diff options
author | serge-sans-paille <sguelton@mozilla.com> | 2022-12-12 17:02:15 +0100 |
---|---|---|
committer | serge-sans-paille <sguelton@mozilla.com> | 2022-12-24 10:25:06 +0100 |
commit | e953ae5bbc313fd0cc980ce021d487e5b5199ea4 (patch) | |
tree | fb51db9062601309046a935536885434765ab500 /llvm/tools/llvm-objcopy | |
parent | 83d4851436904c005ff0831e38e1814a0a8f00ac (diff) | |
download | llvm-e953ae5bbc313fd0cc980ce021d487e5b5199ea4.zip llvm-e953ae5bbc313fd0cc980ce021d487e5b5199ea4.tar.gz llvm-e953ae5bbc313fd0cc980ce021d487e5b5199ea4.tar.bz2 |
[clang] Use a StringRef instead of a raw char pointer to store builtin and call information
This avoids recomputing string length that is already known at compile
time.
It has a slight impact on preprocessing / compile time, see
https://llvm-compile-time-tracker.com/compare.php?from=3f36d2d579d8b0e8824d9dd99bfa79f456858f88&to=e49640c507ddc6615b5e503144301c8e41f8f434&stat=instructions:u
This is a recommit of 719d98dfa841c522d8d452f0685e503538415a53 that into
account a GGC issue (probably
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92181) when dealing with
intiailizer_list and constant expressions.
Workaround this by avoiding initializer list, at the expense of a
temporary plain old array.
Differential Revision: https://reviews.llvm.org/D139881
Diffstat (limited to 'llvm/tools/llvm-objcopy')
-rw-r--r-- | llvm/tools/llvm-objcopy/ObjcopyOptions.cpp | 68 |
1 files changed, 42 insertions, 26 deletions
diff --git a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp index bf39f8c..8cc18ad 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp +++ b/llvm/tools/llvm-objcopy/ObjcopyOptions.cpp @@ -36,32 +36,29 @@ enum ObjcopyID { #undef OPTION }; -#define PREFIX(NAME, VALUE) const char *const OBJCOPY_##NAME[] = VALUE; +namespace objcopy_opt { +#define PREFIX(NAME, VALUE) \ + static constexpr StringLiteral NAME##_init[] = VALUE; \ + static constexpr ArrayRef<StringLiteral> NAME(NAME##_init, \ + std::size(NAME##_init) - 1); #include "ObjcopyOpts.inc" #undef PREFIX static constexpr 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}, + {PREFIX, NAME, HELPTEXT, \ + METAVAR, OBJCOPY_##ID, opt::Option::KIND##Class, \ + PARAM, FLAGS, OBJCOPY_##GROUP, \ + OBJCOPY_##ALIAS, ALIASARGS, VALUES}, #include "ObjcopyOpts.inc" #undef OPTION }; +} // namespace objcopy_opt class ObjcopyOptTable : public opt::OptTable { public: - ObjcopyOptTable() : OptTable(ObjcopyInfoTable) { + ObjcopyOptTable() : OptTable(objcopy_opt::ObjcopyInfoTable) { setGroupedShortOptions(true); } }; @@ -75,15 +72,19 @@ enum InstallNameToolID { #undef OPTION }; +namespace install_name_tool { + #define PREFIX(NAME, VALUE) \ - const char *const INSTALL_NAME_TOOL_##NAME[] = VALUE; + static constexpr StringLiteral NAME##_init[] = VALUE; \ + static constexpr ArrayRef<StringLiteral> NAME(NAME##_init, \ + std::size(NAME##_init) - 1); #include "InstallNameToolOpts.inc" #undef PREFIX static constexpr opt::OptTable::Info InstallNameToolInfoTable[] = { #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES) \ - {INSTALL_NAME_TOOL_##PREFIX, \ + {PREFIX, \ NAME, \ HELPTEXT, \ METAVAR, \ @@ -98,10 +99,12 @@ static constexpr opt::OptTable::Info InstallNameToolInfoTable[] = { #include "InstallNameToolOpts.inc" #undef OPTION }; +} // namespace install_name_tool class InstallNameToolOptTable : public opt::OptTable { public: - InstallNameToolOptTable() : OptTable(InstallNameToolInfoTable) {} + InstallNameToolOptTable() + : OptTable(install_name_tool::InstallNameToolInfoTable) {} }; enum BitcodeStripID { @@ -113,14 +116,19 @@ enum BitcodeStripID { #undef OPTION }; -#define PREFIX(NAME, VALUE) const char *const BITCODE_STRIP_##NAME[] = VALUE; +namespace bitcode_strip { + +#define PREFIX(NAME, VALUE) \ + static constexpr StringLiteral NAME##_init[] = VALUE; \ + static constexpr ArrayRef<StringLiteral> NAME(NAME##_init, \ + std::size(NAME##_init) - 1); #include "BitcodeStripOpts.inc" #undef PREFIX static constexpr opt::OptTable::Info BitcodeStripInfoTable[] = { #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM, \ HELPTEXT, METAVAR, VALUES) \ - {BITCODE_STRIP_##PREFIX, \ + {PREFIX, \ NAME, \ HELPTEXT, \ METAVAR, \ @@ -135,10 +143,11 @@ static constexpr opt::OptTable::Info BitcodeStripInfoTable[] = { #include "BitcodeStripOpts.inc" #undef OPTION }; +} // namespace bitcode_strip class BitcodeStripOptTable : public opt::OptTable { public: - BitcodeStripOptTable() : OptTable(BitcodeStripInfoTable) {} + BitcodeStripOptTable() : OptTable(bitcode_strip::BitcodeStripInfoTable) {} }; enum StripID { @@ -150,24 +159,31 @@ enum StripID { #undef OPTION }; -#define PREFIX(NAME, VALUE) const char *const STRIP_##NAME[] = VALUE; +namespace strip { +#define PREFIX(NAME, VALUE) \ + static constexpr StringLiteral NAME##_init[] = VALUE; \ + static constexpr ArrayRef<StringLiteral> NAME(NAME##_init, \ + std::size(NAME##_init) - 1); #include "StripOpts.inc" #undef PREFIX static constexpr 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}, + {PREFIX, NAME, HELPTEXT, \ + METAVAR, STRIP_##ID, opt::Option::KIND##Class, \ + PARAM, FLAGS, STRIP_##GROUP, \ + STRIP_##ALIAS, ALIASARGS, VALUES}, #include "StripOpts.inc" #undef OPTION }; +} // namespace strip class StripOptTable : public opt::OptTable { public: - StripOptTable() : OptTable(StripInfoTable) { setGroupedShortOptions(true); } + StripOptTable() : OptTable(strip::StripInfoTable) { + setGroupedShortOptions(true); + } }; } // namespace |