nhaehnle created this revision.
Herald added subscribers: libc-commits, Moerafaat, zero9178, bzcheeseman, 
sdasgup3, wenzhicui, wrengr, cota, teijeong, rdzhabarov, tatianashp, msifontes, 
jurahul, Kayjukh, grosul1, Joonsoo, liufengdb, aartbik, mgester, arpith-jacob, 
antiagainst, shauheen, rriddle, mehdi_amini, hiraditya.
Herald added projects: libc-project, All.
nhaehnle requested review of this revision.
Herald added subscribers: lldb-commits, cfe-commits, stephenneuendorffer, 
nicolasvasilache.
Herald added projects: clang, LLDB, MLIR, LLVM.

We plan to include the TableGen library into the LLVM shared library.
This is a preparatory change to avoid polluting the command-line options
space of non-tablegen tools.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D138276

Files:
  clang/utils/TableGen/TableGen.cpp
  libc/utils/HdrGen/Main.cpp
  libc/utils/HdrGen/PrototypeTestGen/PrototypeTestGen.cpp
  libc/utils/tools/WrapperGen/Main.cpp
  lldb/utils/TableGen/LLDBTableGen.cpp
  llvm/include/llvm/TableGen/Main.h
  llvm/lib/TableGen/Main.cpp
  llvm/tools/llvm-shlib/CMakeLists.txt
  llvm/utils/TableGen/TableGen.cpp
  mlir/lib/Tools/mlir-tblgen/MlirTblgenMain.cpp

Index: mlir/lib/Tools/mlir-tblgen/MlirTblgenMain.cpp
===================================================================
--- mlir/lib/Tools/mlir-tblgen/MlirTblgenMain.cpp
+++ mlir/lib/Tools/mlir-tblgen/MlirTblgenMain.cpp
@@ -129,6 +129,7 @@
   llvm::cl::opt<const mlir::GenInfo *, true, mlir::GenNameParser> generator(
       "", llvm::cl::desc("Generator to run"), cl::location(::generator));
 
+  llvm::registerTableGenOptions();
   cl::ParseCommandLineOptions(argc, argv);
 
   return TableGenMain(argv[0], &mlirTableGenMain);
