Skip to content

Commit bae383b

Browse files
authored
[Driver] Cache SanitizerArgs (NFC) (#119442)
The name getSanitizerArgs seems to mislead callers that this is a cheap function, but it extracts the SanitizerArgs each time it is called. So we try to reuse it a bit more.
1 parent bdaa82a commit bae383b

File tree

9 files changed

+38
-24
lines changed

9 files changed

+38
-24
lines changed

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,6 +1417,7 @@ void tools::addAsNeededOption(const ToolChain &TC,
14171417

14181418
void tools::linkSanitizerRuntimeDeps(const ToolChain &TC,
14191419
const llvm::opt::ArgList &Args,
1420+
const SanitizerArgs &SanArgs,
14201421
ArgStringList &CmdArgs) {
14211422
// Force linking against the system libraries sanitizers depends on
14221423
// (see PR15823 why this is necessary).
@@ -1443,18 +1444,18 @@ void tools::linkSanitizerRuntimeDeps(const ToolChain &TC,
14431444
// libresolv.a, even if exists, is an empty archive to satisfy POSIX -lresolv
14441445
// requirement.
14451446
if (TC.getTriple().isOSLinux() && !TC.getTriple().isAndroid() &&
1446-
!TC.getTriple().isMusl() && TC.getSanitizerArgs(Args).needsMsanRt())
1447+
!TC.getTriple().isMusl() && SanArgs.needsMsanRt())
14471448
CmdArgs.push_back("-lresolv");
14481449
}
14491450

14501451
static void
14511452
collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
1453+
const SanitizerArgs &SanArgs,
14521454
SmallVectorImpl<StringRef> &SharedRuntimes,
14531455
SmallVectorImpl<StringRef> &StaticRuntimes,
14541456
SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
14551457
SmallVectorImpl<StringRef> &HelperStaticRuntimes,
14561458
SmallVectorImpl<StringRef> &RequiredSymbols) {
1457-
const SanitizerArgs &SanArgs = TC.getSanitizerArgs(Args);
14581459
// Collect shared runtimes.
14591460
if (SanArgs.needsSharedRt()) {
14601461
if (SanArgs.needsAsanRt()) {
@@ -1588,12 +1589,12 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
15881589
// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
15891590
// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
15901591
bool tools::addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
1592+
const SanitizerArgs &SanArgs,
15911593
ArgStringList &CmdArgs) {
1592-
const SanitizerArgs &SanArgs = TC.getSanitizerArgs(Args);
15931594
SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
15941595
NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
15951596
if (SanArgs.linkRuntimes()) {
1596-
collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
1597+
collectSanitizerRuntimes(TC, Args, SanArgs, SharedRuntimes, StaticRuntimes,
15971598
NonWholeStaticRuntimes, HelperStaticRuntimes,
15981599
RequiredSymbols);
15991600
}

clang/lib/Driver/ToolChains/CommonArgs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ void addLinkerCompressDebugSectionsOption(const ToolChain &TC,
3838
void claimNoWarnArgs(const llvm::opt::ArgList &Args);
3939

4040
bool addSanitizerRuntimes(const ToolChain &TC, const llvm::opt::ArgList &Args,
41+
const SanitizerArgs &SanArgs,
4142
llvm::opt::ArgStringList &CmdArgs);
4243

4344
void linkSanitizerRuntimeDeps(const ToolChain &TC,
4445
const llvm::opt::ArgList &Args,
46+
const SanitizerArgs &SanArgs,
4547
llvm::opt::ArgStringList &CmdArgs);
4648

4749
bool addXRayRuntime(const ToolChain &TC, const llvm::opt::ArgList &Args,

clang/lib/Driver/ToolChains/FreeBSD.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,9 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
283283
D.getLTOMode() == LTOK_Thin);
284284
}
285285

286-
bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
286+
const SanitizerArgs &SanArgs = ToolChain.getSanitizerArgs(Args);
287+
bool NeedsSanitizerDeps =
288+
addSanitizerRuntimes(ToolChain, Args, SanArgs, CmdArgs);
287289
bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
288290
addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
289291
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
@@ -324,7 +326,7 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
324326
}
325327

326328
if (NeedsSanitizerDeps)
327-
linkSanitizerRuntimeDeps(ToolChain, Args, CmdArgs);
329+
linkSanitizerRuntimeDeps(ToolChain, Args, SanArgs, CmdArgs);
328330
if (NeedsXRayDeps)
329331
linkXRayRuntimeDeps(ToolChain, Args, CmdArgs);
330332
// FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding

clang/lib/Driver/ToolChains/Fuchsia.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ void fuchsia::Linker::ConstructJob(Compilation &C, const JobAction &JA,
184184
// Note that Fuchsia never needs to link in sanitizer runtime deps. Any
185185
// sanitizer runtimes with system dependencies use the `.deplibs` feature
186186
// instead.
187-
addSanitizerRuntimes(ToolChain, Args, CmdArgs);
187+
const SanitizerArgs &SanArgs = ToolChain.getSanitizerArgs(Args);
188+
addSanitizerRuntimes(ToolChain, Args, SanArgs, CmdArgs);
188189

189190
addXRayRuntime(ToolChain, Args, CmdArgs);
190191

@@ -317,10 +318,9 @@ Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple,
317318
Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, true);
318319
addMultilibFlag(Exceptions, "-fexceptions", Flags);
319320
addMultilibFlag(!Exceptions, "-fno-exceptions", Flags);
320-
addMultilibFlag(getSanitizerArgs(Args).needsAsanRt(), "-fsanitize=address",
321-
Flags);
322-
addMultilibFlag(getSanitizerArgs(Args).needsHwasanRt(),
323-
"-fsanitize=hwaddress", Flags);
321+
const SanitizerArgs &SanArgs = getSanitizerArgs(Args);
322+
addMultilibFlag(SanArgs.needsAsanRt(), "-fsanitize=address", Flags);
323+
addMultilibFlag(SanArgs.needsHwasanRt(), "-fsanitize=hwaddress", Flags);
324324

325325
addMultilibFlag(Args.getLastArgValue(options::OPT_fcxx_abi_EQ) == "itanium",
326326
"-fc++-abi=itanium", Flags);

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "clang/Driver/DriverDiagnostic.h"
2424
#include "clang/Driver/MultilibBuilder.h"
2525
#include "clang/Driver/Options.h"
26+
#include "clang/Driver/SanitizerArgs.h"
2627
#include "clang/Driver/Tool.h"
2728
#include "clang/Driver/ToolChain.h"
2829
#include "llvm/ADT/StringSet.h"
@@ -538,7 +539,9 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
538539
if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
539540
CmdArgs.push_back("--no-demangle");
540541

541-
bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
542+
const SanitizerArgs &SanArgs = ToolChain.getSanitizerArgs(Args);
543+
bool NeedsSanitizerDeps =
544+
addSanitizerRuntimes(ToolChain, Args, SanArgs, CmdArgs);
542545
bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
543546
addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs);
544547
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
@@ -583,7 +586,7 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
583586
CmdArgs.push_back("--start-group");
584587

585588
if (NeedsSanitizerDeps)
586-
linkSanitizerRuntimeDeps(ToolChain, Args, CmdArgs);
589+
linkSanitizerRuntimeDeps(ToolChain, Args, SanArgs, CmdArgs);
587590

588591
if (NeedsXRayDeps)
589592
linkXRayRuntimeDeps(ToolChain, Args, CmdArgs);

clang/lib/Driver/ToolChains/Hexagon.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "clang/Driver/DriverDiagnostic.h"
1414
#include "clang/Driver/InputInfo.h"
1515
#include "clang/Driver/Options.h"
16+
#include "clang/Driver/SanitizerArgs.h"
1617
#include "llvm/ADT/StringExtras.h"
1718
#include "llvm/Option/ArgList.h"
1819
#include "llvm/Support/FileSystem.h"
@@ -215,7 +216,8 @@ void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
215216
"-mcpu=hexagon" +
216217
toolchains::HexagonToolChain::GetTargetCPUVersion(Args)));
217218

