10b57cec5SDimitry Andric //===-- ItaniumABILanguageRuntime.h -----------------------------*- C++ -*-===// 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_ITANIUMABI_ITANIUMABILANGUAGERUNTIME_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_ITANIUMABI_ITANIUMABILANGUAGERUNTIME_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include <map> 130b57cec5SDimitry Andric #include <mutex> 140b57cec5SDimitry Andric #include <vector> 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "lldb/Breakpoint/BreakpointResolver.h" 170b57cec5SDimitry Andric #include "lldb/Core/Value.h" 180b57cec5SDimitry Andric #include "lldb/Symbol/Type.h" 190b57cec5SDimitry Andric #include "lldb/Target/LanguageRuntime.h" 200b57cec5SDimitry Andric #include "lldb/lldb-private.h" 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric #include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h" 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric namespace lldb_private { 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric class ItaniumABILanguageRuntime : public lldb_private::CPPLanguageRuntime { 270b57cec5SDimitry Andric public: 280b57cec5SDimitry Andric ~ItaniumABILanguageRuntime() override = default; 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric // Static Functions 310b57cec5SDimitry Andric static void Initialize(); 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric static void Terminate(); 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric static lldb_private::LanguageRuntime * 360b57cec5SDimitry Andric CreateInstance(Process *process, lldb::LanguageType language); 370b57cec5SDimitry Andric GetPluginNameStatic()38349cc55cSDimitry Andric static llvm::StringRef GetPluginNameStatic() { return "itanium"; } 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric static char ID; 410b57cec5SDimitry Andric isA(const void * ClassID)420b57cec5SDimitry Andric bool isA(const void *ClassID) const override { 430b57cec5SDimitry Andric return ClassID == &ID || CPPLanguageRuntime::isA(ClassID); 440b57cec5SDimitry Andric } 450b57cec5SDimitry Andric classof(const LanguageRuntime * runtime)460b57cec5SDimitry Andric static bool classof(const LanguageRuntime *runtime) { 470b57cec5SDimitry Andric return runtime->isA(&ID); 480b57cec5SDimitry Andric } 490b57cec5SDimitry Andric 50*5f757f3fSDimitry Andric 51*5f757f3fSDimitry Andric llvm::Expected<LanguageRuntime::VTableInfo> 52*5f757f3fSDimitry Andric GetVTableInfo(ValueObject &in_value, bool check_type) override; 53*5f757f3fSDimitry Andric 540b57cec5SDimitry Andric bool GetDynamicTypeAndAddress(ValueObject &in_value, 550b57cec5SDimitry Andric lldb::DynamicValueType use_dynamic, 560b57cec5SDimitry Andric TypeAndOrName &class_type_or_name, 570b57cec5SDimitry Andric Address &address, 580b57cec5SDimitry Andric Value::ValueType &value_type) override; 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name, 610b57cec5SDimitry Andric ValueObject &static_value) override; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric bool CouldHaveDynamicValue(ValueObject &in_value) override; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric void SetExceptionBreakpoints() override; 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric void ClearExceptionBreakpoints() override; 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric bool ExceptionBreakpointsAreSet() override; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric bool ExceptionBreakpointsExplainStop(lldb::StopInfoSP stop_reason) override; 720b57cec5SDimitry Andric 735ffd83dbSDimitry Andric lldb::BreakpointResolverSP 745ffd83dbSDimitry Andric CreateExceptionResolver(const lldb::BreakpointSP &bkpt, 755ffd83dbSDimitry Andric bool catch_bp, bool throw_bp) override; 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric lldb::SearchFilterSP CreateExceptionSearchFilter() override; 780b57cec5SDimitry Andric 790b57cec5SDimitry Andric lldb::ValueObjectSP GetExceptionObjectForThread( 800b57cec5SDimitry Andric lldb::ThreadSP thread_sp) override; 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric // PluginInterface protocol GetPluginName()83349cc55cSDimitry Andric llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric protected: 865ffd83dbSDimitry Andric lldb::BreakpointResolverSP 875ffd83dbSDimitry Andric CreateExceptionResolver(const lldb::BreakpointSP &bkpt, 885ffd83dbSDimitry Andric bool catch_bp, bool throw_bp, bool for_expressions); 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric lldb::BreakpointSP CreateExceptionBreakpoint(bool catch_bp, bool throw_bp, 910b57cec5SDimitry Andric bool for_expressions, 920b57cec5SDimitry Andric bool is_internal); 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric private: 950b57cec5SDimitry Andric typedef std::map<lldb_private::Address, TypeAndOrName> DynamicTypeCache; 96*5f757f3fSDimitry Andric typedef std::map<lldb_private::Address, VTableInfo> VTableInfoCache; 970b57cec5SDimitry Andric ItaniumABILanguageRuntime(Process * process)980b57cec5SDimitry Andric ItaniumABILanguageRuntime(Process *process) 990b57cec5SDimitry Andric : // Call CreateInstance instead. 100*5f757f3fSDimitry Andric lldb_private::CPPLanguageRuntime(process) {} 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric lldb::BreakpointSP m_cxx_exception_bp_sp; 1030b57cec5SDimitry Andric DynamicTypeCache m_dynamic_type_map; 104*5f757f3fSDimitry Andric VTableInfoCache m_vtable_info_map; 105*5f757f3fSDimitry Andric std::mutex m_mutex; 1060b57cec5SDimitry Andric 107*5f757f3fSDimitry Andric TypeAndOrName GetTypeInfo(ValueObject &in_value, 108*5f757f3fSDimitry Andric const VTableInfo &vtable_info); 1090b57cec5SDimitry Andric 1100b57cec5SDimitry Andric TypeAndOrName GetDynamicTypeInfo(const lldb_private::Address &vtable_addr); 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric void SetDynamicTypeInfo(const lldb_private::Address &vtable_addr, 1130b57cec5SDimitry Andric const TypeAndOrName &type_info); 114*5f757f3fSDimitry Andric 115*5f757f3fSDimitry Andric // Check if a compiler type has a vtable. 116*5f757f3fSDimitry Andric // 117*5f757f3fSDimitry Andric // If the compiler type is a pointer or a reference, this function will check 118*5f757f3fSDimitry Andric // if the pointee type has a vtable, else it will check the type passed in. 119*5f757f3fSDimitry Andric // 120*5f757f3fSDimitry Andric // Returns an error if the type of the value doesn't have a vtable with an 121*5f757f3fSDimitry Andric // explanation why, or returns an Error::success() if the type has a vtable. 122*5f757f3fSDimitry Andric llvm::Error TypeHasVTable(CompilerType compiler_type); 1230b57cec5SDimitry Andric }; 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric } // namespace lldb_private 1260b57cec5SDimitry Andric 1275ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_CPLUSPLUS_ITANIUMABI_ITANIUMABILANGUAGERUNTIME_H 128