[LLVMdev] LLD input graph handling proposal
Shankar Easwaran
shankare at codeaurora.org
Fri Sep 20 17:04:45 PDT 2013
My email client spoilt the whole email, will create a pdf and send it.
On 9/20/2013 7:00 PM, Shankar Easwaran wrote:
> Hi Nick,
>
> On 9/20/2013 5:59 PM, Nick Kledzik wrote:
>> On Sep 20, 2013, at 3:42 PM, Shankar Easwaran
>> <shankare at codeaurora.org> wrote:
>>> nextFile could pass the current resolver state at the time when its
>>> called, the linkingcontext can return the next file to be processed
>>> as below :-
>>>
>>> nextFile(currentResolverState) :-
>>>
>>> a) Returns the next file if the current node is not a group node
>>> b) Returns the next file in the group node, if the current node is a
>>> group node and the resolver state states undefined /weak / shared
>>> library atoms were added.
>>> c) Returns the start file in the group node, if the resolver state
>>> states undefined/weak/shared library atoms were added
>>> d) If the state is unchanged, no symbols were added exit the group
>>> and move to the next node.
>> What causes the Resolver state to change? I understand the state of
>> "there are undefines remaining", but the "something was added" is a
>> transient state. Each last file, changes it.
> Sorry for the long mail. This should explain things better.
>
> Here is a example with a state diagram on how the above proposal
> works. The main idea is to keep a running state of the resolver and
> the capturing the resolver state of each input file in the group by
> the linkingcontext.
>
> lld -flavor gnu main.o thread.o --start-group libc.a libpthread.a
> --end-group function.o
>
> main.o has atoms
> ------------------------
> main (defined)
> printf(undefined)
> fn(undefined)
>
> thread.o has atoms
> -----------------------------
> pthread_create (undefined)
>
> libc.a(printf.o) has atoms
> ------------------------------------
> printf(defined)
>
> libc.a(exit.o) has atoms
> ----------------------------------
> exit(defined)
>
> libpthread.a has atoms
> ---------------------------------
> pthread_create(defined)
> exit(undefined)
>
> function.o has atoms
> -------------------------------
> fn(defined)
>
>
> State diagram with time information
>
> Resolver resolverState Context(nextFile)
> -------------- ------------------ ----------------
> resolverState = initialState
> nextFile(resolverState) initialState
> ELFContextState=processingFileNode, return a.o
> resolverState = nochange
> process(a.o)
> state = definedatoms/undefinedatoms (reason: main/printf)
> nextFile(resolverState) definedAtoms/undefinedAtoms
> ELFContextState=processingFileNode, return b.o
> resolverState = nochange
> process(b.o)
> state = undefinedatoms(reason: pthread_create)
> nextFile(resolverState) undefinedAtoms
> ELFContextState=processingGroupNode, return libc.a
> resolverState=nochange
> process(libc.a)
> process(printf.o)
> state = definedatom (reason: printf)
> nextFile(resolverState) definedAtoms
> ELFContextState=processingGroupNode, state[libc.a]=definedAtoms,
> return libpthread.a
> resolverState=nochange
> process(libpthread.a)
> process(pthread.o)
> state = definedatom/undefinedatoms (reason: pthread_create/exit)
> nextFile(resolverState) definedAtoms/undefinedatoms
> ELFContextState=processingGroupNode,
> state[libpthread.a]=definedAtoms|undefinedAtoms, return libc.a
> (returns the first file in the group)
>
> *LinkingContext would exit the GroupNode only if the state of each
> file in the group is unchanged, or has only definedAtoms.*
> ///LinkingContext here, finds that libc.a has definedAtoms, whereas
> libpthread.a has undefinedAtoms, so traverses the group back./*
>
> *resolverState=nochange
> process(libc.a)
> process(exit.o)
> state = definedatom (reason: exit)
> nextfile(resolverState) definedAtoms
> ELFContextState=processingGroupNode, state[libc.a] = definedAtoms,
> return libpthread.a
> resolverState=nochange
> process(libc.a)
> state = nochange
> nextfile(resolverState) nochange ELFContextState=processingGroupNode,
> state[libpthread.a] = nochange,
>
> / LinkingContext //finds that
> libc.a state has "definedAtoms", and libpthread.a has "nochange", so
> exits the group./*
>
> *resolverState=nochange
> process(function.o)
> state = definedatom (reason: fn)
>
> Exit.
>
> Thanks
>
> Shankar Easwaran
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130920/339a122d/attachment.html>
More information about the llvm-dev
mailing list