From: Daniel Dunbar Date: Thu, 19 Nov 2009 00:15:11 +0000 (+0000) Subject: Driver: Split OptTable out into OptTable.{h,cpp} X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=27e738d0d3f781672a5999d2a9e2827b00a97d0c;p=clang 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 dcb60381a4..34ca013b90 100644 --- a/include/clang/Driver/ArgList.h +++ b/include/clang/Driver/ArgList.h @@ -26,6 +26,7 @@ namespace llvm { 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 0000000000..58a0c5389d --- /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 + +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 20c3d2ff93..d6a3cff7ec 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 +#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 b6998abe47..c4430a694b 100644 --- a/lib/Driver/CMakeLists.txt +++ b/lib/Driver/CMakeLists.txt @@ -6,6 +6,7 @@ add_clang_library(clangDriver 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 a93812632c..a696f33d0a 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 0000000000..ac6ca5c376 --- /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 + { "", 0, 0, Option::InputClass, DriverOption, 0, OPT_INVALID, OPT_INVALID }, + // The UnknownOption info + { "", 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 6065b2df22..74937a7188 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 @@ Arg *OptTable::ParseOneArg(const InputArgList &Args, unsigned &Index) const { return new PositionalArg(TheUnknownOption, Index++); } - -// - -static OptTable::Info InfoTable[] = { - // The InputOption info - { "", 0, 0, Option::InputClass, DriverOption, 0, OPT_INVALID, OPT_INVALID }, - // The UnknownOption info - { "", 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 b83e399411..296e399a25 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"