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