Skip to content

Commit c0467ce

Browse files
committed
Don't assume we can restore every register.
We only deal with a limited subset of DWARF registers - namely the "general purpose" registers, or those in the user_regs_struct. for i386/x86_64, that's pretty much the only thing that appears in unwind info - the floating point and SIMD registers are all caller-saved, so the unwind info never includes info about how to restore them on unwind. That is not true for ARM, so we need to be careful when we get instructed to restore a register from a saved blob - we may not have existing state for that register. I have a proper fix for this in the main branch - it revamps the way we handle registers entirely, so we can deal properly with floating point and SIMD registers, but it's not finished, so doing this quick hack for now.
1 parent 5485635 commit c0467ce

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

libpstack/dwarf.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,11 @@ CIE::execInsns(const CallFrame &dframe, uintptr_t start, uintptr_t end, uintmax_
982982
}
983983

984984
case DW_CFA_restore: {
985-
frame.registers[reg] = dframe.registers.at(reg);
985+
// Careful - we may not support every register.
986+
auto regi = dframe.registers.find(reg);
987+
if (regi != dframe.registers.end()) {
988+
frame.registers[reg] = regi->second;
989+
}
986990
break;
987991
}
988992

@@ -1024,10 +1028,14 @@ CIE::execInsns(const CallFrame &dframe, uintptr_t start, uintptr_t end, uintmax_
10241028
break;
10251029
}
10261030

1027-
case DW_CFA_restore_extended:
1031+
case DW_CFA_restore_extended: {
10281032
reg = r.getuleb128();
1029-
frame.registers[reg] = dframe.registers.at(reg);
1033+
auto regi = dframe.registers.find(reg);
1034+
if (regi != dframe.registers.end()) {
1035+
frame.registers[reg] = regi->second;
1036+
}
10301037
break;
1038+
}
10311039

10321040
case DW_CFA_undefined:
10331041
reg = r.getuleb128();

0 commit comments

Comments
 (0)