Skip to content

Commit 1d7086e

Browse files
authored
clang/win: Add a flag to disable default-linking of compiler-rt libraries (#89642)
For ASan, users already manually have to pass in the path to the lib, and for other libraries they have to pass in the path to the libpath. With LLVM's unreliable name of the lib (due to LLVM_ENABLE_PER_TARGET_RUNTIME_DIR confusion and whatnot), it's useful to be able to opt in to just explicitly passing the paths to the libs everywhere. Follow-up of sorts to https://reviews.llvm.org/D65543, and to #87866.
1 parent 8317d36 commit 1d7086e

File tree

6 files changed

+41
-4
lines changed

6 files changed

+41
-4
lines changed

clang/docs/UsersManual.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4921,6 +4921,9 @@ directory. Using the example installation above, this would mean passing
49214921
If the user links the program with the ``clang`` or ``clang-cl`` drivers, the
49224922
driver will pass this flag for them.
49234923

4924+
The auto-linking can be disabled with -fno-rtlib-defaultlib. If that flag is
4925+
used, pass the complete flag to required libraries as described for ASan below.
4926+
49244927
If the linker cannot find the appropriate library, it will emit an error like
49254928
this::
49264929

clang/include/clang/Driver/Options.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5508,6 +5508,14 @@ def fno_rtlib_add_rpath: Flag<["-"], "fno-rtlib-add-rpath">,
55085508
Visibility<[ClangOption, FlangOption]>,
55095509
HelpText<"Do not add -rpath with architecture-specific resource directory to the linker flags. "
55105510
"When --hip-link is specified, do not add -rpath with HIP runtime library directory to the linker flags">;
5511+
def frtlib_defaultlib : Flag<["-"], "frtlib-defaultlib">,
5512+
Visibility<[ClangOption, CLOption]>,
5513+
Group<f_Group>,
5514+
HelpText<"On Windows, emit /defaultlib: directives to link compiler-rt libraries (default)">;
5515+
def fno_rtlib_defaultlib : Flag<["-"], "fno-rtlib-defaultlib">,
5516+
Visibility<[ClangOption, CLOption]>,
5517+
Group<f_Group>,
5518+
HelpText<"On Windows, do not emit /defaultlib: directives to link compiler-rt libraries">;
55115519
def offload_add_rpath: Flag<["--"], "offload-add-rpath">,
55125520
Flags<[NoArgumentUnused]>,
55135521
Alias<frtlib_add_rpath>;

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,7 +1192,9 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
11921192
BinaryMetadataIgnorelistFiles);
11931193
}
11941194

