1226584Sdim//===- Error.cpp - tblgen error handling helper routines --------*- C++ -*-===// 2226584Sdim// 3226584Sdim// The LLVM Compiler Infrastructure 4226584Sdim// 5226584Sdim// This file is distributed under the University of Illinois Open Source 6226584Sdim// License. See LICENSE.TXT for details. 7226584Sdim// 8226584Sdim//===----------------------------------------------------------------------===// 9226584Sdim// 10226584Sdim// This file contains error handling helper routines to pretty-print diagnostic 11226584Sdim// messages from tblgen. 12226584Sdim// 13226584Sdim//===----------------------------------------------------------------------===// 14226584Sdim 15226584Sdim#include "llvm/TableGen/Error.h" 16226584Sdim#include "llvm/ADT/Twine.h" 17226584Sdim#include "llvm/Support/raw_ostream.h" 18243830Sdim#include <cstdlib> 19243830Sdim 20226584Sdimnamespace llvm { 21226584Sdim 22226584SdimSourceMgr SrcMgr; 23249423Sdimunsigned ErrorsPrinted = 0; 24226584Sdim 25243830Sdimstatic void PrintMessage(ArrayRef<SMLoc> Loc, SourceMgr::DiagKind Kind, 26243830Sdim const Twine &Msg) { 27249423Sdim // Count the total number of errors printed. 28249423Sdim // This is used to exit with an error code if there were any errors. 29249423Sdim if (Kind == SourceMgr::DK_Error) 30249423Sdim ++ErrorsPrinted; 31249423Sdim 32243830Sdim SMLoc NullLoc; 33243830Sdim if (Loc.empty()) 34243830Sdim Loc = NullLoc; 35243830Sdim SrcMgr.PrintMessage(Loc.front(), Kind, Msg); 36243830Sdim for (unsigned i = 1; i < Loc.size(); ++i) 37243830Sdim SrcMgr.PrintMessage(Loc[i], SourceMgr::DK_Note, 38243830Sdim "instantiated from multiclass"); 39234982Sdim} 40234982Sdim 41243830Sdimvoid PrintWarning(ArrayRef<SMLoc> WarningLoc, const Twine &Msg) { 42243830Sdim PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg); 43243830Sdim} 44243830Sdim 45234982Sdimvoid PrintWarning(const char *Loc, const Twine &Msg) { 46234982Sdim SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Warning, Msg); 47234982Sdim} 48234982Sdim 49234982Sdimvoid PrintWarning(const Twine &Msg) { 50234982Sdim errs() << "warning:" << Msg << "\n"; 51234982Sdim} 52234982Sdim 53243830Sdimvoid PrintError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) { 54243830Sdim PrintMessage(ErrorLoc, SourceMgr::DK_Error, Msg); 55234982Sdim} 56234982Sdim 57226584Sdimvoid PrintError(const char *Loc, const Twine &Msg) { 58234353Sdim SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg); 59226584Sdim} 60226584Sdim 61226584Sdimvoid PrintError(const Twine &Msg) { 62226584Sdim errs() << "error:" << Msg << "\n"; 63226584Sdim} 64226584Sdim 65243830Sdimvoid PrintFatalError(const std::string &Msg) { 66243830Sdim PrintError(Twine(Msg)); 67243830Sdim std::exit(1); 68226584Sdim} 69226584Sdim 70243830Sdimvoid PrintFatalError(ArrayRef<SMLoc> ErrorLoc, const std::string &Msg) { 71243830Sdim PrintError(ErrorLoc, Msg); 72243830Sdim std::exit(1); 73243830Sdim} 74243830Sdim 75226584Sdim} // end namespace llvm 76