DWARF and GDB Algol 68 support - notes

Jose E. Marchesi jemarch@gnu.org
Sat May 9 11:07:24 GMT 2026


Hi again.

>> Hi Cuper.
>>
>> These are the notes from the discussion we have just had over jitsi
>> about adding support for Algol 68 to GDB.
>>
>>   begin int x := 20; (*)
>>         prio > = 4;
>>         real i = (x_1>10 | 10 | x_2);
>>                                 { Without -g: real(x) }
>>                                 { With -g: (real x_2 = real(x); x) }
>>         puts (fixed(1) + "'n")
>>   end
>
> I just noticed that creating var_decls for the applied identifiers x_1,
> x_2, etc, doesn't mean that the var_decl for the defining identifier x
> goes away: it is still there.
>
> This is very good, because it means that, given a listing:
>
>   10  begin int x := 20;
>   11        prio > = 4;
>   12        real i = (x_1>10 | 10 | x_2);
>   13        puts (fixed(1) + "'n")
>   14  end
>
> When we breakpoint at line 13, we have:
>
>   (gdb) print x
>   x = 20
>   (gdb) print x_1
>   x_1 = 20
>   (gdb) print x_2
>   x_2 = 20.0
>
> Therefore, we can document that using a non-subscripted identifier
> refers to the defining identifier, i.e. the object x, whereas using a
> subscripted version of x refers to some particular applied identifier,
> in its role as coercee.
>
> This is looking good :)
>
>>
>>                 unit
>>                   |
>>                 widen
>>                   |
>>   deref         deref
>>     |             |
>>     x             x
>>
>>   (gdb) print x_2 + 10
>>
>> For unit_is_applied_identifier (p)
>>
>>   Skip zero or more nodes:
>>
>>      WIDENING
>>      VOIDING
>>      ROWING
>>      UNITING
>>      DEREFERENCING
>>      DEPROCEDURING
>>
>>   If next node is IDENTIFIER, return TREE_DECL (TAX (node))
>>   Otherwise, return NULL_TREE
>>
>> Code sketch:
>>
>> diff --git a/gcc/algol68/a68-low-units.cc b/gcc/algol68/a68-low-units.cc
>> index 3cbf131112b..831fd509c2f 100644
>> --- a/gcc/algol68/a68-low-units.cc
>> +++ b/gcc/algol68/a68-low-units.cc
>> @@ -1371,5 +1371,27 @@ a68_lower_formal_hole (NODE_T *p, LOW_CTX_T ctx ATTRIBUTE_UNUSED)
>>  tree
>>  a68_lower_unit (NODE_T *p, LOW_CTX_T ctx)
>>  {
>> -  return a68_lower_tree (SUB (p), ctx);
>> +  tree unit = a68_lower_tree (SUB (p), ctx);
>> +
>> +  if (debug_info)
>> +    {
>> +      tree *id_decl = unit_is_applied_identifier (p);
>> +
>> +      /* If the unit is an applied identifier after zero or more coercions.  */
>> +      if (id_decl != NULL_TREE)
>> +	{
>> +	  /* Return a compound_stmt
>> +
>> +	     (var_decl for an object named ID_N, and value UNIT,
>> +	     ID_N)
>> +	  */
>> +	  unit = save_expr (unit);
>> +	  return fold_build2 (COMPOUND_EXPR, TREE_TYPE (unit),
>> +			      build_decl (LOC (unit),
>> +					  VAR_DECL,
>> +					  DECL_NAME (id_decl) + "_" + ++(NAMECNT (TAX (id_decl))),
>> +					  unit),
>> +			      unit);
>> +	}
>> +    }
>>  }

Note that the declaration built there should be added to the current
range using a68_add_decl, and also probably a decl_expr.  Much like any
other declarations.

Also, we will unfortunately have to use symbols like x__2 or x&2 for
these decls.  Something that is not a valid identifier in Algol 68...

>> diff --git a/gcc/algol68/a68-types.h b/gcc/algol68/a68-types.h
>> index 9dc3d006e9f..6736c51ca18 100644
>> --- a/gcc/algol68/a68-types.h
>> +++ b/gcc/algol68/a68-types.h
>> @@ -638,6 +638,7 @@ struct GTY((chain_next ("%h.next"))) TAG_T
>>    LOWERER_T lowerer;
>>    TAG_T *next, *body;
>>    const char *extern_symbol;
>> +  int name_counter;
>>  };
>>  #define NO_TAG ((TAG_T *) 0)
>>  
>> @@ -1021,6 +1022,7 @@ struct GTY(()) A68_T
>>  #define MULTIPLE(p) ((p)->multiple_mode)
>>  #define MULTIPLE_MODE(p) ((p)->multiple_mode)
>>  #define NAME(p) ((p)->name)
>> +#define NAMECNT(p) ((p)->name_counter)
>>  #define NEST(p) ((p)->nest)
>>  #define NEST_PROC(p) ((p)->nest_proc)
>>  #define NEXT(p) ((p)->next)
>>  


More information about the Algol68 mailing list