diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 6705901..196ab5d 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -689,7 +689,7 @@
     return i->second;
 
   // Not found yet, create a new global.
-  llvm::Constant *s = llvm::ConstantArray::get(getLLVMContext(), Str, true);
+  llvm::Constant *s = llvm::ConstantDataArray::getString(getLLVMContext(), Str);
   llvm::GlobalValue *gv = new llvm::GlobalVariable(getModule(), s->getType(),
     true, llvm::GlobalValue::PrivateLinkage, s, ".str");
   gv->setSection(AnnotationSection);
@@ -1853,7 +1853,8 @@
     llvm::ConstantInt::get(Ty, 0x07C8);
 
   // String pointer.
-  llvm::Constant *C = llvm::ConstantArray::get(VMContext, Entry.getKey().str());
+  llvm::Constant *C = llvm::ConstantDataArray::getString(VMContext,
+                                                         Entry.getKey());
 
   llvm::GlobalValue::LinkageTypes Linkage;
   if (isUTF16)
@@ -1985,7 +1986,8 @@
   Fields[0] = ConstantStringClassRef;
   
   // String pointer.
-  llvm::Constant *C = llvm::ConstantArray::get(VMContext, Entry.getKey().str());
+  llvm::Constant *C =
+    llvm::ConstantDataArray::getString(VMContext, Entry.getKey());
   
   llvm::GlobalValue::LinkageTypes Linkage;
   bool isConstant;
@@ -2081,29 +2083,28 @@
   // Don't emit it as the address of the string, emit the string data itself
   // as an inline array.
   if (E->getCharByteWidth()==1) {
-    return llvm::ConstantArray::get(VMContext,
+    return llvm::ConstantDataArray::getString(VMContext,
                                     GetStringForStringLiteral(E), false);
-  } else {
-    llvm::ArrayType *AType =
-      cast<llvm::ArrayType>(getTypes().ConvertType(E->getType()));
-    llvm::Type *ElemTy = AType->getElementType();
-    unsigned NumElements = AType->getNumElements();
-    std::vector<llvm::Constant*> Elts;
-    Elts.reserve(NumElements);
-    
-    for(unsigned i=0;i<E->getLength();++i) {
-      unsigned value = E->getCodeUnit(i);
-      llvm::Constant *C = llvm::ConstantInt::get(ElemTy,value,false);
-      Elts.push_back(C);
-    }
-    for(unsigned i=E->getLength();i<NumElements;++i) {
-      llvm::Constant *C = llvm::ConstantInt::get(ElemTy,0,false);
-      Elts.push_back(C);
-    }
-    
-    return llvm::ConstantArray::get(AType, Elts);
   }
-
+  
+  llvm::ArrayType *AType =
+    cast<llvm::ArrayType>(getTypes().ConvertType(E->getType()));
+  llvm::Type *ElemTy = AType->getElementType();
+  unsigned NumElements = AType->getNumElements();
+  std::vector<llvm::Constant*> Elts;
+  Elts.reserve(NumElements);
+  
+  for(unsigned i=0;i<E->getLength();++i) {
+    unsigned value = E->getCodeUnit(i);
+    llvm::Constant *C = llvm::ConstantInt::get(ElemTy,value,false);
+    Elts.push_back(C);
+  }
+  for(unsigned i=E->getLength();i<NumElements;++i) {
+    llvm::Constant *C = llvm::ConstantInt::get(ElemTy,0,false);
+    Elts.push_back(C);
+  }
+  
+  return llvm::ConstantArray::get(AType, Elts);
 }
 
 /// GetAddrOfConstantStringFromLiteral - Return a pointer to a
@@ -2152,7 +2153,7 @@
                                              unsigned Alignment) {
   // Create Constant for this string literal. Don't add a '\0'.
   llvm::Constant *C =
-      llvm::ConstantArray::get(CGM.getLLVMContext(), str, false);
+      llvm::ConstantDataArray::getString(CGM.getLLVMContext(), str, false);
 
   // Create a global variable for this string
   llvm::GlobalVariable *GV =
