capstone
109 строк · 4.1 Кб
1From b42f9f2014ec49a22077b6610863d9341a74e142 Mon Sep 17 00:00:00 2001
2From: mephi42 <mephi42@gmail.com>
3Date: Fri, 17 Aug 2018 11:07:39 +0200
4Subject: [PATCH 7/7] capstone: generate *GenInsnNameMaps.inc
5
6---
7lib/Target/SystemZ/CMakeLists.txt | 1 +
8utils/TableGen/InstrInfoEmitter.cpp | 29 +++++++++++++++++++++++++++++
9utils/TableGen/TableGen.cpp | 6 ++++++
10utils/TableGen/TableGenBackends.h | 1 +
114 files changed, 37 insertions(+)
12
13diff --git a/lib/Target/SystemZ/CMakeLists.txt b/lib/Target/SystemZ/CMakeLists.txt
14index 4b5d9c4a3b2..2c64e0a94b8 100644
15--- a/lib/Target/SystemZ/CMakeLists.txt
16+++ b/lib/Target/SystemZ/CMakeLists.txt
17@@ -7,6 +7,7 @@ tablegen(LLVM SystemZGenDAGISel.inc -gen-dag-isel)
18tablegen(LLVM SystemZGenDisassemblerTables.inc -gen-disassembler)
19tablegen(LLVM SystemZGenInstrInfo.inc -gen-instr-info)
20tablegen(LLVM SystemZMappingInsn.inc -mapping-insn)
21+tablegen(LLVM SystemZGenInsnNameMaps.inc -gen-insn-name-maps)
22tablegen(LLVM SystemZGenMCCodeEmitter.inc -gen-emitter)
23tablegen(LLVM SystemZGenRegisterInfo.inc -gen-register-info)
24tablegen(LLVM SystemZGenSubtargetInfo.inc -gen-subtarget)
25diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp
26index 14ab1ea8a72..ccf8170ca62 100644
27--- a/utils/TableGen/InstrInfoEmitter.cpp
28+++ b/utils/TableGen/InstrInfoEmitter.cpp
29@@ -837,6 +837,35 @@ void EmitMappingInsn(RecordKeeper &RK, raw_ostream &OS) {
30<< "},\n";
31}
32}
33+
34+std::string GetMnemonic(const CodeGenInstruction *Inst) {
35+ std::string Mnemonic = Inst->AsmString;
36+
37+ for (size_t i = 0; i < Mnemonic.length(); i++) {
38+ if (Mnemonic[i] == '\t') {
39+ return Mnemonic.substr(0, i);
40+ }
41+ }
42+ return Mnemonic;
43+}
44+
45+void EmitInsnNameMaps(RecordKeeper &RK, raw_ostream &OS) {
46+ OS << "// This is auto-gen data for Capstone engine (www.capstone-engine.org)\n"
47+ "// By Nguyen Anh Quynh <aquynh@gmail.com>\n"
48+ "\n";
49+ CodeGenTarget Target(RK);
50+ std::map<std::string, std::string> M;
51+ for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue()) {
52+ if (Inst->TheDef->getValueAsBit("isPseudo") ||
53+ Inst->TheDef->getValueAsBit("isCodeGenOnly")) {
54+ continue;
55+ }
56+ M[GetPublicName(Inst)] = GetMnemonic(Inst);
57+ }
58+ for (auto &P : M) {
59+ OS << "\t{ " << P.first << ", \"" << P.second << "\" },\n";
60+ }
61+}
62#endif
63
64} // end llvm namespace
65diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp
66index bbb4e860536..27c6603de5a 100644
67--- a/utils/TableGen/TableGen.cpp
68+++ b/utils/TableGen/TableGen.cpp
69@@ -28,6 +28,7 @@ enum ActionType {
70GenRegisterInfo,
71GenInstrInfo,
72MappingInsn,
73+ GenInsnNameMaps,
74GenInstrDocs,
75GenAsmWriter,
76GenAsmMatcher,
77@@ -68,6 +69,8 @@ namespace {
78"Generate instruction descriptions"),
79clEnumValN(MappingInsn, "mapping-insn",
80""),
81+ clEnumValN(GenInsnNameMaps, "gen-insn-name-maps",
82+ ""),
83clEnumValN(GenInstrDocs, "gen-instr-docs",
84"Generate instruction documentation"),
85clEnumValN(GenCallingConv, "gen-callingconv",
86@@ -141,6 +144,9 @@ bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
87case MappingInsn:
88EmitMappingInsn(Records, OS);
89break;
90+ case GenInsnNameMaps:
91+ EmitInsnNameMaps(Records, OS);
92+ break;
93case GenInstrDocs:
94EmitInstrDocs(Records, OS);
95break;
96diff --git a/utils/TableGen/TableGenBackends.h b/utils/TableGen/TableGenBackends.h
97index a41e46b1db0..5656e5be849 100644
98--- a/utils/TableGen/TableGenBackends.h
99+++ b/utils/TableGen/TableGenBackends.h
100@@ -76,6 +76,7 @@ void EmitDisassembler(RecordKeeper &RK, raw_ostream &OS);
101void EmitFastISel(RecordKeeper &RK, raw_ostream &OS);
102void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS);
103void EmitMappingInsn(RecordKeeper &RK, raw_ostream &OS);
104+void EmitInsnNameMaps(RecordKeeper &RK, raw_ostream &OS);
105void EmitInstrDocs(RecordKeeper &RK, raw_ostream &OS);
106void EmitPseudoLowering(RecordKeeper &RK, raw_ostream &OS);
107void EmitCompressInst(RecordKeeper &RK, raw_ostream &OS);
108--
1092.19.1
110
111