mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00:00
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
This commit is contained in:
parent
7fd4489de1
commit
4fd32c6648
@ -1524,14 +1524,39 @@ static bool EmitMnemonicAliases(raw_ostream &OS) {
|
||||
Records.getAllDerivedDefinitions("MnemonicAlias");
|
||||
if (Aliases.empty()) return false;
|
||||
|
||||
std::vector<StringMatcher::StringPair> 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<std::string, std::vector<Record*> > 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<StringMatcher::StringPair> Cases;
|
||||
for (std::map<std::string, std::vector<Record*> >::iterator
|
||||
I = AliasesFromMnemonic.begin(), E = AliasesFromMnemonic.end();
|
||||
I != E; ++I) {
|
||||
const std::string &From = I->first;
|
||||
const std::vector<Record*> &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";
|
||||
|
Loading…
Reference in New Issue
Block a user