From: Robert Pengelly Date: Wed, 15 Jul 2026 14:04:45 +0000 (+0100) Subject: Codegen and postfix fixes X-Git-Url: https://git.candlhat.org/?a=commitdiff_plain;h=643cc4528b96686111093148cfc529166c580ef6;p=scc.git Codegen and postfix fixes --- diff --git a/amd64.c b/amd64.c index 34238d7..3107148 100644 --- a/amd64.c +++ b/amd64.c @@ -7679,10 +7679,6 @@ static int declarator_element_size_from_fields (int base_size, const int *field_ static int declarator_pointed_size_now (void) { - if (declarator_pointer_depth > 1) { - return DATA_PTR; - } - if (parsed_type_is_aggregate) { return parsed_type_size; } @@ -10519,9 +10515,9 @@ static void emit_load_symbol_address_to_reg_now (const char *reg, const char *sy const char *addr_reg = amd64_full_reg_name (reg); if (state->syntax & ASM_SYNTAX_NASM) { - fprintf (state->ofp, " mov %s, %s\n", addr_reg, asm_symbol); + fprintf (state->ofp, " lea %s, [rel %s]\n", addr_reg, asm_symbol); } else { - fprintf (state->ofp, " mov %s, offset %s\n", addr_reg, asm_symbol); + fprintf (state->ofp, " lea %s, %s\n", addr_reg, asm_symbol); } } else { @@ -13944,8 +13940,6 @@ static void emit_apply_postfix_member_access_to_reg_now (const char *reg) { */ if (is_array && pointer_depth > 0) { elem_size = DATA_PTR; - } else if (pointer_depth > 1) { - elem_size = DATA_PTR; } else if (pointer_depth == 1 && member_tag_name) { struct aggregate_tag_entry *entry = find_aggregate_tag (member_tag_name, 0); @@ -13997,13 +13991,30 @@ static void emit_apply_postfix_member_access_to_reg_now (const char *reg) { } - subscript_elem_size = index_step_size (elem_size); + subscript_elem_size = pointer_depth > 1 ? (DATA_PTR & 0x1f) : index_step_size (elem_size); if (subscript_elem_size <= 0) { subscript_elem_size = DATA_INT & 0x1f; } - emit_parse_postfix_subscript_scaled_address_to_reg_now (reg, subscript_elem_size); + if (pointer_depth > 1) { + + emit_parse_postfix_subscripts_to_reg_now (reg, subscript_elem_size, pointer_depth, elem_size); + subscript_elem_size = index_step_size (elem_size); + + if (!is_assignment_operator (tok.kind)) { + + postfix_member_pointer_depth = 0; + postfix_member_pointed_size = elem_size; + postfix_member_size = subscript_elem_size; + + continue; + + } + + } else { + emit_parse_postfix_subscript_scaled_address_to_reg_now (reg, subscript_elem_size); + } if (tok.kind == TOK_ARROW && subscript_elem_size <= (DATA_PTR & 0x1f)) { diff --git a/i386.c b/i386.c index 537842e..3cc6f35 100644 --- a/i386.c +++ b/i386.c @@ -6912,10 +6912,6 @@ static int declarator_element_size_from_fields (int base_size, const int *field_ static int declarator_pointed_size_now (void) { - if (declarator_pointer_depth > 1) { - return DATA_PTR; - } - if (parsed_type_is_aggregate) { return parsed_type_size; } @@ -12924,8 +12920,6 @@ static void emit_apply_postfix_member_access_to_reg_now (const char *reg) { */ if (is_array && pointer_depth > 0) { elem_size = DATA_PTR; - } else if (pointer_depth > 1) { - elem_size = DATA_PTR; } else if (pointer_depth == 1 && member_tag_name) { struct aggregate_tag_entry *entry = find_aggregate_tag (member_tag_name, 0); @@ -12977,13 +12971,30 @@ static void emit_apply_postfix_member_access_to_reg_now (const char *reg) { } - subscript_elem_size = index_step_size (elem_size); + subscript_elem_size = pointer_depth > 1 ? (DATA_PTR & 0x1f) : index_step_size (elem_size); if (subscript_elem_size <= 0) { subscript_elem_size = DATA_INT & 0x1f; } - emit_parse_postfix_subscript_scaled_address_to_reg_now (reg, subscript_elem_size); + if (pointer_depth > 1) { + + emit_parse_postfix_subscripts_to_reg_now (reg, subscript_elem_size, pointer_depth, elem_size); + subscript_elem_size = index_step_size (elem_size); + + if (!is_assignment_operator (tok.kind)) { + + postfix_member_pointer_depth = 0; + postfix_member_pointed_size = elem_size; + postfix_member_size = subscript_elem_size; + + continue; + + } + + } else { + emit_parse_postfix_subscript_scaled_address_to_reg_now (reg, subscript_elem_size); + } if (tok.kind == TOK_ARROW && subscript_elem_size <= (DATA_PTR & 0x1f)) { diff --git a/parse.c b/parse.c index 5288d5f..b119613 100644 --- a/parse.c +++ b/parse.c @@ -2858,7 +2858,7 @@ void parse_type_spec (void) { } else { member_info_elem_size = declarator_is_pointer ? - (declarator_pointer_depth > 1 ? DATA_PTR : (parsed_type_is_aggregate ? parsed_type_size : (parsed_type_size & 0x1f))) : + (parsed_type_is_aggregate ? parsed_type_size : (parsed_type_size & 0x1f)) : (declarator_has_array ? member_type_size : member_size); }