[Lldb-commits] [lldb] 48864a5 - Revert "[lldb] Remove UnwindPlan::Row shared_ptrs (#132370)" (#133299)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Mar 27 12:20:10 PDT 2025
Author: Jordan Rupprecht
Date: 2025-03-27T14:20:07-05:00
New Revision: 48864a52ef547ac0477271127b510dd9e9798219
URL: https://github.com/llvm/llvm-project/commit/48864a52ef547ac0477271127b510dd9e9798219
DIFF: https://github.com/llvm/llvm-project/commit/48864a52ef547ac0477271127b510dd9e9798219.diff
LOG: Revert "[lldb] Remove UnwindPlan::Row shared_ptrs (#132370)" (#133299)
This reverts commit d7cea2b18717f0cc31b7da4a03f772d89ee201db. It causes
crashes in API tests.
Added:
Modified:
lldb/include/lldb/Symbol/UnwindPlan.h
lldb/source/Symbol/UnwindPlan.cpp
Removed:
################################################################################
diff --git a/lldb/include/lldb/Symbol/UnwindPlan.h b/lldb/include/lldb/Symbol/UnwindPlan.h
index ddc54a9fdc8ae..db9aade93b6ba 100644
--- a/lldb/include/lldb/Symbol/UnwindPlan.h
+++ b/lldb/include/lldb/Symbol/UnwindPlan.h
@@ -428,6 +428,8 @@ class UnwindPlan {
bool m_unspecified_registers_are_undefined = false;
}; // class Row
+ typedef std::shared_ptr<Row> RowSP;
+
UnwindPlan(lldb::RegisterKind reg_kind)
: m_register_kind(reg_kind), m_return_addr_register(LLDB_INVALID_REGNUM),
m_plan_is_sourced_from_compiler(eLazyBoolCalculate),
@@ -435,10 +437,25 @@ class UnwindPlan {
m_plan_is_for_signal_trap(eLazyBoolCalculate) {}
// Performs a deep copy of the plan, including all the rows (expensive).
- UnwindPlan(const UnwindPlan &rhs) = default;
- UnwindPlan &operator=(const UnwindPlan &rhs) = default;
-
+ UnwindPlan(const UnwindPlan &rhs)
+ : m_plan_valid_ranges(rhs.m_plan_valid_ranges),
+ m_register_kind(rhs.m_register_kind),
+ m_return_addr_register(rhs.m_return_addr_register),
+ m_source_name(rhs.m_source_name),
+ m_plan_is_sourced_from_compiler(rhs.m_plan_is_sourced_from_compiler),
+ m_plan_is_valid_at_all_instruction_locations(
+ rhs.m_plan_is_valid_at_all_instruction_locations),
+ m_plan_is_for_signal_trap(rhs.m_plan_is_for_signal_trap),
+ m_lsda_address(rhs.m_lsda_address),
+ m_personality_func_addr(rhs.m_personality_func_addr) {
+ m_row_list.reserve(rhs.m_row_list.size());
+ for (const RowSP &row_sp : rhs.m_row_list)
+ m_row_list.emplace_back(new Row(*row_sp));
+ }
UnwindPlan(UnwindPlan &&rhs) = default;
+ UnwindPlan &operator=(const UnwindPlan &rhs) {
+ return *this = UnwindPlan(rhs); // NB: moving from a temporary (deep) copy
+ }
UnwindPlan &operator=(UnwindPlan &&) = default;
~UnwindPlan() = default;
@@ -469,7 +486,7 @@ class UnwindPlan {
uint32_t GetInitialCFARegister() const {
if (m_row_list.empty())
return LLDB_INVALID_REGNUM;
- return m_row_list.front().GetCFAValue().GetRegisterNumber();
+ return m_row_list.front()->GetCFAValue().GetRegisterNumber();
}
// This UnwindPlan may not be valid at every address of the function span.
@@ -552,7 +569,7 @@ class UnwindPlan {
}
private:
- std::vector<Row> m_row_list;
+ std::vector<RowSP> m_row_list;
std::vector<AddressRange> m_plan_valid_ranges;
lldb::RegisterKind m_register_kind; // The RegisterKind these register numbers
// are in terms of - will need to be
diff --git a/lldb/source/Symbol/UnwindPlan.cpp b/lldb/source/Symbol/UnwindPlan.cpp
index 92daf29630ab6..48089cbdecd97 100644
--- a/lldb/source/Symbol/UnwindPlan.cpp
+++ b/lldb/source/Symbol/UnwindPlan.cpp
@@ -391,29 +391,29 @@ bool UnwindPlan::Row::operator==(const UnwindPlan::Row &rhs) const {
}
void UnwindPlan::AppendRow(Row row) {
- if (m_row_list.empty() || m_row_list.back().GetOffset() != row.GetOffset())
- m_row_list.push_back(std::move(row));
+ if (m_row_list.empty() || m_row_list.back()->GetOffset() != row.GetOffset())
+ m_row_list.push_back(std::make_shared<Row>(std::move(row)));
else
- m_row_list.back() = std::move(row);
+ *m_row_list.back() = std::move(row);
}
struct RowLess {
- bool operator()(addr_t a, const UnwindPlan::Row &b) const {
- return a < b.GetOffset();
+ bool operator()(addr_t a, const UnwindPlan::RowSP &b) const {
+ return a < b->GetOffset();
}
- bool operator()(const UnwindPlan::Row &a, addr_t b) const {
- return a.GetOffset() < b;
+ bool operator()(const UnwindPlan::RowSP &a, addr_t b) const {
+ return a->GetOffset() < b;
}
};
void UnwindPlan::InsertRow(Row row, bool replace_existing) {
auto it = llvm::lower_bound(m_row_list, row.GetOffset(), RowLess());
- if (it == m_row_list.end() || it->GetOffset() > row.GetOffset())
- m_row_list.insert(it, std::move(row));
+ if (it == m_row_list.end() || it->get()->GetOffset() > row.GetOffset())
+ m_row_list.insert(it, std::make_shared<Row>(std::move(row)));
else {
- assert(it->GetOffset() == row.GetOffset());
+ assert(it->get()->GetOffset() == row.GetOffset());
if (replace_existing)
- *it = std::move(row);
+ **it = std::move(row);
}
}
@@ -424,7 +424,7 @@ const UnwindPlan::Row *UnwindPlan::GetRowForFunctionOffset(int offset) const {
return nullptr;
// upper_bound returns the row strictly greater than our desired offset, which
// means that the row before it is a match.
- return &*std::prev(it);
+ return std::prev(it)->get();
}
bool UnwindPlan::IsValidRowIndex(uint32_t idx) const {
@@ -433,7 +433,7 @@ bool UnwindPlan::IsValidRowIndex(uint32_t idx) const {
const UnwindPlan::Row *UnwindPlan::GetRowAtIndex(uint32_t idx) const {
if (idx < m_row_list.size())
- return &m_row_list[idx];
+ return m_row_list[idx].get();
LLDB_LOG(GetLog(LLDBLog::Unwind),
"error: UnwindPlan::GetRowAtIndex(idx = {0}) invalid index "
"(number rows is {1})",
@@ -447,7 +447,7 @@ const UnwindPlan::Row *UnwindPlan::GetLastRow() const {
"UnwindPlan::GetLastRow() when rows are empty");
return nullptr;
}
- return &m_row_list.back();
+ return m_row_list.back().get();
}
bool UnwindPlan::PlanValidAtAddress(Address addr) {
@@ -566,9 +566,9 @@ void UnwindPlan::Dump(Stream &s, Thread *thread, lldb::addr_t base_addr) const {
range.Dump(&s, target_sp.get(), Address::DumpStyleSectionNameOffset);
s.EOL();
}
- for (const auto &[index, row] : llvm::enumerate(m_row_list)) {
+ for (const auto &[index, row_sp] : llvm::enumerate(m_row_list)) {
s.Format("row[{0}]: ", index);
- row.Dump(s, this, thread, base_addr);
+ row_sp->Dump(s, this, thread, base_addr);
s << "\n";
}
}
More information about the lldb-commits
mailing list