16122f3e6SDimitry Andric //===- Error.cpp - tblgen error handling helper routines --------*- C++ -*-===//
26122f3e6SDimitry Andric //
36122f3e6SDimitry Andric // The LLVM Compiler Infrastructure
46122f3e6SDimitry Andric //
56122f3e6SDimitry Andric // This file is distributed under the University of Illinois Open Source
66122f3e6SDimitry Andric // License. See LICENSE.TXT for details.
76122f3e6SDimitry Andric //
86122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
96122f3e6SDimitry Andric //
106122f3e6SDimitry Andric // This file contains error handling helper routines to pretty-print diagnostic
116122f3e6SDimitry Andric // messages from tblgen.
126122f3e6SDimitry Andric //
136122f3e6SDimitry Andric //===----------------------------------------------------------------------===//
146122f3e6SDimitry Andric
156122f3e6SDimitry Andric #include "llvm/TableGen/Error.h"
166122f3e6SDimitry Andric #include "llvm/ADT/Twine.h"
17ff0cc061SDimitry Andric #include "llvm/Support/Signals.h"
18*4ba319b5SDimitry Andric #include "llvm/Support/WithColor.h"
196122f3e6SDimitry Andric #include "llvm/Support/raw_ostream.h"
203861d79fSDimitry Andric #include <cstdlib>
213861d79fSDimitry Andric
226122f3e6SDimitry Andric namespace llvm {
236122f3e6SDimitry Andric
246122f3e6SDimitry Andric SourceMgr SrcMgr;
25139f7f9bSDimitry Andric unsigned ErrorsPrinted = 0;
266122f3e6SDimitry Andric
PrintMessage(ArrayRef<SMLoc> Loc,SourceMgr::DiagKind Kind,const Twine & Msg)273861d79fSDimitry Andric static void PrintMessage(ArrayRef<SMLoc> Loc, SourceMgr::DiagKind Kind,
283861d79fSDimitry Andric const Twine &Msg) {
29139f7f9bSDimitry Andric // Count the total number of errors printed.
30139f7f9bSDimitry Andric // This is used to exit with an error code if there were any errors.
31139f7f9bSDimitry Andric if (Kind == SourceMgr::DK_Error)
32139f7f9bSDimitry Andric ++ErrorsPrinted;
33139f7f9bSDimitry Andric
343861d79fSDimitry Andric SMLoc NullLoc;
353861d79fSDimitry Andric if (Loc.empty())
363861d79fSDimitry Andric Loc = NullLoc;
373861d79fSDimitry Andric SrcMgr.PrintMessage(Loc.front(), Kind, Msg);
383861d79fSDimitry Andric for (unsigned i = 1; i < Loc.size(); ++i)
393861d79fSDimitry Andric SrcMgr.PrintMessage(Loc[i], SourceMgr::DK_Note,
403861d79fSDimitry Andric "instantiated from multiclass");
413861d79fSDimitry Andric }
423861d79fSDimitry Andric
PrintNote(ArrayRef<SMLoc> NoteLoc,const Twine & Msg)432cab237bSDimitry Andric void PrintNote(ArrayRef<SMLoc> NoteLoc, const Twine &Msg) {
442cab237bSDimitry Andric PrintMessage(NoteLoc, SourceMgr::DK_Note, Msg);
452cab237bSDimitry Andric }
462cab237bSDimitry Andric
PrintWarning(ArrayRef<SMLoc> WarningLoc,const Twine & Msg)473861d79fSDimitry Andric void PrintWarning(ArrayRef<SMLoc> WarningLoc, const Twine &Msg) {
483861d79fSDimitry Andric PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg);
49cb4dff85SDimitry Andric }
50cb4dff85SDimitry Andric
PrintWarning(const char * Loc,const Twine & Msg)51cb4dff85SDimitry Andric void PrintWarning(const char *Loc, const Twine &Msg) {
52cb4dff85SDimitry Andric SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Warning, Msg);
53cb4dff85SDimitry Andric }
54cb4dff85SDimitry Andric
PrintWarning(const Twine & Msg)55*4ba319b5SDimitry Andric void PrintWarning(const Twine &Msg) { WithColor::warning() << Msg << "\n"; }
56cb4dff85SDimitry Andric
PrintError(ArrayRef<SMLoc> ErrorLoc,const Twine & Msg)573861d79fSDimitry Andric void PrintError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) {
583861d79fSDimitry Andric PrintMessage(ErrorLoc, SourceMgr::DK_Error, Msg);
596122f3e6SDimitry Andric }
606122f3e6SDimitry Andric
PrintError(const char * Loc,const Twine & Msg)616122f3e6SDimitry Andric void PrintError(const char *Loc, const Twine &Msg) {
62dff0c46cSDimitry Andric SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg);
636122f3e6SDimitry Andric }
646122f3e6SDimitry Andric
PrintError(const Twine & Msg)65*4ba319b5SDimitry Andric void PrintError(const Twine &Msg) { WithColor::error() << Msg << "\n"; }
666122f3e6SDimitry Andric
PrintFatalError(const Twine & Msg)6791bc56edSDimitry Andric void PrintFatalError(const Twine &Msg) {
6891bc56edSDimitry Andric PrintError(Msg);
69ff0cc061SDimitry Andric // The following call runs the file cleanup handlers.
70ff0cc061SDimitry Andric sys::RunInterruptHandlers();
713861d79fSDimitry Andric std::exit(1);
723861d79fSDimitry Andric }
733861d79fSDimitry Andric
PrintFatalError(ArrayRef<SMLoc> ErrorLoc,const Twine & Msg)7491bc56edSDimitry Andric void PrintFatalError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) {
753861d79fSDimitry Andric PrintError(ErrorLoc, Msg);
76ff0cc061SDimitry Andric // The following call runs the file cleanup handlers.
77ff0cc061SDimitry Andric sys::RunInterruptHandlers();
783861d79fSDimitry Andric std::exit(1);
796122f3e6SDimitry Andric }
806122f3e6SDimitry Andric
816122f3e6SDimitry Andric } // end namespace llvm
82