[llvm-dev] A "Cross-Platform Runtime Library API" in LLVM IR

Lorenzo Laneve via llvm-dev llvm-dev at lists.llvm.org
Mon May 23 04:00:25 PDT 2016


This is the point,
High-level OO languages don't use malloc(), they use something else.
My idea was a C API with implementations of functions:
For example
Assuming I need to implement a function which allocates a new object.
The API provides a really basic allocator function I can use to implement the complete function the high-level language needs.

void *__newobject(int class_size) {
 void *r = __alloc(class_size);
 // Add GC metadata here
 return r;
}

This function will be included in the runtime library. Obviously this is a stupid example maybe a better implementation can be done.

Something like this can be done for I/O.

> On May 23, 2016, at 11:28 AM, David Chisnall <David.Chisnall at cl.cam.ac.uk> wrote:
> 
>> On 23 May 2016, at 10:13, Lorenzo Laneve <lore97drk at icloud.com> wrote:
>> 
>> I know but maybe malloc() is a bit higher level than a hypothetical __alloc(), which may be lower-level and then faster.
> 
> How?
> 
>> And malloc() is contained in the libc as Matthias said and so maybe a program using malloc() even for a non-C language linking against the crt is needed.
> 
> On many *NIX platforms, libc or some equivalent is the canonical interface to the system.  
> 
>> I'm just assuming that the functions we use in C such as malloc() are quite high-level interfaces and that there might be something faster.
>> 
>> For example, does Swift use malloc() to allocate its objects?
> 
> A number of high-level language don’t use malloc, but not because it is too high-level; quite the reverse.  You can have a more efficient malloc implementation if you know something about allocation patterns.  For example, in a class-based OO language you’re likely to have a small number of class sizes and having a separate slab allocator for each of these can be faster.  If you need garbage collection, then you’ll want to associate more metadata with allocations.  
> 
> malloc() is about as low-level an interface to memory management as is possible while maintaining some abstraction: you give it a size (no type, for example) and it gives you a pointer to some uninitialised memory.  The only lower-level interfaces would be related to page table management (mmap and friends on *NIX, more complex APIs on Mach and entirely delegated page table manipulation on something like Xen or DUNE).
> 
> Again, what problem are you trying to solve?  What is your use case for such a library?
> 
> David
> 


More information about the llvm-dev mailing list