diff options
| author | Chris Lattner <sabre@nondot.org> | 2001-06-06 20:29:01 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2001-06-06 20:29:01 +0000 |
| commit | 2f7c963559dbc6dbda43df77a090a93f94c6625e (patch) | |
| tree | 095d7b8910fd91af079a547362923a3ed877ded1 /llvm/lib/AsmParser/Parser.cpp | |
| parent | 97724f18c79c7cc81ced24239eb5e883bf1398ef (diff) | |
| download | bcm5719-llvm-2f7c963559dbc6dbda43df77a090a93f94c6625e.tar.gz bcm5719-llvm-2f7c963559dbc6dbda43df77a090a93f94c6625e.zip | |
Initial revision
llvm-svn: 2
Diffstat (limited to 'llvm/lib/AsmParser/Parser.cpp')
| -rw-r--r-- | llvm/lib/AsmParser/Parser.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/llvm/lib/AsmParser/Parser.cpp b/llvm/lib/AsmParser/Parser.cpp new file mode 100644 index 00000000000..57c831e9e17 --- /dev/null +++ b/llvm/lib/AsmParser/Parser.cpp @@ -0,0 +1,84 @@ +//===- Parser.cpp - Main dispatch module for the Parser library -------------=== +// +// This library implements the functionality defined in llvm/assembly/parser.h +// +//===------------------------------------------------------------------------=== + +#include "llvm/Analysis/Verifier.h" +#include "llvm/Module.h" +#include "ParserInternals.h" +#include <stdio.h> // for sprintf + +// 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 ToolCommandLine &Opts) throw (ParseException) { + FILE *F = stdin; + + if (Opts.getInputFilename() != "-") + F = fopen(Opts.getInputFilename().c_str(), "r"); + + if (F == 0) { + throw ParseException(Opts, string("Could not open file '") + + Opts.getInputFilename() + "'"); + } + + // TODO: If this throws an exception, F is not closed. + Module *Result = RunVMAsmParser(Opts, F); + + if (F != stdin) + fclose(F); + + if (Result) { // Check to see that it is valid... + vector<string> 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(Opts, Message); + } + } + return Result; +} + + +//===------------------------------------------------------------------------=== +// ParseException Class +//===------------------------------------------------------------------------=== + + +ParseException::ParseException(const ToolCommandLine &opts, + const string &message, int lineNo, int colNo) + : Opts(opts), Message(message) { + LineNo = lineNo; ColumnNo = colNo; +} + +ParseException::ParseException(const ParseException &E) + : Opts(E.Opts), Message(E.Message) { + LineNo = E.LineNo; + ColumnNo = E.ColumnNo; +} + +const string ParseException::getMessage() const { // Includes info from options + string Result; + char Buffer[10]; + + if (Opts.getInputFilename() == "-") + Result += "<stdin>"; + else + Result += Opts.getInputFilename(); + + if (LineNo != -1) { + sprintf(Buffer, "%d", LineNo); + Result += string(":") + Buffer; + if (ColumnNo != -1) { + sprintf(Buffer, "%d", ColumnNo); + Result += string(",") + Buffer; + } + } + + return Result + ": " + Message; +} |

