This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC]: patch #2 for Sun C compiled target programs



Not sure.  As I said, it's not easy.  As far as I understand things,
INTERNALIZE_SYMBOL() should look at n_type to decide whether n_value
should be treated as a signed or an unsigned value.  The problem seems
to be that n_value can either be interpreted as an address or as an
offset.  Addresses should be sign-extended based on what
bfd_get_sign_extend_vma() tells us.  Offsets should probably always be
sign-extended.

Mark


The gdb stabs docu says:


4.1 Automatic Variables Allocated on the Stack

   The value of the stab is the offset of the variable within the
   local variables. On most machines this is an offset from the
   frame pointer and is negative.

I think we could sign extend e_value if bfd_get_sign_extend_vma() tells us OR if n_type == N_LSYM.

N_LSYM is also used for types. But e_value seems to be unused and = 0 in this case.
Index: dbxread.c
===================================================================
RCS file: /cvs/src/src/gdb/dbxread.c,v
retrieving revision 1.67
diff -c -p -r1.67 dbxread.c
*** dbxread.c	10 Jun 2004 20:05:43 -0000	1.67
--- dbxread.c	28 Jun 2004 07:39:31 -0000
*************** stabs_seek (int sym_offset)
*** 852,858 ****
      (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);		\
      (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);		\
      (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);  		\
!     if (bfd_get_sign_extend_vma (abfd))					\
        (intern).n_value = bfd_h_get_signed_32 (abfd, (extern)->e_value);	\
      else								\
        (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);	\
--- 852,859 ----
      (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);		\
      (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);		\
      (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);  		\
!     /* stack variable offsets (N_LSYM) are always signed */		\
!     if ((intern).n_type == N_LSYM || bfd_get_sign_extend_vma (abfd))	\
        (intern).n_value = bfd_h_get_signed_32 (abfd, (extern)->e_value);	\
      else								\
        (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);	\

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]