summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-09-01 21:59:03 +0000
committerChris Lattner <sabre@nondot.org>2006-09-01 21:59:03 +0000
commit7717d0930ac4ef6eda81e9ae66cebef574daaadd (patch)
treefd07ab4297a42905d66b0bed1d393bc817f2b1f0 /utils
parentbf7744160594c939f858caa1f7744d25e1c4e0ee (diff)
downloadllvm-7717d0930ac4ef6eda81e9ae66cebef574daaadd.tar.gz
llvm-7717d0930ac4ef6eda81e9ae66cebef574daaadd.tar.bz2
llvm-7717d0930ac4ef6eda81e9ae66cebef574daaadd.tar.xz
fix an assertion with multidefs. Def inside of multiclasses don't need to
be complete. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30034 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/FileParser.cpp.cvs50
-rw-r--r--utils/TableGen/FileParser.y6
-rw-r--r--utils/TableGen/FileParser.y.cvs6
3 files changed, 37 insertions, 25 deletions
diff --git a/utils/TableGen/FileParser.cpp.cvs b/utils/TableGen/FileParser.cpp.cvs
index 97045c5ee4..945cd487ba 100644
--- a/utils/TableGen/FileParser.cpp.cvs
+++ b/utils/TableGen/FileParser.cpp.cvs
@@ -350,10 +350,10 @@ static const short yyrline[] = { 0,
458, 471, 487, 489, 489, 493, 495, 499, 502, 506,
523, 525, 531, 531, 532, 532, 534, 536, 540, 545,
550, 553, 557, 560, 565, 566, 566, 568, 568, 570,
- 577, 595, 620, 634, 639, 641, 643, 647, 656, 670,
- 673, 677, 688, 690, 692, 697, 697, 759, 759, 760,
- 760, 762, 767, 767, 770, 770, 773, 776, 780, 780,
- 782
+ 577, 595, 620, 634, 639, 641, 643, 647, 657, 671,
+ 674, 678, 689, 691, 693, 698, 698, 763, 763, 764,
+ 764, 766, 771, 771, 774, 774, 777, 780, 784, 784,
+ 786
};
#endif
@@ -1679,7 +1679,8 @@ case 77:
case 78:
#line 647 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
- yyvsp[0].Rec->resolveReferences();
+ if (CurMultiClass == 0) // Def's in multiclasses aren't really defs.
+ yyvsp[0].Rec->resolveReferences();
// If ObjectBody has template arguments, it's an error.
assert(yyvsp[0].Rec->getTemplateArgs().empty() && "How'd this get template args?");
@@ -1687,7 +1688,7 @@ case 78:
;
break;}
case 79:
-#line 656 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 657 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
yyval.Rec = yyvsp[0].Rec;
// Copy the template arguments for the multiclass into the def.
@@ -1701,20 +1702,20 @@ case 79:
;
break;}
case 80:
-#line 670 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 671 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
yyval.RecList = new std::vector<Record*>();
yyval.RecList->push_back(yyvsp[0].Rec);
;
break;}
case 81:
-#line 673 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 674 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
yyval.RecList->push_back(yyvsp[0].Rec);
;
break;}
case 82:
-#line 677 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 678 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
MultiClass *&MCE = MultiClasses[*yyvsp[0].StrVal];
if (MCE) {
@@ -1726,29 +1727,29 @@ case 82:
;
break;}
case 83:
-#line 688 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 689 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
ParsingTemplateArgs = true;
;
break;}
case 84:
-#line 690 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 691 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
ParsingTemplateArgs = false;
;
break;}
case 85:
-#line 692 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 693 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
CurMultiClass = 0;
;
break;}
case 86:
-#line 697 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 698 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ CurDefmPrefix = yyvsp[0].StrVal; ;
break;}
case 87:
-#line 697 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 698 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
// To instantiate a multiclass, we need to first get the multiclass, then
// instantiate each def contained in the multiclass with the SubClassRef
@@ -1804,6 +1805,9 @@ case 87:
exit(1);
}
Records.addDef(CurRec);
+
+ CurRec->resolveReferences();
+
CurRec = 0;
}
@@ -1812,42 +1816,42 @@ case 87:
;
break;}
case 88:
-#line 759 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 763 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
break;}
case 89:
-#line 759 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 763 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
break;}
case 92:
-#line 762 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 766 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
LetStack.back().push_back(LetRecord(*yyvsp[-3].StrVal, yyvsp[-2].BitList, yyvsp[0].Initializer));
delete yyvsp[-3].StrVal; delete yyvsp[-2].BitList;
;
break;}
case 95:
-#line 770 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 774 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ LetStack.push_back(std::vector<LetRecord>()); ;
break;}
case 97:
-#line 773 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 777 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
LetStack.pop_back();
;
break;}
case 98:
-#line 776 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 780 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
LetStack.pop_back();
;
break;}
case 99:
-#line 780 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 784 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
break;}
case 100:
-#line 780 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 784 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
break;}
}
@@ -2072,7 +2076,7 @@ yyerrhandle:
}
return 1;
}
-#line 784 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
+#line 788 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
int yyerror(const char *ErrorMsg) {
diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y
index 8ae2ef9ff1..0f0c4689e8 100644
--- a/utils/TableGen/FileParser.y
+++ b/utils/TableGen/FileParser.y
@@ -645,7 +645,8 @@ ClassInst : CLASS ClassName {
};
DefInst : DEF DefName ObjectBody {
- $3->resolveReferences();
+ if (CurMultiClass == 0) // Def's in multiclasses aren't really defs.
+ $3->resolveReferences();
// If ObjectBody has template arguments, it's an error.
assert($3->getTemplateArgs().empty() && "How'd this get template args?");
@@ -749,6 +750,9 @@ DefMInst : DEFM ID { CurDefmPrefix = $2; } ':' SubClassRef ';' {
exit(1);
}
Records.addDef(CurRec);
+
+ CurRec->resolveReferences();
+
CurRec = 0;
}
diff --git a/utils/TableGen/FileParser.y.cvs b/utils/TableGen/FileParser.y.cvs
index 8ae2ef9ff1..0f0c4689e8 100644
--- a/utils/TableGen/FileParser.y.cvs
+++ b/utils/TableGen/FileParser.y.cvs
@@ -645,7 +645,8 @@ ClassInst : CLASS ClassName {
};
DefInst : DEF DefName ObjectBody {
- $3->resolveReferences();
+ if (CurMultiClass == 0) // Def's in multiclasses aren't really defs.
+ $3->resolveReferences();
// If ObjectBody has template arguments, it's an error.
assert($3->getTemplateArgs().empty() && "How'd this get template args?");
@@ -749,6 +750,9 @@ DefMInst : DEFM ID { CurDefmPrefix = $2; } ':' SubClassRef ';' {
exit(1);
}
Records.addDef(CurRec);
+
+ CurRec->resolveReferences();
+
CurRec = 0;
}