Thread View: gnu.gdb.bug
1 messages
1 total messages
Started by David Hull
Wed, 15 Mar 1989 23:47
Bugs in gdb 3.1 coffread.c [ + patch ]
Author: David Hull
Date: Wed, 15 Mar 1989 23:47
Date: Wed, 15 Mar 1989 23:47
132 lines
4732 bytes
4732 bytes
In the process of porting gdb 3.1 to the Intergraph CLIPPER, I found
the following bugs in coffread.c:
The function enter_linenos() fails on machines which require strict
alignment of integer variables.
Symbols of type C_REGPARM were treated like type C_REG in
process_coff_symbol().
The CLIPPER compiler passes the first two (integer) arguments to a
function in registers. If the declared argument is smaller than an
int, then the function prologue copies the argument into a local
variable of the local type before the program can use it. In this
case, the symbol information for the argument says that it is of
type C_ARG, but the symbol value is *negative*. This causes two
problems, in coffread.c:process_coff_symbol() and in printcmd.c:
print_frame_args(). In process_coff_symbol(), my fix is to get rid
of the promotion of char and short arguments to int. I will post
my fix to print_frame_args() separately.
Also in this patch is the test for CLIPPERMAGIC that was necessary for
gdb to work on the CLIPPER.
-David
---------------------------------------
David Hull TRW Inc. Redondo Beach, CA
...!{uunet,cit-vax,trwrb}!wiley!david
david%wiley.uucp@csvax.caltech.edu
*** orig/coffread.c Thu Feb 9 18:15:50 1989
--- coffread.c Fri Feb 17 17:37:06 1989
***************
*** 1080,1085 ****
--- 1080,1088 ----
#ifdef I386MAGIC
case I386MAGIC:
#endif
+ #ifdef CLIPPERMAGIC
+ case CLIPPERMAGIC:
+ #endif
return file_hdr->f_nsyms;
***************
*** 1276,1282 ****
register int last_line;
{
register char *rawptr = &linetab[file_offset - linetab_offset];
! register struct lineno *lptr;
/* skip first line entry for each function */
rawptr += LINESZ;
--- 1279,1285 ----
register int last_line;
{
register char *rawptr = &linetab[file_offset - linetab_offset];
! struct lineno lptr;
/* skip first line entry for each function */
rawptr += LINESZ;
***************
*** 1283,1293 ****
/* line numbers start at one for the first line of the function */
first_line--;
! for (lptr = (struct lineno *)rawptr;
! lptr->l_lnno && lptr->l_lnno <= last_line;
! rawptr += LINESZ, lptr = (struct lineno *)rawptr)
{
! record_line (first_line + lptr->l_lnno, lptr->l_addr.l_paddr);
}
}
--- 1286,1296 ----
/* line numbers start at one for the first line of the function */
first_line--;
! for (bcopy (rawptr, &lptr, LINESZ);
! lptr.l_lnno && lptr.l_lnno <= last_line;
! rawptr += LINESZ, bcopy (rawptr, &lptr, LINESZ))
{
! record_line (first_line + lptr.l_lnno, lptr.l_addr.l_paddr);
}
}
***************
*** 1465,1471 ****
break;
case C_REG:
- case C_REGPARM:
SYMBOL_CLASS (sym) = LOC_REGISTER;
add_symbol_to_list (sym, &local_symbols);
break;
--- 1468,1473 ----
***************
*** 1476,1481 ****
--- 1478,1484 ----
case C_ARG:
SYMBOL_CLASS (sym) = LOC_ARG;
add_symbol_to_list (sym, &local_symbols);
+ #ifndef clipper
/* If PCC says a parameter is a short or a char,
it is really an int. */
if (SYMBOL_TYPE (sym) == builtin_type_char
***************
*** 1484,1491 ****
--- 1487,1510 ----
else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
|| SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
+ #endif
break;
+ case C_REGPARM:
+ SYMBOL_CLASS (sym) = LOC_REGPARM;
+ add_symbol_to_list (sym, &local_symbols);
+ #ifndef clipper
+ /* If PCC says a parameter is a short or a char,
+ it is really an int. */
+ if (SYMBOL_TYPE (sym) == builtin_type_char
+ || SYMBOL_TYPE (sym) == builtin_type_short)
+ SYMBOL_TYPE (sym) = builtin_type_int;
+ else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
+ || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
+ SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
+ #endif
+ break;
+
case C_TPDEF:
SYMBOL_CLASS (sym) = LOC_TYPEDEF;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads