switch the .ll parser into SMDiagnostic.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74734 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2009-07-02 22:46:18 +00:00
parent 7e1e31f467
commit 92bcb426c3
7 changed files with 26 additions and 105 deletions

View File

@@ -19,7 +19,7 @@
namespace llvm { namespace llvm {
class Module; class Module;
class ParseError; class SMDiagnostic;
class raw_ostream; class raw_ostream;
class LLVMContext; class LLVMContext;
@@ -31,8 +31,8 @@ class LLVMContext;
/// @brief Parse LLVM Assembly from a file /// @brief Parse LLVM Assembly from a file
Module *ParseAssemblyFile( Module *ParseAssemblyFile(
const std::string &Filename, ///< The name of the file to parse const std::string &Filename, ///< The name of the file to parse
ParseError &Error, ///< If not null, an object to return errors in. SMDiagnostic &Error, ///< Error result info.
LLVMContext& Context ///< Context in which to allocate globals info. LLVMContext &Context ///< Context in which to allocate globals info.
); );
/// The function is a secondary interface to the LLVM Assembly Parser. It parses /// The function is a secondary interface to the LLVM Assembly Parser. It parses
@@ -44,61 +44,10 @@ Module *ParseAssemblyFile(
Module *ParseAssemblyString( Module *ParseAssemblyString(
const char *AsmString, ///< The string containing assembly const char *AsmString, ///< The string containing assembly
Module *M, ///< A module to add the assembly too. Module *M, ///< A module to add the assembly too.
ParseError &Error, ///< If not null, an object to return errors in. SMDiagnostic &Error, ///< Error result info.
LLVMContext& Context LLVMContext &Context
); );
//===------------------------------------------------------------------------===
// Helper Classes
//===------------------------------------------------------------------------===
/// An instance of this class can be passed to ParseAssemblyFile or
/// ParseAssemblyString functions in order to capture error information from
/// the parser. It provides a standard way to print out the error message
/// including the file name and line number where the error occurred.
/// @brief An LLVM Assembly Parsing Error Object
class ParseError {
public:
ParseError() : Filename("unknown"), Message("none"), LineNo(0), ColumnNo(0) {}
ParseError(const ParseError &E);
void setFilename(const std::string &F) { Filename = F; }
inline const std::string &getRawMessage() const { // Just the raw message.
return Message;
}
inline const std::string &getFilename() const {
return Filename;
}
void setError(const std::string &message, int lineNo = -1, int ColNo = -1,
const std::string &FileContents = "") {
Message = message;
LineNo = lineNo; ColumnNo = ColNo;
LineContents = FileContents;
}
// getErrorLocation - Return the line and column number of the error in the
// input source file. The source filename can be derived from the
// ParserOptions in effect. If positional information is not applicable,
// these will return a value of -1.
//
inline void getErrorLocation(int &Line, int &Column) const {
Line = LineNo; Column = ColumnNo;
}
void PrintError(const char *ProgName, raw_ostream &S);
private :
std::string Filename;
std::string Message;
int LineNo, ColumnNo; // -1 if not relevant
std::string LineContents;
void operator=(const ParseError &E); // DO NOT IMPLEMENT
};
} // End llvm namespace } // End llvm namespace
#endif #endif

View File

@@ -16,6 +16,7 @@
#include "llvm/Instruction.h" #include "llvm/Instruction.h"
#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/MathExtras.h" #include "llvm/Support/MathExtras.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
#include "llvm/Assembly/Parser.h" #include "llvm/Assembly/Parser.h"
#include <cstdlib> #include <cstdlib>
@@ -38,8 +39,9 @@ bool LLLexer::Error(LocTy ErrorLoc, const std::string &Msg) const {
for (const char *FP = CurBuf->getBufferStart(); FP != ErrorLoc; ++FP) for (const char *FP = CurBuf->getBufferStart(); FP != ErrorLoc; ++FP)
if (*FP == '\n') ++LineNo; if (*FP == '\n') ++LineNo;
std::string LineContents(LineStart, LineEnd); ErrorInfo = SMDiagnostic(CurBuf->getBufferIdentifier(),
ErrorInfo.setError(Msg, LineNo, ErrorLoc-LineStart, LineContents); LineNo, ErrorLoc-LineStart, Msg,
std::string(LineStart, LineEnd));
return true; return true;
} }
@@ -195,7 +197,7 @@ static const char *isLabelTail(const char *CurPtr) {
// Lexer definition. // Lexer definition.
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
LLLexer::LLLexer(MemoryBuffer *StartBuf, ParseError &Err) LLLexer::LLLexer(MemoryBuffer *StartBuf, SMDiagnostic &Err)
: CurBuf(StartBuf), ErrorInfo(Err), APFloatVal(0.0) { : CurBuf(StartBuf), ErrorInfo(Err), APFloatVal(0.0) {
CurPtr = CurBuf->getBufferStart(); CurPtr = CurBuf->getBufferStart();
} }

View File

@@ -22,12 +22,12 @@
namespace llvm { namespace llvm {
class MemoryBuffer; class MemoryBuffer;
class Type; class Type;
class ParseError; class SMDiagnostic;
class LLLexer { class LLLexer {
const char *CurPtr; const char *CurPtr;
MemoryBuffer *CurBuf; MemoryBuffer *CurBuf;
ParseError &ErrorInfo; SMDiagnostic &ErrorInfo;
// Information about the current token. // Information about the current token.
const char *TokStart; const char *TokStart;
@@ -40,7 +40,7 @@ namespace llvm {
std::string TheError; std::string TheError;
public: public:
explicit LLLexer(MemoryBuffer *StartBuf, ParseError &); explicit LLLexer(MemoryBuffer *StartBuf, SMDiagnostic &);
~LLLexer() {} ~LLLexer() {}
lltok::Kind Lex() { lltok::Kind Lex() {

View File

@@ -73,7 +73,7 @@ namespace llvm {
std::map<unsigned, std::pair<GlobalValue*, LocTy> > ForwardRefValIDs; std::map<unsigned, std::pair<GlobalValue*, LocTy> > ForwardRefValIDs;
std::vector<GlobalValue*> NumberedVals; std::vector<GlobalValue*> NumberedVals;
public: public:
LLParser(MemoryBuffer *F, ParseError &Err, Module *m) : LLParser(MemoryBuffer *F, SMDiagnostic &Err, Module *m) :
Context(m->getContext()), Lex(F, Err), M(m) {} Context(m->getContext()), Lex(F, Err), M(m) {}
bool Run(); bool Run();

View File

@@ -15,20 +15,20 @@
#include "LLParser.h" #include "LLParser.h"
#include "llvm/Module.h" #include "llvm/Module.h"
#include "llvm/ADT/OwningPtr.h" #include "llvm/ADT/OwningPtr.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
#include <cstring> #include <cstring>
using namespace llvm; using namespace llvm;
Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError &Err, Module *llvm::ParseAssemblyFile(const std::string &Filename, SMDiagnostic &Err,
LLVMContext& Context) { LLVMContext &Context) {
Err.setFilename(Filename);
std::string ErrorStr; std::string ErrorStr;
OwningPtr<MemoryBuffer> OwningPtr<MemoryBuffer>
F(MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr)); F(MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr));
if (F == 0) { if (F == 0) {
Err.setError("Could not open input file '" + Filename + "'"); Err = SMDiagnostic("", -1, -1,
"Could not open input file '" + Filename + "'", "");
return 0; return 0;
} }
@@ -39,9 +39,7 @@ Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError &Err,
} }
Module *llvm::ParseAssemblyString(const char *AsmString, Module *M, Module *llvm::ParseAssemblyString(const char *AsmString, Module *M,
ParseError &Err, LLVMContext& Context) { SMDiagnostic &Err, LLVMContext &Context) {
Err.setFilename("<string>");
OwningPtr<MemoryBuffer> OwningPtr<MemoryBuffer>
F(MemoryBuffer::getMemBuffer(AsmString, AsmString+strlen(AsmString), F(MemoryBuffer::getMemBuffer(AsmString, AsmString+strlen(AsmString),
"<string>")); "<string>"));
@@ -56,33 +54,3 @@ Module *llvm::ParseAssemblyString(const char *AsmString, Module *M,
return 0; return 0;
return M2.take(); return M2.take();
} }
//===------------------------------------------------------------------------===
// ParseError Class
//===------------------------------------------------------------------------===
void ParseError::PrintError(const char *ProgName, raw_ostream &S) {
errs() << ProgName << ": ";
if (Filename == "-")
errs() << "<stdin>";
else
errs() << Filename;
if (LineNo != -1) {
errs() << ':' << LineNo;
if (ColumnNo != -1)
errs() << ':' << (ColumnNo+1);
}
errs() << ": " << Message << '\n';
if (LineNo != -1 && ColumnNo != -1) {
errs() << LineContents << '\n';
// Print out spaces/tabs before the caret.
for (unsigned i = 0; i != unsigned(ColumnNo); ++i)
errs() << (LineContents[i] == '\t' ? '\t' : ' ');
errs() << "^\n";
}
}

View File

@@ -23,6 +23,7 @@
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/FileUtilities.h" #include "llvm/Support/FileUtilities.h"
#include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
#include <iostream> #include <iostream>
#include <memory> #include <memory>
@@ -82,9 +83,9 @@ Module *llvm::ParseInputFile(const std::string &Filename,
if (Buffer.get()) if (Buffer.get())
Result = ParseBitcodeFile(Buffer.get(), Ctxt); Result = ParseBitcodeFile(Buffer.get(), Ctxt);
ParseError Err; SMDiagnostic Err;
if (!Result && !(Result = ParseAssemblyFile(Filename, Err, Ctxt))) { if (!Result && !(Result = ParseAssemblyFile(Filename, Err, Ctxt))) {
Err.PrintError("bugpoint", errs()); Err.Print("bugpoint", errs());
Result = 0; Result = 0;
} }

View File

@@ -23,6 +23,7 @@
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/Streams.h" #include "llvm/Support/Streams.h"
#include "llvm/Support/SystemUtils.h" #include "llvm/Support/SystemUtils.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
@@ -64,10 +65,10 @@ int main(int argc, char **argv) {
std::ostream *Out = 0; std::ostream *Out = 0;
try { try {
// Parse the file now... // Parse the file now...
ParseError Err; SMDiagnostic Err;
std::auto_ptr<Module> M(ParseAssemblyFile(InputFilename, Err, Context)); std::auto_ptr<Module> M(ParseAssemblyFile(InputFilename, Err, Context));
if (M.get() == 0) { if (M.get() == 0) {
Err.PrintError(argv[0], errs()); Err.Print(argv[0], errs());
return 1; return 1;
} }