218-
addSanitizerRuntimes(HTC, Args, CmdArgs);
219+
SanitizerArgs SanArgs = HTC.getSanitizerArgs(Args);
220+
addSanitizerRuntimes(HTC, Args, SanArgs, CmdArgs);
219221

220222
assert((Output.isFilename() || Output.isNothing()) && "Invalid output.");
221223
if (Output.isFilename()) {
@@ -301,7 +303,8 @@ constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
301303
bool UseShared = IsShared && !IsStatic;
302304
StringRef CpuVer = toolchains::HexagonToolChain::GetTargetCPUVersion(Args);
303305

304-
bool NeedsSanitizerDeps = addSanitizerRuntimes(HTC, Args, CmdArgs);
306+
const SanitizerArgs &SanArgs = HTC.getSanitizerArgs(Args);
307+
bool NeedsSanitizerDeps = addSanitizerRuntimes(HTC, Args, SanArgs, CmdArgs);
305308
bool NeedsXRayDeps = addXRayRuntime(HTC, Args, CmdArgs);
306309

307310
//----------------------------------------------------------------------------
@@ -371,7 +374,7 @@ constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
371374

372375
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
373376
if (NeedsSanitizerDeps) {
374-
linkSanitizerRuntimeDeps(HTC, Args, CmdArgs);
377+
linkSanitizerRuntimeDeps(HTC, Args, SanArgs, CmdArgs);
375378

376379
if (UNW != ToolChain::UNW_None)
377380
CmdArgs.push_back("-lunwind");

clang/lib/Driver/ToolChains/NetBSD.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,12 @@ void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
274274
options::OPT_s, options::OPT_t});
275275
ToolChain.AddFilePathLibArgs(Args, CmdArgs);
276276

