diff options
author | Chris Lattner <sabre@nondot.org> | 2003-06-03 05:04:42 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-06-03 05:04:42 +0000 |
commit | 9a886386a4067a2407a284c947bd1044b43e2b1b (patch) | |
tree | 5b0b901b1f568c39c2df868f0d4c3cb9687bdb1b /support/tools/TableGen/TableGen.cpp | |
parent | bc52013e30f69655f941313c3fa1a2c18de5b7ab (diff) |
Add -o support for TableGen
I figure that misha has done a lot of things on my todo list, the least I
can do is reciprocate a bit. :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6571 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'support/tools/TableGen/TableGen.cpp')
-rw-r--r-- | support/tools/TableGen/TableGen.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/support/tools/TableGen/TableGen.cpp b/support/tools/TableGen/TableGen.cpp index b6d1810302..aebf6077e8 100644 --- a/support/tools/TableGen/TableGen.cpp +++ b/support/tools/TableGen/TableGen.cpp @@ -1,7 +1,9 @@ #include "Record.h" #include "Support/CommandLine.h" +#include "Support/Signals.h" #include "CodeEmitterGen.h" #include <algorithm> +#include <fstream> enum ActionType { PrintRecords, @@ -25,6 +27,10 @@ namespace { cl::opt<std::string> Class("class", cl::desc("Print Enum list for this class")); + + cl::opt<std::string> + OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"), + cl::init("-")); } @@ -374,13 +380,26 @@ int main(int argc, char **argv) { cl::ParseCommandLineOptions(argc, argv); ParseFile(); + std::ostream *Out = &std::cout; + if (OutputFilename != "-") { + Out = new std::ofstream(OutputFilename.c_str()); + + if (!Out->good()) { + std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n"; + return 1; + } + + // Make sure the file gets removed if *gasp* tablegen crashes... + RemoveFileOnSignal(OutputFilename); + } + switch (Action) { case Parse: ParseMachineCode(); break; case GenEmitter: - CodeEmitterGen(Records).createEmitter(std::cout); + CodeEmitterGen(Records).createEmitter(*Out); break; case PrintRecords: - std::cout << Records; // No argument, dump all contents + *Out << Records; // No argument, dump all contents break; case PrintEnums: Record *R = Records.getClass(Class); @@ -393,11 +412,13 @@ int main(int argc, char **argv) { for (std::map<std::string, Record*>::const_iterator I = Defs.begin(), E = Defs.end(); I != E; ++I) { if (I->second->isSubClassOf(R)) { - std::cout << I->first << ", "; + *Out << I->first << ", "; } } - std::cout << "\n"; + *Out << "\n"; break; } + + if (Out != &std::cout) delete Out; return 0; } |