1//===-- X86AsmPrinter.cpp - Convert X86 LLVM code to AT&T assembly --------===//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7//===----------------------------------------------------------------------===//
9// This file contains a printer that converts from our internal representation
10// of machine-dependent LLVM code to X86 machine code.
12//===----------------------------------------------------------------------===//
57 std::unique_ptr<MCStreamer> Streamer)
60//===----------------------------------------------------------------------===//
61// Primitive Helper Functions.
62//===----------------------------------------------------------------------===//
64/// runOnMachineFunction - Emit the function body.
68 PSI = &PSIW->getPSI();
70 SDPI = &SDPIW->getStaticDataProfileInfo();
74 SMShadowTracker.startFunction(
MF);
75 CodeEmitter.reset(
TM.getTarget().createMCCodeEmitter(
76 *Subtarget->getInstrInfo(),
MF.getContext()));
78 const Module *M =
MF.getFunction().getParent();
79 EmitFPOData = Subtarget->isTargetWin32() && M->getCodeViewFlag();
81 IndCSPrefix = M->getModuleFlag(
"indirect_branch_cs_prefix");
85 if (Subtarget->isTargetCOFF()) {
86 bool Local =
MF.getFunction().hasLocalLinkage();
95 // Emit the rest of the function body.
98 // Emit the XRay table for this function.
105 // We didn't modify anything.
128 // If the type hash matches an invalid pattern, mask the value.
130 0xFA1E0FF3,
/* ENDBR64 */
131 0xFB1E0FF3,
/* ENDBR32 */
134 // LowerKCFI_CHECK emits -Value for indirect call checks, so we must also
135 // mask that. Note that -(Value + 1) == ~Value.
144 // Keep the function entry aligned, taking patchable-function-prefix into
146 int64_t PrefixBytes = 0;
147 (void)
MF.getFunction()
148 .getFnAttribute(
"patchable-function-prefix")
150 .getAsInteger(10, PrefixBytes);
152 // Also take the type identifier into account if we're emitting
153 // one. Otherwise, just pad with nops. The X86::MOV32ri instruction emitted
154 // in X86AsmPrinter::emitKCFITypeId is 5 bytes long.
161/// emitKCFITypeId - Emit the KCFI type information in architecture specific
165 if (!
F.getParent()->getModuleFlag(
"kcfi"))
169 if (
const MDNode *MD =
F.getMetadata(LLVMContext::MD_kcfi_type))
172 // If we don't have a type to emit, just emit padding if needed to maintain
173 // the same alignment for all functions.
175 EmitKCFITypePadding(
MF,
/*HasType=*/false);
179 // Emit a function symbol for the type data to avoid unreachable instruction
180 // warnings from binary validation tools, and use the same linkage as the
181 // parent function. Note that using local linkage would result in duplicate
182 // symbols for weak parent functions.
185 if (
MAI->hasDotTypeDotSizeDirective())
189 // Embed the type hash in the X86::MOV32ri instruction to avoid special
190 // casing object file parsers.
191 EmitKCFITypePadding(
MF);
192 unsigned DestReg = X86::EAX;
194 if (
F.getParent()->getModuleFlag(
"kcfi-arity")) {
195 // The ArityToRegMap assumes the 64-bit SysV ABI.
196 [[maybe_unused]]
const auto &
Triple =
MF.getTarget().getTargetTriple();
199 // Determine the function's arity (i.e., the number of arguments) at the ABI
200 // level by counting the number of parameters that are passed
201 // as registers, such as pointers and 64-bit (or smaller) integers. The
202 // Linux x86-64 ABI allows up to 6 integer parameters to be passed in GPRs.
203 // Additional parameters or parameters larger than 64 bits may be passed on
204 // the stack, in which case the arity is denoted as 7. Floating-point
205 // arguments passed in XMM0-XMM7 are not counted toward arity because
206 // floating-point values are not relevant to enforcing kCFI at this time.
207 const unsigned ArityToRegMap[8] = {X86::EAX, X86::ECX, X86::EDX, X86::EBX,
208 X86::ESP, X86::EBP, X86::ESI, X86::EDI};
214 for (
const auto &LI :
MF.getRegInfo().liveins()) {
223 DestReg = ArityToRegMap[Arity];
228 .addImm(MaskKCFIType(
Type->getZExtValue())));
230 if (
MAI->hasDotTypeDotSizeDirective()) {
241/// PrintSymbolOperand - Print a raw symbol reference operand. This handles
242/// jump tables, constant pools, global address and external symbols, all of
243/// which print to a label with various suffixes for relocation types etc.
262 // Handle dllimport linkage.
279 // If the name begins with a dollar-sign, enclose it in parens. We do this
280 // to avoid having it look like an integer immediate to the assembler.
281 if (GVSym->
getName()[0] !=
'$')
301 // These affect the name of the symbol, not any suffix.
305 MF->getPICBaseSymbol()->print(O,
MAI);
311 MF->getPICBaseSymbol()->print(O,
MAI);
330 MF->getPICBaseSymbol()->print(O,
MAI);
336void X86AsmPrinter::PrintOperand(
const MachineInstr *
MI,
unsigned OpNo,
338 const MachineOperand &MO =
MI->getOperand(OpNo);
357 switch (
MI->getInlineAsmDialect()) {
365 PrintSymbolOperand(MO, O);
376/// PrintModifiedOperand - Print subregisters based on supplied modifier,
377/// deferring to PrintOperand() if no modifier was supplied or if operand is not
379void X86AsmPrinter::PrintModifiedOperand(
const MachineInstr *
MI,
unsigned OpNo,
381 const MachineOperand &MO =
MI->getOperand(OpNo);
383 return PrintOperand(
MI, OpNo, O);
388 unsigned Size = (Modifier ==
"64") ? 64
389 : (Modifier ==
"32") ? 32
390 : (Modifier ==
"16") ? 16
397/// PrintPCRelImm - This is used to print an immediate value that ends up
398/// being encoded as a pc-relative value. These print slightly differently, for
399/// example, a $ is not emitted.
400void X86AsmPrinter::PrintPCRelImm(
const MachineInstr *
MI,
unsigned OpNo,
402 const MachineOperand &MO =
MI->getOperand(OpNo);
406 // pc-relativeness was handled when computing the value in the reg.
407 PrintOperand(
MI, OpNo, O);
413 PrintSymbolOperand(MO, O);
418void X86AsmPrinter::PrintLeaMemReference(
const MachineInstr *
MI,
unsigned OpNo,
424 // If we really don't want to print out (rip), don't.
425 bool HasBaseReg =
BaseReg.getReg() != 0;
426 if (HasBaseReg && Modifier ==
"no-rip" &&
BaseReg.getReg() == X86::RIP)
429 // HasParenPart - True if we will print out the () part of the mem ref.
430 bool HasParenPart = IndexReg.
getReg() || HasBaseReg;
436 int DispVal = DispSpec.
getImm();
437 if (DispVal || !HasParenPart)
443 PrintSymbolOperand(DispSpec, O);
452 "X86 doesn't allow scaling by ESP");
463 O <<
',' << ScaleVal;
470 // We exclude all tail calls here which set both isReturn and isCall.
471 return MI.getDesc().isReturn() && !
MI.getDesc().isCall();
475 unsigned Opc =
MI.getOpcode();
476 return MI.getDesc().isIndirectBranch()
/*Make below code in a good shape*/ ||
477 Opc == X86::TAILJMPr ||
Opc == X86::TAILJMPm ||
478 Opc == X86::TAILJMPr64 ||
Opc == X86::TAILJMPm64 ||
479 Opc == X86::TCRETURNri ||
Opc == X86::TCRETURN_WIN64ri ||
480 Opc == X86::TCRETURN_HIPE32ri ||
Opc == X86::TCRETURNmi ||
481 Opc == X86::TCRETURN_WINmi64 ||
Opc == X86::TCRETURNri64 ||
482 Opc == X86::TCRETURNmi64 ||
Opc == X86::TCRETURNri64_ImpCall ||
483 Opc == X86::TAILJMPr64_REX ||
Opc == X86::TAILJMPm64_REX;
487 if (Subtarget->hardenSlsRet() || Subtarget->hardenSlsIJmp()) {
488 auto I =
MBB.getLastNonDebugInstr();
489 if (
I !=
MBB.end()) {
502void X86AsmPrinter::PrintMemReference(
const MachineInstr *
MI,
unsigned OpNo,
510 PrintLeaMemReference(
MI, OpNo, O, Modifier);
522 // If we really don't want to print out (rip), don't.
523 bool HasBaseReg =
BaseReg.getReg() != 0;
524 if (HasBaseReg && Modifier ==
"no-rip" &&
BaseReg.getReg() == X86::RIP)
527 // If we really just want to print out displacement.
528 if ((DispSpec.
isGlobal() || DispSpec.
isSymbol()) && Modifier ==
"disp-only") {
532 // If this has a segment register, print it.
540 bool NeedPlus =
false;
547 if (NeedPlus)
O <<
" + ";
549 O << ScaleVal <<
'*';
554 if (!DispSpec.
isImm()) {
555 if (NeedPlus)
O <<
" + ";
556 // Do not add `offset` operator. Matches the behaviour of
557 // X86IntelInstPrinter::printMemReference.
558 PrintSymbolOperand(DispSpec, O);
560 int64_t DispVal = DispSpec.
getImm();
561 if (DispVal || (!IndexReg.
getReg() && !HasBaseReg)) {
584 // jmpq *lazy_pointer(%rip)
587 MCInstBuilder(X86::JMP32m)
597void X86AsmPrinter::emitMachOIFuncStubHelperBody(
Module &M,
600 // _ifunc.stub_helper:
609 // movq %rax,lazy_pointer(%rip)
617 // jmpq *lazy_pointer(%rip)
620 {X86::RAX, X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9})
621 OutStreamer->emitInstruction(MCInstBuilder(X86::PUSH64r).addReg(
Reg),
625 MCInstBuilder(X86::CALL64pcrel32)
630 MCInstBuilder(X86::MOV64mr)
641 {X86::R9, X86::R8, X86::RCX, X86::RDX, X86::RSI, X86::RDI, X86::RAX})
642 OutStreamer->emitInstruction(MCInstBuilder(X86::POP64r).addReg(
Reg),
646 MCInstBuilder(X86::JMP32m)
668 default:
return true;
// Unknown mode.
669 case 'b':
// Print QImode register
672 case 'h':
// Print QImode high register
677 case 'w':
// Print HImode register
680 case 'k':
// Print SImode register
687 // Print 64-bit register names if 64-bit integer registers are available.
688 // Otherwise, print 32-bit register names.
707 Index =
Reg - X86::XMM0;
709 Index =
Reg - X86::YMM0;
711 Index =
Reg - X86::ZMM0;
716 default:
// Unknown mode.
718 case 'x':
// Print V4SFmode register
719 Reg = X86::XMM0 + Index;
721 case 't':
// Print V8SFmode register
722 Reg = X86::YMM0 + Index;
724 case 'g':
// Print V16SFmode register
725 Reg = X86::ZMM0 + Index;
736/// PrintAsmOperand - Print out an operand for an inline asm expression.
740 // Does this asm operand have a single letter operand modifier?
741 if (ExtraCode && ExtraCode[0]) {
742 if (ExtraCode[1] != 0)
return true;
// Unknown modifier.
746 switch (ExtraCode[0]) {
748 // See if this is a generic print operand
750 case 'a':
// This is an address. Currently only 'i' and 'r' are expected.
762 PrintSymbolOperand(MO, O);
763 if (Subtarget->is64Bit())
768 PrintOperand(
MI, OpNo, O);
773 case 'c':
// Don't print "$" before a global var name or constant.
776 PrintOperand(
MI, OpNo, O);
786 PrintSymbolOperand(MO, O);
791 case 'A':
// Print '*' before a register (it must be a register)
794 PrintOperand(
MI, OpNo, O);
799 case 'b':
// Print QImode register
800 case 'h':
// Print QImode high register
801 case 'w':
// Print HImode register
802 case 'k':
// Print SImode register
803 case 'q':
// Print DImode register
804 case 'V':
// Print native register without '%'
807 PrintOperand(
MI, OpNo, O);
810 case 'x':
// Print V4SFmode register
811 case 't':
// Print V8SFmode register
812 case 'g':
// Print V16SFmode register
815 PrintOperand(
MI, OpNo, O);
822 PrintSymbolOperand(MO, O);
826 case 'P':
// This is the operand of a call, treat specially.
827 PrintPCRelImm(
MI, OpNo, O);
830 case 'n':
// Negate the immediate or print a '-' before the operand.
831 // Note: this is a temporary solution. It should be handled target
832 // independently as part of the 'MC' work.
841 PrintOperand(
MI, OpNo, O);
846 const char *ExtraCode,
848 if (ExtraCode && ExtraCode[0]) {
849 if (ExtraCode[1] != 0)
return true;
// Unknown modifier.
851 switch (ExtraCode[0]) {
852 default:
return true;
// Unknown modifier.
853 case 'b':
// Print QImode register
854 case 'h':
// Print QImode high register
855 case 'w':
// Print HImode register
856 case 'k':
// Print SImode register
857 case 'q':
// Print SImode register
858 // These only apply to registers, ignore on mem.
862 return true;
// Unsupported modifier in Intel inline assembly.
864 PrintMemReference(
MI, OpNo, O,
"H");
867 // Print memory only with displacement. The Modifer 'P' is used in inline
868 // asm to present a call symbol or a global symbol which can not use base
872 PrintIntelMemReference(
MI, OpNo, O,
"disp-only");
874 PrintMemReference(
MI, OpNo, O,
"disp-only");
880 PrintIntelMemReference(
MI, OpNo, O);
882 PrintMemReference(
MI, OpNo, O);
888 const Triple &TT =
TM.getTargetTriple();
890 if (TT.isOSBinFormatELF()) {
891 // Assemble feature flags that may require creation of a note section.
892 unsigned FeatureFlagsAnd = 0;
893 if (M.getModuleFlag(
"cf-protection-branch"))
895 if (M.getModuleFlag(
"cf-protection-return"))
898 if (FeatureFlagsAnd) {
899 // Emit a .note.gnu.property section with the flags.
900 assert((TT.isX86_32() || TT.isX86_64()) &&
901 "CFProtection used on invalid architecture!");
907 // Emitting note header.
908 const int WordSize = TT.isX86_64() && !TT.isX32() ? 8 : 4;
910 OutStreamer->emitIntValue(4, 4
/*size*/);
// data size for "GNU0円"
911 OutStreamer->emitIntValue(8 + WordSize, 4
/*size*/);
// Elf_Prop size
915 // Emitting an Elf_Prop for the CET properties.
925 if (TT.isOSBinFormatMachO())
928 if (TT.isOSBinFormatCOFF()) {
932 if (M.getModuleFlag(
"import-call-optimization"))
933 EnableImportCallOptimization =
true;
937 // If this is not inline asm and we're in 16-bit
938 // mode prefix assembly with .code16.
940 if (M.getModuleInlineAsm().empty() && is16) {
952 // .indirect_symbol _foo
956 // External to current translation unit.
959 // Internal to current translation unit.
961 // When we place the LSDA into the TEXT section, the type info
962 // pointers need to be indirect and pc-rel. We accomplish this by
963 // using NLPs; however, sometimes the types are local to the file.
964 // We need to fill in the value for the NLP in those cases.
975 // Output stubs for dynamically-linked functions.
978 // Output stubs for external and common global variables.
980 if (!Stubs.empty()) {
985 for (
auto &Stub : Stubs)
993/// True if this module is being built for windows/msvc, and uses floating
994/// point. This is used to emit an undefined reference to _fltused. This is
995/// needed in Windows kernel or driver contexts to find and prevent code from
996/// modifying non-GPR registers.
998/// TODO: It would be better if this was computed from MIR by looking for
999/// selected floating-point instructions.
1001 // Only needed for MSVC
1002 if (!TT.isWindowsMSVCEnvironment())
1007 if (
I.getType()->isFloatingPointTy())
1010 for (
const auto &
Op :
I.operands()) {
1011 if (
Op->getType()->isFloatingPointTy())
1021 const Triple &TT =
TM.getTargetTriple();
1023 if (TT.isOSBinFormatMachO()) {
1024 // Mach-O uses non-lazy symbol stubs to encode per-TU information into
1025 // global table for symbol lookup.
1028 // Emit fault map information.
1029 FM.serializeToFaultMapSection();
1031 // This flag tells the linker that no global symbols contain code that fall
1032 // through to other global symbols (e.g. an implementation of multiple entry
1033 // points). If this doesn't occur, the linker can safely perform dead code
1034 // stripping. Since LLVM never generates code that does this, it is always
1037 }
else if (TT.isOSBinFormatCOFF()) {
1038 // If import call optimization is enabled, emit the appropriate section.
1039 // We do this whether or not we recorded any items.
1040 if (EnableImportCallOptimization) {
1043 // Section always starts with some magic.
1044 constexpr char ImpCallMagic[12] =
"RetpolineV1";
1047 // Layout of this section is:
1048 // Per section that contains an item to record:
1049 // uint32_t SectionSize: Size in bytes for information in this section.
1050 // uint32_t Section Number
1051 // Per call to imported function in section:
1052 // uint32_t Kind: the kind of item.
1053 // uint32_t InstOffset: the offset of the instr in its parent section.
1054 for (
auto &[Section, CallsToImportedFuncs] :
1055 SectionToImportedFunctionCalls) {
1056 unsigned SectionSize =
1057 sizeof(
uint32_t) * (2 + 2 * CallsToImportedFuncs.size());
1059 OutStreamer->emitCOFFSecNumber(Section->getBeginSymbol());
1060 for (
auto &[CallsiteSymbol, Kind] : CallsToImportedFuncs) {
1068 // In Windows' libcmt.lib, there is a file which is linked in only if the
1069 // symbol _fltused is referenced. Linking this in causes some
1072 // 1. For x86-32, it will set the x87 rounding mode to 53-bit instead of
1073 // 64-bit mantissas at program start.
1075 // 2. It links in support routines for floating-point in scanf and printf.
1077 // MSVC emits an undefined reference to _fltused when there are any
1078 // floating point operations in the program (including calls). A program
1079 // that only has: `scanf("%f", &global_float);` may fail to trigger this,
1080 // but oh well...that's a documented issue.
1082 (TT.getArch() ==
Triple::x86) ?
"__fltused" :
"_fltused";
1083 MCSymbol *S =
MMI->getContext().getOrCreateSymbol(SymbolName);
1087 }
else if (TT.isOSBinFormatELF()) {
1088 FM.serializeToFaultMapSection();
1091 // Emit __morestack address if needed for indirect calls.
1097 /*C=*/nullptr, Alignment);
1101 unsigned PtrSize =
MAI->getCodePointerSize();
1113//===----------------------------------------------------------------------===//
1114// Target Registry Stuff
1115//===----------------------------------------------------------------------===//
1117// Force static initialization.
1118extern
"C" LLVM_C_ABI void LLVMInitializeX86AsmPrinter() {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static MCDisassembler::DecodeStatus addOperand(MCInst &Inst, const MCOperand &Opnd)
static void emitNonLazySymbolPointer(MCStreamer &OutStreamer, MCSymbol *StubLabel, MachineModuleInfoImpl::StubValueTy &MCSym)
Expand Atomic instructions
Module.h This file contains the declarations for the Module class.
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Promote Memory to Register
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
#define LLVM_C_ABI
LLVM_C_ABI is the export/visibility macro used to mark symbols declared in llvm-c as exported when bu...
static bool printAsmMRegister(const X86AsmPrinter &P, const MachineOperand &MO, char Mode, raw_ostream &O)
static bool isSimpleReturn(const MachineInstr &MI)
static bool usesMSVCFloatingPoint(const Triple &TT, const Module &M)
True if this module is being built for windows/msvc, and uses floating point.
static bool isIndirectBranchOrTailCall(const MachineInstr &MI)
static bool printAsmVRegister(const MachineOperand &MO, char Mode, raw_ostream &O)
static void emitNonLazyStubs(MachineModuleInfo *MMI, MCStreamer &OutStreamer)
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
MCSymbol * getSymbol(const GlobalValue *GV) const
void emitNops(unsigned N)
Emit N NOP instructions.
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
TargetMachine & TM
Target machine description.
void emitXRayTable()
Emit a table with all XRay instrumentation points.
virtual void emitBasicBlockEnd(const MachineBasicBlock &MBB)
Targets can override this to emit stuff at the end of a basic block.
virtual MCSymbol * GetCPISymbol(unsigned CPID) const
Return the symbol for the specified constant pool entry.
const MCAsmInfo * MAI
Target Asm Printer information.
MachineFunction * MF
The current machine function.
virtual const MCExpr * lowerConstant(const Constant *CV, const Constant *BaseCV=nullptr, uint64_t Offset=0)
Lower the specified LLVM Constant to an MCExpr.
virtual void SetupMachineFunction(MachineFunction &MF)
This should be called when a new MachineFunction is being processed from runOnMachineFunction.
void emitFunctionBody()
This method emits the body and trailer for a function.
virtual void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const
This emits linkage information about GVSym based on GV, if this is supported by the target.
AsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer, char &ID=AsmPrinter::ID)
void printOffset(int64_t Offset, raw_ostream &OS) const
This is just convenient handler for printing offsets.
MCSymbol * getSymbolPreferLocal(const GlobalValue &GV) const
Similar to getSymbol() but preferred for references.
MCSymbol * CurrentFnSym
The symbol for the current function.
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
void emitAlignment(Align Alignment, const GlobalObject *GV=nullptr, unsigned MaxBytesToEmit=0) const
Emit an alignment directive to the specified power of two boundary.
MCContext & OutContext
This is the context for the output file that we are streaming.
const StaticDataProfileInfo * SDPI
Provides the profile information for constants.
virtual const MCSubtargetInfo * getIFuncMCSubtargetInfo() const
getSubtargetInfo() cannot be used where this is needed because we don't have a MachineFunction when w...
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
const ProfileSummaryInfo * PSI
The profile summary information.
MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const
Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.
const DataLayout & getDataLayout() const
Return information about data layout.
void emitCOFFFeatureSymbol(Module &M)
Emits the @feat.00 symbol indicating the features enabled in this module.
MCSymbol * GetExternalSymbolSymbol(const Twine &Sym) const
Return the MCSymbol for the specified ExternalSymbol.
const MCSubtargetInfo & getSubtargetInfo() const
Return information about subtarget.
void emitCOFFReplaceableFunctionData(Module &M)
Emits symbols and data to allow functions marked with the loader-replaceable attribute to be replacea...
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS)
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.
This is the shared class of boolean and integer constants.
const Constant * getResolver() const
bool hasInternalLinkage() const
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
LLVM_ABI MCSectionMachO * getMachOSection(StringRef Segment, StringRef Section, unsigned TypeAndAttributes, unsigned Reserved2, SectionKind K, const char *BeginSymName=nullptr)
Return the MCSection for the specified mach-o section.
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Base class for the full range of assembler expressions which are needed for parsing.
Instances of this class represent a single low-level machine instruction.
void setOpcode(unsigned Op)
static MCOperand createExpr(const MCExpr *Val)
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Streaming machine code generation interface.
virtual void addBlankLine()
Emit a blank line to a .s file to pretty it up.
virtual bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
MCContext & getContext() const
void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
virtual void emitIntValue(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers.
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
Generic base class for all target subtargets.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
LLVM_ABI void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
StringRef getName() const
getName - Get the symbol name.
Representation of each machine instruction.
LLVM_ABI InlineAsm::AsmDialect getInlineAsmDialect() const
std::vector< std::pair< MCSymbol *, StubValueTy > > SymbolListTy
PointerIntPair< MCSymbol *, 1, bool > StubValueTy
MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation for MachO targets.
SymbolListTy GetGVStubList()
Accessor methods to return the set of stubs in sorted order.
This class contains meta information specific to a module.
const MCContext & getContext() const
Ty & getObjFileInfo()
Keep track of various per-module pieces of information for backends that would like to do so.
MachineOperand class - Representation of each machine instruction operand.
const GlobalValue * getGlobal() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool isSymbol() const
isSymbol - Tests if this is a MO_ExternalSymbol operand.
const BlockAddress * getBlockAddress() const
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
unsigned getTargetFlags() const
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
Register getReg() const
getReg - Returns the register number.
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_GlobalAddress
Address of a global value.
@ MO_BlockAddress
Address of a basic block.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
int64_t getOffset() const
Return the offset from the symbol in this operand.
A Module instance is used to store all the information related to an LLVM module.
AnalysisType * getAnalysisIfAvailable() const
getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information tha...
PointerTy getPointer() const
Wrapper class representing virtual and physical registers.
static SectionKind getMetadata()
static SectionKind getReadOnly()
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
virtual MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const
Given a constant with the SectionKind, return a section that it should be placed in.
Primary interface to the complete machine description for the target machine.
Triple - Helper class for working with autoconf configuration names.
bool isX86_64() const
Tests whether the target is x86 (64-bit).
bool isOSWindows() const
Tests whether the OS is Windows.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
static const char * getRegisterName(MCRegister Reg)
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - Emit the function body.
void emitKCFITypeId(const MachineFunction &MF) override
emitKCFITypeId - Emit the KCFI type information in architecture specific format.
void emitStartOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the start of their fi...
void emitEndOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the end of their file...
void emitFunctionBodyEnd() override
Targets can override this to emit stuff after the last basic block in the function.
bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &O) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant as...
void emitBasicBlockEnd(const MachineBasicBlock &MBB) override
Targets can override this to emit stuff at the end of a basic block.
X86AsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer)
bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &O) override
PrintAsmOperand - Print out an operand for an inline asm expression.
void emitFunctionBodyStart() override
Targets can override this to emit stuff before the first basic block in the function.
X86MachineFunctionInfo - This class is derived from MachineFunction and contains private X86 target-s...
unsigned getArgumentStackSize() const
X86 target streamer implementing x86-only assembly directives.
virtual bool emitFPOProc(const MCSymbol *ProcSym, unsigned ParamsSize, SMLoc L={})
virtual void emitCode16()
virtual bool emitFPOEndProc(SMLoc L={})
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ IMAGE_SYM_CLASS_EXTERNAL
External symbol.
@ IMAGE_SYM_CLASS_STATIC
Static.
@ IMAGE_SYM_DTYPE_FUNCTION
A function that returns a base type.
@ SCT_COMPLEX_TYPE_SHIFT
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
@ GNU_PROPERTY_X86_FEATURE_1_AND
@ GNU_PROPERTY_X86_FEATURE_1_SHSTK
@ GNU_PROPERTY_X86_FEATURE_1_IBT
@ S_NON_LAZY_SYMBOL_POINTERS
S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers.
@ MO_TLSLD
MO_TLSLD - On a symbol operand this indicates that the immediate is the offset of the GOT entry with ...
@ MO_GOTPCREL_NORELAX
MO_GOTPCREL_NORELAX - Same as MO_GOTPCREL except that R_X86_64_GOTPCREL relocations are guaranteed to...
@ MO_GOTOFF
MO_GOTOFF - On a symbol operand this indicates that the immediate is the offset to the location of th...
@ MO_DARWIN_NONLAZY_PIC_BASE
MO_DARWIN_NONLAZY_PIC_BASE - On a symbol operand "FOO", this indicates that the reference is actually...
@ MO_GOT_ABSOLUTE_ADDRESS
MO_GOT_ABSOLUTE_ADDRESS - On a symbol operand, this represents a relocation of: SYMBOL_LABEL + [.
@ MO_COFFSTUB
MO_COFFSTUB - On a symbol operand "FOO", this indicates that the reference is actually to the "....
@ MO_NTPOFF
MO_NTPOFF - On a symbol operand this indicates that the immediate is the negative thread-pointer offs...
@ MO_DARWIN_NONLAZY
MO_DARWIN_NONLAZY - On a symbol operand "FOO", this indicates that the reference is actually to the "...
@ MO_INDNTPOFF
MO_INDNTPOFF - On a symbol operand this indicates that the immediate is the absolute address of the G...
@ MO_GOTNTPOFF
MO_GOTNTPOFF - On a symbol operand this indicates that the immediate is the offset of the GOT entry w...
@ MO_TPOFF
MO_TPOFF - On a symbol operand this indicates that the immediate is the thread-pointer offset for the...
@ MO_TLVP_PIC_BASE
MO_TLVP_PIC_BASE - On a symbol operand this indicates that the immediate is some TLS offset from the ...
@ MO_GOT
MO_GOT - On a symbol operand this indicates that the immediate is the offset to the GOT entry for the...
@ MO_PLT
MO_PLT - On a symbol operand this indicates that the immediate is offset to the PLT entry of symbol n...
@ MO_TLSGD
MO_TLSGD - On a symbol operand this indicates that the immediate is the offset of the GOT entry with ...
@ MO_NO_FLAG
MO_NO_FLAG - No flag for the operand.
@ MO_TLVP
MO_TLVP - On a symbol operand this indicates that the immediate is some TLS offset.
@ MO_DLLIMPORT
MO_DLLIMPORT - On a symbol operand "FOO", this indicates that the reference is actually to the "__imp...
@ MO_GOTTPOFF
MO_GOTTPOFF - On a symbol operand this indicates that the immediate is the offset of the GOT entry wi...
@ MO_SECREL
MO_SECREL - On a symbol operand this indicates that the immediate is the offset from beginning of sec...
@ MO_DTPOFF
MO_DTPOFF - On a symbol operand this indicates that the immediate is the offset of the GOT entry with...
@ MO_PIC_BASE_OFFSET
MO_PIC_BASE_OFFSET - On a symbol operand this indicates that the immediate should get the value of th...
@ MO_TLSLDM
MO_TLSLDM - On a symbol operand this indicates that the immediate is the offset of the GOT entry with...
@ MO_GOTPCREL
MO_GOTPCREL - On a symbol operand this indicates that the immediate is offset to the GOT entry for th...
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
BaseReg
Stack frame base register. Bit 0 of FREInfo.Info.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
static bool isMem(const MachineInstr &MI, unsigned Op)
MCRegister getX86SubSuperRegister(MCRegister Reg, unsigned Size, bool High=false)
Target & getTheX86_32Target()
uint64_t offsetToAlignment(uint64_t Value, Align Alignment)
Returns the offset to the next integer (mod 2**64) that is greater than or equal to Value and is a mu...
DWARFExpression::Operation Op
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Target & getTheX86_64Target()
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)
@ MCSA_Global
.type _foo, @gnu_unique_object
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
RegisterAsmPrinter - Helper template for registering a target specific assembly printer,...