1195-
if (TC.getTriple().isOSWindows() && needsUbsanRt()) {
1195+
if (TC.getTriple().isOSWindows() && needsUbsanRt() &&
1196+
Args.hasFlag(options::OPT_frtlib_defaultlib,
1197+
options::OPT_fno_rtlib_defaultlib, true)) {
11961198
// Instruct the code generator to embed linker directives in the object file
11971199
// that cause the required runtime libraries to be linked.
11981200
CmdArgs.push_back(
@@ -1203,7 +1205,9 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
12031205
"--dependent-lib=" +
12041206
TC.getCompilerRTBasename(Args, "ubsan_standalone_cxx")));
12051207
}
1206-
if (TC.getTriple().isOSWindows() && needsStatsRt()) {
1208+
if (TC.getTriple().isOSWindows() && needsStatsRt() &&
1209+
Args.hasFlag(options::OPT_frtlib_defaultlib,
1210+
options::OPT_fno_rtlib_defaultlib, true)) {
12071211
CmdArgs.push_back(Args.MakeArgString(
12081212
"--dependent-lib=" + TC.getCompilerRTBasename(Args, "stats_client")));
12091213

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,9 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, Compilation &C,
637637
ProfileGenerateArg->getValue()));
638638
// The default is to use Clang Instrumentation.
639639
CmdArgs.push_back("-fprofile-instrument=clang");
640-
if (TC.getTriple().isWindowsMSVCEnvironment()) {
640+
if (TC.getTriple().isWindowsMSVCEnvironment() &&
641+
Args.hasFlag(options::OPT_frtlib_defaultlib,
642+
options::OPT_fno_rtlib_defaultlib, true)) {
641643
// Add dependent lib for clang_rt.profile
642644
CmdArgs.push_back(Args.MakeArgString(
643645
"--dependent-lib=" + TC.getCompilerRTBasename(Args, "profile")));
@@ -656,7 +658,9 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, Compilation &C,
656658
CmdArgs.push_back("-fprofile-instrument=csllvm");
657659
}
658660
if (PGOGenArg) {
659-
if (TC.getTriple().isWindowsMSVCEnvironment()) {
661+
if (TC.getTriple().isWindowsMSVCEnvironment() &&
662+
Args.hasFlag(options::OPT_frtlib_defaultlib,
663+
options::OPT_fno_rtlib_defaultlib, true)) {
660664
// Add dependent lib for clang_rt.profile
661665
CmdArgs.push_back(Args.MakeArgString(
662666
"--dependent-lib=" + TC.getCompilerRTBasename(Args, "profile")));

clang/test/Driver/cl-options.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,16 @@
7070
// fsanitize_address: -fsanitize=address
7171

7272
// RUN: %clang_cl -### /FA -fprofile-instr-generate -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-INSTR-GENERATE %s
73+
// RUN: %clang_cl -### /FA -fprofile-instr-generate -fno-rtlib-defaultlib -frtlib-defaultlib -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-INSTR-GENERATE %s
7374
// RUN: %clang_cl -### /FA -fprofile-instr-generate=/tmp/somefile.profraw -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-INSTR-GENERATE-FILE %s
7475
// RUN: %clang_cl -### /FAcsu -fprofile-instr-generate -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-INSTR-GENERATE %s
7576
// RUN: %clang_cl -### /FAcsu -fprofile-instr-generate=/tmp/somefile.profraw -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-INSTR-GENERATE-FILE %s
7677
// CHECK-PROFILE-INSTR-GENERATE: "-fprofile-instrument=clang" "--dependent-lib=clang_rt.profile{{[^"]*}}.lib"
7778
// CHECK-PROFILE-INSTR-GENERATE-FILE: "-fprofile-instrument-path=/tmp/somefile.profraw"
7879

80+
// RUN: %clang_cl -### /FA -fprofile-instr-generate -fno-rtlib-defaultlib -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-INSTR-GENERATE-NODEF %s
81+
// CHECK-PROFILE-INSTR-GENERATE-NODEF-NOT: "--dependent-lib=clang_rt.profile{{[^"]*}}.lib"
82+
7983
// RUN: %clang_cl -### /FA -fprofile-generate -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-GENERATE %s
8084
// RUN: %clang_cl -### /FAcsu -fprofile-generate -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-GENERATE %s
8185
// CHECK-PROFILE-GENERATE: "-fprofile-instrument=llvm" "--dependent-lib=clang_rt.profile{{[^"]*}}.lib"

clang/test/Driver/sanitizer-ld.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,10 +802,24 @@
802802
// RUN: --target=i686-pc-windows \
803803
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
804804
// RUN: | FileCheck --check-prefix=CHECK-CFI-STATS-WIN32 %s
805+
// RUN: not %clang -fsanitize=cfi -fsanitize-stats -### %s 2>&1 \
806+
// RUN: --target=i686-pc-windows \
807+
// RUN: -fno-rtlib-defaultlib \
808+
// RUN: -frtlib-defaultlib \
809+
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
810+
// RUN: | FileCheck --check-prefix=CHECK-CFI-STATS-WIN32 %s
805811
// CHECK-CFI-STATS-WIN32: "--dependent-lib=clang_rt.stats_client{{(-i386)?}}.lib"
806812
// CHECK-CFI-STATS-WIN32: "--dependent-lib=clang_rt.stats{{(-i386)?}}.lib"
807813
// CHECK-CFI-STATS-WIN32: "--linker-option=/include:___sanitizer_stats_register"
808814

815+
// RUN: not %clang -fsanitize=cfi -fsanitize-stats -### %s 2>&1 \
816+
// RUN: --target=i686-pc-windows \
817+
// RUN: -fno-rtlib-defaultlib \
818+
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
819+
// RUN: | FileCheck --check-prefix=CHECK-CFI-STATS-WIN32-NODEF %s
820+
// CHECK-CFI-STATS-WIN32-NODEF-NOT: "--dependent-lib=clang_rt.stats_client{{(-i386)?}}.lib"
821+
// CHECK-CFI-STATS-WIN32-NODEF-NOT: "--dependent-lib=clang_rt.stats{{(-i386)?}}.lib"
822+
809823
// RUN: %clang -### %s 2>&1 \
810824
// RUN: --target=arm-linux-androideabi -fuse-ld=ld -fsanitize=safe-stack \
811825
// RUN: --sysroot=%S/Inputs/basic_android_tree \

0 commit comments

Comments
 (0)