45 class AArch64ELFStreamer;
50 void emitInst(
uint32_t Inst)
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";
115 AArch64TargetAsmStreamer::AArch64TargetAsmStreamer(
MCStreamer &
S,
119 void AArch64TargetAsmStreamer::emitInst(
uint32_t Inst) {
120 OS <<
"\t.inst\t0x" << Twine::utohexstr(Inst) <<
"\n";
139 std::unique_ptr<MCObjectWriter> OW,
140 std::unique_ptr<MCCodeEmitter> Emitter)
143 MappingSymbolCounter(0), LastEMS(EMS_None) {}
150 LastEMS = LastMappingSymbols.lookup(
Section);
156 void reset()
override {
157 MappingSymbolCounter = 0;
159 LastMappingSymbols.clear();
168 emitA64MappingSymbol();
180 for (
char &
C : Buffer) {
185 emitA64MappingSymbol();
193 emitDataMappingSymbol();
201 emitDataMappingSymbol();
206 SMLoc Loc)
override {
207 emitDataMappingSymbol();
211 enum ElfMappingSymbol {
217 void emitDataMappingSymbol() {
218 if (LastEMS == EMS_Data)
220 emitMappingSymbol(
"$d");
224 void emitA64MappingSymbol() {
225 if (LastEMS == EMS_A64)
227 emitMappingSymbol(
"$x");
233 Name +
"." +
Twine(MappingSymbolCounter++)));
237 Symbol->setExternal(
false);
240 int64_t MappingSymbolCounter;
243 ElfMappingSymbol LastEMS;
248 AArch64ELFStreamer &AArch64TargetELFStreamer::getStreamer() {
249 return static_cast<AArch64ELFStreamer &
>(
Streamer);
252 void AArch64TargetELFStreamer::emitInst(
uint32_t Inst) {
253 getStreamer().emitInst(Inst);
256 void AArch64TargetELFStreamer::emitDirectiveVariantPCS(
MCSymbol *
Symbol) {
257 getStreamer().getAssembler().registerSymbol(*
Symbol);
265 return new AArch64TargetAsmStreamer(
S, OS);
270 std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCCodeEmitter> Emitter,
272 AArch64ELFStreamer *
S =
new AArch64ELFStreamer(
275 S->getAssembler().setRelaxAll(
true);