DWARF and GDB Algol 68 support - notes

Jose E. Marchesi jemarch@gnu.org
Sat May 9 11:11:06 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...

x#2 would be a good one IMO: the # character is worthy but not currently
used other than comment delimiter in UPPER stropping and within strings.

>
>>> 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