From 2f3a5753fbf830d8f79ef19bde12110af631bcad Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Wed, 2 Nov 2022 09:35:00 -0700 Subject: [PATCH 01/12] [cmake][msvc] Enable standards-conforming preprocessor Since we now only support Visual Studio 2019 16.7 and newer, we're able to use the /Zc:preprocessor flag that turns on the standards-conforming preprocessor. Among other things, it correctly expands __VA_ARGS__. This enables removal of some boilerplate in D135128. Reviewed By: Bigcheese, thieta Differential Revision: https://reviews.llvm.org/D135128 --- llvm/cmake/modules/HandleLLVMOptions.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 1b1b074e16351..09d2cbbd25dba 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -485,6 +485,10 @@ if( MSVC ) append("/Zc:inline" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + # Enable standards-conforming preprocessor. + # https://learn.microsoft.com/en-us/cpp/build/reference/zc-preprocessor + append("/Zc:preprocessor" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + # Some projects use the __cplusplus preprocessor macro to check support for # a particular version of the C++ standard. When this option is not specified # explicitly, macro's value is "199711L" that implies C++98 Standard. From 335eb0eada3b0a276fb9c264010968db3024a4a9 Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Wed, 8 Feb 2023 14:52:53 -0800 Subject: [PATCH 02/12] [clang][cli] Simplify repetitive macro invocations Since we now only support Visual Studio 2019 16.7 and newer, we're able to use the `/Zc:preprocessor` flag that turns on the standards-conforming preprocessor. It (among other things) correctly expands `__VA_ARGS__` (see https://learn.microsoft.com/en-us/cpp/preprocessor/preprocessor-experimental-overview?view=msvc-170#macro-arguments-are-unpacked). This enables us to get rid of some repetitive boilerplate in Clang's command-line parser/generator. Reviewed By: Bigcheese Differential Revision: https://reviews.llvm.org/D135128 --- clang/lib/Frontend/CompilerInvocation.cpp | 273 +++++----------------- 1 file changed, 60 insertions(+), 213 deletions(-) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index dd79107a2459b..280d2154ae56d 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -456,8 +456,10 @@ static T extractMaskValue(T KeyPath) { } #define PARSE_OPTION_WITH_MARSHALLING( \ - ARGS, DIAGS, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) \ + ARGS, DIAGS, 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) \ if ((FLAGS)&options::CC1Option) { \ KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \ if (IMPLIED_CHECK) \ @@ -471,9 +473,10 @@ static T extractMaskValue(T KeyPath) { // 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) \ + ARGS, STRING_ALLOCATOR, 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) \ if ((FLAGS)&options::CC1Option) { \ [&](const auto &Extracted) { \ if (ALWAYS_EMIT || \ @@ -892,14 +895,8 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, CompilerInvocation::StringAllocator SA) { const AnalyzerOptions *AnalyzerOpts = &Opts; -#define ANALYZER_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) +#define ANALYZER_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef ANALYZER_OPTION_WITH_MARSHALLING @@ -985,14 +982,8 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, AnalyzerOptions *AnalyzerOpts = &Opts; -#define ANALYZER_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define ANALYZER_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef ANALYZER_OPTION_WITH_MARSHALLING @@ -1597,14 +1588,8 @@ void CompilerInvocation::GenerateCodeGenArgs( else GenerateArg(Args, OPT_O, Twine(Opts.OptimizationLevel), SA); -#define CODEGEN_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) +#define CODEGEN_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef CODEGEN_OPTION_WITH_MARSHALLING @@ -1869,14 +1854,8 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, // variable name and type. const LangOptions *LangOpts = &LangOptsRef; -#define CODEGEN_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define CODEGEN_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef CODEGEN_OPTION_WITH_MARSHALLING @@ -2334,14 +2313,8 @@ GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, SmallVectorImpl &Args, CompilerInvocation::StringAllocator SA) { const DependencyOutputOptions &DependencyOutputOpts = Opts; -#define DEPENDENCY_OUTPUT_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) +#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING @@ -2375,14 +2348,8 @@ static bool ParseDependencyOutputArgs(DependencyOutputOptions &Opts, unsigned NumErrorsBefore = Diags.getNumErrors(); DependencyOutputOptions &DependencyOutputOpts = Opts; -#define DEPENDENCY_OUTPUT_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING @@ -2498,14 +2465,8 @@ void CompilerInvocation::GenerateCASArgs( CompilerInvocation::StringAllocator SA) { const CASOptions &CASOpts = Opts; -#define CAS_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) +#define CAS_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef CAS_OPTION_WITH_MARSHALLING } @@ -2515,14 +2476,8 @@ bool CompilerInvocation::ParseCASArgs(CASOptions &Opts, const ArgList &Args, CASOptions &CASOpts = Opts; bool Success = true; -#define CAS_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define CAS_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef CAS_OPTION_WITH_MARSHALLING @@ -2534,14 +2489,8 @@ static void GenerateFileSystemArgs(const FileSystemOptions &Opts, CompilerInvocation::StringAllocator SA) { const FileSystemOptions &FileSystemOpts = Opts; -#define FILE_SYSTEM_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) +#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef FILE_SYSTEM_OPTION_WITH_MARSHALLING } @@ -2552,14 +2501,8 @@ static bool ParseFileSystemArgs(FileSystemOptions &Opts, const ArgList &Args, FileSystemOptions &FileSystemOpts = Opts; -#define FILE_SYSTEM_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef FILE_SYSTEM_OPTION_WITH_MARSHALLING @@ -2570,14 +2513,8 @@ static void GenerateMigratorArgs(const MigratorOptions &Opts, SmallVectorImpl &Args, CompilerInvocation::StringAllocator SA) { const MigratorOptions &MigratorOpts = Opts; -#define MIGRATOR_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) +#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef MIGRATOR_OPTION_WITH_MARSHALLING } @@ -2588,14 +2525,8 @@ static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, MigratorOptions &MigratorOpts = Opts; -#define MIGRATOR_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef MIGRATOR_OPTION_WITH_MARSHALLING @@ -2606,14 +2537,8 @@ void CompilerInvocation::GenerateDiagnosticArgs( const DiagnosticOptions &Opts, SmallVectorImpl &Args, StringAllocator SA, bool DefaultDiagColor) { const DiagnosticOptions *DiagnosticOpts = &Opts; -#define DIAG_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) +#define DIAG_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef DIAG_OPTION_WITH_MARSHALLING @@ -2697,14 +2622,8 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, // "DiagnosticOpts->". Let's provide the expected variable name and type. DiagnosticOptions *DiagnosticOpts = &Opts; -#define DIAG_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, *Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define DIAG_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef DIAG_OPTION_WITH_MARSHALLING @@ -2850,14 +2769,8 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts, CompilerInvocation::StringAllocator SA, bool IsHeader) { const FrontendOptions &FrontendOpts = Opts; -#define FRONTEND_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) +#define FRONTEND_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef FRONTEND_OPTION_WITH_MARSHALLING @@ -3074,14 +2987,8 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, FrontendOptions &FrontendOpts = Opts; -#define FRONTEND_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define FRONTEND_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef FRONTEND_OPTION_WITH_MARSHALLING @@ -3366,14 +3273,8 @@ static void GenerateHeaderSearchArgs(HeaderSearchOptions &Opts, SmallVectorImpl &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) +#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef HEADER_SEARCH_OPTION_WITH_MARSHALLING @@ -3495,14 +3396,8 @@ static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, 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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef HEADER_SEARCH_OPTION_WITH_MARSHALLING @@ -3817,14 +3712,8 @@ void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts, const LangOptions *LangOpts = &Opts; -#define LANG_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) +#define LANG_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef LANG_OPTION_WITH_MARSHALLING @@ -4143,14 +4032,8 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, // "LangOpts->". Let's provide the expected variable name and type. LangOptions *LangOpts = &Opts; -#define LANG_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define LANG_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef LANG_OPTION_WITH_MARSHALLING @@ -4658,14 +4541,8 @@ static void GeneratePreprocessorArgs(PreprocessorOptions &Opts, const CodeGenOptions &CodeGenOpts) { PreprocessorOptions *PreprocessorOpts = &Opts; -#define PREPROCESSOR_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) +#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OPTION_WITH_MARSHALLING @@ -4733,14 +4610,8 @@ static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, PreprocessorOptions *PreprocessorOpts = &Opts; -#define PREPROCESSOR_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OPTION_WITH_MARSHALLING @@ -4833,14 +4704,8 @@ static void GeneratePreprocessorOutputArgs( CompilerInvocation::StringAllocator SA, frontend::ActionKind Action) { const PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; -#define PREPROCESSOR_OUTPUT_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) +#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING @@ -4860,14 +4725,8 @@ static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; -#define PREPROCESSOR_OUTPUT_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING @@ -4882,14 +4741,8 @@ static void GenerateTargetArgs(const TargetOptions &Opts, SmallVectorImpl &Args, CompilerInvocation::StringAllocator SA) { const TargetOptions *TargetOpts = &Opts; -#define TARGET_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) +#define TARGET_OPTION_WITH_MARSHALLING(...) \ + GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef TARGET_OPTION_WITH_MARSHALLING @@ -4907,14 +4760,8 @@ static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args, TargetOptions *TargetOpts = &Opts; -#define TARGET_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) \ - PARSE_OPTION_WITH_MARSHALLING( \ - Args, Diags, ID, FLAGS, PARAM, SHOULD_PARSE, KEYPATH, DEFAULT_VALUE, \ - IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, MERGER, TABLE_INDEX) +#define TARGET_OPTION_WITH_MARSHALLING(...) \ + PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef TARGET_OPTION_WITH_MARSHALLING From 17ed3343c67af1eb3700ad27c3133281ef76acaa Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Fri, 28 Jul 2023 15:38:49 -0700 Subject: [PATCH 03/12] [llvm][ADT] Make `Twine` aware of `StringLiteral` The `const char *` storage backing StringLiteral has static lifetime. Making `Twine` aware of that allows us to avoid allocating heap memory in some contexts (e.g. avoid passing it to `StringSaver::save()` in a follow-up Clang patch). Reviewed By: benlangmuir Differential Revision: https://reviews.llvm.org/D157010 --- llvm/include/llvm/ADT/Twine.h | 19 +++++++++++++++++++ llvm/lib/Support/Twine.cpp | 7 +++++++ llvm/unittests/ADT/TwineTest.cpp | 10 ++++++++++ 3 files changed, 36 insertions(+) diff --git a/llvm/include/llvm/ADT/Twine.h b/llvm/include/llvm/ADT/Twine.h index ecd9d6df60ac6..8dfbe4f72e07d 100644 --- a/llvm/include/llvm/ADT/Twine.h +++ b/llvm/include/llvm/ADT/Twine.h @@ -102,6 +102,10 @@ namespace llvm { /// because they are not trivally constructible. PtrAndLengthKind, + /// A pointer and length representation that's also null-terminated. + /// Guaranteed to be constructed from a compile-time string literal. + StringLiteralKind, + /// A pointer to a formatv_object_base instance. FormatvObjectKind, @@ -303,6 +307,14 @@ namespace llvm { assert(isValid() && "Invalid twine!"); } + /// Construct from a StringLiteral. + /*implicit*/ Twine(const StringLiteral &Str) + : LHSKind(StringLiteralKind) { + LHS.ptrAndLength.ptr = Str.data(); + LHS.ptrAndLength.length = Str.size(); + assert(isValid() && "Invalid twine!"); + } + /// Construct from a SmallString. /*implicit*/ Twine(const SmallVectorImpl &Str) : LHSKind(PtrAndLengthKind) { @@ -418,6 +430,11 @@ namespace llvm { return isNullary(); } + /// Check if this twine is guaranteed to refer to single string literal. + bool isSingleStringLiteral() const { + return isUnary() && getLHSKind() == StringLiteralKind; + } + /// Return true if this twine can be dynamically accessed as a single /// StringRef value with getSingleStringRef(). bool isSingleStringRef() const { @@ -428,6 +445,7 @@ namespace llvm { case CStringKind: case StdStringKind: case PtrAndLengthKind: + case StringLiteralKind: return true; default: return false; @@ -463,6 +481,7 @@ namespace llvm { case StdStringKind: return StringRef(*LHS.stdString); case PtrAndLengthKind: + case StringLiteralKind: return StringRef(LHS.ptrAndLength.ptr, LHS.ptrAndLength.length); } } diff --git a/llvm/lib/Support/Twine.cpp b/llvm/lib/Support/Twine.cpp index 8bbfd0815a402..495b9cf2dbd68 100644 --- a/llvm/lib/Support/Twine.cpp +++ b/llvm/lib/Support/Twine.cpp @@ -44,6 +44,8 @@ StringRef Twine::toNullTerminatedStringRef(SmallVectorImpl &Out) const { const std::string *str = LHS.stdString; return StringRef(str->c_str(), str->size()); } + case StringLiteralKind: + return StringRef(LHS.ptrAndLength.ptr, LHS.ptrAndLength.length); default: break; } @@ -69,6 +71,7 @@ void Twine::printOneChild(raw_ostream &OS, Child Ptr, OS << *Ptr.stdString; break; case Twine::PtrAndLengthKind: + case Twine::StringLiteralKind: OS << StringRef(Ptr.ptrAndLength.ptr, Ptr.ptrAndLength.length); break; case Twine::FormatvObjectKind: @@ -124,6 +127,10 @@ void Twine::printOneChildRepr(raw_ostream &OS, Child Ptr, OS << "ptrAndLength:\"" << StringRef(Ptr.ptrAndLength.ptr, Ptr.ptrAndLength.length) << "\""; break; + case Twine::StringLiteralKind: + OS << "constexprPtrAndLength:\"" + << StringRef(Ptr.ptrAndLength.ptr, Ptr.ptrAndLength.length) << "\""; + break; case Twine::FormatvObjectKind: OS << "formatv:\"" << *Ptr.formatvObject << "\""; break; diff --git a/llvm/unittests/ADT/TwineTest.cpp b/llvm/unittests/ADT/TwineTest.cpp index bb7127659ee92..d45805f4db7a3 100644 --- a/llvm/unittests/ADT/TwineTest.cpp +++ b/llvm/unittests/ADT/TwineTest.cpp @@ -30,6 +30,7 @@ TEST(TwineTest, Construction) { EXPECT_EQ("hi", Twine(StringRef("hi")).str()); EXPECT_EQ("hi", Twine(StringRef(std::string("hi"))).str()); EXPECT_EQ("hi", Twine(StringRef("hithere", 2)).str()); + EXPECT_EQ("hi", Twine(StringLiteral("hi")).str()); EXPECT_EQ("hi", Twine(SmallString<4>("hi")).str()); EXPECT_EQ("hi", Twine(formatv("{0}", "hi")).str()); EXPECT_EQ("hi", Twine(std::string_view("hi")).str()); @@ -96,6 +97,9 @@ TEST(TwineTest, toNullTerminatedStringRef) { EXPECT_EQ(0, *Twine("hello").toNullTerminatedStringRef(storage).end()); EXPECT_EQ(0, *Twine(StringRef("hello")).toNullTerminatedStringRef(storage).end()); + EXPECT_EQ( + 0, + *Twine(StringLiteral("hello")).toNullTerminatedStringRef(storage).end()); EXPECT_EQ(0, *Twine(SmallString<11>("hello")) .toNullTerminatedStringRef(storage) .end()); @@ -104,6 +108,12 @@ TEST(TwineTest, toNullTerminatedStringRef) { .end()); } +TEST(TwineTest, isSingleStringLiteral) { + EXPECT_TRUE(Twine(StringLiteral("hi")).isSingleStringLiteral()); + EXPECT_FALSE(Twine("hi").isSingleStringLiteral()); + EXPECT_FALSE(Twine(StringRef("hi")).isSingleStringLiteral()); +} + TEST(TwineTest, LazyEvaluation) { struct formatter : FormatAdapter { explicit formatter(int &Count) : FormatAdapter(0), Count(Count) {} From 63c36c2f3ccdea3be7a416ca2c0e1effde2c4715 Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Thu, 3 Aug 2023 10:15:01 -0700 Subject: [PATCH 04/12] [llvm][Support] Avoid intermediate heap allocations in `StringSaver` The `Twine::str()` function currently always allocates heap memory via `std::string`. However, some instances of `Twine` don't need an intermediate buffer at all, and the rest can attempt to print into a stack buffer first. This is intentionally not making use of `Twine::isSingleStringLiteral()` from D157010 to skip saving the string in the bump-pointer allocator, since the `StringSaver` documentation suggests that MUST happen for every given string. Reviewed By: benlangmuir Differential Revision: https://reviews.llvm.org/D157015 --- llvm/include/llvm/Support/StringSaver.h | 4 ++-- llvm/lib/Support/StringSaver.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/Support/StringSaver.h b/llvm/include/llvm/Support/StringSaver.h index 2ef87754a0cfd..a34c0a5cf066d 100644 --- a/llvm/include/llvm/Support/StringSaver.h +++ b/llvm/include/llvm/Support/StringSaver.h @@ -29,7 +29,7 @@ class StringSaver final { // All returned strings are null-terminated: *save(S).end() == 0. StringRef save(const char *S) { return save(StringRef(S)); } StringRef save(StringRef S); - StringRef save(const Twine &S) { return save(StringRef(S.str())); } + StringRef save(const Twine &S); StringRef save(const std::string &S) { return save(StringRef(S)); } }; @@ -51,7 +51,7 @@ class UniqueStringSaver final { // All returned strings are null-terminated: *save(S).end() == 0. StringRef save(const char *S) { return save(StringRef(S)); } StringRef save(StringRef S); - StringRef save(const Twine &S) { return save(StringRef(S.str())); } + StringRef save(const Twine &S); StringRef save(const std::string &S) { return save(StringRef(S)); } }; diff --git a/llvm/lib/Support/StringSaver.cpp b/llvm/lib/Support/StringSaver.cpp index f7ccfb97ea798..4a616d7348320 100644 --- a/llvm/lib/Support/StringSaver.cpp +++ b/llvm/lib/Support/StringSaver.cpp @@ -8,6 +8,8 @@ #include "llvm/Support/StringSaver.h" +#include "llvm/ADT/SmallString.h" + using namespace llvm; StringRef StringSaver::save(StringRef S) { @@ -18,9 +20,19 @@ StringRef StringSaver::save(StringRef S) { return StringRef(P, S.size()); } +StringRef StringSaver::save(const Twine &S) { + SmallString<128> Storage; + return save(S.toStringRef(Storage)); +} + StringRef UniqueStringSaver::save(StringRef S) { auto R = Unique.insert(S); if (R.second) // cache miss, need to actually save the string *R.first = Strings.save(S); // safe replacement with equal value return *R.first; } + +StringRef UniqueStringSaver::save(const Twine &S) { + SmallString<128> Storage; + return save(S.toStringRef(Storage)); +} From 0f3a3e7b40d50cbe295e3605a3c55e6836a00f2e Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Thu, 3 Aug 2023 14:11:02 -0700 Subject: [PATCH 05/12] [clang][cli] Accept option spelling as `Twine` This will make it possible to accept the spelling as `StringLiteral` in D157029 and avoid some unnecessary allocations in a later patch. Reviewed By: benlangmuir Differential Revision: https://reviews.llvm.org/D157035 --- clang/lib/Frontend/CompilerInvocation.cpp | 31 ++++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 280d2154ae56d..3c4f5fa65b337 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -197,10 +197,12 @@ static Optional normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned, /// unnecessary template instantiations and just ignore it with a variadic /// argument. static void denormalizeSimpleFlag(SmallVectorImpl &Args, - const char *Spelling, + const Twine &Spelling, CompilerInvocation::StringAllocator, Option::OptionClass, unsigned, /*T*/...) { - Args.push_back(Spelling); + // Spelling is already allocated or a static string, no need to call SA. + assert(*Spelling.getSingleStringRef().end() == '\0'); + Args.push_back(Spelling.getSingleStringRef().data()); } template static constexpr bool is_uint64_t_convertible() { @@ -238,16 +240,19 @@ static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue, } static auto makeBooleanOptionDenormalizer(bool Value) { - return [Value](SmallVectorImpl &Args, const char *Spelling, + return [Value](SmallVectorImpl &Args, const Twine &Spelling, CompilerInvocation::StringAllocator, Option::OptionClass, unsigned, bool KeyPath) { - if (KeyPath == Value) - Args.push_back(Spelling); + if (KeyPath == Value) { + // Spelling is already allocated or a static string, no need to call SA. + assert(*Spelling.getSingleStringRef().end() == '\0'); + Args.push_back(Spelling.getSingleStringRef().data()); + } }; } static void denormalizeStringImpl(SmallVectorImpl &Args, - const char *Spelling, + const Twine &Spelling, CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned, const Twine &Value) { @@ -255,7 +260,9 @@ static void denormalizeStringImpl(SmallVectorImpl &Args, case Option::SeparateClass: case Option::JoinedOrSeparateClass: case Option::JoinedAndSeparateClass: - Args.push_back(Spelling); + // Spelling is already allocated or a static string, no need to call SA. + assert(*Spelling.getSingleStringRef().end() == '\0'); + Args.push_back(Spelling.getSingleStringRef().data()); Args.push_back(SA(Value)); break; case Option::JoinedClass: @@ -270,7 +277,7 @@ static void denormalizeStringImpl(SmallVectorImpl &Args, template static void -denormalizeString(SmallVectorImpl &Args, const char *Spelling, +denormalizeString(SmallVectorImpl &Args, const Twine &Spelling, CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned TableIndex, T Value) { denormalizeStringImpl(Args, Spelling, SA, OptClass, TableIndex, Twine(Value)); @@ -315,7 +322,7 @@ static llvm::Optional normalizeSimpleEnum(OptSpecifier Opt, } static void denormalizeSimpleEnumImpl(SmallVectorImpl &Args, - const char *Spelling, + const Twine &Spelling, CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned TableIndex, unsigned Value) { @@ -332,7 +339,7 @@ static void denormalizeSimpleEnumImpl(SmallVectorImpl &Args, template static void denormalizeSimpleEnum(SmallVectorImpl &Args, - const char *Spelling, + const Twine &Spelling, CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned TableIndex, T Value) { @@ -372,7 +379,7 @@ normalizeStringVector(OptSpecifier Opt, int, const ArgList &Args, } static void denormalizeStringVector(SmallVectorImpl &Args, - const char *Spelling, + const Twine &Spelling, CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned TableIndex, @@ -417,7 +424,7 @@ normalizeStringPairVector(OptSpecifier Opt, int, const ArgList &Args, } static void denormalizeStringPairVector( - SmallVectorImpl &Args, const char *Spelling, + SmallVectorImpl &Args, const Twine &Spelling, CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned TableIndex, const std::vector> &Values) { From d23fc2b61dab09419fb92f4573a70d03b9105c84 Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Fri, 28 Jul 2023 14:37:08 -0700 Subject: [PATCH 06/12] [clang] Abstract away string allocation in command line generation This patch abstracts away the string allocation and vector push-back from command line generation. Instead, **all** generated arguments are passed into `ArgumentConsumer`, which may choose to do the string allocation and vector push-back, or something else entirely. Reviewed By: benlangmuir Differential Revision: https://reviews.llvm.org/D157046 --- .../clang/Frontend/CompilerInvocation.h | 35 +- clang/lib/Frontend/CompilerInvocation.cpp | 705 +++++++++--------- 2 files changed, 363 insertions(+), 377 deletions(-) diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h index c2a6a3213d787..1f660b2563c13 100644 --- a/clang/include/clang/Frontend/CompilerInvocation.h +++ b/clang/include/clang/Frontend/CompilerInvocation.h @@ -242,7 +242,7 @@ class CompilerInvocation : public CompilerInvocationRefBase, /// identifying the conditions under which the module was built. std::string getModuleHash(DiagnosticsEngine &Diags) const; - using StringAllocator = llvm::function_ref; + using StringAllocator = llvm::function_ref; /// Generate cc1-compatible command line arguments from this instance. /// /// \param [out] Args - The generated arguments. Note that the caller is @@ -252,7 +252,21 @@ class CompilerInvocation : public CompilerInvocationRefBase, /// command line argument and return a pointer to the newly allocated string. /// The returned pointer is what gets appended to Args. void generateCC1CommandLine(llvm::SmallVectorImpl &Args, - StringAllocator SA) const; + StringAllocator SA) const { + generateCC1CommandLine([&](const Twine &Arg) { + // No need to allocate static string literals. + Args.push_back(Arg.isSingleStringLiteral() + ? Arg.getSingleStringRef().data() + : SA(Arg)); + }); + } + + using ArgumentConsumer = llvm::function_ref; + /// Generate cc1-compatible command line arguments from this instance. + /// + /// \param Consumer - Callback that gets invoked for every single generated + /// command line argument. + void generateCC1CommandLine(ArgumentConsumer Consumer) const; /// Generate cc1-compatible command line arguments from this instance, /// wrapping the result as a std::vector. @@ -284,9 +298,13 @@ class CompilerInvocation : public CompilerInvocationRefBase, DiagnosticsEngine &Diags); /// Generate command line options from CASOptions. + static void GenerateCASArgs(const CASOptions &Opts, + ArgumentConsumer Consumer); static void GenerateCASArgs(const CASOptions &Opts, SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA); + CompilerInvocation::StringAllocator SA) { + GenerateCASArgs(Opts, [&](const Twine &Arg) { Args.push_back(SA(Arg)); }); + } private: static bool CreateFromArgsImpl(CompilerInvocation &Res, @@ -295,8 +313,8 @@ class CompilerInvocation : public CompilerInvocationRefBase, /// Generate command line options from DiagnosticOptions. static void GenerateDiagnosticArgs(const DiagnosticOptions &Opts, - SmallVectorImpl &Args, - StringAllocator SA, bool DefaultDiagColor); + ArgumentConsumer Consumer, + bool DefaultDiagColor); /// Parse command line options that map to LangOptions. static bool ParseLangArgs(LangOptions &Opts, llvm::opt::ArgList &Args, @@ -307,8 +325,7 @@ class CompilerInvocation : public CompilerInvocationRefBase, public: /// Generate command line options from LangOptions. static void GenerateLangArgs(const LangOptions &Opts, - SmallVectorImpl &Args, - StringAllocator SA, const llvm::Triple &T, + ArgumentConsumer Consumer, const llvm::Triple &T, InputKind IK); private: @@ -324,8 +341,8 @@ class CompilerInvocation : public CompilerInvocationRefBase, // Generate command line options from CodeGenOptions. static void GenerateCodeGenArgs(const CodeGenOptions &Opts, - SmallVectorImpl &Args, - StringAllocator SA, const llvm::Triple &T, + ArgumentConsumer Consumer, + const llvm::Triple &T, const std::string &OutputFile, const LangOptions *LangOpts); }; diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 3c4f5fa65b337..d732d37ed1cb8 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -171,6 +171,8 @@ CompilerInvocationRefBase::~CompilerInvocationRefBase() = default; // Normalizers //===----------------------------------------------------------------------===// +using ArgumentConsumer = CompilerInvocation::ArgumentConsumer; + #define SIMPLE_ENUM_VALUE_TABLE #include "clang/Driver/Options.inc" #undef SIMPLE_ENUM_VALUE_TABLE @@ -196,13 +198,10 @@ static Optional normalizeSimpleNegativeFlag(OptSpecifier Opt, unsigned, /// denormalizeSimpleFlags never looks at it. Avoid bloating compile-time with /// unnecessary template instantiations and just ignore it with a variadic /// argument. -static void denormalizeSimpleFlag(SmallVectorImpl &Args, - const Twine &Spelling, - CompilerInvocation::StringAllocator, - Option::OptionClass, unsigned, /*T*/...) { - // Spelling is already allocated or a static string, no need to call SA. - assert(*Spelling.getSingleStringRef().end() == '\0'); - Args.push_back(Spelling.getSingleStringRef().data()); +static void denormalizeSimpleFlag(ArgumentConsumer Consumer, + const Twine &Spelling, Option::OptionClass, + unsigned, /*T*/...) { + Consumer(Spelling); } template static constexpr bool is_uint64_t_convertible() { @@ -240,34 +239,27 @@ static auto makeBooleanOptionNormalizer(bool Value, bool OtherValue, } static auto makeBooleanOptionDenormalizer(bool Value) { - return [Value](SmallVectorImpl &Args, const Twine &Spelling, - CompilerInvocation::StringAllocator, Option::OptionClass, - unsigned, bool KeyPath) { - if (KeyPath == Value) { - // Spelling is already allocated or a static string, no need to call SA. - assert(*Spelling.getSingleStringRef().end() == '\0'); - Args.push_back(Spelling.getSingleStringRef().data()); - } + return [Value](ArgumentConsumer Consumer, const Twine &Spelling, + Option::OptionClass, unsigned, bool KeyPath) { + if (KeyPath == Value) + Consumer(Spelling); }; } -static void denormalizeStringImpl(SmallVectorImpl &Args, +static void denormalizeStringImpl(ArgumentConsumer Consumer, const Twine &Spelling, - CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned, const Twine &Value) { switch (OptClass) { case Option::SeparateClass: case Option::JoinedOrSeparateClass: case Option::JoinedAndSeparateClass: - // Spelling is already allocated or a static string, no need to call SA. - assert(*Spelling.getSingleStringRef().end() == '\0'); - Args.push_back(Spelling.getSingleStringRef().data()); - Args.push_back(SA(Value)); + Consumer(Spelling); + Consumer(Value); break; case Option::JoinedClass: case Option::CommaJoinedClass: - Args.push_back(SA(Twine(Spelling) + Value)); + Consumer(Spelling + Value); break; default: llvm_unreachable("Cannot denormalize an option with option class " @@ -276,11 +268,10 @@ static void denormalizeStringImpl(SmallVectorImpl &Args, } template -static void -denormalizeString(SmallVectorImpl &Args, const Twine &Spelling, - CompilerInvocation::StringAllocator SA, - Option::OptionClass OptClass, unsigned TableIndex, T Value) { - denormalizeStringImpl(Args, Spelling, SA, OptClass, TableIndex, Twine(Value)); +static void denormalizeString(ArgumentConsumer Consumer, const Twine &Spelling, + Option::OptionClass OptClass, unsigned TableIndex, + T Value) { + denormalizeStringImpl(Consumer, Spelling, OptClass, TableIndex, Twine(Value)); } static Optional @@ -321,15 +312,14 @@ static llvm::Optional normalizeSimpleEnum(OptSpecifier Opt, return None; } -static void denormalizeSimpleEnumImpl(SmallVectorImpl &Args, +static void denormalizeSimpleEnumImpl(ArgumentConsumer Consumer, const Twine &Spelling, - CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned TableIndex, unsigned Value) { assert(TableIndex < SimpleEnumValueTablesSize); const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex]; if (auto MaybeEnumVal = findValueTableByValue(Table, Value)) { - denormalizeString(Args, Spelling, SA, OptClass, TableIndex, + denormalizeString(Consumer, Spelling, OptClass, TableIndex, MaybeEnumVal->Name); } else { llvm_unreachable("The simple enum value was not correctly defined in " @@ -338,12 +328,11 @@ static void denormalizeSimpleEnumImpl(SmallVectorImpl &Args, } template -static void denormalizeSimpleEnum(SmallVectorImpl &Args, +static void denormalizeSimpleEnum(ArgumentConsumer Consumer, const Twine &Spelling, - CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned TableIndex, T Value) { - return denormalizeSimpleEnumImpl(Args, Spelling, SA, OptClass, TableIndex, + return denormalizeSimpleEnumImpl(Consumer, Spelling, OptClass, TableIndex, static_cast(Value)); } @@ -378,9 +367,8 @@ normalizeStringVector(OptSpecifier Opt, int, const ArgList &Args, return Args.getAllArgValues(Opt); } -static void denormalizeStringVector(SmallVectorImpl &Args, +static void denormalizeStringVector(ArgumentConsumer Consumer, const Twine &Spelling, - CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, unsigned TableIndex, const std::vector &Values) { @@ -394,7 +382,7 @@ static void denormalizeStringVector(SmallVectorImpl &Args, CommaJoinedValue.append(Value); } } - denormalizeString(Args, Spelling, SA, Option::OptionClass::JoinedClass, + denormalizeString(Consumer, Spelling, Option::OptionClass::JoinedClass, TableIndex, CommaJoinedValue); break; } @@ -402,7 +390,7 @@ static void denormalizeStringVector(SmallVectorImpl &Args, case Option::SeparateClass: case Option::JoinedOrSeparateClass: for (const std::string &Value : Values) - denormalizeString(Args, Spelling, SA, OptClass, TableIndex, Value); + denormalizeString(Consumer, Spelling, OptClass, TableIndex, Value); break; default: llvm_unreachable("Cannot denormalize an option with option class " @@ -424,15 +412,14 @@ normalizeStringPairVector(OptSpecifier Opt, int, const ArgList &Args, } static void denormalizeStringPairVector( - SmallVectorImpl &Args, const Twine &Spelling, - CompilerInvocation::StringAllocator SA, Option::OptionClass OptClass, - unsigned TableIndex, + ArgumentConsumer Consumer, const Twine &Spelling, + Option::OptionClass OptClass, unsigned TableIndex, const std::vector> &Values) { std::vector Joined; for (const auto &Pair : Values) { Joined.push_back(Pair.first + "=" + Pair.second); } - denormalizeStringVector(Args, Spelling, SA, OptClass, TableIndex, Joined); + denormalizeStringVector(Consumer, Spelling, OptClass, TableIndex, Joined); } static Optional normalizeTriple(OptSpecifier Opt, int TableIndex, @@ -480,18 +467,18 @@ static T extractMaskValue(T KeyPath) { // 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, 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) \ + CONSUMER, 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) \ if ((FLAGS)&options::CC1Option) { \ [&](const auto &Extracted) { \ if (ALWAYS_EMIT || \ (Extracted != \ static_cast((IMPLIED_CHECK) ? (IMPLIED_VALUE) \ : (DEFAULT_VALUE)))) \ - DENORMALIZER(ARGS, SPELLING, STRING_ALLOCATOR, Option::KIND##Class, \ - TABLE_INDEX, Extracted); \ + DENORMALIZER(CONSUMER, SPELLING, Option::KIND##Class, TABLE_INDEX, \ + Extracted); \ }(EXTRACTOR(KEYPATH)); \ } @@ -656,33 +643,30 @@ static unsigned getOptimizationLevelSize(ArgList &Args) { return 0; } -static void GenerateArg(SmallVectorImpl &Args, - llvm::opt::OptSpecifier OptSpecifier, - CompilerInvocation::StringAllocator SA) { +static void GenerateArg(ArgumentConsumer Consumer, + llvm::opt::OptSpecifier OptSpecifier) { Option Opt = getDriverOptTable().getOption(OptSpecifier); - denormalizeSimpleFlag(Args, SA(Opt.getPrefix() + Opt.getName()), SA, + denormalizeSimpleFlag(Consumer, Opt.getPrefix() + Opt.getName(), Option::OptionClass::FlagClass, 0); } -static void GenerateArg(SmallVectorImpl &Args, +static void GenerateArg(ArgumentConsumer Consumer, llvm::opt::OptSpecifier OptSpecifier, - const Twine &Value, - CompilerInvocation::StringAllocator SA) { + const Twine &Value) { Option Opt = getDriverOptTable().getOption(OptSpecifier); - denormalizeString(Args, SA(Opt.getPrefix() + Opt.getName()), SA, - Opt.getKind(), 0, Value); + denormalizeString(Consumer, Opt.getPrefix() + Opt.getName(), Opt.getKind(), 0, + Value); } -static void GenerateMultiArg(SmallVectorImpl &Args, +static void GenerateMultiArg(ArgumentConsumer Consumer, llvm::opt::OptSpecifier OptSpecifier, - ArrayRef Values, - CompilerInvocation::StringAllocator SA) { + ArrayRef Values) { Option Opt = getDriverOptTable().getOption(OptSpecifier); assert(Opt.getKind() == Option::MultiArgClass); assert(Opt.getNumArgs() == Values.size()); - Args.push_back(SA(Opt.getPrefix() + Opt.getName())); + Consumer(Opt.getPrefix() + Opt.getName()); for (StringRef Value : Values) - Args.push_back(SA(Value)); + Consumer(Value); } // Parse command line arguments into CompilerInvocation. @@ -898,12 +882,11 @@ static void getAllNoBuiltinFuncValues(ArgList &Args, } static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { + ArgumentConsumer Consumer) { const AnalyzerOptions *AnalyzerOpts = &Opts; #define ANALYZER_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef ANALYZER_OPTION_WITH_MARSHALLING @@ -911,7 +894,7 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, switch (Opts.AnalysisConstraintsOpt) { #define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \ case NAME##Model: \ - GenerateArg(Args, OPT_analyzer_constraints, CMDFLAG, SA); \ + GenerateArg(Consumer, OPT_analyzer_constraints, CMDFLAG); \ break; #include "clang/StaticAnalyzer/Core/Analyses.def" default: @@ -923,7 +906,7 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, switch (Opts.AnalysisDiagOpt) { #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \ case PD_##NAME: \ - GenerateArg(Args, OPT_analyzer_output, CMDFLAG, SA); \ + GenerateArg(Consumer, OPT_analyzer_output, CMDFLAG); \ break; #include "clang/StaticAnalyzer/Core/Analyses.def" default: @@ -935,7 +918,7 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, switch (Opts.AnalysisPurgeOpt) { #define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \ case NAME: \ - GenerateArg(Args, OPT_analyzer_purge, CMDFLAG, SA); \ + GenerateArg(Consumer, OPT_analyzer_purge, CMDFLAG); \ break; #include "clang/StaticAnalyzer/Core/Analyses.def" default: @@ -947,7 +930,7 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, switch (Opts.InliningMode) { #define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \ case NAME: \ - GenerateArg(Args, OPT_analyzer_inlining_mode, CMDFLAG, SA); \ + GenerateArg(Consumer, OPT_analyzer_inlining_mode, CMDFLAG); \ break; #include "clang/StaticAnalyzer/Core/Analyses.def" default: @@ -958,7 +941,7 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, for (const auto &CP : Opts.CheckersAndPackages) { OptSpecifier Opt = CP.second ? OPT_analyzer_checker : OPT_analyzer_disable_checker; - GenerateArg(Args, Opt, CP.first, SA); + GenerateArg(Consumer, Opt, CP.first); } AnalyzerOptions ConfigOpts; @@ -977,7 +960,7 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, if (Entry != ConfigOpts.Config.end() && Entry->getValue() == Value) continue; - GenerateArg(Args, OPT_analyzer_config, Key + "=" + Value, SA); + GenerateArg(Consumer, OPT_analyzer_config, Key + "=" + Value); } // Nothing to generate for FullCompilerInvocation. @@ -1242,16 +1225,15 @@ static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts, /// Generate a remark argument. This is an inverse of `ParseOptimizationRemark`. static void -GenerateOptimizationRemark(SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA, - OptSpecifier OptEQ, StringRef Name, +GenerateOptimizationRemark(ArgumentConsumer Consumer, OptSpecifier OptEQ, + StringRef Name, const CodeGenOptions::OptRemark &Remark) { if (Remark.hasValidPattern()) { - GenerateArg(Args, OptEQ, Remark.Pattern, SA); + GenerateArg(Consumer, OptEQ, Remark.Pattern); } else if (Remark.Kind == CodeGenOptions::RK_Enabled) { - GenerateArg(Args, OPT_R_Joined, Name, SA); + GenerateArg(Consumer, OPT_R_Joined, Name); } else if (Remark.Kind == CodeGenOptions::RK_Disabled) { - GenerateArg(Args, OPT_R_Joined, StringRef("no-") + Name, SA); + GenerateArg(Consumer, OPT_R_Joined, StringRef("no-") + Name); } } @@ -1584,35 +1566,36 @@ static bool parsePointerAuthOptions(PointerAuthOptions &Opts, return false; } -void CompilerInvocation::GenerateCodeGenArgs( - const CodeGenOptions &Opts, SmallVectorImpl &Args, - StringAllocator SA, const llvm::Triple &T, const std::string &OutputFile, - const LangOptions *LangOpts) { +void CompilerInvocation::GenerateCodeGenArgs(const CodeGenOptions &Opts, + ArgumentConsumer Consumer, + const llvm::Triple &T, + const std::string &OutputFile, + const LangOptions *LangOpts) { const CodeGenOptions &CodeGenOpts = Opts; if (Opts.OptimizationLevel == 0) - GenerateArg(Args, OPT_O0, SA); + GenerateArg(Consumer, OPT_O0); else - GenerateArg(Args, OPT_O, Twine(Opts.OptimizationLevel), SA); + GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel)); #define CODEGEN_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef CODEGEN_OPTION_WITH_MARSHALLING if (Opts.OptimizationLevel > 0) { if (Opts.Inlining == CodeGenOptions::NormalInlining) - GenerateArg(Args, OPT_finline_functions, SA); + GenerateArg(Consumer, OPT_finline_functions); else if (Opts.Inlining == CodeGenOptions::OnlyHintInlining) - GenerateArg(Args, OPT_finline_hint_functions, SA); + GenerateArg(Consumer, OPT_finline_hint_functions); else if (Opts.Inlining == CodeGenOptions::OnlyAlwaysInlining) - GenerateArg(Args, OPT_fno_inline, SA); + GenerateArg(Consumer, OPT_fno_inline); } if (Opts.DirectAccessExternalData && LangOpts->PICLevel != 0) - GenerateArg(Args, OPT_fdirect_access_external_data, SA); + GenerateArg(Consumer, OPT_fdirect_access_external_data); else if (!Opts.DirectAccessExternalData && LangOpts->PICLevel == 0) - GenerateArg(Args, OPT_fno_direct_access_external_data, SA); + GenerateArg(Consumer, OPT_fno_direct_access_external_data); Optional DebugInfoVal; switch (Opts.DebugInfo) { @@ -1642,23 +1625,23 @@ void CompilerInvocation::GenerateCodeGenArgs( break; } if (DebugInfoVal) - GenerateArg(Args, OPT_debug_info_kind_EQ, *DebugInfoVal, SA); + GenerateArg(Consumer, OPT_debug_info_kind_EQ, *DebugInfoVal); for (const auto &Prefix : Opts.DebugPrefixMap) - GenerateArg(Args, OPT_fdebug_prefix_map_EQ, - Prefix.first + "=" + Prefix.second, SA); + GenerateArg(Consumer, OPT_fdebug_prefix_map_EQ, + Prefix.first + "=" + Prefix.second); for (const auto &Prefix : Opts.CoveragePrefixMap) - GenerateArg(Args, OPT_fcoverage_prefix_map_EQ, - Prefix.first + "=" + Prefix.second, SA); + GenerateArg(Consumer, OPT_fcoverage_prefix_map_EQ, + Prefix.first + "=" + Prefix.second); if (Opts.NewStructPathTBAA) - GenerateArg(Args, OPT_new_struct_path_tbaa, SA); + GenerateArg(Consumer, OPT_new_struct_path_tbaa); if (Opts.OptimizeSize == 1) - GenerateArg(Args, OPT_O, "s", SA); + GenerateArg(Consumer, OPT_O, "s"); else if (Opts.OptimizeSize == 2) - GenerateArg(Args, OPT_O, "z", SA); + GenerateArg(Consumer, OPT_O, "z"); // SimplifyLibCalls is set only in the absence of -fno-builtin and // -ffreestanding. We'll consider that when generating them. @@ -1666,65 +1649,65 @@ void CompilerInvocation::GenerateCodeGenArgs( // NoBuiltinFuncs are generated by LangOptions. if (Opts.UnrollLoops && Opts.OptimizationLevel <= 1) - GenerateArg(Args, OPT_funroll_loops, SA); + GenerateArg(Consumer, OPT_funroll_loops); else if (!Opts.UnrollLoops && Opts.OptimizationLevel > 1) - GenerateArg(Args, OPT_fno_unroll_loops, SA); + GenerateArg(Consumer, OPT_fno_unroll_loops); if (!Opts.BinutilsVersion.empty()) - GenerateArg(Args, OPT_fbinutils_version_EQ, Opts.BinutilsVersion, SA); + GenerateArg(Consumer, OPT_fbinutils_version_EQ, Opts.BinutilsVersion); if (Opts.DebugNameTable == static_cast(llvm::DICompileUnit::DebugNameTableKind::GNU)) - GenerateArg(Args, OPT_ggnu_pubnames, SA); + GenerateArg(Consumer, OPT_ggnu_pubnames); else if (Opts.DebugNameTable == static_cast( llvm::DICompileUnit::DebugNameTableKind::Default)) - GenerateArg(Args, OPT_gpubnames, SA); + GenerateArg(Consumer, OPT_gpubnames); auto TNK = Opts.getDebugSimpleTemplateNames(); if (TNK != codegenoptions::DebugTemplateNamesKind::Full) { if (TNK == codegenoptions::DebugTemplateNamesKind::Simple) - GenerateArg(Args, OPT_gsimple_template_names_EQ, "simple", SA); + GenerateArg(Consumer, OPT_gsimple_template_names_EQ, "simple"); else if (TNK == codegenoptions::DebugTemplateNamesKind::Mangled) - GenerateArg(Args, OPT_gsimple_template_names_EQ, "mangled", SA); + GenerateArg(Consumer, OPT_gsimple_template_names_EQ, "mangled"); } // ProfileInstrumentUsePath is marshalled automatically, no need to generate // it or PGOUseInstrumentor. if (Opts.TimePasses) { if (Opts.TimePassesPerRun) - GenerateArg(Args, OPT_ftime_report_EQ, "per-pass-run", SA); + GenerateArg(Consumer, OPT_ftime_report_EQ, "per-pass-run"); else - GenerateArg(Args, OPT_ftime_report, SA); + GenerateArg(Consumer, OPT_ftime_report); } if (Opts.PrepareForLTO && !Opts.PrepareForThinLTO) - GenerateArg(Args, OPT_flto_EQ, "full", SA); + GenerateArg(Consumer, OPT_flto_EQ, "full"); if (Opts.PrepareForThinLTO) - GenerateArg(Args, OPT_flto_EQ, "thin", SA); + GenerateArg(Consumer, OPT_flto_EQ, "thin"); if (!Opts.ThinLTOIndexFile.empty()) - GenerateArg(Args, OPT_fthinlto_index_EQ, Opts.ThinLTOIndexFile, SA); + GenerateArg(Consumer, OPT_fthinlto_index_EQ, Opts.ThinLTOIndexFile); if (Opts.SaveTempsFilePrefix == OutputFile) - GenerateArg(Args, OPT_save_temps_EQ, "obj", SA); + GenerateArg(Consumer, OPT_save_temps_EQ, "obj"); StringRef MemProfileBasename("memprof.profraw"); if (!Opts.MemoryProfileOutput.empty()) { if (Opts.MemoryProfileOutput == MemProfileBasename) { - GenerateArg(Args, OPT_fmemory_profile, SA); + GenerateArg(Consumer, OPT_fmemory_profile); } else { size_t ArgLength = Opts.MemoryProfileOutput.size() - MemProfileBasename.size(); - GenerateArg(Args, OPT_fmemory_profile_EQ, - Opts.MemoryProfileOutput.substr(0, ArgLength), SA); + GenerateArg(Consumer, OPT_fmemory_profile_EQ, + Opts.MemoryProfileOutput.substr(0, ArgLength)); } } if (memcmp(Opts.CoverageVersion, "408*", 4) != 0) - GenerateArg(Args, OPT_coverage_version_EQ, - StringRef(Opts.CoverageVersion, 4), SA); + GenerateArg(Consumer, OPT_coverage_version_EQ, + StringRef(Opts.CoverageVersion, 4)); // TODO: Check if we need to generate arguments stored in CmdArgs. (Namely // '-fembed_bitcode', which does not map to any CompilerInvocation field and @@ -1734,99 +1717,98 @@ void CompilerInvocation::GenerateCodeGenArgs( std::string InstrBundle = serializeXRayInstrumentationBundle(Opts.XRayInstrumentationBundle); if (!InstrBundle.empty()) - GenerateArg(Args, OPT_fxray_instrumentation_bundle, InstrBundle, SA); + GenerateArg(Consumer, OPT_fxray_instrumentation_bundle, InstrBundle); } if (Opts.CFProtectionReturn && Opts.CFProtectionBranch) - GenerateArg(Args, OPT_fcf_protection_EQ, "full", SA); + GenerateArg(Consumer, OPT_fcf_protection_EQ, "full"); else if (Opts.CFProtectionReturn) - GenerateArg(Args, OPT_fcf_protection_EQ, "return", SA); + GenerateArg(Consumer, OPT_fcf_protection_EQ, "return"); else if (Opts.CFProtectionBranch) - GenerateArg(Args, OPT_fcf_protection_EQ, "branch", SA); + GenerateArg(Consumer, OPT_fcf_protection_EQ, "branch"); if (Opts.IBTSeal) - GenerateArg(Args, OPT_mibt_seal, SA); + GenerateArg(Consumer, OPT_mibt_seal); if (Opts.FunctionReturnThunks) - GenerateArg(Args, OPT_mfunction_return_EQ, "thunk-extern", SA); + GenerateArg(Consumer, OPT_mfunction_return_EQ, "thunk-extern"); for (const auto &F : Opts.LinkBitcodeFiles) { bool Builtint = F.LinkFlags == llvm::Linker::Flags::LinkOnlyNeeded && F.PropagateAttrs && F.Internalize; - GenerateArg(Args, + GenerateArg(Consumer, Builtint ? OPT_mlink_builtin_bitcode : OPT_mlink_bitcode_file, - F.Filename, SA); + F.Filename); } - GenerateArg( - Args, Opts.EmulatedTLS ? OPT_femulated_tls : OPT_fno_emulated_tls, SA); + GenerateArg(Consumer, + Opts.EmulatedTLS ? OPT_femulated_tls : OPT_fno_emulated_tls); if (Opts.FPDenormalMode != llvm::DenormalMode::getIEEE()) - GenerateArg(Args, OPT_fdenormal_fp_math_EQ, Opts.FPDenormalMode.str(), SA); + GenerateArg(Consumer, OPT_fdenormal_fp_math_EQ, Opts.FPDenormalMode.str()); if ((Opts.FPDenormalMode != Opts.FP32DenormalMode) || (Opts.FP32DenormalMode != llvm::DenormalMode::getIEEE())) - GenerateArg(Args, OPT_fdenormal_fp_math_f32_EQ, Opts.FP32DenormalMode.str(), - SA); + GenerateArg(Consumer, OPT_fdenormal_fp_math_f32_EQ, + Opts.FP32DenormalMode.str()); if (Opts.StructReturnConvention == CodeGenOptions::SRCK_OnStack) { OptSpecifier Opt = T.isPPC32() ? OPT_maix_struct_return : OPT_fpcc_struct_return; - GenerateArg(Args, Opt, SA); + GenerateArg(Consumer, Opt); } else if (Opts.StructReturnConvention == CodeGenOptions::SRCK_InRegs) { OptSpecifier Opt = T.isPPC32() ? OPT_msvr4_struct_return : OPT_freg_struct_return; - GenerateArg(Args, Opt, SA); + GenerateArg(Consumer, Opt); } if (Opts.EnableAIXExtendedAltivecABI) - GenerateArg(Args, OPT_mabi_EQ_vec_extabi, SA); + GenerateArg(Consumer, OPT_mabi_EQ_vec_extabi); if (!Opts.OptRecordPasses.empty()) - GenerateArg(Args, OPT_opt_record_passes, Opts.OptRecordPasses, SA); + GenerateArg(Consumer, OPT_opt_record_passes, Opts.OptRecordPasses); if (!Opts.OptRecordFormat.empty()) - GenerateArg(Args, OPT_opt_record_format, Opts.OptRecordFormat, SA); + GenerateArg(Consumer, OPT_opt_record_format, Opts.OptRecordFormat); - GenerateOptimizationRemark(Args, SA, OPT_Rpass_EQ, "pass", + GenerateOptimizationRemark(Consumer, OPT_Rpass_EQ, "pass", Opts.OptimizationRemark); - GenerateOptimizationRemark(Args, SA, OPT_Rpass_missed_EQ, "pass-missed", + GenerateOptimizationRemark(Consumer, OPT_Rpass_missed_EQ, "pass-missed", Opts.OptimizationRemarkMissed); - GenerateOptimizationRemark(Args, SA, OPT_Rpass_analysis_EQ, "pass-analysis", + GenerateOptimizationRemark(Consumer, OPT_Rpass_analysis_EQ, "pass-analysis", Opts.OptimizationRemarkAnalysis); - GenerateArg(Args, OPT_fdiagnostics_hotness_threshold_EQ, + GenerateArg(Consumer, OPT_fdiagnostics_hotness_threshold_EQ, Opts.DiagnosticsHotnessThreshold ? Twine(*Opts.DiagnosticsHotnessThreshold) - : "auto", - SA); + : "auto"); - GenerateArg(Args, OPT_fdiagnostics_misexpect_tolerance_EQ, - Twine(*Opts.DiagnosticsMisExpectTolerance), SA); + GenerateArg(Consumer, OPT_fdiagnostics_misexpect_tolerance_EQ, + Twine(*Opts.DiagnosticsMisExpectTolerance)); for (StringRef Sanitizer : serializeSanitizerKinds(Opts.SanitizeRecover)) - GenerateArg(Args, OPT_fsanitize_recover_EQ, Sanitizer, SA); + GenerateArg(Consumer, OPT_fsanitize_recover_EQ, Sanitizer); for (StringRef Sanitizer : serializeSanitizerKinds(Opts.SanitizeTrap)) - GenerateArg(Args, OPT_fsanitize_trap_EQ, Sanitizer, SA); + GenerateArg(Consumer, OPT_fsanitize_trap_EQ, Sanitizer); if (!Opts.EmitVersionIdentMetadata) - GenerateArg(Args, OPT_Qn, SA); + GenerateArg(Consumer, OPT_Qn); if (!Opts.SplitColdCode && (Opts.OptimizationLevel > 0) && (Opts.OptimizeSize != 2)) - GenerateArg(Args, OPT_fno_split_cold_code, SA); + GenerateArg(Consumer, OPT_fno_split_cold_code); switch (Opts.FiniteLoops) { case CodeGenOptions::FiniteLoopsKind::Language: break; case CodeGenOptions::FiniteLoopsKind::Always: - GenerateArg(Args, OPT_ffinite_loops, SA); + GenerateArg(Consumer, OPT_ffinite_loops); break; case CodeGenOptions::FiniteLoopsKind::Never: - GenerateArg(Args, OPT_fno_finite_loops, SA); + GenerateArg(Consumer, OPT_fno_finite_loops); break; } } @@ -2315,18 +2297,16 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, return Diags.getNumErrors() == NumErrorsBefore; } -static void -GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { +static void GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, + ArgumentConsumer Consumer) { const DependencyOutputOptions &DependencyOutputOpts = Opts; #define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING if (Opts.ShowIncludesDest != ShowIncludesDestination::None) - GenerateArg(Args, OPT_show_includes, SA); + GenerateArg(Consumer, OPT_show_includes); for (const auto &Dep : Opts.ExtraDeps) { switch (Dep.second) { @@ -2342,7 +2322,7 @@ GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, // marshalling infrastructure. continue; case EDK_DepFileEntry: - GenerateArg(Args, OPT_fdepfile_entry, Dep.first, SA); + GenerateArg(Consumer, OPT_fdepfile_entry, Dep.first); break; } } @@ -2467,13 +2447,12 @@ static bool checkVerifyPrefixes(const std::vector &VerifyPrefixes, return Success; } -void CompilerInvocation::GenerateCASArgs( - const CASOptions &Opts, SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { +void CompilerInvocation::GenerateCASArgs(const CASOptions &Opts, + ArgumentConsumer Consumer) { const CASOptions &CASOpts = Opts; #define CAS_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef CAS_OPTION_WITH_MARSHALLING } @@ -2492,12 +2471,11 @@ bool CompilerInvocation::ParseCASArgs(CASOptions &Opts, const ArgList &Args, } static void GenerateFileSystemArgs(const FileSystemOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { + ArgumentConsumer Consumer) { const FileSystemOptions &FileSystemOpts = Opts; #define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef FILE_SYSTEM_OPTION_WITH_MARSHALLING } @@ -2517,11 +2495,10 @@ static bool ParseFileSystemArgs(FileSystemOptions &Opts, const ArgList &Args, } static void GenerateMigratorArgs(const MigratorOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { + ArgumentConsumer Consumer) { const MigratorOptions &MigratorOpts = Opts; #define MIGRATOR_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef MIGRATOR_OPTION_WITH_MARSHALLING } @@ -2540,51 +2517,51 @@ static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, return Diags.getNumErrors() == NumErrorsBefore; } -void CompilerInvocation::GenerateDiagnosticArgs( - const DiagnosticOptions &Opts, SmallVectorImpl &Args, - StringAllocator SA, bool DefaultDiagColor) { +void CompilerInvocation::GenerateDiagnosticArgs(const DiagnosticOptions &Opts, + ArgumentConsumer Consumer, + bool DefaultDiagColor) { const DiagnosticOptions *DiagnosticOpts = &Opts; #define DIAG_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef DIAG_OPTION_WITH_MARSHALLING if (!Opts.DiagnosticSerializationFile.empty()) - GenerateArg(Args, OPT_diagnostic_serialized_file, - Opts.DiagnosticSerializationFile, SA); + GenerateArg(Consumer, OPT_diagnostic_serialized_file, + Opts.DiagnosticSerializationFile); if (Opts.ShowColors) - GenerateArg(Args, OPT_fcolor_diagnostics, SA); + GenerateArg(Consumer, OPT_fcolor_diagnostics); if (Opts.VerifyDiagnostics && llvm::is_contained(Opts.VerifyPrefixes, "expected")) - GenerateArg(Args, OPT_verify, SA); + GenerateArg(Consumer, OPT_verify); for (const auto &Prefix : Opts.VerifyPrefixes) if (Prefix != "expected") - GenerateArg(Args, OPT_verify_EQ, Prefix, SA); + GenerateArg(Consumer, OPT_verify_EQ, Prefix); DiagnosticLevelMask VIU = Opts.getVerifyIgnoreUnexpected(); if (VIU == DiagnosticLevelMask::None) { // This is the default, don't generate anything. } else if (VIU == DiagnosticLevelMask::All) { - GenerateArg(Args, OPT_verify_ignore_unexpected, SA); + GenerateArg(Consumer, OPT_verify_ignore_unexpected); } else { if (static_cast(VIU & DiagnosticLevelMask::Note) != 0) - GenerateArg(Args, OPT_verify_ignore_unexpected_EQ, "note", SA); + GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ, "note"); if (static_cast(VIU & DiagnosticLevelMask::Remark) != 0) - GenerateArg(Args, OPT_verify_ignore_unexpected_EQ, "remark", SA); + GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ, "remark"); if (static_cast(VIU & DiagnosticLevelMask::Warning) != 0) - GenerateArg(Args, OPT_verify_ignore_unexpected_EQ, "warning", SA); + GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ, "warning"); if (static_cast(VIU & DiagnosticLevelMask::Error) != 0) - GenerateArg(Args, OPT_verify_ignore_unexpected_EQ, "error", SA); + GenerateArg(Consumer, OPT_verify_ignore_unexpected_EQ, "error"); } for (const auto &Warning : Opts.Warnings) { // This option is automatically generated from UndefPrefixes. if (Warning == "undef-prefix") continue; - Args.push_back(SA(StringRef("-W") + Warning)); + Consumer(StringRef("-W") + Warning); } for (const auto &Remark : Opts.Remarks) { @@ -2596,7 +2573,7 @@ void CompilerInvocation::GenerateDiagnosticArgs( if (llvm::is_contained(IgnoredRemarks, Remark)) continue; - Args.push_back(SA(StringRef("-R") + Remark)); + Consumer(StringRef("-R") + Remark); } } @@ -2772,12 +2749,10 @@ getProgramActionOpt(frontend::ActionKind ProgramAction) { } static void GenerateFrontendArgs(const FrontendOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA, - bool IsHeader) { + ArgumentConsumer Consumer, bool IsHeader) { const FrontendOptions &FrontendOpts = Opts; #define FRONTEND_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef FRONTEND_OPTION_WITH_MARSHALLING @@ -2786,7 +2761,7 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts, // Generating a simple flag covers most frontend actions. std::function GenerateProgramAction = [&]() { - GenerateArg(Args, *ProgramActionOpt, SA); + GenerateArg(Consumer, *ProgramActionOpt); }; if (!ProgramActionOpt) { @@ -2794,7 +2769,7 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts, assert(Opts.ProgramAction == frontend::PluginAction && "Frontend action without option."); GenerateProgramAction = [&]() { - GenerateArg(Args, OPT_plugin, Opts.ActionName, SA); + GenerateArg(Consumer, OPT_plugin, Opts.ActionName); }; } @@ -2815,21 +2790,21 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts, } if (Opts.ASTDumpAll) - GenerateArg(Args, OPT_ast_dump_all_EQ, Format, SA); + GenerateArg(Consumer, OPT_ast_dump_all_EQ, Format); if (Opts.ASTDumpDecls) - GenerateArg(Args, OPT_ast_dump_EQ, Format, SA); + GenerateArg(Consumer, OPT_ast_dump_EQ, Format); } else { if (Opts.ASTDumpAll) - GenerateArg(Args, OPT_ast_dump_all, SA); + GenerateArg(Consumer, OPT_ast_dump_all); if (Opts.ASTDumpDecls) - GenerateArg(Args, OPT_ast_dump, SA); + GenerateArg(Consumer, OPT_ast_dump); } }; } if (Opts.ProgramAction == frontend::FixIt && !Opts.FixItSuffix.empty()) { GenerateProgramAction = [&]() { - GenerateArg(Args, OPT_fixit_EQ, Opts.FixItSuffix, SA); + GenerateArg(Consumer, OPT_fixit_EQ, Opts.FixItSuffix); }; } @@ -2837,36 +2812,36 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts, for (const auto &PluginArgs : Opts.PluginArgs) { Option Opt = getDriverOptTable().getOption(OPT_plugin_arg); - const char *Spelling = - SA(Opt.getPrefix() + Opt.getName() + PluginArgs.first); for (const auto &PluginArg : PluginArgs.second) - denormalizeString(Args, Spelling, SA, Opt.getKind(), 0, PluginArg); + denormalizeString(Consumer, + Opt.getPrefix() + Opt.getName() + PluginArgs.first, + Opt.getKind(), 0, PluginArg); } for (const auto &Ext : Opts.ModuleFileExtensions) if (auto *TestExt = dyn_cast_or_null(Ext.get())) - GenerateArg(Args, OPT_ftest_module_file_extension_EQ, TestExt->str(), SA); + GenerateArg(Consumer, OPT_ftest_module_file_extension_EQ, TestExt->str()); if (!Opts.CodeCompletionAt.FileName.empty()) - GenerateArg(Args, OPT_code_completion_at, Opts.CodeCompletionAt.ToString(), - SA); + GenerateArg(Consumer, OPT_code_completion_at, + Opts.CodeCompletionAt.ToString()); for (const auto &Plugin : Opts.Plugins) - GenerateArg(Args, OPT_load, Plugin, SA); + GenerateArg(Consumer, OPT_load, Plugin); // ASTDumpDecls and ASTDumpAll already handled with ProgramAction. for (const auto &ModuleFile : Opts.ModuleFiles) - GenerateArg(Args, OPT_fmodule_file, ModuleFile, SA); + GenerateArg(Consumer, OPT_fmodule_file, ModuleFile); for (const auto &A : Opts.ModuleCacheKeys) - GenerateMultiArg(Args, OPT_fmodule_file_cache_key, {A.first, A.second}, SA); + GenerateMultiArg(Consumer, OPT_fmodule_file_cache_key, {A.first, A.second}); if (Opts.AuxTargetCPU) - GenerateArg(Args, OPT_aux_target_cpu, *Opts.AuxTargetCPU, SA); + GenerateArg(Consumer, OPT_aux_target_cpu, *Opts.AuxTargetCPU); if (Opts.AuxTargetFeatures) for (const auto &Feature : *Opts.AuxTargetFeatures) - GenerateArg(Args, OPT_aux_target_feature, Feature, SA); + GenerateArg(Consumer, OPT_aux_target_feature, Feature); { StringRef Preprocessed = Opts.DashX.isPreprocessed() ? "-cpp-output" : ""; @@ -2933,14 +2908,14 @@ static void GenerateFrontendArgs(const FrontendOptions &Opts, break; } - GenerateArg(Args, OPT_x, - Lang + HeaderUnit + Header + ModuleMap + Preprocessed, SA); + GenerateArg(Consumer, OPT_x, + Lang + HeaderUnit + Header + ModuleMap + Preprocessed); } // OPT_INPUT has a unique class, generate it directly. for (const auto &Input : Opts.Inputs) if (!Input.isIncludeTree()) - Args.push_back(SA(Input.getFile())); + Consumer(Input.getFile()); } static void determineInputFromIncludeTree( @@ -3277,28 +3252,27 @@ std::string CompilerInvocation::GetResourcesPath(const char *Argv0, } static void GenerateHeaderSearchArgs(HeaderSearchOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { + ArgumentConsumer Consumer) { const HeaderSearchOptions *HeaderSearchOpts = &Opts; #define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef HEADER_SEARCH_OPTION_WITH_MARSHALLING if (Opts.UseLibcxx) - GenerateArg(Args, OPT_stdlib_EQ, "libc++", SA); + GenerateArg(Consumer, OPT_stdlib_EQ, "libc++"); if (!Opts.ModuleCachePath.empty()) - GenerateArg(Args, OPT_fmodules_cache_path, Opts.ModuleCachePath, SA); + GenerateArg(Consumer, OPT_fmodules_cache_path, Opts.ModuleCachePath); for (const auto &File : Opts.PrebuiltModuleFiles) - GenerateArg(Args, OPT_fmodule_file, File.first + "=" + File.second, SA); + GenerateArg(Consumer, OPT_fmodule_file, File.first + "=" + File.second); for (const auto &Path : Opts.PrebuiltModulePaths) - GenerateArg(Args, OPT_fprebuilt_module_path, Path, SA); + GenerateArg(Consumer, OPT_fprebuilt_module_path, Path); for (const auto &Macro : Opts.ModulesIgnoreMacros) - GenerateArg(Args, OPT_fmodules_ignore_macro, Macro.val(), SA); + GenerateArg(Consumer, OPT_fmodules_ignore_macro, Macro.val()); auto Matches = [](const HeaderSearchOptions::Entry &Entry, llvm::ArrayRef Groups, @@ -3329,8 +3303,8 @@ static void GenerateHeaderSearchArgs(HeaderSearchOptions &Opts, }(); if (It->Group == frontend::IndexHeaderMap) - GenerateArg(Args, OPT_index_header_map, SA); - GenerateArg(Args, Opt, It->Path, SA); + GenerateArg(Consumer, OPT_index_header_map); + GenerateArg(Consumer, Opt, It->Path); }; // Note: some paths that came from "[-iprefix=xx] -iwithprefixbefore=yy" may @@ -3342,33 +3316,33 @@ static void GenerateHeaderSearchArgs(HeaderSearchOptions &Opts, ++It) { OptSpecifier Opt = It->Group == frontend::After ? OPT_iwithprefix : OPT_iwithprefixbefore; - GenerateArg(Args, Opt, It->Path, SA); + GenerateArg(Consumer, Opt, It->Path); } // Note: Some paths that came from "-idirafter=xxyy" may have already been // generated as "-iwithprefix=xxyy". If that's the case, their position on // command line was such that this has no semantic impact on include paths. for (; It < End && Matches(*It, {frontend::After}, false, true); ++It) - GenerateArg(Args, OPT_idirafter, It->Path, SA); + GenerateArg(Consumer, OPT_idirafter, It->Path); for (; It < End && Matches(*It, {frontend::Quoted}, false, true); ++It) - GenerateArg(Args, OPT_iquote, It->Path, SA); + GenerateArg(Consumer, OPT_iquote, It->Path); for (; It < End && Matches(*It, {frontend::System}, false, None); ++It) - GenerateArg(Args, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot, - It->Path, SA); + GenerateArg(Consumer, It->IgnoreSysRoot ? OPT_isystem : OPT_iwithsysroot, + It->Path); for (; It < End && Matches(*It, {frontend::System}, true, true); ++It) - GenerateArg(Args, OPT_iframework, It->Path, SA); + GenerateArg(Consumer, OPT_iframework, It->Path); for (; It < End && Matches(*It, {frontend::System}, true, false); ++It) - GenerateArg(Args, OPT_iframeworkwithsysroot, It->Path, SA); + GenerateArg(Consumer, OPT_iframeworkwithsysroot, It->Path); // Add the paths for the various language specific isystem flags. for (; It < End && Matches(*It, {frontend::CSystem}, false, true); ++It) - GenerateArg(Args, OPT_c_isystem, It->Path, SA); + GenerateArg(Consumer, OPT_c_isystem, It->Path); for (; It < End && Matches(*It, {frontend::CXXSystem}, false, true); ++It) - GenerateArg(Args, OPT_cxx_isystem, It->Path, SA); + GenerateArg(Consumer, OPT_cxx_isystem, It->Path); for (; It < End && Matches(*It, {frontend::ObjCSystem}, false, true); ++It) - GenerateArg(Args, OPT_objc_isystem, It->Path, SA); + GenerateArg(Consumer, OPT_objc_isystem, It->Path); for (; It < End && Matches(*It, {frontend::ObjCXXSystem}, false, true); ++It) - GenerateArg(Args, OPT_objcxx_isystem, It->Path, SA); + GenerateArg(Consumer, OPT_objcxx_isystem, It->Path); // Add the internal paths from a driver that detects standard include paths. // Note: Some paths that came from "-internal-isystem" arguments may have @@ -3380,7 +3354,7 @@ static void GenerateHeaderSearchArgs(HeaderSearchOptions &Opts, OptSpecifier Opt = It->Group == frontend::System ? OPT_internal_isystem : OPT_internal_externc_isystem; - GenerateArg(Args, Opt, It->Path, SA); + GenerateArg(Consumer, Opt, It->Path); } assert(It == End && "Unhandled HeaderSearchOption::Entry."); @@ -3389,11 +3363,11 @@ static void GenerateHeaderSearchArgs(HeaderSearchOptions &Opts, for (const auto &P : Opts.SystemHeaderPrefixes) { OptSpecifier Opt = P.IsSystemHeader ? OPT_system_header_prefix : OPT_no_system_header_prefix; - GenerateArg(Args, Opt, P.Prefix, SA); + GenerateArg(Consumer, Opt, P.Prefix); } for (const std::string &F : Opts.VFSOverlayFiles) - GenerateArg(Args, OPT_ivfsoverlay, F, SA); + GenerateArg(Consumer, OPT_ivfsoverlay, F); } static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, @@ -3526,14 +3500,13 @@ static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, } static void GenerateAPINotesArgs(const APINotesOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { + ArgumentConsumer Consumer) { if (!Opts.SwiftVersion.empty()) - GenerateArg(Args, OPT_fapinotes_swift_version, - Opts.SwiftVersion.getAsString(), SA); + GenerateArg(Consumer, OPT_fapinotes_swift_version, + Opts.SwiftVersion.getAsString()); for (const auto &Path : Opts.ModuleSearchPaths) - GenerateArg(Args, OPT_iapinotes_modules, Path, SA); + GenerateArg(Consumer, OPT_iapinotes_modules, Path); } static void ParseAPINotesArgs(APINotesOptions &Opts, ArgList &Args, @@ -3554,26 +3527,25 @@ static void ParseAPINotesArgs(APINotesOptions &Opts, ArgList &Args, } static void GeneratePointerAuthArgs(LangOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { + ArgumentConsumer Consumer) { if (Opts.PointerAuthIntrinsics) - GenerateArg(Args, OPT_fptrauth_intrinsics, SA); + GenerateArg(Consumer, OPT_fptrauth_intrinsics); if (Opts.PointerAuthCalls) - GenerateArg(Args, OPT_fptrauth_calls, SA); + GenerateArg(Consumer, OPT_fptrauth_calls); if (Opts.PointerAuthReturns) - GenerateArg(Args, OPT_fptrauth_returns, SA); + GenerateArg(Consumer, OPT_fptrauth_returns); if (Opts.PointerAuthIndirectGotos) - GenerateArg(Args, OPT_fptrauth_indirect_gotos, SA); + GenerateArg(Consumer, OPT_fptrauth_indirect_gotos); if (Opts.PointerAuthAuthTraps) - GenerateArg(Args, OPT_fptrauth_auth_traps, SA); + GenerateArg(Consumer, OPT_fptrauth_auth_traps); if (Opts.SoftPointerAuth) - GenerateArg(Args, OPT_fptrauth_soft, SA); + GenerateArg(Consumer, OPT_fptrauth_soft); if (Opts.PointerAuthABIVersionEncoded) { - GenerateArg(Args, OPT_fptrauth_abi_version_EQ, - Twine(Opts.PointerAuthABIVersion), SA); + GenerateArg(Consumer, OPT_fptrauth_abi_version_EQ, + Twine(Opts.PointerAuthABIVersion)); if (Opts.PointerAuthKernelABIVersion) - GenerateArg(Args, OPT_fptrauth_kernel_abi_version, SA); + GenerateArg(Consumer, OPT_fptrauth_kernel_abi_version); } } @@ -3676,19 +3648,18 @@ static StringRef GetInputKindName(InputKind IK) { } void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts, - SmallVectorImpl &Args, - StringAllocator SA, + ArgumentConsumer Consumer, const llvm::Triple &T, InputKind IK) { if (IK.getFormat() == InputKind::Precompiled || IK.getLanguage() == Language::LLVM_IR) { if (Opts.ObjCAutoRefCount) - GenerateArg(Args, OPT_fobjc_arc, SA); + GenerateArg(Consumer, OPT_fobjc_arc); if (Opts.PICLevel != 0) - GenerateArg(Args, OPT_pic_level, Twine(Opts.PICLevel), SA); + GenerateArg(Consumer, OPT_pic_level, Twine(Opts.PICLevel)); if (Opts.PIE) - GenerateArg(Args, OPT_pic_is_pie, SA); + GenerateArg(Consumer, OPT_pic_is_pie); for (StringRef Sanitizer : serializeSanitizerKinds(Opts.Sanitize)) - GenerateArg(Args, OPT_fsanitize_EQ, Sanitizer, SA); + GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer); return; } @@ -3710,148 +3681,148 @@ void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts, } auto LangStandard = LangStandard::getLangStandardForKind(Opts.LangStd); - GenerateArg(Args, StdOpt, LangStandard.getName(), SA); + GenerateArg(Consumer, StdOpt, LangStandard.getName()); if (Opts.IncludeDefaultHeader) - GenerateArg(Args, OPT_finclude_default_header, SA); + GenerateArg(Consumer, OPT_finclude_default_header); if (Opts.DeclareOpenCLBuiltins) - GenerateArg(Args, OPT_fdeclare_opencl_builtins, SA); + GenerateArg(Consumer, OPT_fdeclare_opencl_builtins); const LangOptions *LangOpts = &Opts; #define LANG_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef LANG_OPTION_WITH_MARSHALLING if (Opts.NeededByPCHOrCompilationUsesPCH) - GenerateArg(Args, OPT_fmodule_related_to_pch, SA); + GenerateArg(Consumer, OPT_fmodule_related_to_pch); // The '-fcf-protection=' option is generated by CodeGenOpts generator. if (Opts.ObjC) { - GenerateArg(Args, OPT_fobjc_runtime_EQ, Opts.ObjCRuntime.getAsString(), SA); + GenerateArg(Consumer, OPT_fobjc_runtime_EQ, Opts.ObjCRuntime.getAsString()); if (Opts.GC == LangOptions::GCOnly) - GenerateArg(Args, OPT_fobjc_gc_only, SA); + GenerateArg(Consumer, OPT_fobjc_gc_only); else if (Opts.GC == LangOptions::HybridGC) - GenerateArg(Args, OPT_fobjc_gc, SA); + GenerateArg(Consumer, OPT_fobjc_gc); else if (Opts.ObjCAutoRefCount == 1) - GenerateArg(Args, OPT_fobjc_arc, SA); + GenerateArg(Consumer, OPT_fobjc_arc); if (Opts.ObjCWeakRuntime) - GenerateArg(Args, OPT_fobjc_runtime_has_weak, SA); + GenerateArg(Consumer, OPT_fobjc_runtime_has_weak); if (Opts.ObjCWeak) - GenerateArg(Args, OPT_fobjc_weak, SA); + GenerateArg(Consumer, OPT_fobjc_weak); if (Opts.ObjCSubscriptingLegacyRuntime) - GenerateArg(Args, OPT_fobjc_subscripting_legacy_runtime, SA); + GenerateArg(Consumer, OPT_fobjc_subscripting_legacy_runtime); } if (Opts.GNUCVersion != 0) { unsigned Major = Opts.GNUCVersion / 100 / 100; unsigned Minor = (Opts.GNUCVersion / 100) % 100; unsigned Patch = Opts.GNUCVersion % 100; - GenerateArg(Args, OPT_fgnuc_version_EQ, - Twine(Major) + "." + Twine(Minor) + "." + Twine(Patch), SA); + GenerateArg(Consumer, OPT_fgnuc_version_EQ, + Twine(Major) + "." + Twine(Minor) + "." + Twine(Patch)); } if (Opts.IgnoreXCOFFVisibility) - GenerateArg(Args, OPT_mignore_xcoff_visibility, SA); + GenerateArg(Consumer, OPT_mignore_xcoff_visibility); if (Opts.SignedOverflowBehavior == LangOptions::SOB_Trapping) { - GenerateArg(Args, OPT_ftrapv, SA); - GenerateArg(Args, OPT_ftrapv_handler, Opts.OverflowHandler, SA); + GenerateArg(Consumer, OPT_ftrapv); + GenerateArg(Consumer, OPT_ftrapv_handler, Opts.OverflowHandler); } else if (Opts.SignedOverflowBehavior == LangOptions::SOB_Defined) { - GenerateArg(Args, OPT_fwrapv, SA); + GenerateArg(Consumer, OPT_fwrapv); } if (Opts.MSCompatibilityVersion != 0) { unsigned Major = Opts.MSCompatibilityVersion / 10000000; unsigned Minor = (Opts.MSCompatibilityVersion / 100000) % 100; unsigned Subminor = Opts.MSCompatibilityVersion % 100000; - GenerateArg(Args, OPT_fms_compatibility_version, - Twine(Major) + "." + Twine(Minor) + "." + Twine(Subminor), SA); + GenerateArg(Consumer, OPT_fms_compatibility_version, + Twine(Major) + "." + Twine(Minor) + "." + Twine(Subminor)); } if ((!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17) || T.isOSzOS()) { if (!Opts.Trigraphs) - GenerateArg(Args, OPT_fno_trigraphs, SA); + GenerateArg(Consumer, OPT_fno_trigraphs); } else { if (Opts.Trigraphs) - GenerateArg(Args, OPT_ftrigraphs, SA); + GenerateArg(Consumer, OPT_ftrigraphs); } if (Opts.Blocks && !(Opts.OpenCL && Opts.OpenCLVersion == 200)) - GenerateArg(Args, OPT_fblocks, SA); + GenerateArg(Consumer, OPT_fblocks); if (Opts.ConvergentFunctions && !(Opts.OpenCL || (Opts.CUDA && Opts.CUDAIsDevice) || Opts.SYCLIsDevice)) - GenerateArg(Args, OPT_fconvergent_functions, SA); + GenerateArg(Consumer, OPT_fconvergent_functions); if (Opts.NoBuiltin && !Opts.Freestanding) - GenerateArg(Args, OPT_fno_builtin, SA); + GenerateArg(Consumer, OPT_fno_builtin); if (!Opts.NoBuiltin) for (const auto &Func : Opts.NoBuiltinFuncs) - GenerateArg(Args, OPT_fno_builtin_, Func, SA); + GenerateArg(Consumer, OPT_fno_builtin_, Func); if (Opts.LongDoubleSize == 128) - GenerateArg(Args, OPT_mlong_double_128, SA); + GenerateArg(Consumer, OPT_mlong_double_128); else if (Opts.LongDoubleSize == 64) - GenerateArg(Args, OPT_mlong_double_64, SA); + GenerateArg(Consumer, OPT_mlong_double_64); else if (Opts.LongDoubleSize == 80) - GenerateArg(Args, OPT_mlong_double_80, SA); + GenerateArg(Consumer, OPT_mlong_double_80); // Not generating '-mrtd', it's just an alias for '-fdefault-calling-conv='. // OpenMP was requested via '-fopenmp', not implied by '-fopenmp-simd' or // '-fopenmp-targets='. if (Opts.OpenMP && !Opts.OpenMPSimd) { - GenerateArg(Args, OPT_fopenmp, SA); + GenerateArg(Consumer, OPT_fopenmp); if (Opts.OpenMP != 50) - GenerateArg(Args, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP), SA); + GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP)); if (!Opts.OpenMPUseTLS) - GenerateArg(Args, OPT_fnoopenmp_use_tls, SA); + GenerateArg(Consumer, OPT_fnoopenmp_use_tls); if (Opts.OpenMPIsDevice) - GenerateArg(Args, OPT_fopenmp_is_device, SA); + GenerateArg(Consumer, OPT_fopenmp_is_device); if (Opts.OpenMPIRBuilder) - GenerateArg(Args, OPT_fopenmp_enable_irbuilder, SA); + GenerateArg(Consumer, OPT_fopenmp_enable_irbuilder); } if (Opts.OpenMPSimd) { - GenerateArg(Args, OPT_fopenmp_simd, SA); + GenerateArg(Consumer, OPT_fopenmp_simd); if (Opts.OpenMP != 50) - GenerateArg(Args, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP), SA); + GenerateArg(Consumer, OPT_fopenmp_version_EQ, Twine(Opts.OpenMP)); } if (Opts.OpenMPThreadSubscription) - GenerateArg(Args, OPT_fopenmp_assume_threads_oversubscription, SA); + GenerateArg(Consumer, OPT_fopenmp_assume_threads_oversubscription); if (Opts.OpenMPTeamSubscription) - GenerateArg(Args, OPT_fopenmp_assume_teams_oversubscription, SA); + GenerateArg(Consumer, OPT_fopenmp_assume_teams_oversubscription); if (Opts.OpenMPTargetDebug != 0) - GenerateArg(Args, OPT_fopenmp_target_debug_EQ, - Twine(Opts.OpenMPTargetDebug), SA); + GenerateArg(Consumer, OPT_fopenmp_target_debug_EQ, + Twine(Opts.OpenMPTargetDebug)); if (Opts.OpenMPCUDANumSMs != 0) - GenerateArg(Args, OPT_fopenmp_cuda_number_of_sm_EQ, - Twine(Opts.OpenMPCUDANumSMs), SA); + GenerateArg(Consumer, OPT_fopenmp_cuda_number_of_sm_EQ, + Twine(Opts.OpenMPCUDANumSMs)); if (Opts.OpenMPCUDABlocksPerSM != 0) - GenerateArg(Args, OPT_fopenmp_cuda_blocks_per_sm_EQ, - Twine(Opts.OpenMPCUDABlocksPerSM), SA); + GenerateArg(Consumer, OPT_fopenmp_cuda_blocks_per_sm_EQ, + Twine(Opts.OpenMPCUDABlocksPerSM)); if (Opts.OpenMPCUDAReductionBufNum != 1024) - GenerateArg(Args, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ, - Twine(Opts.OpenMPCUDAReductionBufNum), SA); + GenerateArg(Consumer, OPT_fopenmp_cuda_teams_reduction_recs_num_EQ, + Twine(Opts.OpenMPCUDAReductionBufNum)); if (!Opts.OMPTargetTriples.empty()) { std::string Targets; @@ -3859,83 +3830,83 @@ void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts, llvm::interleave( Opts.OMPTargetTriples, OS, [&OS](const llvm::Triple &T) { OS << T.str(); }, ","); - GenerateArg(Args, OPT_fopenmp_targets_EQ, OS.str(), SA); + GenerateArg(Consumer, OPT_fopenmp_targets_EQ, OS.str()); } if (!Opts.OMPHostIRFile.empty()) - GenerateArg(Args, OPT_fopenmp_host_ir_file_path, Opts.OMPHostIRFile, SA); + GenerateArg(Consumer, OPT_fopenmp_host_ir_file_path, Opts.OMPHostIRFile); if (Opts.OpenMPCUDAMode) - GenerateArg(Args, OPT_fopenmp_cuda_mode, SA); + GenerateArg(Consumer, OPT_fopenmp_cuda_mode); // The arguments used to set Optimize, OptimizeSize and NoInlineDefine are // generated from CodeGenOptions. if (Opts.DefaultFPContractMode == LangOptions::FPM_Fast) - GenerateArg(Args, OPT_ffp_contract, "fast", SA); + GenerateArg(Consumer, OPT_ffp_contract, "fast"); else if (Opts.DefaultFPContractMode == LangOptions::FPM_On) - GenerateArg(Args, OPT_ffp_contract, "on", SA); + GenerateArg(Consumer, OPT_ffp_contract, "on"); else if (Opts.DefaultFPContractMode == LangOptions::FPM_Off) - GenerateArg(Args, OPT_ffp_contract, "off", SA); + GenerateArg(Consumer, OPT_ffp_contract, "off"); else if (Opts.DefaultFPContractMode == LangOptions::FPM_FastHonorPragmas) - GenerateArg(Args, OPT_ffp_contract, "fast-honor-pragmas", SA); + GenerateArg(Consumer, OPT_ffp_contract, "fast-honor-pragmas"); for (StringRef Sanitizer : serializeSanitizerKinds(Opts.Sanitize)) - GenerateArg(Args, OPT_fsanitize_EQ, Sanitizer, SA); + GenerateArg(Consumer, OPT_fsanitize_EQ, Sanitizer); // Conflating '-fsanitize-system-ignorelist' and '-fsanitize-ignorelist'. for (const std::string &F : Opts.NoSanitizeFiles) - GenerateArg(Args, OPT_fsanitize_ignorelist_EQ, F, SA); + GenerateArg(Consumer, OPT_fsanitize_ignorelist_EQ, F); if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver3_8) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "3.8", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "3.8"); else if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver4) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "4.0", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "4.0"); else if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver6) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "6.0", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "6.0"); else if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver7) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "7.0", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "7.0"); else if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver9) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "9.0", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "9.0"); else if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver11) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "11.0", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "11.0"); else if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver12) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "12.0", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "12.0"); else if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver14) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "14.0", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "14.0"); else if (Opts.getClangABICompat() == LangOptions::ClangABI::Ver15) - GenerateArg(Args, OPT_fclang_abi_compat_EQ, "15.0", SA); + GenerateArg(Consumer, OPT_fclang_abi_compat_EQ, "15.0"); if (Opts.getSignReturnAddressScope() == LangOptions::SignReturnAddressScopeKind::All) - GenerateArg(Args, OPT_msign_return_address_EQ, "all", SA); + GenerateArg(Consumer, OPT_msign_return_address_EQ, "all"); else if (Opts.getSignReturnAddressScope() == LangOptions::SignReturnAddressScopeKind::NonLeaf) - GenerateArg(Args, OPT_msign_return_address_EQ, "non-leaf", SA); + GenerateArg(Consumer, OPT_msign_return_address_EQ, "non-leaf"); if (Opts.getSignReturnAddressKey() == LangOptions::SignReturnAddressKeyKind::BKey) - GenerateArg(Args, OPT_msign_return_address_key_EQ, "b_key", SA); + GenerateArg(Consumer, OPT_msign_return_address_key_EQ, "b_key"); if (Opts.CXXABI) - GenerateArg(Args, OPT_fcxx_abi_EQ, TargetCXXABI::getSpelling(*Opts.CXXABI), - SA); + GenerateArg(Consumer, OPT_fcxx_abi_EQ, + TargetCXXABI::getSpelling(*Opts.CXXABI)); if (Opts.RelativeCXXABIVTables) - GenerateArg(Args, OPT_fexperimental_relative_cxx_abi_vtables, SA); + GenerateArg(Consumer, OPT_fexperimental_relative_cxx_abi_vtables); else - GenerateArg(Args, OPT_fno_experimental_relative_cxx_abi_vtables, SA); + GenerateArg(Consumer, OPT_fno_experimental_relative_cxx_abi_vtables); if (Opts.UseTargetPathSeparator) - GenerateArg(Args, OPT_ffile_reproducible, SA); + GenerateArg(Consumer, OPT_ffile_reproducible); else - GenerateArg(Args, OPT_fno_file_reproducible, SA); + GenerateArg(Consumer, OPT_fno_file_reproducible); for (const auto &MP : Opts.MacroPrefixMap) - GenerateArg(Args, OPT_fmacro_prefix_map_EQ, MP.first + "=" + MP.second, SA); + GenerateArg(Consumer, OPT_fmacro_prefix_map_EQ, MP.first + "=" + MP.second); if (!Opts.RandstructSeed.empty()) - GenerateArg(Args, OPT_frandomize_layout_seed_EQ, Opts.RandstructSeed, SA); + GenerateArg(Consumer, OPT_frandomize_layout_seed_EQ, Opts.RandstructSeed); } bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, @@ -4541,29 +4512,27 @@ static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) { } static void GeneratePreprocessorArgs(PreprocessorOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA, + ArgumentConsumer Consumer, const LangOptions &LangOpts, const FrontendOptions &FrontendOpts, const CodeGenOptions &CodeGenOpts) { PreprocessorOptions *PreprocessorOpts = &Opts; #define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OPTION_WITH_MARSHALLING if (Opts.PCHWithHdrStop && !Opts.PCHWithHdrStopCreate) - GenerateArg(Args, OPT_pch_through_hdrstop_use, SA); + GenerateArg(Consumer, OPT_pch_through_hdrstop_use); for (const auto &D : Opts.DeserializedPCHDeclsToErrorOn) - GenerateArg(Args, OPT_error_on_deserialized_pch_decl, D, SA); + GenerateArg(Consumer, OPT_error_on_deserialized_pch_decl, D); if (Opts.PrecompiledPreambleBytes != std::make_pair(0u, false)) - GenerateArg(Args, OPT_preamble_bytes_EQ, + GenerateArg(Consumer, OPT_preamble_bytes_EQ, Twine(Opts.PrecompiledPreambleBytes.first) + "," + - (Opts.PrecompiledPreambleBytes.second ? "1" : "0"), - SA); + (Opts.PrecompiledPreambleBytes.second ? "1" : "0")); for (const auto &M : Opts.Macros) { // Don't generate __CET__ macro definitions. They are implied by the @@ -4578,7 +4547,7 @@ static void GeneratePreprocessorArgs(PreprocessorOptions &Opts, CodeGenOpts.CFProtectionBranch) continue; - GenerateArg(Args, M.second ? OPT_U : OPT_D, M.first, SA); + GenerateArg(Consumer, M.second ? OPT_U : OPT_D, M.first); } for (const auto &I : Opts.Includes) { @@ -4593,17 +4562,17 @@ static void GeneratePreprocessorArgs(PreprocessorOptions &Opts, if (LangOpts.HLSL && I == "hlsl.h") continue; - GenerateArg(Args, OPT_include, I, SA); + GenerateArg(Consumer, OPT_include, I); } for (const auto &CI : Opts.ChainedIncludes) - GenerateArg(Args, OPT_chain_include, CI, SA); + GenerateArg(Consumer, OPT_chain_include, CI); for (const auto &RF : Opts.RemappedFiles) - GenerateArg(Args, OPT_remap_file, RF.first + ";" + RF.second, SA); + GenerateArg(Consumer, OPT_remap_file, RF.first + ";" + RF.second); if (Opts.SourceDateEpoch) - GenerateArg(Args, OPT_source_date_epoch, Twine(*Opts.SourceDateEpoch), SA); + GenerateArg(Consumer, OPT_source_date_epoch, Twine(*Opts.SourceDateEpoch)); // Don't handle LexEditorPlaceholders. It is implied by the action that is // generated elsewhere. @@ -4706,23 +4675,24 @@ static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, return Diags.getNumErrors() == NumErrorsBefore; } -static void GeneratePreprocessorOutputArgs( - const PreprocessorOutputOptions &Opts, SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA, frontend::ActionKind Action) { +static void +GeneratePreprocessorOutputArgs(const PreprocessorOutputOptions &Opts, + ArgumentConsumer Consumer, + frontend::ActionKind Action) { const PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; #define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING bool Generate_dM = isStrictlyPreprocessorAction(Action) && !Opts.ShowCPP; if (Generate_dM) - GenerateArg(Args, OPT_dM, SA); + GenerateArg(Consumer, OPT_dM); if (!Generate_dM && Opts.ShowMacros) - GenerateArg(Args, OPT_dD, SA); + GenerateArg(Consumer, OPT_dD); if (Opts.DirectivesOnly) - GenerateArg(Args, OPT_fdirectives_only, SA); + GenerateArg(Consumer, OPT_fdirectives_only); } static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, @@ -4745,20 +4715,19 @@ static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, } static void GenerateTargetArgs(const TargetOptions &Opts, - SmallVectorImpl &Args, - CompilerInvocation::StringAllocator SA) { + ArgumentConsumer Consumer) { const TargetOptions *TargetOpts = &Opts; #define TARGET_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Args, SA, __VA_ARGS__) + GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) #include "clang/Driver/Options.inc" #undef TARGET_OPTION_WITH_MARSHALLING if (!Opts.SDKVersion.empty()) - GenerateArg(Args, OPT_target_sdk_version_EQ, Opts.SDKVersion.getAsString(), - SA); + GenerateArg(Consumer, OPT_target_sdk_version_EQ, + Opts.SDKVersion.getAsString()); if (!Opts.DarwinTargetVariantSDKVersion.empty()) - GenerateArg(Args, OPT_darwin_target_variant_sdk_version_EQ, - Opts.DarwinTargetVariantSDKVersion.getAsString(), SA); + GenerateArg(Consumer, OPT_darwin_target_variant_sdk_version_EQ, + Opts.DarwinTargetVariantSDKVersion.getAsString()); } static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args, @@ -5068,27 +5037,27 @@ std::string CompilerInvocation::getModuleHash(DiagnosticsEngine &Diags) const { } void CompilerInvocation::generateCC1CommandLine( - SmallVectorImpl &Args, StringAllocator SA) const { + ArgumentConsumer Consumer) const { llvm::Triple T(TargetOpts->Triple); - GenerateCASArgs(CASOpts, Args, SA); - GenerateFileSystemArgs(FileSystemOpts, Args, SA); - GenerateMigratorArgs(MigratorOpts, Args, SA); - GenerateAnalyzerArgs(*AnalyzerOpts, Args, SA); - GenerateDiagnosticArgs(*DiagnosticOpts, Args, SA, false); - GenerateFrontendArgs(FrontendOpts, Args, SA, LangOpts->IsHeaderFile); - GenerateTargetArgs(*TargetOpts, Args, SA); - GenerateHeaderSearchArgs(*HeaderSearchOpts, Args, SA); - GenerateAPINotesArgs(APINotesOpts, Args, SA); - GeneratePointerAuthArgs(*LangOpts, Args, SA); - GenerateLangArgs(*LangOpts, Args, SA, T, FrontendOpts.DashX); - GenerateCodeGenArgs(CodeGenOpts, Args, SA, T, FrontendOpts.OutputFile, + GenerateCASArgs(CASOpts, Consumer); + GenerateFileSystemArgs(FileSystemOpts, Consumer); + GenerateMigratorArgs(MigratorOpts, Consumer); + GenerateAnalyzerArgs(*AnalyzerOpts, Consumer); + GenerateDiagnosticArgs(*DiagnosticOpts, Consumer, false); + GenerateFrontendArgs(FrontendOpts, Consumer, LangOpts->IsHeaderFile); + GenerateTargetArgs(*TargetOpts, Consumer); + GenerateHeaderSearchArgs(*HeaderSearchOpts, Consumer); + GenerateAPINotesArgs(APINotesOpts, Consumer); + GeneratePointerAuthArgs(*LangOpts, Consumer); + GenerateLangArgs(*LangOpts, Consumer, T, FrontendOpts.DashX); + GenerateCodeGenArgs(CodeGenOpts, Consumer, T, FrontendOpts.OutputFile, &*LangOpts); - GeneratePreprocessorArgs(*PreprocessorOpts, Args, SA, *LangOpts, FrontendOpts, + GeneratePreprocessorArgs(*PreprocessorOpts, Consumer, *LangOpts, FrontendOpts, CodeGenOpts); - GeneratePreprocessorOutputArgs(PreprocessorOutputOpts, Args, SA, + GeneratePreprocessorOutputArgs(PreprocessorOutputOpts, Consumer, FrontendOpts.ProgramAction); - GenerateDependencyOutputArgs(DependencyOutputOpts, Args, SA); + GenerateDependencyOutputArgs(DependencyOutputOpts, Consumer); } std::vector CompilerInvocation::getCC1CommandLine() const { From ecc479507f673e0660d03ea028e648dc46269fe5 Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Thu, 3 Aug 2023 15:40:18 -0700 Subject: [PATCH 07/12] [clang] NFC: Avoid double allocation when generating command line This patch makes use of the infrastructure established in D157046 to avoid needless allocations via `StringSaver`. Depends on D157046. Reviewed By: benlangmuir Differential Revision: https://reviews.llvm.org/D157048 --- clang/lib/Frontend/CompilerInvocation.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index d732d37ed1cb8..ea284980d6de3 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -5061,17 +5061,10 @@ void CompilerInvocation::generateCC1CommandLine( } std::vector CompilerInvocation::getCC1CommandLine() const { - // Set up string allocator. - llvm::BumpPtrAllocator Alloc; - llvm::StringSaver Strings(Alloc); - auto SA = [&Strings](const Twine &Arg) { return Strings.save(Arg).data(); }; - - // Synthesize full command line from the CompilerInvocation, including "-cc1". - SmallVector Args{"-cc1"}; - generateCC1CommandLine(Args, SA); - - // Convert arguments to the return type. - return std::vector{Args.begin(), Args.end()}; + std::vector Args{"-cc1"}; + generateCC1CommandLine( + [&Args](const Twine &Arg) { Args.push_back(Arg.str()); }); + return Args; } void CompilerInvocation::resetNonModularOptions() { From a5724e52e39c239bcb842b7d742475b992fab54b Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Thu, 3 Aug 2023 15:55:49 -0700 Subject: [PATCH 08/12] [clang][deps] NFC: Speed up canonical context hash computation This patch makes use of the infrastructure established in D157046 to speed up computation of the canonical context hash in the dependency scanner. This is somewhat hot code, since it's ran for all modules in the dependency graph of every TU. I also tried an alternative approach that tried to avoid allocations as much as possible (essentially doing `HashBuilder.add(Arg.toStringRef(ArgVec))`), but that turned out to be slower than approach in this patch. Note that this is not problematic in the same way command-line hashing used to be prior D143027. The lambda is now being called even for constant strings. Depends on D157046. Reviewed By: benlangmuir Differential Revision: https://reviews.llvm.org/D157052 --- .../DependencyScanning/ModuleDepCollector.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp index eff46eafa0d7b..25190c9640363 100644 --- a/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ b/clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -301,12 +301,13 @@ static std::string getModuleContextHash(const ModuleDeps &MD, MutableCI.getCASOpts(), {}); // Hash the BuildInvocation without any input files. - SmallVector Args; - llvm::BumpPtrAllocator Alloc; - llvm::StringSaver Saver(Alloc); - CI.generateCC1CommandLine( - Args, [&](const Twine &Arg) { return Saver.save(Arg).data(); }); - HashBuilder.addRange(Args); + SmallString<0> ArgVec; + ArgVec.reserve(4096); + CI.generateCC1CommandLine([&](const Twine &Arg) { + Arg.toVector(ArgVec); + ArgVec.push_back('\0'); + }); + HashBuilder.add(ArgVec); // Hash the module dependencies. These paths may differ even if the invocation // is identical if they depend on the contents of the files in the TU -- for From d394ab65183bb8a3f23d32f6e67edfafb37fb41e Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Fri, 4 Aug 2023 11:19:09 -0700 Subject: [PATCH 09/12] [llvm] Extract common `OptTable` bits into macros All command-line tools using `llvm::opt` create an enum of option IDs and a table of `OptTable::Info` object. Most of the tools use the same ID (`OPT_##ID`), kind (`Option::KIND##Class`), group ID (`OPT_##GROUP`) and alias ID (`OPT_##ALIAS`). This patch extracts that common code into canonical macros. This results in fewer changes when tweaking the `OPTION` macros emitted by the TableGen backend. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D157028 --- clang/include/clang/Driver/Options.h | 10 +-- clang/lib/Driver/DriverOptions.cpp | 5 +- .../ClangLinkerWrapper.cpp | 9 +-- lld/COFF/Driver.h | 2 +- lld/COFF/DriverUtils.cpp | 4 +- lld/ELF/Driver.h | 2 +- lld/ELF/DriverUtils.cpp | 4 +- lld/MachO/Driver.h | 2 +- lld/MinGW/Driver.cpp | 2 +- lld/wasm/Driver.cpp | 2 +- lldb/tools/driver/Driver.cpp | 12 +-- lldb/tools/lldb-server/lldb-gdbserver.cpp | 12 +-- lldb/tools/lldb-vscode/lldb-vscode.cpp | 12 +-- llvm/include/llvm/Option/OptTable.h | 28 +++++++ .../JITLink/COFFDirectiveParser.cpp | 17 +---- .../JITLink/COFFDirectiveParser.h | 2 +- .../llvm-dlltool/DlltoolDriver.cpp | 7 +- llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | 7 +- llvm/tools/dsymutil/dsymutil.cpp | 12 +-- llvm/tools/llvm-cvtres/llvm-cvtres.cpp | 12 +-- llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp | 12 +-- llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp | 12 +-- llvm/tools/llvm-ifs/llvm-ifs.cpp | 12 +-- llvm/tools/llvm-lipo/llvm-lipo.cpp | 11 +-- llvm/tools/llvm-ml/llvm-ml.cpp | 12 +-- llvm/tools/llvm-mt/llvm-mt.cpp | 12 +-- llvm/tools/llvm-nm/llvm-nm.cpp | 12 +-- llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 73 ++++--------------- llvm/tools/llvm-objdump/ObjdumpOptID.h | 6 +- llvm/tools/llvm-objdump/llvm-objdump.cpp | 19 +---- llvm/tools/llvm-rc/llvm-rc.cpp | 26 ++----- llvm/tools/llvm-readobj/llvm-readobj.cpp | 12 +-- llvm/tools/llvm-size/llvm-size.cpp | 12 +-- llvm/tools/llvm-strings/llvm-strings.cpp | 12 +-- .../tools/llvm-symbolizer/llvm-symbolizer.cpp | 12 +-- .../llvm-tli-checker/llvm-tli-checker.cpp | 12 +-- llvm/unittests/Option/OptionParsingTest.cpp | 9 +-- 37 files changed, 113 insertions(+), 326 deletions(-) diff --git a/clang/include/clang/Driver/Options.h b/clang/include/clang/Driver/Options.h index f7ee154b7a7ab..f1592e1dc3160 100644 --- a/clang/include/clang/Driver/Options.h +++ b/clang/include/clang/Driver/Options.h @@ -9,11 +9,7 @@ #ifndef LLVM_CLANG_DRIVER_OPTIONS_H #define LLVM_CLANG_DRIVER_OPTIONS_H -namespace llvm { -namespace opt { -class OptTable; -} -} +#include "llvm/Option/OptTable.h" namespace clang { namespace driver { @@ -42,9 +38,7 @@ enum ClangFlags { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "clang/Driver/Options.inc" LastOption #undef OPTION diff --git a/clang/lib/Driver/DriverOptions.cpp b/clang/lib/Driver/DriverOptions.cpp index 67d4198d222aa..1fb57f5e5db7d 100644 --- a/clang/lib/Driver/DriverOptions.cpp +++ b/clang/lib/Driver/DriverOptions.cpp @@ -21,10 +21,7 @@ using namespace llvm::opt; #undef PREFIX static const OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "clang/Driver/Options.inc" #undef OPTION }; diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 40825ac831a50..475240b457b17 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -112,9 +112,7 @@ enum WrapperFlags { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "LinkerWrapperOpts.inc" LastOption #undef OPTION @@ -125,10 +123,7 @@ enum ID { #undef PREFIX static const OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "LinkerWrapperOpts.inc" #undef OPTION }; diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h index 3f6f98d1a0606..b89a9dbe402b9 100644 --- a/lld/COFF/Driver.h +++ b/lld/COFF/Driver.h @@ -230,7 +230,7 @@ MemoryBufferRef convertResToCOFF(ArrayRef mbs, // Create enum with OPT_xxx values for each option in Options.td enum { OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp index eceb539942342..27679d647f6f2 100644 --- a/lld/COFF/DriverUtils.cpp +++ b/lld/COFF/DriverUtils.cpp @@ -778,9 +778,7 @@ MemoryBufferRef convertResToCOFF(ArrayRef mbs, // Create table mapping all options defined in Options.td static const llvm::opt::OptTable::Info infoTable[] = { -#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11, X12) \ - {X1, X2, X10, X11, OPT_##ID, llvm::opt::Option::KIND##Class, \ - X9, X8, OPT_##GROUP, OPT_##ALIAS, X7, X12}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h index 20a7a8edfd26a..a325dec3ff8fb 100644 --- a/lld/ELF/Driver.h +++ b/lld/ELF/Driver.h @@ -25,7 +25,7 @@ class ELFOptTable : public llvm::opt::OptTable { // Create enum with OPT_xxx values for each option in Options.td enum { OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp index ec2f6ba8e6ed2..9dcbd5d5c05ec 100644 --- a/lld/ELF/DriverUtils.cpp +++ b/lld/ELF/DriverUtils.cpp @@ -40,9 +40,7 @@ using namespace lld::elf; // Create table mapping all options defined in Options.td static const opt::OptTable::Info optInfo[] = { -#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11, X12) \ - {X1, X2, X10, X11, OPT_##ID, opt::Option::KIND##Class, \ - X9, X8, OPT_##GROUP, OPT_##ALIAS, X7, X12}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/lld/MachO/Driver.h b/lld/MachO/Driver.h index 7249fe3b45203..809db8db3d01a 100644 --- a/lld/MachO/Driver.h +++ b/lld/MachO/Driver.h @@ -35,7 +35,7 @@ class MachOOptTable : public llvm::opt::OptTable { // Create enum with OPT_xxx values for each option in Options.td enum { OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/lld/MinGW/Driver.cpp b/lld/MinGW/Driver.cpp index 865a90837eba9..b2117e485b68f 100644 --- a/lld/MinGW/Driver.cpp +++ b/lld/MinGW/Driver.cpp @@ -55,7 +55,7 @@ using namespace llvm; // Create OptTable enum { OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp index e6b2239e7a159..bb54db4a9043d 100644 --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -49,7 +49,7 @@ namespace { // Create enum with OPT_xxx values for each option in Options.td enum { OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp index c70ae4c344389..d174258345827 100644 --- a/lldb/tools/driver/Driver.cpp +++ b/lldb/tools/driver/Driver.cpp @@ -52,9 +52,7 @@ using namespace llvm; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; @@ -64,13 +62,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/lldb/tools/lldb-server/lldb-gdbserver.cpp b/lldb/tools/lldb-server/lldb-gdbserver.cpp index eca66cfc4967b..51422cc3a9c1e 100644 --- a/lldb/tools/lldb-server/lldb-gdbserver.cpp +++ b/lldb/tools/lldb-server/lldb-gdbserver.cpp @@ -271,9 +271,7 @@ void ConnectToRemote(MainLoop &mainloop, namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "LLGSOptions.inc" #undef OPTION }; @@ -283,13 +281,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "LLGSOptions.inc" #undef OPTION }; diff --git a/lldb/tools/lldb-vscode/lldb-vscode.cpp b/lldb/tools/lldb-vscode/lldb-vscode.cpp index e93a14c37729c..f7f4588e7ac69 100644 --- a/lldb/tools/lldb-vscode/lldb-vscode.cpp +++ b/lldb/tools/lldb-vscode/lldb-vscode.cpp @@ -48,6 +48,7 @@ #include "llvm/ADT/ScopeExit.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" +#include "llvm/Option/OptTable.h" #include "llvm/Option/Option.h" #include "llvm/Support/Errno.h" #include "llvm/Support/FileSystem.h" @@ -72,9 +73,7 @@ using namespace lldb_vscode; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; @@ -84,12 +83,7 @@ enum ID { #undef PREFIX static const llvm::opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, llvm::opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/llvm/include/llvm/Option/OptTable.h b/llvm/include/llvm/Option/OptTable.h index 07d9870f71b33..593a0b4c71d71 100644 --- a/llvm/include/llvm/Option/OptTable.h +++ b/llvm/include/llvm/Option/OptTable.h @@ -262,4 +262,32 @@ class OptTable { } // end namespace llvm +#define LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(ID_PREFIX, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + ID_PREFIX##ID + +#define LLVM_MAKE_OPT_ID(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OPT_, PREFIX, NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, \ + VALUE) + +#define LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX( \ + ID_PREFIX, PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + llvm::opt::OptTable::Info { \ + ID_PREFIX##PREFIX, NAME, HELPTEXT, METAVAR, ID_PREFIX##ID, \ + llvm::opt::Option::KIND##Class, PARAM, FLAGS, ID_PREFIX##GROUP, \ + ID_PREFIX##ALIAS, ALIASARGS, VALUES \ + } + +#define LLVM_CONSTRUCT_OPT_INFO(PREFIX, NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, \ + VALUES) \ + llvm::opt::OptTable::Info { \ + PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, llvm::opt::Option::KIND##Class, \ + PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS, VALUES \ + } + #endif // LLVM_OPTION_OPTTABLE_H diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp index 50d95dd9bfaee..c7c22ee75e6a1 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp @@ -18,25 +18,14 @@ using namespace jitlink; #define DEBUG_TYPE "jitlink" // Create prefix string literals used in Options.td -#define PREFIX(NAME, VALUE) const char *const NAME[] = VALUE; +#define PREFIX(NAME, VALUE) const char *const COFF_OPT_##NAME[] = VALUE; #include "COFFOptions.inc" #undef PREFIX // Create table mapping all options defined in COFFOptions.td static const opt::OptTable::Info infoTable[] = { -#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11, X12) \ - {X1, \ - X2, \ - X10, \ - X11, \ - COFF_OPT_##ID, \ - opt::Option::KIND##Class, \ - X9, \ - X8, \ - COFF_OPT_##GROUP, \ - COFF_OPT_##ALIAS, \ - X7, \ - X12}, +#define OPTION(...) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(COFF_OPT_, __VA_ARGS__), #include "COFFOptions.inc" #undef OPTION }; diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h index 8d5e0f7314ddf..588f0fd18467a 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h +++ b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h @@ -26,7 +26,7 @@ namespace jitlink { enum { COFF_OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) COFF_OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(COFF_OPT_, __VA_ARGS__), #include "COFFOptions.inc" #undef OPTION }; diff --git a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp index de1634ebed3ca..4316148c14b57 100644 --- a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp @@ -18,6 +18,7 @@ #include "llvm/Object/COFFModuleDefinition.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" +#include "llvm/Option/OptTable.h" #include "llvm/Option/Option.h" #include "llvm/Support/Host.h" #include "llvm/Support/Path.h" @@ -32,7 +33,7 @@ namespace { enum { OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; @@ -42,9 +43,7 @@ enum { #undef PREFIX static const llvm::opt::OptTable::Info InfoTable[] = { -#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11, X12) \ - {X1, X2, X10, X11, OPT_##ID, llvm::opt::Option::KIND##Class, \ - X9, X8, OPT_##GROUP, OPT_##ALIAS, X7, X12}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp index 5f4d0cdf2b577..49b7e2780e1df 100644 --- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -22,6 +22,7 @@ #include "llvm/Object/WindowsMachineFlag.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" +#include "llvm/Option/OptTable.h" #include "llvm/Option/Option.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Path.h" @@ -35,7 +36,7 @@ namespace { enum { OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; @@ -45,9 +46,7 @@ enum { #undef PREFIX static const opt::OptTable::Info InfoTable[] = { -#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11, X12) \ - {X1, X2, X10, X11, OPT_##ID, opt::Option::KIND##Class, \ - X9, X8, OPT_##GROUP, OPT_##ALIAS, X7, X12}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/llvm/tools/dsymutil/dsymutil.cpp b/llvm/tools/dsymutil/dsymutil.cpp index 9ea8aa0c4512f..d59f6f50971ee 100644 --- a/llvm/tools/dsymutil/dsymutil.cpp +++ b/llvm/tools/dsymutil/dsymutil.cpp @@ -57,9 +57,7 @@ using namespace object; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; @@ -69,13 +67,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp index 64620173c3142..158c465460351 100644 --- a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp +++ b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp @@ -37,9 +37,7 @@ namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -49,13 +47,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp index 1cea9e29faa4f..259bc29b7b712 100644 --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -25,9 +25,7 @@ using namespace llvm; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -37,13 +35,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp b/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp index c5f5a6a4f863b..912523916e6e9 100644 --- a/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp +++ b/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp @@ -33,9 +33,7 @@ using namespace object; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Options.inc" #undef OPTION }; @@ -45,13 +43,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Options.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-ifs/llvm-ifs.cpp b/llvm/tools/llvm-ifs/llvm-ifs.cpp index 4a0c1c9e1d9bc..5eb3b8e2409c3 100644 --- a/llvm/tools/llvm-ifs/llvm-ifs.cpp +++ b/llvm/tools/llvm-ifs/llvm-ifs.cpp @@ -52,9 +52,7 @@ enum class FileFormat { IFS, ELF, TBD }; using namespace llvm::opt; enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -64,13 +62,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-lipo/llvm-lipo.cpp b/llvm/tools/llvm-lipo/llvm-lipo.cpp index e48be6aa8acb9..55f9fd1d3f7d2 100644 --- a/llvm/tools/llvm-lipo/llvm-lipo.cpp +++ b/llvm/tools/llvm-lipo/llvm-lipo.cpp @@ -65,9 +65,7 @@ static const StringRef ToolName = "llvm-lipo"; namespace { enum LipoID { LIPO_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - LIPO_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(LIPO_, __VA_ARGS__), #include "LipoOpts.inc" #undef OPTION }; @@ -79,12 +77,7 @@ const char *const *LIPO_nullptr = nullptr; #undef PREFIX const opt::OptTable::Info LipoInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {LIPO_##PREFIX, NAME, HELPTEXT, \ - METAVAR, LIPO_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, LIPO_##GROUP, \ - LIPO_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(LIPO_, __VA_ARGS__), #include "LipoOpts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-ml/llvm-ml.cpp b/llvm/tools/llvm-ml/llvm-ml.cpp index 12cd727e722a0..050a859efdbe4 100644 --- a/llvm/tools/llvm-ml/llvm-ml.cpp +++ b/llvm/tools/llvm-ml/llvm-ml.cpp @@ -52,9 +52,7 @@ namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -64,13 +62,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-mt/llvm-mt.cpp b/llvm/tools/llvm-mt/llvm-mt.cpp index aa7582b5d9967..d9259e86d0120 100644 --- a/llvm/tools/llvm-mt/llvm-mt.cpp +++ b/llvm/tools/llvm-mt/llvm-mt.cpp @@ -34,9 +34,7 @@ namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -46,13 +44,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ -{ \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index c7387f07dc459..168bf9c76f13f 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -57,9 +57,7 @@ namespace { using namespace llvm::opt; // for HelpHidden in Opts.inc enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -69,13 +67,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp index 1f7321e4f4b6b..4abf660323bb3 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp +++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp @@ -30,9 +30,7 @@ using namespace llvm::objcopy; namespace { enum ObjcopyID { OBJCOPY_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OBJCOPY_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OBJCOPY_, __VA_ARGS__), #include "ObjcopyOpts.inc" #undef OPTION }; @@ -42,20 +40,8 @@ enum ObjcopyID { #undef PREFIX const opt::OptTable::Info ObjcopyInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {OBJCOPY_##PREFIX, \ - NAME, \ - HELPTEXT, \ - METAVAR, \ - OBJCOPY_##ID, \ - opt::Option::KIND##Class, \ - PARAM, \ - FLAGS, \ - OBJCOPY_##GROUP, \ - OBJCOPY_##ALIAS, \ - ALIASARGS, \ - VALUES}, +#define OPTION(...) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OBJCOPY_, __VA_ARGS__), #include "ObjcopyOpts.inc" #undef OPTION }; @@ -69,9 +55,8 @@ class ObjcopyOptTable : public opt::OptTable { enum InstallNameToolID { INSTALL_NAME_TOOL_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - INSTALL_NAME_TOOL_##ID, +#define OPTION(...) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(INSTALL_NAME_TOOL_, __VA_ARGS__), #include "InstallNameToolOpts.inc" #undef OPTION }; @@ -82,20 +67,8 @@ enum InstallNameToolID { #undef PREFIX const opt::OptTable::Info InstallNameToolInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {INSTALL_NAME_TOOL_##PREFIX, \ - NAME, \ - HELPTEXT, \ - METAVAR, \ - INSTALL_NAME_TOOL_##ID, \ - opt::Option::KIND##Class, \ - PARAM, \ - FLAGS, \ - INSTALL_NAME_TOOL_##GROUP, \ - INSTALL_NAME_TOOL_##ALIAS, \ - ALIASARGS, \ - VALUES}, +#define OPTION(...) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(INSTALL_NAME_TOOL_, __VA_ARGS__), #include "InstallNameToolOpts.inc" #undef OPTION }; @@ -107,9 +80,8 @@ class InstallNameToolOptTable : public opt::OptTable { enum BitcodeStripID { BITCODE_STRIP_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - BITCODE_STRIP_##ID, +#define OPTION(...) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(BITCODE_STRIP_, __VA_ARGS__), #include "BitcodeStripOpts.inc" #undef OPTION }; @@ -119,20 +91,8 @@ enum BitcodeStripID { #undef PREFIX const opt::OptTable::Info BitcodeStripInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {BITCODE_STRIP_##PREFIX, \ - NAME, \ - HELPTEXT, \ - METAVAR, \ - BITCODE_STRIP_##ID, \ - opt::Option::KIND##Class, \ - PARAM, \ - FLAGS, \ - BITCODE_STRIP_##GROUP, \ - BITCODE_STRIP_##ALIAS, \ - ALIASARGS, \ - VALUES}, +#define OPTION(...) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(BITCODE_STRIP_, __VA_ARGS__), #include "BitcodeStripOpts.inc" #undef OPTION }; @@ -144,9 +104,7 @@ class BitcodeStripOptTable : public opt::OptTable { enum StripID { STRIP_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - STRIP_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(STRIP_, __VA_ARGS__), #include "StripOpts.inc" #undef OPTION }; @@ -156,12 +114,7 @@ enum StripID { #undef PREFIX const opt::OptTable::Info StripInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {STRIP_##PREFIX, NAME, HELPTEXT, \ - METAVAR, STRIP_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, STRIP_##GROUP, \ - STRIP_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(STRIP_, __VA_ARGS__), #include "StripOpts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-objdump/ObjdumpOptID.h b/llvm/tools/llvm-objdump/ObjdumpOptID.h index 65f6c60ad884f..fc90cb5c8f040 100644 --- a/llvm/tools/llvm-objdump/ObjdumpOptID.h +++ b/llvm/tools/llvm-objdump/ObjdumpOptID.h @@ -1,11 +1,11 @@ #ifndef LLVM_TOOLS_LLVM_OBJDUMP_OBJDUMP_OPT_ID_H #define LLVM_TOOLS_LLVM_OBJDUMP_OBJDUMP_OPT_ID_H +#include "llvm/Option/OptTable.h" + enum ObjdumpOptID { OBJDUMP_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OBJDUMP_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OBJDUMP_, __VA_ARGS__), #include "ObjdumpOpts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index aa3c053cf4aa5..4a0d7da8500b0 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -126,12 +126,8 @@ class CommonOptTable : public opt::OptTable { static constexpr opt::OptTable::Info ObjdumpInfoTable[] = { #define OBJDUMP_nullptr nullptr -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {OBJDUMP_##PREFIX, NAME, HELPTEXT, \ - METAVAR, OBJDUMP_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OBJDUMP_##GROUP, \ - OBJDUMP_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OBJDUMP_, __VA_ARGS__), #include "ObjdumpOpts.inc" #undef OPTION #undef OBJDUMP_nullptr @@ -146,9 +142,7 @@ class ObjdumpOptTable : public CommonOptTable { enum OtoolOptID { OTOOL_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OTOOL_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OTOOL_, __VA_ARGS__), #include "OtoolOpts.inc" #undef OPTION }; @@ -159,12 +153,7 @@ enum OtoolOptID { static constexpr opt::OptTable::Info OtoolInfoTable[] = { #define OTOOL_nullptr nullptr -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {OTOOL_##PREFIX, NAME, HELPTEXT, \ - METAVAR, OTOOL_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OTOOL_##GROUP, \ - OTOOL_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OTOOL_, __VA_ARGS__), #include "OtoolOpts.inc" #undef OPTION #undef OTOOL_nullptr diff --git a/llvm/tools/llvm-rc/llvm-rc.cpp b/llvm/tools/llvm-rc/llvm-rc.cpp index 73991571c3ddf..b1e154f414809 100644 --- a/llvm/tools/llvm-rc/llvm-rc.cpp +++ b/llvm/tools/llvm-rc/llvm-rc.cpp @@ -21,6 +21,7 @@ #include "llvm/Object/WindowsResource.h" #include "llvm/Option/Arg.h" #include "llvm/Option/ArgList.h" +#include "llvm/Option/OptTable.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" @@ -48,9 +49,7 @@ namespace { enum ID { OPT_INVALID = 0, // This is not a correct option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -60,13 +59,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -78,9 +71,7 @@ class RcOptTable : public opt::OptTable { enum Windres_ID { WINDRES_INVALID = 0, // This is not a correct option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - WINDRES_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(WINDRES_, __VA_ARGS__), #include "WindresOpts.inc" #undef OPTION }; @@ -90,13 +81,8 @@ enum Windres_ID { #undef PREFIX const opt::OptTable::Info WindresInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - WINDRES_##PREFIX, NAME, HELPTEXT, \ - METAVAR, WINDRES_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, WINDRES_##GROUP, \ - WINDRES_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(WINDRES_, __VA_ARGS__), #include "WindresOpts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index f3f89497d8bd9..fc98786dc8c64 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -55,9 +55,7 @@ namespace { using namespace llvm::opt; // for HelpHidden in Opts.inc enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -67,13 +65,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-size/llvm-size.cpp b/llvm/tools/llvm-size/llvm-size.cpp index 77f68c0e659cc..143a83e3b2de0 100644 --- a/llvm/tools/llvm-size/llvm-size.cpp +++ b/llvm/tools/llvm-size/llvm-size.cpp @@ -40,9 +40,7 @@ namespace { using namespace llvm::opt; // for HelpHidden in Opts.inc enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -52,13 +50,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-strings/llvm-strings.cpp b/llvm/tools/llvm-strings/llvm-strings.cpp index 71d1321ee0ba3..10e5449e3159a 100644 --- a/llvm/tools/llvm-strings/llvm-strings.cpp +++ b/llvm/tools/llvm-strings/llvm-strings.cpp @@ -32,9 +32,7 @@ using namespace llvm::object; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -44,13 +42,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index a59364ade11ae..4bec9bcedfb3e 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -49,9 +49,7 @@ using namespace symbolize; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -61,13 +59,7 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp index 17a4000cb1d10..1001960e145f2 100644 --- a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp +++ b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp @@ -28,9 +28,7 @@ using namespace llvm::object; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; @@ -40,13 +38,7 @@ enum ID { #undef PREFIX static const opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - { \ - PREFIX, NAME, HELPTEXT, \ - METAVAR, OPT_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, \ - OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/unittests/Option/OptionParsingTest.cpp b/llvm/unittests/Option/OptionParsingTest.cpp index 520801d5aba72..7e4e68ccfc1bf 100644 --- a/llvm/unittests/Option/OptionParsingTest.cpp +++ b/llvm/unittests/Option/OptionParsingTest.cpp @@ -17,9 +17,7 @@ using namespace llvm::opt; enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - OPT_##ID, +#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), #include "Opts.inc" LastOption #undef OPTION @@ -36,10 +34,7 @@ enum OptionFlags { }; static const OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), #include "Opts.inc" #undef OPTION }; From 4a7c57ae6f2b9f3ea8e9b4f751824618d18ad1dd Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Wed, 9 Aug 2023 09:23:40 -0700 Subject: [PATCH 10/12] [llvm] Construct option's prefixed name at compile-time Some Clang command-line handling code could benefit from the option's prefixed name being a `StringLiteral`. This patch changes the `llvm::opt` TableGen backend to generate and emit that into the .inc file. Depends on D157028. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D157029 --- clang-tools-extra/clangd/CompileCommands.cpp | 8 ++-- clang/lib/Driver/Driver.cpp | 4 +- clang/lib/Frontend/CompilerInvocation.cpp | 12 +++--- clang/lib/Tooling/Tooling.cpp | 8 ++-- llvm/include/llvm/Option/OptTable.h | 38 +++++++++++-------- llvm/include/llvm/Option/Option.h | 9 ++--- llvm/lib/Option/OptTable.cpp | 18 ++++----- .../Option/OptionMarshallingTest.cpp | 16 ++++---- llvm/utils/TableGen/OptParserEmitter.cpp | 27 +++---------- 9 files changed, 64 insertions(+), 76 deletions(-) diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp index 02acc92265ffa..6b8753a290d33 100644 --- a/clang-tools-extra/clangd/CompileCommands.cpp +++ b/clang-tools-extra/clangd/CompileCommands.cpp @@ -466,8 +466,8 @@ llvm::ArrayRef ArgStripper::rulesFor(llvm::StringRef Arg) { // Also grab prefixes for each option, these are not fully exposed. const char *const *Prefixes[DriverID::LastOption] = {nullptr}; #define PREFIX(NAME, VALUE) static const char *const NAME[] = VALUE; -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELP, METAVAR, VALUES) \ +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ Prefixes[DriverID::OPT_##ID] = PREFIX; #include "clang/Driver/Options.inc" #undef OPTION @@ -478,8 +478,8 @@ llvm::ArrayRef ArgStripper::rulesFor(llvm::StringRef Arg) { DriverID AliasID; const void *AliasArgs; } AliasTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELP, METAVAR, VALUES) \ +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ {DriverID::OPT_##ID, DriverID::OPT_##ALIAS, ALIASARGS}, #include "clang/Driver/Options.inc" #undef OPTION diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index fb2a9a88d01e3..42bf9e908e33c 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -228,7 +228,7 @@ Driver::Driver(StringRef ClangExecutable, StringRef TargetTriple, } void Driver::setDriverMode(StringRef Value) { - static const std::string OptName = + static StringRef OptName = getOpts().getOption(options::OPT_driver_mode).getPrefixedName(); if (auto M = llvm::StringSwitch>(Value) .Case("gcc", GCCMode) @@ -6322,7 +6322,7 @@ bool clang::driver::willEmitRemarks(const ArgList &Args) { llvm::StringRef clang::driver::getDriverMode(StringRef ProgName, ArrayRef Args) { - static const std::string OptName = + static StringRef OptName = getDriverOptTable().getOption(options::OPT_driver_mode).getPrefixedName(); llvm::StringRef Opt; for (StringRef Arg : Args) { diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index ea284980d6de3..85de3f4776921 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -450,8 +450,8 @@ static T extractMaskValue(T KeyPath) { } #define PARSE_OPTION_WITH_MARSHALLING( \ - ARGS, DIAGS, PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ - PARAM, HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, \ + ARGS, DIAGS, PREFIX_TYPE, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \ if ((FLAGS)&options::CC1Option) { \ @@ -467,10 +467,10 @@ static T extractMaskValue(T KeyPath) { // Capture the extracted value as a lambda argument to avoid potential issues // with lifetime extension of the reference. #define GENERATE_OPTION_WITH_MARSHALLING( \ - CONSUMER, 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) \ + CONSUMER, PREFIX_TYPE, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ if ((FLAGS)&options::CC1Option) { \ [&](const auto &Extracted) { \ if (ALWAYS_EMIT || \ diff --git a/clang/lib/Tooling/Tooling.cpp b/clang/lib/Tooling/Tooling.cpp index a76046ae79193..db970cbbf9dd6 100644 --- a/clang/lib/Tooling/Tooling.cpp +++ b/clang/lib/Tooling/Tooling.cpp @@ -268,14 +268,14 @@ void addTargetAndModeForProgramName(std::vector &CommandLine, return; const auto &Table = driver::getDriverOptTable(); // --target=X - const std::string TargetOPT = + StringRef TargetOPT = Table.getOption(driver::options::OPT_target).getPrefixedName(); // -target X - const std::string TargetOPTLegacy = + StringRef TargetOPTLegacy = Table.getOption(driver::options::OPT_target_legacy_spelling) .getPrefixedName(); // --driver-mode=X - const std::string DriverModeOPT = + StringRef DriverModeOPT = Table.getOption(driver::options::OPT_driver_mode).getPrefixedName(); auto TargetMode = driver::ToolChain::getTargetAndModeFromProgramName(InvokedAs); @@ -295,7 +295,7 @@ void addTargetAndModeForProgramName(std::vector &CommandLine, } if (ShouldAddTarget) { CommandLine.insert(++CommandLine.begin(), - TargetOPT + TargetMode.TargetPrefix); + (TargetOPT + TargetMode.TargetPrefix).str()); } } diff --git a/llvm/include/llvm/Option/OptTable.h b/llvm/include/llvm/Option/OptTable.h index 593a0b4c71d71..b09fe38dc212b 100644 --- a/llvm/include/llvm/Option/OptTable.h +++ b/llvm/include/llvm/Option/OptTable.h @@ -44,7 +44,7 @@ class OptTable { /// A null terminated array of prefix strings to apply to name while /// matching. const char *const *Prefixes; - const char *Name; + StringLiteral PrefixedName; const char *HelpText; const char *MetaVar; unsigned ID; @@ -55,6 +55,11 @@ class OptTable { unsigned short AliasID; const char *AliasArgs; const char *Values; + + StringRef getName() const { + unsigned PrefixLength = !Prefixes ? 0 : StringRef(Prefixes[0]).size(); + return PrefixedName.drop_front(PrefixLength); + } }; private: @@ -103,7 +108,7 @@ class OptTable { /// Lookup the name of the given option. const char *getOptionName(OptSpecifier id) const { - return getInfo(id).Name; + return getInfo(id).getName().data(); } /// Get the kind of the given option. @@ -262,32 +267,33 @@ class OptTable { } // end namespace llvm -#define LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(ID_PREFIX, PREFIX, NAME, ID, KIND, \ - GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ +#define LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(ID_PREFIX, PREFIX, PREFIXED_NAME, ID, \ + KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES) \ ID_PREFIX##ID -#define LLVM_MAKE_OPT_ID(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ - FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ - LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OPT_, PREFIX, NAME, ID, KIND, GROUP, ALIAS, \ - ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, \ - VALUE) +#define LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OPT_, PREFIX, PREFIXED_NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUE) #define LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX( \ - ID_PREFIX, PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ + ID_PREFIX, PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ llvm::opt::OptTable::Info { \ - ID_PREFIX##PREFIX, NAME, HELPTEXT, METAVAR, ID_PREFIX##ID, \ + ID_PREFIX##PREFIX, PREFIXED_NAME, HELPTEXT, METAVAR, ID_PREFIX##ID, \ llvm::opt::Option::KIND##Class, PARAM, FLAGS, ID_PREFIX##GROUP, \ ID_PREFIX##ALIAS, ALIASARGS, VALUES \ } -#define LLVM_CONSTRUCT_OPT_INFO(PREFIX, NAME, ID, KIND, GROUP, ALIAS, \ +#define LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, \ VALUES) \ llvm::opt::OptTable::Info { \ - PREFIX, NAME, HELPTEXT, METAVAR, OPT_##ID, llvm::opt::Option::KIND##Class, \ - PARAM, FLAGS, OPT_##GROUP, OPT_##ALIAS, ALIASARGS, VALUES \ + PREFIX, PREFIXED_NAME, HELPTEXT, METAVAR, OPT_##ID, \ + llvm::opt::Option::KIND##Class, PARAM, FLAGS, OPT_##GROUP, \ + OPT_##ALIAS, ALIASARGS, VALUES \ } #endif // LLVM_OPTION_OPTTABLE_H diff --git a/llvm/include/llvm/Option/Option.h b/llvm/include/llvm/Option/Option.h index 106f6863fca1c..e2509e0232ffc 100644 --- a/llvm/include/llvm/Option/Option.h +++ b/llvm/include/llvm/Option/Option.h @@ -97,7 +97,7 @@ class Option { /// Get the name of this option without any prefix. StringRef getName() const { assert(Info && "Must have a valid info!"); - return Info->Name; + return Info->getName(); } const Option getGroup() const { @@ -129,10 +129,9 @@ class Option { } /// Get the name of this option with the default prefix. - std::string getPrefixedName() const { - std::string Ret(getPrefix()); - Ret += getName(); - return Ret; + StringLiteral getPrefixedName() const { + assert(Info && "Must have a valid info!"); + return Info->PrefixedName; } /// Get the help text for this option. diff --git a/llvm/lib/Option/OptTable.cpp b/llvm/lib/Option/OptTable.cpp index ef4873eb7f9c4..a0f59f8654ac0 100644 --- a/llvm/lib/Option/OptTable.cpp +++ b/llvm/lib/Option/OptTable.cpp @@ -67,7 +67,7 @@ static inline bool operator<(const OptTable::Info &A, const OptTable::Info &B) { if (&A == &B) return false; - if (int N = StrCmpOptionName(A.Name, B.Name)) + if (int N = StrCmpOptionName(A.getName().data(), B.getName().data())) return N < 0; for (const char * const *APre = A.Prefixes, @@ -87,7 +87,7 @@ static inline bool operator<(const OptTable::Info &A, const OptTable::Info &B) { // Support lower_bound between info and an option name. static inline bool operator<(const OptTable::Info &I, const char *Name) { - return StrCmpOptionNameIgnoreCase(I.Name, Name) < 0; + return StrCmpOptionNameIgnoreCase(I.getName().data(), Name) < 0; } } // end namespace opt @@ -183,10 +183,10 @@ static unsigned matchOption(const OptTable::Info *I, StringRef Str, StringRef Prefix(*Pre); if (Str.startswith(Prefix)) { StringRef Rest = Str.substr(Prefix.size()); - bool Matched = IgnoreCase ? Rest.startswith_insensitive(I->Name) - : Rest.startswith(I->Name); + bool Matched = IgnoreCase ? Rest.startswith_insensitive(I->getName()) + : Rest.startswith(I->getName()); if (Matched) - return Prefix.size() + StringRef(I->Name).size(); + return Prefix.size() + StringRef(I->getName()).size(); } } return 0; @@ -195,7 +195,7 @@ static unsigned matchOption(const OptTable::Info *I, StringRef Str, // Returns true if one of the Prefixes + In.Names matches Option static bool optionMatches(const OptTable::Info &In, StringRef Option) { if (In.Prefixes) { - StringRef InName(In.Name); + StringRef InName(In.getName()); for (size_t I = 0; In.Prefixes[I]; I++) if (Option.endswith(InName)) if (Option.slice(0, Option.size() - InName.size()) == In.Prefixes[I]) @@ -238,7 +238,7 @@ OptTable::findByPrefix(StringRef Cur, unsigned int DisableFlags) const { continue; for (int I = 0; In.Prefixes[I]; I++) { - std::string S = std::string(In.Prefixes[I]) + std::string(In.Name) + "\t"; + std::string S = std::string(In.Prefixes[I]) + std::string(In.getName()) + "\t"; if (In.HelpText) S += In.HelpText; if (StringRef(S).startswith(Cur) && S != std::string(Cur) + "\t") @@ -258,7 +258,7 @@ unsigned OptTable::findNearest(StringRef Option, std::string &NearestString, unsigned BestDistance = UINT_MAX; for (const Info &CandidateInfo : ArrayRef(OptionInfos).drop_front(FirstSearchableIndex)) { - StringRef CandidateName = CandidateInfo.Name; + StringRef CandidateName = CandidateInfo.getName(); // We can eliminate some option prefix/name pairs as candidates right away: // * Ignore option candidates with empty names, such as "--", or names @@ -535,7 +535,7 @@ InputArgList OptTable::parseArgs(int Argc, char *const *Argv, static std::string getOptionHelpName(const OptTable &Opts, OptSpecifier Id) { const Option O = Opts.getOption(Id); - std::string Name = O.getPrefixedName(); + std::string Name = O.getPrefixedName().str(); // Add metavar, if used. switch (O.getKind()) { diff --git a/llvm/unittests/Option/OptionMarshallingTest.cpp b/llvm/unittests/Option/OptionMarshallingTest.cpp index 85f0d86a86968..168e28d5db289 100644 --- a/llvm/unittests/Option/OptionMarshallingTest.cpp +++ b/llvm/unittests/Option/OptionMarshallingTest.cpp @@ -9,7 +9,7 @@ #include "gtest/gtest.h" struct OptionWithMarshallingInfo { - const char *Name; + llvm::StringLiteral PrefixedName; const char *KeyPath; const char *ImpliedCheck; const char *ImpliedValue; @@ -17,20 +17,20 @@ struct OptionWithMarshallingInfo { static const OptionWithMarshallingInfo MarshallingTable[] = { #define OPTION_WITH_MARSHALLING( \ - PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES, SPELLING, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ MERGER, EXTRACTOR, TABLE_INDEX) \ - {NAME, #KEYPATH, #IMPLIED_CHECK, #IMPLIED_VALUE}, + {PREFIXED_NAME, #KEYPATH, #IMPLIED_CHECK, #IMPLIED_VALUE}, #include "Opts.inc" #undef OPTION_WITH_MARSHALLING }; TEST(OptionMarshalling, EmittedOrderSameAsDefinitionOrder) { - ASSERT_STREQ(MarshallingTable[0].Name, "marshalled-flag-d"); - ASSERT_STREQ(MarshallingTable[1].Name, "marshalled-flag-c"); - ASSERT_STREQ(MarshallingTable[2].Name, "marshalled-flag-b"); - ASSERT_STREQ(MarshallingTable[3].Name, "marshalled-flag-a"); + ASSERT_EQ(MarshallingTable[0].PrefixedName, "-marshalled-flag-d"); + ASSERT_EQ(MarshallingTable[1].PrefixedName, "-marshalled-flag-c"); + ASSERT_EQ(MarshallingTable[2].PrefixedName, "-marshalled-flag-b"); + ASSERT_EQ(MarshallingTable[3].PrefixedName, "-marshalled-flag-a"); } TEST(OptionMarshalling, EmittedSpecifiedKeyPath) { diff --git a/llvm/utils/TableGen/OptParserEmitter.cpp b/llvm/utils/TableGen/OptParserEmitter.cpp index 182cd0076090a..0738615c5f4ac 100644 --- a/llvm/utils/TableGen/OptParserEmitter.cpp +++ b/llvm/utils/TableGen/OptParserEmitter.cpp @@ -34,29 +34,14 @@ static raw_ostream &write_cstring(raw_ostream &OS, llvm::StringRef Str) { return OS; } -static std::string getOptionSpelling(const Record &R, size_t &PrefixLength) { +static std::string getOptionPrefixedName(const Record &R) { std::vector Prefixes = R.getValueAsListOfStrings("Prefixes"); StringRef Name = R.getValueAsString("Name"); - if (Prefixes.empty()) { - PrefixLength = 0; + if (Prefixes.empty()) return Name.str(); - } - - PrefixLength = Prefixes[0].size(); - return (Twine(Prefixes[0]) + Twine(Name)).str(); -} -static std::string getOptionSpelling(const Record &R) { - size_t PrefixLength; - return getOptionSpelling(R, PrefixLength); -} - -static void emitNameUsingSpelling(raw_ostream &OS, const Record &R) { - size_t PrefixLength; - OS << "&"; - write_cstring(OS, StringRef(getOptionSpelling(R, PrefixLength))); - OS << "[" << PrefixLength << "]"; + return (Prefixes[0] + Twine(Name)).str(); } class MarshallingInfo { @@ -104,8 +89,6 @@ struct SimpleEnumValueTable { } void emit(raw_ostream &OS) const { - write_cstring(OS, StringRef(getOptionSpelling(R))); - OS << ", "; OS << ShouldParse; OS << ", "; OS << ShouldAlwaysEmit; @@ -310,8 +293,8 @@ void EmitOptParser(RecordKeeper &Records, raw_ostream &OS) { std::vector RPrefixes = R.getValueAsListOfStrings("Prefixes"); OS << Prefixes[PrefixKeyT(RPrefixes.begin(), RPrefixes.end())] << ", "; - // The option string. - emitNameUsingSpelling(OS, R); + // The option prefixed name. + write_cstring(OS, getOptionPrefixedName(R)); // The option identifier name. OS << ", " << getOptionName(R); From 2fc38639bb1d3a5d29cdecd677943bef1ef52fa9 Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Wed, 9 Aug 2023 09:54:57 -0700 Subject: [PATCH 11/12] [clang] NFC: Use compile-time option spelling when generating command line When generating command lines, use the option spelling generated by TableGen (`StringLiteral`) instead of constructing it at runtime. This saves some needless allocations. Depends on D157029. Reviewed By: benlangmuir, MaskRay Differential Revision: https://reviews.llvm.org/D157054 --- clang/lib/Frontend/CompilerInvocation.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 85de3f4776921..7f15f8ed52f94 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -646,7 +646,7 @@ static unsigned getOptimizationLevelSize(ArgList &Args) { static void GenerateArg(ArgumentConsumer Consumer, llvm::opt::OptSpecifier OptSpecifier) { Option Opt = getDriverOptTable().getOption(OptSpecifier); - denormalizeSimpleFlag(Consumer, Opt.getPrefix() + Opt.getName(), + denormalizeSimpleFlag(Consumer, Opt.getPrefixedName(), Option::OptionClass::FlagClass, 0); } @@ -654,8 +654,7 @@ static void GenerateArg(ArgumentConsumer Consumer, llvm::opt::OptSpecifier OptSpecifier, const Twine &Value) { Option Opt = getDriverOptTable().getOption(OptSpecifier); - denormalizeString(Consumer, Opt.getPrefix() + Opt.getName(), Opt.getKind(), 0, - Value); + denormalizeString(Consumer, Opt.getPrefixedName(), Opt.getKind(), 0, Value); } static void GenerateMultiArg(ArgumentConsumer Consumer, From 72de4581b7ae800f2acd9bf7b5d31a589abf2572 Mon Sep 17 00:00:00 2001 From: Jan Svoboda Date: Wed, 16 Aug 2023 19:50:18 -0700 Subject: [PATCH 12/12] [llvm][clang] Work around older Windows SDK not working with conforming preprocessor rdar://113996252 --- clang/include/clang/Driver/Options.h | 5 +- clang/lib/Driver/DriverOptions.cpp | 5 +- clang/lib/Frontend/CompilerInvocation.cpp | 312 +++++++++++++++--- .../ClangLinkerWrapper.cpp | 10 +- lld/COFF/Driver.h | 5 +- lld/COFF/DriverUtils.cpp | 5 +- lld/ELF/Driver.h | 5 +- lld/ELF/DriverUtils.cpp | 5 +- lld/MachO/Driver.h | 5 +- lld/MinGW/Driver.cpp | 5 +- lld/wasm/Driver.cpp | 5 +- lldb/tools/driver/Driver.cpp | 10 +- lldb/tools/lldb-server/lldb-gdbserver.cpp | 10 +- lldb/tools/lldb-vscode/lldb-vscode.cpp | 10 +- llvm/cmake/modules/HandleLLVMOptions.cmake | 4 - .../JITLink/COFFDirectiveParser.cpp | 7 +- .../JITLink/COFFDirectiveParser.h | 6 +- .../llvm-dlltool/DlltoolDriver.cpp | 10 +- llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp | 10 +- llvm/tools/dsymutil/dsymutil.cpp | 10 +- llvm/tools/llvm-cvtres/llvm-cvtres.cpp | 10 +- llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp | 10 +- llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp | 10 +- llvm/tools/llvm-ifs/llvm-ifs.cpp | 10 +- llvm/tools/llvm-lipo/llvm-lipo.cpp | 12 +- llvm/tools/llvm-ml/llvm-ml.cpp | 10 +- llvm/tools/llvm-mt/llvm-mt.cpp | 10 +- llvm/tools/llvm-nm/llvm-nm.cpp | 10 +- llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 53 ++- llvm/tools/llvm-objdump/ObjdumpOptID.h | 6 +- llvm/tools/llvm-objdump/llvm-objdump.cpp | 19 +- llvm/tools/llvm-rc/llvm-rc.cpp | 23 +- llvm/tools/llvm-readobj/llvm-readobj.cpp | 10 +- llvm/tools/llvm-size/llvm-size.cpp | 10 +- llvm/tools/llvm-strings/llvm-strings.cpp | 10 +- .../tools/llvm-symbolizer/llvm-symbolizer.cpp | 10 +- .../llvm-tli-checker/llvm-tli-checker.cpp | 10 +- llvm/unittests/Option/OptionParsingTest.cpp | 10 +- 38 files changed, 554 insertions(+), 133 deletions(-) diff --git a/clang/include/clang/Driver/Options.h b/clang/include/clang/Driver/Options.h index f1592e1dc3160..4b5239f01fa67 100644 --- a/clang/include/clang/Driver/Options.h +++ b/clang/include/clang/Driver/Options.h @@ -38,7 +38,10 @@ enum ClangFlags { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "clang/Driver/Options.inc" LastOption #undef OPTION diff --git a/clang/lib/Driver/DriverOptions.cpp b/clang/lib/Driver/DriverOptions.cpp index 1fb57f5e5db7d..2768912515444 100644 --- a/clang/lib/Driver/DriverOptions.cpp +++ b/clang/lib/Driver/DriverOptions.cpp @@ -21,7 +21,10 @@ using namespace llvm::opt; #undef PREFIX static const OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "clang/Driver/Options.inc" #undef OPTION }; diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 7f15f8ed52f94..1190687095825 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -884,8 +884,16 @@ static void GenerateAnalyzerArgs(AnalyzerOptions &Opts, ArgumentConsumer Consumer) { const AnalyzerOptions *AnalyzerOpts = &Opts; -#define ANALYZER_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define ANALYZER_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef ANALYZER_OPTION_WITH_MARSHALLING @@ -971,8 +979,16 @@ static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args, AnalyzerOptions *AnalyzerOpts = &Opts; -#define ANALYZER_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define ANALYZER_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef ANALYZER_OPTION_WITH_MARSHALLING @@ -1577,8 +1593,16 @@ void CompilerInvocation::GenerateCodeGenArgs(const CodeGenOptions &Opts, else GenerateArg(Consumer, OPT_O, Twine(Opts.OptimizationLevel)); -#define CODEGEN_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define CODEGEN_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef CODEGEN_OPTION_WITH_MARSHALLING @@ -1842,8 +1866,16 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, // variable name and type. const LangOptions *LangOpts = &LangOptsRef; -#define CODEGEN_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define CODEGEN_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef CODEGEN_OPTION_WITH_MARSHALLING @@ -2299,8 +2331,16 @@ bool CompilerInvocation::ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, static void GenerateDependencyOutputArgs(const DependencyOutputOptions &Opts, ArgumentConsumer Consumer) { const DependencyOutputOptions &DependencyOutputOpts = Opts; -#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING @@ -2334,8 +2374,16 @@ static bool ParseDependencyOutputArgs(DependencyOutputOptions &Opts, unsigned NumErrorsBefore = Diags.getNumErrors(); DependencyOutputOptions &DependencyOutputOpts = Opts; -#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef DEPENDENCY_OUTPUT_OPTION_WITH_MARSHALLING @@ -2450,8 +2498,16 @@ void CompilerInvocation::GenerateCASArgs(const CASOptions &Opts, ArgumentConsumer Consumer) { const CASOptions &CASOpts = Opts; -#define CAS_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define CAS_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef CAS_OPTION_WITH_MARSHALLING } @@ -2461,8 +2517,16 @@ bool CompilerInvocation::ParseCASArgs(CASOptions &Opts, const ArgList &Args, CASOptions &CASOpts = Opts; bool Success = true; -#define CAS_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define CAS_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef CAS_OPTION_WITH_MARSHALLING @@ -2473,8 +2537,16 @@ static void GenerateFileSystemArgs(const FileSystemOptions &Opts, ArgumentConsumer Consumer) { const FileSystemOptions &FileSystemOpts = Opts; -#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define FILE_SYSTEM_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef FILE_SYSTEM_OPTION_WITH_MARSHALLING } @@ -2485,8 +2557,16 @@ static bool ParseFileSystemArgs(FileSystemOptions &Opts, const ArgList &Args, FileSystemOptions &FileSystemOpts = Opts; -#define FILE_SYSTEM_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define FILE_SYSTEM_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef FILE_SYSTEM_OPTION_WITH_MARSHALLING @@ -2496,8 +2576,16 @@ static bool ParseFileSystemArgs(FileSystemOptions &Opts, const ArgList &Args, static void GenerateMigratorArgs(const MigratorOptions &Opts, ArgumentConsumer Consumer) { const MigratorOptions &MigratorOpts = Opts; -#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define MIGRATOR_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef MIGRATOR_OPTION_WITH_MARSHALLING } @@ -2508,8 +2596,16 @@ static bool ParseMigratorArgs(MigratorOptions &Opts, const ArgList &Args, MigratorOptions &MigratorOpts = Opts; -#define MIGRATOR_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define MIGRATOR_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef MIGRATOR_OPTION_WITH_MARSHALLING @@ -2520,8 +2616,16 @@ void CompilerInvocation::GenerateDiagnosticArgs(const DiagnosticOptions &Opts, ArgumentConsumer Consumer, bool DefaultDiagColor) { const DiagnosticOptions *DiagnosticOpts = &Opts; -#define DIAG_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define DIAG_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef DIAG_OPTION_WITH_MARSHALLING @@ -2605,8 +2709,16 @@ bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, // "DiagnosticOpts->". Let's provide the expected variable name and type. DiagnosticOptions *DiagnosticOpts = &Opts; -#define DIAG_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, *Diags, __VA_ARGS__) +#define DIAG_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, *Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef DIAG_OPTION_WITH_MARSHALLING @@ -2750,8 +2862,16 @@ getProgramActionOpt(frontend::ActionKind ProgramAction) { static void GenerateFrontendArgs(const FrontendOptions &Opts, ArgumentConsumer Consumer, bool IsHeader) { const FrontendOptions &FrontendOpts = Opts; -#define FRONTEND_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define FRONTEND_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef FRONTEND_OPTION_WITH_MARSHALLING @@ -2968,8 +3088,16 @@ static bool ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args, FrontendOptions &FrontendOpts = Opts; -#define FRONTEND_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define FRONTEND_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef FRONTEND_OPTION_WITH_MARSHALLING @@ -3253,8 +3381,16 @@ std::string CompilerInvocation::GetResourcesPath(const char *Argv0, static void GenerateHeaderSearchArgs(HeaderSearchOptions &Opts, ArgumentConsumer Consumer) { const HeaderSearchOptions *HeaderSearchOpts = &Opts; -#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define HEADER_SEARCH_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef HEADER_SEARCH_OPTION_WITH_MARSHALLING @@ -3376,8 +3512,16 @@ static bool ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args, HeaderSearchOptions *HeaderSearchOpts = &Opts; -#define HEADER_SEARCH_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define HEADER_SEARCH_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef HEADER_SEARCH_OPTION_WITH_MARSHALLING @@ -3689,8 +3833,16 @@ void CompilerInvocation::GenerateLangArgs(const LangOptions &Opts, const LangOptions *LangOpts = &Opts; -#define LANG_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define LANG_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef LANG_OPTION_WITH_MARSHALLING @@ -4009,8 +4161,16 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, // "LangOpts->". Let's provide the expected variable name and type. LangOptions *LangOpts = &Opts; -#define LANG_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define LANG_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef LANG_OPTION_WITH_MARSHALLING @@ -4517,8 +4677,16 @@ static void GeneratePreprocessorArgs(PreprocessorOptions &Opts, const CodeGenOptions &CodeGenOpts) { PreprocessorOptions *PreprocessorOpts = &Opts; -#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define PREPROCESSOR_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OPTION_WITH_MARSHALLING @@ -4585,8 +4753,16 @@ static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, PreprocessorOptions *PreprocessorOpts = &Opts; -#define PREPROCESSOR_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define PREPROCESSOR_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OPTION_WITH_MARSHALLING @@ -4680,8 +4856,16 @@ GeneratePreprocessorOutputArgs(const PreprocessorOutputOptions &Opts, frontend::ActionKind Action) { const PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; -#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING @@ -4701,8 +4885,16 @@ static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, PreprocessorOutputOptions &PreprocessorOutputOpts = Opts; -#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef PREPROCESSOR_OUTPUT_OPTION_WITH_MARSHALLING @@ -4716,8 +4908,16 @@ static bool ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, static void GenerateTargetArgs(const TargetOptions &Opts, ArgumentConsumer Consumer) { const TargetOptions *TargetOpts = &Opts; -#define TARGET_OPTION_WITH_MARSHALLING(...) \ - GENERATE_OPTION_WITH_MARSHALLING(Consumer, __VA_ARGS__) +#define TARGET_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + GENERATE_OPTION_WITH_MARSHALLING( \ + Consumer, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, \ + KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ + DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef TARGET_OPTION_WITH_MARSHALLING @@ -4735,8 +4935,16 @@ static bool ParseTargetArgs(TargetOptions &Opts, ArgList &Args, TargetOptions *TargetOpts = &Opts; -#define TARGET_OPTION_WITH_MARSHALLING(...) \ - PARSE_OPTION_WITH_MARSHALLING(Args, Diags, __VA_ARGS__) +#define TARGET_OPTION_WITH_MARSHALLING( \ + PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, ALWAYS_EMIT, KEYPATH, \ + DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, DENORMALIZER, \ + MERGER, EXTRACTOR, TABLE_INDEX) \ + PARSE_OPTION_WITH_MARSHALLING( \ + Args, Diags, PREFIX_TYPE, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, VALUES, SHOULD_PARSE, \ + ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, \ + NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) #include "clang/Driver/Options.inc" #undef TARGET_OPTION_WITH_MARSHALLING diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 475240b457b17..da758c80206ce 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -112,7 +112,10 @@ enum WrapperFlags { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "LinkerWrapperOpts.inc" LastOption #undef OPTION @@ -123,7 +126,10 @@ enum ID { #undef PREFIX static const OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "LinkerWrapperOpts.inc" #undef OPTION }; diff --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h index b89a9dbe402b9..8005ab3e2f622 100644 --- a/lld/COFF/Driver.h +++ b/lld/COFF/Driver.h @@ -230,7 +230,10 @@ MemoryBufferRef convertResToCOFF(ArrayRef mbs, // Create enum with OPT_xxx values for each option in Options.td enum { OPT_INVALID = 0, -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/lld/COFF/DriverUtils.cpp b/lld/COFF/DriverUtils.cpp index 27679d647f6f2..86b3bbed8a230 100644 --- a/lld/COFF/DriverUtils.cpp +++ b/lld/COFF/DriverUtils.cpp @@ -778,7 +778,10 @@ MemoryBufferRef convertResToCOFF(ArrayRef mbs, // Create table mapping all options defined in Options.td static const llvm::opt::OptTable::Info infoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/lld/ELF/Driver.h b/lld/ELF/Driver.h index a325dec3ff8fb..e8199c798bba4 100644 --- a/lld/ELF/Driver.h +++ b/lld/ELF/Driver.h @@ -25,7 +25,10 @@ class ELFOptTable : public llvm::opt::OptTable { // Create enum with OPT_xxx values for each option in Options.td enum { OPT_INVALID = 0, -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/lld/ELF/DriverUtils.cpp b/lld/ELF/DriverUtils.cpp index 9dcbd5d5c05ec..b98f2885086a0 100644 --- a/lld/ELF/DriverUtils.cpp +++ b/lld/ELF/DriverUtils.cpp @@ -40,7 +40,10 @@ using namespace lld::elf; // Create table mapping all options defined in Options.td static const opt::OptTable::Info optInfo[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/lld/MachO/Driver.h b/lld/MachO/Driver.h index 809db8db3d01a..1465aa399d26f 100644 --- a/lld/MachO/Driver.h +++ b/lld/MachO/Driver.h @@ -35,7 +35,10 @@ class MachOOptTable : public llvm::opt::OptTable { // Create enum with OPT_xxx values for each option in Options.td enum { OPT_INVALID = 0, -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/lld/MinGW/Driver.cpp b/lld/MinGW/Driver.cpp index b2117e485b68f..954db28d4d00a 100644 --- a/lld/MinGW/Driver.cpp +++ b/lld/MinGW/Driver.cpp @@ -55,7 +55,10 @@ using namespace llvm; // Create OptTable enum { OPT_INVALID = 0, -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp index bb54db4a9043d..0c20d9cfc1885 100644 --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -49,7 +49,10 @@ namespace { // Create enum with OPT_xxx values for each option in Options.td enum { OPT_INVALID = 0, -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/lldb/tools/driver/Driver.cpp b/lldb/tools/driver/Driver.cpp index d174258345827..46f420e22e951 100644 --- a/lldb/tools/driver/Driver.cpp +++ b/lldb/tools/driver/Driver.cpp @@ -52,7 +52,10 @@ using namespace llvm; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; @@ -62,7 +65,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/lldb/tools/lldb-server/lldb-gdbserver.cpp b/lldb/tools/lldb-server/lldb-gdbserver.cpp index 51422cc3a9c1e..6c0625d3b86ff 100644 --- a/lldb/tools/lldb-server/lldb-gdbserver.cpp +++ b/lldb/tools/lldb-server/lldb-gdbserver.cpp @@ -271,7 +271,10 @@ void ConnectToRemote(MainLoop &mainloop, namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "LLGSOptions.inc" #undef OPTION }; @@ -281,7 +284,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "LLGSOptions.inc" #undef OPTION }; diff --git a/lldb/tools/lldb-vscode/lldb-vscode.cpp b/lldb/tools/lldb-vscode/lldb-vscode.cpp index f7f4588e7ac69..64a57ff7df0aa 100644 --- a/lldb/tools/lldb-vscode/lldb-vscode.cpp +++ b/lldb/tools/lldb-vscode/lldb-vscode.cpp @@ -73,7 +73,10 @@ using namespace lldb_vscode; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; @@ -83,7 +86,10 @@ enum ID { #undef PREFIX static const llvm::opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/llvm/cmake/modules/HandleLLVMOptions.cmake b/llvm/cmake/modules/HandleLLVMOptions.cmake index 09d2cbbd25dba..1b1b074e16351 100644 --- a/llvm/cmake/modules/HandleLLVMOptions.cmake +++ b/llvm/cmake/modules/HandleLLVMOptions.cmake @@ -485,10 +485,6 @@ if( MSVC ) append("/Zc:inline" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) - # Enable standards-conforming preprocessor. - # https://learn.microsoft.com/en-us/cpp/build/reference/zc-preprocessor - append("/Zc:preprocessor" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) - # Some projects use the __cplusplus preprocessor macro to check support for # a particular version of the C++ standard. When this option is not specified # explicitly, macro's value is "199711L" that implies C++98 Standard. diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp index c7c22ee75e6a1..15e0d3d4001bd 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp @@ -24,8 +24,11 @@ using namespace jitlink; // Create table mapping all options defined in COFFOptions.td static const opt::OptTable::Info infoTable[] = { -#define OPTION(...) \ - LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(COFF_OPT_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(COFF_OPT_, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES), #include "COFFOptions.inc" #undef OPTION }; diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h index 588f0fd18467a..db8bf1f1fa81c 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h +++ b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h @@ -26,7 +26,11 @@ namespace jitlink { enum { COFF_OPT_INVALID = 0, -#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(COFF_OPT_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(COFF_OPT_, PREFIX, NAME, ID, KIND, GROUP, \ + ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, \ + METAVAR, VALUES), #include "COFFOptions.inc" #undef OPTION }; diff --git a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp index 4316148c14b57..e49e5d699bab2 100644 --- a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp @@ -33,7 +33,10 @@ namespace { enum { OPT_INVALID = 0, -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; @@ -43,7 +46,10 @@ enum { #undef PREFIX static const llvm::opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp index 49b7e2780e1df..8c1408ad7a66d 100644 --- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp @@ -36,7 +36,10 @@ namespace { enum { OPT_INVALID = 0, -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; @@ -46,7 +49,10 @@ enum { #undef PREFIX static const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/llvm/tools/dsymutil/dsymutil.cpp b/llvm/tools/dsymutil/dsymutil.cpp index d59f6f50971ee..21c675b806f52 100644 --- a/llvm/tools/dsymutil/dsymutil.cpp +++ b/llvm/tools/dsymutil/dsymutil.cpp @@ -57,7 +57,10 @@ using namespace object; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; @@ -67,7 +70,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp index 158c465460351..a284459b1ee44 100644 --- a/llvm/tools/llvm-cvtres/llvm-cvtres.cpp +++ b/llvm/tools/llvm-cvtres/llvm-cvtres.cpp @@ -37,7 +37,10 @@ namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -47,7 +50,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp index 259bc29b7b712..344b67fa5b269 100644 --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp @@ -25,7 +25,10 @@ using namespace llvm; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -35,7 +38,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp b/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp index 912523916e6e9..0688ec6840d00 100644 --- a/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp +++ b/llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp @@ -33,7 +33,10 @@ using namespace object; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; @@ -43,7 +46,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Options.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-ifs/llvm-ifs.cpp b/llvm/tools/llvm-ifs/llvm-ifs.cpp index 5eb3b8e2409c3..b43e7fef4f695 100644 --- a/llvm/tools/llvm-ifs/llvm-ifs.cpp +++ b/llvm/tools/llvm-ifs/llvm-ifs.cpp @@ -52,7 +52,10 @@ enum class FileFormat { IFS, ELF, TBD }; using namespace llvm::opt; enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -62,7 +65,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-lipo/llvm-lipo.cpp b/llvm/tools/llvm-lipo/llvm-lipo.cpp index 55f9fd1d3f7d2..4c94e59e61ae3 100644 --- a/llvm/tools/llvm-lipo/llvm-lipo.cpp +++ b/llvm/tools/llvm-lipo/llvm-lipo.cpp @@ -65,7 +65,11 @@ static const StringRef ToolName = "llvm-lipo"; namespace { enum LipoID { LIPO_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(LIPO_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(LIPO_, PREFIX, NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELPTEXT, METAVAR, \ + VALUES), #include "LipoOpts.inc" #undef OPTION }; @@ -77,7 +81,11 @@ const char *const *LIPO_nullptr = nullptr; #undef PREFIX const opt::OptTable::Info LipoInfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(LIPO_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(LIPO_, PREFIX, NAME, ID, KIND, GROUP, \ + ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES), #include "LipoOpts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-ml/llvm-ml.cpp b/llvm/tools/llvm-ml/llvm-ml.cpp index 050a859efdbe4..569e0d35ebc96 100644 --- a/llvm/tools/llvm-ml/llvm-ml.cpp +++ b/llvm/tools/llvm-ml/llvm-ml.cpp @@ -52,7 +52,10 @@ namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -62,7 +65,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-mt/llvm-mt.cpp b/llvm/tools/llvm-mt/llvm-mt.cpp index d9259e86d0120..644552309fd55 100644 --- a/llvm/tools/llvm-mt/llvm-mt.cpp +++ b/llvm/tools/llvm-mt/llvm-mt.cpp @@ -34,7 +34,10 @@ namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -44,7 +47,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 168bf9c76f13f..0c3995711f184 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -57,7 +57,10 @@ namespace { using namespace llvm::opt; // for HelpHidden in Opts.inc enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -67,7 +70,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp index 4abf660323bb3..d27351232a2e9 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp +++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp @@ -30,7 +30,11 @@ using namespace llvm::objcopy; namespace { enum ObjcopyID { OBJCOPY_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OBJCOPY_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OBJCOPY_, PREFIX, NAME, ID, KIND, GROUP, \ + ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, \ + METAVAR, VALUES), #include "ObjcopyOpts.inc" #undef OPTION }; @@ -40,8 +44,11 @@ enum ObjcopyID { #undef PREFIX const opt::OptTable::Info ObjcopyInfoTable[] = { -#define OPTION(...) \ - LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OBJCOPY_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OBJCOPY_, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES), #include "ObjcopyOpts.inc" #undef OPTION }; @@ -55,8 +62,11 @@ class ObjcopyOptTable : public opt::OptTable { enum InstallNameToolID { INSTALL_NAME_TOOL_INVALID = 0, // This is not an option ID. -#define OPTION(...) \ - LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(INSTALL_NAME_TOOL_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(INSTALL_NAME_TOOL_, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES), #include "InstallNameToolOpts.inc" #undef OPTION }; @@ -67,8 +77,11 @@ enum InstallNameToolID { #undef PREFIX const opt::OptTable::Info InstallNameToolInfoTable[] = { -#define OPTION(...) \ - LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(INSTALL_NAME_TOOL_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(INSTALL_NAME_TOOL_, PREFIX, NAME, ID, \ + KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES), #include "InstallNameToolOpts.inc" #undef OPTION }; @@ -80,8 +93,11 @@ class InstallNameToolOptTable : public opt::OptTable { enum BitcodeStripID { BITCODE_STRIP_INVALID = 0, // This is not an option ID. -#define OPTION(...) \ - LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(BITCODE_STRIP_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(BITCODE_STRIP_, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES), #include "BitcodeStripOpts.inc" #undef OPTION }; @@ -91,8 +107,11 @@ enum BitcodeStripID { #undef PREFIX const opt::OptTable::Info BitcodeStripInfoTable[] = { -#define OPTION(...) \ - LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(BITCODE_STRIP_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(BITCODE_STRIP_, PREFIX, NAME, ID, \ + KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES), #include "BitcodeStripOpts.inc" #undef OPTION }; @@ -104,7 +123,11 @@ class BitcodeStripOptTable : public opt::OptTable { enum StripID { STRIP_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(STRIP_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(STRIP_, PREFIX, NAME, ID, KIND, GROUP, \ + ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, \ + METAVAR, VALUES), #include "StripOpts.inc" #undef OPTION }; @@ -114,7 +137,11 @@ enum StripID { #undef PREFIX const opt::OptTable::Info StripInfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(STRIP_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(STRIP_, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES), #include "StripOpts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-objdump/ObjdumpOptID.h b/llvm/tools/llvm-objdump/ObjdumpOptID.h index fc90cb5c8f040..f2e3073f990c4 100644 --- a/llvm/tools/llvm-objdump/ObjdumpOptID.h +++ b/llvm/tools/llvm-objdump/ObjdumpOptID.h @@ -5,7 +5,11 @@ enum ObjdumpOptID { OBJDUMP_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OBJDUMP_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OBJDUMP_, PREFIX, NAME, ID, KIND, GROUP, \ + ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, \ + METAVAR, VALUES), #include "ObjdumpOpts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 4a0d7da8500b0..7f2f6f82bbb5e 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -126,8 +126,11 @@ class CommonOptTable : public opt::OptTable { static constexpr opt::OptTable::Info ObjdumpInfoTable[] = { #define OBJDUMP_nullptr nullptr -#define OPTION(...) \ - LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OBJDUMP_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OBJDUMP_, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES), #include "ObjdumpOpts.inc" #undef OPTION #undef OBJDUMP_nullptr @@ -142,7 +145,11 @@ class ObjdumpOptTable : public CommonOptTable { enum OtoolOptID { OTOOL_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OTOOL_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(OTOOL_, PREFIX, NAME, ID, KIND, GROUP, \ + ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, \ + METAVAR, VALUES), #include "OtoolOpts.inc" #undef OPTION }; @@ -153,7 +160,11 @@ enum OtoolOptID { static constexpr opt::OptTable::Info OtoolInfoTable[] = { #define OTOOL_nullptr nullptr -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OTOOL_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OTOOL_, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES), #include "OtoolOpts.inc" #undef OPTION #undef OTOOL_nullptr diff --git a/llvm/tools/llvm-rc/llvm-rc.cpp b/llvm/tools/llvm-rc/llvm-rc.cpp index b1e154f414809..34bf2b79d696c 100644 --- a/llvm/tools/llvm-rc/llvm-rc.cpp +++ b/llvm/tools/llvm-rc/llvm-rc.cpp @@ -49,7 +49,10 @@ namespace { enum ID { OPT_INVALID = 0, // This is not a correct option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -59,7 +62,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -71,7 +77,11 @@ class RcOptTable : public opt::OptTable { enum Windres_ID { WINDRES_INVALID = 0, // This is not a correct option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(WINDRES_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID_WITH_ID_PREFIX(WINDRES_, PREFIX, NAME, ID, KIND, GROUP, \ + ALIAS, ALIASARGS, FLAGS, PARAM, HELPTEXT, \ + METAVAR, VALUES), #include "WindresOpts.inc" #undef OPTION }; @@ -81,8 +91,11 @@ enum Windres_ID { #undef PREFIX const opt::OptTable::Info WindresInfoTable[] = { -#define OPTION(...) \ - LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(WINDRES_, __VA_ARGS__), +#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ + HELPTEXT, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(WINDRES_, PREFIX, NAME, ID, KIND, \ + GROUP, ALIAS, ALIASARGS, FLAGS, \ + PARAM, HELPTEXT, METAVAR, VALUES), #include "WindresOpts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index fc98786dc8c64..be4b0b83f3213 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -55,7 +55,10 @@ namespace { using namespace llvm::opt; // for HelpHidden in Opts.inc enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -65,7 +68,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-size/llvm-size.cpp b/llvm/tools/llvm-size/llvm-size.cpp index 143a83e3b2de0..3334c0bee12fd 100644 --- a/llvm/tools/llvm-size/llvm-size.cpp +++ b/llvm/tools/llvm-size/llvm-size.cpp @@ -40,7 +40,10 @@ namespace { using namespace llvm::opt; // for HelpHidden in Opts.inc enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -50,7 +53,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-strings/llvm-strings.cpp b/llvm/tools/llvm-strings/llvm-strings.cpp index 10e5449e3159a..c5340f0ad003b 100644 --- a/llvm/tools/llvm-strings/llvm-strings.cpp +++ b/llvm/tools/llvm-strings/llvm-strings.cpp @@ -32,7 +32,10 @@ using namespace llvm::object; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -42,7 +45,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index 4bec9bcedfb3e..2ca5f636c532b 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -49,7 +49,10 @@ using namespace symbolize; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -59,7 +62,10 @@ enum ID { #undef PREFIX const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp index 1001960e145f2..e7e6b0dbb226f 100644 --- a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp +++ b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp @@ -28,7 +28,10 @@ using namespace llvm::object; namespace { enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; @@ -38,7 +41,10 @@ enum ID { #undef PREFIX static const opt::OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION }; diff --git a/llvm/unittests/Option/OptionParsingTest.cpp b/llvm/unittests/Option/OptionParsingTest.cpp index 7e4e68ccfc1bf..01844e6da8243 100644 --- a/llvm/unittests/Option/OptionParsingTest.cpp +++ b/llvm/unittests/Option/OptionParsingTest.cpp @@ -17,7 +17,10 @@ using namespace llvm::opt; enum ID { OPT_INVALID = 0, // This is not an option ID. -#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_MAKE_OPT_ID(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" LastOption #undef OPTION @@ -34,7 +37,10 @@ enum OptionFlags { }; static const OptTable::Info InfoTable[] = { -#define OPTION(...) LLVM_CONSTRUCT_OPT_INFO(__VA_ARGS__), +#define OPTION(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ + LLVM_CONSTRUCT_OPT_INFO(PREFIX, PREFIXED_NAME, ID, KIND, GROUP, ALIAS, \ + ALIASARGS, FLAGS, PARAM, HELP, METAVAR, VALUES), #include "Opts.inc" #undef OPTION };