summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-03-18 08:01:15 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-03-18 08:01:15 +0000
commit4b6058e33aebf20d1bed1252ddc78f4a05deb15b (patch)
tree3170014b13158dfdaffcf236007358e1da8c74cf /clang/lib
parent64a6a092b1f13a7d7aee9fbe143f0d9c5ce891b5 (diff)
downloadbcm5719-llvm-4b6058e33aebf20d1bed1252ddc78f4a05deb15b.tar.gz
bcm5719-llvm-4b6058e33aebf20d1bed1252ddc78f4a05deb15b.zip
Driver: Add "d" flag to Options.def for options which are completely
handled by driver. - This is not very precise, we use it to drive the "forward-to-gcc" predicate, when trying to talk to a generic gcc tool. - Slightly better than what ccc was doing, and should be good enough. Platforms which want a robust driver should implement a proper tool chain. llvm-svn: 67181
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Driver/OptTable.cpp16
-rw-r--r--clang/lib/Driver/Option.cpp3
2 files changed, 15 insertions, 4 deletions
diff --git a/clang/lib/Driver/OptTable.cpp b/clang/lib/Driver/OptTable.cpp
index 54e5ee1b6a2..7b7e2a7bbcc 100644
--- a/clang/lib/Driver/OptTable.cpp
+++ b/clang/lib/Driver/OptTable.cpp
@@ -29,7 +29,7 @@ struct Info {
static Info OptionInfos[] = {
// The InputOption info
- { "<input>", "", Option::InputClass, OPT_INVALID, OPT_INVALID, 0 },
+ { "<input>", "d", Option::InputClass, OPT_INVALID, OPT_INVALID, 0 },
// The UnknownOption info
{ "<unknown>", "", Option::UnknownClass, OPT_INVALID, OPT_INVALID, 0 },
@@ -107,14 +107,24 @@ Option *OptTable::constructOption(options::ID id) const {
for (const char *s = info.Flags; *s; ++s) {
switch (*s) {
default: assert(0 && "Invalid option flag.");
- case 'J': Opt->setForceJoinedRender(true); break;
- case 'S': Opt->setForceSeparateRender(true); break;
+ case 'J':
+ assert(info.Kind == Option::SeparateClass && "Invalid option.");
+ Opt->setForceJoinedRender(true); break;
+ case 'S':
+ assert(info.Kind == Option::JoinedClass && "Invalid option.");
+ Opt->setForceSeparateRender(true); break;
+ case 'd': Opt->setForwardToGCC(false); break;
case 'i': Opt->setNoOptAsInput(true); break;
case 'l': Opt->setLinkerInput(true); break;
case 'u': Opt->setUnsupported(true); break;
}
}
+ // Linker inputs shouldn't be forwarded to GCC as arguments (they
+ // will, however, be forwarded as inputs).
+ if (Opt->isLinkerInput())
+ Opt->setForwardToGCC(false);
+
return Opt;
}
diff --git a/clang/lib/Driver/Option.cpp b/clang/lib/Driver/Option.cpp
index 503b54d8fe6..12d501b3cb9 100644
--- a/clang/lib/Driver/Option.cpp
+++ b/clang/lib/Driver/Option.cpp
@@ -20,7 +20,8 @@ Option::Option(OptionClass _Kind, options::ID _ID, const char *_Name,
const OptionGroup *_Group, const Option *_Alias)
: Kind(_Kind), ID(_ID), Name(_Name), Group(_Group), Alias(_Alias),
Unsupported(false), LinkerInput(false), NoOptAsInput(false),
- ForceSeparateRender(false), ForceJoinedRender(false)
+ ForceSeparateRender(false), ForceJoinedRender(false),
+ ForwardToGCC(true)
{
// Multi-level aliases are not supported, and alias options cannot
OpenPOWER on IntegriCloud