45 class AArch64ELFStreamer;
50 void emitInst(
uint32_t Inst)
override;
52 void emitDirectiveVariantPCS(
MCSymbol *Symbol)
override {
53 OS <<
"\t.variant_pcs\t" <<
Symbol->getName() <<
"\n";
56 void emitARM64WinCFIAllocStack(
unsigned Size)
override {
57 OS <<
"\t.seh_stackalloc\t" <<
Size <<
"\n";
59 void emitARM64WinCFISaveR19R20X(
int Offset)
override {
60 OS <<
"\t.seh_save_r19r20_x\t" <<
Offset <<
"\n";
62 void emitARM64WinCFISaveFPLR(
int Offset)
override {
63 OS <<
"\t.seh_save_fplr\t" <<
Offset <<
"\n";
65 void emitARM64WinCFISaveFPLRX(
int Offset)
override {
66 OS <<
"\t.seh_save_fplr_x\t" <<
Offset <<
"\n";
68 void emitARM64WinCFISaveReg(
unsigned Reg,
int Offset)
override {
69 OS <<
"\t.seh_save_reg\tx" <<
Reg <<
", " <<
Offset <<
"\n";
71 void emitARM64WinCFISaveRegX(
unsigned Reg,
int Offset)
override {
72 OS <<
"\t.seh_save_reg_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
74 void emitARM64WinCFISaveRegP(
unsigned Reg,
int Offset)
override {
75 OS <<
"\t.seh_save_regp\tx" <<
Reg <<
", " <<
Offset <<
"\n";
77 void emitARM64WinCFISaveRegPX(
unsigned Reg,
int Offset)
override {
78 OS <<
"\t.seh_save_regp_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
80 void emitARM64WinCFISaveLRPair(
unsigned Reg,
int Offset)
override {
81 OS <<
"\t.seh_save_lrpair\tx" <<
Reg <<
", " <<
Offset <<
"\n";
83 void emitARM64WinCFISaveFReg(
unsigned Reg,
int Offset)
override {
84 OS <<
"\t.seh_save_freg\td" <<
Reg <<
", " <<
Offset <<
"\n";
86 void emitARM64WinCFISaveFRegX(
unsigned Reg,
int Offset)
override {
87 OS <<
"\t.seh_save_freg_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
89 void emitARM64WinCFISaveFRegP(
unsigned Reg,
int Offset)
override {
90 OS <<
"\t.seh_save_fregp\td" <<
Reg <<
", " <<
Offset <<
"\n";
92 void emitARM64WinCFISaveFRegPX(
unsigned Reg,
int Offset)
override {
93 OS <<
"\t.seh_save_fregp_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
95 void emitARM64WinCFISetFP()
override { OS <<
"\t.seh_set_fp\n"; }
96 void emitARM64WinCFIAddFP(
unsigned Size)
override {
97 OS <<
"\t.seh_add_fp\t" <<
Size <<
"\n";
99 void emitARM64WinCFINop()
override { OS <<
"\t.seh_nop\n"; }
100 void emitARM64WinCFISaveNext()
override { OS <<
"\t.seh_save_next\n"; }
101 void emitARM64WinCFIPrologEnd()
override { OS <<
"\t.seh_endprologue\n"; }
102 void emitARM64WinCFIEpilogStart()
override { OS <<
"\t.seh_startepilogue\n"; }
103 void emitARM64WinCFIEpilogEnd()
override { OS <<
"\t.seh_endepilogue\n"; }
104 void emitARM64WinCFITrapFrame()
override { OS <<
"\t.seh_trap_frame\n"; }
105 void emitARM64WinCFIMachineFrame()
override { OS <<
"\t.seh_pushframe\n"; }
106 void emitARM64WinCFIContext()
override { OS <<
"\t.seh_context\n"; }
107 void emitARM64WinCFIClearUnwoundToCall()
override {
108 OS <<
"\t.seh_clear_unwound_to_call\n";
110 void emitARM64WinCFIPACSignLR()
override {
111 OS <<
"\t.seh_pac_sign_lr\n";
114 void emitARM64WinCFISaveAnyRegI(
unsigned Reg,
int Offset)
override {
115 OS <<
"\t.seh_save_any_reg\tx" <<
Reg <<
", " <<
Offset <<
"\n";
117 void emitARM64WinCFISaveAnyRegIP(
unsigned Reg,
int Offset)
override {
118 OS <<
"\t.seh_save_any_reg_p\tx" <<
Reg <<
", " <<
Offset <<
"\n";
120 void emitARM64WinCFISaveAnyRegD(
unsigned Reg,
int Offset)
override {
121 OS <<
"\t.seh_save_any_reg\td" <<
Reg <<
", " <<
Offset <<
"\n";
123 void emitARM64WinCFISaveAnyRegDP(
unsigned Reg,
int Offset)
override {
124 OS <<
"\t.seh_save_any_reg_p\td" <<
Reg <<
", " <<
Offset <<
"\n";
126 void emitARM64WinCFISaveAnyRegQ(
unsigned Reg,
int Offset)
override {
127 OS <<
"\t.seh_save_any_reg\tq" <<
Reg <<
", " <<
Offset <<
"\n";
129 void emitARM64WinCFISaveAnyRegQP(
unsigned Reg,
int Offset)
override {
130 OS <<
"\t.seh_save_any_reg_p\tq" <<
Reg <<
", " <<
Offset <<
"\n";
132 void emitARM64WinCFISaveAnyRegIX(
unsigned Reg,
int Offset)
override {
133 OS <<
"\t.seh_save_any_reg_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
135 void emitARM64WinCFISaveAnyRegIPX(
unsigned Reg,
int Offset)
override {
136 OS <<
"\t.seh_save_any_reg_px\tx" <<
Reg <<
", " <<
Offset <<
"\n";
138 void emitARM64WinCFISaveAnyRegDX(
unsigned Reg,
int Offset)
override {
139 OS <<
"\t.seh_save_any_reg_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
141 void emitARM64WinCFISaveAnyRegDPX(
unsigned Reg,
int Offset)
override {
142 OS <<
"\t.seh_save_any_reg_px\td" <<
Reg <<
", " <<
Offset <<
"\n";
144 void emitARM64WinCFISaveAnyRegQX(
unsigned Reg,
int Offset)
override {
145 OS <<
"\t.seh_save_any_reg_x\tq" <<
Reg <<
", " <<
Offset <<
"\n";
147 void emitARM64WinCFISaveAnyRegQPX(
unsigned Reg,
int Offset)
override {
148 OS <<
"\t.seh_save_any_reg_px\tq" <<
Reg <<
", " <<
Offset <<
"\n";
155 AArch64TargetAsmStreamer::AArch64TargetAsmStreamer(
MCStreamer &
S,
159 void AArch64TargetAsmStreamer::emitInst(
uint32_t Inst) {
160 OS <<
"\t.inst\t0x" << Twine::utohexstr(Inst) <<
"\n";
179 std::unique_ptr<MCObjectWriter> OW,
180 std::unique_ptr<MCCodeEmitter>
Emitter)
183 MappingSymbolCounter(0), LastEMS(EMS_None) {}
190 LastEMS = LastMappingSymbols.lookup(
Section);
196 void reset()
override {
197 MappingSymbolCounter = 0;
199 LastMappingSymbols.clear();
208 emitA64MappingSymbol();
220 for (
char &
C : Buffer) {
225 emitA64MappingSymbol();
233 emitDataMappingSymbol();
241 emitDataMappingSymbol();
246 SMLoc Loc)
override {
247 emitDataMappingSymbol();
251 enum ElfMappingSymbol {
257 void emitDataMappingSymbol() {
258 if (LastEMS == EMS_Data)
260 emitMappingSymbol(
"$d");
264 void emitA64MappingSymbol() {
265 if (LastEMS == EMS_A64)
267 emitMappingSymbol(
"$x");
273 Name +
"." +
Twine(MappingSymbolCounter++)));
277 Symbol->setExternal(
false);
280 int64_t MappingSymbolCounter;
283 ElfMappingSymbol LastEMS;
288 AArch64ELFStreamer &AArch64TargetELFStreamer::getStreamer() {
289 return static_cast<AArch64ELFStreamer &
>(
Streamer);
292 void AArch64TargetELFStreamer::emitInst(
uint32_t Inst) {
293 getStreamer().emitInst(Inst);
296 void AArch64TargetELFStreamer::emitDirectiveVariantPCS(
MCSymbol *Symbol) {
297 getStreamer().getAssembler().registerSymbol(*Symbol);
305 return new AArch64TargetAsmStreamer(
S, OS);
310 std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter>
Emitter,
312 AArch64ELFStreamer *
S =
new AArch64ELFStreamer(
315 S->getAssembler().setRelaxAll(
true);