<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Feb 8, 2017 at 9:56 AM Adrian Prantl <<a href="mailto:aprantl@apple.com">aprantl@apple.com</a>> wrote:<br></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="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Feb 8, 2017, at 9:44 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="gmail_msg" target="_blank">dblaikie@gmail.com</a>> wrote:</div><br class="m_2534350994454936561Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div dir="ltr" class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Wed, Feb 8, 2017 at 9:36 AM Adrian Prantl <<a href="mailto:aprantl@apple.com" class="gmail_msg" target="_blank">aprantl@apple.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br class="gmail_msg">
> On Feb 8, 2017, at 9:25 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="gmail_msg" target="_blank">dblaikie@gmail.com</a>> wrote:<br class="gmail_msg">
><br class="gmail_msg">
> So Reid came across a case where the current strategy (dropping locations when they move across basic blocks) proves to be at odds with another precept we have: inlinable calls must have locations, so that if/when they are inlined the location can be accurately described (due to the nature of our IR representation of inlining, a location must be given for the call site so that the DIEs for the inlined subroutine can be described)<br class="gmail_msg">
><br class="gmail_msg">
> Any ideas on how we should approach this?<br class="gmail_msg">
><br class="gmail_msg">
> We could have a bit in DebugLoc (or other choice of representation) for the non-line location. For the line table this would work the same as absent DebugLoc - for calls it would cause call_file/line/discriminator (do we have a call_discriminator? We probably should, don't know if we do) to be omitted which is something the LLVM IR representation currently can't express.<br class="gmail_msg">
<br class="gmail_msg">
Even if the function calls are not inlined it could be preferable to keep a debug location. It's a very odd debugging experience to be stopped at a breakpoint and then do "up" (or just "bt") to look at the parent frame and not have a location for the call in the parent frame.<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Usually what will happen is it will have a location, it'll be the flow-on from the previous location (ie: we won't emit any line entry for the call, so it naturally ends up at the line of whatever instruction came before).</div><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Is the stripping in this case motivated by correctness for profiling or just to smooth the line table to improve the stepping experience?<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Mostly it seems the people pushing/contributing patches are motivated by profile correctness, as far as I understand (with the line table/debugging behavior 'improvement' being a nod to "there's at least an argument to be made that this could be justified by debuggability too"). At least that's the impression I get. I may've misunderstood.</div><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If its about correctness for profiling, we should consider having a separate profiling location or a skip-for-profiling bit as David suggests, that honored when the CU has the new tune-for-profiling flag set.<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I think that might be a bit too much, in my mind, for the tune-for-profiling flag. Adding things to make the profile more accurate seems good - removing things and 'hurting' debuggability because you opted for profiling seems like a different and more difficult-to-tolerate situation.</div><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">If it is about a better stepping experience, we just shouldn't do this for call sites.<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Why? A call could produce weird stepping behavior as much as a non-call instruction, and could be similarly mis-attributed. CSE could hoist two distinct calls to pure functions into a common block and we'd pick one location - the stack trace and location would be confusing to the debugger user (it could end up indicating that the if branch was taken when it was really the else branch, being the canonical example)<br class="gmail_msg"><br class="gmail_msg">Calls don't seem fundamentally special here - except due to limitations of the IR representation.</div></div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">The CSE example is a good one, though I *think* in this case we will end up calling getMergedDebugLocation() which will return a line 0 location.</div></div></div></blockquote><div><br></div><div>I think getMergedDebugLocation (or whatever it's called) currently returns a null location, which is a bit different from line 0.<br><br>Line zero is tricky to use as it can make the line table larger (file size)/worse for the user (similarly jumpy behavior, possibly, depending on how the DWARF consumer handles it).<br></div><div> </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="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"> Which brings me to the next idea: Couldn't we just assign a line 0 location instead of removing the DebugLoc and everybody would be happy?</div></div></div></blockquote><div><br></div><div>Will make the line table larger, which might not be ideal (I remember Paul tried this, then went to only using zero loc at the start of basic blocks to ensure that block ordering didn't affect locations by causing un-lined instructions at the start of a block to inherit the location at the end of the previous block). But maybe for this new use case/concern the cost might be worthwhile? Not sure.</div><div> </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="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">Or should we treat moving an instruction to a different BB different from CSE?</div></div></div></blockquote><div><br></div><div>CSE's just the most compelling example, even if it's only a single move it could still be confusing to the user and the profile (eg: the block might be conditional, the destination unconditional - so as a debugger user you'd still be mislead into believing the condition is true because your code is executing, when that's not the case)<br><br>- Dave</div><div> </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="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">-- adrian</div></div></div></blockquote></div></div>