RuntimeDyldChecker.h revision 288943
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