Skip to content

Commit 374862d

Browse files
committed
[clang][cli] Use variadic macros for parsing/generating
This patch makes all macros forwarding to `PARSE_OPTION_WITH_MARSHALLING` and `GENERATE_OPTION_WITH_MARSHALLING` variadic. Sice we will be splitting up all CompilerInvocation parts, this will allow us to avoid a lot of boilerplate code. The local macros prefix forwarded arguments with local variables required by the main macros. The `{THIS,NO}_PREFIX` macros make it possible for forwarding macros in member functions (`parseSimpleArgs`, `generateCC1CommandLine`) to prefix keypaths with `this->`. (Some build bots seem to require that.) Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D95532
1 parent b9ed8eb commit 374862d

File tree

1 file changed

+35
-76
lines changed

1 file changed

+35
-76
lines changed

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 35 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -385,36 +385,44 @@ static T extractMaskValue(T KeyPath) {
385385
return KeyPath & Value;
386386
}
387387

388-
#define PARSE_OPTION_WITH_MARSHALLING(ARGS, DIAGS, SUCCESS, ID, FLAGS, PARAM, \
389-
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
390-
IMPLIED_CHECK, IMPLIED_VALUE, \
391-
NORMALIZER, MERGER, TABLE_INDEX) \
388+
#define THIS_PREFIX(KEYPATH) this->KEYPATH
389+
#define NO_PREFIX(KEYPATH) KEYPATH
390+
391+
#define PARSE_OPTION_WITH_MARSHALLING( \
392+
ARGS, DIAGS, SUCCESS, PREFIX_KEYPATH, PREFIX_TYPE, NAME, ID, KIND, GROUP, \
393+
ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SPELLING, \
394+
SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, \
395+
IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \
392396
if ((FLAGS)&options::CC1Option) { \
393-
KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \
397+
PREFIX_KEYPATH(KEYPATH) = MERGER(PREFIX_KEYPATH(KEYPATH), DEFAULT_VALUE); \
394398
if (IMPLIED_CHECK) \
395-
KEYPATH = MERGER(KEYPATH, IMPLIED_VALUE); \
399+
PREFIX_KEYPATH(KEYPATH) = \
400+
MERGER(PREFIX_KEYPATH(KEYPATH), IMPLIED_VALUE); \
396401
if (SHOULD_PARSE) \
397402
if (auto MaybeValue = \
398403
NORMALIZER(OPT_##ID, TABLE_INDEX, ARGS, DIAGS, SUCCESS)) \
399-
KEYPATH = \
400-
MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
404+
PREFIX_KEYPATH(KEYPATH) = MERGER( \
405+
PREFIX_KEYPATH(KEYPATH), \
406+
static_cast<decltype(PREFIX_KEYPATH(KEYPATH))>(*MaybeValue)); \
401407
}
402408

403409
// Capture the extracted value as a lambda argument to avoid potential issues
404410
// with lifetime extension of the reference.
405411
#define GENERATE_OPTION_WITH_MARSHALLING( \
406-
ARGS, STRING_ALLOCATOR, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, \
407-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, \
412+
ARGS, STRING_ALLOCATOR, PREFIX_KEYPATH, PREFIX_TYPE, NAME, ID, KIND, \
413+
GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, \
414+
SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
415+
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, \
408416
TABLE_INDEX) \
409417
if ((FLAGS)&options::CC1Option) { \
410418
[&](const auto &Extracted) { \
411419
if (ALWAYS_EMIT || \
412420
(Extracted != \
413-
static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
414-
: (DEFAULT_VALUE)))) \
421+
static_cast<decltype(PREFIX_KEYPATH(KEYPATH))>( \
422+
(IMPLIED_CHECK) ? (IMPLIED_VALUE) : (DEFAULT_VALUE)))) \
415423
DENORMALIZER(ARGS, SPELLING, STRING_ALLOCATOR, Option::KIND##Class, \
416424
TABLE_INDEX, Extracted); \
417-
}(EXTRACTOR(KEYPATH)); \
425+
}(EXTRACTOR(PREFIX_KEYPATH(KEYPATH))); \
418426
}
419427

420428
static const StringRef GetInputKindName(InputKind IK);
@@ -986,15 +994,8 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
986994
// variable name and type.
987995
const LangOptions *LangOpts = &LangOptsRef;
988996

989-
#define CODEGEN_OPTION_WITH_MARSHALLING( \
990-
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
991-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
992-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
993-
MERGER, EXTRACTOR, TABLE_INDEX) \
994-
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
995-
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
996-
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
997-
MERGER, TABLE_INDEX)
997+
#define CODEGEN_OPTION_WITH_MARSHALLING(...) \
998+
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, NO_PREFIX, __VA_ARGS__)
998999
#include "clang/Driver/Options.inc"
9991000
#undef CODEGEN_OPTION_WITH_MARSHALLING
10001001

