<div dir="ltr">This failing build for me<div><br></div><div><div>include/llvm/IR/Type.h:413:14: error: cannot initialize return object of type 'llvm::Type *' with an rvalue of type 'llvm::IntegerType *'</div><div>      return Type::getIntNTy(C, noOfBits);</div></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Mon, Mar 19, 2018 at 12:49 PM, Alina Sbirlea via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: asbirlea<br>
Date: Mon Mar 19 12:49:28 2018<br>
New Revision: 327894<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=327894&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=327894&view=rev</a><br>
Log:<br>
Make ConstantDataArray::get constructor templated. Will support signed integers.<br>
<br>
Summary: Make ConstantDataArray::get() constructors a single templated one.<br>
<br>
Reviewers: timshen, rsmith<br>
<br>
Subscribers: sanjoy, llvm-commits, jlebar<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D44337" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D44337</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/IR/<wbr>Constants.h<br>
    llvm/trunk/include/llvm/IR/<wbr>Type.h<br>
    llvm/trunk/lib/IR/Constants.<wbr>cpp<br>
<br>
Modified: llvm/trunk/include/llvm/IR/<wbr>Constants.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Constants.h?rev=327894&r1=327893&r2=327894&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/IR/Constants.h?rev=<wbr>327894&r1=327893&r2=327894&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/IR/<wbr>Constants.h (original)<br>
+++ llvm/trunk/include/llvm/IR/<wbr>Constants.h Mon Mar 19 12:49:28 2018<br>
@@ -692,15 +692,23 @@ class ConstantDataArray final : public C<br>
 public:<br>
   ConstantDataArray(const ConstantDataArray &) = delete;<br>
<br>
-  /// get() constructors - Return a constant with array type with an element<br>
+  /// get() constructor - Return a constant with array type with an element<br>
   /// count and element type matching the ArrayRef passed in.  Note that this<br>
   /// can return a ConstantAggregateZero object.<br>
-  static Constant *get(LLVMContext &Context, ArrayRef<uint8_t> Elts);<br>
-  static Constant *get(LLVMContext &Context, ArrayRef<uint16_t> Elts);<br>
-  static Constant *get(LLVMContext &Context, ArrayRef<uint32_t> Elts);<br>
-  static Constant *get(LLVMContext &Context, ArrayRef<uint64_t> Elts);<br>
-  static Constant *get(LLVMContext &Context, ArrayRef<float> Elts);<br>
-  static Constant *get(LLVMContext &Context, ArrayRef<double> Elts);<br>
+  template <typename ElementTy><br>
+  static Constant *get(LLVMContext &Context, ArrayRef<ElementTy> Elts) {<br>
+    const char *Data = reinterpret_cast<const char *>(Elts.data());<br>
+    Type *Ty =<br>
+        ArrayType::get(Type::<wbr>getScalarTy<ElementTy>(<wbr>Context), Elts.size());<br>
+    return getImpl(StringRef(Data, Elts.size() * sizeof(ElementTy)), Ty);<br>
+  }<br>
+<br>
+  /// get() constructor - ArrayTy needs to be compatible with<br>
+  /// ArrayRef<ElementTy>. Calls get(LLVMContext, ArrayRef<ElementTy>).<br>
+  template <typename ArrayTy><br>
+  static Constant *get(LLVMContext &Context, ArrayTy &Elts) {<br>
+    return ConstantDataArray::get(<wbr>Context, makeArrayRef(Elts));<br>
+  }<br>
<br>
   /// getFP() constructors - Return a constant with array type with an element<br>
   /// count and element type of float with precision matching the number of<br>
<br>
Modified: llvm/trunk/include/llvm/IR/<wbr>Type.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Type.h?rev=327894&r1=327893&r2=327894&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/IR/Type.h?rev=327894&r1=<wbr>327893&r2=327894&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/IR/<wbr>Type.h (original)<br>
+++ llvm/trunk/include/llvm/IR/<wbr>Type.h Mon Mar 19 12:49:28 2018<br>
@@ -407,6 +407,20 @@ public:<br>
   static IntegerType *getInt32Ty(LLVMContext &C);<br>
   static IntegerType *getInt64Ty(LLVMContext &C);<br>
   static IntegerType *getInt128Ty(LLVMContext &C);<br>
