X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FAsmParser%2FParser.cpp;h=0005e11737b8e781c4e79c80dd3231168da7555a;hb=629c1a3f78494d0dd769fe82bd2bd17df0555843;hp=4b280efd7d0b3e7425d2643eb09e92d2bfeb328f;hpb=697954c15da58bd8b186dbafdedd8b06db770201;p=oota-llvm.git diff --git a/lib/AsmParser/Parser.cpp b/lib/AsmParser/Parser.cpp index 4b280efd7d0..0005e11737b 100644 --- a/lib/AsmParser/Parser.cpp +++ b/lib/AsmParser/Parser.cpp @@ -1,85 +1,90 @@ //===- Parser.cpp - Main dispatch module for the Parser library -------------=== // +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// // This library implements the functionality defined in llvm/assembly/parser.h // //===------------------------------------------------------------------------=== -#include "llvm/Analysis/Verifier.h" -#include "llvm/Module.h" #include "ParserInternals.h" -#include // for sprintf -using std::string; +#include "llvm/Module.h" +#include "llvm/Support/MemoryBuffer.h" +#include +using namespace llvm; -// The useful interface defined by this file... Parse an ascii file, and return -// the internal representation in a nice slice'n'dice'able representation. -// -Module *ParseAssemblyFile(const string &Filename) { // throw (ParseException) - FILE *F = stdin; - if (Filename != "-") - F = fopen(Filename.c_str(), "r"); +ParseError* TheParseError = 0; /// FIXME: Not threading friendly +Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError* Err) { + std::string ErrorStr; + MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr); if (F == 0) { - throw ParseException(Filename, string("Could not open file '") + - Filename + "'"); + if (Err) + Err->setError(Filename, "Could not open input file '" + Filename + "'"); + return 0; } + + TheParseError = Err; + Module *Result = RunVMAsmParser(F); + delete F; + return Result; +} - // TODO: If this throws an exception, F is not closed. - Module *Result = RunVMAsmParser(Filename, F); - - if (F != stdin) - fclose(F); - - if (Result) { // Check to see that it is valid... - std::vector Errors; - if (verify(Result, Errors)) { - delete Result; Result = 0; - string Message; - - for (unsigned i = 0; i < Errors.size(); i++) - Message += Errors[i] + "\n"; - - throw ParseException(Filename, Message); - } - } +Module *llvm::ParseAssemblyString(const char *AsmString, Module *M, + ParseError *Err) { + TheParseError = Err; + MemoryBuffer *F = MemoryBuffer::getMemBuffer(AsmString, + AsmString+strlen(AsmString), + ""); + Module *Result = RunVMAsmParser(F); + delete F; return Result; } //===------------------------------------------------------------------------=== -// ParseException Class +// ParseError Class //===------------------------------------------------------------------------=== -ParseException::ParseException(const string &filename, const string &message, - int lineNo, int colNo) - : Filename(filename), Message(message) { - LineNo = lineNo; ColumnNo = colNo; +void ParseError::setError(const std::string &filename, + const std::string &message, + int lineNo, int colNo) { + Filename = filename; + Message = message; + LineNo = lineNo; + colNo = colNo; } -ParseException::ParseException(const ParseException &E) +ParseError::ParseError(const ParseError &E) : Filename(E.Filename), Message(E.Message) { LineNo = E.LineNo; ColumnNo = E.ColumnNo; } -const string ParseException::getMessage() const { // Includes info from options - string Result; +// Includes info from options +const std::string ParseError::getMessage() const { + std::string Result; char Buffer[10]; - if (Filename == "-") + if (Filename == "-") Result += ""; else Result += Filename; if (LineNo != -1) { sprintf(Buffer, "%d", LineNo); - Result += string(":") + Buffer; + Result += std::string(":") + Buffer; if (ColumnNo != -1) { sprintf(Buffer, "%d", ColumnNo); - Result += string(",") + Buffer; + Result += std::string(",") + Buffer; } } - + return Result + ": " + Message; }