Reapply patch for adding support for address spaces and added a isVolatile field to memcpy, memmove, and memset.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100305 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGExprAgg.cpp b/lib/CodeGen/CGExprAgg.cpp
index e2e2cd0..4d5160f 100644
--- a/lib/CodeGen/CGExprAgg.cpp
+++ b/lib/CodeGen/CGExprAgg.cpp
@@ -771,12 +771,27 @@
   //   a = b;
   // }
   //
-  // we need to use a differnt call here.  We use isVolatile to indicate when
+  // we need to use a different call here.  We use isVolatile to indicate when
   // either the source or the destination is volatile.
-  Builder.CreateCall4(CGM.getMemCpyFn(),
+  const llvm::Type *I1Ty = llvm::Type::getInt1Ty(VMContext);
+  const llvm::Type *I8Ty = llvm::Type::getInt8Ty(VMContext);
+  const llvm::Type *I32Ty = llvm::Type::getInt32Ty(VMContext);
+
+  const llvm::PointerType *DPT = cast<llvm::PointerType>(DestPtr->getType());
+  const llvm::Type *DBP = llvm::PointerType::get(I8Ty, DPT->getAddressSpace());
+  if (DestPtr->getType() != DBP)
+    DestPtr = Builder.CreateBitCast(DestPtr, DBP, "tmp");
+
+  const llvm::PointerType *SPT = cast<llvm::PointerType>(SrcPtr->getType());
+  const llvm::Type *SBP = llvm::PointerType::get(I8Ty, SPT->getAddressSpace());
+  if (SrcPtr->getType() != SBP)
+    SrcPtr = Builder.CreateBitCast(SrcPtr, SBP, "tmp");
+
+  Builder.CreateCall5(CGM.getMemCpyFn(DestPtr->getType(), SrcPtr->getType(),
+                                      IntPtr),
                       DestPtr, SrcPtr,
                       // TypeInfo.first describes size in bits.
                       llvm::ConstantInt::get(IntPtr, TypeInfo.first/8),
-                      llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
-                                             TypeInfo.second/8));
+                      llvm::ConstantInt::get(I32Ty,  TypeInfo.second/8),
+                      llvm::ConstantInt::get(I1Ty,  isVolatile));
 }