[Dwarf-discuss] Recovering type definitions
Paul Hilfinger
hilfingr
Wed May 25 22:58:58 GMT 2005
I was looking at the Ada example in D.2.2, which contains
subtype TEENY is INTEGER range 1..100;
type ARR is array (INTEGER range <>) of INTEGER;
type REC2(N : TEENY := 100) is record
VEC2 : ARR(1..N); -- <
end record;
The suggested encoding for the type REC2 gives the location of
VEC2's upper bound as a DWARF expression:
DW_OP_push_object_address,
DW_OP_lit<n> ! where n == offset(REC2, VEC2) - offset(REC2, N)
DW_OP_neg
DW_OP_plus
It occurs to me that one has to work a bit to recover from this the
information that, e.g., GDB would print in response to
ptype REC2
which would be expected to resemble the original type declaration to
some extent, e.g.,
type rec2 is record
n : teeny;
vec2: arr ( 1 .. n );
end record;
Indeed, while it is possible to recover that the upper bound is N (by
symbolically analyzing the expression and discovering that the
indicated location happens to coincide with that of N), it is
impossible from the suggested encoding to reproduce the type names Teeny for
N and Arr for Vec2 (as the text says, there is no notion of subtype in
Dwarf).
It might seem that the problem of type names could be solved by giving
names to the types of n and vec2, but would the resulting name
duplication cause confusion?
Also, recovering that the upper bound is N in this case looks easy
enough, but things look to become harder with more complex types in
which several fields are dynamic, as for VEC3 in
type REC3(M, N : TEENY) is record
VEC2 : ARR(M..N);
VEC3 : ARR(1..M);
end record;
(in the particular Ada implementations of interest, VEC2 and VEC3 are
unboxed). I am not sanguine about extracting a general algorithm for
'ptype'-like operations given examples like this.
Is there a better way of encoding these examples in DWARF?
Paul Hilfinger
AdaCore, Inc.
More information about the Dwarf-discuss
mailing list