Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

-Wduplicate-decl-specifier and LLVM "error in backend: Unsupported expression in static initializer" crash trying to enable CONFIG_USE_X86_SEG_SUPPORT #2013

Open
nathanchance opened this issue Apr 3, 2024 · 1 comment
Labels
[ARCH] x86_64 This bug impacts ARCH=x86_64 Compiler crash This bug makes Clang crash, emitting a backtrace Reported upstream This bug was filed on LLVM’s issue tracker, Phabricator, or the kernel mailing list.

Comments

@nathanchance
Copy link
Member

On top of current -tip, which has some fixes for CONFIG_USE_X86_SEG_SUPPORT, attempting to enable it for Clang with

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index c62db6b853d7..e8eb2e06ad2c 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -2429,10 +2429,10 @@ source "kernel/livepatch/Kconfig"
 endmenu

 config CC_HAS_NAMED_AS
-       def_bool CC_IS_GCC && GCC_VERSION >= 90100
+       def_bool (CC_IS_GCC && GCC_VERSION >= 90100) || (CC_IS_CLANG && CLANG_VERSION >= 190000)

 config CC_HAS_NAMED_AS_FIXED_SANITIZERS
-       def_bool CC_IS_GCC && GCC_VERSION >= 130300
+       def_bool !CC_IS_GCC || (CC_IS_GCC && GCC_VERSION >= 130300)

 config USE_X86_SEG_SUPPORT
        def_bool y

results in

In file included from arch/x86/kernel/asm-offsets.c:9:
In file included from include/linux/crypto.h:15:
In file included from include/linux/completion.h:12:
In file included from include/linux/swait.h:7:
In file included from include/linux/spinlock.h:56:
In file included from include/linux/preempt.h:79:
In file included from arch/x86/include/asm/preempt.h:7:
arch/x86/include/asm/current.h:47:10: error: multiple identical address spaces specified for type [-Werror,-Wduplicate-decl-specifier]
   47 |                 return this_cpu_read_const(const_pcpu_hot.current_task);
      |                        ^
arch/x86/include/asm/percpu.h:462:34: note: expanded from macro 'this_cpu_read_const'
  462 | #define this_cpu_read_const(pcp)        __raw_cpu_read(, pcp)
      |                                         ^
arch/x86/include/asm/percpu.h:432:30: note: expanded from macro '__raw_cpu_read'
  432 |         *(qual __my_cpu_type(pcp) *)__my_cpu_ptr(&(pcp));               \
      |                                     ^
arch/x86/include/asm/percpu.h:99:28: note: expanded from macro '__my_cpu_ptr'
   99 | #define __my_cpu_ptr(ptr)       (__my_cpu_type(*ptr)*)(__force uintptr_t)(ptr)
      |                                  ^
arch/x86/include/asm/percpu.h:98:40: note: expanded from macro '__my_cpu_type'
   98 | #define __my_cpu_type(var)      typeof(var) __percpu_seg_override
      |                                             ^
arch/x86/include/asm/percpu.h:45:31: note: expanded from macro '__percpu_seg_override'
   45 | #define __percpu_seg_override   __seg_gs
      |                                 ^
<built-in>:343:33: note: expanded from macro '__seg_gs'
  343 | #define __seg_gs __attribute__((address_space(256)))
      |                                 ^

I think this should be resolved with __typeof_unqual__, which was recently added to LLVM by myself in llvm/llvm-project@cc308f6 (hence the 190000 check above) and its use has been talked about on LKML. This diff shuts up the warning above (may or may not be actually correct)

diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h
index 20696df5d567..fc77c99d2e80 100644
--- a/arch/x86/include/asm/percpu.h
+++ b/arch/x86/include/asm/percpu.h
@@ -95,7 +95,7 @@

 #endif /* CONFIG_SMP */

-#define __my_cpu_type(var)     typeof(var) __percpu_seg_override
+#define __my_cpu_type(var)     __typeof_unqual__(var) __percpu_seg_override
 #define __my_cpu_ptr(ptr)      (__my_cpu_type(*ptr)*)(__force uintptr_t)(ptr)
 #define __my_cpu_var(var)      (*__my_cpu_ptr(&(var)))
 #define __percpu_arg(x)                __percpu_prefix "%" #x

but I get a crash in arch/x86/kernel/cpu/common.c

