106c3fb27SDimitry Andric //===-- GNUstepObjCRuntime.h ------------------------------------*- C++ -*-===//
206c3fb27SDimitry Andric //
306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606c3fb27SDimitry Andric //
706c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
806c3fb27SDimitry Andric 
906c3fb27SDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_GNUSTEPOBJCRUNTIME_GNUSTEPOBJCRUNTIME_H
1006c3fb27SDimitry Andric #define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_GNUSTEPOBJCRUNTIME_GNUSTEPOBJCRUNTIME_H
1106c3fb27SDimitry Andric 
1206c3fb27SDimitry Andric #include "lldb/Target/LanguageRuntime.h"
1306c3fb27SDimitry Andric #include "lldb/lldb-private.h"
1406c3fb27SDimitry Andric 
1506c3fb27SDimitry Andric #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
1606c3fb27SDimitry Andric 
1706c3fb27SDimitry Andric #include "llvm/ADT/StringRef.h"
1806c3fb27SDimitry Andric #include "llvm/Support/Error.h"
1906c3fb27SDimitry Andric 
2006c3fb27SDimitry Andric #include <optional>
2106c3fb27SDimitry Andric 
2206c3fb27SDimitry Andric namespace lldb_private {
2306c3fb27SDimitry Andric 
2406c3fb27SDimitry Andric class GNUstepObjCRuntime : public lldb_private::ObjCLanguageRuntime {
2506c3fb27SDimitry Andric public:
2606c3fb27SDimitry Andric   ~GNUstepObjCRuntime() override;
2706c3fb27SDimitry Andric 
2806c3fb27SDimitry Andric   //
2906c3fb27SDimitry Andric   //  PluginManager, PluginInterface and LLVM RTTI implementation
3006c3fb27SDimitry Andric   //
3106c3fb27SDimitry Andric 
3206c3fb27SDimitry Andric   static char ID;
3306c3fb27SDimitry Andric 
3406c3fb27SDimitry Andric   static void Initialize();
3506c3fb27SDimitry Andric 
3606c3fb27SDimitry Andric   static void Terminate();
3706c3fb27SDimitry Andric 
3806c3fb27SDimitry Andric   static lldb_private::LanguageRuntime *
3906c3fb27SDimitry Andric   CreateInstance(Process *process, lldb::LanguageType language);
4006c3fb27SDimitry Andric 
4106c3fb27SDimitry Andric   static llvm::StringRef GetPluginNameStatic() {
4206c3fb27SDimitry Andric     return "gnustep-objc-libobjc2";
4306c3fb27SDimitry Andric   }
4406c3fb27SDimitry Andric 
4506c3fb27SDimitry Andric   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
4606c3fb27SDimitry Andric 
4706c3fb27SDimitry Andric   void ModulesDidLoad(const ModuleList &module_list) override;
4806c3fb27SDimitry Andric 
4906c3fb27SDimitry Andric   bool isA(const void *ClassID) const override {
5006c3fb27SDimitry Andric     return ClassID == &ID || ObjCLanguageRuntime::isA(ClassID);
5106c3fb27SDimitry Andric   }
5206c3fb27SDimitry Andric 
5306c3fb27SDimitry Andric   static bool classof(const LanguageRuntime *runtime) {
5406c3fb27SDimitry Andric     return runtime->isA(&ID);
5506c3fb27SDimitry Andric   }
5606c3fb27SDimitry Andric 
5706c3fb27SDimitry Andric   //
5806c3fb27SDimitry Andric   // LanguageRuntime implementation
5906c3fb27SDimitry Andric   //
60*0fca6ea1SDimitry Andric   llvm::Error GetObjectDescription(Stream &str, Value &value,
6106c3fb27SDimitry Andric                                    ExecutionContextScope *exe_scope) override;
6206c3fb27SDimitry Andric 
63*0fca6ea1SDimitry Andric   llvm::Error GetObjectDescription(Stream &str, ValueObject &object) override;
6406c3fb27SDimitry Andric 
6506c3fb27SDimitry Andric   bool CouldHaveDynamicValue(ValueObject &in_value) override;
6606c3fb27SDimitry Andric 
6706c3fb27SDimitry Andric   bool GetDynamicTypeAndAddress(ValueObject &in_value,
6806c3fb27SDimitry Andric                                 lldb::DynamicValueType use_dynamic,
6906c3fb27SDimitry Andric                                 TypeAndOrName &class_type_or_name,
7006c3fb27SDimitry Andric                                 Address &address,
7106c3fb27SDimitry Andric                                 Value::ValueType &value_type) override;
7206c3fb27SDimitry Andric 
7306c3fb27SDimitry Andric   TypeAndOrName FixUpDynamicType(const TypeAndOrName &type_and_or_name,
7406c3fb27SDimitry Andric                                  ValueObject &static_value) override;
7506c3fb27SDimitry Andric 
7606c3fb27SDimitry Andric   lldb::BreakpointResolverSP
7706c3fb27SDimitry Andric   CreateExceptionResolver(const lldb::BreakpointSP &bkpt, bool catch_bp,
7806c3fb27SDimitry Andric                           bool throw_bp) override;
7906c3fb27SDimitry Andric 
8006c3fb27SDimitry Andric   lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
8106c3fb27SDimitry Andric                                                   bool stop_others) override;
8206c3fb27SDimitry Andric 
8306c3fb27SDimitry Andric   //
8406c3fb27SDimitry Andric   // ObjCLanguageRuntime implementation
8506c3fb27SDimitry Andric   //
8606c3fb27SDimitry Andric 
8706c3fb27SDimitry Andric   bool IsModuleObjCLibrary(const lldb::ModuleSP &module_sp) override;
8806c3fb27SDimitry Andric 
8906c3fb27SDimitry Andric   bool ReadObjCLibrary(const lldb::ModuleSP &module_sp) override;
9006c3fb27SDimitry Andric 
9106c3fb27SDimitry Andric   bool HasReadObjCLibrary() override { return m_objc_module_sp != nullptr; }
9206c3fb27SDimitry Andric 
9306c3fb27SDimitry Andric   llvm::Expected<std::unique_ptr<UtilityFunction>>
9406c3fb27SDimitry Andric   CreateObjectChecker(std::string name, ExecutionContext &exe_ctx) override;
9506c3fb27SDimitry Andric 
9606c3fb27SDimitry Andric   ObjCRuntimeVersions GetRuntimeVersion() const override {
9706c3fb27SDimitry Andric     return ObjCRuntimeVersions::eGNUstep_libobjc2;
9806c3fb27SDimitry Andric   }
9906c3fb27SDimitry Andric 
10006c3fb27SDimitry Andric   void UpdateISAToDescriptorMapIfNeeded() override;
10106c3fb27SDimitry Andric 
10206c3fb27SDimitry Andric protected:
10306c3fb27SDimitry Andric   // Call CreateInstance instead.
10406c3fb27SDimitry Andric   GNUstepObjCRuntime(Process *process);
10506c3fb27SDimitry Andric 
10606c3fb27SDimitry Andric   lldb::ModuleSP m_objc_module_sp;
10706c3fb27SDimitry Andric };
10806c3fb27SDimitry Andric 
10906c3fb27SDimitry Andric } // namespace lldb_private
11006c3fb27SDimitry Andric 
11106c3fb27SDimitry Andric #endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_GNUSTEPOBJCRUNTIME_GNUSTEPOBJCRUNTIME_H
112