277-
bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
277+
const SanitizerArgs &SanArgs = ToolChain.getSanitizerArgs(Args);
278+
bool NeedsSanitizerDeps =
279+
addSanitizerRuntimes(ToolChain, Args, SanArgs, CmdArgs);
278280
bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
279281
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
280282

281-
const SanitizerArgs &SanArgs = ToolChain.getSanitizerArgs(Args);
282283
if (SanArgs.needsSharedRt()) {
283284
CmdArgs.push_back("-rpath");
284285
CmdArgs.push_back(Args.MakeArgString(ToolChain.getCompilerRTPath()));
@@ -334,7 +335,7 @@ void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
334335
}
335336

336337
if (NeedsSanitizerDeps)
337-
linkSanitizerRuntimeDeps(ToolChain, Args, CmdArgs);
338+
linkSanitizerRuntimeDeps(ToolChain, Args, SanArgs, CmdArgs);
338339
if (NeedsXRayDeps)
339340
linkXRayRuntimeDeps(ToolChain, Args, CmdArgs);
340341
if (Args.hasArg(options::OPT_pthread))

clang/lib/Driver/ToolChains/OpenBSD.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,9 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
213213
D.getLTOMode() == LTOK_Thin);
214214
}
215215

216-
bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
216+
const SanitizerArgs &SanArgs = ToolChain.getSanitizerArgs(Args);
217+
bool NeedsSanitizerDeps =
218+
addSanitizerRuntimes(ToolChain, Args, SanArgs, CmdArgs);
217219
bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs);
218220
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
219221

@@ -251,7 +253,7 @@ void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
251253

252254
if (NeedsSanitizerDeps) {
253255
CmdArgs.push_back(ToolChain.getCompilerRTArgString(Args, "builtins"));
254-
linkSanitizerRuntimeDeps(ToolChain, Args, CmdArgs);
256+
linkSanitizerRuntimeDeps(ToolChain, Args, SanArgs, CmdArgs);
255257
}
256258
if (NeedsXRayDeps) {
257259
CmdArgs.push_back(ToolChain.getCompilerRTArgString(Args, "builtins"));

clang/lib/Driver/ToolChains/Solaris.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,8 @@ void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
203203

204204
Args.addAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group});
205205

206-
bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
206+
const SanitizerArgs &SA = ToolChain.getSanitizerArgs(Args);
207+
bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, SA, CmdArgs);
207208
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA);
208209

209210
if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs,
@@ -250,9 +251,8 @@ void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
250251
if (!Args.hasArg(options::OPT_shared)) {
251252
CmdArgs.push_back("-lgcc");
252253
}
253-
const SanitizerArgs &SA = ToolChain.getSanitizerArgs(Args);
254254
if (NeedsSanitizerDeps) {
255-
linkSanitizerRuntimeDeps(ToolChain, Args, CmdArgs);
255+
linkSanitizerRuntimeDeps(ToolChain, Args, SA, CmdArgs);
256256

257257
// Work around Solaris/amd64 ld bug when calling __tls_get_addr directly.
258258
// However, ld -z relax=transtls is available since Solaris 11.2, but not

0 commit comments

Comments
 (0)