fatal error: error in backend: Unsupported expression in static initializer: addrspacecast (ptr addrspace(256) @const_pcpu_hot to ptr)
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.	Program arguments: /mnt/nvme/tmp/build/llvm-project/final/bin/clang --target=x86_64-linux-gnu -fintegrated-as -Werror=unknown-warning-option -Werror=ignored-optimization-argument -Werror=option-ignored -Werror=unused-command-line-argument -fmacro-prefix-map=/home/nathan/cbl/src/dev/linux-next/= -std=gnu11 -fshort-wchar -funsigned-char -fno-common -fno-PIE -fno-strict-aliasing -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -mno-avx -fcf-protection=branch -fno-jump-tables -m64 -falign-loops=1 -mno-80387 -mno-fp-ret-in-387 -mstack-alignment=8 -mskip-rax-setup -mtune=generic -mno-red-zone -mcmodel=kernel -Wno-sign-compare -fno-asynchronous-unwind-tables -mretpoline-external-thunk -mindirect-branch-cs-prefix -mfunction-return=thunk-extern -fpatchable-function-entry=16,16 -fno-delete-null-pointer-checks -O2 -fstack-protector-strong -fomit-frame-pointer -ftrivial-auto-var-init=zero -fno-stack-clash-protection -falign-functions=16 -fstrict-flex-arrays=3 -fno-strict-overflow -fno-stack-check -Wall -Wundef -Werror=implicit-function-declaration -Werror=implicit-int -Werror=return-type -Werror=strict-prototypes -Wno-format-security -Wno-trigraphs -Wno-frame-address -Wno-address-of-packed-member -Wmissing-declarations -Wmissing-prototypes -Wframe-larger-than=2048 -Wno-gnu -Wno-unused-but-set-variable -Wno-unused-const-variable -Wvla -Wno-pointer-sign -Wcast-function-type -Wimplicit-fallthrough -Werror=date-time -Werror=incompatible-pointer-types -Wenum-conversion -Wno-unused-but-set-variable -Wno-unused-const-variable -Wno-format-overflow -Wno-format-truncation -Wno-override-init -Wno-pointer-to-enum-cast -Wno-tautological-constant-out-of-range-compare -Wno-unaligned-access -Wno-cast-function-type-strict -Wno-enum-compare-conditional -Wno-enum-enum-conversion -Wno-missing-field-initializers -Wno-type-limits -Wno-shift-negative-value -Wno-sign-compare -Werror -nostdinc -I/home/nathan/cbl/src/dev/linux-next/arch/x86/include -I./arch/x86/include/generated -I/home/nathan/cbl/src/dev/linux-next/include -I./include -I/home/nathan/cbl/src/dev/linux-next/arch/x86/include/uapi -I./arch/x86/include/generated/uapi -I/home/nathan/cbl/src/dev/linux-next/include/uapi -I./include/generated/uapi -include /home/nathan/cbl/src/dev/linux-next/include/linux/compiler-version.h -include /home/nathan/cbl/src/dev/linux-next/include/linux/kconfig.h -include /home/nathan/cbl/src/dev/linux-next/include/linux/compiler_types.h -D__KERNEL__ -I /home/nathan/cbl/src/dev/linux-next/arch/x86/kernel/cpu -I ./arch/x86/kernel/cpu -DKBUILD_MODFILE=\"arch/x86/kernel/cpu/common\" -DKBUILD_BASENAME=\"common\" -DKBUILD_MODNAME=\"common\" -D__KBUILD_MODNAME=kmod_common -c -Wp,-MMD,arch/x86/kernel/cpu/.common.o.d -fcolor-diagnostics -o arch/x86/kernel/cpu/common.o /home/nathan/cbl/src/dev/linux-next/arch/x86/kernel/cpu/common.c
1.	<eof> parser at end of file
2.	Code generation
 #0 0x0000557a7233aa18 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x534aa18)
 #1 0x0000557a7233859e llvm::sys::RunSignalHandlers() (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x534859e)
 #2 0x0000557a722ba2a7 (anonymous namespace)::CrashRecoveryContextImpl::HandleCrash(int, unsigned long) CrashRecoveryContext.cpp:0:0
 #3 0x0000557a722ba23f llvm::CrashRecoveryContext::HandleExit(int) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x52ca23f)
 #4 0x0000557a72334f07 llvm::sys::Process::Exit(int, bool) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5344f07)
 #5 0x0000557a704f85a3 (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x35085a3)
 #6 0x0000557a722bfe42 llvm::report_fatal_error(llvm::Twine const&, bool) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x52cfe42)
 #7 0x0000557a7322e423 llvm::AsmPrinter::lowerConstant(llvm::Constant const*) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x623e423)
 #8 0x0000557a7322e8b0 emitGlobalConstantImpl(llvm::DataLayout const&, llvm::Constant const*, llvm::AsmPrinter&, llvm::Constant const*, unsigned long, llvm::DenseMap<unsigned long, llvm::SmallVector<llvm::GlobalAlias const*, 1u>, llvm::DenseMapInfo<unsigned long, void>, llvm::detail::DenseMapPair<unsigned long, llvm::SmallVector<llvm::GlobalAlias const*, 1u>>>*) AsmPrinter.cpp:0:0
 #9 0x0000557a73220dd0 llvm::AsmPrinter::emitGlobalConstant(llvm::DataLayout const&, llvm::Constant const*, llvm::DenseMap<unsigned long, llvm::SmallVector<llvm::GlobalAlias const*, 1u>, llvm::DenseMapInfo<unsigned long, void>, llvm::detail::DenseMapPair<unsigned long, llvm::SmallVector<llvm::GlobalAlias const*, 1u>>>*) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x6230dd0)
