xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1061da546Spatrick //===-- AppleObjCRuntime.h --------------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCRUNTIME_H
10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCRUNTIME_H
11061da546Spatrick 
12061da546Spatrick 
13061da546Spatrick #include "AppleObjCTrampolineHandler.h"
14061da546Spatrick #include "AppleThreadPlanStepThroughObjCTrampoline.h"
15061da546Spatrick #include "lldb/Target/LanguageRuntime.h"
16061da546Spatrick #include "lldb/lldb-private.h"
17061da546Spatrick 
18061da546Spatrick #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
19*f6aab3d8Srobert #include <optional>
20061da546Spatrick 
21061da546Spatrick namespace lldb_private {
22061da546Spatrick 
23061da546Spatrick class AppleObjCRuntime : public lldb_private::ObjCLanguageRuntime {
24061da546Spatrick public:
25061da546Spatrick   ~AppleObjCRuntime() override;
26061da546Spatrick 
27061da546Spatrick   // Static Functions
28061da546Spatrick   // Note there is no CreateInstance, Initialize & Terminate functions here,
29061da546Spatrick   // because
30061da546Spatrick   // you can't make an instance of this generic runtime.
31061da546Spatrick 
32061da546Spatrick   static char ID;
33061da546Spatrick 
34dda28197Spatrick   static void Initialize();
35dda28197Spatrick 
36dda28197Spatrick   static void Terminate();
37dda28197Spatrick 
isA(const void * ClassID)38061da546Spatrick   bool isA(const void *ClassID) const override {
39061da546Spatrick     return ClassID == &ID || ObjCLanguageRuntime::isA(ClassID);
40061da546Spatrick   }
41061da546Spatrick 
classof(const LanguageRuntime * runtime)42061da546Spatrick   static bool classof(const LanguageRuntime *runtime) {
43061da546Spatrick     return runtime->isA(&ID);
44061da546Spatrick   }
45061da546Spatrick 
46061da546Spatrick   // These are generic runtime functions:
47061da546Spatrick   bool GetObjectDescription(Stream &str, Value &value,
48061da546Spatrick                             ExecutionContextScope *exe_scope) override;
49061da546Spatrick 
50061da546Spatrick   bool GetObjectDescription(Stream &str, ValueObject &object) override;
51061da546Spatrick 
52061da546Spatrick   bool CouldHaveDynamicValue(ValueObject &in_value) override;
53061da546Spatrick 
54061da546Spatrick   bool GetDynamicTypeAndAddress(ValueObject &in_value,
55061da546Spatrick                                 lldb::DynamicValueType use_dynamic,
56061da546Spatrick                                 TypeAndOrName &class_type_or_name,
57061da546Spatrick                                 Address &address,
58061da546Spatrick                                 Value::ValueType &value_type) override;
59061da546Spatrick 
60061da546Spatrick   TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name,
61061da546Spatrick                                  ValueObject &static_value) override;
62061da546Spatrick 
63061da546Spatrick   // These are the ObjC specific functions.
64061da546Spatrick 
65061da546Spatrick   bool IsModuleObjCLibrary(const lldb::ModuleSP &module_sp) override;
66061da546Spatrick 
67061da546Spatrick   bool ReadObjCLibrary(const lldb::ModuleSP &module_sp) override;
68061da546Spatrick 
HasReadObjCLibrary()69061da546Spatrick   bool HasReadObjCLibrary() override { return m_read_objc_library; }
70061da546Spatrick 
71061da546Spatrick   lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
72061da546Spatrick                                                   bool stop_others) override;
73061da546Spatrick 
74061da546Spatrick   // Get the "libobjc.A.dylib" module from the current target if we can find
75061da546Spatrick   // it, also cache it once it is found to ensure quick lookups.
76061da546Spatrick   lldb::ModuleSP GetObjCModule();
77061da546Spatrick 
78061da546Spatrick   // Sync up with the target
79061da546Spatrick 
80061da546Spatrick   void ModulesDidLoad(const ModuleList &module_list) override;
81061da546Spatrick 
82061da546Spatrick   void SetExceptionBreakpoints() override;
83061da546Spatrick 
84061da546Spatrick   void ClearExceptionBreakpoints() override;
85061da546Spatrick 
86061da546Spatrick   bool ExceptionBreakpointsAreSet() override;
87061da546Spatrick 
88061da546Spatrick   bool ExceptionBreakpointsExplainStop(lldb::StopInfoSP stop_reason) override;
89061da546Spatrick 
90061da546Spatrick   lldb::SearchFilterSP CreateExceptionSearchFilter() override;
91061da546Spatrick 
92061da546Spatrick   static std::tuple<FileSpec, ConstString> GetExceptionThrowLocation();
93061da546Spatrick 
94061da546Spatrick   lldb::ValueObjectSP GetExceptionObjectForThread(
95061da546Spatrick       lldb::ThreadSP thread_sp) override;
96061da546Spatrick 
97061da546Spatrick   lldb::ThreadSP GetBacktraceThreadFromException(
98061da546Spatrick       lldb::ValueObjectSP thread_sp) override;
99061da546Spatrick 
100061da546Spatrick   uint32_t GetFoundationVersion();
101061da546Spatrick 
102061da546Spatrick   virtual void GetValuesForGlobalCFBooleans(lldb::addr_t &cf_true,
103061da546Spatrick                                             lldb::addr_t &cf_false);
104061da546Spatrick 
IsTaggedPointer(lldb::addr_t addr)105061da546Spatrick   virtual bool IsTaggedPointer (lldb::addr_t addr) { return false; }
106061da546Spatrick 
107061da546Spatrick protected:
108061da546Spatrick   // Call CreateInstance instead.
109061da546Spatrick   AppleObjCRuntime(Process *process);
110061da546Spatrick 
111061da546Spatrick   bool CalculateHasNewLiteralsAndIndexing() override;
112061da546Spatrick 
113061da546Spatrick   static bool AppleIsModuleObjCLibrary(const lldb::ModuleSP &module_sp);
114061da546Spatrick 
115061da546Spatrick   static ObjCRuntimeVersions GetObjCVersion(Process *process,
116061da546Spatrick                                             lldb::ModuleSP &objc_module_sp);
117061da546Spatrick 
118061da546Spatrick   void ReadObjCLibraryIfNeeded(const ModuleList &module_list);
119061da546Spatrick 
120061da546Spatrick   Address *GetPrintForDebuggerAddr();
121061da546Spatrick 
122061da546Spatrick   std::unique_ptr<Address> m_PrintForDebugger_addr;
123061da546Spatrick   bool m_read_objc_library;
124061da546Spatrick   std::unique_ptr<lldb_private::AppleObjCTrampolineHandler>
125061da546Spatrick       m_objc_trampoline_handler_up;
126061da546Spatrick   lldb::BreakpointSP m_objc_exception_bp_sp;
127061da546Spatrick   lldb::ModuleWP m_objc_module_wp;
128061da546Spatrick   std::unique_ptr<FunctionCaller> m_print_object_caller_up;
129061da546Spatrick 
130*f6aab3d8Srobert   std::optional<uint32_t> m_Foundation_major;
131061da546Spatrick };
132061da546Spatrick 
133061da546Spatrick } // namespace lldb_private
134061da546Spatrick 
135dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCRUNTIME_H
136