summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2019-09-08 13:54:55 -0700
committerKhem Raj <raj.khem@gmail.com>2019-09-09 12:41:29 -0700
commit6ff4226426c634eb5b026af0619dcb1eaf7dffc8 (patch)
treef7f4a6e0147600a3bbb82059a775b52fa0ca3fc1
parentf23263ad99b7b7de8986ac41f72db6274aaa63e2 (diff)
downloadmeta-clang-6ff4226426c634eb5b026af0619dcb1eaf7dffc8.tar.gz
clang: Backport a fix to re-arrange header include order on musl
Signed-off-by: Khem Raj <raj.khem@gmail.com>
-rw-r--r--recipes-devtools/clang/clang/0022-Driver-Prioritize-SYSROOT-usr-include-over-RESOURCE_.patch115
-rw-r--r--recipes-devtools/clang/common.inc1
2 files changed, 116 insertions, 0 deletions
diff --git a/recipes-devtools/clang/clang/0022-Driver-Prioritize-SYSROOT-usr-include-over-RESOURCE_.patch b/recipes-devtools/clang/clang/0022-Driver-Prioritize-SYSROOT-usr-include-over-RESOURCE_.patch
new file mode 100644
index 0000000..df2d496
--- /dev/null
+++ b/recipes-devtools/clang/clang/0022-Driver-Prioritize-SYSROOT-usr-include-over-RESOURCE_.patch
@@ -0,0 +1,115 @@
1From c2a7db3073f1991ee3be8e61acb750b40bbd71f3 Mon Sep 17 00:00:00 2001
2From: Fangrui Song <maskray@google.com>
3Date: Tue, 6 Aug 2019 06:25:32 +0000
4Subject: [PATCH] [Driver] Prioritize SYSROOT/usr/include over
5 RESOURCE_DIR/include on linux-musl
6
7On 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.
8Reorder RESOURCE_DIR/include to fix the search order problem.
9(Currently musl doesn't provide stdatomic.h. stdatomic.h is still found in RESOURCE_DIR/include.)
10
11gcc on musl has a similar search order:
12
13```
14 /usr/lib/gcc/x86_64-alpine-linux-musl/8.3.0/../../../../include/c++/8.3.0
15 /usr/lib/gcc/x86_64-alpine-linux-musl/8.3.0/../../../../include/c++/8.3.0/x86_64-alpine-linux-musl
16 /usr/lib/gcc/x86_64-alpine-linux-musl/8.3.0/../../../../include/c++/8.3.0/backward
17 /usr/local/include
18 /usr/include/fortify
19 /usr/include
20 /usr/lib/gcc/x86_64-alpine-linux-musl/8.3.0/include
21```
22
23This is different from a glibc-based distribution where RESOURCE_DIR/include is placed before SYSROOT/usr/include.
24
25According to the maintainer of musl:
26
27> 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.
28
29Reviewed by: phosek
30
31Differential Revision: https://reviews.llvm.org/D65699
32
33llvm-svn: 367981
34---
35 clang/lib/Driver/ToolChains/Linux.cpp | 13 ++++---
36 .../test/Driver/linux-musl-header-search.cpp | 39 +++++++++++++++++++
37 2 files changed, 47 insertions(+), 5 deletions(-)
38 create mode 100644 clang/test/Driver/linux-musl-header-search.cpp
39
40diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
41index fc7d6c17484..ff671fe27d2 100644
42--- a/clang/lib/Driver/ToolChains/Linux.cpp
43+++ b/clang/lib/Driver/ToolChains/Linux.cpp
44@@ -668,11 +668,11 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
45 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
46 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
47
48- if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
49- SmallString<128> P(D.ResourceDir);
50- llvm::sys::path::append(P, "include");
51- addSystemInclude(DriverArgs, CC1Args, P);
52- }
53+ SmallString<128> ResourceDirInclude(D.ResourceDir);
54+ llvm::sys::path::append(ResourceDirInclude, "include");
55+ if (!DriverArgs.hasArg(options::OPT_nobuiltininc) &&
56+ (!getTriple().isMusl() || DriverArgs.hasArg(options::OPT_nostdlibinc)))
57+ addSystemInclude(DriverArgs, CC1Args, ResourceDirInclude);
58
59 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
60 return;
61@@ -870,6 +870,9 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
62 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
63
64 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
65+
66+ if (!DriverArgs.hasArg(options::OPT_nobuiltininc) && getTriple().isMusl())
67+ addSystemInclude(DriverArgs, CC1Args, ResourceDirInclude);
68 }
69
70 static std::string DetectLibcxxIncludePath(llvm::vfs::FileSystem &vfs,
71diff --git a/clang/test/Driver/linux-musl-header-search.cpp b/clang/test/Driver/linux-musl-header-search.cpp
72new file mode 100644
73index 00000000000..9fee0360068
74--- /dev/null
75+++ b/clang/test/Driver/linux-musl-header-search.cpp
76@@ -0,0 +1,39 @@
77+// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \
78+// RUN: -target x86_64-linux-musl -stdlib=libc++ \
79+// RUN: -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \
80+// RUN: -resource-dir=%S/Inputs/resource_dir \
81+// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree --gcc-toolchain= \
82+// RUN: | FileCheck --check-prefix=CHECK-X86-64-LIBCXX %s
83+
84+// RESOURCE_DIR/include comes after /usr/include on linux-musl.
85+// This is different from a glibc-based distribution.
86+// CHECK-X86-64-LIBCXX: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
87+// CHECK-X86-64-LIBCXX: "-isysroot" "[[SYSROOT:[^"]+]]"
88+// CHECK-X86-64-LIBCXX: "-internal-isystem" "[[SYSROOT]]/usr/include/c++/v1"
89+// CHECK-X86-64-LIBCXX: "-internal-isystem" "[[SYSROOT]]/usr/local/include"
90+// CHECK-X86-64-LIBCXX: "-internal-externc-isystem" "[[SYSROOT]]/usr/include"
91+// CHECK-X86-64-LIBCXX: "-internal-isystem" "[[RESOURCE_DIR]]{{/|\\\\}}include"
92+
93+// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only -nobuiltininc 2>&1 \
94+// RUN: -target x86_64-linux-musl \
95+// RUN: -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \
96+// RUN: -resource-dir=%S/Inputs/resource_dir \
97+// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree --gcc-toolchain= \
98+// RUN: | FileCheck --check-prefix=CHECK-NOBUILTININC %s
99+
100+// CHECK-NOBUILTININC: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
101+// CHECK-NOBUILTININC-NOT: "-internal-isystem" "[[RESOURCE_DIR]]{{/|\\\\}}include"
102+
103+// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only -nostdlibinc 2>&1 \
104+// RUN: -target x86_64-linux-musl \
105+// RUN: -ccc-install-dir %S/Inputs/basic_linux_tree/usr/bin \
106+// RUN: -resource-dir=%S/Inputs/resource_dir \
107+// RUN: --sysroot=%S/Inputs/basic_linux_libcxx_tree --gcc-toolchain= \
108+// RUN: | FileCheck --check-prefix=CHECK-NOSTDLIBINC %s
109+
110+// CHECK-NOSTDLIBINC: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
111+// CHECK-NOSTDLIBINC-NOT: "-internal-externc-isystem"
112+// CHECK-NOSTDLIBINC-NOT: "-internal-isystem"
113+// CHECK-NOSTDLIBINC: "-internal-isystem" "[[RESOURCE_DIR]]{{/|\\\\}}include"
114+// CHECK-NOSTDLIBINC-NOT: "-internal-externc-isystem"
115+// CHECK-NOSTDLIBINC-NOT: "-internal-isystem"
diff --git a/recipes-devtools/clang/common.inc b/recipes-devtools/clang/common.inc
index 6c03622..9adeac8 100644
--- a/recipes-devtools/clang/common.inc
+++ b/recipes-devtools/clang/common.inc
@@ -29,6 +29,7 @@ SRC_URI = "\
29 file://0019-clang-Add-lpthread-and-ldl-along-with-lunwind-for-st.patch \ 29 file://0019-clang-Add-lpthread-and-ldl-along-with-lunwind-for-st.patch \
30 file://0020-clang-default-to-lp64d-ABI-and-rv64gc-ISA.patch \ 30 file://0020-clang-default-to-lp64d-ABI-and-rv64gc-ISA.patch \
31 file://0021-lldb-Do-not-look-for-interpreter.patch \ 31 file://0021-lldb-Do-not-look-for-interpreter.patch \
32 file://0022-Driver-Prioritize-SYSROOT-usr-include-over-RESOURCE_.patch \
32" 33"
33 34
34# Fallback to no-PIE if not set 35# Fallback to no-PIE if not set