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

Daniel Dunbar daniel at zuster.org
Tue Aug 25 10:23:51 PDT 2009


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