-
Notifications
You must be signed in to change notification settings - Fork 0
/
ir_print.cpp
122 lines (100 loc) · 2.52 KB
/
ir_print.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "ir.h"
#include <cstdint>
#include <iostream>
struct Printer {
virtual void PrintOpcode(std::ostream &stm, int opc) {
stm << "opc." << opc;
}
virtual void PrintInput(std::ostream &stm, int in) {
stm << "in." << in;
}
virtual void PrintInfo(std::ostream &stm, int in) {
stm << "in." << in;
}
};
struct Inst {
void PrintInfo(std::ostream& stm) {
stm << "Inst ";
}
int id{1};
int opcode{2};
};
struct DynInst : public Inst {
void PrintInfo(std::ostream& stm) {
Inst::PrintInfo(stm);
stm << "DynInst ";
}
uintptr_t* inputs;
};
struct FixInst : public Inst {
void PrintInfo(std::ostream& stm) {
Inst::PrintInfo(stm);
stm << "FixInst ";
}
uintptr_t inputs[4];
};
struct MixinA {
void PrintInfo(std::ostream& stm) {
stm << "MixinA ";
}
uintptr_t value;
};
struct MixinB {
void PrintInfo(std::ostream& stm) {
stm << "MixinB ";
}
char c;
};
template<typename T>
struct MixinC : public T {
void PrintInfo(std::ostream& stm) {
T::PrintInfo(stm);
stm << "MixinC ";
}
char c;
};
template<typename InstT, typename... Args>
struct Wrapper : public InstT, Args... {
void Print(std::ostream& stm, Printer& printer) {
stm << InstT::id << " ";
printer.PrintOpcode(stm, InstT::opcode);
stm << " {";
InstT::PrintInfo(stm);
(Args::PrintInfo(stm),...);
stm << "}\n";
}
};
template<typename InstT, typename... Args>
void PrintAll(std::ostream& stm, InstT* inst, Printer& printer) {
stm << inst->id << " ";
printer.PrintOpcode(stm, inst->opcode);
stm << " {";
(static_cast<Args*>(inst)->PrintInfo(stm),...);
inst->PrintInfo(stm);
stm << "}\n";
};
//struct InstA : public Wrapper<MixinC<FixInst>, MixinA> {
struct InstA : public MixinC<FixInst>, public MixinA {
void PrintInfo(std::ostream& stm) {
//Wrapper::Print(stm);
// MixinC<FixInst>::PrintInfo(stm);
// MixinA::PrintInfo(stm);
stm << "InstA";
}
void Print(std::ostream& stm, Printer& printer) {
PrintAll<InstA, MixinC<FixInst>, MixinA>(stm, this, printer);
}
uintptr_t* inputs;
};
using tp = std::tuple<MixinA, MixinB>;
struct PrinterA : public Printer {
void PrintOpcode(std::ostream &stm, int opc) override {
Printer::PrintOpcode(stm, opc);
stm << "(хуй)";
}
};
void test_ir() {
InstA a;
PrinterA printer;
a.Print(std::cerr, printer);
}