Messages in this thread | | | Date | Fri, 23 Jan 2009 19:57:20 +0200 | From | Török Edwin <> | Subject | inline asm semantics: output constraint width smaller than input |
| |
Hi,
I am trying to build the kernel with LLVM 2.5 prerelease (using llvm-gcc-4.2 frontend), however I am running into some inline asm semantics issues, and after some discussion on LLVM bugzilla I would like to know if you would be accepting patches for this: http://llvm.org/bugs/show_bug.cgi?id=3373
The problem is when "a" output constraint is used with a variable of smaller width than the "0" input constraint.
Here are 2 examples:
int __ret_pu; unsigned long __pu_val; return ({asm volatile("call __put_user_" "8" : "=a" (__ret_pu) :"0" (__pu_val), "c"(addr) : "ebx"); __ret_pu;});
unsigned char return_code; /* %al */ unsigned long address; /* %ebx */ unsigned long length; /* %ecx */ unsigned long entry; /* %edx */ unsigned long flags; __asm__("lcall *(%%edi); cld" : "=a" (return_code), "=b" (address), "=c" (length), "=d" (entry) : "0" (service), "1" (0), "D" (&bios32_indirect));
There are 2 cases: 1. output is wider than input 2. output is narrower than input
Case 2 seems to occur lots of times on 64-bit (due to sizeof(int) != sizeof(unsigned long)), and a few times on 32-bit as well.
Would you accept patches that increase the portability of the inline asm statements? (essentially by adding casts for case 1, and introducing a temporary of correct width for case 2).
Please see: http://llvm.org/bugs/show_bug.cgi?id=3373#c6
Best regards, --Edwin
| |