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