Skip to content

Commit 446a245

Browse files
jiaoluFlakebi
authored andcommitted
Add class member function support for addSet
Add class member function support
1 parent 9ff519b commit 446a245

3 files changed

Lines changed: 32 additions & 9 deletions

File tree

example/ExampleMain.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ struct VisitorNest {
173173
void visitBinaryOperator(BinaryOperator &inst) {
174174
*out << "visiting BinaryOperator: " << inst << '\n';
175175
}
176+
void visitInst(Instruction &inst) {
177+
*out << "visiting llvm instruction: " << inst << '\n';
178+
}
179+
176180
VisitorResult visitUnaryInstruction(UnaryInstruction &inst) {
177181
*out << "visiting UnaryInstruction (pre): " << inst << '\n';
178182
return isa<LoadInst>(inst) ? VisitorResult::Stop : VisitorResult::Continue;
@@ -212,10 +216,10 @@ template <bool rpot> const Visitor<VisitorContainer> &getExampleVisitor() {
212216
});
213217
b.add(&VisitorNest::visitUnaryInstruction);
214218
b.add<xd::cpp::SetReadOp>([](VisitorNest &self, xd::cpp::SetReadOp &op) {
215-
*self.out << "visiting SetReadOp: " << op << '\n';
216-
return op.getType()->isIntegerTy(1) ? VisitorResult::Stop
217-
: VisitorResult::Continue;
218-
});
219+
*self.out << "visiting SetReadOp: " << op << '\n';
220+
return op.getType()->isIntegerTy(1) ? VisitorResult::Stop
221+
: VisitorResult::Continue;
222+
});
219223
b.addSet<xd::cpp::SetReadOp, xd::cpp::SetWriteOp>(
220224
[](VisitorNest &self, llvm::Instruction &op) {
221225
if (isa<xd::cpp::SetReadOp>(op)) {
@@ -224,11 +228,13 @@ template <bool rpot> const Visitor<VisitorContainer> &getExampleVisitor() {
224228
*self.out << "visiting SetWriteOp (set): " << op << '\n';
225229
}
226230
});
231+
b.addSet<xd::cpp::SetReadOp, xd::cpp::SetWriteOp>(
232+
&VisitorNest::visitInst);
227233
b.addSet(complexSet, [](VisitorNest &self, llvm::Instruction &op) {
228234
assert((op.getOpcode() == Instruction::Ret ||
229235
(isa<IntrinsicInst>(&op) &&
230-
cast<IntrinsicInst>(&op)->getIntrinsicID() ==
231-
Intrinsic::umin)) &&
236+
cast<IntrinsicInst>(&op)->getIntrinsicID() ==
237+
Intrinsic::umin)) &&
232238
"Unexpected operation detected while visiting OpSet!");
233239

234240
if (op.getOpcode() == Instruction::Ret) {
@@ -246,8 +252,8 @@ template <bool rpot> const Visitor<VisitorContainer> &getExampleVisitor() {
246252
b.add(&VisitorNest::visitBinaryOperator);
247253
b.nest<raw_ostream>([](VisitorBuilder<raw_ostream> &b) {
248254
b.add<xd::cpp::WriteOp>([](raw_ostream &out, xd::cpp::WriteOp &op) {
249-
out << "visiting WriteOp: " << op << '\n';
250-
});
255+
out << "visiting WriteOp: " << op << '\n';
256+
});
251257
b.add<xd::cpp::WriteVarArgOp>(
252258
[](raw_ostream &out, xd::cpp::WriteVarArgOp &op) {
253259
out << "visiting WriteVarArgOp: " << op << ":\n";

include/llvm-dialects/Dialect/Visitor.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,12 @@ class VisitorBuilder : private detail::VisitorBuilderBase {
414414
return *this;
415415
}
416416

417+
template <typename... OpTs>
418+
VisitorBuilder &addSet(void (PayloadT::*fn)(llvm::Instruction &)) {
419+
addSetMemberCase(detail::VisitorKey::opSet<OpTs...>(), fn);
420+
return *this;
421+
}
422+
417423
VisitorBuilder &addSet(const OpSet &opSet,
418424
VisitorResult (*fn)(PayloadT &,
419425
llvm::Instruction &I)) {
@@ -512,6 +518,15 @@ class VisitorBuilder : private detail::VisitorBuilderBase {
512518
VisitorBuilderBase::add(key, &VisitorBuilder::setForwarder<ReturnT>, data);
513519
}
514520

521+
template <typename ReturnT>
522+
void addSetMemberCase(detail::VisitorKey key,
523+
ReturnT (PayloadT::*fn)(llvm::Instruction &)) {
524+
detail::VisitorCallbackData data{};
525+
static_assert(sizeof(fn) <= sizeof(data.data));
526+
memcpy(&data.data, &fn, sizeof(fn));
527+
VisitorBuilderBase::add(key, &VisitorBuilder::setForwarder<ReturnT>, data);
528+
}
529+
515530
template <typename OpT, typename ReturnT>
516531
void addMemberFnCase(detail::VisitorKey key, ReturnT (PayloadT::*fn)(OpT &)) {
517532
detail::VisitorCallbackData data{};

test/example/visitor-basic.ll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@
2828
; DEFAULT-NEXT: visiting SetReadOp: %v.0 = call i1 @xd.ir.set.read__i1()
2929
; DEFAULT-NEXT: visiting SetReadOp: %v.1 = call i32 @xd.ir.set.read__i32()
3030
; DEFAULT-NEXT: visiting SetReadOp (set): %v.1 = call i32 @xd.ir.set.read__i32()
31+
; DEFAULT-NEXT: visiting llvm instruction: %v.1 = call i32 @xd.ir.set.read__i32()
3132
; DEFAULT-NEXT: visiting UnaryInstruction (pre): %v.2 = trunc i32 %v.1 to i8
3233
; DEFAULT-NEXT: visiting UnaryInstruction: %v.2 = trunc i32 %v.1 to i8
3334
; DEFAULT-NEXT: visiting SetWriteOp (set): call void (...) @xd.ir.set.write(i8 %v.2)
35+
; DEFAULT-NEXT: visiting llvm instruction: call void (...) @xd.ir.set.write(i8 %v.2)
3436
; DEFAULT-NEXT: visiting WriteVarArgOp: call void (...) @xd.ir.write.vararg(i8 %t, i32 %v2, i32 %q)
3537
; DEFAULT-NEXT: %v2 =
3638
; DEFAULT-NEXT: %q =
37-
; DEFAULT-NEXT: visiting umin (set): %vm = call i32 @llvm.umin.i32(i32 %v1, i32 %q)
39+
; DEFAULT-NEXT: visiting umin (set): %vm = call i32 @llvm.umin.i32(i32 %v1, i32 %q)
3840
; DEFAULT-NEXT: visiting StringAttrOp: Hello world!
3941
; DEFAULT-NEXT: visiting CallInst: %0 = call i32 @op.func(i32 %v1, i32 %q)
4042
; DEFAULT-NEXT: visiting CallBrInst: callbr void @callee()

0 commit comments

Comments
 (0)