[llvm] [SandboxIR] Implement ConstantAggregate (PR #107136)
Sriraman Tallam via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 3 16:41:13 PDT 2024
================
@@ -840,6 +842,97 @@ class ConstantFP final : public Constant {
#endif
};
+/// Base class for aggregate constants (with operands).
+class ConstantAggregate : public Constant {
+protected:
+ ConstantAggregate(ClassID ID, llvm::Constant *C, Context &Ctx)
+ : Constant(ID, C, Ctx) {}
+
+public:
+ /// For isa/dyn_cast.
+ static bool classof(const sandboxir::Value *From) {
+ auto ID = From->getSubclassID();
+ return ID == ClassID::ConstantVector || ID == ClassID::ConstantStruct ||
+ ID == ClassID::ConstantArray;
+ }
+};
+
+class ConstantArray final : public ConstantAggregate {
+ ConstantArray(llvm::ConstantArray *C, Context &Ctx)
+ : ConstantAggregate(ClassID::ConstantArray, C, Ctx) {}
+ friend class Context; // For constructor.
+
+public:
+ static Constant *get(ArrayType *T, ArrayRef<Constant *> V);
+ ArrayType *getType() const;
+
+ // TODO: Missing functions: getType(), getTypeForElements(), getAnon(), get().
+
+ /// For isa/dyn_cast.
+ static bool classof(const Value *From) {
+ return From->getSubclassID() == ClassID::ConstantArray;
+ }
+};
+
+class ConstantStruct final : public ConstantAggregate {
+ ConstantStruct(llvm::ConstantStruct *C, Context &Ctx)
+ : ConstantAggregate(ClassID::ConstantStruct, C, Ctx) {}
+ friend class Context; // For constructor.
+
+public:
+ static Constant *get(StructType *T, ArrayRef<Constant *> V);
+
+ template <typename... Csts>
+ static std::enable_if_t<are_base_of<Constant, Csts...>::value, Constant *>
+ get(StructType *T, Csts *...Vs) {
+ return get(T, ArrayRef<Constant *>({Vs...}));
+ }
+ /// Return an anonymous struct that has the specified elements.
+ /// If the struct is possibly empty, then you must specify a context.
+ static Constant *getAnon(ArrayRef<Constant *> V, bool Packed = false) {
+ return get(getTypeForElements(V, Packed), V);
+ }
+ static Constant *getAnon(Context &Ctx, ArrayRef<Constant *> V,
+ bool Packed = false) {
+ return get(getTypeForElements(Ctx, V, Packed), V);
+ }
+ /// This version of the method allows an empty list.
+ static StructType *getTypeForElements(Context &Ctx, ArrayRef<Constant *> V,
+ bool Packed = false);
+ /// Return an anonymous struct type to use for a constant with the specified
+ /// set of elements. The list must not be empty.
+ static StructType *getTypeForElements(ArrayRef<Constant *> V,
+ bool Packed = false) {
+ assert(!V.empty() &&
+ "ConstantStruct::getTypeForElements cannot be called on empty list");
+ return getTypeForElements(V[0]->getContext(), V, Packed);
+ }
+
+ /// Specialization - reduce amount of casting.
+ inline StructType *getType() const {
+ return cast<StructType>(Value::getType());
+ }
+
+ /// For isa/dyn_cast.
+ static bool classof(const Value *From) {
+ return From->getSubclassID() == ClassID::ConstantStruct;
+ }
+};
+
+class ConstantVector final : public ConstantAggregate {
+ ConstantVector(llvm::ConstantVector *C, Context &Ctx)
+ : ConstantAggregate(ClassID::ConstantVector, C, Ctx) {}
+ friend class Context; // For constructor.
+
+public:
+ // TODO: Missing functions: getSplat(), getType(), getSplatValue().
----------------
tmsri wrote:
Also get(ArrayRef<Constant *>) is missing
https://github.com/llvm/llvm-project/pull/107136
More information about the llvm-commits
mailing list