62 "Invalid personality index");
63 return (
Twine(
"__aeabi_unwind_cpp_pr") +
Twine(Index)).str();
71 formatted_raw_ostream &OS;
72 MCInstPrinter &InstPrinter;
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(MCRegister FpReg, MCRegister SpReg,
82 int64_t
Offset = 0)
override;
83 void emitMovSP(MCRegister
Reg, int64_t
Offset = 0)
override;
84 void emitPad(int64_t
Offset)
override;
85 void emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
86 bool isVector)
override;
87 void emitUnwindRaw(int64_t
Offset,
88 const SmallVectorImpl<uint8_t> &Opcodes)
override;
90 void switchVendor(StringRef Vendor)
override;
93 void emitIntTextAttribute(
unsigned Attribute,
unsigned IntValue,
94 StringRef StringValue)
override;
96 void emitArchExtension(uint64_t ArchExt)
override;
99 void emitInst(uint32_t Inst,
char Suffix =
'\0')
override;
100 void finishAttributeSection()
override;
102 void annotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE)
override;
103 void emitSyntaxUnified()
override;
104 void emitCode16()
override;
105 void emitCode32()
override;
106 void emitThumbFunc(MCSymbol *Symbol)
override;
107 void emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value)
override;
109 void emitARMWinCFIAllocStack(
unsigned Size,
bool Wide)
override;
110 void emitARMWinCFISaveRegMask(
unsigned Mask,
bool Wide)
override;
111 void emitARMWinCFISaveSP(
unsigned Reg)
override;
112 void emitARMWinCFISaveFRegs(
unsigned First,
unsigned Last)
override;
113 void emitARMWinCFISaveLR(
unsigned Offset)
override;
114 void emitARMWinCFIPrologEnd(
bool Fragment)
override;
115 void emitARMWinCFINop(
bool Wide)
override;
116 void emitARMWinCFIEpilogStart(
unsigned Condition)
override;
117 void emitARMWinCFIEpilogEnd()
override;
118 void emitARMWinCFICustom(
unsigned Opcode)
override;
121 ARMTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS,
122 MCInstPrinter &InstPrinter);
125ARMTargetAsmStreamer::ARMTargetAsmStreamer(
MCStreamer &S,
129 IsVerboseAsm(S.isVerboseAsm()) {}
131void ARMTargetAsmStreamer::emitFnStart() { OS <<
"\t.fnstart\n"; }
132void ARMTargetAsmStreamer::emitFnEnd() { OS <<
"\t.fnend\n"; }
133void ARMTargetAsmStreamer::emitCantUnwind() { OS <<
"\t.cantunwind\n"; }
135void ARMTargetAsmStreamer::emitPersonality(
const MCSymbol *Personality) {
136 OS <<
"\t.personality " << Personality->
getName() <<
'\n';
139void ARMTargetAsmStreamer::emitPersonalityIndex(
unsigned Index) {
140 OS <<
"\t.personalityindex " <<
Index <<
'\n';
143void ARMTargetAsmStreamer::emitHandlerData() { OS <<
"\t.handlerdata\n"; }
145void ARMTargetAsmStreamer::emitSetFP(MCRegister FpReg, MCRegister SpReg,
156void ARMTargetAsmStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
158 "the operand of .movsp cannot be either sp or pc");
167void ARMTargetAsmStreamer::emitPad(int64_t
Offset) {
168 OS <<
"\t.pad\t#" <<
Offset <<
'\n';
171void ARMTargetAsmStreamer::emitRegSave(
172 const SmallVectorImpl<MCRegister> &RegList,
bool isVector) {
173 assert(RegList.
size() &&
"RegList should not be empty");
181 for (
unsigned i = 1, e = RegList.
size(); i != e; ++i) {
189void ARMTargetAsmStreamer::switchVendor(StringRef Vendor) {}
191void ARMTargetAsmStreamer::emitAttribute(
unsigned Attribute,
unsigned Value) {
197 OS <<
"\t@ " <<
Name;
202void ARMTargetAsmStreamer::emitTextAttribute(
unsigned Attribute,
206 OS <<
"\t.cpu\t" <<
String.lower();
209 OS <<
"\t.eabi_attribute\t" <<
Attribute <<
", \"";
219 OS <<
"\t@ " <<
Name;
226void ARMTargetAsmStreamer::emitIntTextAttribute(
unsigned Attribute,
228 StringRef StringValue) {
232 OS <<
"\t.eabi_attribute\t" <<
Attribute <<
", " << IntValue;
233 if (!StringValue.
empty())
234 OS <<
", \"" << StringValue <<
"\"";
248void ARMTargetAsmStreamer::emitArchExtension(uint64_t ArchExt) {
252void ARMTargetAsmStreamer::emitObjectArch(
ARM::ArchKind Arch) {
260void ARMTargetAsmStreamer::finishAttributeSection() {}
262void ARMTargetAsmStreamer::annotateTLSDescriptorSequence(
263 const MCSymbolRefExpr *S) {
267void ARMTargetAsmStreamer::emitSyntaxUnified() { OS <<
"\t.syntax\tunified\n"; }
269void ARMTargetAsmStreamer::emitCode16() { OS <<
"\t.code\t16\n"; }
271void ARMTargetAsmStreamer::emitCode32() { OS <<
"\t.code\t32\n"; }
273void ARMTargetAsmStreamer::emitThumbFunc(MCSymbol *Symbol) {
274 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
275 OS <<
"\t.thumb_func";
284void ARMTargetAsmStreamer::emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value) {
285 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
287 OS <<
"\t.thumb_set\t";
294void ARMTargetAsmStreamer::emitInst(uint32_t Inst,
char Suffix) {
301void ARMTargetAsmStreamer::emitUnwindRaw(int64_t
Offset,
302 const SmallVectorImpl<uint8_t> &Opcodes) {
303 OS <<
"\t.unwind_raw " <<
Offset;
304 for (uint8_t Opcode : Opcodes)
309void ARMTargetAsmStreamer::emitARMWinCFIAllocStack(
unsigned Size,
bool Wide) {
311 OS <<
"\t.seh_stackalloc_w\t" <<
Size <<
"\n";
313 OS <<
"\t.seh_stackalloc\t" <<
Size <<
"\n";
316static void printRegs(formatted_raw_ostream &OS, ListSeparator &LS,
int First,
324void ARMTargetAsmStreamer::emitARMWinCFISaveRegMask(
unsigned Mask,
bool Wide) {
326 OS <<
"\t.seh_save_regs_w\t";
328 OS <<
"\t.seh_save_regs\t";
332 for (
int I = 0;
I <= 12;
I++) {
333 if (Mask & (1 <<
I)) {
338 printRegs(OS, LS,
First,
I - 1);
344 printRegs(OS, LS,
First, 12);
345 if (Mask & (1 << 14))
350void ARMTargetAsmStreamer::emitARMWinCFISaveSP(
unsigned Reg) {
351 OS <<
"\t.seh_save_sp\tr" <<
Reg <<
"\n";
354void ARMTargetAsmStreamer::emitARMWinCFISaveFRegs(
unsigned First,
357 OS <<
"\t.seh_save_fregs\t{d" <<
First <<
"-d" <<
Last <<
"}\n";
359 OS <<
"\t.seh_save_fregs\t{d" <<
First <<
"}\n";
362void ARMTargetAsmStreamer::emitARMWinCFISaveLR(
unsigned Offset) {
363 OS <<
"\t.seh_save_lr\t" <<
Offset <<
"\n";
366void ARMTargetAsmStreamer::emitARMWinCFIPrologEnd(
bool Fragment) {
368 OS <<
"\t.seh_endprologue_fragment\n";
370 OS <<
"\t.seh_endprologue\n";
373void ARMTargetAsmStreamer::emitARMWinCFINop(
bool Wide) {
375 OS <<
"\t.seh_nop_w\n";
377 OS <<
"\t.seh_nop\n";
380void ARMTargetAsmStreamer::emitARMWinCFIEpilogStart(
unsigned Condition) {
382 OS <<
"\t.seh_startepilogue\n";
384 OS <<
"\t.seh_startepilogue_cond\t"
388void ARMTargetAsmStreamer::emitARMWinCFIEpilogEnd() {
389 OS <<
"\t.seh_endepilogue\n";
392void ARMTargetAsmStreamer::emitARMWinCFICustom(
unsigned Opcode) {
394 for (
I = 3;
I > 0;
I--)
395 if (Opcode & (0xffu << (8 *
I)))
398 OS <<
"\t.seh_custom\t";
400 OS << LS << ((Opcode >> (8 *
I)) & 0xff);
404class ARMTargetELFStreamer :
public ARMTargetStreamer {
406 StringRef CurrentVendor;
411 MCSection *AttributeSection =
nullptr;
413 void emitArchDefaultAttributes();
414 void emitFPUDefaultAttributes();
416 ARMELFStreamer &getStreamer();
418 void emitFnStart()
override;
419 void emitFnEnd()
override;
420 void emitCantUnwind()
override;
421 void emitPersonality(
const MCSymbol *Personality)
override;
422 void emitPersonalityIndex(
unsigned Index)
override;
423 void emitHandlerData()
override;
424 void emitSetFP(MCRegister FpReg, MCRegister SpReg,
425 int64_t
Offset = 0)
override;
426 void emitMovSP(MCRegister
Reg, int64_t
Offset = 0)
override;
427 void emitPad(int64_t
Offset)
override;
428 void emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
429 bool isVector)
override;
430 void emitUnwindRaw(int64_t
Offset,
431 const SmallVectorImpl<uint8_t> &Opcodes)
override;
433 void switchVendor(StringRef Vendor)
override;
436 void emitIntTextAttribute(
unsigned Attribute,
unsigned IntValue,
437 StringRef StringValue)
override;
441 void emitInst(uint32_t Inst,
char Suffix =
'\0')
override;
442 void finishAttributeSection()
override;
443 void emitLabel(MCSymbol *Symbol)
override;
445 void annotateTLSDescriptorSequence(
const MCSymbolRefExpr *SRE)
override;
446 void emitCode16()
override;
447 void emitCode32()
override;
448 void emitThumbFunc(MCSymbol *Symbol)
override;
449 void emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value)
override;
452 void reset()
override;
454 void finish()
override;
457 ARMTargetELFStreamer(MCStreamer &S)
458 : ARMTargetStreamer(S), CurrentVendor(
"aeabi") {}
473class ARMELFStreamer :
public MCELFStreamer {
475 friend class ARMTargetELFStreamer;
477 ARMELFStreamer(MCContext &
Context, std::unique_ptr<MCAsmBackend> TAB,
478 std::unique_ptr<MCObjectWriter> OW,
479 std::unique_ptr<MCCodeEmitter>
Emitter,
bool IsThumb,
483 IsThumb(IsThumb), IsAndroid(IsAndroid) {
487 ~ARMELFStreamer()
override =
default;
492 void emitCantUnwind();
493 void emitPersonality(
const MCSymbol *Per);
494 void emitPersonalityIndex(
unsigned index);
495 void emitHandlerData();
496 void emitSetFP(MCRegister NewFpReg, MCRegister NewSpReg, int64_t
Offset = 0);
497 void emitMovSP(MCRegister
Reg, int64_t
Offset = 0);
498 void emitPad(int64_t
Offset);
499 void emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
bool isVector);
500 void emitUnwindRaw(int64_t
Offset,
const SmallVectorImpl<uint8_t> &Opcodes);
501 void emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
502 SMLoc Loc)
override {
503 emitDataMappingSymbol();
507 void changeSection(MCSection *Section, uint32_t Subsection)
override {
508 LastMappingSymbols[getCurrentSection().first] = std::move(LastEMSInfo);
510 auto LastMappingSymbol = LastMappingSymbols.find(Section);
511 if (LastMappingSymbol != LastMappingSymbols.end()) {
512 LastEMSInfo = std::move(LastMappingSymbol->second);
515 LastEMSInfo.reset(
new ElfMappingSymbolInfo);
522 const MCSubtargetInfo &STI)
override {
524 EmitThumbMappingSymbol();
526 EmitARMMappingSymbol();
528 MCELFStreamer::emitInstruction(Inst, STI);
531 void emitInst(uint32_t Inst,
char Suffix) {
534 const bool LittleEndian =
getContext().getAsmInfo()->isLittleEndian();
541 EmitARMMappingSymbol();
543 const unsigned I = LittleEndian ? (
Size -
II - 1) :
II;
544 Buffer[
Size -
II - 1] = uint8_t(Inst >>
I * CHAR_BIT);
550 Size = (Suffix ==
'n' ? 2 : 4);
553 EmitThumbMappingSymbol();
557 const unsigned I0 = LittleEndian ?
II + 0 :
II + 1;
558 const unsigned I1 = LittleEndian ?
II + 1 :
II + 0;
559 Buffer[
Size -
II - 2] = uint8_t(Inst >> I0 * CHAR_BIT);
560 Buffer[
Size -
II - 1] = uint8_t(Inst >> I1 * CHAR_BIT);
568 MCELFStreamer::emitBytes(StringRef(Buffer,
Size));
574 void emitBytes(StringRef
Data)
override {
575 emitDataMappingSymbol();
576 MCELFStreamer::emitBytes(
Data);
579 void FlushPendingMappingSymbol() {
580 if (!LastEMSInfo->hasInfo())
582 ElfMappingSymbolInfo *EMS = LastEMSInfo.get();
583 emitMappingSymbol(
"$d", *EMS->F, EMS->Offset);
590 void emitValueImpl(
const MCExpr *
Value,
unsigned Size, SMLoc Loc)
override {
593 getContext().reportError(Loc,
"relocated expression must be 32-bit");
596 getCurrentFragment();
599 emitDataMappingSymbol();
600 MCELFStreamer::emitValueImpl(
Value,
Size, Loc);
620 getAssembler().setIsThumbFunc(Symbol);
625 void setIsThumb(
bool Val) { IsThumb = Val; }
628 enum ElfMappingSymbol {
635 struct ElfMappingSymbolInfo {
640 bool hasInfo() {
return F !=
nullptr; }
641 MCFragment *
F =
nullptr;
643 ElfMappingSymbol State = EMS_None;
646 void emitDataMappingSymbol() {
647 if (LastEMSInfo->State == EMS_Data)
649 else if (LastEMSInfo->State == EMS_None) {
652 ElfMappingSymbolInfo *EMS = LastEMSInfo.get();
653 auto *
DF = getCurrentFragment();
657 EMS->Offset =
DF->getFixedSize();
658 LastEMSInfo->State = EMS_Data;
661 EmitMappingSymbol(
"$d");
662 LastEMSInfo->State = EMS_Data;
665 void EmitThumbMappingSymbol() {
666 if (LastEMSInfo->State == EMS_Thumb)
668 FlushPendingMappingSymbol();
669 EmitMappingSymbol(
"$t");
670 LastEMSInfo->State = EMS_Thumb;
673 void EmitARMMappingSymbol() {
674 if (LastEMSInfo->State == EMS_ARM)
676 FlushPendingMappingSymbol();
677 EmitMappingSymbol(
"$a");
678 LastEMSInfo->State = EMS_ARM;
681 void EmitMappingSymbol(StringRef Name) {
683 static_cast<MCSymbolELF *
>(
getContext().createLocalSymbol(Name));
690 void emitMappingSymbol(StringRef Name, MCFragment &
F, uint64_t
Offset) {
692 static_cast<MCSymbolELF *
>(
getContext().createLocalSymbol(Name));
693 emitLabelAtPos(Symbol, SMLoc(),
F,
Offset);
702 void reset()
override;
704 void EmitPersonalityFixup(StringRef Name);
705 void FlushPendingOffset();
706 void FlushUnwindOpcodes(
bool NoHandlerData);
708 void SwitchToEHSection(StringRef Prefix,
unsigned Type,
unsigned Flags,
709 SectionKind Kind,
const MCSymbol &Fn);
710 void SwitchToExTabSection(
const MCSymbol &FnStart);
711 void SwitchToExIdxSection(
const MCSymbol &FnStart);
716 DenseMap<const MCSection *, std::unique_ptr<ElfMappingSymbolInfo>>
719 std::unique_ptr<ElfMappingSymbolInfo> LastEMSInfo;
725 unsigned PersonalityIndex;
729 int64_t PendingOffset;
733 UnwindOpcodeAssembler UnwindOpAsm;
738ARMELFStreamer &ARMTargetELFStreamer::getStreamer() {
739 return static_cast<ARMELFStreamer &
>(Streamer);
742void ARMTargetELFStreamer::emitFnStart() { getStreamer().emitFnStart(); }
743void ARMTargetELFStreamer::emitFnEnd() { getStreamer().emitFnEnd(); }
744void ARMTargetELFStreamer::emitCantUnwind() { getStreamer().emitCantUnwind(); }
746void ARMTargetELFStreamer::emitPersonality(
const MCSymbol *Personality) {
747 getStreamer().emitPersonality(Personality);
750void ARMTargetELFStreamer::emitPersonalityIndex(
unsigned Index) {
751 getStreamer().emitPersonalityIndex(Index);
754void ARMTargetELFStreamer::emitHandlerData() {
755 getStreamer().emitHandlerData();
758void ARMTargetELFStreamer::emitSetFP(MCRegister FpReg, MCRegister SpReg,
760 getStreamer().emitSetFP(FpReg, SpReg,
Offset);
763void ARMTargetELFStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
767void ARMTargetELFStreamer::emitPad(int64_t
Offset) {
768 getStreamer().emitPad(
Offset);
771void ARMTargetELFStreamer::emitRegSave(
772 const SmallVectorImpl<MCRegister> &RegList,
bool isVector) {
773 getStreamer().emitRegSave(RegList, isVector);
776void ARMTargetELFStreamer::emitUnwindRaw(int64_t
Offset,
777 const SmallVectorImpl<uint8_t> &Opcodes) {
778 getStreamer().emitUnwindRaw(
Offset, Opcodes);
781void 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;
796void ARMTargetELFStreamer::emitAttribute(
unsigned Attribute,
unsigned Value) {
801void ARMTargetELFStreamer::emitTextAttribute(
unsigned Attribute,
807void ARMTargetELFStreamer::emitIntTextAttribute(
unsigned Attribute,
809 StringRef StringValue) {
810 getStreamer().setAttributeItems(
Attribute, IntValue, StringValue,
822void ARMTargetELFStreamer::emitArchDefaultAttributes() {
823 using namespace ARMBuildAttrs;
824 ARMELFStreamer &S = getStreamer();
828 if (EmittedArch == ARM::ArchKind::INVALID)
834 case ARM::ArchKind::ARMV4:
835 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
838 case ARM::ArchKind::ARMV4T:
839 case ARM::ArchKind::ARMV5T:
840 case ARM::ArchKind::XSCALE:
841 case ARM::ArchKind::ARMV5TE:
842 case ARM::ArchKind::ARMV6:
843 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
844 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
847 case ARM::ArchKind::ARMV6T2:
848 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
849 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
852 case ARM::ArchKind::ARMV6K:
853 case ARM::ArchKind::ARMV6KZ:
854 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
855 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
856 S.setAttributeItem(Virtualization_use, AllowTZ,
false);
859 case ARM::ArchKind::ARMV6M:
860 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
863 case ARM::ArchKind::ARMV7A:
864 S.setAttributeItem(CPU_arch_profile, ApplicationProfile,
false);
865 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
866 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
869 case ARM::ArchKind::ARMV7R:
870 S.setAttributeItem(CPU_arch_profile, RealTimeProfile,
false);
871 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
872 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
875 case ARM::ArchKind::ARMV7EM:
876 case ARM::ArchKind::ARMV7M:
877 S.setAttributeItem(CPU_arch_profile, MicroControllerProfile,
false);
878 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
881 case ARM::ArchKind::ARMV8A:
882 case ARM::ArchKind::ARMV8_1A:
883 case ARM::ArchKind::ARMV8_2A:
884 case ARM::ArchKind::ARMV8_3A:
885 case ARM::ArchKind::ARMV8_4A:
886 case ARM::ArchKind::ARMV8_5A:
887 case ARM::ArchKind::ARMV8_6A:
888 case ARM::ArchKind::ARMV8_7A:
889 case ARM::ArchKind::ARMV8_8A:
890 case ARM::ArchKind::ARMV8_9A:
891 case ARM::ArchKind::ARMV9A:
892 case ARM::ArchKind::ARMV9_1A:
893 case ARM::ArchKind::ARMV9_2A:
894 case ARM::ArchKind::ARMV9_3A:
895 case ARM::ArchKind::ARMV9_4A:
896 case ARM::ArchKind::ARMV9_5A:
897 case ARM::ArchKind::ARMV9_6A:
898 case ARM::ArchKind::ARMV9_7A:
899 S.setAttributeItem(CPU_arch_profile, ApplicationProfile,
false);
900 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
901 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
902 S.setAttributeItem(MPextension_use, Allowed,
false);
903 S.setAttributeItem(Virtualization_use, AllowTZVirtualization,
false);
906 case ARM::ArchKind::ARMV8MBaseline:
907 case ARM::ArchKind::ARMV8MMainline:
908 case ARM::ArchKind::ARMV8_1MMainline:
909 S.setAttributeItem(THUMB_ISA_use, AllowThumbDerived,
false);
910 S.setAttributeItem(CPU_arch_profile, MicroControllerProfile,
false);
913 case ARM::ArchKind::IWMMXT:
914 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
915 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
916 S.setAttributeItem(WMMX_arch, AllowWMMXv1,
false);
919 case ARM::ArchKind::IWMMXT2:
920 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
921 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
922 S.setAttributeItem(WMMX_arch, AllowWMMXv2,
false);
933void ARMTargetELFStreamer::emitFPUDefaultAttributes() {
934 ARMELFStreamer &S = getStreamer();
948 case ARM::FK_VFPV3_FP16:
955 case ARM::FK_VFPV3_D16:
960 case ARM::FK_VFPV3_D16_FP16:
967 case ARM::FK_VFPV3XD:
971 case ARM::FK_VFPV3XD_FP16:
985 case ARM::FK_FPV4_SP_D16:
986 case ARM::FK_VFPV4_D16:
991 case ARM::FK_FP_ARMV8:
998 case ARM::FK_FPV5_SP_D16:
999 case ARM::FK_FPV5_D16:
1002 case ARM::FK_FP_ARMV8_FULLFP16_SP_D16:
1003 case ARM::FK_FP_ARMV8_FULLFP16_D16:
1016 case ARM::FK_NEON_FP16:
1026 case ARM::FK_NEON_VFPV4:
1034 case ARM::FK_NEON_FP_ARMV8:
1035 case ARM::FK_CRYPTO_NEON_FP_ARMV8:
1042 case ARM::FK_SOFTVFP:
1052void ARMTargetELFStreamer::finishAttributeSection() {
1053 ARMELFStreamer &S = getStreamer();
1055 if (FPU != ARM::FK_INVALID)
1056 emitFPUDefaultAttributes();
1058 if (Arch != ARM::ArchKind::INVALID)
1059 emitArchDefaultAttributes();
1061 if (S.Contents.empty())
1064 auto LessTag = [](
const MCELFStreamer::AttributeItem &
LHS,
1065 const MCELFStreamer::AttributeItem &
RHS) ->
bool {
1082 S.emitAttributesSection(CurrentVendor,
".ARM.attributes",
1085 FPU = ARM::FK_INVALID;
1088void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
1089 ARMELFStreamer &Streamer = getStreamer();
1090 if (!Streamer.IsThumb)
1093 Streamer.getAssembler().registerSymbol(*Symbol);
1096 emitThumbFunc(Symbol);
1099void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
1100 const MCSymbolRefExpr *Expr) {
1101 getStreamer().addFixup(Expr,
FK_Data_4);
1104void ARMTargetELFStreamer::emitCode16() { getStreamer().setIsThumb(
true); }
1106void ARMTargetELFStreamer::emitCode32() { getStreamer().setIsThumb(
false); }
1108void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Symbol) {
1109 getStreamer().getAssembler().setIsThumbFunc(Symbol);
1113void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value) {
1115 const MCSymbol &Sym = SRE->getSymbol();
1117 getStreamer().emitAssignment(Symbol,
Value);
1122 emitThumbFunc(Symbol);
1123 getStreamer().emitAssignment(Symbol,
Value);
1126void ARMTargetELFStreamer::emitInst(uint32_t Inst,
char Suffix) {
1127 getStreamer().emitInst(Inst, Suffix);
1130void ARMTargetELFStreamer::reset() { AttributeSection =
nullptr; }
1132void ARMTargetELFStreamer::finish() {
1133 ARMTargetStreamer::finish();
1134 finishAttributeSection();
1142 auto &
Asm = getStreamer().getAssembler();
1143 if (
any_of(Asm, [](
const MCSection &Sec) {
1144 return static_cast<const MCSectionELF &
>(Sec).
getFlags() &
1149 for (
auto &
F : *Text)
1156void ARMELFStreamer::reset() {
1157 MCTargetStreamer &TS = *getTargetStreamer();
1158 ARMTargetStreamer &ATS =
static_cast<ARMTargetStreamer &
>(TS);
1161 LastMappingSymbols.clear();
1162 LastEMSInfo.reset();
1169inline void ARMELFStreamer::SwitchToEHSection(StringRef Prefix,
1173 const MCSymbol &Fn) {
1174 const MCSectionELF &FnSection =
1175 static_cast<const MCSectionELF &
>(Fn.
getSection());
1178 StringRef FnSecName(FnSection.
getName());
1179 SmallString<128> EHSecName(Prefix);
1180 if (FnSecName !=
".text") {
1181 EHSecName += FnSecName;
1185 const MCSymbolELF *Group = FnSection.
getGroup();
1188 MCSectionELF *EHSection =
getContext().getELFSection(
1189 EHSecName,
Type, Flags, 0, Group,
true,
1193 assert(EHSection &&
"Failed to get the required EH section");
1196 switchSection(EHSection);
1197 emitValueToAlignment(
Align(4), 0, 1, 0);
1200inline void ARMELFStreamer::SwitchToExTabSection(
const MCSymbol &FnStart) {
1205inline void ARMELFStreamer::SwitchToExIdxSection(
const MCSymbol &FnStart) {
1211void ARMELFStreamer::EHReset() {
1214 Personality =
nullptr;
1224 UnwindOpAsm.
Reset();
1227void ARMELFStreamer::emitFnStart() {
1228 assert(FnStart ==
nullptr);
1233void ARMELFStreamer::emitFnEnd() {
1234 assert(FnStart &&
".fnstart must precedes .fnend");
1237 if (!ExTab && !CantUnwind)
1238 FlushUnwindOpcodes(
true);
1241 SwitchToExIdxSection(*FnStart);
1251 const MCSymbolRefExpr *FnStartRef =
1254 emitValue(FnStartRef, 4);
1260 const MCSymbolRefExpr *ExTabEntryRef =
1262 emitValue(ExTabEntryRef, 4);
1268 "Compact model must use __aeabi_unwind_cpp_pr0 as personality");
1270 "Unwind opcode size for __aeabi_unwind_cpp_pr0 must be equal to 4");
1271 uint64_t Intval = Opcodes[0] |
1275 emitIntValue(Intval, Opcodes.
size());
1285void ARMELFStreamer::emitCantUnwind() { CantUnwind =
true; }
1288void ARMELFStreamer::EmitPersonalityFixup(StringRef Name) {
1290 visitUsedSymbol(*PersonalitySym);
1292 const MCSymbolRefExpr *PersonalityRef =
1297void ARMELFStreamer::FlushPendingOffset() {
1298 if (PendingOffset != 0) {
1304void ARMELFStreamer::FlushUnwindOpcodes(
bool NoHandlerData) {
1308 int64_t LastRegSaveSPOffset = SPOffset - PendingOffset;
1309 UnwindOpAsm.
EmitSPOffset(LastRegSaveSPOffset - FPOffset);
1312 FlushPendingOffset();
1316 UnwindOpAsm.
Finalize(PersonalityIndex, Opcodes);
1325 SwitchToExTabSection(*FnStart);
1337 emitValue(PersonalityRef, 4);
1342 "Unwind opcode size for __aeabi_cpp_unwind_pr0 must be multiple of 4");
1343 for (
unsigned I = 0;
I != Opcodes.
size();
I += 4) {
1344 uint64_t Intval = Opcodes[
I] |
1345 Opcodes[
I + 1] << 8 |
1346 Opcodes[
I + 2] << 16 |
1347 Opcodes[
I + 3] << 24;
1358 if (NoHandlerData && !Personality)
1362void ARMELFStreamer::emitHandlerData() { FlushUnwindOpcodes(
false); }
1364void ARMELFStreamer::emitPersonality(
const MCSymbol *Per) {
1369void ARMELFStreamer::emitPersonalityIndex(
unsigned Index) {
1371 PersonalityIndex =
Index;
1374void ARMELFStreamer::emitSetFP(MCRegister NewFPReg, MCRegister NewSPReg,
1376 assert((NewSPReg == ARM::SP || NewSPReg ==
FPReg) &&
1377 "the operand of .setfp directive should be either $sp or $fp");
1382 if (NewSPReg == ARM::SP)
1383 FPOffset = SPOffset +
Offset;
1388void ARMELFStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
1390 "the operand of .movsp cannot be either sp or pc");
1391 assert(
FPReg == ARM::SP &&
"current FP must be SP");
1393 FlushPendingOffset();
1396 FPOffset = SPOffset +
Offset;
1402void ARMELFStreamer::emitPad(int64_t
Offset) {
1411static std::pair<unsigned, unsigned>
1419 if (
Reg == ARM::RA_AUTH_CODE)
1421 unsigned RegEnc =
MRI.getEncodingValue(
Reg);
1422 assert(RegEnc < (IsVector ? 32U : 16U) &&
"Register out of range");
1423 unsigned Bit = (1u << RegEnc);
1424 if ((Mask & Bit) == 0) {
1432 return {Idx,
Count};
1435void ARMELFStreamer::emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
1438 unsigned Idx,
Count;
1439 const MCRegisterInfo &
MRI = *
getContext().getRegisterInfo();
1447 Idx = RegList.
size();
1455 SPOffset -=
Count * (IsVector ? 8 : 4);
1458 FlushPendingOffset();
1463 }
else if (Idx > 0 && RegList[Idx - 1] == ARM::RA_AUTH_CODE) {
1466 FlushPendingOffset();
1472void ARMELFStreamer::emitUnwindRaw(int64_t
Offset,
1473 const SmallVectorImpl<uint8_t> &Opcodes) {
1474 FlushPendingOffset();
1475 SPOffset = SPOffset -
Offset;
1484 return new ARMTargetAsmStreamer(S, OS, *InstPrint);
1492 return new ARMTargetELFStreamer(S);
1496 std::unique_ptr<MCAsmBackend> TAB,
1497 std::unique_ptr<MCObjectWriter> OW,
1498 std::unique_ptr<MCCodeEmitter>
Emitter,
1499 bool IsThumb,
bool IsAndroid) {
1501 new ARMELFStreamer(Context, std::move(TAB), std::move(OW),
1502 std::move(
Emitter), IsThumb, IsAndroid);
unsigned const MachineRegisterInfo * MRI
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.
uint64_t IntrinsicInst * II
static constexpr MCPhysReg FPReg
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...
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
empty - 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)
Context & getContext() const
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
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.
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)
FunctionAddr VTableAddr Count
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.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
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_TypeFunction
.type _foo, STT_FUNC # aka @function