<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jun 16, 2015, at 11:12 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Tue, Jun 16, 2015 at 11:01 AM, Frédéric Riss <span dir="ltr" class=""><<a href="mailto:friss@apple.com" target="_blank" class="">friss@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><br class=""><div class=""><div class=""><div class="h5"><blockquote type="cite" class=""><div class="">On Jun 16, 2015, at 10:54 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank" class="">dblaikie@gmail.com</a>> wrote:</div><br class=""><div class=""><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Tue, Jun 16, 2015 at 10:43 AM, Duncan P. N. Exon Smith <span dir="ltr" class=""><<a href="mailto:dexonsmith@apple.com" target="_blank" class="">dexonsmith@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br class="">
> On 2015-Jun-11, at 12:26, Frédéric Riss <<a href="mailto:friss@apple.com" target="_blank" class="">friss@apple.com</a>> wrote:<br class="">
><br class="">
><br class="">
>> On Jun 11, 2015, at 12:19 PM, Rafael Espíndola <<a href="mailto:rafael.espindola@gmail.com" target="_blank" class="">rafael.espindola@gmail.com</a>> wrote:<br class="">
>><br class="">
>>> When Duncan was working on this I was wondering if it couldn’t be generalized. I thought the ELF linkers relied on the relocations this would generate eg. for strings in the dwarf_str section. I guess all the strings will be in the same fragment. Without relocations, how can a standard ELF linker rewrite the references to the dwarf_str section when combining multiple input files?<br class="">
>><br class="">
>> The elf linker needs a relocation if one section refers to another. If<br class="">
>> two symbols are in different sections, then they are in different<br class="">
>> fragments.<br class="">
>><br class="">
>> So the case of dwarf_str, only if the two symbols are in dwarf_str<br class="">
>> would this function avoid creating the expression.<br class="">
><br class="">
> Sorry for the noise. I thought the logic that did a difference between the string symbol and the start of section symbol was common to all platforms. I see that ELF will emits directly the string symbol which makes it totally irrelevant to this patch :-)<br class="">
<br class="">
</span>What a mess.  These functions' assumptions are pretty convoluted.  I<br class="">
just spent some time trying to follow this as well (a little behind on<br class="">
email).  I'm not quite convinced this patch is right.<br class="">
<br class="">
I hadn't realized that (almost!) all the logic to use<br class="">
emitLabelDifference() from section starts was Darwin-specific.  With<br class="">
that new knowledge, here are a few useful assumptions we can make in<br class="">
emitLabelDifference():<br class="">
<br class="">
 1. It's only used when emitting DWARF.  (I have an out-of-tree patch<br class="">
    to rename it to emitDwarfLabelDifference()... I'll commit that soon<br class="">
    I hope.)<br class="">
 2. emitSectionOffset(), which calls into this function only on Mach-O,<br class="">
    is only used to describe DWARF sections.  (The same patch fixes its<br class="">
    name.)<br class="">
 3. On ELF, sections can't be split.  Since emitLabelDifference() is<br class="">
    only used between two symbols within a section (caveat below for<br class="">
    split-DWARF!!), we can safely emit it absolutely.<br class="">
 4. On Mach-O, DWARF isn't relocatable: the DWARF is always grabbed<br class="">
    from the original object file.  The target symbols are always<br class="">
    either (1) DWARF, which won't move, or (2) some offset of an atom,<br class="">
    and atoms can't be split.  Safe here too.<br class="">
<br class="">
So aside from my caveat, and assuming COFF somehow falls in the ELF<br class="">
bucket (or doesn't use DWARF), this seems good.<br class="">
<br class="">
The one case I can't quite prove to myself is "okay" is split-DWARF.<br class="">
There's a bunch of logic that calls `emitLabelDifference()` instead of<br class="">
`emitSectionOffset()` on split-DWARF/DWO.  `DIELocList::EmitValue()`<br class="">
is one suspicious example, since it's emitting a symbol offset into<br class="">
the TEXT section:<br class=""></blockquote><div class=""><br class="">Wouldn't this be emitting a relocation into the debug_loc section, not the text section?<br class=""></div></div></div></div></div></blockquote><div class=""><br class=""></div></div></div><div class="">Yes, I think that’s what Duncan meant. It’s emitting a relocation into the debug_loc section that refers to symbols from the .text section. </div></div></div></blockquote><div class=""><br class="">Sorry, perhaps an issue with terminology.<br class=""><br class="">This relocation will be placed in the debug_info section, and will refer to the debug_loc section, right? Neither of these is the text section.<br class=""></div></div></div></div></div></blockquote><div><br class=""></div><div>Doh you’re right. Duncan’s mail resonated with what I initially thought could be an issue and this made me jump to conclusions.</div><div><br class=""></div><div>Fred</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><div class="">& in fission, this would be the debug_info.dwo section containing relocations that refer to the debug_loc.dwo section (which is why it doesn't need relocations, just absolute offsets - because .dwo linking is handled by a debug-aware tool, so we don't emit any relocations into the .dwo file)<br class=""> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class=""><div class="">And —with the new logic — if at some point the MCSymbols that generate this relocation end up in the same fragment, then this relocation is gone too.</div><div class=""><br class=""></div><div class="">Fred</div><span class=""><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">    void DIELocList::EmitValue(const AsmPrinter *AP, dwarf::Form Form) const {<br class="">
      DwarfDebug *DD = AP->getDwarfDebug();<br class="">
      MCSymbol *Label = DD->getDebugLocs().getList(Index).Label;<br class="">
<br class="">
      if (AP->MAI->doesDwarfUseRelocationsAcrossSections() && !DD->useSplitDwarf())<br class="">
        AP->emitSectionOffset(Label);<br class="">
      else<br class="">
        AP->EmitLabelDifference(Label, Label->getSection().getBeginSymbol(), 4);<br class="">
    }<br class="">
<br class="">
I *think* this case is alright, but only because, currently, every<br class="">
instruction happens to be in a separate RelaxableFragment, so<br class="">
emitAbsoluteLabelDifference() is going to "fail".  What I don't like<br class="">
is that whoever breaks that assumption is going to have no idea that<br class="">
the correctness of "emitAbsoluteLabelDifference()" depends on this.<br class="">
<br class="">
To rephrase, emitAbsoluteLabelDifference() used to only be called<br class="">
when it was correct to emit an absolute difference -- if it "failed",<br class="">
it was only a missed optimization.  It looks to me like we're now<br class="">
*depending* on it "failing" for split-DWARF.<br class="">
<br class="">
Or am I wrong that we're depending on that?  Does ELF not require<br class="">
relocations here?<br class="">
<br class="">
(There are a couple of other calls to emitLabelDifference() that come<br class="">
from split-DWARF/DWO logic.  I didn't look at them as deeply, but I<br class="">
imagine they could have similar problems?)</blockquote></div><br class=""></div></div>
</div></blockquote></span></div><br class=""></div></blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""></body></html>