forked from OSchip/llvm-project
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
This commit is contained in:
parent
aae2c047d6
commit
a2036e4945
|
@ -692,15 +692,23 @@ class ConstantDataArray final : public ConstantDataSequential {
|
||||||
public:
|
public:
|
||||||
ConstantDataArray(const ConstantDataArray &) = delete;
|
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
|
/// count and element type matching the ArrayRef passed in. Note that this
|
||||||
/// can return a ConstantAggregateZero object.
|
/// can return a ConstantAggregateZero object.
|
||||||
static Constant *get(LLVMContext &Context, ArrayRef<uint8_t> Elts);
|
template <typename ElementTy>
|
||||||
static Constant *get(LLVMContext &Context, ArrayRef<uint16_t> Elts);
|
static Constant *get(LLVMContext &Context, ArrayRef<ElementTy> Elts) {
|
||||||
static Constant *get(LLVMContext &Context, ArrayRef<uint32_t> Elts);
|
const char *Data = reinterpret_cast<const char *>(Elts.data());
|
||||||
static Constant *get(LLVMContext &Context, ArrayRef<uint64_t> Elts);
|
Type *Ty =
|
||||||
static Constant *get(LLVMContext &Context, ArrayRef<float> Elts);
|
ArrayType::get(Type::getScalarTy<ElementTy>(Context), Elts.size());
|
||||||
static Constant *get(LLVMContext &Context, ArrayRef<double> Elts);
|
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
|
/// getFP() constructors - Return a constant with array type with an element
|
||||||
/// count and element type of float with precision matching the number of
|
/// count and element type of float with precision matching the number of
|
||||||
|
|
|
@ -407,6 +407,20 @@ public:
|
||||||
static IntegerType *getInt32Ty(LLVMContext &C);
|
static IntegerType *getInt32Ty(LLVMContext &C);
|
||||||
static IntegerType *getInt64Ty(LLVMContext &C);
|
static IntegerType *getInt64Ty(LLVMContext &C);
|
||||||
static IntegerType *getInt128Ty(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
|
// Convenience methods for getting pointer types with one of the above builtin
|
||||||
|
|
|
@ -2452,40 +2452,6 @@ void ConstantDataSequential::destroyConstantImpl() {
|
||||||
Next = nullptr;
|
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
|
/// getFP() constructors - Return a constant with array type with an element
|
||||||
/// count and element type of float with precision matching the number of
|
/// 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,
|
/// bits in the ArrayRef passed in. (i.e. half for 16bits, float for 32bits,
|
||||||
|
|
Loading…
Reference in New Issue