mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
Materialize functions whose basic blocks are used by global variables. Fixes
PR11677. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147425 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a86bcfb565
commit
47f79bb58e
@ -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;
|
||||
}
|
||||
|
||||
|
@ -185,6 +185,8 @@ public:
|
||||
FreeState();
|
||||
}
|
||||
|
||||
void materializeForwardReferencedFunctions();
|
||||
|
||||
void FreeState();
|
||||
|
||||
/// setBufferOwned - If this is true, the reader will destroy the MemoryBuffer
|
||||
|
@ -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.
|
||||
|
64
unittests/VMCore/pr11677.cpp
Normal file
64
unittests/VMCore/pr11677.cpp
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user