gcc-4.1-20050709: alpha: "macro requires $at register while noat in effect" while compiling Linux kernel
Dan Kegel
dank@kegel.com
Mon Jul 11 17:29:00 GMT 2005
Richard Henderson wrote:
> On Mon, Jul 11, 2005 at 09:52:22AM -0700, Dan Kegel wrote:
>
>>>No, this code is protected by various system checks.
>>>
>>>We want -mcpu=ev5 such that the kernel as a whole will run everywhere,
>>>but we require these specific instructions on specific ev56/ev6 systems
>>>for i/o.
>>
>>rth, can you eyeball the summary I posted at
>>http://marc.theaimsgroup.com/?l=linux-kernel&m=112109202911699&w=2 ?
>>My limited understanding is that gcc is fine, no need to revert anything,
>>but the linux kernel configury needs to stop doing
>> -mcpu=ev5 -Wa,-mev6
>>for CONFIG_ALPHA_EV5/CONFIG_ALPHA_GENERIC, since those specific instructions
>>really aren't there on real ev5 machines, and passing
>>-Wa,-mev6 keeps it from substituting a macro.
>
>
> Absolutely not. While one can argue about which in the gcc+binutils
> pair is buggy, the kernel is *not* buggy.
>
> Please re-read my problem description above, and recall that this is
> for a GENERIC kernel, that runs on ALL alpha systems.
Maybe I'm missing something. include/asm-alpha/compiler.h says:
#if defined(__alpha_bwx__)
#define __kernel_ldbu(mem) (mem)
...
#else
#define __kernel_ldbu(mem) \
({ unsigned char __kir; \
__asm__("ldbu %0,%1" : "=r"(__kir) : "m"(mem)); \
__kir; })
For -mcpu=ev5, the #else branch is taken, and the ldbu instruction
is given to the assembler, right?
And since arch/alpha/Makefile does
CFLAGS += $(cflags-y) -Wa,-mev6
unconditionally, real ldbu instructions are used instead of
the emulation. And that means that __kernel_ldbu(mem) won't
work on pure ev5 machines. Are you saying that __kernel_ldbu(mem)
is never called on pure ev5 machines, then?
Thanks,
Dan
--
Trying to get a job as a c++ developer? See http://kegel.com/academy/getting-hired.html
More information about the Gcc
mailing list