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:
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue