]> granicus.if.org Git - clang/commitdiff
build wide strings with ConstantDataArray, just because we can.
authorChris Lattner <sabre@nondot.org>
Mon, 6 Feb 2012 22:52:04 +0000 (22:52 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 6 Feb 2012 22:52:04 +0000 (22:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149928 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenModule.cpp

index 887513d2bd0cc665ba444aa64d62ca5797d63557..301f76a4f37fae26e375228ebd779bd843bd4be0 100644 (file)
@@ -2072,20 +2072,26 @@ CodeGenModule::GetConstantArrayFromStringLiteral(const StringLiteral *E) {
     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);
+
+  // Wide strings have either 2-byte or 4-byte elements.
+  if (ElemTy->getPrimitiveSizeInBits() == 16) {
+    SmallVector<uint16_t, 32> Elements;
+    Elements.reserve(NumElements);
+
+    for(unsigned i = 0, e = E->getLength(); i != e; ++i)
+      Elements.push_back(E->getCodeUnit(i));
+    Elements.resize(NumElements);
+    return llvm::ConstantDataArray::get(VMContext, Elements);
   }
   
-  return llvm::ConstantArray::get(AType, Elts);
+  assert(ElemTy->getPrimitiveSizeInBits() == 32);
+  SmallVector<uint32_t, 32> Elements;
+  Elements.reserve(NumElements);
+  
+  for(unsigned i = 0, e = E->getLength(); i != e; ++i)
+    Elements.push_back(E->getCodeUnit(i));
+  Elements.resize(NumElements);
+  return llvm::ConstantDataArray::get(VMContext, Elements);
 }
 
 /// GetAddrOfConstantStringFromLiteral - Return a pointer to a