summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2020-03-26 15:42:50 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2020-03-26 15:42:50 +0100
commit6ffe7b7fafa3cbbec04a1bec63643baf7acce1c5 (patch)
treeeca0e6b235518bd8a53db9013bdc5b4dc866b6a2
parent0cea216174b4a0ecbc858752f928bc7b5c19dfff (diff)
downloadcompilertests-6ffe7b7fafa3cbbec04a1bec63643baf7acce1c5.tar.gz
compilertests-6ffe7b7fafa3cbbec04a1bec63643baf7acce1c5.tar.bz2
improved automatic tests, also assemble (with fasm and asm-i386) and run the emulators on both
code segments (as a replacement for a missing disassembler for now)
-rw-r--r--ecomp-c/README12
-rw-r--r--ecomp-c/emul.c31
-rw-r--r--ecomp-c/tests/const_assignment_error.easm (renamed from ecomp-c/tests/const_assignment_error.eout)0
-rw-r--r--ecomp-c/tests/const_assignment_error.ecomp_err (renamed from ecomp-c/tests/const_assignment_error.eerr)0
-rw-r--r--ecomp-c/tests/empty_module.easm (renamed from ecomp-c/tests/empty_module.eout)0
-rw-r--r--ecomp-c/tests/empty_module.ecomp_err (renamed from ecomp-c/tests/empty_module.eerr)0
-rwxr-xr-xecomp-c/tests/run_tests.sh40
-rw-r--r--ecomp-c/tests/unknown_type.easm (renamed from ecomp-c/tests/unknown_type.eout)0
-rw-r--r--ecomp-c/tests/unknown_type.ecomp_err (renamed from ecomp-c/tests/unknown_type.eerr)0
-rw-r--r--ecomp-c/tests/unknown_variable.easm (renamed from ecomp-c/tests/unknown_variable.eout)0
-rw-r--r--ecomp-c/tests/unknown_variable.ecomp_err (renamed from ecomp-c/tests/unknown_variable.eerr)0
-rw-r--r--ecomp-c/tests/variable_assign_from_constant.easm (renamed from ecomp-c/tests/variable_assign_from_constant.eout)0
-rw-r--r--ecomp-c/tests/variable_assign_from_constant.ecomp_err (renamed from ecomp-c/tests/variable_assign_from_constant.eerr)0
-rw-r--r--ecomp-c/tests/variable_assign_from_expression.easm (renamed from ecomp-c/tests/variable_assign_from_expression.eout)0
-rw-r--r--ecomp-c/tests/variable_assign_from_expression.ecomp_err (renamed from ecomp-c/tests/variable_assign_from_expression.eerr)0
-rw-r--r--ecomp-c/tests/variable_assign_from_type.easm (renamed from ecomp-c/tests/variable_assign_from_type.eout)0
-rw-r--r--ecomp-c/tests/variable_assign_from_type.ecomp_err (renamed from ecomp-c/tests/variable_assign_from_type.eerr)0
-rw-r--r--ecomp-c/tests/variable_assign_from_variable.easm (renamed from ecomp-c/tests/variable_assign_from_variable.eout)0
-rw-r--r--ecomp-c/tests/variable_assign_from_variable.ecomp_err (renamed from ecomp-c/tests/variable_assign_from_variable.eerr)0
-rw-r--r--ecomp-c/tests/variable_name_as_type.easm (renamed from ecomp-c/tests/variable_name_as_type.eout)0
-rw-r--r--ecomp-c/tests/variable_name_as_type.ecomp_err (renamed from ecomp-c/tests/variable_name_as_type.eerr)0
-rw-r--r--ecomp-c/tests/variable_not_initialized.easm (renamed from ecomp-c/tests/variable_not_initialized.eout)0
-rw-r--r--ecomp-c/tests/variable_not_initialized.ecomp_err (renamed from ecomp-c/tests/variable_not_initialized.eerr)0
23 files changed, 71 insertions, 12 deletions
diff --git a/ecomp-c/README b/ecomp-c/README
index cebd76a..6713ead 100644
--- a/ecomp-c/README
+++ b/ecomp-c/README
@@ -65,12 +65,22 @@ links
-----
1:10:00 video Hjalfi writes a compiler
-1:50:00 video Hjalfi writes an assembler
+
things I got from cowgol:
inner-nested functions/procedures
don't do automatic type promotion, maybe something like uint8, int8, etc.
no recursion, well, we might need that
+1:50:00 video Hjalfi writes an assembler
+
+no frees as things are freed in the end, well, we don't obey that rule,
+compiler/assember should be embedable and they have local scopes which
+can be freed while running, thus reducing the memory usage and hence
+allowing bigger modules to be comiled/assembled.
+
+hashtables as simple table on the first character + list, avoids complex
+hashtable classes in C.
+
syscalls
--------
diff --git a/ecomp-c/emul.c b/ecomp-c/emul.c
index c9e87a1..db63bc2 100644
--- a/ecomp-c/emul.c
+++ b/ecomp-c/emul.c
@@ -13,6 +13,7 @@
#define PAGE_SIZE 4 * 1024 * 1024
#define CODE_START 0x1000000
#define CODE_SIZE PAGE_SIZE
+#define DATA_SIZE 64
#define STACK_SIZE PAGE_SIZE
#define STACK_START CODE_START + CODE_SIZE + STACK_SIZE
@@ -67,6 +68,16 @@ static void dump_stack( uc_engine *uc )
}
}
+static void initialize_memory( uc_engine *uc, uint64_t start_address, uint64_t end_address )
+{
+ uint8_t mem[4];
+
+ memset( mem, 0, 4 );
+ for( uint64_t a = start_address; a < end_address; a += 4 ) {
+ uc_mem_write( uc, a, &mem, 4 );
+ }
+}
+
static void dump_memory( uc_engine *uc, uint64_t start_address, uint64_t end_address )
{
uint8_t mem[4];
@@ -157,7 +168,7 @@ int main( int argc, char *argv[] )
exit( EXIT_FAILURE );
}
- code = (char *)malloc( file_size );
+ code = (char *)malloc( file_size + DATA_SIZE );
if( code == NULL ) {
fprintf( stderr, "ERROR: out of memory\n" );
uc_close( uc );
@@ -179,6 +190,8 @@ int main( int argc, char *argv[] )
exit( EXIT_FAILURE );
}
printf( "Read %zu bytes of code..\n", code_size );
+
+ fclose( f );
// disassemble the whole code block
nof_instrs = cs_disasm( cs, (const uint8_t *)code, code_size, CODE_START, 0, &instrs );
@@ -248,10 +261,21 @@ int main( int argc, char *argv[] )
uc_close( uc );
exit( EXIT_FAILURE );
}
-
+
+ // initialize memory (to make tests deterministic)
+ if( data_start == 0 ) {
+ data_start = CODE_START + code_size;
+ }
+ initialize_memory( uc, data_start, data_start + DATA_SIZE );
+
+ // initialize stack pointer
int addr = CODE_START;
int esp = STACK_START;
uc_reg_write( uc, UC_X86_REG_ESP, &esp );
+
+ printf( "core start %x\n", (unsigned int)CODE_START );
+ printf( "data start %x\n", (unsigned int)data_start );
+ printf( "stack start %x\n", (unsigned int)esp );
uint64_t address = CODE_START;
bool terminate = false;
@@ -298,7 +322,7 @@ int main( int argc, char *argv[] )
dump_regs( uc );
dump_stack( uc );
- dump_memory( uc, data_start, data_start + 64 );
+ dump_memory( uc, data_start, data_start + DATA_SIZE );
if( strcmp( instrs[n].mnemonic, "hlt" ) == 0 ) {
terminate = true;
@@ -309,6 +333,7 @@ int main( int argc, char *argv[] )
cs_free( instrs, nof_instrs );
cs_close( &cs );
uc_close( uc );
+ free( code );
exit( EXIT_SUCCESS );
}
diff --git a/ecomp-c/tests/const_assignment_error.eout b/ecomp-c/tests/const_assignment_error.easm
index 5f36409..5f36409 100644
--- a/ecomp-c/tests/const_assignment_error.eout
+++ b/ecomp-c/tests/const_assignment_error.easm
diff --git a/ecomp-c/tests/const_assignment_error.eerr b/ecomp-c/tests/const_assignment_error.ecomp_err
index 5ebd0b7..5ebd0b7 100644
--- a/ecomp-c/tests/const_assignment_error.eerr
+++ b/ecomp-c/tests/const_assignment_error.ecomp_err
diff --git a/ecomp-c/tests/empty_module.eout b/ecomp-c/tests/empty_module.easm
index ef4e524..ef4e524 100644
--- a/ecomp-c/tests/empty_module.eout
+++ b/ecomp-c/tests/empty_module.easm
diff --git a/ecomp-c/tests/empty_module.eerr b/ecomp-c/tests/empty_module.ecomp_err
index e69de29..e69de29 100644
--- a/ecomp-c/tests/empty_module.eerr
+++ b/ecomp-c/tests/empty_module.ecomp_err
diff --git a/ecomp-c/tests/run_tests.sh b/ecomp-c/tests/run_tests.sh
index a96ba9e..4f43bb4 100755
--- a/ecomp-c/tests/run_tests.sh
+++ b/ecomp-c/tests/run_tests.sh
@@ -17,26 +17,50 @@ run_test( )
{
TEST=$1
echo -n "$TEST"
- ../ec < $TEST.e > $TEST.out 2> _tmp
- grep -v '^Total ' _tmp | grep -v '^Arena' | grep -v 'bytes.*=' | grep -v 'max mmap' > $TEST.err
+ ../ec < $TEST.e > $TEST.asm 2> _tmp
+ COMPILATION_RES=$?
+ grep -v '^Total ' _tmp | grep -v '^Arena' | grep -v 'bytes.*=' | grep -v 'max mmap' > $TEST.comp_err
rm -f _tmp
- diff $TEST.out $TEST.eout >/dev/null 2>&1
+ diff $TEST.asm $TEST.easm >/dev/null 2>&1
OUT=$?
- diff $TEST.err $TEST.eerr >/dev/null 2>&1
+ diff $TEST.comp_err $TEST.ecomp_err >/dev/null 2>&1
ERR=$?
if test $OUT = 0 -a $ERR = 0; then
- echo " PASS"
+ if test $COMPILATION_RES = 0; then
+ fasm $TEST.asm $TEST.ebin >/dev/null 2>&1
+ ../asm-i386 < $TEST.asm > $TEST.bin 2>/dev/null
+ cmp $TEST.asm $TEST.easm >/dev/null 2>&1
+ OUT=$?
+ if test $OUT = 0; then
+ ../emul $TEST.ebin > $TEST.erun
+ ../emul $TEST.bin > $TEST.run
+ diff $TEST.run $TEST.erun >/dev/null 2>&1
+ if test $? = 0; then
+ echo " PASS"
+ else
+ echo " FAIL"
+ diff $TEST.run $TEST.erun
+ echo "---"
+ fi
+ else
+ echo " FAIL"
+ cmp -b $TEST.asm $TEST.easm
+ echo "---"
+ fi
+ else
+ echo " PASS (XFAIL)"
+ fi
else
echo " FAIL"
- diff $TEST.out $TEST.eout
- diff $TEST.err $TEST.eerr
+ diff $TEST.asm $TEST.easm
+ diff $TEST.comp_err $TEST.ecomp_err
echo "---"
fi
}
cd "$(dirname "$0")"
-rm -f *.out *.err
+rm -f *.asm *.comp_err *.bin *.ebin *.run *.erun
for test in $TESTS; do
run_test $test
diff --git a/ecomp-c/tests/unknown_type.eout b/ecomp-c/tests/unknown_type.easm
index 0883ccb..0883ccb 100644
--- a/ecomp-c/tests/unknown_type.eout
+++ b/ecomp-c/tests/unknown_type.easm
diff --git a/ecomp-c/tests/unknown_type.eerr b/ecomp-c/tests/unknown_type.ecomp_err
index f29d5cf..f29d5cf 100644
--- a/ecomp-c/tests/unknown_type.eerr
+++ b/ecomp-c/tests/unknown_type.ecomp_err
diff --git a/ecomp-c/tests/unknown_variable.eout b/ecomp-c/tests/unknown_variable.easm
index 0883ccb..0883ccb 100644
--- a/ecomp-c/tests/unknown_variable.eout
+++ b/ecomp-c/tests/unknown_variable.easm
diff --git a/ecomp-c/tests/unknown_variable.eerr b/ecomp-c/tests/unknown_variable.ecomp_err
index a5e556e..a5e556e 100644
--- a/ecomp-c/tests/unknown_variable.eerr
+++ b/ecomp-c/tests/unknown_variable.ecomp_err
diff --git a/ecomp-c/tests/variable_assign_from_constant.eout b/ecomp-c/tests/variable_assign_from_constant.easm
index 3fb03d6..3fb03d6 100644
--- a/ecomp-c/tests/variable_assign_from_constant.eout
+++ b/ecomp-c/tests/variable_assign_from_constant.easm
diff --git a/ecomp-c/tests/variable_assign_from_constant.eerr b/ecomp-c/tests/variable_assign_from_constant.ecomp_err
index e69de29..e69de29 100644
--- a/ecomp-c/tests/variable_assign_from_constant.eerr
+++ b/ecomp-c/tests/variable_assign_from_constant.ecomp_err
diff --git a/ecomp-c/tests/variable_assign_from_expression.eout b/ecomp-c/tests/variable_assign_from_expression.easm
index 0ea76fb..0ea76fb 100644
--- a/ecomp-c/tests/variable_assign_from_expression.eout
+++ b/ecomp-c/tests/variable_assign_from_expression.easm
diff --git a/ecomp-c/tests/variable_assign_from_expression.eerr b/ecomp-c/tests/variable_assign_from_expression.ecomp_err
index e69de29..e69de29 100644
--- a/ecomp-c/tests/variable_assign_from_expression.eerr
+++ b/ecomp-c/tests/variable_assign_from_expression.ecomp_err
diff --git a/ecomp-c/tests/variable_assign_from_type.eout b/ecomp-c/tests/variable_assign_from_type.easm
index 3c00c78..3c00c78 100644
--- a/ecomp-c/tests/variable_assign_from_type.eout
+++ b/ecomp-c/tests/variable_assign_from_type.easm
diff --git a/ecomp-c/tests/variable_assign_from_type.eerr b/ecomp-c/tests/variable_assign_from_type.ecomp_err
index 5d0ca6a..5d0ca6a 100644
--- a/ecomp-c/tests/variable_assign_from_type.eerr
+++ b/ecomp-c/tests/variable_assign_from_type.ecomp_err
diff --git a/ecomp-c/tests/variable_assign_from_variable.eout b/ecomp-c/tests/variable_assign_from_variable.easm
index e3024ed..e3024ed 100644
--- a/ecomp-c/tests/variable_assign_from_variable.eout
+++ b/ecomp-c/tests/variable_assign_from_variable.easm
diff --git a/ecomp-c/tests/variable_assign_from_variable.eerr b/ecomp-c/tests/variable_assign_from_variable.ecomp_err
index e69de29..e69de29 100644
--- a/ecomp-c/tests/variable_assign_from_variable.eerr
+++ b/ecomp-c/tests/variable_assign_from_variable.ecomp_err
diff --git a/ecomp-c/tests/variable_name_as_type.eout b/ecomp-c/tests/variable_name_as_type.easm
index ffbfbe0..ffbfbe0 100644
--- a/ecomp-c/tests/variable_name_as_type.eout
+++ b/ecomp-c/tests/variable_name_as_type.easm
diff --git a/ecomp-c/tests/variable_name_as_type.eerr b/ecomp-c/tests/variable_name_as_type.ecomp_err
index 0b6d539..0b6d539 100644
--- a/ecomp-c/tests/variable_name_as_type.eerr
+++ b/ecomp-c/tests/variable_name_as_type.ecomp_err
diff --git a/ecomp-c/tests/variable_not_initialized.eout b/ecomp-c/tests/variable_not_initialized.easm
index 665c916..665c916 100644
--- a/ecomp-c/tests/variable_not_initialized.eout
+++ b/ecomp-c/tests/variable_not_initialized.easm
diff --git a/ecomp-c/tests/variable_not_initialized.eerr b/ecomp-c/tests/variable_not_initialized.ecomp_err
index 8202b94..8202b94 100644
--- a/ecomp-c/tests/variable_not_initialized.eerr
+++ b/ecomp-c/tests/variable_not_initialized.ecomp_err