63 "Invalid personality index");
64 return (
Twine(
"__aeabi_unwind_cpp_pr") +
Twine(Index)).str();
72 formatted_raw_ostream &OS;
73 MCInstPrinter &InstPrinter;
76 void emitFnStart()
override;
77 void emitFnEnd()
override;
78 void emitCantUnwind()
override;
79 void emitPersonality(
const MCSymbol *Personality)
override;
80 void emitPersonalityIndex(
unsigned Index)
override;
81 void emitHandlerData()
override;
82 void emitSetFP(MCRegister FpReg, MCRegister SpReg,
83 int64_t
Offset = 0)
override;
84 void emitMovSP(MCRegister
Reg, int64_t
Offset = 0)
override;
85 void emitPad(int64_t
Offset)
override;
86 void emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
87 bool isVector)
override;
88 void emitUnwindRaw(int64_t
Offset,
89 const SmallVectorImpl<uint8_t> &Opcodes)
override;
91 void switchVendor(StringRef Vendor)
override;
94 void emitIntTextAttribute(
unsigned Attribute,
unsigned IntValue,
95 StringRef StringValue)
override;
97 void emitArchExtension(uint64_t ArchExt)
override;
100 void emitInst(uint32_t Inst,
char Suffix =
'\0')
override;
101 void finishAttributeSection()
override;
103 void annotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE)
override;
104 void emitSyntaxUnified()
override;
105 void emitCode16()
override;
106 void emitCode32()
override;
107 void emitThumbFunc(MCSymbol *Symbol)
override;
108 void emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value)
override;
110 void emitARMWinCFIAllocStack(
unsigned Size,
bool Wide)
override;
111 void emitARMWinCFISaveRegMask(
unsigned Mask,
bool Wide)
override;
112 void emitARMWinCFISaveSP(
unsigned Reg)
override;
113 void emitARMWinCFISaveFRegs(
unsigned First,
unsigned Last)
override;
114 void emitARMWinCFISaveLR(
unsigned Offset)
override;
115 void emitARMWinCFIPrologEnd(
bool Fragment)
override;
116 void emitARMWinCFINop(
bool Wide)
override;
117 void emitARMWinCFIEpilogStart(
unsigned Condition)
override;
118 void emitARMWinCFIEpilogEnd()
override;
119 void emitARMWinCFICustom(
unsigned Opcode)
override;
122 ARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS,
123 MCInstPrinter &InstPrinter);
126ARMTargetAsmStreamer::ARMTargetAsmStreamer(
MCStreamer &S,
130 IsVerboseAsm(S.isVerboseAsm()) {}
132void ARMTargetAsmStreamer::emitFnStart() { OS <<
"\t.fnstart\n"; }
133void ARMTargetAsmStreamer::emitFnEnd() { OS <<
"\t.fnend\n"; }
134void ARMTargetAsmStreamer::emitCantUnwind() { OS <<
"\t.cantunwind\n"; }
136void ARMTargetAsmStreamer::emitPersonality(
const MCSymbol *Personality) {
137 OS <<
"\t.personality " << Personality->
getName() <<
'\n';
140void ARMTargetAsmStreamer::emitPersonalityIndex(
unsigned Index) {
141 OS <<
"\t.personalityindex " <<
Index <<
'\n';
144void ARMTargetAsmStreamer::emitHandlerData() { OS <<
"\t.handlerdata\n"; }
146void ARMTargetAsmStreamer::emitSetFP(MCRegister FpReg, MCRegister SpReg,
157void ARMTargetAsmStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
159 "the operand of .movsp cannot be either sp or pc");
168void ARMTargetAsmStreamer::emitPad(int64_t
Offset) {
169 OS <<
"\t.pad\t#" <<
Offset <<
'\n';
172void ARMTargetAsmStreamer::emitRegSave(
173 const SmallVectorImpl<MCRegister> &RegList,
bool isVector) {
174 assert(RegList.
size() &&
"RegList should not be empty");
182 for (
unsigned i = 1, e = RegList.
size(); i != e; ++i) {
190void ARMTargetAsmStreamer::switchVendor(StringRef Vendor) {}
192void ARMTargetAsmStreamer::emitAttribute(
unsigned Attribute,
unsigned Value) {
198 OS <<
"\t@ " <<
Name;
203void ARMTargetAsmStreamer::emitTextAttribute(
unsigned Attribute,
207 OS <<
"\t.cpu\t" <<
String.lower();
210 OS <<
"\t.eabi_attribute\t" <<
Attribute <<
", \"";
220 OS <<
"\t@ " <<
Name;
227void ARMTargetAsmStreamer::emitIntTextAttribute(
unsigned Attribute,
229 StringRef StringValue) {
233 OS <<
"\t.eabi_attribute\t" <<
Attribute <<
", " << IntValue;
234 if (!StringValue.
empty())
235 OS <<
", \"" << StringValue <<
"\"";
249void ARMTargetAsmStreamer::emitArchExtension(uint64_t ArchExt) {
253void ARMTargetAsmStreamer::emitObjectArch(
ARM::ArchKind Arch) {
261void ARMTargetAsmStreamer::finishAttributeSection() {}
263void ARMTargetAsmStreamer::annotateTLSDescriptorSequence(
264 const MCSymbolRefExpr *S) {
268void ARMTargetAsmStreamer::emitSyntaxUnified() { OS <<
"\t.syntax\tunified\n"; }
270void ARMTargetAsmStreamer::emitCode16() { OS <<
"\t.code\t16\n"; }
272void ARMTargetAsmStreamer::emitCode32() { OS <<
"\t.code\t32\n"; }
274void ARMTargetAsmStreamer::emitThumbFunc(MCSymbol *Symbol) {
275 const MCAsmInfo &MAI = Streamer.getContext().getAsmInfo();
276 OS <<
"\t.thumb_func";
285void ARMTargetAsmStreamer::emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value) {
286 const MCAsmInfo &MAI = Streamer.getContext().getAsmInfo();
288 OS <<
"\t.thumb_set\t";
295void ARMTargetAsmStreamer::emitInst(uint32_t Inst,
char Suffix) {
302void ARMTargetAsmStreamer::emitUnwindRaw(int64_t
Offset,
303 const SmallVectorImpl<uint8_t> &Opcodes) {
304 OS <<
"\t.unwind_raw " <<
Offset;
305 for (uint8_t Opcode : Opcodes)
310void ARMTargetAsmStreamer::emitARMWinCFIAllocStack(
unsigned Size,
bool Wide) {
312 OS <<
"\t.seh_stackalloc_w\t" <<
Size <<
"\n";
314 OS <<
"\t.seh_stackalloc\t" <<
Size <<
"\n";
317static void printRegs(formatted_raw_ostream &OS, ListSeparator &LS,
int First,
325void ARMTargetAsmStreamer::emitARMWinCFISaveRegMask(
unsigned Mask,
bool Wide) {
327 OS <<
"\t.seh_save_regs_w\t";
329 OS <<
"\t.seh_save_regs\t";
333 for (
int I = 0;
I <= 12;
I++) {
334 if (Mask & (1 <<
I)) {
339 printRegs(OS, LS,
First,
I - 1);
345 printRegs(OS, LS,
First, 12);
346 if (Mask & (1 << 14))
351void ARMTargetAsmStreamer::emitARMWinCFISaveSP(
unsigned Reg) {
352 OS <<
"\t.seh_save_sp\tr" <<
Reg <<
"\n";
355void ARMTargetAsmStreamer::emitARMWinCFISaveFRegs(
unsigned First,
358 OS <<
"\t.seh_save_fregs\t{d" <<
First <<
"-d" <<
Last <<
"}\n";
360 OS <<
"\t.seh_save_fregs\t{d" <<
First <<
"}\n";
363void ARMTargetAsmStreamer::emitARMWinCFISaveLR(
unsigned Offset) {
364 OS <<
"\t.seh_save_lr\t" <<
Offset <<
"\n";
367void ARMTargetAsmStreamer::emitARMWinCFIPrologEnd(
bool Fragment) {
369 OS <<
"\t.seh_endprologue_fragment\n";
371 OS <<
"\t.seh_endprologue\n";
374void ARMTargetAsmStreamer::emitARMWinCFINop(
bool Wide) {
376 OS <<
"\t.seh_nop_w\n";
378 OS <<
"\t.seh_nop\n";
381void ARMTargetAsmStreamer::emitARMWinCFIEpilogStart(
unsigned Condition) {
383 OS <<
"\t.seh_startepilogue\n";
385 OS <<
"\t.seh_startepilogue_cond\t"
389void ARMTargetAsmStreamer::emitARMWinCFIEpilogEnd() {
390 OS <<
"\t.seh_endepilogue\n";
393void ARMTargetAsmStreamer::emitARMWinCFICustom(
unsigned Opcode) {
395 for (
I = 3;
I > 0;
I--)
396 if (Opcode & (0xffu << (8 *
I)))
399 OS <<
"\t.seh_custom\t";
401 OS << LS << ((Opcode >> (8 *
I)) & 0xff);
405class ARMTargetELFStreamer :
public ARMTargetStreamer {
407 StringRef CurrentVendor;
412 MCSection *AttributeSection =
nullptr;
414 void emitArchDefaultAttributes();
415 void emitFPUDefaultAttributes();
417 ARMELFStreamer &getStreamer();
419 void emitFnStart()
override;
420 void emitFnEnd()
override;
421 void emitCantUnwind()
override;
422 void emitPersonality(
const MCSymbol *Personality)
override;
423 void emitPersonalityIndex(
unsigned Index)
override;
424 void emitHandlerData()
override;
425 void emitSetFP(MCRegister FpReg, MCRegister SpReg,
426 int64_t
Offset = 0)
override;
427 void emitMovSP(MCRegister
Reg, int64_t
Offset = 0)
override;
428 void emitPad(int64_t
Offset)
override;
429 void emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
430 bool isVector)
override;
431 void emitUnwindRaw(int64_t
Offset,
432 const SmallVectorImpl<uint8_t> &Opcodes)
override;
434 void switchVendor(StringRef Vendor)
override;
437 void emitIntTextAttribute(
unsigned Attribute,
unsigned IntValue,
438 StringRef StringValue)
override;
442 void emitInst(uint32_t Inst,
char Suffix =
'\0')
override;
443 void finishAttributeSection()
override;
444 void emitLabel(MCSymbol *Symbol)
override;
446 void annotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE)
override;
447 void emitCode16()
override;
448 void emitCode32()
override;
449 void emitThumbFunc(MCSymbol *Symbol)
override;
450 void emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value)
override;
453 void reset()
override;
455 void finish()
override;
458 ARMTargetELFStreamer(MCStreamer &S)
459 : ARMTargetStreamer(S), CurrentVendor(
"aeabi") {}
474class ARMELFStreamer :
public MCELFStreamer {
476 friend class ARMTargetELFStreamer;
478 ARMELFStreamer(MCContext &
Context, std::unique_ptr<MCAsmBackend> TAB,
479 std::unique_ptr<MCObjectWriter> OW,
480 std::unique_ptr<MCCodeEmitter>
Emitter,
bool IsThumb,
484 IsThumb(IsThumb), IsAndroid(IsAndroid) {
488 ~ARMELFStreamer()
override =
default;
493 void emitCantUnwind();
494 void emitPersonality(
const MCSymbol *Per);
495 void emitPersonalityIndex(
unsigned index);
496 void emitHandlerData();
497 void emitSetFP(MCRegister NewFpReg, MCRegister NewSpReg, int64_t
Offset = 0);
498 void emitMovSP(MCRegister
Reg, int64_t
Offset = 0);
499 void emitPad(int64_t
Offset);
500 void emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
bool isVector);
501 void emitUnwindRaw(int64_t
Offset,
const SmallVectorImpl<uint8_t> &Opcodes);
502 void emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
503 SMLoc Loc)
override {
504 emitDataMappingSymbol();
508 void changeSection(MCSection *Section, uint32_t Subsection)
override {
509 LastMappingSymbols[getCurrentSection().first] = std::move(LastEMSInfo);
511 auto LastMappingSymbol = LastMappingSymbols.find(Section);
512 if (LastMappingSymbol != LastMappingSymbols.end()) {
513 LastEMSInfo = std::move(LastMappingSymbol->second);
516 LastEMSInfo.reset(
new ElfMappingSymbolInfo);
523 const MCSubtargetInfo &STI)
override {
525 EmitThumbMappingSymbol();
527 EmitARMMappingSymbol();
529 MCELFStreamer::emitInstruction(Inst, STI);
532 void emitInst(uint32_t Inst,
char Suffix) {
535 const bool LittleEndian =
getContext().getAsmInfo().isLittleEndian();
542 EmitARMMappingSymbol();
544 const unsigned I = LittleEndian ? (
Size -
II - 1) :
II;
545 Buffer[
Size -
II - 1] = uint8_t(Inst >>
I * CHAR_BIT);
551 Size = (Suffix ==
'n' ? 2 : 4);
554 EmitThumbMappingSymbol();
558 const unsigned I0 = LittleEndian ?
II + 0 :
II + 1;
559 const unsigned I1 = LittleEndian ?
II + 1 :
II + 0;
560 Buffer[
Size -
II - 2] = uint8_t(Inst >> I0 * CHAR_BIT);
561 Buffer[
Size -
II - 1] = uint8_t(Inst >> I1 * CHAR_BIT);
569 MCELFStreamer::emitBytes(StringRef(Buffer,
Size));
575 void emitBytes(StringRef
Data)
override {
576 emitDataMappingSymbol();
577 MCELFStreamer::emitBytes(
Data);
580 void FlushPendingMappingSymbol() {
581 if (!LastEMSInfo->hasInfo())
583 ElfMappingSymbolInfo *EMS = LastEMSInfo.get();
584 emitMappingSymbol(
"$d", *EMS->F, EMS->Offset);
591 void emitValueImpl(
const MCExpr *
Value,
unsigned Size, SMLoc Loc)
override {
594 getContext().reportError(Loc,
"relocated expression must be 32-bit");
597 getCurrentFragment();
600 emitDataMappingSymbol();
601 MCELFStreamer::emitValueImpl(
Value,
Size, Loc);
624 Symbol->isDefined() && ThumbLabels.contains(Symbol))
625 getAssembler().setIsThumbFunc(Symbol);
630 void setIsThumb(
bool Val) { IsThumb = Val; }
633 enum ElfMappingSymbol {
640 struct ElfMappingSymbolInfo {
645 bool hasInfo() {
return F !=
nullptr; }
646 MCFragment *
F =
nullptr;
648 ElfMappingSymbol State = EMS_None;
651 void emitDataMappingSymbol() {
652 if (LastEMSInfo->State == EMS_Data)
654 else if (LastEMSInfo->State == EMS_None) {
657 ElfMappingSymbolInfo *EMS = LastEMSInfo.get();
658 auto *
DF = getCurrentFragment();
662 EMS->Offset =
DF->getFixedSize();
663 LastEMSInfo->State = EMS_Data;
666 EmitMappingSymbol(
"$d");
667 LastEMSInfo->State = EMS_Data;
670 void EmitThumbMappingSymbol() {
671 if (LastEMSInfo->State == EMS_Thumb)
673 FlushPendingMappingSymbol();
674 EmitMappingSymbol(
"$t");
675 LastEMSInfo->State = EMS_Thumb;
678 void EmitARMMappingSymbol() {
679 if (LastEMSInfo->State == EMS_ARM)
681 FlushPendingMappingSymbol();
682 EmitMappingSymbol(
"$a");
683 LastEMSInfo->State = EMS_ARM;
686 void EmitMappingSymbol(StringRef Name) {
688 static_cast<MCSymbolELF *
>(
getContext().createLocalSymbol(Name));
695 void emitMappingSymbol(StringRef Name, MCFragment &
F, uint64_t
Offset) {
697 static_cast<MCSymbolELF *
>(
getContext().createLocalSymbol(Name));
698 emitLabelAtPos(Symbol, SMLoc(),
F,
Offset);
707 void reset()
override;
709 void EmitPersonalityFixup(StringRef Name);
710 void FlushPendingOffset();
711 void FlushUnwindOpcodes(
bool NoHandlerData);
713 void SwitchToEHSection(StringRef Prefix,
unsigned Type,
unsigned Flags,
714 SectionKind Kind,
const MCSymbol &Fn);
715 void SwitchToExTabSection(
const MCSymbol &FnStart);
716 void SwitchToExIdxSection(
const MCSymbol &FnStart);
720 DenseSet<const MCSymbol *> ThumbLabels;
722 DenseMap<const MCSection *, std::unique_ptr<ElfMappingSymbolInfo>>
725 std::unique_ptr<ElfMappingSymbolInfo> LastEMSInfo;
731 unsigned PersonalityIndex;
735 int64_t PendingOffset;
739 UnwindOpcodeAssembler UnwindOpAsm;
744ARMELFStreamer &ARMTargetELFStreamer::getStreamer() {
745 return static_cast<ARMELFStreamer &
>(Streamer);
748void ARMTargetELFStreamer::emitFnStart() { getStreamer().emitFnStart(); }
749void ARMTargetELFStreamer::emitFnEnd() { getStreamer().emitFnEnd(); }
750void ARMTargetELFStreamer::emitCantUnwind() { getStreamer().emitCantUnwind(); }
752void ARMTargetELFStreamer::emitPersonality(
const MCSymbol *Personality) {
753 getStreamer().emitPersonality(Personality);
756void ARMTargetELFStreamer::emitPersonalityIndex(
unsigned Index) {
757 getStreamer().emitPersonalityIndex(Index);
760void ARMTargetELFStreamer::emitHandlerData() {
761 getStreamer().emitHandlerData();
764void ARMTargetELFStreamer::emitSetFP(MCRegister FpReg, MCRegister SpReg,
766 getStreamer().emitSetFP(FpReg, SpReg,
Offset);
769void ARMTargetELFStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
773void ARMTargetELFStreamer::emitPad(int64_t
Offset) {
774 getStreamer().emitPad(
Offset);
777void ARMTargetELFStreamer::emitRegSave(
778 const SmallVectorImpl<MCRegister> &RegList,
bool isVector) {
779 getStreamer().emitRegSave(RegList, isVector);
782void ARMTargetELFStreamer::emitUnwindRaw(int64_t
Offset,
783 const SmallVectorImpl<uint8_t> &Opcodes) {
784 getStreamer().emitUnwindRaw(
Offset, Opcodes);
787void ARMTargetELFStreamer::switchVendor(StringRef Vendor) {
788 assert(!Vendor.
empty() &&
"Vendor cannot be empty.");
790 if (CurrentVendor == Vendor)
793 if (!CurrentVendor.
empty())
794 finishAttributeSection();
796 assert(getStreamer().Contents.empty() &&
797 ".ARM.attributes should be flushed before changing vendor");
798 CurrentVendor = Vendor;
802void ARMTargetELFStreamer::emitAttribute(
unsigned Attribute,
unsigned Value) {
807void ARMTargetELFStreamer::emitTextAttribute(
unsigned Attribute,
813void ARMTargetELFStreamer::emitIntTextAttribute(
unsigned Attribute,
815 StringRef StringValue) {
816 getStreamer().setAttributeItems(
Attribute, IntValue, StringValue,
828void ARMTargetELFStreamer::emitArchDefaultAttributes() {
829 using namespace ARMBuildAttrs;
830 ARMELFStreamer &S = getStreamer();
834 if (EmittedArch == ARM::ArchKind::INVALID)
840 case ARM::ArchKind::ARMV4:
841 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
844 case ARM::ArchKind::ARMV4T:
845 case ARM::ArchKind::ARMV5T:
846 case ARM::ArchKind::XSCALE:
847 case ARM::ArchKind::ARMV5TE:
848 case ARM::ArchKind::ARMV6:
849 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
850 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
853 case ARM::ArchKind::ARMV6T2:
854 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
855 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
858 case ARM::ArchKind::ARMV6K:
859 case ARM::ArchKind::ARMV6KZ:
860 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
861 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
862 S.setAttributeItem(Virtualization_use, AllowTZ,
false);
865 case ARM::ArchKind::ARMV6M:
866 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
869 case ARM::ArchKind::ARMV7A:
870 S.setAttributeItem(CPU_arch_profile, ApplicationProfile,
false);
871 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
872 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
875 case ARM::ArchKind::ARMV7R:
876 S.setAttributeItem(CPU_arch_profile, RealTimeProfile,
false);
877 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
878 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
881 case ARM::ArchKind::ARMV7EM:
882 case ARM::ArchKind::ARMV7M:
883 S.setAttributeItem(CPU_arch_profile, MicroControllerProfile,
false);
884 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
887 case ARM::ArchKind::ARMV8A:
888 case ARM::ArchKind::ARMV8_1A:
889 case ARM::ArchKind::ARMV8_2A:
890 case ARM::ArchKind::ARMV8_3A:
891 case ARM::ArchKind::ARMV8_4A:
892 case ARM::ArchKind::ARMV8_5A:
893 case ARM::ArchKind::ARMV8_6A:
894 case ARM::ArchKind::ARMV8_7A:
895 case ARM::ArchKind::ARMV8_8A:
896 case ARM::ArchKind::ARMV8_9A:
897 case ARM::ArchKind::ARMV9A:
898 case ARM::ArchKind::ARMV9_1A:
899 case ARM::ArchKind::ARMV9_2A:
900 case ARM::ArchKind::ARMV9_3A:
901 case ARM::ArchKind::ARMV9_4A:
902 case ARM::ArchKind::ARMV9_5A:
903 case ARM::ArchKind::ARMV9_6A:
904 case ARM::ArchKind::ARMV9_7A:
905 S.setAttributeItem(CPU_arch_profile, ApplicationProfile,
false);
906 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
907 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
908 S.setAttributeItem(MPextension_use, Allowed,
false);
909 S.setAttributeItem(Virtualization_use, AllowTZVirtualization,
false);
912 case ARM::ArchKind::ARMV8MBaseline:
913 case ARM::ArchKind::ARMV8MMainline:
914 case ARM::ArchKind::ARMV8_1MMainline:
915 S.setAttributeItem(THUMB_ISA_use, AllowThumbDerived,
false);
916 S.setAttributeItem(CPU_arch_profile, MicroControllerProfile,
false);
919 case ARM::ArchKind::IWMMXT:
920 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
921 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
922 S.setAttributeItem(WMMX_arch, AllowWMMXv1,
false);
925 case ARM::ArchKind::IWMMXT2:
926 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
927 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
928 S.setAttributeItem(WMMX_arch, AllowWMMXv2,
false);
939void ARMTargetELFStreamer::emitFPUDefaultAttributes() {
940 ARMELFStreamer &S = getStreamer();
954 case ARM::FK_VFPV3_FP16:
961 case ARM::FK_VFPV3_D16:
966 case ARM::FK_VFPV3_D16_FP16:
973 case ARM::FK_VFPV3XD:
977 case ARM::FK_VFPV3XD_FP16:
991 case ARM::FK_FPV4_SP_D16:
992 case ARM::FK_VFPV4_D16:
997 case ARM::FK_FP_ARMV8:
1004 case ARM::FK_FPV5_SP_D16:
1005 case ARM::FK_FPV5_D16:
1008 case ARM::FK_FP_ARMV8_FULLFP16_SP_D16:
1009 case ARM::FK_FP_ARMV8_FULLFP16_D16:
1022 case ARM::FK_NEON_FP16:
1032 case ARM::FK_NEON_VFPV4:
1040 case ARM::FK_NEON_FP_ARMV8:
1041 case ARM::FK_CRYPTO_NEON_FP_ARMV8:
1048 case ARM::FK_SOFTVFP:
1058void ARMTargetELFStreamer::finishAttributeSection() {
1059 ARMELFStreamer &S = getStreamer();
1061 if (FPU != ARM::FK_INVALID)
1062 emitFPUDefaultAttributes();
1064 if (Arch != ARM::ArchKind::INVALID)
1065 emitArchDefaultAttributes();
1067 if (S.Contents.empty())
1070 auto LessTag = [](
const MCELFStreamer::AttributeItem &
LHS,
1071 const MCELFStreamer::AttributeItem &
RHS) ->
bool {
1088 S.emitAttributesSection(CurrentVendor,
".ARM.attributes",
1091 FPU = ARM::FK_INVALID;
1094void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
1095 ARMELFStreamer &Streamer = getStreamer();
1096 if (!Streamer.IsThumb)
1099 Streamer.ThumbLabels.insert(Symbol);
1100 Streamer.getAssembler().registerSymbol(*Symbol);
1103 emitThumbFunc(Symbol);
1106void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
1107 const MCSymbolRefExpr *Expr) {
1108 getStreamer().addFixup(Expr,
FK_Data_4);
1111void ARMTargetELFStreamer::emitCode16() { getStreamer().setIsThumb(
true); }
1113void ARMTargetELFStreamer::emitCode32() { getStreamer().setIsThumb(
false); }
1115void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Symbol) {
1116 getStreamer().getAssembler().setIsThumbFunc(Symbol);
1120void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value) {
1122 const MCSymbol &Sym = SRE->getSymbol();
1124 getStreamer().emitAssignment(Symbol,
Value);
1129 emitThumbFunc(Symbol);
1130 getStreamer().emitAssignment(Symbol,
Value);
1133void ARMTargetELFStreamer::emitInst(uint32_t Inst,
char Suffix) {
1134 getStreamer().emitInst(Inst, Suffix);
1137void ARMTargetELFStreamer::reset() { AttributeSection =
nullptr; }
1139void ARMTargetELFStreamer::finish() {
1140 ARMTargetStreamer::finish();
1141 finishAttributeSection();
1149 auto &
Asm = getStreamer().getAssembler();
1150 if (
any_of(Asm, [](
const MCSection &Sec) {
1151 return static_cast<const MCSectionELF &
>(Sec).
getFlags() &
1156 for (
auto &
F : *
Text)
1163void ARMELFStreamer::reset() {
1164 MCTargetStreamer &TS = *getTargetStreamer();
1165 ARMTargetStreamer &ATS =
static_cast<ARMTargetStreamer &
>(TS);
1168 ThumbLabels.clear();
1169 LastMappingSymbols.clear();
1170 LastEMSInfo.reset();
1177inline void ARMELFStreamer::SwitchToEHSection(StringRef Prefix,
1181 const MCSymbol &Fn) {
1182 const MCSectionELF &FnSection =
1183 static_cast<const MCSectionELF &
>(Fn.
getSection());
1186 StringRef FnSecName(FnSection.
getName());
1187 SmallString<128> EHSecName(Prefix);
1188 if (FnSecName !=
".text") {
1189 EHSecName += FnSecName;
1193 const MCSymbolELF *Group = FnSection.
getGroup();
1196 MCSectionELF *EHSection =
getContext().getELFSection(
1197 EHSecName,
Type, Flags, 0, Group,
true,
1201 assert(EHSection &&
"Failed to get the required EH section");
1204 switchSection(EHSection);
1205 emitValueToAlignment(
Align(4), 0, 1, 0);
1208inline void ARMELFStreamer::SwitchToExTabSection(
const MCSymbol &FnStart) {
1213inline void ARMELFStreamer::SwitchToExIdxSection(
const MCSymbol &FnStart) {
1219void ARMELFStreamer::EHReset() {
1222 Personality =
nullptr;
1232 UnwindOpAsm.
Reset();
1235void ARMELFStreamer::emitFnStart() {
1236 assert(FnStart ==
nullptr);
1241void ARMELFStreamer::emitFnEnd() {
1242 assert(FnStart &&
".fnstart must precedes .fnend");
1245 if (!ExTab && !CantUnwind)
1246 FlushUnwindOpcodes(
true);
1249 SwitchToExIdxSection(*FnStart);
1259 const MCSymbolRefExpr *FnStartRef =
1262 emitValue(FnStartRef, 4);
1268 const MCSymbolRefExpr *ExTabEntryRef =
1270 emitValue(ExTabEntryRef, 4);
1276 "Compact model must use __aeabi_unwind_cpp_pr0 as personality");
1278 "Unwind opcode size for __aeabi_unwind_cpp_pr0 must be equal to 4");
1279 uint64_t Intval = Opcodes[0] |
1283 emitIntValue(Intval, Opcodes.
size());
1293void ARMELFStreamer::emitCantUnwind() { CantUnwind =
true; }
1296void ARMELFStreamer::EmitPersonalityFixup(StringRef Name) {
1298 visitUsedSymbol(*PersonalitySym);
1300 const MCSymbolRefExpr *PersonalityRef =
1305void ARMELFStreamer::FlushPendingOffset() {
1306 if (PendingOffset != 0) {
1312void ARMELFStreamer::FlushUnwindOpcodes(
bool NoHandlerData) {
1315 const MCRegisterInfo *MRI =
getContext().getRegisterInfo();
1316 int64_t LastRegSaveSPOffset = SPOffset - PendingOffset;
1317 UnwindOpAsm.
EmitSPOffset(LastRegSaveSPOffset - FPOffset);
1320 FlushPendingOffset();
1324 UnwindOpAsm.
Finalize(PersonalityIndex, Opcodes);
1333 SwitchToExTabSection(*FnStart);
1345 emitValue(PersonalityRef, 4);
1350 "Unwind opcode size for __aeabi_cpp_unwind_pr0 must be multiple of 4");
1351 for (
unsigned I = 0;
I != Opcodes.
size();
I += 4) {
1352 uint64_t Intval = Opcodes[
I] |
1353 Opcodes[
I + 1] << 8 |
1354 Opcodes[
I + 2] << 16 |
1355 Opcodes[
I + 3] << 24;
1366 if (NoHandlerData && !Personality)
1370void ARMELFStreamer::emitHandlerData() { FlushUnwindOpcodes(
false); }
1372void ARMELFStreamer::emitPersonality(
const MCSymbol *Per) {
1377void ARMELFStreamer::emitPersonalityIndex(
unsigned Index) {
1379 PersonalityIndex =
Index;
1382void ARMELFStreamer::emitSetFP(MCRegister NewFPReg, MCRegister NewSPReg,
1384 assert((NewSPReg == ARM::SP || NewSPReg ==
FPReg) &&
1385 "the operand of .setfp directive should be either $sp or $fp");
1390 if (NewSPReg == ARM::SP)
1391 FPOffset = SPOffset +
Offset;
1396void ARMELFStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
1398 "the operand of .movsp cannot be either sp or pc");
1399 assert(
FPReg == ARM::SP &&
"current FP must be SP");
1401 FlushPendingOffset();
1404 FPOffset = SPOffset +
Offset;
1406 const MCRegisterInfo *MRI =
getContext().getRegisterInfo();
1410void ARMELFStreamer::emitPad(int64_t
Offset) {
1419static std::pair<unsigned, unsigned>
1427 if (
Reg == ARM::RA_AUTH_CODE)
1430 assert(RegEnc < (IsVector ? 32U : 16U) &&
"Register out of range");
1431 unsigned Bit = (1u << RegEnc);
1432 if ((Mask & Bit) == 0) {
1440 return {Idx,
Count};
1443void ARMELFStreamer::emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
1446 unsigned Idx,
Count;
1447 const MCRegisterInfo &MRI = *
getContext().getRegisterInfo();
1455 Idx = RegList.
size();
1463 SPOffset -=
Count * (IsVector ? 8 : 4);
1466 FlushPendingOffset();
1471 }
else if (Idx > 0 && RegList[Idx - 1] == ARM::RA_AUTH_CODE) {
1474 FlushPendingOffset();
1480void ARMELFStreamer::emitUnwindRaw(int64_t
Offset,
1481 const SmallVectorImpl<uint8_t> &Opcodes) {
1482 FlushPendingOffset();
1483 SPOffset = SPOffset -
Offset;
1492 return new ARMTargetAsmStreamer(S, OS, *InstPrint);
1500 return new ARMTargetELFStreamer(S);
1504 std::unique_ptr<MCAsmBackend> TAB,
1505 std::unique_ptr<MCObjectWriter> OW,
1506 std::unique_ptr<MCCodeEmitter>
Emitter,
1507 bool IsThumb,
bool IsAndroid) {
1509 new ARMELFStreamer(Context, std::move(TAB), std::move(OW),
1510 std::move(
Emitter), IsThumb, IsAndroid);
static void addFixup(SmallVectorImpl< MCFixup > &Fixups, uint32_t Offset, const MCExpr *Value, uint16_t Kind, bool PCRel=false)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static std::pair< unsigned, unsigned > collectHWRegs(const MCRegisterInfo &MRI, unsigned Idx, const SmallVectorImpl< MCRegister > &RegList, bool IsVector, uint32_t &Mask_)
static std::string GetAEABIUnwindPersonalityName(unsigned Index)
dxil DXContainer Global Emitter
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
uint64_t IntrinsicInst * II
static constexpr MCPhysReg FPReg
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file defines the SmallString class.
This file defines the SmallVector class.
static uint32_t getFlags(const Symbol *Sym)
static SymbolRef::Type getType(const Symbol *Sym)
virtual void reset()
Reset any state between object emissions, i.e.
void printExpr(raw_ostream &, const MCExpr &) const
bool hasSubsectionsViaSymbols() const
Context object for machine code objects.
const MCObjectFileInfo * getObjectFileInfo() const
void changeSection(MCSection *Section, uint32_t Subsection=0) override
This is called by popSection and switchSection, if the current section changes.
void reset() override
state management
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override
Add the given Attribute to Symbol.
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
virtual void printRegName(raw_ostream &OS, MCRegister Reg)
Print the assembler register name.
void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc=SMLoc()) override
Emit Size bytes worth of the value specified by FillValue.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
uint16_t getEncodingValue(MCRegister Reg) const
Returns the encoding for Reg.
Wrapper class representing physical registers. Should be passed by value.
unsigned getUniqueID() const
const MCSymbolELF * getGroup() const
StringRef getName() const
MCSymbol * getBeginSymbol()
Streaming machine code generation interface.
const MCSymbol & getSymbol() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
StringRef getName() const
getName - Get the symbol name.
MCSection & getSection() const
Get the section associated with a defined, non-absolute symbol.
Target specific streamer interface.
static SectionKind getData()
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
constexpr bool empty() const
Check if the string is empty.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static Twine utohexstr(uint64_t Val)
void EmitSetSP(uint16_t Reg)
Emit unwind opcodes to copy address from source register to $sp.
void EmitVFPRegSave(uint32_t VFPRegSave)
Emit unwind opcodes for .vsave directives.
void EmitRegSave(uint32_t RegSave)
Emit unwind opcodes for .save directives.
void setPersonality(const MCSymbol *Per)
Set the personality.
void EmitSPOffset(int64_t Offset)
Emit unwind opcodes to add $sp with an offset.
void Reset()
Reset the unwind opcode assembler.
void EmitRaw(const SmallVectorImpl< uint8_t > &Opcodes)
Emit unwind raw opcodes.
void Finalize(unsigned &PersonalityIndex, SmallVectorImpl< uint8_t > &Result)
Finalize the unwind opcode sequence for emitBytes()
raw_ostream & write_escaped(StringRef Str, bool UseHexEscapes=false)
Output Str, turning '\', '\t', ' ', '"', and anything that doesn't satisfy llvm::isPrint into an esca...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
LLVM_ABI const TagNameMap & getARMAttributeTags()
@ EXIDX_CANTUNWIND
Special entry for the function never unwind.
LLVM_ABI StringRef getArchExtName(uint64_t ArchExtKind)
LLVM_ABI StringRef getCPUAttr(ArchKind AK)
LLVM_ABI StringRef getArchName(ArchKind AK)
LLVM_ABI unsigned getArchAttr(ArchKind AK)
LLVM_ABI StringRef getFPUName(FPUKind FPUKind)
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
LLVM_ABI StringRef attrTypeAsString(unsigned attr, TagNameMap tagNameMap, bool hasTagPrefix=true)
void emitInstruction(MCObjectStreamer &, const MCInst &Inst, const MCSubtargetInfo &STI)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI MCELFStreamer * createARMELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter, bool IsThumb, bool IsAndroid)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
MCTargetStreamer * createARMObjectTargetELFStreamer(MCStreamer &S)
auto dyn_cast_or_null(const Y &Val)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
@ FK_Data_4
A four-byte fixup.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
static const char * ARMCondCodeToString(ARMCC::CondCodes CC)
MCTargetStreamer * createARMNullTargetStreamer(MCStreamer &S)
MCTargetStreamer * createARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function