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