Skip to content

Commit 571e4de

Browse files
authored
[lldb] Use UnwindPlan::Row as values (#131150)
In most places, the rows are copied anyway (because they are generated by cumulating modifications) immediately after adding them to the unwind plans. In others, they can be moved into the unwind plan. This lets us remove some backflip copies and make `const UnwindPlan` actually mean something. I've split this patch into two (and temporarily left both APIs) as this patch was getting a bit big. This patch covers all the interesting cases. Part two all about converting "architecture default" unwind plans from ABI and InstructionEmulation plugins.
1 parent 6db2594 commit 571e4de

File tree

10 files changed

+306
-404
lines changed

10 files changed

+306
-404
lines changed

lldb/include/lldb/Symbol/UnwindPlan.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,8 +463,12 @@ class UnwindPlan {
463463
void Dump(Stream &s, Thread *thread, lldb::addr_t base_addr) const;
464464

465465
void AppendRow(const RowSP &row_sp);
466+
void AppendRow(Row row) { AppendRow(std::make_shared<Row>(std::move(row))); }
466467

467468
void InsertRow(const RowSP &row_sp, bool replace_existing = false);
469+
void InsertRow(Row row, bool replace_existing = false) {
470+
InsertRow(std::make_shared<Row>(std::move(row)), replace_existing);
471+
}
468472

469473
// Returns a pointer to the best row for the given offset into the function's
470474
// instructions. If offset is -1 it indicates that the function start is

lldb/source/Plugins/ObjectFile/PECOFF/PECallFrameInfo.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ class EHProgramRange {
351351
EHProgramRange(EHProgram::const_iterator begin,
352352
EHProgram::const_iterator end);
353353

354-
std::unique_ptr<UnwindPlan::Row> BuildUnwindPlanRow() const;
354+
UnwindPlan::Row BuildUnwindPlanRow() const;
355355

356356
private:
357357
int32_t GetCFAFrameOffset() const;
@@ -364,20 +364,20 @@ EHProgramRange::EHProgramRange(EHProgram::const_iterator begin,
364364
EHProgram::const_iterator end)
365365
: m_begin(begin), m_end(end) {}
366366

367-
std::unique_ptr<UnwindPlan::Row> EHProgramRange::BuildUnwindPlanRow() const {
368-
std::unique_ptr<UnwindPlan::Row> row = std::make_unique<UnwindPlan::Row>();
367+
UnwindPlan::Row EHProgramRange::BuildUnwindPlanRow() const {
368+
UnwindPlan::Row row;
369369

370370
if (m_begin != m_end)
371-
row->SetOffset(m_begin->offset);
371+
row.SetOffset(m_begin->offset);
372372

373373
int32_t cfa_frame_offset = GetCFAFrameOffset();
374374

375375
bool frame_pointer_found = false;
376376
for (EHProgram::const_iterator it = m_begin; it != m_end; ++it) {
377377
switch (it->type) {
378378
case EHInstruction::Type::SET_FRAME_POINTER_REGISTER:
379-
row->GetCFAValue().SetIsRegisterPlusOffset(it->reg, cfa_frame_offset -
380-
it->frame_offset);
379+
row.GetCFAValue().SetIsRegisterPlusOffset(it->reg, cfa_frame_offset -
380+
it->frame_offset);
381381
frame_pointer_found = true;
382382
break;
383383
default:
@@ -387,30 +387,30 @@ std::unique_ptr<UnwindPlan::Row> EHProgramRange::BuildUnwindPlanRow() const {
387387
break;
388388
}
389389
if (!frame_pointer_found)
390-
row->GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64,
391-
cfa_frame_offset);
390+
row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64,
391+
cfa_frame_offset);
392392

393393
int32_t rsp_frame_offset = 0;
394394
for (EHProgram::const_iterator it = m_begin; it != m_end; ++it) {
395395
switch (it->type) {
396396
case EHInstruction::Type::PUSH_REGISTER:
397-
row->SetRegisterLocationToAtCFAPlusOffset(
397+
row.SetRegisterLocationToAtCFAPlusOffset(
398398
it->reg, rsp_frame_offset - cfa_frame_offset, false);
399399
rsp_frame_offset += it->frame_offset;
400400
break;
401401
case EHInstruction::Type::ALLOCATE:
402402
rsp_frame_offset += it->frame_offset;
403403
break;
404404
case EHInstruction::Type::SAVE_REGISTER:
405-
row->SetRegisterLocationToAtCFAPlusOffset(
405+
row.SetRegisterLocationToAtCFAPlusOffset(
406406
it->reg, it->frame_offset - cfa_frame_offset, false);
407407
break;
408408
default:
409409
break;
410410
}
411411
}
412412

413-
row->SetRegisterLocationToIsCFAPlusOffset(lldb_rsp_x86_64, 0, false);
413+
row.SetRegisterLocationToIsCFAPlusOffset(lldb_rsp_x86_64, 0, false);
414414

415415
return row;
416416
}
@@ -477,7 +477,7 @@ bool PECallFrameInfo::GetUnwindPlan(const AddressRange &range,
477477
if (!builder.Build())
478478
return false;
479479

480-
std::vector<UnwindPlan::RowSP> rows;
480+
std::vector<UnwindPlan::Row> rows;
481481

482482
uint32_t last_offset = UINT32_MAX;
483483
for (auto it = builder.GetProgram().begin(); it != builder.GetProgram().end();
@@ -493,7 +493,7 @@ bool PECallFrameInfo::GetUnwindPlan(const AddressRange &range,
493493
}
494494

495495
for (auto it = rows.rbegin(); it != rows.rend(); ++it)
496-
unwind_plan.AppendRow(*it);
496+
unwind_plan.AppendRow(std::move(*it));
497497

498498
unwind_plan.SetPlanValidAddressRange(AddressRange(
499499
m_object_file.GetAddress(runtime_function->StartAddress),

lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,7 @@ static lldb::UnwindPlanSP GetAArch64TrapHandlerUnwindPlan(ConstString name) {
210210
if (name != "__kernel_rt_sigreturn")
211211
return unwind_plan_sp;
212212

213-
UnwindPlan::RowSP row = std::make_shared<UnwindPlan::Row>();
214-
row->SetOffset(0);
213+
UnwindPlan::Row row;
215214

216215
// In the signal trampoline frame, sp points to an rt_sigframe[1], which is:
217216
// - 128-byte siginfo struct
@@ -235,48 +234,48 @@ static lldb::UnwindPlanSP GetAArch64TrapHandlerUnwindPlan(ConstString name) {
235234

236235
// Skip fault address
237236
offset += 8;
238-
row->GetCFAValue().SetIsRegisterPlusOffset(arm64_dwarf::sp, offset);
239-
240-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x0, 0 * 8, false);
241-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x1, 1 * 8, false);
242-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x2, 2 * 8, false);
243-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x3, 3 * 8, false);
244-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x4, 4 * 8, false);
245-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x5, 5 * 8, false);
246-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x6, 6 * 8, false);
247-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x7, 7 * 8, false);
248-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x8, 8 * 8, false);
249-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x9, 9 * 8, false);
250-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x10, 10 * 8, false);
251-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x11, 11 * 8, false);
252-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x12, 12 * 8, false);
253-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x13, 13 * 8, false);
254-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x14, 14 * 8, false);
255-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x15, 15 * 8, false);
256-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x16, 16 * 8, false);
257-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x17, 17 * 8, false);
258-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x18, 18 * 8, false);
259-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x19, 19 * 8, false);
260-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x20, 20 * 8, false);
261-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x21, 21 * 8, false);
262-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x22, 22 * 8, false);
263-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x23, 23 * 8, false);
264-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x24, 24 * 8, false);
265-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x25, 25 * 8, false);
266-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x26, 26 * 8, false);
267-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x27, 27 * 8, false);
268-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x28, 28 * 8, false);
269-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::fp, 29 * 8, false);
270-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x30, 30 * 8, false);
271-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::sp, 31 * 8, false);
272-
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::pc, 32 * 8, false);
237+
row.GetCFAValue().SetIsRegisterPlusOffset(arm64_dwarf::sp, offset);
238+
239+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x0, 0 * 8, false);
240+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x1, 1 * 8, false);
241+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x2, 2 * 8, false);
242+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x3, 3 * 8, false);
243+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x4, 4 * 8, false);
244+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x5, 5 * 8, false);
245+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x6, 6 * 8, false);
246+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x7, 7 * 8, false);
247+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x8, 8 * 8, false);
248+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x9, 9 * 8, false);
249+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x10, 10 * 8, false);
250+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x11, 11 * 8, false);
251+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x12, 12 * 8, false);
252+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x13, 13 * 8, false);
253+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x14, 14 * 8, false);
254+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x15, 15 * 8, false);
255+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x16, 16 * 8, false);
256+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x17, 17 * 8, false);
257+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x18, 18 * 8, false);
258+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x19, 19 * 8, false);
259+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x20, 20 * 8, false);
260+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x21, 21 * 8, false);
261+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x22, 22 * 8, false);
262+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x23, 23 * 8, false);
263+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x24, 24 * 8, false);
264+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x25, 25 * 8, false);
265+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x26, 26 * 8, false);
266+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x27, 27 * 8, false);
267+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x28, 28 * 8, false);
268+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::fp, 29 * 8, false);
269+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x30, 30 * 8, false);
270+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::sp, 31 * 8, false);
271+
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::pc, 32 * 8, false);
273272

