Re: [PATCH] KFAIL variable-length array tests which fail with Clang

Tom de Vries
2020-11-20T16:30:11Z

On 11/20/20 4:50 PM, Tom Tromey wrote:
>>>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes:
>
> Tom> + gdb_byte last = block->data[block->size - 1];
> Tom> + baton->locexpr.is_reference
> Tom> + = !(last == DW_OP_stack_value || last == DW_OP_implicit_value);
>
> I don't really understand the is_reference stuff

In case a dwarf expression is used for an DW_AT_location attribute, by
default it represents an address, and needs to be dereferenced to get
the value.

> but my first reaction
> is that it must be incorrect somehow.
>
> Anyway, gdb can't do this sort of check. It will fail if the expression
> has a different shape, which is completely allowed by the spec.

So, I'm referring to this bit in the dwarf standard (v4):
...
2.6.1.1.3 Implicit Location Descriptions

An implicit location description represents a piece or all of an object
which has no actual location but whose contents are nonetheless either
known or known to be undefined.

The following DWARF operations may be used to specify a value that has
no location in the program but is a known constant or is computed from
other locations and values in the program.

...

2.DW_OP_stack_value

The DW_OP_stack_value operation specifies that the object does not exist
in memory but its value is nonetheless known and is at the top of the
DWARF expression stack. In this form of location description, the DWARF
expression represents the actual value of the object, rather than its
location. The DW_OP_stack_value operation terminates the expression.
...

AFAIU, the spec specifically says how to interpret a DW_OP_stack_value
at the end of the dwarf expression which is used a location description,
and the code in the patch follows that reasoning.

So, for my understanding, can you give an example of the problem you're
envisioning?

Thanks,
- Tom