/// then loads the result into DestPtr.
void EmitAggLoadOfLValue(const Expr *E);
- void EmitAggregateCopy(llvm::Value *DestPtr, llvm::Value *SrcPtr,
- QualType EltTy);
-
- void EmitAggregateClear(llvm::Value *DestPtr, QualType Ty);
-
void EmitNonConstInit(InitListExpr *E);
//===--------------------------------------------------------------------===//
// Utilities
//===----------------------------------------------------------------------===//
-void AggExprEmitter::EmitAggregateClear(llvm::Value *DestPtr, QualType Ty) {
- assert(!Ty->isAnyComplexType() && "Shouldn't happen for complex");
-
- CGF.EmitMemSetToZero(DestPtr, Ty);
-}
-
-void AggExprEmitter::EmitAggregateCopy(llvm::Value *DestPtr,
- llvm::Value *SrcPtr, QualType Ty) {
- assert(!Ty->isAnyComplexType() && "Shouldn't happen for complex");
-
- // Aggregate assignment turns into llvm.memmove.
- const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
- if (DestPtr->getType() != BP)
- DestPtr = Builder.CreateBitCast(DestPtr, BP, "tmp");
- if (SrcPtr->getType() != BP)
- SrcPtr = Builder.CreateBitCast(SrcPtr, BP, "tmp");
-
- // Get size and alignment info for this aggregate.
- std::pair<uint64_t, unsigned> TypeInfo = CGF.getContext().getTypeInfo(Ty);
-
- // FIXME: Handle variable sized types.
- const llvm::Type *IntPtr = llvm::IntegerType::get(CGF.LLVMPointerWidth);
-
- Builder.CreateCall4(CGF.CGM.getMemMoveFn(),
- DestPtr, SrcPtr,
- // TypeInfo.first describes size in bits.
- llvm::ConstantInt::get(IntPtr, TypeInfo.first/8),
- llvm::ConstantInt::get(llvm::Type::Int32Ty,
- TypeInfo.second/8));
-}
-
-
/// EmitAggLoadOfLValue - Given an expression with aggregate type that
/// represents a value lvalue, this method emits the address of the lvalue,
/// then loads the result into DestPtr.
// FIXME: If the source is volatile, we must read from it.
return;
- EmitAggregateCopy(DestPtr, SrcPtr, E->getType());
+ CGF.EmitAggregateCopy(DestPtr, SrcPtr, E->getType());
}
//===----------------------------------------------------------------------===//
// FIXME: If the source is volatile, we must read from it.
return;
- EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
+ CGF.EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
}
void AggExprEmitter::VisitObjCMessageExpr(ObjCMessageExpr *E) {
// FIXME: If the source is volatile, we must read from it.
return;
- EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
+ CGF.EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
}
void AggExprEmitter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
// FIXME: If the source is volatile, we must read from it.
return;
- EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
+ CGF.EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
}
void AggExprEmitter::VisitOverloadExpr(const OverloadExpr *E) {
// FIXME: If the source is volatile, we must read from it.
return;
- EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
+ CGF.EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType());
}
void AggExprEmitter::VisitBinComma(const BinaryOperator *E) {
return;
// If the result of the assignment is used, copy the RHS there also.
- EmitAggregateCopy(DestPtr, LHS.getAddress(), E->getType());
+ CGF.EmitAggregateCopy(DestPtr, LHS.getAddress(), E->getType());
}
}
// FIXME: volatility
Builder.CreateStore(llvm::Constant::getNullValue(EType), NextVal);
else
- EmitAggregateClear(NextVal, QType);
+ CGF.EmitAggregateClear(NextVal, QType);
}
} else
assert(false && "Invalid initializer");
AggExprEmitter(*this, DestPtr, VolatileDest).Visit(const_cast<Expr*>(E));
}
+
+void CodeGenFunction::EmitAggregateClear(llvm::Value *DestPtr, QualType Ty) {
+ assert(!Ty->isAnyComplexType() && "Shouldn't happen for complex");
+
+ EmitMemSetToZero(DestPtr, Ty);
+}
+
+void CodeGenFunction::EmitAggregateCopy(llvm::Value *DestPtr,
+ llvm::Value *SrcPtr, QualType Ty) {
+ assert(!Ty->isAnyComplexType() && "Shouldn't happen for complex");
+
+ // Aggregate assignment turns into llvm.memmove.
+ const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty);
+ if (DestPtr->getType() != BP)
+ DestPtr = Builder.CreateBitCast(DestPtr, BP, "tmp");
+ if (SrcPtr->getType() != BP)
+ SrcPtr = Builder.CreateBitCast(SrcPtr, BP, "tmp");
+
+ // Get size and alignment info for this aggregate.
+ std::pair<uint64_t, unsigned> TypeInfo = getContext().getTypeInfo(Ty);
+
+ // FIXME: Handle variable sized types.
+ const llvm::Type *IntPtr = llvm::IntegerType::get(LLVMPointerWidth);
+
+ Builder.CreateCall4(CGM.getMemMoveFn(),
+ DestPtr, SrcPtr,
+ // TypeInfo.first describes size in bits.
+ llvm::ConstantInt::get(IntPtr, TypeInfo.first/8),
+ llvm::ConstantInt::get(llvm::Type::Int32Ty,
+ TypeInfo.second/8));
+}