Skip to content

Commit c9ab697

Browse files
authored
[SandboxIR] Implement ConstantTokenNone (#108106)
This patch implements sandboxir::ConstantTokenNone mirroring llvm::ConstantTokenNone.
1 parent 39751e7 commit c9ab697

File tree

4 files changed

+66
-0
lines changed

4 files changed

+66
-0
lines changed

llvm/include/llvm/SandboxIR/SandboxIR.h

Lines changed: 32 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 ConstantTokenNone;
127128
class Context;
128129
class Function;
129130
class Instruction;
@@ -1141,6 +1142,37 @@ class BlockAddress final : public Constant {
11411142
}
11421143
};
11431144

1145+
// TODO: This should inherit from ConstantData.
1146+
class ConstantTokenNone final : public Constant {
1147+
ConstantTokenNone(llvm::ConstantTokenNone *C, Context &Ctx)
1148+
: Constant(ClassID::ConstantTokenNone, C, Ctx) {}
1149+
friend class Context; // For constructor.
1150+
1151+
public:
1152+
/// Return the ConstantTokenNone.
1153+
static ConstantTokenNone *get(Context &Ctx);
1154+
1155+
/// For isa/dyn_cast.
1156+
static bool classof(const sandboxir::Value *From) {
1157+
return From->getSubclassID() == ClassID::ConstantTokenNone;
1158+
}
1159+
1160+
unsigned getUseOperandNo(const Use &Use) const final {
1161+
llvm_unreachable("ConstantTokenNone has no operands!");
1162+
}
1163+
1164+
#ifndef NDEBUG
1165+
void verify() const override {
1166+
assert(isa<llvm::ConstantTokenNone>(Val) &&
1167+
"Expected a ConstantTokenNone!");
1168+
}
1169+
void dumpOS(raw_ostream &OS) const override {
1170+
dumpCommonPrefix(OS);
1171+
dumpCommonSuffix(OS);
1172+
}
1173+
#endif
1174+
};
1175+
11441176
/// Iterator for `Instruction`s in a `BasicBlock.
11451177
/// \Returns an sandboxir::Instruction & when derereferenced.
11461178
class BBIterator {

llvm/include/llvm/SandboxIR/SandboxIRValues.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ DEF_CONST(ConstantPointerNull, ConstantPointerNull)
3535
DEF_CONST(UndefValue, UndefValue)
3636
DEF_CONST(PoisonValue, PoisonValue)
3737
DEF_CONST(BlockAddress, BlockAddress)
38+
DEF_CONST(ConstantTokenNone, ConstantTokenNone)
3839

3940
#ifndef DEF_INSTR
4041
#define DEF_INSTR(ID, OPCODE, CLASS)

llvm/lib/SandboxIR/SandboxIR.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2521,6 +2521,11 @@ BasicBlock *BlockAddress::getBasicBlock() const {
25212521
Ctx.getValue(cast<llvm::BlockAddress>(Val)->getBasicBlock()));
25222522
}
25232523

2524+
ConstantTokenNone *ConstantTokenNone::get(Context &Ctx) {
2525+
auto *LLVMC = llvm::ConstantTokenNone::get(Ctx.LLVMCtx);
2526+
return cast<ConstantTokenNone>(Ctx.getOrCreateConstant(LLVMC));
2527+
}
2528+
25242529
FunctionType *Function::getFunctionType() const {
25252530
return cast<FunctionType>(
25262531
Ctx.getType(cast<llvm::Function>(Val)->getFunctionType()));
@@ -2621,6 +2626,10 @@ Value *Context::getOrCreateValueInternal(llvm::Value *LLVMV, llvm::User *U) {
26212626
It->second = std::unique_ptr<BlockAddress>(
26222627
new BlockAddress(cast<llvm::BlockAddress>(C), *this));
26232628
return It->second.get();
2629+
case llvm::Value::ConstantTokenNoneVal:
2630+
It->second = std::unique_ptr<ConstantTokenNone>(
2631+
new ConstantTokenNone(cast<llvm::ConstantTokenNone>(C), *this));
2632+
return It->second.get();
26242633
case llvm::Value::ConstantAggregateZeroVal: {
26252634
auto *CAZ = cast<llvm::ConstantAggregateZero>(C);
26262635
It->second = std::unique_ptr<ConstantAggregateZero>(

llvm/unittests/SandboxIR/SandboxIRTest.cpp

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

780+
TEST_F(SandboxIRTest, ConstantTokenNone) {
781+
parseIR(C, R"IR(
782+
define void @foo(ptr %ptr) {
783+
bb0:
784+
%cs = catchswitch within none [label %handler] unwind to caller
785+
handler:
786+
ret void
787+
}
788+
)IR");
789+
Function &LLVMF = *M->getFunction("foo");
790+
sandboxir::Context Ctx(C);
791+
792+
[[maybe_unused]] auto &F = *Ctx.createFunction(&LLVMF);
793+
auto *BB0 = cast<sandboxir::BasicBlock>(
794+
Ctx.getValue(getBasicBlockByName(LLVMF, "bb0")));
795+
auto *CS = cast<sandboxir::CatchSwitchInst>(&*BB0->begin());
796+
797+
// Check classof(), creation, getFunction(), getBasicBlock().
798+
auto *CTN = cast<sandboxir::ConstantTokenNone>(CS->getParentPad());
799+
// Check get().
800+
auto *NewCTN = sandboxir::ConstantTokenNone::get(Ctx);
801+
EXPECT_EQ(NewCTN, CTN);
802+
}
803+
780804
TEST_F(SandboxIRTest, Use) {
781805
parseIR(C, R"IR(
782806
define i32 @foo(i32 %v0, i32 %v1) {

0 commit comments

Comments
 (0)