[comp.sys.sun] Sun CC bug?

amir@taux01.nsc.com (06/05/91)

I have trouble tracing 'short' parameters passed into functions.
'dbx', 'gdb' and 'ups' all fail to show the value correctly.
If I compile it with gcc, then it works fine, but gcc introduces other
compilcations, so I'd rather stick with plain-vanilla Sun's cc.
I suspect that the debug symbols in the object file are corrupted.
Enclosed are the C file, output from 'nm -apo' and recordings of
dbx and gdb sessions:

#---------------------------------------------------------------
#A C-file example:
#---------------------------------------------------------------
$ cat test.c
shorty (a,b)
  short a;
  int   b;
{
printf ("short=%d, int=%d\n", a, b);
}

main ()
{
short aa;
int   bb;

aa = 10;
bb = 20;
shorty (aa,bb);
aa += 100;
bb += 100;
shorty (aa,bb);
}
#---------------------------------------------------------------
# dump of object file
#---------------------------------------------------------------
$ nm -apo test.o

test.o:00000034 T _main
test.o:         U _printf
test.o:00000000 T _shorty
test.o:00000000 - 00 0000    SO /files/pilat/amir/c/
test.o:00000000 - 00 0000    SO test.c
test.o:00000000 - 00 0000  LSYM int:t(0,1)=r(0,1);-2147483648;2147483647;
test.o:00000000 - 00 0000  LSYM char:t(0,2)=r(0,2);0;127;
test.o:00000000 - 00 0000  LSYM long:t(0,3)=r(0,1);-2147483648;2147483647;
test.o:00000000 - 00 0000  LSYM short:t(0,4)=r(0,1);-32768;32767;
test.o:00000000 - 00 0000  LSYM unsigned char:t(0,5)=r(0,1);0;255;
test.o:00000000 - 00 0000  LSYM unsigned short:t(0,6)=r(0,1);0;65535;
test.o:00000000 - 00 0000  LSYM unsigned long:t(0,7)=r(0,1);0;-1;
test.o:00000000 - 00 0000  LSYM unsigned int:t(0,8)=r(0,1);0;-1;
test.o:00000000 - 00 0000  LSYM float:t(0,9)=r(0,1);4;0;
test.o:00000000 - 00 0000  LSYM double:t(0,10)=r(0,1);8;0;
test.o:00000000 - 00 0000  LSYM void:t(0,11)=(0,11)
test.o:00000000 - 00 0000  LSYM ???:t(0,12)=(0,1)
test.o:00000000 - 00 0004   FUN shorty:F(0,1)
test.o:00000000 - 00 0004 SLINE
test.o:00000046 - 00 0002  PSYM a:p(0,4)
test.o:00000048 - 00 0004  PSYM b:p(0,1)
test.o:00000014 - 00 0004 SLINE
test.o:00000014 - 00 0005 SLINE
test.o:0000002c - 00 0006 SLINE
test.o:00000034 - 00 0004   FUN main:F(0,1)
test.o:00000034 - 00 0009 SLINE
test.o:00000040 - 00 0009 SLINE
test.o:fffffffe - 00 0002  LSYM aa:(0,4)
test.o:fffffff8 - 00 0004  LSYM bb:(0,1)
test.o:00000040 - 00 0002 LBRAC
test.o:00000040 - 00 000e SLINE
test.o:00000048 - 00 000f SLINE
test.o:00000050 - 00 0011 SLINE
test.o:00000060 - 00 0014 SLINE
test.o:00000074 - 00 0015 SLINE
test.o:00000080 - 00 0017 SLINE
test.o:00000090 - 00 0019 SLINE
test.o:000000a0 - 00 0002 RBRAC
test.o:000000a0 - 00 001a SLINE
#---------------------------------------------------------------
#A recording of the dbx session: 
#---------------------------------------------------------------
$ dbx test
Reading symbolic information...
Read 49 symbols
(dbx) stop in shorty
(2) stop in shorty
(dbx) run
Running: test
stopped in shorty at line 5 in file "test.c"
    5   printf ("short%d, int=%d\n", a, b);
(dbx) where
shorty(a = 0, b = 20), line 5 in "test.c"
main(), line 17 in "test.c"
(dbx) cont
short=10, int=20
stopped in shorty at line 5 in file "test.c"
    5   printf ("short=%d, int=%d\n", a, b);
(dbx) cont
short=110, int=120

execution completed, exit code is 1
program exited with 1
(dbx) quit
#---------------------------------------------------------------
#A recording of the gdb session: 
#---------------------------------------------------------------
$ gdb test
(gdb) break shorty
Reading in symbols for test.c...done.
Breakpoint 1 at 0x22a4: file test.c, line 5.
(gdb) run
Starting program: c/test

Bpt 1, shorty (a=0, b=20) (test.c line 5)
5       printf ("short=%d, int=%d\n", a, b);
(gdb) bt
#0  shorty (a=0, b=20) (test.c line 5)
#1  0x22f0 in main () (test.c line 17)
(gdb) cont
Continuing.
short=10, int=20

Bpt 1, shorty (a=0, b=120) (test.c line 5)
5       printf ("short=%d, int=%d\n", a, b);
(gdb) bt
#0  shorty (a=0, b=120) (test.c line 5)
#1  0x2320 in main () (test.c line 23)
(gdb) cont
Continuing.
short=110, int=120