summaryrefslogtreecommitdiffstats
path: root/llvm/lib/TableGen/TGParser.cpp
diff options
context:
space:
mode:
authorNicolai Haehnle <nhaehnle@gmail.com>2018-03-05 15:21:15 +0000
committerNicolai Haehnle <nhaehnle@gmail.com>2018-03-05 15:21:15 +0000
commit1faf8689d7f065e29b0440178385c60451cde13e (patch)
treebb09f151c8da2f0a5c5da30d82f611937b99f81e /llvm/lib/TableGen/TGParser.cpp
parentb0cf9e93a68f224288d3fb029255c97d5c6fe5eb (diff)
downloadbcm5719-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.cpp32
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;
OpenPOWER on IntegriCloud