]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add array length to the proc macro buffer
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Thu, 5 Oct 2023 10:28:38 +0000 (12:28 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:09:34 +0000 (19:09 +0100)
The compiler cannot infer the array length from the type, we should
therefore hand it the information. The proc macro buffer missed that
information.

gcc/rust/ChangeLog:

* backend/rust-compile.cc (proc_macro_buffer): Update type builder with
array length information.
(proc_macro_array): Update type initializer with array length
information.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/backend/rust-compile.cc

index f400d6916aaccf9e8306d8750447b08a1f640780..d0052feb571290e9d510d4744cc1031b6a49b943 100644 (file)
@@ -207,8 +207,14 @@ proc_macro ()
 tree
 proc_macro_buffer (tree proc_macro_type, size_t total_macro)
 {
-  // FIXME: Add the array length, build a structure containing an array
-  return build_array_type_nelts (proc_macro_type, total_macro);
+  auto length_field = Backend::typed_identifier ("length", unsigned_type_node,
+                                                BUILTINS_LOCATION);
+
+  auto array_type = build_array_type_nelts (proc_macro_type, total_macro);
+  auto macros_field
+    = Backend::typed_identifier ("macros", array_type, BUILTINS_LOCATION);
+
+  return Backend::struct_type ({length_field, macros_field});
 }
 
 // The entrypoint of a proc macro crate is a reference to the proc macro buffer
@@ -374,8 +380,15 @@ proc_macro_array (Context *ctx, tree proc_macro_buffer_type,
       index++;
     }
 
-  return Backend::array_constructor_expression (proc_macro_buffer_type, indexes,
-                                               ctors, BUILTINS_LOCATION);
+  auto length = build_int_cst (unsigned_type_node, ctors.size ());
+  auto array = Backend::array_constructor_expression (
+    build_array_type_nelts (proc_macro_type, ctors.size ()), indexes, ctors,
+    BUILTINS_LOCATION);
+  return Backend::constructor_expression (proc_macro_buffer_type,
+                                         false /* invariant */,
+                                         {length, array},
+                                         -1 /* Structure: No index */,
+                                         BUILTINS_LOCATION);
 }
 } // namespace init