#10 0x0000557a7322032a llvm::AsmPrinter::emitGlobalVariable(llvm::GlobalVariable const*) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x623032a)
#11 0x0000557a73229cfc llvm::AsmPrinter::doFinalization(llvm::Module&) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x6239cfc)
#12 0x0000557a71e7affa llvm::FPPassManager::doFinalization(llvm::Module&) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x4e8affa)
#13 0x0000557a71e73ace llvm::legacy::PassManagerImpl::run(llvm::Module&) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x4e83ace)
#14 0x0000557a72acadc1 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5adadc1)
#15 0x0000557a72af017f clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5b0017f)
#16 0x0000557a73d8f9e9 clang::ParseAST(clang::Sema&, bool, bool) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x6d9f9e9)
#17 0x0000557a72eeb70f clang::FrontendAction::Execute() (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5efb70f)
#18 0x0000557a72e602fd clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5e702fd)
#19 0x0000557a72fa9bea clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5fb9bea)
#20 0x0000557a704f818f cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x350818f)
#21 0x0000557a704f4919 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#22 0x0000557a72ce5619 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0>(long) Job.cpp:0:0
#23 0x0000557a722ba1d6 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x52ca1d6)
#24 0x0000557a72ce4d23 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5cf4d23)
#25 0x0000557a72ca3b83 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5cb3b83)
#26 0x0000557a72ca3e37 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5cb3e37)
#27 0x0000557a72cc0da9 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x5cd0da9)
#28 0x0000557a704f40bc clang_main(int, char**, llvm::ToolContext const&) (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x35040bc)
#29 0x0000557a70503ba7 main (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x3513ba7)
#30 0x00007ff40e261cd0 (/usr/lib/libc.so.6+0x25cd0)
#31 0x00007ff40e261d8a __libc_start_main (/usr/lib/libc.so.6+0x25d8a)
#32 0x0000557a704f2365 _start (/mnt/nvme/tmp/build/llvm-project/final/bin/clang+0x3502365)
clang: error: clang frontend command failed with exit code 70 (use -v to see invocation)
ClangBuiltLinux clang version 19.0.0git (https://github.com/llvm/llvm-project 5b702be1e80b8733786ac48ceaf04f2936616d1b)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /mnt/nvme/tmp/build/llvm-project/final/bin
clang: note: diagnostic msg: 
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang: note: diagnostic msg: /tmp/common-b4a03e.c
clang: note: diagnostic msg: /tmp/common-b4a03e.sh
clang: note: diagnostic msg: 

********************

The crash occurs without the __typeof_unqual__ diff if KCFLAGS=-Wno-duplicate-decl-specifier is passed, so it seems like the problems are unrelated.

I'll try to reduce something out for the crash later.

@nathanchance nathanchance added [BUG] Untriaged Something isn't working [ARCH] x86_64 This bug impacts ARCH=x86_64 Compiler crash This bug makes Clang crash, emitting a backtrace labels Apr 3, 2024
@nathanchance
Copy link
Member Author

The -Wduplicate-decl-specifier instance can be worked around in the kernel: https://lore.kernel.org/lkml/[email protected]/

Uros reported the crash upstream and I reduced something down for the LLVM folks to take a look at: llvm/llvm-project#93449

@nathanchance nathanchance added Reported upstream This bug was filed on LLVM’s issue tracker, Phabricator, or the kernel mailing list. and removed [BUG] Untriaged Something isn't working labels May 29, 2024
marcosps added a commit to marcosps/clang-extract that referenced this issue Aug 16, 2024
This happens on recent kernel tree due to issues with LLVM. As we don't
need any backends and only need to parse the source code we can disable
the warning and move on.

For more information about the issue take a look into
ClangBuiltLinux/linux#2013 and
llvm/llvm-project#93449.

Signed-off-by: Marcos Paulo de Souza <[email protected]>
giulianobelinassi pushed a commit to SUSE/clang-extract that referenced this issue Aug 16, 2024
This happens on recent kernel tree due to issues with LLVM. As we don't
need any backends and only need to parse the source code we can disable
the warning and move on.

For more information about the issue take a look into
ClangBuiltLinux/linux#2013 and
llvm/llvm-project#93449.

Signed-off-by: Marcos Paulo de Souza <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[ARCH] x86_64 This bug impacts ARCH=x86_64 Compiler crash This bug makes Clang crash, emitting a backtrace Reported upstream This bug was filed on LLVM’s issue tracker, Phabricator, or the kernel mailing list.
Projects
None yet
Development

No branches or pull requests

1 participant