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 | 44f38013e22475e122e6847de8642d1dd18d497d (patch) | |
tree | 071b1b925da4a93c5577638f2ad38f2e9b18d631 /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | f12d9d93feacad93ff99dd2eb700c9ebee53bb34 (diff) | |
download | bcm5719-llvm-44f38013e22475e122e6847de8642d1dd18d497d.tar.gz bcm5719-llvm-44f38013e22475e122e6847de8642d1dd18d497d.zip |
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
llvm-svn: 180982
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 122e95b2663..9f975606005 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/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); } |