From d5e2d53e9baa51e6eb9dc75db3ba921b5edaa0e5 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Wed, 21 May 2025 00:08:33 +0200 Subject: [PATCH] Replace Byte pointer with a generic pointer type --- boot/semantic.cc | 3 +++ boot/symbol.cc | 2 +- gcc/elna-builtins.cc | 4 ++-- gcc/elna-diagnostic.cc | 4 ++-- gcc/elna-tree.cc | 7 ++++++- include/elna/gcc/elna1.h | 4 ++-- source.elna | 44 ++++++++++++++++++++-------------------- 7 files changed, 38 insertions(+), 30 deletions(-) diff --git a/boot/semantic.cc b/boot/semantic.cc index b668f8e..a8bcbe9 100644 --- a/boot/semantic.cc +++ b/boot/semantic.cc @@ -180,6 +180,8 @@ namespace elna::boot build_procedure(definition->heading()), definition->parameter_names); this->symbols->enter(definition->identifier.identifier, info); + this->symbols = std::make_shared(this->symbols); + if (definition->body.has_value()) { for (constant_definition *const constant : definition->body.value().constants()) @@ -195,6 +197,7 @@ namespace elna::boot statement->accept(this); } } + this->symbols = this->symbols->scope(); } void declaration_visitor::visit(assign_statement *statement) diff --git a/boot/symbol.cc b/boot/symbol.cc index fef6ab6..58a0752 100644 --- a/boot/symbol.cc +++ b/boot/symbol.cc @@ -350,7 +350,7 @@ namespace elna::boot result->enter("Word", std::make_shared(type(std::make_shared("Word")))); result->enter("Char", std::make_shared(type(std::make_shared("Char")))); result->enter("Bool", std::make_shared(type(std::make_shared("Bool")))); - result->enter("Byte", std::make_shared(type(std::make_shared("Byte")))); + result->enter("Pointer", std::make_shared(type(std::make_shared("Pointer")))); result->enter("Float", std::make_shared(type(std::make_shared("Float")))); result->enter("String", std::make_shared(type(std::make_shared("String")))); diff --git a/gcc/elna-builtins.cc b/gcc/elna-builtins.cc index 1ea0eae..904aeb7 100644 --- a/gcc/elna-builtins.cc +++ b/gcc/elna-builtins.cc @@ -28,7 +28,7 @@ namespace elna::gcc elna_int_type_node = long_integer_type_node; elna_word_type_node = size_type_node; elna_char_type_node = unsigned_char_type_node; - elna_byte_type_node = make_unsigned_type(8); + elna_pointer_type_node = ptr_type_node; elna_float_type_node = double_type_node; elna_bool_type_node = boolean_type_node; @@ -70,7 +70,7 @@ namespace elna::gcc declare_builtin_type(symbol_table, "Word", elna_word_type_node); declare_builtin_type(symbol_table, "Char", elna_char_type_node); declare_builtin_type(symbol_table, "Bool", elna_bool_type_node); - declare_builtin_type(symbol_table, "Byte", elna_byte_type_node); + declare_builtin_type(symbol_table, "Pointer", elna_pointer_type_node); declare_builtin_type(symbol_table, "Float", elna_float_type_node); tree string_declaration = declare_builtin_type(symbol_table, "String", elna_string_type_node); diff --git a/gcc/elna-diagnostic.cc b/gcc/elna-diagnostic.cc index b30ba75..2acef82 100644 --- a/gcc/elna-diagnostic.cc +++ b/gcc/elna-diagnostic.cc @@ -59,9 +59,9 @@ namespace elna::gcc { return "Bool"; } - else if (unqualified_type == elna_byte_type_node) + else if (unqualified_type == elna_pointer_type_node) { - return "Byte"; + return "Pointer"; } else if (unqualified_type == elna_float_type_node) { diff --git a/gcc/elna-tree.cc b/gcc/elna-tree.cc index 5b66da8..6c16d84 100644 --- a/gcc/elna-tree.cc +++ b/gcc/elna-tree.cc @@ -138,22 +138,27 @@ namespace elna::gcc { tree pointer{ NULL_TREE }; tree offset{ NULL_TREE }; + tree pointer_type{ NULL_TREE }; if (POINTER_TYPE_P(left_type) && is_integral_type(right_type)) { pointer = left; offset = right; + pointer_type = left_type; } else if (is_integral_type(left_type) && POINTER_TYPE_P(right_type)) { pointer = right; offset = left; + pointer_type = right_type; } else { return error_mark_node; } - tree size_exp = fold_convert(TREE_TYPE(offset), size_in_bytes(TREE_TYPE(TREE_TYPE(pointer)))); + tree size_exp = pointer_type == elna_pointer_type_node + ? size_one_node + : fold_convert(TREE_TYPE(offset), size_in_bytes(TREE_TYPE(TREE_TYPE(pointer)))); offset = fold_build2(MULT_EXPR, TREE_TYPE(offset), offset, size_exp); offset = fold_convert(sizetype, offset); diff --git a/include/elna/gcc/elna1.h b/include/elna/gcc/elna1.h index 1a418d8..91d0e6f 100644 --- a/include/elna/gcc/elna1.h +++ b/include/elna/gcc/elna1.h @@ -23,7 +23,7 @@ enum elna_tree_index ELNA_TI_WORD_TYPE, ELNA_TI_CHAR_TYPE, ELNA_TI_BOOL_TYPE, - ELNA_TI_BYTE_TYPE, + ELNA_TI_POINTER_TYPE, ELNA_TI_FLOAT_TYPE, ELNA_TI_STRING_TYPE, ELNA_TI_BOOL_TRUE, @@ -41,7 +41,7 @@ extern GTY(()) hash_map *elna_global_decls; #define elna_word_type_node elna_global_trees[ELNA_TI_WORD_TYPE] #define elna_char_type_node elna_global_trees[ELNA_TI_CHAR_TYPE] #define elna_bool_type_node elna_global_trees[ELNA_TI_BOOL_TYPE] -#define elna_byte_type_node elna_global_trees[ELNA_TI_BYTE_TYPE] +#define elna_pointer_type_node elna_global_trees[ELNA_TI_POINTER_TYPE] #define elna_float_type_node elna_global_trees[ELNA_TI_FLOAT_TYPE] #define elna_string_type_node elna_global_trees[ELNA_TI_STRING_TYPE] #define elna_bool_true_node elna_global_trees[ELNA_TI_BOOL_TRUE] diff --git a/source.elna b/source.elna index 7fbe0aa..2555e1f 100644 --- a/source.elna +++ b/source.elna @@ -96,17 +96,17 @@ type end FILE* = record end StringBuffer* = record - data: ^Byte + data: Pointer size: Word capacity: Word end SourceCode = record position: Position - input: ^Byte - empty: proc(^Byte) -> Bool - advance: proc(^Byte) - head: proc(^Byte) -> Char + input: Pointer + empty: proc(Pointer) -> Bool + advance: proc(Pointer) + head: proc(Pointer) -> Char end Token* = record kind: TokenKind @@ -137,13 +137,13 @@ proc fclose(stream: ^FILE) -> Int; extern proc fseek(stream: ^FILE, off: Int, whence: Int) -> Int; extern proc rewind(stream: ^FILE); extern proc ftell(stream: ^FILE) -> Int; extern -proc fread(ptr: ^Byte, size: Word, nmemb: Word, stream: ^FILE) -> Word; extern -proc write(fd: Int, buf: ^Byte, Word: Int) -> Int; extern +proc fread(ptr: Pointer, size: Word, nmemb: Word, stream: ^FILE) -> Word; extern +proc write(fd: Int, buf: Pointer, Word: Int) -> Int; extern -proc malloc(size: Word) -> ^Byte; extern -proc free(ptr: ^Byte); extern -proc calloc(nmemb: Word, size: Word) -> ^Byte; extern -proc realloc(ptr: ^Byte, size: Word) -> ^Byte; extern +proc malloc(size: Word) -> Pointer; extern +proc free(ptr: Pointer); extern +proc calloc(nmemb: Word, size: Word) -> Pointer; extern +proc realloc(ptr: Pointer, size: Word) -> Pointer; extern proc memset(ptr: ^Char, c: Int, n: Int) -> ^Char; extern @@ -160,18 +160,18 @@ proc exit(code: Int) -> !; extern Standard procedures. *) -proc reallocarray(ptr: ^Byte, n: Word, size: Word) -> ^Byte; +proc reallocarray(ptr: Pointer, n: Word, size: Word) -> Pointer; return realloc(ptr, n * size) end proc write_s(value: String); begin - write(0, cast(value.ptr: ^Byte), cast(value.length: Int)) + write(0, cast(value.ptr: Pointer), cast(value.length: Int)) end proc write_z(value: ^Char); begin - write(0, cast(value: ^Byte), cast(strlen(value): Int)) + write(0, cast(value: Pointer), cast(strlen(value): Int)) end proc write_b(value: Bool); @@ -185,7 +185,7 @@ end proc write_c(value: Char); begin - write(0, cast(@value: ^Byte), 1) + write(0, cast(@value: Pointer), 1) end proc write_i(value: Int); @@ -268,7 +268,7 @@ begin buffer^.capacity := buffer^.capacity + 1024u; buffer^.data := realloc(buffer^.data, buffer^.capacity) end; - (buffer^.data + buffer^.size)^ := cast(char: Byte); + cast(buffer^.data + buffer^.size: ^Char)^ := cast(char: Char); buffer^.size := buffer^.size + 1u end @@ -306,21 +306,21 @@ begin return result end -proc source_file_empty(source_input: ^Byte) -> Bool; +proc source_file_empty(source_input: Pointer) -> Bool; var source_file: ^SourceFile begin source_file := cast(source_input: ^SourceFile); if source_file^.index > source_file^.size then - source_file^.size := fread(cast(@source_file^.buffer: ^Byte), 1u, 1024u, source_file^.handle); + source_file^.size := fread(cast(@source_file^.buffer: Pointer), 1u, 1024u, source_file^.handle); source_file^.index := 1u end; return source_file^.size = 0u end -proc source_file_head(source_input: ^Byte) -> Char; +proc source_file_head(source_input: Pointer) -> Char; var source_file: ^SourceFile begin @@ -329,7 +329,7 @@ begin return source_file^.buffer[source_file^.index] end -proc source_file_advance(source_input: ^Byte); +proc source_file_advance(source_input: Pointer); var source_file: ^SourceFile begin @@ -597,7 +597,7 @@ var new_length: Word begin new_length := lexer^.length + 1u; - lexer^.data := cast(reallocarray(cast(lexer^.data: ^Byte), new_length, #size(Token)): ^Token); + lexer^.data := cast(reallocarray(cast(lexer^.data: Pointer), new_length, #size(Token)): ^Token); (lexer^.data + lexer^.length)^ := token; lexer^.length := new_length end @@ -1069,7 +1069,7 @@ begin end; source_code.position := Position(1u, 1u); - source_code.input := cast(source_file: ^Byte); + source_code.input := cast(source_file: Pointer); source_code.empty := source_file_empty; source_code.head := source_file_head; source_code.advance := source_file_advance;