Error.cpp revision 0eafc7fc37e48b27aad907bcdf0b726d2e6a9af8
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"
180b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
190eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger#include <cstdlib>
200eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger
210b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachnamespace llvm {
220b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
230b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim GrosbachSourceMgr SrcMgr;
240b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
25376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenstatic void PrintMessage(ArrayRef<SMLoc> Loc, SourceMgr::DiagKind Kind,
26376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen                         const Twine &Msg) {
27376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  SMLoc NullLoc;
28376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  if (Loc.empty())
29376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    Loc = NullLoc;
30376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  SrcMgr.PrintMessage(Loc.front(), Kind, Msg);
31376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  for (unsigned i = 1; i < Loc.size(); ++i)
32376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen    SrcMgr.PrintMessage(Loc[i], SourceMgr::DK_Note,
33376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen                        "instantiated from multiclass");
34376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen}
35376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen
36376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenvoid PrintWarning(ArrayRef<SMLoc> WarningLoc, const Twine &Msg) {
37376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  PrintMessage(WarningLoc, SourceMgr::DK_Warning, Msg);
3897c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach}
3997c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach
4097c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbachvoid PrintWarning(const char *Loc, const Twine &Msg) {
4197c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach  SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Warning, Msg);
4297c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach}
4397c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach
4497c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbachvoid PrintWarning(const Twine &Msg) {
4528b810e9e4b11074a241aad87e1e09ec7859a691Jim Grosbach  errs() << "warning:" << Msg << "\n";
4697c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach}
4797c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach
4897c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbachvoid PrintWarning(const TGError &Warning) {
4997c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach  PrintWarning(Warning.getLoc(), Warning.getMessage());
5097c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach}
5197c02bf2409bccdb43c3822c438e3ff977d8514eJim Grosbach
52376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesenvoid PrintError(ArrayRef<SMLoc> ErrorLoc, const Twine &Msg) {
53376a8a773e38fdcd9102a40e08ab1e0661d645d9Jakob Stoklund Olesen  PrintMessage(ErrorLoc, SourceMgr::DK_Error, Msg);
540b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach}
550b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
560b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachvoid PrintError(const char *Loc, const Twine &Msg) {
573f2d5f60b31fd057c10f77b2e607b23a8c94f6d3Chris Lattner  SrcMgr.PrintMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg);
580b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach}
590b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
600b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachvoid PrintError(const Twine &Msg) {
610b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach  errs() << "error:" << Msg << "\n";
620b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach}
630b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
640b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbachvoid PrintError(const TGError &Error) {
650b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach  PrintError(Error.getLoc(), Error.getMessage());
660b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach}
670b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach
680eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenbergervoid PrintFatalError(const std::string &Msg) {
690eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger  PrintError(Twine(Msg));
700eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger  std::exit(1);
710eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger}
720eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger
730eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenbergervoid PrintFatalError(ArrayRef<SMLoc> ErrorLoc, const std::string &Msg) {
740eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger  PrintError(ErrorLoc, Msg);
750eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger  std::exit(1);
760eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger}
770eafc7fc37e48b27aad907bcdf0b726d2e6a9af8Joerg Sonnenberger
780b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach} // end namespace llvm
79