[Dwarf-discuss] Question on "pascal property"

Martin dwarf@mfriebe.de
Wed May 1 11:24:44 GMT 2024


Hello,

I am writing the below to see if any of this might be of interest to add 
new tags/attributes to the Dwarf spec.

If not, or for the parts for which it is a no, then I am happy to use 
vendor extensions.


In Pascal there is a construct called property. 
https://www.freepascal.org/docs-html/ref/refse27.html
	
To the user (and to any code accessing it, it behaves like a variable in 
that it can be read or assigned too. But it can not have its address 
taken. (The last bit may be ignorable for the rest of this email)

In the most basic form it provides a setter and getter, which can either 
be a field or method. Setter and getter are always references to 
existing fields/methods.

In order to describe this to a debugger, I can see 2 features that could 
be added to dwarf


1) Probably a new DW_TAG_PROPERTY

Albeit, it might be possible to sub-divide existing DW_TAG_Variable / 
DW_TAG_Member into sub-sections, but I don't think that is advisable.

The tag could then be sub-divided, as it needs the same info for 
different accessors. DW_TAG_PROPERTY_xxxx where xxxx is

- "reader" => description on how to get the value
- "setter" => description on how to write the value
- "default" => how to get the default value, if one exsits
- "stored" => information if this value should be serialized, if the 
object is serialized (may depend on its vaule, can be a function)
- user..../other

Alternatively to dividing it into accessor tags, there could be just 
attributes for each method of access. Then however the below idea to 
allow direct variable/member tags will not work.


The property would also be able to have attributes directly (not in sub 
sections), like virtuality.

And it could be without sub-sections, if it just changed virtuality. 
This is common in Pascal, that a sub-class makes an inherited property 
more visible.


Maybe.... There would be the question, if existing variable/member could 
benefit from any of that information. (I don't know a case were it would 
be needed). If there was, then the variable/member would be encoded as 
it currently is, but a DW_TAG_PROPERTY_WRITE[R] could be added, to 
override the handling of how it is written. Just a thought.


2) Forwarding to the existing member/method/function

As indicated in Pascal the getter/setter are always a reference to an 
existing field/getter. Though defaults/stored can be a constant too.
And to make it more flexible, it might be considered to allow embedding 
DW_TAG_Variable / DW_TAG_Member directly?

In Pascal the reference can be
- reference to a field or method
- references to a field or method in a different object (needs 
specification of the target obj)
- reference to a function (not part of an object/structure)

So the accessors could have a simple tag

For forwarding the would need a new DW_AT_FORWARD or DW_AT_ALIAS (better 
names may exist) attribute.

References already exist. But they only reference the TAG describing the 
value. They can't hold an object (e.g. for DW_OP_push_object_address).

So there would also be the need for DW_AT_FORWARD_OBJECT.

I don't know if there are cases where such an ref-with-object would be 
interesting to existing encoding (such as when a ref is used to get the 
bounds of an array)



If the forwarder is to a function, then there is a need to know how to 
call it. For a getter a function (or method, only taking the _this 
instance), the "how to call" is implicit.

For a setter, there needs to be an extra argument, to pass the value. 
This could be implicit, if it is the only argument (other than maybe _this).


Pascal has properties, that can share a getter and share a setter. The 
getter/setter then takes an index (of any type).
For this a description would be needed, how to call the function.

DW_TAG_CALL_ARGUMENT_LIST with a list of DW_AT_CALL_ARGUMENT. (that 
could be const, ref, expr), or Special values for _this and for "the 
value".



More information about the Dwarf-discuss mailing list