/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===- AArch64TargetStreamer.cpp - AArch64TargetStreamer class ------------===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | // |
9 | | // This file implements the AArch64TargetStreamer class. |
10 | | // |
11 | | //===----------------------------------------------------------------------===// |
12 | | |
13 | | #include "AArch64TargetStreamer.h" |
14 | | #include "llvm/MC/ConstantPools.h" |
15 | | #include "llvm/MC/MCSection.h" |
16 | | #include "llvm/MC/MCSubtargetInfo.h" |
17 | | |
18 | | using namespace llvm; |
19 | | |
20 | | // |
21 | | // AArch64TargetStreamer Implemenation |
22 | | // |
23 | | AArch64TargetStreamer::AArch64TargetStreamer(MCStreamer &S) |
24 | 4.96k | : MCTargetStreamer(S), ConstantPools(new AssemblerConstantPools()) {} |
25 | | |
26 | 4.95k | AArch64TargetStreamer::~AArch64TargetStreamer() = default; |
27 | | |
28 | | // The constant pool handling is shared by all AArch64TargetStreamer |
29 | | // implementations. |
30 | | const MCExpr *AArch64TargetStreamer::addConstantPoolEntry(const MCExpr *Expr, |
31 | | unsigned Size, |
32 | 32 | SMLoc Loc) { |
33 | 32 | return ConstantPools->addEntry(Streamer, Expr, Size, Loc); |
34 | 32 | } |
35 | | |
36 | 0 | void AArch64TargetStreamer::emitCurrentConstantPool() { |
37 | 0 | ConstantPools->emitForCurrentSection(Streamer); |
38 | 0 | } |
39 | | |
40 | | // finish() - write out any non-empty assembler constant pools. |
41 | 3.61k | void AArch64TargetStreamer::finish() { ConstantPools->emitAll(Streamer); } |
42 | | |
43 | 2 | void AArch64TargetStreamer::emitInst(uint32_t Inst) { |
44 | 2 | char Buffer[4]; |
45 | 2 | |
46 | 2 | // We can't just use EmitIntValue here, as that will swap the |
47 | 2 | // endianness on big-endian systems (instructions are always |
48 | 2 | // little-endian). |
49 | 10 | for (unsigned I = 0; I < 4; ++I8 ) { |
50 | 8 | Buffer[I] = uint8_t(Inst); |
51 | 8 | Inst >>= 8; |
52 | 8 | } |
53 | 2 | |
54 | 2 | getStreamer().EmitBytes(StringRef(Buffer, 4)); |
55 | 2 | } |
56 | | |
57 | | namespace llvm { |
58 | | |
59 | | MCTargetStreamer * |
60 | 8.65k | createAArch64ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) { |
61 | 8.65k | const Triple &TT = STI.getTargetTriple(); |
62 | 8.65k | if (TT.isOSBinFormatELF()) |
63 | 1.29k | return new AArch64TargetELFStreamer(S); |
64 | 7.36k | if (TT.isOSBinFormatCOFF()) |
65 | 31 | return new AArch64TargetWinCOFFStreamer(S); |
66 | 7.33k | return nullptr; |
67 | 7.33k | } |
68 | | |
69 | | } // end namespace llvm |