diff options
author | Nicolai Haehnle <nhaehnle@gmail.com> | 2018-03-05 15:21:15 +0000 |
---|---|---|
committer | Nicolai Haehnle <nhaehnle@gmail.com> | 2018-03-05 15:21:15 +0000 |
commit | 1faf8689d7f065e29b0440178385c60451cde13e (patch) | |
tree | bb09f151c8da2f0a5c5da30d82f611937b99f81e /llvm/lib/TableGen/TGParser.cpp | |
parent | b0cf9e93a68f224288d3fb029255c97d5c6fe5eb (diff) | |
download | bcm5719-llvm-1faf8689d7f065e29b0440178385c60451cde13e.tar.gz bcm5719-llvm-1faf8689d7f065e29b0440178385c60451cde13e.zip |
TableGen: Resolve all template args simultaneously in AddSubMultiClass
Summary:
Use the new resolver interface more explicitly, and avoid traversing
all the initializers multiple times.
Change-Id: Ia4dcc6d42dd8b65e6079d318c6a202f36f320fee
Reviewers: arsenm, craig.topper, tra, MartinO
Subscribers: wdng, llvm-commits
Differential Revision: https://reviews.llvm.org/D43653
llvm-svn: 326707
Diffstat (limited to 'llvm/lib/TableGen/TGParser.cpp')
-rw-r--r-- | llvm/lib/TableGen/TGParser.cpp | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp index 3c1f4f3ab6f..73a7e5cd6a7 100644 --- a/llvm/lib/TableGen/TGParser.cpp +++ b/llvm/lib/TableGen/TGParser.cpp @@ -252,6 +252,8 @@ bool TGParser::AddSubMultiClass(MultiClass *CurMC, // Loop over all of the template arguments, setting them to the specified // value or leaving them as the default if necessary. + MapResolver CurRecResolver(CurRec); + for (unsigned i = 0, e = SMCTArgs.size(); i != e; ++i) { if (i < SubMultiClass.TemplateArgs.size()) { // If a value is specified for this template arg, set it in the @@ -260,12 +262,6 @@ bool TGParser::AddSubMultiClass(MultiClass *CurMC, None, SubMultiClass.TemplateArgs[i])) return true; - // Resolve it next. - CurRec->resolveReferencesTo(CurRec->getValue(SMCTArgs[i])); - - // Now remove it. - CurRec->removeValue(SMCTArgs[i]); - // If a value is specified for this template arg, set it in the // new defs now. for (const auto &Def : @@ -273,12 +269,6 @@ bool TGParser::AddSubMultiClass(MultiClass *CurMC, if (SetValue(Def.get(), SubMultiClass.RefRange.Start, SMCTArgs[i], None, SubMultiClass.TemplateArgs[i])) return true; - - // Resolve it next. - Def->resolveReferencesTo(Def->getValue(SMCTArgs[i])); - - // Now remove it - Def->removeValue(SMCTArgs[i]); } } else if (!CurRec->getValue(SMCTArgs[i])->getValue()->isComplete()) { return Error(SubMultiClass.RefRange.Start, @@ -286,6 +276,24 @@ bool TGParser::AddSubMultiClass(MultiClass *CurMC, Twine(i) + " (" + SMCTArgs[i]->getAsUnquotedString() + ") of subclass '" + SMC->Rec.getNameInitAsString() + "'!"); } + + CurRecResolver.set(SMCTArgs[i], CurRec->getValue(SMCTArgs[i])->getValue()); + + CurRec->removeValue(SMCTArgs[i]); + } + + CurRec->resolveReferences(CurRecResolver); + + for (const auto &Def : + makeArrayRef(CurMC->DefPrototypes).slice(newDefStart)) { + MapResolver R(Def.get()); + + for (Init *SMCTArg : SMCTArgs) { + R.set(SMCTArg, Def->getValue(SMCTArg)->getValue()); + Def->removeValue(SMCTArg); + } + + Def->resolveReferences(R); } return false; |