mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Add a pointer to the owning LLVMContext to Module. This requires threading LLVMContext through a lot
of the bitcode reader and ASM parser APIs, as well as supporting it in all of the tools. Patches for Clang and LLVM-GCC to follow. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74614 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -138,9 +138,9 @@ bool ArchiveMember::replaceWith(const sys::Path& newFile, std::string* ErrMsg) {
|
||||
// Archive constructor - this is the only constructor that gets used for the
|
||||
// Archive class. Everything else (default,copy) is deprecated. This just
|
||||
// initializes and maps the file into memory, if requested.
|
||||
Archive::Archive(const sys::Path& filename)
|
||||
Archive::Archive(const sys::Path& filename, LLVMContext* C)
|
||||
: archPath(filename), members(), mapfile(0), base(0), symTab(), strtab(),
|
||||
symTabSize(0), firstFileOffset(0), modules(), foreignST(0) {
|
||||
symTabSize(0), firstFileOffset(0), modules(), foreignST(0), Context(C) {
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -208,6 +208,7 @@ static void getSymbols(Module*M, std::vector<std::string>& symbols) {
|
||||
|
||||
// Get just the externally visible defined symbols from the bitcode
|
||||
bool llvm::GetBitcodeSymbols(const sys::Path& fName,
|
||||
LLVMContext* Context,
|
||||
std::vector<std::string>& symbols,
|
||||
std::string* ErrMsg) {
|
||||
std::auto_ptr<MemoryBuffer> Buffer(
|
||||
@@ -217,7 +218,7 @@ bool llvm::GetBitcodeSymbols(const sys::Path& fName,
|
||||
return true;
|
||||
}
|
||||
|
||||
ModuleProvider *MP = getBitcodeModuleProvider(Buffer.get(), ErrMsg);
|
||||
ModuleProvider *MP = getBitcodeModuleProvider(Buffer.get(), Context, ErrMsg);
|
||||
if (!MP)
|
||||
return true;
|
||||
|
||||
@@ -239,13 +240,14 @@ bool llvm::GetBitcodeSymbols(const sys::Path& fName,
|
||||
ModuleProvider*
|
||||
llvm::GetBitcodeSymbols(const unsigned char *BufPtr, unsigned Length,
|
||||
const std::string& ModuleID,
|
||||
LLVMContext* Context,
|
||||
std::vector<std::string>& symbols,
|
||||
std::string* ErrMsg) {
|
||||
// Get the module provider
|
||||
MemoryBuffer *Buffer =MemoryBuffer::getNewMemBuffer(Length, ModuleID.c_str());
|
||||
memcpy((char*)Buffer->getBufferStart(), BufPtr, Length);
|
||||
|
||||
ModuleProvider *MP = getBitcodeModuleProvider(Buffer, ErrMsg);
|
||||
ModuleProvider *MP = getBitcodeModuleProvider(Buffer, Context, ErrMsg);
|
||||
if (!MP)
|
||||
return 0;
|
||||
|
||||
|
@@ -31,6 +31,8 @@
|
||||
|
||||
namespace llvm {
|
||||
|
||||
class LLVMContext;
|
||||
|
||||
/// The ArchiveMemberHeader structure is used internally for bitcode
|
||||
/// archives.
|
||||
/// The header precedes each file member in the archive. This structure is
|
||||
@@ -71,11 +73,13 @@ namespace llvm {
|
||||
|
||||
// Get just the externally visible defined symbols from the bitcode
|
||||
bool GetBitcodeSymbols(const sys::Path& fName,
|
||||
LLVMContext* Context,
|
||||
std::vector<std::string>& symbols,
|
||||
std::string* ErrMsg);
|
||||
|
||||
ModuleProvider* GetBitcodeSymbols(const unsigned char*Buffer,unsigned Length,
|
||||
const std::string& ModuleID,
|
||||
LLVMContext* Context,
|
||||
std::vector<std::string>& symbols,
|
||||
std::string* ErrMsg);
|
||||
}
|
||||
|
@@ -327,9 +327,9 @@ Archive::loadArchive(std::string* error) {
|
||||
|
||||
// Open and completely load the archive file.
|
||||
Archive*
|
||||
Archive::OpenAndLoad(const sys::Path& file, std::string* ErrorMessage)
|
||||
{
|
||||
std::auto_ptr<Archive> result ( new Archive(file));
|
||||
Archive::OpenAndLoad(const sys::Path& file, LLVMContext* C,
|
||||
std::string* ErrorMessage) {
|
||||
std::auto_ptr<Archive> result ( new Archive(file, C));
|
||||
if (result->mapToMemory(ErrorMessage))
|
||||
return 0;
|
||||
if (!result->loadArchive(ErrorMessage))
|
||||
@@ -339,7 +339,8 @@ Archive::OpenAndLoad(const sys::Path& file, std::string* ErrorMessage)
|
||||
|
||||
// Get all the bitcode modules from the archive
|
||||
bool
|
||||
Archive::getAllModules(std::vector<Module*>& Modules, std::string* ErrMessage) {
|
||||
Archive::getAllModules(std::vector<Module*>& Modules,
|
||||
std::string* ErrMessage) {
|
||||
|
||||
for (iterator I=begin(), E=end(); I != E; ++I) {
|
||||
if (I->isBitcode()) {
|
||||
@@ -349,7 +350,7 @@ Archive::getAllModules(std::vector<Module*>& Modules, std::string* ErrMessage) {
|
||||
MemoryBuffer::getNewMemBuffer(I->getSize(), FullMemberName.c_str());
|
||||
memcpy((char*)Buffer->getBufferStart(), I->getData(), I->getSize());
|
||||
|
||||
Module *M = ParseBitcodeFile(Buffer, ErrMessage);
|
||||
Module *M = ParseBitcodeFile(Buffer, Context, ErrMessage);
|
||||
delete Buffer;
|
||||
if (!M)
|
||||
return true;
|
||||
@@ -440,9 +441,9 @@ Archive::loadSymbolTable(std::string* ErrorMsg) {
|
||||
}
|
||||
|
||||
// Open the archive and load just the symbol tables
|
||||
Archive*
|
||||
Archive::OpenAndLoadSymbols(const sys::Path& file, std::string* ErrorMessage) {
|
||||
std::auto_ptr<Archive> result ( new Archive(file) );
|
||||
Archive* Archive::OpenAndLoadSymbols(const sys::Path& file, LLVMContext* C,
|
||||
std::string* ErrorMessage) {
|
||||
std::auto_ptr<Archive> result ( new Archive(file, C) );
|
||||
if (result->mapToMemory(ErrorMessage))
|
||||
return 0;
|
||||
if (!result->loadSymbolTable(ErrorMessage))
|
||||
@@ -488,7 +489,7 @@ Archive::findModuleDefiningSymbol(const std::string& symbol,
|
||||
FullMemberName.c_str());
|
||||
memcpy((char*)Buffer->getBufferStart(), mbr->getData(), mbr->getSize());
|
||||
|
||||
ModuleProvider *mp = getBitcodeModuleProvider(Buffer, ErrMsg);
|
||||
ModuleProvider *mp = getBitcodeModuleProvider(Buffer, Context, ErrMsg);
|
||||
if (!mp)
|
||||
return 0;
|
||||
|
||||
@@ -536,7 +537,7 @@ Archive::findModulesDefiningSymbols(std::set<std::string>& symbols,
|
||||
mbr->getPath().toString() + ")";
|
||||
ModuleProvider* MP =
|
||||
GetBitcodeSymbols((const unsigned char*)At, mbr->getSize(),
|
||||
FullMemberName, symbols, error);
|
||||
FullMemberName, Context, symbols, error);
|
||||
|
||||
if (MP) {
|
||||
// Insert the module's symbols into the symbol table
|
||||
@@ -615,7 +616,7 @@ bool Archive::isBitcodeArchive() {
|
||||
MemoryBuffer *Buffer =
|
||||
MemoryBuffer::getNewMemBuffer(I->getSize(), FullMemberName.c_str());
|
||||
memcpy((char*)Buffer->getBufferStart(), I->getData(), I->getSize());
|
||||
Module *M = ParseBitcodeFile(Buffer);
|
||||
Module *M = ParseBitcodeFile(Buffer, Context);
|
||||
delete Buffer;
|
||||
if (!M)
|
||||
return false; // Couldn't parse bitcode, not a bitcode archive.
|
||||
|
@@ -64,9 +64,8 @@ static inline unsigned numVbrBytes(unsigned num) {
|
||||
}
|
||||
|
||||
// Create an empty archive.
|
||||
Archive*
|
||||
Archive::CreateEmpty(const sys::Path& FilePath ) {
|
||||
Archive* result = new Archive(FilePath);
|
||||
Archive* Archive::CreateEmpty(const sys::Path& FilePath, LLVMContext* C) {
|
||||
Archive* result = new Archive(FilePath, C);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -229,7 +228,7 @@ Archive::writeMember(
|
||||
+ ")";
|
||||
ModuleProvider* MP =
|
||||
GetBitcodeSymbols((const unsigned char*)data,fSize,
|
||||
FullMemberName, symbols, ErrMsg);
|
||||
FullMemberName, Context, symbols, ErrMsg);
|
||||
|
||||
// If the bitcode parsed successfully
|
||||
if ( MP ) {
|
||||
|
Reference in New Issue
Block a user