1*9a0e4156SSadaf EbrahimiFrom a73fe8ac18d3ca81fa7a8d8c404cd7e0faf92ddc Mon Sep 17 00:00:00 2001
2*9a0e4156SSadaf EbrahimiFrom: mephi42 <[email protected]>
3*9a0e4156SSadaf EbrahimiDate: Tue, 7 Aug 2018 17:59:43 +0200
4*9a0e4156SSadaf EbrahimiSubject: [PATCH 3/7] capstone: generate *GenInstrInfo.inc
5*9a0e4156SSadaf Ebrahimi
6*9a0e4156SSadaf Ebrahimi---
7*9a0e4156SSadaf Ebrahimi utils/TableGen/InstrInfoEmitter.cpp | 49 ++++++++++++++++++++++++++---
8*9a0e4156SSadaf Ebrahimi 1 file changed, 44 insertions(+), 5 deletions(-)
9*9a0e4156SSadaf Ebrahimi
10*9a0e4156SSadaf Ebrahimidiff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp
11*9a0e4156SSadaf Ebrahimiindex 0aff1aa6f94..2f3a2729262 100644
12*9a0e4156SSadaf Ebrahimi--- a/utils/TableGen/InstrInfoEmitter.cpp
13*9a0e4156SSadaf Ebrahimi+++ b/utils/TableGen/InstrInfoEmitter.cpp
14*9a0e4156SSadaf Ebrahimi@@ -92,6 +92,7 @@ private:
15*9a0e4156SSadaf Ebrahimi
16*9a0e4156SSadaf Ebrahimi } // end anonymous namespace
17*9a0e4156SSadaf Ebrahimi
18*9a0e4156SSadaf Ebrahimi+#ifndef CAPSTONE
19*9a0e4156SSadaf Ebrahimi static void PrintDefList(const std::vector<Record*> &Uses,
20*9a0e4156SSadaf Ebrahimi                          unsigned Num, raw_ostream &OS) {
21*9a0e4156SSadaf Ebrahimi   OS << "static const MCPhysReg ImplicitList" << Num << "[] = { ";
22*9a0e4156SSadaf Ebrahimi@@ -99,6 +100,7 @@ static void PrintDefList(const std::vector<Record*> &Uses,
23*9a0e4156SSadaf Ebrahimi     OS << getQualifiedName(U) << ", ";
24*9a0e4156SSadaf Ebrahimi   OS << "0 };\n";
25*9a0e4156SSadaf Ebrahimi }
26*9a0e4156SSadaf Ebrahimi+#endif
27*9a0e4156SSadaf Ebrahimi
28*9a0e4156SSadaf Ebrahimi //===----------------------------------------------------------------------===//
29*9a0e4156SSadaf Ebrahimi // Operand Info Emission.
30*9a0e4156SSadaf Ebrahimi@@ -426,8 +428,17 @@ void InstrInfoEmitter::emitTIIHelperMethods(raw_ostream &OS) {
31*9a0e4156SSadaf Ebrahimi // run - Emit the main instruction description records for the target...
32*9a0e4156SSadaf Ebrahimi void InstrInfoEmitter::run(raw_ostream &OS) {
33*9a0e4156SSadaf Ebrahimi   emitSourceFileHeader("Target Instruction Enum Values and Descriptors", OS);
34*9a0e4156SSadaf Ebrahimi+
35*9a0e4156SSadaf Ebrahimi+#ifdef CAPSTONE
36*9a0e4156SSadaf Ebrahimi+  OS << "/* Capstone Disassembly Engine */\n"
37*9a0e4156SSadaf Ebrahimi+        "/* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */\n"
38*9a0e4156SSadaf Ebrahimi+        "\n"
39*9a0e4156SSadaf Ebrahimi+        "\n";
40*9a0e4156SSadaf Ebrahimi+#endif
41*9a0e4156SSadaf Ebrahimi+
42*9a0e4156SSadaf Ebrahimi   emitEnums(OS);
43*9a0e4156SSadaf Ebrahimi
44*9a0e4156SSadaf Ebrahimi+#ifndef CAPSTONE
45*9a0e4156SSadaf Ebrahimi   OS << "#ifdef GET_INSTRINFO_MC_DESC\n";
46*9a0e4156SSadaf Ebrahimi   OS << "#undef GET_INSTRINFO_MC_DESC\n";
47*9a0e4156SSadaf Ebrahimi
48*9a0e4156SSadaf Ebrahimi@@ -545,6 +556,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
49*9a0e4156SSadaf Ebrahimi   emitOperandTypesEnum(OS, Target);
50*9a0e4156SSadaf Ebrahimi
51*9a0e4156SSadaf Ebrahimi   emitMCIIHelperMethods(OS);
52*9a0e4156SSadaf Ebrahimi+#endif
53*9a0e4156SSadaf Ebrahimi }
54*9a0e4156SSadaf Ebrahimi
55*9a0e4156SSadaf Ebrahimi void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
56*9a0e4156SSadaf Ebrahimi@@ -659,7 +671,9 @@ void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
57*9a0e4156SSadaf Ebrahimi   OS << "#ifdef GET_INSTRINFO_ENUM\n";
58*9a0e4156SSadaf Ebrahimi   OS << "#undef GET_INSTRINFO_ENUM\n";
59*9a0e4156SSadaf Ebrahimi
60*9a0e4156SSadaf Ebrahimi+#ifndef CAPSTONE
61*9a0e4156SSadaf Ebrahimi   OS << "namespace llvm {\n\n";
62*9a0e4156SSadaf Ebrahimi+#endif
63*9a0e4156SSadaf Ebrahimi
64*9a0e4156SSadaf Ebrahimi   CodeGenTarget Target(Records);
65*9a0e4156SSadaf Ebrahimi
66*9a0e4156SSadaf Ebrahimi@@ -669,17 +683,39 @@ void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
67*9a0e4156SSadaf Ebrahimi   if (Namespace.empty())
68*9a0e4156SSadaf Ebrahimi     PrintFatalError("No instructions defined!");
69*9a0e4156SSadaf Ebrahimi
70*9a0e4156SSadaf Ebrahimi+#ifndef CAPSTONE
71*9a0e4156SSadaf Ebrahimi   OS << "namespace " << Namespace << " {\n";
72*9a0e4156SSadaf Ebrahimi-  OS << "  enum {\n";
73*9a0e4156SSadaf Ebrahimi+#endif
74*9a0e4156SSadaf Ebrahimi+#ifdef CAPSTONE
75*9a0e4156SSadaf Ebrahimi+  OS << "\n"
76*9a0e4156SSadaf Ebrahimi+#else
77*9a0e4156SSadaf Ebrahimi+  OS << "  "
78*9a0e4156SSadaf Ebrahimi+#endif
79*9a0e4156SSadaf Ebrahimi+     << "enum {\n";
80*9a0e4156SSadaf Ebrahimi   unsigned Num = 0;
81*9a0e4156SSadaf Ebrahimi   for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue())
82*9a0e4156SSadaf Ebrahimi-    OS << "    " << Inst->TheDef->getName() << "\t= " << Num++ << ",\n";
83*9a0e4156SSadaf Ebrahimi-  OS << "    INSTRUCTION_LIST_END = " << Num << "\n";
84*9a0e4156SSadaf Ebrahimi+    OS << "    "
85*9a0e4156SSadaf Ebrahimi+#ifdef CAPSTONE
86*9a0e4156SSadaf Ebrahimi+       << Target.getName() << "_"
87*9a0e4156SSadaf Ebrahimi+#endif
88*9a0e4156SSadaf Ebrahimi+       << Inst->TheDef->getName() << "\t= " << Num++ << ",\n";
89*9a0e4156SSadaf Ebrahimi+  OS << "    "
90*9a0e4156SSadaf Ebrahimi+#ifdef CAPSTONE
91*9a0e4156SSadaf Ebrahimi+     << Target.getName() << "_"
92*9a0e4156SSadaf Ebrahimi+#endif
93*9a0e4156SSadaf Ebrahimi+     << "INSTRUCTION_LIST_END = " << Num << "\n";
94*9a0e4156SSadaf Ebrahimi   OS << "  };\n\n";
95*9a0e4156SSadaf Ebrahimi+#ifndef CAPSTONE
96*9a0e4156SSadaf Ebrahimi   OS << "} // end " << Namespace << " namespace\n";
97*9a0e4156SSadaf Ebrahimi   OS << "} // end llvm namespace\n";
98*9a0e4156SSadaf Ebrahimi-  OS << "#endif // GET_INSTRINFO_ENUM\n\n";
99*9a0e4156SSadaf Ebrahimi-
100*9a0e4156SSadaf Ebrahimi+#endif
101*9a0e4156SSadaf Ebrahimi+  OS << "#endif // GET_INSTRINFO_ENUM\n"
102*9a0e4156SSadaf Ebrahimi+#ifndef CAPSTONE
103*9a0e4156SSadaf Ebrahimi+     << "\n"
104*9a0e4156SSadaf Ebrahimi+#endif
105*9a0e4156SSadaf Ebrahimi+     ;
106*9a0e4156SSadaf Ebrahimi+
107*9a0e4156SSadaf Ebrahimi+#ifndef CAPSTONE
108*9a0e4156SSadaf Ebrahimi   OS << "#ifdef GET_INSTRINFO_SCHED_ENUM\n";
109*9a0e4156SSadaf Ebrahimi   OS << "#undef GET_INSTRINFO_SCHED_ENUM\n";
110*9a0e4156SSadaf Ebrahimi   OS << "namespace llvm {\n\n";
111*9a0e4156SSadaf Ebrahimi@@ -696,13 +732,16 @@ void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
112*9a0e4156SSadaf Ebrahimi   OS << "} // end llvm namespace\n";
113*9a0e4156SSadaf Ebrahimi
114*9a0e4156SSadaf Ebrahimi   OS << "#endif // GET_INSTRINFO_SCHED_ENUM\n\n";
115*9a0e4156SSadaf Ebrahimi+#endif
116*9a0e4156SSadaf Ebrahimi }
117*9a0e4156SSadaf Ebrahimi
118*9a0e4156SSadaf Ebrahimi namespace llvm {
119*9a0e4156SSadaf Ebrahimi
120*9a0e4156SSadaf Ebrahimi void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS) {
121*9a0e4156SSadaf Ebrahimi   InstrInfoEmitter(RK).run(OS);
122*9a0e4156SSadaf Ebrahimi+#ifndef CAPSTONE
123*9a0e4156SSadaf Ebrahimi   EmitMapTable(RK, OS);
124*9a0e4156SSadaf Ebrahimi+#endif
125*9a0e4156SSadaf Ebrahimi }
126*9a0e4156SSadaf Ebrahimi
127*9a0e4156SSadaf Ebrahimi } // end llvm namespace
128*9a0e4156SSadaf Ebrahimi--
129*9a0e4156SSadaf Ebrahimi2.19.1
130*9a0e4156SSadaf Ebrahimi
131