+  template <typename ScalarTy> static Type *getScalarTy(LLVMContext &C) {<br>
+    int noOfBits = sizeof(ScalarTy) * CHAR_BIT;<br>
+    if (std::is_integral<ScalarTy>::<wbr>value) {<br>
+      return Type::getIntNTy(C, noOfBits);<br>
+    } else if (std::is_floating_point<<wbr>ScalarTy>::value) {<br>
+      switch (noOfBits) {<br>
+      case 32:<br>
+        return Type::getFloatTy(C);<br>
+      case 64:<br>
+        return Type::getDoubleTy(C);<br>
+      }<br>
+    }<br>
+    llvm_unreachable("Unsupported type in Type::getScalarTy");<br>
+  }<br>
<br>
   //===-------------------------<wbr>------------------------------<wbr>-------------===//<br>
   // Convenience methods for getting pointer types with one of the above builtin<br>
<br>
Modified: llvm/trunk/lib/IR/Constants.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Constants.cpp?rev=327894&r1=327893&r2=327894&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/IR/<wbr>Constants.cpp?rev=327894&r1=<wbr>327893&r2=327894&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/IR/Constants.<wbr>cpp (original)<br>
+++ llvm/trunk/lib/IR/Constants.<wbr>cpp Mon Mar 19 12:49:28 2018<br>
@@ -2452,40 +2452,6 @@ void ConstantDataSequential::<wbr>destroyCons<br>
   Next = nullptr;<br>
 }<br>
<br>
-/// get() constructors - Return a constant with array type with an element<br>
-/// count and element type matching the ArrayRef passed in.  Note that this<br>
-/// can return a ConstantAggregateZero object.<br>
-Constant *ConstantDataArray::get(<wbr>LLVMContext &Context, ArrayRef<uint8_t> Elts) {<br>
-  Type *Ty = ArrayType::get(Type::<wbr>getInt8Ty(Context), Elts.size());<br>
-  const char *Data = reinterpret_cast<const char *>(Elts.data());<br>
-  return getImpl(StringRef(Data, Elts.size() * 1), Ty);<br>
-}<br>
-Constant *ConstantDataArray::get(<wbr>LLVMContext &Context, ArrayRef<uint16_t> Elts){<br>
-  Type *Ty = ArrayType::get(Type::<wbr>getInt16Ty(Context), Elts.size());<br>
-  const char *Data = reinterpret_cast<const char *>(Elts.data());<br>
-  return getImpl(StringRef(Data, Elts.size() * 2), Ty);<br>
-}<br>
-Constant *ConstantDataArray::get(<wbr>LLVMContext &Context, ArrayRef<uint32_t> Elts){<br>
-  Type *Ty = ArrayType::get(Type::<wbr>getInt32Ty(Context), Elts.size());<br>
-  const char *Data = reinterpret_cast<const char *>(Elts.data());<br>
-  return getImpl(StringRef(Data, Elts.size() * 4), Ty);<br>
-}<br>
-Constant *ConstantDataArray::get(<wbr>LLVMContext &Context, ArrayRef<uint64_t> Elts){<br>
-  Type *Ty = ArrayType::get(Type::<wbr>getInt64Ty(Context), Elts.size());<br>
-  const char *Data = reinterpret_cast<const char *>(Elts.data());<br>
-  return getImpl(StringRef(Data, Elts.size() * 8), Ty);<br>
-}<br>
-Constant *ConstantDataArray::get(<wbr>LLVMContext &Context, ArrayRef<float> Elts) {<br>
-  Type *Ty = ArrayType::get(Type::<wbr>getFloatTy(Context), Elts.size());<br>
-  const char *Data = reinterpret_cast<const char *>(Elts.data());<br>
-  return getImpl(StringRef(Data, Elts.size() * 4), Ty);<br>
-}<br>
-Constant *ConstantDataArray::get(<wbr>LLVMContext &Context, ArrayRef<double> Elts) {<br>
-  Type *Ty = ArrayType::get(Type::<wbr>getDoubleTy(Context), Elts.size());<br>
-  const char *Data = reinterpret_cast<const char *>(Elts.data());<br>
-  return getImpl(StringRef(Data, Elts.size() * 8), Ty);<br>
-}<br>
-<br>
 /// getFP() constructors - Return a constant with array type with an element<br>
 /// count and element type of float with precision matching the number of<br>
 /// bits in the ArrayRef passed in. (i.e. half for 16bits, float for 32bits,<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>