[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Aha!



Found out something interesting.  I was trying to figure out why
gcc/fold-const.c wouldn't assemble properly and found a set of
command-line options where it would.

Some background, I decided to add '-save-temps -v' to gcc's options while
compiling.  What it showed command-wise was exactly what I expected, so
I'll omit that stuff.  I then tried hand-running gas with the options that
gcc was passing it on fold-const.s. Here's the errors I got:

# as -EB -v -KPIC -o fold-const.o fold-const.s
fold-const.s: Assembler messages:
fold-const.s:27290: Error: Branch out of range
fold-const.s:27329: Error: Branch out of range
fold-const.s:27334: Error: Branch out of range
fold-const.s:28748: Error: Branch out of range
fold-const.s:28861: Error: Branch out of range

Ok, I tried a few things including looking directly at the assembly
generated by cc1 (despite not having any MIPS asm references around, it
looked ok...looks like it was supposed to be using jumps to the branches
that gas was saying was out of range).

I then hit the gas docs and tried various MIPS-specific options with
eventual success.  Turns out that adding any of the -mips? options other
than -mips1 allows it to assemble correctly.  For the uninformed, here's a
breakdown on those options:
	-mips1 = generates code for the R2000 and R3000 processors
	-mips2 = generates code for the R6000 processor
	-mips3 = generates code for the R4000 processor
	-mips4 = generates code for the R8000 and R10000 processors


It seems that, when binutils is configured for the mips-unknown-linux-gnu
target, it assumes that -mips1 is the default, apparently.  This is
probably for maximum compatibility.  Since I don't have any reference
manuals on the generations of MIPS processors, I don't really know the
differences yet between all of these families, but it appears that, either
the R2000/R3000 processors cannot handle these specific jumps for some
reason OR (most likely) there is a bug in binutils wrt -mips1 support.

Can someone educate me on the differences between the families of
MIPS processors or point me towards some technical docs?  I can probably
isolate this problem in binutils if I had more to work with.  Also, this
may turn up a bug in gcc as well (who knows at this point...I'm too new to
this arch to really know what may be involved).  In the meantime, I'm
going to see if I can target binutils and gcc towards the R4x00 that's in
this indy and go from there.

C



Reply to: