From b0b4d98804bf28d9afd71919a8800e7c5a13b4e6 Mon Sep 17 00:00:00 2001 From: Gregory LEOCADIE Date: Thu, 15 Dec 2022 20:54:50 +0100 Subject: Add fix for arm and aarch64 --- src/aarch64/Gstash_frame.c | 9 +++++++++ src/arm/Gstash_frame.c | 9 +++++++++ 2 files changed, 18 insertions(+) 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 -- cgit v1.2.1