<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Hi,<br>
      <br>
      Attached is the pdf of the operation to make things easier to
      read.<br>
      <br>
      Thanks<br>
      <br>
      Shankar Easwaran<br>
      <br>
      On 9/20/2013 7:04 PM, Shankar Easwaran wrote:<br>
    </div>
    <blockquote cite="mid:523CE29D.8020900@codeaurora.org" type="cite">
      <meta content="text/html; charset=ISO-8859-1"
        http-equiv="Content-Type">
      <div class="moz-cite-prefix">My email client spoilt the whole
        email, will create a pdf and send it.<br>
        <br>
        On 9/20/2013 7:00 PM, Shankar Easwaran wrote:<br>
      </div>
      <blockquote cite="mid:523CE195.601@codeaurora.org" type="cite">Hi
        Nick, <br>
        <br>
        On 9/20/2013 5:59 PM, Nick Kledzik wrote: <br>
        <blockquote type="cite">On Sep 20, 2013, at 3:42 PM, Shankar
          Easwaran <a moz-do-not-send="true"
            class="moz-txt-link-rfc2396E"
            href="mailto:shankare@codeaurora.org"><shankare@codeaurora.org></a>
          wrote: <br>
          <blockquote type="cite">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 :- <br>
            <br>
            nextFile(currentResolverState) :- <br>
            <br>
            a) Returns the next file if the current node is not a group
            node <br>
            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. <br>
            c) Returns the start file in the group node, if the resolver
            state states undefined/weak/shared library atoms were added
            <br>
            d) If the state is unchanged, no symbols were added exit the
            group and move to the next node. <br>
          </blockquote>
          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.
          <br>
        </blockquote>
        Sorry for the long mail. This should explain things better. <br>
        <br>
        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. <br>
        <br>
        lld -flavor gnu main.o thread.o --start-group libc.a
        libpthread.a --end-group function.o <br>
        <br>
        main.o has atoms <br>
        ------------------------ <br>
        main (defined) <br>
        printf(undefined) <br>
        fn(undefined) <br>
        <br>
        thread.o has atoms <br>
        ----------------------------- <br>
        pthread_create (undefined) <br>
        <br>
        libc.a(printf.o) has atoms <br>
        ------------------------------------ <br>
        printf(defined) <br>
        <br>
        libc.a(exit.o) has atoms <br>
        ---------------------------------- <br>
        exit(defined) <br>
        <br>
        libpthread.a has atoms <br>
        --------------------------------- <br>
        pthread_create(defined) <br>
        exit(undefined) <br>
        <br>
        function.o has atoms <br>
        ------------------------------- <br>
        fn(defined) <br>
        <br>
        <br>
        State diagram with time information <br>
        <br>
        Resolver resolverState                                         
        Context(nextFile) <br>
        -------------- ------------------ ---------------- <br>
        resolverState = initialState <br>
        nextFile(resolverState) initialState
        ELFContextState=processingFileNode, return a.o <br>
        resolverState = nochange <br>
        process(a.o) <br>
        state = definedatoms/undefinedatoms (reason: main/printf) <br>
        nextFile(resolverState) definedAtoms/undefinedAtoms
        ELFContextState=processingFileNode, return b.o <br>
        resolverState = nochange <br>
        process(b.o) <br>
        state = undefinedatoms(reason: pthread_create) <br>
        nextFile(resolverState) undefinedAtoms
        ELFContextState=processingGroupNode, return libc.a <br>
        resolverState=nochange <br>
        process(libc.a) <br>
        process(printf.o) <br>
        state = definedatom (reason: printf) <br>
        nextFile(resolverState) definedAtoms
        ELFContextState=processingGroupNode, state[libc.a]=definedAtoms,
        return libpthread.a <br>
        resolverState=nochange <br>
        process(libpthread.a) <br>
        process(pthread.o) <br>
        state = definedatom/undefinedatoms (reason: pthread_create/exit)
        <br>
        nextFile(resolverState) definedAtoms/undefinedatoms
        ELFContextState=processingGroupNode,
        state[libpthread.a]=definedAtoms|undefinedAtoms, return libc.a <br>
        (returns the first file in the group) <br>
        <br>
        *LinkingContext would exit the GroupNode only if the state of
        each file in the group is unchanged, or has only definedAtoms.*
        <br>
        ///LinkingContext here, finds that libc.a has definedAtoms,
        whereas libpthread.a has undefinedAtoms, so traverses the group
        back./* <br>
        <br>
        *resolverState=nochange <br>
        process(libc.a) <br>
        process(exit.o) <br>
        state = definedatom (reason: exit) <br>
        nextfile(resolverState) definedAtoms
        ELFContextState=processingGroupNode, state[libc.a] =
        definedAtoms, return libpthread.a <br>
        resolverState=nochange <br>
        process(libc.a) <br>
        state = nochange <br>
        nextfile(resolverState) nochange
        ELFContextState=processingGroupNode, state[libpthread.a] =
        nochange, <br>
        <br>
        /                                          LinkingContext
        //finds that libc.a state has "definedAtoms", and libpthread.a
        has "nochange", so exits the group./* <br>
        <br>
        *resolverState=nochange <br>
        process(function.o) <br>
        state  = definedatom (reason: fn) <br>
        <br>
        Exit. <br>
        <br>
        Thanks <br>
        <br>
        Shankar Easwaran <br>
        <br>
        <br>
        <fieldset class="mimeAttachmentHeader"></fieldset>
        <br>
        <pre wrap="">_______________________________________________
LLVM Developers mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a>
</pre>
      </blockquote>
      <br>
      <br>
      <pre class="moz-signature" cols="72">-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation</pre>
    </blockquote>
    <br>
    <br>
    <pre class="moz-signature" cols="72">-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation</pre>
  </body>
</html>