Change to verifier interface
[oota-llvm.git] / lib / AsmParser / Parser.cpp
1 //===- Parser.cpp - Main dispatch module for the Parser library -------------===
2 //
3 // This library implements the functionality defined in llvm/assembly/parser.h
4 //
5 //===------------------------------------------------------------------------===
6
7 #include "llvm/Analysis/Verifier.h"
8 #include "llvm/Module.h"
9 #include "ParserInternals.h"
10 #include <stdio.h>  // for sprintf
11 using std::string;
12
13 // The useful interface defined by this file... Parse an ascii file, and return
14 // the internal representation in a nice slice'n'dice'able representation.
15 //
16 Module *ParseAssemblyFile(const string &Filename) { // throw (ParseException)
17   FILE *F = stdin;
18
19   if (Filename != "-") 
20     F = fopen(Filename.c_str(), "r");
21
22   if (F == 0) {
23     throw ParseException(Filename, string("Could not open file '") + 
24                          Filename + "'");
25   }
26
27   // TODO: If this throws an exception, F is not closed.
28   Module *Result = RunVMAsmParser(Filename, F);
29
30   if (F != stdin)
31     fclose(F);
32
33   if (Result) {  // Check to see that it is valid...
34     if (verifyModule(Result)) {
35       delete Result;
36       throw ParseException(Filename, "Source file is not well formed LLVM!");
37     }
38   }
39   return Result;
40 }
41
42
43 //===------------------------------------------------------------------------===
44 //                              ParseException Class
45 //===------------------------------------------------------------------------===
46
47
48 ParseException::ParseException(const string &filename, const string &message, 
49                                int lineNo, int colNo) 
50   : Filename(filename), Message(message) {
51   LineNo = lineNo; ColumnNo = colNo;
52 }
53
54 ParseException::ParseException(const ParseException &E) 
55   : Filename(E.Filename), Message(E.Message) {
56   LineNo = E.LineNo;
57   ColumnNo = E.ColumnNo;
58 }
59
60 const string ParseException::getMessage() const { // Includes info from options
61   string Result;
62   char Buffer[10];
63
64   if (Filename == "-") 
65     Result += "<stdin>";
66   else
67     Result += Filename;
68
69   if (LineNo != -1) {
70     sprintf(Buffer, "%d", LineNo);
71     Result += string(":") + Buffer;
72     if (ColumnNo != -1) {
73       sprintf(Buffer, "%d", ColumnNo);
74       Result += string(",") + Buffer;
75     }
76   }
77   
78   return Result + ": " + Message;
79 }