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

Anders Carlsson andersca at mac.com
Wed Sep 23 11:59:48 PDT 2009


Author: andersca
Date: Wed Sep 23 13:59:48 2009
New Revision: 82642

URL: http://llvm.org/viewvc/llvm-project?rev=82642&view=rev
Log:
Emit new[] cookie when needed.

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

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

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXXExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXXExpr.cpp Wed Sep 23 13:59:48 2009
@@ -16,6 +16,9 @@
 using namespace CodeGen;
 
 static uint64_t CalculateCookiePadding(ASTContext &Ctx, const CXXNewExpr *E) {
+  if (!E->isArray())
+    return 0;
+  
   QualType T = E->getAllocatedType();
   
   const RecordType *RT = T->getAs<RecordType>();
@@ -34,7 +37,7 @@
   
   // Padding is the maximum of sizeof(size_t) and alignof(T)
   return std::max(Ctx.getTypeSize(Ctx.getSizeType()),
-                  static_cast<uint64_t>(Ctx.getTypeAlign(T)));
+                  static_cast<uint64_t>(Ctx.getTypeAlign(T))) / 8;
 }
 
 static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF, 
@@ -115,11 +118,6 @@
 }
 
 llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
-  if (E->isArray() && CalculateCookiePadding(getContext(), E)) {
-    ErrorUnsupported(E, "new[] expression");
-    return llvm::UndefValue::get(ConvertType(E->getType()));
-  }
-
   QualType AllocType = E->getAllocatedType();
   FunctionDecl *NewFD = E->getOperatorNew();
   const FunctionProtoType *NewFTy = NewFD->getType()->getAs<FunctionProtoType>();
@@ -199,6 +197,21 @@
     EmitBlock(NewNotNull);
   }
 
+  if (uint64_t CookiePadding = CalculateCookiePadding(getContext(), E)) {
+    uint64_t CookieOffset = 
+      CookiePadding - getContext().getTypeSize(SizeTy) / 8;
+    
+    llvm::Value *NumElementsPtr = 
+      Builder.CreateConstInBoundsGEP1_64(NewPtr, CookieOffset);
+    
+    NumElementsPtr = Builder.CreateBitCast(NumElementsPtr, 
+                                           ConvertType(SizeTy)->getPointerTo());
+    Builder.CreateStore(NumElements, NumElementsPtr);
+
+    // Now add the padding to the new ptr.
+    NewPtr = Builder.CreateConstInBoundsGEP1_64(NewPtr, CookiePadding);
+  }
+  
   NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType()));
 
   EmitNewInitializer(*this, E, NewPtr, NumElements);

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

==============================================================================
--- cfe/trunk/test/CodeGenCXX/new.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/new.cpp Wed Sep 23 13:59:48 2009
@@ -55,6 +55,10 @@
   new int();
 }
 
+struct U {
+  ~U();
+};
+  
 void t8(int n) {
   new int[10];
   new int[n];
@@ -62,4 +66,8 @@
   // Non-POD
   new T[10];
   new T[n];
+  
+  // Cookie required
+  new U[10];
+  new U[n];
 }





More information about the cfe-commits mailing list