diff options
author | Xavier Leroy <xavier.leroy@college-de-france.fr> | 2019-02-12 11:25:22 +0100 |
---|---|---|
committer | Xavier Leroy <xavierleroy@users.noreply.github.com> | 2019-02-25 17:15:36 +0100 |
commit | 0616171c89d3db651b6842338fdf2da9da885aa1 (patch) | |
tree | f3915dd053050785277c93e8647f13f7202b53e2 /common/Switch.v | |
parent | 3881d799d23bcc0cbaaa9e6bfa82c5bc3b2030eb (diff) | |
download | compcert-0616171c89d3db651b6842338fdf2da9da885aa1.tar.gz compcert-0616171c89d3db651b6842338fdf2da9da885aa1.zip |
Do not expand type names when floating attributes "up" a declaration
During elaboration of type declarators, non-type-related attributes such as "aligned" or "section" are "floated up" so that they apply to the thing being declared. For example, consider:
```
__attribute((aligned(16))) int * p;
```
The attribute is first attached to type `int`, then floated up to type `int *`, so that it finally applies to `p`, giving a 16-aligned pointer to int, and not a naturally-aligned pointer to 16-aligned int.
What happens when the non-type-related attribute comes from a typedef?
```
typedef __attribute((aligned(16))) int i16;
i16 * p;
```
CompCert used to expand the typedef then float up the attribute, resulting in `p` being a 16-aligned pointer to int.
GCC and Clang produce a naturally-aligned pointer, so they do not expand the typedef before floating.
The old CompCert behavior is somewhat surprising, and potentially less useful than the GCC/Clang behavior.
This commit changes the floating up of non-type-related attributes so that typedefs and struct/union/enum definitions are not expanded when determining which attributes to float up. This is a first step towards mimicking the GCC/Clang behavior.
Diffstat (limited to 'common/Switch.v')
0 files changed, 0 insertions, 0 deletions