[RFA/rfc] blockframe.c: dummy frames unwind and pseudoregs

Elena Zannoni ezannoni@redhat.com
Thu Aug 22 08:48:00 GMT 2002


On the e500, the general registers are pseudo registers.
Such registers are used in the debug info to find the address of 
paramters and variables.

In the event that you do the following, you get an internal error:

(gdb) b main
Breakpoint 1 at 0x100002a4: file /es/scratch/ezannoni/uberbaum/src/gdb/testsuite/gdb.base/break.c, line 75.
(gdb) tar sim
Connected to the simulator.
(gdb) lo
(gdb) r
Starting program: /es/scratch/ezannoni/uberbaum/H-sparc-sun-solaris2.5-x-powerpc-eabispe-2/gdb/testsuite/gdb.base/break 

Breakpoint 1, main (argc=1, argv=0xdffffb38, envp=0xdffffb40)
    at /es/scratch/ezannoni/uberbaum/src/gdb/testsuite/gdb.base/break.c:75
75          if (argc == 12345) {  /* an unlikely value < 2^16, in case uninited */
(gdb) info addr argc
Symbol "argc" is an argument at offset 8 from register r31.
(gdb) b marker2
Breakpoint 2 at 0x1000021c: file /es/scratch/ezannoni/uberbaum/src/gdb/testsuite/gdb.base/break.c, line 49.
(gdb) p marker2(44)

Breakpoint 2, 0x1000021c in marker2 (a=268560764)
    at /es/scratch/ezannoni/uberbaum/src/gdb/testsuite/gdb.base/break.c:49
49      int marker2 (a) int a; { return (1); }
The program being debugged stopped while in a function called from GDB.
When the function (marker2) is done executing, GDB will silently
stop (instead of continuing to evaluate the expression containing
the function call).
(gdb) bt
#0  0x1000021c in marker2 (a=268560764)
    at /es/scratch/ezannoni/uberbaum/src/gdb/testsuite/gdb.base/break.c:49
#1  <function called from gdb>
#2  main (/es/scratch/ezannoni/uberbaum/src/gdb/regcache.c:638: gdb-internal-error: regcache_raw_read: Assertion `regnum >= 0 && regnum < regcache->descr->nr_raw_registers' failed.
argc=An internal GDB error was detected.  This may make further
debugging unreliable.  Quit this debugging session? (y or n) 


argc is computerd using r31 which is a pseudo register on this target.

This is because the generic_call_dummy_register_unwind() doesn't deal with
pseudo registers. It has this comment:

      /* Return the actual value.  */
      /* FIXME: cagney/2002-06-26: This should be via the
         gdbarch_register_read() method so that it, on the fly,
         constructs either a raw or pseudo register from the raw
         register cache.  */
      regcache_raw_read (registers, regnum, bufferp);


If instead of raw reads I do cooked reads, I don't get the error.  I
wonder though if, based of the comment, this could be a problem for
other targets.
Thoughts?

Elena

2002-08-22  Elena Zannoni  <ezannoni@redhat.com>

	* blockframe.c (generic_call_dummy_register_unwind): Use
	regcache_cooked_read to catch cases in which the variable is
	stored in a pseudo register.

Index: blockframe.c
===================================================================
RCS file: /cvs/uberbaum/gdb/blockframe.c,v
retrieving revision 1.37
diff -u -p -r1.37 blockframe.c
--- blockframe.c	18 Aug 2002 22:40:15 -0000	1.37
+++ blockframe.c	22 Aug 2002 15:35:27 -0000
@@ -1406,7 +1406,7 @@ generic_call_dummy_register_unwind (stru
          gdbarch_register_read() method so that it, on the fly,
          constructs either a raw or pseudo register from the raw
          register cache.  */
-      regcache_raw_read (registers, regnum, bufferp);
+      regcache_cooked_read (registers, regnum, bufferp);
     }
 }



More information about the Gdb-patches mailing list