Skip to content

Commit b1afb8e

Browse files
kolerovShahab Vahedi
authored andcommitted
arc64: gdb: Fix an order of registers for ENTER
ENTER in ARCv3 stores different registers and in a different order rather than ARCv2's variant: 1. R14-R27 instead of R13-R26. 2. FP is stored last. Stack unwinder relies on that information while handling ENTER. Note that this patch does not add support of floating point registers for ENTER. Signed-off-by: Yuriy Kolerov <kolerov93@gmail.com>
1 parent 300cac9 commit b1afb8e

File tree

2 files changed

+15
-16
lines changed

2 files changed

+15
-16
lines changed

gdb/arc64-tdep.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,15 +1189,15 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn,
11891189
registers according to given arguments thus greatly reducing code
11901190
size. Which registers will be actually saved depends on arguments.
11911191
1192-
ENTER_S {R13-...,FP,BLINK} stores registers in following order:
1192+
ENTER_S {R14-...,FP,BLINK} stores registers in following order:
11931193
11941194
new SP ->
1195+
FP
11951196
BLINK
1196-
R13
11971197
R14
11981198
R15
1199+
R16
11991200
...
1200-
FP
12011201
old SP ->
12021202
12031203
There are up to three arguments for this opcode, as presented by ARC
@@ -1239,14 +1239,8 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn,
12391239
/* Current store address. */
12401240
pv_t addr = regs[ARC_SP_REGNUM];
12411241

1242-
if (is_fp_saved)
1243-
{
1244-
addr = pv_add_constant (addr, -reg_size);
1245-
stack->store (addr, reg_size, regs[ARC_FP_REGNUM]);
1246-
}
1247-
1248-
/* Registers are stored in backward order: from GP (R26) to R13. */
1249-
for (int i = ARC_R13_REGNUM + regs_saved - 1; i >= ARC_R13_REGNUM; i--)
1242+
/* Registers are stored in backward order: from GP (R27) to R14. */
1243+
for (int i = ARC_R14_REGNUM + regs_saved - 1; i >= ARC_R14_REGNUM; i--)
12501244
{
12511245
addr = pv_add_constant (addr, -reg_size);
12521246
stack->store (addr, reg_size, regs[i]);
@@ -1259,6 +1253,12 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn,
12591253
regs[ARC_BLINK_REGNUM]);
12601254
}
12611255

1256+
if (is_fp_saved)
1257+
{
1258+
addr = pv_add_constant (addr, -reg_size);
1259+
stack->store (addr, reg_size, regs[ARC_FP_REGNUM]);
1260+
}
1261+
12621262
gdb_assert (pv_is_identical (addr, new_sp));
12631263

12641264
regs[ARC_SP_REGNUM] = new_sp;

gdb/arc64-tdep.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,10 @@ enum arc_regnum
4040
ARC_R4_REGNUM = 4,
4141
ARC_R7_REGNUM = 7,
4242
ARC_R9_REGNUM = 9,
43-
ARC_R13_REGNUM = 13,
43+
ARC_R14_REGNUM = 14,
4444
ARC_R16_REGNUM = 16,
45-
ARC_R26_REGNUM = 26,
4645
/* Frame pointer. */
47-
ARC_FP_REGNUM,
46+
ARC_FP_REGNUM = 27,
4847
/* Stack pointer. */
4948
ARC_SP_REGNUM,
5049
/* Return address from interrupt. */
@@ -92,8 +91,8 @@ enum arc_regnum
9291
/* Additional ABI constants. */
9392
ARC_FIRST_ARG_REGNUM = ARC_R0_REGNUM,
9493
ARC_LAST_ARG_REGNUM = ARC_R7_REGNUM,
95-
ARC_FIRST_CALLEE_SAVED_REGNUM = ARC_R13_REGNUM,
96-
ARC_LAST_CALLEE_SAVED_REGNUM = ARC_R26_REGNUM
94+
ARC_FIRST_CALLEE_SAVED_REGNUM = ARC_R14_REGNUM,
95+
ARC_LAST_CALLEE_SAVED_REGNUM = ARC_FP_REGNUM
9796
};
9897

9998
/* arc64 DWARF register numbers. */

0 commit comments

Comments
 (0)