From 845fab378b073b6b525a5ae1f8f21f3efbd3decb Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sat, 1 Feb 2025 11:47:23 +0100 Subject: [PATCH] Pass command line arguments to main --- gcc/elna-generic.cc | 25 +++++++++++++++++++++---- source.elna | 35 ++++++++++++++++++++++------------- 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/gcc/elna-generic.cc b/gcc/elna-generic.cc index fc42e5a..35e451a 100644 --- a/gcc/elna-generic.cc +++ b/gcc/elna-generic.cc @@ -1,3 +1,5 @@ +#include + #include "elna/gcc/elna-generic.h" #include "elna/gcc/elna-diagnostic.h" @@ -94,11 +96,11 @@ namespace gcc { constant->accept(this); } - tree parameter_types[] = { + std::array parameter_types{ integer_type_node, build_pointer_type(build_pointer_type(char_type_node)) }; - tree declaration_type = build_function_type_array(integer_type_node, 2, parameter_types); + tree declaration_type = build_function_type_array(integer_type_node, 2, parameter_types.data()); this->main_fndecl = build_fn_decl("main", declaration_type); tree resdecl = build_decl(UNKNOWN_LOCATION, RESULT_DECL, NULL_TREE, integer_type_node); DECL_CONTEXT(resdecl) = this->main_fndecl; @@ -106,6 +108,19 @@ namespace gcc enter_scope(); + tree_chain argument_chain; + for (std::size_t i = 0; i < 2; ++i) + { + std::string argument_name = i == 0 ? "count" : "parameters"; + tree argc_declaration_tree = build_decl(UNKNOWN_LOCATION, PARM_DECL, + get_identifier(argument_name.c_str()), parameter_types[i]); + DECL_CONTEXT(argc_declaration_tree) = this->main_fndecl; + DECL_ARG_TYPE(argc_declaration_tree) = parameter_types[i]; + this->symbol_map->enter(argument_name, boot::make_info(argc_declaration_tree)); + argument_chain.append(argc_declaration_tree); + } + DECL_ARGUMENTS(this->main_fndecl) = argument_chain.head(); + for (const auto body_statement : program->body) { body_statement->accept(this); @@ -152,7 +167,7 @@ namespace gcc enter_scope(); } - gcc::tree_chain argument_chain; + tree_chain argument_chain; for (std::size_t i = 0; i < definition->parameters.size(); ++i) { auto parameter = definition->parameters.at(i); @@ -241,7 +256,9 @@ namespace gcc void generic_visitor::visit(boot::number_literal *boolean) { - this->current_expression = build_int_cst_type(boolean_type_node, boolean->number()); + auto symbol = this->symbol_map->lookup("Bool"); + + this->current_expression = build_int_cst_type(symbol->payload, boolean->number()); } void generic_visitor::visit(boot::number_literal *character) diff --git a/source.elna b/source.elna index 4320e73..086c433 100644 --- a/source.elna +++ b/source.elna @@ -141,17 +141,6 @@ end; End of standard procedures. *) -proc test_record(); -var r: Token; -begin - write_s("\nTest record:\n"); - - r.kind := 4; - r.value.int_value := 8; - - write_i(r.value.int_value) -end; - proc test_primitive(); begin write_s("\nTest primitives:\n"); @@ -413,7 +402,8 @@ begin write_c(' '); i := i + sizeof(Token) - end + end; + write_c('\n') end; proc categorize_identifier(input_pointer: pointer to Char, token_length: Int): Token; @@ -638,10 +628,29 @@ begin free(input) end; +proc command_line(argc: Int, argv: pointer to pointer to Char); +var + parameter: pointer to pointer to Char, + i: Int; +begin + write_s("Argument count: "); + write_i(argc); + write_s("\nArguments:"); + + i := 1; + while i < argc do + parameter := argv + i * cast(sizeof(pointer to Char) as Int); + + write_c(' '); + write_s(parameter^); + i := i + 1 + end +end; + begin compile(); - test_record(); + command_line(count, parameters); test_primitive(); exit(0)