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