1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

Materialize functions whose basic blocks are used by global variables. Fixes

PR11677.

llvm-svn: 147425
This commit is contained in:
Rafael Espindola 2012-01-02 07:49:53 +00:00
parent f7c9bf17dd
commit 7ab0861d5f
4 changed files with 78 additions and 1 deletions

View File

@ -27,6 +27,13 @@
#include "llvm/OperandTraits.h"
using namespace llvm;
void BitcodeReader::materializeForwardReferencedFunctions() {
while (!BlockAddrFwdRefs.empty()) {
Function *F = BlockAddrFwdRefs.begin()->first;
F->Materialize();
}
}
void BitcodeReader::FreeState() {
if (BufferOwned)
delete Buffer;
@ -2779,6 +2786,9 @@ Module *llvm::getLazyBitcodeModule(MemoryBuffer *Buffer,
}
// Have the BitcodeReader dtor delete 'Buffer'.
R->setBufferOwned(true);
R->materializeForwardReferencedFunctions();
return M;
}

View File

@ -184,7 +184,9 @@ public:
~BitcodeReader() {
FreeState();
}
void materializeForwardReferencedFunctions();
void FreeState();
/// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer

View File

@ -112,6 +112,7 @@ set(VMCoreSources
VMCore/PassManagerTest.cpp
VMCore/ValueMapTest.cpp
VMCore/VerifierTest.cpp
VMCore/pr11677.cpp
)
# MSVC9 and 8 cannot compile ValueMapTest.cpp due to their bug.

View File

@ -0,0 +1,64 @@
//===- llvm/unittest/VMCore/pr11677.cpp - Test for blockaddr --------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/Verifier.h"
#include "llvm/Bitcode/BitstreamWriter.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/Constants.h"
#include "llvm/Instructions.h"
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/PassManager.h"
#include "llvm/Support/MemoryBuffer.h"
#include "gtest/gtest.h"
namespace llvm {
namespace {
static Module *makeLLVMModule() {
Module* Mod = new Module("test-mem", getGlobalContext());
FunctionType* FuncTy =
FunctionType::get(Type::getVoidTy(Mod->getContext()), false);
Function* Func = Function::Create(FuncTy,GlobalValue::ExternalLinkage,
"func", Mod);
BasicBlock* Entry = BasicBlock::Create(Mod->getContext(), "entry", Func);
new UnreachableInst(Mod->getContext(), Entry);
BasicBlock* BB = BasicBlock::Create(Mod->getContext(), "bb", Func);
new UnreachableInst(Mod->getContext(), BB);
PointerType* Int8Ptr = Type::getInt8PtrTy(Mod->getContext());
new GlobalVariable(*Mod, Int8Ptr, /*isConstant=*/true,
GlobalValue::ExternalLinkage,
BlockAddress::get(BB), "table");
return Mod;
}
static void writeModuleToBuffer(std::vector<unsigned char> &Buffer) {
Module *Mod = makeLLVMModule();
BitstreamWriter Stream(Buffer);
WriteBitcodeToStream(Mod, Stream);
}
TEST(PR11677, BlockAddr) {
std::vector<unsigned char> Mem;
writeModuleToBuffer(Mem);
StringRef Data((const char*)&Mem[0], Mem.size());
MemoryBuffer *Buffer = MemoryBuffer::getMemBuffer(Data, "test", false);
std::string errMsg;
Module *m = getLazyBitcodeModule(Buffer, getGlobalContext(), &errMsg);
PassManager passes;
passes.add(createVerifierPass());
passes.run(*m);
}
}
}