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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits