This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
determining aggregate member from MEM_REF
- From: Martin Sebor <msebor at gmail dot com>
- To: GCC Mailing List <gcc at gcc dot gnu dot org>
- Date: Thu, 15 Feb 2018 10:28:01 -0700
- Subject: determining aggregate member from MEM_REF
- Authentication-results: sourceware.org; auth=none
There are APIs to determine the base object and an offset
into it from all sorts of expressions, including ARRAY_REF,
COMPONENT_REF, and MEM_REF, but none of those I know about
makes it also possible to discover the member being referred
to.
Is there an API that I'm missing or a combination of calls
to some that would let me determine the (approximate) member
and/or element of an aggregate from a MEM_REF expression,
plus the offset from its beginning?
Say, given
struct A
{
void *p;
char b[3][9];
} a[2];
and an expression like
a[1].b[2] + 3
represented as the expr
MEM_REF (char[9], a, 69)
where offsetof (struct A, a[1].b[2]) == 66
I'd like to be able to determine that expr refers to the field
b of struct A, and more specifically, b[2], plus 3. It's not
important what the index into the array a is, or any other
arrays on the way to b.
I realize the reference can be ambiguous in some cases (arrays
of structs with multiple array members) and so the result wouldn't
be guaranteed to be 100% reliable. It would only be used in
diagnostics. (I think with some effort the type of the MEM_REF
could be used to disambiguate the majority (though not all) of
these references in practice.)
Thanks
Martin