Skip to content

Commit 0f34f1b

Browse files
MaskRaytstellar
authored andcommitted
Merging r367981:
------------------------------------------------------------------------ r367981 | maskray | 2019-08-05 23:25:32 -0700 (Mon, 05 Aug 2019) | 27 lines [Driver] Prioritize SYSROOT/usr/include over RESOURCE_DIR/include on linux-musl On a musl-based Linux distribution, stdalign.h stdarg.h stdbool.h stddef.h stdint.h stdnoreturn.h are expected to be provided by musl (/usr/include), instead of RESOURCE_DIR/include. Reorder RESOURCE_DIR/include to fix the search order problem. (Currently musl doesn't provide stdatomic.h. stdatomic.h is still found in RESOURCE_DIR/include.) gcc on musl has a similar search order: ``` /usr/lib/gcc/x86_64-alpine-linux-musl/8.3.0/../../../../include/c++/8.3.0 /usr/lib/gcc/x86_64-alpine-linux-musl/8.3.0/../../../../include/c++/8.3.0/x86_64-alpine-linux-musl /usr/lib/gcc/x86_64-alpine-linux-musl/8.3.0/../../../../include/c++/8.3.0/backward /usr/local/include /usr/include/fortify /usr/include /usr/lib/gcc/x86_64-alpine-linux-musl/8.3.0/include ``` This is different from a glibc-based distribution where RESOURCE_DIR/include is placed before SYSROOT/usr/include. According to the maintainer of musl: > musl does not support use/mixing of compiler-provided std headers with its headers, and intentionally has no mechanism for communicating with such headers as to which types have already been defined or still need to be defined. If the current include order, with clang's headers before the libc ones, works in some situations, it's only by accident. Reviewed by: phosek Differential Revision: https://reviews.llvm.org/D65699 ------------------------------------------------------------------------
1 parent 6c86aa6 commit 0f34f1b

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -658,11 +658,11 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
658658
if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
659659
addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
660660

661-
if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
662-
SmallString<128> P(D.ResourceDir);
663-
llvm::sys::path::append(P, "include");
664-
addSystemInclude(DriverArgs, CC1Args, P);
665-
}
661+
SmallString<128> ResourceDirInclude(D.ResourceDir);
662+
llvm::sys::path::append(ResourceDirInclude, "include");
663+
if (!DriverArgs.hasArg(options::OPT_nobuiltininc) &&
664+
(!getTriple().isMusl() || DriverArgs.hasArg(options::OPT_nostdlibinc)))
665+
addSystemInclude(DriverArgs, CC1Args, ResourceDirInclude);
666666

667667
if (DriverArgs.hasArg(options::OPT_nostdlibinc))
668668
return;
@@ -860,6 +860,9 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
860860
addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
861861

862862
addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
863+
864+
if (!DriverArgs.hasArg(options::OPT_nobuiltininc) && getTriple().isMusl())
865+
addSystemInclude(DriverArgs, CC1Args, ResourceDirInclude);
863866
}
864867

865868
static std::string DetectLibcxxIncludePath(llvm::vfs::FileSystem &vfs,
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \
2+
// RUN: -target x86_64-linux-musl -stdlib=libc++ \
3+
// RUN: -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \
4+
// RUN: -resource-dir=%S/Inputs/resource_dir \
5+
// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree --gcc-toolchain= \
6+
// RUN: | FileCheck --check-prefix=CHECK-X86-64-LIBCXX %s
7+
8+
// RESOURCE_DIR/include comes after /usr/include on linux-musl.
9+
// This is different from a glibc-based distribution.
10+
// CHECK-X86-64-LIBCXX: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
11+
// CHECK-X86-64-LIBCXX: "-isysroot" "[[SYSROOT:[^"]+]]"
12+
// CHECK-X86-64-LIBCXX: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
13+
// CHECK-X86-64-LIBCXX: "-internal-isystem" "[[SYSROOT]]/usr/local/include"
14+
// CHECK-X86-64-LIBCXX: "-internal-externc-isystem" "[[SYSROOT]]/usr/include"
15+
// CHECK-X86-64-LIBCXX: "-internal-isystem" "[[RESOURCE_DIR]]{{/|\\\\}}include"
16+
17+
// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only -nobuiltininc 2>&1 \
18+
// RUN: -target x86_64-linux-musl \
19+
// RUN: -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \
20+
// RUN: -resource-dir=%S/Inputs/resource_dir \
21+
// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree --gcc-toolchain= \
22+
// RUN: | FileCheck --check-prefix=CHECK-NOBUILTININC %s
23+
24+
// CHECK-NOBUILTININC: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
25+
// CHECK-NOBUILTININC-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{/|\\\\}}include"
26+
27+
// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only -nostdlibinc 2>&1 \
28+
// RUN: -target x86_64-linux-musl \
29+
// RUN: -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \
30+
// RUN: -resource-dir=%S/Inputs/resource_dir \
31+
// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree --gcc-toolchain= \
32+
// RUN: | FileCheck --check-prefix=CHECK-NOSTDLIBINC %s
33+
34+
// CHECK-NOSTDLIBINC: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
35+
// CHECK-NOSTDLIBINC-NOT: "-internal-externc-isystem"
36+
// CHECK-NOSTDLIBINC-NOT: "-internal-isystem"
37+
// CHECK-NOSTDLIBINC: "-internal-isystem" "[[RESOURCE_DIR]]{{/|\\\\}}include"
38+
// CHECK-NOSTDLIBINC-NOT: "-internal-externc-isystem"
39+
// CHECK-NOSTDLIBINC-NOT: "-internal-isystem"

0 commit comments

Comments
 (0)