mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2025-07-23 21:43:55 +00:00
Initial Commit
This commit is contained in:
3161
thirdparty/capstone/contrib/riscv_update/0001-capstone-riscv-patchs.patch
vendored
Normal file
3161
thirdparty/capstone/contrib/riscv_update/0001-capstone-riscv-patchs.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,905 @@
|
||||
From 40ac7444e7f3679fad852564acca4f30f47fb52d Mon Sep 17 00:00:00 2001
|
||||
From: fanfuqiang <feqin1023@gmail.com>
|
||||
Date: Thu, 28 Feb 2019 01:37:55 +0800
|
||||
Subject: [PATCH] update TableGen for generate RISCV port inc for CAPSTONE
|
||||
|
||||
---
|
||||
llvm/lib/Target/RISCV/CMakeLists.txt | 2 +-
|
||||
llvm/utils/TableGen/AsmWriterEmitter.cpp | 175 ++++++++++++++++--
|
||||
.../utils/TableGen/FixedLenDecoderEmitter.cpp | 122 ++++++------
|
||||
llvm/utils/TableGen/InstrInfoEmitter.cpp | 14 +-
|
||||
llvm/utils/TableGen/RegisterInfoEmitter.cpp | 20 +-
|
||||
llvm/utils/TableGen/TableGen.cpp | 6 +
|
||||
6 files changed, 249 insertions(+), 90 deletions(-)
|
||||
|
||||
diff --git a/llvm/lib/Target/RISCV/CMakeLists.txt b/llvm/lib/Target/RISCV/CMakeLists.txt
|
||||
index 1821f4b01..603aa3f54 100644
|
||||
--- a/llvm/lib/Target/RISCV/CMakeLists.txt
|
||||
+++ b/llvm/lib/Target/RISCV/CMakeLists.txt
|
||||
@@ -6,7 +6,7 @@ tablegen(LLVM RISCVGenCompressInstEmitter.inc -gen-compress-inst-emitter)
|
||||
tablegen(LLVM RISCVGenDAGISel.inc -gen-dag-isel)
|
||||
tablegen(LLVM RISCVGenDisassemblerTables.inc -gen-disassembler)
|
||||
tablegen(LLVM RISCVGenInstrInfo.inc -gen-instr-info)
|
||||
-tablegen(LLVM RISCVGenMappingInsn.inc -gen-mapping-insn)
|
||||
+tablegen(LLVM RISCVMappingInsn.inc -gen-mapping-insn)
|
||||
tablegen(LLVM RISCVGenInsnNameMaps.inc -gen-insn-name-maps)
|
||||
tablegen(LLVM RISCVGenMCCodeEmitter.inc -gen-emitter)
|
||||
tablegen(LLVM RISCVGenMCPseudoLowering.inc -gen-pseudo-lowering)
|
||||
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
index c24dc6052..ac82573fe 100644
|
||||
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
@@ -270,12 +270,13 @@ static void UnescapeString(std::string &Str) {
|
||||
/// implementation. Destroys all instances of AsmWriterInst information, by
|
||||
/// clearing the Instructions vector.
|
||||
void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
||||
+#ifdef CAPSTONE
|
||||
+ bool PassSubtarget = false;
|
||||
+#else
|
||||
Record *AsmWriter = Target.getAsmWriter();
|
||||
-#ifndef CAPSTONE
|
||||
StringRef ClassName = AsmWriter->getValueAsString("AsmWriterClassName");
|
||||
-#endif
|
||||
bool PassSubtarget = AsmWriter->getValueAsInt("PassSubtarget");
|
||||
-
|
||||
+#endif
|
||||
O <<
|
||||
"/// printInstruction - This method is automatically generated by tablegen\n"
|
||||
"/// from the instruction set description.\n"
|
||||
@@ -434,7 +435,11 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
||||
}
|
||||
|
||||
// Emit the initial tab character.
|
||||
-#ifndef CAPSTONE
|
||||
+#ifdef CAPSTONE
|
||||
+ O << "#ifndef CAPSTONE_DIET\n"
|
||||
+ << " SStream_concat0(O, \"\\t\");\n"
|
||||
+ << "#endif\n\n";
|
||||
+#else
|
||||
O << " O << \"\\t\";\n\n";
|
||||
#endif
|
||||
|
||||
@@ -493,10 +498,10 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
||||
<< ((1 << NumBits)-1) << ") {\n"
|
||||
<< " default: "
|
||||
#ifdef CAPSTONE
|
||||
- << "assert(0);\n"
|
||||
-#endif
|
||||
+ << "assert(0 && \"Invalid command number.\");\n";
|
||||
+#else
|
||||
<< "llvm_unreachable(\"Invalid command number.\");\n";
|
||||
-
|
||||
+#endif
|
||||
// Print out all the cases.
|
||||
for (unsigned j = 0, e = Commands.size(); j != e; ++j) {
|
||||
O << " case " << j << ":\n";
|
||||
@@ -576,9 +581,7 @@ emitRegisterNameString(raw_ostream &O, StringRef AltName,
|
||||
}
|
||||
|
||||
StringTable.layout();
|
||||
-#ifdef CAPSTONE
|
||||
- O << "#ifndef CAPSTONE_DIET\n";
|
||||
-#endif
|
||||
+
|
||||
O << " static const char AsmStrs" << AltName << "[] = {\n";
|
||||
StringTable.emit(O, printChar);
|
||||
O << " };\n\n";
|
||||
@@ -625,7 +628,8 @@ void AsmWriterEmitter::EmitGetRegisterName(raw_ostream &O) {
|
||||
O << " "
|
||||
<< "assert(RegNo && RegNo < " << (Registers.size()+1)
|
||||
<< " && \"Invalid register number!\");\n"
|
||||
- << "\n";
|
||||
+ << "\n"
|
||||
+ << "#ifndef CAPSTONE_DIET\n";
|
||||
|
||||
if (hasAltNames) {
|
||||
for (const Record *R : AltNameIndices)
|
||||
@@ -636,7 +640,7 @@ void AsmWriterEmitter::EmitGetRegisterName(raw_ostream &O) {
|
||||
if (hasAltNames) {
|
||||
O << " switch(AltIdx) {\n"
|
||||
#ifdef CAPSTONE
|
||||
- << " default: assert(0);\n";
|
||||
+ << " default: assert(0 && \"Invalid register alt name index!\");\n";
|
||||
#else
|
||||
<< " default: llvm_unreachable(\"Invalid register alt name index!\");\n";
|
||||
#endif
|
||||
@@ -886,7 +890,9 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
|
||||
IAPrinter IAP(CGA.Result->getAsString(), FlatAliasAsmString);
|
||||
|
||||
+#ifndef CAPSTONE // Silence the compiler waring.
|
||||
StringRef Namespace = Target.getName();
|
||||
+#endif
|
||||
std::vector<Record *> ReqFeatures;
|
||||
if (PassSubtarget) {
|
||||
// We only consider ReqFeatures predicates if PassSubtarget
|
||||
@@ -902,7 +908,11 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
NumMIOps += ResultInstOpnd.MINumOperands;
|
||||
|
||||
std::string Cond;
|
||||
+#ifdef CAPSTONE
|
||||
+ Cond = std::string("MCInst_getNumOperands(MI) == ") + utostr(NumMIOps);
|
||||
+#else
|
||||
Cond = std::string("MI->getNumOperands() == ") + utostr(NumMIOps);
|
||||
+#endif
|
||||
IAP.addCond(Cond);
|
||||
|
||||
bool CantHandle = false;
|
||||
@@ -926,9 +936,11 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
-
|
||||
+#ifdef CAPSTONE
|
||||
+ std::string Op = "MCInst_getOperand(MI, " + utostr(MIOpNum) + ")";
|
||||
+#else
|
||||
std::string Op = "MI->getOperand(" + utostr(MIOpNum) + ")";
|
||||
-
|
||||
+#endif
|
||||
const CodeGenInstAlias::ResultOperand &RO = CGA.ResultOperands[i];
|
||||
|
||||
switch (RO.Kind) {
|
||||
@@ -954,19 +966,39 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
if (Rec->isSubClassOf("RegisterOperand"))
|
||||
Rec = Rec->getValueAsDef("RegClass");
|
||||
if (Rec->isSubClassOf("RegisterClass")) {
|
||||
+#ifdef CAPSTONE
|
||||
+ IAP.addCond("MCOperand_isReg(" + Op + ")");
|
||||
+#else
|
||||
IAP.addCond(Op + ".isReg()");
|
||||
+#endif
|
||||
|
||||
if (!IAP.isOpMapped(ROName)) {
|
||||
IAP.addOperand(ROName, MIOpNum, PrintMethodIdx);
|
||||
Record *R = CGA.ResultOperands[i].getRecord();
|
||||
if (R->isSubClassOf("RegisterOperand"))
|
||||
R = R->getValueAsDef("RegClass");
|
||||
+
|
||||
+#ifdef CAPSTONE
|
||||
+ Cond = std::string("MCRegisterClass_contains(") +
|
||||
+ "MCRegisterInfo_getRegClass(" + "MRI, " +
|
||||
+ Target.getName().str() + "_" + R->getName().str() + "RegClassID)" +
|
||||
+ ", " +
|
||||
+ "MCOperand_getReg(" + Op + "))";
|
||||
+#else
|
||||
Cond = std::string("MRI.getRegClass(") + Target.getName().str() +
|
||||
"::" + R->getName().str() + "RegClassID).contains(" + Op +
|
||||
".getReg())";
|
||||
+#endif
|
||||
+
|
||||
} else {
|
||||
+#ifdef CAPSTONE
|
||||
+ Cond = std::string("MCOperand_getReg(") + Op + ") == " +
|
||||
+ "MCOperand_getReg(MCInst_getOperand(MI, " +
|
||||
+ utostr(IAP.getOpIndex(ROName)) + "))";
|
||||
+#else
|
||||
Cond = Op + ".getReg() == MI->getOperand(" +
|
||||
utostr(IAP.getOpIndex(ROName)) + ").getReg()";
|
||||
+#endif
|
||||
}
|
||||
} else {
|
||||
// Assume all printable operands are desired for now. This can be
|
||||
@@ -984,8 +1016,12 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
break; // No conditions on this operand at all
|
||||
}
|
||||
Cond = (Target.getName() + ClassName + "ValidateMCOperand(" + Op +
|
||||
+ #ifdef CAPSTONE
|
||||
+ ", " + utostr(Entry) + ")").str();
|
||||
+ #else
|
||||
", STI, " + utostr(Entry) + ")")
|
||||
.str();
|
||||
+ #endif
|
||||
}
|
||||
// for all subcases of ResultOperand::K_Record:
|
||||
IAP.addCond(Cond);
|
||||
@@ -994,9 +1030,15 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
case CodeGenInstAlias::ResultOperand::K_Imm: {
|
||||
// Just because the alias has an immediate result, doesn't mean the
|
||||
// MCInst will. An MCExpr could be present, for example.
|
||||
+#ifdef CAPSTONE
|
||||
+ IAP.addCond("MCOperand_isImm(" + Op + ")");
|
||||
+ Cond = "MCOperand_getImm(" + Op + ") == " +
|
||||
+ itostr(CGA.ResultOperands[i].getImm());
|
||||
+#else
|
||||
IAP.addCond(Op + ".isImm()");
|
||||
-
|
||||
Cond = Op + ".getImm() == " + itostr(CGA.ResultOperands[i].getImm());
|
||||
+#endif
|
||||
+
|
||||
IAP.addCond(Cond);
|
||||
break;
|
||||
}
|
||||
@@ -1008,8 +1050,14 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
break;
|
||||
}
|
||||
|
||||
+#ifdef CAPSTONE
|
||||
+ Cond = "MCOperand_getReg(" + Op + ") == " + Target.getName().str() +
|
||||
+ "_" + CGA.ResultOperands[i].getRegister()->getName().str();
|
||||
+#else
|
||||
Cond = Op + ".getReg() == " + Target.getName().str() + "::" +
|
||||
CGA.ResultOperands[i].getRegister()->getName().str();
|
||||
+#endif
|
||||
+
|
||||
IAP.addCond(Cond);
|
||||
break;
|
||||
}
|
||||
@@ -1019,6 +1067,7 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
|
||||
if (CantHandle) continue;
|
||||
|
||||
+#ifndef CAPSTONE
|
||||
for (auto I = ReqFeatures.cbegin(); I != ReqFeatures.cend(); I++) {
|
||||
Record *R = *I;
|
||||
StringRef AsmCondString = R->getValueAsString("AssemblerCondString");
|
||||
@@ -1040,6 +1089,7 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
IAP.addCond(Cond);
|
||||
}
|
||||
}
|
||||
+#endif
|
||||
|
||||
IAPrinterMap[Aliases.first].push_back(std::move(IAP));
|
||||
}
|
||||
@@ -1052,10 +1102,17 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
std::string Header;
|
||||
raw_string_ostream HeaderO(Header);
|
||||
|
||||
+#ifdef CAPSTONE
|
||||
+ HeaderO << "\nstatic bool printAliasInstr(MCInst *MI, SStream * OS, void *info)"
|
||||
+ << "\n"
|
||||
+ << "{\n"
|
||||
+ << " MCRegisterInfo *MRI = (MCRegisterInfo *) info;\n";
|
||||
+#else
|
||||
HeaderO << "bool " << Target.getName() << ClassName
|
||||
<< "::printAliasInstr(const MCInst"
|
||||
<< " *MI, " << (PassSubtarget ? "const MCSubtargetInfo &STI, " : "")
|
||||
<< "raw_ostream &OS) {\n";
|
||||
+#endif
|
||||
|
||||
std::string Cases;
|
||||
raw_string_ostream CasesO(Cases);
|
||||
@@ -1079,7 +1136,16 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
|
||||
if (UniqueIAPs.empty()) continue;
|
||||
|
||||
+#ifdef CAPSTONE
|
||||
+ // TODO: tricky.
|
||||
+ const char* tmpCase = Entry.first.c_str();
|
||||
+ assert (Entry.first.size() > 7);
|
||||
+ CasesO.indent(2) << "case "
|
||||
+ << "RISCV_" << std::string(tmpCase + 7) // strlen("RISCV::) == 7
|
||||
+ << ":\n";
|
||||
+#else
|
||||
CasesO.indent(2) << "case " << Entry.first << ":\n";
|
||||
+#endif
|
||||
|
||||
for (IAPrinter *IAP : UniqueIAPs) {
|
||||
CasesO.indent(4);
|
||||
@@ -1100,13 +1166,21 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
|
||||
if (!MCOpPredicates.empty())
|
||||
O << "static bool " << Target.getName() << ClassName
|
||||
+#ifdef CAPSTONE
|
||||
+ << "ValidateMCOperand(MCOperand *MCOp,\n"
|
||||
+#else
|
||||
<< "ValidateMCOperand(const MCOperand &MCOp,\n"
|
||||
<< " const MCSubtargetInfo &STI,\n"
|
||||
+#endif
|
||||
<< " unsigned PredicateIndex);\n";
|
||||
|
||||
O << HeaderO.str();
|
||||
O.indent(2) << "const char *AsmString;\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ O.indent(2) << "switch (MCInst_getOpcode(MI)) {\n";
|
||||
+#else
|
||||
O.indent(2) << "switch (MI->getOpcode()) {\n";
|
||||
+#endif
|
||||
O.indent(2) << "default: return false;\n";
|
||||
O << CasesO.str();
|
||||
O.indent(2) << "}\n\n";
|
||||
@@ -1114,14 +1188,27 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
// Code that prints the alias, replacing the operands with the ones from the
|
||||
// MCInst.
|
||||
O << " unsigned I = 0;\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ O << " char *tmpString = cs_strdup(AsmString);\n";
|
||||
+#endif
|
||||
O << " while (AsmString[I] != ' ' && AsmString[I] != '\\t' &&\n";
|
||||
O << " AsmString[I] != '$' && AsmString[I] != '\\0')\n";
|
||||
O << " ++I;\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ O << " tmpString[I] = 0;\n";
|
||||
+ O << " SStream_concat0(OS, \"\\t\");\n";
|
||||
+ O << " SStream_concat0(OS, tmpString);\n";
|
||||
+ O << " SStream_concat0(OS, \"\\n\");\n";
|
||||
+#else
|
||||
O << " OS << '\\t' << StringRef(AsmString, I);\n";
|
||||
-
|
||||
+#endif
|
||||
O << " if (AsmString[I] != '\\0') {\n";
|
||||
O << " if (AsmString[I] == ' ' || AsmString[I] == '\\t') {\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ O << " SStream_concat0(OS, \"\\t\");\n";
|
||||
+#else
|
||||
O << " OS << '\\t';\n";
|
||||
+#endif
|
||||
O << " ++I;\n";
|
||||
O << " }\n";
|
||||
O << " do {\n";
|
||||
@@ -1131,15 +1218,28 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
O << " ++I;\n";
|
||||
O << " int OpIdx = AsmString[I++] - 1;\n";
|
||||
O << " int PrintMethodIdx = AsmString[I++] - 1;\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ O << " printCustomAliasOperand(MI, OpIdx, PrintMethodIdx, OS);\n";
|
||||
+#else
|
||||
O << " printCustomAliasOperand(MI, OpIdx, PrintMethodIdx, ";
|
||||
O << (PassSubtarget ? "STI, " : "");
|
||||
O << "OS);\n";
|
||||
+#endif
|
||||
O << " } else\n";
|
||||
+
|
||||
+#ifdef CAPSTONE
|
||||
+ O << " printOperand(MI, (unsigned)(AsmString[I++]) - 1, OS);\n";
|
||||
+#else
|
||||
O << " printOperand(MI, unsigned(AsmString[I++]) - 1, ";
|
||||
O << (PassSubtarget ? "STI, " : "");
|
||||
O << "OS);\n";
|
||||
+#endif
|
||||
O << " } else {\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ O << " SStream_concat0(OS, &AsmString[I++]);\n";
|
||||
+#else
|
||||
O << " OS << AsmString[I++];\n";
|
||||
+#endif
|
||||
O << " }\n";
|
||||
O << " } while (AsmString[I] != '\\0');\n";
|
||||
O << " }\n\n";
|
||||
@@ -1150,25 +1250,48 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
//////////////////////////////
|
||||
// Write out the printCustomAliasOperand function
|
||||
//////////////////////////////
|
||||
-
|
||||
+#ifdef CAPSTONE
|
||||
+ O << "static void "
|
||||
+#else
|
||||
O << "void " << Target.getName() << ClassName << "::"
|
||||
+#endif
|
||||
<< "printCustomAliasOperand(\n"
|
||||
+#ifdef CAPSTONE
|
||||
+ << " MCInst *MI, unsigned OpIdx,\n"
|
||||
+#else
|
||||
<< " const MCInst *MI, unsigned OpIdx,\n"
|
||||
+#endif
|
||||
<< " unsigned PrintMethodIdx,\n"
|
||||
+#ifdef CAPSTONE
|
||||
+ << " SStream *OS) {\n";
|
||||
+#else
|
||||
<< (PassSubtarget ? " const MCSubtargetInfo &STI,\n" : "")
|
||||
<< " raw_ostream &OS) {\n";
|
||||
+#endif
|
||||
if (PrintMethods.empty())
|
||||
+#ifdef CAPSTONE
|
||||
+ O << " assert(0 && \"Unknown PrintMethod kind\");\n";
|
||||
+#else
|
||||
O << " llvm_unreachable(\"Unknown PrintMethod kind\");\n";
|
||||
+#endif
|
||||
else {
|
||||
O << " switch (PrintMethodIdx) {\n"
|
||||
<< " default:\n"
|
||||
+#ifdef CAPSTONE
|
||||
+ << " assert(0 && \"Unknown PrintMethod kind\");\n"
|
||||
+#else
|
||||
<< " llvm_unreachable(\"Unknown PrintMethod kind\");\n"
|
||||
+#endif
|
||||
<< " break;\n";
|
||||
|
||||
for (unsigned i = 0; i < PrintMethods.size(); ++i) {
|
||||
O << " case " << i << ":\n"
|
||||
<< " " << PrintMethods[i] << "(MI, OpIdx, "
|
||||
+#ifdef CAPSTONE
|
||||
+ << "OS);\n"
|
||||
+#else
|
||||
<< (PassSubtarget ? "STI, " : "") << "OS);\n"
|
||||
+#endif
|
||||
<< " break;\n";
|
||||
}
|
||||
O << " }\n";
|
||||
@@ -1177,9 +1300,20 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
|
||||
if (!MCOpPredicates.empty()) {
|
||||
O << "static bool " << Target.getName() << ClassName
|
||||
+#ifdef CAPSTONE
|
||||
+ << "ValidateMCOperand(MCOperand *MCOp,\n"
|
||||
+#else
|
||||
<< "ValidateMCOperand(const MCOperand &MCOp,\n"
|
||||
<< " const MCSubtargetInfo &STI,\n"
|
||||
- << " unsigned PredicateIndex) {\n"
|
||||
+#endif
|
||||
+ << " unsigned PredicateIndex) {\n"
|
||||
+#ifdef CAPSTONE
|
||||
+ << " // TODO: need some constant untils operate the MCOperand,\n"
|
||||
+ << " // but current CAPSTONE does't have.\n"
|
||||
+ << " // So, We just return true\n"
|
||||
+ << " return true;\n\n"
|
||||
+ << "#if 0\n"
|
||||
+#endif
|
||||
<< " switch (PredicateIndex) {\n"
|
||||
<< " default:\n"
|
||||
<< " llvm_unreachable(\"Unknown MCOperandPredicate kind\");\n"
|
||||
@@ -1195,6 +1329,9 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
llvm_unreachable("Unexpected MCOperandPredicate field!");
|
||||
}
|
||||
O << " }\n"
|
||||
+#ifdef CAPSTONE
|
||||
+ << "#endif\n"
|
||||
+#endif
|
||||
<< "}\n\n";
|
||||
}
|
||||
|
||||
@@ -1228,7 +1365,7 @@ void AsmWriterEmitter::run(raw_ostream &O) {
|
||||
#endif
|
||||
EmitPrintInstruction(O);
|
||||
EmitGetRegisterName(O);
|
||||
-#ifndef CAPSTONE
|
||||
+#ifdef CAPSTONE
|
||||
EmitPrintAliasInstruction(O);
|
||||
#endif
|
||||
}
|
||||
diff --git a/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp b/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp
|
||||
index 3db428dfa..e1bfaa934 100644
|
||||
--- a/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/FixedLenDecoderEmitter.cpp
|
||||
@@ -946,13 +946,6 @@ void FixedLenDecoderEmitter::emitTable(formatted_raw_ostream &OS,
|
||||
void FixedLenDecoderEmitter::
|
||||
emitPredicateFunction(formatted_raw_ostream &OS, PredicateSet &Predicates,
|
||||
unsigned Indentation) const {
|
||||
-#ifdef CAPSTONE
|
||||
- OS.indent(Indentation) << "static bool getbool(uint64_t b)\n";
|
||||
- OS.indent(Indentation) << "{\n";
|
||||
- OS.indent(Indentation) << "\treturn b != 0;\n";
|
||||
- OS.indent(Indentation) << "}\n\n";
|
||||
-#endif
|
||||
-
|
||||
// The predicate function is just a big switch statement based on the
|
||||
// input predicate index.
|
||||
OS.indent(Indentation) << "static bool checkDecoderPredicate(unsigned Idx, "
|
||||
@@ -966,26 +959,25 @@ emitPredicateFunction(formatted_raw_ostream &OS, PredicateSet &Predicates,
|
||||
OS.indent(Indentation) << "switch (Idx) {\n";
|
||||
OS.indent(Indentation) << "default: "
|
||||
#ifdef CAPSTONE
|
||||
- << "assert(0);\n"
|
||||
-#endif
|
||||
+ << "assert(0 && \"Invalid index!\");\n";
|
||||
+#else
|
||||
<< "llvm_unreachable(\"Invalid index!\");\n";
|
||||
+#endif
|
||||
unsigned Index = 0;
|
||||
for (const auto &Predicate : Predicates) {
|
||||
OS.indent(Indentation) << "case " << Index++ << ":\n";
|
||||
OS.indent(Indentation+2) << "return "
|
||||
-#ifdef CAPSTONE
|
||||
- << "getbool"
|
||||
-#endif
|
||||
- << "(" << Predicate << ");\n";
|
||||
+ << Predicate << ";\n";
|
||||
}
|
||||
OS.indent(Indentation) << "}\n";
|
||||
} else {
|
||||
// No case statement to emit
|
||||
OS.indent(Indentation)
|
||||
#ifdef CAPSTONE
|
||||
- << "assert(0);\n"
|
||||
-#endif
|
||||
+ << "assert(0 && \"Invalid index!\");\n";
|
||||
+#else
|
||||
<< "llvm_unreachable(\"Invalid index!\");\n";
|
||||
+#endif
|
||||
}
|
||||
Indentation -= 2;
|
||||
OS.indent(Indentation) << "}\n\n";
|
||||
@@ -998,10 +990,11 @@ emitDecoderFunction(formatted_raw_ostream &OS, DecoderSet &Decoders,
|
||||
// input decoder index.
|
||||
#ifdef CAPSTONE
|
||||
#define EDF_EOL " \\\n"
|
||||
- OS.indent(Indentation) << "#define DecodeToMCInst(fname,fieldname, InsnType) \\\n";
|
||||
- OS.indent(Indentation) << "static DecodeStatus fname(DecodeStatus S, unsigned Idx, InsnType insn, MCInst *MI, \\\n";
|
||||
- OS.indent(Indentation) << " uint64_t Address, const void *Decoder) \\\n";
|
||||
- OS.indent(Indentation) << "{ \\\n";
|
||||
+ OS.indent(Indentation) << "#define DecodeToMCInst(fname, fieldname, InsnType) \\\n";
|
||||
+ OS.indent(Indentation) << "static DecodeStatus fname(DecodeStatus S, unsigned Idx,"
|
||||
+ << " InsnType insn, MCInst *MI, \\\n";
|
||||
+ OS.indent(Indentation) << " uint64_t Address, const void *Decoder,\\\n";
|
||||
+ OS.indent(Indentation) << " bool *DecodeComplete) {\\\n";
|
||||
#else
|
||||
#define EDF_EOL "\n"
|
||||
OS.indent(Indentation) << "template<typename InsnType>\n";
|
||||
@@ -1011,16 +1004,18 @@ emitDecoderFunction(formatted_raw_ostream &OS, DecoderSet &Decoders,
|
||||
<< "Address, const void *Decoder, bool &DecodeComplete) {\n";
|
||||
#endif
|
||||
Indentation += 2;
|
||||
-#ifndef CAPSTONE
|
||||
+#ifdef CAPSTONE
|
||||
+ OS.indent(Indentation) << "*DecodeComplete = true;\\\n";
|
||||
+#else
|
||||
OS.indent(Indentation) << "DecodeComplete = true;\n";
|
||||
#endif
|
||||
OS.indent(Indentation) << "InsnType tmp;" EDF_EOL;
|
||||
OS.indent(Indentation) << "switch (Idx) {" EDF_EOL;
|
||||
OS.indent(Indentation) << "default:"
|
||||
-#ifndef CAPSTONE
|
||||
- << " llvm_unreachable(\"Invalid index!\");\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ << " assert(0 && \"Invalid index!\");\\\n";
|
||||
#else
|
||||
- << " assert(0);\\\n";
|
||||
+ << " llvm_unreachable(\"Invalid index!\");\n";
|
||||
#endif
|
||||
unsigned Index = 0;
|
||||
for (const auto &Decoder : Decoders) {
|
||||
@@ -1174,8 +1169,27 @@ void FilterChooser::emitBinaryParser(raw_ostream &o, unsigned &Indentation,
|
||||
|
||||
if (Decoder != "") {
|
||||
OpHasCompleteDecoder = OpInfo.HasCompleteDecoder;
|
||||
+#ifdef CAPSTONE
|
||||
+ std::string::size_type posOfLeftAngle = 0, posOfRightAngle = 0;
|
||||
+ posOfLeftAngle = Decoder.find("<");
|
||||
+ posOfRightAngle = Decoder.find(">");
|
||||
+ std::string printDecoder = Decoder;
|
||||
+ if (posOfLeftAngle != std::string::npos &&
|
||||
+ posOfRightAngle != std::string::npos) {
|
||||
+ printDecoder = Decoder.substr(0, posOfLeftAngle);
|
||||
+ o.indent(Indentation) << Emitter->GuardPrefix
|
||||
+ << printDecoder
|
||||
+ << "(MI, tmp, Address, Decoder, "
|
||||
+ << Decoder.substr(posOfLeftAngle+1, posOfRightAngle-posOfLeftAngle-1);
|
||||
+ } else
|
||||
+ o.indent(Indentation) << Emitter->GuardPrefix << Decoder
|
||||
+ << "(MI, tmp, Address, Decoder";
|
||||
+ // trick.
|
||||
+ o << ")"
|
||||
+#else
|
||||
o.indent(Indentation) << Emitter->GuardPrefix << Decoder
|
||||
<< "(MI, tmp, Address, Decoder)"
|
||||
+#endif
|
||||
<< Emitter->GuardPostfix
|
||||
#ifdef CAPSTONE
|
||||
<< " return MCDisassembler_Fail; \\\n";
|
||||
@@ -1246,7 +1260,7 @@ static void emitSinglePredicateMatch(raw_ostream &o, StringRef str,
|
||||
const std::string &PredicateNamespace) {
|
||||
if (str[0] == '!')
|
||||
#ifdef CAPSTONE
|
||||
- o << "~(Bits & " << PredicateNamespace << "_"
|
||||
+ o << "!(Bits & " << PredicateNamespace << "_"
|
||||
<< str.slice(1,str.size()) << ")";
|
||||
#else
|
||||
o << "!Bits[" << PredicateNamespace << "::"
|
||||
@@ -2331,15 +2345,13 @@ static void emitDecodeInstruction(formatted_raw_ostream &OS) {
|
||||
#endif
|
||||
|
||||
#ifdef CAPSTONE
|
||||
- OS << "static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], "
|
||||
-
|
||||
+ OS << "#define DecodeInstruction(fname, fieldname, decoder, InsnType) \\\n"
|
||||
+ << "static DecodeStatus fname(const uint8_t DecodeTable[], "
|
||||
"MCInst *MI,\\\n"
|
||||
- << " InsnType insn, uint64_t "
|
||||
+ << " InsnType insn, uint64_t "
|
||||
"Address,\\\n"
|
||||
- << " const void *DisAsm,\\\n"
|
||||
- << " int feature) {\\\n"
|
||||
- << " uint64_t Bits = getFeatureBits(feature); \\\n"
|
||||
- //<< " const FeatureBitset& Bits = STI.getFeatureBits();\n"
|
||||
+ << " const void *DisAsm, int feature) {\\\n"
|
||||
+ << " uint64_t Bits = getFeatureBits(feature);\\\n"
|
||||
<< "\\\n"
|
||||
<< " const uint8_t *Ptr = DecodeTable;\\\n"
|
||||
<< " uint32_t CurFieldValue = 0;\\\n"
|
||||
@@ -2353,52 +2365,42 @@ static void emitDecodeInstruction(formatted_raw_ostream &OS) {
|
||||
<< " unsigned Start = *++Ptr;\\\n"
|
||||
<< " unsigned Len = *++Ptr;\\\n"
|
||||
<< " ++Ptr;\\\n"
|
||||
- << " CurFieldValue = fieldFromInstruction(insn, Start, Len);\\\n"
|
||||
+ << " CurFieldValue = fieldname(insn, Start, Len);\\\n"
|
||||
<< " break;\\\n"
|
||||
<< " }\\\n"
|
||||
<< " case MCD_OPC_FilterValue: {\\\n"
|
||||
- << " // Decode the field value.\\\n"
|
||||
<< " unsigned Len;\\\n"
|
||||
<< " InsnType Val = decodeULEB128(++Ptr, &Len);\\\n"
|
||||
<< " Ptr += Len;\\\n"
|
||||
- << " // NumToSkip is a plain 24-bit integer.\\\n"
|
||||
<< " unsigned NumToSkip = *Ptr++;\\\n"
|
||||
<< " NumToSkip |= (*Ptr++) << 8;\\\n"
|
||||
<< " NumToSkip |= (*Ptr++) << 16;\\\n"
|
||||
<< "\\\n"
|
||||
- << " // Perform the filter operation.\\\n"
|
||||
<< " if (Val != CurFieldValue)\\\n"
|
||||
<< " Ptr += NumToSkip;\\\n"
|
||||
- << "\\\n"
|
||||
<< " break;\\\n"
|
||||
<< " }\\\n"
|
||||
<< " case MCD_OPC_CheckField: {\\\n"
|
||||
<< " unsigned Start = *++Ptr;\\\n"
|
||||
<< " unsigned Len = *++Ptr;\\\n"
|
||||
- << " InsnType FieldValue = fieldFromInstruction(insn, Start, Len);\\\n"
|
||||
- << " // Decode the field value.\\\n"
|
||||
+ << " InsnType FieldValue = fieldname(insn, Start, Len);\\\n"
|
||||
<< " uint32_t ExpectedValue = decodeULEB128(++Ptr, &Len);\\\n"
|
||||
<< " Ptr += Len;\\\n"
|
||||
- << " // NumToSkip is a plain 24-bit integer.\\\n"
|
||||
<< " unsigned NumToSkip = *Ptr++;\\\n"
|
||||
<< " NumToSkip |= (*Ptr++) << 8;\\\n"
|
||||
<< " NumToSkip |= (*Ptr++) << 16;\\\n"
|
||||
<< "\\\n"
|
||||
- << " // If the actual and expected values don't match, skip.\\\n"
|
||||
<< " if (ExpectedValue != FieldValue)\\\n"
|
||||
<< " Ptr += NumToSkip;\\\n"
|
||||
<< " break;\\\n"
|
||||
<< " }\\\n"
|
||||
<< " case MCD_OPC_CheckPredicate: {\\\n"
|
||||
<< " unsigned Len;\\\n"
|
||||
- << " // Decode the Predicate Index value.\\\n"
|
||||
<< " unsigned PIdx = decodeULEB128(++Ptr, &Len);\\\n"
|
||||
<< " Ptr += Len;\\\n"
|
||||
- << " // NumToSkip is a plain 24-bit integer.\\\n"
|
||||
<< " unsigned NumToSkip = *Ptr++;\\\n"
|
||||
<< " NumToSkip |= (*Ptr++) << 8;\\\n"
|
||||
<< " NumToSkip |= (*Ptr++) << 16;\\\n"
|
||||
- << " // Check the predicate.\\\n"
|
||||
<< " bool Pred;\\\n"
|
||||
<< " if (!(Pred = checkDecoderPredicate(PIdx, Bits)))\\\n"
|
||||
<< " Ptr += NumToSkip;\\\n"
|
||||
@@ -2407,7 +2409,6 @@ static void emitDecodeInstruction(formatted_raw_ostream &OS) {
|
||||
<< " }\\\n"
|
||||
<< " case MCD_OPC_Decode: {\\\n"
|
||||
<< " unsigned Len;\\\n"
|
||||
- << " // Decode the Opcode value.\\\n"
|
||||
<< " unsigned Opc = decodeULEB128(++Ptr, &Len);\\\n"
|
||||
<< " Ptr += Len;\\\n"
|
||||
<< " unsigned DecodeIdx = decodeULEB128(Ptr, &Len);\\\n"
|
||||
@@ -2416,47 +2417,39 @@ static void emitDecodeInstruction(formatted_raw_ostream &OS) {
|
||||
<< " MCInst_clear(MI);\\\n"
|
||||
<< " MCInst_setOpcode(MI, Opc);\\\n"
|
||||
<< " bool DecodeComplete;\\\n"
|
||||
- << " S = decodeToMCInst(S, DecodeIdx, insn, MI, Address, DisAsm, "
|
||||
- "DecodeComplete);\\\n"
|
||||
+ << " S = decoder(S, DecodeIdx, insn, MI, Address, DisAsm, "
|
||||
+ "&DecodeComplete);\\\n"
|
||||
<< " assert(DecodeComplete);\\\n"
|
||||
<< "\\\n"
|
||||
<< " return S;\\\n"
|
||||
<< " }\\\n"
|
||||
<< " case MCD_OPC_TryDecode: {\\\n"
|
||||
<< " unsigned Len;\\\n"
|
||||
- << " // Decode the Opcode value.\\\n"
|
||||
<< " unsigned Opc = decodeULEB128(++Ptr, &Len);\\\n"
|
||||
<< " Ptr += Len;\\\n"
|
||||
<< " unsigned DecodeIdx = decodeULEB128(Ptr, &Len);\\\n"
|
||||
<< " Ptr += Len;\\\n"
|
||||
- << " // NumToSkip is a plain 24-bit integer.\\\n"
|
||||
<< " unsigned NumToSkip = *Ptr++;\\\n"
|
||||
<< " NumToSkip |= (*Ptr++) << 8;\\\n"
|
||||
<< " NumToSkip |= (*Ptr++) << 16;\\\n"
|
||||
<< "\\\n"
|
||||
- << " // Perform the decode operation.\\\n"
|
||||
<< " MCInst TmpMI;\\\n"
|
||||
<< " MCInst_setOpcode(&TmpMI, Opc);\\\n"
|
||||
- << " bool DecodeComplete;\n"
|
||||
- << " S = decodeToMCInst(S, DecodeIdx, insn, &TmpMI, Address, DisAsm, "
|
||||
- "DecodeComplete);\\\n"
|
||||
+ << " bool DecodeComplete;\\\n"
|
||||
+ << " S = decoder(S, DecodeIdx, insn, &TmpMI, Address, DisAsm, "
|
||||
+ "&DecodeComplete);\\\n"
|
||||
+ << "\\\n"
|
||||
<< " if (DecodeComplete) {\\\n"
|
||||
- << " // Decoding complete.\\\n"
|
||||
- << " MI = &TmpMI;\\\n"
|
||||
+ << " *MI = TmpMI;\\\n"
|
||||
<< " return S;\\\n"
|
||||
<< " } else {\\\n"
|
||||
<< " assert(S == MCDisassembler_Fail);\\\n"
|
||||
- << " // If the decoding was incomplete, skip.\\\n"
|
||||
<< " Ptr += NumToSkip;\\\n"
|
||||
- << " // Reset decode status. This also drops a SoftFail status "
|
||||
- "that could be\\\n"
|
||||
- << " // set before the decode attempt.\\\n"
|
||||
<< " S = MCDisassembler_Success;\\\n"
|
||||
<< " }\\\n"
|
||||
<< " break;\\\n"
|
||||
<< " }\\\n"
|
||||
<< " case MCD_OPC_SoftFail: {\\\n"
|
||||
- << " // Decode the mask values.\\\n"
|
||||
<< " unsigned Len;\\\n"
|
||||
<< " InsnType PositiveMask = decodeULEB128(++Ptr, &Len);\\\n"
|
||||
<< " Ptr += Len;\\\n"
|
||||
@@ -2472,8 +2465,8 @@ static void emitDecodeInstruction(formatted_raw_ostream &OS) {
|
||||
<< " }\\\n"
|
||||
<< " }\\\n"
|
||||
<< " }\\\n"
|
||||
- << " assert(0);\\\n"
|
||||
-
|
||||
+ << " assert(0 && \"bogosity detected in disassembler state "
|
||||
+ "machine!\");\\\n"
|
||||
#else
|
||||
OS << "template<typename InsnType>\n"
|
||||
<< "static DecodeStatus decodeInstruction(const uint8_t DecodeTable[], "
|
||||
@@ -2752,9 +2745,10 @@ void FixedLenDecoderEmitter::run(raw_ostream &o) {
|
||||
emitDecodeInstruction(OS);
|
||||
|
||||
#ifdef CAPSTONE
|
||||
- OS << "FieldFromInstruction(fieldFromInstruction, uint64_t)\n";
|
||||
- OS << "DecodeToMCInst(decodeToMCInst, fieldFromInstruction, uint64_t)\n";
|
||||
- OS << "DecodeInstruction(decodeInstruction, fieldFromInstruction, decodeToMCInst, uint64_t)\n";
|
||||
+ OS << "// For RISCV instruction is 32 bits.\n";
|
||||
+ OS << "FieldFromInstruction(fieldFromInstruction, uint32_t)\n";
|
||||
+ OS << "DecodeToMCInst(decodeToMCInst, fieldFromInstruction, uint32_t)\n";
|
||||
+ OS << "DecodeInstruction(decodeInstruction, fieldFromInstruction, decodeToMCInst, uint32_t)\n";
|
||||
#else
|
||||
OS << "\n} // End llvm namespace\n";
|
||||
#endif
|
||||
diff --git a/llvm/utils/TableGen/InstrInfoEmitter.cpp b/llvm/utils/TableGen/InstrInfoEmitter.cpp
|
||||
index 01605184f..e59dace24 100644
|
||||
--- a/llvm/utils/TableGen/InstrInfoEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/InstrInfoEmitter.cpp
|
||||
@@ -769,6 +769,7 @@ void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS) {
|
||||
#ifdef CAPSTONE
|
||||
std::string GetPublicName(const CodeGenInstruction *Inst) {
|
||||
std::string Name = Inst->TheDef->getName();
|
||||
+#if 0
|
||||
// Apply backward compatibility fixups.
|
||||
// BRNLE -> BNLER.
|
||||
if (Name.length() >= 5 && Name.substr(0, 5) == "BRAsm") {
|
||||
@@ -785,7 +786,7 @@ std::string GetPublicName(const CodeGenInstruction *Inst) {
|
||||
break;
|
||||
}
|
||||
Name = Name.substr(0, pos) + Name.substr(pos + 3);
|
||||
- }
|
||||
+ }f 0
|
||||
// CPSDRxx -> CPSDR.
|
||||
if (Name.length() >= 2) {
|
||||
std::string Suffix2 = Name.substr(Name.length() - 2, 2);
|
||||
@@ -794,7 +795,8 @@ std::string GetPublicName(const CodeGenInstruction *Inst) {
|
||||
Name = Name.substr(0, Name.length() - 2);
|
||||
}
|
||||
}
|
||||
- return "SYSZ_INS_" + Name;
|
||||
+#endif
|
||||
+ return "RISCV_INS_" + Name;
|
||||
}
|
||||
|
||||
std::string GetRegisterName(Record *Reg) {
|
||||
@@ -802,6 +804,7 @@ std::string GetRegisterName(Record *Reg) {
|
||||
for (char& c : Name) {
|
||||
c = toupper(c);
|
||||
}
|
||||
+#if 0
|
||||
// R0L, R0D -> R0.
|
||||
if (Name.length() >= 3 &&
|
||||
Name[Name.length() - 3] == 'R' &&
|
||||
@@ -809,7 +812,8 @@ std::string GetRegisterName(Record *Reg) {
|
||||
Name[Name.length() - 1] == 'D')) {
|
||||
Name = Name.substr(0, Name.length() - 3) + Name[Name.length() - 2];
|
||||
}
|
||||
- return "SYSZ_REG_" + Name;
|
||||
+#endif
|
||||
+ return "RISCV_REG_" + Name;
|
||||
}
|
||||
|
||||
std::string GetGroupName(Record *Pred) {
|
||||
@@ -817,10 +821,12 @@ std::string GetGroupName(Record *Pred) {
|
||||
for (char& c : Name) {
|
||||
c = toupper(c);
|
||||
}
|
||||
+#if 0
|
||||
if (Name.length() >= 7 && Name.substr(0, 7) == "FEATURE") {
|
||||
Name = Name.substr(7);
|
||||
}
|
||||
- return "SYSZ_GRP_" + Name;
|
||||
+#endif
|
||||
+ return "RISCV_GRP_" + Name;
|
||||
}
|
||||
|
||||
void EmitMappingInsn(RecordKeeper &RK, raw_ostream &OS) {
|
||||
diff --git a/llvm/utils/TableGen/RegisterInfoEmitter.cpp b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
|
||||
index 0df306680..cf9c352d7 100644
|
||||
--- a/llvm/utils/TableGen/RegisterInfoEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/RegisterInfoEmitter.cpp
|
||||
@@ -180,12 +180,20 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS,
|
||||
#endif
|
||||
}
|
||||
|
||||
-#ifndef CAPSTONE
|
||||
const std::vector<Record*> &RegAltNameIndices = Target.getRegAltNameIndices();
|
||||
// If the only definition is the default NoRegAltName, we don't need to
|
||||
// emit anything.
|
||||
if (RegAltNameIndices.size() > 1) {
|
||||
OS << "\n// Register alternate name indices\n\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ OS << "enum {\n";
|
||||
+ for (unsigned i = 0, e = RegAltNameIndices.size(); i != e; ++i)
|
||||
+ OS << " " << NAME_PREFIX RegAltNameIndices[i]->getName()
|
||||
+ << ",\t// " << i << "\n";
|
||||
+ OS << " " << NAME_PREFIX "NUM_TARGET_REG_ALT_NAMES = "
|
||||
+ << RegAltNameIndices.size() << "\n";
|
||||
+ OS << "};\n";
|
||||
+#else
|
||||
if (!Namespace.empty())
|
||||
OS << "namespace " << Namespace << " {\n";
|
||||
OS << "enum {\n";
|
||||
@@ -195,11 +203,19 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS,
|
||||
OS << "};\n";
|
||||
if (!Namespace.empty())
|
||||
OS << "} // end namespace " << Namespace << "\n\n";
|
||||
+#endif
|
||||
}
|
||||
|
||||
auto &SubRegIndices = Bank.getSubRegIndices();
|
||||
if (!SubRegIndices.empty()) {
|
||||
OS << "\n// Subregister indices\n\n";
|
||||
+#ifdef CAPSTONE
|
||||
+ OS << "enum {\n" << " " << NAME_PREFIX "NoSubRegister,\n";
|
||||
+ unsigned i = 0;
|
||||
+ for (const auto &Idx : SubRegIndices)
|
||||
+ OS << " " << NAME_PREFIX Idx.getName() << ",\t// " << ++i << "\n";
|
||||
+ OS << " " << NAME_PREFIX "NUM_TARGET_SUBREGS\n};\n";
|
||||
+#else
|
||||
std::string Namespace = SubRegIndices.front().getNamespace();
|
||||
if (!Namespace.empty())
|
||||
OS << "namespace " << Namespace << " {\n";
|
||||
@@ -210,8 +226,8 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS,
|
||||
OS << " NUM_TARGET_SUBREGS\n};\n";
|
||||
if (!Namespace.empty())
|
||||
OS << "} // end namespace " << Namespace << "\n\n";
|
||||
- }
|
||||
#endif
|
||||
+ }
|
||||
|
||||
#ifndef CAPSTONE
|
||||
OS << "} // end namespace llvm\n\n";
|
||||
diff --git a/llvm/utils/TableGen/TableGen.cpp b/llvm/utils/TableGen/TableGen.cpp
|
||||
index 9e2a868be..7ec93c0e0 100644
|
||||
--- a/llvm/utils/TableGen/TableGen.cpp
|
||||
+++ b/llvm/utils/TableGen/TableGen.cpp
|
||||
@@ -27,8 +27,10 @@ enum ActionType {
|
||||
GenEmitter,
|
||||
GenRegisterInfo,
|
||||
GenInstrInfo,
|
||||
+#ifdef CAPSTONE
|
||||
GenMappingInsn,
|
||||
GenInsnNameMaps,
|
||||
+#endif
|
||||
GenInstrDocs,
|
||||
GenAsmWriter,
|
||||
GenAsmMatcher,
|
||||
@@ -76,10 +78,12 @@ namespace {
|
||||
"Generate registers and register classes info"),
|
||||
clEnumValN(GenInstrInfo, "gen-instr-info",
|
||||
"Generate instruction descriptions"),
|
||||
+#ifdef CAPSTONE
|
||||
clEnumValN(GenMappingInsn, "gen-mapping-insn",
|
||||
""),
|
||||
clEnumValN(GenInsnNameMaps, "gen-insn-name-maps",
|
||||
""),
|
||||
+#endif
|
||||
clEnumValN(GenInstrDocs, "gen-instr-docs",
|
||||
"Generate instruction documentation"),
|
||||
clEnumValN(GenCallingConv, "gen-callingconv",
|
||||
@@ -160,12 +164,14 @@ bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
|
||||
case GenInstrInfo:
|
||||
EmitInstrInfo(Records, OS);
|
||||
break;
|
||||
+#ifdef CAPSTONE
|
||||
case GenMappingInsn:
|
||||
EmitMappingInsn(Records, OS);
|
||||
break;
|
||||
case GenInsnNameMaps:
|
||||
EmitInsnNameMaps(Records, OS);
|
||||
break;
|
||||
+#endif
|
||||
case GenInstrDocs:
|
||||
EmitInstrDocs(Records, OS);
|
||||
break;
|
||||
--
|
||||
2.20.1
|
||||
|
1602
thirdparty/capstone/contrib/riscv_update/0003-clear-old-patchs.patch
vendored
Normal file
1602
thirdparty/capstone/contrib/riscv_update/0003-clear-old-patchs.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5743
thirdparty/capstone/contrib/riscv_update/0004-fix-riscv-registerclass-array-of-genregisterinfo.patch
vendored
Normal file
5743
thirdparty/capstone/contrib/riscv_update/0004-fix-riscv-registerclass-array-of-genregisterinfo.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
5703
thirdparty/capstone/contrib/riscv_update/0005-fix-riscv-registerclass-array-of-genregisterinfo.patch
vendored
Normal file
5703
thirdparty/capstone/contrib/riscv_update/0005-fix-riscv-registerclass-array-of-genregisterinfo.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
32
thirdparty/capstone/contrib/riscv_update/0006-fix-output-TAB-for-riscv-capstone.patch
vendored
Normal file
32
thirdparty/capstone/contrib/riscv_update/0006-fix-output-TAB-for-riscv-capstone.patch
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
From 5adfa13945a8eb1a104db57b29d27ceba0a2d948 Mon Sep 17 00:00:00 2001
|
||||
From: fanfuqiang <feqin1023@gmail.com>
|
||||
Date: Sun, 3 Mar 2019 23:16:27 +0800
|
||||
Subject: [PATCH] fix output TAB for riscv capstone
|
||||
|
||||
---
|
||||
llvm/utils/TableGen/AsmWriterEmitter.cpp | 9 +--------
|
||||
1 file changed, 1 insertion(+), 8 deletions(-)
|
||||
|
||||
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
index ac82573fe..21630f4ce 100644
|
||||
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
@@ -435,14 +435,7 @@ void AsmWriterEmitter::EmitPrintInstruction(raw_ostream &O) {
|
||||
}
|
||||
|
||||
// Emit the initial tab character.
|
||||
-#ifdef CAPSTONE
|
||||
- O << "#ifndef CAPSTONE_DIET\n"
|
||||
- << " SStream_concat0(O, \"\\t\");\n"
|
||||
- << "#endif\n\n";
|
||||
-#else
|
||||
- O << " O << \"\\t\";\n\n";
|
||||
-#endif
|
||||
-
|
||||
+ //O << " O << \"\\t\";\n\n";
|
||||
O << " // Emit the opcode for the instruction.\n";
|
||||
O << BitsString;
|
||||
|
||||
--
|
||||
2.20.1
|
||||
|
32
thirdparty/capstone/contrib/riscv_update/0007-fix-riscv-alias-inst-output-useless-newline.patch
vendored
Normal file
32
thirdparty/capstone/contrib/riscv_update/0007-fix-riscv-alias-inst-output-useless-newline.patch
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
From 9028d6a0ce67296be48a3dae07d954ebe26942e1 Mon Sep 17 00:00:00 2001
|
||||
From: fanfuqiang <feqin1023@gmail.com>
|
||||
Date: Thu, 7 Mar 2019 00:08:08 +0800
|
||||
Subject: [PATCH] fix riscv alias inst output useless newline
|
||||
|
||||
---
|
||||
llvm/utils/TableGen/AsmWriterEmitter.cpp | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
index 21630f4ce..9db5f7f54 100644
|
||||
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
@@ -1191,14 +1191,13 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
O << " tmpString[I] = 0;\n";
|
||||
O << " SStream_concat0(OS, \"\\t\");\n";
|
||||
O << " SStream_concat0(OS, tmpString);\n";
|
||||
- O << " SStream_concat0(OS, \"\\n\");\n";
|
||||
#else
|
||||
O << " OS << '\\t' << StringRef(AsmString, I);\n";
|
||||
#endif
|
||||
O << " if (AsmString[I] != '\\0') {\n";
|
||||
O << " if (AsmString[I] == ' ' || AsmString[I] == '\\t') {\n";
|
||||
#ifdef CAPSTONE
|
||||
- O << " SStream_concat0(OS, \"\\t\");\n";
|
||||
+ O << " SStream_concat0(OS, \" \");\n";
|
||||
#else
|
||||
O << " OS << '\\t';\n";
|
||||
#endif
|
||||
--
|
||||
2.20.1
|
||||
|
24
thirdparty/capstone/contrib/riscv_update/0008-fix-riscv-inst-output-more-formal.patch
vendored
Normal file
24
thirdparty/capstone/contrib/riscv_update/0008-fix-riscv-inst-output-more-formal.patch
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
From 6830f128011a19e77e8c131cdfcf2f87fb78e316 Mon Sep 17 00:00:00 2001
|
||||
From: fanfuqiang <feqin1023@gmail.com>
|
||||
Date: Thu, 7 Mar 2019 00:31:51 +0800
|
||||
Subject: [PATCH] fix riscv inst output more formal
|
||||
|
||||
---
|
||||
llvm/utils/TableGen/AsmWriterEmitter.cpp | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
index 9db5f7f54..fff9f7677 100644
|
||||
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
@@ -1189,7 +1189,6 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
O << " ++I;\n";
|
||||
#ifdef CAPSTONE
|
||||
O << " tmpString[I] = 0;\n";
|
||||
- O << " SStream_concat0(OS, \"\\t\");\n";
|
||||
O << " SStream_concat0(OS, tmpString);\n";
|
||||
#else
|
||||
O << " OS << '\\t' << StringRef(AsmString, I);\n";
|
||||
--
|
||||
2.20.1
|
||||
|
@@ -0,0 +1,38 @@
|
||||
From b1a7abb285aaa1436d563a30f65813513a512850 Mon Sep 17 00:00:00 2001
|
||||
From: fanfuqiang <feqin1023@gmail.com>
|
||||
Date: Fri, 8 Mar 2019 11:09:54 +0800
|
||||
Subject: [PATCH] fix riscv asmwriter variable declaration place
|
||||
|
||||
---
|
||||
llvm/utils/TableGen/AsmWriterEmitter.cpp | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
index fff9f7677..90540000f 100644
|
||||
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
@@ -1170,6 +1170,8 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
O << HeaderO.str();
|
||||
O.indent(2) << "const char *AsmString;\n";
|
||||
#ifdef CAPSTONE
|
||||
+ O << " unsigned I = 0;\n";
|
||||
+ O << " char *tmpString;\n";
|
||||
O.indent(2) << "switch (MCInst_getOpcode(MI)) {\n";
|
||||
#else
|
||||
O.indent(2) << "switch (MI->getOpcode()) {\n";
|
||||
@@ -1180,9 +1182,11 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
|
||||
// Code that prints the alias, replacing the operands with the ones from the
|
||||
// MCInst.
|
||||
+#ifndef CAPSTONE
|
||||
O << " unsigned I = 0;\n";
|
||||
+#endif
|
||||
#ifdef CAPSTONE
|
||||
- O << " char *tmpString = cs_strdup(AsmString);\n";
|
||||
+ O << " tmpString = cs_strdup(AsmString);\n";
|
||||
#endif
|
||||
O << " while (AsmString[I] != ' ' && AsmString[I] != '\\t' &&\n";
|
||||
O << " AsmString[I] != '$' && AsmString[I] != '\\0')\n";
|
||||
--
|
||||
2.20.1
|
||||
|
24
thirdparty/capstone/contrib/riscv_update/0010-fix-riscvgenasmwiter.inc-memory-leak.patch
vendored
Normal file
24
thirdparty/capstone/contrib/riscv_update/0010-fix-riscvgenasmwiter.inc-memory-leak.patch
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
From 533ce514a7365932e9919be6e63c605d7edf655c Mon Sep 17 00:00:00 2001
|
||||
From: fanfuqiang <feqin1023@gmail.com>
|
||||
Date: Wed, 20 Mar 2019 12:26:19 +0800
|
||||
Subject: [PATCH] fix riscvgenasmwiter.inc memory leak
|
||||
|
||||
---
|
||||
llvm/utils/TableGen/AsmWriterEmitter.cpp | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
index 90540000f..bc32a494b 100644
|
||||
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
@@ -1194,6 +1194,7 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
#ifdef CAPSTONE
|
||||
O << " tmpString[I] = 0;\n";
|
||||
O << " SStream_concat0(OS, tmpString);\n";
|
||||
+ O << " cs_mem_free(tmpString);\n";
|
||||
#else
|
||||
O << " OS << '\\t' << StringRef(AsmString, I);\n";
|
||||
#endif
|
||||
--
|
||||
2.20.1
|
||||
|
@@ -0,0 +1,53 @@
|
||||
From 93d420c95c3cf1d6a369be1ca7f2333fdf670283 Mon Sep 17 00:00:00 2001
|
||||
From: fanfuqiang <feqin1023@gmail.com>
|
||||
Date: Wed, 20 Mar 2019 15:15:01 +0800
|
||||
Subject: [PATCH] using static array contain temp string for riscv asmwriter
|
||||
|
||||
---
|
||||
llvm/utils/TableGen/AsmWriterEmitter.cpp | 16 +++++++++++++---
|
||||
1 file changed, 13 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
index bc32a494b..8e2bd70c6 100644
|
||||
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
|
||||
@@ -1171,7 +1171,10 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
O.indent(2) << "const char *AsmString;\n";
|
||||
#ifdef CAPSTONE
|
||||
O << " unsigned I = 0;\n";
|
||||
- O << " char *tmpString;\n";
|
||||
+ O << "#define ASMSTRING_CONTAIN_SIZE 64\n";
|
||||
+ O << " unsigned AsmStringLen = 0;\n";
|
||||
+ O << " char tmpString_[ASMSTRING_CONTAIN_SIZE];\n";
|
||||
+ O << " char *tmpString = tmpString_;\n";
|
||||
O.indent(2) << "switch (MCInst_getOpcode(MI)) {\n";
|
||||
#else
|
||||
O.indent(2) << "switch (MI->getOpcode()) {\n";
|
||||
@@ -1186,7 +1189,11 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
O << " unsigned I = 0;\n";
|
||||
#endif
|
||||
#ifdef CAPSTONE
|
||||
- O << " tmpString = cs_strdup(AsmString);\n";
|
||||
+ O << " AsmStringLen = strlen(AsmString);\n";
|
||||
+ O << " if (ASMSTRING_CONTAIN_SIZE - 1 < AsmStringLen)\n";
|
||||
+ O << " tmpString = cs_strdup(AsmString);\n";
|
||||
+ O << " else\n";
|
||||
+ O << " tmpString = memcpy(tmpString, AsmString, 1 + AsmStringLen);\n\n";
|
||||
#endif
|
||||
O << " while (AsmString[I] != ' ' && AsmString[I] != '\\t' &&\n";
|
||||
O << " AsmString[I] != '$' && AsmString[I] != '\\0')\n";
|
||||
@@ -1194,7 +1201,10 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
|
||||
#ifdef CAPSTONE
|
||||
O << " tmpString[I] = 0;\n";
|
||||
O << " SStream_concat0(OS, tmpString);\n";
|
||||
- O << " cs_mem_free(tmpString);\n";
|
||||
+ O << " if (ASMSTRING_CONTAIN_SIZE - 1 < AsmStringLen)\n";
|
||||
+ O << " /* Free the possible cs_strdup() memory. PR#1424. */\n";
|
||||
+ O << " cs_mem_free(tmpString);\n";
|
||||
+ O << "#undef ASMSTRING_CONTAIN_SIZE\n\n";
|
||||
#else
|
||||
O << " OS << '\\t' << StringRef(AsmString, I);\n";
|
||||
#endif
|
||||
--
|
||||
2.20.1
|
||||
|
61
thirdparty/capstone/contrib/riscv_update/README.md
vendored
Normal file
61
thirdparty/capstone/contrib/riscv_update/README.md
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
# How to update RISCV tables.
|
||||
|
||||
* Checkout LLVM. Patches are tested on commit `b81d715c`.
|
||||
```
|
||||
git clone https://github.com/llvm/llvm-project.git
|
||||
git checkout b81d715c
|
||||
```
|
||||
* Apply patches from the current directory.
|
||||
* Run tablegen.
|
||||
```
|
||||
cd $LLVM
|
||||
mkdir build
|
||||
cd build
|
||||
cmake -DCMAKE_CXX_FLAGS=-DCAPSTONE -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD="RISCV" ..
|
||||
make RISCVCommonTableGen
|
||||
```
|
||||
* Copy `.inc` files.
|
||||
```
|
||||
cp arch/RISCV/RISCVGenInsnNameMaps.inc \
|
||||
arch/RISCV/RISCVGenInsnNameMaps.inc.old
|
||||
for inc in $(cd arch/RISCV && ls *.inc); do
|
||||
cp $LLVM/build/lib/Target/RISCV/$inc arch/RISCV/
|
||||
done
|
||||
```
|
||||
* Fixup `RISCVGenInsnNameMaps.inc`.
|
||||
```
|
||||
comm -1 -3 \
|
||||
<(grep RISCV_INS_ <arch/RISCV/RISCVGenInsnNameMaps.inc.old \
|
||||
| sort -u) \
|
||||
<(grep RISCV_INS_ <arch/RISCV/RISCVGenInsnNameMaps.inc \
|
||||
| sort -u) \
|
||||
>arch/RISCV/RISCVGenInsnNameMaps.inc.new
|
||||
cat arch/RISCV/RISCVGenInsnNameMaps.inc.old \
|
||||
arch/RISCV/RISCVGenInsnNameMaps.inc.new \
|
||||
>arch/RISCV/RISCVGenInsnNameMaps.inc
|
||||
```
|
||||
* Add new groups, insns, registers and formats.
|
||||
* `include/capstone/RISCV.h`
|
||||
* `enum RISCV_insn`:
|
||||
```
|
||||
comm -1 -3 \
|
||||
<(perl -ne 'if (/(RISCV_INS_.+),/) { print "\t$1,\n" }' \
|
||||
<include/capstone/RISCV.h | sort -u) \
|
||||
<(perl -ne 'if (/(RISCV_INS_.+),/) { print "\t$1,\n" }' \
|
||||
<arch/RISCV/RISCVMappingInsn.inc | sort -u)
|
||||
```
|
||||
* `enum RISCV_insn_group`:
|
||||
```
|
||||
perl -ne 'if (/(\{.RISCV_GRP_.*?\}),/) { print "\t$1,\n"; }' < \
|
||||
arch/RISCV/RISCVMappingInsn.inc | sort -u
|
||||
```
|
||||
* `arch/RISCV/RISCVDisassembler.c`
|
||||
* `arch/RISCV/RISCVInstPrinter.c`
|
||||
* `arch/RISCV/RISCVMCTargetDesc.c`
|
||||
* `arch/RISCV/RISCVMCTargetDesc.h`
|
||||
* `arch/RISCV/RISCVMapping.c`
|
||||
* `enum group_name_maps`:
|
||||
```
|
||||
perl -ne 'if (/(RISCV_GRP_(.*?)),/) { print "\t{ $1, \"" . lc($2) . "\" },\n"; }' \
|
||||
arch/RISCV/RISCVMappingInsn.inc | sort -u
|
||||
```
|
Reference in New Issue
Block a user