Driver: Split OptTable out into OptTable.{h,cpp}
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89283 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/Driver/ArgList.h b/include/clang/Driver/ArgList.h
index dcb6038..34ca013 100644
--- a/include/clang/Driver/ArgList.h
+++ b/include/clang/Driver/ArgList.h
@@ -26,6 +26,7 @@
namespace clang {
namespace driver {
class Arg;
+ class Option;
/// ArgList - Ordered collection of driver arguments.
///
diff --git a/include/clang/Driver/OptTable.h b/include/clang/Driver/OptTable.h
new file mode 100644
index 0000000..58a0c53
--- /dev/null
+++ b/include/clang/Driver/OptTable.h
@@ -0,0 +1,142 @@
+//===--- OptTable.h - Option Table ------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_DRIVER_OPTTABLE_H
+#define CLANG_DRIVER_OPTTABLE_H
+
+#include <cassert>
+
+namespace clang {
+namespace driver {
+namespace options {
+ enum DriverFlag {
+ DriverOption = (1 << 0),
+ LinkerInput = (1 << 1),
+ NoArgumentUnused = (1 << 2),
+ RenderAsInput = (1 << 3),
+ RenderJoined = (1 << 4),
+ RenderSeparate = (1 << 5),
+ Unsupported = (1 << 6)
+ };
+}
+
+ class Arg;
+ class InputArgList;
+ class Option;
+
+ /// OptTable - Provide access to the Option info table.
+ ///
+ /// The OptTable class provides a layer of indirection which allows Option
+ /// instance to be created lazily. In the common case, only a few options will
+ /// be needed at runtime; the OptTable class maintains enough information to
+ /// parse command lines without instantiating Options, while letting other
+ /// parts of the driver still use Option instances where convenient.
+ //
+ // FIXME: Introduce an OptionSpecifier class to wrap the option ID
+ // variant?
+ class OptTable {
+ public:
+ /// Info - Entry for a single option instance in the option data table.
+ struct Info {
+ const char *Name;
+ const char *HelpText;
+ const char *MetaVar;
+ unsigned char Kind;
+ unsigned char Flags;
+ unsigned char Param;
+ unsigned short GroupID;
+ unsigned short AliasID;
+ };
+
+ private:
+ /// The static option information table.
+ const Info *OptionInfos;
+ unsigned NumOptionInfos;
+
+ /// The lazily constructed options table, indexed by option::ID - 1.
+ mutable Option **Options;
+
+ /// Prebound input option instance.
+ const Option *TheInputOption;
+
+ /// Prebound unknown option instance.
+ const Option *TheUnknownOption;
+
+ /// The index of the first option which can be parsed (i.e., is not a
+ /// special option like 'input' or 'unknown', and is not an option group).
+ unsigned FirstSearchableIndex;
+
+ private:
+ const Info &getInfo(unsigned id) const {
+ assert(id > 0 && id - 1 < getNumOptions() && "Invalid Option ID.");
+ return OptionInfos[id - 1];
+ }
+
+ Option *CreateOption(unsigned id) const;
+
+ protected:
+ OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos);
+ public:
+ ~OptTable();
+
+ /// getNumOptions - Return the total number of option classes.
+ unsigned getNumOptions() const { return NumOptionInfos; }
+
+ /// getOption - Get the given \arg id's Option instance, lazily creating it
+ /// if necessary.
+ ///
+ /// \return The option, or null for the INVALID option id.
+ const Option *getOption(unsigned id) const {
+ if (id == 0)
+ return 0;
+
+ assert((unsigned) (id - 1) < getNumOptions() && "Invalid ID.");
+ Option *&Entry = Options[id - 1];
+ if (!Entry)
+ Entry = CreateOption(id);
+ return Entry;
+ }
+
+ /// getOptionName - Lookup the name of the given option.
+ const char *getOptionName(unsigned id) const {
+ return getInfo(id).Name;
+ }
+
+ /// getOptionKind - Get the kind of the given option.
+ unsigned getOptionKind(unsigned id) const {
+ return getInfo(id).Kind;
+ }
+
+ /// getOptionHelpText - Get the help text to use to describe this option.
+ const char *getOptionHelpText(unsigned id) const {
+ return getInfo(id).HelpText;
+ }
+
+ /// getOptionMetaVar - Get the meta-variable name to use when describing
+ /// this options values in the help text.
+ const char *getOptionMetaVar(unsigned id) const {
+ return getInfo(id).MetaVar;
+ }
+
+ /// parseOneArg - Parse a single argument; returning the new argument and
+ /// updating Index.
+ ///
+ /// \param [in] [out] Index - The current parsing position in the argument
+ /// string list; on return this will be the index of the next argument
+ /// string to parse.
+ ///
+ /// \return - The parsed argument, or 0 if the argument is missing values
+ /// (in which case Index still points at the conceptual next argument string
+ /// to parse).
+ Arg *ParseOneArg(const InputArgList &Args, unsigned &Index) const;
+ };
+}
+}
+
+#endif
diff --git a/include/clang/Driver/Options.h b/include/clang/Driver/Options.h
index 20c3d2f..d6a3cff 100644
--- a/include/clang/Driver/Options.h
+++ b/include/clang/Driver/Options.h
@@ -7,135 +7,12 @@
//
//===----------------------------------------------------------------------===//
-#ifndef CLANG_DRIVER_OPTIONS_H_
-#define CLANG_DRIVER_OPTIONS_H_
-
-#include <cassert>
+#ifndef CLANG_DRIVER_OPTIONS_H
+#define CLANG_DRIVER_OPTIONS_H
namespace clang {
namespace driver {
-namespace options {
- enum DriverFlag {
- DriverOption = (1 << 0),
- LinkerInput = (1 << 1),
- NoArgumentUnused = (1 << 2),
- RenderAsInput = (1 << 3),
- RenderJoined = (1 << 4),
- RenderSeparate = (1 << 5),
- Unsupported = (1 << 6)
- };
-}
-
- class Arg;
- class InputArgList;
- class Option;
-
- /// OptTable - Provide access to the Option info table.
- ///
- /// The OptTable class provides a layer of indirection which allows Option
- /// instance to be created lazily. In the common case, only a few options will
- /// be needed at runtime; the OptTable class maintains enough information to
- /// parse command lines without instantiating Options, while letting other
- /// parts of the driver still use Option instances where convenient.
- //
- // FIXME: Introduce an OptionSpecifier class to wrap the option ID
- // variant?
- class OptTable {
- public:
- /// Info - Entry for a single option instance in the option data table.
- struct Info {
- const char *Name;
- const char *HelpText;
- const char *MetaVar;
- unsigned char Kind;
- unsigned char Flags;
- unsigned char Param;
- unsigned short GroupID;
- unsigned short AliasID;
- };
-
- private:
- /// The static option information table.
- const Info *OptionInfos;
- unsigned NumOptionInfos;
-
- /// The lazily constructed options table, indexed by option::ID - 1.
- mutable Option **Options;
-
- /// Prebound input option instance.
- const Option *TheInputOption;
-
- /// Prebound unknown option instance.
- const Option *TheUnknownOption;
-
- /// The index of the first option which can be parsed (i.e., is not a
- /// special option like 'input' or 'unknown', and is not an option group).
- unsigned FirstSearchableIndex;
-
- private:
- const Info &getInfo(unsigned id) const {
- assert(id > 0 && id - 1 < getNumOptions() && "Invalid Option ID.");
- return OptionInfos[id - 1];
- }
-
- Option *CreateOption(unsigned id) const;
-
- protected:
- OptTable(const Info *_OptionInfos, unsigned _NumOptionInfos);
- public:
- ~OptTable();
-
- /// getNumOptions - Return the total number of option classes.
- unsigned getNumOptions() const { return NumOptionInfos; }
-
- /// getOption - Get the given \arg id's Option instance, lazily creating it
- /// if necessary.
- ///
- /// \return The option, or null for the INVALID option id.
- const Option *getOption(unsigned id) const {
- if (id == 0)
- return 0;
-
- assert((unsigned) (id - 1) < getNumOptions() && "Invalid ID.");
- Option *&Entry = Options[id - 1];
- if (!Entry)
- Entry = CreateOption(id);
- return Entry;
- }
-
- /// getOptionName - Lookup the name of the given option.
- const char *getOptionName(unsigned id) const {
- return getInfo(id).Name;
- }
-
- /// getOptionKind - Get the kind of the given option.
- unsigned getOptionKind(unsigned id) const {
- return getInfo(id).Kind;
- }
-
- /// getOptionHelpText - Get the help text to use to describe this option.
- const char *getOptionHelpText(unsigned id) const {
- return getInfo(id).HelpText;
- }
-
- /// getOptionMetaVar - Get the meta-variable name to use when describing
- /// this options values in the help text.
- const char *getOptionMetaVar(unsigned id) const {
- return getInfo(id).MetaVar;
- }
-
- /// parseOneArg - Parse a single argument; returning the new argument and
- /// updating Index.
- ///
- /// \param [in] [out] Index - The current parsing position in the argument
- /// string list; on return this will be the index of the next argument
- /// string to parse.
- ///
- /// \return - The parsed argument, or 0 if the argument is missing values
- /// (in which case Index still points at the conceptual next argument string
- /// to parse).
- Arg *ParseOneArg(const InputArgList &Args, unsigned &Index) const;
- };
+ class OptTable;
namespace options {
enum ID {
diff --git a/lib/Driver/CMakeLists.txt b/lib/Driver/CMakeLists.txt
index b6998ab..c4430a6 100644
--- a/lib/Driver/CMakeLists.txt
+++ b/lib/Driver/CMakeLists.txt
@@ -6,6 +6,7 @@
ArgList.cpp
Compilation.cpp
Driver.cpp
+ DriverOptions.cpp
HostInfo.cpp
Job.cpp
OptTable.cpp
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index a938126..a696f33 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -16,6 +16,7 @@
#include "clang/Driver/DriverDiagnostic.h"
#include "clang/Driver/HostInfo.h"
#include "clang/Driver/Job.h"
+#include "clang/Driver/OptTable.h"
#include "clang/Driver/Option.h"
#include "clang/Driver/Options.h"
#include "clang/Driver/Tool.h"
diff --git a/lib/Driver/DriverOptions.cpp b/lib/Driver/DriverOptions.cpp
new file mode 100644
index 0000000..ac6ca5c
--- /dev/null
+++ b/lib/Driver/DriverOptions.cpp
@@ -0,0 +1,42 @@
+//===--- DriverOptions.cpp - Driver Options Table -----------------------*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Driver/Options.h"
+#include "clang/Driver/OptTable.h"
+#include "clang/Driver/Option.h"
+
+using namespace clang::driver;
+using namespace clang::driver::options;
+
+static OptTable::Info InfoTable[] = {
+ // The InputOption info
+ { "<input>", 0, 0, Option::InputClass, DriverOption, 0, OPT_INVALID, OPT_INVALID },
+ // The UnknownOption info
+ { "<unknown>", 0, 0, Option::UnknownClass, 0, 0, OPT_INVALID, OPT_INVALID },
+
+#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \
+ HELPTEXT, METAVAR) \
+ { NAME, HELPTEXT, METAVAR, Option::KIND##Class, FLAGS, PARAM, \
+ OPT_##GROUP, OPT_##ALIAS },
+#include "clang/Driver/Options.def"
+};
+
+namespace {
+
+class DriverOptTable : public OptTable {
+public:
+ DriverOptTable()
+ : OptTable(InfoTable, sizeof(InfoTable) / sizeof(InfoTable[0])) {}
+};
+
+}
+
+OptTable *clang::driver::createDriverOptTable() {
+ return new DriverOptTable();
+}
diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp
index 6065b2d..74937a7 100644
--- a/lib/Driver/OptTable.cpp
+++ b/lib/Driver/OptTable.cpp
@@ -1,4 +1,4 @@
-//===--- Options.cpp - Option info table --------------------------------*-===//
+//===--- OptTable.cpp - Option Table Implementation ---------------------*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -7,8 +7,7 @@
//
//===----------------------------------------------------------------------===//
-#include "clang/Driver/Options.h"
-
+#include "clang/Driver/OptTable.h"
#include "clang/Driver/Arg.h"
#include "clang/Driver/ArgList.h"
#include "clang/Driver/Option.h"
@@ -218,32 +217,3 @@
return new PositionalArg(TheUnknownOption, Index++);
}
-
-//
-
-static OptTable::Info InfoTable[] = {
- // The InputOption info
- { "<input>", 0, 0, Option::InputClass, DriverOption, 0, OPT_INVALID, OPT_INVALID },
- // The UnknownOption info
- { "<unknown>", 0, 0, Option::UnknownClass, 0, 0, OPT_INVALID, OPT_INVALID },
-
-#define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM, \
- HELPTEXT, METAVAR) \
- { NAME, HELPTEXT, METAVAR, Option::KIND##Class, FLAGS, PARAM, \
- OPT_##GROUP, OPT_##ALIAS },
-#include "clang/Driver/Options.def"
-};
-
-namespace {
-
-class DriverOptTable : public OptTable {
-public:
- DriverOptTable()
- : OptTable(InfoTable, sizeof(InfoTable) / sizeof(InfoTable[0])) {}
-};
-
-}
-
-OptTable *clang::driver::createDriverOptTable() {
- return new DriverOptTable();
-}
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index b83e399..296e399 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -14,6 +14,7 @@
#include "clang/Driver/Driver.h"
#include "clang/Driver/DriverDiagnostic.h"
#include "clang/Driver/HostInfo.h"
+#include "clang/Driver/OptTable.h"
#include "clang/Driver/Option.h"
#include "llvm/ADT/StringExtras.h"