62 "Invalid personality index");
75 void emitFnStart()
override;
76 void emitFnEnd()
override;
77 void emitCantUnwind()
override;
78 void emitPersonality(
const MCSymbol *Personality)
override;
79 void emitPersonalityIndex(
unsigned Index)
override;
80 void emitHandlerData()
override;
81 void emitSetFP(
unsigned FpReg,
unsigned SpReg, int64_t Offset = 0)
override;
82 void emitMovSP(
unsigned Reg, int64_t Offset = 0)
override;
83 void emitPad(int64_t Offset)
override;
86 void emitUnwindRaw(int64_t Offset,
89 void switchVendor(
StringRef Vendor)
override;
92 void emitIntTextAttribute(
unsigned Attribute,
unsigned IntValue,
95 void emitArchExtension(
uint64_t ArchExt)
override;
97 void emitFPU(
unsigned FPU)
override;
98 void emitInst(
uint32_t Inst,
char Suffix =
'\0')
override;
99 void finishAttributeSection()
override;
101 void annotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE)
override;
104 void emitARMWinCFIAllocStack(
unsigned Size,
bool Wide)
override;
105 void emitARMWinCFISaveRegMask(
unsigned Mask,
bool Wide)
override;
106 void emitARMWinCFISaveSP(
unsigned Reg)
override;
107 void emitARMWinCFISaveFRegs(
unsigned First,
unsigned Last)
override;
108 void emitARMWinCFISaveLR(
unsigned Offset)
override;
109 void emitARMWinCFIPrologEnd(
bool Fragment)
override;
110 void emitARMWinCFINop(
bool Wide)
override;
111 void emitARMWinCFIEpilogStart(
unsigned Condition)
override;
112 void emitARMWinCFIEpilogEnd()
override;
113 void emitARMWinCFICustom(
unsigned Opcode)
override;
120 ARMTargetAsmStreamer::ARMTargetAsmStreamer(
MCStreamer &
S,
125 IsVerboseAsm(VerboseAsm) {}
127 void ARMTargetAsmStreamer::emitFnStart() { OS <<
"\t.fnstart\n"; }
128 void ARMTargetAsmStreamer::emitFnEnd() { OS <<
"\t.fnend\n"; }
129 void ARMTargetAsmStreamer::emitCantUnwind() { OS <<
"\t.cantunwind\n"; }
131 void ARMTargetAsmStreamer::emitPersonality(
const MCSymbol *Personality) {
132 OS <<
"\t.personality " << Personality->
getName() <<
'\n';
135 void ARMTargetAsmStreamer::emitPersonalityIndex(
unsigned Index) {
136 OS <<
"\t.personalityindex " <<
Index <<
'\n';
139 void ARMTargetAsmStreamer::emitHandlerData() { OS <<
"\t.handlerdata\n"; }
141 void ARMTargetAsmStreamer::emitSetFP(
unsigned FpReg,
unsigned SpReg,
144 InstPrinter.printRegName(OS, FpReg);
146 InstPrinter.printRegName(OS, SpReg);
152 void ARMTargetAsmStreamer::emitMovSP(
unsigned Reg, int64_t
Offset) {
154 "the operand of .movsp cannot be either sp or pc");
157 InstPrinter.printRegName(OS,
Reg);
163 void ARMTargetAsmStreamer::emitPad(int64_t
Offset) {
164 OS <<
"\t.pad\t#" <<
Offset <<
'\n';
169 assert(RegList.size() &&
"RegList should not be empty");
175 InstPrinter.printRegName(OS, RegList[0]);
177 for (
unsigned i = 1,
e = RegList.size();
i !=
e; ++
i) {
179 InstPrinter.printRegName(OS, RegList[
i]);
185 void ARMTargetAsmStreamer::switchVendor(
StringRef Vendor) {}
187 void ARMTargetAsmStreamer::emitAttribute(
unsigned Attribute,
unsigned Value) {
193 OS <<
"\t@ " <<
Name;
198 void ARMTargetAsmStreamer::emitTextAttribute(
unsigned Attribute,
202 OS <<
"\t.cpu\t" <<
String.lower();
210 OS <<
"\t@ " <<
Name;
217 void ARMTargetAsmStreamer::emitIntTextAttribute(
unsigned Attribute,
223 OS <<
"\t.eabi_attribute\t" <<
Attribute <<
", " << IntValue;
224 if (!StringValue.
empty())
225 OS <<
", \"" << StringValue <<
"\"";
239 void ARMTargetAsmStreamer::emitArchExtension(
uint64_t ArchExt) {
243 void ARMTargetAsmStreamer::emitObjectArch(
ARM::ArchKind Arch) {
247 void ARMTargetAsmStreamer::emitFPU(
unsigned FPU) {
251 void ARMTargetAsmStreamer::finishAttributeSection() {}
253 void ARMTargetAsmStreamer::annotateTLSDescriptorSequence(
255 OS <<
"\t.tlsdescseq\t" <<
S->getSymbol().getName() <<
"\n";
259 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
261 OS <<
"\t.thumb_set\t";
268 void ARMTargetAsmStreamer::emitInst(
uint32_t Inst,
char Suffix) {
272 OS <<
"\t0x" << Twine::utohexstr(Inst) <<
"\n";
275 void ARMTargetAsmStreamer::emitUnwindRaw(int64_t
Offset,
277 OS <<
"\t.unwind_raw " <<
Offset;
278 for (uint8_t Opcode : Opcodes)
279 OS <<
", 0x" << Twine::utohexstr(Opcode);
283 void ARMTargetAsmStreamer::emitARMWinCFIAllocStack(
unsigned Size,
bool Wide) {
285 OS <<
"\t.seh_stackalloc_w\t" <<
Size <<
"\n";
287 OS <<
"\t.seh_stackalloc\t" <<
Size <<
"\n";
298 void ARMTargetAsmStreamer::emitARMWinCFISaveRegMask(
unsigned Mask,
bool Wide) {
300 OS <<
"\t.seh_save_regs_w\t";
302 OS <<
"\t.seh_save_regs\t";
306 for (
int I = 0;
I <= 12;
I++) {
307 if (
Mask & (1 <<
I)) {
319 if (
Mask & (1 << 14))
324 void ARMTargetAsmStreamer::emitARMWinCFISaveSP(
unsigned Reg) {
325 OS <<
"\t.seh_save_sp\tr" <<
Reg <<
"\n";
328 void ARMTargetAsmStreamer::emitARMWinCFISaveFRegs(
unsigned First,
331 OS <<
"\t.seh_save_fregs\t{d" <<
First <<
"-d" <<
Last <<
"}\n";
333 OS <<
"\t.seh_save_fregs\t{d" <<
First <<
"}\n";
336 void ARMTargetAsmStreamer::emitARMWinCFISaveLR(
unsigned Offset) {
337 OS <<
"\t.seh_save_lr\t" <<
Offset <<
"\n";
340 void ARMTargetAsmStreamer::emitARMWinCFIPrologEnd(
bool Fragment) {
342 OS <<
"\t.seh_endprologue_fragment\n";
344 OS <<
"\t.seh_endprologue\n";
347 void ARMTargetAsmStreamer::emitARMWinCFINop(
bool Wide) {
349 OS <<
"\t.seh_nop_w\n";
351 OS <<
"\t.seh_nop\n";
354 void ARMTargetAsmStreamer::emitARMWinCFIEpilogStart(
unsigned Condition) {
356 OS <<
"\t.seh_startepilogue\n";
358 OS <<
"\t.seh_startepilogue_cond\t"
362 void ARMTargetAsmStreamer::emitARMWinCFIEpilogEnd() {
363 OS <<
"\t.seh_endepilogue\n";
366 void ARMTargetAsmStreamer::emitARMWinCFICustom(
unsigned Opcode) {
368 for (
I = 3;
I > 0;
I--)
369 if (Opcode & (0xffu << (8 *
I)))
372 OS <<
"\t.seh_custom\t";
374 OS <<
LS << ((Opcode >> (8 *
I)) & 0xff);
387 void emitArchDefaultAttributes();
388 void emitFPUDefaultAttributes();
398 void emitSetFP(
unsigned FpReg,
unsigned SpReg, int64_t
Offset = 0)
override;
413 void emitFPU(
unsigned FPU)
override;
422 void reset()
override;
443 friend class ARMTargetELFStreamer;
446 std::unique_ptr<MCObjectWriter> OW,
447 std::unique_ptr<MCCodeEmitter> Emitter,
bool IsThumb,
451 IsThumb(IsThumb), IsAndroid(IsAndroid) {
455 ~ARMELFStreamer()
override =
default;
462 void emitCantUnwind();
463 void emitPersonality(
const MCSymbol *Per);
464 void emitPersonalityIndex(
unsigned index);
465 void emitHandlerData();
466 void emitSetFP(
unsigned NewFpReg,
unsigned NewSpReg, int64_t
Offset = 0);
467 void emitMovSP(
unsigned Reg, int64_t
Offset = 0);
468 void emitPad(int64_t
Offset);
472 SMLoc Loc)
override {
473 emitDataMappingSymbol();
480 auto LastMappingSymbol = LastMappingSymbols.find(
Section);
481 if (LastMappingSymbol != LastMappingSymbols.end()) {
482 LastEMSInfo =
std::move(LastMappingSymbol->second);
485 LastEMSInfo.reset(
new ElfMappingSymbolInfo(
SMLoc(),
nullptr, 0));
494 EmitThumbMappingSymbol();
496 EmitARMMappingSymbol();
501 void emitInst(
uint32_t Inst,
char Suffix) {
511 EmitARMMappingSymbol();
512 for (
unsigned II = 0,
IE =
Size; II !=
IE; II++) {
513 const unsigned I = LittleEndian ? (
Size - II - 1) : II;
514 Buffer[
Size - II - 1] = uint8_t(Inst >>
I * CHAR_BIT);
520 Size = (Suffix ==
'n' ? 2 : 4);
523 EmitThumbMappingSymbol();
526 for (
unsigned II = 0,
IE =
Size; II !=
IE; II = II + 2) {
527 const unsigned I0 = LittleEndian ? II + 0 : II + 1;
528 const unsigned I1 = LittleEndian ? II + 1 : II + 0;
529 Buffer[
Size - II - 2] = uint8_t(Inst >> I0 * CHAR_BIT);
530 Buffer[
Size - II - 1] = uint8_t(Inst >>
I1 * CHAR_BIT);
545 emitDataMappingSymbol();
549 void FlushPendingMappingSymbol() {
550 if (!LastEMSInfo->hasInfo())
552 ElfMappingSymbolInfo *EMS = LastEMSInfo.get();
553 EmitMappingSymbol(
"$d", EMS->Loc, EMS->F, EMS->Offset);
562 if (SRE->getKind() == MCSymbolRefExpr::VK_ARM_SBREL && !(
Size == 4)) {
569 emitDataMappingSymbol();
606 unsigned Type = cast<MCSymbolELF>(
Symbol)->getType();
615 enum ElfMappingSymbol {
622 struct ElfMappingSymbolInfo {
624 : Loc(Loc),
F(
F),
Offset(
O), State(EMS_None) {}
629 bool hasInfo() {
return F !=
nullptr; }
633 ElfMappingSymbol State;
636 void emitDataMappingSymbol() {
637 if (LastEMSInfo->State == EMS_Data)
639 else if (LastEMSInfo->State == EMS_None) {
642 ElfMappingSymbolInfo *EMS = LastEMSInfo.get();
648 EMS->Offset =
DF->getContents().size();
649 LastEMSInfo->State = EMS_Data;
652 EmitMappingSymbol(
"$d");
653 LastEMSInfo->State = EMS_Data;
656 void EmitThumbMappingSymbol() {
657 if (LastEMSInfo->State == EMS_Thumb)
659 FlushPendingMappingSymbol();
660 EmitMappingSymbol(
"$t");
661 LastEMSInfo->State = EMS_Thumb;
664 void EmitARMMappingSymbol() {
665 if (LastEMSInfo->State == EMS_ARM)
667 FlushPendingMappingSymbol();
668 EmitMappingSymbol(
"$a");
669 LastEMSInfo->State = EMS_ARM;
674 Name +
"." +
Twine(MappingSymbolCounter++)));
684 Name +
"." +
Twine(MappingSymbolCounter++)));
699 void reset()
override;
702 void FlushPendingOffset();
703 void FlushUnwindOpcodes(
bool NoHandlerData);
707 void SwitchToExTabSection(
const MCSymbol &FnStart);
708 void SwitchToExIdxSection(
const MCSymbol &FnStart);
714 int64_t MappingSymbolCounter = 0;
719 std::unique_ptr<ElfMappingSymbolInfo> LastEMSInfo;
725 unsigned PersonalityIndex;
729 int64_t PendingOffset;
738 ARMELFStreamer &ARMTargetELFStreamer::getStreamer() {
739 return static_cast<ARMELFStreamer &
>(Streamer);
742 void ARMTargetELFStreamer::emitFnStart() { getStreamer().emitFnStart(); }
743 void ARMTargetELFStreamer::emitFnEnd() { getStreamer().emitFnEnd(); }
744 void ARMTargetELFStreamer::emitCantUnwind() { getStreamer().emitCantUnwind(); }
746 void ARMTargetELFStreamer::emitPersonality(
const MCSymbol *Personality) {
747 getStreamer().emitPersonality(Personality);
750 void ARMTargetELFStreamer::emitPersonalityIndex(
unsigned Index) {
751 getStreamer().emitPersonalityIndex(
Index);
754 void ARMTargetELFStreamer::emitHandlerData() {
755 getStreamer().emitHandlerData();
758 void ARMTargetELFStreamer::emitSetFP(
unsigned FpReg,
unsigned SpReg,
760 getStreamer().emitSetFP(FpReg, SpReg,
Offset);
763 void ARMTargetELFStreamer::emitMovSP(
unsigned Reg, int64_t
Offset) {
767 void ARMTargetELFStreamer::emitPad(int64_t
Offset) {
768 getStreamer().emitPad(
Offset);
773 getStreamer().emitRegSave(RegList,
isVector);
776 void ARMTargetELFStreamer::emitUnwindRaw(int64_t
Offset,
778 getStreamer().emitUnwindRaw(
Offset, Opcodes);
781 void ARMTargetELFStreamer::switchVendor(
StringRef Vendor) {
782 assert(!Vendor.
empty() &&
"Vendor cannot be empty.");
784 if (CurrentVendor == Vendor)
787 if (!CurrentVendor.empty())
788 finishAttributeSection();
790 assert(getStreamer().Contents.empty() &&
791 ".ARM.attributes should be flushed before changing vendor");
792 CurrentVendor = Vendor;
796 void ARMTargetELFStreamer::emitAttribute(
unsigned Attribute,
unsigned Value) {
801 void ARMTargetELFStreamer::emitTextAttribute(
unsigned Attribute,
807 void ARMTargetELFStreamer::emitIntTextAttribute(
unsigned Attribute,
810 getStreamer().setAttributeItems(
Attribute, IntValue, StringValue,
822 void ARMTargetELFStreamer::emitArchDefaultAttributes() {
823 using namespace ARMBuildAttrs;
824 ARMELFStreamer &
S = getStreamer();
828 if (EmittedArch == ARM::ArchKind::INVALID)
834 case ARM::ArchKind::ARMV2:
835 case ARM::ArchKind::ARMV2A:
836 case ARM::ArchKind::ARMV3:
837 case ARM::ArchKind::ARMV3M:
838 case ARM::ArchKind::ARMV4:
842 case ARM::ArchKind::ARMV4T:
843 case ARM::ArchKind::ARMV5T:
844 case ARM::ArchKind::XSCALE:
845 case ARM::ArchKind::ARMV5TE:
846 case ARM::ArchKind::ARMV6:
851 case ARM::ArchKind::ARMV6T2:
856 case ARM::ArchKind::ARMV6K:
857 case ARM::ArchKind::ARMV6KZ:
863 case ARM::ArchKind::ARMV6M:
867 case ARM::ArchKind::ARMV7A:
873 case ARM::ArchKind::ARMV7R:
879 case ARM::ArchKind::ARMV7EM:
880 case ARM::ArchKind::ARMV7M:
885 case ARM::ArchKind::ARMV8A:
886 case ARM::ArchKind::ARMV8_1A:
887 case ARM::ArchKind::ARMV8_2A:
888 case ARM::ArchKind::ARMV8_3A:
889 case ARM::ArchKind::ARMV8_4A:
890 case ARM::ArchKind::ARMV8_5A:
891 case ARM::ArchKind::ARMV8_6A:
892 case ARM::ArchKind::ARMV9A:
893 case ARM::ArchKind::ARMV9_1A:
894 case ARM::ArchKind::ARMV9_2A:
895 case ARM::ArchKind::ARMV9_3A:
903 case ARM::ArchKind::ARMV8MBaseline:
904 case ARM::ArchKind::ARMV8MMainline:
909 case ARM::ArchKind::IWMMXT:
915 case ARM::ArchKind::IWMMXT2:
927 void ARMTargetELFStreamer::emitFPU(
unsigned Value) {
931 void ARMTargetELFStreamer::emitFPUDefaultAttributes() {
932 ARMELFStreamer &
S = getStreamer();
946 case ARM::FK_VFPV3_FP16:
953 case ARM::FK_VFPV3_D16:
958 case ARM::FK_VFPV3_D16_FP16:
965 case ARM::FK_VFPV3XD:
969 case ARM::FK_VFPV3XD_FP16:
983 case ARM::FK_FPV4_SP_D16:
984 case ARM::FK_VFPV4_D16:
989 case ARM::FK_FP_ARMV8:
996 case ARM::FK_FPV5_SP_D16:
997 case ARM::FK_FPV5_D16:
1010 case ARM::FK_NEON_FP16:
1020 case ARM::FK_NEON_VFPV4:
1028 case ARM::FK_NEON_FP_ARMV8:
1029 case ARM::FK_CRYPTO_NEON_FP_ARMV8:
1036 case ARM::FK_SOFTVFP:
1046 void ARMTargetELFStreamer::finishAttributeSection() {
1047 ARMELFStreamer &
S = getStreamer();
1050 emitFPUDefaultAttributes();
1052 if (Arch != ARM::ArchKind::INVALID)
1053 emitArchDefaultAttributes();
1055 if (
S.Contents.empty())
1076 S.emitAttributesSection(CurrentVendor,
".ARM.attributes",
1083 ARMELFStreamer &Streamer = getStreamer();
1084 if (!Streamer.IsThumb)
1087 Streamer.getAssembler().registerSymbol(*
Symbol);
1088 unsigned Type = cast<MCSymbolELF>(
Symbol)->getType();
1090 Streamer.emitThumbFunc(
Symbol);
1093 void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
1100 const MCSymbol &Sym = SRE->getSymbol();
1107 getStreamer().emitThumbFunc(
Symbol);
1111 void ARMTargetELFStreamer::emitInst(
uint32_t Inst,
char Suffix) {
1112 getStreamer().emitInst(Inst, Suffix);
1115 void ARMTargetELFStreamer::reset() { AttributeSection =
nullptr; }
1117 void ARMELFStreamer::finishImpl() {
1122 MCELFStreamer::finishImpl();
1125 void ARMELFStreamer::reset() {
1129 MappingSymbolCounter = 0;
1130 MCELFStreamer::reset();
1131 LastMappingSymbols.clear();
1132 LastEMSInfo.reset();
1150 if (FnSecName !=
".text") {
1151 EHSecName += FnSecName;
1159 EHSecName,
Type, Flags, 0, Group,
true,
1163 assert(EHSection &&
"Failed to get the required EH section");
1166 switchSection(EHSection);
1167 emitValueToAlignment(4, 0, 1, 0);
1170 inline void ARMELFStreamer::SwitchToExTabSection(
const MCSymbol &FnStart) {
1172 SectionKind::getData(), FnStart);
1175 inline void ARMELFStreamer::SwitchToExIdxSection(
const MCSymbol &FnStart) {
1178 SectionKind::getData(), FnStart);
1187 void ARMELFStreamer::EHReset() {
1190 Personality =
nullptr;
1200 UnwindOpAsm.Reset();
1203 void ARMELFStreamer::emitFnStart() {
1204 assert(FnStart ==
nullptr);
1205 FnStart = getContext().createTempSymbol();
1209 void ARMELFStreamer::emitFnEnd() {
1210 assert(FnStart &&
".fnstart must precedes .fnend");
1213 if (!ExTab && !CantUnwind)
1214 FlushUnwindOpcodes(
true);
1217 SwitchToExIdxSection(*FnStart);
1228 MCSymbolRefExpr::create(FnStart,
1229 MCSymbolRefExpr::VK_ARM_PREL31,
1232 emitValue(FnStartRef, 4);
1239 MCSymbolRefExpr::create(ExTab,
1240 MCSymbolRefExpr::VK_ARM_PREL31,
1242 emitValue(ExTabEntryRef, 4);
1248 "Compact model must use __aeabi_unwind_cpp_pr0 as personality");
1249 assert(Opcodes.size() == 4u &&
1250 "Unwind opcode size for __aeabi_unwind_cpp_pr0 must be equal to 4");
1255 emitIntValue(Intval, Opcodes.size());
1265 void ARMELFStreamer::emitCantUnwind() { CantUnwind =
true; }
1269 const MCSymbol *PersonalitySym = getContext().getOrCreateSymbol(
Name);
1272 PersonalitySym, MCSymbolRefExpr::VK_ARM_NONE, getContext());
1274 visitUsedExpr(*PersonalityRef);
1276 DF->getFixups().push_back(MCFixup::create(
DF->getContents().size(),
1278 MCFixup::getKindForSize(4,
false)));
1281 void ARMELFStreamer::FlushPendingOffset() {
1282 if (PendingOffset != 0) {
1283 UnwindOpAsm.EmitSPOffset(-PendingOffset);
1288 void ARMELFStreamer::FlushUnwindOpcodes(
bool NoHandlerData) {
1292 int64_t LastRegSaveSPOffset = SPOffset - PendingOffset;
1293 UnwindOpAsm.EmitSPOffset(LastRegSaveSPOffset - FPOffset);
1294 UnwindOpAsm.EmitSetSP(
MRI->getEncodingValue(FPReg));
1296 FlushPendingOffset();
1300 UnwindOpAsm.Finalize(PersonalityIndex, Opcodes);
1309 SwitchToExTabSection(*FnStart);
1313 ExTab = getContext().createTempSymbol();
1319 MCSymbolRefExpr::create(Personality,
1320 MCSymbolRefExpr::VK_ARM_PREL31,
1323 emitValue(PersonalityRef, 4);
1327 assert((Opcodes.size() % 4) == 0 &&
1328 "Unwind opcode size for __aeabi_cpp_unwind_pr0 must be multiple of 4");
1329 for (
unsigned I = 0;
I != Opcodes.size();
I += 4) {
1331 Opcodes[
I + 1] << 8 |
1332 Opcodes[
I + 2] << 16 |
1333 Opcodes[
I + 3] << 24;
1344 if (NoHandlerData && !Personality)
1348 void ARMELFStreamer::emitHandlerData() { FlushUnwindOpcodes(
false); }
1350 void ARMELFStreamer::emitPersonality(
const MCSymbol *Per) {
1352 UnwindOpAsm.setPersonality(Per);
1355 void ARMELFStreamer::emitPersonalityIndex(
unsigned Index) {
1357 PersonalityIndex =
Index;
1360 void ARMELFStreamer::emitSetFP(
unsigned NewFPReg,
unsigned NewSPReg,
1362 assert((NewSPReg == ARM::SP || NewSPReg == FPReg) &&
1363 "the operand of .setfp directive should be either $sp or $fp");
1368 if (NewSPReg == ARM::SP)
1369 FPOffset = SPOffset +
Offset;
1374 void ARMELFStreamer::emitMovSP(
unsigned Reg, int64_t
Offset) {
1376 "the operand of .movsp cannot be either sp or pc");
1377 assert(FPReg == ARM::SP &&
"current FP must be SP");
1379 FlushPendingOffset();
1382 FPOffset = SPOffset +
Offset;
1385 UnwindOpAsm.EmitSetSP(
MRI->getEncodingValue(FPReg));
1388 void ARMELFStreamer::emitPad(int64_t
Offset) {
1397 static std::pair<unsigned, unsigned>
1404 unsigned Reg = RegList[Idx - 1];
1405 if (
Reg == ARM::RA_AUTH_CODE)
1408 assert(
Reg < (IsVector ? 32U : 16U) &&
"Register out of range");
1409 unsigned Bit = (1u <<
Reg);
1418 return {Idx, Count};
1424 unsigned Idx, Count;
1433 Idx = RegList.size();
1441 SPOffset -= Count * (IsVector ? 8 : 4);
1444 FlushPendingOffset();
1446 UnwindOpAsm.EmitVFPRegSave(
Mask);
1448 UnwindOpAsm.EmitRegSave(
Mask);
1449 }
else if (Idx > 0 && RegList[Idx - 1] == ARM::RA_AUTH_CODE) {
1452 FlushPendingOffset();
1453 UnwindOpAsm.EmitRegSave(0);
1458 void ARMELFStreamer::emitUnwindRaw(int64_t
Offset,
1460 FlushPendingOffset();
1461 SPOffset = SPOffset -
Offset;
1462 UnwindOpAsm.EmitRaw(Opcodes);
1470 bool isVerboseAsm) {
1471 return new ARMTargetAsmStreamer(
S, OS, *InstPrint, isVerboseAsm);
1479 return new ARMTargetELFStreamer(
S);
1483 std::unique_ptr<MCAsmBackend> TAB,
1484 std::unique_ptr<MCObjectWriter> OW,
1485 std::unique_ptr<MCCodeEmitter> Emitter,
1486 bool RelaxAll,
bool IsThumb,
1490 std::move(Emitter), IsThumb, IsAndroid);
1497 S->getAssembler().setRelaxAll(
true);