[commit] ARM : prologue scan

Jerome Guitton
2003-09-25T14:24:23Z

[-- Attachment #1: Type: text/plain, Size: 208 bytes --]

Jerome Guitton (guitton@act-europe.fr):

> I still don't have committed this change, for the simple reason that I don't

patch merged with the current version of arm-tdep.c (head), and
committed.

--
Jerome

[-- Attachment #2: arm_bt.dif --]
[-- Type: text/plain, Size: 3478 bytes --]

2003-09-25 Jerome Guitton <guitton@act-europe.fr>

* arm-tdep.c (arm_skip_prologue): Handle "sub ip, sp #n" and
"add ip, sp #n" in the prologue.
(arm_scan_prologue): Ditto.

Index: arm-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/arm-tdep.c,v
retrieving revision 1.150
diff -c -r1.150 arm-tdep.c
*** arm-tdep.c 14 Sep 2003 16:32:12 -0000 1.150
--- arm-tdep.c 25 Sep 2003 14:15:51 -0000
***************
*** 455,460 ****
--- 455,466 ----
if (inst == 0xe1a0c00d) /* mov ip, sp */
continue;

+ if ((inst & 0xfffff000) == 0xe28dc000) /* add ip, sp #n */
+ continue;
+
+ if ((inst & 0xfffff000) == 0xe24dc000) /* sub ip, sp #n */
+ continue;
+
/* Some prologues begin with "str lr, [sp, #-4]!". */
if (inst == 0xe52de004) /* str lr, [sp, #-4]! */
continue;
***************
*** 707,713 ****
static void
arm_scan_prologue (struct frame_info *next_frame, struct arm_prologue_cache *cache)
{
! int regno, sp_offset, fp_offset;
CORE_ADDR prologue_start, prologue_end, current_pc;
CORE_ADDR prev_pc = frame_pc_unwind (next_frame);

--- 713,719 ----
static void
arm_scan_prologue (struct frame_info *next_frame, struct arm_prologue_cache *cache)
{
! int regno, sp_offset, fp_offset, ip_offset;
CORE_ADDR prologue_start, prologue_end, current_pc;
CORE_ADDR prev_pc = frame_pc_unwind (next_frame);

***************
*** 808,814 ****
in which case it is often (but not always) replaced by
"str lr, [sp, #-4]!". - Michael Snyder, 2002-04-23] */

! sp_offset = fp_offset = 0;

for (current_pc = prologue_start;
current_pc < prologue_end;
--- 814,820 ----
in which case it is often (but not always) replaced by
"str lr, [sp, #-4]!". - Michael Snyder, 2002-04-23] */

! sp_offset = fp_offset = ip_offset = 0;

for (current_pc = prologue_start;
current_pc < prologue_end;
***************
*** 818,823 ****
--- 824,846 ----

if (insn == 0xe1a0c00d) /* mov ip, sp */
{
+ ip_offset = 0;
+ continue;
+ }
+ else if ((insn & 0xfffff000) == 0xe28dc000) /* add ip, sp #n */
+ {
+ unsigned imm = insn & 0xff; /* immediate value */
+ unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
+ imm = (imm >> rot) | (imm << (32 - rot));
+ ip_offset = imm;
+ continue;
+ }
+ else if ((insn & 0xfffff000) == 0xe24dc000) /* sub ip, sp #n */
+ {
+ unsigned imm = insn & 0xff; /* immediate value */
+ unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
+ imm = (imm >> rot) | (imm << (32 - rot));
+ ip_offset = -imm;
continue;
}
else if (insn == 0xe52de004) /* str lr, [sp, #-4]! */
***************
*** 859,865 ****
unsigned imm = insn & 0xff; /* immediate value */
unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
imm = (imm >> rot) | (imm << (32 - rot));
! fp_offset = -imm;
cache->framereg = ARM_FP_REGNUM;
}
else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
--- 882,888 ----
unsigned imm = insn & 0xff; /* immediate value */
unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
imm = (imm >> rot) | (imm << (32 - rot));
! fp_offset = -imm + ip_offset;
cache->framereg = ARM_FP_REGNUM;
}
else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */