<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<br>
<div>
<div>On Nov 24, 2012, at 2:48 PM, Nick Kledzik <<a href="mailto:kledzik@apple.com">kledzik@apple.com</a>> wrote:</div>
<br class="Apple-interchange-newline">
<blockquote type="cite">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div>
<div>On Nov 21, 2012, at 4:00 PM, Relph, Richard wrote:</div>
<blockquote type="cite">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div>On Nov 21, 2012, at 11:07 AM, Nick Kledzik <<a href="mailto:kledzik@apple.com">kledzik@apple.com</a>> wrote:</div>
<blockquote type="cite">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div>
<div>On Nov 21, 2012, at 8:55 AM, Relph, Richard wrote:</div>
<blockquote type="cite">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
AMD would like to add new functionality to ranlib (and later ar and nm) and to the bits of LLVM Core that read (and later write) archives.
<div>Herewith a terse summary of the change, which we want to improve support of OpenCL for multiple GPUs in a single run-time.<br>
<br>
<div>Conceptually, a serialized archive is really 2 pieces: a few header members and a set of normal file members. There are no constraints on the normal members in the 'pure' archive format. They could be text files, pictures, or, as we're all familiar with,
 object modules. Most object file archives are "libraries" and the have a special header member that is a global symbol table, associating global scope names with defining object module members in the archive body.</div>
<div><br>
</div>
We have N very large archives, defining essentially the same set of symbols. Many of the normal file members of each are duplicated in other archives, but not all. The goal is the produce a single "super-archive" that contains 1 copy of each unique object file
 member no matter how many archives it is part of, and N symbol table members representing each of the original N archives.</div>
</div>
</blockquote>
<div>Let me see if I understand your need here.  You are dynamically generating code and need to link it.  The linking step requires some support routines which makes sense to have in a static library.  Since this must work on machines not set up with developer
 tools, you are packaging the static library inside a DLL/DSO.  In addition, with all the minor variations of GPUs, having a separate archive for every GPU type would be too large, so you need some way to remove duplicates of support functions.</div>
</div>
</div>
</blockquote>
<div><br>
</div>
Close. But it isn't "support routines". It's the entire OpenCL "built-in" library… thousands and thousands of functions, some tiny, some large, some merely aliases.<br>
<br>
<blockquote type="cite">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<div>
<div>If the above summary is close, then here are two other ideas that avoid the need for archive/TOC changes:</div>
<div>1) Have lots of little archives which removes duplicates.  Give each archive a unique name, then have a lookup table which lists which sequence of archives to use for which specific GPU.  When linking for a particular GPU, you pass the linker that particular
 sequence of little archives to search.  </div>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>This is close to what we have now, but find unworkable because the Linker doesn't take a "set" of libraries. So if library A calls something in B calls something in A, you end up having to make multiple passes over the libraries, which isn't efficient
 and creates other headaches. This is what we are trying to 'solve' by going to a single library, but we want to preserve the space advantage of the current approach.</div>
</div>
</blockquote>
<div><br>
</div>
<div>The gnu linker has the option:</div>
<div>  <span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 14px; "><b style="font-weight: bold; ">--start-group</b></span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 14px; "> </span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 14px; "><i style="font-style: italic; ">archives</i></span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 14px; "> </span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 14px; "><b style="font-weight: bold; ">--end-group</b></span></div>
<div>which tells the linker to keep searching the list of archives (not just make one pass).   The darwin linker does this by default.  </div>
<div><br>
</div>
<div>BTW, I had assumed you were using the "system linker".   But that won't work if you are adding some new kind of archive table of contents.  I guess that means you have some in-process code that provides linking functionality?  If so, I'd like to understand
 this better to see if this is something lld <<a href="http://lld.llvm.org/">http://lld.llvm.org/</a>> might want to support some day.</div>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>We are using the Linker class, which uses the Bitcode/Archive class, which is why I was focusing on that class to support the new functionality.</div>
<div>Once I have Bitcode/Archive enhanced, and llvm-ar generates the new "multi-archives", I was going to add a method to the Linker class to support linking "in-memory archives"… not strictly part of the Archive enhancements, but something we else we need.</div>
<div><br>
</div>
<div>Richard</div>
</div>
</body>
</html>