diff --git a/include/llvm/Constants.h b/include/llvm/Constants.h index 3dc0ec3de00..d3fd766ee7e 100644 --- a/include/llvm/Constants.h +++ b/include/llvm/Constants.h @@ -358,6 +358,8 @@ public: /// of the array by one (you've been warned). However, in some situations /// this is not desired so if AddNull==false then the string is copied without /// null termination. + + // FIXME Remove this. static Constant *get(LLVMContext &Context, StringRef Initializer, bool AddNull = true); @@ -697,13 +699,21 @@ public: /// 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. - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + /// 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. + static Constant *getString(LLVMContext &Context, StringRef Initializer, + bool AddNull = true); + /// getType - Specialize the getType() method to always return an ArrayType, /// which reduces the amount of casting needed in parts of the compiler. /// @@ -740,12 +750,12 @@ public: /// 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. - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); - static Constant *get(ArrayRef Elts, LLVMContext &Context); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); + static Constant *get(LLVMContext &Context, ArrayRef Elts); /// getType - Specialize the getType() method to always return a VectorType, /// which reduces the amount of casting needed in parts of the compiler. diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index d329c67af0e..5151105e05d 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 Elts, LLVMContext &Context) { +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef Elts) { Type *Ty = ArrayType::get(Type::getInt8Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*1), Ty); } -Constant *ConstantDataArray::get(ArrayRef Elts, LLVMContext &Context){ +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef Elts){ Type *Ty = ArrayType::get(Type::getInt16Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*2), Ty); } -Constant *ConstantDataArray::get(ArrayRef Elts, LLVMContext &Context){ +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef Elts){ Type *Ty = ArrayType::get(Type::getInt32Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*4), Ty); } -Constant *ConstantDataArray::get(ArrayRef Elts, LLVMContext &Context){ +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef Elts){ Type *Ty = ArrayType::get(Type::getInt64Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*8), Ty); } -Constant *ConstantDataArray::get(ArrayRef Elts, LLVMContext &Context) { +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef Elts) { Type *Ty = ArrayType::get(Type::getFloatTy(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*4), Ty); } -Constant *ConstantDataArray::get(ArrayRef Elts, LLVMContext &Context) { +Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef 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*)Str.data(), Str.size())); + + SmallVector 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 Elts, LLVMContext &Context) { +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef Elts){ Type *Ty = VectorType::get(Type::getInt8Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*1), Ty); } -Constant *ConstantDataVector::get(ArrayRef Elts, LLVMContext &Context){ +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef Elts){ Type *Ty = VectorType::get(Type::getInt16Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*2), Ty); } -Constant *ConstantDataVector::get(ArrayRef Elts, LLVMContext &Context){ +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef Elts){ Type *Ty = VectorType::get(Type::getInt32Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*4), Ty); } -Constant *ConstantDataVector::get(ArrayRef Elts, LLVMContext &Context){ +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef Elts){ Type *Ty = VectorType::get(Type::getInt64Ty(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*8), Ty); } -Constant *ConstantDataVector::get(ArrayRef Elts, LLVMContext &Context) { +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef Elts) { Type *Ty = VectorType::get(Type::getFloatTy(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*4), Ty); } -Constant *ConstantDataVector::get(ArrayRef Elts, LLVMContext &Context) { +Constant *ConstantDataVector::get(LLVMContext &Context, ArrayRef Elts) { Type *Ty = VectorType::get(Type::getDoubleTy(Context), Elts.size()); return getImpl(StringRef((char*)Elts.data(), Elts.size()*8), Ty); }