diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2020-03-26 15:42:50 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2020-03-26 15:42:50 +0100 |
commit | 6ffe7b7fafa3cbbec04a1bec63643baf7acce1c5 (patch) | |
tree | eca0e6b235518bd8a53db9013bdc5b4dc866b6a2 | |
parent | 0cea216174b4a0ecbc858752f928bc7b5c19dfff (diff) | |
download | compilertests-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/README | 12 | ||||
-rw-r--r-- | ecomp-c/emul.c | 31 | ||||
-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-x | ecomp-c/tests/run_tests.sh | 40 | ||||
-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 |