<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Dec 19, 2012, at 6:26 PM, Shankar Kalpathi Easwaran wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">I support Nick's option too. I think handling groups is another example of using follow on references. <br><br>One question is how does an atom outside the group refer to the main atom here ? Will not garbage collection cleanup the main atom/signature atom because there are no references ?<br></blockquote><div>Well, if there are no references, it should be dead stripped, right?  </div><div><br></div><div>A typical use of group COMDAT is that you have a function with an inline definition and that function has a static local variable.  You have two atoms: the function atom and an atom for the data variable.  They are bound together in a group.  Meaning, either they both are used, or neither is used.  The "signature" of the group is the (mangled) name of the function.  If nothing is using that function, and the resolver it told to dead strip, it will remove the function and variable.  If another object file also defines the function (and variable), one copy of function will be coalesced away (mergeAsWeak) which also (because of the group reference) also coalesces away its variable atom copy.</div><div><br></div><div>-Nick</div><div><br></div><blockquote type="cite"><br><div class="gmail_quote">On Wed, Dec 19, 2012 at 5:00 PM, Nick Kledzik <span dir="ltr"><<a href="mailto:kledzik@apple.com" target="_blank">kledzik@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On Dec 19, 2012, at 4:53 PM, Michael Spencer wrote:<br>
> On Wed, Dec 19, 2012 at 4:43 PM, Nick Kledzik <<a href="mailto:kledzik@apple.com">kledzik@apple.com</a>> wrote:<br>
>><br>
>> On Dec 19, 2012, at 4:25 PM, Michael Spencer wrote:<br>
>>> So I was looking into handling ELF groups today in the Atom model. It<br>
>>> appears that we will need to add the concept of a group to the atom<br>
>>> model directly, as modeling it with references fails to capture some<br>
>>> semantics.<br>
>>><br>
>>> <a href="http://www.sco.com/developers/gabi/latest/ch4.sheader.html" target="_blank">http://www.sco.com/developers/gabi/latest/ch4.sheader.html</a><br>
>>><br>
>>> Groups in ELF are collections of sections that must be either included<br>
>>> or excluded as a unit.<br>
>> I thought groups were a collection of symbol - not sections.  Is this a case<br>
>> where there is one symbol per section?<br>
><br>
> It's sections. There is no restriction on symbols in a group section.<br>
><br>
>><br>
>>> They also are used to implement COMDAT. Each<br>
>>> group has an "identifying symbol entry" or "group signature". This is<br>
>>> only used in the case of COMDAT groups (which are marked with a flag).<br>
>>> When two COMDAT groups have the same group signature the linker must<br>
>>> select one (not specified how to pick) and discard _all_ members of<br>
>>> the other group.<br>
>>><br>
>>> Correctly implementing this requires knowing the group name for each<br>
>>> group and having the resolver remove the correct set of atoms on<br>
>>> collision. We also need to be able to explicitly track the identifying<br>
>>> symbol entry for the relocatable case.<br>
>><br>
>> In the darwin linker this is solved using references.   The "signature" atom in<br>
>> a group has a "group-subordinate" reference to each atom in the group.<br>
>> When an atom is coalesced away, its references are scanned and the<br>
>> target of any group-subordinate reference is also coalesced.<br>
>><br>
>> Conceptually, a group is just a circle around some set of atoms.  That same<br>
>> information can be represented as a connected graph.  That is, by introducing<br>
>> a zero size "master " atom with reference to each atom in the group.  In the special<br>
>> case of group comdat, the signature atom can be used as the master.<br>
>><br>
>> In other words, I'm not convinced of the need to introduce a new top level class<br>
>> (Group) to go along with Atom and Reference.  I believe we can encode<br>
>> the same information using references.<br>
>><br>
>> -Nick<br>
><br>
> Ok, I kinda see how this can work. The only thing I'm still confused<br>
> about is conforming to this part of the ELF spec:<br>
><br>
> "This is a COMDAT group. It may duplicate another COMDAT group in<br>
> another object file, where duplication is defined as having the same<br>
> group signature. In such cases, only one of the duplicate groups may<br>
> be retained by the linker, and the members of the remaining groups<br>
> must be discarded."<br>
><br>
> How do we know that a group master is a COMDAT group master as opposed<br>
> to a normal group master?<br>
</div></div>A COMDAT group master has a real, named atom as its master.    The other<br>
groups will have a zero size master atom with some special content type<br>
(e.g.  typeGroupMaster).<br>
<br>
For COMDAT groups, the "group signature" is the name of the signature<br>
(master) atom.   If two .o files each have a COMDAT group with the<br>
same signature, that means they each have a master atom with the same<br>
name.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Nick<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
>>><br>
>>> An idea for implementing this would be to add a list of Groups to each<br>
>>> File. I don't believe a Group should be an atom as it has different<br>
>>> semantics and would have to be treated specially everywhere.<br>
>>><br>
>>> A group would have a name, merge attribute, and a list of atoms it contains.<br>
>>><br>
>>> YAML mockup:<br>
>>><br>
>>> ---<br>
>>> groups:<br>
>>> - name: _Z4funcIiET_S0_<br>
>>>   merge: pickAny<br>
>>>   members: [_Z4funcIiET_S0_, ".debug._Z4funcIiET_S0_"]<br>
>>><br>
>>> atoms:<br>
>>> - name _Z4funcIiET_S0_<br>
>>>   scope: global<br>
>>>   merge: asWeak<br>
>>>   type: code<br>
>>> ...<br>
>>><br>
>>> The main problem I see with this is that groups are no longer<br>
>>> represented explicitly in the reference graph.<br>
>>><br>
>>> - Michael Spencer<br>
>><br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu/" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br>
</blockquote></div><br></body></html>