10b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//===- Error.cpp - tblgen error handling helper routines --------*- C++ -*-===// 20b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// 30b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// The LLVM Compiler Infrastructure 40b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// 50b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// This file is distributed under the University of Illinois Open Source 60b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// License. See LICENSE.TXT for details. 70b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// 80b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//===----------------------------------------------------------------------===// 90b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// 100b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// This file contains error handling helper routines to pretty-print diagnostic 110b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// messages from tblgen. 120b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// 130b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//===----------------------------------------------------------------------===// 140b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach 157c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Error.h" 160b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach#include "llvm/ADT/Twine.h" 170b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach#include "llvm/Support/raw_ostream.h" 180eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger#include <cstdlib> 190eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger 200b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachnamespace llvm { 210b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach 220b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim GrosbachSourceMgr SrcMgr; 23f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesenunsigned ErrorsPrinted = 0; 240b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach 25376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenstatic void PrintMessage(ArrayRef<SMLoc> Loc, SourceMgr::DiagKind Kind, 26376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen const Twine &Msg) { 27f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen // Count the total number of errors printed. 28f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen // This is used to exit with an error code if there were any errors. 29f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen if (Kind == SourceMgr::DK_Error) 30f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen ++ErrorsPrinted; 31f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen 32376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen SMLoc NullLoc; 33376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen if (Loc.empty()) 34376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen Loc = NullLoc; 35376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen SrcMgr.PrintMessage(Loc.front(), Kind, Msg); 36376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen for (unsigned i = 1; i < Loc.size(); ++i) 37376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen SrcMgr.PrintMessage(Loc[i], SourceMgr::DK_Note, 38376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen "instantiated from multiclass"); 39376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen} 40376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen 41376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenvoid PrintWarning(ArrayRef<SMLoc> WarningLoc, const Twine &Msg) { 42376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg); 4397c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach} 4497c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach 4597c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbachvoid PrintWarning(const char *Loc, const Twine &Msg) { 4697c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Warning, Msg); 4797c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach} 4897c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach 4997c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbachvoid PrintWarning(const Twine &Msg) { 5028b810e9e4b11074a241aad87e1e09ec7859a691Jim Grosbach errs() << "warning:" << Msg << "\n"; 5197c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach} 5297c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach 53376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenvoid PrintError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) { 54376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen PrintMessage(ErrorLoc, SourceMgr::DK_Error, Msg); 550b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach} 560b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach 570b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachvoid PrintError(const char *Loc, const Twine &Msg) { 583f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg); 590b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach} 600b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach 610b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachvoid PrintError(const Twine &Msg) { 620b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach errs() << "error:" << Msg << "\n"; 630b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach} 640b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid PrintFatalError(const Twine &Msg) { 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintError(Msg); 670eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger std::exit(1); 680eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger} 690eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid PrintFatalError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) { 710eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger PrintError(ErrorLoc, Msg); 720eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger std::exit(1); 730eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger} 740eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger 750b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach} // end namespace llvm 76