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