X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FAsmParser%2FParser.cpp;h=0005e11737b8e781c4e79c80dd3231168da7555a;hb=629c1a3f78494d0dd769fe82bd2bd17df0555843;hp=e8a7bdbbb9896010066edbd28052b88f6e446758;hpb=1913848e337c982f7997fc5fe2a722e514315308;p=oota-llvm.git diff --git a/lib/AsmParser/Parser.cpp b/lib/AsmParser/Parser.cpp index e8a7bdbbb98..0005e11737b 100644 --- a/lib/AsmParser/Parser.cpp +++ b/lib/AsmParser/Parser.cpp @@ -1,10 +1,10 @@ //===- Parser.cpp - Main dispatch module for the Parser library -------------=== -// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// 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 @@ -13,60 +13,66 @@ #include "ParserInternals.h" #include "llvm/Module.h" -#include "llvm/Analysis/Verifier.h" - -// 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 std::string &Filename) { - FILE *F = stdin; +#include "llvm/Support/MemoryBuffer.h" +#include +using namespace llvm; - if (Filename != "-") { - F = fopen(Filename.c_str(), "r"); - if (F == 0) - throw ParseException(Filename, "Could not open file '" + Filename + "'"); - } +ParseError* TheParseError = 0; /// FIXME: Not threading friendly - Module *Result; - try { - Result = RunVMAsmParser(Filename, F); - } catch (...) { - if (F != stdin) fclose(F); // Make sure to close file descriptor if an - throw; // exception is thrown +Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError* Err) { + 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 + "'"); + return 0; } + + TheParseError = Err; + Module *Result = RunVMAsmParser(F); + delete F; + return Result; +} - if (F != stdin) - fclose(F); - +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 std::string &filename, - const std::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; } // Includes info from options -const std::string ParseException::getMessage() const { +const std::string ParseError::getMessage() const { std::string Result; char Buffer[10]; - if (Filename == "-") + if (Filename == "-") Result += ""; else Result += Filename; @@ -79,6 +85,6 @@ const std::string ParseException::getMessage() const { Result += std::string(",") + Buffer; } } - + return Result + ": " + Message; }