[LLVMdev] inline asm semantics: output constraint width smaller than input

Chris Lattner clattner at apple.com
Sat Jan 24 11:23:18 PST 2009


On Jan 24, 2009, at 9:27 AM, Ingo Molnar wrote:

>> #define __put_user_size(x, ptr, size, retval, errret)            \
>> diff --git a/arch/x86/lib/delay.c b/arch/x86/lib/delay.c
>> index f456860..12d27f8 100644
>> --- a/arch/x86/lib/delay.c
>> +++ b/arch/x86/lib/delay.c
>> @@ -112,7 +112,7 @@ EXPORT_SYMBOL(__delay);
>>
>> inline void __const_udelay(unsigned long xloops)
>> {
>> -    int d0;
>> +    unsigned long d0;
>>
>>     xloops *= 4;
>>     asm("mull %%edx"
>
> Is this all that you need (plus the 16-bit setup code tweaks) to get  
> LLVM
> to successfully build a 64-bit kernel image?
>
> If yes then this doesnt look all that bad or invasive at first sight  
> (if
> the put_user() workaround can be expressed in a cleaner way), but in  
> any
> case it would be nice to hear an LLVM person's opinion about roughly  
> when
> this is going to be solved in LLVM itself.

Hi Ingo,

We would like to support some more specific cases (e.g. when tying a  
pointer/int to a different size pointer/int) but we currently don't  
intend to support all cases (e.g. tying a FP value to int).  We are in  
this position because the semantics are very vague and hard to reason  
about (and change based on target endianness) and we had many subtle  
bugs in the corner cases.

Instead of having silent miscompiles, we decided to just reject all  
the "hard" cases and add them back one by one as there is demand.   
That way users could choose to modify their asms instead of having  
them be potentially silently miscompiled.

LLVM 2.5 is in its release process right now, so it will not have  
improvements in this area, but LLVM 2.6 certainly could.  If there is  
interest in building the kernel with 2.5, I think taking the patches  
would be worthwhile.  If that is hopeless anyway, waiting for the LLVM- 
side fixes should be fine.

-Chris



More information about the llvm-dev mailing list