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: [RFC] Mips, N32, cc, gcc, and gdb (longish)


Daniel Jacobowitz wrote:
> 
> On Thu, Aug 01, 2002 at 07:24:16PM -0700, Michael Snyder wrote:
> > Daniel Jacobowitz wrote:
> > >
> > > On Thu, Aug 01, 2002 at 06:14:32PM -0700, Michael Snyder wrote:
> > > > OK, I think I've made this as concise as practical.   ;-)
> > > >
> > > > In case the difference between Irix cc and gcc does not get
> > > > fixed (and I mean specifically the difference concerning
> > > > alignment of small struct arguments), I'd like to discuss
> > > > "fixing" gdb so that it will work correctly with both.
> > > >
> > > > I've found a testcase for this problem in call-ar-st.exp:
> > > >
> > > > (gdb) print print_long_arg_list (a, b, c, d, e, f, *struct1,
> > > >       *struct2, *struct3, *struct4, *flags, *flags_combo,
> > > >       *three_char, *five_char, *int_char_combo,
> > > >       *d1, *d2, *d3, *f1, *f2, *f3)
> > > >
> > > > This fails (or doesn't) depending on whether a small struct
> > > > is left-justified or right-justified when it is pushed onto
> > > > the stack (ie, when it is the 5th or higher argument).
> > > >
> > > > The code in mips_push_arguments that controls this is:
> > > >
> > > >       if (MIPS_STACK_ARGSIZE == 8 &&
> > > >           (typecode == TYPE_CODE_INT ||
> > > >            typecode == TYPE_CODE_PTR ||
> > > >            typecode == TYPE_CODE_FLT) && len <= 4)
> > > >         longword_offset = MIPS_STACK_ARGSIZE - len;
> > > >       else if ((typecode == TYPE_CODE_STRUCT ||
> > > >                 typecode == TYPE_CODE_UNION) &&
> > > >               TYPE_LENGTH (arg_type) < MIPS_STACK_ARGSIZE)
> > > >         longword_offset = MIPS_STACK_ARGSIZE - len;
> > > >     }
> > > >
> > > > As it is written, it "works" with gcc but fails with cc.
> > > >
> > > > Kevin proposed this change to me (I don't remember if
> > > > he has submitted it yet):
> > > >
> > > > ***
> > > >                 typecode == TYPE_CODE_UNION) &&
> > > > !              TYPE_LENGTH (arg_type) < MIPS_STACK_ARGSIZE)
> > > >         longword_offset = MIPS_STACK_ARGSIZE - len;
> > > > ---
> > > >                 typecode == TYPE_CODE_UNION) &&
> > > > !              TYPE_LENGTH (arg_type) < MIPS_STACK_ARGSIZE
> > > > !              && tdep->mips_abi != MIPS_ABI_N32)
> > > >         longword_offset = MIPS_STACK_ARGSIZE - len;
> > > > ***
> > > >
> > > > With this change, it "works" with cc, but fails with gcc.
> > > >
> > > > I want to discuss the following change, which should
> > > > make it "work" with both cc and gcc (given the current
> > > > behavior of both):
> > > >
> > > > ***
> > > >                 typecode == TYPE_CODE_UNION) &&
> > > > !              TYPE_LENGTH (arg_type) < MIPS_STACK_ARGSIZE)
> > > >         longword_offset = MIPS_STACK_ARGSIZE - len;
> > > > ---
> > > >                 typecode == TYPE_CODE_UNION) &&
> > > > !              TYPE_LENGTH (arg_type) < MIPS_STACK_ARGSIZE
> > > > !              && (gcc_p ||tdep->mips_abi != MIPS_ABI_N32))
> > > >         longword_offset = MIPS_STACK_ARGSIZE - len;
> > > > ***
> > > >
> > > >
> > > > This of course makes gdb's behavior dependent on which
> > > > compiler it detects.
> > > >
> > > > There is one problem: there is no variable "gcc_p" within
> > > > the scope of mips_push_arguments, because PUSH_ARGUMENTS
> > > > does not pass it.  So that would need to be solved,
> > > > possibly by modifying the definition of PUSH_ARGUMENTS.
> > > >
> > > > Comments?
> > >
> > > Comment - you're on a slippery slope.  I know of at least one other
> > > variation in this area; for structures of less than a word SGI CC
> > > shifts them in register only for big endian targets, and not for little
> > > endian (on the old versions of CC which support little endian).  There
> > > comes a point where we just need to get GCC fixed, and I think this is
> > > it.
> >
> > Right -- but this thread concerns what to do if that DOESN'T happen.
> >
> > In answer to your comment, I believe the code currently in GDB
> > already handles the case you describe, both for CC and for GCC.
> > So what I'm discussing here will bring stack-passing into line
> > with register-passing.
> >
> > However, you may be right that I need to check for endian-ness
> > in my proposed change.  I haven't tested that.
> 
> I'm not actually sure if it's the same if statement. 

It's not.

> Certainly GDB and GCC do not agree on mipsel-linux.
> 
> I'd say the proper thing to do is to see that GCC is fixed, not to lay
> contingency plans...

Well then, I hope somebody else replies!   ;-)


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