forked from OSchip/llvm-project
[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
This commit is contained in:
parent
05127fba4b
commit
d0e8a9e5a2
|
@ -400,6 +400,23 @@ static T extractMaskValue(T KeyPath) {
|
|||
MERGER(KEYPATH, static_cast<decltype(KEYPATH)>(*MaybeValue)); \
|
||||
}
|
||||
|
||||
// Capture the extracted value as a lambda argument to avoid potential issues
|
||||
// with lifetime extension of the reference.
|
||||
#define GENERATE_OPTION_WITH_MARSHALLING( \
|
||||
ARGS, STRING_ALLOCATOR, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, \
|
||||
TABLE_INDEX) \
|
||||
if ((FLAGS)&options::CC1Option) { \
|
||||
[&](const auto &Extracted) { \
|
||||
if (ALWAYS_EMIT || \
|
||||
(Extracted != \
|
||||
static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
|
||||
: (DEFAULT_VALUE)))) \
|
||||
DENORMALIZER(ARGS, SPELLING, STRING_ALLOCATOR, Option::KIND##Class, \
|
||||
TABLE_INDEX, Extracted); \
|
||||
}(EXTRACTOR(KEYPATH)); \
|
||||
}
|
||||
|
||||
static const StringRef GetInputKindName(InputKind IK);
|
||||
|
||||
static void FixupInvocation(CompilerInvocation &Invocation,
|
||||
|
@ -1826,6 +1843,22 @@ std::string CompilerInvocation::GetResourcesPath(const char *Argv0,
|
|||
return Driver::GetResourcesPath(ClangExecutable, CLANG_RESOURCE_DIR);
|
||||
}
|
||||
|
||||
static void GenerateHeaderSearchArgs(const HeaderSearchOptions &Opts,
|
||||
SmallVectorImpl<const char *> &Args,
|
||||
CompilerInvocation::StringAllocator SA) {
|
||||
const HeaderSearchOptions *HeaderSearchOpts = &Opts;
|
||||
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \
|
||||
MERGER, EXTRACTOR, TABLE_INDEX) \
|
||||
GENERATE_OPTION_WITH_MARSHALLING( \
|
||||
Args, SA, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, \
|
||||
IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, TABLE_INDEX)
|
||||
#include "clang/Driver/Options.inc"
|
||||
#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
|
||||
}
|
||||
|
||||
static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args,
|
||||
DiagnosticsEngine &Diags,
|
||||
const std::string &WorkingDir) {
|
||||
|
@ -2983,23 +3016,6 @@ std::string CompilerInvocation::getModuleHash() const {
|
|||
|
||||
void CompilerInvocation::generateCC1CommandLine(
|
||||
SmallVectorImpl<const char *> &Args, StringAllocator SA) const {
|
||||
// Capture the extracted value as a lambda argument to avoid potential issues
|
||||
// with lifetime extension of the reference.
|
||||
#define GENERATE_OPTION_WITH_MARSHALLING( \
|
||||
ARGS, STRING_ALLOCATOR, KIND, FLAGS, SPELLING, ALWAYS_EMIT, KEYPATH, \
|
||||
DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, DENORMALIZER, EXTRACTOR, \
|
||||
TABLE_INDEX) \
|
||||
if ((FLAGS)&options::CC1Option) { \
|
||||
[&](const auto &Extracted) { \
|
||||
if (ALWAYS_EMIT || \
|
||||
(Extracted != \
|
||||
static_cast<decltype(KEYPATH)>((IMPLIED_CHECK) ? (IMPLIED_VALUE) \
|
||||
: (DEFAULT_VALUE)))) \
|
||||
DENORMALIZER(ARGS, SPELLING, STRING_ALLOCATOR, Option::KIND##Class, \
|
||||
TABLE_INDEX, Extracted); \
|
||||
}(EXTRACTOR(KEYPATH)); \
|
||||
}
|
||||
|
||||
#define OPTION_WITH_MARSHALLING( \
|
||||
PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \
|
||||
HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \
|
||||
|
@ -3011,7 +3027,6 @@ void CompilerInvocation::generateCC1CommandLine(
|
|||
EXTRACTOR, TABLE_INDEX)
|
||||
|
||||
#define DIAG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
|
||||
#define HEADER_SEARCH_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
|
||||
#define LANG_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
|
||||
#define CODEGEN_OPTION_WITH_MARSHALLING OPTION_WITH_MARSHALLING
|
||||
|
||||
|
@ -3019,11 +3034,10 @@ void CompilerInvocation::generateCC1CommandLine(
|
|||
|
||||
#undef CODEGEN_OPTION_WITH_MARSHALLING
|
||||
#undef LANG_OPTION_WITH_MARSHALLING
|
||||
#undef HEADER_SEARCH_OPTION_WITH_MARSHALLING
|
||||
#undef DIAG_OPTION_WITH_MARSHALLING
|
||||
#undef OPTION_WITH_MARSHALLING
|
||||
#undef GENERATE_OPTION_WITH_MARSHALLING
|
||||
|
||||
GenerateHeaderSearchArgs(*HeaderSearchOpts, Args, SA);
|
||||
GenerateLangArgs(*LangOpts, Args, SA);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue