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 emitARM64WinCFIEpilogStart()
override { OS <<
"\t.seh_startepilogue\n"; }
112 void emitARM64WinCFIEpilogEnd()
override { OS <<
"\t.seh_endepilogue\n"; }
113 void emitARM64WinCFITrapFrame()
override { OS <<
"\t.seh_trap_frame\n"; }
114 void emitARM64WinCFIMachineFrame()
override { OS <<
"\t.seh_pushframe\n"; }
115 void emitARM64WinCFIContext()
override { OS <<
"\t.seh_context\n"; }
116 void emitARM64WinCFIECContext()
override { OS <<
"\t.seh_ec_context\n"; }
117 void emitARM64WinCFIClearUnwoundToCall()
override {
118 OS <<
"\t.seh_clear_unwound_to_call\n";
120 void emitARM64WinCFIPACSignLR()
override {
121 OS <<
"\t.seh_pac_sign_lr\n";
124 void emitARM64WinCFISaveAnyRegI(
unsigned Reg,
int Offset)
override {
125 OS <<
"\t.seh_save_any_reg\tx" <<
Reg <<
", " <<
Offset <<
"\n";
127 void emitARM64WinCFISaveAnyRegIP(
unsigned Reg,
int Offset)
override {
128 OS <<
"\t.seh_save_any_reg_p\tx" <<
Reg <<
", " <<
Offset <<
"\n";
130 void emitARM64WinCFISaveAnyRegD(
unsigned Reg,
int Offset)
override {
131 OS <<
"\t.seh_save_any_reg\td" <<
Reg <<
", " <<
Offset <<
"\n";
133 void emitARM64WinCFISaveAnyRegDP(
unsigned Reg,
int Offset)
override {
134 OS <<
"\t.seh_save_any_reg_p\td" <<
Reg <<
", " <<
Offset <<
"\n";
136 void emitARM64WinCFISaveAnyRegQ(
unsigned Reg,
int Offset)
override {
137 OS <<
"\t.seh_save_any_reg\tq" <<
Reg <<
", " <<
Offset <<
"\n";
139 void emitARM64WinCFISaveAnyRegQP(
unsigned Reg,
int Offset)
override {
140 OS <<
"\t.seh_save_any_reg_p\tq" <<
Reg <<
", " <<
Offset <<
"\n";
142 void emitARM64WinCFISaveAnyRegIX(
unsigned Reg,
int Offset)
override {
143 OS <<
"\t.seh_save_any_reg_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
145 void emitARM64WinCFISaveAnyRegIPX(
unsigned Reg,
int Offset)
override {
146 OS <<
"\t.seh_save_any_reg_px\tx" <<
Reg <<
", " <<
Offset <<
"\n";
148 void emitARM64WinCFISaveAnyRegDX(
unsigned Reg,
int Offset)
override {
149 OS <<
"\t.seh_save_any_reg_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
151 void emitARM64WinCFISaveAnyRegDPX(
unsigned Reg,
int Offset)
override {
152 OS <<
"\t.seh_save_any_reg_px\td" <<
Reg <<
", " <<
Offset <<
"\n";
154 void emitARM64WinCFISaveAnyRegQX(
unsigned Reg,
int Offset)
override {
155 OS <<
"\t.seh_save_any_reg_x\tq" <<
Reg <<
", " <<
Offset <<
"\n";
157 void emitARM64WinCFISaveAnyRegQPX(
unsigned Reg,
int Offset)
override {
158 OS <<
"\t.seh_save_any_reg_px\tq" <<
Reg <<
", " <<
Offset <<
"\n";
160 void emitARM64WinCFIAllocZ(
int Offset)
override {
161 OS <<
"\t.seh_allocz\t" <<
Offset <<
"\n";
163 void emitARM64WinCFISaveZReg(
unsigned Reg,
int Offset)
override {
164 OS <<
"\t.seh_save_zreg\tz" <<
Reg <<
", " <<
Offset <<
"\n";
166 void emitARM64WinCFISavePReg(
unsigned Reg,
int Offset)
override {
167 OS <<
"\t.seh_save_preg\tp" <<
Reg <<
", " <<
Offset <<
"\n";
170 void emitAttribute(StringRef VendorName,
unsigned Tag,
unsigned Value,
171 std::string
String)
override {
176 assert(0 &&
"Arguments error");
184 if (
unsigned(-1) !=
Value) {
185 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
189 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
String;
198 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
206 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value <<
"\t// "
216 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
223 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value <<
"\t// "
233 void emitAttributesSubsection(
234 StringRef SubsectionName,
243 assert((0 == Optional || 1 == Optional) &&
245 assert((0 == ParameterType || 1 == ParameterType) &&
248 std::string SubsectionTag =
".aeabi_subsection";
250 StringRef ParameterStr =
getTypeStr(ParameterType);
252 switch (SubsectionID) {
259 "subsection .aeabi-pauthabi should be marked as "
260 "required and not as optional");
262 "subsection .aeabi-pauthabi should be "
263 "marked as uleb128 and not as ntbs");
268 "subsection .aeabi_feature_and_bits should be "
269 "marked as optional and not as required");
271 "subsection .aeabi_feature_and_bits should "
272 "be marked as uleb128 and not as ntbs");
276 OS <<
"\t" << SubsectionTag <<
"\t" << SubsectionName <<
", " << OptionalStr
277 <<
", " << ParameterStr;
286 AArch64TargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
289AArch64TargetAsmStreamer::AArch64TargetAsmStreamer(
MCStreamer &S,
293void AArch64TargetAsmStreamer::emitInst(
uint32_t Inst) {
310class AArch64ELFStreamer :
public MCELFStreamer {
312 friend AArch64TargetELFStreamer;
313 AArch64ELFStreamer(MCContext &
Context, std::unique_ptr<MCAsmBackend> TAB,
314 std::unique_ptr<MCObjectWriter> OW,
315 std::unique_ptr<MCCodeEmitter>
Emitter)
319 ImplicitMapSyms =
getContext().getTargetOptions().ImplicitMapSyms;
322 void changeSection(MCSection *Section, uint32_t Subsection = 0)
override {
326 LastMappingSymbols[getCurrentSection().first] = LastEMS;
327 auto It = LastMappingSymbols.find(Section);
328 if (It != LastMappingSymbols.end())
329 LastEMS = It->second;
330 else if (ImplicitMapSyms)
331 LastEMS =
Section->isText() ? EMS_A64 : EMS_Data;
343 void reset()
override {
345 LastMappingSymbols.clear();
353 const MCSubtargetInfo &STI)
override {
354 emitA64MappingSymbol();
355 MCELFStreamer::emitInstruction(Inst, STI);
360 void emitInst(uint32_t Inst) {
366 for (
char &
C : Buffer) {
371 emitA64MappingSymbol();
372 MCELFStreamer::emitBytes(StringRef(Buffer, 4));
378 void emitBytes(StringRef
Data)
override {
379 emitDataMappingSymbol();
380 MCELFStreamer::emitBytes(
Data);
386 void emitValueImpl(
const MCExpr *
Value,
unsigned Size, SMLoc Loc)
override {
387 emitDataMappingSymbol();
388 MCELFStreamer::emitValueImpl(
Value,
Size, Loc);
391 void emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
392 SMLoc Loc)
override {
393 emitDataMappingSymbol();
398 enum ElfMappingSymbol {
404 void emitDataMappingSymbol() {
405 if (LastEMS == EMS_Data)
407 emitMappingSymbol(
"$d");
411 void emitA64MappingSymbol() {
412 if (LastEMS == EMS_A64)
414 emitMappingSymbol(
"$x");
418 MCSymbol *emitMappingSymbol(StringRef Name) {
420 static_cast<MCSymbolELF *
>(
getContext().createLocalSymbol(Name));
425 DenseMap<const MCSection *, ElfMappingSymbol> LastMappingSymbols;
426 ElfMappingSymbol LastEMS;
427 bool ImplicitMapSyms;
431AArch64ELFStreamer &AArch64TargetELFStreamer::getStreamer() {
432 return static_cast<AArch64ELFStreamer &
>(Streamer);
435void AArch64TargetELFStreamer::emitAttributesSubsection(
442void AArch64TargetELFStreamer::emitAttribute(StringRef VendorName,
unsigned Tag,
445 if (
unsigned(-1) !=
Value)
451void AArch64TargetELFStreamer::emitInst(uint32_t Inst) {
452 getStreamer().emitInst(Inst);
455void AArch64TargetELFStreamer::emitDirectiveVariantPCS(MCSymbol *Symbol) {
456 getStreamer().getAssembler().registerSymbol(*Symbol);
460void AArch64TargetELFStreamer::finish() {
462 AArch64ELFStreamer &S = getStreamer();
463 MCContext &Ctx = S.getContext();
464 auto &
Asm = S.getAssembler();
466 S.emitAttributesSection(AttributeSection,
".ARM.attributes",
476 if (S.ImplicitMapSyms) {
477 auto &Syms =
Asm.getSymbols();
478 const size_t NumSyms = Syms.size();
479 DenseMap<MCSection *, std::pair<size_t, MCSymbol *>> EndMapSym;
480 for (MCSection &Sec : Asm) {
481 S.switchSection(&Sec);
482 if (S.LastEMS == (Sec.isText() ? AArch64ELFStreamer::EMS_Data
483 : AArch64ELFStreamer::EMS_A64))
485 {&Sec, {NumSyms, S.emitMappingSymbol(Sec.isText() ?
"$x" :
"$d")}});
487 if (Syms.size() != NumSyms) {
489 Syms.truncate(NumSyms);
492 if (!Sym->isInSection())
494 auto It = EndMapSym.
find(&Sym->getSection());
495 if (It != EndMapSym.
end())
496 It->second.first =
I;
498 SmallVector<size_t, 0> Idx;
501 if (!Sym->isInSection())
503 auto It = EndMapSym.
find(&Sym->getSection());
506 if (It != EndMapSym.
end() &&
I == It->second.first) {
511 Syms = std::move(NewSyms);
514 for (
auto &
F : S.getWriter().getFileNames())
524 if (
any_of(Asm, [](
const MCSection &Sec) {
525 return static_cast<const MCSectionELF &
>(Sec).
getFlags() &
531 for (
auto &
F : *
Text) {
541 MCSectionELF *MemtagSec =
nullptr;
542 for (
const MCSymbol &Symbol :
Asm.symbols()) {
543 auto &Sym =
static_cast<const MCSymbolELF &
>(
Symbol);
544 if (Sym.isMemtag()) {
555 S.switchSection(MemtagSec);
557 for (
const MCSymbol &Symbol :
Asm.symbols()) {
558 auto &Sym =
static_cast<const MCSymbolELF &
>(
Symbol);
562 S.emitRelocDirective(*Zero,
"BFD_RELOC_NONE", SRE);
569 return new AArch64TargetAsmStreamer(S, OS);
574 std::unique_ptr<MCAsmBackend> &&TAB,
575 std::unique_ptr<MCObjectWriter> &&OW,
576 std::unique_ptr<MCCodeEmitter> &&
Emitter) {
577 return new AArch64ELFStreamer(Context, std::move(TAB), std::move(OW),
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
dxil DXContainer Global Emitter
This file defines the DenseMap class.
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.
@ C
The default llvm calling convention, compatible with C.
@ SHT_AARCH64_MEMTAG_GLOBALS_STATIC
@ STO_AARCH64_VARIANT_PCS
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
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,...
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...
FunctionAddr VTableAddr uintptr_t uintptr_t Data
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.