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 S.setAttributeItem(CPU_arch_profile, ApplicationProfile,
false);
899 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
900 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
901 S.setAttributeItem(MPextension_use, Allowed,
false);
902 S.setAttributeItem(Virtualization_use, AllowTZVirtualization,
false);
905 case ARM::ArchKind::ARMV8MBaseline:
906 case ARM::ArchKind::ARMV8MMainline:
907 case ARM::ArchKind::ARMV8_1MMainline:
908 S.setAttributeItem(THUMB_ISA_use, AllowThumbDerived,
false);
909 S.setAttributeItem(CPU_arch_profile, MicroControllerProfile,
false);
912 case ARM::ArchKind::IWMMXT:
913 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
914 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
915 S.setAttributeItem(WMMX_arch, AllowWMMXv1,
false);
918 case ARM::ArchKind::IWMMXT2:
919 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
920 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
921 S.setAttributeItem(WMMX_arch, AllowWMMXv2,
false);
932void ARMTargetELFStreamer::emitFPUDefaultAttributes() {
933 ARMELFStreamer &S = getStreamer();
947 case ARM::FK_VFPV3_FP16:
954 case ARM::FK_VFPV3_D16:
959 case ARM::FK_VFPV3_D16_FP16:
966 case ARM::FK_VFPV3XD:
970 case ARM::FK_VFPV3XD_FP16:
984 case ARM::FK_FPV4_SP_D16:
985 case ARM::FK_VFPV4_D16:
990 case ARM::FK_FP_ARMV8:
997 case ARM::FK_FPV5_SP_D16:
998 case ARM::FK_FPV5_D16:
1001 case ARM::FK_FP_ARMV8_FULLFP16_SP_D16:
1002 case ARM::FK_FP_ARMV8_FULLFP16_D16:
1015 case ARM::FK_NEON_FP16:
1025 case ARM::FK_NEON_VFPV4:
1033 case ARM::FK_NEON_FP_ARMV8:
1034 case ARM::FK_CRYPTO_NEON_FP_ARMV8:
1041 case ARM::FK_SOFTVFP:
1051void ARMTargetELFStreamer::finishAttributeSection() {
1052 ARMELFStreamer &S = getStreamer();
1054 if (FPU != ARM::FK_INVALID)
1055 emitFPUDefaultAttributes();
1057 if (Arch != ARM::ArchKind::INVALID)
1058 emitArchDefaultAttributes();
1060 if (S.Contents.empty())
1063 auto LessTag = [](
const MCELFStreamer::AttributeItem &
LHS,
1064 const MCELFStreamer::AttributeItem &
RHS) ->
bool {
1081 S.emitAttributesSection(CurrentVendor,
".ARM.attributes",
1084 FPU = ARM::FK_INVALID;
1087void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
1088 ARMELFStreamer &Streamer = getStreamer();
1089 if (!Streamer.IsThumb)
1092 Streamer.getAssembler().registerSymbol(*Symbol);
1095 emitThumbFunc(Symbol);
1098void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
1099 const MCSymbolRefExpr *Expr) {
1100 getStreamer().addFixup(Expr,
FK_Data_4);
1103void ARMTargetELFStreamer::emitCode16() { getStreamer().setIsThumb(
true); }
1105void ARMTargetELFStreamer::emitCode32() { getStreamer().setIsThumb(
false); }
1107void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Symbol) {
1108 getStreamer().getAssembler().setIsThumbFunc(Symbol);
1112void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value) {
1114 const MCSymbol &Sym = SRE->getSymbol();
1116 getStreamer().emitAssignment(Symbol,
Value);
1121 emitThumbFunc(Symbol);
1122 getStreamer().emitAssignment(Symbol,
Value);
1125void ARMTargetELFStreamer::emitInst(uint32_t Inst,
char Suffix) {
1126 getStreamer().emitInst(Inst, Suffix);
1129void ARMTargetELFStreamer::reset() { AttributeSection =
nullptr; }
1131void ARMTargetELFStreamer::finish() {
1132 ARMTargetStreamer::finish();
1133 finishAttributeSection();
1141 auto &
Asm = getStreamer().getAssembler();
1142 if (
any_of(Asm, [](
const MCSection &Sec) {
1143 return static_cast<const MCSectionELF &
>(Sec).
getFlags() &
1148 for (
auto &
F : *Text)
1155void ARMELFStreamer::reset() {
1156 MCTargetStreamer &TS = *getTargetStreamer();
1157 ARMTargetStreamer &ATS =
static_cast<ARMTargetStreamer &
>(TS);
1160 LastMappingSymbols.clear();
1161 LastEMSInfo.reset();
1168inline void ARMELFStreamer::SwitchToEHSection(StringRef Prefix,
1172 const MCSymbol &Fn) {
1173 const MCSectionELF &FnSection =
1174 static_cast<const MCSectionELF &
>(Fn.
getSection());
1177 StringRef FnSecName(FnSection.
getName());
1178 SmallString<128> EHSecName(Prefix);
1179 if (FnSecName !=
".text") {
1180 EHSecName += FnSecName;
1184 const MCSymbolELF *Group = FnSection.
getGroup();
1187 MCSectionELF *EHSection =
getContext().getELFSection(
1188 EHSecName,
Type, Flags, 0, Group,
true,
1192 assert(EHSection &&
"Failed to get the required EH section");
1195 switchSection(EHSection);
1196 emitValueToAlignment(
Align(4), 0, 1, 0);
1199inline void ARMELFStreamer::SwitchToExTabSection(
const MCSymbol &FnStart) {
1204inline void ARMELFStreamer::SwitchToExIdxSection(
const MCSymbol &FnStart) {
1210void ARMELFStreamer::EHReset() {
1213 Personality =
nullptr;
1223 UnwindOpAsm.
Reset();
1226void ARMELFStreamer::emitFnStart() {
1227 assert(FnStart ==
nullptr);
1232void ARMELFStreamer::emitFnEnd() {
1233 assert(FnStart &&
".fnstart must precedes .fnend");
1236 if (!ExTab && !CantUnwind)
1237 FlushUnwindOpcodes(
true);
1240 SwitchToExIdxSection(*FnStart);
1250 const MCSymbolRefExpr *FnStartRef =
1253 emitValue(FnStartRef, 4);
1259 const MCSymbolRefExpr *ExTabEntryRef =
1261 emitValue(ExTabEntryRef, 4);
1267 "Compact model must use __aeabi_unwind_cpp_pr0 as personality");
1269 "Unwind opcode size for __aeabi_unwind_cpp_pr0 must be equal to 4");
1270 uint64_t Intval = Opcodes[0] |
1274 emitIntValue(Intval, Opcodes.
size());
1284void ARMELFStreamer::emitCantUnwind() { CantUnwind =
true; }
1287void ARMELFStreamer::EmitPersonalityFixup(StringRef Name) {
1289 visitUsedSymbol(*PersonalitySym);
1291 const MCSymbolRefExpr *PersonalityRef =
1296void ARMELFStreamer::FlushPendingOffset() {
1297 if (PendingOffset != 0) {
1303void ARMELFStreamer::FlushUnwindOpcodes(
bool NoHandlerData) {
1307 int64_t LastRegSaveSPOffset = SPOffset - PendingOffset;
1308 UnwindOpAsm.
EmitSPOffset(LastRegSaveSPOffset - FPOffset);
1311 FlushPendingOffset();
1315 UnwindOpAsm.
Finalize(PersonalityIndex, Opcodes);
1324 SwitchToExTabSection(*FnStart);
1336 emitValue(PersonalityRef, 4);
1341 "Unwind opcode size for __aeabi_cpp_unwind_pr0 must be multiple of 4");
1342 for (
unsigned I = 0;
I != Opcodes.
size();
I += 4) {
1343 uint64_t Intval = Opcodes[
I] |
1344 Opcodes[
I + 1] << 8 |
1345 Opcodes[
I + 2] << 16 |
1346 Opcodes[
I + 3] << 24;
1357 if (NoHandlerData && !Personality)
1361void ARMELFStreamer::emitHandlerData() { FlushUnwindOpcodes(
false); }
1363void ARMELFStreamer::emitPersonality(
const MCSymbol *Per) {
1368void ARMELFStreamer::emitPersonalityIndex(
unsigned Index) {
1370 PersonalityIndex =
Index;
1373void ARMELFStreamer::emitSetFP(MCRegister NewFPReg, MCRegister NewSPReg,
1375 assert((NewSPReg == ARM::SP || NewSPReg ==
FPReg) &&
1376 "the operand of .setfp directive should be either $sp or $fp");
1381 if (NewSPReg == ARM::SP)
1382 FPOffset = SPOffset +
Offset;
1387void ARMELFStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
1389 "the operand of .movsp cannot be either sp or pc");
1390 assert(
FPReg == ARM::SP &&
"current FP must be SP");
1392 FlushPendingOffset();
1395 FPOffset = SPOffset +
Offset;
1401void ARMELFStreamer::emitPad(int64_t
Offset) {
1410static std::pair<unsigned, unsigned>
1418 if (
Reg == ARM::RA_AUTH_CODE)
1420 unsigned RegEnc =
MRI.getEncodingValue(
Reg);
1421 assert(RegEnc < (IsVector ? 32U : 16U) &&
"Register out of range");
1422 unsigned Bit = (1u << RegEnc);
1423 if ((Mask & Bit) == 0) {
1431 return {Idx,
Count};
1434void ARMELFStreamer::emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
1437 unsigned Idx,
Count;
1438 const MCRegisterInfo &
MRI = *
getContext().getRegisterInfo();
1446 Idx = RegList.
size();
1454 SPOffset -=
Count * (IsVector ? 8 : 4);
1457 FlushPendingOffset();
1462 }
else if (Idx > 0 && RegList[Idx - 1] == ARM::RA_AUTH_CODE) {
1465 FlushPendingOffset();
1471void ARMELFStreamer::emitUnwindRaw(int64_t
Offset,
1472 const SmallVectorImpl<uint8_t> &Opcodes) {
1473 FlushPendingOffset();
1474 SPOffset = SPOffset -
Offset;
1483 return new ARMTargetAsmStreamer(S, OS, *InstPrint);
1491 return new ARMTargetELFStreamer(S);
1495 std::unique_ptr<MCAsmBackend> TAB,
1496 std::unique_ptr<MCObjectWriter> OW,
1497 std::unique_ptr<MCCodeEmitter>
Emitter,
1498 bool IsThumb,
bool IsAndroid) {
1500 new ARMELFStreamer(Context, std::move(TAB), std::move(OW),
1501 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