diff options
author | Chris Lattner <sabre@nondot.org> | 2012-01-24 14:04:40 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2012-01-24 14:04:40 +0000 |
commit | 32100602432657b188db603ca3ab50b487938027 (patch) | |
tree | 80645fe2c58e5097db2ce07176ecf1c8f49e6703 /lib | |
parent | 28d7e71a3021d55dce21005112f444facbda0398 (diff) | |
download | external_llvm-32100602432657b188db603ca3ab50b487938027.zip external_llvm-32100602432657b188db603ca3ab50b487938027.tar.gz external_llvm-32100602432657b188db603ca3ab50b487938027.tar.bz2 |
Rearrange argument order of ::get methods so that LLVMContext comes first,
add a ConstantDataArray::getString method that corresponds to the (to be
removed) StringRef version of ConstantArray::get, but is dramatically more
efficient.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148804 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VMCore/Constants.cpp | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index d329c67..5151105 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -718,9 +718,8 @@ Constant *ConstantArray::get(LLVMContext &Context, StringRef Str, ElementVals.push_back(ConstantInt::get(Type::getInt8Ty(Context), Str[i])); // Add a null terminator to the string... - if (AddNull) { + if (AddNull) ElementVals.push_back(ConstantInt::get(Type::getInt8Ty(Context), 0)); - } ArrayType *ATy = ArrayType::get(Type::getInt8Ty(Context), ElementVals.size()); return get(ATy, ElementVals); @@ -2119,56 +2118,71 @@ void ConstantDataSequential::destroyConstant() { /// get() constructors - Return a constant with array type with an element /// count and element type matching the ArrayRef passed in. Note that this /// can return a ConstantAggregateZero object. -Constant *ConstantDataArray::get(ArrayRef<uint8_t> Elts, LLVMContext &Context) { +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint8_t> Elts) { Type *Ty = ArrayType::get(Type::getInt8Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*1), Ty); } -Constant *ConstantDataArray::get(ArrayRef<uint16_t> Elts, LLVMContext &Context){ +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint16_t> Elts){ Type *Ty = ArrayType::get(Type::getInt16Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*2), Ty); } -Constant *ConstantDataArray::get(ArrayRef<uint32_t> Elts, LLVMContext &Context){ +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint32_t> Elts){ Type *Ty = ArrayType::get(Type::getInt32Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*4), Ty); } -Constant *ConstantDataArray::get(ArrayRef<uint64_t> Elts, LLVMContext &Context){ +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint64_t> Elts){ Type *Ty = ArrayType::get(Type::getInt64Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*8), Ty); } -Constant *ConstantDataArray::get(ArrayRef<float> Elts, LLVMContext &Context) { +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<float> Elts) { Type *Ty = ArrayType::get(Type::getFloatTy(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*4), Ty); } -Constant *ConstantDataArray::get(ArrayRef<double> Elts, LLVMContext &Context) { +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<double> Elts) { Type *Ty = ArrayType::get(Type::getDoubleTy(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*8), Ty); } +/// getString - This method constructs a CDS and initializes it with a text +/// string. The default behavior (AddNull==true) causes a null terminator to +/// be placed at the end of the array (increasing the length of the string by +/// one more than the StringRef would normally indicate. Pass AddNull=false +/// to disable this behavior. +Constant *ConstantDataArray::getString(LLVMContext &Context, + StringRef Str, bool AddNull) { + if (!AddNull) + return get(Context, ArrayRef<uint8_t>((uint8_t*)Str.data(), Str.size())); + + SmallVector<uint8_t, 64> ElementVals; + ElementVals.append(Str.begin(), Str.end()); + ElementVals.push_back(0); + return get(Context, ElementVals); +} /// get() constructors - Return a constant with vector type with an element /// count and element type matching the ArrayRef passed in. Note that this /// can return a ConstantAggregateZero object. -Constant *ConstantDataVector::get(ArrayRef<uint8_t> Elts, LLVMContext &Context) { +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<uint8_t> Elts){ Type *Ty = VectorType::get(Type::getInt8Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*1), Ty); } -Constant *ConstantDataVector::get(ArrayRef<uint16_t> Elts, LLVMContext &Context){ +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<uint16_t> Elts){ Type *Ty = VectorType::get(Type::getInt16Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*2), Ty); } -Constant *ConstantDataVector::get(ArrayRef<uint32_t> Elts, LLVMContext &Context){ +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<uint32_t> Elts){ Type *Ty = VectorType::get(Type::getInt32Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*4), Ty); } -Constant *ConstantDataVector::get(ArrayRef<uint64_t> Elts, LLVMContext &Context){ +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<uint64_t> Elts){ Type *Ty = VectorType::get(Type::getInt64Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*8), Ty); } -Constant *ConstantDataVector::get(ArrayRef<float> Elts, LLVMContext &Context) { +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<float> Elts) { Type *Ty = VectorType::get(Type::getFloatTy(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*4), Ty); } -Constant *ConstantDataVector::get(ArrayRef<double> Elts, LLVMContext &Context) { +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef<double> Elts) { Type *Ty = VectorType::get(Type::getDoubleTy(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*8), Ty); } |