Index: llvm/utils/TableGen/TableGen.cpp
===================================================================
--- llvm/utils/TableGen/TableGen.cpp
+++ llvm/utils/TableGen/TableGen.cpp
@@ -286,6 +286,7 @@
 
 int main(int argc, char **argv) {
   InitLLVM X(argc, argv);
+  registerTableGenOptions();
   cl::ParseCommandLineOptions(argc, argv);
 
   return TableGenMain(argv[0], &LLVMTableGenMain);
Index: llvm/tools/llvm-shlib/CMakeLists.txt
===================================================================
--- llvm/tools/llvm-shlib/CMakeLists.txt
+++ llvm/tools/llvm-shlib/CMakeLists.txt
@@ -19,7 +19,6 @@
 
   # Exclude libLLVMTableGen for the following reasons:
   #  - it is only used by internal *-tblgen utilities;
-  #  - it pollutes the global options space.
   list(REMOVE_ITEM LIB_NAMES "LLVMTableGen")
 
   if(LLVM_DYLIB_EXPORTED_SYMBOL_FILE)
Index: llvm/lib/TableGen/Main.cpp
===================================================================
--- llvm/lib/TableGen/Main.cpp
+++ llvm/lib/TableGen/Main.cpp
@@ -26,36 +26,45 @@
 #include <system_error>
 using namespace llvm;
 
-static cl::opt<std::string>
-OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"),
-               cl::init("-"));
+namespace {
 
-static cl::opt<std::string>
-DependFilename("d",
-               cl::desc("Dependency filename"),
-               cl::value_desc("filename"),
-               cl::init(""));
+struct TableGenOptions {
+  cl::opt<std::string> OutputFilename{"o", cl::desc("Output filename"),
+                                      cl::value_desc("filename"),
+                                      cl::init("-")};
 
-static cl::opt<std::string>
-InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
+  cl::opt<std::string> DependFilename{"d", cl::desc("Dependency filename"),
+                                      cl::value_desc("filename"), cl::init("")};
 
-static cl::list<std::string>
-IncludeDirs("I", cl::desc("Directory of include files"),
-            cl::value_desc("directory"), cl::Prefix);
+  cl::opt<std::string> InputFilename{cl::Positional, cl::desc("<input file>"),
+                                     cl::init("-")};
 
-static cl::list<std::string>
-MacroNames("D", cl::desc("Name of the macro to be defined"),
-            cl::value_desc("macro name"), cl::Prefix);
+  cl::list<std::string> IncludeDirs{"I", cl::desc("Directory of include files"),
+                                    cl::value_desc("directory"), cl::Prefix};
 
-static cl::opt<bool>
-WriteIfChanged("write-if-changed", cl::desc("Only write output if it changed"));
+  cl::list<std::string> MacroNames{"D",
+                                   cl::desc("Name of the macro to be defined"),
+                                   cl::value_desc("macro name"), cl::Prefix};
 
-static cl::opt<bool>
-TimePhases("time-phases", cl::desc("Time phases of parser and backend"));
+  cl::opt<bool> WriteIfChanged{"write-if-changed",
+                               cl::desc("Only write output if it changed")};
 
-static cl::opt<bool> NoWarnOnUnusedTemplateArgs(
-    "no-warn-on-unused-template-args",
-    cl::desc("Disable unused template argument warnings."));
+  cl::opt<bool> TimePhases{"time-phases",
+                           cl::desc("Time phases of parser and backend")};
+
+  cl::opt<bool> NoWarnOnUnusedTemplateArgs{
+      "no-warn-on-unused-template-args",
+      cl::desc("Disable unused template argument warnings.")};
+};
+
+TableGenOptions &getOpts() {
+  static TableGenOptions Opts;
+  return Opts;
+}
+
+} // anonymous namespace
+
+void llvm::registerTableGenOptions() { (void)getOpts(); }
 
 static int reportError(const char *ProgName, Twine Msg) {
   errs() << ProgName << ": " << Msg;
@@ -68,15 +77,15 @@
 /// This functionality is really only for the benefit of the build system.
 /// It is similar to GCC's `-M*` family of options.
 static int createDependencyFile(const TGParser &Parser, const char *argv0) {
-  if (OutputFilename == "-")
+  if (getOpts().OutputFilename == "-")
     return reportError(argv0, "the option -d must be used together with -o\n");
 
   std::error_code EC;
-  ToolOutputFile DepOut(DependFilename, EC, sys::fs::OF_Text);
+  ToolOutputFile DepOut(getOpts().DependFilename, EC, sys::fs::OF_Text);
   if (EC)
-    return reportError(argv0, "error opening " + DependFilename + ":" +
-                                  EC.message() + "\n");
-  DepOut.os() << OutputFilename << ":";
+    return reportError(argv0, "error opening " + getOpts().DependFilename +
+                                  ":" + EC.message() + "\n");
+  DepOut.os() << getOpts().OutputFilename << ":";
   for (const auto &Dep : Parser.getDependencies()) {
     DepOut.os() << ' ' << Dep;
   }
@@ -88,28 +97,31 @@
 int llvm::TableGenMain(const char *argv0, TableGenMainFn *MainFn) {
   RecordKeeper Records;
 
-  if (TimePhases)
+  if (getOpts().TimePhases)
     Records.startPhaseTiming();
 
   // Parse the input file.
 
   Records.startTimer("Parse, build records");
   ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr =
-      MemoryBuffer::getFileOrSTDIN(InputFilename, /*IsText=*/true);
-  if (std::error_code EC = FileOrErr.getError())
-    return reportError(argv0, "Could not open input file '" + InputFilename +
+      MemoryBuffer::getFileOrSTDIN(getOpts().InputFilename, /*IsText=*/true);
+  if (std::error_code EC = FileOrErr.getError()) {
+    return reportError(argv0, "Could not open input file '" +
+                                  getOpts().InputFilename +
                                   "': " + EC.message() + "\n");
+  }
 
-  Records.saveInputFilename(InputFilename);
+  Records.saveInputFilename(getOpts().InputFilename);
 
   // Tell SrcMgr about this buffer, which is what TGParser will pick up.
   SrcMgr.AddNewSourceBuffer(std::move(*FileOrErr), SMLoc());
 
   // Record the location of the include directory so that the lexer can find
   // it later.
-  SrcMgr.setIncludeDirs(IncludeDirs);
+  SrcMgr.setIncludeDirs(getOpts().IncludeDirs);
 
-  TGParser Parser(SrcMgr, MacroNames, Records, NoWarnOnUnusedTemplateArgs);
+  TGParser Parser(SrcMgr, getOpts().MacroNames, Records,
+                  getOpts().NoWarnOnUnusedTemplateArgs);
 
   if (Parser.ParseFile())
     return 1;
@@ -128,28 +140,28 @@
   // If it's missing, Ninja considers the output dirty.  If this was below
   // the early exit below and someone deleted the .inc.d file but not the .inc
   // file, tablegen would never write the depfile.
-  if (!DependFilename.empty()) {
+  if (!getOpts().DependFilename.empty()) {
     if (int Ret = createDependencyFile(Parser, argv0))
       return Ret;
   }
 
   Records.startTimer("Write output");
   bool WriteFile = true;
-  if (WriteIfChanged) {
+  if (getOpts().WriteIfChanged) {
     // Only updates the real output file if there are any differences.
     // This prevents recompilation of all the files depending on it if there
     // aren't any.
     if (auto ExistingOrErr =
-            MemoryBuffer::getFile(OutputFilename, /*IsText=*/true))
+            MemoryBuffer::getFile(getOpts().OutputFilename, /*IsText=*/true))
       if (std::move(ExistingOrErr.get())->getBuffer() == Out.str())
         WriteFile = false;
   }
   if (WriteFile) {
     std::error_code EC;
-    ToolOutputFile OutFile(OutputFilename, EC, sys::fs::OF_Text);
+    ToolOutputFile OutFile(getOpts().OutputFilename, EC, sys::fs::OF_Text);
     if (EC)
-      return reportError(argv0, "error opening " + OutputFilename + ": " +
-                                    EC.message() + "\n");
+      return reportError(argv0, "error opening " + getOpts().OutputFilename +
+                                    ": " + EC.message() + "\n");
     OutFile.os() << Out.str();
     if (ErrorsPrinted == 0)
       OutFile.keep();
Index: llvm/include/llvm/TableGen/Main.h
===================================================================
--- llvm/include/llvm/TableGen/Main.h
+++ llvm/include/llvm/TableGen/Main.h
@@ -18,6 +18,8 @@
 class raw_ostream;
 class RecordKeeper;
 
+void registerTableGenOptions();
+
 /// Perform the action using Records, and write output to OS.
 /// Returns true on error, false otherwise.
 using TableGenMainFn = bool (raw_ostream &OS, RecordKeeper &Records);
Index: lldb/utils/TableGen/LLDBTableGen.cpp
===================================================================
--- lldb/utils/TableGen/LLDBTableGen.cpp
+++ lldb/utils/TableGen/LLDBTableGen.cpp
@@ -66,6 +66,7 @@
 int main(int argc, char **argv) {
   sys::PrintStackTraceOnErrorSignal(argv[0]);
   PrettyStackTraceProgram X(argc, argv);
+  registerTableGenOptions();
   cl::ParseCommandLineOptions(argc, argv);
 
   llvm_shutdown_obj Y;
Index: libc/utils/tools/WrapperGen/Main.cpp
===================================================================
--- libc/utils/tools/WrapperGen/Main.cpp
+++ libc/utils/tools/WrapperGen/Main.cpp
@@ -193,6 +193,7 @@
 }
 
 int main(int argc, char *argv[]) {
+  llvm::registerTableGenOptions();
   llvm::cl::ParseCommandLineOptions(argc, argv);
-  return TableGenMain(argv[0], wrapperGenMain);
+  return llvm::TableGenMain(argv[0], wrapperGenMain);
 }
Index: libc/utils/HdrGen/PrototypeTestGen/PrototypeTestGen.cpp
===================================================================
--- libc/utils/HdrGen/PrototypeTestGen/PrototypeTestGen.cpp
+++ libc/utils/HdrGen/PrototypeTestGen/PrototypeTestGen.cpp
@@ -100,6 +100,7 @@
 }
 
 int main(int argc, char *argv[]) {
+  llvm::registerTableGenOptions();
   llvm::cl::ParseCommandLineOptions(argc, argv);
-  return TableGenMain(argv[0], TestGeneratorMain);
+  return llvm::TableGenMain(argv[0], TestGeneratorMain);
 }
Index: libc/utils/HdrGen/Main.cpp
===================================================================
--- libc/utils/HdrGen/Main.cpp
+++ libc/utils/HdrGen/Main.cpp
@@ -56,6 +56,7 @@
 } // namespace llvm_libc
 
 int main(int argc, char *argv[]) {
+  llvm::registerTableGenOptions();
   llvm::cl::ParseCommandLineOptions(argc, argv);
-  return TableGenMain(argv[0], &llvm_libc::HeaderGeneratorMain);
+  return llvm::TableGenMain(argv[0], &llvm_libc::HeaderGeneratorMain);
 }
Index: clang/utils/TableGen/TableGen.cpp
===================================================================
--- clang/utils/TableGen/TableGen.cpp
+++ clang/utils/TableGen/TableGen.cpp
@@ -489,6 +489,7 @@
 int main(int argc, char **argv) {
   sys::PrintStackTraceOnErrorSignal(argv[0]);
   PrettyStackTraceProgram X(argc, argv);
+  registerTableGenOptions();
   cl::ParseCommandLineOptions(argc, argv);
 
   llvm_shutdown_obj Y;
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits] [PATCH] D1... Nicolai Hähnle via Phabricator via lldb-commits

Reply via email to