Codegen and postfix fixes
authorRobert Pengelly <robertapengelly@hotmail.com>
Wed, 15 Jul 2026 14:04:45 +0000 (15:04 +0100)
committerRobert Pengelly <robertapengelly@hotmail.com>
Wed, 15 Jul 2026 14:04:45 +0000 (15:04 +0100)
amd64.c
i386.c
parse.c

diff --git a/amd64.c b/amd64.c
index 34238d7095348f90d77b2cb0526bda8e21133268..31071487f0ff476e4da2ecdbe3a033366ee73c30 100644 (file)
--- 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 537842ecd78eeaeb6d1b548eef2a5d8a123b667f..3cc6f35feaa93958560fe2527962766989c757a7 100644 (file)
--- 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 5288d5fbe1693319739236d8e0b3b1653f27611e..b119613a8ff9c63b1f3ff50791a0fe4c71c2e4b1 100644 (file)
--- 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);
                         
                         }