diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2020-03-14 20:40:44 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2020-03-14 20:40:44 +0100 |
commit | 65ae9c7bb7a7ea65c6821d9c3da9520c9c3ffe6c (patch) | |
tree | e89af78c1b559bd215d32bc5cd8c7a5fd7eca6a1 | |
parent | caa171eb64d90d3428190dfaa76a45c111ded7e8 (diff) | |
download | compilertests-65ae9c7bb7a7ea65c6821d9c3da9520c9c3ffe6c.tar.gz compilertests-65ae9c7bb7a7ea65c6821d9c3da9520c9c3ffe6c.tar.bz2 |
check for undefined labels
-rw-r--r-- | ecomp-c/asm-i386.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/ecomp-c/asm-i386.c b/ecomp-c/asm-i386.c index 268ca2b..4bc13ea 100644 --- a/ecomp-c/asm-i386.c +++ b/ecomp-c/asm-i386.c @@ -480,12 +480,17 @@ static int LC = 0; typedef struct Symbol { char *name; + int defined; int addr; struct Symbol *next; } Symbol; struct Symbol *symbol = NULL; +enum { + ADDRESS_UNDEFINED = 0x7FFFFFFF +}; + static Symbol *get_symbol( char *name ) { Symbol *sym = symbol; @@ -512,7 +517,7 @@ static Symbol *insert_symbol( char *name ) sym = Allocate( sizeof( Symbol ) ); sym->name = Allocate( strlen( name ) + 1 ); strlcpy( sym->name, name, strlen( name ) + 1 ); - sym->addr = 0; + sym->addr = ADDRESS_UNDEFINED; sym->next = symbol; symbol = sym; @@ -559,7 +564,7 @@ static void parseLabel( void ) symbol = get_symbol( ident ); if( symbol != NULL ) { - if( symbol->addr == 0 ) { + if( symbol->addr == ADDRESS_UNDEFINED ) { symbol->addr = LC; } else { Abort( "label '%s' has already been defined", ident ); @@ -736,7 +741,7 @@ static OperandInfo *parseOperand( void ) operand_info = Allocate( sizeof( OperandInfo ) ); operand_info->next = NULL; - operand_info->addr = 0; + operand_info->addr = ADDRESS_UNDEFINED; if( sym == S_ident ) { /* op like eax or an address jmp x */ @@ -877,6 +882,14 @@ static void epilogue( void ) sym = symbol; while( sym != NULL ) { + if( sym->addr == ADDRESS_UNDEFINED ) { + Abort( "Undefined address for label '%s'", sym->name ); + } + sym = sym->next; + } + + sym = symbol; + while( sym != NULL ) { ptr = sym->next; free_symbol( sym ); sym = ptr; |