diff options
author | Adrian Prantl <aprantl@apple.com> | 2013-07-25 00:23:42 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2013-07-25 00:23:42 +0000 |
commit | 524ba1f11dda0933a83323c889b743fbdd8732ab (patch) | |
tree | bc260768fced0e72fc8beee85002b621649328c4 /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | 12bdde57a963a4a17af5e7d546d400b77069183e (diff) | |
download | bcm5719-llvm-524ba1f11dda0933a83323c889b743fbdd8732ab.tar.gz bcm5719-llvm-524ba1f11dda0933a83323c889b743fbdd8732ab.zip |
Debug Info: Fine-tune the simple return expression location handling to
only affect functions without a separate return block. This fixes the
linetable for void functions with cleanups and multiple returns.
llvm-svn: 187090
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 51b86f77e59..addc25f5310 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -191,14 +191,20 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) { "mismatched push/pop in break/continue stack!"); bool OnlySimpleReturnStmts = NumSimpleReturnExprs > 0 - && NumSimpleReturnExprs == NumReturnExprs; - // If the function contains only a simple return statement, the - // location before the cleanup code becomes the last useful - // breakpoint in the function, because the simple return expression - // will be evaluated after the cleanup code. To be safe, set the - // debug location for cleanup code to the location of the return - // statement. Otherwise the cleanup code should be at the end of the - // function's lexical scope. + && NumSimpleReturnExprs == NumReturnExprs + && ReturnBlock.getBlock()->use_empty(); + // Usually the return expression is evaluated before the cleanup + // code. If the function contains only a simple return statement, + // such as a constant, the location before the cleanup code becomes + // the last useful breakpoint in the function, because the simple + // return expression will be evaluated after the cleanup code. To be + // safe, set the debug location for cleanup code to the location of + // the return statement. Otherwise the cleanup code should be at the + // end of the function's lexical scope. + // + // If there are multiple branches to the return block, the branch + // instructions will get the location of the return statements and + // all will be fine. if (CGDebugInfo *DI = getDebugInfo()) { if (OnlySimpleReturnStmts) DI->EmitLocation(Builder, LastStopPoint); |