1 //===-- GNUstepObjCRuntime.h ------------------------------------*- C++ -*-===//
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 LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_GNUSTEPOBJCRUNTIME_GNUSTEPOBJCRUNTIME_H
10 #define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_GNUSTEPOBJCRUNTIME_GNUSTEPOBJCRUNTIME_H
11 
12 #include "lldb/Target/LanguageRuntime.h"
13 #include "lldb/lldb-private.h"
14 
15 #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
16 
17 #include "llvm/ADT/StringRef.h"
18 #include "llvm/Support/Error.h"
19 
20 #include <optional>
21 
22 namespace lldb_private {
23 
24 class GNUstepObjCRuntime : public lldb_private::ObjCLanguageRuntime {
25 public:
26   ~GNUstepObjCRuntime() override;
27 
28   //
29   //  PluginManager, PluginInterface and LLVM RTTI implementation
30   //
31 
32   static char ID;
33 
34   static void Initialize();
35 
36   static void Terminate();
37 
38   static lldb_private::LanguageRuntime *
39   CreateInstance(Process *process, lldb::LanguageType language);
40 
41   static llvm::StringRef GetPluginNameStatic() {
42     return "gnustep-objc-libobjc2";
43   }
44 
45   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
46 
47   void ModulesDidLoad(const ModuleList &module_list) override;
48 
49   bool isA(const void *ClassID) const override {
50     return ClassID == &ID || ObjCLanguageRuntime::isA(ClassID);
51   }
52 
53   static bool classof(const LanguageRuntime *runtime) {
54     return runtime->isA(&ID);
55   }
56 
57   //
58   // LanguageRuntime implementation
59   //
60   bool GetObjectDescription(Stream &str, Value &value,
61                             ExecutionContextScope *exe_scope) override;
62 
63   bool GetObjectDescription(Stream &str, ValueObject &object) override;
64 
65   bool CouldHaveDynamicValue(ValueObject &in_value) override;
66 
67   bool GetDynamicTypeAndAddress(ValueObject &in_value,
68                                 lldb::DynamicValueType use_dynamic,
69                                 TypeAndOrName &class_type_or_name,
70                                 Address &address,
71                                 Value::ValueType &value_type) override;
72 
73   TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name,
74                                  ValueObject &static_value) override;
75 
76   lldb::BreakpointResolverSP
77   CreateExceptionResolver(const lldb::BreakpointSP &bkpt, bool catch_bp,
78                           bool throw_bp) override;
79 
80   lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
81                                                   bool stop_others) override;
82 
83   //
84   // ObjCLanguageRuntime implementation
85   //
86 
87   bool IsModuleObjCLibrary(const lldb::ModuleSP &module_sp) override;
88 
89   bool ReadObjCLibrary(const lldb::ModuleSP &module_sp) override;
90 
91   bool HasReadObjCLibrary() override { return m_objc_module_sp != nullptr; }
92 
93   llvm::Expected<std::unique_ptr<UtilityFunction>>
94   CreateObjectChecker(std::string name, ExecutionContext &exe_ctx) override;
95 
96   ObjCRuntimeVersions GetRuntimeVersion() const override {
97     return ObjCRuntimeVersions::eGNUstep_libobjc2;
98   }
99 
100   void UpdateISAToDescriptorMapIfNeeded() override;
101 
102 protected:
103   // Call CreateInstance instead.
104   GNUstepObjCRuntime(Process *process);
105 
106   lldb::ModuleSP m_objc_module_sp;
107 };
108 
109 } // namespace lldb_private
110 
111 #endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_GNUSTEPOBJCRUNTIME_GNUSTEPOBJCRUNTIME_H
112