diff options
author | Nicolai Haehnle <nhaehnle@gmail.com> | 2018-03-14 11:00:48 +0000 |
---|---|---|
committer | Nicolai Haehnle <nhaehnle@gmail.com> | 2018-03-14 11:00:48 +0000 |
commit | b61c26e6140caa8ba4d2e2329dcbdb18333f47a6 (patch) | |
tree | 481c75ab6f5284b5c2fd1718afa51cd4e16b7f76 | |
parent | 77841b159abd5767fec6d26223420ec6d99c617d (diff) | |
download | bcm5719-llvm-b61c26e6140caa8ba4d2e2329dcbdb18333f47a6.tar.gz bcm5719-llvm-b61c26e6140caa8ba4d2e2329dcbdb18333f47a6.zip |
TableGen: Allow dag operators to be resolved late
Change-Id: I51bb80fd5c48c8ac441ab11e43d43c1b91b4b590
Differential revision: https://reviews.llvm.org/D44113
llvm-svn: 327495
-rw-r--r-- | llvm/lib/TableGen/Record.cpp | 9 | ||||
-rw-r--r-- | llvm/test/TableGen/dag-functional.td | 17 |
2 files changed, 22 insertions, 4 deletions
diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp index 48197f04d11..e9325decfac 100644 --- a/llvm/lib/TableGen/Record.cpp +++ b/llvm/lib/TableGen/Record.cpp @@ -859,8 +859,13 @@ Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { if (LHSs && RHSs) { DefInit *LOp = dyn_cast<DefInit>(LHSs->getOperator()); DefInit *ROp = dyn_cast<DefInit>(RHSs->getOperator()); - if (!LOp || !ROp || LOp->getDef() != ROp->getDef()) - PrintFatalError("Concated Dag operators do not match!"); + if (!LOp || !ROp) + break; + if (LOp->getDef() != ROp->getDef()) { + PrintFatalError(Twine("Concatenated Dag operators do not match: '") + + LHSs->getAsString() + "' vs. '" + RHSs->getAsString() + + "'"); + } SmallVector<Init*, 8> Args; SmallVector<StringInit*, 8> ArgNames; for (unsigned i = 0, e = LHSs->getNumArgs(); i != e; ++i) { diff --git a/llvm/test/TableGen/dag-functional.td b/llvm/test/TableGen/dag-functional.td index dc1c37c8eca..6baee695ddd 100644 --- a/llvm/test/TableGen/dag-functional.td +++ b/llvm/test/TableGen/dag-functional.td @@ -40,7 +40,13 @@ // CHECK: dag d1 = (ops 1, ?:$name1, 2, 3); // CHECK: } -def ops; +// CHECK: def E0 { +// CHECK: dag ret = (ops 1, 2); +// CHECK: } + +class Ops; + +def ops : Ops; class Node<int val, string name> { int Val = val; @@ -100,4 +106,11 @@ def C0 : C<[1, 2], ["a", "b"]>; def D { dag d1 = !con((ops 1), (ops $name1), (ops), (ops 2, 3)); -}
\ No newline at end of file +} + +class E<Ops op> { + // Allow concatenation of DAG nodes with operators from template arguments. + dag ret = !con((op 1), (op 2)); +} + +def E0 : E<ops>; |