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 /code/tools/lcc/lib | |
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 'code/tools/lcc/lib')
-rw-r--r-- | code/tools/lcc/lib/assert.c | 15 | ||||
-rw-r--r-- | code/tools/lcc/lib/bbexit.c | 123 | ||||
-rw-r--r-- | code/tools/lcc/lib/yynull.c | 12 |
3 files changed, 150 insertions, 0 deletions
diff --git a/code/tools/lcc/lib/assert.c b/code/tools/lcc/lib/assert.c new file mode 100644 index 0000000..10958a8 --- /dev/null +++ b/code/tools/lcc/lib/assert.c @@ -0,0 +1,15 @@ +#include <stdio.h> +#include <stdlib.h> + + +int _assert(char *e, char *file, int line) { + fprintf(stderr, "assertion failed:"); + if (e) + fprintf(stderr, " %s", e); + if (file) + fprintf(stderr, " file %s", file); + fprintf(stderr, " line %d\n", line); + fflush(stderr); + abort(); + return 0; +} diff --git a/code/tools/lcc/lib/bbexit.c b/code/tools/lcc/lib/bbexit.c new file mode 100644 index 0000000..6dff067 --- /dev/null +++ b/code/tools/lcc/lib/bbexit.c @@ -0,0 +1,123 @@ +#include <stdio.h> +#include <stdlib.h> + + +struct callsite { + char *file, *name; + union coordinate { + struct { unsigned int index:6,x:10,y:16; } be; + struct { unsigned int y:16,x:10,index:6; } le; + unsigned int coord; + } u; +} *_caller; + +static struct _bbdata { + struct _bbdata *link; + unsigned npoints, *counts; + union coordinate *coords; + char **files; + struct func { + struct func *link; + struct caller { + struct caller *link; + struct callsite *caller; + unsigned count; + } *callers; + char *name; + union coordinate src; + } *funcs; +} tail, *_bblist = &tail; + +static void unpack(unsigned int coord, int *index, int *x, int *y) { + static union { int x; char endian; } little = { 1 }; + union coordinate u; + + u.coord = coord; + if (little.endian) { + *index = u.le.index; + *x = u.le.x; + *y = u.le.y; + } else { + *index = u.be.index; + *x = u.be.x; + *y = u.be.y; + } +} + +static void profout(struct _bbdata *p, FILE *fp) { + int i, index, x, y; + struct func *f; + struct caller *q; + + for (i = 0; p->files[i]; i++) + ; + fprintf(fp, "%d\n", i); + for (i = 0; p->files[i]; i++) + fprintf(fp, "%s\n", p->files[i]); + for (i = 0, f = p->funcs; f; i++, f = f->link) + if ((q = f->callers)) + for (i--; q; q = q->link) + i++; + fprintf(fp, "%d\n", i); + for (f = p->funcs; f; f = f->link) { + int n = 0; + for (q = f->callers; q; n += q->count, q = q->link) { + unpack(f->src.coord, &index, &x, &y); + fprintf(fp, "%s %d %d %d %d", f->name, index, x, y, q->count); + if (q->caller) { + unpack(q->caller->u.coord, &index, &x, &y); + fprintf(fp, " %s %s %d %d\n", q->caller->name, q->caller->file, x, y); + } else + fprintf(fp, " ? ? 0 0\n"); + } + if (n == 0) { + unpack(f->src.coord, &index, &x, &y); + fprintf(fp, "%s %d %d %d 0 ? ? 0 0\n", f->name, index, x, y); + } + } + fprintf(fp, "%d\n", p->npoints); + for (i = 0; i < p->npoints; i++) { + unpack(p->coords[i].coord, &index, &x, &y); + fprintf(fp, "%d %d %d %d\n", index, x, y, p->counts[i]); + } +} + +static void bbexit(void) { + FILE *fp; + + if (_bblist != &tail && (fp = fopen("prof.out", "a"))) { + for ( ; _bblist != &tail; _bblist = _bblist->link) + profout(_bblist, fp); + fclose(fp); + } +} + +void _epilogue(struct func *callee) { + _caller = 0; +} + +void _prologue(struct func *callee, struct _bbdata *yylink) { + static struct caller callers[4096]; + static int next; + struct caller *p; + + if (!yylink->link) { + yylink->link = _bblist; + _bblist = yylink; + if (next == 0) + atexit(bbexit); + } + for (p = callee->callers; p; p = p->link) + if (p->caller == _caller) { + p->count++; + break; + } + if (!p && next < sizeof callers/sizeof callers[0]) { + p = &callers[next++]; + p->caller = _caller; + p->count = 1; + p->link = callee->callers; + callee->callers = p; + } + _caller = 0; +} diff --git a/code/tools/lcc/lib/yynull.c b/code/tools/lcc/lib/yynull.c new file mode 100644 index 0000000..7dbc968 --- /dev/null +++ b/code/tools/lcc/lib/yynull.c @@ -0,0 +1,12 @@ +#include <stdio.h> +#include <stdlib.h> + + +void _YYnull(char *file, int line) { + fprintf(stderr, "null pointer dereferenced:"); + if (file) + fprintf(stderr, " file %s,", file); + fprintf(stderr, " line %d\n", line); + fflush(stderr); + abort(); +} |