This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
PING [RFC] Fix MIPS frame prologue scan problem
- From: "Pierre Muller" <pierre dot muller at ics-cnrs dot unistra dot fr>
- To: "'GDB Patches'" <gdb-patches at sourceware dot org>
- Cc: "'Maciej W. Rozycki'" <macro at codesourcery dot com>, "'Daniel Jacobowitz'" <dan at codesourcery dot com>
- Date: Fri, 22 Jun 2012 00:16:42 +0200
- Subject: PING [RFC] Fix MIPS frame prologue scan problem
- References: <00a501cd495e$db6adea0$92409be0$@muller@ics-cnrs.unistra.fr>
I got no reaction to this RFC...
Maybe Maciej or Daniel?
Pierre Muller
> -----Message d'origine-----
> De?: gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] De la part de Pierre Muller
> Envoyé?: mercredi 13 juin 2012 14:20
> À?: 'GDB Patches'
> Objet?: [RFC] Fix MIPS frame prologue scan problem
>
> I am trying to extend the Free Pascal compiler to support
> MIPS architecture.
>
> From what I read so far, register $s8 (register number 30) can be used
as
> a frame register,
> but when I set $s8 to the value of the stack pointer ($sp, register number
> 29)
> I get all my locals and parameter of functions wrong.
>
> I traced it down to the fact that GDB seems to use a
> 'virtual' frame pointer register called $fp,
> but which is miscalculated in my case.
>
> In GCC generated code, $s8 register gets the same value as
> $sp register, so that this problem does not show up in that case,
> but for me, if I have a prologue that reserves 80 bytes,
> I will typically get
>
> # Reserve 80 bytes for locals and area for called function parameters
> addi $sp,$sp,-80
> # Save $ra and $s8 registers, there could be others...
> sw $ra,44($sp)
> sw $s8,40($sp)
> # Set $s8 to function entry value of $sp
> addi $s8,$sp,80
>
> Analysis of first instruction leads to setting of
> frame_offset to 80.
>
> The problem is that when the last instruction
> is analyzed by mips32_scan_prologue,
> it switches the frame_reg from $sp to $s8,
> but does not modify frame_offset value.
> This leads to a frame pointer $fp
> being computed as $s8 + frame_offset
> which is equal to $sp + 2*frame_offset.
> Thus all my locals are wrong :(
>
> Substraction of the constant in the last addi instruction (low_word)
> to frame_offset seems to cure my problem.
>
>
> I tried to run a testsuite comparison and
> I got a bunch of regression, but I have no idea if those
> regression are relevant or a problem of stability of results...
> See below if you understand those failures.
>
>
> Comments are most welcome,
>
>
> Pierre Muller
>
>
> 2012-06-11 Pierre Muller <muller@ics.u-strasbg.fr>
>
> * mips-tdep.c (mpis32_scan_prologue): Fix value of frame_offset
> for ADDIU $s8,$sp,FrameSize.
>
>
> Index: src/gdb/mips-tdep.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/mips-tdep.c,v
> retrieving revision 1.556
> diff -u -p -r1.556 mips-tdep.c
> --- src/gdb/mips-tdep.c 6 Jun 2012 21:34:12 -0000 1.556
> +++ src/gdb/mips-tdep.c 10 Jun 2012 23:43:44 -0000
> @@ -3226,6 +3226,7 @@ restart:
> (this_frame, gdbarch_num_regs (gdbarch) + 30);
>
> alloca_adjust = (unsigned) (frame_addr - (sp + low_word));
> + frame_offset -= low_word;
> if (alloca_adjust > 0)
> {
> /* FP > SP + frame_size. This may be because of
>
> Regressions with my patch:
>
> muller@gcc42:~/auto-test-gdb/state/patched/2012_06_13_10_34_41$ cat report
> Calling update for "HEAD"
> cleanup called
> Calling git clean -d -x -f
> Calling git reset --hard
> cleanup called
> Calling git clean -d -x -f
> Calling git reset --hard
> apply_patch called
> cleanup called
> Calling git clean -d -x -f
> Calling git reset --hard
> (cat /home/muller/auto-test-gdb/state/testing/patched/report
> with your patch there are 23 regressions.
> list of regressions with your patch:
> gdb.sum gdb.base/checkpoint.exp: break2 10 one
> gdb.sum gdb.base/checkpoint.exp: break2 2 one
> gdb.sum gdb.base/checkpoint.exp: break2 3 one
> gdb.sum gdb.base/checkpoint.exp: break2 4 one
> gdb.sum gdb.base/checkpoint.exp: break2 5 one
> gdb.sum gdb.base/checkpoint.exp: break2 6 one
> gdb.sum gdb.base/checkpoint.exp: break2 7 one
> gdb.sum gdb.base/checkpoint.exp: break2 8 one
> gdb.sum gdb.base/checkpoint.exp: break2 9 one
> gdb.sum gdb.base/checkpoint.exp: break4 one
> gdb.sum gdb.base/checkpoint.exp: delete copy1
> gdb.sum gdb.base/checkpoint.exp: outfile still open 1
> gdb.sum gdb.base/checkpoint.exp: outfile still open 10
> gdb.sum gdb.base/checkpoint.exp: outfile still open 2
> gdb.sum gdb.base/checkpoint.exp: outfile still open 3
> gdb.sum gdb.base/checkpoint.exp: outfile still open 4
> gdb.sum gdb.base/checkpoint.exp: outfile still open 5
> gdb.sum gdb.base/checkpoint.exp: outfile still open 6
> gdb.sum gdb.base/checkpoint.exp: outfile still open 7
> gdb.sum gdb.base/checkpoint.exp: outfile still open 8
> gdb.sum gdb.base/checkpoint.exp: outfile still open 9
> gdb.sum gdb.base/checkpoint.exp: restart 0 one
> gdb.sum gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint
> after
> the second fork
> tac)
> (cat /home/muller/auto-test-gdb/state/testing/patched/gdb.sum.diff
> 1c1
> < Test Run By muller on Wed Jun 13 12:04:38 2012
> ---
> > Test Run By muller on Wed Jun 13 10:52:26 2012
> 2759,2760c2759,2760
> < FAIL: gdb.base/checkpoint.exp: breakpoint 1 6 one (timeout)
> < FAIL: gdb.base/checkpoint.exp: step in 6 two
> ---
> > PASS: gdb.base/checkpoint.exp: breakpoint 1 6 one
> > FAIL: gdb.base/checkpoint.exp: step in 6 two (timeout)
> 2767,2772c2767,2775
> < PASS: gdb.base/checkpoint.exp: restart 0 one
> < PASS: gdb.base/checkpoint.exp: break4 one
> < PASS: gdb.base/checkpoint.exp: delete copy1
> < PASS: gdb.base/checkpoint.exp: restart 1 three
> < PASS: gdb.base/checkpoint.exp: break2 1 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 1
> ---
> > FAIL: gdb.base/checkpoint.exp: restart 0 one
> > FAIL: gdb.base/checkpoint.exp: setting breakpoint at 58
> > FAIL: gdb.base/checkpoint.exp: break4 one
> > FAIL: gdb.base/checkpoint.exp: delete copy1
> > ERROR: breakpoints not deleted
> > UNRESOLVED: gdb.base/checkpoint.exp: setting breakpoint at 53 (timeout)
> > FAIL: gdb.base/checkpoint.exp: restart 1 three (got interactive prompt)
> > FAIL: gdb.base/checkpoint.exp: break2 1 one (the program exited)
> > FAIL: gdb.base/checkpoint.exp: outfile still open 1
> 2774,2775c2777,2778
> < PASS: gdb.base/checkpoint.exp: break2 2 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 2
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 2 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 2
> 2777,2778c2780,2781
> < PASS: gdb.base/checkpoint.exp: break2 3 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 3
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 3 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 3
> 2780,2781c2783,2784
> < PASS: gdb.base/checkpoint.exp: break2 4 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 4
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 4 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 4
> 2783,2784c2786,2787
> < PASS: gdb.base/checkpoint.exp: break2 5 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 5
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 5 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 5
> 2786,2787c2789,2790
> < PASS: gdb.base/checkpoint.exp: break2 6 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 6
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 6 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 6
> 2789,2790c2792,2793
> < PASS: gdb.base/checkpoint.exp: break2 7 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 7
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 7 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 7
> 2792,2793c2795,2796
> < PASS: gdb.base/checkpoint.exp: break2 8 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 8
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 8 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 8
> 2795,2796c2798,2799
> < PASS: gdb.base/checkpoint.exp: break2 9 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 9
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 9 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 9
> 2798,2799c2801,2802
> < PASS: gdb.base/checkpoint.exp: break2 10 one
> < PASS: gdb.base/checkpoint.exp: outfile still open 10
> ---
> > FAIL: gdb.base/checkpoint.exp: break2 10 one
> > FAIL: gdb.base/checkpoint.exp: outfile still open 10
> 5022,5023c5025,5026
> < gdb compile failed, /tmp/ccv7IQuN.s: Assembler messages:
> < /tmp/ccv7IQuN.s:7: Error: unrecognized symbol type
"gnu_indirect_function"
> ---
> > gdb compile failed, /tmp/cc3V0Vhb.s: Assembler messages:
> > /tmp/cc3V0Vhb.s:7: Error: unrecognized symbol type
"gnu_indirect_function"
> 8861,8867c8864,8870
> < FAIL: gdb.base/sigaltstack.exp: finish from catch LEAF (the program
> exited)
> < FAIL: gdb.base/sigaltstack.exp: finish to throw INNER (the program is no
> longe
> r running)
> < FAIL: gdb.base/sigaltstack.exp: finish to catch INNER (the program is no
> longe
> r running)
> < FAIL: gdb.base/sigaltstack.exp: finish from catch INNER (the program is
no
> lon
> ger running)
> < FAIL: gdb.base/sigaltstack.exp: finish to OUTER (the program is no
longer
> runn
> ing)
> < FAIL: gdb.base/sigaltstack.exp: finish to catch MAIN (the program is no
> longer
> running)
> < FAIL: gdb.base/sigaltstack.exp: finish to MAIN (the program is no longer
> runni
> ng)
> ---
> > PASS: gdb.base/sigaltstack.exp: finish from catch LEAF
> > PASS: gdb.base/sigaltstack.exp: finish to throw INNER
> > PASS: gdb.base/sigaltstack.exp: finish to catch INNER
> > PASS: gdb.base/sigaltstack.exp: finish from catch INNER
> > PASS: gdb.base/sigaltstack.exp: finish to OUTER
> > PASS: gdb.base/sigaltstack.exp: finish to catch MAIN
> > PASS: gdb.base/sigaltstack.exp: finish to MAIN
> 15571c15574
> < FAIL: gdb.java/jprint.exp: unambiguous static call
> ---
> > FAIL: gdb.java/jprint.exp: unambiguous static call (the program exited)
> 19245,19249c19248,19252
> < FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: hardware
> breakpo
> ints work (timeout)
> < FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded:
watchpoints
> work
>
> < FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint
> after
> the first fork
> < FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint
> after
> the first fork (timeout)
> < PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint
> after
> the second fork
> ---
> > PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: hardware
> breakpo
> ints work
> > PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded:
watchpoints
> work
>
> > FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint
> after
> the first fork (timeout)
> > FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint
> after
> the first fork
> > FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint
> after
> the second fork
> 19265c19268
> < FAIL: gdb.threads/watchpoint-fork.exp: child: multithreaded: watchpoint
A
> afte
> r the second fork (timeout)
> ---
> > FAIL: gdb.threads/watchpoint-fork.exp: child: multithreaded: watchpoint
A
> afte
> r the second fork
> 19267c19270
> < FAIL: gdb.threads/watchpoint-fork.exp: child: multithreaded: finish
> ---
> > FAIL: gdb.threads/watchpoint-fork.exp: child: multithreaded: finish
> (timeout)
> 19564,19565c19567,19568
> < # of expected passes 17184
> < # of unexpected failures 1033
> ---
> > # of expected passes 17169
> > # of unexpected failures 1049
> 19570c19573
> < # of unresolved testcases 32
> ---
> > # of unresolved testcases 33
> tac)
> FAILs with patched version in failed
> FAILs with pristine version in pristine-failed
> The files used for the validation of your patch are stored in
> /home/muller/auto-
> test-gdb/state/patched/2012_06_13_10_34_41 on the tester machine.