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 case ARM::ArchKind::ARMV9_8A:
906 S.setAttributeItem(CPU_arch_profile, ApplicationProfile,
false);
907 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
908 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
909 S.setAttributeItem(MPextension_use, Allowed,
false);
910 S.setAttributeItem(Virtualization_use, AllowTZVirtualization,
false);
913 case ARM::ArchKind::ARMV8MBaseline:
914 case ARM::ArchKind::ARMV8MMainline:
915 case ARM::ArchKind::ARMV8_1MMainline:
916 S.setAttributeItem(THUMB_ISA_use, AllowThumbDerived,
false);
917 S.setAttributeItem(CPU_arch_profile, MicroControllerProfile,
false);
920 case ARM::ArchKind::IWMMXT:
921 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
922 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
923 S.setAttributeItem(WMMX_arch, AllowWMMXv1,
false);
926 case ARM::ArchKind::IWMMXT2:
927 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
928 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
929 S.setAttributeItem(WMMX_arch, AllowWMMXv2,
false);
940void ARMTargetELFStreamer::emitFPUDefaultAttributes() {
941 ARMELFStreamer &S = getStreamer();
955 case ARM::FK_VFPV3_FP16:
962 case ARM::FK_VFPV3_D16:
967 case ARM::FK_VFPV3_D16_FP16:
974 case ARM::FK_VFPV3XD:
978 case ARM::FK_VFPV3XD_FP16:
992 case ARM::FK_FPV4_SP_D16:
993 case ARM::FK_VFPV4_D16:
998 case ARM::FK_FP_ARMV8:
1005 case ARM::FK_FPV5_SP_D16:
1006 case ARM::FK_FPV5_D16:
1009 case ARM::FK_FP_ARMV8_FULLFP16_SP_D16:
1010 case ARM::FK_FP_ARMV8_FULLFP16_D16:
1023 case ARM::FK_NEON_FP16:
1033 case ARM::FK_NEON_VFPV4:
1041 case ARM::FK_NEON_FP_ARMV8:
1042 case ARM::FK_CRYPTO_NEON_FP_ARMV8:
1049 case ARM::FK_SOFTVFP:
1059void ARMTargetELFStreamer::finishAttributeSection() {
1060 ARMELFStreamer &S = getStreamer();
1062 if (FPU != ARM::FK_INVALID)
1063 emitFPUDefaultAttributes();
1065 if (Arch != ARM::ArchKind::INVALID)
1066 emitArchDefaultAttributes();
1068 if (S.Contents.empty())
1071 auto LessTag = [](
const MCELFStreamer::AttributeItem &
LHS,
1072 const MCELFStreamer::AttributeItem &
RHS) ->
bool {
1089 S.emitAttributesSection(CurrentVendor,
".ARM.attributes",
1092 FPU = ARM::FK_INVALID;
1095void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
1096 ARMELFStreamer &
Streamer = getStreamer();
1100 Streamer.ThumbLabels.insert(Symbol);
1101 Streamer.getAssembler().registerSymbol(*Symbol);
1104 emitThumbFunc(Symbol);
1107void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
1108 const MCSymbolRefExpr *Expr) {
1109 getStreamer().addFixup(Expr,
FK_Data_4);
1112void ARMTargetELFStreamer::emitCode16() { getStreamer().setIsThumb(
true); }
1114void ARMTargetELFStreamer::emitCode32() { getStreamer().setIsThumb(
false); }
1116void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Symbol) {
1117 getStreamer().getAssembler().setIsThumbFunc(Symbol);
1121void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value) {
1123 const MCSymbol &Sym = SRE->getSymbol();
1125 getStreamer().emitAssignment(Symbol,
Value);
1130 emitThumbFunc(Symbol);
1131 getStreamer().emitAssignment(Symbol,
Value);
1134void ARMTargetELFStreamer::emitInst(uint32_t Inst,
char Suffix) {
1135 getStreamer().emitInst(Inst, Suffix);
1138void ARMTargetELFStreamer::reset() { AttributeSection =
nullptr; }
1140void ARMTargetELFStreamer::finish() {
1141 ARMTargetStreamer::finish();
1142 finishAttributeSection();
1150 auto &
Asm = getStreamer().getAssembler();
1151 if (
any_of(Asm, [](
const MCSection &Sec) {
1152 return static_cast<const MCSectionELF &
>(Sec).
getFlags() &
1157 for (
auto &
F : *
Text)
1164void ARMELFStreamer::reset() {
1165 MCTargetStreamer &TS = *getTargetStreamer();
1166 ARMTargetStreamer &ATS =
static_cast<ARMTargetStreamer &
>(TS);
1169 ThumbLabels.clear();
1170 LastMappingSymbols.clear();
1171 LastEMSInfo.reset();
1178inline void ARMELFStreamer::SwitchToEHSection(StringRef Prefix,
1182 const MCSymbol &Fn) {
1183 const MCSectionELF &FnSection =
1184 static_cast<const MCSectionELF &
>(Fn.
getSection());
1187 StringRef FnSecName(FnSection.
getName());
1188 SmallString<128> EHSecName(Prefix);
1189 if (FnSecName !=
".text") {
1190 EHSecName += FnSecName;
1194 const MCSymbolELF *Group = FnSection.
getGroup();
1197 MCSectionELF *EHSection =
getContext().getELFSection(
1198 EHSecName,
Type, Flags, 0, Group,
true,
1202 assert(EHSection &&
"Failed to get the required EH section");
1205 switchSection(EHSection);
1206 emitValueToAlignment(
Align(4), 0, 1, 0);
1209inline void ARMELFStreamer::SwitchToExTabSection(
const MCSymbol &FnStart) {
1214inline void ARMELFStreamer::SwitchToExIdxSection(
const MCSymbol &FnStart) {
1220void ARMELFStreamer::EHReset() {
1223 Personality =
nullptr;
1233 UnwindOpAsm.
Reset();
1236void ARMELFStreamer::emitFnStart() {
1237 assert(FnStart ==
nullptr);
1242void ARMELFStreamer::emitFnEnd() {
1243 assert(FnStart &&
".fnstart must precedes .fnend");
1246 if (!ExTab && !CantUnwind)
1247 FlushUnwindOpcodes(
true);
1250 SwitchToExIdxSection(*FnStart);
1260 const MCSymbolRefExpr *FnStartRef =
1263 emitValue(FnStartRef, 4);
1269 const MCSymbolRefExpr *ExTabEntryRef =
1271 emitValue(ExTabEntryRef, 4);
1277 "Compact model must use __aeabi_unwind_cpp_pr0 as personality");
1279 "Unwind opcode size for __aeabi_unwind_cpp_pr0 must be equal to 4");
1284 emitIntValue(Intval, Opcodes.
size());
1294void ARMELFStreamer::emitCantUnwind() { CantUnwind =
true; }
1297void ARMELFStreamer::EmitPersonalityFixup(StringRef Name) {
1299 visitUsedSymbol(*PersonalitySym);
1301 const MCSymbolRefExpr *PersonalityRef =
1306void ARMELFStreamer::FlushPendingOffset() {
1307 if (PendingOffset != 0) {
1313void ARMELFStreamer::FlushUnwindOpcodes(
bool NoHandlerData) {
1316 const MCRegisterInfo *MRI =
getContext().getRegisterInfo();
1317 int64_t LastRegSaveSPOffset = SPOffset - PendingOffset;
1318 UnwindOpAsm.
EmitSPOffset(LastRegSaveSPOffset - FPOffset);
1321 FlushPendingOffset();
1325 UnwindOpAsm.
Finalize(PersonalityIndex, Opcodes);
1334 SwitchToExTabSection(*FnStart);
1346 emitValue(PersonalityRef, 4);
1351 "Unwind opcode size for __aeabi_cpp_unwind_pr0 must be multiple of 4");
1352 for (
unsigned I = 0;
I != Opcodes.
size();
I += 4) {
1354 Opcodes[
I + 1] << 8 |
1355 Opcodes[
I + 2] << 16 |
1356 Opcodes[
I + 3] << 24;
1367 if (NoHandlerData && !Personality)
1371void ARMELFStreamer::emitHandlerData() { FlushUnwindOpcodes(
false); }
1373void ARMELFStreamer::emitPersonality(
const MCSymbol *Per) {
1378void ARMELFStreamer::emitPersonalityIndex(
unsigned Index) {
1380 PersonalityIndex =
Index;
1383void ARMELFStreamer::emitSetFP(MCRegister NewFPReg, MCRegister NewSPReg,
1385 assert((NewSPReg == ARM::SP || NewSPReg ==
FPReg) &&
1386 "the operand of .setfp directive should be either $sp or $fp");
1391 if (NewSPReg == ARM::SP)
1392 FPOffset = SPOffset +
Offset;
1397void ARMELFStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
1399 "the operand of .movsp cannot be either sp or pc");
1400 assert(
FPReg == ARM::SP &&
"current FP must be SP");
1402 FlushPendingOffset();
1405 FPOffset = SPOffset +
Offset;
1407 const MCRegisterInfo *MRI =
getContext().getRegisterInfo();
1411void ARMELFStreamer::emitPad(int64_t
Offset) {
1420static std::pair<unsigned, unsigned>
1428 if (
Reg == ARM::RA_AUTH_CODE)
1431 assert(RegEnc < (IsVector ? 32U : 16U) &&
"Register out of range");
1432 unsigned Bit = (1u << RegEnc);
1433 if ((Mask & Bit) == 0) {
1441 return {Idx,
Count};
1444void ARMELFStreamer::emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
1448 const MCRegisterInfo &MRI = *
getContext().getRegisterInfo();
1464 SPOffset -=
Count * (IsVector ? 8 : 4);
1467 FlushPendingOffset();
1472 }
else if (Idx > 0 && RegList[Idx - 1] == ARM::RA_AUTH_CODE) {
1475 FlushPendingOffset();
1481void ARMELFStreamer::emitUnwindRaw(int64_t
Offset,
1482 const SmallVectorImpl<uint8_t> &Opcodes) {
1483 FlushPendingOffset();
1484 SPOffset = SPOffset -
Offset;
1493 return new ARMTargetAsmStreamer(S, OS, *InstPrint);
1501 return new ARMTargetELFStreamer(S);
1505 std::unique_ptr<MCAsmBackend> TAB,
1506 std::unique_ptr<MCObjectWriter> OW,
1507 std::unique_ptr<MCCodeEmitter>
Emitter,
1508 bool IsThumb,
bool IsAndroid) {
1510 new ARMELFStreamer(Context, std::move(TAB), std::move(OW),
1511 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.
std::unique_ptr< MCStreamer > && Streamer
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