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)
320 ImplicitMapSyms = TO && TO->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!")
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.