[llvm] fffc7fb - [SandboxIR] Implement DSOLocalEquivalent (#108473)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 13 09:40:41 PDT 2024
Author: vporpo
Date: 2024-09-13T09:40:37-07:00
New Revision: fffc7fb7ad48d64d164565fdf54bec25267c9d22
URL: https://github.com/llvm/llvm-project/commit/fffc7fb7ad48d64d164565fdf54bec25267c9d22
DIFF: https://github.com/llvm/llvm-project/commit/fffc7fb7ad48d64d164565fdf54bec25267c9d22.diff
LOG: [SandboxIR] Implement DSOLocalEquivalent (#108473)
This patch implements sandboxir::DSOLocalEquivalent mirroring
llvm::DSOLocalEquivalent.
Added:
Modified:
llvm/include/llvm/SandboxIR/SandboxIR.h
llvm/include/llvm/SandboxIR/SandboxIRValues.def
llvm/lib/SandboxIR/SandboxIR.cpp
llvm/unittests/SandboxIR/SandboxIRTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/SandboxIR/SandboxIR.h b/llvm/include/llvm/SandboxIR/SandboxIR.h
index 5b57d5cebc3346..d21b8a85161e4b 100644
--- a/llvm/include/llvm/SandboxIR/SandboxIR.h
+++ b/llvm/include/llvm/SandboxIR/SandboxIR.h
@@ -124,6 +124,7 @@ class ConstantAggregateZero;
class ConstantPointerNull;
class PoisonValue;
class BlockAddress;
+class DSOLocalEquivalent;
class ConstantTokenNone;
class GlobalValue;
class Context;
@@ -328,6 +329,7 @@ class Value {
friend class PoisonValue; // For `Val`.
friend class BlockAddress; // For `Val`.
friend class GlobalValue; // For `Val`.
+ friend class DSOLocalEquivalent; // For `Val`.
/// All values point to the context.
Context &Ctx;
@@ -1218,6 +1220,38 @@ class BlockAddress final : public Constant {
}
};
+class DSOLocalEquivalent final : public Constant {
+ DSOLocalEquivalent(llvm::DSOLocalEquivalent *C, Context &Ctx)
+ : Constant(ClassID::DSOLocalEquivalent, C, Ctx) {}
+ friend class Context; // For constructor.
+
+public:
+ /// Return a DSOLocalEquivalent for the specified global value.
+ static DSOLocalEquivalent *get(GlobalValue *GV);
+
+ GlobalValue *getGlobalValue() const;
+
+ /// For isa/dyn_cast.
+ static bool classof(const sandboxir::Value *From) {
+ return From->getSubclassID() == ClassID::DSOLocalEquivalent;
+ }
+
+ unsigned getUseOperandNo(const Use &Use) const final {
+ llvm_unreachable("DSOLocalEquivalent has no operands!");
+ }
+
+#ifndef NDEBUG
+ void verify() const override {
+ assert(isa<llvm::DSOLocalEquivalent>(Val) &&
+ "Expected a DSOLocalEquivalent!");
+ }
+ void dumpOS(raw_ostream &OS) const override {
+ dumpCommonPrefix(OS);
+ dumpCommonSuffix(OS);
+ }
+#endif
+};
+
// TODO: This should inherit from ConstantData.
class ConstantTokenNone final : public Constant {
ConstantTokenNone(llvm::ConstantTokenNone *C, Context &Ctx)
diff --git a/llvm/include/llvm/SandboxIR/SandboxIRValues.def b/llvm/include/llvm/SandboxIR/SandboxIRValues.def
index 7b72f9b7173e6d..c218ffee3ce383 100644
--- a/llvm/include/llvm/SandboxIR/SandboxIRValues.def
+++ b/llvm/include/llvm/SandboxIR/SandboxIRValues.def
@@ -38,6 +38,7 @@ DEF_CONST(GlobalVariable, GlobalVariable)
DEF_CONST(GlobalIFunc, GlobalIFunc)
DEF_CONST(GlobalAlias, GlobalAlias)
DEF_CONST(BlockAddress, BlockAddress)
+DEF_CONST(DSOLocalEquivalent, DSOLocalEquivalent)
DEF_CONST(ConstantTokenNone, ConstantTokenNone)
#ifndef DEF_INSTR
diff --git a/llvm/lib/SandboxIR/SandboxIR.cpp b/llvm/lib/SandboxIR/SandboxIR.cpp
index 8a7c3981e6680d..04243564809dbf 100644
--- a/llvm/lib/SandboxIR/SandboxIR.cpp
+++ b/llvm/lib/SandboxIR/SandboxIR.cpp
@@ -2535,6 +2535,16 @@ BasicBlock *BlockAddress::getBasicBlock() const {
Ctx.getValue(cast<llvm::BlockAddress>(Val)->getBasicBlock()));
}
+DSOLocalEquivalent *DSOLocalEquivalent::get(GlobalValue *GV) {
+ auto *LLVMC = llvm::DSOLocalEquivalent::get(cast<llvm::GlobalValue>(GV->Val));
+ return cast<DSOLocalEquivalent>(GV->getContext().getValue(LLVMC));
+}
+
+GlobalValue *DSOLocalEquivalent::getGlobalValue() const {
+ return cast<GlobalValue>(
+ Ctx.getValue(cast<llvm::DSOLocalEquivalent>(Val)->getGlobalValue()));
+}
+
ConstantTokenNone *ConstantTokenNone::get(Context &Ctx) {
auto *LLVMC = llvm::ConstantTokenNone::get(Ctx.LLVMCtx);
return cast<ConstantTokenNone>(Ctx.getOrCreateConstant(LLVMC));
@@ -2669,6 +2679,14 @@ Value *Context::getOrCreateValueInternal(llvm::Value *LLVMV, llvm::User *U) {
It->second = std::unique_ptr<UndefValue>(
new UndefValue(cast<llvm::UndefValue>(C), *this));
return It->second.get();
+ case llvm::Value::DSOLocalEquivalentVal: {
+ auto *DSOLE = cast<llvm::DSOLocalEquivalent>(C);
+ It->second = std::unique_ptr<DSOLocalEquivalent>(
+ new DSOLocalEquivalent(DSOLE, *this));
+ auto *Ret = It->second.get();
+ getOrCreateValueInternal(DSOLE->getGlobalValue(), DSOLE);
+ return Ret;
+ }
case llvm::Value::ConstantArrayVal:
It->second = std::unique_ptr<ConstantArray>(
new ConstantArray(cast<llvm::ConstantArray>(C), *this));
diff --git a/llvm/unittests/SandboxIR/SandboxIRTest.cpp b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
index ad5508f041d6cd..d883c185f82962 100644
--- a/llvm/unittests/SandboxIR/SandboxIRTest.cpp
+++ b/llvm/unittests/SandboxIR/SandboxIRTest.cpp
@@ -843,6 +843,30 @@ define void @foo(ptr %ptr) {
EXPECT_EQ(LookupBB2Addr, nullptr);
}
+TEST_F(SandboxIRTest, DSOLocalEquivalent) {
+ parseIR(C, R"IR(
+declare void @bar()
+define void @foo() {
+ call void dso_local_equivalent @bar()
+ ret void
+}
+)IR");
+ Function &LLVMF = *M->getFunction("foo");
+ sandboxir::Context Ctx(C);
+
+ auto &F = *Ctx.createFunction(&LLVMF);
+ auto *BB = &*F.begin();
+ auto It = BB->begin();
+ auto *CI = cast<sandboxir::CallInst>(&*It++);
+ // Check classof().
+ auto *DSOLE = cast<sandboxir::DSOLocalEquivalent>(CI->getCalledOperand());
+ // Check getGlobalValue().
+ auto *GV = DSOLE->getGlobalValue();
+ // Check get().
+ auto *NewDSOLE = sandboxir::DSOLocalEquivalent::get(GV);
+ EXPECT_EQ(NewDSOLE, DSOLE);
+}
+
TEST_F(SandboxIRTest, ConstantTokenNone) {
parseIR(C, R"IR(
define void @foo(ptr %ptr) {
More information about the llvm-commits
mailing list