[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gdb-bugs
Subject:    Oddity in generic_use_struct_convention
From:       "Donn Terry" <donnte () microsoft ! com>
Date:       2002-10-14 20:03:00
Message-ID: FE465D8F724E3F4F811D067203A214AE067386C0 () red-msg-08 ! redmond ! corp ! microsoft ! com
[Download RAW message or body]

In generic_use_struct_convention(), the code checks for gcc_p having the
value of exactly 1.   Inferring from the name (_p), this is intended as
a boolean type.

In valops.c, there's the following code:

#ifdef CARE_IF_GCC
  {
    struct block *b = block_for_pc (funaddr);
    /* If compiled without -g, assume GCC 2.  */
    using_gcc = (b == NULL ? 2 : BLOCK_GCC_COMPILED (b));
  }
#else
  /* If we don't care if we're using gcc or not on this system,
     then default to 2.  Note that there appears to be NO code
     that actually sets up BLOCK_GCC_COMPILED (gcc_compile_flag)
     so this is all pretty much meaningless anyway, but it
     breaks the regressions (callfunc).  */
  using_gcc = 2;
#endif

  /* Are we returning a value using a structure return or a normal
     value return? */

  struct_return = using_struct_return (function, funaddr, value_type,
                                       using_gcc);
---
Note that using_gcc can be 2 (==don't care) at that point.  Following
down
thru using_struct_return(), the 2 gets passed on to 
generic_use_struct_convention (via the macro USE_STRUCT_CONVENTION),
presumably violating its assumptions about gcc_p being "boolean".  
(As far as I can tell, the case when it is 2 should be treated as
"true", which is not the case.)

A version of USE_STRUCT_CONVENTION that converts its first argument to
"boolean"
(a zero/nonzero test) seems to work for me (while passing the 2 thru did
not),
but that's probably not the right long-term fix.

Donn



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic