1//===-- CPPLanguageRuntime.h 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef liblldb_CPPLanguageRuntime_h_ 10#define liblldb_CPPLanguageRuntime_h_ 11 12#include <vector> 13 14#include "llvm/ADT/StringMap.h" 15 16#include "lldb/Core/PluginInterface.h" 17#include "lldb/Target/LanguageRuntime.h" 18#include "lldb/lldb-private.h" 19 20namespace lldb_private { 21 22class CPPLanguageRuntime : public LanguageRuntime { 23public: 24 enum class LibCppStdFunctionCallableCase { 25 Lambda = 0, 26 CallableObject, 27 FreeOrMemberFunction, 28 Invalid 29 }; 30 31 struct LibCppStdFunctionCallableInfo { 32 Symbol callable_symbol; 33 Address callable_address; 34 LineEntry callable_line_entry; 35 lldb::addr_t member__f_pointer_value = 0u; 36 LibCppStdFunctionCallableCase callable_case = 37 LibCppStdFunctionCallableCase::Invalid; 38 }; 39 40 LibCppStdFunctionCallableInfo 41 FindLibCppStdFunctionCallableInfo(lldb::ValueObjectSP &valobj_sp); 42 43 ~CPPLanguageRuntime() override; 44 45 static char ID; 46 47 bool isA(const void *ClassID) const override { 48 return ClassID == &ID || LanguageRuntime::isA(ClassID); 49 } 50 51 static bool classof(const LanguageRuntime *runtime) { 52 return runtime->isA(&ID); 53 } 54 55 lldb::LanguageType GetLanguageType() const override { 56 return lldb::eLanguageTypeC_plus_plus; 57 } 58 59 static CPPLanguageRuntime *Get(Process &process) { 60 return llvm::cast_or_null<CPPLanguageRuntime>( 61 process.GetLanguageRuntime(lldb::eLanguageTypeC_plus_plus)); 62 } 63 64 bool GetObjectDescription(Stream &str, ValueObject &object) override; 65 66 bool GetObjectDescription(Stream &str, Value &value, 67 ExecutionContextScope *exe_scope) override; 68 69 /// Obtain a ThreadPlan to get us into C++ constructs such as std::function. 70 /// 71 /// \param[in] thread 72 /// Curent thrad of execution. 73 /// 74 /// \param[in] stop_others 75 /// True if other threads should pause during execution. 76 /// 77 /// \return 78 /// A ThreadPlan Shared pointer 79 lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread, 80 bool stop_others) override; 81 82 bool IsWhitelistedRuntimeValue(ConstString name) override; 83protected: 84 // Classes that inherit from CPPLanguageRuntime can see and modify these 85 CPPLanguageRuntime(Process *process); 86 87private: 88 using OperatorStringToCallableInfoMap = 89 llvm::StringMap<CPPLanguageRuntime::LibCppStdFunctionCallableInfo>; 90 91 OperatorStringToCallableInfoMap CallableLookupCache; 92 93 DISALLOW_COPY_AND_ASSIGN(CPPLanguageRuntime); 94}; 95 96} // namespace lldb_private 97 98#endif // liblldb_CPPLanguageRuntime_h_ 99