[Options] Make Option non clang specific.
authorMichael J. Spencer <bigcheesegs@gmail.com>
Fri, 19 Oct 2012 22:37:06 +0000 (22:37 +0000)
committerMichael J. Spencer <bigcheesegs@gmail.com>
Fri, 19 Oct 2012 22:37:06 +0000 (22:37 +0000)
llvm-svn: 166348

clang/include/clang/Driver/Option.h
clang/lib/Driver/Driver.cpp
clang/lib/Driver/ToolChains.cpp
clang/lib/Driver/Tools.cpp
clang/lib/Frontend/CompilerInvocation.cpp

index 9cda280..11e4171 100644 (file)
@@ -21,15 +21,20 @@ namespace driver {
   class ArgList;
 
 namespace options {
+  /// Base flags for all options. Custom flags may be added after.
   enum DriverFlag {
-    DriverOption     = (1 << 0),
-    HelpHidden       = (1 << 1),
-    LinkerInput      = (1 << 2),
-    NoArgumentUnused = (1 << 3),
-    NoForward        = (1 << 4),
-    RenderAsInput    = (1 << 5),
-    RenderJoined     = (1 << 6),
-    RenderSeparate   = (1 << 7),
+    HelpHidden       = (1 << 0),
+    RenderAsInput    = (1 << 1),
+    RenderJoined     = (1 << 2),
+    RenderSeparate   = (1 << 3)
+  };
+
+  /// Flags specifically for clang options.
+  enum ClangFlags {
+    DriverOption     = (1 << 4),
+    LinkerInput      = (1 << 5),
+    NoArgumentUnused = (1 << 6),
+    NoForward        = (1 << 7),
     Unsupported      = (1 << 8),
     CC1Option        = (1 << 9)
   };
@@ -68,7 +73,7 @@ namespace options {
       RenderValuesStyle
     };
 
-  private:
+  protected:
     const OptTable::Info *Info;
     const OptTable *Owner;
 
@@ -84,23 +89,23 @@ namespace options {
       assert(Info && "Must have a valid info!");
       return Info->ID;
     }
-    
+
     OptionClass getKind() const {
       assert(Info && "Must have a valid info!");
       return OptionClass(Info->Kind);
     }
-    
+
     StringRef getName() const {
       assert(Info && "Must have a valid info!");
       return Info->Name;
     }
-    
+
     const Option getGroup() const {
       assert(Info && "Must have a valid info!");
       assert(Owner && "Must have a valid owner!");
       return Owner->getOption(Info->GroupID);
     }
-    
+
     const Option getAlias() const {
       assert(Info && "Must have a valid info!");
       assert(Owner && "Must have a valid owner!");
@@ -109,10 +114,6 @@ namespace options {
 
     unsigned getNumArgs() const { return Info->Param; }
 
-    bool isUnsupported() const { return Info->Flags & options::Unsupported; }
-
-    bool isLinkerInput() const { return Info->Flags & options::LinkerInput; }
-
     bool hasNoOptAsInput() const { return Info->Flags & options::RenderAsInput;}
 
     RenderStyleKind getRenderStyle() const {
@@ -139,18 +140,9 @@ namespace options {
       llvm_unreachable("Unexpected kind!");
     }
 
-    bool isDriverOption() const { return Info->Flags & options::DriverOption; }
-
-    bool hasNoArgumentUnused() const {
-      return Info->Flags & options::NoArgumentUnused;
-    }
-
-    bool hasNoForward() const { return Info->Flags & options::NoForward; }
-
-    bool isCC1Option() const { return Info->Flags & options::CC1Option; }
-
-    bool hasForwardToGCC() const {
-      return !hasNoForward() && !isDriverOption() && !isLinkerInput();
+    /// Test if this option has the flag \a Val.
+    bool hasFlag(unsigned Val) const {
+      return Info->Flags & Val;
     }
 
     /// getUnaliasedOption - Return the final option this option
index f747621..59cebf5 100644 (file)
@@ -98,7 +98,7 @@ InputArgList *Driver::ParseArgStrings(ArrayRef<const char *> ArgList) {
   for (ArgList::const_iterator it = Args->begin(), ie = Args->end();
        it != ie; ++it) {
     Arg *A = *it;
-    if (A->getOption().isUnsupported()) {
+    if (A->getOption().hasFlag(options::Unsupported)) {
       Diag(clang::diag::err_drv_unsupported_opt) << A->getAsString(*Args);
       continue;
     }
@@ -1033,7 +1033,7 @@ void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args,
       } else
         Inputs.push_back(std::make_pair(Ty, A));
 
-    } else if (A->getOption().isLinkerInput()) {
+    } else if (A->getOption().hasFlag(options::LinkerInput)) {
       // Just treat as object type, we could make a special type for this if
       // necessary.
       Inputs.push_back(std::make_pair(types::TY_Object, A));
@@ -1300,7 +1300,7 @@ void Driver::BuildJobs(Compilation &C) const {
     // DiagnosticsEngine, so that extra values, position, and so on could be
     // printed.
     if (!A->isClaimed()) {
-      if (A->getOption().hasNoArgumentUnused())
+      if (A->getOption().hasFlag(options::NoArgumentUnused))
         continue;
 
       // Suppress the warning automatically if this is just a flag, and it is an
index de18f53..e5773fb 100644 (file)
@@ -737,7 +737,7 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
           << A->getAsString(Args);
         continue;
-      } else if (XarchArg->getOption().isDriverOption()) {
+      } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
         getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
           << A->getAsString(Args);
         continue;
@@ -751,7 +751,7 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
       // Linker input arguments require custom handling. The problem is that we
       // have already constructed the phase actions, so we can not treat them as
       // "input arguments".
-      if (A->getOption().isLinkerInput()) {
+      if (A->getOption().hasFlag(options::LinkerInput)) {
         // Convert the argument into individual Zlinker_input_args.
         for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
           DAL->AddSeparateArg(OriginalArg,
index 07d24b4..80691ee 100644 (file)
@@ -200,6 +200,12 @@ static void addProfileRT(const ToolChain &TC, const ArgList &Args,
   CmdArgs.push_back(Args.MakeArgString(ProfileRT));
 }
 
+static bool forwardToGCC(const Option &O) {
+  return !O.hasFlag(options::NoForward) &&
+         !O.hasFlag(options::DriverOption) &&
+         !O.hasFlag(options::LinkerInput);
+}
+
 void Clang::AddPreprocessingOptions(Compilation &C,
                                     const Driver &D,
                                     const ArgList &Args,
@@ -3195,7 +3201,7 @@ void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
   for (ArgList::const_iterator
          it = Args.begin(), ie = Args.end(); it != ie; ++it) {
     Arg *A = *it;
-    if (A->getOption().hasForwardToGCC()) {
+    if (forwardToGCC(A->getOption())) {
       // Don't forward any -g arguments to assembly steps.
       if (isa<AssembleJobAction>(JA) &&
           A->getOption().matches(options::OPT_g_Group))
@@ -3420,7 +3426,7 @@ void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
   for (ArgList::const_iterator
          it = Args.begin(), ie = Args.end(); it != ie; ++it) {
     Arg *A = *it;
-    if (A->getOption().hasForwardToGCC()) {
+    if (forwardToGCC(A->getOption())) {
       // Don't forward any -g arguments to assembly steps.
       if (isa<AssembleJobAction>(JA) &&
           A->getOption().matches(options::OPT_g_Group))
index 5327951..4f0cfa8 100644 (file)
@@ -2330,7 +2330,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
   // Issue errors on arguments that are not valid for CC1.
   for (ArgList::iterator I = Args->begin(), E = Args->end();
        I != E; ++I) {
-    if (!(*I)->getOption().isCC1Option()) {
+    if (!(*I)->getOption().hasFlag(options::CC1Option)) {
       Diags.Report(diag::err_drv_unknown_argument) << (*I)->getAsString(*Args);
       Success = false;
     }