[PATCH] D24616: [ELF] Improve section GC for comdat groups

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 15 15:09:36 PDT 2016


On Thu, Sep 15, 2016 at 1:02 PM, Eugene Leviant <evgeny.leviant at gmail.com>
wrote:

> First of all, I need to identify this section, because, like I said, it's
> being added only once to a single object file. When some group is seen next
> time, all member sections are discarded. This means that relocations in
> some object file may point to discarded sections. When you see this
> discarded section in GC, you should (IMHO) find it counterpart and mark it
> live.
>

No, I don't think relocations could point to sections that were removed
because of comdat group deduplication. All relocations to sections in
comdat groups should be through undefined symbols. So, when the control
reaches this part of code, all symbols should have already been resolved,
or it will end up with a link error. You shouldn't have to "resolve" comdat
groups by name again here.

What I'm doing now is:
>
> a) Get group signature, given object file and some input section index.
> This is done using SectionGroupSig hash map.
> b) Store all group signatures in hash set
> c) Iterate object files and fetch all input sections, which are members of
> comdat groups with signatures in this hash set.
>
> Now I'm trying to understand your suggestion. You suggest to keep list of
> member sections in each member of the group, correct?
> You cannot do so in discarded section, so you still need to find real
> section, having some object file and section number in it, right?
>
>
> 2016-09-15 22:45 GMT+03:00 Rui Ueyama <ruiu at google.com>:
>
>> Imagine any section that is in some comdat group have a GroupMembers
>> vector, so that starting from any comdat group member section, you can
>> reach all siblings in the same group. With that, all you have to do for a
>> section S to make all its siblings live is to do `for (InputSectionData
>> *Succ : S->GroupMember) Enque({Succ, 0});`. Doesn't it work?
>>
>> On Thu, Sep 15, 2016 at 12:32 PM, Eugene Leviant <
>> evgeny.leviant at gmail.com> wrote:
>>
>>> evgeny777 added a comment.
>>>
>>> Let's elaborate the idea. The main problem is that symbol 'D' inside
>>> resolveReloc() may point to InputSectionBase<ELFT>::Discarded. This
>>> happens because comdat group is added to only one object file and causes
>>> crash in GC, because forEachSuccessor implicitly casts Discarded to
>>> InputSection<ELFT> and tries to fetch relocs from it. How this
>>> 'GroupMembers' vector would help?
>>>
>>>
>>> Repository:
>>>   rL LLVM
>>>
>>> https://reviews.llvm.org/D24616
>>>
>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160915/8446e067/attachment.html>


More information about the llvm-commits mailing list