Skip to content

Commit 7787764

Browse files
committed
clang/win: Add a flag to disable default-linking of compiler-rt libraries
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 #81037.
1 parent 1fb3ea6 commit 7787764

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
@@ -5502,6 +5502,14 @@ def fno_rtlib_add_rpath: Flag<["-"], "fno-rtlib-add-rpath">,
55025502
Visibility<[ClangOption, FlangOption]>,
55035503
HelpText<"Do not add -rpath with architecture-specific resource directory to the linker flags. "
55045504
"When --hip-link is specified, do not add -rpath with HIP runtime library directory to the linker flags">;
5505+
def frtlib_defaultlib : Flag<["-"], "frtlib-defaultlib">,
5506+
Visibility<[ClangOption, CLOption]>,
5507+
Group<f_Group>,
5508+
HelpText<"On Windows, emit /defaultlib: directives to link compiler-rt libraries (default)">;
5509+
def fno_rtlib_defaultlib : Flag<["-"], "fno-rtlib-defaultlib">,
5510+
Visibility<[ClangOption, CLOption]>,
5511+
Group<f_Group>,
5512+
HelpText<"On Windows, do not emit /defaultlib: directives to link compiler-rt libraries">;
55055513
def offload_add_rpath: Flag<["--"], "offload-add-rpath">,
55065514
Flags<[NoArgumentUnused]>,
55075515
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)