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