[cfe-commits] r105964 - in /cfe/trunk: include/clang/Driver/Arg.h include/clang/Driver/Options.td lib/Driver/Driver.cpp test/Driver/Xlinker-args.c
Daniel Dunbar
daniel at zuster.org
Mon Jun 14 14:23:13 PDT 2010
Author: ddunbar
Date: Mon Jun 14 16:23:12 2010
New Revision: 105964
URL: http://llvm.org/viewvc/llvm-project?rev=105964&view=rev
Log:
Driver: Dissect -Wl, and -Xlinker arguments to remove --no-demangle, which was a
collect2 option that is passed by some projects (notably WebKit).
Added:
cfe/trunk/test/Driver/Xlinker-args.c
Modified:
cfe/trunk/include/clang/Driver/Arg.h
cfe/trunk/include/clang/Driver/Options.td
cfe/trunk/lib/Driver/Driver.cpp
Modified: cfe/trunk/include/clang/Driver/Arg.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Arg.h?rev=105964&r1=105963&r2=105964&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Arg.h (original)
+++ cfe/trunk/include/clang/Driver/Arg.h Mon Jun 14 16:23:12 2010
@@ -12,6 +12,7 @@
#include "Util.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringRef.h"
#include <vector>
#include <string>
@@ -91,6 +92,13 @@
return Values;
}
+ bool containsValue(llvm::StringRef Value) const {
+ for (unsigned i = 0, e = getNumValues(); i != e; ++i)
+ if (Values[i] == Value)
+ return true;
+ return false;
+ }
+
/// render - Append the argument onto the given array as strings.
void render(const ArgList &Args, ArgStringList &Output) const;
Modified: cfe/trunk/include/clang/Driver/Options.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=105964&r1=105963&r2=105964&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Options.td (original)
+++ cfe/trunk/include/clang/Driver/Options.td Mon Jun 14 16:23:12 2010
@@ -715,3 +715,6 @@
def _write_dependencies : Flag<"--write-dependencies">, Alias<MD>;
def _write_user_dependencies : Flag<"--write-user-dependencies">, Alias<MMD>;
def _ : Joined<"--">, Flags<[Unsupported]>;
+
+// Special internal option to handle -Xlinker --no-demangle.
+def Z_Xlinker__no_demangle : Flag<"-Z-Xlinker-no-demangle">, Flags<[Unsupported]>;
Modified: cfe/trunk/lib/Driver/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=105964&r1=105963&r2=105964&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Driver.cpp (original)
+++ cfe/trunk/lib/Driver/Driver.cpp Mon Jun 14 16:23:12 2010
@@ -114,8 +114,32 @@
DerivedArgList *DAL = new DerivedArgList(Args);
for (ArgList::const_iterator it = Args.begin(),
- ie = Args.end(); it != ie; ++it)
+ ie = Args.end(); it != ie; ++it) {
+ const Arg *A = *it;
+
+ // Unfortunately, we have to parse some forwarding options (-Xassembler,
+ // -Xlinker, -Xpreprocessor) because we either integrate their functionality
+ // (assembler and preprocessor), or bypass a previous driver ('collect2').
+ if (A->getOption().matches(options::OPT_Xlinker) &&
+ A->getValue(Args) == llvm::StringRef("--no-demangle")) {
+ DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_Xlinker__no_demangle));
+ continue;
+ } else if (A->getOption().matches(options::OPT_Wl_COMMA) &&
+ A->containsValue("--no-demangle")) {
+ // Add the rewritten no-demangle argument.
+ DAL->AddFlagArg(A, Opts->getOption(options::OPT_Z_Xlinker__no_demangle));
+
+ // Add the remaining values as Xlinker arguments.
+ for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
+ if (llvm::StringRef(A->getValue(Args, i)) != "--no-demangle")
+ DAL->AddSeparateArg(A, Opts->getOption(options::OPT_Xlinker),
+ A->getValue(Args, i));
+
+ continue;
+ }
+
DAL->append(*it);
+ }
return DAL;
}
@@ -322,7 +346,7 @@
llvm::outs() << CLANG_VERSION_STRING "\n";
return false;
}
-
+
if (C.getArgs().hasArg(options::OPT__print_diagnostic_categories)) {
PrintDiagnosticCategories(llvm::outs());
return false;
@@ -1230,7 +1254,7 @@
// TCE is an osless target
if (Triple.getArchName() == "tce")
- return createTCEHostInfo(*this, Triple);
+ return createTCEHostInfo(*this, Triple);
switch (Triple.getOS()) {
case llvm::Triple::AuroraUX:
Added: cfe/trunk/test/Driver/Xlinker-args.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Xlinker-args.c?rev=105964&view=auto
==============================================================================
--- cfe/trunk/test/Driver/Xlinker-args.c (added)
+++ cfe/trunk/test/Driver/Xlinker-args.c Mon Jun 14 16:23:12 2010
@@ -0,0 +1,9 @@
+// Check that we extract --no-demangle from '-Xlinker' and '-Wl,', since that
+// was a collect2 argument.
+
+// RUN: %clang --ccc-host-triple i386-apple-darwin9 -### \
+// RUN: -Xlinker one -Xlinker --no-demangle \
+// RUN: -Wl,two,--no-demangle,three -Xlinker four %s 2> %t
+// RUN: FileCheck < %t %s
+//
+// CHECK: "one" "two" "three" "four"
More information about the cfe-commits
mailing list