@@ -1456,15 +1457,8 @@ bool CompilerInvocation::parseSimpleArgs(const ArgList &Args,
14561457
DiagnosticsEngine &Diags) {
14571458
bool Success = true;
14581459

1459-
#define OPTION_WITH_MARSHALLING( \
1460-
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
1461-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
1462-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
1463-
MERGER, EXTRACTOR, TABLE_INDEX) \
1464-
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
1465-
SHOULD_PARSE, this->KEYPATH, DEFAULT_VALUE, \
1466-
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
1467-
MERGER, TABLE_INDEX)
1460+
#define OPTION_WITH_MARSHALLING(...) \
1461+
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, THIS_PREFIX, __VA_ARGS__)
14681462
#include "clang/Driver/Options.inc"
14691463
#undef OPTION_WITH_MARSHALLING
14701464

@@ -1486,15 +1480,8 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
14861480
DiagnosticOptions *DiagnosticOpts = &Opts;
14871481
bool Success = true;
14881482

1489-
#define DIAG_OPTION_WITH_MARSHALLING( \
1490-
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
1491-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
1492-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
1493-
MERGER, EXTRACTOR, TABLE_INDEX) \
1494-
PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, Success, ID, FLAGS, PARAM, \
1495-
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
1496-
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
1497-
MERGER, TABLE_INDEX)
1483+
#define DIAG_OPTION_WITH_MARSHALLING(...) \
1484+
PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, Success, NO_PREFIX, __VA_ARGS__)
14981485
#include "clang/Driver/Options.inc"
14991486
#undef DIAG_OPTION_WITH_MARSHALLING
15001487

@@ -1847,14 +1834,8 @@ static void GenerateHeaderSearchArgs(const HeaderSearchOptions &Opts,
18471834
SmallVectorImpl<const char *> &Args,
18481835
CompilerInvocation::StringAllocator SA) {
18491836
const HeaderSearchOptions *HeaderSearchOpts = &Opts;
1850-
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING( \
1851-
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
1852-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
1853-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
1854-
MERGER, EXTRACTOR, TABLE_INDEX) \
1855-
GENERATE_OPTION_WITH_MARSHALLING( \
1856-
Args, SA, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
1857-
IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, TABLE_INDEX)
1837+
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
1838+
GENERATE_OPTION_WITH_MARSHALLING(Args, SA, NO_PREFIX, __VA_ARGS__)
18581839
#include "clang/Driver/Options.inc"
18591840
#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
18601841
}
@@ -1865,15 +1846,8 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args,
18651846
HeaderSearchOptions *HeaderSearchOpts = &Opts;
18661847
bool Success = true;
18671848

1868-
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING( \
1869-
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
1870-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
1871-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
1872-
MERGER, EXTRACTOR, TABLE_INDEX) \
1873-
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
1874-
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
1875-
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
1876-
MERGER, TABLE_INDEX)
1849+
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \
1850+
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, NO_PREFIX, __VA_ARGS__)
18771851
#include "clang/Driver/Options.inc"
18781852
#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
18791853

@@ -2292,15 +2266,8 @@ void CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
22922266
LangOptions *LangOpts = &Opts;
22932267
bool Success = true;
22942268

2295-
#define LANG_OPTION_WITH_MARSHALLING( \
2296-
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
2297-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
2298-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
2299-
MERGER, EXTRACTOR, TABLE_INDEX) \
2300-
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, ID, FLAGS, PARAM, \
2301-
SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \
2302-
IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \
2303-
MERGER, TABLE_INDEX)
2269+
#define LANG_OPTION_WITH_MARSHALLING(...) \
2270+
PARSE_OPTION_WITH_MARSHALLING(Args, Diags, Success, NO_PREFIX, __VA_ARGS__)
23042271
#include "clang/Driver/Options.inc"
23052272
#undef LANG_OPTION_WITH_MARSHALLING
23062273

@@ -3016,16 +2983,8 @@ std::string CompilerInvocation::getModuleHash() const {
30162983

30172984
void CompilerInvocation::generateCC1CommandLine(
30182985
SmallVectorImpl<const char *> &Args, StringAllocator SA) const {
3019-
#define OPTION_WITH_MARSHALLING( \
3020-
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
3021-
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
3022-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
3023-
MERGER, EXTRACTOR, TABLE_INDEX) \
3024-
GENERATE_OPTION_WITH_MARSHALLING(Args, SA, KIND, FLAGS, SPELLING, \
3025-
ALWAYS_EMIT, this->KEYPATH, DEFAULT_VALUE, \
3026-
IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, \
3027-
EXTRACTOR, TABLE_INDEX)
3028-
2986+
#define OPTION_WITH_MARSHALLING(...) \
2987+
GENERATE_OPTION_WITH_MARSHALLING(Args, SA, THIS_PREFIX, __VA_ARGS__)
30292988
#define DIAG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
30302989
#define LANG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
30312990
#define CODEGEN_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING

0 commit comments

Comments
 (0)