16da90771SNick Lewycky //===--- DriverOptions.cpp - Driver Options Table -------------------------===//
2aa767378SDaniel Dunbar //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6aa767378SDaniel Dunbar //
7aa767378SDaniel Dunbar //===----------------------------------------------------------------------===//
8aa767378SDaniel Dunbar 
9aa767378SDaniel Dunbar #include "clang/Driver/Options.h"
10e5ce831cSCraig Topper #include "llvm/ADT/STLExtras.h"
11898229abSReid Kleckner #include "llvm/Option/OptTable.h"
12898229abSReid Kleckner #include "llvm/Option/Option.h"
1324bc6a4cSYuka Takahashi #include <cassert>
14aa767378SDaniel Dunbar 
15aa767378SDaniel Dunbar using namespace clang::driver;
16aa767378SDaniel Dunbar using namespace clang::driver::options;
17898229abSReid Kleckner using namespace llvm::opt;
18aa767378SDaniel Dunbar 
19fb624ce8SHans Wennborg #define PREFIX(NAME, VALUE) static const char *const NAME[] = VALUE;
20929fccd4SMichael J. Spencer #include "clang/Driver/Options.inc"
21929fccd4SMichael J. Spencer #undef PREFIX
22929fccd4SMichael J. Spencer 
23221c1fd6SNuno Lopes static const OptTable::Info InfoTable[] = {
24212e7ec7SHans Wennborg #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,  \
25ba5d4af4SYuka Takahashi                HELPTEXT, METAVAR, VALUES)                                      \
26ba5d4af4SYuka Takahashi   {PREFIX, NAME,  HELPTEXT,    METAVAR,     OPT_##ID,  Option::KIND##Class,    \
27ba5d4af4SYuka Takahashi    PARAM,  FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS, VALUES},
2846fffee0SDaniel Dunbar #include "clang/Driver/Options.inc"
29fb624ce8SHans Wennborg #undef OPTION
30aa767378SDaniel Dunbar };
31aa767378SDaniel Dunbar 
32aa767378SDaniel Dunbar namespace {
33aa767378SDaniel Dunbar 
34aa767378SDaniel Dunbar class DriverOptTable : public OptTable {
35aa767378SDaniel Dunbar public:
DriverOptTable()36aa767378SDaniel Dunbar   DriverOptTable()
372f6e21e7SCraig Topper     : OptTable(InfoTable) {}
38aa767378SDaniel Dunbar };
39aa767378SDaniel Dunbar 
40aa767378SDaniel Dunbar }
41aa767378SDaniel Dunbar 
getDriverOptTable()42*43392759SIlya Biryukov const llvm::opt::OptTable &clang::driver::getDriverOptTable() {
43*43392759SIlya Biryukov   static const DriverOptTable *Table = []() {
442b3d49b6SJonas Devlieghere     auto Result = std::make_unique<DriverOptTable>();
4524bc6a4cSYuka Takahashi     // Options.inc is included in DriverOptions.cpp, and calls OptTable's
4624bc6a4cSYuka Takahashi     // addValues function.
4724bc6a4cSYuka Takahashi     // Opt is a variable used in the code fragment in Options.inc.
4824bc6a4cSYuka Takahashi     OptTable &Opt = *Result;
4924bc6a4cSYuka Takahashi #define OPTTABLE_ARG_INIT
5024bc6a4cSYuka Takahashi #include "clang/Driver/Options.inc"
5124bc6a4cSYuka Takahashi #undef OPTTABLE_ARG_INIT
52*43392759SIlya Biryukov     return Result.release();
53*43392759SIlya Biryukov   }();
54*43392759SIlya Biryukov   return *Table;
55aa767378SDaniel Dunbar }
56