[cfe-commits] r72678 - in /cfe/trunk: lib/CodeGen/CGCXX.cpp test/CodeGenCXX/new.cpp

Anders Carlsson andersca at mac.com
Sun May 31 17:05:16 PDT 2009


Author: andersca
Date: Sun May 31 19:05:16 2009
New Revision: 72678

URL: http://llvm.org/viewvc/llvm-project?rev=72678&view=rev
Log:
Check for null correctly for new expressions.

Modified:
    cfe/trunk/lib/CodeGen/CGCXX.cpp
    cfe/trunk/test/CodeGenCXX/new.cpp

Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=72678&r1=72677&r2=72678&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Sun May 31 19:05:16 2009
@@ -292,13 +292,27 @@
   bool NullCheckResult = NewFTy->hasEmptyExceptionSpec() &&
     !(AllocType->isPODType() && !E->hasInitializer());
 
+  llvm::BasicBlock *NewNull = 0;
+  llvm::BasicBlock *NewNotNull = 0;
+  llvm::BasicBlock *NewEnd = 0;
+
+  llvm::Value *NewPtr = RV.getScalarVal();
+
   if (NullCheckResult) {
-    ErrorUnsupported(E, "new expr that needs to be null checked");
-    return llvm::UndefValue::get(ConvertType(E->getType()));
+    NewNull = createBasicBlock("new.null");
+    NewNotNull = createBasicBlock("new.notnull");
+    NewEnd = createBasicBlock("new.end");
+    
+    llvm::Value *IsNull = 
+      Builder.CreateICmpEQ(NewPtr, 
+                           llvm::Constant::getNullValue(NewPtr->getType()),
+                           "isnull");
+    
+    Builder.CreateCondBr(IsNull, NewNull, NewNotNull);
+    EmitBlock(NewNotNull);
   }
   
-  llvm::Value *NewPtr = 
-    Builder.CreateBitCast(RV.getScalarVal(), ConvertType(E->getType()));
+  NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType()));
   
   if (AllocType->isPODType()) {
     if (E->hasInitializer()) {
@@ -323,6 +337,20 @@
                            E->constructor_arg_end());
   }
 
+  if (NullCheckResult) {
+    Builder.CreateBr(NewEnd);
+    EmitBlock(NewNull);
+    Builder.CreateBr(NewEnd);
+    EmitBlock(NewEnd);
+  
+    llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType());
+    PHI->reserveOperandSpace(2);
+    PHI->addIncoming(NewPtr, NewNotNull);
+    PHI->addIncoming(llvm::Constant::getNullValue(NewPtr->getType()), NewNull);
+    
+    NewPtr = PHI;
+  }
+    
   return NewPtr;
 }
 

Modified: cfe/trunk/test/CodeGenCXX/new.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/new.cpp?rev=72678&r1=72677&r2=72678&view=diff

==============================================================================
--- cfe/trunk/test/CodeGenCXX/new.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/new.cpp Sun May 31 19:05:16 2009
@@ -45,3 +45,8 @@
   // RUN: grep "call void @_ZN2T2C1Eii" %t | count 1 
   T2 *t2 = new T2(10, 10);
 }
+
+int *t6() {
+  // Null check.
+  return new (0) int(10);
+}





More information about the cfe-commits mailing list