diff options
author | tma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2005-10-04 15:18:22 +0000 |
---|---|---|
committer | tma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea> | 2005-10-04 15:18:22 +0000 |
commit | 1c7864f6d4380797b07c7149111066b61f69f689 (patch) | |
tree | 59057c26f97fdf846b0193e852eeea7e707a9e20 /lcc/src/symbolic.c | |
parent | 91db83f0cc7c564ff6c853eeb4e790732dae81cd (diff) | |
download | ioquake3-aero-1c7864f6d4380797b07c7149111066b61f69f689.tar.gz ioquake3-aero-1c7864f6d4380797b07c7149111066b61f69f689.zip |
* Moved lcc and q3asm into code/tools
git-svn-id: svn://svn.icculus.org/quake3/trunk@134 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'lcc/src/symbolic.c')
-rw-r--r-- | lcc/src/symbolic.c | 494 |
1 files changed, 0 insertions, 494 deletions
diff --git a/lcc/src/symbolic.c b/lcc/src/symbolic.c deleted file mode 100644 index affa67a..0000000 --- a/lcc/src/symbolic.c +++ /dev/null @@ -1,494 +0,0 @@ -#include <time.h> -#include <ctype.h> -#include "c.h" - -#define I(f) s_##f - -static Node *tail; -static int off, maxoff, uid = 0, verbose = 0, html = 0; - -static const char *yyBEGIN(const char *tag) { - if (html) - print("<%s>", tag); - return tag; -} - -static void yyEND(const char *tag) { - if (html) - print("</%s>", tag); - if (isupper(*tag)) - print("\n"); -} - -#define BEGIN(tag) do { const char *yytag=yyBEGIN(#tag); -#define END yyEND(yytag); } while (0) -#define ITEM BEGIN(li) -#define START BEGIN(LI) -#define ANCHOR(attr,code) do { const char *yytag="a"; if (html) { printf("<a " #attr "=\""); code; print("\">"); } -#define NEWLINE print(html ? "<br>\n" : "\n") - -static void emitCoord(Coordinate src) { - if (src.file && *src.file) { - ANCHOR(href,print("%s", src.file)); print("%s", src.file); END; - print(":"); - } - print("%d.%d", src.y, src.x); -} - -static void emitString(int len, const char *s) { - for ( ; len-- > 0; s++) - if (*s == '&' && html) - print("&"); - else if (*s == '<' && html) - print("<"); - else if (*s == '>' && html) - print("<"); - else if (*s == '"' || *s == '\\') - print("\\%c", *s); - else if (*s >= ' ' && *s < 0177) - print("%c", *s); - else - print("\\%d%d%d", (*s>>6)&3, (*s>>3)&7, *s&7); -} - -static void emitSymRef(Symbol p) { - (*IR->defsymbol)(p); - ANCHOR(href,print("#%s", p->x.name)); BEGIN(code); print("%s", p->name); END; END; -} - -static void emitSymbol(Symbol p) { - (*IR->defsymbol)(p); - ANCHOR(name,print("%s", p->x.name)); BEGIN(code); print("%s", p->name); END; END; - BEGIN(ul); -#define xx(field,code) ITEM; if (!html) print(" "); print(#field "="); code; END - if (verbose && (src.y || src.x)) - xx(src,emitCoord(p->src)); - xx(type,print("%t", p->type)); - xx(sclass,print("%k", p->sclass)); - switch (p->scope) { - case CONSTANTS: xx(scope,print("CONSTANTS")); break; - case LABELS: xx(scope,print("LABELS")); break; - case GLOBAL: xx(scope,print("GLOBAL")); break; - case PARAM: xx(scope,print("PARAM")); break; - case LOCAL: xx(scope,print("LOCAL")); break; - default: - if (p->scope > LOCAL) - xx(scope,print("LOCAL+%d", p->scope-LOCAL)); - else - xx(scope,print("%d", p->scope)); - } - if (p->scope >= PARAM && p->sclass != STATIC) - xx(offset,print("%d", p->x.offset)); - xx(ref,print("%f", p->ref)); - if (p->temporary && p->u.t.cse) - xx(u.t.cse,print("%p", p->u.t.cse)); - END; -#undef xx -} - -/* address - initialize q for addressing expression p+n */ -static void I(address)(Symbol q, Symbol p, long n) { - q->name = stringf("%s%s%D", p->name, n > 0 ? "+" : "", n); - (*IR->defsymbol)(q); - START; print("address "); emitSymbol(q); END; -} - -/* blockbeg - start a block */ -static void I(blockbeg)(Env *e) { - e->offset = off; - START; print("blockbeg off=%d", off); END; -} - -/* blockend - start a block */ -static void I(blockend)(Env *e) { - if (off > maxoff) - maxoff = off; - START; print("blockend off=%d", off); END; - off = e->offset; -} - -/* defaddress - initialize an address */ -static void I(defaddress)(Symbol p){ - START; print("defaddress "); emitSymRef(p); END; -} - -/* defconst - define a constant */ -static void I(defconst)(int suffix, int size, Value v) { - START; - print("defconst "); - switch (suffix) { - case I: - print("int.%d ", size); - BEGIN(code); - if (size > sizeof (int)) - print("%D", v.i); - else - print("%d", (int)v.i); - END; - break; - case U: - print("unsigned.%d ", size); - BEGIN(code); - if (size > sizeof (unsigned)) - print("%U", v.u); - else - print("%u", (unsigned)v.u); - END; - break; - case P: print("void*.%d ", size); BEGIN(code); print("%p", v.p); END; break; - case F: print("float.%d ", size); BEGIN(code); print("%g", (double)v.d); END; break; - default: assert(0); - } - END; -} - -/* defstring - emit a string constant */ -static void I(defstring)(int len, char *s) { - START; print("defstring "); - BEGIN(code); print("\""); emitString(len, s); print("\""); END; - END; -} - -/* defsymbol - define a symbol: initialize p->x */ -static void I(defsymbol)(Symbol p) { - if (p->x.name == NULL) - p->x.name = stringd(++uid); -} - -/* emit - emit the dags on list p */ -static void I(emit)(Node p){ - ITEM; - if (!html) - print(" "); - for (; p; p = p->x.next) { - if (p->op == LABEL+V) { - assert(p->syms[0]); - ANCHOR(name,print("%s", p->syms[0]->x.name)); - BEGIN(code); print("%s", p->syms[0]->name); END; - END; - print(":"); - } else { - int i; - if (p->x.listed) { - BEGIN(strong); print("%d", p->x.inst); END; print("'"); - print(" %s", opname(p->op)); - } else - print("%d. %s", p->x.inst, opname(p->op)); - if (p->count > 1) - print(" count=%d", p->count); - for (i = 0; i < NELEMS(p->kids) && p->kids[i]; i++) - print(" #%d", p->kids[i]->x.inst); - if (generic(p->op) == CALL && p->syms[0] && p->syms[0]->type) - print(" {%t}", p->syms[0]->type); - else - for (i = 0; i < NELEMS(p->syms) && p->syms[i]; i++) { - print(" "); - if (p->syms[i]->scope == CONSTANTS) - print(p->syms[i]->name); - else - emitSymRef(p->syms[i]); - } - } - NEWLINE; - } - END; -} - -/* export - announce p as exported */ -static void I(export)(Symbol p) { - START; print("export "); emitSymRef(p); END; -} - -/* function - generate code for a function */ -static void I(function)(Symbol f, Symbol caller[], Symbol callee[], int ncalls) { - int i; - - (*IR->defsymbol)(f); - off = 0; - for (i = 0; caller[i] && callee[i]; i++) { - off = roundup(off, caller[i]->type->align); - caller[i]->x.offset = callee[i]->x.offset = off; - off += caller[i]->type->size; - } - if (!html) { - print("function "); - emitSymbol(f); - print(" ncalls=%d\n", ncalls); - for (i = 0; caller[i]; i++) - START; print("caller "); emitSymbol(caller[i]); END; - for (i = 0; callee[i]; i++) - START; print("callee "); emitSymbol(callee[i]); END; - } else { - START; - print("function"); - BEGIN(UL); -#define xx(field,code) ITEM; print(#field "="); code; END - xx(f,emitSymbol(f)); - xx(ncalls,print("%d", ncalls)); - if (caller[0]) { - ITEM; print("caller"); BEGIN(OL); - for (i = 0; caller[i]; i++) - ITEM; emitSymbol(caller[i]); END; - END; END; - ITEM; print("callee"); BEGIN(OL); - for (i = 0; callee[i]; i++) - ITEM; emitSymbol(callee[i]); END; - END; END; - } else { - xx(caller,BEGIN(em); print("empty"); END); - xx(callee,BEGIN(em); print("empty"); END); - } - END; - END; - } - maxoff = off = 0; - gencode(caller, callee); - if (html) - START; print("emitcode"); BEGIN(ul); emitcode(); END; END; - else - emitcode(); - START; print("maxoff=%d", maxoff); END; -#undef xx -} - -/* visit - generate code for *p */ -static int visit(Node p, int n) { - if (p && p->x.inst == 0) { - p->x.inst = ++n; - n = visit(p->kids[0], n); - n = visit(p->kids[1], n); - *tail = p; - tail = &p->x.next; - } - return n; -} - -/* gen0 - generate code for the dags on list p */ -static Node I(gen)(Node p) { - int n; - Node nodelist; - - tail = &nodelist; - for (n = 0; p; p = p->link) { - switch (generic(p->op)) { /* check for valid forest */ - case CALL: - assert(IR->wants_dag || p->count == 0); - break; - case ARG: - case ASGN: case JUMP: case LABEL: case RET: - case EQ: case GE: case GT: case LE: case LT: case NE: - assert(p->count == 0); - break; - case INDIR: - assert(IR->wants_dag && p->count > 0); - break; - default: - assert(0); - } - check(p); - p->x.listed = 1; - n = visit(p, n); - } - *tail = 0; - return nodelist; -} - -/* global - announce a global */ -static void I(global)(Symbol p) { - START; print("global "); emitSymbol(p); END; -} - -/* import - import a symbol */ -static void I(import)(Symbol p) { - START; print("import "); emitSymRef(p); END; -} - -/* local - local variable */ -static void I(local)(Symbol p) { - if (p->temporary) - p->name = stringf("t%s", p->name); - (*IR->defsymbol)(p); - off = roundup(off, p->type->align); - p->x.offset = off; - off += p->type->size; - START; print(p->temporary ? "temporary " : "local "); emitSymbol(p); END; -} - -/* progbeg - beginning of program */ -static void I(progbeg)(int argc, char *argv[]) { - int i; - - for (i = 1; i < argc; i++) - if (strcmp(argv[i], "-v") == 0) - verbose++; - else if (strcmp(argv[i], "-html") == 0) - html++; - if (html) { - print("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n"); - print("<html>"); - BEGIN(head); - if (firstfile && *firstfile) - BEGIN(title); emitString(strlen(firstfile), firstfile); END; - print("<link rev=made href=\"mailto:drh@microsoft.com\">\n"); - END; - print("<body>\n"); - if (firstfile && *firstfile) - BEGIN(h1); emitString(strlen(firstfile), firstfile); END; - BEGIN(P); BEGIN(em); - print("Links lead from uses of identifiers and labels to their definitions."); - END; END; - print("<ul>\n"); - START; - print("progbeg"); - BEGIN(ol); - for (i = 1; i < argc; i++) { - ITEM; - BEGIN(code); print("\""); emitString(strlen(argv[i]), argv[i]); print("\""); END; - END; - } - END; - END; - } -} - -/* progend - end of program */ -static void I(progend)(void) { - START; print("progend"); END; - if (html) { - time_t t; - print("</ul>\n"); - time(&t); - print("<hr><address>%s</address>\n", ctime(&t)); - print("</body></html>\n"); - } -} - -/* segment - switch to segment s */ -static void I(segment)(int s) { - START; print("segment %s", &"text\0bss\0.data\0lit\0.sym\0."[5*s-5]); END; -} - -/* space - initialize n bytes of space */ -static void I(space)(int n) { - START; print("space %d", n); END; -} - -static void I(stabblock)(int brace, int lev, Symbol *p) {} - -/* stabend - finalize stab output */ -static void I(stabend)(Coordinate *cp, Symbol p, Coordinate **cpp, Symbol *sp, Symbol *stab) { - int i; - - if (p) - emitSymRef(p); - print("\n"); - if (cpp && sp) - for (i = 0; cpp[i] && sp[i]; i++) { - print("%w.%d: ", cpp[i], cpp[i]->x); - emitSymRef(sp[i]); - print("\n"); - } -} - -static void I(stabfend)(Symbol p, int lineno) {} -static void I(stabinit)(char *file, int argc, char *argv[]) {} - -/* stabline - emit line number information for source coordinate *cp */ -static void I(stabline)(Coordinate *cp) { - if (cp->file) - print("%s:", cp->file); - print("%d.%d:\n", cp->y, cp->x); -} - -static void I(stabsym)(Symbol p) {} -static void I(stabtype)(Symbol p) {} - -Interface symbolicIR = { - {1, 1, 0}, /* char */ - {2, 2, 0}, /* short */ - {4, 4, 0}, /* int */ - {4, 4, 0}, /* long */ - {4, 4, 0}, /* long long */ - {4, 4, 1}, /* float */ - {8, 8, 1}, /* double */ - {8, 8, 1}, /* long double */ - {4, 4, 0}, /* T* */ - {0, 4, 0}, /* struct */ - 0, /* little_endian */ - 0, /* mulops_calls */ - 0, /* wants_callb */ - 1, /* wants_argb */ - 1, /* left_to_right */ - 1, /* wants_dag */ - 0, /* unsigned_char */ - I(address), - I(blockbeg), - I(blockend), - I(defaddress), - I(defconst), - I(defstring), - I(defsymbol), - I(emit), - I(export), - I(function), - I(gen), - I(global), - I(import), - I(local), - I(progbeg), - I(progend), - I(segment), - I(space), - I(stabblock), - I(stabend), - I(stabfend), - I(stabinit), - I(stabline), - I(stabsym), - I(stabtype) -}; - -Interface symbolic64IR = { - {1, 1, 0}, /* char */ - {2, 2, 0}, /* short */ - {4, 4, 0}, /* int */ - {8, 8, 0}, /* long */ - {8, 8, 0}, /* long long */ - {4, 4, 1}, /* float */ - {8, 8, 1}, /* double */ - {8, 8, 1}, /* long double */ - {8, 8, 0}, /* T* */ - {0, 1, 0}, /* struct */ - 1, /* little_endian */ - 0, /* mulops_calls */ - 0, /* wants_callb */ - 1, /* wants_argb */ - 1, /* left_to_right */ - 1, /* wants_dag */ - 0, /* unsigned_char */ - I(address), - I(blockbeg), - I(blockend), - I(defaddress), - I(defconst), - I(defstring), - I(defsymbol), - I(emit), - I(export), - I(function), - I(gen), - I(global), - I(import), - I(local), - I(progbeg), - I(progend), - I(segment), - I(space), - I(stabblock), - I(stabend), - I(stabfend), - I(stabinit), - I(stabline), - I(stabsym), - I(stabtype) -}; |