comp.lang.ada
 help / color / mirror / Atom feed
From: kevq@banana.demon.co.uk (Kevin F. Quinn)
Subject: Re: Importing C Structures
Date: 1995/03/27
Date: 1995-03-27T00:00:00+00:00	[thread overview]
Message-ID: <19950327.180750.74@banana.demon.co.uk> (raw)
In-Reply-To: 1995Mar26.081652.9489@eisner

In article <1995Mar26.081652.9489@eisner>,
          kilgallen@eisner.decus.org (Larry Kilgallen, LJK Software) wrote:

> In article <D5zqB9.5F8@thomsoft.com>, kst@thomsoft.com (Keith Thompson) writes:
> 
> > Here's an example of an erroneous use of address clauses in Ada 83:
> > 
> >     X : Integer;
> >     ...
> >     Y : Integer;
> >     for Y use at X'Address;
> > 
> > The reason this is erroneous is that the compiler may not be aware that
> > X and Y are really the same object (X may be declared in a different
> > compilation unit, or the overlaid object might be something more
> > complex than a simple object, say a dynamically indexed array element).
> > The compiler is free to keep the value of X in a register, optimize out
> > dead assignments, etc., so the apparent values of X and Y won't track

You're correct (of course :) ) but I would expect the situation
with more complex objects, especially ones involving dynamically
chosen elements to be very rare indeed.  Especially justifiable
situations...

> 
> For an address representation clause, which might be used to access hardware,
> optimizing out dead assignments seems quite inappropriate.  Is there no
> Ada83 method of avoiding such an optimization for such objects?

The problem occurs with 'X', which the compiler is free to handle
purely in a register for a while if that is appropriate; it doesn't
know that an interrupt handler which uses Y can come in expecting
Y to be the same as X at all times, for example.  Possibly a bit of
a contrived situation, but if it can be done, it probably will be
done by someone somewhere :)

Dead assignments for Y should never be optimised away, for the
reasons you mention, Larry.  Not that I'd trust a compiler in this;
I'd always take a glance at the assembly listing to be sure...

Most compilers I've used have a "pragma Volatile" or similar, which
marks a variable so that the optimiser leaves it in memory.  If your
compiler doesn't have a suitable pragma (and it doesn't have to), you
can try:

   private_XY : Integer;
   
   X : Integer;
   for X use at private_Z'address;
   Y : Integer;
   for Y use at private_Z'address;

Then you can use X and Y with impunity - if the compiler is worth
anything then both X and Y will always be accessed over the bus.
Leave it to coding standards to ensure that private_XY is never
used.  This can be done in all situations, including ones where
data is declared in a new block (hence is declared dynamically,
probably on a stack or heap).

I'm not sure if you can put private_XY in a package body, vis:

  package MyData is
    X : Integer;
    Y : Integer;
  end MyData;
  
  package body MyData is
    private_XY : Integer;
    for X use at private_XY'address;
    for Y use at private_XY'address;
  end Mydata;

It might work though (don't have a compiler here to check...),
in which case you will have enforced the non-use of private_XY
by packaging.

If you're relying on this kind of thing, it is always best to
check your object code just to be sure, anyway.  I may be
stating the obvious, but then again...

Especially since you'll need to give VERY good reasons why
you're doing it in the first place :)

-- 
Kevin F. Quinn           * "No-one ever made any money out of good
kevq@banana.demon.co.uk  *  looks and charm."
kevq@cix.compulink.co.uk * "You obviously haven't met Lady Hamilton..."
Compu$erve: 100025,1525  *                               Blackadder III
... I'll have what the guy on the floor is having...




  reply	other threads:[~1995-03-27  0:00 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1995-03-23  6:34 Importing C Structures Chris O'Regan
1995-03-23  7:55 ` Vladimir Vukicevic
1995-03-23 18:55   ` Robert S. White
1995-03-24  8:51     ` Vladimir Vukicevic
1995-03-25  9:57       ` Keith Thompson
1995-03-26 13:16         ` Larry Kilgallen, LJK Software
1995-03-27  0:00           ` Kevin F. Quinn [this message]
1995-04-07  0:00             ` Larry Kilgallen
1995-03-27 15:35           ` Theodore Dennison
1995-03-28  0:00             ` Robert Dewar
1995-03-28 11:44             ` Keith Thompson
1995-03-29  0:00               ` misattrubation (was: Re: Importing C Structures) Theodore Dennison
1995-03-31  0:00                 ` Theodore Dennison
1995-03-27 23:39           ` Importing C Structures Keith Thompson
1995-03-27 16:00       ` Norman H. Cohen
1995-03-24 16:08     ` Robert I. Eachus
1995-03-24 20:20     ` Bob Gilbert
1995-03-25 18:07     ` Robert Dewar
1995-03-24 17:30   ` Robert Dewar
1995-03-24 15:32 ` 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