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