Merge branch 'master' of https://codeberg.org/eaxcc/eaxcc
This commit is contained in:
2
Makefile
2
Makefile
@ -76,7 +76,7 @@ ${OBJECT.d}/%.pluglock: ${OBJECT.d}/%.pp
|
|||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
test: ${OUT}
|
test: ${OUT}
|
||||||
-ORIGIN="$$(realpath .)" PATH="$$(realpath .):${PATH}" cmdtest
|
-ORIGIN="$$(realpath .)" PATH="$$(realpath .):${PATH}" cmdtest --fast
|
||||||
-${WRAP} ./${OUT} test/nop.eax
|
-${WRAP} ./${OUT} test/nop.eax
|
||||||
|
|
||||||
bootstrap:
|
bootstrap:
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
* the storage of variables.
|
* the storage of variables.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// XXX: we dont *actually* have to store names, do we?
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@ -33,9 +35,29 @@ static size_t anon_variable_counter = 0;
|
|||||||
*/
|
*/
|
||||||
static size_t unresolved_label_counter = 0;
|
static size_t unresolved_label_counter = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
static int control_block_stack[12];
|
||||||
|
static size_t control_block_stack_top = 0;
|
||||||
|
*/
|
||||||
|
|
||||||
static unsigned symbol_id = 1;
|
static unsigned symbol_id = 1;
|
||||||
tommy_hashtable symbol_table;
|
tommy_hashtable symbol_table;
|
||||||
|
|
||||||
|
/*
|
||||||
|
void add_if(void) {
|
||||||
|
control_block_stack[control_block_stack_top++] = symbol_id++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fin_if(void) {
|
||||||
|
append_instructions(ASMDIRMEM, control_block_stack[control_block_stack_top--]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void add_logic_equals(cpuregister_t * c1, cpuregister_t * c2) {
|
||||||
|
append_instructions(CMP, c1->size, REG, c1->number, REG, c2->number);
|
||||||
|
append_instructions(JNE, D32, REL, control_block_stack[control_block_stack_top]);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
static char * scope = NULL;
|
static char * scope = NULL;
|
||||||
void empty_out_scope(void) {
|
void empty_out_scope(void) {
|
||||||
free(scope);
|
free(scope);
|
||||||
@ -60,7 +82,6 @@ symbol_t * new_symbol(char * name) {
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
|
||||||
void free_symbol(void * data) {
|
void free_symbol(void * data) {
|
||||||
symbol_t * variable = (symbol_t*)data;
|
symbol_t * variable = (symbol_t*)data;
|
||||||
|
|
||||||
@ -332,6 +353,7 @@ void add_fastcall(const char * const destination) {
|
|||||||
|
|
||||||
append_instructions(CALL, REL, function->_id);
|
append_instructions(CALL, REL, function->_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
int type2size(const int type) {
|
int type2size(const int type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case U8:
|
case U8:
|
||||||
|
@ -75,6 +75,12 @@ extern void add_procedure(const char * const name);
|
|||||||
extern void add_fastcall(const char * const destination);
|
extern void add_fastcall(const char * const destination);
|
||||||
extern void fin_procedure(void);
|
extern void fin_procedure(void);
|
||||||
extern void fin_hla(void);
|
extern void fin_hla(void);
|
||||||
|
/*
|
||||||
|
extern void add_if(void);
|
||||||
|
extern void fin_if(void);
|
||||||
|
extern void add_logic_equals();
|
||||||
|
extern void add_logic_equals(cpuregister_t * c1, cpuregister_t * c2);
|
||||||
|
*/
|
||||||
/* Not implemented
|
/* Not implemented
|
||||||
extern symbol_t * add_function(symbol_t function);
|
extern symbol_t * add_function(symbol_t function);
|
||||||
extern symbol_t * get_function(const char * const name);
|
extern symbol_t * get_function(const char * const name);
|
||||||
|
@ -106,7 +106,6 @@ document: hla { fin_hla(); }
|
|||||||
|
|
||||||
hla: %empty
|
hla: %empty
|
||||||
// | library hla
|
// | library hla
|
||||||
| declaration hla // tmp
|
|
||||||
| program hla
|
| program hla
|
||||||
| function hla
|
| function hla
|
||||||
;
|
;
|
||||||
@ -234,12 +233,12 @@ stored_literal: ARRAY_LITERAL {
|
|||||||
|
|
||||||
code: %empty
|
code: %empty
|
||||||
| error code { /*yyerrok;*/ }
|
| error code { /*yyerrok;*/ }
|
||||||
| repeat code
|
/*| repeat code */
|
||||||
| if code
|
/*| if code */
|
||||||
| call code
|
| call code
|
||||||
| label code
|
| label code
|
||||||
| machine code
|
| machine code
|
||||||
| BREAK code
|
/*| BREAK code*/
|
||||||
| exit code
|
| exit code
|
||||||
| instruction code
|
| instruction code
|
||||||
;
|
;
|
||||||
@ -250,15 +249,26 @@ label: LABEL {
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
/*
|
||||||
repeat: REPEAT code END_REPEAT
|
repeat: REPEAT code END_REPEAT
|
||||||
| UNTIL logic REPEAT code END_REPEAT
|
| UNTIL logic REPEAT code END_REPEAT
|
||||||
;
|
;
|
||||||
|
|
||||||
if: IF logic THEN code END_IF
|
if_start: IF { add_if(); }
|
||||||
|
;
|
||||||
|
|
||||||
|
if_end: END_IF { fin_if(); }
|
||||||
|
;
|
||||||
|
|
||||||
|
if: if_start logic THEN code if_end
|
||||||
| IF logic THEN code ELSE code END_IF
|
| IF logic THEN code ELSE code END_IF
|
||||||
;
|
;
|
||||||
|
|
||||||
logic: logical_operand ITAND logical_operand
|
logic: register '=' register {
|
||||||
|
add_logic_equals(&$1, &$3);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
logical_operand ITAND logical_operand
|
||||||
| logical_operand ITOR logical_operand
|
| logical_operand ITOR logical_operand
|
||||||
| logical_operand ITXOR logical_operand
|
| logical_operand ITXOR logical_operand
|
||||||
| logical_operand '=' logical_operand
|
| logical_operand '=' logical_operand
|
||||||
@ -277,6 +287,7 @@ logical_operand: sublogic
|
|||||||
|
|
||||||
sublogic: '(' logic ')'
|
sublogic: '(' logic ')'
|
||||||
;
|
;
|
||||||
|
*/
|
||||||
|
|
||||||
machine: MACHINE machine_code END_MACHINE
|
machine: MACHINE machine_code END_MACHINE
|
||||||
;
|
;
|
||||||
|
@ -1,127 +1,73 @@
|
|||||||
$default_output_file = "test_me_please"
|
$default_output_file = "a.out"
|
||||||
|
|
||||||
class CMDTEST_error_batch < Cmdtest::Testcase
|
class CMDTEST_error_batch < Cmdtest::Testcase
|
||||||
def test_unknown_instruction
|
def test_unknown_instruction
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/unknown_instruction.eax", "./"
|
||||||
procedure a
|
|
||||||
nop
|
|
||||||
end procedure
|
|
||||||
|
|
||||||
unix
|
cmd "eaxhla unknown_instruction.eax" do
|
||||||
program main
|
|
||||||
wigglecall a
|
|
||||||
end program
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
|
||||||
stderr_equal /.+/
|
stderr_equal /.+/
|
||||||
exit_status 1
|
exit_status 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_unclosed_comment
|
def test_unclosed_comment
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/unclosed_comment.eax", "./"
|
||||||
/*
|
|
||||||
reeeeeeee
|
|
||||||
reeeeeeeee
|
|
||||||
reeeeee
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
cmd "eaxhla unclosed_comment.eax" do
|
||||||
stderr_equal /.+/
|
stderr_equal /.+/
|
||||||
exit_status 1
|
exit_status 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_unclosed_artimetric
|
def test_unclosed_artimetric
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/unclosed_artimetric.eax", "./"
|
||||||
program a
|
|
||||||
u8 var = [
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
cmd "eaxhla unclosed_artimetric.eax" do
|
||||||
stderr_equal /.+/
|
stderr_equal /.+/
|
||||||
exit_status 1
|
exit_status 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_unclosed_program
|
def test_unclosed_program
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/unclosed_program.eax", "./"
|
||||||
unix
|
|
||||||
program main
|
|
||||||
begin
|
|
||||||
exit 1
|
|
||||||
end rpogram
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
cmd "eaxhla unclosed_program.eax" do
|
||||||
stderr_equal /.+/
|
stderr_equal /.+/
|
||||||
exit_status 1
|
exit_status 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_double_declare
|
def test_double_declare
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/double_declare.eax", "./"
|
||||||
program main
|
|
||||||
u8 a
|
|
||||||
u8 a
|
|
||||||
begin
|
|
||||||
end program
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
cmd "eaxhla double_declare.eax" do
|
||||||
stderr_equal /.+/
|
stderr_equal /.+/
|
||||||
exit_status 1
|
exit_status 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_double_program
|
def test_double_program
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/double_program.eax", "./"
|
||||||
program a
|
|
||||||
begin
|
|
||||||
end program
|
|
||||||
|
|
||||||
program b
|
cmd "eaxhla double_program.eax" do
|
||||||
begin
|
|
||||||
end program
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
|
||||||
stderr_equal /.+/
|
stderr_equal /.+/
|
||||||
exit_status 1
|
exit_status 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_cut_string
|
def test_cut_string
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/cut_string.eax", "./"
|
||||||
program main
|
|
||||||
u8 <> kek = "asd
|
|
||||||
begin
|
|
||||||
end program
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
cmd "eaxhla cut_string.eax" do
|
||||||
stderr_equal /.+\n(.|\n)+/m
|
stderr_equal /.+\n(.|\n)+/m
|
||||||
exit_status 1
|
exit_status 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_multi_error
|
def test_multi_error
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/multi_error.eax", "./"
|
||||||
program main
|
|
||||||
k8 kek
|
|
||||||
begin
|
|
||||||
wigglecall func
|
|
||||||
xor $rsp rsp
|
|
||||||
xor rsp rsp
|
|
||||||
poke rsp
|
|
||||||
xor rsp rsp
|
|
||||||
xor rsp rsp
|
|
||||||
xor rsp rsp
|
|
||||||
end program
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
cmd "eaxhla multi_error.eax" do
|
||||||
stderr_equal /.+\n(.|\n)+/m
|
stderr_equal /.+\n(.|\n)+/m
|
||||||
exit_status 1
|
exit_status 1
|
||||||
end
|
end
|
||||||
@ -130,31 +76,31 @@ end
|
|||||||
|
|
||||||
class CMDTEST_warning_batch < Cmdtest::Testcase
|
class CMDTEST_warning_batch < Cmdtest::Testcase
|
||||||
def test_overflows
|
def test_overflows
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/overflows.eax", "./"
|
||||||
program main
|
|
||||||
u8 a = 10
|
|
||||||
u8 b = 10000
|
|
||||||
u8 c = -200
|
|
||||||
begin
|
|
||||||
end program
|
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
ignore_file $default_output_file
|
ignore_file $default_output_file
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
cmd "eaxhla overflows.eax" do
|
||||||
created_files "a.out"
|
stderr_equal /.+/
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_very_empty
|
||||||
|
import_file "test/very_empty.eax", "./"
|
||||||
|
|
||||||
|
ignore_file $default_output_file
|
||||||
|
|
||||||
|
cmd "eaxhla very_empty.eax" do
|
||||||
stderr_equal /.+/
|
stderr_equal /.+/
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_empty
|
def test_empty
|
||||||
create_file "input.eax", <<-HEREDOC
|
import_file "test/empty.eax", "./"
|
||||||
HEREDOC
|
|
||||||
|
|
||||||
ignore_file $default_output_file
|
ignore_file $default_output_file
|
||||||
|
|
||||||
cmd "eaxhla input.eax" do
|
cmd "eaxhla empty.eax" do
|
||||||
created_files "a.out"
|
|
||||||
stderr_equal /.+/
|
stderr_equal /.+/
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
9
test/basic_if.eax
Normal file
9
test/basic_if.eax
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
program basic_if
|
||||||
|
begin
|
||||||
|
mov rax 2
|
||||||
|
mov rbx 3
|
||||||
|
if rax = rbx then
|
||||||
|
exit 1
|
||||||
|
end if
|
||||||
|
exit 0
|
||||||
|
end program
|
4
test/cut_string.eax
Normal file
4
test/cut_string.eax
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
program main
|
||||||
|
u8 <> kek = "asd
|
||||||
|
begin
|
||||||
|
end program
|
5
test/double_declare.eax
Normal file
5
test/double_declare.eax
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
program main
|
||||||
|
u8 a
|
||||||
|
u8 a
|
||||||
|
begin
|
||||||
|
end program
|
7
test/double_program.eax
Normal file
7
test/double_program.eax
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
program a
|
||||||
|
begin
|
||||||
|
end program
|
||||||
|
|
||||||
|
program b
|
||||||
|
begin
|
||||||
|
end program
|
5
test/hello_world.c
Normal file
5
test/hello_world.c
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
// @BAKE gcc $@ -o $*.out -ggdb
|
||||||
|
signed main() {
|
||||||
|
puts("Hello World!");
|
||||||
|
return 0;
|
||||||
|
}
|
11
test/multi_error.eax
Normal file
11
test/multi_error.eax
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
program main
|
||||||
|
k8 kek
|
||||||
|
begin
|
||||||
|
wigglecall func
|
||||||
|
xor $rsp rsp
|
||||||
|
xor rsp rsp
|
||||||
|
poke rsp
|
||||||
|
xor rsp rsp
|
||||||
|
xor rsp rsp
|
||||||
|
xor rsp rsp
|
||||||
|
end program
|
6
test/overflows.eax
Normal file
6
test/overflows.eax
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
program main
|
||||||
|
u8 a = 10
|
||||||
|
u8 b = 10000
|
||||||
|
u8 c = -200
|
||||||
|
begin
|
||||||
|
end program
|
5
test/sigint.eax
Normal file
5
test/sigint.eax
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
program sigint
|
||||||
|
begin
|
||||||
|
my_loop:
|
||||||
|
jmp my_loop
|
||||||
|
end program
|
2
test/unclosed_artimetric.eax
Normal file
2
test/unclosed_artimetric.eax
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
program a
|
||||||
|
u8 var = [
|
4
test/unclosed_comment.eax
Normal file
4
test/unclosed_comment.eax
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/*
|
||||||
|
reeeeeeee
|
||||||
|
reeeeeeeee
|
||||||
|
reeeeee
|
5
test/unclosed_program.eax
Normal file
5
test/unclosed_program.eax
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
unix
|
||||||
|
program main
|
||||||
|
begin
|
||||||
|
exit 1
|
||||||
|
end rpogram
|
8
test/unknown_instruction.eax
Normal file
8
test/unknown_instruction.eax
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
procedure a
|
||||||
|
nop
|
||||||
|
end procedure
|
||||||
|
|
||||||
|
unix
|
||||||
|
program main
|
||||||
|
wigglecall a
|
||||||
|
end program
|
0
test/very_empty.eax
Normal file
0
test/very_empty.eax
Normal file
Reference in New Issue
Block a user