summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlina Sbirlea <asbirlea@google.com>2018-03-19 19:49:28 +0000
committerAlina Sbirlea <asbirlea@google.com>2018-03-19 19:49:28 +0000
commita2036e4945666aaf4579821121f4566dea7dd29d (patch)
treea026bac086e1e4351525400b7f53d3f0efbb3b41
parentaae2c047d65d7b5fae52a192836bf8a0c00890fd (diff)
downloadbcm5719-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.h22
-rw-r--r--llvm/include/llvm/IR/Type.h14
-rw-r--r--llvm/lib/IR/Constants.cpp34
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,
OpenPOWER on IntegriCloud