asm conflict question
Andrew Haley
aph@redhat.com
Wed Aug 9 15:29:00 GMT 2006
Richard Bonomo writes:
>
> I am hoping someone can give me a little
> advice in how to proceed. I have
> some C-code which I compile under
> gcc-3.4.5 which employs a definition
> such as this:
>
> #define disable() \
> ({ register int __Status __asm__ ("d"); \
> __asm__ ("clra ; save CPU status"); \
> __asm__ volatile ("tfr cc,b" : "=d" (__Status) : : "d", "b"); \
> __asm__ ("orcc #0x50 ; disable interrupts"); \
> __Status; })
>
> When an attempt is made to compile, upon hitting the
> spot in the program where this code winds up being
> inserted, the compiler produces this error message
>
> error: asm-specifier for variable `__Status' conflicts with asm clobber list
>
> and quits.
>
> After doing quite a bit if digging, I do know that for some
> reason the compiler is probably complaining about the
> assignment of register "d" (which includes registers
> "a" and "b" in the Motorola 6809 as its high and
> low components).
>
> However, I am still at quite a loss as to how
> I am to deal with this: how do I get around this,
> short of rewriting this and other functions to
> use ordinary variables as much as possible?
>
> Can you shed any light on what, precisely is being
> objected to, and how to meet that objection?
Sure. You declare a register variable "__Status" that lives in
register d. You then use that same register as an asm output. gcc is
complaining about that conflict.
It's easy to fix. Something like this:
#define disable() \
({ int __Status; \
__asm__ volatile ("clra ; save CPU status"); \
__asm__ volatile ("tfr cc,b" : "=d" (__Status)); \
__asm__ volatile ("orcc #0x50 ; disable interrupts"); \
__Status; })
Andrew.
More information about the Gcc-help
mailing list