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