105 lines
2.3 KiB
ArmAsm
105 lines
2.3 KiB
ArmAsm
# 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
|