Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lldb/include/lldb/Symbol/UnwindPlan.h
Original file line number Diff line number Diff line change
Expand Up @@ -463,8 +463,12 @@ class UnwindPlan {
void Dump(Stream &s, Thread *thread, lldb::addr_t base_addr) const;

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

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

// Returns a pointer to the best row for the given offset into the function's
// instructions. If offset is -1 it indicates that the function start is
Expand Down
26 changes: 13 additions & 13 deletions lldb/source/Plugins/ObjectFile/PECOFF/PECallFrameInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ class EHProgramRange {
EHProgramRange(EHProgram::const_iterator begin,
EHProgram::const_iterator end);

std::unique_ptr<UnwindPlan::Row> BuildUnwindPlanRow() const;
UnwindPlan::Row BuildUnwindPlanRow() const;

private:
int32_t GetCFAFrameOffset() const;
Expand All @@ -364,20 +364,20 @@ EHProgramRange::EHProgramRange(EHProgram::const_iterator begin,
EHProgram::const_iterator end)
: m_begin(begin), m_end(end) {}

std::unique_ptr<UnwindPlan::Row> EHProgramRange::BuildUnwindPlanRow() const {
std::unique_ptr<UnwindPlan::Row> row = std::make_unique<UnwindPlan::Row>();
UnwindPlan::Row EHProgramRange::BuildUnwindPlanRow() const {
UnwindPlan::Row row;

if (m_begin != m_end)
row->SetOffset(m_begin->offset);
row.SetOffset(m_begin->offset);

int32_t cfa_frame_offset = GetCFAFrameOffset();

bool frame_pointer_found = false;
for (EHProgram::const_iterator it = m_begin; it != m_end; ++it) {
switch (it->type) {
case EHInstruction::Type::SET_FRAME_POINTER_REGISTER:
row->GetCFAValue().SetIsRegisterPlusOffset(it->reg, cfa_frame_offset -
it->frame_offset);
row.GetCFAValue().SetIsRegisterPlusOffset(it->reg, cfa_frame_offset -
it->frame_offset);
frame_pointer_found = true;
break;
default:
Expand All @@ -387,30 +387,30 @@ std::unique_ptr<UnwindPlan::Row> EHProgramRange::BuildUnwindPlanRow() const {
break;
}
if (!frame_pointer_found)
row->GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64,
cfa_frame_offset);
row.GetCFAValue().SetIsRegisterPlusOffset(lldb_rsp_x86_64,
cfa_frame_offset);

int32_t rsp_frame_offset = 0;
for (EHProgram::const_iterator it = m_begin; it != m_end; ++it) {
switch (it->type) {
case EHInstruction::Type::PUSH_REGISTER:
row->SetRegisterLocationToAtCFAPlusOffset(
row.SetRegisterLocationToAtCFAPlusOffset(
it->reg, rsp_frame_offset - cfa_frame_offset, false);
rsp_frame_offset += it->frame_offset;
break;
case EHInstruction::Type::ALLOCATE:
rsp_frame_offset += it->frame_offset;
break;
case EHInstruction::Type::SAVE_REGISTER:
row->SetRegisterLocationToAtCFAPlusOffset(
row.SetRegisterLocationToAtCFAPlusOffset(
it->reg, it->frame_offset - cfa_frame_offset, false);
break;
default:
break;
}
}

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

return row;
}
Expand Down Expand Up @@ -477,7 +477,7 @@ bool PECallFrameInfo::GetUnwindPlan(const AddressRange &range,
if (!builder.Build())
return false;

std::vector<UnwindPlan::RowSP> rows;
std::vector<UnwindPlan::Row> rows;

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

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

unwind_plan.SetPlanValidAddressRange(AddressRange(
m_object_file.GetAddress(runtime_function->StartAddress),
Expand Down
75 changes: 37 additions & 38 deletions lldb/source/Plugins/Platform/Linux/PlatformLinux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,7 @@ static lldb::UnwindPlanSP GetAArch64TrapHandlerUnwindPlan(ConstString name) {
if (name != "__kernel_rt_sigreturn")
return unwind_plan_sp;

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

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

// Skip fault address
offset += 8;
row->GetCFAValue().SetIsRegisterPlusOffset(arm64_dwarf::sp, offset);

row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x0, 0 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x1, 1 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x2, 2 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x3, 3 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x4, 4 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x5, 5 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x6, 6 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x7, 7 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x8, 8 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x9, 9 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x10, 10 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x11, 11 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x12, 12 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x13, 13 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x14, 14 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x15, 15 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x16, 16 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x17, 17 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x18, 18 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x19, 19 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x20, 20 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x21, 21 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x22, 22 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x23, 23 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x24, 24 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x25, 25 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x26, 26 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x27, 27 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x28, 28 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::fp, 29 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x30, 30 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::sp, 31 * 8, false);
row->SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::pc, 32 * 8, false);
row.GetCFAValue().SetIsRegisterPlusOffset(arm64_dwarf::sp, offset);

row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x0, 0 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x1, 1 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x2, 2 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x3, 3 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x4, 4 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x5, 5 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x6, 6 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x7, 7 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x8, 8 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x9, 9 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x10, 10 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x11, 11 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x12, 12 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x13, 13 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x14, 14 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x15, 15 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x16, 16 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x17, 17 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x18, 18 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x19, 19 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x20, 20 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x21, 21 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x22, 22 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x23, 23 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x24, 24 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x25, 25 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x26, 26 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x27, 27 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x28, 28 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::fp, 29 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::x30, 30 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::sp, 31 * 8, false);
row.SetRegisterLocationToAtCFAPlusOffset(arm64_dwarf::pc, 32 * 8, false);

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

unwind_plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
unwind_plan_sp->AppendRow(row);
unwind_plan_sp->AppendRow(std::move(row));
unwind_plan_sp->SetSourceName("AArch64 Linux sigcontext");
unwind_plan_sp->SetSourcedFromCompiler(eLazyBoolYes);
// Because sp is the same throughout the function
Expand Down
27 changes: 12 additions & 15 deletions lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -660,23 +660,21 @@ SymbolFileBreakpad::ParseCFIUnwindPlan(const Bookmark &bookmark,
AddressRange(base + init_record->Address, *init_record->Size,
m_objfile_sp->GetModule()->GetSectionList()));

auto row_sp = std::make_shared<UnwindPlan::Row>();
row_sp->SetOffset(0);
if (!ParseCFIUnwindRow(init_record->UnwindRules, resolver, *row_sp))
UnwindPlan::Row row;
if (!ParseCFIUnwindRow(init_record->UnwindRules, resolver, row))
return nullptr;
plan_sp->AppendRow(row_sp);
plan_sp->AppendRow(row);
for (++It; It != End; ++It) {
std::optional<StackCFIRecord> record = StackCFIRecord::parse(*It);
if (!record)
return nullptr;
if (record->Size)
break;

row_sp = std::make_shared<UnwindPlan::Row>(*row_sp);
row_sp->SetOffset(record->Address - init_record->Address);
if (!ParseCFIUnwindRow(record->UnwindRules, resolver, *row_sp))
row.SetOffset(record->Address - init_record->Address);
if (!ParseCFIUnwindRow(record->UnwindRules, resolver, row))
return nullptr;
plan_sp->AppendRow(row_sp);
plan_sp->AppendRow(row);
}
return plan_sp;
}
Expand All @@ -702,8 +700,7 @@ SymbolFileBreakpad::ParseWinUnwindPlan(const Bookmark &bookmark,
AddressRange(base + record->RVA, record->CodeSize,
m_objfile_sp->GetModule()->GetSectionList()));

auto row_sp = std::make_shared<UnwindPlan::Row>();
row_sp->SetOffset(0);
UnwindPlan::Row row;

llvm::BumpPtrAllocator node_alloc;
std::vector<std::pair<llvm::StringRef, postfix::Node *>> program =
Expand Down Expand Up @@ -732,16 +729,16 @@ SymbolFileBreakpad::ParseWinUnwindPlan(const Bookmark &bookmark,
// clang will use T1, if it needs to realign the stack.
auto *symbol = llvm::dyn_cast<postfix::SymbolNode>(it->second);
if (symbol && symbol->GetName() == ".raSearch") {
row_sp->GetCFAValue().SetRaSearch(record->LocalSize +
record->SavedRegisterSize);
row.GetCFAValue().SetRaSearch(record->LocalSize +
record->SavedRegisterSize);
} else {
if (!postfix::ResolveSymbols(it->second, symbol_resolver)) {
LLDB_LOG(log, "Resolving symbols in `{0}` failed.",
record->ProgramString);
return nullptr;
}
llvm::ArrayRef<uint8_t> saved = SaveAsDWARF(*it->second);
row_sp->GetCFAValue().SetIsDWARFExpression(saved.data(), saved.size());
row.GetCFAValue().SetIsDWARFExpression(saved.data(), saved.size());
}

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

plan_sp->AppendRow(row_sp);
plan_sp->AppendRow(std::move(row));
return plan_sp;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,8 @@ bool UnwindAssemblyInstEmulation::GetNonCallSiteUnwindPlanFromAssembly(
}
}
for (auto &[_, state] : saved_unwind_states) {
unwind_plan.InsertRow(
std::make_shared<UnwindPlan::Row>(std::move(state.row)),
/*replace_existing=*/true);
unwind_plan.InsertRow(std::move(state.row),
/*replace_existing=*/true);
}
}

Expand Down
Loading