Skip to content

Commit 9af5de3

Browse files
authored
[driver] Fix sanitizer libc++ runtime linking (#120370)
1. -f[no-]sanitize-link-c++-runtime suppose to override defauld behavior implied from `CCCIsCXX` 2. Take into account -nostdlib++ (unblocks #108357) 3. Fix typo hasFlag vs hasArg.
1 parent 1a87f07 commit 9af5de3

File tree

3 files changed

+79
-15
lines changed

3 files changed

+79
-15
lines changed

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1098,10 +1098,11 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
10981098
options::OPT_fno_sanitize_link_runtime, LinkRuntimes);
10991099

11001100
// Parse -link-cxx-sanitizer flag.
1101-
LinkCXXRuntimes = Args.hasArg(options::OPT_fsanitize_link_cxx_runtime,
1102-
options::OPT_fno_sanitize_link_cxx_runtime,
1103-
LinkCXXRuntimes) ||
1104-
D.CCCIsCXX();
1101+
LinkCXXRuntimes =
1102+
D.CCCIsCXX() && !Args.hasArg(clang::driver::options::OPT_nostdlibxx);
1103+
LinkCXXRuntimes =
1104+
Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1105+
options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
11051106

11061107
NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
11071108
options::OPT_fmemory_profile_EQ,

clang/test/Driver/sanitizer-ld.c

Lines changed: 73 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -132,18 +132,81 @@
132132
// RUN: -resource-dir=%S/Inputs/empty_resource_dir \
133133
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
134134
// RUN: | FileCheck --check-prefix=CHECK-ASAN-LINUX-CXX %s
135-
//
136-
// CHECK-ASAN-LINUX-CXX: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}"
135+
136+
// RUN: %clangxx -### %s 2>&1 \
137+
// RUN: --target=i386-unknown-linux -fuse-ld=ld -stdlib=platform -fsanitize=address \
138+
// RUN: -resource-dir=%S/Inputs/empty_resource_dir \
139+
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
140+
// RUN: -fsanitize-link-c++-runtime \
141+
// RUN: | FileCheck --check-prefix=CHECK-ASAN-LINUX-CXX %s
142+
137143
// CHECK-ASAN-LINUX-CXX-NOT: "-lc"
138-
// CHECK-ASAN-LINUX-CXX: "--whole-archive" "{{.*}}libclang_rt.asan.a" "--no-whole-archive"
139-
// CHECK-ASAN-LINUX-CXX: "--whole-archive" "{{.*}}libclang_rt.asan_cxx.a" "--no-whole-archive"
140144
// CHECK-ASAN-LINUX-CXX-NOT: "--dynamic-list"
141-
// CHECK-ASAN-LINUX-CXX: "--export-dynamic"
142-
// CHECK-ASAN-LINUX-CXX: stdc++
143-
// CHECK-ASAN-LINUX-CXX: "-lpthread"
144-
// CHECK-ASAN-LINUX-CXX: "-lrt"
145-
// CHECK-ASAN-LINUX-CXX: "-ldl"
146-
// CHECK-ASAN-LINUX-CXX: "-lresolv"
145+
// CHECK-ASAN-LINUX-CXX: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}"
146+
// CHECK-ASAN-LINUX-CXX-SAME: "--whole-archive" "{{.*}}libclang_rt.asan.a" "--no-whole-archive"
147+
// CHECK-ASAN-LINUX-CXX-SAME: "--whole-archive" "{{.*}}libclang_rt.asan_cxx.a" "--no-whole-archive"
148+
// CHECK-ASAN-LINUX-CXX-SAME: "--export-dynamic"
149+
// CHECK-ASAN-LINUX-CXX-SAME: stdc++
150+
// CHECK-ASAN-LINUX-CXX-SAME: "-lpthread"
151+
// CHECK-ASAN-LINUX-CXX-SAME: "-lrt"
152+
// CHECK-ASAN-LINUX-CXX-SAME: "-ldl"
153+
// CHECK-ASAN-LINUX-CXX-SAME: "-lresolv"
154+
155+
// RUN: %clang -### %s 2>&1 \
156+
// RUN: --target=i386-unknown-linux -fuse-ld=ld -stdlib=platform -fsanitize=address \
157+
// RUN: -resource-dir=%S/Inputs/empty_resource_dir \
158+
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
159+
// RUN: -fno-sanitize-link-c++-runtime \
160+
// RUN: | FileCheck --check-prefix=CHECK-ASAN-LINUX-CNOCXX %s
161+
162+
// CHECK-ASAN-LINUX-CNOCXX-NOT: "-lc"
163+
// CHECK-ASAN-LINUX-CNOCXX-NOT: libclang_rt.asan_cxx
164+
// CHECK-ASAN-LINUX-CNOCXX-NOT: "--dynamic-list"
165+
// CHECK-ASAN-LINUX-CNOCXX-NOT: stdc++
166+
// CHECK-ASAN-LINUX-CNOCXX: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}"
167+
// CHECK-ASAN-LINUX-CNOCXX-SAME: "--whole-archive" "{{.*}}libclang_rt.asan.a" "--no-whole-archive"
168+
// CHECK-ASAN-LINUX-CNOCXX-SAME: "--export-dynamic"
169+
// CHECK-ASAN-LINUX-CNOCXX-SAME: "-lpthread"
170+
// CHECK-ASAN-LINUX-CNOCXX-SAME: "-lrt"
171+
// CHECK-ASAN-LINUX-CNOCXX-SAME: "-ldl"
172+
// CHECK-ASAN-LINUX-CNOCXX-SAME: "-lresolv"
173+
174+
// RUN: %clangxx -### %s 2>&1 \
175+
// RUN: --target=i386-unknown-linux -fuse-ld=ld -stdlib=platform -fsanitize=address \
176+
// RUN: -resource-dir=%S/Inputs/empty_resource_dir \
177+
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
178+
// RUN: -fno-sanitize-link-c++-runtime \
179+
// RUN: | FileCheck --check-prefix=CHECK-ASAN-LINUX-NOCXX %s
180+
181+
// CHECK-ASAN-LINUX-NOCXX-NOT: "-lc"
182+
// CHECK-ASAN-LINUX-NOCXX-NOT: libclang_rt.asan_cxx
183+
// CHECK-ASAN-LINUX-NOCXX-NOT: "--dynamic-list"
184+
// CHECK-ASAN-LINUX-NOCXX: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}"
185+
// CHECK-ASAN-LINUX-NOCXX-SAME: "--whole-archive" "{{.*}}libclang_rt.asan.a" "--no-whole-archive"
186+
// CHECK-ASAN-LINUX-NOCXX-SAME: "--export-dynamic"
187+
// CHECK-ASAN-LINUX-NOCXX-SAME: stdc++
188+
// CHECK-ASAN-LINUX-NOCXX-SAME: "-lpthread"
189+
// CHECK-ASAN-LINUX-NOCXX-SAME: "-lrt"
190+
// CHECK-ASAN-LINUX-NOCXX-SAME: "-ldl"
191+
// CHECK-ASAN-LINUX-NOCXX-SAME: "-lresolv"
192+
193+
// RUN: %clangxx -### %s 2>&1 \
194+
// RUN: --target=i386-unknown-linux -fuse-ld=ld -stdlib=platform -fsanitize=address \
195+
// RUN: -resource-dir=%S/Inputs/empty_resource_dir \
196+
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
197+
// RUN: -nostdlib++ \
198+
// RUN: | FileCheck --check-prefix=CHECK-ASAN-LINUX-NOSTDCXX %s
199+
200+
// CHECK-ASAN-LINUX-NOSTDCXX-NOT: "-lc"
201+
// CHECK-ASAN-LINUX-NOSTDCXX-NOT: libclang_rt.asan_cxx
202+
// CHECK-ASAN-LINUX-NOSTDCXX-NOT: "--dynamic-list"
203+
// CHECK-ASAN-LINUX-NOSTDCXX: "{{(.*[^-.0-9A-Z_a-z])?}}ld{{(.exe)?}}"
204+
// CHECK-ASAN-LINUX-NOSTDCXX-SAME: "--whole-archive" "{{.*}}libclang_rt.asan.a" "--no-whole-archive"
205+
// CHECK-ASAN-LINUX-NOSTDCXX-SAME: "--export-dynamic"
206+
// CHECK-ASAN-LINUX-NOSTDCXX-SAME: "-lpthread"
207+
// CHECK-ASAN-LINUX-NOSTDCXX-SAME: "-lrt"
208+
// CHECK-ASAN-LINUX-NOSTDCXX-SAME: "-ldl"
209+
// CHECK-ASAN-LINUX-NOSTDCXX-SAME: "-lresolv"
147210

148211
// RUN: %clang -### %s -o /dev/null -fsanitize=address \
149212
// RUN: --target=i386-unknown-linux -fuse-ld=ld -stdlib=platform \

compiler-rt/test/hwasan/TestCases/sizes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This test requires operator new to be intercepted by the hwasan runtime,
22
// so we need to avoid linking against libc++.
3-
// RUN: %clangxx_hwasan %s -nostdlib++ -lstdc++ -o %t || %clangxx_hwasan %s -o %t
3+
// RUN: %clangxx_hwasan %s -nostdlib++ -lstdc++ -fsanitize-link-c++-runtime -o %t || %clangxx_hwasan %s -o %t
44
// RUN: %env_hwasan_opts=allocator_may_return_null=0 not %run %t malloc 2>&1 | FileCheck %s --check-prefix=CHECK-max
55
// RUN: %env_hwasan_opts=allocator_may_return_null=1 %run %t malloc 2>&1
66
// RUN: %env_hwasan_opts=allocator_may_return_null=0 not %run %t malloc max 2>&1 | FileCheck %s --check-prefix=CHECK-max

0 commit comments

Comments
 (0)