----Original Message----
>From: Dave Murphy
>Sent: 20 July 2005 11:21
> I've been having some trouble building gcc 4.0.1 for mips target on a
> mingw host
No you aren't. You're using a modified version of the gcc-4.0.1 sources
and you're targetting PSP. That may be a MIPS backend, but it's a different
_target_.
> Reading specs from c:/projects/devkitPro/sources/psp/gcc/gcc/specs
> Target: psp
> Configured with: ../../gcc-4.0.1-new/configure --enable-languages=c,c++
> --disable-multilib --with-gcc --with-gnu-ld --with-gnu-as --with-stabs
> --disable-shared --disable-win32-registry --disable-nls
> --enable-cxx-flags=-G0 --target=psp --with-newlib
There's no such thing in FSF gcc (unless it was sneaked in just after
RC2...):
[EMAIL PROTECTED] /gnu/testing/psp> /gnu/testing/gcc-4.0.1-20050702/configure
--enable-la
nguages=c --target=psp
creating cache ./config.cache
checking host system type... i686-pc-cygwin
checking target system type... Invalid configuration `psp': machine `psp'
not recognized
> The same build process works fine on linux and I've compared output. The
> preprocessed source is identical barring paths. The assembly output
> differs only in the function prologue
>
> on mingw built compiler
>
> __muldi3:
> .frame $sp,0,(null) # vars= 7640055, regs= 0/0, args= 0,
^^^^^^ ^^^^^^
This is very bad. This is even worse.
Stack frame generation / layout is going wrong if it thinks __muldi3 needs
seven and a bit megs of stack. However, perhaps that's not the correct
number for how much it actually does think it wants.
> can anyone point me in the right direction? I'm not quite sure what I
> should be looking for.
You're looking for gcc to be calling *printf and passing a NULL argument
to a %s format character, basically. Whatever patches you have applied must
be faulty. The bad call is in gcc/config/mips/mips.c
(mips_output_function_prologue):
if (!flag_inhibit_size_directive)
{
/* .frame FRAMEREG, FRAMESIZE, RETREG */
fprintf (file,
"\t.frame\t%s," HOST_WIDE_INT_PRINT_DEC ",%s\t\t"
"# vars= " HOST_WIDE_INT_PRINT_DEC ", regs= %d/%d"
", args= " HOST_WIDE_INT_PRINT_DEC
", gp= " HOST_WIDE_INT_PRINT_DEC "\n",
(reg_names[(frame_pointer_needed)
? HARD_FRAME_POINTER_REGNUM :
STACK_POINTER_REGNUM]),
((frame_pointer_needed && TARGET_MIPS16)
? tsize - cfun->machine->frame.args_size
: tsize),
reg_names[GP_REG_FIRST + 31],
cfun->machine->frame.var_size,
cfun->machine->frame.num_gp,
cfun->machine->frame.num_fp,
cfun->machine->frame.args_size,
cfun->machine->frame.cprestore_size);
Hmm. Perhaps we have HOST_WIDE_INT problems for mingw host here? If
cfun->machine->frame.var_size was a long long, and HOST_WIDE_INT_PRINT_DEC
for mingw is just "%d" or "%ld" rather than "%lld", that would push an extra
NULL word onto the stack that would be taken as the parameter for %s because
the "%d" wouldn't be advancing the varargs pointer past the whole of the
second format arg...
cheers,
DaveK
--
Can't think of a witty .sigline today....