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