]> granicus.if.org Git - clang/commitdiff
Code-gen for CXXZeroInitValueExpr AST passed
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 20 Oct 2009 23:29:04 +0000 (23:29 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 20 Oct 2009 23:29:04 +0000 (23:29 +0000)
as argument to a function call. Removes a FIXME.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84694 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp
lib/CodeGen/CGExpr.cpp
lib/CodeGen/CodeGenFunction.h
test/CodeGenCXX/call-arg-zero-temp.cpp [new file with mode: 0644]

index 44e5207e53d2b23e532d408b7178c0514b5ff4cb..cfa669dc4b6ecfc4e022b371077be54b74679747 100644 (file)
@@ -566,10 +566,6 @@ CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D,
       assert(!ClassDecl->hasUserDeclaredCopyConstructor() &&
              "EmitCXXConstructorCall - user declared copy constructor");
       const Expr *E = (*ArgBeg);
-      // FIXME. This may not be correct. But till now, we were skipping
-      // code gen of trivial copy constructors regardless of their arguments.
-      if (isa<CXXZeroInitValueExpr>(E))
-        return;
       QualType Ty = E->getType();
       llvm::Value *Src = EmitLValue(E).getAddress();
       EmitAggregateCopy(This, Src, Ty);
index 29ca900ed318d66b9aa18acb4481f3c25b77cf93..d3d1c61fe99f2c4c3798569e1100ebbf4261c505 100644 (file)
@@ -303,6 +303,8 @@ LValue CodeGenFunction::EmitLValue(const Expr *E) {
   case Expr::CXXReinterpretCastExprClass:
   case Expr::CXXConstCastExprClass:
     return EmitCastLValue(cast<CastExpr>(E));
+  case Expr::CXXZeroInitValueExprClass:
+    return EmitNullInitializationLValue(cast<CXXZeroInitValueExpr>(E));
   }
 }
 
@@ -1313,6 +1315,18 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
   }
 }
 
+LValue CodeGenFunction::EmitNullInitializationLValue(
+                                              const CXXZeroInitValueExpr *E) {
+  QualType Ty = E->getType();
+  const llvm::Type *LTy = ConvertTypeForMem(Ty);
+  llvm::AllocaInst *Alloc = CreateTempAlloca(LTy);
+  unsigned Align = getContext().getTypeAlign(Ty)/8;
+  Alloc->setAlignment(Align);
+  LValue lvalue = LValue::MakeAddr(Alloc, Qualifiers());
+  EmitMemSetToZero(lvalue.getAddress(), Ty);
+  return lvalue;
+}
+
 //===--------------------------------------------------------------------===//
 //                             Expression Emission
 //===--------------------------------------------------------------------===//
index 3048257d2ceaf953bc5de4a9d927f55672d952af..a32a7eabad60fd9b4f10dcd048279cdae1717801 100644 (file)
@@ -817,7 +817,8 @@ public:
   LValue EmitCompoundLiteralLValue(const CompoundLiteralExpr *E);
   LValue EmitConditionalOperatorLValue(const ConditionalOperator *E);
   LValue EmitCastLValue(const CastExpr *E);
-
+  LValue EmitNullInitializationLValue(const CXXZeroInitValueExpr *E);
+  
   llvm::Value *EmitIvarOffset(const ObjCInterfaceDecl *Interface,
                               const ObjCIvarDecl *Ivar);
   LValue EmitLValueForField(llvm::Value* Base, FieldDecl* Field,
diff --git a/test/CodeGenCXX/call-arg-zero-temp.cpp b/test/CodeGenCXX/call-arg-zero-temp.cpp
new file mode 100644 (file)
index 0000000..2c44f69
--- /dev/null
@@ -0,0 +1,23 @@
+// RUN: clang-cc -triple x86_64-apple-darwin -S %s -o %t-64.s &&
+// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s &&
+// RUN: clang-cc -triple i386-apple-darwin -S %s -o %t-32.s &&
+// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s &&
+// RUN: true
+
+
+extern "C" int printf(...);
+
+struct obj{ int a; float b; double d; };
+
+void foo(obj o) {
+  printf("%d  %f  %f\n", o.a, o.b, o.d);
+}
+
+int main() {
+  obj o = obj();
+  foo(obj());
+}
+
+// CHECK-LP64: call     __Z3foo3obj
+
+// CHECK-LP32: call     __Z3foo3obj