10b57cec5SDimitry Andric //===-- CPPLanguageRuntime.h 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_CPPLANGUAGERUNTIME_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_CPPLANGUAGERUNTIME_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include <vector> 13480093f4SDimitry Andric 14480093f4SDimitry Andric #include "llvm/ADT/StringMap.h" 15480093f4SDimitry Andric 160b57cec5SDimitry Andric #include "lldb/Core/PluginInterface.h" 170b57cec5SDimitry Andric #include "lldb/Target/LanguageRuntime.h" 180b57cec5SDimitry Andric #include "lldb/lldb-private.h" 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric namespace lldb_private { 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric class CPPLanguageRuntime : public LanguageRuntime { 230b57cec5SDimitry Andric public: 240b57cec5SDimitry Andric enum class LibCppStdFunctionCallableCase { 250b57cec5SDimitry Andric Lambda = 0, 260b57cec5SDimitry Andric CallableObject, 270b57cec5SDimitry Andric FreeOrMemberFunction, 280b57cec5SDimitry Andric Invalid 290b57cec5SDimitry Andric }; 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric struct LibCppStdFunctionCallableInfo { 320b57cec5SDimitry Andric Symbol callable_symbol; 330b57cec5SDimitry Andric Address callable_address; 340b57cec5SDimitry Andric LineEntry callable_line_entry; 3581ad6265SDimitry Andric lldb::addr_t member_f_pointer_value = 0u; 360b57cec5SDimitry Andric LibCppStdFunctionCallableCase callable_case = 370b57cec5SDimitry Andric LibCppStdFunctionCallableCase::Invalid; 380b57cec5SDimitry Andric }; 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric LibCppStdFunctionCallableInfo 410b57cec5SDimitry Andric FindLibCppStdFunctionCallableInfo(lldb::ValueObjectSP &valobj_sp); 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric static char ID; 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric bool isA(const void *ClassID) const override { 460b57cec5SDimitry Andric return ClassID == &ID || LanguageRuntime::isA(ClassID); 470b57cec5SDimitry Andric } 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric static bool classof(const LanguageRuntime *runtime) { 500b57cec5SDimitry Andric return runtime->isA(&ID); 510b57cec5SDimitry Andric } 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric lldb::LanguageType GetLanguageType() const override { 540b57cec5SDimitry Andric return lldb::eLanguageTypeC_plus_plus; 550b57cec5SDimitry Andric } 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric static CPPLanguageRuntime *Get(Process &process) { 580b57cec5SDimitry Andric return llvm::cast_or_null<CPPLanguageRuntime>( 590b57cec5SDimitry Andric process.GetLanguageRuntime(lldb::eLanguageTypeC_plus_plus)); 600b57cec5SDimitry Andric } 610b57cec5SDimitry Andric 62*0fca6ea1SDimitry Andric llvm::Error GetObjectDescription(Stream &str, ValueObject &object) override; 630b57cec5SDimitry Andric 64*0fca6ea1SDimitry Andric llvm::Error GetObjectDescription(Stream &str, Value &value, 650b57cec5SDimitry Andric ExecutionContextScope *exe_scope) override; 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric /// Obtain a ThreadPlan to get us into C++ constructs such as std::function. 680b57cec5SDimitry Andric /// 690b57cec5SDimitry Andric /// \param[in] thread 705ffd83dbSDimitry Andric /// Current thrad of execution. 710b57cec5SDimitry Andric /// 720b57cec5SDimitry Andric /// \param[in] stop_others 730b57cec5SDimitry Andric /// True if other threads should pause during execution. 740b57cec5SDimitry Andric /// 750b57cec5SDimitry Andric /// \return 760b57cec5SDimitry Andric /// A ThreadPlan Shared pointer 770b57cec5SDimitry Andric lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread, 780b57cec5SDimitry Andric bool stop_others) override; 790b57cec5SDimitry Andric 805ffd83dbSDimitry Andric bool IsAllowedRuntimeValue(ConstString name) override; 810b57cec5SDimitry Andric protected: 820b57cec5SDimitry Andric // Classes that inherit from CPPLanguageRuntime can see and modify these 830b57cec5SDimitry Andric CPPLanguageRuntime(Process *process); 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric private: 86480093f4SDimitry Andric using OperatorStringToCallableInfoMap = 87480093f4SDimitry Andric llvm::StringMap<CPPLanguageRuntime::LibCppStdFunctionCallableInfo>; 88480093f4SDimitry Andric 89480093f4SDimitry Andric OperatorStringToCallableInfoMap CallableLookupCache; 900b57cec5SDimitry Andric }; 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric } // namespace lldb_private 930b57cec5SDimitry Andric 945ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_CPPLANGUAGERUNTIME_H 95