Pointer-ize the acc front end.

The ACC compiler used to be able to compile itself. This was a neat
feature, but because ACC only supports ints, pointers are stored as
ints, and cast to pointers when used.

This checkin turns many ints that are really pointers back into
pointers, so that the code is clearer.

 int ch;
 char* glo;
 char* sym_stack;
 char* dstk;
 char* dptr;
 int dch;
 char* last_id;
This commit is contained in:
Jack Palevich 2009-05-28 17:15:32 -07:00
parent 730c8d7c03
commit 653f42da92
1 changed files with 47 additions and 46 deletions

View File

@ -47,7 +47,7 @@ namespace acc {
class Compiler {
class CodeBuf {
char* ind;
char* ind; // Output code pointer
char* pProgramBase;
void release() {
@ -1027,20 +1027,21 @@ class Compiler {
size_t mPosition;
};
/* vars: value of variables
loc : local variable index
glo : global variable index
ind : output code ptr
rsym: return symbol
prog: output code
dstk: define stack
dptr, dch: macro state
*/
intptr_t tok, tokc, tokl, ch, vars, rsym, loc, glo, sym_stk, dstk,
dptr, dch, last_id;
int ch; // Current input character, or EOF
intptr_t tok; // token
intptr_t tokc; // token extra info
int tokl; // token operator level
intptr_t rsym; // return symbol
intptr_t loc; // local variable index
char* glo; // global variable index
char* sym_stk;
char* dstk; // Define stack
char* dptr; // Macro state: Points to macro text during macro playback.
int dch; // Macro state: Saves old value of ch during a macro playback.
char* last_id;
void* pSymbolBase;
void* pGlobalBase;
void* pVarsBase;
char* pVarsBase; // Value of variables
InputStream* file;
@ -1106,12 +1107,12 @@ class Compiler {
static const char operatorLevel[];
void pdef(int t) {
*(char *) dstk++ = t;
*dstk++ = t;
}
void inp() {
if (dptr) {
ch = *(char *) dptr++;
ch = *dptr++;
if (ch == TAG_MACRO) {
dptr = 0;
ch = dch;
@ -1145,7 +1146,7 @@ class Compiler {
next();
pdef(TAG_TOK); /* fill last ident tag */
*(int *) tok = SYM_DEFINE;
*(int *) (tok + 4) = dstk; /* define stack */
*(char* *) (tok + 4) = dstk; /* define stack */
}
/* well we always save the values ! */
while (ch != '\n') {
@ -1168,21 +1169,21 @@ class Compiler {
inp();
}
if (isdigit(tok)) {
tokc = strtol((char*) last_id, 0, 0);
tokc = strtol(last_id, 0, 0);
tok = TOK_NUM;
} else {
*(char *) dstk = TAG_TOK; /* no need to mark end of string (we
* dstk = TAG_TOK; /* no need to mark end of string (we
suppose data is initialized to zero by calloc) */
tok = (intptr_t) (strstr((char*) sym_stk, (char*) (last_id - 1))
tok = (intptr_t) (strstr(sym_stk, (last_id - 1))
- sym_stk);
*(char *) dstk = 0; /* mark real end of ident for dlsym() */
* dstk = 0; /* mark real end of ident for dlsym() */
tok = tok * 8 + TOK_IDENT;
if (tok > TOK_DEFINE) {
tok = vars + tok;
tok = (intptr_t) (pVarsBase + tok);
/* printf("tok=%s %x\n", last_id, tok); */
/* define handling */
if (*(int *) tok == SYM_DEFINE) {
dptr = *(int *) (tok + 4);
dptr = *(char* *) (tok + 4);
dch = ch;
inp();
next();
@ -1243,17 +1244,17 @@ class Compiler {
}
#if 0
{
int p;
char* p;
printf("tok=0x%x ", tok);
if (tok >= TOK_IDENT) {
printf("'");
if (tok> TOK_DEFINE)
p = sym_stk + 1 + (tok - vars - TOK_IDENT) / 8;
p = sym_stk + 1 + ((char*) tok - pVarsBase - TOK_IDENT) / 8;
else
p = sym_stk + 1 + (tok - TOK_IDENT) / 8;
while (*(char *)p != TAG_TOK && *(char *)p)
printf("%c", *(char *)p++);
while (*p != TAG_TOK && *p)
printf("%c", *p++);
printf("'\n");
} else if (tok == TOK_NUM) {
printf("%d\n", tokc);
@ -1284,19 +1285,20 @@ class Compiler {
/* l is one if '=' parsing wanted (quick hack) */
void unary(intptr_t l) {
intptr_t n, t, a, c;
intptr_t n, t, a;
int c;
t = 0;
n = 1; /* type of expression 0 = forward, 1 = value, other =
lvalue */
if (tok == '\"') {
pGen->li(glo);
pGen->li((int) glo);
while (ch != '\"') {
getq();
*(char *) glo++ = ch;
*glo++ = ch;
inp();
}
*(char *) glo = 0;
glo = (glo + 4) & -4; /* align heap */
*glo = 0;
glo = (char*) (((intptr_t) glo + 4) & -4); /* align heap */
inp();
next();
} else {
@ -1349,7 +1351,7 @@ class Compiler {
n = *(int *) t;
/* forward reference: try dlsym */
if (!n) {
n = (intptr_t) dlsym(RTLD_DEFAULT, (char*) last_id);
n = (intptr_t) dlsym(RTLD_DEFAULT, last_id);
}
if ((tok == '=') & l) {
/* assignment */
@ -1398,7 +1400,7 @@ class Compiler {
}
}
void sum(intptr_t l) {
void sum(int l) {
intptr_t t, n, a;
t = 0;
if (l-- == 1)
@ -1518,7 +1520,7 @@ class Compiler {
void decl(bool l) {
intptr_t a;
while ((tok == TOK_INT) | ((tok != -1) & (!l))) {
while ((tok == TOK_INT) | ((tok != EOF) & (!l))) {
if (tok == TOK_INT) {
next();
while (tok != ';') {
@ -1526,7 +1528,7 @@ class Compiler {
loc = loc + 4;
*(int *) tok = -loc;
} else {
*(int *) tok = glo;
*(int* *) tok = (int*) glo;
glo = glo + 4;
}
next();
@ -1565,7 +1567,7 @@ class Compiler {
void cleanup() {
if (sym_stk != 0) {
free((void*) sym_stk);
free(sym_stk);
sym_stk = 0;
}
if (pGlobalBase != 0) {
@ -1591,7 +1593,7 @@ class Compiler {
tokc = 0;
tokl = 0;
ch = 0;
vars = 0;
pVarsBase = 0;
rsym = 0;
loc = 0;
glo = 0;
@ -1664,14 +1666,13 @@ public:
}
pGen->init(&codeBuf);
file = new TextInputStream(text, textLength);
sym_stk = (intptr_t) calloc(1, ALLOC_SIZE);
dstk = (intptr_t) strcpy((char*) sym_stk,
sym_stk = (char*) calloc(1, ALLOC_SIZE);
dstk = strcpy(sym_stk,
" int if else while break return for define main ")
+ TOK_STR_SIZE;
pGlobalBase = calloc(1, ALLOC_SIZE);
glo = (intptr_t) pGlobalBase;
pVarsBase = calloc(1, ALLOC_SIZE);
vars = (intptr_t) pVarsBase;
glo = (char*) pGlobalBase;
pVarsBase = (char*) calloc(1, ALLOC_SIZE);
inp();
next();
decl(0);
@ -1681,7 +1682,7 @@ public:
int run(int argc, char** argv) {
typedef int (*mainPtr)(int argc, char** argv);
mainPtr aMain = (mainPtr) *(int*) (vars + TOK_MAIN);
mainPtr aMain = (mainPtr) *(int*) (pVarsBase + TOK_MAIN);
if (!aMain) {
fprintf(stderr, "Could not find function \"main\".\n");
return -1;
@ -1706,7 +1707,7 @@ public:
return NULL;
}
size_t nameLen = strlen(name);
char* pSym = (char*) sym_stk;
char* pSym = sym_stk;
char c;
for(;;) {
c = *pSym++;
@ -1716,12 +1717,12 @@ public:
if (c == TAG_TOK) {
if (memcmp(pSym, name, nameLen) == 0
&& pSym[nameLen] == TAG_TOK) {
int tok = pSym - 1 - (char*) sym_stk;
int tok = pSym - 1 - sym_stk;
tok = tok * 8 + TOK_IDENT;
if (tok <= TOK_DEFINE) {
return 0;
} else {
tok = vars + tok;
tok = (intptr_t) (pVarsBase + tok);
return * (void**) tok;
}
}