From 7af521bd0c1807827a3e01490eff2c08a7a81cca Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 13 Mar 2009 16:25:21 +0000 Subject: [PATCH] add a new TGError class and use it to propagate location info with errors when thrown. This gets us nice errors like this from tblgen: CMOVL32rr: (set GR32:i32:$dst, (X86cmov GR32:$src1, GR32:$src2)) /Users/sabre/llvm/Debug/bin/tblgen: error: Included from X86.td:116: Parsing X86InstrInfo.td:922: In CMOVL32rr: X86cmov node requires exactly 4 operands! def CMOVL32rr : I<0x4C, MRMSrcReg, // if getName() + ": " + Msg; + throw TGError(TheRecord->getLoc(), "In " + TheRecord->getName() + ": " + Msg); } TreePatternNode *TreePattern::ParseTreePattern(DagInit *Dag) { diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h index 5eb07eb1e99..00b77305cdc 100644 --- a/utils/TableGen/Record.h +++ b/utils/TableGen/Record.h @@ -1195,6 +1195,17 @@ struct LessRecordFieldName { } }; + +class TGError { + TGLoc Loc; + std::string Message; +public: + TGError(TGLoc loc, const std::string &message) : Loc(loc), Message(message) {} + + TGLoc getLoc() const { return Loc; } + const std::string &getMessage() const { return Message; } +}; + std::ostream &operator<<(std::ostream &OS, const RecordKeeper &RK); diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp index 1beddf0693d..36ad999a1e2 100644 --- a/utils/TableGen/TableGen.cpp +++ b/utils/TableGen/TableGen.cpp @@ -114,7 +114,7 @@ RecordKeeper llvm::Records; static TGSourceMgr SrcMgr; -void PrintError(TGLoc ErrorLoc, const std::string &Msg) { +void llvm::PrintError(TGLoc ErrorLoc, const std::string &Msg) { SrcMgr.PrintError(ErrorLoc, Msg); } @@ -229,31 +229,26 @@ int main(int argc, char **argv) { assert(1 && "Invalid Action"); return 1; } + + if (Out != cout.stream()) + delete Out; // Close the file + return 0; + + } catch (const TGError &Error) { + cerr << 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; } catch (const char *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; } 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; } - + if (Out != cout.stream()) { - delete Out; // Close the file + delete Out; // Close the file + std::remove(OutputFilename.c_str()); // Remove the file, it's broken } - return 0; + return 1; }