diff options
author | Alina Sbirlea <asbirlea@google.com> | 2018-03-19 19:49:28 +0000 |
---|---|---|
committer | Alina Sbirlea <asbirlea@google.com> | 2018-03-19 19:49:28 +0000 |
commit | a2036e4945666aaf4579821121f4566dea7dd29d (patch) | |
tree | a026bac086e1e4351525400b7f53d3f0efbb3b41 | |
parent | aae2c047d65d7b5fae52a192836bf8a0c00890fd (diff) | |
download | bcm5719-llvm-a2036e4945666aaf4579821121f4566dea7dd29d.tar.gz bcm5719-llvm-a2036e4945666aaf4579821121f4566dea7dd29d.zip |
Make ConstantDataArray::get constructor templated. Will support signed integers.
Summary: Make ConstantDataArray::get() constructors a single templated one.
Reviewers: timshen, rsmith
Subscribers: sanjoy, llvm-commits, jlebar
Differential Revision: https://reviews.llvm.org/D44337
llvm-svn: 327894
-rw-r--r-- | llvm/include/llvm/IR/Constants.h | 22 | ||||
-rw-r--r-- | llvm/include/llvm/IR/Type.h | 14 | ||||
-rw-r--r-- | llvm/lib/IR/Constants.cpp | 34 |
3 files changed, 29 insertions, 41 deletions
diff --git a/llvm/include/llvm/IR/Constants.h b/llvm/include/llvm/IR/Constants.h index 0ec082c23eb..1a7596d4276 100644 --- a/llvm/include/llvm/IR/Constants.h +++ b/llvm/include/llvm/IR/Constants.h @@ -692,15 +692,23 @@ class ConstantDataArray final : public ConstantDataSequential { public: ConstantDataArray(const ConstantDataArray &) = delete; - /// get() constructors - Return a constant with array type with an element + /// get() constructor - 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(LLVMContext &Context, ArrayRef<uint8_t> Elts); - static Constant *get(LLVMContext &Context, ArrayRef<uint16_t> Elts); - static Constant *get(LLVMContext &Context, ArrayRef<uint32_t> Elts); - static Constant *get(LLVMContext &Context, ArrayRef<uint64_t> Elts); - static Constant *get(LLVMContext &Context, ArrayRef<float> Elts); - static Constant *get(LLVMContext &Context, ArrayRef<double> Elts); + template <typename ElementTy> + static Constant *get(LLVMContext &Context, ArrayRef<ElementTy> Elts) { + const char *Data = reinterpret_cast<const char *>(Elts.data()); + Type *Ty = + ArrayType::get(Type::getScalarTy<ElementTy>(Context), Elts.size()); + return getImpl(StringRef(Data, Elts.size() * sizeof(ElementTy)), Ty); + } + + /// get() constructor - ArrayTy needs to be compatible with + /// ArrayRef<ElementTy>. Calls get(LLVMContext, ArrayRef<ElementTy>). + template <typename ArrayTy> + static Constant *get(LLVMContext &Context, ArrayTy &Elts) { + return ConstantDataArray::get(Context, makeArrayRef(Elts)); + } /// getFP() constructors - Return a constant with array type with an element /// count and element type of float with precision matching the number of diff --git a/llvm/include/llvm/IR/Type.h b/llvm/include/llvm/IR/Type.h index 1574fc334ff..0b0a10f101c 100644 --- a/llvm/include/llvm/IR/Type.h +++ b/llvm/include/llvm/IR/Type.h @@ -407,6 +407,20 @@ public: static IntegerType *getInt32Ty(LLVMContext &C); static IntegerType *getInt64Ty(LLVMContext &C); static IntegerType *getInt128Ty(LLVMContext &C); + template <typename ScalarTy> static Type *getScalarTy(LLVMContext &C) { + int noOfBits = sizeof(ScalarTy) * CHAR_BIT; + if (std::is_integral<ScalarTy>::value) { + return Type::getIntNTy(C, noOfBits); + } else if (std::is_floating_point<ScalarTy>::value) { + switch (noOfBits) { + case 32: + return Type::getFloatTy(C); + case 64: + return Type::getDoubleTy(C); + } + } + llvm_unreachable("Unsupported type in Type::getScalarTy"); + } //===--------------------------------------------------------------------===// // Convenience methods for getting pointer types with one of the above builtin diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp index ad3dc174fe3..e7752758361 100644 --- a/llvm/lib/IR/Constants.cpp +++ b/llvm/lib/IR/Constants.cpp @@ -2452,40 +2452,6 @@ void ConstantDataSequential::destroyConstantImpl() { Next = nullptr; } -/// 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(LLVMContext &Context, ArrayRef<uint8_t> Elts) { - Type *Ty = ArrayType::get(Type::getInt8Ty(Context), Elts.size()); - const char *Data = reinterpret_cast<const char *>(Elts.data()); - return getImpl(StringRef(Data, Elts.size() * 1), Ty); -} -Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint16_t> Elts){ - Type *Ty = ArrayType::get(Type::getInt16Ty(Context), Elts.size()); - const char *Data = reinterpret_cast<const char *>(Elts.data()); - return getImpl(StringRef(Data, Elts.size() * 2), Ty); -} -Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint32_t> Elts){ - Type *Ty = ArrayType::get(Type::getInt32Ty(Context), Elts.size()); - const char *Data = reinterpret_cast<const char *>(Elts.data()); - return getImpl(StringRef(Data, Elts.size() * 4), Ty); -} -Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<uint64_t> Elts){ - Type *Ty = ArrayType::get(Type::getInt64Ty(Context), Elts.size()); - const char *Data = reinterpret_cast<const char *>(Elts.data()); - return getImpl(StringRef(Data, Elts.size() * 8), Ty); -} -Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<float> Elts) { - Type *Ty = ArrayType::get(Type::getFloatTy(Context), Elts.size()); - const char *Data = reinterpret_cast<const char *>(Elts.data()); - return getImpl(StringRef(Data, Elts.size() * 4), Ty); -} -Constant *ConstantDataArray::get(LLVMContext &Context, ArrayRef<double> Elts) { - Type *Ty = ArrayType::get(Type::getDoubleTy(Context), Elts.size()); - const char *Data = reinterpret_cast<const char *>(Elts.data()); - return getImpl(StringRef(Data, Elts.size() * 8), Ty); -} - /// getFP() constructors - Return a constant with array type with an element /// count and element type of float with precision matching the number of /// bits in the ArrayRef passed in. (i.e. half for 16bits, float for 32bits, |