[LLVMdev] llvmContext::removeModule doesn't remove NamedStructTypes
Liu Xin
navy.xliu at gmail.com
Tue Dec 17 01:42:27 PST 2013
Hi, LLVM community,
I found an issue in my using scenario. We deliberately parse a bitcode
file twice. It contains a named struct type. eg. %struct.cmd = type {
float, float, float, float, float, i32 }. In the second module->dump,
%struct.cmd becomes %struct.cmd0.
my code is simplified like this.
int main()
{
llvm::LLVMContext &llvmCtx = llvm::getGlobalContext();
string ErrMsg;
string filename = "wrapper.bc";
llvm::OwningPtr<llvm::MemoryBuffer> File;
if (llvm::MemoryBuffer::getFileOrSTDIN(filename, File)) {
assert(0);
}
llvm::MemoryBuffer * buffer = File.take();
{
llvm::OwningPtr<llvm::Module> module(llvm::ParseBitcodeFile(buffer,
llvmCtx, &ErrMsg));
module->dump();
}
{
llvm::OwningPtr<llvm::Module> module(llvm::ParseBitcodeFile(buffer,
llvmCtx, &ErrMsg));
module->dump();
}
}
with smart pointer, the 1st module will be deleted and call removeModule
for the context. The implementation of removeModule is quite simple. It
just removes the PtrSet.
pImpl->OwnedModules.erase(M);
It doesn't touch LLVMContextImpl's NamedStructTypes. As a result,
'struct.cmd' is still in the symbol table even the module has destroyed.
In second ParseBitCodeFile, StructType::setName will introduce struct.cmd0
due to conflict.
should we do thorough cleanup for the method removeModule? or why does llvm
retain NamedStructTypes?
thanks,
--lx
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131217/e71ea5f2/attachment.html>
More information about the llvm-dev
mailing list