more m68k breakage on m68k-linux
Bernardo Innocenti
bernie@develer.com
Tue Mar 9 22:35:00 GMT 2004
Gunther Nikl wrote:
> Hello Bernado!
>
> On Mon, Mar 08, 2004 at 10:38:03PM +0100, Bernardo Innocenti wrote:
>
>>Gunther Nikl wrote:
>>
>>>On Sun, Mar 07, 2004 at 04:05:50PM +0100, Bernardo Innocenti wrote:
>>>
>>>
>>>>Roman Zippel wrote:
>>>>
>>>>
>>>>>Does your patch look very different from the one below?
>>>>>That's the one I'm testing for m68k-linux right now.
>>>>
>>>>It's similar, but I didn't notice REGNO_REG_CLASS also needed fiddling,
>>>>so your patch is superior.
>>>
>>> Why are so many changes required to fix the breakage caused by adding
>>> argptr?
>>
>>Because the target configuration infrastructure used by GCC is a hell
>>ofpreprocessor macros with very weak consistency checking? :-)
>
> No, that wasn't my real question ;-) I thought that just adding argptr
> to FIXED_REGISTERS+CALL_USED_REGISTERS would be enough. But the patch
> adds REG_ALLOC_ORDER and modifies REG_CLASS_CONTENTS+REGNO_REG_CLASS.
Well, the REGNO_REG_CLASS is needed for correctness in case the middle-end
invokes it on the argument pointer. I dunno if it really does, but better
safe than sorry. The divide-by-8 trick doesn't work any more, so Roman
converted the clever formula to a table.
For other's reference:
`REGNO_REG_CLASS (REGNO)'
A C expression whose value is a register class containing hard
register REGNO. In general there is more than one such class;
choose a class which is "minimal", meaning that no smaller class
also contains the register.
Roman's changes:
-#define REGNO_REG_CLASS(REGNO) (((REGNO)>>3)+1)
+extern char regno_reg_class[];
+#define REGNO_REG_CLASS(REGNO) ((enum reg_class)regno_reg_class[(REGNO)])
...
+char regno_reg_class[] =
+{
+ DATA_REGS, DATA_REGS, DATA_REGS, DATA_REGS,
+ DATA_REGS, DATA_REGS, DATA_REGS, DATA_REGS,
+ ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
+ ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
+ FP_REGS, FP_REGS, FP_REGS, FP_REGS,
+ FP_REGS, FP_REGS, FP_REGS, FP_REGS,
+ ADDR_REGS
+};
> I checked the documenation but it wasn't that helpful regarding
> REG_ALLOC_ORDER. Why is that one now needed?
I'm puzzled too... I think Roman wanted to make sure argptr wasn't
being ever allocated, but this is easly accomplished by setting it
to 1 in FIXED_REGISTERS.
All code paths for targets that don't define REG_ALLOC_ORDER look
safe to me even for the argument pointer fake register.
> BTW, the patch should be posted quickly because according to
> http://gcc.gnu.org/ml/gcc-patches/2004-03/msg00513.html 3.4.0 is
> scheduled for its final code freeze soon. IMHO, this patch must be
> in 3.4.0.
Yeah. Sorry for the delay, I'll see if I can work on it later this
week.
--
// Bernardo Innocenti - Develer S.r.l., R&D dept.
\X/ http://www.develer.com/
More information about the Gcc
mailing list