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: RFA: GCC stabs don't contain prototype info


Jim Blandy wrote:
> 
> This comes as a bit of a surprise to me, but it seems that stabs
> generated by GCC don't indicate whether a given function was defined
> with a prototype or not.  The argument types should appear after the
> return types, each preceded by a semicolon, but for the following
> input program:
> 
>         int foo (int a, float b) { return a + b; }
> 
> `gcc -save-temps -O2 -g -c' generates the following relevant stabs:
> 
>     .stabs "int:t(0,1)=r(0,1);0020000000000;0017777777777;",128,0,0,0
>     .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
>     .stabs "foo:F(0,1)",36,0,1,foo
>     .stabs "a:P(0,1)",64,0,1,8
>     .stabs "b:P(0,12)",64,0,1,9
>     .stabs "",36,0,0,.LLscope0-foo
>             .stabs "",100,0,0,.Letext
> 
> There is no no prototype info here.  There's no way for GDB to know
> that the function expects its second argument to be passed as a float,
> not promoted to a double, as the K&R-style rules specify.

Yes, this is an old, old issue.  The test (float2) in callfuncs.exp
was designed to reveal this problem.  Unfortunately a few years ago
somebody went thru callfuncs.c and protoized all of the functions, 
thus defeating this test.  I've recently restored it, which is why
you may be suddenly seeing the fails again.


> 
> Thus:
> 
> 2001-11-26  Jim Blandy  <jimb@redhat.com>
> 
>         * gdb.base/callfuncs.exp: The stabs generated by GCC don't tell us
>         whether functions are prototyped or not, so we can't possibly pass
>         arguments to t_float_values2 properly.

Yep, that's why it's there.  I suppose xfailing it is reasonable, 
if there is no hope of it ever being fixed.


> 
> Index: gdb/testsuite/gdb.base/callfuncs.exp
> ===================================================================
> RCS file: /cvs/cvsfiles/devo/gdb/testsuite/gdb.base/callfuncs.exp,v
> retrieving revision 1.46
> diff -c -r1.46 callfuncs.exp
> *** gdb/testsuite/gdb.base/callfuncs.exp        2001/11/10 00:08:23     1.46
> --- gdb/testsuite/gdb.base/callfuncs.exp        2001/11/27 03:24:59
> ***************
> *** 142,147 ****
> --- 142,150 ----
>         gdb_test "p t_float_values(float_val1,-2.3765)" " = 1"
> 
>         # Test passing of arguments which might not be widened.
> +         # Under stabs, GCC doesn't tell us whether the function was
> +         # prototyped or not.
> +         if {$gcc_compiled} { setup_xfail_format "stabs" }
>         gdb_test "p t_float_values2(0.0,0.0)" " = 0"
> 
>         # Although PR 5318 mentions SunOS specifically, this seems
> ***************
> *** 152,158 ****
> --- 155,166 ----
>                 setup_xfail "alpha-dec-osf2*" "i*86-*-sysv4*" 5318
>             }
>         }
> +
> +         # Under stabs, GCC doesn't tell us whether the function was
> +         # prototyped or not.
> +         if {$gcc_compiled} { setup_xfail_format "stabs" }
>         gdb_test "p t_float_values2(3.14159,float_val2)" " = 1"
> +
>         gdb_test "p t_small_values(1,2,3,4,5,6,7,8,9,10)" " = 55"
> 
>         gdb_test "p t_double_values(0.0,0.0)" " = 0"
> ***************
> *** 289,294 ****
> --- 297,304 ----
>         }
>       }
>   }
> +
> + get_debug_format
> 
>   # Make sure that malloc gets called and that the floating point unit
>   # is initialized via a call to t_double_values.


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