mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 20:23:59 +00:00
Adjustments to allow Bytecode Reading to support the BytecodeHandler
interface which is called by the reader if a BytecodeHandler is provided. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14493 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -12,8 +12,9 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "llvm/Bytecode/Analyzer.h"
|
||||||
#include "llvm/Bytecode/Reader.h"
|
#include "llvm/Bytecode/Reader.h"
|
||||||
#include "ReaderInternals.h"
|
#include "Reader.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
#include "llvm/Instructions.h"
|
#include "llvm/Instructions.h"
|
||||||
#include "Support/FileUtilities.h"
|
#include "Support/FileUtilities.h"
|
||||||
@ -29,7 +30,7 @@ using namespace llvm;
|
|||||||
namespace {
|
namespace {
|
||||||
/// BytecodeFileReader - parses a bytecode file from a file
|
/// BytecodeFileReader - parses a bytecode file from a file
|
||||||
///
|
///
|
||||||
class BytecodeFileReader : public BytecodeParser {
|
class BytecodeFileReader : public BytecodeReader {
|
||||||
private:
|
private:
|
||||||
unsigned char *Buffer;
|
unsigned char *Buffer;
|
||||||
unsigned Length;
|
unsigned Length;
|
||||||
@ -38,7 +39,7 @@ namespace {
|
|||||||
void operator=(const BytecodeFileReader &BFR); // Do not implement
|
void operator=(const BytecodeFileReader &BFR); // Do not implement
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BytecodeFileReader(const std::string &Filename);
|
BytecodeFileReader(const std::string &Filename, llvm::BytecodeHandler* H=0);
|
||||||
~BytecodeFileReader();
|
~BytecodeFileReader();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -47,7 +48,10 @@ static std::string ErrnoMessage (int savedErrNum, std::string descr) {
|
|||||||
return ::strerror(savedErrNum) + std::string(", while trying to ") + descr;
|
return ::strerror(savedErrNum) + std::string(", while trying to ") + descr;
|
||||||
}
|
}
|
||||||
|
|
||||||
BytecodeFileReader::BytecodeFileReader(const std::string &Filename) {
|
BytecodeFileReader::BytecodeFileReader(const std::string &Filename,
|
||||||
|
llvm::BytecodeHandler* H )
|
||||||
|
: BytecodeReader(H)
|
||||||
|
{
|
||||||
Buffer = (unsigned char*)ReadFileIntoAddressSpace(Filename, Length);
|
Buffer = (unsigned char*)ReadFileIntoAddressSpace(Filename, Length);
|
||||||
if (Buffer == 0)
|
if (Buffer == 0)
|
||||||
throw "Error reading file '" + Filename + "'.";
|
throw "Error reading file '" + Filename + "'.";
|
||||||
@ -73,7 +77,7 @@ BytecodeFileReader::~BytecodeFileReader() {
|
|||||||
namespace {
|
namespace {
|
||||||
/// BytecodeBufferReader - parses a bytecode file from a buffer
|
/// BytecodeBufferReader - parses a bytecode file from a buffer
|
||||||
///
|
///
|
||||||
class BytecodeBufferReader : public BytecodeParser {
|
class BytecodeBufferReader : public BytecodeReader {
|
||||||
private:
|
private:
|
||||||
const unsigned char *Buffer;
|
const unsigned char *Buffer;
|
||||||
bool MustDelete;
|
bool MustDelete;
|
||||||
@ -83,7 +87,8 @@ namespace {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
BytecodeBufferReader(const unsigned char *Buf, unsigned Length,
|
BytecodeBufferReader(const unsigned char *Buf, unsigned Length,
|
||||||
const std::string &ModuleID);
|
const std::string &ModuleID,
|
||||||
|
llvm::BytecodeHandler* Handler = 0);
|
||||||
~BytecodeBufferReader();
|
~BytecodeBufferReader();
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -91,7 +96,9 @@ namespace {
|
|||||||
|
|
||||||
BytecodeBufferReader::BytecodeBufferReader(const unsigned char *Buf,
|
BytecodeBufferReader::BytecodeBufferReader(const unsigned char *Buf,
|
||||||
unsigned Length,
|
unsigned Length,
|
||||||
const std::string &ModuleID)
|
const std::string &ModuleID,
|
||||||
|
llvm::BytecodeHandler* H )
|
||||||
|
: BytecodeReader(H)
|
||||||
{
|
{
|
||||||
// If not aligned, allocate a new buffer to hold the bytecode...
|
// If not aligned, allocate a new buffer to hold the bytecode...
|
||||||
const unsigned char *ParseBegin = 0;
|
const unsigned char *ParseBegin = 0;
|
||||||
@ -125,7 +132,7 @@ BytecodeBufferReader::~BytecodeBufferReader() {
|
|||||||
namespace {
|
namespace {
|
||||||
/// BytecodeStdinReader - parses a bytecode file from stdin
|
/// BytecodeStdinReader - parses a bytecode file from stdin
|
||||||
///
|
///
|
||||||
class BytecodeStdinReader : public BytecodeParser {
|
class BytecodeStdinReader : public BytecodeReader {
|
||||||
private:
|
private:
|
||||||
std::vector<unsigned char> FileData;
|
std::vector<unsigned char> FileData;
|
||||||
unsigned char *FileBuf;
|
unsigned char *FileBuf;
|
||||||
@ -134,11 +141,13 @@ namespace {
|
|||||||
void operator=(const BytecodeStdinReader &BFR); // Do not implement
|
void operator=(const BytecodeStdinReader &BFR); // Do not implement
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BytecodeStdinReader();
|
BytecodeStdinReader( llvm::BytecodeHandler* H = 0 );
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
BytecodeStdinReader::BytecodeStdinReader() {
|
BytecodeStdinReader::BytecodeStdinReader( BytecodeHandler* H )
|
||||||
|
: BytecodeReader(H)
|
||||||
|
{
|
||||||
int BlockSize;
|
int BlockSize;
|
||||||
unsigned char Buffer[4096*4];
|
unsigned char Buffer[4096*4];
|
||||||
|
|
||||||
@ -238,8 +247,10 @@ static ModuleProvider *CheckVarargs(ModuleProvider *MP) {
|
|||||||
ModuleProvider*
|
ModuleProvider*
|
||||||
llvm::getBytecodeBufferModuleProvider(const unsigned char *Buffer,
|
llvm::getBytecodeBufferModuleProvider(const unsigned char *Buffer,
|
||||||
unsigned Length,
|
unsigned Length,
|
||||||
const std::string &ModuleID) {
|
const std::string &ModuleID,
|
||||||
return CheckVarargs(new BytecodeBufferReader(Buffer, Length, ModuleID));
|
BytecodeHandler* H ) {
|
||||||
|
return CheckVarargs(
|
||||||
|
new BytecodeBufferReader(Buffer, Length, ModuleID, H));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ParseBytecodeBuffer - Parse a given bytecode buffer
|
/// ParseBytecodeBuffer - Parse a given bytecode buffer
|
||||||
@ -259,11 +270,12 @@ Module *llvm::ParseBytecodeBuffer(const unsigned char *Buffer, unsigned Length,
|
|||||||
|
|
||||||
/// getBytecodeModuleProvider - lazy function-at-a-time loading from a file
|
/// getBytecodeModuleProvider - lazy function-at-a-time loading from a file
|
||||||
///
|
///
|
||||||
ModuleProvider *llvm::getBytecodeModuleProvider(const std::string &Filename) {
|
ModuleProvider *llvm::getBytecodeModuleProvider(const std::string &Filename,
|
||||||
|
BytecodeHandler* H) {
|
||||||
if (Filename != std::string("-")) // Read from a file...
|
if (Filename != std::string("-")) // Read from a file...
|
||||||
return CheckVarargs(new BytecodeFileReader(Filename));
|
return CheckVarargs(new BytecodeFileReader(Filename,H));
|
||||||
else // Read from stdin
|
else // Read from stdin
|
||||||
return CheckVarargs(new BytecodeStdinReader());
|
return CheckVarargs(new BytecodeStdinReader(H));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ParseBytecodeFile - Parse the given bytecode file
|
/// ParseBytecodeFile - Parse the given bytecode file
|
||||||
@ -279,3 +291,44 @@ Module *llvm::ParseBytecodeFile(const std::string &Filename,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
extern BytecodeHandler* createBytecodeAnalyzerHandler(BytecodeAnalysis& bca );
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnalyzeBytecodeFile - analyze one file
|
||||||
|
Module* llvm::AnalyzeBytecodeFile(const std::string &Filename,
|
||||||
|
BytecodeAnalysis& bca,
|
||||||
|
std::string *ErrorStr)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
BytecodeHandler* analyzerHandler = createBytecodeAnalyzerHandler(bca);
|
||||||
|
std::auto_ptr<ModuleProvider> AMP(
|
||||||
|
getBytecodeModuleProvider(Filename,analyzerHandler));
|
||||||
|
return AMP->releaseModule();
|
||||||
|
} catch (std::string &err) {
|
||||||
|
if (ErrorStr) *ErrorStr = err;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// AnalyzeBytecodeBuffer - analyze a buffer
|
||||||
|
Module* llvm::AnalyzeBytecodeBuffer(
|
||||||
|
const unsigned char* Buffer, ///< Pointer to start of bytecode buffer
|
||||||
|
unsigned Length, ///< Size of the bytecode buffer
|
||||||
|
const std::string& ModuleID, ///< Identifier for the module
|
||||||
|
BytecodeAnalysis& bca, ///< The results of the analysis
|
||||||
|
std::string* ErrorStr ///< Errors, if any.
|
||||||
|
)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
BytecodeHandler* hdlr = createBytecodeAnalyzerHandler(bca);
|
||||||
|
std::auto_ptr<ModuleProvider>
|
||||||
|
AMP(getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, hdlr));
|
||||||
|
return AMP->releaseModule();
|
||||||
|
} catch (std::string &err) {
|
||||||
|
if (ErrorStr) *ErrorStr = err;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// vim: sw=2 ai
|
||||||
|
Reference in New Issue
Block a user