[LLVMdev] Handling ELF groups.

Shankar Kalpathi Easwaran shankarke at gmail.com
Wed Dec 19 18:26:09 PST 2012


I support Nick's option too. I think handling groups is another example of
using follow on references.

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 ?

Thanks

-

Shankar Easwaran

On Wed, Dec 19, 2012 at 5:00 PM, Nick Kledzik <kledzik at apple.com> wrote:

> On Dec 19, 2012, at 4:53 PM, Michael Spencer wrote:
> > On Wed, Dec 19, 2012 at 4:43 PM, Nick Kledzik <kledzik at apple.com> wrote:
> >>
> >> On Dec 19, 2012, at 4:25 PM, Michael Spencer wrote:
> >>> So I was looking into handling ELF groups today in the Atom model. It
> >>> appears that we will need to add the concept of a group to the atom
> >>> model directly, as modeling it with references fails to capture some
> >>> semantics.
> >>>
> >>> http://www.sco.com/developers/gabi/latest/ch4.sheader.html
> >>>
> >>> Groups in ELF are collections of sections that must be either included
> >>> or excluded as a unit.
> >> I thought groups were a collection of symbol - not sections.  Is this a
> case
> >> where there is one symbol per section?
> >
> > It's sections. There is no restriction on symbols in a group section.
> >
> >>
> >>> They also are used to implement COMDAT. Each
> >>> group has an "identifying symbol entry" or "group signature". This is
> >>> only used in the case of COMDAT groups (which are marked with a flag).
> >>> When two COMDAT groups have the same group signature the linker must
> >>> select one (not specified how to pick) and discard _all_ members of
> >>> the other group.
> >>>
> >>> Correctly implementing this requires knowing the group name for each
> >>> group and having the resolver remove the correct set of atoms on
> >>> collision. We also need to be able to explicitly track the identifying
> >>> symbol entry for the relocatable case.
> >>
> >> In the darwin linker this is solved using references.   The "signature"
> atom in
> >> a group has a "group-subordinate" reference to each atom in the group.
> >> When an atom is coalesced away, its references are scanned and the
> >> target of any group-subordinate reference is also coalesced.
> >>
> >> Conceptually, a group is just a circle around some set of atoms.  That
> same
> >> information can be represented as a connected graph.  That is, by
> introducing
> >> a zero size "master " atom with reference to each atom in the group.
>  In the special
> >> case of group comdat, the signature atom can be used as the master.
> >>
> >> In other words, I'm not convinced of the need to introduce a new top
> level class
> >> (Group) to go along with Atom and Reference.  I believe we can encode
> >> the same information using references.
> >>
> >> -Nick
> >
> > Ok, I kinda see how this can work. The only thing I'm still confused
> > about is conforming to this part of the ELF spec:
> >
> > "This is a COMDAT group. It may duplicate another COMDAT group in
> > another object file, where duplication is defined as having the same
> > group signature. In such cases, only one of the duplicate groups may
> > be retained by the linker, and the members of the remaining groups
> > must be discarded."
> >
> > How do we know that a group master is a COMDAT group master as opposed
> > to a normal group master?
> A COMDAT group master has a real, named atom as its master.    The other
> groups will have a zero size master atom with some special content type
> (e.g.  typeGroupMaster).
>
> For COMDAT groups, the "group signature" is the name of the signature
> (master) atom.   If two .o files each have a COMDAT group with the
> same signature, that means they each have a master atom with the same
> name.
>
> -Nick
>
>
> >>>
> >>> An idea for implementing this would be to add a list of Groups to each
> >>> File. I don't believe a Group should be an atom as it has different
> >>> semantics and would have to be treated specially everywhere.
> >>>
> >>> A group would have a name, merge attribute, and a list of atoms it
> contains.
> >>>
> >>> YAML mockup:
> >>>
> >>> ---
> >>> groups:
> >>> - name: _Z4funcIiET_S0_
> >>>   merge: pickAny
> >>>   members: [_Z4funcIiET_S0_, ".debug._Z4funcIiET_S0_"]
> >>>
> >>> atoms:
> >>> - name _Z4funcIiET_S0_
> >>>   scope: global
> >>>   merge: asWeak
> >>>   type: code
> >>> ...
> >>>
> >>> The main problem I see with this is that groups are no longer
> >>> represented explicitly in the reference graph.
> >>>
> >>> - Michael Spencer
> >>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121219/e0fa14c2/attachment.html>


More information about the llvm-dev mailing list