diff options
author | Adrian Prantl <aprantl@apple.com> | 2013-05-03 00:44:13 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2013-05-03 00:44:13 +0000 |
commit | 30c0d27b61e38ad6038eeb8650f0dac83056c75b (patch) | |
tree | f6a518899d04ca7ea2e2234f452c467eab0e225f /lib/CodeGen/CodeGenFunction.cpp | |
parent | d306a530fca74e40916121f5583e0545e470b3c4 (diff) |
Attempt to un-break the gdb buildbot.
- Use the debug location of the return expression for the cleanup code
if the return expression is trivially evaluatable, regardless of the
number of stop points in the function.
- Ensure that any EH code in the cleanup still gets the line number of
the closing } of the lexical scope.
- Added a testcase with EH in the cleanup.
rdar://problem/13442648
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@180982 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | lib/CodeGen/CodeGenFunction.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index 122e95b266..9f97560600 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -44,7 +44,7 @@ CodeGenFunction::CodeGenFunction(CodeGenModule &cgm, bool suppressNewContext) DebugInfo(0), DisableDebugInfo(false), CalleeWithThisReturn(0), DidCallStackSave(false), IndirectBranch(0), SwitchInsn(0), CaseRangeBlock(0), UnreachableBlock(0), - NumStopPoints(0), NumSimpleReturnExprs(0), + NumReturnExprs(0), NumSimpleReturnExprs(0), CXXABIThisDecl(0), CXXABIThisValue(0), CXXThisValue(0), CXXDefaultInitExprThis(0), CXXStructorImplicitParamDecl(0), CXXStructorImplicitParamValue(0), @@ -188,14 +188,14 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) { assert(BreakContinueStack.empty() && "mismatched push/pop in break/continue stack!"); - // If the function contains only a single, simple return statement, - // the cleanup code may become the first breakpoint in the - // function. To be safe set the debug location for it to the - // location of the return statement. Otherwise point it to end of - // the function's lexical scope. + // If the function contains only a simple return statement, the + // cleanup code may become the first breakpoint in the function. To + // be safe, set the debug location for it to the location of the + // return statement. Otherwise point it to end of the function's + // lexical scope. if (CGDebugInfo *DI = getDebugInfo()) { - if (NumSimpleReturnExprs == 1 && NumStopPoints == 1) - DI->EmitLocation(Builder, FirstStopPoint); + if (NumSimpleReturnExprs == NumReturnExprs) + DI->EmitLocation(Builder, LastStopPoint); else DI->EmitLocation(Builder, EndLoc); } @@ -206,14 +206,14 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) { // edges will be *really* confused. bool EmitRetDbgLoc = true; if (EHStack.stable_begin() != PrologueCleanupDepth) { - PopCleanupBlocks(PrologueCleanupDepth); + PopCleanupBlocks(PrologueCleanupDepth, EndLoc); // Make sure the line table doesn't jump back into the body for // the ret after it's been at EndLoc. EmitRetDbgLoc = false; if (CGDebugInfo *DI = getDebugInfo()) - if (NumSimpleReturnExprs == 1 && NumStopPoints == 1) + if (NumSimpleReturnExprs == NumReturnExprs) DI->EmitLocation(Builder, EndLoc); } |