diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2020-05-10 21:09:37 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2020-05-10 21:09:37 +0200 |
commit | 1e3452c52d140e43efbfeaa5f4a1057e959b644d (patch) | |
tree | c1c9833693316c3555adaa9b926fa02e10a47797 | |
parent | cc41902750e66aa6dc179aabbcfcd2eb50b8254a (diff) | |
download | compilertests-1e3452c52d140e43efbfeaa5f4a1057e959b644d.tar.gz compilertests-1e3452c52d140e43efbfeaa5f4a1057e959b644d.tar.bz2 |
some work on char type
-rw-r--r-- | ecomp-c/asm-i386.c | 17 | ||||
-rw-r--r-- | ecomp-c/ec.c | 21 | ||||
-rw-r--r-- | ecomp-c/test1.e | 1 | ||||
-rw-r--r-- | ecomp-c/tests/boolean_variable.easm | 2 |
4 files changed, 38 insertions, 3 deletions
diff --git a/ecomp-c/asm-i386.c b/ecomp-c/asm-i386.c index a796398..62e15ca 100644 --- a/ecomp-c/asm-i386.c +++ b/ecomp-c/asm-i386.c @@ -46,6 +46,7 @@ * use32 * org 0x0000 * dd 0x0000 + * db 0x00 */ /* constants */ @@ -497,6 +498,11 @@ static void Emit_char( int c ) fputc( c, stdout ); } +static void Emit_byte( int d ) +{ + Emit_char( ( d & 0xFF ) ); +} + static void Emit_double_little_endian( int d ) { Emit_char( ( d & 0xFF ) ); @@ -595,6 +601,7 @@ static Symbol *parseLabel( void ) typedef enum { OPCODE_PSEUDO_ORG, OPCODE_PSEUDO_DD, + OPCODE_PSEUDO_DB, OPCODE_MOV, OPCODE_PUSH, OPCODE_POP, @@ -617,6 +624,7 @@ typedef enum { static char *opcodename[OPCODE_UNKNOWN+1] = { "org", "dd", + "db", "mov", "push", "pop", @@ -711,6 +719,10 @@ static OpcodeInfo *parseOpcode( void ) opcode_info->opcode = OPCODE_PSEUDO_DD; opcode_info->nof_operands = 1; opcode_info->size = 4; + } else if( strcmp( ident, "db" ) == 0 ) { + opcode_info->opcode = OPCODE_PSEUDO_DB; + opcode_info->nof_operands = 1; + opcode_info->size = 1; } else if( strcmp( ident, "div" ) == 0 ) { opcode_info->opcode = OPCODE_DIV; opcode_info->nof_operands = 1; @@ -934,6 +946,7 @@ static void parseOperands( OpcodeInfo *opcode_info ) switch( opcode_info->opcode ) { case OPCODE_HLT: case OPCODE_PSEUDO_DD: + case OPCODE_PSEUDO_DB: break; case OPCODE_MOV: if( opcode_info->operand->type == OPERAND_REGISTER && @@ -1280,6 +1293,7 @@ static void compute_addresses( OpcodeInfo *opcode_info ) break; case OPCODE_PSEUDO_DD: + case OPCODE_PSEUDO_DB: case OPCODE_MOV: case OPCODE_PUSH: case OPCODE_POP: @@ -1362,6 +1376,9 @@ static void emit_opcode( OpcodeInfo *opcode_info ) case OPCODE_PSEUDO_DD: Emit_double_little_endian( opcode_info->operand->num ); break; + case OPCODE_PSEUDO_DB: + Emit_byte( opcode_info->operand->num ); + break; case OPCODE_HLT: Emit( "%c", 0xF4 ); break; diff --git a/ecomp-c/ec.c b/ecomp-c/ec.c index f560d6b..61791f8 100644 --- a/ecomp-c/ec.c +++ b/ecomp-c/ec.c @@ -533,6 +533,7 @@ typedef struct Symbol { int value; /* variable */ int initialized; + int size; } Symbol; typedef struct Scope { @@ -629,6 +630,7 @@ static Symbol *insert_symbol( Scope *scope, char *name, SymbolClass class ) sym->name = Allocate( strlen( name ) + 1 ); strlcpy( sym->name, name, strlen( name ) + 1 ); sym->initialized = 0; + sym->size = 0; sym->next = scope->symbol; scope->symbol = sym; @@ -1303,9 +1305,11 @@ static void register_internal_types( Scope *scope ) { Symbol *type_symbol, *const_symbol; - insert_symbol( current_scope, "integer", SYMBOL_CLASS_TYPE ); + type_symbol = insert_symbol( current_scope, "integer", SYMBOL_CLASS_TYPE ); + type_symbol->size = 4; type_symbol = insert_symbol( current_scope, "boolean", SYMBOL_CLASS_TYPE ); + type_symbol->size = 1; const_symbol = insert_symbol( current_scope, "false", SYMBOL_CLASS_CONSTANT ); const_symbol->type = type_symbol; @@ -1314,6 +1318,9 @@ static void register_internal_types( Scope *scope ) const_symbol = insert_symbol( current_scope, "true", SYMBOL_CLASS_CONSTANT ); const_symbol->type = type_symbol; const_symbol->value = 1; + + type_symbol = insert_symbol( current_scope, "char", SYMBOL_CLASS_TYPE ); + type_symbol->size = 1; } static void init( void ) @@ -1346,7 +1353,17 @@ static void epilogue( void ) symbol = current_scope->symbol; while( symbol != NULL ) { if( symbol->class == SYMBOL_CLASS_VARIABLE ) { - Emit( "%s: dd $00000000\n", symbol->name ); + switch( symbol->type->size ) { + case 4: + Emit( "%s: dd $00000000\n", symbol->name ); + break; + case 1: + Emit( "%s: db $00\n", symbol->name ); + break; + default: + Abort( "Unhandled size of type '%s' in variable '%s'", + symbol->type->name, symbol->name ); + } } symbol = symbol->next; } diff --git a/ecomp-c/test1.e b/ecomp-c/test1.e index 88a6d26..28d2516 100644 --- a/ecomp-c/test1.e +++ b/ecomp-c/test1.e @@ -22,6 +22,7 @@ var d, e, f : integer; flag : boolean; i : integer; + j : char; begin a := 1; diff --git a/ecomp-c/tests/boolean_variable.easm b/ecomp-c/tests/boolean_variable.easm index 13c5493..a884de7 100644 --- a/ecomp-c/tests/boolean_variable.easm +++ b/ecomp-c/tests/boolean_variable.easm @@ -31,6 +31,6 @@ push eax pop eax mov [flag], eax hlt -flag: dd $00000000 +flag: db $00 b: dd $00000000 a: dd $00000000 |