ClangExpressionParser.h revision 296417
1238106Sdes//===-- ClangExpressionParser.h ---------------------------------*- C++ -*-===// 2238106Sdes// 3238106Sdes// The LLVM Compiler Infrastructure 4238106Sdes// 5238106Sdes// This file is distributed under the University of Illinois Open Source 6238106Sdes// License. See LICENSE.TXT for details. 7238106Sdes// 8238106Sdes//===----------------------------------------------------------------------===// 9238106Sdes 10238106Sdes#ifndef liblldb_ClangExpressionParser_h_ 11238106Sdes#define liblldb_ClangExpressionParser_h_ 12238106Sdes 13238106Sdes#include "lldb/lldb-public.h" 14238106Sdes#include "lldb/Core/ArchSpec.h" 15238106Sdes#include "lldb/Core/ClangForward.h" 16238106Sdes#include "lldb/Core/Error.h" 17238106Sdes#include "lldb/Expression/ExpressionParser.h" 18238106Sdes 19238106Sdes#include <string> 20238106Sdes#include <vector> 21238106Sdes 22238106Sdesnamespace lldb_private 23238106Sdes{ 24269257Sdes 25269257Sdesclass IRExecutionUnit; 26269257Sdes 27269257Sdes//---------------------------------------------------------------------- 28269257Sdes/// @class ClangExpressionParser ClangExpressionParser.h "lldb/Expression/ClangExpressionParser.h" 29269257Sdes/// @brief Encapsulates an instance of Clang that can parse expressions. 30269257Sdes/// 31269257Sdes/// ClangExpressionParser is responsible for preparing an instance of 32269257Sdes/// ClangExpression for execution. ClangExpressionParser uses ClangExpression 33269257Sdes/// as a glorified parameter list, performing the required parsing and 34238106Sdes/// conversion to formats (DWARF bytecode, or JIT compiled machine code) 35238106Sdes/// that can be executed. 36238106Sdes//---------------------------------------------------------------------- 37238106Sdesclass ClangExpressionParser : public ExpressionParser 38238106Sdes{ 39238106Sdespublic: 40238106Sdes //------------------------------------------------------------------ 41238106Sdes /// Constructor 42238106Sdes /// 43238106Sdes /// Initializes class variables. 44238106Sdes /// 45238106Sdes /// @param[in] exe_scope, 46238106Sdes /// If non-NULL, an execution context scope that can help to 47238106Sdes /// correctly create an expression with a valid process for 48238106Sdes /// optional tuning Objective-C runtime support. Can be NULL. 49238106Sdes /// 50238106Sdes /// @param[in] expr 51238106Sdes /// The expression to be parsed. 52238106Sdes //------------------------------------------------------------------ 53238106Sdes ClangExpressionParser (ExecutionContextScope *exe_scope, 54238106Sdes Expression &expr, 55238106Sdes bool generate_debug_info); 56238106Sdes 57238106Sdes //------------------------------------------------------------------ 58238106Sdes /// Destructor 59238106Sdes //------------------------------------------------------------------ 60238106Sdes ~ClangExpressionParser () override; 61238106Sdes 62238106Sdes //------------------------------------------------------------------ 63269257Sdes /// Parse a single expression and convert it to IR using Clang. Don't 64238106Sdes /// wrap the expression in anything at all. 65238106Sdes /// 66238106Sdes /// @param[in] stream 67238106Sdes /// The stream to print errors to. 68238106Sdes /// 69238106Sdes /// @return 70238106Sdes /// The number of errors encountered during parsing. 0 means 71238106Sdes /// success. 72238106Sdes //------------------------------------------------------------------ 73238106Sdes unsigned 74238106Sdes Parse (Stream &stream) override; 75238106Sdes 76238106Sdes //------------------------------------------------------------------ 77238106Sdes /// Ready an already-parsed expression for execution, possibly 78238106Sdes /// evaluating it statically. 79238106Sdes /// 80238106Sdes /// @param[out] func_addr 81238106Sdes /// The address to which the function has been written. 82238106Sdes /// 83238106Sdes /// @param[out] func_end 84238106Sdes /// The end of the function's allocated memory region. (func_addr 85238106Sdes /// and func_end do not delimit an allocated region; the allocated 86238106Sdes /// region may begin before func_addr.) 87238106Sdes /// 88238106Sdes /// @param[in] execution_unit_sp 89238106Sdes /// After parsing, ownership of the execution unit for 90238106Sdes /// for the expression is handed to this shared pointer. 91238106Sdes /// 92238106Sdes /// @param[in] exe_ctx 93238106Sdes /// The execution context to write the function into. 94238106Sdes /// 95238106Sdes /// @param[out] evaluated_statically 96238106Sdes /// Set to true if the expression could be interpreted statically; 97238106Sdes /// untouched otherwise. 98238106Sdes /// 99238106Sdes /// @param[out] const_result 100238106Sdes /// If the result of the expression is constant, and the 101238106Sdes /// expression has no side effects, this is set to the result of the 102238106Sdes /// expression. 103238106Sdes /// 104238106Sdes /// @param[in] execution_policy 105238106Sdes /// Determines whether the expression must be JIT-compiled, must be 106238106Sdes /// evaluated statically, or whether this decision may be made 107238106Sdes /// opportunistically. 108238106Sdes /// 109238106Sdes /// @return 110238106Sdes /// An error code indicating the success or failure of the operation. 111238106Sdes /// Test with Success(). 112238106Sdes //------------------------------------------------------------------ 113238106Sdes Error 114238106Sdes PrepareForExecution (lldb::addr_t &func_addr, 115238106Sdes lldb::addr_t &func_end, 116238106Sdes lldb::IRExecutionUnitSP &execution_unit_sp, 117238106Sdes ExecutionContext &exe_ctx, 118238106Sdes bool &can_interpret, 119238106Sdes lldb_private::ExecutionPolicy execution_policy) override; 120238106Sdes 121238106Sdesprivate: 122238106Sdes std::unique_ptr<llvm::LLVMContext> m_llvm_context; ///< The LLVM context to generate IR into 123238106Sdes std::unique_ptr<clang::FileManager> m_file_manager; ///< The Clang file manager object used by the compiler 124238106Sdes std::unique_ptr<clang::CompilerInstance> m_compiler; ///< The Clang compiler used to parse expressions into IR 125238106Sdes std::unique_ptr<clang::Builtin::Context> m_builtin_context; ///< Context for Clang built-ins 126238106Sdes std::unique_ptr<clang::SelectorTable> m_selector_table; ///< Selector table for Objective-C methods 127238106Sdes std::unique_ptr<clang::CodeGenerator> m_code_generator; ///< The Clang object that generates IR 128238106Sdes 129238106Sdes class LLDBPreprocessorCallbacks; 130238106Sdes LLDBPreprocessorCallbacks *m_pp_callbacks; ///< Called when the preprocessor encounters module imports 131238106Sdes std::unique_ptr<ClangASTContext> m_ast_context; 132238106Sdes}; 133238106Sdes 134238106Sdes} 135238106Sdes 136238106Sdes#endif // liblldb_ClangExpressionParser_h_ 137238106Sdes