From 3a37309073fb78342cb777ab9cf8bec4597b7326 Mon Sep 17 00:00:00 2001 From: ketmar Date: Fri, 16 Mar 2012 13:20:31 +0200 Subject: [PATCH] awasm, assembler: report unused labels --- asm/game/use/dynamite.awa | 2 +- asm/game/use/fan.awa | 2 +- asm/game/use/rocket.awa | 2 +- asm/game/utils.awa | 2 +- asm/game/walkcheck.awa | 2 +- src/awasm.c | 69 ++++++++++++++++++++++++++++------------------- 6 files changed, 47 insertions(+), 32 deletions(-) diff --git a/asm/game/use/dynamite.awa b/asm/game/use/dynamite.awa index 6650d09..d5ca490 100644 --- a/asm/game/use/dynamite.awa +++ b/asm/game/use/dynamite.awa @@ -44,6 +44,6 @@ locals: .dx, .t set activated, 1, [prof_item] set item_id, ITEM_DYNAMITE, [prof_item] set [prof_item], 0 -.quit: +;;;.quit: ret endp: game_use_dynamite diff --git a/asm/game/use/fan.awa b/asm/game/use/fan.awa index 50ad0cb..9994129 100644 --- a/asm/game/use/fan.awa +++ b/asm/game/use/fan.awa @@ -36,6 +36,6 @@ local: .t sus [prof_item] ; set [spr_num], PSPR_STANDING -.quit: +;;;.quit: ret endp: game_use_fan diff --git a/asm/game/use/rocket.awa b/asm/game/use/rocket.awa index 5e87781..e8f7342 100644 --- a/asm/game/use/rocket.awa +++ b/asm/game/use/rocket.awa @@ -57,6 +57,6 @@ deflvar: .dx, .t ; don't change to locals add [prof_dir] psh -666 msb 1 -.quit: +;;;.quit: ret endp: game_use_rocket diff --git a/asm/game/utils.awa b/asm/game/utils.awa index c54a507..ffc595c 100644 --- a/asm/game/utils.awa +++ b/asm/game/utils.awa @@ -83,7 +83,7 @@ prof_turn_to_dir: jeq .looking_to_player, [spr_num], PSPR_FACING jeq .looking_left, [spr_dir], DIR_LEFT ; -.looking_right: +;;;.looking_right: jeq .quit, [prof_dir], PDIR_RIGHT ; ok ; want to turn left bsr prof_turn_to_player diff --git a/asm/game/walkcheck.awa b/asm/game/walkcheck.awa index 357b847..84e0b21 100644 --- a/asm/game/walkcheck.awa +++ b/asm/game/walkcheck.awa @@ -45,6 +45,6 @@ locals: .x, .y sub [.y], 1 mgf [.x], [.y] jeq .can, FTILE_EMPTY -.cant: +;;;.cant: ret 0 endp: game_can_jump diff --git a/src/awasm.c b/src/awasm.c index 2c7a1fc..817b8c3 100644 --- a/src/awasm.c +++ b/src/awasm.c @@ -33,6 +33,15 @@ enum { }; +static const char *ltnames[] = { + "GVAR", + "TVAR", + "SVAR", + "CODE", + "CONST" +}; + + //////////////////////////////////////////////////////////////////////////////// #define MAX_TOKEN_LENGTH (256) @@ -124,10 +133,12 @@ static void closeFile (void) { if (ic->fname) free(ic->fname); free(ic); --incLevel; + /* if (ictx != NULL) { for (int f = 0; f < incLevel-1; ++f) fputc(' ', stderr); - //fprintf(stderr, "compiling: %s\n", ictx->fname); + fprintf(stderr, "compiling: %s\n", ictx->fname); } + */ } } @@ -348,7 +359,10 @@ typedef struct LabelInfo { int value; // code && <0: not defined yet (forward ref) int ext; // extern? int fixCount; - int *fixes; // 65535 + int *fixes; // 65536 + int refCount; + int *refs; // 65536 + int used; } LabelInfo; @@ -379,6 +393,7 @@ static void addLabelRef (LabelInfo *l, int pc) { static void fixupLabelRefs (LabelInfo *l, int pc) { if (l != NULL) { // code fixup + if (l->fixCount > 0) l->used = 1; l->value = pc; for (int f = 0; f < l->fixCount; ++f) { //fprintf(stderr, "[%s] FIXUP #%d: 0x%04x=0x%04x\n", l->name, f, l->fixes[f], pc); @@ -392,16 +407,17 @@ static void fixupLabelRefs (LabelInfo *l, int pc) { static void checkLabels (void) { for (LabelInfo *l = labels; l != NULL; l = l->next) { - if (l->type == LB_CODE && l->value < 0) fatal("undefined label: '%s'", l->name); + if (l->type == LB_CODE && l->value < 0) fatal("undefined %slabel: '%s'", l->used?"":"not referenced ", l->name); + if (!l->used) { l->used = -1; fprintf(stderr, "WARNING: unused %s label '%s'\n", ltnames[l->type], l->name); } } } static void freeLabels (void) { + checkLabels(); while (labels) { LabelInfo *l = labels; // - if (l->type == LB_CODE && l->value < 0) fatal("undefined label: '%s'", l->name); labels = l->next; if (l->fixes) free(l->fixes); free(l->name); @@ -411,21 +427,23 @@ static void freeLabels (void) { static void freeLocalLabels (int onlyVars) { - LabelInfo *p = NULL, *c = labels; + LabelInfo *p = NULL, *l = labels; // - while (c != NULL) { - LabelInfo *n = c->next; + while (l != NULL) { + LabelInfo *n = l->next; // - if ((!onlyVars || c->type != LB_CODE) && c->name[0] == '.') { - if (c->type == LB_CODE && c->value < 0) fatal("undefined label: '%s'", c->name); - if (c->fixes) free(c->fixes); - free(c->name); - free(c); + if ((!onlyVars || l->type != LB_CODE) && l->name[0] == '.') { + if (l->type == LB_CODE && l->value < 0) fatal("undefined %slabel: '%s'", l->used?"":"not referenced ", l->name); + if (!l->used) { l->used = -1; fprintf(stderr, "WARNING: unused %s label '%s'\n", ltnames[l->type], l->name); } + //if (l->type == LB_CODE && l->value < 0) fatal("undefined label: '%s'", l->name); + if (l->fixes) free(l->fixes); + free(l->name); + free(l); if (p != NULL) p->next = n; else labels = n; } else { - p = c; + p = l; } - c = n; + l = n; } } @@ -583,6 +601,7 @@ static void emitOperand (OperandInfo *op) { // variable if (op->l) { // from label + op->l->used = 1; switch (op->l->type) { case LB_GVAR: emitByte(op->l->value|0x80); break; case LB_TVAR: emitByte(op->l->value); break; @@ -596,9 +615,9 @@ static void emitOperand (OperandInfo *op) { } else { // from value switch (op->vartype) { - case 0: emitByte(op->value|0x80); break; - case 1: emitByte(op->value); break; - case 2: + case 0: emitByte(op->value|0x80); break; // global + case 1: emitByte(op->value); break; // tlocal + case 2: // stack emitByte(127); // special emitByte(op->value&0xff); emitByte((op->value>>8)&0xff); @@ -614,16 +633,10 @@ static void emitOperand (OperandInfo *op) { emitByte(255); // special if (op->l) { // from label - if (op->l->type == LB_CODE && op->l->value < 0) { - // undefined - addLabelRef(op->l, pc); - emitByte(0); - emitByte(0); - } else { - // defined - emitByte(op->l->value&0xff); - emitByte((op->l->value>>8)&0xff); - } + op->l->used = 1; + addLabelRef(op->l, pc); + emitByte(op->l->value&0xff); + emitByte((op->l->value>>8)&0xff); } else { // direct if (op->value < -32767 || op->value > 32767) fatal("invalid value"); @@ -1217,6 +1230,7 @@ static void parseDB (void) { // if (l == NULL) fatal("unknown label: '%s'", tstr); if (l->type == LB_CODE) fatal("bad label type: '%s'", l->name); + l->used = 1; tint = l->value; } else if (token != TK_NUM) { fatal("number expected"); @@ -1329,6 +1343,7 @@ static void parseDAscii (int zeroend) { // if (l == NULL) fatal("unknown label: '%s'", tstr); if (l->type == LB_CODE) fatal("bad label type: '%s'", l->name); + l->used = 1; tint = l->value; } else if (token != TK_NUM) { fatal("number expected"); -- 2.11.4.GIT