30#define DEBUG_TYPE "x86-indirect-branch-tracking"
34 cl::desc(
"Enable X86 indirect branch tracking pass."));
36STATISTIC(NumEndBranchAdded,
"Number of ENDBR instructions added");
43 StringRef getPassName()
const override {
44 return "X86 Indirect Branch Tracking";
47 bool runOnMachineFunction(MachineFunction &MF)
override;
53 const X86InstrInfo *TII =
nullptr;
56 unsigned int EndbrOpcode = 0;
67char X86IndirectBranchTrackingPass::ID = 0;
70 return new X86IndirectBranchTrackingPass();
73bool X86IndirectBranchTrackingPass::addENDBR(
75 assert(
TII &&
"Target instruction info was not initialized");
76 assert((X86::ENDBR64 == EndbrOpcode || X86::ENDBR32 == EndbrOpcode) &&
77 "Unexpected Endbr opcode");
81 if (
I ==
MBB.end() ||
I->getOpcode() != EndbrOpcode) {
95 AttributeList Attrs = CalleeFn->getAttributes();
96 return Attrs.hasFnAttr(Attribute::ReturnsTwice);
103 if (
F.doesNoCfCheck())
112 return (
F.hasAddressTaken() || !
F.hasLocalLinkage());
116bool X86IndirectBranchTrackingPass::runOnMachineFunction(MachineFunction &MF) {
117 const X86Subtarget &SubTarget = MF.
getSubtarget<X86Subtarget>();
121 Metadata *isCFProtectionSupported =
M->getModuleFlag(
"cf-protection-branch");
125 const X86TargetMachine *
TM =
126 static_cast<const X86TargetMachine *
>(&MF.
getTarget());
128 bool isJITwithCET =
TM->isJIT();
130 bool isJITwithCET =
false;
139 EndbrOpcode = SubTarget.is64Bit() ? X86::ENDBR64 : X86::ENDBR32;
147 for (
auto &
MBB : MF) {
154 if (
I->isCall() &&
I->getNumOperands() > 0 &&
163 if (
TM->Options.ExceptionModel == ExceptionHandling::SjLj) {
167 if (
I->isDebugInstr())
171 }
else if (
I->isEHLabel()) {
174 MCSymbol *Sym =
I->getOperand(0).getMCSymbol();
175 if (!MF.hasCallSiteLandingPad(Sym))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
const HexagonInstrInfo * TII
Module.h This file contains the declarations for the Module class.
Machine Check Debug Module
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static bool needsPrologueENDBR(MachineFunction &MF, const Module *M)
static bool IsCallReturnTwice(llvm::MachineOperand &MOp)
cl::opt< bool > IndirectBranchTracking("x86-indirect-branch-tracking", cl::init(false), cl::Hidden, cl::desc("Enable X86 indirect branch tracking pass."))
FunctionPass class - This class is used to implement most global optimizations.
Module * getParent()
Get the module that this global value is contained inside of...
bool isEHPad() const
Returns true if the block is a landing pad.
bool isIRBlockAddressTaken() const
Test whether this block is the target of an IR BlockAddress.
bool isMachineBlockAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
MachineOperand class - Representation of each machine instruction operand.
const GlobalValue * getGlobal() const
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
A Module instance is used to store all the information related to an LLVM module.
CodeModel::Model getCodeModel() const
Returns the code model.
const X86InstrInfo * getInstrInfo() const override
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
FunctionPass * createX86IndirectBranchTrackingPass()
This pass inserts ENDBR instructions before indirect jump/call destinations as part of CET IBT mechan...