OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [ada/] [acats/] [tests/] [c3/] [c3a0015.a] - Rev 720

Compare with Previous | Blame | View Log

-- C3A0015.A
--
--                             Grant of Unlimited Rights
--
--     The Ada Conformity Assessment Authority (ACAA) holds unlimited
--     rights in the software and documentation contained herein. Unlimited
--     rights are the same as those granted by the U.S. Government for older
--     parts of the Ada Conformity Assessment Test Suite, and are defined
--     in DFAR 252.227-7013(a)(19). By making this public release, the ACAA
--     intends to confer upon all recipients unlimited rights equal to those
--     held by the ACAA. These rights include rights to use, duplicate,
--     release or disclose the released technical data and computer software
--     in whole or in part, in any manner and for any purpose whatsoever, and
--     to have or permit others to do so.
--
--                                    DISCLAIMER
--
--     ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR
--     DISCLOSED ARE AS IS.  THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED
--     WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE
--     SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE
--     OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A
--     PARTICULAR PURPOSE OF SAID MATERIAL.
--*
--
-- OBJECTIVE:
--    Check that a derived access type has the same storage pool as its
--    parent.  (Defect Report 8652/0012, Technical Corrigendum 3.10(7/1)).
--
-- CHANGE HISTORY:
--    24 JAN 2001   PHL   Initial version.
--    29 JUN 2001   RLB   Reformatted for ACATS.
--
--!
with System.Storage_Elements;
use System.Storage_Elements;
with System.Storage_Pools;
use System.Storage_Pools;
package C3A0015_0 is

    type Pool (Storage_Size : Storage_Count) is new Root_Storage_Pool with
        record
            First_Free : Storage_Count := 1;
            Contents : Storage_Array (1 .. Storage_Size);
        end record;

    procedure Allocate (Pool : in out C3A0015_0.Pool;
                        Storage_Address : out System.Address;
                        Size_In_Storage_Elements : in Storage_Count;
                        Alignment : in Storage_Count);

    procedure Deallocate (Pool : in out C3A0015_0.Pool;
                          Storage_Address : in System.Address;
                          Size_In_Storage_Elements : in Storage_Count;
                          Alignment : in Storage_Count);

    function Storage_Size (Pool : in C3A0015_0.Pool) return Storage_Count;

end C3A0015_0;

package body C3A0015_0 is

    use System;

    procedure Allocate (Pool : in out C3A0015_0.Pool;
                        Storage_Address : out System.Address;
                        Size_In_Storage_Elements : in Storage_Count;
                        Alignment : in Storage_Count) is
        Unaligned_Address : constant System.Address :=
           Pool.Contents (Pool.First_Free)'Address;
        Unalignment : Storage_Count;
    begin
        Unalignment := Unaligned_Address mod Alignment;
        if Unalignment = 0 then
            Storage_Address := Unaligned_Address;
            Pool.First_Free := Pool.First_Free + Size_In_Storage_Elements;
        else
            Storage_Address :=
               Pool.Contents (Pool.First_Free + Alignment - Unalignment)'
                  Address;
            Pool.First_Free := Pool.First_Free + Size_In_Storage_Elements +
                                  Alignment - Unalignment;
        end if;
    end Allocate;

    procedure Deallocate (Pool : in out C3A0015_0.Pool;
                          Storage_Address : in System.Address;
                          Size_In_Storage_Elements : in Storage_Count;
                          Alignment : in Storage_Count) is
    begin
        if Storage_Address + Size_In_Storage_Elements =
           Pool.Contents (Pool.First_Free)'Address then
            -- Only deallocate if the block is at the end.
            Pool.First_Free := Pool.First_Free - Size_In_Storage_Elements;
        end if;
    end Deallocate;

    function Storage_Size (Pool : in C3A0015_0.Pool) return Storage_Count is
    begin
        return Pool.Storage_Size;
    end Storage_Size;

end C3A0015_0;

