Nuno Lopes
2008-Oct-03 18:27 UTC
[LLVMdev] memory leaks in *Type::get() and Constant*::get()
Hi, Per my previous post about a patch to run the test suite under valgrind (btw, can I commit it?), I've tracked a few memory leaks in LLVM. I've fixed 4 trivial ones, but there are a few more not-so-trivial remaining. Take a look at two common reports by valgrind: 240 (144 direct, 96 indirect) bytes in 3 blocks are definitely lost in loss record 17 of 20 at 0x4023614: operator new(unsigned) (in vgpreload_memcheck.so) by 0x866B4B3: llvm::PointerType::get(llvm::Type const*, unsigned) (Type.cpp:1319) by 0x85E656E: llvm::BitcodeReader::ParseTypeTable() (BitcodeReader.cpp:498) by 0x85EDDB1: llvm::BitcodeReader::ParseModule(std::string const&) (BitcodeReader.cpp:1078) by 0x85EF35F: llvm::BitcodeReader::ParseBitcode() (BitcodeReader.cpp:1367) by 0x85EF40B: llvm::getBitcodeModuleProvider(llvm::MemoryBuffer*, std::string*) (BitcodeReader.cpp:2078) by 0x85EF483: llvm::ParseBitcodeFile(llvm::MemoryBuffer*, std::string*) (BitcodeReader.cpp:2094) by 0x839ADFF: main (opt.cpp:432) 160 bytes in 4 blocks are definitely lost in loss record 18 of 20 at 0x4023614: operator new(unsigned) (in vgpreload_memcheck.so) by 0x867EF30: llvm::User::operator new(unsigned, unsigned) (Value.cpp:384) by 0x861F3EE: llvm::ConstantInt::operator new(unsigned) (Constants.h:55) by 0x860E794: llvm::ConstantInt::get(llvm::APInt const&) (Constants.cpp:272) by 0x860E831: llvm::ConstantInt::get(llvm::Type const*, unsigned long long, bool) (Constants.cpp:254) by 0x860ECE2: llvm::Constant::getNullValue(llvm::Type const*) (Constants.cpp:109) by 0x85E7AB0: llvm::BitcodeReader::ParseConstants() (BitcodeReader.cpp:768) by 0x85EDE17: llvm::BitcodeReader::ParseModule(std::string const&) (BitcodeReader.cpp:1090) by 0x85EF35F: llvm::BitcodeReader::ParseBitcode() (BitcodeReader.cpp:1367) by 0x85EF40B: llvm::getBitcodeModuleProvider(llvm::MemoryBuffer*, std::string*) (BitcodeReader.cpp:2078) by 0x85EF483: llvm::ParseBitcodeFile(llvm::MemoryBuffer*, std::string*) (BitcodeReader.cpp:2094) by 0x839ADFF: main (opt.cpp:432) The problem here is that these methods add newly created types/constants to a static variable, which is managed by the ManagedStatic template. This template effectively deletes the map, but does not frees the Types*. I made a quick&dirty patch (http://web.ist.utl.pt/nuno.lopes/llvm_types_cleanup.txt), but it doesn't seem to fix the problem (it makes llvm crash), since it seems there are some statically allocated Types. Any ideas on how to kill these memleaks? Nuno