1226584Sdim//===- Error.cpp - tblgen error handling helper routines --------*- C++ -*-===// 2226584Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6226584Sdim// 7226584Sdim//===----------------------------------------------------------------------===// 8226584Sdim// 9226584Sdim// This file contains error handling helper routines to pretty-print diagnostic 10226584Sdim// messages from tblgen. 11226584Sdim// 12226584Sdim//===----------------------------------------------------------------------===// 13226584Sdim 14226584Sdim#include "llvm/TableGen/Error.h" 15226584Sdim#include "llvm/ADT/Twine.h" 16288943Sdim#include "llvm/Support/Signals.h" 17341825Sdim#include "llvm/Support/WithColor.h" 18226584Sdim#include "llvm/Support/raw_ostream.h" 19243830Sdim#include <cstdlib> 20243830Sdim 21226584Sdimnamespace llvm { 22226584Sdim 23226584SdimSourceMgr SrcMgr; 24249423Sdimunsigned ErrorsPrinted = 0; 25226584Sdim 26243830Sdimstatic void PrintMessage(ArrayRef<SMLoc> Loc, SourceMgr::DiagKind Kind, 27243830Sdim const Twine &Msg) { 28249423Sdim // Count the total number of errors printed. 29249423Sdim // This is used to exit with an error code if there were any errors. 30249423Sdim if (Kind == SourceMgr::DK_Error) 31249423Sdim ++ErrorsPrinted; 32249423Sdim 33243830Sdim SMLoc NullLoc; 34243830Sdim if (Loc.empty()) 35243830Sdim Loc = NullLoc; 36243830Sdim SrcMgr.PrintMessage(Loc.front(), Kind, Msg); 37243830Sdim for (unsigned i = 1; i < Loc.size(); ++i) 38243830Sdim SrcMgr.PrintMessage(Loc[i], SourceMgr::DK_Note, 39243830Sdim "instantiated from multiclass"); 40234982Sdim} 41234982Sdim 42360784Sdimvoid PrintNote(const Twine &Msg) { WithColor::note() << Msg << "\n"; } 43360784Sdim 44327952Sdimvoid PrintNote(ArrayRef<SMLoc> NoteLoc, const Twine &Msg) { 45327952Sdim PrintMessage(NoteLoc, SourceMgr::DK_Note, Msg); 46327952Sdim} 47327952Sdim 48243830Sdimvoid PrintWarning(ArrayRef<SMLoc> WarningLoc, const Twine &Msg) { 49243830Sdim PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg); 50243830Sdim} 51243830Sdim 52234982Sdimvoid PrintWarning(const char *Loc, const Twine &Msg) { 53234982Sdim SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Warning, Msg); 54234982Sdim} 55234982Sdim 56341825Sdimvoid PrintWarning(const Twine &Msg) { WithColor::warning() << Msg << "\n"; } 57234982Sdim 58243830Sdimvoid PrintError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) { 59243830Sdim PrintMessage(ErrorLoc, SourceMgr::DK_Error, Msg); 60234982Sdim} 61234982Sdim 62226584Sdimvoid PrintError(const char *Loc, const Twine &Msg) { 63234353Sdim SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg); 64226584Sdim} 65226584Sdim 66341825Sdimvoid PrintError(const Twine &Msg) { WithColor::error() << Msg << "\n"; } 67226584Sdim 68276479Sdimvoid PrintFatalError(const Twine &Msg) { 69276479Sdim PrintError(Msg); 70288943Sdim // The following call runs the file cleanup handlers. 71288943Sdim sys::RunInterruptHandlers(); 72243830Sdim std::exit(1); 73226584Sdim} 74226584Sdim 75276479Sdimvoid PrintFatalError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) { 76243830Sdim PrintError(ErrorLoc, Msg); 77288943Sdim // The following call runs the file cleanup handlers. 78288943Sdim sys::RunInterruptHandlers(); 79243830Sdim std::exit(1); 80243830Sdim} 81243830Sdim 82226584Sdim} // end namespace llvm 83