jansvoboda11 created this revision. jansvoboda11 added a reviewer: MaskRay. Herald added subscribers: ormris, ributzka, kadircet, arphaman, hiraditya. Herald added a reviewer: alexander-shaposhnikov. Herald added a reviewer: jhenderson. Herald added a project: All. jansvoboda11 requested review of this revision. Herald added projects: clang, LLVM, clang-tools-extra. Herald added subscribers: cfe-commits, llvm-commits.
Some Clang command-line handling code could benefit from the option spelling being a `StringLiteral`. This patch changes the `llvm::opt` TableGen backend to generate the "canonical" spelling and emit it into the .inc file. Depends on D157028 <https://reviews.llvm.org/D157028>. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D157029 Files: clang-tools-extra/clangd/CompileCommands.cpp clang/lib/Frontend/CompilerInvocation.cpp llvm/include/llvm/Option/OptTable.h llvm/include/llvm/Option/Option.h llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h llvm/tools/llvm-lipo/llvm-lipo.cpp llvm/tools/llvm-objcopy/ObjcopyOptions.cpp llvm/tools/llvm-objdump/ObjdumpOptID.h llvm/tools/llvm-objdump/llvm-objdump.cpp llvm/tools/llvm-rc/llvm-rc.cpp llvm/utils/TableGen/OptParserEmitter.cpp
Index: llvm/utils/TableGen/OptParserEmitter.cpp =================================================================== --- llvm/utils/TableGen/OptParserEmitter.cpp +++ llvm/utils/TableGen/OptParserEmitter.cpp @@ -105,8 +105,6 @@ } void emit(raw_ostream &OS) const { - write_cstring(OS, StringRef(getOptionSpelling(R))); - OS << ", "; OS << ShouldParse; OS << ", "; OS << ShouldAlwaysEmit; @@ -306,6 +304,9 @@ // The option string. OS << ", \"" << R.getValueAsString("Name") << '"'; + // The option spelling. + OS << ", \"" << R.getValueAsString("Name") << '"'; + // The option identifier name. OS << ", " << getOptionName(R); @@ -349,6 +350,11 @@ // The option string. emitNameUsingSpelling(OS, R); + // The option spelling. + OS << ", llvm::StringLiteral("; + write_cstring(OS, getOptionSpelling(R)); + OS << ")"; + // The option identifier name. OS << ", " << getOptionName(R); Index: llvm/tools/llvm-rc/llvm-rc.cpp =================================================================== --- llvm/tools/llvm-rc/llvm-rc.cpp +++ llvm/tools/llvm-rc/llvm-rc.cpp @@ -77,8 +77,8 @@ 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) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ WINDRES_##ID, #include "WindresOpts.inc" #undef OPTION @@ -93,12 +93,21 @@ #undef PREFIX static constexpr opt::OptTable::Info InfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, \ - METAVAR, WINDRES_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, WINDRES_##GROUP, \ - WINDRES_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ + {PREFIX, \ + NAME, \ + SPELLING, \ + HELPTEXT, \ + METAVAR, \ + WINDRES_##ID, \ + opt::Option::KIND##Class, \ + PARAM, \ + FLAGS, \ + WINDRES_##GROUP, \ + WINDRES_##ALIAS, \ + ALIASARGS, \ + VALUES}, #include "WindresOpts.inc" #undef OPTION }; Index: llvm/tools/llvm-objdump/llvm-objdump.cpp =================================================================== --- llvm/tools/llvm-objdump/llvm-objdump.cpp +++ llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -128,12 +128,21 @@ #undef PREFIX static constexpr opt::OptTable::Info ObjdumpInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, \ - METAVAR, OBJDUMP_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OBJDUMP_##GROUP, \ - OBJDUMP_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ + {PREFIX, \ + NAME, \ + SPELLING, \ + HELPTEXT, \ + METAVAR, \ + OBJDUMP_##ID, \ + opt::Option::KIND##Class, \ + PARAM, \ + FLAGS, \ + OBJDUMP_##GROUP, \ + OBJDUMP_##ALIAS, \ + ALIASARGS, \ + VALUES}, #include "ObjdumpOpts.inc" #undef OPTION }; @@ -149,8 +158,8 @@ 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) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ OTOOL_##ID, #include "OtoolOpts.inc" #undef OPTION @@ -165,12 +174,21 @@ #undef PREFIX static constexpr opt::OptTable::Info OtoolInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, \ - METAVAR, OTOOL_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OTOOL_##GROUP, \ - OTOOL_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ + {PREFIX, \ + NAME, \ + SPELLING, \ + HELPTEXT, \ + METAVAR, \ + OTOOL_##ID, \ + opt::Option::KIND##Class, \ + PARAM, \ + FLAGS, \ + OTOOL_##GROUP, \ + OTOOL_##ALIAS, \ + ALIASARGS, \ + VALUES}, #include "OtoolOpts.inc" #undef OPTION }; Index: llvm/tools/llvm-objdump/ObjdumpOptID.h =================================================================== --- llvm/tools/llvm-objdump/ObjdumpOptID.h +++ llvm/tools/llvm-objdump/ObjdumpOptID.h @@ -3,8 +3,8 @@ 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) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ OBJDUMP_##ID, #include "ObjdumpOpts.inc" #undef OPTION Index: llvm/tools/llvm-objcopy/ObjcopyOptions.cpp =================================================================== --- llvm/tools/llvm-objcopy/ObjcopyOptions.cpp +++ llvm/tools/llvm-objcopy/ObjcopyOptions.cpp @@ -30,8 +30,8 @@ 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) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ OBJCOPY_##ID, #include "ObjcopyOpts.inc" #undef OPTION @@ -46,12 +46,21 @@ #undef PREFIX static constexpr opt::OptTable::Info ObjcopyInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, \ - METAVAR, OBJCOPY_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, OBJCOPY_##GROUP, \ - OBJCOPY_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ + {PREFIX, \ + NAME, \ + SPELLING, \ + HELPTEXT, \ + METAVAR, \ + OBJCOPY_##ID, \ + opt::Option::KIND##Class, \ + PARAM, \ + FLAGS, \ + OBJCOPY_##GROUP, \ + OBJCOPY_##ALIAS, \ + ALIASARGS, \ + VALUES}, #include "ObjcopyOpts.inc" #undef OPTION }; @@ -66,8 +75,8 @@ 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) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ INSTALL_NAME_TOOL_##ID, #include "InstallNameToolOpts.inc" #undef OPTION @@ -83,10 +92,11 @@ #undef PREFIX static constexpr opt::OptTable::Info InstallNameToolInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ {PREFIX, \ NAME, \ + SPELLING, \ HELPTEXT, \ METAVAR, \ INSTALL_NAME_TOOL_##ID, \ @@ -110,8 +120,8 @@ 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) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ BITCODE_STRIP_##ID, #include "BitcodeStripOpts.inc" #undef OPTION @@ -127,10 +137,11 @@ #undef PREFIX static constexpr opt::OptTable::Info BitcodeStripInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ {PREFIX, \ NAME, \ + SPELLING, \ HELPTEXT, \ METAVAR, \ BITCODE_STRIP_##ID, \ @@ -154,8 +165,8 @@ 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) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ STRIP_##ID, #include "StripOpts.inc" #undef OPTION @@ -170,12 +181,21 @@ #undef PREFIX static constexpr opt::OptTable::Info StripInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, \ - METAVAR, STRIP_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, STRIP_##GROUP, \ - STRIP_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ + {PREFIX, \ + NAME, \ + SPELLING, \ + HELPTEXT, \ + METAVAR, \ + STRIP_##ID, \ + opt::Option::KIND##Class, \ + PARAM, \ + FLAGS, \ + STRIP_##GROUP, \ + STRIP_##ALIAS, \ + ALIASARGS, \ + VALUES}, #include "StripOpts.inc" #undef OPTION }; Index: llvm/tools/llvm-lipo/llvm-lipo.cpp =================================================================== --- llvm/tools/llvm-lipo/llvm-lipo.cpp +++ llvm/tools/llvm-lipo/llvm-lipo.cpp @@ -67,8 +67,8 @@ 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) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ LIPO_##ID, #include "LipoOpts.inc" #undef OPTION @@ -83,12 +83,21 @@ #undef PREFIX static constexpr opt::OptTable::Info LipoInfoTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELPTEXT, METAVAR, VALUES) \ - {PREFIX, NAME, HELPTEXT, \ - METAVAR, LIPO_##ID, opt::Option::KIND##Class, \ - PARAM, FLAGS, LIPO_##GROUP, \ - LIPO_##ALIAS, ALIASARGS, VALUES}, +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELPTEXT, METAVAR, VALUES) \ + {PREFIX, \ + NAME, \ + SPELLING, \ + HELPTEXT, \ + METAVAR, \ + LIPO_##ID, \ + opt::Option::KIND##Class, \ + PARAM, \ + FLAGS, \ + LIPO_##GROUP, \ + LIPO_##ALIAS, \ + ALIASARGS, \ + VALUES}, #include "LipoOpts.inc" #undef OPTION }; Index: llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h =================================================================== --- llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h +++ llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h @@ -26,7 +26,8 @@ enum { COFF_OPT_INVALID = 0, -#define OPTION(_1, _2, ID, _4, _5, _6, _7, _8, _9, _10, _11, _12) COFF_OPT_##ID, +#define OPTION(_1, _2, _3, ID, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + COFF_OPT_##ID, #include "COFFOptions.inc" #undef OPTION }; Index: llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp =================================================================== --- llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp +++ llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp @@ -37,19 +37,20 @@ // Create table mapping all options defined in COFFOptions.td static constexpr opt::OptTable::Info infoTable[] = { -#define OPTION(X1, X2, ID, KIND, GROUP, ALIAS, X7, X8, X9, X10, X11, X12) \ +#define OPTION(X1, X2, X3, ID, KIND, GROUP, ALIAS, X8, X9, X10, X11, X12, X13) \ {X1, \ X2, \ - X10, \ + X3, \ X11, \ + X12, \ COFF_OPT_##ID, \ opt::Option::KIND##Class, \ + X10, \ X9, \ - X8, \ COFF_OPT_##GROUP, \ COFF_OPT_##ALIAS, \ - X7, \ - X12}, + X8, \ + X13}, #include "COFFOptions.inc" #undef OPTION }; Index: llvm/include/llvm/Option/Option.h =================================================================== --- llvm/include/llvm/Option/Option.h +++ llvm/include/llvm/Option/Option.h @@ -100,6 +100,11 @@ return Info->Name; } + StringLiteral getSpelling() const { + assert(Info && "Must have a valid info!"); + return Info->Spelling; + } + const Option getGroup() const { assert(Info && "Must have a valid info!"); assert(Owner && "Must have a valid owner!"); Index: llvm/include/llvm/Option/OptTable.h =================================================================== --- llvm/include/llvm/Option/OptTable.h +++ llvm/include/llvm/Option/OptTable.h @@ -45,6 +45,7 @@ /// matching. ArrayRef<StringLiteral> Prefixes; StringRef Name; + StringLiteral Spelling; const char *HelpText; const char *MetaVar; unsigned ID; Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -427,10 +427,10 @@ } #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, \ - KEYPATH, DEFAULT_VALUE, IMPLIED_CHECK, IMPLIED_VALUE, NORMALIZER, \ - DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX) \ + ARGS, DIAGS, PREFIX_TYPE, NAME, 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) { \ KEYPATH = MERGER(KEYPATH, DEFAULT_VALUE); \ if (IMPLIED_CHECK) \ @@ -444,10 +444,10 @@ // 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) \ + ARGS, STRING_ALLOCATOR, PREFIX_TYPE, NAME, 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 || \ Index: clang-tools-extra/clangd/CompileCommands.cpp =================================================================== --- clang-tools-extra/clangd/CompileCommands.cpp +++ clang-tools-extra/clangd/CompileCommands.cpp @@ -493,8 +493,8 @@ static constexpr llvm::StringLiteral NAME##_init[] = VALUE; \ static constexpr llvm::ArrayRef<llvm::StringLiteral> NAME( \ NAME##_init, std::size(NAME##_init) - 1); -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELP, METAVAR, VALUES) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ Prefixes[DriverID::OPT_##ID] = PREFIX; #include "clang/Driver/Options.inc" #undef OPTION @@ -505,8 +505,8 @@ DriverID AliasID; const void *AliasArgs; } AliasTable[] = { -#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ - HELP, METAVAR, VALUES) \ +#define OPTION(PREFIX, NAME, SPELLING, ID, KIND, GROUP, ALIAS, ALIASARGS, \ + FLAGS, PARAM, HELP, METAVAR, VALUES) \ {DriverID::OPT_##ID, DriverID::OPT_##ALIAS, ALIASARGS}, #include "clang/Driver/Options.inc" #undef OPTION
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits