X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=utils%2FTableGen%2FTableGen.cpp;h=7c8d288db937769d209796989e97ef9f4375d403;hb=9e6d1d1f5034347d237941f1bf08fba5c1583cd3;hp=d6e84609f430aa961d5fd1d35260b3f6a4ce4acc;hpb=b0cf29c5cfff797284b3660dc233e135feb65d9a;p=oota-llvm.git diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp index d6e84609f43..7c8d288db93 100644 --- a/utils/TableGen/TableGen.cpp +++ b/utils/TableGen/TableGen.cpp @@ -15,40 +15,48 @@ // //===----------------------------------------------------------------------===// -#include "Record.h" -#include "TGParser.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/Streams.h" -#include "llvm/System/Signals.h" -#include "llvm/Support/FileUtilities.h" -#include "llvm/Support/MemoryBuffer.h" +#include "AsmMatcherEmitter.h" +#include "AsmWriterEmitter.h" #include "CallingConvEmitter.h" +#include "ClangDiagnosticsEmitter.h" #include "CodeEmitterGen.h" -#include "RegisterInfoEmitter.h" -#include "InstrInfoEmitter.h" -#include "InstrEnumEmitter.h" -#include "AsmWriterEmitter.h" #include "DAGISelEmitter.h" +#include "DisassemblerEmitter.h" #include "FastISelEmitter.h" -#include "SubtargetEmitter.h" +#include "InstrEnumEmitter.h" +#include "InstrInfoEmitter.h" #include "IntrinsicEmitter.h" #include "LLVMCConfigurationEmitter.h" +#include "OptParserEmitter.h" +#include "Record.h" +#include "RegisterInfoEmitter.h" +#include "SubtargetEmitter.h" +#include "TGParser.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/FileUtilities.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/PrettyStackTrace.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/System/Signals.h" #include #include -#include -#include using namespace llvm; enum ActionType { PrintRecords, GenEmitter, GenRegisterEnums, GenRegister, GenRegisterHeader, - GenInstrEnums, GenInstrs, GenAsmWriter, + GenInstrEnums, GenInstrs, GenAsmWriter, GenAsmMatcher, + GenDisassembler, GenCallingConv, + GenClangDiagsDefs, + GenClangDiagGroups, GenDAGISel, GenFastISel, + GenOptParserDefs, GenOptParserImpl, GenSubtarget, GenIntrinsic, + GenTgtIntrinsic, GenLLVMCConf, PrintEnums }; @@ -74,14 +82,28 @@ namespace { "Generate calling convention descriptions"), clEnumValN(GenAsmWriter, "gen-asm-writer", "Generate assembly writer"), + clEnumValN(GenDisassembler, "gen-disassembler", + "Generate disassembler"), + clEnumValN(GenAsmMatcher, "gen-asm-matcher", + "Generate assembly instruction matcher"), clEnumValN(GenDAGISel, "gen-dag-isel", "Generate a DAG instruction selector"), clEnumValN(GenFastISel, "gen-fast-isel", "Generate a \"fast\" instruction selector"), + clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", + "Generate option definitions"), + clEnumValN(GenOptParserImpl, "gen-opt-parser-impl", + "Generate option parser implementation"), clEnumValN(GenSubtarget, "gen-subtarget", "Generate subtarget enumerations"), clEnumValN(GenIntrinsic, "gen-intrinsic", "Generate intrinsic information"), + clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic", + "Generate target intrinsic information"), + clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", + "Generate Clang diagnostics definitions"), + clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", + "Generate Clang diagnostic groups"), clEnumValN(GenLLVMCConf, "gen-llvmc", "Generate LLVMC configuration library"), clEnumValN(PrintEnums, "print-enums", @@ -102,43 +124,68 @@ namespace { cl::list IncludeDirs("I", cl::desc("Directory of include files"), cl::value_desc("directory"), cl::Prefix); + + cl::opt + ClangComponent("clang-component", + cl::desc("Only use warnings from specified component"), + cl::value_desc("component"), cl::Hidden); } + +// FIXME: Eliminate globals from tblgen. RecordKeeper llvm::Records; +static SourceMgr SrcMgr; + +void llvm::PrintError(SMLoc ErrorLoc, const std::string &Msg) { + SrcMgr.PrintMessage(ErrorLoc, Msg, "error"); +} + + + /// ParseFile - this function begins the parsing of the specified tablegen /// file. static bool ParseFile(const std::string &Filename, - const std::vector &IncludeDirs) { + const std::vector &IncludeDirs, + SourceMgr &SrcMgr) { std::string ErrorStr; MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr); if (F == 0) { - cerr << "Could not open input file '" + Filename + "': " << ErrorStr <<"\n"; + errs() << "Could not open input file '" << Filename << "': " + << ErrorStr <<"\n"; return true; } - - TGParser Parser(F); + + // Tell SrcMgr about this buffer, which is what TGParser will pick up. + SrcMgr.AddNewSourceBuffer(F, SMLoc()); // Record the location of the include directory so that the lexer can find // it later. - Parser.setIncludeDirs(IncludeDirs); + SrcMgr.setIncludeDirs(IncludeDirs); + + TGParser Parser(SrcMgr); return Parser.ParseFile(); } int main(int argc, char **argv) { + sys::PrintStackTraceOnErrorSignal(); + PrettyStackTraceProgram X(argc, argv); cl::ParseCommandLineOptions(argc, argv); + // Parse the input file. - if (ParseFile(InputFilename, IncludeDirs)) + if (ParseFile(InputFilename, IncludeDirs, SrcMgr)) return 1; - std::ostream *Out = cout.stream(); + raw_ostream *Out = &outs(); if (OutputFilename != "-") { - Out = new std::ofstream(OutputFilename.c_str()); + std::string Error; + Out = new raw_fd_ostream(OutputFilename.c_str(), Error); - if (!Out->good()) { - cerr << argv[0] << ": error opening " << OutputFilename << "!\n"; + if (!Error.empty()) { + errs() << argv[0] << ": error opening " << OutputFilename + << ":" << Error << "\n"; return 1; } @@ -164,7 +211,6 @@ int main(int argc, char **argv) { case GenRegisterHeader: RegisterInfoEmitter(Records).runHeader(*Out); break; - case GenInstrEnums: InstrEnumEmitter(Records).run(*Out); break; @@ -177,7 +223,24 @@ int main(int argc, char **argv) { case GenAsmWriter: AsmWriterEmitter(Records).run(*Out); break; - + case GenAsmMatcher: + AsmMatcherEmitter(Records).run(*Out); + break; + case GenClangDiagsDefs: + ClangDiagsDefsEmitter(Records, ClangComponent).run(*Out); + break; + case GenClangDiagGroups: + ClangDiagGroupsEmitter(Records).run(*Out); + break; + case GenDisassembler: + DisassemblerEmitter(Records).run(*Out); + break; + case GenOptParserDefs: + OptParserEmitter(Records, true).run(*Out); + break; + case GenOptParserImpl: + OptParserEmitter(Records, false).run(*Out); + break; case GenDAGISel: DAGISelEmitter(Records).run(*Out); break; @@ -190,6 +253,9 @@ int main(int argc, char **argv) { case GenIntrinsic: IntrinsicEmitter(Records).run(*Out); break; + case GenTgtIntrinsic: + IntrinsicEmitter(Records, true).run(*Out); + break; case GenLLVMCConf: LLVMCConfigurationEmitter(Records).run(*Out); break; @@ -205,24 +271,26 @@ int main(int argc, char **argv) { assert(1 && "Invalid Action"); return 1; } + + if (Out != &outs()) + delete Out; // Close the file + return 0; + + } catch (const TGError &Error) { + errs() << argv[0] << ": error:\n"; + PrintError(Error.getLoc(), Error.getMessage()); + } catch (const std::string &Error) { - cerr << argv[0] << ": " << Error << "\n"; - if (Out != cout.stream()) { - delete Out; // Close the file - std::remove(OutputFilename.c_str()); // Remove the file, it's broken - } - return 1; + errs() << argv[0] << ": " << Error << "\n"; + } catch (const char *Error) { + errs() << argv[0] << ": " << Error << "\n"; } catch (...) { - cerr << argv[0] << ": Unknown unexpected exception occurred.\n"; - if (Out != cout.stream()) { - delete Out; // Close the file - std::remove(OutputFilename.c_str()); // Remove the file, it's broken - } - return 2; + errs() << argv[0] << ": Unknown unexpected exception occurred.\n"; } - - if (Out != cout.stream()) { - delete Out; // Close the file + + if (Out != &outs()) { + delete Out; // Close the file + std::remove(OutputFilename.c_str()); // Remove the file, it's broken } - return 0; + return 1; }