45class AArch64ELFStreamer;
49 std::string VendorTag;
54 OS <<
"\t.variant_pcs\t" <<
Symbol->getName() <<
"\n";
58 OS <<
"\t.seh_stackalloc\t" <<
Size <<
"\n";
61 OS <<
"\t.seh_save_r19r20_x\t" <<
Offset <<
"\n";
64 OS <<
"\t.seh_save_fplr\t" <<
Offset <<
"\n";
67 OS <<
"\t.seh_save_fplr_x\t" <<
Offset <<
"\n";
70 OS <<
"\t.seh_save_reg\tx" <<
Reg <<
", " <<
Offset <<
"\n";
73 OS <<
"\t.seh_save_reg_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
76 OS <<
"\t.seh_save_regp\tx" <<
Reg <<
", " <<
Offset <<
"\n";
79 OS <<
"\t.seh_save_regp_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
82 OS <<
"\t.seh_save_lrpair\tx" <<
Reg <<
", " <<
Offset <<
"\n";
85 OS <<
"\t.seh_save_freg\td" <<
Reg <<
", " <<
Offset <<
"\n";
88 OS <<
"\t.seh_save_freg_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
91 OS <<
"\t.seh_save_fregp\td" <<
Reg <<
", " <<
Offset <<
"\n";
94 OS <<
"\t.seh_save_fregp_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
98 OS <<
"\t.seh_add_fp\t" <<
Size <<
"\n";
110 OS <<
"\t.seh_clear_unwound_to_call\n";
113 OS <<
"\t.seh_pac_sign_lr\n";
117 OS <<
"\t.seh_save_any_reg\tx" <<
Reg <<
", " <<
Offset <<
"\n";
120 OS <<
"\t.seh_save_any_reg_p\tx" <<
Reg <<
", " <<
Offset <<
"\n";
123 OS <<
"\t.seh_save_any_reg\td" <<
Reg <<
", " <<
Offset <<
"\n";
126 OS <<
"\t.seh_save_any_reg_p\td" <<
Reg <<
", " <<
Offset <<
"\n";
129 OS <<
"\t.seh_save_any_reg\tq" <<
Reg <<
", " <<
Offset <<
"\n";
132 OS <<
"\t.seh_save_any_reg_p\tq" <<
Reg <<
", " <<
Offset <<
"\n";
135 OS <<
"\t.seh_save_any_reg_x\tx" <<
Reg <<
", " <<
Offset <<
"\n";
138 OS <<
"\t.seh_save_any_reg_px\tx" <<
Reg <<
", " <<
Offset <<
"\n";
141 OS <<
"\t.seh_save_any_reg_x\td" <<
Reg <<
", " <<
Offset <<
"\n";
144 OS <<
"\t.seh_save_any_reg_px\td" <<
Reg <<
", " <<
Offset <<
"\n";
147 OS <<
"\t.seh_save_any_reg_x\tq" <<
Reg <<
", " <<
Offset <<
"\n";
150 OS <<
"\t.seh_save_any_reg_px\tq" <<
Reg <<
", " <<
Offset <<
"\n";
154 std::string
String,
bool Override)
override {
159 assert(0 &&
"Arguments error");
167 assert(0 &&
"Subsection name error");
170 if (
unsigned(-1) !=
Value) {
171 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
176 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
String;
185 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
194 OS <<
"\t.aeabi_attribute" <<
"\t"
205 OS <<
"\t.aeabi_attribute" <<
"\t" <<
Tag <<
", " <<
Value;
213 OS <<
"\t.aeabi_attribute" <<
"\t"
233 assert((0 == Optional || 1 == Optional) &&
235 assert((0 == ParameterType || 1 == ParameterType) &&
238 std::string SubsectionTag =
".aeabi_subsection";
242 switch (SubsectionID) {
249 "subsection .aeabi-pauthabi should be marked as "
250 "required and not as optional");
252 "subsection .aeabi-pauthabi should be "
253 "marked as uleb128 and not as ntbs");
258 "subsection .aeabi_feature_and_bits should be "
259 "marked as optional and not as required");
261 "subsection .aeabi_feature_and_bits should "
262 "be marked as uleb128 and not as ntbs");
266 OS <<
"\t" << SubsectionTag <<
"\t" << SubsectionName <<
", " << OptionalStr
267 <<
", " << ParameterStr;
279AArch64TargetAsmStreamer::AArch64TargetAsmStreamer(
MCStreamer &S,
283void AArch64TargetAsmStreamer::emitInst(
uint32_t Inst) {
303 AArch64ELFStreamer(
MCContext &Context, std::unique_ptr<MCAsmBackend> TAB,
304 std::unique_ptr<MCObjectWriter> OW,
305 std::unique_ptr<MCCodeEmitter>
Emitter)
318 auto It = LastMappingSymbols.find(Section);
319 if (It != LastMappingSymbols.end())
320 LastEMS = It->second;
321 else if (ImplicitMapSyms)
322 LastEMS =
Section->isText() ? EMS_A64 : EMS_Data;
330 void reset()
override {
332 LastMappingSymbols.clear();
341 emitA64MappingSymbol();
353 for (
char &
C : Buffer) {
358 emitA64MappingSymbol();
366 emitDataMappingSymbol();
374 emitDataMappingSymbol();
379 SMLoc Loc)
override {
380 emitDataMappingSymbol();
385 enum ElfMappingSymbol {
391 void emitDataMappingSymbol() {
392 if (LastEMS == EMS_Data)
394 emitMappingSymbol(
"$d");
398 void emitA64MappingSymbol() {
399 if (LastEMS == EMS_A64)
401 emitMappingSymbol(
"$x");
412 ElfMappingSymbol LastEMS;
413 bool ImplicitMapSyms;
417AArch64ELFStreamer &AArch64TargetELFStreamer::getStreamer() {
418 return static_cast<AArch64ELFStreamer &
>(
Streamer);
421void AArch64TargetELFStreamer::emitAtributesSubsection(
428void AArch64TargetELFStreamer::emitAttribute(
StringRef VendorName,
unsigned Tag,
431 if (
unsigned(-1) !=
Value)
438void AArch64TargetELFStreamer::emitInst(
uint32_t Inst) {
439 getStreamer().emitInst(Inst);
442void AArch64TargetELFStreamer::emitDirectiveVariantPCS(
MCSymbol *Symbol) {
443 getStreamer().getAssembler().registerSymbol(*Symbol);
447void AArch64TargetELFStreamer::finish() {
449 AArch64ELFStreamer &S = getStreamer();
451 auto &
Asm = S.getAssembler();
453 S.emitAttributesSection(AttributeSection,
".ARM.attributes",
463 if (S.ImplicitMapSyms) {
464 auto &Syms =
Asm.getSymbols();
465 const size_t NumSyms = Syms.size();
468 S.switchSection(&Sec);
469 if (S.LastEMS == (Sec.isText() ? AArch64ELFStreamer::EMS_Data
470 : AArch64ELFStreamer::EMS_A64))
472 {&Sec, {NumSyms, S.emitMappingSymbol(Sec.isText() ?
"$x" :
"$d")}});
474 if (Syms.size() != NumSyms) {
477 Syms.truncate(NumSyms);
480 if (!
Sym->isInSection())
482 auto It = EndMapSym.
find(&
Sym->getSection());
483 if (It != EndMapSym.
end())
484 It->second.first =
I;
489 if (!
Sym->isInSection())
491 auto It = EndMapSym.
find(&
Sym->getSection());
494 if (It != EndMapSym.
end() &&
I == It->second.first) {
499 Syms = std::move(NewSyms);
502 for (
auto &
F : S.getWriter().getFileNames())
509 const auto &
Sym = cast<MCSymbolELF>(Symbol);
510 if (
Sym.isMemtag()) {
521 S.switchSection(MemtagSec);
524 const auto &
Sym = cast<MCSymbolELF>(Symbol);
528 (void)S.emitRelocDirective(*Zero,
"BFD_RELOC_NONE", SRE,
SMLoc(),
536 return new AArch64TargetAsmStreamer(S,
OS);
541 std::unique_ptr<MCAsmBackend> TAB,
542 std::unique_ptr<MCObjectWriter> OW,
543 std::unique_ptr<MCCodeEmitter>
Emitter) {
544 AArch64ELFStreamer *S =
new AArch64ELFStreamer(
545 Context, std::move(TAB), std::move(OW), std::move(
Emitter));
dxil DXContainer Global Emitter
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
virtual void emitARM64WinCFISaveAnyRegIX(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveRegP(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveAnyRegQX(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveAnyRegDPX(unsigned Reg, int Offset)
virtual void emitAtributesSubsection(StringRef VendorName, AArch64BuildAttrs::SubsectionOptional IsOptional, AArch64BuildAttrs::SubsectionType ParameterType)
Build attributes implementation.
virtual void emitARM64WinCFISaveAnyRegDX(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveRegPX(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveAnyRegQ(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveAnyRegQP(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveAnyRegD(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveFReg(unsigned Reg, int Offset)
virtual void emitARM64WinCFIPACSignLR()
virtual void emitARM64WinCFISaveAnyRegI(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveFRegPX(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveRegX(unsigned Reg, int Offset)
virtual void emitARM64WinCFIAllocStack(unsigned Size)
virtual void emitARM64WinCFISaveFPLRX(int Offset)
virtual void emitARM64WinCFISaveNext()
virtual void emitAttribute(StringRef VendorName, unsigned Tag, unsigned Value, std::string String, bool Override)
virtual void emitDirectiveVariantPCS(MCSymbol *Symbol)
Callback used to implement the .variant_pcs directive.
virtual void emitARM64WinCFISaveR19R20X(int Offset)
virtual void emitARM64WinCFIAddFP(unsigned Size)
virtual void emitARM64WinCFISaveFPLR(int Offset)
virtual void emitARM64WinCFIClearUnwoundToCall()
virtual void emitARM64WinCFISaveFRegP(unsigned Reg, int Offset)
virtual void emitARM64WinCFIECContext()
virtual void emitARM64WinCFISaveAnyRegQPX(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveFRegX(unsigned Reg, int Offset)
SmallVector< MCELFStreamer::AttributeSubSection, 64 > AttributeSubSections
virtual void emitARM64WinCFISetFP()
virtual void emitARM64WinCFISaveAnyRegDP(unsigned Reg, int Offset)
virtual void emitARM64WinCFISaveAnyRegIPX(unsigned Reg, int Offset)
virtual void emitARM64WinCFIEpilogEnd()
virtual void emitARM64WinCFIMachineFrame()
virtual void emitARM64WinCFIPrologEnd()
virtual void emitARM64WinCFITrapFrame()
virtual void emitARM64WinCFIContext()
virtual void emitARM64WinCFISaveReg(unsigned Reg, int Offset)
virtual void emitARM64WinCFINop()
virtual void emitARM64WinCFISaveLRPair(unsigned Reg, int Offset)
virtual void emitInst(uint32_t Inst)
Callback used to implement the .inst directive.
virtual void emitARM64WinCFIEpilogStart()
virtual void emitARM64WinCFISaveAnyRegIP(unsigned Reg, int Offset)
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
const MCTargetOptions * getTargetOptions() const
const MCSubtargetInfo * getSubtargetInfo() const
void changeSection(MCSection *Section, uint32_t Subsection=0) override
This is called by popSection and switchSection, if the current section changes.
void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc()) override
Emit the expression Value into the output as a native integer of the given Size bytes.
void reset() override
state management
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
Base class for the full range of assembler expressions which are needed for parsing.
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
Instances of this class represent a single low-level machine instruction.
void emitFill(const MCExpr &NumBytes, uint64_t FillValue, SMLoc Loc=SMLoc()) override
Emit Size bytes worth of the value specified by FillValue.
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override
Emit the given Instruction into the current section.
This represents a section on linux, lots of unix variants and some bare metal systems.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Streaming machine code generation interface.
MCContext & getContext() const
MCSectionSubPair getCurrentSection() const
Return the current section that the streamer is emitting code to.
Generic base class for all target subtargets.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Target specific streamer interface.
Represents a location in source code.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
static Twine utohexstr(const uint64_t &Val)
LLVM Value Representation.
StringRef getFeatureAndBitsTagsStr(unsigned FeatureAndBitsTag)
StringRef getPauthABITagsStr(unsigned PauthABITag)
StringRef getOptionalStr(unsigned Optional)
StringRef getSubsectionOptionalUnknownError()
VendorID
AArch64 build attributes vendors IDs (a.k.a subsection name)
VendorID getVendorID(StringRef const Vendor)
StringRef getTypeStr(unsigned Type)
StringRef getSubsectionTypeUnknownError()
@ C
The default llvm calling convention, compatible with C.
@ STO_AARCH64_VARIANT_PCS
@ SHT_AARCH64_MEMTAG_GLOBALS_STATIC
Reg
All possible values of the reg field in the ModR/M byte.
This is an optimization pass for GlobalISel generic memory operations.
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,...
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.
MCELFStreamer * createAArch64ELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
Implement std::hash so that hash_code can be used in STL containers.