From 4fd32c66481c107a4f32cbec0c3017d9c6154a93 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 30 Oct 2010 18:56:12 +0000 Subject: [PATCH] diagnose targets that define two alises with the same 'from' mnemonic with a useful error message instead of having tblgen explode with an assert. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117827 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/AsmMatcherEmitter.cpp | 35 ++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/utils/TableGen/AsmMatcherEmitter.cpp b/utils/TableGen/AsmMatcherEmitter.cpp index 93d3ac304ea..8cc766e4619 100644 --- a/utils/TableGen/AsmMatcherEmitter.cpp +++ b/utils/TableGen/AsmMatcherEmitter.cpp @@ -1524,14 +1524,39 @@ static bool EmitMnemonicAliases(raw_ostream &OS) { Records.getAllDerivedDefinitions("MnemonicAlias"); if (Aliases.empty()) return false; - std::vector Cases; + // Keep track of all the aliases from a mnemonic. Use an std::map so that the + // iteration order of the map is stable. + std::map > AliasesFromMnemonic; + for (unsigned i = 0, e = Aliases.size(); i != e; ++i) { Record *R = Aliases[i]; - Cases.push_back(std::make_pair(R->getValueAsString("FromMnemonic"), - "Mnemonic = \"" + - R->getValueAsString("ToMnemonic") + - "\"; return;")); + AliasesFromMnemonic[R->getValueAsString("FromMnemonic")].push_back(R); } + + // Process each alias a "from" mnemonic at a time, building the code executed + // by the string remapper. + std::vector Cases; + for (std::map >::iterator + I = AliasesFromMnemonic.begin(), E = AliasesFromMnemonic.end(); + I != E; ++I) { + const std::string &From = I->first; + const std::vector &ToVec = I->second; + + // If there is only one destination mnemonic, generate simple code. + if (ToVec.size() == 1) { + Cases.push_back(std::make_pair(From, "Mnemonic = \"" + + ToVec[0]->getValueAsString("ToMnemonic") + + "\"; return;")); + continue; + } + + // Otherwise, diagnose an error, can't have two aliases from the same + // mnemonic. + PrintError(ToVec[0]->getLoc(), "two MnemonicAliases with the same 'from' mnemonic!"); + PrintError(ToVec[1]->getLoc(), "this is the other MnemonicAliases."); + throw std::string("ERROR: Invalid MnemonicAliases definitions!"); + } + StringMatcher("Mnemonic", Cases, OS).Emit(); OS << "}\n";