1*9880d681SAndroid Build Coastguard Worker //===- Error.cpp - tblgen error handling helper routines --------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file contains error handling helper routines to pretty-print diagnostic
11*9880d681SAndroid Build Coastguard Worker // messages from tblgen.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker #include "llvm/TableGen/Error.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Twine.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Signals.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
19*9880d681SAndroid Build Coastguard Worker #include <cstdlib>
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker namespace llvm {
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Worker SourceMgr SrcMgr;
24*9880d681SAndroid Build Coastguard Worker unsigned ErrorsPrinted = 0;
25*9880d681SAndroid Build Coastguard Worker
PrintMessage(ArrayRef<SMLoc> Loc,SourceMgr::DiagKind Kind,const Twine & Msg)26*9880d681SAndroid Build Coastguard Worker static void PrintMessage(ArrayRef<SMLoc> Loc, SourceMgr::DiagKind Kind,
27*9880d681SAndroid Build Coastguard Worker const Twine &Msg) {
28*9880d681SAndroid Build Coastguard Worker // Count the total number of errors printed.
29*9880d681SAndroid Build Coastguard Worker // This is used to exit with an error code if there were any errors.
30*9880d681SAndroid Build Coastguard Worker if (Kind == SourceMgr::DK_Error)
31*9880d681SAndroid Build Coastguard Worker ++ErrorsPrinted;
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker SMLoc NullLoc;
34*9880d681SAndroid Build Coastguard Worker if (Loc.empty())
35*9880d681SAndroid Build Coastguard Worker Loc = NullLoc;
36*9880d681SAndroid Build Coastguard Worker SrcMgr.PrintMessage(Loc.front(), Kind, Msg);
37*9880d681SAndroid Build Coastguard Worker for (unsigned i = 1; i < Loc.size(); ++i)
38*9880d681SAndroid Build Coastguard Worker SrcMgr.PrintMessage(Loc[i], SourceMgr::DK_Note,
39*9880d681SAndroid Build Coastguard Worker "instantiated from multiclass");
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker
PrintWarning(ArrayRef<SMLoc> WarningLoc,const Twine & Msg)42*9880d681SAndroid Build Coastguard Worker void PrintWarning(ArrayRef<SMLoc> WarningLoc, const Twine &Msg) {
43*9880d681SAndroid Build Coastguard Worker PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg);
44*9880d681SAndroid Build Coastguard Worker }
45*9880d681SAndroid Build Coastguard Worker
PrintWarning(const char * Loc,const Twine & Msg)46*9880d681SAndroid Build Coastguard Worker void PrintWarning(const char *Loc, const Twine &Msg) {
47*9880d681SAndroid Build Coastguard Worker SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Warning, Msg);
48*9880d681SAndroid Build Coastguard Worker }
49*9880d681SAndroid Build Coastguard Worker
PrintWarning(const Twine & Msg)50*9880d681SAndroid Build Coastguard Worker void PrintWarning(const Twine &Msg) {
51*9880d681SAndroid Build Coastguard Worker errs() << "warning:" << Msg << "\n";
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker
PrintError(ArrayRef<SMLoc> ErrorLoc,const Twine & Msg)54*9880d681SAndroid Build Coastguard Worker void PrintError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) {
55*9880d681SAndroid Build Coastguard Worker PrintMessage(ErrorLoc, SourceMgr::DK_Error, Msg);
56*9880d681SAndroid Build Coastguard Worker }
57*9880d681SAndroid Build Coastguard Worker
PrintError(const char * Loc,const Twine & Msg)58*9880d681SAndroid Build Coastguard Worker void PrintError(const char *Loc, const Twine &Msg) {
59*9880d681SAndroid Build Coastguard Worker SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg);
60*9880d681SAndroid Build Coastguard Worker }
61*9880d681SAndroid Build Coastguard Worker
PrintError(const Twine & Msg)62*9880d681SAndroid Build Coastguard Worker void PrintError(const Twine &Msg) {
63*9880d681SAndroid Build Coastguard Worker errs() << "error:" << Msg << "\n";
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker
PrintFatalError(const Twine & Msg)66*9880d681SAndroid Build Coastguard Worker void PrintFatalError(const Twine &Msg) {
67*9880d681SAndroid Build Coastguard Worker PrintError(Msg);
68*9880d681SAndroid Build Coastguard Worker // The following call runs the file cleanup handlers.
69*9880d681SAndroid Build Coastguard Worker sys::RunInterruptHandlers();
70*9880d681SAndroid Build Coastguard Worker std::exit(1);
71*9880d681SAndroid Build Coastguard Worker }
72*9880d681SAndroid Build Coastguard Worker
PrintFatalError(ArrayRef<SMLoc> ErrorLoc,const Twine & Msg)73*9880d681SAndroid Build Coastguard Worker void PrintFatalError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) {
74*9880d681SAndroid Build Coastguard Worker PrintError(ErrorLoc, Msg);
75*9880d681SAndroid Build Coastguard Worker // The following call runs the file cleanup handlers.
76*9880d681SAndroid Build Coastguard Worker sys::RunInterruptHandlers();
77*9880d681SAndroid Build Coastguard Worker std::exit(1);
78*9880d681SAndroid Build Coastguard Worker }
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
81