[Orc] Add support for RuntimeDyld::setProcessAllSections.
[oota-llvm.git] / include / llvm / ExecutionEngine / RuntimeDyldChecker.h
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
15 namespace llvm {
16
17 class MCDisassembler;
18 class MemoryBuffer;
19 class MCInstPrinter;
20 class RuntimeDyld;
21 class RuntimeDyldCheckerImpl;
22 class 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 ///
65 class RuntimeDyldChecker {
66 public:
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
96 private:
97   std::unique_ptr<RuntimeDyldCheckerImpl> Impl;
98 };
99
100 } // end namespace llvm
101
102 #endif