Skip to content

Commit 90637aa

Browse files
Take care of OPT_linker_option_Group to produce desired behaviour
The -l args values are handled by OPT_l and OPT_linker_option_Group, to do this have created a helper method under Toolchain
1 parent fd2fcbb commit 90637aa

File tree

6 files changed

+47
-12
lines changed

6 files changed

+47
-12
lines changed

include/swift/Driver/ToolChain.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,14 @@ class ToolChain {
249249
const Driver &getDriver() const { return D; }
250250
const llvm::Triple &getTriple() const { return Triple; }
251251

252+
static void addLinkedLibArgs(const llvm::opt::ArgList &Args,
253+
llvm::opt::ArgStringList &FrontendArgs);
254+
255+
static void addArgsFromGroupExcept(const llvm::opt::ArgList &Args,
256+
llvm::opt::ArgStringList &FrontendArgs,
257+
llvm::opt::OptSpecifier groupID,
258+
llvm::opt::OptSpecifier exceptID);
259+
252260
/// Construct a Job for the action \p JA, taking the given information into
253261
/// account.
254262
///

lib/Driver/DarwinToolChains.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,10 @@ toolchains::Darwin::constructInvocation(const DynamicLinkJobAction &job,
796796
Arguments.push_back("-no_objc_category_merging");
797797

798798
// These custom arguments should be right before the object file at the end.
799-
context.Args.AddAllArgs(Arguments, options::OPT_linker_option_Group);
799+
ToolChain::addArgsFromGroupExcept(context.Args, Arguments,
800+
options::OPT_linker_option_Group,
801+
options::OPT_l);
802+
ToolChain::addLinkedLibArgs(context.Args, Arguments);
800803
context.Args.AddAllArgValues(Arguments, options::OPT_Xlinker);
801804

802805
// This should be the last option, for convenience in checking output.

lib/Driver/ToolChain.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,31 @@ mergeBatchInputs(ArrayRef<const Job *> jobs,
287287
return false;
288288
}
289289

290+
/// Remove space for -l arg values from \c Args and add to \c FrontendArgs
291+
void ToolChain::addLinkedLibArgs(const llvm::opt::ArgList &Args,
292+
llvm::opt::ArgStringList &FrontendArgs) {
293+
Args.getLastArg(options::OPT_l);
294+
for (auto Arg : Args.getAllArgValues(options::OPT_l)) {
295+
const std::string lArg("-l" + Arg);
296+
FrontendArgs.push_back(Args.MakeArgString(Twine(lArg)));
297+
}
298+
}
299+
300+
/// Add all values of a \c groupID from \c Args to \c FrontendArgs .
301+
/// except for \c exceptID .
302+
void ToolChain::addArgsFromGroupExcept(const llvm::opt::ArgList &Args,
303+
llvm::opt::ArgStringList &FrontendArgs,
304+
llvm::opt::OptSpecifier groupID,
305+
llvm::opt::OptSpecifier exceptID) {
306+
for (auto *Arg : Args) {
307+
if (Arg->getOption().matches(groupID) &&
308+
!Arg->getOption().matches(exceptID)) {
309+
Arg->claim();
310+
Arg->render(Args, FrontendArgs);
311+
}
312+
}
313+
}
314+
290315
/// Construct a \c BatchJob by merging the constituent \p jobs' CommandOutput,
291316
/// input \c Job and \c Action members. Call through to \c constructInvocation
292317
/// on \p BatchJob, to build the \c InvocationInfo.

lib/Driver/ToolChains.cpp

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,6 @@ static void addLTOArgs(const OutputInfo &OI, ArgStringList &arguments) {
142142
}
143143
}
144144

145-
static void addLinkedLibArgs(const ArgList &Args, ArgStringList &FrontendArgs) {
146-
Args.getLastArg(options::OPT_l);
147-
for (auto Arg : Args.getAllArgValues(options::OPT_l)) {
148-
const std::string lArg("-l" + Arg);
149-
FrontendArgs.push_back(Args.MakeArgString(Twine(lArg)));
150-
}
151-
}
152145

153146
void ToolChain::addCommonFrontendArgs(const OutputInfo &OI,
154147
const CommandOutput &output,
@@ -851,7 +844,7 @@ ToolChain::constructInvocation(const InterpretJobAction &job,
851844
Arguments.push_back(context.Args.MakeArgString(context.OI.ModuleName));
852845

853846
context.Args.AddAllArgs(Arguments, options::OPT_framework);
854-
addLinkedLibArgs(context.Args, Arguments);
847+
ToolChain::addLinkedLibArgs(context.Args, Arguments);
855848

856849
// The immediate arguments must be last.
857850
context.Args.AddLastArg(Arguments, options::OPT__DASH_DASH);
@@ -1200,7 +1193,7 @@ ToolChain::constructInvocation(const REPLJobAction &job,
12001193

12011194
context.Args.AddLastArg(FrontendArgs, options::OPT_import_objc_header);
12021195
context.Args.AddAllArgs(FrontendArgs, options::OPT_framework, options::OPT_L);
1203-
addLinkedLibArgs(context.Args, FrontendArgs);
1196+
ToolChain::addLinkedLibArgs(context.Args, FrontendArgs);
12041197

12051198
if (!useLLDB) {
12061199
FrontendArgs.insert(FrontendArgs.begin(), {"-frontend", "-repl"});

lib/Driver/UnixToolChains.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,10 @@ toolchains::GenericUnix::constructInvocation(const DynamicLinkJobAction &job,
358358
}
359359

360360
// These custom arguments should be right before the object file at the end.
361-
context.Args.AddAllArgs(Arguments, options::OPT_linker_option_Group);
361+
ToolChain::addArgsFromGroupExcept(context.Args, Arguments,
362+
options::OPT_linker_option_Group,
363+
options::OPT_l);
364+
ToolChain::addLinkedLibArgs(context.Args, Arguments);
362365
context.Args.AddAllArgs(Arguments, options::OPT_Xlinker);
363366
context.Args.AddAllArgValues(Arguments, options::OPT_Xclang_linker);
364367

lib/Driver/WindowsToolChains.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,10 @@ toolchains::Windows::constructInvocation(const DynamicLinkJobAction &job,
179179
}
180180

181181
context.Args.AddAllArgs(Arguments, options::OPT_Xlinker);
182-
context.Args.AddAllArgs(Arguments, options::OPT_linker_option_Group);
182+
ToolChain::addArgsFromGroupExcept(context.Args, Arguments,
183+
options::OPT_linker_option_Group,
184+
options::OPT_l);
185+
ToolChain::addLinkedLibArgs(context.Args, Arguments);
183186
context.Args.AddAllArgValues(Arguments, options::OPT_Xclang_linker);
184187

185188
// Run clang in verbose mode if "-v" is set

0 commit comments

Comments
 (0)