Properly tokenize declaration sections

This commit is contained in:
2025-05-02 22:57:04 +02:00
parent 768821c689
commit dcfd6b1515
5 changed files with 357 additions and 165 deletions

View File

@@ -4,6 +4,8 @@
# s1 - Contains the current position in the source text.
# s2 - Label counter.
.include "boot/definitions.inc"
.equ SOURCE_BUFFER_SIZE, 81920
.section .rodata
@@ -55,20 +57,41 @@ source_code: .zero SOURCE_BUFFER_SIZE
.type _compile_import, @function
_compile_import:
# Prologue.
addi sp, sp, -8
sw ra, 4(sp)
sw s0, 0(sp)
addi s0, sp, 8
addi sp, sp, -16
sw ra, 12(sp)
sw s0, 8(sp)
addi s0, sp, 16
addi s1, s1, 6
.Lcompile_import_loop:
call _skip_comment
call _skip_spaces
call _read_token
add s1, s1, a0 # Skip the imported module name.
mv a0, s1
addi a1, sp, 0
call _tokenize_next
li t0, TOKEN_IMPORT
lw t1, 0(sp)
bne t0, t1, .Lcompile_import_end
# a0 is set from the previous _tokenize_next call. Skip the module name.
addi a1, sp, 0
call _tokenize_next
mv s1, a0
/* DEBUG
lw t0, 0(sp)
addi t0, t0, '0'
sw t0, 4(sp)
addi a0, sp, 4
li a1, 1
call _write_error*/
j .Lcompile_import_loop
.Lcompile_import_end:
# Epilogue.
lw ra, 4(sp)
lw s0, 0(sp)
addi sp, sp, 8
lw ra, 12(sp)
lw s0, 8(sp)
addi sp, sp, 16
ret
.type _build_binary_expression, @function
@@ -943,40 +966,54 @@ _compile_assembly:
addi sp, sp, 16
ret
.type _compile_program, @function
_compile_program:
.type _compile_module_declaration, @function
_compile_module_declaration:
# Prologue.
addi sp, sp, -8
sw ra, 4(sp)
sw s0, 0(sp)
addi s0, sp, 8
addi sp, sp, -16
sw ra, 12(sp)
sw s0, 8(sp)
addi s0, sp, 16
la a0, global_start
li a1, GLOBAL_START_SIZE
call _write_out
addi s1, s1, 8 # program\n.
# Skip "program".
call _skip_comment
mv a0, s1
addi a1, sp, 0
call _tokenize_next
mv s1, a0
# Epilogue.
lw ra, 4(sp)
lw s0, 0(sp)
addi sp, sp, 8
lw ra, 12(sp)
lw s0, 8(sp)
addi sp, sp, 16
ret
.type _compile_constant_section, @function
_compile_constant_section:
# Prologue.
addi sp, sp, -8
sw ra, 4(sp)
sw s0, 0(sp)
addi s0, sp, 8
addi sp, sp, -16
sw ra, 12(sp)
sw s0, 8(sp)
addi s0, sp, 16
call _skip_comment
call _skip_spaces
mv a0, s1
addi a1, sp, 0
call _tokenize_next
li t0, TOKEN_CONST
lw t1, 0(sp)
bne t0, t1, .Lcompile_constant_section_end
mv s1, a0
la a0, section_rodata
li a1, SECTION_RODATA_SIZE
call _write_out
addi s1, s1, 6 # const\n.
.Lcompile_constant_section_item:
call _skip_spaces
lbu a0, (s1)
@@ -988,9 +1025,9 @@ _compile_constant_section:
.Lcompile_constant_section_end:
# Epilogue.
lw ra, 4(sp)
lw s0, 0(sp)
addi sp, sp, 8
lw ra, 12(sp)
lw s0, 8(sp)
addi sp, sp, 16
ret
.type _compile_constant, @function
@@ -1040,17 +1077,23 @@ _compile_constant:
.type _compile_variable_section, @function
_compile_variable_section:
# Prologue.
addi sp, sp, -8
sw ra, 4(sp)
sw s0, 0(sp)
addi s0, sp, 8
addi sp, sp, -16
sw ra, 12(sp)
sw s0, 8(sp)
addi s0, sp, 16
mv a0, s1
addi a1, sp, 0
call _tokenize_next
li t0, TOKEN_VAR
lw t1, 0(sp)
bne t0, t1, .Lcompile_variable_section_end
mv s1, a0
la a0, section_bss
li a1, SECTION_BSS_SIZE
call _write_out
addi s1, s1, 4 # var\n.
.Lcompile_variable_section_item:
call _skip_spaces
lbu a0, (s1)
@@ -1062,9 +1105,9 @@ _compile_variable_section:
.Lcompile_variable_section_end:
# Epilogue.
lw ra, 4(sp)
lw s0, 0(sp)
addi sp, sp, 8
lw ra, 12(sp)
lw s0, 8(sp)
addi sp, sp, 16
ret
.type _compile_variable, @function
@@ -1589,30 +1632,6 @@ _compile_line:
li t1, '('
beq t0, t1, .Lcompile_line_comment
li t0, 0x676f7270 # prog
sw t0, 12(sp)
mv a0, s1
addi a1, sp, 12
li a2, 4
call _memcmp
beqz a0, .Lcompile_line_program
li t0, 0x736e6f63 # cons
sw t0, 12(sp)
mv a0, s1
addi a1, sp, 12
li a2, 4
call _memcmp
beqz a0, .Lcompile_line_const
li t0, 0x0a726176 # var\n
sw t0, 12(sp)
mv a0, s1
addi a1, sp, 12
li a2, 4
call _memcmp
beqz a0, .Lcompile_line_var
li t0, 0x636f7270 # proc
sw t0, 12(sp)
mv a0, s1
@@ -1647,14 +1666,6 @@ _compile_line:
call _is_register_identifier
bnez a0, .Lcompile_line_identifier
li t0, 0x6f706d69 # impo
sw t0, 12(sp)
mv a0, s1
addi a1, sp, 12
li a2, 4
call _memcmp
beqz a0, .Lcompile_line_import
li t0, 0x6f746f67 # goto
sw t0, 12(sp)
mv a0, s1
@@ -1704,10 +1715,6 @@ _compile_line:
call _compile_goto
j .Lcompile_line_section
.Lcompile_line_import:
call _compile_import
j .Lcompile_line_section
.Lcompile_line_identifier:
call _compile_identifier
j .Lcompile_line_section
@@ -1725,10 +1732,6 @@ _compile_line:
li a0, 1
j .Lcompile_line_end
.Lcompile_line_const:
call _compile_constant_section
j .Lcompile_line_section
.Lcompile_line_procedure:
lw a1, 16(sp)
bnez a1, .Lcompile_line_compile_procedure
@@ -1738,14 +1741,6 @@ _compile_line:
li a0, 1
j .Lcompile_line_end
.Lcompile_line_var:
call _compile_variable_section
j .Lcompile_line_section
.Lcompile_line_program:
call _compile_program
j .Lcompile_line_section
.Lcompile_line_comment:
lw a0, 20(sp)
call _skip_comment
@@ -1864,6 +1859,11 @@ _compile:
sw zero, 4(sp) # Whether the text section header was already emitted.
call _compile_module_declaration
call _compile_import
call _compile_constant_section
call _compile_variable_section
.Lcompile_do:
lbu t0, (s1) # t0 = Current character.
beqz t0, .Lcompile_end # Exit the loop on the NUL character.
@@ -1913,7 +1913,6 @@ _start:
call _read_file
mv a0, s1
call _tokenize
call _main
call _compile