summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-03-14 20:40:44 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2020-03-14 20:40:44 +0100
commit65ae9c7bb7a7ea65c6821d9c3da9520c9c3ffe6c (patch)
treee89af78c1b559bd215d32bc5cd8c7a5fd7eca6a1
parentcaa171eb64d90d3428190dfaa76a45c111ded7e8 (diff)
downloadcompilertests-65ae9c7bb7a7ea65c6821d9c3da9520c9c3ffe6c.tar.gz
compilertests-65ae9c7bb7a7ea65c6821d9c3da9520c9c3ffe6c.tar.bz2
check for undefined labels
-rw-r--r--ecomp-c/asm-i386.c19
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;