From 04389a36925497a52bdc206ccd00b7fe1a988958 Mon Sep 17 00:00:00 2001 From: billow Date: Sun, 2 Apr 2023 23:45:21 +0800 Subject: [PATCH 1/4] refactor: Refactor `setPrinterParameters` function for broader coverage - Improve handling of `GPostfix` in `setPrinterParameters` function in `DecoderEmitter.cpp` - Update `setPrinterParameters` to handle more cases when setting `GPostfix` - Add `switch` statement to handle different cases when setting `GPostfix` based on output language - Remove unnecessary line setting `GPostfix` in `DecoderEmitter.cpp` --- llvm/utils/TableGen/DecoderEmitter.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/llvm/utils/TableGen/DecoderEmitter.cpp b/llvm/utils/TableGen/DecoderEmitter.cpp index d68258c98768..bc48369d21c2 100644 --- a/llvm/utils/TableGen/DecoderEmitter.cpp +++ b/llvm/utils/TableGen/DecoderEmitter.cpp @@ -2064,8 +2064,18 @@ static void setPrinterParameters(CodeGenTarget &Target, PrinterLanguage PL, } else { PredicateNamespace = Target.getName().str(); GPrefix = "if ("; - GPostfix = " == MCDisassembler::Fail)"; L = ""; + + switch (PL) { + default: + PrintFatalNote("DecoderEmitter does not support the given output language."); + case llvm::PRINTER_LANG_CPP: + GPostfix = " == MCDisassembler::Fail)"; + break; + case llvm::PRINTER_LANG_CAPSTONE_C: + GPostfix = " == MCDisassembler_Fail)"; + break; + } } ROK = "S"; From 94eba854a4c901eed4240362bd99296ebe846427 Mon Sep 17 00:00:00 2001 From: billow Date: Mon, 3 Apr 2023 17:04:48 +0800 Subject: [PATCH 2/4] refactor: Refactor instruction printing in TableGen. - Refactor PrinterCapstone.cpp to utilize a new normal mnemonic function for MatchableInfo objects - Replace hardcoded Mnemonic.upper() with new function call for readability --- llvm/utils/TableGen/PrinterCapstone.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/llvm/utils/TableGen/PrinterCapstone.cpp b/llvm/utils/TableGen/PrinterCapstone.cpp index 8421c7ea3623..786a36258dae 100644 --- a/llvm/utils/TableGen/PrinterCapstone.cpp +++ b/llvm/utils/TableGen/PrinterCapstone.cpp @@ -2309,11 +2309,22 @@ std::string getImplicitDefs(StringRef const &TargetName, return Flags; } +static inline std::string +getNormalMnemonic(std::unique_ptr const &MI, const bool upper = true) { + auto Mn = MI->Mnemonic.str(); + std::replace(Mn.begin(), Mn.end(), '.', '_'); + if (upper) { + std::transform(Mn.begin(), Mn.end(), Mn.begin(), + ::toupper); + } + return Mn; +} + std::string getReqFeatures(StringRef const &TargetName, std::unique_ptr const &MI, bool UseMI, CodeGenInstruction const *CGI) { std::string Flags = "{ "; - std::string Mn = MI->Mnemonic.upper(); + std::string Mn = getNormalMnemonic(MI); // The debug if if (CGI->isBranch && !CGI->isCall) { Flags += TargetName.str() + "_GRP_JUMP, "; @@ -2354,7 +2365,7 @@ void printInsnMapEntry(StringRef const &TargetName, InsnMap.indent(2) << getLLVMInstEnumName(TargetName, CGI) << " /* " << InsnNum << " */"; InsnMap << ", " << TargetName << "_INS_" - << (UseMI ? MI->Mnemonic.upper() : "INVALID") << ",\n"; + << (UseMI ? getNormalMnemonic(MI) : "INVALID") << ",\n"; InsnMap.indent(2) << "#ifndef CAPSTONE_DIET\n"; if (UseMI) { InsnMap.indent(4) << getImplicitUses(TargetName, CGI) << ", "; @@ -2536,7 +2547,7 @@ void printInsnOpMapEntry(CodeGenTarget const &Target, // Write the C struct of the Instruction operands. InsnOpMap << "{ /* " + LLVMEnum + " (" << InsnNum << ") - " + TargetName + "_INS_" + - (UseMI ? MI->Mnemonic.upper() : "INVALID") + " - " + + (UseMI ? getNormalMnemonic(MI) : "INVALID") + " - " + CGI->AsmString + " */\n"; InsnOpMap << " 0 \n"; InsnOpMap << "},\n"; @@ -2601,7 +2612,7 @@ void printInsnOpMapEntry(CodeGenTarget const &Target, // Write the C struct of the Instruction operands. InsnOpMap << "{ /* " + LLVMEnum + " (" << InsnNum << ") - " + TargetName + "_INS_" + - (UseMI ? MI->Mnemonic.upper() : "INVALID") + " - " + + (UseMI ? getNormalMnemonic(MI) : "INVALID") + " - " + CGI->AsmString + " */\n"; InsnOpMap << "{\n"; for (OpData const &OD : InsOps) { @@ -2618,7 +2629,8 @@ void printInsnNameMapEnumEntry(StringRef const &TargetName, raw_string_ostream &InsnNameMap, raw_string_ostream &InsnEnum) { static std::set MnemonicsSeen; - StringRef Mnemonic = MI->Mnemonic; + auto Mn = getNormalMnemonic(MI, false); + StringRef Mnemonic = Mn; if (MnemonicsSeen.find(Mnemonic) != MnemonicsSeen.end()) return; MnemonicsSeen.emplace(Mnemonic); From 40f12b66377c7efe91e19389455570cad2fb871a Mon Sep 17 00:00:00 2001 From: billow Date: Mon, 3 Apr 2023 20:50:15 +0800 Subject: [PATCH 3/4] Fix: Capstone printer code - Change type of `Mn` to `std::string` in [llvm/utils/TableGen/PrinterCapstone.cpp] - Use `mapped_iterator` to uppercase `Mnemonic` before assigning to `Mn` --- llvm/utils/TableGen/PrinterCapstone.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/llvm/utils/TableGen/PrinterCapstone.cpp b/llvm/utils/TableGen/PrinterCapstone.cpp index 786a36258dae..58c939a9737e 100644 --- a/llvm/utils/TableGen/PrinterCapstone.cpp +++ b/llvm/utils/TableGen/PrinterCapstone.cpp @@ -11,6 +11,8 @@ //===----------------------------------------------------------------------===// #include "Printer.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/CodeGen/ValueTypes.h" #include "llvm/MC/MCInst.h" #include "llvm/Support/FileSystem.h" @@ -2315,7 +2317,7 @@ getNormalMnemonic(std::unique_ptr const &MI, const bool upper = t std::replace(Mn.begin(), Mn.end(), '.', '_'); if (upper) { std::transform(Mn.begin(), Mn.end(), Mn.begin(), - ::toupper); + ::toupper); } return Mn; } @@ -2628,14 +2630,16 @@ void printInsnNameMapEnumEntry(StringRef const &TargetName, std::unique_ptr const &MI, raw_string_ostream &InsnNameMap, raw_string_ostream &InsnEnum) { - static std::set MnemonicsSeen; - auto Mn = getNormalMnemonic(MI, false); - StringRef Mnemonic = Mn; + static std::set MnemonicsSeen; + auto Mnemonic = getNormalMnemonic(MI, false); if (MnemonicsSeen.find(Mnemonic) != MnemonicsSeen.end()) return; MnemonicsSeen.emplace(Mnemonic); - std::string EnumName = TargetName.str() + "_INS_" + Mnemonic.upper(); + std::string Mn{mapped_iterator(Mnemonic.begin(), toUpper), + mapped_iterator(Mnemonic.end(), toUpper)}; + + std::string EnumName = TargetName.str() + "_INS_" + Mn; InsnNameMap.indent(2) << "\"" + Mnemonic + "\", // " + EnumName + "\n"; InsnEnum.indent(2) << EnumName + ",\n"; } From 18fa6cfd6a5cc1c5acfc430dee89fad64d6b2bf8 Mon Sep 17 00:00:00 2001 From: billow Date: Mon, 3 Apr 2023 23:21:16 +0800 Subject: [PATCH 4/4] Fix: capstone register enum code in LLVM TableGen printer - Replace ARM_REG_ENDING with TargetName_REG_ENDING in PrinterCapstone.cpp --- llvm/utils/TableGen/PrinterCapstone.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/utils/TableGen/PrinterCapstone.cpp b/llvm/utils/TableGen/PrinterCapstone.cpp index 58c939a9737e..bf4086d4833b 100644 --- a/llvm/utils/TableGen/PrinterCapstone.cpp +++ b/llvm/utils/TableGen/PrinterCapstone.cpp @@ -167,7 +167,8 @@ void PrinterCapstone::regInfoEmitEnums(CodeGenTarget const &Target, "Register enum value mismatch!"); OS << " NUM_TARGET_REGS // " << Registers.size() + 1 << "\n"; OS << "};\n"; - CSRegEnum << "\tARM_REG_ENDING, // " << Registers.size() + 1 << "\n"; + CSRegEnum << "\t" << TargetName << "_REG_ENDING, // " << Registers.size() + 1 << "\n"; + writeFile(TargetName + "GenCSRegEnum.inc", CSRegEnumStr); const auto &RegisterClasses = Bank.getRegClasses();