Skip to content

Commit fffc7fb

Browse files
authored
[SandboxIR] Implement DSOLocalEquivalent (#108473)
This patch implements sandboxir::DSOLocalEquivalent mirroring llvm::DSOLocalEquivalent.
1 parent f902339 commit fffc7fb

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed

llvm/include/llvm/SandboxIR/SandboxIR.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ class ConstantAggregateZero;
124124
class ConstantPointerNull;
125125
class PoisonValue;
126126
class BlockAddress;
127+
class DSOLocalEquivalent;
127128
class ConstantTokenNone;
128129
class GlobalValue;
129130
class Context;
@@ -328,6 +329,7 @@ class Value {
328329
friend class PoisonValue; // For `Val`.
329330
friend class BlockAddress; // For `Val`.
330331
friend class GlobalValue; // For `Val`.
332+
friend class DSOLocalEquivalent; // For `Val`.
331333

332334
/// All values point to the context.
333335
Context &Ctx;
@@ -1218,6 +1220,38 @@ class BlockAddress final : public Constant {
12181220
}
12191221
};
12201222

1223+
class DSOLocalEquivalent final : public Constant {
1224+
DSOLocalEquivalent(llvm::DSOLocalEquivalent *C, Context &Ctx)
1225+
: Constant(ClassID::DSOLocalEquivalent, C, Ctx) {}
1226+
friend class Context; // For constructor.
1227+
1228+
public:
1229+
/// Return a DSOLocalEquivalent for the specified global value.
1230+
static DSOLocalEquivalent *get(GlobalValue *GV);
1231+
1232+
GlobalValue *getGlobalValue() const;
1233+
1234+
/// For isa/dyn_cast.
1235+
static bool classof(const sandboxir::Value *From) {
1236+
return From->getSubclassID() == ClassID::DSOLocalEquivalent;
1237+
}
1238+
1239+
unsigned getUseOperandNo(const Use &Use) const final {
1240+
llvm_unreachable("DSOLocalEquivalent has no operands!");
1241+
}
1242+
1243+
#ifndef NDEBUG
1244+
void verify() const override {
1245+
assert(isa<llvm::DSOLocalEquivalent>(Val) &&
1246+
"Expected a DSOLocalEquivalent!");
1247+
}
1248+
void dumpOS(raw_ostream &OS) const override {
1249+
dumpCommonPrefix(OS);
1250+
dumpCommonSuffix(OS);
1251+
}
1252+
#endif
1253+
};
1254+
12211255
// TODO: This should inherit from ConstantData.
12221256
class ConstantTokenNone final : public Constant {
12231257
ConstantTokenNone(llvm::ConstantTokenNone *C, Context &Ctx)

llvm/include/llvm/SandboxIR/SandboxIRValues.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ DEF_CONST(GlobalVariable, GlobalVariable)
3838
DEF_CONST(GlobalIFunc, GlobalIFunc)
3939
DEF_CONST(GlobalAlias, GlobalAlias)
4040
DEF_CONST(BlockAddress, BlockAddress)
41+
DEF_CONST(DSOLocalEquivalent, DSOLocalEquivalent)
4142
DEF_CONST(ConstantTokenNone, ConstantTokenNone)
4243

4344
#ifndef DEF_INSTR

llvm/lib/SandboxIR/SandboxIR.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2535,6 +2535,16 @@ BasicBlock *BlockAddress::getBasicBlock() const {
25352535
Ctx.getValue(cast<llvm::BlockAddress>(Val)->getBasicBlock()));
25362536
}
25372537

2538+
DSOLocalEquivalent *DSOLocalEquivalent::get(GlobalValue *GV) {
2539+
auto *LLVMC = llvm::DSOLocalEquivalent::get(cast<llvm::GlobalValue>(GV->Val));
2540+
return cast<DSOLocalEquivalent>(GV->getContext().getValue(LLVMC));
2541+
}
2542+
2543+
GlobalValue *DSOLocalEquivalent::getGlobalValue() const {
2544+
return cast<GlobalValue>(
2545+
Ctx.getValue(cast<llvm::DSOLocalEquivalent>(Val)->getGlobalValue()));
2546+
}
2547+
25382548
ConstantTokenNone *ConstantTokenNone::get(Context &Ctx) {
25392549
auto *LLVMC = llvm::ConstantTokenNone::get(Ctx.LLVMCtx);
25402550
return cast<ConstantTokenNone>(Ctx.getOrCreateConstant(LLVMC));
@@ -2669,6 +2679,14 @@ Value *Context::getOrCreateValueInternal(llvm::Value *LLVMV, llvm::User *U) {
26692679
It->second = std::unique_ptr<UndefValue>(
26702680
new UndefValue(cast<llvm::UndefValue>(C), *this));
26712681
return It->second.get();
2682+
case llvm::Value::DSOLocalEquivalentVal: {
2683+
auto *DSOLE = cast<llvm::DSOLocalEquivalent>(C);
2684+
It->second = std::unique_ptr<DSOLocalEquivalent>(
2685+
new DSOLocalEquivalent(DSOLE, *this));
2686+
auto *Ret = It->second.get();
2687+
getOrCreateValueInternal(DSOLE->getGlobalValue(), DSOLE);
2688+
return Ret;
2689+
}
26722690
case llvm::Value::ConstantArrayVal:
26732691
It->second = std::unique_ptr<ConstantArray>(
26742692
new ConstantArray(cast<llvm::ConstantArray>(C), *this));

llvm/unittests/SandboxIR/SandboxIRTest.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,30 @@ define void @foo(ptr %ptr) {
843843
EXPECT_EQ(LookupBB2Addr, nullptr);
844844
}
845845

846+
TEST_F(SandboxIRTest, DSOLocalEquivalent) {
847+
parseIR(C, R"IR(
848+
declare void @bar()
849+
define void @foo() {
850+
call void dso_local_equivalent @bar()
851+
ret void
852+
}
853+
)IR");
854+
Function &LLVMF = *M->getFunction("foo");
855+
sandboxir::Context Ctx(C);
856+
857+
auto &F = *Ctx.createFunction(&LLVMF);
858+
auto *BB = &*F.begin();
859+
auto It = BB->begin();
860+
auto *CI = cast<sandboxir::CallInst>(&*It++);
861+
// Check classof().
862+
auto *DSOLE = cast<sandboxir::DSOLocalEquivalent>(CI->getCalledOperand());
863+
// Check getGlobalValue().
864+
auto *GV = DSOLE->getGlobalValue();
865+
// Check get().
866+
auto *NewDSOLE = sandboxir::DSOLocalEquivalent::get(GV);
867+
EXPECT_EQ(NewDSOLE, DSOLE);
868+
}
869+
846870
TEST_F(SandboxIRTest, ConstantTokenNone) {
847871
parseIR(C, R"IR(
848872
define void @foo(ptr %ptr) {

0 commit comments

Comments
 (0)