10b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//===- Error.cpp - tblgen error handling helper routines --------*- C++ -*-===//
20b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//
30b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//                     The LLVM Compiler Infrastructure
40b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//
50b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// This file is distributed under the University of Illinois Open Source
60b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// License. See LICENSE.TXT for details.
70b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//
80b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//===----------------------------------------------------------------------===//
90b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//
100b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// This file contains error handling helper routines to pretty-print diagnostic
110b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach// messages from tblgen.
120b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//
130b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach//===----------------------------------------------------------------------===//
140b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
157c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Error.h"
160b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach#include "llvm/ADT/Twine.h"
170b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach#include "llvm/Support/raw_ostream.h"
180eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger#include <cstdlib>
190eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger
200b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachnamespace llvm {
210b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
220b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim GrosbachSourceMgr SrcMgr;
23f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesenunsigned ErrorsPrinted = 0;
240b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
25376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenstatic void PrintMessage(ArrayRef<SMLoc> Loc, SourceMgr::DiagKind Kind,
26376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen                         const Twine &Msg) {
27f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen  // Count the total number of errors printed.
28f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen  // This is used to exit with an error code if there were any errors.
29f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen  if (Kind == SourceMgr::DK_Error)
30f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen    ++ErrorsPrinted;
31f8ea5a5a27222f3b0f6daaddc47f79fb969c7448Jakob Stoklund Olesen
32376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  SMLoc NullLoc;
33376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  if (Loc.empty())
34376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    Loc = NullLoc;
35376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  SrcMgr.PrintMessage(Loc.front(), Kind, Msg);
36376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  for (unsigned i = 1; i < Loc.size(); ++i)
37376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    SrcMgr.PrintMessage(Loc[i], SourceMgr::DK_Note,
38376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen                        "instantiated from multiclass");
39376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen}
40376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen
41376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenvoid PrintWarning(ArrayRef<SMLoc> WarningLoc, const Twine &Msg) {
42376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg);
4397c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach}
4497c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach
4597c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbachvoid PrintWarning(const char *Loc, const Twine &Msg) {
4697c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach  SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Warning, Msg);
4797c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach}
4897c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach
4997c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbachvoid PrintWarning(const Twine &Msg) {
5028b810e9e4b11074a241aad87e1e09ec7859a691Jim Grosbach  errs() << "warning:" << Msg << "\n";
5197c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach}
5297c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach
53376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenvoid PrintError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) {
54376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  PrintMessage(ErrorLoc, SourceMgr::DK_Error, Msg);
550b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach}
560b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
570b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachvoid PrintError(const char *Loc, const Twine &Msg) {
583f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner  SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg);
590b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach}
600b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
610b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachvoid PrintError(const Twine &Msg) {
620b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach  errs() << "error:" << Msg << "\n";
630b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach}
640b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
650eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenbergervoid PrintFatalError(const std::string &Msg) {
660eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger  PrintError(Twine(Msg));
670eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger  std::exit(1);
680eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger}
690eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger
700eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenbergervoid PrintFatalError(ArrayRef<SMLoc> ErrorLoc, const std::string &Msg) {
710eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger  PrintError(ErrorLoc, Msg);
720eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger  std::exit(1);
730eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger}
740eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger
750b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach} // end namespace llvm
76