Author: Jan Svoboda
Date: 2023-08-04T13:57:13-07:00
New Revision: 3f092f37b7362447cbb13f5502dae4bdd5762afd

URL: 
https://github.com/llvm/llvm-project/commit/3f092f37b7362447cbb13f5502dae4bdd5762afd
DIFF: 
https://github.com/llvm/llvm-project/commit/3f092f37b7362447cbb13f5502dae4bdd5762afd.diff

LOG: [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

Added: 
    

Modified: 
    clang/include/clang/Driver/Options.h
    clang/lib/Driver/DriverOptions.cpp
    clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
    clang/tools/clang-scan-deps/ClangScanDeps.cpp
    lld/COFF/Driver.h
    lld/COFF/DriverUtils.cpp
    lld/ELF/Driver.h
    lld/ELF/DriverUtils.cpp
    lld/MachO/Driver.h
    lld/MinGW/Driver.cpp
    lld/wasm/Driver.cpp
    lldb/tools/driver/Driver.cpp
    lldb/tools/lldb-server/lldb-gdbserver.cpp
    lldb/tools/lldb-vscode/lldb-vscode.cpp
    llvm/include/llvm/Option/OptTable.h
    llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp
    llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.h
    llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
    llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
    llvm/tools/dsymutil/dsymutil.cpp
    llvm/tools/llvm-cvtres/llvm-cvtres.cpp
    llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
    llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp
    llvm/tools/llvm-dwarfutil/llvm-dwarfutil.cpp
    llvm/tools/llvm-dwp/llvm-dwp.cpp
    llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
    llvm/tools/llvm-ifs/llvm-ifs.cpp
    llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
    llvm/tools/llvm-lipo/llvm-lipo.cpp
    llvm/tools/llvm-ml/llvm-ml.cpp
    llvm/tools/llvm-mt/llvm-mt.cpp
    llvm/tools/llvm-nm/llvm-nm.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/tools/llvm-readobj/llvm-readobj.cpp
    llvm/tools/llvm-size/llvm-size.cpp
    llvm/tools/llvm-strings/llvm-strings.cpp
    llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
    llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp
    llvm/tools/sancov/sancov.cpp
    llvm/unittests/Option/OptionParsingTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Driver/Options.h 
b/clang/include/clang/Driver/Options.h
index 54c6f5faa37c22..fb0e536d972cbf 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 {
@@ -43,9 +39,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 2a6868d179159d..b25801a8f3f494 100644
--- a/clang/lib/Driver/DriverOptions.cpp
+++ b/clang/lib/Driver/DriverOptions.cpp
@@ -36,10 +36,7 @@ static constexpr const llvm::ArrayRef<llvm::StringLiteral>
     PrefixTable(PrefixTable_init, std::size(PrefixTable_init) - 1);
 
 static constexpr 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 c553cf86da8e32..aea6792f1f3b84 100644
--- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
+++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
@@ -117,9 +117,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
@@ -133,10 +131,7 @@ enum ID {
 #undef PREFIX
 
 static constexpr 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/clang/tools/clang-scan-deps/ClangScanDeps.cpp 
b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
index 8c863bcc5b2b6e..3baf58725cb22d 100644
--- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -43,9 +43,7 @@ namespace {
 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
 };
@@ -58,12 +56,7 @@ enum ID {
 #undef PREFIX
 
 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 "Opts.inc"
 #undef OPTION
 };

diff  --git a/lld/COFF/Driver.h b/lld/COFF/Driver.h
index 17d2e6a483dc33..549407539cdde9 100644
--- a/lld/COFF/Driver.h
+++ b/lld/COFF/Driver.h
@@ -272,7 +272,7 @@ class LinkerDriver {
 // 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 d859911c2321e2..ca9f8a47b0235f 100644
--- a/lld/COFF/DriverUtils.cpp
+++ b/lld/COFF/DriverUtils.cpp
@@ -818,9 +818,7 @@ MemoryBufferRef 
LinkerDriver::convertResToCOFF(ArrayRef<MemoryBufferRef> mbs,
 
 // Create table mapping all options defined in Options.td
 static constexpr 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 16cb52229e71f7..29a2b04af71174 100644
--- a/lld/ELF/Driver.h
+++ b/lld/ELF/Driver.h
@@ -25,7 +25,7 @@ class ELFOptTable : public llvm::opt::GenericOptTable {
 // 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 5e3f6d1459d8e6..0a27422e3b2df8 100644
--- a/lld/ELF/DriverUtils.cpp
+++ b/lld/ELF/DriverUtils.cpp
@@ -43,9 +43,7 @@ using namespace lld::elf;
 
 // Create table mapping all options defined in Options.td
 static constexpr 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 bed752ff6258d6..fe97324e3a35ec 100644
--- a/lld/MachO/Driver.h
+++ b/lld/MachO/Driver.h
@@ -35,7 +35,7 @@ class MachOOptTable : public llvm::opt::GenericOptTable {
 // 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 a5b83d2f12ca1d..67c45051a703a8 100644
--- a/lld/MinGW/Driver.cpp
+++ b/lld/MinGW/Driver.cpp
@@ -56,7 +56,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 8e2c93772abda6..b0d6d1147e6b0b 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -50,7 +50,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 b14d15602aba31..3460842ea8d197 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
 };
@@ -67,13 +65,7 @@ enum ID {
 #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,     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 8d0346c1c0c454..0b829d2d0f0540 100644
--- a/lldb/tools/lldb-server/lldb-gdbserver.cpp
+++ b/lldb/tools/lldb-server/lldb-gdbserver.cpp
@@ -274,9 +274,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
 };
@@ -289,13 +287,7 @@ enum ID {
 #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,     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 1680bead2491fd..b6917a37d83174 100644
--- a/lldb/tools/lldb-vscode/lldb-vscode.cpp
+++ b/lldb/tools/lldb-vscode/lldb-vscode.cpp
@@ -53,6 +53,7 @@
 #include "llvm/ADT/StringExtras.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"
@@ -77,9 +78,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
 };
@@ -92,12 +91,7 @@ enum ID {
 #undef PREFIX
 
 static constexpr 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 6f3d6032e59ac5..ef7d05d6a1ee99 100644
--- a/llvm/include/llvm/Option/OptTable.h
+++ b/llvm/include/llvm/Option/OptTable.h
@@ -298,4 +298,31 @@ class PrecomputedOptTable : public 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 {                                                  
\
+    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_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OPT_, PREFIX, NAME, ID, KIND, GROUP,  
\
+                                         ALIAS, ALIASARGS, FLAGS, PARAM,       
\
+                                         HELPTEXT, METAVAR, VALUES)
+
 #endif // LLVM_OPTION_OPTTABLE_H

diff  --git a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp 
b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp
index 30c1579a1ba074..957c879cf7559f 100644
--- a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp
@@ -37,19 +37,8 @@ static constexpr const ArrayRef<StringLiteral>
 
 // 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)      
\
-  {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 5c953da7581fd5..21808f0afcb5eb 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 39bb8dd8ec858b..df05f507ef0c70 100644
--- a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
+++ b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp
@@ -17,6 +17,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/Path.h"
 #include "llvm/TargetParser/Host.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
 };
@@ -45,9 +46,7 @@ enum {
 #undef PREFIX
 
 static constexpr 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 747e4c5928eac1..d158795d7bb803 100644
--- a/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
+++ b/llvm/lib/ToolDrivers/llvm-lib/LibDriver.cpp
@@ -23,6 +23,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"
@@ -38,7 +39,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
 };
@@ -51,9 +52,7 @@ enum {
 #undef PREFIX
 
 static constexpr 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 5a8d2196c5ff82..6f1e06cf2f6591 100644
--- a/llvm/tools/dsymutil/dsymutil.cpp
+++ b/llvm/tools/dsymutil/dsymutil.cpp
@@ -59,9 +59,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
 };
@@ -74,13 +72,7 @@ enum ID {
 #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,     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 9040237278a83b..0bc1bcb84822ef 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
 };
@@ -52,13 +50,7 @@ enum ID {
 #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,     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 2bbd57f14d9983..17476293de2744 100644
--- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
+++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
@@ -27,9 +27,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
 };
@@ -42,13 +40,7 @@ enum ID {
 #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,     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-debuginfod/llvm-debuginfod.cpp 
b/llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp
index 725b810595268c..cc1f38c4e2b42f 100644
--- a/llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp
+++ b/llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp
@@ -31,9 +31,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
 };
@@ -46,13 +44,7 @@ enum ID {
 #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,     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 1c762717979543..08ff4c53c436aa 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
 };
@@ -48,13 +46,7 @@ enum ID {
 #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,     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-dwp/llvm-dwp.cpp 
b/llvm/tools/llvm-dwp/llvm-dwp.cpp
index 01fd45857489b3..af5621e24b65d3 100644
--- a/llvm/tools/llvm-dwp/llvm-dwp.cpp
+++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp
@@ -43,9 +43,7 @@ static mc::RegisterMCTargetOptionsFlags MCTargetOptionsFlags;
 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
 };
@@ -58,13 +56,7 @@ enum ID {
 #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,     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-gsymutil/llvm-gsymutil.cpp 
b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
index 47e3d4559a1d6a..94b4f2e88faa7d 100644
--- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
+++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
@@ -58,9 +58,7 @@ using namespace object;
 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
 };
@@ -73,13 +71,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-ifs/llvm-ifs.cpp 
b/llvm/tools/llvm-ifs/llvm-ifs.cpp
index 0d2744f9a33b0e..ed660bc13490da 100644
--- a/llvm/tools/llvm-ifs/llvm-ifs.cpp
+++ b/llvm/tools/llvm-ifs/llvm-ifs.cpp
@@ -54,9 +54,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
 };
@@ -69,13 +67,7 @@ enum ID {
 #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,     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-libtool-darwin/llvm-libtool-darwin.cpp 
b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
index 9ca0887527e688..5e0ba139dd6bbf 100644
--- a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
+++ b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
@@ -44,9 +44,7 @@ using namespace llvm::opt;
 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
 };
@@ -59,13 +57,7 @@ enum ID {
 #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,     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 d37df628475d5a..82b8b3dbb03d13 100644
--- a/llvm/tools/llvm-lipo/llvm-lipo.cpp
+++ b/llvm/tools/llvm-lipo/llvm-lipo.cpp
@@ -67,9 +67,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
 };
@@ -83,12 +81,7 @@ namespace lipo {
 #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(...) 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 34691c435d82ca..f8e4734be63658 100644
--- a/llvm/tools/llvm-ml/llvm-ml.cpp
+++ b/llvm/tools/llvm-ml/llvm-ml.cpp
@@ -53,9 +53,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
 };
@@ -68,13 +66,7 @@ enum ID {
 #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,     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 887cc9056b607e..f3283a4a5a7c2e 100644
--- a/llvm/tools/llvm-mt/llvm-mt.cpp
+++ b/llvm/tools/llvm-mt/llvm-mt.cpp
@@ -35,9 +35,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
 };
@@ -50,13 +48,7 @@ enum ID {
 #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,     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 10ce7fd95a6abd..9accf5681e83c3 100644
--- a/llvm/tools/llvm-nm/llvm-nm.cpp
+++ b/llvm/tools/llvm-nm/llvm-nm.cpp
@@ -58,9 +58,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
 };
@@ -73,13 +71,7 @@ enum ID {
 #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,     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 2e0c3ca8671aa1..02b7790ecb3e78 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
 };
@@ -46,12 +44,8 @@ namespace objcopy_opt {
 #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(...)                                                            
\
+  LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OBJCOPY_, __VA_ARGS__),
 #include "ObjcopyOpts.inc"
 #undef OPTION
 };
@@ -66,9 +60,8 @@ class ObjcopyOptTable : public opt::GenericOptTable {
 
 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
 };
@@ -83,20 +76,8 @@ namespace install_name_tool {
 #undef PREFIX
 
 static constexpr opt::OptTable::Info InstallNameToolInfoTable[] = {
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,  
\
-               HELPTEXT, METAVAR, VALUES)                                      
\
-  {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
 };
@@ -110,9 +91,8 @@ class InstallNameToolOptTable : public opt::GenericOptTable {
 
 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
 };
@@ -127,20 +107,8 @@ namespace bitcode_strip {
 #undef PREFIX
 
 static constexpr opt::OptTable::Info BitcodeStripInfoTable[] = {
-#define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,  
\
-               HELPTEXT, METAVAR, VALUES)                                      
\
-  {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
 };
@@ -154,9 +122,7 @@ class BitcodeStripOptTable : public opt::GenericOptTable {
 
 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
 };
@@ -170,12 +136,7 @@ namespace strip {
 #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(...) 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 65f6c60ad884f6..fc90cb5c8f0408 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 67b7dd02361529..7813ff0b5523c1 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -128,12 +128,8 @@ namespace objdump_opt {
 #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(...)                                                            
\
+  LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OBJDUMP_, __VA_ARGS__),
 #include "ObjdumpOpts.inc"
 #undef OPTION
 };
@@ -149,9 +145,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
 };
@@ -165,12 +159,7 @@ namespace otool {
 #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(...) LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(OTOOL_, 
__VA_ARGS__),
 #include "OtoolOpts.inc"
 #undef OPTION
 };

diff  --git a/llvm/tools/llvm-rc/llvm-rc.cpp b/llvm/tools/llvm-rc/llvm-rc.cpp
index a476a659f856c2..3a151cc600b676 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"
@@ -50,9 +51,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
 };
@@ -66,13 +65,7 @@ namespace rc_opt {
 #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,     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
 };
@@ -85,9 +78,7 @@ class RcOptTable : public opt::GenericOptTable {
 
 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
 };
@@ -101,12 +92,8 @@ namespace windres_opt {
 #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(...)                                                            
\
+  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 d72eec04d06ae2..8a10df4beb13f5 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
 };
@@ -70,13 +68,7 @@ enum ID {
 #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,     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 048a98b9af7d1d..c0d1a1b104b891 100644
--- a/llvm/tools/llvm-size/llvm-size.cpp
+++ b/llvm/tools/llvm-size/llvm-size.cpp
@@ -41,9 +41,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
 };
@@ -56,13 +54,7 @@ enum ID {
 #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,     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 d9bc34ee621ad6..9a727205e834a0 100644
--- a/llvm/tools/llvm-strings/llvm-strings.cpp
+++ b/llvm/tools/llvm-strings/llvm-strings.cpp
@@ -33,9 +33,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
 };
@@ -48,13 +46,7 @@ enum ID {
 #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,     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 3e342a4db9ce4d..811aeae9162117 100644
--- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -50,9 +50,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
 };
@@ -65,13 +63,7 @@ enum ID {
 #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,     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 9cc18f80910d45..2adce18c85fc0b 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
 };
@@ -43,13 +41,7 @@ enum ID {
 #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,     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/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp
index b33bb0eae7c62e..d30bdf3e5c60d2 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -63,9 +63,7 @@ namespace {
 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
 };
@@ -78,13 +76,7 @@ enum ID {
 #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,     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 c1150c806b920c..e6ca41005c522c 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
@@ -47,10 +45,7 @@ enum OptionFlags {
 };
 
 static constexpr 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
 };


        
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to