From 92bcb426c3e4503c99324afd4ed0a73521711a56 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 2 Jul 2009 22:46:18 +0000 Subject: [PATCH] switch the .ll parser into SMDiagnostic. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74734 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Assembly/Parser.h | 61 +++------------------------------- lib/AsmParser/LLLexer.cpp | 8 +++-- lib/AsmParser/LLLexer.h | 6 ++-- lib/AsmParser/LLParser.h | 2 +- lib/AsmParser/Parser.cpp | 44 ++++-------------------- tools/bugpoint/BugDriver.cpp | 5 +-- tools/llvm-as/llvm-as.cpp | 5 +-- 7 files changed, 26 insertions(+), 105 deletions(-) diff --git a/include/llvm/Assembly/Parser.h b/include/llvm/Assembly/Parser.h index 3f601493b0a..966abaaa206 100644 --- a/include/llvm/Assembly/Parser.h +++ b/include/llvm/Assembly/Parser.h @@ -19,7 +19,7 @@ namespace llvm { class Module; -class ParseError; +class SMDiagnostic; class raw_ostream; class LLVMContext; @@ -31,8 +31,8 @@ class LLVMContext; /// @brief Parse LLVM Assembly from a file Module *ParseAssemblyFile( const std::string &Filename, ///< The name of the file to parse - ParseError &Error, ///< If not null, an object to return errors in. - LLVMContext& Context ///< Context in which to allocate globals info. + SMDiagnostic &Error, ///< Error result info. + LLVMContext &Context ///< Context in which to allocate globals info. ); /// The function is a secondary interface to the LLVM Assembly Parser. It parses @@ -44,61 +44,10 @@ Module *ParseAssemblyFile( Module *ParseAssemblyString( const char *AsmString, ///< The string containing assembly Module *M, ///< A module to add the assembly too. - ParseError &Error, ///< If not null, an object to return errors in. - LLVMContext& Context + SMDiagnostic &Error, ///< Error result info. + LLVMContext &Context ); -//===------------------------------------------------------------------------=== -// Helper Classes -//===------------------------------------------------------------------------=== - -/// An instance of this class can be passed to ParseAssemblyFile or -/// ParseAssemblyString functions in order to capture error information from -/// the parser. It provides a standard way to print out the error message -/// including the file name and line number where the error occurred. -/// @brief An LLVM Assembly Parsing Error Object -class ParseError { -public: - ParseError() : Filename("unknown"), Message("none"), LineNo(0), ColumnNo(0) {} - ParseError(const ParseError &E); - - void setFilename(const std::string &F) { Filename = F; } - - inline const std::string &getRawMessage() const { // Just the raw message. - return Message; - } - - inline const std::string &getFilename() const { - return Filename; - } - - void setError(const std::string &message, int lineNo = -1, int ColNo = -1, - const std::string &FileContents = "") { - Message = message; - LineNo = lineNo; ColumnNo = ColNo; - LineContents = FileContents; - } - - // getErrorLocation - Return the line and column number of the error in the - // input source file. The source filename can be derived from the - // ParserOptions in effect. If positional information is not applicable, - // these will return a value of -1. - // - inline void getErrorLocation(int &Line, int &Column) const { - Line = LineNo; Column = ColumnNo; - } - - void PrintError(const char *ProgName, raw_ostream &S); - -private : - std::string Filename; - std::string Message; - int LineNo, ColumnNo; // -1 if not relevant - std::string LineContents; - - void operator=(const ParseError &E); // DO NOT IMPLEMENT -}; - } // End llvm namespace #endif diff --git a/lib/AsmParser/LLLexer.cpp b/lib/AsmParser/LLLexer.cpp index b3f7cdb3c37..090e6141227 100644 --- a/lib/AsmParser/LLLexer.cpp +++ b/lib/AsmParser/LLLexer.cpp @@ -16,6 +16,7 @@ #include "llvm/Instruction.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Assembly/Parser.h" #include @@ -38,8 +39,9 @@ bool LLLexer::Error(LocTy ErrorLoc, const std::string &Msg) const { for (const char *FP = CurBuf->getBufferStart(); FP != ErrorLoc; ++FP) if (*FP == '\n') ++LineNo; - std::string LineContents(LineStart, LineEnd); - ErrorInfo.setError(Msg, LineNo, ErrorLoc-LineStart, LineContents); + ErrorInfo = SMDiagnostic(CurBuf->getBufferIdentifier(), + LineNo, ErrorLoc-LineStart, Msg, + std::string(LineStart, LineEnd)); return true; } @@ -195,7 +197,7 @@ static const char *isLabelTail(const char *CurPtr) { // Lexer definition. //===----------------------------------------------------------------------===// -LLLexer::LLLexer(MemoryBuffer *StartBuf, ParseError &Err) +LLLexer::LLLexer(MemoryBuffer *StartBuf, SMDiagnostic &Err) : CurBuf(StartBuf), ErrorInfo(Err), APFloatVal(0.0) { CurPtr = CurBuf->getBufferStart(); } diff --git a/lib/AsmParser/LLLexer.h b/lib/AsmParser/LLLexer.h index 995aa4eb079..49a63a16927 100644 --- a/lib/AsmParser/LLLexer.h +++ b/lib/AsmParser/LLLexer.h @@ -22,12 +22,12 @@ namespace llvm { class MemoryBuffer; class Type; - class ParseError; + class SMDiagnostic; class LLLexer { const char *CurPtr; MemoryBuffer *CurBuf; - ParseError &ErrorInfo; + SMDiagnostic &ErrorInfo; // Information about the current token. const char *TokStart; @@ -40,7 +40,7 @@ namespace llvm { std::string TheError; public: - explicit LLLexer(MemoryBuffer *StartBuf, ParseError &); + explicit LLLexer(MemoryBuffer *StartBuf, SMDiagnostic &); ~LLLexer() {} lltok::Kind Lex() { diff --git a/lib/AsmParser/LLParser.h b/lib/AsmParser/LLParser.h index 6691f60536e..fdb21478103 100644 --- a/lib/AsmParser/LLParser.h +++ b/lib/AsmParser/LLParser.h @@ -73,7 +73,7 @@ namespace llvm { std::map > ForwardRefValIDs; std::vector NumberedVals; public: - LLParser(MemoryBuffer *F, ParseError &Err, Module *m) : + LLParser(MemoryBuffer *F, SMDiagnostic &Err, Module *m) : Context(m->getContext()), Lex(F, Err), M(m) {} bool Run(); diff --git a/lib/AsmParser/Parser.cpp b/lib/AsmParser/Parser.cpp index 82d6f8fe5d4..17aae397eaa 100644 --- a/lib/AsmParser/Parser.cpp +++ b/lib/AsmParser/Parser.cpp @@ -15,20 +15,20 @@ #include "LLParser.h" #include "llvm/Module.h" #include "llvm/ADT/OwningPtr.h" +#include "llvm/Support/SourceMgr.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/raw_ostream.h" #include using namespace llvm; -Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError &Err, - LLVMContext& Context) { - Err.setFilename(Filename); - +Module *llvm::ParseAssemblyFile(const std::string &Filename, SMDiagnostic &Err, + LLVMContext &Context) { std::string ErrorStr; OwningPtr F(MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr)); if (F == 0) { - Err.setError("Could not open input file '" + Filename + "'"); + Err = SMDiagnostic("", -1, -1, + "Could not open input file '" + Filename + "'", ""); return 0; } @@ -39,9 +39,7 @@ Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError &Err, } Module *llvm::ParseAssemblyString(const char *AsmString, Module *M, - ParseError &Err, LLVMContext& Context) { - Err.setFilename(""); - + SMDiagnostic &Err, LLVMContext &Context) { OwningPtr F(MemoryBuffer::getMemBuffer(AsmString, AsmString+strlen(AsmString), "")); @@ -56,33 +54,3 @@ Module *llvm::ParseAssemblyString(const char *AsmString, Module *M, return 0; return M2.take(); } - - -//===------------------------------------------------------------------------=== -// ParseError Class -//===------------------------------------------------------------------------=== - -void ParseError::PrintError(const char *ProgName, raw_ostream &S) { - errs() << ProgName << ": "; - if (Filename == "-") - errs() << ""; - else - errs() << Filename; - - if (LineNo != -1) { - errs() << ':' << LineNo; - if (ColumnNo != -1) - errs() << ':' << (ColumnNo+1); - } - - errs() << ": " << Message << '\n'; - - if (LineNo != -1 && ColumnNo != -1) { - errs() << LineContents << '\n'; - - // Print out spaces/tabs before the caret. - for (unsigned i = 0; i != unsigned(ColumnNo); ++i) - errs() << (LineContents[i] == '\t' ? '\t' : ' '); - errs() << "^\n"; - } -} diff --git a/tools/bugpoint/BugDriver.cpp b/tools/bugpoint/BugDriver.cpp index 847de1f8066..aab50720c6e 100644 --- a/tools/bugpoint/BugDriver.cpp +++ b/tools/bugpoint/BugDriver.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileUtilities.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -82,9 +83,9 @@ Module *llvm::ParseInputFile(const std::string &Filename, if (Buffer.get()) Result = ParseBitcodeFile(Buffer.get(), Ctxt); - ParseError Err; + SMDiagnostic Err; if (!Result && !(Result = ParseAssemblyFile(Filename, Err, Ctxt))) { - Err.PrintError("bugpoint", errs()); + Err.Print("bugpoint", errs()); Result = 0; } diff --git a/tools/llvm-as/llvm-as.cpp b/tools/llvm-as/llvm-as.cpp index 53731b6c11e..eccabd5d14a 100644 --- a/tools/llvm-as/llvm-as.cpp +++ b/tools/llvm-as/llvm-as.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/PrettyStackTrace.h" +#include "llvm/Support/SourceMgr.h" #include "llvm/Support/Streams.h" #include "llvm/Support/SystemUtils.h" #include "llvm/Support/raw_ostream.h" @@ -64,10 +65,10 @@ int main(int argc, char **argv) { std::ostream *Out = 0; try { // Parse the file now... - ParseError Err; + SMDiagnostic Err; std::auto_ptr M(ParseAssemblyFile(InputFilename, Err, Context)); if (M.get() == 0) { - Err.PrintError(argv[0], errs()); + Err.Print(argv[0], errs()); return 1; } -- 2.34.1