aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/ToolChains.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-03-25 06:12:34 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-03-25 06:12:34 +0000
commit4e7e9cff2e3b1bf15da06a4284a936da15e19578 (patch)
tree3fafc92caaca76bd95b665c6cb6613a884e6493c /lib/Driver/ToolChains.cpp
parentf6dd66b7b80e2fb42628df2593b3948149a53a5f (diff)
Driver: Handle -Xarch_, including warning for nasty -Xarch_ use cases
we aren't going to support. For example: clang -Xarch_i386 -S -Xarch_i386 -o -Xarch_i386 myi386asm.s ... git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67680 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/ToolChains.cpp')
-rw-r--r--lib/Driver/ToolChains.cpp43
1 files changed, 41 insertions, 2 deletions
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index 898f12e8f2..866cfa15dc 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -12,7 +12,9 @@
#include "clang/Driver/Arg.h"
#include "clang/Driver/ArgList.h"
#include "clang/Driver/Driver.h"
+#include "clang/Driver/DriverDiagnostic.h"
#include "clang/Driver/HostInfo.h"
+#include "clang/Driver/Option.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/System/Path.h"
@@ -125,8 +127,45 @@ Tool &Darwin_X86::SelectTool(const Compilation &C,
}
DerivedArgList *Darwin_X86::TranslateArgs(InputArgList &Args) const {
- // FIXME: Implement!
- return new DerivedArgList(Args, true);
+ DerivedArgList *DAL = new DerivedArgList(Args, false);
+
+ for (ArgList::iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) {
+ Arg *A = *it;
+
+ if (A->getOption().matches(options::OPT_Xarch__)) {
+ // FIXME: Canonicalize name.
+ if (getArchName() != A->getValue(Args, 0))
+ continue;
+
+ // FIXME: The arg is leaked here, and we should have a nicer
+ // interface for this.
+ const Driver &D = getHost().getDriver();
+ unsigned Prev, Index = Prev = A->getIndex() + 1;
+ Arg *XarchArg = D.getOpts().ParseOneArg(Args, Index);
+
+ // If the argument parsing failed or more than one argument was
+ // consumed, the -Xarch_ argument's parameter tried to consume
+ // extra arguments. Emit an error and ignore.
+ //
+ // We also want to disallow any options which would alter the
+ // driver behavior; that isn't going to work in our model. We
+ // use isDriverOption() as an approximation, although things
+ // like -O4 are going to slip through.
+ if (!XarchArg || Index > Prev + 1 ||
+ XarchArg->getOption().isDriverOption()) {
+ D.Diag(clang::diag::err_drv_invalid_Xarch_argument)
+ << A->getAsString(Args);
+ continue;
+ }
+
+ A = XarchArg;
+ }
+
+ // FIXME: Translate.
+ DAL->append(A);
+ }
+
+ return DAL;
}
bool Darwin_X86::IsMathErrnoDefault() const {