This is the mail archive of the
gdb-prs@sources.redhat.com
mailing list for the GDB project.
pending/1325: Re: [RFA] ARM : prologue scan
- From: Jerome Guitton <guitton at act-europe dot fr>
- To: gdb-gnats at sources dot redhat dot com
- Date: Tue, 22 Jul 2003 13:47:09 +0200
- Subject: pending/1325: Re: [RFA] ARM : prologue scan
- References: <20030721142742.GA3621@act-europe.fr>
>Number: 1325
>Category: pending
>Synopsis: Re: [RFA] ARM : prologue scan
>Confidential: yes
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: change-request
>Submitter-Id: unknown
>Arrival-Date: Fri Aug 08 02:18:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:
>Release:
>Organization:
>Environment:
>Description:
--envbJBWh7q8WU6mo
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
I have done some minor corrections on the previous patch, discard it.
In attachment, the new version. No regression, no fixed.
--
Jerome.
--envbJBWh7q8WU6mo
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="arm_bt.dif"
2003-07-21 J. Guitton <guitton@gnat.com>
* arm-tdep.c (arm_skip_prologue): Add the handling of "sub ip, sp #n"
and "add ip, sp #n", as these instructions can be found in a ATPCS
compliant prologue.
(arm_scan_prologue): Ditto.
Index: arm-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/arm-tdep.c,v
retrieving revision 1.143
diff -u -3 -p -r1.143 arm-tdep.c
--- arm-tdep.c 13 Jun 2003 14:15:51 -0000 1.143
+++ arm-tdep.c 22 Jul 2003 11:43:10 -0000
@@ -449,6 +449,12 @@ arm_skip_prologue (CORE_ADDR pc)
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;
@@ -708,7 +714,7 @@ thumb_scan_prologue (struct frame_info *
static void
arm_scan_prologue (struct frame_info *fi)
{
- int regno, sp_offset, fp_offset;
+ int regno, sp_offset, fp_offset, ip_offset;
LONGEST return_value;
CORE_ADDR prologue_start, prologue_end, current_pc;
@@ -799,7 +805,7 @@ arm_scan_prologue (struct frame_info *fi
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;
+ sp_offset = fp_offset = ip_offset = 0;
for (current_pc = prologue_start;
current_pc < prologue_end;
@@ -809,6 +815,23 @@ arm_scan_prologue (struct frame_info *fi
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]! */
@@ -850,7 +873,7 @@ arm_scan_prologue (struct frame_info *fi
unsigned imm = insn & 0xff; /* immediate value */
unsigned rot = (insn & 0xf00) >> 7; /* rotate amount */
imm = (imm >> rot) | (imm << (32 - rot));
- fp_offset = -imm;
+ fp_offset = -imm + ip_offset;
get_frame_extra_info (fi)->framereg = ARM_FP_REGNUM;
}
else if ((insn & 0xfffff000) == 0xe24dd000) /* sub sp, sp #n */
--envbJBWh7q8WU6mo--
>How-To-Repeat:
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted: