llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: Pavel Labath (labath) <details> <summary>Changes</summary> These plans are cached and accessed from multiple threads. Modifying them would be a Bad Idea(tm). --- Patch is 48.49 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/133247.diff 7 Files Affected: - (modified) lldb/include/lldb/Symbol/FuncUnwinders.h (+41-37) - (modified) lldb/include/lldb/Symbol/UnwindPlan.h (+2-2) - (modified) lldb/include/lldb/Target/RegisterContextUnwind.h (+9-7) - (modified) lldb/source/Commands/CommandObjectTarget.cpp (+49-57) - (modified) lldb/source/Symbol/FuncUnwinders.cpp (+105-102) - (modified) lldb/source/Symbol/UnwindPlan.cpp (+1-1) - (modified) lldb/source/Target/RegisterContextUnwind.cpp (+40-44) ``````````diff diff --git a/lldb/include/lldb/Symbol/FuncUnwinders.h b/lldb/include/lldb/Symbol/FuncUnwinders.h index 1d4c28324e90f..479ccf87b6e2c 100644 --- a/lldb/include/lldb/Symbol/FuncUnwinders.h +++ b/lldb/include/lldb/Symbol/FuncUnwinders.h @@ -36,18 +36,19 @@ class FuncUnwinders { ~FuncUnwinders(); - lldb::UnwindPlanSP GetUnwindPlanAtCallSite(Target &target, Thread &thread); + std::shared_ptr<const UnwindPlan> GetUnwindPlanAtCallSite(Target &target, + Thread &thread); - lldb::UnwindPlanSP GetUnwindPlanAtNonCallSite(Target &target, - lldb_private::Thread &thread); + std::shared_ptr<const UnwindPlan> + GetUnwindPlanAtNonCallSite(Target &target, lldb_private::Thread &thread); - lldb::UnwindPlanSP GetUnwindPlanFastUnwind(Target &target, - lldb_private::Thread &thread); + std::shared_ptr<const UnwindPlan> + GetUnwindPlanFastUnwind(Target &target, lldb_private::Thread &thread); - lldb::UnwindPlanSP + std::shared_ptr<const UnwindPlan> GetUnwindPlanArchitectureDefault(lldb_private::Thread &thread); - lldb::UnwindPlanSP + std::shared_ptr<const UnwindPlan> GetUnwindPlanArchitectureDefaultAtFunctionEntry(lldb_private::Thread &thread); Address &GetFirstNonPrologueInsn(Target &target); @@ -77,32 +78,34 @@ class FuncUnwinders { // used. Instead, clients should ask for the *behavior* they are looking for, // using one of the above UnwindPlan retrieval methods. - lldb::UnwindPlanSP GetAssemblyUnwindPlan(Target &target, Thread &thread); + std::shared_ptr<const UnwindPlan> GetAssemblyUnwindPlan(Target &target, + Thread &thread); - lldb::UnwindPlanSP GetObjectFileUnwindPlan(Target &target); + std::shared_ptr<const UnwindPlan> GetObjectFileUnwindPlan(Target &target); - lldb::UnwindPlanSP GetObjectFileAugmentedUnwindPlan(Target &target, - Thread &thread); + std::shared_ptr<const UnwindPlan> + GetObjectFileAugmentedUnwindPlan(Target &target, Thread &thread); - lldb::UnwindPlanSP GetEHFrameUnwindPlan(Target &target); + std::shared_ptr<const UnwindPlan> GetEHFrameUnwindPlan(Target &target); - lldb::UnwindPlanSP GetEHFrameAugmentedUnwindPlan(Target &target, - Thread &thread); + std::shared_ptr<const UnwindPlan> + GetEHFrameAugmentedUnwindPlan(Target &target, Thread &thread); - lldb::UnwindPlanSP GetDebugFrameUnwindPlan(Target &target); + std::shared_ptr<const UnwindPlan> GetDebugFrameUnwindPlan(Target &target); - lldb::UnwindPlanSP GetDebugFrameAugmentedUnwindPlan(Target &target, - Thread &thread); + std::shared_ptr<const UnwindPlan> + GetDebugFrameAugmentedUnwindPlan(Target &target, Thread &thread); - lldb::UnwindPlanSP GetCompactUnwindUnwindPlan(Target &target); + std::shared_ptr<const UnwindPlan> GetCompactUnwindUnwindPlan(Target &target); - lldb::UnwindPlanSP GetArmUnwindUnwindPlan(Target &target); + std::shared_ptr<const UnwindPlan> GetArmUnwindUnwindPlan(Target &target); - lldb::UnwindPlanSP GetSymbolFileUnwindPlan(Thread &thread); + std::shared_ptr<const UnwindPlan> GetSymbolFileUnwindPlan(Thread &thread); - lldb::UnwindPlanSP GetArchDefaultUnwindPlan(Thread &thread); + std::shared_ptr<const UnwindPlan> GetArchDefaultUnwindPlan(Thread &thread); - lldb::UnwindPlanSP GetArchDefaultAtFuncEntryUnwindPlan(Thread &thread); + std::shared_ptr<const UnwindPlan> + GetArchDefaultAtFuncEntryUnwindPlan(Thread &thread); private: lldb::UnwindAssemblySP GetUnwindAssemblyProfiler(Target &target); @@ -113,7 +116,8 @@ class FuncUnwinders { // unwind rule for the pc, and LazyBoolCalculate if it was unable to // determine this for some reason. lldb_private::LazyBool CompareUnwindPlansForIdenticalInitialPCLocation( - Thread &thread, const lldb::UnwindPlanSP &a, const lldb::UnwindPlanSP &b); + Thread &thread, const std::shared_ptr<const UnwindPlan> &a, + const std::shared_ptr<const UnwindPlan> &b); UnwindTable &m_unwind_table; @@ -129,22 +133,22 @@ class FuncUnwinders { std::recursive_mutex m_mutex; - lldb::UnwindPlanSP m_unwind_plan_assembly_sp; - lldb::UnwindPlanSP m_unwind_plan_object_file_sp; - lldb::UnwindPlanSP m_unwind_plan_eh_frame_sp; - lldb::UnwindPlanSP m_unwind_plan_debug_frame_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_assembly_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_object_file_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_eh_frame_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_debug_frame_sp; // augmented by assembly inspection so it's valid everywhere - lldb::UnwindPlanSP m_unwind_plan_object_file_augmented_sp; - lldb::UnwindPlanSP m_unwind_plan_eh_frame_augmented_sp; - lldb::UnwindPlanSP m_unwind_plan_debug_frame_augmented_sp; - - std::vector<lldb::UnwindPlanSP> m_unwind_plan_compact_unwind; - lldb::UnwindPlanSP m_unwind_plan_arm_unwind_sp; - lldb::UnwindPlanSP m_unwind_plan_symbol_file_sp; - lldb::UnwindPlanSP m_unwind_plan_fast_sp; - lldb::UnwindPlanSP m_unwind_plan_arch_default_sp; - lldb::UnwindPlanSP m_unwind_plan_arch_default_at_func_entry_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_object_file_augmented_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_eh_frame_augmented_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_debug_frame_augmented_sp; + + std::vector<std::shared_ptr<const UnwindPlan>> m_unwind_plan_compact_unwind; + std::shared_ptr<const UnwindPlan> m_unwind_plan_arm_unwind_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_symbol_file_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_fast_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_arch_default_sp; + std::shared_ptr<const UnwindPlan> m_unwind_plan_arch_default_at_func_entry_sp; // Fetching the UnwindPlans can be expensive - if we've already attempted to // get one & failed, don't try again. diff --git a/lldb/include/lldb/Symbol/UnwindPlan.h b/lldb/include/lldb/Symbol/UnwindPlan.h index ddc54a9fdc8ae..80517de5a7e9c 100644 --- a/lldb/include/lldb/Symbol/UnwindPlan.h +++ b/lldb/include/lldb/Symbol/UnwindPlan.h @@ -464,7 +464,7 @@ class UnwindPlan { m_return_addr_register = regnum; } - uint32_t GetReturnAddressRegister() { return m_return_addr_register; } + uint32_t GetReturnAddressRegister() const { return m_return_addr_register; } uint32_t GetInitialCFARegister() const { if (m_row_list.empty()) @@ -479,7 +479,7 @@ class UnwindPlan { m_plan_valid_ranges = std::move(ranges); } - bool PlanValidAtAddress(Address addr); + bool PlanValidAtAddress(Address addr) const; bool IsValidRowIndex(uint32_t idx) const; diff --git a/lldb/include/lldb/Target/RegisterContextUnwind.h b/lldb/include/lldb/Target/RegisterContextUnwind.h index 6cd918fedc003..98e25859d4eab 100644 --- a/lldb/include/lldb/Target/RegisterContextUnwind.h +++ b/lldb/include/lldb/Target/RegisterContextUnwind.h @@ -127,7 +127,8 @@ class RegisterContextUnwind : public lldb_private::RegisterContext { /// Check if the given unwind plan indicates a signal trap handler, and /// update frame type and symbol context if so. - void PropagateTrapHandlerFlagFromUnwindPlan(lldb::UnwindPlanSP unwind_plan); + void PropagateTrapHandlerFlagFromUnwindPlan( + std::shared_ptr<const UnwindPlan> unwind_plan); // Provide a location for where THIS function saved the CALLER's register // value @@ -194,16 +195,17 @@ class RegisterContextUnwind : public lldb_private::RegisterContext { const UnwindPlan::Row::FAValue &fa, lldb::addr_t &address); - lldb::UnwindPlanSP GetFastUnwindPlanForFrame(); + std::shared_ptr<const UnwindPlan> GetFastUnwindPlanForFrame(); - lldb::UnwindPlanSP GetFullUnwindPlanForFrame(); + std::shared_ptr<const UnwindPlan> GetFullUnwindPlanForFrame(); void UnwindLogMsg(const char *fmt, ...) __attribute__((format(printf, 2, 3))); void UnwindLogMsgVerbose(const char *fmt, ...) __attribute__((format(printf, 2, 3))); - bool IsUnwindPlanValidForCurrentPC(lldb::UnwindPlanSP unwind_plan_sp); + bool IsUnwindPlanValidForCurrentPC( + std::shared_ptr<const UnwindPlan> unwind_plan_sp); lldb::addr_t GetReturnAddressHint(int32_t plan_offset); @@ -215,9 +217,9 @@ class RegisterContextUnwind : public lldb_private::RegisterContext { // i.e. where THIS frame saved them /// - lldb::UnwindPlanSP m_fast_unwind_plan_sp; // may be NULL - lldb::UnwindPlanSP m_full_unwind_plan_sp; - lldb::UnwindPlanSP m_fallback_unwind_plan_sp; // may be NULL + std::shared_ptr<const UnwindPlan> m_fast_unwind_plan_sp; // may be NULL + std::shared_ptr<const UnwindPlan> m_full_unwind_plan_sp; + std::shared_ptr<const UnwindPlan> m_fallback_unwind_plan_sp; // may be NULL bool m_all_registers_available; // Can we retrieve all regs or just // nonvolatile regs? diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index c77bddb4af061..3f7d3007ed168 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -3641,77 +3641,70 @@ class CommandObjectTargetModulesShowUnwind : public CommandObjectParsed { result.GetOutputStream().Printf("\n"); - UnwindPlanSP non_callsite_unwind_plan = - func_unwinders_sp->GetUnwindPlanAtNonCallSite(*target, *thread); - if (non_callsite_unwind_plan) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetUnwindPlanAtNonCallSite(*target, *thread)) { result.GetOutputStream().Printf( "Asynchronous (not restricted to call-sites) UnwindPlan is '%s'\n", - non_callsite_unwind_plan->GetSourceName().AsCString()); + plan_sp->GetSourceName().AsCString()); } - UnwindPlanSP callsite_unwind_plan = - func_unwinders_sp->GetUnwindPlanAtCallSite(*target, *thread); - if (callsite_unwind_plan) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetUnwindPlanAtCallSite(*target, *thread)) { result.GetOutputStream().Printf( "Synchronous (restricted to call-sites) UnwindPlan is '%s'\n", - callsite_unwind_plan->GetSourceName().AsCString()); + plan_sp->GetSourceName().AsCString()); } - UnwindPlanSP fast_unwind_plan = - func_unwinders_sp->GetUnwindPlanFastUnwind(*target, *thread); - if (fast_unwind_plan) { - result.GetOutputStream().Printf( - "Fast UnwindPlan is '%s'\n", - fast_unwind_plan->GetSourceName().AsCString()); + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetUnwindPlanFastUnwind(*target, *thread)) { + result.GetOutputStream().Printf("Fast UnwindPlan is '%s'\n", + plan_sp->GetSourceName().AsCString()); } result.GetOutputStream().Printf("\n"); - UnwindPlanSP assembly_sp = - func_unwinders_sp->GetAssemblyUnwindPlan(*target, *thread); - if (assembly_sp) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetAssemblyUnwindPlan(*target, *thread)) { result.GetOutputStream().Printf( "Assembly language inspection UnwindPlan:\n"); - assembly_sp->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - UnwindPlanSP of_unwind_sp = - func_unwinders_sp->GetObjectFileUnwindPlan(*target); - if (of_unwind_sp) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetObjectFileUnwindPlan(*target)) { result.GetOutputStream().Printf("object file UnwindPlan:\n"); - of_unwind_sp->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - UnwindPlanSP of_unwind_augmented_sp = - func_unwinders_sp->GetObjectFileAugmentedUnwindPlan(*target, *thread); - if (of_unwind_augmented_sp) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetObjectFileAugmentedUnwindPlan(*target, + *thread)) { result.GetOutputStream().Printf("object file augmented UnwindPlan:\n"); - of_unwind_augmented_sp->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - UnwindPlanSP ehframe_sp = - func_unwinders_sp->GetEHFrameUnwindPlan(*target); - if (ehframe_sp) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetEHFrameUnwindPlan(*target)) { result.GetOutputStream().Printf("eh_frame UnwindPlan:\n"); - ehframe_sp->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - UnwindPlanSP ehframe_augmented_sp = - func_unwinders_sp->GetEHFrameAugmentedUnwindPlan(*target, *thread); - if (ehframe_augmented_sp) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetEHFrameAugmentedUnwindPlan(*target, + *thread)) { result.GetOutputStream().Printf("eh_frame augmented UnwindPlan:\n"); - ehframe_augmented_sp->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - if (UnwindPlanSP plan_sp = + if (std::shared_ptr<const UnwindPlan> plan_sp = func_unwinders_sp->GetDebugFrameUnwindPlan(*target)) { result.GetOutputStream().Printf("debug_frame UnwindPlan:\n"); plan_sp->Dump(result.GetOutputStream(), thread.get(), @@ -3719,7 +3712,7 @@ class CommandObjectTargetModulesShowUnwind : public CommandObjectParsed { result.GetOutputStream().Printf("\n"); } - if (UnwindPlanSP plan_sp = + if (std::shared_ptr<const UnwindPlan> plan_sp = func_unwinders_sp->GetDebugFrameAugmentedUnwindPlan(*target, *thread)) { result.GetOutputStream().Printf("debug_frame augmented UnwindPlan:\n"); @@ -3728,36 +3721,35 @@ class CommandObjectTargetModulesShowUnwind : public CommandObjectParsed { result.GetOutputStream().Printf("\n"); } - UnwindPlanSP arm_unwind_sp = - func_unwinders_sp->GetArmUnwindUnwindPlan(*target); - if (arm_unwind_sp) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetArmUnwindUnwindPlan(*target)) { result.GetOutputStream().Printf("ARM.exidx unwind UnwindPlan:\n"); - arm_unwind_sp->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - if (UnwindPlanSP symfile_plan_sp = + if (std::shared_ptr<const UnwindPlan> plan_sp = func_unwinders_sp->GetSymbolFileUnwindPlan(*thread)) { result.GetOutputStream().Printf("Symbol file UnwindPlan:\n"); - symfile_plan_sp->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - UnwindPlanSP compact_unwind_sp = - func_unwinders_sp->GetCompactUnwindUnwindPlan(*target); - if (compact_unwind_sp) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetCompactUnwindUnwindPlan(*target)) { result.GetOutputStream().Printf("Compact unwind UnwindPlan:\n"); - compact_unwind_sp->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - if (fast_unwind_plan) { + if (std::shared_ptr<const UnwindPlan> plan_sp = + func_unwinders_sp->GetUnwindPlanFastUnwind(*target, *thread)) { result.GetOutputStream().Printf("Fast UnwindPlan:\n"); - fast_unwind_plan->Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } diff --git a/lldb/source/Symbol/FuncUnwinders.cpp b/lldb/source/Symbol/FuncUnwinders.cpp index a5ca7b094c949..a74029d8343c7 100644 --- a/lldb/source/Symbol/FuncUnwinders.cpp +++ b/lldb/source/Symbol/FuncUnwinders.cpp @@ -71,40 +71,47 @@ FuncUnwinders::FuncUnwinders(UnwindTable &unwind_table, Address addr, FuncUnwinders::~FuncUnwinders() = default; -UnwindPlanSP FuncUnwinders::GetUnwindPlanAtCallSite(Target &target, - Thread &thread) { +std::shared_ptr<const UnwindPlan> +FuncUnwinders::GetUnwindPlanAtCallSite(Target &target, Thread &thread) { std::lock_guard<std::recursive_mutex> guard(m_mutex); - if (UnwindPlanSP plan_sp = GetObjectFileUnwindPlan(target)) + if (std::shared_ptr<const UnwindPlan> plan_sp = + GetObjectFileUnwindPlan(target)) return plan_sp; - if (UnwindPlanSP plan_sp = GetSymbolFileUnwindPlan(thread)) + if (std::shared_ptr<const UnwindPlan> plan_sp = + GetSymbolFileUnwindPlan(thread)) return plan_sp; - if (UnwindPlanSP plan_sp = GetDebugFrameUnwindPlan(target)) + if (std::shared_ptr<const UnwindPlan> plan_sp = + GetDebugFrameUnwindPlan(target)) return plan_sp; - if (UnwindPlanSP plan_sp = GetEHFrameUnwindPlan(target)) + if (std::shared_ptr<const UnwindPlan> plan_sp = GetEHFrameUnwindPlan(target)) return plan_sp; - if (UnwindPlanSP plan_sp = GetCompactUnwindUnwindPlan(target)) + if (std::shared_ptr<const UnwindPlan> plan_sp = + GetCompactUnwindUnwindPlan(target)) return plan_sp; - if (UnwindPlanSP plan_sp = GetArmUnwindUnwindPlan(target)) + if (std::shared_ptr<const UnwindPlan> plan_sp = + GetArmUnwindUnwindPlan(target)) return plan_sp; return nullptr; } -UnwindPlanSP FuncUnwinders::GetCompactUnwindUnwindPlan(Target &target) { +std::shared_ptr<const UnwindPlan> +FuncUnwinders::GetCompactUnwindUnwindPlan(Target &target) { std::lock_guard<std::recursive_mutex> guard(m_mutex); if (m_unwind_plan_compact_unwind.size() > 0) return m_unwind_plan_compact_unwind[0]; // FIXME support multiple compact // unwind plans for one func if (m_tried_unwind_plan_compact_unwind) - return UnwindPlanSP(); + return nullptr; m_tried_unwind_plan_compact_unwind = true; if (m_range.GetBaseAddress().IsValid()) { Address current_pc(m_range.GetBaseAddress()); CompactUnwindInfo *compact_unwind = m_unwind_table.GetCompactUnwindInfo(); if (compact_unwind) { - UnwindPlanSP unwind_plan_sp(new UnwindPlan(lldb::eRegisterKindGeneric));... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/133247 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits