"Simon Clubley" <clubley@remove_me.eisner.decus.org-Earth.UFP> wrote in
message news:p1ei5v$fqc$1...@dont-email.me...
> On 2017-12-20, Simon Wright <
si...@pushface.org> wrote:
>> Simon Clubley <clubley@remove_me.eisner.decus.org-Earth.UFP> writes:
>>
>>> If you use a naturally 32-bit variable instead of your Interrupt_ID
>>> data type, does it work ok ?
>>
>> Yes. My workround is to declare the atomic object as Integer, and
>> convert the Interrupt_ID to Integer (the ARM says only that Interrupt_ID
>> is discrete, but that's a bridge to cross when we come to it; it's
>> naturally an Integer on Cortex-M).
>
> Unless Randy and company come up with something around the use of
> Size to extend the size of the base data type[*], I would consider
> this to be a compiler bug.
I tend to agree. The reason is 13.1(7/2). The extra bits in this case are
defined to be "padding bits", and 13.1(7/2) says that "padding bits are
normally read and updated along with the others".
AI12-0128-1 adds some rules for non-atomic subcomponents of atomic objects,
but it shouldn't change the behavior of an *elementary* atomic object, like
this one. Perhaps GNAT is treating this like a record type with two
components, the actual integer value, and some padding bits. Then it would
be right. (But that's not how the language defines this object.)
Still, you'll always have less issues if you avoid padding bits and have the
subtype Object_Size (this is now in Ada 2020, so we can talk about it) be
32.
Which is something you (Simon Wright, not Simon Clubley) might try, since
Object_Size can be specified for any subtype. So try declaring:
subype Simons_Interrupt_Id is Interrupt_Id with Object_Size => 32;
and declare your object of that subtype. Then there are no padding bits (as
defined by 13.1(7.2)).
Randy.