comp.lang.ada
 help / color / mirror / Atom feed
From: dewar@gnat.com (Robert Dewar)
Subject: Re: Size and pack
Date: 27 Oct 2001 18:30:34 -0700
Date: 2001-10-28T01:30:34+00:00	[thread overview]
Message-ID: <5ee5b646.0110271730.24d0b81e@posting.google.com> (raw)
In-Reply-To: 3BC59C8E.BADA210D@Raytheon.com

Mark Johnson <Mark_H_Johnson@Raytheon.com> wrote in message news:<3BC59C8E.BADA210D@Raytheon.com>...

> Since Bit_Order is described in Chapter 13, all compilers 
> should support it.

That's faulty reasoning. Let's look at the RM, it says that
the recommended level of support is:

7   The recommended level of support for the nondefault bit    
    ordering is:

    8  If Word_Size = Storage_Unit, then the implementation 
       should support the nondefault bit ordering in 
       addition to the default bit ordering.


First of all, a compiler that does not implement the systems
programming annex which is optional, is free to
reject *any* or *all* representation clauses.   

Second a compiler that *does* implement the systems programming annex
must treat recommended level statements
in chapter 13 as requirements. 

Third, even if a compiler does implement the systems
programming annex, it need not recognize any representation
clauses other than those that correspond to these statements about
recommended level of support.

So what does this mean for Bit_Order

a) A compiler not implementing the systems programming annex may
reject all such clauses.

b) A compiler that implements the systems programming annex may reject
all such clauses for machines where the word
size is not equal to a storage unit = all byte addressed
machines = pretty much all machines around these days.

So in other words, on a byte addressed machine you cannot expect the
non-standard bit order to be implemented at all.

Why the apparently surprising restriction? Well let's look
at the definition of Bit_Order:

2   A bit ordering is a method of interpreting the meaning of the
storage place attributes.  High_Order_First (known in the vernacular
as ``big endian'') means that the first bit of a storage element (bit
0) is the mostsignificant bit (interpreting the sequence of bits that
represent a componentas an unsigned integer value).  Low_Order_First
(known in the vernacular as``little endian'') means the opposite: the
first bit is the least significant.

In other words, the attribute affects ONLY the numbering of
bits WITHIN a storage unit, it does NOT affect the numbering of
storage units. The thinking of the designers was that this is of very
limited use on a byte addressed
machine, so what's the point of requiring it to be implemented. On a
word machine it is more useful.

In GNAT, we decided to implement it anyway, even though this is not
required, but of course we have to implement
it the way the RM specifies, so it only affects the numbering of bits
within a storage unit. So for example,
if you have:

   type r is record
      a,b,c : integer;
      d : short_Integer;
   end record;

it is meaningless to apply the non-default bit order because bit
numbering within storage units is not an
issue in this case

GNAT will issue a warning in this case that the selection
of bit order does nothing. Why a warning? Well it is our
experience that lots of people (Marc included I think) expect the
specification of bit order to magically fix the
difference between big-endian and little-endian representations.

In fact not only does it not do this at all, but there is
no obvious (or even non-obvious) way to define a facility
in Ada that *would* take care of this very difficult data
incompatibility in an automatic manner. A few people have
suggested ideas, but none of the ideas have held up.

So yes, I understand that the implementation in GNAT does
not meet Marc's expectations but unfortunately it is the
expectations that are fundamentally wrong, the implementation is
right, and any other compiler that accepts the same declarations must
do the same thing (of
course it would not be at all surprising if some other
compiler rejected the clause on a byte addressed machine,
and any use of the GNAT facility here is likely to be 
non-portable since it is a non-required, though allowed,
extension).

Robert Dewar
Ada Core Technologies

 





 However, the way GNAT (and perhaps other compilers) implement this is
> not the way I expected it. I expected on an Intel PC (little endian) when
> you say...
>   for T'Bit_Order use System.High_Order_First;
> on a data type that has 'Size=32, that bit zero is the most significant bit
> (as it would be on an big endian sgi). That is NOT true. Bit zero is the
> MSB of byte zero (the least significant byte) of a four byte value.
> 
> Basically, the storage place attributes ('Position, 'First_Bit, 'Last_Bit)
> are generated after normalizing the values so that 'First_Bit is less than
> Storage_Unit. So something like...
>  for C at 0 range 24..24;
> with Storage_Size =8, you compute 'Position=3, 'First_Bit=0, 'Last_Bit=0.
> This is the most significant bit in a 32 bit value if you applied
> High_Order_First to the bit order.
> 
> [sigh]
> 
> It is a pain to define structures that are portable between both big and
> little endian machines. Almost as big a pain as the related byte swapping
> that is often needed. If someone wants a more detailed explanation of what
> we found w/ this, I suggest starting a new thread.
>   --Mark



  parent reply	other threads:[~2001-10-28  1:30 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-10-10  8:05 Size and pack Adrian Hoe
2001-10-10  8:59 ` Alfred Hilscher
2001-10-10  9:50   ` John McCabe
2001-10-11  6:36     ` Adrian Hoe
2001-10-11  8:55       ` John McCabe
2001-10-31  1:53         ` Robert Dewar
2001-10-31  1:50     ` Robert Dewar
2001-10-31  9:17       ` John McCabe
2001-10-31 11:58       ` Jeff Creem
2001-11-01  1:58         ` Adrian Hoe
2001-11-01  2:34           ` Jeff Creem
2001-11-01 14:58             ` Marin David Condic
2001-11-01  3:53           ` Matthew Heaney
2001-11-01 18:37             ` Jeff Creem
2001-11-02  3:39               ` Robert Dewar
2001-11-01  3:45         ` Jeffrey Carter
2001-11-01  6:00         ` Robert Dewar
2001-10-10  9:24 ` Pi
2001-10-10  9:27 ` Lutz Donnerhacke
2001-10-11  6:24   ` Adrian Hoe
2001-10-11  8:58     ` John McCabe
2001-10-11 13:20       ` Mark Johnson
2001-10-11 16:23         ` John McCabe
2001-10-11 16:00           ` Pat Rogers
2001-10-12  8:37             ` John McCabe
2001-10-28  1:30         ` Robert Dewar [this message]
2001-10-11  9:30     ` Lutz Donnerhacke
2001-10-11 10:12 ` Vincent Smeets
2001-10-11 10:19   ` Lutz Donnerhacke
2001-10-11 11:18     ` David C. Hoos, Sr.
2001-10-11 12:06       ` Lutz Donnerhacke
2001-10-11 13:49 ` Ted Dennison
2001-10-26  4:00 ` Smark
2001-10-26  6:14   ` tmoran
2001-10-26 17:51     ` Smark
2001-10-26 23:21       ` Jeffrey Carter
2001-10-26 23:39       ` tmoran
2001-10-29  1:01         ` Adrian Hoe
2001-10-29  2:21           ` tmoran
2001-10-29 10:42             ` Adrian Hoe
2001-10-29 23:15               ` tmoran
2001-10-29  9:52         ` Lutz Donnerhacke
2001-10-29 10:29           ` Larry Kilgallen
2001-10-29 10:50             ` Lutz Donnerhacke
2001-10-29 11:12               ` Larry Kilgallen
2001-10-31  2:02                 ` Robert Dewar
2001-10-31  2:00               ` Robert Dewar
2001-10-31  2:51                 ` Larry Kilgallen
2001-10-31  1:59           ` Robert Dewar
2001-10-31  1:57       ` Robert Dewar
2001-10-31  1:55   ` Robert Dewar
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox