[llvm] r327894 - Make ConstantDataArray::get constructor templated. Will support signed integers.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 19 13:07:24 PDT 2018


This failing build for me

include/llvm/IR/Type.h:413:14: error: cannot initialize return object of
type 'llvm::Type *' with an rvalue of type 'llvm::IntegerType *'
      return Type::getIntNTy(C, noOfBits);

~Craig

On Mon, Mar 19, 2018 at 12:49 PM, Alina Sbirlea via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: asbirlea
> Date: Mon Mar 19 12:49:28 2018
> New Revision: 327894
>
> URL: http://llvm.org/viewvc/llvm-project?rev=327894&view=rev
> Log:
> 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
>
> Modified:
>     llvm/trunk/include/llvm/IR/Constants.h
>     llvm/trunk/include/llvm/IR/Type.h
>     llvm/trunk/lib/IR/Constants.cpp
>
> Modified: llvm/trunk/include/llvm/IR/Constants.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/IR/Constants.h?rev=327894&r1=327893&r2=327894&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/IR/Constants.h (original)
> +++ llvm/trunk/include/llvm/IR/Constants.h Mon Mar 19 12:49:28 2018
> @@ -692,15 +692,23 @@ class ConstantDataArray final : public C
>  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
>
> Modified: llvm/trunk/include/llvm/IR/Type.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/IR/Type.h?rev=327894&r1=327893&r2=327894&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/IR/Type.h (original)
> +++ llvm/trunk/include/llvm/IR/Type.h Mon Mar 19 12:49:28 2018
> @@ -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
>
> Modified: llvm/trunk/lib/IR/Constants.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/
> Constants.cpp?rev=327894&r1=327893&r2=327894&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/IR/Constants.cpp (original)
> +++ llvm/trunk/lib/IR/Constants.cpp Mon Mar 19 12:49:28 2018
> @@ -2452,40 +2452,6 @@ void ConstantDataSequential::destroyCons
>    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,
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180319/0775dbbc/attachment.html>


More information about the llvm-commits mailing list