Looks like it's working around the return value load/alloca eliding in
the code generator? I definitely like a more general way of
approaching the problem.

I wonder if we can either localize this fix into EmitFunctionEpilog
(couldn't come up with one) or if this has applicability in the > 1
return statement condition. Open questions, this is a bit of a finicky
and complicated area as you've no doubt realized. :)

One other comment on the patch:

+  if (CGDebugInfo *DI = getDebugInfo()) {
     DI->EmitLocation(Builder, EndLoc);
+    EndLocL = Builder.getCurrentDebugLocation();
+    if ((NStopPoints == 1) && !FnRetTy->isVoidType()) {
+      DI->EmitLocation(Builder, FirstStopPoint);
+      EmitRetDbgLoc = false;

Do we need the two locations emitted here? or the check for VoidType?
(I realize based on the return value load/alloca eliding it would need
to be void type - but hence me asking).

-eric


On Fri, Apr 26, 2013 at 2:15 AM, Adrian Prantl <[email protected]> wrote:
>
> On Apr 23, 2013, at 4:00 PM, Eric Christopher <[email protected]> wrote:
>
>> Not sure what you mean, I'm curious why the arc code is getting line
>> information associated with the end of the block even at the
>> beginning? Same with blocks. (To be fair I didn't implement that front
>> end part so I'm relying on you to know since you're adjusting it :)
>
> With blocks the problem is that we insert an extra alloca and some setup code 
> into the prologue, but unless we set the DebugLoc to an empty location that 
> code will have line info attached to it. This in turn will trigger the 
> heuristic in AsmPrinter/DwarfDebug to believe that it should emit the 
> prologue_end flag when in fact we are still in the middle of the frame setup. 
> Which will cause some debugger tests to fail. I think that that is fairly 
> uncontroversial.
>
> Lets move over to the interesting part:
>
> With ARC the problem is closer to the C++ example you provided the other day. 
> After reconsidering the problem you got me convinced (thanks!) that removing 
> the debug info for the ARC cleanup code goes a bit too far. The problem is 
> that if we have only a single return statement in the function -- especially 
> one where the return expression does not use anything that needs to be 
> cleaned up -- the (ARC) cleanup code will be the first non-prologue 
> (linetable-)stmt in the function. That means we *need* to provide a 
> breakpoint there, otherwise the user can’t inspect the values before they get 
> cleaned up.
>
>     1   - (int)testFoo:(NSString *)foo {
>     2       return 1;
>     3   } // Cleanup code, comes before ret 1, but has a higher line number
>
> My new patch ensures that the line table is always sequential. If there is 
> cleanup code and a single return statement it essentially flips their debug 
> locations so the first breakpoint in the function is before the cleanup code 
> and in a location that does not confuse the user.
> In any function, if there is cleanup code, it will get the debug location of 
> the ‘}’ *and* the ret instruction in the epilog will have no debug location, 
> so the debugger doesn’t jump back into the function body again. There is 
> nothing to see there anyway :-)
>
> I tried it on your C++ example and it seemed reasonable, too.
> It also should be very close to the behavior of GCC that David mentioned the 
> other day where the return expression is at the line of the return statement 
> and the cleanup code and actual return are t the closing brace of the scope.
>
> thanks!
> Adrian

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to