Skip to content

Commit 34fbbfc

Browse files
committed
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 <[email protected]>
1 parent 67f15f3 commit 34fbbfc

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
@@ -1188,15 +1188,15 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn,
11881188
registers according to given arguments thus greatly reducing code
11891189
size. Which registers will be actually saved depends on arguments.
11901190
1191-
ENTER_S {R13-...,FP,BLINK} stores registers in following order:
1191+
ENTER_S {R14-...,FP,BLINK} stores registers in following order:
11921192
11931193
new SP ->
1194+
FP
11941195
BLINK
1195-
R13
11961196
R14
11971197
R15
1198+
R16
11981199
...
1199-
FP
12001200
old SP ->
12011201
12021202
There are up to three arguments for this opcode, as presented by ARC
@@ -1238,14 +1238,8 @@ arc_is_in_prologue (struct gdbarch *gdbarch, const struct arc_instruction &insn,
12381238
/* Current store address. */
12391239
pv_t addr = regs[ARC_SP_REGNUM];
12401240

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

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

12631263
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)