[llvmlinux] clang fails on linux-next since commit 8bf705d13039

Sedat Dilek sedat.dilek at gmail.com
Mon May 28 16:05:15 UTC 2018


On Mon, Mar 19, 2018 at 6:29 PM, Matthias Kaehlcke <mka at chromium.org> wrote:
> El Mon, Mar 19, 2018 at 09:43:25AM +0300 Dmitry Vyukov ha dit:
>
>> On Sat, Mar 17, 2018 at 2:13 PM, Lukas Bulwahn <lukas.bulwahn at gmail.com> wrote:
>> > Hi Dmitry, hi Ingo,
>> >
>> > since commit 8bf705d13039 ("locking/atomic/x86: Switch atomic.h to use atomic-instrumented.h")
>> > on linux-next (tested and bisected from tag next-20180316), compiling the
>> > kernel with clang fails with:
>> >
>> > In file included from arch/x86/entry/vdso/vdso32/vclock_gettime.c:33:
>> > In file included from arch/x86/entry/vdso/vdso32/../vclock_gettime.c:15:
>> > In file included from ./arch/x86/include/asm/vgtod.h:6:
>> > In file included from ./include/linux/clocksource.h:13:
>> > In file included from ./include/linux/timex.h:56:
>> > In file included from ./include/uapi/linux/timex.h:56:
>> > In file included from ./include/linux/time.h:6:
>> > In file included from ./include/linux/seqlock.h:36:
>> > In file included from ./include/linux/spinlock.h:51:
>> > In file included from ./include/linux/preempt.h:81:
>> > In file included from ./arch/x86/include/asm/preempt.h:7:
>> > In file included from ./include/linux/thread_info.h:38:
>> > In file included from ./arch/x86/include/asm/thread_info.h:53:
>> > In file included from ./arch/x86/include/asm/cpufeature.h:5:
>> > In file included from ./arch/x86/include/asm/processor.h:21:
>> > In file included from ./arch/x86/include/asm/msr.h:67:
>> > In file included from ./arch/x86/include/asm/atomic.h:279:
>> > ./include/asm-generic/atomic-instrumented.h:295:10: error: invalid output size for constraint '=a'
>> >                 return arch_cmpxchg((u64 *)ptr, (u64)old, (u64)new);
>> >                        ^
>> > ./arch/x86/include/asm/cmpxchg.h:149:2: note: expanded from macro 'arch_cmpxchg'
>> >         __cmpxchg(ptr, old, new, sizeof(*(ptr)))
>> >         ^
>> > ./arch/x86/include/asm/cmpxchg.h:134:2: note: expanded from macro '__cmpxchg'
>> >         __raw_cmpxchg((ptr), (old), (new), (size), LOCK_PREFIX)
>> >         ^
>> > ./arch/x86/include/asm/cmpxchg.h:95:17: note: expanded from macro '__raw_cmpxchg'
>> >                              : "=a" (__ret), "+m" (*__ptr)              \
>> >                                      ^
>> >
>> > (... and some more similar and closely related errors)
>>
>>
>> Thanks for reporting, Lukas.
>>
>> +more people who are more aware of the current state of clang for kernel.
>>
>> Are there are known issues in '=a' constraint handling between gcc and
>> clang? Is there a recommended way to resolve them?
>>
>> Also, Lukas what's your version of clang? Potentially there are some
>> fixes for kernel in the very latest versions of clang.
>
> My impression is that the problem only occurs in code built for
> 32-bit (like arch/x86/entry/vdso/vdso32/*), where the use of a 64-bit
> address with a '=a' constraint is indeed invalid. I think the 'root
> cause' is that clang parses unreachable code before it discards it:
>
> static __always_inline unsigned long
> cmpxchg_local_size(volatile void *ptr, unsigned long old, unsigned long new,
>                    int size)
> {
>         ...
>         switch (size) {
>         ...
>         case 8:
>                 BUILD_BUG_ON(sizeof(unsigned long) != 8);
>                 return arch_cmpxchg_local((u64 *)ptr, (u64)old, (u64)new);
>         }
>         ...
> }
>
> For 32-bit builds size is 4 and the code in the 'offending' branch is
> unreachable, however clang still parses it.
>
> d135b8b5060e ("arm64: uaccess: suppress spurious clang warning") fixes
> a similar issue.
>

[ CC Jan Beulich ]

Hi Jan,

can you look at this issue [1] as you have fixed the percpu issue [2]
with [3] on the Linux-kernel side?

This problem still occurs with Linux v4.17-rc7 and reverting
x86/asm-goto support (clang-7 does not support it).

Before this gets fixed on the clang-side, do you see a possibility to
fix this on the kernel-side?

Clang fails like this as reported above and see [4] as mentioned by
Matthias before.

./arch/x86/include/asm/cpufeature.h:150:2: warning: "Compiler lacks
ASM_GOTO support. Add -D __BPF_TRACING__ to your compiler arguments"
[-W#warnings]
#warning "Compiler lacks ASM_GOTO support. Add -D __BPF_TRACING__ to
your compiler arguments"
 ^
In file included from arch/x86/entry/vdso/vdso32/vclock_gettime.c:31:
In file included from arch/x86/entry/vdso/vdso32/../vclock_gettime.c:15:
In file included from ./arch/x86/include/asm/vgtod.h:6:
In file included from ./include/linux/clocksource.h:13:
In file included from ./include/linux/timex.h:56:
In file included from ./include/uapi/linux/timex.h:56:
In file included from ./include/linux/time.h:6:
In file included from ./include/linux/seqlock.h:36:
In file included from ./include/linux/spinlock.h:51:
In file included from ./include/linux/preempt.h:81:
In file included from ./arch/x86/include/asm/preempt.h:7:
In file included from ./include/linux/thread_info.h:38:
In file included from ./arch/x86/include/asm/thread_info.h:53:
In file included from ./arch/x86/include/asm/cpufeature.h:5:
In file included from ./arch/x86/include/asm/processor.h:21:
In file included from ./arch/x86/include/asm/msr.h:67:
In file included from ./arch/x86/include/asm/atomic.h:283:
./include/asm-generic/atomic-instrumented.h:365:10: error: invalid
output size for constraint '=a'
                return arch_cmpxchg((u64 *)ptr, (u64)old, (u64)new);
                       ^
./arch/x86/include/asm/cmpxchg.h:149:2: note: expanded from macro 'arch_cmpxchg'
        __cmpxchg(ptr, old, new, sizeof(*(ptr)))
        ^
./arch/x86/include/asm/cmpxchg.h:134:2: note: expanded from macro '__cmpxchg'
        __raw_cmpxchg((ptr), (old), (new), (size), LOCK_PREFIX)
        ^
./arch/x86/include/asm/cmpxchg.h:95:17: note: expanded from macro
'__raw_cmpxchg'
                             : "=a" (__ret), "+m" (*__ptr)              \
                                     ^

Thanks in advance.

Regards,
- Sedat -

[1] https://bugs.llvm.org/show_bug.cgi?id=33587
[2] https://bugs.llvm.org/show_bug.cgi?id=33587#c18
[3] https://git.kernel.org/linus/22636f8c9511245cb3c8412039f1dd95afb3aa59
[4] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/asm-generic/atomic-instrumented.h#n365
-------------- next part --------------
A non-text attachment was scrubbed...
Name: config-4.17.0-rc7-1-iniza-llvmlinux
Type: application/octet-stream
Size: 203024 bytes
Desc: not available
URL: <http://lists.linuxfoundation.org/pipermail/llvmlinux/attachments/20180528/4408409c/attachment-0001.obj>


More information about the LLVMLinux mailing list