summaryrefslogtreecommitdiffstats
path: root/llvm/utils/TableGen
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2017-10-26 06:46:41 +0000
committerCraig Topper <craig.topper@intel.com>2017-10-26 06:46:41 +0000
commit0551556ed2cbf35d4db2b424ad013dcf29570b5c (patch)
tree8ca6bbac3303c58d88ea99e10d7eddaffc120814 /llvm/utils/TableGen
parent2a06028c0a407c7dd2134060993770f50e299401 (diff)
downloadbcm5719-llvm-0551556ed2cbf35d4db2b424ad013dcf29570b5c.tar.gz
bcm5719-llvm-0551556ed2cbf35d4db2b424ad013dcf29570b5c.zip
[AsmParser][TableGen] Add VariantID argument to the generated mnemonic spell check function so it can use the correct table based on variant.
I'm considering implementing the mnemonic spell checker for x86, and that would require the separate intel and att variants. llvm-svn: 316641
Diffstat (limited to 'llvm/utils/TableGen')
-rw-r--r--llvm/utils/TableGen/AsmMatcherEmitter.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/llvm/utils/TableGen/AsmMatcherEmitter.cpp b/llvm/utils/TableGen/AsmMatcherEmitter.cpp
index 073513a2fe9..d279e8c3ae9 100644
--- a/llvm/utils/TableGen/AsmMatcherEmitter.cpp
+++ b/llvm/utils/TableGen/AsmMatcherEmitter.cpp
@@ -2824,16 +2824,26 @@ static void emitCustomOperandParsing(raw_ostream &OS, CodeGenTarget &Target,
static void emitMnemonicSpellChecker(raw_ostream &OS, CodeGenTarget &Target,
unsigned VariantCount) {
OS << "static std::string " << Target.getName()
- << "MnemonicSpellCheck(StringRef S, uint64_t FBS) {\n";
+ << "MnemonicSpellCheck(StringRef S, uint64_t FBS, unsigned VariantID) {\n";
if (!VariantCount)
OS << " return \"\";";
else {
OS << " const unsigned MaxEditDist = 2;\n";
OS << " std::vector<StringRef> Candidates;\n";
- OS << " StringRef Prev = \"\";\n";
- OS << " auto End = std::end(MatchTable0);\n";
- OS << "\n";
- OS << " for (auto I = std::begin(MatchTable0); I < End; I++) {\n";
+ OS << " StringRef Prev = \"\";\n\n";
+
+ OS << " // Find the appropriate table for this asm variant.\n";
+ OS << " const MatchEntry *Start, *End;\n";
+ OS << " switch (VariantID) {\n";
+ OS << " default: llvm_unreachable(\"invalid variant!\");\n";
+ for (unsigned VC = 0; VC != VariantCount; ++VC) {
+ Record *AsmVariant = Target.getAsmParserVariant(VC);
+ int AsmVariantNo = AsmVariant->getValueAsInt("Variant");
+ OS << " case " << AsmVariantNo << ": Start = std::begin(MatchTable" << VC
+ << "); End = std::end(MatchTable" << VC << "); break;\n";
+ }
+ OS << " }\n\n";
+ OS << " for (auto I = Start; I < End; I++) {\n";
OS << " // Ignore unsupported instructions.\n";
OS << " if ((FBS & I->RequiredFeatures) != I->RequiredFeatures)\n";
OS << " continue;\n";
OpenPOWER on IntegriCloud