mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-23 14:25:07 +00:00
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:
@@ -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
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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() {
|
||||||
|
@@ -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();
|
||||||
|
|
||||||
|
@@ -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";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user