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)
StringRef getPauthABITagsStr(unsigned PauthABITag)
StringRef getOptionalStr(unsigned Optional)
VendorID
AArch64 build attributes vendors IDs (a.k.a subsection name)
StringRef getSubsectionTypeUnknownError()
StringRef getSubsectionOptionalUnknownError()
VendorID getVendorID(StringRef const Vendor)
StringRef getTypeStr(unsigned Type)
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.