[LLVMdev] RFC: Supporting ELF symbol aliases via GlobalAlias GEPs

David Chisnall csdavec at swansea.ac.uk
Tue Aug 25 11:55:16 PDT 2009


Hi Daniel,

I've tested it on Linux and FreeBSD and it works on both.  I just  
tested on PowerPC/OpenBSD[1] and it seems that the OpenBSD loader  
does, indeed, break this.  On further investigation it turns out that  
the OpenBSD loader doesn't work properly with aliases at all,  
including the kind emitted from a GlobalAlias.

I've not tried on NetBSD or Solaris.  I'd be interested to know if  
this works on Windows (I would expect that it would, purely by  
accident, given the crazy way DLL relocations work on Windows, but  
I've no idea if it actually does).

It would be nice to get some idea of where this actually works before  
I proceed.  The ELF specification doesn't actually contain the word  
'alias' anywhere, but it seems to be assumed that symbols are allowed  
to be aliased.  As far as I can see, this is no more likely to break  
than aliases pointing to the start of symbols - on platforms where the  
loader relocates entire segments together it works, on platforms where  
they relocate individual symbols independently it breaks.

David

[1] LLVM doesn't seem to correctly output external globals at all on  
this platform - they lack the .size and .type directives, which is a  
bit odd because I remember seeing code for generating them in the  
PowerPCAsmPrinter class.  I'll have a look at what's going on there  
later).

On 25 Aug 2009, at 18:23, Daniel Dunbar wrote:

> Hi David,
>
> Even if this works on Linux/ELF, do know whether it is "officially"  
> supported?
>
> Using aliases to point to the interior of objects seems like something
> that could be very likely to break, but I don't know anything about
> how ELF encodes aliases.
>
> - Daniel
>
> On Tue, Aug 25, 2009 at 9:07 AM, David  
> Chisnall<csdavec at swansea.ac.uk> wrote:
>> I've attached a less-hackish implementation of this.  This includes  
>> the
>> following modifications:
>>
>> - getSupportsOverlappingAliases() method on TargetMachine which  
>> returns
>> whether the target supports multiple symbols to the same object.   
>> This
>> returns false in the superclass and needs to be explicitly  
>> overridden for
>> each target to enable it.
>>
>> - An implementation of this method in X86TargetMachine which  
>> returns true
>> for ELF targets.
>>
>> - printObjectType() in AsmPrinter.  Currently all of the subclasses
>> hard-code this (e.g. ".type " + name + ", @object") when emitting  
>> global
>> variables.  I've implemented this for X86ATTAsmWPrinter, and will  
>> add the
>> same for other classes as required.
>>
>> - PrintGlobalOffsetAlias(), also in AsmPrinter.  This outputs a  
>> GlobalAlias
>> which is a GEP to a GlobalVariable, if the target supports it.
>>
>> This is a proof-of-concept implementation which, pending review,  
>> I'd like to
>> commit as a work-in-progress and then work on adding support for more
>> targets.  It should be relatively trivial to add this for other ELF  
>> targets;
>> just override getSupportsOverlappingAliases() in the relevant  
>> TargetMachine
>> subclass to return true and copy the code out of the  
>> PrintGlobalVariable()
>> method in the AsmPrinter subclass to implement printObjectType().
>>
>> David
>>
>> On 23 Aug 2009, at 23:41, David Chisnall wrote:
>>
>>> Hi Everyone,
>>>
>>> Chris suggested[1] I should ask for feedback as to whether this is a
>>> desired feature before I put too much effort into it, so here goes:
>>>
>>> I would like to be able to export a symbol that is inside an LLVM
>>> structure.  This is possible on ELF targets[2], and the attached
>>> proof-of-concept patch to AsmWriter makes it work (although in a  
>>> hackish way
>>> that I am NOT suggesting be committed as-is).
>>>
>>> With this patch, the you can compile this:
>>>
>>> %0 = type { i32, i32 }
>>> @structure = global %0 { i32 0, i32 1 }
>>> @element1 = alias getelementptr( %0* @structure, i32 0, i32 1)
>>>
>>> To this:
>>>
>>>   .subsections_via_symbols
>>>   .section    __DATA,__data
>>>   .align  3
>>> _structure:                                                 ##  
>>> @structure
>>>   .space  4
>>>   .long   1                                           ## 0x1
>>>
>>>   .globl  _element1
>>>   .set _element1, _structure+4
>>>   .size   _element1, 4
>>>   .type   _element1, at object
>>>
>>> The element1 symbol is an i32* pointing to element 1 in the  
>>> structure (the
>>> one emitted by .long 1).
>>>
>>> There are really two questions here:
>>>
>>> 1) Do we want to be able to generate this kind of output at all (I  
>>> do!)
>>> 2) If we do, do we want to use the global alias initialised with a
>>> constant GEP to do it, or provide some other mechanism?
>>>
>>> David
>>>
>>> [1] http://llvm.org/bugs/show_bug.cgi?id=4739#c24
>>> [2] I know it's not possible on Mach-O (well, it is for internal  
>>> symbols,
>>> just not for ones exported via the symbol table) - does anyone  
>>> know if PE
>>> allows it?
>>> <llvm.diff>
>>
>>
>> _______________________________________________
>> 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