[gnu.gdb.bug] structure return/passing

tmb@AI.MIT.EDU (Thomas M. Breuel) (02/27/90)

Does GDB handle structure return/passing correctly when used
interactively? I have a feeling it doesn't... consider the following
transcript:

Script started on Mon Feb 26 16:10:03 1990
lem$ gdb
Reading symbol data from /tmp_mnt/home/vi/tmb/index/index...done.
Reading in symbols for index.c...done.
Breakpoint 1 at 0x3434: file index.c, line 170.

Bpt 1, main () (index.c line 170)
170             generate_models();
(gdb) p rotatev(makev(1.0,0.0),3.14159)

Program received signal 11, Segmentation fault
0x25f0 in rotatev (p={x = 1, y = 0}, a=3.14159) (./geo.h line 23)
23              q.x=p.x*c-p.y*s;
Cannot continue previously requested operation.
Unable to restore previously selected frame.
(gdb) l rotatev
15              return atan2(p.y,p.x); 
16      }
17      
18      vec rotatev(p,a) 
19      vec p; float a;
20      {
21              float s=sin(a),c=cos(a);
22              vec q;
23              q.x=p.x*c-p.y*s;
24              q.y=p.x*s+p.y*c;
(gdb) l makev
1       typedef struct _vec { float x,y; } vec;
2       
3       vec makev(x,y) float x,y; { vec p; p.x=x; p.y=y; return p; }
4       vec addv(p,q) vec p,q; { p.x+=q.x; p.y+=q.y; return p; }
5       vec subv(p,q) vec p,q; { p.x-=q.x; p.y-=q.y; return p; }
6       float normv(p) vec p; { double sqrt(); return sqrt(p.x*p.x+p.y*p.y); }
7       float distancev(p,q) vec p,q; { return normv(subv(p,q)); }
(gdb) p normv(makev(1.0,0.0))

Program received signal 11, Segmentation fault
normv (p={x = 1, y = 0}) (./geo.h line 6)
6       float normv(p) vec p; { double sqrt(); return sqrt(p.x*p.x+p.y*p.y); }
Cannot continue previously requested operation.
Unable to restore previously selected frame.
(gdb) q
The program is running.  Quit anyway? (y or n) y
lem$ 
script done on Mon Feb 26 16:12:30 1990

(This is in GDB 3.5)

rfg@ics.uci.edu (Ronald Guilmette) (02/28/90)

In article <9002262118.AA03600@lem> tmb@AI.MIT.EDU (Thomas M. Breuel) writes:
>Does GDB handle structure return/passing correctly when used
>interactively? I have a feeling it doesn't... consider the following
>transcript:

Calling sequences are *highly* machine dependent, and thus, there may
be a bug in this area that affects only the machine that you are using.

Did you remember to *always* include complete (or at least some) information
about your configuration when posting your bug report?  No.  Shame on you.


// Ron Guilmette (rfg@ics.uci.edu)
// C++ Entomologist
// Motto:  If it sticks, force it.  If it breaks, it needed replacing anyway.

Raeburn@ATHENA.MIT.EDU (Ken Raeburn) (03/01/90)

   Date: 27 Feb 90 23:00:10 GMT
   From: uci-ics!rfg@ORION.OAC.UCI.EDU  (Ronald Guilmette)

   Calling sequences are *highly* machine dependent, and thus, there may
   be a bug in this area that affects only the machine that you are using.

And compiler dependent!  On the vax, depending on the compiler used
(and whether -fpcc-struct-return is used with gcc), structure returns
are done two different ways, and gdb has no way of knowing which a
given routine will do, unless perhaps the symbol table information is
different, which I doubt....

kingdon@AI.MIT.EDU (Jim Kingdon) (03/01/90)

    And compiler dependent!  On the vax, depending on the compiler used
    (and whether -fpcc-struct-return is used with gcc), structure returns
    are done two different ways

Come on, people, this is bug-gdb, not
uninformed-speculations-and-rumors-about-gdb.  If you have a bug to
report, report it with a specific example (the sections of the emacs
and gcc manuals on reporting bugs are good reading if you're unsure of
how to write a bug report).

Most follow-ups to messages on this list should go just to the sender,
not to the whole list.