[PATCH RFC v3] algol68: Add allocation function for leaf objects

Jose E. Marchesi jemarch@gnu.org
Thu Jan 15 11:12:33 GMT 2026


> On Wed, Jan 14, 2026, at 5:54 PM, Pietro Monteiro wrote:
>>>
>>> Then use leaf malloc if the mode !HAS_ROWS && !HAS_REFS.
>>>
>>> HAS_REFS will be useful for other purposes too...
>>
>> I'm going to try doing that. I'll scream for help if I get stuck :P
>>
>> pietro
>
> This seems to work:

Very nice, this covers all possibilities.

I think at this point the IS_LEAF macro could probably be removed.  In
the few places where it is used, IMHO it is good to see the logic
!HAS_REFS && HAS_ROWS..


>>From 409f48556e07c501ad766059f82502837ee15d40 Mon Sep 17 00:00:00 2001
> From: Pietro Monteiro <pietro@sociotechnical.xyz>
> Date: Wed, 14 Jan 2026 21:37:41 -0500
> Subject: [PATCH] Track if the mode has references
>
> Signed-off-by: Pietro Monteiro <pietro@sociotechnical.xyz>
> ---
>  gcc/algol68/a68-low.cc          |  2 +-
>  gcc/algol68/a68-parser-modes.cc | 25 +++++++++++++++++++++++++
>  gcc/algol68/a68-parser.cc       |  1 +
>  gcc/algol68/a68-types.h         |  8 ++++++--
>  4 files changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/algol68/a68-low.cc b/gcc/algol68/a68-low.cc
> index 57e2cb44847..94af7a3f453 100644
> --- a/gcc/algol68/a68-low.cc
> +++ b/gcc/algol68/a68-low.cc
> @@ -1131,7 +1131,7 @@ tree
>  a68_lower_malloc (MOID_T *m, tree size)
>  {
>    tree type = CTYPE (m);
> -  a68_libcall_fn libcall = LEAF_P (m) ? A68_LIBCALL_MALLOC_LEAF : A68_LIBCALL_MALLOC;
> +  a68_libcall_fn libcall = IS_LEAF (m) ? A68_LIBCALL_MALLOC_LEAF : A68_LIBCALL_MALLOC;
>    return fold_convert (build_pointer_type (type),
>  		       a68_build_libcall (libcall, ptr_type_node,
>  					  1, size));
> diff --git a/gcc/algol68/a68-parser-modes.cc b/gcc/algol68/a68-parser-modes.cc
> index 6b96fa2033b..e4fd4f141cf 100644
> --- a/gcc/algol68/a68-parser-modes.cc
> +++ b/gcc/algol68/a68-parser-modes.cc
> @@ -175,6 +175,7 @@ a68_create_mode (int att, int dim, NODE_T *node, MOID_T *sub, PACK_T *pack)
>    DIM (new_mode) = dim;
>    NODE (new_mode) = node;
>    HAS_ROWS (new_mode) = (att == ROW_SYMBOL);
> +  HAS_REFS (new_mode) = (att == REF_SYMBOL);
>    SUB (new_mode) = sub;
>    PACK (new_mode) = pack;
>    NEXT (new_mode) = NO_MOID;
> @@ -1033,6 +1034,26 @@ is_mode_has_row (MOID_T *m)
>      return (HAS_ROWS (m) || IS_ROW (m) || IS_FLEX (m));
>  }
>  
> +/* Whether mode has ref.  */
> +
> +static bool
> +is_mode_has_ref (MOID_T *m)
> +{
> +  if (IS_STRUCT (m) || IS_UNION(m))
> +    {
> +      bool k = false;
> +
> +      for (PACK_T *p = PACK (m); p != NO_PACK && k == false; FORWARD (p))
> +	{
> +	  HAS_REFS (MOID (p)) = is_mode_has_ref (MOID (p));
> +	  k |= (HAS_REFS (MOID (p)));
> +	}
> +      return k;
> +    }
> +  else
> +    return (HAS_REFS (m) || IS_REF (m));
> +}
> +
>  /* Compute derived modes.  */
>  
>  static void
> @@ -1185,6 +1206,10 @@ compute_derived_modes (MODULE_T *mod)
>    for (z = TOP_MOID (mod); z != NO_MOID; FORWARD (z))
>      HAS_ROWS (z) = is_mode_has_row (z);
>  
> +  /* Find out what modes contain refs.  */
> +  for (z = TOP_MOID (mod); z != NO_MOID; FORWARD (z))
> +    HAS_REFS (z) = is_mode_has_ref (z);
> +
>    /* Check flexible modes.  */
>    for (z = TOP_MOID (mod); z != NO_MOID; FORWARD (z))
>      {
> diff --git a/gcc/algol68/a68-parser.cc b/gcc/algol68/a68-parser.cc
> index 725a8fc44de..1504e4dc25b 100644
> --- a/gcc/algol68/a68-parser.cc
> +++ b/gcc/algol68/a68-parser.cc
> @@ -726,6 +726,7 @@ a68_new_moid (void)
>    DIM (z) = 0;
>    USE (z) = false;
>    HAS_ROWS (z) = false;
> +  HAS_REFS (z) = false;
>    PORTABLE (z) = true;
>    DERIVATE (z) = false;
>    NODE (z) = NO_NODE;
> diff --git a/gcc/algol68/a68-types.h b/gcc/algol68/a68-types.h
> index dd3210d6bb5..f76d908eb21 100644
> --- a/gcc/algol68/a68-types.h
> +++ b/gcc/algol68/a68-types.h
> @@ -187,6 +187,9 @@ struct GTY((chain_next ("%h.more"), chain_prev ("%h.less"))) KEYWORD_T
>     HAS_ROWS is true if the mode contains rows somewhere in its internal
>     structure.
>  
> +   HAS_REFS is true if the mode contains refs somewhere in its internal
> +   structure.
> +
>     The interpretation of SUB depends on the kind of mode:
>     - For REF modes it is the referred mode.
>     - For FLEX modes it is the referred mode.
> @@ -244,7 +247,7 @@ struct GTY((chain_next ("%h.next"))) MOID_T
>    int number;
>    int attribute;
>    int dim;
> -  bool has_rows, use, portable, derivate;
> +  bool has_rows, has_refs, use, portable, derivate;
>    NODE_T *node;
>    PACK_T *pack;
>    MOID_T *sub, *equivalent_mode, *slice, *deflexed_mode, *name, *multiple_mode, *next, *rowed, *trim;
> @@ -950,6 +953,7 @@ struct GTY(()) A68_T
>  #define GREEN(p) ((p)->green)
>  #define H(p) ((p)->h)
>  #define HANDLE(p) ((p)->handle)
> +#define HAS_REFS(p) ((p)->has_refs)
>  #define HAS_ROWS(p) ((p)->has_rows)
>  #define HEAP(p) ((p)->heap)
>  #define ID(p) ((p)->id)
> @@ -978,7 +982,6 @@ struct GTY(()) A68_T
>  #define LABELS(p) ((p)->labels)
>  #define LAST(p) ((p)->last)
>  #define LAST_LINE(p) ((p)->last_line)
> -#define LEAF_P(m) ((!IS_REF (m) && !HAS_ROWS (m)) ? true : false)
>  #define LESS(p) ((p)->less)
>  #define LEVEL(p) ((p)->level)
>  #define LEX_LEVEL(p) (LEVEL (TABLE (p)))
> @@ -1110,6 +1113,7 @@ struct GTY(()) A68_T
>  #define IS_LITERALLY(p, s) (strcmp (NSYMBOL (p), s) == 0)
>  #define ISNT(p, s) (! IS (p, s))
>  #define IS(p, s) (ATTRIBUTE (p) == (s))
> +#define IS_LEAF(m) (!HAS_REFS (m) && !HAS_ROWS (m))
>  #define IS_REF_FLEX(m) (IS (m, REF_SYMBOL) && IS (SUB (m), FLEX_SYMBOL))
>  #define IS_REF(m) IS ((m), REF_SYMBOL)
>  #define IS_INTEGRAL(m)					  \


More information about the Algol68 mailing list