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);
630 getAssembler().setIsThumbFunc(Symbol);
635 void setIsThumb(
bool Val) { IsThumb = Val; }
638 enum ElfMappingSymbol {
645 struct ElfMappingSymbolInfo {
650 bool hasInfo() {
return F !=
nullptr; }
651 MCFragment *
F =
nullptr;
653 ElfMappingSymbol State = EMS_None;
656 void emitDataMappingSymbol() {
657 if (LastEMSInfo->State == EMS_Data)
659 else if (LastEMSInfo->State == EMS_None) {
662 ElfMappingSymbolInfo *EMS = LastEMSInfo.get();
663 auto *
DF = getCurrentFragment();
667 EMS->Offset =
DF->getFixedSize();
668 LastEMSInfo->State = EMS_Data;
671 EmitMappingSymbol(
"$d");
672 LastEMSInfo->State = EMS_Data;
675 void EmitThumbMappingSymbol() {
676 if (LastEMSInfo->State == EMS_Thumb)
678 FlushPendingMappingSymbol();
679 EmitMappingSymbol(
"$t");
680 LastEMSInfo->State = EMS_Thumb;
683 void EmitARMMappingSymbol() {
684 if (LastEMSInfo->State == EMS_ARM)
686 FlushPendingMappingSymbol();
687 EmitMappingSymbol(
"$a");
688 LastEMSInfo->State = EMS_ARM;
691 void EmitMappingSymbol(StringRef Name) {
693 static_cast<MCSymbolELF *
>(
getContext().createLocalSymbol(Name));
700 void emitMappingSymbol(StringRef Name, MCFragment &
F, uint64_t
Offset) {
702 static_cast<MCSymbolELF *
>(
getContext().createLocalSymbol(Name));
703 emitLabelAtPos(Symbol, SMLoc(),
F,
Offset);
712 void reset()
override;
714 void EmitPersonalityFixup(StringRef Name);
715 void FlushPendingOffset();
716 void FlushUnwindOpcodes(
bool NoHandlerData);
718 void SwitchToEHSection(StringRef Prefix,
unsigned Type,
unsigned Flags,
719 SectionKind Kind,
const MCSymbol &Fn);
720 void SwitchToExTabSection(
const MCSymbol &FnStart);
721 void SwitchToExIdxSection(
const MCSymbol &FnStart);
726 DenseMap<const MCSection *, std::unique_ptr<ElfMappingSymbolInfo>>
729 std::unique_ptr<ElfMappingSymbolInfo> LastEMSInfo;
735 unsigned PersonalityIndex;
739 int64_t PendingOffset;
743 UnwindOpcodeAssembler UnwindOpAsm;
748ARMELFStreamer &ARMTargetELFStreamer::getStreamer() {
749 return static_cast<ARMELFStreamer &
>(Streamer);
752void ARMTargetELFStreamer::emitFnStart() { getStreamer().emitFnStart(); }
753void ARMTargetELFStreamer::emitFnEnd() { getStreamer().emitFnEnd(); }
754void ARMTargetELFStreamer::emitCantUnwind() { getStreamer().emitCantUnwind(); }
756void ARMTargetELFStreamer::emitPersonality(
const MCSymbol *Personality) {
757 getStreamer().emitPersonality(Personality);
760void ARMTargetELFStreamer::emitPersonalityIndex(
unsigned Index) {
761 getStreamer().emitPersonalityIndex(Index);
764void ARMTargetELFStreamer::emitHandlerData() {
765 getStreamer().emitHandlerData();
768void ARMTargetELFStreamer::emitSetFP(MCRegister FpReg, MCRegister SpReg,
770 getStreamer().emitSetFP(FpReg, SpReg,
Offset);
773void ARMTargetELFStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
777void ARMTargetELFStreamer::emitPad(int64_t
Offset) {
778 getStreamer().emitPad(
Offset);
781void ARMTargetELFStreamer::emitRegSave(
782 const SmallVectorImpl<MCRegister> &RegList,
bool isVector) {
783 getStreamer().emitRegSave(RegList, isVector);
786void ARMTargetELFStreamer::emitUnwindRaw(int64_t
Offset,
787 const SmallVectorImpl<uint8_t> &Opcodes) {
788 getStreamer().emitUnwindRaw(
Offset, Opcodes);
791void ARMTargetELFStreamer::switchVendor(StringRef Vendor) {
792 assert(!Vendor.
empty() &&
"Vendor cannot be empty.");
794 if (CurrentVendor == Vendor)
797 if (!CurrentVendor.
empty())
798 finishAttributeSection();
800 assert(getStreamer().Contents.empty() &&
801 ".ARM.attributes should be flushed before changing vendor");
802 CurrentVendor = Vendor;
806void ARMTargetELFStreamer::emitAttribute(
unsigned Attribute,
unsigned Value) {
811void ARMTargetELFStreamer::emitTextAttribute(
unsigned Attribute,
817void ARMTargetELFStreamer::emitIntTextAttribute(
unsigned Attribute,
819 StringRef StringValue) {
820 getStreamer().setAttributeItems(
Attribute, IntValue, StringValue,
832void ARMTargetELFStreamer::emitArchDefaultAttributes() {
833 using namespace ARMBuildAttrs;
834 ARMELFStreamer &S = getStreamer();
838 if (EmittedArch == ARM::ArchKind::INVALID)
844 case ARM::ArchKind::ARMV4:
845 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
848 case ARM::ArchKind::ARMV4T:
849 case ARM::ArchKind::ARMV5T:
850 case ARM::ArchKind::XSCALE:
851 case ARM::ArchKind::ARMV5TE:
852 case ARM::ArchKind::ARMV6:
853 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
854 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
857 case ARM::ArchKind::ARMV6T2:
858 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
859 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
862 case ARM::ArchKind::ARMV6K:
863 case ARM::ArchKind::ARMV6KZ:
864 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
865 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
866 S.setAttributeItem(Virtualization_use, AllowTZ,
false);
869 case ARM::ArchKind::ARMV6M:
870 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
873 case ARM::ArchKind::ARMV7A:
874 S.setAttributeItem(CPU_arch_profile, ApplicationProfile,
false);
875 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
876 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
879 case ARM::ArchKind::ARMV7R:
880 S.setAttributeItem(CPU_arch_profile, RealTimeProfile,
false);
881 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
882 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
885 case ARM::ArchKind::ARMV7EM:
886 case ARM::ArchKind::ARMV7M:
887 S.setAttributeItem(CPU_arch_profile, MicroControllerProfile,
false);
888 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
891 case ARM::ArchKind::ARMV8A:
892 case ARM::ArchKind::ARMV8_1A:
893 case ARM::ArchKind::ARMV8_2A:
894 case ARM::ArchKind::ARMV8_3A:
895 case ARM::ArchKind::ARMV8_4A:
896 case ARM::ArchKind::ARMV8_5A:
897 case ARM::ArchKind::ARMV8_6A:
898 case ARM::ArchKind::ARMV8_7A:
899 case ARM::ArchKind::ARMV8_8A:
900 case ARM::ArchKind::ARMV8_9A:
901 case ARM::ArchKind::ARMV9A:
902 case ARM::ArchKind::ARMV9_1A:
903 case ARM::ArchKind::ARMV9_2A:
904 case ARM::ArchKind::ARMV9_3A:
905 case ARM::ArchKind::ARMV9_4A:
906 case ARM::ArchKind::ARMV9_5A:
907 case ARM::ArchKind::ARMV9_6A:
908 case ARM::ArchKind::ARMV9_7A:
909 S.setAttributeItem(CPU_arch_profile, ApplicationProfile,
false);
910 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
911 S.setAttributeItem(THUMB_ISA_use, AllowThumb32,
false);
912 S.setAttributeItem(MPextension_use, Allowed,
false);
913 S.setAttributeItem(Virtualization_use, AllowTZVirtualization,
false);
916 case ARM::ArchKind::ARMV8MBaseline:
917 case ARM::ArchKind::ARMV8MMainline:
918 case ARM::ArchKind::ARMV8_1MMainline:
919 S.setAttributeItem(THUMB_ISA_use, AllowThumbDerived,
false);
920 S.setAttributeItem(CPU_arch_profile, MicroControllerProfile,
false);
923 case ARM::ArchKind::IWMMXT:
924 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
925 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
926 S.setAttributeItem(WMMX_arch, AllowWMMXv1,
false);
929 case ARM::ArchKind::IWMMXT2:
930 S.setAttributeItem(ARM_ISA_use, Allowed,
false);
931 S.setAttributeItem(THUMB_ISA_use, Allowed,
false);
932 S.setAttributeItem(WMMX_arch, AllowWMMXv2,
false);
943void ARMTargetELFStreamer::emitFPUDefaultAttributes() {
944 ARMELFStreamer &S = getStreamer();
958 case ARM::FK_VFPV3_FP16:
965 case ARM::FK_VFPV3_D16:
970 case ARM::FK_VFPV3_D16_FP16:
977 case ARM::FK_VFPV3XD:
981 case ARM::FK_VFPV3XD_FP16:
995 case ARM::FK_FPV4_SP_D16:
996 case ARM::FK_VFPV4_D16:
1001 case ARM::FK_FP_ARMV8:
1008 case ARM::FK_FPV5_SP_D16:
1009 case ARM::FK_FPV5_D16:
1012 case ARM::FK_FP_ARMV8_FULLFP16_SP_D16:
1013 case ARM::FK_FP_ARMV8_FULLFP16_D16:
1026 case ARM::FK_NEON_FP16:
1036 case ARM::FK_NEON_VFPV4:
1044 case ARM::FK_NEON_FP_ARMV8:
1045 case ARM::FK_CRYPTO_NEON_FP_ARMV8:
1052 case ARM::FK_SOFTVFP:
1062void ARMTargetELFStreamer::finishAttributeSection() {
1063 ARMELFStreamer &S = getStreamer();
1065 if (FPU != ARM::FK_INVALID)
1066 emitFPUDefaultAttributes();
1068 if (Arch != ARM::ArchKind::INVALID)
1069 emitArchDefaultAttributes();
1071 if (S.Contents.empty())
1074 auto LessTag = [](
const MCELFStreamer::AttributeItem &
LHS,
1075 const MCELFStreamer::AttributeItem &
RHS) ->
bool {
1092 S.emitAttributesSection(CurrentVendor,
".ARM.attributes",
1095 FPU = ARM::FK_INVALID;
1098void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
1099 ARMELFStreamer &Streamer = getStreamer();
1100 if (!Streamer.IsThumb)
1103 Streamer.getAssembler().registerSymbol(*Symbol);
1106 emitThumbFunc(Symbol);
1109void ARMTargetELFStreamer::annotateTLSDescriptorSequence(
1110 const MCSymbolRefExpr *Expr) {
1111 getStreamer().addFixup(Expr,
FK_Data_4);
1114void ARMTargetELFStreamer::emitCode16() { getStreamer().setIsThumb(
true); }
1116void ARMTargetELFStreamer::emitCode32() { getStreamer().setIsThumb(
false); }
1118void ARMTargetELFStreamer::emitThumbFunc(MCSymbol *Symbol) {
1119 getStreamer().getAssembler().setIsThumbFunc(Symbol);
1123void ARMTargetELFStreamer::emitThumbSet(MCSymbol *Symbol,
const MCExpr *
Value) {
1125 const MCSymbol &Sym = SRE->getSymbol();
1127 getStreamer().emitAssignment(Symbol,
Value);
1132 emitThumbFunc(Symbol);
1133 getStreamer().emitAssignment(Symbol,
Value);
1136void ARMTargetELFStreamer::emitInst(uint32_t Inst,
char Suffix) {
1137 getStreamer().emitInst(Inst, Suffix);
1140void ARMTargetELFStreamer::reset() { AttributeSection =
nullptr; }
1142void ARMTargetELFStreamer::finish() {
1143 ARMTargetStreamer::finish();
1144 finishAttributeSection();
1152 auto &
Asm = getStreamer().getAssembler();
1153 if (
any_of(Asm, [](
const MCSection &Sec) {
1154 return static_cast<const MCSectionELF &
>(Sec).
getFlags() &
1159 for (
auto &
F : *Text)
1166void ARMELFStreamer::reset() {
1167 MCTargetStreamer &TS = *getTargetStreamer();
1168 ARMTargetStreamer &ATS =
static_cast<ARMTargetStreamer &
>(TS);
1171 LastMappingSymbols.clear();
1172 LastEMSInfo.reset();
1179inline void ARMELFStreamer::SwitchToEHSection(StringRef Prefix,
1183 const MCSymbol &Fn) {
1184 const MCSectionELF &FnSection =
1185 static_cast<const MCSectionELF &
>(Fn.
getSection());
1188 StringRef FnSecName(FnSection.
getName());
1189 SmallString<128> EHSecName(Prefix);
1190 if (FnSecName !=
".text") {
1191 EHSecName += FnSecName;
1195 const MCSymbolELF *Group = FnSection.
getGroup();
1198 MCSectionELF *EHSection =
getContext().getELFSection(
1199 EHSecName,
Type, Flags, 0, Group,
true,
1203 assert(EHSection &&
"Failed to get the required EH section");
1206 switchSection(EHSection);
1207 emitValueToAlignment(
Align(4), 0, 1, 0);
1210inline void ARMELFStreamer::SwitchToExTabSection(
const MCSymbol &FnStart) {
1215inline void ARMELFStreamer::SwitchToExIdxSection(
const MCSymbol &FnStart) {
1221void ARMELFStreamer::EHReset() {
1224 Personality =
nullptr;
1234 UnwindOpAsm.
Reset();
1237void ARMELFStreamer::emitFnStart() {
1238 assert(FnStart ==
nullptr);
1243void ARMELFStreamer::emitFnEnd() {
1244 assert(FnStart &&
".fnstart must precedes .fnend");
1247 if (!ExTab && !CantUnwind)
1248 FlushUnwindOpcodes(
true);
1251 SwitchToExIdxSection(*FnStart);
1261 const MCSymbolRefExpr *FnStartRef =
1264 emitValue(FnStartRef, 4);
1270 const MCSymbolRefExpr *ExTabEntryRef =
1272 emitValue(ExTabEntryRef, 4);
1278 "Compact model must use __aeabi_unwind_cpp_pr0 as personality");
1280 "Unwind opcode size for __aeabi_unwind_cpp_pr0 must be equal to 4");
1281 uint64_t Intval = Opcodes[0] |
1285 emitIntValue(Intval, Opcodes.
size());
1295void ARMELFStreamer::emitCantUnwind() { CantUnwind =
true; }
1298void ARMELFStreamer::EmitPersonalityFixup(StringRef Name) {
1300 visitUsedSymbol(*PersonalitySym);
1302 const MCSymbolRefExpr *PersonalityRef =
1307void ARMELFStreamer::FlushPendingOffset() {
1308 if (PendingOffset != 0) {
1314void ARMELFStreamer::FlushUnwindOpcodes(
bool NoHandlerData) {
1318 int64_t LastRegSaveSPOffset = SPOffset - PendingOffset;
1319 UnwindOpAsm.
EmitSPOffset(LastRegSaveSPOffset - FPOffset);
1322 FlushPendingOffset();
1326 UnwindOpAsm.
Finalize(PersonalityIndex, Opcodes);
1335 SwitchToExTabSection(*FnStart);
1347 emitValue(PersonalityRef, 4);
1352 "Unwind opcode size for __aeabi_cpp_unwind_pr0 must be multiple of 4");
1353 for (
unsigned I = 0;
I != Opcodes.
size();
I += 4) {
1354 uint64_t Intval = Opcodes[
I] |
1355 Opcodes[
I + 1] << 8 |
1356 Opcodes[
I + 2] << 16 |
1357 Opcodes[
I + 3] << 24;
1368 if (NoHandlerData && !Personality)
1372void ARMELFStreamer::emitHandlerData() { FlushUnwindOpcodes(
false); }
1374void ARMELFStreamer::emitPersonality(
const MCSymbol *Per) {
1379void ARMELFStreamer::emitPersonalityIndex(
unsigned Index) {
1381 PersonalityIndex =
Index;
1384void ARMELFStreamer::emitSetFP(MCRegister NewFPReg, MCRegister NewSPReg,
1386 assert((NewSPReg == ARM::SP || NewSPReg ==
FPReg) &&
1387 "the operand of .setfp directive should be either $sp or $fp");
1392 if (NewSPReg == ARM::SP)
1393 FPOffset = SPOffset +
Offset;
1398void ARMELFStreamer::emitMovSP(MCRegister
Reg, int64_t
Offset) {
1400 "the operand of .movsp cannot be either sp or pc");
1401 assert(
FPReg == ARM::SP &&
"current FP must be SP");
1403 FlushPendingOffset();
1406 FPOffset = SPOffset +
Offset;
1412void ARMELFStreamer::emitPad(int64_t
Offset) {
1421static std::pair<unsigned, unsigned>
1429 if (
Reg == ARM::RA_AUTH_CODE)
1431 unsigned RegEnc =
MRI.getEncodingValue(
Reg);
1432 assert(RegEnc < (IsVector ? 32U : 16U) &&
"Register out of range");
1433 unsigned Bit = (1u << RegEnc);
1434 if ((Mask & Bit) == 0) {
1442 return {Idx,
Count};
1445void ARMELFStreamer::emitRegSave(
const SmallVectorImpl<MCRegister> &RegList,
1448 unsigned Idx,
Count;
1449 const MCRegisterInfo &
MRI = *
getContext().getRegisterInfo();
1457 Idx = RegList.
size();
1465 SPOffset -=
Count * (IsVector ? 8 : 4);
1468 FlushPendingOffset();
1473 }
else if (Idx > 0 && RegList[Idx - 1] == ARM::RA_AUTH_CODE) {
1476 FlushPendingOffset();
1482void ARMELFStreamer::emitUnwindRaw(int64_t
Offset,
1483 const SmallVectorImpl<uint8_t> &Opcodes) {
1484 FlushPendingOffset();
1485 SPOffset = SPOffset -
Offset;
1494 return new ARMTargetAsmStreamer(S, OS, *InstPrint);
1502 return new ARMTargetELFStreamer(S);
1506 std::unique_ptr<MCAsmBackend> TAB,
1507 std::unique_ptr<MCObjectWriter> OW,
1508 std::unique_ptr<MCCodeEmitter>
Emitter,
1509 bool IsThumb,
bool IsAndroid) {
1511 new ARMELFStreamer(Context, std::move(TAB), std::move(OW),
1512 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_TypeIndFunction
.type _foo, STT_GNU_IFUNC
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function