r230503 - Reland r230460 with a test fix for -Asserts builds.

Reid Kleckner rnk at google.com
Wed Feb 25 09:08:01 PST 2015


Nice!

On Wed, Feb 25, 2015 at 8:25 AM, Nico Weber <nicolasweber at gmx.de> wrote:

> Author: nico
> Date: Wed Feb 25 10:25:00 2015
> New Revision: 230503
>
> URL: http://llvm.org/viewvc/llvm-project?rev=230503&view=rev
> Log:
> Reland r230460 with a test fix for -Asserts builds.
>
> Original CL description:
> Produce less broken basic block sequences for __finally blocks.
>
> The way cleanups (such as PerformSEHFinally) get emitted is that codegen
> generates some initialization code, then calls the cleanup's Emit() with
> the
> insertion point set to a good place, then the cleanup is supposed to emit
> its
> stuff, and then codegen might tack in a jump or similar to where the
> insertion
> point is after the cleanup.
>
> The PerformSEHFinally cleanup tries to just stash away the block it's
> supposed
> to codegen into, and then does codegen later, into that stashed block.
> However,
> after codegen'ing the __finally block, it used to set the insertion point
> to
> the finally's continuation block (where the __finally cleanup goes when
> its body
> is completed after regular, non-exceptional control flow).  That's not
> correct,
> as that block can (and generally does) already ends in a jump.  Instead,
> remember the insertion point that was current before the __finally got
> emitted,
> and restore that.
>
> Fixes two of the crashes in PR22553.
>
> Modified:
>     cfe/trunk/lib/CodeGen/CGException.cpp
>     cfe/trunk/test/CodeGen/exceptions-seh-finally.c
>
> Modified: cfe/trunk/lib/CodeGen/CGException.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=230503&r1=230502&r2=230503&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGException.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGException.cpp Wed Feb 25 10:25:00 2015
> @@ -813,8 +813,8 @@ llvm::BasicBlock *CodeGenFunction::EmitL
>    bool hasFilter = false;
>    SmallVector<llvm::Value*, 4> filterTypes;
>    llvm::SmallPtrSet<llvm::Value*, 4> catchTypes;
> -  for (EHScopeStack::iterator I = EHStack.begin(), E = EHStack.end();
> -         I != E; ++I) {
> +  for (EHScopeStack::iterator I = EHStack.begin(), E = EHStack.end(); I
> != E;
> +       ++I) {
>
>      switch (I->getKind()) {
>      case EHScope::Cleanup:
> @@ -1927,6 +1927,7 @@ void CodeGenFunction::ExitSEHTryStmt(con
>      assert(FI.ContBB && "did not emit normal cleanup");
>
>      // Emit the code into FinallyBB.
> +    CGBuilderTy::InsertPoint SavedIP = Builder.saveIP();
>      Builder.SetInsertPoint(FI.FinallyBB);
>      EmitStmt(Finally->getBlock());
>
> @@ -1949,7 +1950,7 @@ void CodeGenFunction::ExitSEHTryStmt(con
>        Builder.CreateBr(FI.ContBB);
>      }
>
> -    Builder.SetInsertPoint(FI.ContBB);
> +    Builder.restoreIP(SavedIP);
>
>      return;
>    }
>
> Modified: cfe/trunk/test/CodeGen/exceptions-seh-finally.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/exceptions-seh-finally.c?rev=230503&r1=230502&r2=230503&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/exceptions-seh-finally.c (original)
> +++ cfe/trunk/test/CodeGen/exceptions-seh-finally.c Wed Feb 25 10:25:00
> 2015
> @@ -160,3 +160,45 @@ void noreturn_finally() {
>  // CHECK-NEXT: cleanup
>  // CHECK: store i8 1, i8* %
>  // CHECK: br label %[[finally]]
> +
> +int finally_with_return() {
> +  __try {
> +    return 42;
> +  } __finally {
> +  }
> +}
> +// CHECK-LABEL: define i32 @finally_with_return()
> +// CHECK: store i8 0, i8* %
> +// CHECK-NEXT: br label %[[finally:[^ ]*]]
> +//
> +// CHECK: [[finally]]
> +// CHECK-NEXT: br label %[[finallycont:[^ ]*]]
> +//
> +// CHECK: [[finallycont]]
> +// CHECK-NEXT: ret i32 42
> +
> +int nested___finally___finally() {
> +  __try {
> +    __try {
> +    } __finally {
> +      return 1;
> +    }
> +  } __finally {
> +    // Intentionally no return here.
> +  }
> +  return 0;
> +}
> +// CHECK-LABEL: define i32 @nested___finally___finally
> +// CHECK: store i8 0, i8* %
> +// CHECK-NEXT: br label %[[finally:[^ ]*]]
> +//
> +// CHECK: [[finally]]
> +// CHECK-NEXT:  store i32 1, i32* %
> +// CHECK-NEXT:  store i8 0, i8* %
> +// CHECK-NEXT: br label %[[outerfinally:[^ ]*]]
> +//
> +// CHECK: [[outerfinally]]
> +// CHECK-NEXT: br label %[[finallycont:[^ ]*]]
> +//
> +// CHECK: [[finallycont]]
> +// CHECK-NEXT: ret i32 1
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150225/dd47d1e2/attachment.html>


More information about the cfe-commits mailing list