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 | 02cb1715eca56489f9450aef13b818d832f24794 (patch) | |
tree | dd470f80a14ac49597475e67ddbbf428ee2bb4c1 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 8e7b34c7fc0747d5d9c9487f412aa1e99f2ba218 (diff) | |
download | bcm5719-llvm-02cb1715eca56489f9450aef13b818d832f24794.tar.gz bcm5719-llvm-02cb1715eca56489f9450aef13b818d832f24794.zip |
build wide strings with ConstantDataArray, just because we can.
llvm-svn: 149928
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 887513d2bd0..301f76a4f37 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/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 |