Properly tokenize declaration sections
This commit is contained in:
173
boot/stage1.s
173
boot/stage1.s
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user