Skip to content

Commit d0e8a9e

Browse files
committed
[clang][cli] Generate HeaderSearch options separately
This patch moves parsing of header search options from `generateCC1Options` to separate `GenerateHeaderSearchArgs`. The round-trip algorithm in D94472 requires this separation to be able to run parsing and generating **only** for the options that need to be tested via round-tripping. This also moves the `GENERATE_OPTION_WITH_MARSHALLING` to the top of the file, because other kinds of options will be generated in separate functions that will be spread throughout `CompilerInvocation.cpp` to be close to their parsing counterparts. Reviewed By: dexonsmith Differential Revision: https://reviews.llvm.org/D94803
1 parent 05127fb commit d0e8a9e

File tree

1 file changed

+34
-20
lines changed

1 file changed

+34
-20
lines changed

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,23 @@ static T extractMaskValue(T KeyPath) {
400400
MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
401401
}
402402

403+
// Capture the extracted value as a lambda argument to avoid potential issues
404+
// with lifetime extension of the reference.
405+
#define GENERATE_OPTION_WITH_MARSHALLING( \
406+
ARGS, STRING_ALLOCATOR, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, \
407+
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, \
408+
TABLE_INDEX) \
409+
if ((FLAGS)&options::CC1Option) { \
410+
[&](const auto &Extracted) { \
411+
if (ALWAYS_EMIT || \
412+
(Extracted != \
413+
static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
414+
: (DEFAULT_VALUE)))) \
415+
DENORMALIZER(ARGS, SPELLING, STRING_ALLOCATOR, Option::KIND##Class, \
416+
TABLE_INDEX, Extracted); \
417+
}(EXTRACTOR(KEYPATH)); \
418+
}
419+
403420
static const StringRef GetInputKindName(InputKind IK);
404421

405422
static void FixupInvocation(CompilerInvocation &Invocation,
@@ -1826,6 +1843,22 @@ std::string CompilerInvocation::GetResourcesPath(const char *Argv0,
18261843
return Driver::GetResourcesPath(ClangExecutable, CLANG_RESOURCE_DIR);
18271844
}
18281845

1846+
static void GenerateHeaderSearchArgs(const HeaderSearchOptions &Opts,
1847+
SmallVectorImpl<const char *> &Args,
1848+
CompilerInvocation::StringAllocator SA) {
1849+
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)
1858+
#include "clang/Driver/Options.inc"
1859+
#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
1860+
}
1861+
18291862
static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args,
18301863
DiagnosticsEngine &Diags,
18311864
const std::string &WorkingDir) {
@@ -2983,23 +3016,6 @@ std::string CompilerInvocation::getModuleHash() const {
29833016

29843017
void CompilerInvocation::generateCC1CommandLine(
29853018
SmallVectorImpl<const char *> &Args, StringAllocator SA) const {
2986-
// Capture the extracted value as a lambda argument to avoid potential issues
2987-
// with lifetime extension of the reference.
2988-
#define GENERATE_OPTION_WITH_MARSHALLING( \
2989-
ARGS, STRING_ALLOCATOR, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, \
2990-
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, \
2991-
TABLE_INDEX) \
2992-
if ((FLAGS)&options::CC1Option) { \
2993-
[&](const auto &Extracted) { \
2994-
if (ALWAYS_EMIT || \
2995-
(Extracted != \
2996-
static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
2997-
: (DEFAULT_VALUE)))) \
2998-
DENORMALIZER(ARGS, SPELLING, STRING_ALLOCATOR, Option::KIND##Class, \
2999-
TABLE_INDEX, Extracted); \
3000-
}(EXTRACTOR(KEYPATH)); \
3001-
}
3002-
30033019
#define OPTION_WITH_MARSHALLING( \
30043020
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
30053021
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
@@ -3011,19 +3027,17 @@ void CompilerInvocation::generateCC1CommandLine(
30113027
EXTRACTOR, TABLE_INDEX)
30123028

30133029
#define DIAG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
3014-
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
30153030
#define LANG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
30163031
#define CODEGEN_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
30173032

30183033
#include "clang/Driver/Options.inc"
30193034

30203035
#undef CODEGEN_OPTION_WITH_MARSHALLING
30213036
#undef LANG_OPTION_WITH_MARSHALLING
3022-
#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
30233037
#undef DIAG_OPTION_WITH_MARSHALLING
30243038
#undef OPTION_WITH_MARSHALLING
3025-
#undef GENERATE_OPTION_WITH_MARSHALLING
30263039

3040+
GenerateHeaderSearchArgs(*HeaderSearchOpts, Args, SA);
30273041
GenerateLangArgs(*LangOpts, Args, SA);
30283042
}
30293043

0 commit comments

Comments
 (0)