[llvm] [SandboxIR] sandboxir::Use operands (part 1) and uses (part 2) (PR #98251)
Arthur Eubanks via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 10 13:53:52 PDT 2024
================
@@ -71,6 +71,98 @@ namespace sandboxir {
class Function;
class Context;
class Instruction;
+class User;
+class Value;
+
+/// Represents a Def-use/Use-def edge in SandboxIR.
+/// NOTE: Unlike llvm::Use, this is not an integral part of the use-def chains.
+/// It is also not uniqued and is currently passed by value, so you can have
+/// more than one sandboxir::Use objects for the same use-def edge.
+class Use {
+ llvm::Use *LLVMUse;
+ User *User;
+ Context *Ctx;
+
+ /// Don't allow the user to create a sandboxir::Use directly.
+ Use(llvm::Use *LLVMUse, class User *User, Context &Ctx)
+ : LLVMUse(LLVMUse), User(User), Ctx(&Ctx) {}
+ Use() : LLVMUse(nullptr), Ctx(nullptr) {}
+
+ friend class Value; // For constructor
+ friend class User; // For constructor
+ friend class OperandUseIterator; // For constructor
+ friend class UserUseIterator; // For accessing members
+
+public:
+ operator Value *() const { return get(); }
+ Value *get() const;
+ class User *getUser() const { return User; }
+ unsigned getOperandNo() const;
+ Context *getContext() const { return Ctx; }
+ bool operator==(const Use &Other) const {
+ assert(Ctx == Other.Ctx && "Contexts differ!");
+ return LLVMUse == Other.LLVMUse && User == Other.User;
+ }
+ bool operator!=(const Use &Other) const { return !(*this == Other); }
+#ifndef NDEBUG
+ void dump(raw_ostream &OS) const;
+ void dump() const;
+#endif // NDEBUG
+};
+
+/// Returns the operand edge when dereferenced.
+class OperandUseIterator {
+ Use Use;
+ /// Don't let the user create a non-empty OperandUseIterator.
+ OperandUseIterator(const class Use &Use) : Use(Use) {}
+ friend class User; // For constructor
+#define DEF_VALUE(ID, CLASS)
----------------
aeubanks wrote:
no need for empty define
https://github.com/llvm/llvm-project/pull/98251
More information about the llvm-commits
mailing list