summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-05-10 21:09:37 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2020-05-10 21:09:37 +0200
commit1e3452c52d140e43efbfeaa5f4a1057e959b644d (patch)
treec1c9833693316c3555adaa9b926fa02e10a47797
parentcc41902750e66aa6dc179aabbcfcd2eb50b8254a (diff)
downloadcompilertests-1e3452c52d140e43efbfeaa5f4a1057e959b644d.tar.gz
compilertests-1e3452c52d140e43efbfeaa5f4a1057e959b644d.tar.bz2
some work on char type
-rw-r--r--ecomp-c/asm-i386.c17
-rw-r--r--ecomp-c/ec.c21
-rw-r--r--ecomp-c/test1.e1
-rw-r--r--ecomp-c/tests/boolean_variable.easm2
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