//===---- RuntimeDyldChecker.h - RuntimeDyld tester framework -----*- C++ -*-=// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_EXECUTIONENGINE_RUNTIMEDYLDCHECKER_H #define LLVM_EXECUTIONENGINE_RUNTIMEDYLDCHECKER_H #include "llvm/ExecutionEngine/JITSymbol.h" #include "llvm/Support/Endian.h" #include "llvm/TargetParser/SubtargetFeature.h" #include "llvm/TargetParser/Triple.h" #include <optional> #include <cstdint> #include <memory> #include <string> #include <utility> namespace llvm { class StringRef; class MCDisassembler; class MemoryBuffer; class MCInstPrinter; class RuntimeDyld; class RuntimeDyldCheckerImpl; class raw_ostream; /// Holds target-specific properties for a symbol. TargetFlagsType; /// RuntimeDyld invariant checker for verifying that RuntimeDyld has /// correctly applied relocations. /// /// The RuntimeDyldChecker class evaluates expressions against an attached /// RuntimeDyld instance to verify that relocations have been applied /// correctly. /// /// The expression language supports basic pointer arithmetic and bit-masking, /// and has limited disassembler integration for accessing instruction /// operands and the next PC (program counter) address for each instruction. /// /// The language syntax is: /// /// check = expr '=' expr /// /// expr = binary_expr /// | sliceable_expr /// /// sliceable_expr = '*{' number '}' load_addr_expr [slice] /// | '(' expr ')' [slice] /// | ident_expr [slice] /// | number [slice] /// /// slice = '[' high-bit-index ':' low-bit-index ']' /// /// load_addr_expr = symbol /// | '(' symbol '+' number ')' /// | '(' symbol '-' number ')' /// /// ident_expr = 'decode_operand' '(' symbol ',' operand-index ')' /// | 'next_pc' '(' symbol ')' /// | 'stub_addr' '(' stub-container-name ',' symbol ')' /// | 'got_addr' '(' stub-container-name ',' symbol ')' /// | 'section_addr' '(' stub-container-name ',' symbol ')' /// | symbol /// /// binary_expr = expr '+' expr /// | expr '-' expr /// | expr '&' expr /// | expr '|' expr /// | expr '<<' expr /// | expr '>>' expr /// class RuntimeDyldChecker { … }; } // end namespace llvm #endif