diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 12 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 19 |
2 files changed, 27 insertions, 4 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index f5ba96549ba..3707acad249 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -115,6 +115,7 @@ InputArgList *Driver::ParseArgStrings(const char **ArgBegin, DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { DerivedArgList *DAL = new DerivedArgList(Args); + bool HasNostdlib = Args.hasArg(options::OPT_nostdlib); for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { const Arg *A = *it; @@ -157,6 +158,17 @@ DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const { continue; } + // Rewrite reserved library names, unless -nostdlib is present. + if (!HasNostdlib && A->getOption().matches(options::OPT_l)) { + llvm::StringRef Value = A->getValue(Args); + + if (Value == "stdc++") { + DAL->AddFlagArg(A, Opts->getOption( + options::OPT_Z_reserved_lib_stdcxx)); + continue; + } + } + DAL->append(*it); } diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 7866ad67bc0..6d66af50c50 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -104,10 +104,20 @@ static void AddLinkerInputs(const ToolChain &TC, << TC.getTripleString(); } - if (II.isFilename()) + // Add filenames immediately. + if (II.isFilename()) { CmdArgs.push_back(II.getFilename()); - else - II.getInputArg().renderAsInput(Args, CmdArgs); + continue; + } + + // Otherwise, this is a linker input argument. + const Arg &A = II.getInputArg(); + + // Handle reserved library options. + if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) { + TC.AddClangCXXStdlibLibArgs(Args, CmdArgs); + } else + A.renderAsInput(Args, CmdArgs); } } @@ -3242,7 +3252,8 @@ void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA, ArgStringList CmdArgs; if (Output.isFilename()) { - CmdArgs.push_back(Args.MakeArgString(std::string("-out:") + Output.getFilename())); + CmdArgs.push_back(Args.MakeArgString(std::string("-out:") + + Output.getFilename())); } else { assert(Output.isNothing() && "Invalid output."); } |