274273
// The sigcontext may also contain floating point and SVE registers.
275274
// However this would require a dynamic unwind plan so they are not included
276275
// here.
277276

278277
unwind_plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
279-
unwind_plan_sp->AppendRow(row);
278+
unwind_plan_sp->AppendRow(std::move(row));
280279
unwind_plan_sp->SetSourceName("AArch64 Linux sigcontext");
281280
unwind_plan_sp->SetSourcedFromCompiler(eLazyBoolYes);
282281
// Because sp is the same throughout the function

lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -660,23 +660,21 @@ SymbolFileBreakpad::ParseCFIUnwindPlan(const Bookmark &bookmark,
660660
AddressRange(base + init_record->Address, *init_record->Size,
661661
m_objfile_sp->GetModule()->GetSectionList()));
662662

663-
auto row_sp = std::make_shared<UnwindPlan::Row>();
664-
row_sp->SetOffset(0);
665-
if (!ParseCFIUnwindRow(init_record->UnwindRules, resolver, *row_sp))
663+
UnwindPlan::Row row;
664+
if (!ParseCFIUnwindRow(init_record->UnwindRules, resolver, row))
666665
return nullptr;
667-
plan_sp->AppendRow(row_sp);
666+
plan_sp->AppendRow(row);
668667
for (++It; It != End; ++It) {
669668
std::optional<StackCFIRecord> record = StackCFIRecord::parse(*It);
670669
if (!record)
671670
return nullptr;
672671
if (record->Size)
673672
break;
674673

675-
row_sp = std::make_shared<UnwindPlan::Row>(*row_sp);
676-
row_sp->SetOffset(record->Address - init_record->Address);
677-
if (!ParseCFIUnwindRow(record->UnwindRules, resolver, *row_sp))
674+
row.SetOffset(record->Address - init_record->Address);
675+
if (!ParseCFIUnwindRow(record->UnwindRules, resolver, row))
678676
return nullptr;
679-
plan_sp->AppendRow(row_sp);
677+
plan_sp->AppendRow(row);
680678
}
681679
return plan_sp;
682680
}
@@ -702,8 +700,7 @@ SymbolFileBreakpad::ParseWinUnwindPlan(const Bookmark &bookmark,
702700
AddressRange(base + record->RVA, record->CodeSize,
703701
m_objfile_sp->GetModule()->GetSectionList()));
704702