with Ada.Exceptions;
use Ada.Exceptions;
with Ada.Unchecked_Deallocation;
with Report;
use Report;
with System.Storage_Elements;
use System.Storage_Elements;
with C3A0015_0;
procedure C3A0015 is

    type Standard_Pool is access Float;
    type Derived_Standard_Pool is new Standard_Pool;
    type Derived_Derived_Standard_Pool is new Derived_Standard_Pool;

    type User_Defined_Pool is access Integer;
    type Derived_User_Defined_Pool is new User_Defined_Pool;
    type Derived_Derived_User_Defined_Pool is new Derived_User_Defined_Pool;

    My_Pool : C3A0015_0.Pool (1024);
    for User_Defined_Pool'Storage_Pool use My_Pool;

    generic
        type Designated is private;
        Value : Designated;
        type Acc is access Designated;
        type Derived_Acc is new Acc;
    procedure Check (Subtest : String; User_Defined_Pool : Boolean);

    procedure Check (Subtest : String; User_Defined_Pool : Boolean) is

        procedure Deallocate is
           new Ada.Unchecked_Deallocation (Object => Designated,
                                           Name => Acc);
        procedure Deallocate is
           new Ada.Unchecked_Deallocation (Object => Designated,
                                           Name => Derived_Acc);

        First_Free : Storage_Count;
        X : Acc;
        Y : Derived_Acc;
    begin
        if User_Defined_Pool then
            First_Free := My_Pool.First_Free;
        end if;
        X := new Designated'(Value);
        if User_Defined_Pool and then First_Free >= My_Pool.First_Free then
            Failed (Subtest &
                    " - Allocation didn't consume storage in the pool - 1");
        else
            First_Free := My_Pool.First_Free;
        end if;

        Y := Derived_Acc (X);
        if User_Defined_Pool and then First_Free /= My_Pool.First_Free then
            Failed (Subtest &
                    " - Conversion did consume storage in the pool - 1");
        end if;
        if Y.all /= Value then
            Failed (Subtest &
                    " - Incorrect allocation/conversion of access values - 1");
        end if;

        Deallocate (Y);
        if User_Defined_Pool and then First_Free <= My_Pool.First_Free then
            Failed (Subtest &
                    " - Deallocation didn't release storage from the pool - 1");
        else
            First_Free := My_Pool.First_Free;
        end if;

        Y := new Designated'(Value);
        if User_Defined_Pool and then First_Free >= My_Pool.First_Free then
            Failed (Subtest &
                    " - Allocation didn't consume storage in the pool - 2");
        else
            First_Free := My_Pool.First_Free;
        end if;

        X := Acc (Y);
        if User_Defined_Pool and then First_Free /= My_Pool.First_Free then
            Failed (Subtest &
                    " - Conversion did consume storage in the pool - 2");
        end if;
        if X.all /= Value then
            Failed (Subtest &
                    " - Incorrect allocation/conversion of access values - 2");
        end if;

        Deallocate (X);
        if User_Defined_Pool and then First_Free <= My_Pool.First_Free then
            Failed (Subtest &
                    " - Deallocation didn't release storage from the pool - 2");
        end if;
    exception
        when E: others =>
            Failed (Subtest & " - Exception " & Exception_Name (E) &
                    " raised - " & Exception_Message (E));
    end Check;


begin
    Test ("C3A0015", "Check that a dervied access type has the same " &
                        "storage pool as its parent");

    Comment ("Access types using the standard storage pool");

    Std:
        declare
            procedure Check1 is
               new Check (Designated => Float,
                          Value => 3.0,
                          Acc => Standard_Pool,
                          Derived_Acc => Derived_Standard_Pool);
            procedure Check2 is
               new Check (Designated => Float,
                          Value => 4.0,
                          Acc => Standard_Pool,
                          Derived_Acc => Derived_Derived_Standard_Pool);
            procedure Check3 is
               new Check (Designated => Float,
                          Value => 5.0,
                          Acc => Derived_Standard_Pool,
                          Derived_Acc => Derived_Derived_Standard_Pool);
        begin
            Check1 ("Standard_Pool/Derived_Standard_Pool",
                    User_Defined_Pool => False);
            Check2 ("Standard_Pool/Derived_Derived_Standard_Pool",
                    User_Defined_Pool => False);
            Check3 ("Derived_Standard_Pool/Derived_Derived_Standard_Pool",
                    User_Defined_Pool => False);
        end Std;

    Comment ("Access types using a user-defined storage pool");

    User:
        declare
            procedure Check1 is
               new Check (Designated => Integer,
                          Value => 17,
                          Acc => User_Defined_Pool,
                          Derived_Acc => Derived_User_Defined_Pool);
            procedure Check2 is
               new Check (Designated => Integer,
                          Value => 18,
                          Acc => User_Defined_Pool,
                          Derived_Acc => Derived_Derived_User_Defined_Pool);
            procedure Check3 is
               new Check (Designated => Integer,
                          Value => 19,
                          Acc => Derived_User_Defined_Pool,
                          Derived_Acc => Derived_Derived_User_Defined_Pool);
        begin
            Check1 ("User_Defined_Pool/Derived_User_Defined_Pool",
                    User_Defined_Pool => True);
            Check2 ("User_Defined_Pool/Derived_Derived_User_Defined_Pool",
                    User_Defined_Pool => True);
            Check3
               ("Derived_User_Defined_Pool/Derived_Derived_User_Defined_Pool",
                User_Defined_Pool => True);
        end User;

    Result;
end C3A0015;

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.