diff options
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/API/SBMutex.cpp | 9 | ||||
-rw-r--r-- | lldb/source/Breakpoint/BreakpointLocationCollection.cpp | 25 | ||||
-rw-r--r-- | lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp | 65 | ||||
-rw-r--r-- | lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h | 4 | ||||
-rw-r--r-- | lldb/source/Target/StopInfo.cpp | 13 | ||||
-rw-r--r-- | lldb/source/Utility/RegisterValue.cpp | 2 |
6 files changed, 102 insertions, 16 deletions
diff --git a/lldb/source/API/SBMutex.cpp b/lldb/source/API/SBMutex.cpp index 445076b..c7844de 100644 --- a/lldb/source/API/SBMutex.cpp +++ b/lldb/source/API/SBMutex.cpp @@ -58,3 +58,12 @@ void SBMutex::unlock() const { if (m_opaque_sp) m_opaque_sp->unlock(); } + +bool SBMutex::try_lock() const { + LLDB_INSTRUMENT_VA(this); + + if (m_opaque_sp) + return m_opaque_sp->try_lock(); + + return false; +} diff --git a/lldb/source/Breakpoint/BreakpointLocationCollection.cpp b/lldb/source/Breakpoint/BreakpointLocationCollection.cpp index 1d052c5..9771583 100644 --- a/lldb/source/Breakpoint/BreakpointLocationCollection.cpp +++ b/lldb/source/Breakpoint/BreakpointLocationCollection.cpp @@ -17,7 +17,8 @@ using namespace lldb; using namespace lldb_private; // BreakpointLocationCollection constructor -BreakpointLocationCollection::BreakpointLocationCollection() = default; +BreakpointLocationCollection::BreakpointLocationCollection(bool preserving) + : m_preserving_bkpts(preserving) {} // Destructor BreakpointLocationCollection::~BreakpointLocationCollection() = default; @@ -26,8 +27,19 @@ void BreakpointLocationCollection::Add(const BreakpointLocationSP &bp_loc) { std::lock_guard<std::mutex> guard(m_collection_mutex); BreakpointLocationSP old_bp_loc = FindByIDPair(bp_loc->GetBreakpoint().GetID(), bp_loc->GetID()); - if (!old_bp_loc.get()) + if (!old_bp_loc.get()) { m_break_loc_collection.push_back(bp_loc); + if (m_preserving_bkpts) { + lldb::break_id_t bp_loc_id = bp_loc->GetID(); + Breakpoint &bkpt = bp_loc->GetBreakpoint(); + lldb::break_id_t bp_id = bkpt.GetID(); + std::pair<lldb::break_id_t, lldb::break_id_t> key = + std::make_pair(bp_id, bp_loc_id); + auto entry = m_preserved_bps.find(key); + if (entry == m_preserved_bps.end()) + m_preserved_bps.emplace(key, bkpt.shared_from_this()); + } + } } bool BreakpointLocationCollection::Remove(lldb::break_id_t bp_id, @@ -35,6 +47,15 @@ bool BreakpointLocationCollection::Remove(lldb::break_id_t bp_id, std::lock_guard<std::mutex> guard(m_collection_mutex); collection::iterator pos = GetIDPairIterator(bp_id, bp_loc_id); // Predicate if (pos != m_break_loc_collection.end()) { + if (m_preserving_bkpts) { + std::pair<lldb::break_id_t, lldb::break_id_t> key = + std::make_pair(bp_id, bp_loc_id); + auto entry = m_preserved_bps.find(key); + if (entry == m_preserved_bps.end()) + assert(0 && "Breakpoint added to collection but not preserving map."); + else + m_preserved_bps.erase(entry); + } m_break_loc_collection.erase(pos); return true; } diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp index c33760e..2b2ca08 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.cpp @@ -423,6 +423,46 @@ Status ObjCLanguageRuntime::ObjCExceptionPrecondition::ConfigurePrecondition( return error; } +CompilerType ObjCLanguageRuntime::LookupInModulesVendor(ConstString class_name, + Target &target) { + assert(class_name); + + auto *persistent_state = llvm::cast<ClangPersistentVariables>( + target.GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); + if (!persistent_state) + return {}; + + auto clang_modules_decl_vendor_sp = + persistent_state->GetClangModulesDeclVendor(); + if (!clang_modules_decl_vendor_sp) + return {}; + + auto types = clang_modules_decl_vendor_sp->FindTypes( + class_name, /*max_matches*/ UINT32_MAX); + if (types.empty()) + return {}; + + return types.front(); +} + +CompilerType ObjCLanguageRuntime::LookupInRuntime(ConstString class_name) { + auto *runtime_vendor = GetDeclVendor(); + if (!runtime_vendor) + return {}; + + std::vector<CompilerDecl> compiler_decls; + runtime_vendor->FindDecls(class_name, false, UINT32_MAX, compiler_decls); + if (compiler_decls.empty()) + return {}; + + auto *ctx = + llvm::dyn_cast<TypeSystemClang>(compiler_decls[0].GetTypeSystem()); + if (!ctx) + return {}; + + return ctx->GetTypeForDecl(compiler_decls[0].GetOpaqueDecl()); +} + std::optional<CompilerType> ObjCLanguageRuntime::GetRuntimeType(CompilerType base_type) { CompilerType class_type; @@ -442,18 +482,21 @@ ObjCLanguageRuntime::GetRuntimeType(CompilerType base_type) { if (!class_name) return std::nullopt; - TypeSP complete_objc_class_type_sp = LookupInCompleteClassCache(class_name); - if (!complete_objc_class_type_sp) - return std::nullopt; - - CompilerType complete_class( - complete_objc_class_type_sp->GetFullCompilerType()); - if (complete_class.GetCompleteType()) { - if (is_pointer_type) - return complete_class.GetPointerType(); - else - return complete_class; + if (TypeSP complete_objc_class_type_sp = + LookupInCompleteClassCache(class_name)) { + if (CompilerType complete_class = + complete_objc_class_type_sp->GetFullCompilerType(); + complete_class.GetCompleteType()) + return is_pointer_type ? complete_class.GetPointerType() : complete_class; } + assert(m_process); + if (CompilerType found = + LookupInModulesVendor(class_name, m_process->GetTarget())) + return is_pointer_type ? found.GetPointerType() : found; + + if (CompilerType found = LookupInRuntime(class_name)) + return is_pointer_type ? found.GetPointerType() : found; + return std::nullopt; } diff --git a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h index 45de098..cc8281e 100644 --- a/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h @@ -465,6 +465,10 @@ protected: ObjCLanguageRuntime(const ObjCLanguageRuntime &) = delete; const ObjCLanguageRuntime &operator=(const ObjCLanguageRuntime &) = delete; + +private: + CompilerType LookupInRuntime(ConstString class_name); + CompilerType LookupInModulesVendor(ConstString class_name, Target &process); }; } // namespace lldb_private diff --git a/lldb/source/Target/StopInfo.cpp b/lldb/source/Target/StopInfo.cpp index 7fa1fc5..e9e534a 100644 --- a/lldb/source/Target/StopInfo.cpp +++ b/lldb/source/Target/StopInfo.cpp @@ -87,11 +87,15 @@ bool StopInfo::HasTargetRunSinceMe() { namespace lldb_private { class StopInfoBreakpoint : public StopInfo { public: + // We use a "breakpoint preserving BreakpointLocationCollection because we + // may need to hand out the "breakpoint hit" list as any point, potentially + // after the breakpoint has been deleted. But we still need to refer to them. StopInfoBreakpoint(Thread &thread, break_id_t break_id) : StopInfo(thread, break_id), m_should_stop(false), m_should_stop_is_valid(false), m_should_perform_action(true), m_address(LLDB_INVALID_ADDRESS), m_break_id(LLDB_INVALID_BREAK_ID), - m_was_all_internal(false), m_was_one_shot(false) { + m_was_all_internal(false), m_was_one_shot(false), + m_async_stopped_locs(true) { StoreBPInfo(); } @@ -99,7 +103,8 @@ public: : StopInfo(thread, break_id), m_should_stop(should_stop), m_should_stop_is_valid(true), m_should_perform_action(true), m_address(LLDB_INVALID_ADDRESS), m_break_id(LLDB_INVALID_BREAK_ID), - m_was_all_internal(false), m_was_one_shot(false) { + m_was_all_internal(false), m_was_one_shot(false), + m_async_stopped_locs(true) { StoreBPInfo(); } @@ -699,6 +704,10 @@ private: lldb::break_id_t m_break_id; bool m_was_all_internal; bool m_was_one_shot; + /// The StopInfoBreakpoint lives after the stop, and could get queried + /// at any time so we need to make sure that it keeps the breakpoints for + /// each of the locations it records alive while it is around. That's what + /// The BreakpointPreservingLocationCollection does. BreakpointLocationCollection m_async_stopped_locs; }; diff --git a/lldb/source/Utility/RegisterValue.cpp b/lldb/source/Utility/RegisterValue.cpp index 0e99451..12c349a 100644 --- a/lldb/source/Utility/RegisterValue.cpp +++ b/lldb/source/Utility/RegisterValue.cpp @@ -199,7 +199,7 @@ Status RegisterValue::SetValueFromData(const RegisterInfo ®_info, else if (reg_info.byte_size <= 16) { uint64_t data1 = src.GetU64(&src_offset); uint64_t data2 = src.GetU64(&src_offset); - if (src.GetByteOrder() == eByteOrderBig) { + if (src.GetByteOrder() == eByteOrderLittle) { int128.x[0] = data1; int128.x[1] = data2; } else { |