diff options
author | Khem Raj <raj.khem@gmail.com> | 2019-09-08 13:54:55 -0700 |
---|---|---|
committer | Khem Raj <raj.khem@gmail.com> | 2019-09-09 12:41:29 -0700 |
commit | 6ff4226426c634eb5b026af0619dcb1eaf7dffc8 (patch) | |
tree | f7f4a6e0147600a3bbb82059a775b52fa0ca3fc1 | |
parent | f23263ad99b7b7de8986ac41f72db6274aaa63e2 (diff) | |
download | meta-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_.patch | 115 | ||||
-rw-r--r-- | recipes-devtools/clang/common.inc | 1 |
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 @@ | |||
1 | From c2a7db3073f1991ee3be8e61acb750b40bbd71f3 Mon Sep 17 00:00:00 2001 | ||
2 | From: Fangrui Song <maskray@google.com> | ||
3 | Date: Tue, 6 Aug 2019 06:25:32 +0000 | ||
4 | Subject: [PATCH] [Driver] Prioritize SYSROOT/usr/include over | ||
5 | RESOURCE_DIR/include on linux-musl | ||
6 | |||
7 | 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. | ||
8 | Reorder 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 | |||
11 | gcc 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 | |||
23 | This is different from a glibc-based distribution where RESOURCE_DIR/include is placed before SYSROOT/usr/include. | ||
24 | |||
25 | According 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 | |||
29 | Reviewed by: phosek | ||
30 | |||
31 | Differential Revision: https://reviews.llvm.org/D65699 | ||
32 | |||
33 | llvm-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 | |||
40 | diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp | ||
41 | index 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, | ||
71 | diff --git a/clang/test/Driver/linux-musl-header-search.cpp b/clang/test/Driver/linux-musl-header-search.cpp | ||
72 | new file mode 100644 | ||
73 | index 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 |