From a73fe8ac18d3ca81fa7a8d8c404cd7e0faf92ddc Mon Sep 17 00:00:00 2001
From: mephi42 <mephi42@gmail.com>
Date: Tue, 7 Aug 2018 17:59:43 +0200
Subject: [PATCH 3/7] capstone: generate *GenInstrInfo.inc

---
 utils/TableGen/InstrInfoEmitter.cpp | 49 ++++++++++++++++++++++++++---
 1 file changed, 44 insertions(+), 5 deletions(-)

diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp
index 0aff1aa6f94..2f3a2729262 100644
--- a/utils/TableGen/InstrInfoEmitter.cpp
+++ b/utils/TableGen/InstrInfoEmitter.cpp
@@ -92,6 +92,7 @@ private:
 
 } // end anonymous namespace
 
+#ifndef CAPSTONE
 static void PrintDefList(const std::vector<Record*> &Uses,
                          unsigned Num, raw_ostream &OS) {
   OS << "static const MCPhysReg ImplicitList" << Num << "[] = { ";
@@ -99,6 +100,7 @@ static void PrintDefList(const std::vector<Record*> &Uses,
     OS << getQualifiedName(U) << ", ";
   OS << "0 };\n";
 }
+#endif
 
 //===----------------------------------------------------------------------===//
 // Operand Info Emission.
@@ -426,8 +428,17 @@ void InstrInfoEmitter::emitTIIHelperMethods(raw_ostream &OS) {
 // run - Emit the main instruction description records for the target...
 void InstrInfoEmitter::run(raw_ostream &OS) {
   emitSourceFileHeader("Target Instruction Enum Values and Descriptors", OS);
+
+#ifdef CAPSTONE
+  OS << "/* Capstone Disassembly Engine */\n"
+        "/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */\n"
+        "\n"
+        "\n";
+#endif
+
   emitEnums(OS);
 
+#ifndef CAPSTONE
   OS << "#ifdef GET_INSTRINFO_MC_DESC\n";
   OS << "#undef GET_INSTRINFO_MC_DESC\n";
 
@@ -545,6 +556,7 @@ void InstrInfoEmitter::run(raw_ostream &OS) {
   emitOperandTypesEnum(OS, Target);
 
   emitMCIIHelperMethods(OS);
+#endif
 }
 
 void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
@@ -659,7 +671,9 @@ void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
   OS << "#ifdef GET_INSTRINFO_ENUM\n";
   OS << "#undef GET_INSTRINFO_ENUM\n";
 
+#ifndef CAPSTONE
   OS << "namespace llvm {\n\n";
+#endif
 
   CodeGenTarget Target(Records);
 
@@ -669,17 +683,39 @@ void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
   if (Namespace.empty())
     PrintFatalError("No instructions defined!");
 
+#ifndef CAPSTONE
   OS << "namespace " << Namespace << " {\n";
-  OS << "  enum {\n";
+#endif
+#ifdef CAPSTONE
+  OS << "\n"
+#else
+  OS << "  "
+#endif
+     << "enum {\n";
   unsigned Num = 0;
   for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue())
-    OS << "    " << Inst->TheDef->getName() << "\t= " << Num++ << ",\n";
-  OS << "    INSTRUCTION_LIST_END = " << Num << "\n";
+    OS << "    "
+#ifdef CAPSTONE
+       << Target.getName() << "_"
+#endif
+       << Inst->TheDef->getName() << "\t= " << Num++ << ",\n";
+  OS << "    "
+#ifdef CAPSTONE
+     << Target.getName() << "_"
+#endif
+     << "INSTRUCTION_LIST_END = " << Num << "\n";
   OS << "  };\n\n";
+#ifndef CAPSTONE
   OS << "} // end " << Namespace << " namespace\n";
   OS << "} // end llvm namespace\n";
-  OS << "#endif // GET_INSTRINFO_ENUM\n\n";
-
+#endif
+  OS << "#endif // GET_INSTRINFO_ENUM\n"
+#ifndef CAPSTONE
+     << "\n"
+#endif
+     ;
+
+#ifndef CAPSTONE
   OS << "#ifdef GET_INSTRINFO_SCHED_ENUM\n";
   OS << "#undef GET_INSTRINFO_SCHED_ENUM\n";
   OS << "namespace llvm {\n\n";
@@ -696,13 +732,16 @@ void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
   OS << "} // end llvm namespace\n";
 
   OS << "#endif // GET_INSTRINFO_SCHED_ENUM\n\n";
+#endif
 }
 
 namespace llvm {
 
 void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS) {
   InstrInfoEmitter(RK).run(OS);
+#ifndef CAPSTONE
   EmitMapTable(RK, OS);
+#endif
 }
 
 } // end llvm namespace
-- 
2.19.1

