[LLVMdev] Chaining Atoms together

Shankar Easwaran shankare at codeaurora.org
Mon Nov 19 13:25:08 PST 2012


Hi Nick,

Waiting for your feedback on this.

Thanks

Shankar Easwaran

On 11/16/2012 10:03 AM, Shankar Easwaran wrote:
> Hi Nick,
>
> Thanks for your reply.
>
> The usecase here is just trying to construct a valid ELF. The lld 
> linker needs to handle all sorts of code written in assembly as well 
> as 'C'. The usecase is just one example of it.
>
> I have also seen similiar code in 
> http://lxr.free-electrons.com/source/arch/powerpc/kernel/head_32.S?a=powerpc 
> which has global and local labels.
>
> You are right, that the function has multiple entry points. You can 
> remove the .local directive too.
>
> Thanks
>
> Shankar Easwaran
>
> On 11/15/2012 9:47 PM, Nick Kledzik wrote:
>> Shankar,
>>
>> Let's step back.  What is this use case trying to do?
>>
>> What is:
>>     .local bar
>> bar:
>>
>> I have not seen the .local directive.  Symbols are local to the 
>> assembler by default and need a .global directive to make it to the 
>> .o file.  Local symbols also usually start with ".L"
>>
>> Why does only "foo" have the .type and .size directives?  Is the goal 
>> here to have one "function" with multiple entry points?
>>
>> -Nick
>>
>>
>> On Nov 15, 2012, at 6:50 PM, Shankar Easwaran wrote:
>>> Hi Nick,
>>>
>>> Below is an use case where we need all atoms within a section be 
>>> chained together.
>>>
>>> The usecase that we have currently is when a function foo which has 
>>> a mix of local/global symbols for example :-
>>>
>>>   .text
>>>   .global foo
>>>   .type foo, at function
>>> foo:
>>>   jmp bar
>>>   jmp fubar
>>>   ret
>>>   .global foo1
>>> foo1:
>>>   ret
>>>   .local bar
>>> bar:
>>>   ret
>>>   .global foo2
>>> foo2:
>>>   ret
>>>   .local fubar
>>> fubar:
>>>   ret
>>>   .size foo,.-foo
>>>
>>> When the object file is read by lld, the ELF Reader converts the 
>>> .text section into the following defined atoms :-
>>> a) foo
>>> b) foo1
>>> c) bar
>>> d) foo2
>>> e) fubar
>>>
>>> The atoms have to appear in the same order as the assembler already 
>>> has fixed the relocations in the ".text" section. This is done by 
>>> having the Reader to chain all the atoms together in the .text section.
>>>
>>> In addition to the above, we need a way so that the size information 
>>> of the atom is appropriately emitted by the linker in the final 
>>> executable / object file. When we read the object file, the size 
>>> information of the symbol that was there
>>> in the symbol table needs to be preserved until the linker writes 
>>> the binary.
>>>
>>> Referring to the above example we see that the function atom "foo", 
>>> has contents set to
>>>
>>> jmp bar
>>> jmp foobar
>>> ret
>>>
>>> The definedAtom "foo" gets created with the above contents and sets 
>>> the atom size to be the size of whatever data that has been read. In 
>>> this example, the Atom size of "foo" becomes 5 bytes.
>>> But when the Atom "foo" gets written by the linker it needs to be 
>>> set to the size thats specified in the symbol table(9 bytes).
>>>
>>> To fix this, What is needed is
>>>
>>> a) A field in the NativeDefinedAtomIvarsV1 datastructure to hold the 
>>> symbol size information that was present in the symbol table.
>>> b) A field in the DefinedAtom class to store the symbol size 
>>> information (needed back for the NativeReader to construct the 
>>> DefinedAtom object appropriately)
>>>
>>> Can I go ahead and do the modifications to the 
>>> NativeDefinedAtomsIvarsV1 and the DefinedAtom class to store this 
>>> additional attribute ?
>>>
>>> Thanks
>>>
>>> Shankar Easwaran
>>>
>>> -- 
>>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, 
>>> hosted by the Linux Foundation
>>>
>>
>>
>
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation




More information about the llvm-dev mailing list