Add builtin symbols
This commit is contained in:
104
boot/symbol.s
Normal file
104
boot/symbol.s
Normal file
@@ -0,0 +1,104 @@
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public License,
|
||||
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
|
||||
# obtain one at https://mozilla.org/MPL/2.0/.
|
||||
|
||||
.global symbol_table_build
|
||||
|
||||
.include "boot/definitions.inc"
|
||||
|
||||
.equ SYMBOL_PRIME, 1543
|
||||
|
||||
.section .rodata
|
||||
|
||||
.type symbol_builtin_name_int, @object
|
||||
symbol_builtin_name_int: .ascii "Int"
|
||||
.type symbol_builtin_name_word, @object
|
||||
symbol_builtin_name_word: .ascii "Word"
|
||||
.type symbol_builtin_name_byte, @object
|
||||
symbol_builtin_name_byte: .ascii "Byte"
|
||||
.type symbol_builtin_name_char, @object
|
||||
symbol_builtin_name_char: .ascii "Char"
|
||||
|
||||
# Every type info starts with a word describing what type it is.
|
||||
|
||||
# Primitive types have only type size.
|
||||
.type symbol_builtin_type_int, @object
|
||||
symbol_builtin_type_int: .word TYPE_PRIMITIVE
|
||||
.word 4
|
||||
.type symbol_builtin_type_word, @object
|
||||
symbol_builtin_type_word: .word TYPE_PRIMITIVE
|
||||
.word 4
|
||||
.type symbol_builtin_type_byte, @object
|
||||
symbol_builtin_type_byte: .word TYPE_PRIMITIVE
|
||||
.word 1
|
||||
.type symbol_builtin_type_char, @object
|
||||
symbol_builtin_type_char: .word TYPE_PRIMITIVE
|
||||
.word 1
|
||||
|
||||
.section .bss
|
||||
|
||||
# The first word of the symbol table is its length.
|
||||
# Then a list of type infos follows:
|
||||
#
|
||||
# record
|
||||
# name: String
|
||||
# info: ^TypeInfo
|
||||
# end
|
||||
.type symbol_table, @object
|
||||
symbol_table: .zero SYMBOL_PRIME
|
||||
|
||||
.section .text
|
||||
|
||||
# Build the initial symbols.
|
||||
#
|
||||
# Sets a0 to the pointer to the global symbol table.
|
||||
.type symbol_build, @function
|
||||
symbol_table_build:
|
||||
la a0, symbol_table
|
||||
addi t0, a0, 4
|
||||
|
||||
li t1, 3 # Length of the word "Int".
|
||||
sw t1, 0(t0)
|
||||
la t1, symbol_builtin_name_int
|
||||
sw t1, 4(t0)
|
||||
la t1, symbol_builtin_type_int
|
||||
sw t1, 8(t0)
|
||||
lw t1, 0(a0)
|
||||
addi t1, t1, 1
|
||||
sw t1, 0(a0)
|
||||
addi t0, t0, 12
|
||||
|
||||
li t1, 4 # Length of the word "Word".
|
||||
sw t1, 0(t0)
|
||||
la t1, symbol_builtin_name_word
|
||||
sw t1, 4(t0)
|
||||
la t1, symbol_builtin_type_word
|
||||
sw t1, 8(t0)
|
||||
lw t1, 0(a0)
|
||||
addi t1, t1, 1
|
||||
sw t1, 0(a0)
|
||||
addi t0, t0, 12
|
||||
|
||||
li t1, 4 # Length of the word "Byte".
|
||||
sw t1, 0(t0)
|
||||
la t1, symbol_builtin_name_byte
|
||||
sw t1, 4(t0)
|
||||
la t1, symbol_builtin_type_byte
|
||||
sw t1, 8(t0)
|
||||
lw t1, 0(a0)
|
||||
addi t1, t1, 1
|
||||
sw t1, 0(a0)
|
||||
addi t0, t0, 12
|
||||
|
||||
li t1, 4 # Length of the word "Char".
|
||||
sw t1, 0(t0)
|
||||
la t1, symbol_builtin_name_char
|
||||
sw t1, 4(t0)
|
||||
la t1, symbol_builtin_type_char
|
||||
sw t1, 8(t0)
|
||||
lw t1, 0(a0)
|
||||
addi t1, t1, 1
|
||||
sw t1, 0(a0)
|
||||
addi t0, t0, 12
|
||||
|
||||
ret
|
Reference in New Issue
Block a user