From: Stephen Leake <stephen_leake@stephe-leake.org>
Subject: Re: GNAT 4.4.5 Record Bit_Order Endian issues
Date: Fri, 18 Jan 2013 04:49:21 -0500
Date: 2013-01-18T04:49:21-05:00 [thread overview]
Message-ID: <85a9s64y8u.fsf@stephe-leake.org> (raw)
In-Reply-To: 9961f0a1-aa2c-47d5-be84-77e495ea2a0f@googlegroups.com
awdorrin <awdorrin@gmail.com> writes:
> The code in question was originally developed on a Motorola (Big
> Endian) CPU, So, given the Motorola 'Bit Order' being
> 'High_Order_First':
>
> Byte: 0 1 2 3
> Bits: 01234567 01234567 01234567 01234567
>
> 00000000 00111111 11112222 22222233
> 01234567 89012345 67890123 45678901
>
> For a picture using the definition of:
> TRACK_ID at 0 range 0 .. 11;
> TRACK_ID_CNT at 1 range 4 .. 9;
>
> Track Id starts at 'Byte 0, Bit 0 and extends to the 11th bit'
>
> Byte:|0 |1 |2
> Bits:|01234567|0123 4567|01234567
> |00000000|0011 1111|11112222
> |01234567|8901 2345|67890123
> |Track ID |
> |0000 0000 00|11111|
> |0123 4567 89|01234|
> |Track |
> |Id Cnt |
I see. I guess I never tried to write rep specs this way; I've always
implicitly used the machine scalar concept.
>> In this code:
>> TRACK_ID at 0 range 0 .. 11;
>> TRACK_ID_CNT at 0 range 12 .. 17;
>>
>> it's obvious that the fields are contiguous, and it's up to the compiler
>> to ensure that happens.
>
> I agree that this notation makes more sense, given Big Endian
> notation. But the question I have is, when can you start at a byte
> other than 0?
When the field you are describing starts on a byte boundary.
More precisely, on a Storage_Unit boundary.
> As I just discovered after upgrading my system from Debian 6/GNAT
> 4.4.5 to Debian 7/GNAT 4.6; the GNAT 4.6 compiler produces the
> overlaps' error messages and will not compile.
It doesn't help that only very recent versions of GNAT get this right.
> Now, if the standard wants to say 'all data fields that span a group
> of bytes must be defined from the same starting byte', that would make
> sense to me.
Yes, that is what it should say. I agree the ARM is very deficient in
descibing this. It really needs to say what Cohen's paper says.
13.5.1(3) says:
component_clause ::=
component_local_name at position range first_bit .. last_bit;
But I could find no definition of "position"!
> For example:
> TRACK_ID at 0 range 0 .. 11;
> TRACK_ID_CNT at 0 range 12 .. 17;
> VAR1 at 0 range 18 .. 20;
> VAR2 at 0 range 21 .. 23;
that's a 24 bit machine scalar
> Byte1 at 3 range 0 .. 7;
that's an 8 bit machine scalar
> Int32Var at 4 range 0 .. 31;
that's a 32 bit machine scalar
> As for the 'A Proposal for Endian-Portable Record Representation
> Clauses' document, I take the proposal to mean that we should be
> defining the records as a multiple of a 'machine scalar' - which the
> document states could be 8-bit, 16-bit or 32-bit.
The size of the machine scalar is flexible, it does not have to be the
same thru-out the record.
> After further thought, I understand this to mean that our record
> definitions should fit the least common multiple that fits the span.
That does make things simpler, but it is not required.
> So, given my above example, defining 'Byte1' at starting at byte 3,
> would be wrong, since the first 'group' is 3 bytes (24-bits) and
> instead should be an even multiple (ie. 32-bits), so:
>
> TRACK_ID at 0 range 0 .. 11;
> TRACK_ID_CNT at 0 range 12 .. 17;
> VAR1 at 0 range 18 .. 20;
> VAR2 at 0 range 21 .. 23;
> Byte1 at 0 range 24 .. 31;
> Int32Var at 4 range 0 .. 31;
I would probably write it this way, since it is a little easier to
understand.
> I would assume, that if the record needed the 'Byte1' and 'Int32Var'
> elements swapped physically that the definition would need to be
> bumped from a '32-bit' base, to a 64-bit base:
>
> TRACK_ID at 0 range 0 .. 11;
> TRACK_ID_CNT at 0 range 12 .. 17;
> VAR1 at 0 range 18 .. 20;
> VAR2 at 0 range 21 .. 23;
> Int32Var at 0 range 24 .. 55;
> Byte1 at 0 range 56 .. 63;
> Int32Var2 at 8 range 0 .. 31;
That is correct, but not necessary, since Int32Var starts on a byte
boundary. And some compiler might support only 32 bit machine scalars.
> While I understand the rationale of defining the records using this
> methodology, it requires that the programmer knows that the 'starting
> byte' has restrictions.
And the ARM does not help.
> Rather than put this expectation on the programmer, it seems like
> something best left to the compiler to work out.
As Cohen's paper makes clear, the compiler _can_ work it out, but
without the notion of machine scalar, the notation is ambiguous.
> So if I write 'Track_ID_Cnt at 1 range 4 .. 7' the compiler should be
> able to translate that for me to: 'Track_Id_Cnt at 0 range 12 .. 17'
> (etc)
I don't think so, since that '4' is not on a byte boundary.
This is related to the confusion between bit endianness and byte
endianness; they are _not_ the same thing, although they almost always
are correlated. See my other post.
--
-- Stephe
next prev parent reply other threads:[~2013-01-18 9:49 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-14 17:43 GNAT 4.4.5 Record Bit_Order Endian issues awdorrin
2013-01-15 0:38 ` Randy Brukardt
2013-01-15 1:57 ` Adam Beneschan
2013-01-15 16:57 ` AdaMagica
2013-01-15 22:24 ` Stephen Leake
2013-01-16 10:44 ` Simon Wright
2013-01-16 19:00 ` AdaMagica
2013-01-16 21:34 ` Simon Wright
2013-01-16 23:14 ` Randy Brukardt
2013-01-17 3:49 ` Stephen Leake
2013-01-17 15:32 ` awdorrin
2013-01-18 9:49 ` Stephen Leake [this message]
2013-01-18 13:04 ` Robert A Duff
2013-01-19 1:43 ` Stephen Leake
2013-01-19 12:48 ` AdaMagica
2013-01-22 0:14 ` Randy Brukardt
2013-01-17 17:28 ` Simon Wright
2013-01-18 9:56 ` Stephen Leake
2013-01-17 18:04 ` awdorrin
2013-01-17 19:50 ` awdorrin
2013-01-18 9:58 ` Stephen Leake
2013-01-17 20:58 ` Simon Wright
2013-01-17 21:29 ` awdorrin
2013-01-17 22:16 ` awdorrin
2013-01-18 6:15 ` J-P. Rosen
2013-01-18 15:28 ` Niklas Holsti
2013-01-18 9:37 ` Stephen Leake
2013-01-18 12:24 ` awdorrin
2013-01-18 15:11 ` awdorrin
2013-01-19 1:48 ` Stephen Leake
2013-01-18 17:19 ` Simon Wright
2013-01-22 9:49 ` quinot
2013-01-28 13:39 ` quinot
-- strict thread matches above, loose matches on Subject: below --
2013-01-22 3:21 Stephen Leake
2013-01-22 5:14 ` Jeffrey Carter
2013-01-23 1:29 ` Stephen Leake
2013-01-22 22:40 ` Randy Brukardt
2013-01-23 1:38 ` Stephen Leake
2013-01-23 10:58 ` Simon Wright
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox