diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index de8f1769a5f4..a574f41d8c55 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -38,6 +38,7 @@ def u_Group : OptionGroup<"">; def pedantic_Group : OptionGroup<"">, Group; +def reserved_lib_Group : OptionGroup<"">; // Temporary groups for clang options which we know we don't support, // but don't want to verbosely warn the user about. @@ -742,4 +743,8 @@ def _write_user_dependencies : Flag<"--write-user-dependencies">, Alias; def _ : Joined<"--">, Flags<[Unsupported]>; // Special internal option to handle -Xlinker --no-demangle. -def Z_Xlinker__no_demangle : Flag<"-Z-Xlinker-no-demangle">, Flags<[Unsupported]>; +def Z_Xlinker__no_demangle : Flag<"-Z-Xlinker-no-demangle">, Flags<[Unsupported, NoArgumentUnused]>; + +// Reserved library options. +def Z_reserved_lib_stdcxx : Flag<"-Z-reserved-lib-stdc++">, + Flags<[LinkerInput, NoArgumentUnused, Unsupported]>, Group; diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index f5ba96549bac..3707acad2499 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 7866ad67bc02..6d66af50c501 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."); }