diff options
Diffstat (limited to 'llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h')
| -rw-r--r-- | llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h | 43 | 
1 files changed, 26 insertions, 17 deletions
| diff --git a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h index e0eecb037c3..dfeff13863b 100644 --- a/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h +++ b/llvm/tools/llvm-cfi-verify/lib/FileAnalysis.h @@ -44,8 +44,29 @@  namespace llvm {  namespace cfi_verify { +struct GraphResult; +  extern bool IgnoreDWARFFlag; +enum class CFIProtectionStatus { +  // This instruction is protected by CFI. +  PROTECTED, +  // The instruction is not an indirect control flow instruction, and thus +  // shouldn't be protected. +  FAIL_NOT_INDIRECT_CF, +  // There is a path to the instruction that was unexpected. +  FAIL_ORPHANS, +  // There is a path to the instruction from a conditional branch that does not +  // properly check the destination for this vcall/icall. +  FAIL_BAD_CONDITIONAL_BRANCH, +  // The instruction referenced does not exist. This normally indicates an +  // error in the program, where you try and validate a graph that was created +  // in a different FileAnalysis object. +  FAIL_INVALID_INSTRUCTION, +}; + +StringRef stringCFIProtectionStatus(CFIProtectionStatus Status); +  // Disassembler and analysis tool for machine code files. Keeps track of non-  // sequential control flows, including indirect control flow instructions.  class FileAnalysis { @@ -69,12 +90,6 @@ public:    FileAnalysis(const FileAnalysis &) = delete;    FileAnalysis(FileAnalysis &&Other) = default; -  // Check whether the provided instruction is CFI protected in this file. -  // Returns false if this instruction doesn't exist in this file, if it's not -  // an indirect control flow instruction, or isn't CFI protected. Returns true -  // otherwise. -  bool isIndirectInstructionCFIProtected(uint64_t Address) const; -    // Returns the instruction at the provided address. Returns nullptr if there    // is no instruction at the provided address.    const Instr *getInstruction(uint64_t Address) const; @@ -122,19 +137,13 @@ public:    const MCRegisterInfo *getRegisterInfo() const;    const MCInstrInfo *getMCInstrInfo() const;    const MCInstrAnalysis *getMCInstrAnalysis() const; -  symbolize::LLVMSymbolizer &getSymbolizer(); - -  // Returns true if this class is using DWARF line tables for elimination. -  bool hasLineTableInfo() const; -  // Returns the line table information for the range {Address +- -  // DWARFSearchRange}. Returns an empty table if the address has no valid line -  // table information, or this analysis object has DWARF handling disabled. -  DILineInfoTable getLineInfoForAddressRange(uint64_t Address); +  // Returns the inlining information for the provided address. +  Expected<DIInliningInfo> symbolizeInlinedCode(uint64_t Address); -  // Returns whether the provided address has valid line information for -  // instructions in the range of Address +- DWARFSearchRange. -  bool hasValidLineInfoForAddressRange(uint64_t Address); +  // Returns whether the provided Graph represents a protected indirect control +  // flow instruction in this file. +  CFIProtectionStatus validateCFIProtection(const GraphResult &Graph) const;  protected:    // Construct a blank object with the provided triple and features. Used in | 

