1//===---- RuntimeDyldChecker.h - RuntimeDyld tester framework -----*- C++ -*-=// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef LLVM_EXECUTIONENGINE_RUNTIMEDYLDCHECKER_H 11#define LLVM_EXECUTIONENGINE_RUNTIMEDYLDCHECKER_H 12 13#include "llvm/ADT/StringRef.h" 14 15namespace llvm { 16 17class MCDisassembler; 18class MemoryBuffer; 19class MCInstPrinter; 20class RuntimeDyld; 21class RuntimeDyldCheckerImpl; 22class raw_ostream; 23 24/// \brief RuntimeDyld invariant checker for verifying that RuntimeDyld has 25/// correctly applied relocations. 26/// 27/// The RuntimeDyldChecker class evaluates expressions against an attached 28/// RuntimeDyld instance to verify that relocations have been applied 29/// correctly. 30/// 31/// The expression language supports basic pointer arithmetic and bit-masking, 32/// and has limited disassembler integration for accessing instruction 33/// operands and the next PC (program counter) address for each instruction. 34/// 35/// The language syntax is: 36/// 37/// check = expr '=' expr 38/// 39/// expr = binary_expr 40/// | sliceable_expr 41/// 42/// sliceable_expr = '*{' number '}' load_addr_expr [slice] 43/// | '(' expr ')' [slice] 44/// | ident_expr [slice] 45/// | number [slice] 46/// 47/// slice = '[' high-bit-index ':' low-bit-index ']' 48/// 49/// load_addr_expr = symbol 50/// | '(' symbol '+' number ')' 51/// | '(' symbol '-' number ')' 52/// 53/// ident_expr = 'decode_operand' '(' symbol ',' operand-index ')' 54/// | 'next_pc' '(' symbol ')' 55/// | 'stub_addr' '(' file-name ',' section-name ',' symbol ')' 56/// | symbol 57/// 58/// binary_expr = expr '+' expr 59/// | expr '-' expr 60/// | expr '&' expr 61/// | expr '|' expr 62/// | expr '<<' expr 63/// | expr '>>' expr 64/// 65class RuntimeDyldChecker { 66public: 67 RuntimeDyldChecker(RuntimeDyld &RTDyld, MCDisassembler *Disassembler, 68 MCInstPrinter *InstPrinter, raw_ostream &ErrStream); 69 ~RuntimeDyldChecker(); 70 71 // \brief Get the associated RTDyld instance. 72 RuntimeDyld& getRTDyld(); 73 74 // \brief Get the associated RTDyld instance. 75 const RuntimeDyld& getRTDyld() const; 76 77 /// \brief Check a single expression against the attached RuntimeDyld 78 /// instance. 79 bool check(StringRef CheckExpr) const; 80 81 /// \brief Scan the given memory buffer for lines beginning with the string 82 /// in RulePrefix. The remainder of the line is passed to the check 83 /// method to be evaluated as an expression. 84 bool checkAllRulesInBuffer(StringRef RulePrefix, MemoryBuffer *MemBuf) const; 85 86 /// \brief Returns the address of the requested section (or an error message 87 /// in the second element of the pair if the address cannot be found). 88 /// 89 /// if 'LocalAddress' is true, this returns the address of the section 90 /// within the linker's memory. If 'LocalAddress' is false it returns the 91 /// address within the target process (i.e. the load address). 92 std::pair<uint64_t, std::string> getSectionAddr(StringRef FileName, 93 StringRef SectionName, 94 bool LocalAddress); 95 96private: 97 std::unique_ptr<RuntimeDyldCheckerImpl> Impl; 98}; 99 100} // end namespace llvm 101 102#endif 103