<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Mar 29, 2017 at 2:16 AM George Rimar via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">grimar added inline comments.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
================<br class="gmail_msg">
Comment at: ELF/SyntheticSections.cpp:1739-1740<br class="gmail_msg">
+  // consists of a 0 for the beginning address offset and a 0 for the ending<br class="gmail_msg">
+  // address offset. We assume here that whole section data starting from offset<br class="gmail_msg">
+  // is a range, terminated with null entry.<br class="gmail_msg">
+  if (Optional<uint64_t> Offset = toSectionOffset(Die.find(DW_AT_ranges))) {<br class="gmail_msg">
----------------<br class="gmail_msg">
dblaikie wrote:<br class="gmail_msg">
> I don't understand what assumption you're describing.<br class="gmail_msg">
><br class="gmail_msg">
> Oh, because relocations haven't been performed, nor handled at all - it's not possible to tell where the address ranges end, so you're providing an overestimate here? That's a bit subtle and the function name should at least mention that I would think (& the function that calls this one too)<br class="gmail_msg">
><br class="gmail_msg">
> Is there any penalty to this overestimate in how the gdb_index is created? Does a larger sized record need to be used to handle a maximum that may never be needed?<br class="gmail_msg">
><br class="gmail_msg">
> [looking at the implementation, it seems there is a penalty for overestimate - a table is reserved for that many address ranges, right? so much of that table may go unused if this is a significant overestimate (though that probably only happens if someone uses ld -r or, perhaps more likely: LTO)]<br class="gmail_msg">
><br class="gmail_msg">
> I wouldn't imagine it'd be too hard to look at enough relocation data (essentially parse the relocations applicable to debug_ranges and look for holes (bytes that don't have relocations for them) - those are the ends of range lists - you wouldn't need to apply any relocations or examine their addends, etc, only their offsets)<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
>I don't understand what assumption you're describing.<br class="gmail_msg">
><br class="gmail_msg">
>Oh, because relocations haven't been performed, nor handled at all - it's not possible to tell where the address ranges end, so you're providing >an overestimate here? That's a bit subtle and the function name should at least mention that I would think (& the function that calls this one >too)<br class="gmail_msg">
<br class="gmail_msg">
Right. Its straightforward and fastest way to do things I believe. It is possible to tell where is address ranges end only after handling or some parsing of relocations. I think we can find the relocation with largest offset in .debug_range section and that be enough to know that next offset is the end here. (but that would not solve everything, please see below)<br class="gmail_msg">
I can probably rename getDieRangesCount to estimateDieRangesCount and getAddressRangesCount to estimateAddressRangesCount ?<br class="gmail_msg">
<br class="gmail_msg">
>Is there any penalty to this overestimate in how the gdb_index is created? Does a larger sized record need to be used to handle a maximum >that may never be needed?<br class="gmail_msg">
><br class="gmail_msg">
>[looking at the implementation, it seems there is a penalty for overestimate - a table is reserved for that many address ranges, right? so much >of that table may go unused if this is a significant overestimate (though that probably only happens if someone uses ld -r or, perhaps more >likely: LTO)]<br class="gmail_msg">
<br class="gmail_msg">
Yes, penalty is size. I am not aware about LTO, </blockquote><div><br>In LTO (& ThinLTO, I think) it's expected that there will be object files with multiple CUs (& thus multiple ranges)<br><br>Actually, for that matter, even in a non-LTO situation, especially in an optimized build, the CU's range list won't be the only range list in the debug_ranges section, so this may be quite a substantial overestimate for optimized debug info.<br><br>I'll leave it up to Rui if that's a reasonable intermediate step to commit - or whether you should find a solution to this overestimate before committing this change.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I knew about ld -r here only. I think perfomance is preferable over possible size penalty in general. And this patch just a first step in direction to use relocated data, so we can think about how to solve that after this change probably.<br class="gmail_msg">
<br class="gmail_msg">
>I wouldn't imagine it'd be too hard to look at enough relocation data (essentially parse the relocations applicable to debug_ranges and look for >holes (bytes that don't have relocations for them) - those are the ends of range lists - you wouldn't need to apply any relocations or examine >their addends, etc, only their offsets)<br class="gmail_msg">
<br class="gmail_msg">
There is one more issue I mentioned in description - is when address range belongs to discarded section. This case can not be catched until relocations are scanned at later stages, because we cant just scan relocations early when we do not know which sections were discarded.<br class="gmail_msg">
So since these issues are related, I would fix them in a separate patch(es). Scanning of relocations also will probably affect perfomance, and should be done in a some smart way.<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<a href="https://reviews.llvm.org/D31424" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D31424</a><br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
</blockquote></div></div>