blob: 2d6185efeb03384bbb82ce5c4b3a992f4ff1b411 [file] [log] [blame]
Chris Lattner00950542001-06-06 20:29:01 +00001//===- Parser.cpp - Main dispatch module for the Parser library -------------===
John Criswellb576c942003-10-20 19:43:21 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattner00950542001-06-06 20:29:01 +00009//
10// This library implements the functionality defined in llvm/assembly/parser.h
11//
12//===------------------------------------------------------------------------===
13
Chris Lattner00950542001-06-06 20:29:01 +000014#include "ParserInternals.h"
Misha Brukman19138482003-10-23 18:00:34 +000015#include "llvm/Module.h"
16#include "llvm/Analysis/Verifier.h"
Chris Lattner00950542001-06-06 20:29:01 +000017
Brian Gaeked0fde302003-11-11 22:41:34 +000018namespace llvm {
19
Misha Brukman32299912003-09-22 23:50:25 +000020// The useful interface defined by this file... Parse an ASCII file, and return
Chris Lattner00950542001-06-06 20:29:01 +000021// the internal representation in a nice slice'n'dice'able representation.
22//
Misha Brukman19138482003-10-23 18:00:34 +000023Module *ParseAssemblyFile(const std::string &Filename) {
Chris Lattner00950542001-06-06 20:29:01 +000024 FILE *F = stdin;
25
Chris Lattnerfbdb1da2002-02-20 18:06:43 +000026 if (Filename != "-") {
Chris Lattnera2850432001-07-22 18:36:00 +000027 F = fopen(Filename.c_str(), "r");
Chris Lattner00950542001-06-06 20:29:01 +000028
Chris Lattnerfbdb1da2002-02-20 18:06:43 +000029 if (F == 0)
30 throw ParseException(Filename, "Could not open file '" + Filename + "'");
Chris Lattner00950542001-06-06 20:29:01 +000031 }
32
Chris Lattnerfbdb1da2002-02-20 18:06:43 +000033 Module *Result;
34 try {
35 Result = RunVMAsmParser(Filename, F);
36 } catch (...) {
37 if (F != stdin) fclose(F); // Make sure to close file descriptor if an
38 throw; // exception is thrown
39 }
Chris Lattner00950542001-06-06 20:29:01 +000040
41 if (F != stdin)
42 fclose(F);
43
Chris Lattner00950542001-06-06 20:29:01 +000044 return Result;
45}
46
47
48//===------------------------------------------------------------------------===
49// ParseException Class
50//===------------------------------------------------------------------------===
51
52
Misha Brukman19138482003-10-23 18:00:34 +000053ParseException::ParseException(const std::string &filename,
54 const std::string &message,
Chris Lattnera2850432001-07-22 18:36:00 +000055 int lineNo, int colNo)
56 : Filename(filename), Message(message) {
Chris Lattner00950542001-06-06 20:29:01 +000057 LineNo = lineNo; ColumnNo = colNo;
58}
59
60ParseException::ParseException(const ParseException &E)
Chris Lattnera2850432001-07-22 18:36:00 +000061 : Filename(E.Filename), Message(E.Message) {
Chris Lattner00950542001-06-06 20:29:01 +000062 LineNo = E.LineNo;
63 ColumnNo = E.ColumnNo;
64}
65
Misha Brukman19138482003-10-23 18:00:34 +000066// Includes info from options
67const std::string ParseException::getMessage() const {
68 std::string Result;
Chris Lattner00950542001-06-06 20:29:01 +000069 char Buffer[10];
70
Chris Lattnera2850432001-07-22 18:36:00 +000071 if (Filename == "-")
Chris Lattner00950542001-06-06 20:29:01 +000072 Result += "<stdin>";
73 else
Chris Lattnera2850432001-07-22 18:36:00 +000074 Result += Filename;
Chris Lattner00950542001-06-06 20:29:01 +000075
76 if (LineNo != -1) {
77 sprintf(Buffer, "%d", LineNo);
Misha Brukman19138482003-10-23 18:00:34 +000078 Result += std::string(":") + Buffer;
Chris Lattner00950542001-06-06 20:29:01 +000079 if (ColumnNo != -1) {
80 sprintf(Buffer, "%d", ColumnNo);
Misha Brukman19138482003-10-23 18:00:34 +000081 Result += std::string(",") + Buffer;
Chris Lattner00950542001-06-06 20:29:01 +000082 }
83 }
84
85 return Result + ": " + Message;
86}
Brian Gaeked0fde302003-11-11 22:41:34 +000087
88} // End llvm namespace