[LLVMdev] [cfe-dev] Extend llvm to fix global addresses

John Criswell criswell at illinois.edu
Tue Dec 6 22:39:40 PST 2011


On 12/6/11 7:19 PM, Dan Gohman wrote:
> On Dec 6, 2011, at 3:29 PM, Peter Cooper wrote:
>
>> The best case i can think of is embedded developers needing to layout functions or globals in memory.
>> Currently they would have to resort to a linker script or assembly hacks for this.
> This proposal also requires extending object file formats and linkers,
> and this impacts a lot of people, so it would want a pretty
> compelling motivation.
>
>> But anything which avoids the horrible int* cast has to be a good thing.  For one thing it would cause alias analysis a lot of pain.
> Actually, it wouldn't cause very much pain, if any, in alias analysis.
>
> LLVM IR already assumes that programmers can't "guess" what the
> address of the stack, global variables, or heap will be. An integer
> constant casted to a pointer is assumed to be non-aliasing with
> "regular" objects in memory. This property is of utmost importance,
> because a pass like mem2reg relies on it to know that the allocas
> it wants to promote to registers don't have their addresses
> secretly taken, for example.

In some circumstances, it may be helpful to treat memory used for memory 
mapped I/O devices as special memory objects.  We did this in the SVA-OS 
work in which we wanted to know which pieces of memory are used for 
memory mapped I/O and which are used for regular memory objects.  This, 
in turn, could be used to figure out which memory objects should be 
accessible for DMA (they are reachable from I/O memory objects in the 
points-to graph) and which load/store instructions (regular loads and 
stores or special I/O loads/stores) were accessing which type of memory.

In other words, it may be desirable to tell the difference between an 
arbitrary int2ptr cast and a pointer to a memory-mapped I/O object.

One way to do this is to have the kernel/driver use an I/O allocator 
function.  This function returns a pointer like (malloc()) but takes as 
input a physical memory address and size; the returned pointer is a 
pointer to memory-mapped I/O that can be accessed by deferencing the 
pointer, either using a volatile load/store or some special I/O function.

Interestingly enough, the Linux 2.4 kernel had such a function; it 
remapped physical memory into the kernel address space and returned a 
pointer to it.

So, instead of adding the globals feature originally suggested in this 
thread, one could simply add an intrinsic or just recognize some 
function as the "I/O memory allocator" the same way that malloc() is 
recognized as a heap allocator today.  Just make it take a constant 
integer and a size, and it returns a pointer to the memory in question.

-- John T.

P.S. The relevant SVA-OS paper is at 
http://llvm.org/pubs/2009-08-12-UsenixSecurity-SafeSVAOS.html




More information about the llvm-dev mailing list