From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Large arrays (again), problem case for GNAT
Date: Wed, 13 Apr 2005 14:54:48 -0500
Date: 2005-04-13T14:54:48-05:00 [thread overview]
Message-ID: <ltGdnU4oIZ3j5cDfRVn-qw@megapath.net> (raw)
In-Reply-To: pan.2005.04.13.12.46.52.518681@linuxchip.demon.co.uk.uk.uk
"Dr. Adrian Wrigley" <amtw@linuxchip.demon.co.uk.uk.uk> wrote in message
news:pan.2005.04.13.12.46.52.518681@linuxchip.demon.co.uk.uk.uk...
> Hi guys!
>
> A month or two back I hinted that I had been having problems
> the GNAT code accessing large data structures. It seemed that
> incorrect code was silently being generated. Since I didn't
> have a test case available, no progress could be made.
I tried to make an all-Ada version to test on Janus/Ada. But there is not
enough memory on my machine to run it (at least, I think that's why I'm
getting Storage_Error; the Janus/Ada runtime bypasses the system heap and
goes directly to the Windows virtual memory manager for large blocks of
memory, so the failure should indicate that Windows couldn't allocate it.)
I made three changes to the program:
Added a type Big_Int to replace Integer (better portability, especially
for a compiler
with Integer'Size = 16);
Replaced the GNAT-specific "Address_Image" with
System.Storage_Elements.Integer_Address (clunky, but pure Ada);
Replaced the call to Malloc with New.
The latter was done simply because end-running the compiler's memory
management is likely to cause bugs. And ours, at least, is designed to work
with any reasonable-sized chunk of memory. Finally, if I hadn't changed
that, it would not have worked, as Janus/Ada does not allow random memory to
be used with a pool-specific type. (Really, the access type should be a
general access type if you are going to end-run Ada's heap management.)
The test works with small enough numbers to run on my machine with 384Meg of
RAM (the top value being about 130_000_000). If you were our customer, I'd
try to figure out why the Storage_Error is being raised. Probably the answer
really is to use a supported compiler; you do really get what you pay for.
Randy.
with Text_IO;
with System.Storage_Elements; -- Added, RLB.
procedure TestBig2 is
-- Test devised by Adrian Wrigley, amtw@linuxchip.demon.co.uk.uk.uk (one uk
is e
-- I disclaim all rights to this code. Do what you wish with it!
-- This test case illustrates a problem with code
-- compiled on GNAT 3.15p for x86 under Linux
-- It shows that the 'Address of elements of large
-- arrays can be silently incorrect
-- Redid by Randy Brukardt to work with Janus/Ada; added an appropriate
Integer
-- type, use New to allocate, and removed GNAT specific stuff.
-- Notes:
--
-- This test works if the word "constant" is removed
--
-- The test also works if the value is less than 200_000_000
-- Indexing element also works with computed index
Size : constant := 210_000_000;
type Big_Int is range 0 .. Size;
type Big_T is array (Big_Int range 1 .. Size) of aliased Float;
type Big_A is access Big_T;
Big : Big_A;
-- function GetSomeMemory (X : Integer) return Big_A;
-- pragma Import (C, GetSomeMemory, "malloc");
begin
-- Big := GetSomeMemory (Size*4 + 16); -- This seems to work OK for now
Big := new Big_T;
Text_IO.Put_Line ("First element attribute " & Big_Int'Image
(Big_T'First));
Text_IO.Put_Line ("Last element attribute " & Big_Int'Image
(Big_T'Last));
Text_IO.Put_Line ("Address of first element is " &
System.Storage_Elements.Integer_Address'Image(
System.Storage_Elements.To_Integer(Big (Big_T'First)'Address)));
Text_IO.Put_Line ("Address of last element is " &
System.Storage_Elements.Integer_Address'Image(
System.Storage_Elements.To_Integer(Big (Big_T'Last)'Address)));
Text_IO.Put_Line ("(Last element should be at higher address than
first)");
declare
J : Big_Int := Size;
begin
Text_IO.Put_Line ("Address of last element is " &
System.Storage_Elements.Integer_Address'Image(
System.Storage_Elements.To_Integer(Big (J)'Address)));
end;
Text_IO.Put_Line ("Writing to all elements in loop");
for I in Big_T'Range loop
Big (I) := 0.0;
end loop;
Text_IO.Put_Line ("Writing to 'Last element");
--raised STORAGE_ERROR : stack overflow (or erroneous memory access):
Big (Big_T'Last) := 0.0; -- Fails!!!!!
end TestBig2;
next prev parent reply other threads:[~2005-04-13 19:54 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-04-13 12:46 Large arrays (again), problem case for GNAT Dr. Adrian Wrigley
2005-04-13 13:10 ` Larry Kilgallen
2005-04-13 13:24 ` Alex R. Mosteo
2005-04-13 13:31 ` Marc A. Criley
2005-04-13 19:52 ` Jeffrey Carter
2005-04-13 19:54 ` Randy Brukardt [this message]
2005-04-13 22:01 ` (see below)
2005-04-14 0:16 ` Robert A Duff
2005-04-14 1:11 ` Alexander E. Kopilovich
2005-04-14 7:29 ` Dmitry A. Kazakov
2005-04-14 7:45 ` Duncan Sands
[not found] ` <1113464720.9829.20.camel@localhost.localdomain>
2005-04-14 13:59 ` Marius Amado Alves
2005-04-14 14:09 ` Dr. Adrian Wrigley
2005-04-14 14:40 ` (see below)
[not found] ` <389d1596e98f95f0fdddc40afc0647b7@netcabo.pt>
2005-04-14 14:14 ` Duncan Sands
2005-04-14 15:18 ` Robert A Duff
2005-04-14 15:24 ` Robert A Duff
2005-04-15 5:21 ` Randy Brukardt
2005-04-15 11:49 ` Dr. Adrian Wrigley
2005-04-15 13:21 ` Dmitry A. Kazakov
2005-04-15 14:31 ` Dr. Adrian Wrigley
2005-04-15 14:57 ` Dmitry A. Kazakov
2005-04-14 15:39 ` Dr. Adrian Wrigley
2005-04-14 15:48 ` Dmitry A. Kazakov
2005-04-14 21:19 ` Robert A Duff
2005-04-15 8:23 ` Dmitry A. Kazakov
2005-04-15 8:38 ` Duncan Sands
2005-04-15 9:16 ` Dmitry A. Kazakov
2005-04-15 18:30 ` Mark Lorenzen
2005-04-15 19:06 ` Robert A Duff
[not found] ` <iSSDSN2L04G1@VB1162.spb.edu>
2005-04-14 7:34 ` Duncan Sands
2005-04-13 22:35 ` Robert A Duff
2005-04-14 11:40 ` Dr. Adrian Wrigley
2005-04-14 10:44 ` Dr. Adrian Wrigley
2005-04-14 15:03 ` Robert A Duff
2005-04-14 16:46 ` Dmitry A. Kazakov
2005-04-14 18:30 ` Pascal Obry
2005-04-14 19:45 ` Dmitry A. Kazakov
-- strict thread matches above, loose matches on Subject: below --
2005-04-13 13:52 Duncan Sands
2005-04-13 14:20 ` Dr. Adrian Wrigley
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox