You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
6.2 KiB
175 lines
6.2 KiB
3 years ago
|
From 7a436110ef15c803dc8524af2fb5612bcacbb126 Mon Sep 17 00:00:00 2001
|
||
|
From: mephi42 <mephi42@gmail.com>
|
||
|
Date: Tue, 7 Aug 2018 20:55:32 +0200
|
||
|
Subject: [PATCH 6/7] capstone: generate *MappingInsn.inc
|
||
|
|
||
|
---
|
||
|
lib/Target/SystemZ/CMakeLists.txt | 1 +
|
||
|
utils/TableGen/InstrInfoEmitter.cpp | 95 +++++++++++++++++++++++++++++
|
||
|
utils/TableGen/TableGen.cpp | 6 ++
|
||
|
utils/TableGen/TableGenBackends.h | 1 +
|
||
|
4 files changed, 103 insertions(+)
|
||
|
|
||
|
diff --git a/lib/Target/SystemZ/CMakeLists.txt b/lib/Target/SystemZ/CMakeLists.txt
|
||
|
index f83b4242fb4..4b5d9c4a3b2 100644
|
||
|
--- a/lib/Target/SystemZ/CMakeLists.txt
|
||
|
+++ b/lib/Target/SystemZ/CMakeLists.txt
|
||
|
@@ -6,6 +6,7 @@ tablegen(LLVM SystemZGenCallingConv.inc -gen-callingconv)
|
||
|
tablegen(LLVM SystemZGenDAGISel.inc -gen-dag-isel)
|
||
|
tablegen(LLVM SystemZGenDisassemblerTables.inc -gen-disassembler)
|
||
|
tablegen(LLVM SystemZGenInstrInfo.inc -gen-instr-info)
|
||
|
+tablegen(LLVM SystemZMappingInsn.inc -mapping-insn)
|
||
|
tablegen(LLVM SystemZGenMCCodeEmitter.inc -gen-emitter)
|
||
|
tablegen(LLVM SystemZGenRegisterInfo.inc -gen-register-info)
|
||
|
tablegen(LLVM SystemZGenSubtargetInfo.inc -gen-subtarget)
|
||
|
diff --git a/utils/TableGen/InstrInfoEmitter.cpp b/utils/TableGen/InstrInfoEmitter.cpp
|
||
|
index 2f3a2729262..14ab1ea8a72 100644
|
||
|
--- a/utils/TableGen/InstrInfoEmitter.cpp
|
||
|
+++ b/utils/TableGen/InstrInfoEmitter.cpp
|
||
|
@@ -744,4 +744,99 @@ void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS) {
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
+#ifdef CAPSTONE
|
||
|
+std::string GetPublicName(const CodeGenInstruction *Inst) {
|
||
|
+ std::string Name = Inst->TheDef->getName();
|
||
|
+ // Apply backward compatibility fixups.
|
||
|
+ // BRNLE -> BNLER.
|
||
|
+ if (Name.length() >= 5 && Name.substr(0, 5) == "BRAsm") {
|
||
|
+ Name = "B" + Name.substr(5, Name.length() - 5) + "R";
|
||
|
+ }
|
||
|
+ // SSKEOpt -> SSKE.
|
||
|
+ while (Name.length() >= 3 && Name.substr(Name.length() - 3, 3) == "Opt") {
|
||
|
+ Name = Name.substr(0, Name.length() - 3);
|
||
|
+ }
|
||
|
+ // BRCLAsm -> BRCL.
|
||
|
+ while (true) {
|
||
|
+ size_t pos = Name.find("Asm");
|
||
|
+ if (pos == std::string::npos) {
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ Name = Name.substr(0, pos) + Name.substr(pos + 3);
|
||
|
+ }
|
||
|
+ // CPSDRxx -> CPSDR.
|
||
|
+ if (Name.length() >= 2) {
|
||
|
+ std::string Suffix2 = Name.substr(Name.length() - 2, 2);
|
||
|
+ if (Suffix2 == "dd" || Suffix2 == "ds" ||
|
||
|
+ Suffix2 == "sd" || Suffix2 == "ss") {
|
||
|
+ Name = Name.substr(0, Name.length() - 2);
|
||
|
+ }
|
||
|
+ }
|
||
|
+ return "SYSZ_INS_" + Name;
|
||
|
+}
|
||
|
+
|
||
|
+std::string GetRegisterName(Record *Reg) {
|
||
|
+ std::string Name = Reg->getName();
|
||
|
+ for (char& c : Name) {
|
||
|
+ c = toupper(c);
|
||
|
+ }
|
||
|
+ // R0L, R0D -> R0.
|
||
|
+ if (Name.length() >= 3 &&
|
||
|
+ Name[Name.length() - 3] == 'R' &&
|
||
|
+ (Name[Name.length() - 1] == 'L' ||
|
||
|
+ Name[Name.length() - 1] == 'D')) {
|
||
|
+ Name = Name.substr(0, Name.length() - 3) + Name[Name.length() - 2];
|
||
|
+ }
|
||
|
+ return "SYSZ_REG_" + Name;
|
||
|
+}
|
||
|
+
|
||
|
+std::string GetGroupName(Record *Pred) {
|
||
|
+ std::string Name = Pred->getName();
|
||
|
+ for (char& c : Name) {
|
||
|
+ c = toupper(c);
|
||
|
+ }
|
||
|
+ if (Name.length() >= 7 && Name.substr(0, 7) == "FEATURE") {
|
||
|
+ Name = Name.substr(7);
|
||
|
+ }
|
||
|
+ return "SYSZ_GRP_" + Name;
|
||
|
+}
|
||
|
+
|
||
|
+void EmitMappingInsn(RecordKeeper &RK, raw_ostream &OS) {
|
||
|
+ OS << "// This is auto-gen data for Capstone engine (www.capstone-engine.org)\n"
|
||
|
+ "// By Nguyen Anh Quynh <aquynh@gmail.com>\n"
|
||
|
+ "\n";
|
||
|
+ CodeGenTarget Target(RK);
|
||
|
+ for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue()) {
|
||
|
+ if (Inst->TheDef->getValueAsBit("isPseudo") ||
|
||
|
+ Inst->TheDef->getValueAsBit("isCodeGenOnly")) {
|
||
|
+ continue;
|
||
|
+ }
|
||
|
+ OS << "{\n"
|
||
|
+ << "\t" << Target.getName() << "_" << Inst->TheDef->getName() << ", "
|
||
|
+ << GetPublicName(Inst) << ",\n"
|
||
|
+ << "#ifndef CAPSTONE_DIET\n"
|
||
|
+ << "\t{ ";
|
||
|
+ for (Record *Use : Inst->TheDef->getValueAsListOfDefs("Uses")) {
|
||
|
+ OS << GetRegisterName(Use) << ", ";
|
||
|
+ }
|
||
|
+ OS << "0 }, { ";
|
||
|
+ for (Record *Def : Inst->TheDef->getValueAsListOfDefs("Defs")) {
|
||
|
+ OS << GetRegisterName(Def) << ", ";
|
||
|
+ }
|
||
|
+ OS << "0 }, { ";
|
||
|
+ ListInit *Predicates = Inst->TheDef->getValueAsListInit("Predicates");
|
||
|
+ for (unsigned i = 0; i < Predicates->size(); ++i) {
|
||
|
+ OS << GetGroupName(Predicates->getElementAsRecord(i)) << ", ";
|
||
|
+ }
|
||
|
+ OS << "0 }, "
|
||
|
+ << Inst->TheDef->getValueAsBit("isBranch")
|
||
|
+ << ", "
|
||
|
+ << Inst->TheDef->getValueAsBit("isIndirectBranch")
|
||
|
+ << "\n"
|
||
|
+ << "#endif\n"
|
||
|
+ << "},\n";
|
||
|
+ }
|
||
|
+}
|
||
|
+#endif
|
||
|
+
|
||
|
} // end llvm namespace
|
||
|
diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp
|
||
|
index cf1404d8769..bbb4e860536 100644
|
||
|
--- a/utils/TableGen/TableGen.cpp
|
||
|
+++ b/utils/TableGen/TableGen.cpp
|
||
|
@@ -27,6 +27,7 @@ enum ActionType {
|
||
|
GenEmitter,
|
||
|
GenRegisterInfo,
|
||
|
GenInstrInfo,
|
||
|
+ MappingInsn,
|
||
|
GenInstrDocs,
|
||
|
GenAsmWriter,
|
||
|
GenAsmMatcher,
|
||
|
@@ -65,6 +66,8 @@ namespace {
|
||
|
"Generate registers and register classes info"),
|
||
|
clEnumValN(GenInstrInfo, "gen-instr-info",
|
||
|
"Generate instruction descriptions"),
|
||
|
+ clEnumValN(MappingInsn, "mapping-insn",
|
||
|
+ ""),
|
||
|
clEnumValN(GenInstrDocs, "gen-instr-docs",
|
||
|
"Generate instruction documentation"),
|
||
|
clEnumValN(GenCallingConv, "gen-callingconv",
|
||
|
@@ -135,6 +138,9 @@ bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
|
||
|
case GenInstrInfo:
|
||
|
EmitInstrInfo(Records, OS);
|
||
|
break;
|
||
|
+ case MappingInsn:
|
||
|
+ EmitMappingInsn(Records, OS);
|
||
|
+ break;
|
||
|
case GenInstrDocs:
|
||
|
EmitInstrDocs(Records, OS);
|
||
|
break;
|
||
|
diff --git a/utils/TableGen/TableGenBackends.h b/utils/TableGen/TableGenBackends.h
|
||
|
index 1329a6d833f..a41e46b1db0 100644
|
||
|
--- a/utils/TableGen/TableGenBackends.h
|
||
|
+++ b/utils/TableGen/TableGenBackends.h
|
||
|
@@ -75,6 +75,7 @@ void EmitDFAPacketizer(RecordKeeper &RK, raw_ostream &OS);
|
||
|
void EmitDisassembler(RecordKeeper &RK, raw_ostream &OS);
|
||
|
void EmitFastISel(RecordKeeper &RK, raw_ostream &OS);
|
||
|
void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS);
|
||
|
+void EmitMappingInsn(RecordKeeper &RK, raw_ostream &OS);
|
||
|
void EmitInstrDocs(RecordKeeper &RK, raw_ostream &OS);
|
||
|
void EmitPseudoLowering(RecordKeeper &RK, raw_ostream &OS);
|
||
|
void EmitCompressInst(RecordKeeper &RK, raw_ostream &OS);
|
||
|
--
|
||
|
2.19.1
|
||
|
|