diff options
author | Chris Lattner <sabre@nondot.org> | 2002-09-17 23:03:30 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-09-17 23:03:30 +0000 |
commit | 633a5b1aacb135957b20e5f11e779ea23ccb9619 (patch) | |
tree | 3ddd35119d12cadf13e31f3cae9f67b057332440 /utils/Burg/item.c | |
parent | 24b70926d5750dacadc3252f8fbcc964b369e2af (diff) | |
download | external_llvm-633a5b1aacb135957b20e5f11e779ea23ccb9619.zip external_llvm-633a5b1aacb135957b20e5f11e779ea23ccb9619.tar.gz external_llvm-633a5b1aacb135957b20e5f11e779ea23ccb9619.tar.bz2 |
Initial checkin of burg files
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3785 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/Burg/item.c')
-rw-r--r-- | utils/Burg/item.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/utils/Burg/item.c b/utils/Burg/item.c new file mode 100644 index 0000000..4a9f4a3 --- /dev/null +++ b/utils/Burg/item.c @@ -0,0 +1,133 @@ +char rcsid_item[] = "$Id$"; + +#include "b.h" +#include <stdio.h> +#include <string.h> +#include "fe.h" + +static Item_Set fptr; + +ItemArray +newItemArray() +{ + ItemArray ia; + ia = (ItemArray) zalloc(max_nonterminal *sizeof(*ia)); + return ia; +} + +ItemArray +itemArrayCopy(src) ItemArray src; +{ + ItemArray dst; + + dst = newItemArray(); + memcpy(dst, src, max_nonterminal * sizeof(*dst)); + return dst; +} + +Item_Set +newItem_Set(relevant) Relevant relevant; +{ + Item_Set ts; + + if (fptr) { + ts = fptr; + fptr = 0; + memset(ts->virgin, 0, max_nonterminal * sizeof(struct item)); + if (ts->closed) { + zfree(ts->closed); + ts->closed = 0; + } + ts->num = 0; + ts->op = 0; + } else { + ts = (Item_Set) zalloc(sizeof(struct item_set)); + ts->virgin = newItemArray(); + } + ts->relevant = relevant; + return ts; +} + +void +freeItem_Set(ts) Item_Set ts; +{ + assert(!fptr); + fptr = ts; +} + +int +equivSet(a, b) Item_Set a; Item_Set b; +{ + register Relevant r; + register int nt; + register Item *aa = a->virgin; + register Item *ba = b->virgin; + + /* + return !bcmp(a->virgin, b->virgin, max_nonterminal * sizeof(Item)); + */ + + r = a->relevant ? a->relevant : b->relevant; + assert(r); + + if (a->op && b->op && a->op != b->op) { + return 0; + } + for (; (nt = *r) != 0; r++) { + if (aa[nt].rule != ba[nt].rule || !EQUALCOST(aa[nt].delta, ba[nt].delta)) { + return 0; + } + } + return 1; +} + +void +printRepresentative(f, s) FILE *f; Item_Set s; +{ + if (!s) { + return; + } + fprintf(f, "%s", s->op->name); + switch (s->op->arity) { + case 1: + fprintf(f, "("); + printRepresentative(f, s->kids[0]); + fprintf(f, ")"); + break; + case 2: + fprintf(f, "("); + printRepresentative(f, s->kids[0]); + fprintf(f, ", "); + printRepresentative(f, s->kids[1]); + fprintf(f, ")"); + break; + } +} + +void +dumpItem(t) Item *t; +{ + printf("[%s #%d]", t->rule->lhs->name, t->rule->num); + dumpCost(t->delta); +} + +void +dumpItem_Set(ts) Item_Set ts; +{ + int i; + + printf("Item_Set #%d: [", ts->num); + for (i = 1; i < max_nonterminal; i++) { + if (ts->virgin[i].rule) { + printf(" %d", i); + dumpCost(ts->virgin[i].delta); + } + } + printf(" ]\n"); +} + +void +dumpCost(dc) DeltaCost dc; +{ + printf("(%ld)", (long) dc); +} |