blob: 4a9f4a320b6bdff22d0a8f0180a127cfbdafe777 [file] [log] [blame]
Chris Lattner633a5b12002-09-17 23:03:30 +00001char rcsid_item[] = "$Id$";
2
3#include "b.h"
4#include <stdio.h>
5#include <string.h>
6#include "fe.h"
7
8static Item_Set fptr;
9
10ItemArray
11newItemArray()
12{
13 ItemArray ia;
14 ia = (ItemArray) zalloc(max_nonterminal *sizeof(*ia));
15 return ia;
16}
17
18ItemArray
19itemArrayCopy(src) ItemArray src;
20{
21 ItemArray dst;
22
23 dst = newItemArray();
24 memcpy(dst, src, max_nonterminal * sizeof(*dst));
25 return dst;
26}
27
28Item_Set
29newItem_Set(relevant) Relevant relevant;
30{
31 Item_Set ts;
32
33 if (fptr) {
34 ts = fptr;
35 fptr = 0;
36 memset(ts->virgin, 0, max_nonterminal * sizeof(struct item));
37 if (ts->closed) {
38 zfree(ts->closed);
39 ts->closed = 0;
40 }
41 ts->num = 0;
42 ts->op = 0;
43 } else {
44 ts = (Item_Set) zalloc(sizeof(struct item_set));
45 ts->virgin = newItemArray();
46 }
47 ts->relevant = relevant;
48 return ts;
49}
50
51void
52freeItem_Set(ts) Item_Set ts;
53{
54 assert(!fptr);
55 fptr = ts;
56}
57
58int
59equivSet(a, b) Item_Set a; Item_Set b;
60{
61 register Relevant r;
62 register int nt;
63 register Item *aa = a->virgin;
64 register Item *ba = b->virgin;
65
66 /*
67 return !bcmp(a->virgin, b->virgin, max_nonterminal * sizeof(Item));
68 */
69
70 r = a->relevant ? a->relevant : b->relevant;
71 assert(r);
72
73 if (a->op && b->op && a->op != b->op) {
74 return 0;
75 }
76 for (; (nt = *r) != 0; r++) {
77 if (aa[nt].rule != ba[nt].rule || !EQUALCOST(aa[nt].delta, ba[nt].delta)) {
78 return 0;
79 }
80 }
81 return 1;
82}
83
84void
85printRepresentative(f, s) FILE *f; Item_Set s;
86{
87 if (!s) {
88 return;
89 }
90 fprintf(f, "%s", s->op->name);
91 switch (s->op->arity) {
92 case 1:
93 fprintf(f, "(");
94 printRepresentative(f, s->kids[0]);
95 fprintf(f, ")");
96 break;
97 case 2:
98 fprintf(f, "(");
99 printRepresentative(f, s->kids[0]);
100 fprintf(f, ", ");
101 printRepresentative(f, s->kids[1]);
102 fprintf(f, ")");
103 break;
104 }
105}
106
107void
108dumpItem(t) Item *t;
109{
110 printf("[%s #%d]", t->rule->lhs->name, t->rule->num);
111 dumpCost(t->delta);
112}
113
114void
115dumpItem_Set(ts) Item_Set ts;
116{
117 int i;
118
119 printf("Item_Set #%d: [", ts->num);
120 for (i = 1; i < max_nonterminal; i++) {
121 if (ts->virgin[i].rule) {
122 printf(" %d", i);
123 dumpCost(ts->virgin[i].delta);
124 }
125 }
126 printf(" ]\n");
127}
128
129void
130dumpCost(dc) DeltaCost dc;
131{
132 printf("(%ld)", (long) dc);
133}