On Dec 31, 2010, at 7:05 PM, Chris Lattner wrote: > On Dec 31, 2010, at 12:43 PM, Jakob Stoklund Olesen wrote: >> 1. Pinned local variables are treated no differently than normal local >> variables except when they are used as operands for inline asm. This is what >> Rafael's patch implements. I suppose you could warn if such a variable is >> never used for inline asm. > [...] >> 2. Global variables pinned to a reserved register. This is just an odd way >> of accessing a register, and it is fairly easy to support in the front end >> by emitting empty inline asm instead of reads and writes to the global. > > Right, llvm-gcc does this. This is vaguely bogus but it is (obviously) used > and useful to support. > >> 3. Global variables pinned to an allocatable register. For this to work, the >> backend must treat the pinned register as reserved, effectively changing the >> calling convention of all functions in the compilation unit. Other >> compilation units would have to be built with -ffixed-reg. I really don't >> want to support this if it can at all be avoided. > > [...]
> Interestingly enough, GCC emits a warning:
>
> $ cat t.c
> register int foo asm("rax");
> void f() {
> foo = 42;
> }
>
> t.c:1: warning: call-clobbered register used for global register variable
Yes, the documentation says that you should only use callee-saved registers,
otherwise any library function you call will clobber your global.
> My opinion is that the warning is a (really low priority) QoI issue and that
> we should implement #2 and forget about people who get burned with #3.
I'm fine with that, but it does mean that we silently miscompile #3 because the
register can be allocated normally.
> We should not implement -ffixed-reg if possible IMO, though it has been
> discussed on llvmdev as useful for people who have GC'd languages etc, and I
> vaguely recall the Haskell folks doing some work in this area. To do this
> right we'd have to do something like this:
> http://nondot.org/sabre/LLVMNotes/GlobalRegisterVariables.txt
I would prefer that approach too. It lets the register allocator decide if the
register global is really more important than all the locals it interferes with.
>> We could permit:
>> asm ("" : "={esp}"(foo));
>> The curly brace syntax for inline asm constraints also obsoletes pinned
>> local variables.
>
> Lets not extend GCC assembly syntax anymore! :)
Yeah, fair enough.
/jakob
smime.p7s
Description: S/MIME cryptographic signature
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
