Skip to content

Commit d9d20bd

Browse files
authored
Honor -fno-sanitize-link-runtime for libclang_rt.asan_static (#66414)
https://reviews.llvm.org/D122407 added a static link against libclang_rt.asan_static whenever ASAN is linked, but ignored the -fno-sanitize-link-runtime flag. Every other conditional in collectSanitizerRuntimes is already checking for SanArgs.linkRuntimes(), move it to the top of the function so that newly added conditionals don't need to remember to check it.
1 parent c0d5d36 commit d9d20bd

File tree

2 files changed

+29
-27
lines changed

2 files changed

+29
-27
lines changed

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,28 +1317,28 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
13171317
const SanitizerArgs &SanArgs = TC.getSanitizerArgs(Args);
13181318
// Collect shared runtimes.
13191319
if (SanArgs.needsSharedRt()) {
1320-
if (SanArgs.needsAsanRt() && SanArgs.linkRuntimes()) {
1320+
if (SanArgs.needsAsanRt()) {
13211321
SharedRuntimes.push_back("asan");
13221322
if (!Args.hasArg(options::OPT_shared) && !TC.getTriple().isAndroid())
13231323
HelperStaticRuntimes.push_back("asan-preinit");
13241324
}
1325-
if (SanArgs.needsMemProfRt() && SanArgs.linkRuntimes()) {
1325+
if (SanArgs.needsMemProfRt()) {
13261326
SharedRuntimes.push_back("memprof");
13271327
if (!Args.hasArg(options::OPT_shared) && !TC.getTriple().isAndroid())
13281328
HelperStaticRuntimes.push_back("memprof-preinit");
13291329
}
1330-
if (SanArgs.needsUbsanRt() && SanArgs.linkRuntimes()) {
1330+
if (SanArgs.needsUbsanRt()) {
13311331
if (SanArgs.requiresMinimalRuntime())
13321332
SharedRuntimes.push_back("ubsan_minimal");
13331333
else
13341334
SharedRuntimes.push_back("ubsan_standalone");
13351335
}
1336-
if (SanArgs.needsScudoRt() && SanArgs.linkRuntimes()) {
1336+
if (SanArgs.needsScudoRt()) {
13371337
SharedRuntimes.push_back("scudo_standalone");
13381338
}
1339-
if (SanArgs.needsTsanRt() && SanArgs.linkRuntimes())
1339+
if (SanArgs.needsTsanRt())
13401340
SharedRuntimes.push_back("tsan");
1341-
if (SanArgs.needsHwasanRt() && SanArgs.linkRuntimes()) {
1341+
if (SanArgs.needsHwasanRt()) {
13421342
if (SanArgs.needsHwasanAliasesRt())
13431343
SharedRuntimes.push_back("hwasan_aliases");
13441344
else
@@ -1349,7 +1349,7 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
13491349
}
13501350

13511351
// The stats_client library is also statically linked into DSOs.
1352-
if (SanArgs.needsStatsRt() && SanArgs.linkRuntimes())
1352+
if (SanArgs.needsStatsRt())
13531353
StaticRuntimes.push_back("stats_client");
13541354

13551355
// Always link the static runtime regardless of DSO or executable.
@@ -1365,20 +1365,19 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
13651365
// Each static runtime that has a DSO counterpart above is excluded below,
13661366
// but runtimes that exist only as static are not affected by needsSharedRt.
13671367

1368-
if (!SanArgs.needsSharedRt() && SanArgs.needsAsanRt() && SanArgs.linkRuntimes()) {
1368+
if (!SanArgs.needsSharedRt() && SanArgs.needsAsanRt()) {
13691369
StaticRuntimes.push_back("asan");
13701370
if (SanArgs.linkCXXRuntimes())
13711371
StaticRuntimes.push_back("asan_cxx");
13721372
}
13731373

1374-
if (!SanArgs.needsSharedRt() && SanArgs.needsMemProfRt() &&
1375-
SanArgs.linkRuntimes()) {
1374+
if (!SanArgs.needsSharedRt() && SanArgs.needsMemProfRt()) {
13761375
StaticRuntimes.push_back("memprof");
13771376
if (SanArgs.linkCXXRuntimes())
13781377
StaticRuntimes.push_back("memprof_cxx");
13791378
}
13801379

1381-
if (!SanArgs.needsSharedRt() && SanArgs.needsHwasanRt() && SanArgs.linkRuntimes()) {
1380+
if (!SanArgs.needsSharedRt() && SanArgs.needsHwasanRt()) {
13821381
if (SanArgs.needsHwasanAliasesRt()) {
13831382
StaticRuntimes.push_back("hwasan_aliases");
13841383
if (SanArgs.linkCXXRuntimes())
@@ -1389,22 +1388,21 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
13891388
StaticRuntimes.push_back("hwasan_cxx");
13901389
}
13911390
}
1392-
if (SanArgs.needsDfsanRt() && SanArgs.linkRuntimes())
1391+
if (SanArgs.needsDfsanRt())
13931392
StaticRuntimes.push_back("dfsan");
1394-
if (SanArgs.needsLsanRt() && SanArgs.linkRuntimes())
1393+
if (SanArgs.needsLsanRt())
13951394
StaticRuntimes.push_back("lsan");
1396-
if (SanArgs.needsMsanRt() && SanArgs.linkRuntimes()) {
1395+
if (SanArgs.needsMsanRt()) {
13971396
StaticRuntimes.push_back("msan");
13981397
if (SanArgs.linkCXXRuntimes())
13991398
StaticRuntimes.push_back("msan_cxx");
14001399
}
1401-
if (!SanArgs.needsSharedRt() && SanArgs.needsTsanRt() &&
1402-
SanArgs.linkRuntimes()) {
1400+
if (!SanArgs.needsSharedRt() && SanArgs.needsTsanRt()) {
14031401
StaticRuntimes.push_back("tsan");
14041402
if (SanArgs.linkCXXRuntimes())
14051403
StaticRuntimes.push_back("tsan_cxx");
14061404
}
1407-
if (!SanArgs.needsSharedRt() && SanArgs.needsUbsanRt() && SanArgs.linkRuntimes()) {
1405+
if (!SanArgs.needsSharedRt() && SanArgs.needsUbsanRt()) {
14081406
if (SanArgs.requiresMinimalRuntime()) {
14091407
StaticRuntimes.push_back("ubsan_minimal");
14101408
} else {
@@ -1413,24 +1411,24 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
14131411
StaticRuntimes.push_back("ubsan_standalone_cxx");
14141412
}
14151413
}
1416-
if (SanArgs.needsSafeStackRt() && SanArgs.linkRuntimes()) {
1414+
if (SanArgs.needsSafeStackRt()) {
14171415
NonWholeStaticRuntimes.push_back("safestack");
14181416
RequiredSymbols.push_back("__safestack_init");
14191417
}
1420-
if (!(SanArgs.needsSharedRt() && SanArgs.needsUbsanRt() && SanArgs.linkRuntimes())) {
1421-
if (SanArgs.needsCfiRt() && SanArgs.linkRuntimes())
1418+
if (!(SanArgs.needsSharedRt() && SanArgs.needsUbsanRt())) {
1419+
if (SanArgs.needsCfiRt())
14221420
StaticRuntimes.push_back("cfi");
1423-
if (SanArgs.needsCfiDiagRt() && SanArgs.linkRuntimes()) {
1421+
if (SanArgs.needsCfiDiagRt()) {
14241422
StaticRuntimes.push_back("cfi_diag");
14251423
if (SanArgs.linkCXXRuntimes())
14261424
StaticRuntimes.push_back("ubsan_standalone_cxx");
14271425
}
14281426
}
1429-
if (SanArgs.needsStatsRt() && SanArgs.linkRuntimes()) {
1427+
if (SanArgs.needsStatsRt()) {
14301428
NonWholeStaticRuntimes.push_back("stats");
14311429
RequiredSymbols.push_back("__sanitizer_stats_register");
14321430
}
1433-
if (!SanArgs.needsSharedRt() && SanArgs.needsScudoRt() && SanArgs.linkRuntimes()) {
1431+
if (!SanArgs.needsSharedRt() && SanArgs.needsScudoRt()) {
14341432
StaticRuntimes.push_back("scudo_standalone");
14351433
if (SanArgs.linkCXXRuntimes())
14361434
StaticRuntimes.push_back("scudo_standalone_cxx");
@@ -1441,13 +1439,15 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
14411439
// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
14421440
bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
14431441
ArgStringList &CmdArgs) {
1442+
const SanitizerArgs &SanArgs = TC.getSanitizerArgs(Args);
14441443
SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
14451444
NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1446-
collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
1447-
NonWholeStaticRuntimes, HelperStaticRuntimes,
1448-
RequiredSymbols);
1445+
if (SanArgs.linkRuntimes()) {
1446+
collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
1447+
NonWholeStaticRuntimes, HelperStaticRuntimes,
1448+
RequiredSymbols);
1449+
}
14491450

1450-
const SanitizerArgs &SanArgs = TC.getSanitizerArgs(Args);
14511451
// Inject libfuzzer dependencies.
14521452
if (SanArgs.needsFuzzer() && SanArgs.linkRuntimes() &&
14531453
!Args.hasArg(options::OPT_shared)) {

clang/test/Driver/sanitizer-ld.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
2424
// RUN: | FileCheck --check-prefix=CHECK-ASAN-NO-LINK-RUNTIME-LINUX %s
2525
//
26+
// CHECK-ASAN-NO-LINK-RUNTIME-LINUX-NOT: libclang_rt.asan_static-x86_64
2627
// CHECK-ASAN-NO-LINK-RUNTIME-LINUX-NOT: libclang_rt.asan-x86_64
2728

2829
// RUN: %clang -fsanitize=address -fno-sanitize-link-runtime -### %s 2>&1 \
@@ -31,6 +32,7 @@
3132
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
3233
// RUN: | FileCheck --check-prefix=CHECK-ASAN-NO-LINK-RUNTIME-DARWIN %s
3334
//
35+
// CHECK-ASAN-NO-LINK-RUNTIME-DARWIN-NOT: libclang_rt.asan_static
3436
// CHECK-ASAN-NO-LINK-RUNTIME-DARWIN-NOT: libclang_rt.asan
3537

3638
// RUN: %clang -fsanitize=address -### %s 2>&1 \

0 commit comments

Comments
 (0)