summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory LEOCADIE <gregory.leocadie@datadoghq.com>2022-12-15 20:54:50 +0100
committerDave Watson <dade.watson@gmail.com>2022-12-28 09:38:29 -0800
commitb0b4d98804bf28d9afd71919a8800e7c5a13b4e6 (patch)
tree6d80ea46e54c6f5edfe31918d9394f1b0fa07617
parent5fed3c67c3016cad0b34051106f7d259f95489b0 (diff)
downloadlibunwind-b0b4d98804bf28d9afd71919a8800e7c5a13b4e6.tar.gz
Add fix for arm and aarch64
-rw-r--r--src/aarch64/Gstash_frame.c9
-rw-r--r--src/arm/Gstash_frame.c9
2 files changed, 18 insertions, 0 deletions
diff --git a/src/aarch64/Gstash_frame.c b/src/aarch64/Gstash_frame.c
index 6689af1a..c6f370a4 100644
--- a/src/aarch64/Gstash_frame.c
+++ b/src/aarch64/Gstash_frame.c
@@ -58,16 +58,19 @@ tdep_stash_frame (struct dwarf_cursor *d, struct dwarf_reg_state *rs)
&& rs->ret_addr_column == LR
&& (rs->reg.where[FP] == DWARF_WHERE_UNDEF
|| rs->reg.where[FP] == DWARF_WHERE_SAME
+ || rs->reg.where[FP] == DWARF_WHERE_CFA
|| (rs->reg.where[FP] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[FP]) < (1 << 29)
&& rs->reg.val[FP]+1 != 0))
&& (rs->reg.where[LR] == DWARF_WHERE_UNDEF
|| rs->reg.where[LR] == DWARF_WHERE_SAME
+ || rs->reg.where[LR] == DWARF_WHERE_CFA
|| (rs->reg.where[LR] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[LR]) < (1 << 29)
&& rs->reg.val[LR]+1 != 0))
&& (rs->reg.where[SP] == DWARF_WHERE_UNDEF
|| rs->reg.where[SP] == DWARF_WHERE_SAME
+ || rs->reg.where[SP] == DWARF_WHERE_CFA
|| (rs->reg.where[SP] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[SP]) < (1 << 29)
&& rs->reg.val[SP]+1 != 0)))
@@ -82,6 +85,12 @@ tdep_stash_frame (struct dwarf_cursor *d, struct dwarf_reg_state *rs)
f->lr_cfa_offset = rs->reg.val[LR];
if (rs->reg.where[SP] == DWARF_WHERE_CFAREL)
f->sp_cfa_offset = rs->reg.val[SP];
+ if (rs->reg.where[FP] == DWARF_WHERE_CFA)
+ f->fp_cfa_offset = 0;
+ if (rs->reg.where[LR] == DWARF_WHERE_CFA)
+ f->lr_cfa_offset = 0;
+ if (rs->reg.where[SP] == DWARF_WHERE_CFA)
+ f->sp_cfa_offset = 0;
Debug (4, " standard frame\n");
}
else
diff --git a/src/arm/Gstash_frame.c b/src/arm/Gstash_frame.c
index c5a76b86..a30d24cf 100644
--- a/src/arm/Gstash_frame.c
+++ b/src/arm/Gstash_frame.c
@@ -58,16 +58,19 @@ tdep_stash_frame (struct dwarf_cursor *d, struct dwarf_reg_state *rs)
&& rs->ret_addr_column == LR
&& (rs->reg.where[R7] == DWARF_WHERE_UNDEF
|| rs->reg.where[R7] == DWARF_WHERE_SAME
+ || rs->reg.where[R7] == DWARF_WHERE_CFA
|| (rs->reg.where[R7] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[R7]) < (1 << 29)
&& rs->reg.val[R7]+1 != 0))
&& (rs->reg.where[LR] == DWARF_WHERE_UNDEF
|| rs->reg.where[LR] == DWARF_WHERE_SAME
+ || rs->reg.where[R7] == DWARF_WHERE_CFA
|| (rs->reg.where[LR] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[LR]) < (1 << 29)
&& rs->reg.val[LR]+1 != 0))
&& (rs->reg.where[SP] == DWARF_WHERE_UNDEF
|| rs->reg.where[SP] == DWARF_WHERE_SAME
+ || rs->reg.where[SP] == DWARF_WHERE_CFA
|| (rs->reg.where[SP] == DWARF_WHERE_CFAREL
&& labs(rs->reg.val[SP]) < (1 << 29)
&& rs->reg.val[SP]+1 != 0)))
@@ -82,6 +85,12 @@ tdep_stash_frame (struct dwarf_cursor *d, struct dwarf_reg_state *rs)
f->lr_cfa_offset = rs->reg.val[LR];
if (rs->reg.where[SP] == DWARF_WHERE_CFAREL)
f->sp_cfa_offset = rs->reg.val[SP];
+ if (rs->reg.where[R7] == DWARF_WHERE_CFA)
+ f->r7_cfa_offset = 0;
+ if (rs->reg.where[LR] == DWARF_WHERE_CFA)
+ f->lr_cfa_offset = 0;
+ if (rs->reg.where[SP] == DWARF_WHERE_CFA)
+ f->sp_cfa_offset = 0;
Debug (4, " standard frame\n");
}
else