<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi Sebastian,<div>I went ahead and reverted this in r151203.</div><div><br></div><div> Chad</div><div><br><div><div><div>On Feb 22, 2012, at 12:46 PM, Chad Rosier wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hi Sebastian,<div>The test you added here is failing on one of our internal buildbots.</div><div><br></div><div>Here's the exact errors:</div><div><pre style="font-family: 'Courier New', courier, monotype; "><span class="stdout" style="font-family: 'Courier New', courier, monotype; color: black; ">******************** TEST 'Clang :: CodeGenCXX/new-array-init-exceptions.cpp' FAILED ********************Script:
--
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang-build/Release/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang-build/Release/bin/../lib/clang/3.1/include -std=c++11 -triple i386-unknown-unknown -fexceptions -fcxx-exceptions /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang.src/test/CodeGenCXX/new-array-init-exceptions.cpp -emit-llvm -o - | FileCheck /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang.src/test/CodeGenCXX/new-array-init-exceptions.cpp
--
Exit Code: 1
Command Output (stderr):
--
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.clang-x86_64-darwin10-R/clang.src/test/CodeGenCXX/new-array-init-exceptions.cpp:20:12: error: expected string not found in input
// CHECK: [[LPAD]]:
^
<stdin>:56:1: note: scanning from here
; <label>:27 ; preds = %25
^
<stdin>:56:1: note: with variable "LPAD" equal to "31"
; <label>:27 ; preds = %25
^
<stdin>:56:10: note: possible intended match here
; <label>:27 ; preds = %25
^
--
********************</span></pre></div><div>Chad</div><div><br></div><div><br><div><div>On Feb 22, 2012, at 9:37 AM, Sebastian Redl wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Author: cornedbee<br>Date: Wed Feb 22 11:37:59 2012<br>New Revision: 151172<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=151172&view=rev">http://llvm.org/viewvc/llvm-project?rev=151172&view=rev</a><br>Log:<br>Unwind path cleanup for array new list initializers.<br><br>Added:<br> cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp<br>Modified:<br> cfe/trunk/lib/CodeGen/CGExprCXX.cpp<br><br>Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=151172&r1=151171&r2=151172&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=151172&r1=151171&r2=151172&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)<br>+++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Wed Feb 22 11:37:59 2012<br>@@ -804,12 +804,32 @@<br> unsigned initializerElements = 0;<br><br> const Expr *Init = E->getInitializer();<br>+ llvm::AllocaInst *endOfInit = 0;<br>+ QualType::DestructionKind dtorKind = elementType.isDestructedType();<br>+ EHScopeStack::stable_iterator cleanup;<br>+ llvm::Instruction *cleanupDominator = 0;<br> // If the initializer is an initializer list, first do the explicit elements.<br> if (const InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {<br> initializerElements = ILE->getNumInits();<br>- QualType elementType = E->getAllocatedType();<br>- // FIXME: exception-safety for the explicit initializers<br>+<br>+ // Enter a partial-destruction cleanup if necessary.<br>+ if (needsEHCleanup(dtorKind)) {<br>+ // In principle we could tell the cleanup where we are more<br>+ // directly, but the control flow can get so varied here that it<br>+ // would actually be quite complex. Therefore we go through an<br>+ // alloca.<br>+ endOfInit = CreateTempAlloca(beginPtr->getType(), "array.endOfInit");<br>+ cleanupDominator = Builder.CreateStore(beginPtr, endOfInit);<br>+ pushIrregularPartialArrayCleanup(beginPtr, endOfInit, elementType,<br>+ getDestroyer(dtorKind));<br>+ cleanup = EHStack.stable_begin();<br>+ }<br>+<br> for (unsigned i = 0, e = ILE->getNumInits(); i != e; ++i) {<br>+ // Tell the cleanup that it needs to destroy up to this<br>+ // element. TODO: some of these stores can be trivially<br>+ // observed to be unnecessary.<br>+ if (endOfInit) Builder.CreateStore(explicitPtr, endOfInit);<br> StoreAnyExprIntoOneUnit(*this, ILE->getInit(i), elementType, explicitPtr);<br> explicitPtr =Builder.CreateConstGEP1_32(explicitPtr, 1, "array.exp.next");<br> }<br>@@ -825,7 +845,12 @@<br> // anything left to initialize.<br> if (llvm::ConstantInt *constNum = dyn_cast<llvm::ConstantInt>(numElements)) {<br> // If all elements have already been initialized, skip the whole loop.<br>- if (constNum->getZExtValue() <= initializerElements) return;<br>+ if (constNum->getZExtValue() <= initializerElements) {<br>+ // If there was a cleanup, deactivate it.<br>+ if (cleanupDominator)<br>+ DeactivateCleanupBlock(cleanup, cleanupDominator);;<br>+ return;<br>+ }<br> } else {<br> llvm::BasicBlock *nonEmptyBB = createBasicBlock("new.loop.nonempty");<br> llvm::Value *isEmpty = Builder.CreateICmpEQ(explicitPtr, endPtr,<br>@@ -845,11 +870,11 @@<br> Builder.CreatePHI(explicitPtr->getType(), 2, "array.cur");<br> curPtr->addIncoming(explicitPtr, entryBB);<br><br>+ // Store the new cleanup position for irregular cleanups.<br>+ if (endOfInit) Builder.CreateStore(curPtr, endOfInit);<br>+<br> // Enter a partial-destruction cleanup if necessary.<br>- QualType::DestructionKind dtorKind = elementType.isDestructedType();<br>- EHScopeStack::stable_iterator cleanup;<br>- llvm::Instruction *cleanupDominator = 0;<br>- if (needsEHCleanup(dtorKind)) {<br>+ if (!cleanupDominator && needsEHCleanup(dtorKind)) {<br> pushRegularPartialArrayCleanup(beginPtr, curPtr, elementType,<br> getDestroyer(dtorKind));<br> cleanup = EHStack.stable_begin();<br><br>Added: cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp?rev=151172&view=auto">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp?rev=151172&view=auto</a><br>==============================================================================<br>--- cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp (added)<br>+++ cfe/trunk/test/CodeGenCXX/new-array-init-exceptions.cpp Wed Feb 22 11:37:59 2012<br>@@ -0,0 +1,40 @@<br>+// RUN: %clang_cc1 -std=c++11 -triple i386-unknown-unknown -fexceptions -fcxx-exceptions %s -emit-llvm -o - | FileCheck %s<br>+<br>+struct Throws {<br>+ Throws(int);<br>+ Throws();<br>+ ~Throws();<br>+};<br>+<br>+// CHECK: define void @_Z7cleanupi<br>+void cleanup(int n) {<br>+ // CHECK: invoke void @_ZN6ThrowsC1Ei<br>+ // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD:[^ ]+]]<br>+ // CHECK: invoke void @_ZN6ThrowsC1Ei<br>+ // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]]<br>+ // CHECK: invoke void @_ZN6ThrowsC1Ei<br>+ // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]]<br>+ // CHECK: invoke void @_ZN6ThrowsC1Ev<br>+ // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD]]<br>+ new Throws[n] { 1, 2, 3 };<br>+ // CHECK: [[LPAD]]:<br>+ // CHECK-NEXT: landingpad<br>+ // CHECK: call void @_ZN6ThrowsD1Ev<br>+ // CHECK: call void @_ZdaPv<br>+}<br>+<br>+<br>+// CHECK: define void @_Z7cleanupv<br>+void cleanup() {<br>+ // CHECK: invoke void @_ZN6ThrowsC1Ei<br>+ // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2:[^ ]+]]<br>+ // CHECK: invoke void @_ZN6ThrowsC1Ei<br>+ // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2]]<br>+ // CHECK: invoke void @_ZN6ThrowsC1Ei<br>+ // CHECK-NEXT: to label %{{[^ ]+}} unwind label %[[LPAD2]]<br>+ new Throws[3] { 1, 2, 3 };<br>+ // CHECK: [[LPAD2]]:<br>+ // CHECK-NEXT: landingpad<br>+ // CHECK: call void @_ZN6ThrowsD1Ev<br>+ // CHECK: call void @_ZdaPv<br>+}<br><br><br>_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br></div></blockquote></div><br></div></div>_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits<br></blockquote></div><br></div></div></body></html>