51 std::unique_ptr<MCStreamer> Streamer)
63 SMShadowTracker.startFunction(
MF);
136 int64_t PrefixBytes = 0;
155 if (!
F.getParent()->getModuleFlag(
"kcfi"))
159 if (
const MDNode *MD =
F.getMetadata(LLVMContext::MD_kcfi_type))
160 Type = mdconst::extract<ConstantInt>(MD->getOperand(0));
165 EmitKCFITypePadding(
MF,
false);
181 EmitKCFITypePadding(
MF);
184 .addImm(MaskKCFIType(
Type->getZExtValue())));
237 if (GVSym->
getName()[0] !=
'$')
292void X86AsmPrinter::PrintOperand(
const MachineInstr *
MI,
unsigned OpNo,
313 switch (
MI->getInlineAsmDialect()) {
321 PrintSymbolOperand(MO, O);
335void X86AsmPrinter::PrintModifiedOperand(
const MachineInstr *
MI,
unsigned OpNo,
338 if (!Modifier || !MO.
isReg())
339 return PrintOperand(
MI, OpNo, O);
343 if (strncmp(Modifier,
"subreg", strlen(
"subreg")) == 0) {
344 unsigned Size = (strcmp(Modifier+6,
"64") == 0) ? 64 :
345 (strcmp(Modifier+6,
"32") == 0) ? 32 :
346 (strcmp(Modifier+6,
"16") == 0) ? 16 : 8;
355void X86AsmPrinter::PrintPCRelImm(
const MachineInstr *
MI,
unsigned OpNo,
362 PrintOperand(
MI, OpNo, O);
368 PrintSymbolOperand(MO, O);
373void X86AsmPrinter::PrintLeaMemReference(
const MachineInstr *
MI,
unsigned OpNo,
380 bool HasBaseReg = BaseReg.
getReg() != 0;
381 if (HasBaseReg && Modifier && !strcmp(Modifier,
"no-rip") &&
382 BaseReg.
getReg() == X86::RIP)
386 bool HasParenPart = IndexReg.
getReg() || HasBaseReg;
392 int DispVal = DispSpec.
getImm();
393 if (DispVal || !HasParenPart)
399 PrintSymbolOperand(DispSpec, O);
403 if (Modifier && strcmp(Modifier,
"H") == 0)
408 "X86 doesn't allow scaling by ESP");
419 O <<
',' << ScaleVal;
427 return MI.getDesc().isReturn() && !
MI.getDesc().isCall();
431 unsigned Opc =
MI.getOpcode();
432 return MI.getDesc().isIndirectBranch() ||
433 Opc == X86::TAILJMPr || Opc == X86::TAILJMPm ||
434 Opc == X86::TAILJMPr64 || Opc == X86::TAILJMPm64 ||
435 Opc == X86::TCRETURNri || Opc == X86::TCRETURNmi ||
436 Opc == X86::TCRETURNri64 || Opc == X86::TCRETURNmi64 ||
437 Opc == X86::TAILJMPr64_REX || Opc == X86::TAILJMPm64_REX;
441 if (Subtarget->hardenSlsRet() || Subtarget->hardenSlsIJmp()) {
456void X86AsmPrinter::PrintMemReference(
const MachineInstr *
MI,
unsigned OpNo,
464 PrintLeaMemReference(
MI, OpNo, O, Modifier);
470 const char *Modifier) {
478 bool HasBaseReg = BaseReg.
getReg() != 0;
479 if (HasBaseReg && Modifier && !strcmp(Modifier,
"no-rip") &&
480 BaseReg.
getReg() == X86::RIP)
485 !strcmp(Modifier,
"disp-only")) {
497 bool NeedPlus =
false;
504 if (NeedPlus)
O <<
" + ";
506 O << ScaleVal <<
'*';
511 if (!DispSpec.
isImm()) {
512 if (NeedPlus)
O <<
" + ";
515 PrintSymbolOperand(DispSpec, O);
517 int64_t DispVal = DispSpec.
getImm();
518 if (DispVal || (!IndexReg.
getReg() && !HasBaseReg)) {
538 if (!X86::GR8RegClass.
contains(Reg) &&
545 default:
return true;
583 if (X86::VR128XRegClass.
contains(Reg))
584 Index = Reg - X86::XMM0;
585 else if (X86::VR256XRegClass.
contains(Reg))
586 Index = Reg - X86::YMM0;
587 else if (X86::VR512RegClass.
contains(Reg))
588 Index = Reg - X86::ZMM0;
596 Reg = X86::XMM0 +
Index;
599 Reg = X86::YMM0 +
Index;
602 Reg = X86::ZMM0 +
Index;
618 if (ExtraCode && ExtraCode[0]) {
619 if (ExtraCode[1] != 0)
return true;
623 switch (ExtraCode[0]) {
639 PrintSymbolOperand(MO, O);
645 PrintOperand(
MI, OpNo, O);
653 PrintOperand(
MI, OpNo, O);
663 PrintSymbolOperand(MO, O);
671 PrintOperand(
MI, OpNo, O);
684 PrintOperand(
MI, OpNo, O);
692 PrintOperand(
MI, OpNo, O);
696 PrintPCRelImm(
MI, OpNo, O);
710 PrintOperand(
MI, OpNo, O);
715 const char *ExtraCode,
717 if (ExtraCode && ExtraCode[0]) {
718 if (ExtraCode[1] != 0)
return true;
720 switch (ExtraCode[0]) {
721 default:
return true;
733 PrintMemReference(
MI, OpNo, O,
"H");
741 PrintIntelMemReference(
MI, OpNo, O,
"disp-only");
743 PrintMemReference(
MI, OpNo, O,
"disp-only");
749 PrintIntelMemReference(
MI, OpNo, O,
nullptr);
751 PrintMemReference(
MI, OpNo, O,
nullptr);
759 if (TT.isOSBinFormatELF()) {
761 unsigned FeatureFlagsAnd = 0;
762 if (M.getModuleFlag(
"cf-protection-branch"))
764 if (M.getModuleFlag(
"cf-protection-return"))
767 if (FeatureFlagsAnd) {
769 assert((TT.isArch32Bit() || TT.isArch64Bit()) &&
770 "CFProtection used on invalid architecture!");
777 const int WordSize = TT.isArch64Bit() && !TT.isX32() ? 8 : 4;
795 if (TT.isOSBinFormatMachO())
798 if (TT.isOSBinFormatCOFF()) {
805 int64_t Feat00Value = 0;
816 if (M.getModuleFlag(
"cfguard")) {
821 if (M.getModuleFlag(
"ehcontguard")) {
826 if (M.getModuleFlag(
"ms-kernel")) {
840 if (M.getModuleInlineAsm().empty() && is16)
877 if (!Stubs.empty()) {
882 for (
auto &Stub : Stubs)
893 if (TT.isOSBinFormatMachO()) {
907 }
else if (TT.isOSBinFormatCOFF()) {
923 (TT.getArch() ==
Triple::x86) ?
"__fltused" :
"_fltused";
928 }
else if (TT.isOSBinFormatELF()) {
static void emitNonLazySymbolPointer(MCStreamer &OutStreamer, MCSymbol *StubLabel, MachineModuleInfoImpl::StubValueTy &MCSym)
#define LLVM_EXTERNAL_VISIBILITY
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Module.h This file contains the declarations for the Module class.
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
const char LLVMTargetMachineRef TM
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86AsmPrinter()
static bool printAsmMRegister(const X86AsmPrinter &P, const MachineOperand &MO, char Mode, raw_ostream &O)
static bool isSimpleReturn(const MachineInstr &MI)
static bool isIndirectBranchOrTailCall(const MachineInstr &MI)
static bool printAsmVRegister(const MachineOperand &MO, char Mode, raw_ostream &O)
static void emitNonLazyStubs(MachineModuleInfo *MMI, MCStreamer &OutStreamer)
This class is intended to be used as a driving class for all asm writers.
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 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.
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.
MCSymbol * GetExternalSymbolSymbol(StringRef Sym) const
Return the MCSymbol for the specified ExternalSymbol.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
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.
const MCSubtargetInfo & getSubtargetInfo() const
Return information about subtarget.
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.
StringRef getValueAsString() const
Return the attribute's value as a string.
This is the shared class of boolean and integer constants.
void serializeToFaultMapSection()
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
bool hasLocalLinkage() const
bool hasInternalLinkage() const
bool hasDotTypeDotSizeDirective() const
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
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.
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
MCSymbol * lookupSymbol(const Twine &Name) const
Get the symbol for Name, or null.
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)
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, const MCExpr *Subsection=nullptr)
Set the current section where code is being emitted to Section.
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 ...
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.
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
MCSymbol * getPICBaseSymbol() const
getPICBaseSymbol - Return a function-local symbol to represent the PIC base.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MCContext & getContext() const
Align getAlignment() const
getAlignment - Return the alignment of the function.
Function & getFunction()
Return the LLVM function that this machine code represents.
MachineModuleInfo & getMMI() const
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Representation of each machine instruction.
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
const Module * getModule() const
Ty & getObjFileInfo()
Keep track of various per-module pieces of information for backends that would like to do so.
bool usesMSVCFloatingPoint() const
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.
unsigned getCodeViewFlag() const
Returns the CodeView Version by checking module flags.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
PointerIntPair - This class implements a pair of a pointer and small integer.
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.
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
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.
const Triple & getTargetTriple() const
const Target & getTarget() const
CodeModel::Model getCodeModel() const
Returns the code model.
MCCodeEmitter * createMCCodeEmitter(const MCInstrInfo &II, MCContext &Ctx) const
createMCCodeEmitter - Create a target specific code emitter.
Triple - Helper class for working with autoconf configuration names.
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
const X86InstrInfo * getInstrInfo() const override
bool isTargetCOFF() const
bool isPICStyleRIPRel() const
bool isTargetWin32() const
X86 target streamer implementing x86-only assembly directives.
virtual bool emitFPOProc(const MCSymbol *ProcSym, unsigned ParamsSize, SMLoc L={})
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_NULL
No complex type; simple scalar variable.
@ 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_SHSTK
@ GNU_PROPERTY_X86_FEATURE_1_IBT
@ GNU_PROPERTY_X86_FEATURE_1_AND
@ S_NON_LAZY_SYMBOL_POINTERS
S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers.
Reg
All possible values of the reg field in the ModR/M byte.
@ 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...
This is an optimization pass for GlobalISel generic memory operations.
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...
@ MCAF_Code16
.code16 (X86) / .code 16 (ARM)
@ MCAF_SubsectionsViaSymbols
.subsections_via_symbols (MachO)
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,...