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. llvm-svn: 74614
This commit is contained in:
@@ -18,11 +18,12 @@ using namespace llvm;
|
||||
/* Builds a module from the bitcode in the specified memory buffer, returning a
|
||||
reference to the module via the OutModule parameter. Returns 0 on success.
|
||||
Optionally returns a human-readable error message via OutMessage. */
|
||||
int LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
|
||||
int LLVMParseBitcode(LLVMMemoryBufferRef MemBuf, LLVMContextRef ContextRef,
|
||||
LLVMModuleRef *OutModule, char **OutMessage) {
|
||||
std::string Message;
|
||||
|
||||
*OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), &Message));
|
||||
*OutModule = wrap(ParseBitcodeFile(unwrap(MemBuf), unwrap(ContextRef),
|
||||
&Message));
|
||||
if (!*OutModule) {
|
||||
if (OutMessage)
|
||||
*OutMessage = strdup(Message.c_str());
|
||||
@@ -36,11 +37,13 @@ int LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
|
||||
a module provider which performs lazy deserialization. Returns 0 on success.
|
||||
Optionally returns a human-readable error message via OutMessage. */
|
||||
int LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
|
||||
LLVMContextRef ContextRef,
|
||||
LLVMModuleProviderRef *OutMP,
|
||||
char **OutMessage) {
|
||||
std::string Message;
|
||||
|
||||
*OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), &Message));
|
||||
*OutMP = wrap(getBitcodeModuleProvider(unwrap(MemBuf), unwrap(ContextRef),
|
||||
&Message));
|
||||
if (!*OutMP) {
|
||||
if (OutMessage)
|
||||
*OutMessage = strdup(Message.c_str());
|
||||
|
||||
@@ -1087,7 +1087,7 @@ bool BitcodeReader::ParseModule(const std::string &ModuleID) {
|
||||
return Error("Malformed block record");
|
||||
|
||||
// Otherwise, create the module.
|
||||
TheModule = new Module(ModuleID);
|
||||
TheModule = new Module(ModuleID, Context);
|
||||
|
||||
SmallVector<uint64_t, 64> Record;
|
||||
std::vector<std::string> SectionTable;
|
||||
@@ -2090,8 +2090,9 @@ Module *BitcodeReader::releaseModule(std::string *ErrInfo) {
|
||||
/// getBitcodeModuleProvider - lazy function-at-a-time loading from a file.
|
||||
///
|
||||
ModuleProvider *llvm::getBitcodeModuleProvider(MemoryBuffer *Buffer,
|
||||
LLVMContext* Context,
|
||||
std::string *ErrMsg) {
|
||||
BitcodeReader *R = new BitcodeReader(Buffer);
|
||||
BitcodeReader *R = new BitcodeReader(Buffer, Context);
|
||||
if (R->ParseBitcode()) {
|
||||
if (ErrMsg)
|
||||
*ErrMsg = R->getErrorString();
|
||||
@@ -2106,9 +2107,11 @@ ModuleProvider *llvm::getBitcodeModuleProvider(MemoryBuffer *Buffer,
|
||||
|
||||
/// ParseBitcodeFile - Read the specified bitcode file, returning the module.
|
||||
/// If an error occurs, return null and fill in *ErrMsg if non-null.
|
||||
Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, std::string *ErrMsg){
|
||||
Module *llvm::ParseBitcodeFile(MemoryBuffer *Buffer, LLVMContext* Context,
|
||||
std::string *ErrMsg){
|
||||
BitcodeReader *R;
|
||||
R = static_cast<BitcodeReader*>(getBitcodeModuleProvider(Buffer, ErrMsg));
|
||||
R = static_cast<BitcodeReader*>(getBitcodeModuleProvider(Buffer, Context,
|
||||
ErrMsg));
|
||||
if (!R) return 0;
|
||||
|
||||
// Read in the entire module.
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
namespace llvm {
|
||||
class MemoryBuffer;
|
||||
class LLVMContext;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// BitcodeReaderValueList Class
|
||||
@@ -85,6 +86,7 @@ public:
|
||||
};
|
||||
|
||||
class BitcodeReader : public ModuleProvider {
|
||||
LLVMContext* Context;
|
||||
MemoryBuffer *Buffer;
|
||||
BitstreamReader StreamFile;
|
||||
BitstreamCursor Stream;
|
||||
@@ -123,8 +125,8 @@ class BitcodeReader : public ModuleProvider {
|
||||
/// stream) and what linkage the original function had.
|
||||
DenseMap<Function*, std::pair<uint64_t, unsigned> > DeferredFunctionInfo;
|
||||
public:
|
||||
explicit BitcodeReader(MemoryBuffer *buffer)
|
||||
: Buffer(buffer), ErrorString(0) {
|
||||
explicit BitcodeReader(MemoryBuffer *buffer, LLVMContext* C)
|
||||
: Context(C), Buffer(buffer), ErrorString(0) {
|
||||
HasReversedFunctionsWithBodies = false;
|
||||
}
|
||||
~BitcodeReader() {
|
||||
|
||||
Reference in New Issue
Block a user