45class AArch64ELFStreamer;
48 formatted_raw_ostream &OS;
49 std::string VendorTag;
51 void emitInst(uint32_t Inst)
override;
53 void emitDirectiveVariantPCS(MCSymbol *Symbol)
override {
54 OS <<
"\t.variant_pcs\t" <<
Symbol->getName() <<
"\n";
57 void emitDirectiveArch(StringRef Name)
override {
58 OS <<
"\t.arch\t" <<
Name <<
"\n";
61 void emitDirectiveArchExtension(StringRef Name)
override {
62 OS <<
"\t.arch_extension\t" <<
Name <<
"\n";
65 void emitARM64WinCFIAllocStack(
unsigned Size)
override {
66 OS <<
"\t.seh_stackalloc\t" <<
Size <<
"\n";
68 void emitARM64WinCFISaveR19R20X(
int Offset)
override {
69 OS <<
"\t.seh_save_r19r20_x\t" <<
Offset <<
"\n";
71 void emitARM64WinCFISaveFPLR(
int Offset)
override {
72 OS <<
"\t.seh_save_fplr\t" <<
Offset <<
"\n";
74 void emitARM64WinCFISaveFPLRX(
int Offset)
override {
75 OS <<
"\t.seh_save_fplr_x\t" <<
Offset <<
"\n";
77 void emitARM64WinCFISaveReg(
unsigned Reg,
int Offset)
override {
78 OS <<
"\t.seh_save_reg\tx" <<
Reg <<
", " <<
Offset <<
"\n";
80 void emitARM64WinCFISaveRegX(
unsigned Reg,
int Offset)
override {
81 OS <<
"\t.seh_save_reg_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
83 void emitARM64WinCFISaveRegP(
unsigned Reg,
int Offset)
override {
84 OS <<
"\t.seh_save_regp\tx" <<
Reg <<
", " <<
Offset <<
"\n";
86 void emitARM64WinCFISaveRegPX(
unsigned Reg,
int Offset)
override {
87 OS <<
"\t.seh_save_regp_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
89 void emitARM64WinCFISaveLRPair(
unsigned Reg,
int Offset)
override {
90 OS <<
"\t.seh_save_lrpair\tx" <<
Reg <<
", " <<
Offset <<
"\n";
92 void emitARM64WinCFISaveFReg(
unsigned Reg,
int Offset)
override {
93 OS <<
"\t.seh_save_freg\td" <<
Reg <<
", " <<
Offset <<
"\n";
95 void emitARM64WinCFISaveFRegX(
unsigned Reg,
int Offset)
override {
96 OS <<
"\t.seh_save_freg_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
98 void emitARM64WinCFISaveFRegP(
unsigned Reg,
int Offset)
override {
99 OS <<
"\t.seh_save_fregp\td" <<
Reg <<
", " <<
Offset <<
"\n";
101 void emitARM64WinCFISaveFRegPX(
unsigned Reg,
int Offset)
override {
102 OS <<
"\t.seh_save_fregp_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
104 void emitARM64WinCFISetFP()
override { OS <<
"\t.seh_set_fp\n"; }
105 void emitARM64WinCFIAddFP(
unsigned Size)
override {
106 OS <<
"\t.seh_add_fp\t" <<
Size <<
"\n";
108 void emitARM64WinCFINop()
override { OS <<
"\t.seh_nop\n"; }
109 void emitARM64WinCFISaveNext()
override { OS <<
"\t.seh_save_next\n"; }
110 void emitARM64WinCFIPrologEnd()
override { OS <<
"\t.seh_endprologue\n"; }
111 void emitARM64WinCFIEndC()
override { OS <<
"\t.seh_end_c\n"; }
112 void emitARM64WinCFIEpilogStart()
override { OS <<
"\t.seh_startepilogue\n"; }
113 void emitARM64WinCFIEpilogEnd()
override { OS <<
"\t.seh_endepilogue\n"; }
114 void emitARM64WinCFITrapFrame()
override { OS <<
"\t.seh_trap_frame\n"; }
115 void emitARM64WinCFIMachineFrame()
override { OS <<
"\t.seh_pushframe\n"; }
116 void emitARM64WinCFIContext()
override { OS <<
"\t.seh_context\n"; }
117 void emitARM64WinCFIECContext()
override { OS <<
"\t.seh_ec_context\n"; }
118 void emitARM64WinCFIClearUnwoundToCall()
override {
119 OS <<
"\t.seh_clear_unwound_to_call\n";
121 void emitARM64WinCFIPACSignLR()
override {
122 OS <<
"\t.seh_pac_sign_lr\n";
125 void emitARM64WinCFISaveAnyRegI(
unsigned Reg,
int Offset)
override {
126 OS <<
"\t.seh_save_any_reg\tx" <<
Reg <<
", " <<
Offset <<
"\n";
128 void emitARM64WinCFISaveAnyRegIP(
unsigned Reg,
int Offset)
override {
129 OS <<
"\t.seh_save_any_reg_p\tx" <<
Reg <<
", " <<
Offset <<
"\n";
131 void emitARM64WinCFISaveAnyRegD(
unsigned Reg,
int Offset)
override {
132 OS <<
"\t.seh_save_any_reg\td" <<
Reg <<
", " <<
Offset <<
"\n";
134 void emitARM64WinCFISaveAnyRegDP(
unsigned Reg,
int Offset)
override {
135 OS <<
"\t.seh_save_any_reg_p\td" <<
Reg <<
", " <<
Offset <<
"\n";
137 void emitARM64WinCFISaveAnyRegQ(
unsigned Reg,
int Offset)
override {
138 OS <<
"\t.seh_save_any_reg\tq" <<
Reg <<
", " <<
Offset <<
"\n";
140 void emitARM64WinCFISaveAnyRegQP(
unsigned Reg,
int Offset)
override {
141 OS <<
"\t.seh_save_any_reg_p\tq" <<
Reg <<
", " <<
Offset <<
"\n";
143 void emitARM64WinCFISaveAnyRegIX(
unsigned Reg,
int Offset)
override {
144 OS <<
"\t.seh_save_any_reg_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
146 void emitARM64WinCFISaveAnyRegIPX(
unsigned Reg,
int Offset)
override {
147 OS <<
"\t.seh_save_any_reg_px\tx" <<
Reg <<
", " <<
Offset <<
"\n";
149 void emitARM64WinCFISaveAnyRegDX(
unsigned Reg,
int Offset)
override {
150 OS <<
"\t.seh_save_any_reg_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
152 void emitARM64WinCFISaveAnyRegDPX(
unsigned Reg,
int Offset)
override {
153 OS <<
"\t.seh_save_any_reg_px\td" <<
Reg <<
", " <<
Offset <<
"\n";
155 void emitARM64WinCFISaveAnyRegQX(
unsigned Reg,
int Offset)
override {
156 OS <<
"\t.seh_save_any_reg_x\tq" <<
Reg <<
", " <<
Offset <<
"\n";
158 void emitARM64WinCFISaveAnyRegQPX(
unsigned Reg,
int Offset)
override {
159 OS <<
"\t.seh_save_any_reg_px\tq" <<
Reg <<
", " <<
Offset <<
"\n";
161 void emitARM64WinCFIAllocZ(
int Offset)
override {
162 OS <<
"\t.seh_allocz\t" <<
Offset <<
"\n";
164 void emitARM64WinCFISaveZReg(
unsigned Reg,
int Offset)
override {
165 OS <<
"\t.seh_save_zreg\tz" <<
Reg <<
", " <<
Offset <<
"\n";
167 void emitARM64WinCFISavePReg(
unsigned Reg,
int Offset)
override {
168 OS <<
"\t.seh_save_preg\tp" <<
Reg <<
", " <<
Offset <<
"\n";
171 void emitAttribute(StringRef VendorName,
unsigned Tag,
unsigned Value,
172 std::string
String)
override {
177 assert(0 &&
"Arguments error");
185 if (
unsigned(-1) !=
Value) {
186 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
190 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
String;
199 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
207 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value <<
"\t// "
217 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
224 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value <<
"\t// "
234 void emitAttributesSubsection(
235 StringRef SubsectionName,
244 assert((0 == Optional || 1 == Optional) &&
246 assert((0 == ParameterType || 1 == ParameterType) &&
249 std::string SubsectionTag =
".aeabi_subsection";
251 StringRef ParameterStr =
getTypeStr(ParameterType);
253 switch (SubsectionID) {
260 "subsection .aeabi-pauthabi should be marked as "
261 "required and not as optional");
263 "subsection .aeabi-pauthabi should be "
264 "marked as uleb128 and not as ntbs");
269 "subsection .aeabi_feature_and_bits should be "
270 "marked as optional and not as required");
272 "subsection .aeabi_feature_and_bits should "
273 "be marked as uleb128 and not as ntbs");
277 OS <<
"\t" << SubsectionTag <<
"\t" << SubsectionName <<
", " << OptionalStr
278 <<
", " << ParameterStr;
287 AArch64TargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
290AArch64TargetAsmStreamer::AArch64TargetAsmStreamer(
MCStreamer &S,
294void AArch64TargetAsmStreamer::emitInst(
uint32_t Inst) {
311class AArch64ELFStreamer :
public MCELFStreamer {
313 friend AArch64TargetELFStreamer;
314 AArch64ELFStreamer(MCContext &
Context, std::unique_ptr<MCAsmBackend> TAB,
315 std::unique_ptr<MCObjectWriter> OW,
316 std::unique_ptr<MCCodeEmitter>
Emitter)
320 ImplicitMapSyms =
getContext().getTargetOptions().ImplicitMapSyms;
323 void changeSection(MCSection *Section, uint32_t Subsection = 0)
override {
327 LastMappingSymbols[getCurrentSection().first] = LastEMS;
328 auto It = LastMappingSymbols.find(Section);
329 if (It != LastMappingSymbols.end())
330 LastEMS = It->second;
331 else if (ImplicitMapSyms)
332 LastEMS =
Section->isText() ? EMS_A64 : EMS_Data;
344 void reset()
override {
346 LastMappingSymbols.clear();
354 const MCSubtargetInfo &STI)
override {
355 emitA64MappingSymbol();
356 MCELFStreamer::emitInstruction(Inst, STI);
361 void emitInst(uint32_t Inst) {
367 for (
char &
C : Buffer) {
372 emitA64MappingSymbol();
373 MCELFStreamer::emitBytes(StringRef(Buffer, 4));
379 void emitBytes(StringRef
Data)
override {
380 emitDataMappingSymbol();
381 MCELFStreamer::emitBytes(
Data);
387 void emitValueImpl(
const MCExpr *
Value,
unsigned Size, SMLoc Loc)
override {
388 emitDataMappingSymbol();
389 MCELFStreamer::emitValueImpl(
Value,
Size, Loc);
392 void emitFill(
const MCExpr &NumBytes,
uint64_t FillValue,
393 SMLoc Loc)
override {
394 emitDataMappingSymbol();
399 enum ElfMappingSymbol {
405 void emitDataMappingSymbol() {
406 if (LastEMS == EMS_Data)
408 emitMappingSymbol(
"$d");
412 void emitA64MappingSymbol() {
413 if (LastEMS == EMS_A64)
415 emitMappingSymbol(
"$x");
419 MCSymbol *emitMappingSymbol(StringRef Name) {
421 static_cast<MCSymbolELF *
>(
getContext().createLocalSymbol(Name));
426 DenseMap<const MCSection *, ElfMappingSymbol> LastMappingSymbols;
427 ElfMappingSymbol LastEMS;
428 bool ImplicitMapSyms;
432AArch64ELFStreamer &AArch64TargetELFStreamer::getStreamer() {
433 return static_cast<AArch64ELFStreamer &
>(
Streamer);
436void AArch64TargetELFStreamer::emitAttributesSubsection(
443void AArch64TargetELFStreamer::emitAttribute(StringRef VendorName,
unsigned Tag,
446 if (
unsigned(-1) !=
Value)
452void AArch64TargetELFStreamer::emitInst(uint32_t Inst) {
453 getStreamer().emitInst(Inst);
456void AArch64TargetELFStreamer::emitDirectiveVariantPCS(MCSymbol *Symbol) {
457 getStreamer().getAssembler().registerSymbol(*Symbol);
461void AArch64TargetELFStreamer::finish() {
463 AArch64ELFStreamer &S = getStreamer();
464 MCContext &Ctx = S.getContext();
465 auto &
Asm = S.getAssembler();
467 S.emitAttributesSection(AttributeSection,
".ARM.attributes",
477 if (S.ImplicitMapSyms) {
478 auto &Syms =
Asm.getSymbols();
479 const size_t NumSyms = Syms.size();
480 DenseMap<MCSection *, std::pair<size_t, MCSymbol *>> EndMapSym;
481 for (MCSection &Sec : Asm) {
482 S.switchSection(&Sec);
483 if (S.LastEMS == (Sec.isText() ? AArch64ELFStreamer::EMS_Data
484 : AArch64ELFStreamer::EMS_A64))
486 {&Sec, {NumSyms, S.emitMappingSymbol(Sec.isText() ?
"$x" :
"$d")}});
488 if (Syms.size() != NumSyms) {
490 Syms.truncate(NumSyms);
493 if (!Sym->isInSection())
495 auto It = EndMapSym.
find(&Sym->getSection());
496 if (It != EndMapSym.
end())
497 It->second.first =
I;
499 SmallVector<size_t, 0>
Idx;
502 if (!Sym->isInSection())
504 auto It = EndMapSym.
find(&Sym->getSection());
507 if (It != EndMapSym.
end() &&
I == It->second.first) {
512 Syms = std::move(NewSyms);
515 for (
auto &
F : S.getWriter().getFileNames())
525 if (
any_of(Asm, [](
const MCSection &Sec) {
526 return static_cast<const MCSectionELF &
>(Sec).
getFlags() &
532 for (
auto &
F : *
Text) {
542 MCSectionELF *MemtagSec =
nullptr;
543 for (
const MCSymbol &Symbol :
Asm.symbols()) {
544 auto &Sym =
static_cast<const MCSymbolELF &
>(
Symbol);
545 if (Sym.isMemtag()) {
556 S.switchSection(MemtagSec);
558 for (
const MCSymbol &Symbol :
Asm.symbols()) {
559 auto &Sym =
static_cast<const MCSymbolELF &
>(
Symbol);
563 S.emitRelocDirective(*Zero,
"BFD_RELOC_NONE", SRE);
570 return new AArch64TargetAsmStreamer(S, OS);
575 std::unique_ptr<MCAsmBackend> &&TAB,
576 std::unique_ptr<MCObjectWriter> &&OW,
577 std::unique_ptr<MCCodeEmitter> &&
Emitter) {
578 return new AArch64ELFStreamer(Context, std::move(TAB), std::move(OW),
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
dxil DXContainer Global Emitter
This file defines the DenseMap class.
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
std::unique_ptr< MCStreamer > && Streamer
static uint32_t getFlags(const Symbol *Sym)
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
virtual void emitAttributesSubsection(StringRef VendorName, AArch64BuildAttributes::SubsectionOptional IsOptional, AArch64BuildAttributes::SubsectionType ParameterType)
Build attributes implementation.
virtual void emitAttribute(StringRef VendorName, unsigned Tag, unsigned Value, std::string String)
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCObjectFileInfo * getObjectFileInfo() const
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
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
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc=SMLoc()) override
Emit Size bytes worth of the value specified by FillValue.
Streaming machine code generation interface.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
void push_back(const T &Elt)
Triple - Helper class for working with autoconf configuration names.
static Twine utohexstr(uint64_t Val)
LLVM_ABI StringRef getPauthABITagsStr(unsigned PauthABITag)
LLVM_ABI StringRef getOptionalStr(unsigned Optional)
VendorID
AArch64 build attributes vendors IDs (a.k.a subsection name)
LLVM_ABI StringRef getSubsectionTypeUnknownError()
LLVM_ABI StringRef getSubsectionOptionalUnknownError()
LLVM_ABI VendorID getVendorID(StringRef const Vendor)
LLVM_ABI StringRef getTypeStr(unsigned Type)
LLVM_ABI StringRef getFeatureAndBitsTagsStr(unsigned FeatureAndBitsTag)
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
@ SHT_AARCH64_MEMTAG_GLOBALS_STATIC
@ STO_AARCH64_VARIANT_PCS
void emitInstruction(MCObjectStreamer &, const MCInst &Inst, const MCSubtargetInfo &STI)
This is an optimization pass for GlobalISel generic memory operations.
MCStreamer * createAArch64ELFStreamer(const Triple &, MCContext &Context, std::unique_ptr< MCAsmBackend > &&TAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&Emitter)
MCTargetStreamer * createAArch64AsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint)
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.