705-
auto row_sp = std::make_shared<UnwindPlan::Row>();
706-
row_sp->SetOffset(0);
703+
UnwindPlan::Row row;
707704

708705
llvm::BumpPtrAllocator node_alloc;
709706
std::vector<std::pair<llvm::StringRef, postfix::Node *>> program =
@@ -732,16 +729,16 @@ SymbolFileBreakpad::ParseWinUnwindPlan(const Bookmark &bookmark,
732729
// clang will use T1, if it needs to realign the stack.
733730
auto *symbol = llvm::dyn_cast<postfix::SymbolNode>(it->second);
734731
if (symbol && symbol->GetName() == ".raSearch") {
735-
row_sp->GetCFAValue().SetRaSearch(record->LocalSize +
736-
record->SavedRegisterSize);
732+
row.GetCFAValue().SetRaSearch(record->LocalSize +
733+
record->SavedRegisterSize);
737734
} else {
738735
if (!postfix::ResolveSymbols(it->second, symbol_resolver)) {
739736
LLDB_LOG(log, "Resolving symbols in `{0}` failed.",
740737
record->ProgramString);
741738
return nullptr;
742739
}
743740
llvm::ArrayRef<uint8_t> saved = SaveAsDWARF(*it->second);
744-
row_sp->GetCFAValue().SetIsDWARFExpression(saved.data(), saved.size());
741+
row.GetCFAValue().SetIsDWARFExpression(saved.data(), saved.size());
745742
}
746743

747744
// Replace the node value with InitialValueNode, so that subsequent
@@ -766,10 +763,10 @@ SymbolFileBreakpad::ParseWinUnwindPlan(const Bookmark &bookmark,
766763
llvm::ArrayRef<uint8_t> saved = SaveAsDWARF(*it->second);
767764
UnwindPlan::Row::AbstractRegisterLocation loc;
768765
loc.SetIsDWARFExpression(saved.data(), saved.size());
769-
row_sp->SetRegisterInfo(info->kinds[eRegisterKindLLDB], loc);
766+
row.SetRegisterInfo(info->kinds[eRegisterKindLLDB], loc);
770767
}
771768

772-
plan_sp->AppendRow(row_sp);
769+
plan_sp->AppendRow(std::move(row));
773770
return plan_sp;
774771
}
775772

lldb/source/Plugins/UnwindAssembly/InstEmulation/UnwindAssemblyInstEmulation.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,8 @@ bool UnwindAssemblyInstEmulation::GetNonCallSiteUnwindPlanFromAssembly(
209209
}
210210
}
211211
for (auto &[_, state] : saved_unwind_states) {
212-
unwind_plan.InsertRow(
213-
std::make_shared<UnwindPlan::Row>(std::move(state.row)),
214-
/*replace_existing=*/true);
212+
unwind_plan.InsertRow(std::move(state.row),
213+
/*replace_existing=*/true);
215214
}
216215
}
217216

0 commit comments

Comments
 (0)