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...