[LLVMdev] alloc_size metadata

John Criswell criswell at illinois.edu
Thu May 24 08:43:23 PDT 2012


On 5/24/12 3:51 AM, Duncan Sands wrote:
> Hi Nuno,
>
>> I'm implementing the alloc_size function attribute in clang.
> does anyone actually use this attribute?  And if they do, can it really buy
> them anything?  How about "implementing" it by ignoring it!

Tools like ASan and SAFECode *could* use this attribute to determine the 
size of memory objects created by allocators.  This is needed for things 
like SAFECode's fastcheck optimization (which replaces expensive checks 
that need to lookup object bounds with a simpler check that has the 
object bounds passed in as arguments) as well as its instrumentation to 
register heap object bounds with the SAFECode run-time.

Currently, SAFECode has a pass which just recognizes certain functions 
as allocators and knows how to interpret the arguments to find the 
size.  If we want SAFECode to work with another allocator (like a 
program's custom allocator, the Objective-C allocator, the Boehm garbage 
collector, etc), then that pass needs to be modified to recognize it.  
Having to update this pass for every allocator name and type is one of 
the few reasons why SAFECode only works with C/C++ and not just any old 
language that is compiled down to LLVM IR.

Nuno's proposed feature would allow programmers to communicate the 
relevant information about allocators to tools like SAFECode and ASan.  
I think it might also make some of the optimizations in LLVM that 
require knowing about allocators work on non-C/C++ code.

So, no, I don't think anything's using it now, but it looks like 
something very useful to add, and I think some of those useful things 
are already a part of core LLVM.

-- John T.

>
> Ciao, Duncan.
>
>    This
>> attribute exists in gcc since version 4.3.
>> The attribute specifies that a function returns a buffer with the size
>> given by the multiplication of the specified arguments.  I would like
>> to add new metadata to pass this information to LLVM IR.
>>
>> For example, take the following C code:
>>
>> void* my_calloc(size_t, size_t) __attribute__((alloc_size(1,2)));
>>
>> void* fn() {
>>      return my_calloc(1, 3);
>> }
>>
>>
>> which would get translated to:
>>
>>
>> define i8* @fn() {
>> entry:
>>      %call = call i8* @my_calloc(i32 1, i32 3), !alloc_size !0
>>      ret i8* %call
>> }
>>
>> declare i8* @my_calloc(i32, i32)
>>
>> !0 = metadata !{i32 0, i32 1}
>>
>>
>> The downsize is that the metadata is added to all call sites, since
>> it's not possible to attach metadata to function declarations.
>>
>> Any comment, suggestion, etc?
>>
>> Thanks,
>> Nuno
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list