[LLVMdev] MemoryBuffer and its requirement for NULL termination

Rafael Avila de Espindola rafael.espindola at gmail.com
Thu Feb 24 09:03:38 PST 2011


MemoryBuffer requires that its buffer be NULL terminated. This is handy 
for some users, but it is a hard requirement for some cases. For 
example, currently I get the following valgrind error when doing LTO and 
fetching an archive member:

at 0x6DAC36E: llvm::MemoryBuffer::init(char const*, char const*) 
(MemoryBuffer.cpp:50)

Address 0x5fecea0 is 0 bytes after a block of size 464 alloc'd

  claim_file_hook(ld_plugin_input_file const*, int*) (gold-plugin.cpp:261)

The memory access is the assert that the buffer is null terminated and 
the allocation is done to read in an archive member to pass to libLTO.

I could fix this by just allocating one byte more, but I would like 
instead to mmap the archives. There is no way to get a NULL terminated 
map in the middle of a file.

I propose we split MemoryBuffer in two classes. The base one would not 
guarantee that the buffer is null terminated. A class that does 
guarantee null termination can then be implemented by inheriting from it.

Using two classes has the advantaged that the requirement for null 
termination shows up in the type signature.

Now, what should the default be? My preference would be to use the name 
MemoryBuffer for a class that doesn't guarantee null termination and 
have a ZMemoryBuffer that does. If it is really common to depend on the 
null termination, we can keep MemoryBuffer with its current meaning and 
call the base class NZMemoryBuffer or something.

Better names suggestions are welcome :-)

Cheers,
Rafael



More information about the llvm-dev mailing list