diff options
author | Chris Lattner <sabre@nondot.org> | 2012-02-06 22:52:04 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-02-06 22:52:04 +0000 |
commit | d79ed43d2bb9dd4a54889450ecff9299a9d4d1bc (patch) | |
tree | fe9926fefecb243def8ed51c6530cca016f5b844 /lib/CodeGen/CodeGenModule.cpp | |
parent | 812234b70461eafd43acb6ccbd736bb4bbf88728 (diff) |
build wide strings with ConstantDataArray, just because we can.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@149928 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 887513d2bd..301f76a4f3 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -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 |