diff options
Diffstat (limited to 'lib/AsmParser/Parser.cpp')
-rw-r--r-- | lib/AsmParser/Parser.cpp | 81 |
1 files changed, 35 insertions, 46 deletions
diff --git a/lib/AsmParser/Parser.cpp b/lib/AsmParser/Parser.cpp index 0005e11737..36c9712b9d 100644 --- a/lib/AsmParser/Parser.cpp +++ b/lib/AsmParser/Parser.cpp @@ -1,4 +1,4 @@ -//===- Parser.cpp - Main dispatch module for the Parser library -------------=== +//===- Parser.cpp - Main dispatch module for the Parser library -----------===// // // The LLVM Compiler Infrastructure // @@ -9,39 +9,40 @@ // // This library implements the functionality defined in llvm/assembly/parser.h // -//===------------------------------------------------------------------------=== +//===----------------------------------------------------------------------===// -#include "ParserInternals.h" +#include "llvm/Assembly/Parser.h" +#include "LLParser.h" #include "llvm/Module.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/raw_ostream.h" #include <cstring> using namespace llvm; - -ParseError* TheParseError = 0; /// FIXME: Not threading friendly - -Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError* Err) { +Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError &Err) { + Err.setFilename(Filename); + std::string ErrorStr; MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr); if (F == 0) { - if (Err) - Err->setError(Filename, "Could not open input file '" + Filename + "'"); + Err.setError("Could not open input file '" + Filename + "'"); return 0; } - TheParseError = Err; - Module *Result = RunVMAsmParser(F); + Module *Result = LLParser(F, Err).Run(); delete F; return Result; } +// FIXME: M is ignored?? Module *llvm::ParseAssemblyString(const char *AsmString, Module *M, - ParseError *Err) { - TheParseError = Err; + ParseError &Err) { + Err.setFilename("<string>"); + MemoryBuffer *F = MemoryBuffer::getMemBuffer(AsmString, AsmString+strlen(AsmString), "<string>"); - Module *Result = RunVMAsmParser(F); + Module *Result = LLParser(F, Err).Run(); delete F; return Result; } @@ -51,40 +52,28 @@ Module *llvm::ParseAssemblyString(const char *AsmString, Module *M, // ParseError Class //===------------------------------------------------------------------------=== - -void ParseError::setError(const std::string &filename, - const std::string &message, - int lineNo, int colNo) { - Filename = filename; - Message = message; - LineNo = lineNo; - colNo = colNo; -} - -ParseError::ParseError(const ParseError &E) - : Filename(E.Filename), Message(E.Message) { - LineNo = E.LineNo; - ColumnNo = E.ColumnNo; -} - -// Includes info from options -const std::string ParseError::getMessage() const { - std::string Result; - char Buffer[10]; - +void ParseError::PrintError(const char *ProgName, raw_ostream &S) { + errs() << ProgName << ": "; if (Filename == "-") - Result += "<stdin>"; + errs() << "<stdin>"; else - Result += Filename; - + errs() << Filename; + if (LineNo != -1) { - sprintf(Buffer, "%d", LineNo); - Result += std::string(":") + Buffer; - if (ColumnNo != -1) { - sprintf(Buffer, "%d", ColumnNo); - Result += std::string(",") + Buffer; - } + 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"; } - - return Result + ": " + Message; } + |