Hmm, yes, that file seems to have disappeared from that location! Let's try
again:

http://src.chromium.org/viewvc/native_client/trunk/src/native_client/pnacl/driver/pnacl-ld.py

But, upon closer inspection, this looks like it's just messing around with
the flags (splitting bitcode and native inputs?) and then calling out to
other tools. Looks like it shells out to a "real" linker. Looks like maybe
they use this:

http://llvm.org/releases/3.0/docs/GoldPlugin.html

(everything is very indirect, I'm only pretty sure this is what it does).

Looks like this allows the system "gold" linker (a real linker that knows
all about --start-group and friends) to interface with llvm in a way that
it can do global optimizations on bitcode files (and bitcode archives) to
generate - I think - a single optimized bitcode output.

I have no idea whether it's feasible to use this in emscripten!

Thanks,
Ryan

On Mon, Apr 14, 2014 at 2:26 PM, Alon Zakai <[email protected]> wrote:

> That link doesn't work for me. But that makes sense.
>
> Can we perhaps reuse their code? What do they do to solve this, how do
> they actually do the linking? llvm-link like us?
>
> - Alon
>
>
>
> On Thu, Apr 10, 2014 at 11:56 AM, Ryan Sturgell 
> <[email protected]>wrote:
>
>> Good point. Pnacl has an ld replacement called "pnacl-ld.py" where they
>> handle stuff like --start-group,--end-group:
>>
>>
>> https://code.google.com/p/chromium/codesearch#chromium/src/native_client/pnacl/driver/pnacl-ld.py&l=508
>>
>> Ryan
>>
>> On Thu, Apr 10, 2014 at 11:42 AM, Alon Zakai <[email protected]> wrote:
>>
>>> Regarding llvm-ld, might be worth finding out how other bitcode-using
>>> projects do linking, like PNaCl. They have to do something for this as
>>> well, I assume.
>>>
>>> - Alon
>>>
>>>
>>>
>>> On Mon, Apr 7, 2014 at 9:00 PM, Ryan Sturgell 
>>> <[email protected]>wrote:
>>>
>>>>
>>>> On Monday, April 7, 2014 4:37:12 PM UTC-7, Alon Zakai wrote:
>>>>>
>>>>>  Very interesting about msvc. However different behavior from
>>>>> gcc/clang sounds worrying. But, if there is no perf downside (as Ben just
>>>>> asked) and no compatibility issues, might be worth considering.
>>>>>
>>>>
>>>> The compatibility issue would be that builds that fail with "symbol not
>>>> found" in gcc/clang might succeed in emcc.
>>>>
>>>> Well... there is one real case that could be a problem. If you
>>>> implement a function which overrides something from a library_*.js (like,
>>>> say, glCreateShader), for example:
>>>>
>>>> emcc main.o lib1.a lib2.a
>>>>
>>>> Where:
>>>>   main.o does NOT call glCreateShader
>>>>   lib1.a contains obj1.o, which implements glCreateShader (and nothing
>>>> that main.o depends on, so is not included on the first pass)
>>>>   lib2.a contains obj2.o, which uses glCreateShader and implements a
>>>> function that main calls (so that it IS picked up on the first pass)
>>>>
>>>> With the current implementation, obj1.o is not included in the link,
>>>> and glCreateShader ends up binding to the implementation in library_gl.js
>>>> (however that works).
>>>>
>>>> But with --rescan-libs, obj1.o would be picked up on the second scan,
>>>> and the implementation there would be used.
>>>>
>>>>
>>>>> If we do handle groups, we would need to do it in emcc and the linking
>>>>> code in tools/shared.
>>>>>
>>>>
>>>> Right, that's where I made the changes for --rescan-libs in my branch.
>>>>
>>>>
>>>>> We do linking ourselves except for calling llvm-link which is very
>>>>> low-level and does not support groups and such, last I checked.
>>>>>
>>>>
>>>> Correct. llvm-ld DID handle --start-group/--end-group but llvm-ld was
>>>> dropped in llvm 3.2 because it was incomplete and clang is where all that
>>>> logic happens now.
>>>>
>>>>
>>>>> Hopefully it wouldn't be too complex, but I don't know offhand.
>>>>>
>>>>
>>>> As I mentioned above it's not _too_ bad (the changes in tools/shared.py
>>>> would be very similar to what I have in my branch), the hard part is
>>>> plumbing it all together since the grouping needs to propagate through from
>>>> emcc to shared.py.
>>>>
>>>> I guess the cleanest way would be to unwrap -Wl,--X options to --X in
>>>> the option parsing in emcc, keep these around in the file list, make sure
>>>> to pass them through all the transformations / filters that happen in
>>>> there, and pass those through to shared.building.link.
>>>>
>>>> Ryan
>>>>
>>>>
>>>>> - Alon
>>>>>
>>>>>
>>>>>
>>>>> On Mon, Apr 7, 2014 at 2:07 PM, Ryan Sturgell <[email protected]>wrote:
>>>>>
>>>>>> I have a patch at https://github.com/rsturgell/emscripten/tree/
>>>>>> rescan_libs which adds a --rescan-libs flag to emcc which behaves as
>>>>>> if -Wl,--start-group and -Wl,--end-group surround all the inputs.
>>>>>>
>>>>>> I have to say, though, I hate to add another way to do specify
>>>>>> this... I think it would be better to just properly support groups, but
>>>>>> this will be more complex. We'd have to either handle the flags in emcc 
>>>>>> and
>>>>>> maybe pass some kind of tree through to the link function, or propagate
>>>>>> -Wl,* linker flags through and handle the grouping in link. But both of
>>>>>> these interact poorly with the processing that happens to these inputs in
>>>>>> emcc. It will be a big change to make it all work.
>>>>>>
>>>>>> Another option which doesn't add complexity is go with --rescan-libs
>>>>>> but default to true (!). This way emcc will just work with whatever 
>>>>>> archive
>>>>>> order. This is exactly how msvc does it (from
>>>>>> http://msdn.microsoft.com/en-us/library/hcce369f.aspx):
>>>>>>
>>>>>> Object files on the command line are processed in the order they
>>>>>> appear on the command line. Libraries are searched in command line order 
>>>>>> as
>>>>>> well, with the following caveat: Symbols that are unresolved when 
>>>>>> bringing
>>>>>> in an object file from a library are searched for in that library first,
>>>>>> and then the following libraries from the command line and /DEFAULTLIB
>>>>>> (Specify Default 
>>>>>> Library)<http://msdn.microsoft.com/en-us/library/229a6ysd.aspx> 
>>>>>> directives,
>>>>>> and then to any libraries at the beginning of the command line.
>>>>>>
>>>>>>
>>>>>> Thoughts?
>>>>>>
>>>>>> Thanks,
>>>>>> Ryan
>>>>>>
>>>>>>
>>>>>> On Tuesday, April 1, 2014 6:48:28 AM UTC-7, Warren Seine wrote:
>>>>>>>
>>>>>>> This is something I need and it suits my requirements. At the
>>>>>>> moment, I'm using the wonderful solution of adding libraries twice in 
>>>>>>> the
>>>>>>> command line (which works btw...), so anything cleaner is better.
>>>>>>>
>>>>>>> On Tuesday, April 1, 2014 5:27:24 AM UTC+2, Alon Zakai wrote:
>>>>>>>>
>>>>>>>> From the perspective of maintainability both sound reasonable, the
>>>>>>>> latter sounds much simpler though, so if that is good enough for the 
>>>>>>>> people
>>>>>>>> that want this functionality then it is preferable.
>>>>>>>>
>>>>>>>> - Alon
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Fri, Mar 28, 2014 at 2:24 PM, Ryan Sturgell <[email protected]
>>>>>>>> > wrote:
>>>>>>>>
>>>>>>>>> Hi all, I'm also interested in --start-group/--end-group. I'm
>>>>>>>>> trying to build an existing project which uses gyp and ninja to 
>>>>>>>>> build, and
>>>>>>>>> gyp basically passes the .a files in an arbitrary order and wraps the 
>>>>>>>>> whole
>>>>>>>>> set in --start-group/--end-group.
>>>>>>>>>
>>>>>>>>> Supporting this functionality in shared.Building.link should be
>>>>>>>>> possible (passing a list of archive-groups instead of a list of 
>>>>>>>>> archives).
>>>>>>>>>
>>>>>>>>> Alternatively, the particular case of gyp could be handled by
>>>>>>>>> supporting a new emcc-specific flag like --group-all or something 
>>>>>>>>> which
>>>>>>>>> specifies that the whole set of archives should be repeatedly scanned 
>>>>>>>>> as if
>>>>>>>>> they were all contained in --start-group/--end-group. This would be 
>>>>>>>>> simpler
>>>>>>>>> to implement.
>>>>>>>>>
>>>>>>>>> Do either of these options sound palatable? I could take a stab
>>>>>>>>> and putting a patch together.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Ryan
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Thursday, March 6, 2014 3:18:27 PM UTC-8, Alon Zakai wrote:
>>>>>>>>>
>>>>>>>>>> Hmm yes, .a files do work that way I believe, and we support
>>>>>>>>>> linking them with proper semantics, so that should work.
>>>>>>>>>>
>>>>>>>>>> - Alon
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Thu, Mar 6, 2014 at 12:26 AM, Warren Seine <[email protected]
>>>>>>>>>> > wrote:
>>>>>>>>>>
>>>>>>>>>>> Thank you. I've had a look at the llvm-link source code, and
>>>>>>>>>>> there used to be an option --start-group which was simply
>>>>>>>>>>> ignored (and has since been withdrawn), so I'm wondering if that's 
>>>>>>>>>>> the
>>>>>>>>>>> default behaviour now.
>>>>>>>>>>>
>>>>>>>>>>> Anyway, somebody mentioned that I could put together all the .a
>>>>>>>>>>> files into a single one and then only link the big one. I guess 
>>>>>>>>>>> that'd
>>>>>>>>>>> work? I'll try that.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> On Wednesday, March 5, 2014 10:56:42 PM UTC+1, Alon Zakai wrote:
>>>>>>>>>>>
>>>>>>>>>>>> The most relevant doc is likely https://github.com/kripken/ems
>>>>>>>>>>>> cripten/wiki/Building-Projects but you can just look in emcc
>>>>>>>>>>>> to see what we support and do not support. I've never heard of 
>>>>>>>>>>>> that option,
>>>>>>>>>>>> so I guess we don't support it.
>>>>>>>>>>>>
>>>>>>>>>>>> - Alon
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Wed, Mar 5, 2014 at 12:50 AM, Warren Seine <
>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> @Alon, any idea? Can you describe (or point me to a page
>>>>>>>>>>>>> explaining) the linking step?
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Tuesday, March 4, 2014 9:21:09 AM UTC+1, Warren Seine wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>  -Wl,--start-group and -Wl,--end-group are compiler options
>>>>>>>>>>>>>> to tell the linker to look for symbols in previous libraries, as 
>>>>>>>>>>>>>> in "before
>>>>>>>>>>>>>> in the command line". They seem to have no effect on link order 
>>>>>>>>>>>>>> with
>>>>>>>>>>>>>> emcc and I'm not really surprised because the link step is
>>>>>>>>>>>>>> different from native builds in many ways. I'm wondering if 
>>>>>>>>>>>>>> someone has
>>>>>>>>>>>>>> been there and found a workaround to avoid unresolved symbols 
>>>>>>>>>>>>>> when linking
>>>>>>>>>>>>>> static libraries with circular dependencies.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> I can reorder manually reorder libraries or put them twice,
>>>>>>>>>>>>>> but for some reason I'd prefer to use this feature (or something 
>>>>>>>>>>>>>> similar)
>>>>>>>>>>>>>> which works fine with gcc.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Cheers,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>  --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "emscripten-discuss" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to [email protected].
>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>
>>>>>
>>>>>  --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "emscripten-discuss" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>>  --
>>> You received this message because you are subscribed to a topic in the
>>> Google Groups "emscripten-discuss" group.
>>> To unsubscribe from this topic, visit
>>> https://groups.google.com/d/topic/emscripten-discuss/n1qfKPPAy08/unsubscribe
>>> .
>>> To unsubscribe from this group and all its topics, send an email to
>>> [email protected].
>>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "emscripten-discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>  --
> You received this message because you are subscribed to a topic in the
> Google Groups "emscripten-discuss" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/emscripten-discuss/n1qfKPPAy08/unsubscribe
> .
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to