From: Daniel Dunbar Date: Wed, 4 Mar 2009 21:05:23 +0000 (+0000) Subject: Driver: Add Option flags. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0f9098e093089e935066729ea06bc86c23d9a432;p=clang Driver: Add Option flags. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66067 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Option.h b/include/clang/Driver/Option.h index 47e249c57c..0c74f345f2 100644 --- a/include/clang/Driver/Option.h +++ b/include/clang/Driver/Option.h @@ -61,6 +61,23 @@ namespace driver { /// Option that this is an alias for, if any. const Option *Alias; + /// Unsupported options will not be rejected. + bool Unsupported : 1; + + /// Treat this option like a linker input? + bool LinkerInput : 1; + + /// When rendering as an input, don't render the option. + + // FIXME: We should ditch the render/renderAsInput distinction. + bool NoOptAsInput : 1; + + /// Always render this option as separate form its value. + bool ForceSeparateRender : 1; + + /// Always render this option joined with its value. + bool ForceJoinedRender : 1; + protected: Option(OptionClass Kind, const char *Name, const OptionGroup *Group, const Option *Alias); @@ -72,6 +89,21 @@ namespace driver { const OptionGroup *getGroup() const { return Group; } const Option *getAlias() const { return Alias; } + bool isUnsupported() const { return Unsupported; } + void setUnsupported(bool Value) { Unsupported = Value; } + + bool isLinkerInput() const { return LinkerInput; } + void setLinkerInput(bool Value) { LinkerInput = Value; } + + bool isNoOptAsInput() const { return NoOptAsInput; } + void setNoOptAsInput(bool Value) { NoOptAsInput = Value; } + + bool isForceSeparateRender() const { return ForceSeparateRender; } + void setForceSeparateRender(bool Value) { ForceSeparateRender = Value; } + + bool isForceJoinedRender() const { return ForceJoinedRender; } + void setForceJoinedRender(bool Value) { ForceJoinedRender = Value; } + /// getUnaliasedOption - Return the final option this option /// aliases (itself, if the option has no alias). const Option *getUnaliasedOption() const { diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp index 731334848a..335d7720bf 100644 --- a/lib/Driver/OptTable.cpp +++ b/lib/Driver/OptTable.cpp @@ -95,21 +95,14 @@ Option *OptTable::constructOption(options::ID id) const { Opt = new JoinedAndSeparateOption(info.Name, Group, Alias); break; } - // FIXME: Set flags. for (const char *s = info.Flags; *s; ++s) { switch (*s) { - default: - assert(0 && "Invalid option flag."); - case 'l': - break; - case 'i': - break; - case 'J': - break; - case 'S': - break; - case 'U': - break; + default: assert(0 && "Invalid option flag."); + case 'l': Opt->setLinkerInput(true); break; + case 'i': Opt->setNoOptAsInput(true); break; + case 'J': Opt->setForceJoinedRender(true); break; + case 'S': Opt->setForceSeparateRender(true); break; + case 'U': Opt->setUnsupported(true); break; } } diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp index cf5c3eb0fa..368f004b60 100644 --- a/lib/Driver/Option.cpp +++ b/lib/Driver/Option.cpp @@ -15,7 +15,10 @@ using namespace clang::driver; Option::Option(OptionClass _Kind, const char *_Name, const OptionGroup *_Group, const Option *_Alias) - : Kind(_Kind), Name(_Name), Group(_Group), Alias(_Alias) { + : Kind(_Kind), Name(_Name), Group(_Group), Alias(_Alias), + Unsupported(false), LinkerInput(false), NoOptAsInput(false), + ForceSeparateRender(false), ForceJoinedRender(false) +{ // Multi-level aliases are not supported, and alias options cannot // have groups. This just simplifies option tracking, it is not an