]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR ada/13897 (gnat does not implement tasking on powerpc)
authorBernard Banner <banner@gnat.com>
Mon, 4 Oct 2004 15:01:52 +0000 (15:01 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 4 Oct 2004 15:01:52 +0000 (17:01 +0200)
2004-10-04  Bernard Banner  <banner@gnat.com>

PR ada/13897

* Makefile.in: Add section for powerpc linux
Add variant i-vxwork-x86.ads

* i-vxwork-x86.ads, system-linux-ppc.ads: New files.

From-SVN: r88508

gcc/ada/ChangeLog
gcc/ada/Makefile.in
gcc/ada/i-vxwork-x86.ads [new file with mode: 0644]
gcc/ada/system-linux-ppc.ads [new file with mode: 0644]

index 2caf8dd5f0dfe66a1f75a4786dc2a1f0a5cd1e8c..1dfa878750a0cb54253e8d2dd99e2d29cf23296f 100644 (file)
@@ -1,3 +1,12 @@
+2004-10-04  Bernard Banner  <banner@gnat.com>
+
+       PR ada/13897
+
+       * Makefile.in: Add section for powerpc linux
+       Add variant i-vxwork-x86.ads
+
+       * i-vxwork-x86.ads, system-linux-ppc.ads: New files.
+
 2004-10-04  Olivier Hainque  <hainque@act-europe.fr>
 
        * init.c (__gnat_initialize): Call an Ada subprogram to perform the
index 1dba67473a36d396982026cd29928f4444977ecd..59d90f58135e9e89786eaf35016f1490f7a33ec8 100644 (file)
@@ -597,6 +597,7 @@ ifeq ($(strip $(filter-out %86 wrs vxworks,$(targ))),)
   a-sytaco.ads<a-sytaco-vxworks.ads \
   a-sytaco.adb<a-sytaco-vxworks.adb \
   a-intnam.ads<a-intnam-vxworks.ads \
+  i-vxwork.ads<i-vxwork-x86.ads \
   s-inmaop.adb<s-inmaop-posix.adb \
   s-interr.adb<s-interr-vxworks.adb \
   s-intman.ads<s-intman-vxworks.ads \
@@ -1315,6 +1316,33 @@ ifeq ($(strip $(filter-out cygwin32% mingw32% pe,$(osys))),)
   LIBRARY_VERSION := $(LIB_VERSION)
 endif
 
+ifeq ($(strip $(filter-out powerpc% linux%,$(arch) $(osys))),)
+  LIBGNAT_TARGET_PAIRS = \
+  a-intnam.ads<a-intnam-linux.ads \
+  s-inmaop.adb<s-inmaop-posix.adb \
+  s-intman.adb<s-intman-posix.adb \
+  s-osinte.adb<s-osinte-posix.adb \
+  s-osinte.ads<s-osinte-linux.ads \
+  s-osprim.adb<s-osprim-posix.adb \
+  s-taprop.adb<s-taprop-linux.adb \
+  s-taspri.ads<s-taspri-linux.ads \
+  s-tpopsp.adb<s-tpopsp-posix-foreign.adb \
+  s-parame.adb<s-parame-linux.adb \
+  system.ads<system-linux-ppc.ads
+
+  TOOLS_TARGET_PAIRS =  \
+    mlib-tgt.adb<mlib-tgt-linux.adb \
+    indepsw.adb<indepsw-linux.adb
+
+  SYMLIB = $(ADDR2LINE_SYMLIB)
+  THREADSLIB = -lpthread
+  GNATLIB_SHARED = gnatlib-shared-dual
+  GMEM_LIB = gmemlib
+  PREFIX_OBJS = $(PREFIX_REAL_OBJS)
+  LIBRARY_VERSION := $(LIB_VERSION)
+
+endif
+
 ifeq ($(strip $(filter-out %ia64 linux%,$(arch) $(osys))),)
   LIBGNAT_TARGET_PAIRS = \
   a-intnam.ads<a-intnam-linux.ads \
diff --git a/gcc/ada/i-vxwork-x86.ads b/gcc/ada/i-vxwork-x86.ads
new file mode 100644 (file)
index 0000000..bbae923
--- /dev/null
@@ -0,0 +1,213 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                 GNU ADA RUN-TIME LIBRARY (GNARL) COMPONENTS              --
+--                                                                          --
+--                      I N T E R F A C E S . V X W O R K S                 --
+--                                                                          --
+--                                   S p e c                                --
+--                                                                          --
+--             Copyright (C) 1999-2004 Ada Core Technologies, Inc.          --
+--                                                                          --
+-- GNARL is free software; you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
+-- for  more details.  You should have  received  a copy of the GNU General --
+-- Public License  distributed with GNARL; see file COPYING.  If not, write --
+-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
+-- MA 02111-1307, USA.                                                      --
+--                                                                          --
+-- As a special exception,  if other files  instantiate  generics from this --
+-- unit, or you link  this unit with other files  to produce an executable, --
+-- this  unit  does not  by itself cause  the resulting  executable  to  be --
+-- covered  by the  GNU  General  Public  License.  This exception does not --
+-- however invalidate  any other reasons why  the executable file  might be --
+-- covered by the  GNU Public License.                                      --
+--                                                                          --
+-- GNARL was developed by the GNARL team at Florida State University.       --
+-- Extensive contributions were provided by Ada Core Technologies, Inc.     --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This is the x86 VxWorks version of this package
+
+--  This package provides a limited binding to the VxWorks API
+--  In particular, it interfaces with the VxWorks hardware interrupt
+--  facilities, allowing the use of low-latency direct-vectored
+--  interrupt handlers. Note that such handlers have a variety of
+--  restrictions regarding system calls and language constructs. In particular,
+--  the use of exception handlers and functions returning variable-length
+--  objects cannot be used. Less restrictive, but higher-latency handlers can
+--  be written using Ada protected procedures, Ada 83 style interrupt entries,
+--  or by signalling an Ada task from within an interrupt handler using a
+--  binary semaphore as described in the VxWorks Programmer's Manual.
+--
+--  For complete documentation of the operations in this package, please
+--  consult the VxWorks Programmer's Manual and VxWorks Reference Manual.
+
+with System.VxWorks;
+
+package Interfaces.VxWorks is
+   pragma Preelaborate (VxWorks);
+
+   ------------------------------------------------------------------------
+   --  Here is a complete example that shows how to handle the Interrupt 0x33
+   --  with a direct-vectored interrupt handler in Ada using this package:
+
+   --  with Interfaces.VxWorks; use Interfaces.VxWorks;
+   --  with System;
+   --
+   --  package P is
+   --
+   --     Count : Integer;
+   --     pragma Atomic (Count);
+   --
+   --     procedure Handler (Parameter : System.Address);
+   --
+   --  end P;
+   --
+   --  package body P is
+   --
+   --     procedure Handler (Parameter : System.Address) is
+   --     begin
+   --        Count := Count + 1;
+   --        logMsg ("received an interrupt" & ASCII.LF & ASCII.Nul);
+   --     end Handler;
+   --  end P;
+   --
+   --  with Interfaces.VxWorks; use Interfaces.VxWorks;
+   --  with Ada.Text_IO; use Ada.Text_IO;
+   --  with Ada.Interrupts;
+   --  with Machine_Code; use Machine_Code;
+   --
+   --  with P; use P;
+   --  procedure Useint is
+   --     --  Be sure to use a reasonable interrupt number for the target
+   --     --  board!
+   --     --  This one is an unreserved interrupt for the Pentium 3 BSP
+   --     Interrupt : constant := 16#33#;
+   --
+   --     task T;
+   --
+   --     S : STATUS;
+   --
+   --     task body T is
+   --     begin
+   --        loop
+   --           Put_Line ("Generating an interrupt...");
+   --           delay 1.0;
+   --
+   --           --  Generate interrupt, using interrupt number
+   --           Asm ("int %0",
+   --                Inputs =>
+   --                  Ada.Interrupts.Interrupt_ID'Asm_Input
+   --                    ("i", Interrupt));
+   --        end loop;
+   --     end T;
+   --
+   --  begin
+   --     S := intConnect (INUM_TO_IVEC (Interrupt), Handler'Access);
+   --
+   --     loop
+   --        delay 2.0;
+   --        Put_Line ("value of count:" & P.Count'Img);
+   --     end loop;
+   --  end Useint;
+   -------------------------------------
+
+   subtype int is Integer;
+
+   type STATUS is new int;
+   --  Equivalent of the C type STATUS
+
+   OK    : constant STATUS := 0;
+   ERROR : constant STATUS := -1;
+
+   type VOIDFUNCPTR is access procedure (parameter : System.Address);
+   type Interrupt_Vector is new System.Address;
+   type Exception_Vector is new System.Address;
+
+   function intConnect
+     (vector    : Interrupt_Vector;
+      handler   : VOIDFUNCPTR;
+      parameter : System.Address := System.Null_Address) return STATUS;
+   --  Binding to the C routine intConnect. Use this to set up an
+   --  user handler. The routine generates a wrapper around the user
+   --  handler to save and restore context
+
+   function intVecGet
+     (Vector : Interrupt_Vector) return VOIDFUNCPTR;
+   --  Binding to the C routine intVecGet. Use this to get the
+   --  existing handler for later restoral
+
+   procedure intVecSet
+     (Vector  : Interrupt_Vector;
+      Handler : VOIDFUNCPTR);
+   --  Binding to the C routine intVecSet. Use this to restore a
+   --  handler obtained using intVecGet
+
+   procedure intVecGet2
+     (vector       : Interrupt_Vector;
+      pFunction    : out VOIDFUNCPTR;
+      pIdtGate     : access int;
+      pIdtSelector : access int);
+   --  Binding to the C routine intVecGet2. Use this to get the
+   --  existing handler for later restoral
+
+   procedure intVecSet2
+     (vector       : Interrupt_Vector;
+      pFunction    : VOIDFUNCPTR;
+      pIdtGate     : access int;
+      pIdtSelector : access int);
+   --  Binding to the C routine intVecSet2. Use this to restore a
+   --  handler obtained using intVecGet2
+
+   function INUM_TO_IVEC (intNum : int) return Interrupt_Vector;
+   --  Equivalent to the C macro INUM_TO_IVEC used to convert an interrupt
+   --  number to an interrupt vector
+
+   procedure logMsg
+     (fmt : String; arg1, arg2, arg3, arg4, arg5, arg6 : int := 0);
+   --  Binding to the C routine logMsg. Note that it is the caller's
+   --  responsibility to ensure that fmt is a null-terminated string
+   --  (e.g logMsg ("Interrupt" & ASCII.NUL))
+
+   type FP_CONTEXT is private;
+   --  Floating point context save and restore. Handlers using floating
+   --  point must be bracketed with these calls. The pFpContext parameter
+   --  should be an object of type FP_CONTEXT that is
+   --  declared local to the handler.
+   --  See the VxWorks Intel Architecture Supplement regarding
+   --  these routines.
+
+   procedure fppRestore (pFpContext : in out FP_CONTEXT);
+   --  Restore floating point context - old style
+
+   procedure fppSave (pFpContext : in out FP_CONTEXT);
+   --  Save floating point context - old style
+
+   procedure fppXrestore (pFpContext : in out FP_CONTEXT);
+   --  Restore floating point context - new style
+
+   procedure fppXsave (pFpContext : in out FP_CONTEXT);
+   --  Save floating point context - new style
+
+private
+
+   type FP_CONTEXT is new System.VxWorks.FP_CONTEXT;
+   --  Target-dependent floating point context type
+
+   pragma Import (C, intConnect, "intConnect");
+   pragma Import (C, intVecGet, "intVecGet");
+   pragma Import (C, intVecSet, "intVecSet");
+   pragma Import (C, intVecGet2, "intVecGet2");
+   pragma Import (C, intVecSet2, "intVecSet2");
+   pragma Import (C, INUM_TO_IVEC, "__gnat_inum_to_ivec");
+   pragma Import (C, logMsg, "logMsg");
+   pragma Import (C, fppRestore, "fppRestore");
+   pragma Import (C, fppSave, "fppSave");
+   pragma Import (C, fppXrestore, "fppXrestore");
+   pragma Import (C, fppXsave, "fppXsave");
+end Interfaces.VxWorks;
diff --git a/gcc/ada/system-linux-ppc.ads b/gcc/ada/system-linux-ppc.ads
new file mode 100644 (file)
index 0000000..abffe5d
--- /dev/null
@@ -0,0 +1,151 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                        GNAT RUN-TIME COMPONENTS                          --
+--                                                                          --
+--                               S Y S T E M                                --
+--                                                                          --
+--                                 S p e c                                  --
+--                          (GNU-Linux/PPC Version)                         --
+--                                                                          --
+--          Copyright (C) 1992-2004 Free Software Foundation, Inc.          --
+--                                                                          --
+-- This specification is derived from the Ada Reference Manual for use with --
+-- GNAT. The copyright notice above, and the license provisions that follow --
+-- apply solely to the  contents of the part following the private keyword. --
+--                                                                          --
+-- GNAT is free software;  you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
+-- for  more details.  You should have  received  a copy of the GNU General --
+-- Public License  distributed with GNAT;  see file COPYING.  If not, write --
+-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
+-- MA 02111-1307, USA.                                                      --
+--                                                                          --
+-- As a special exception,  if other files  instantiate  generics from this --
+-- unit, or you link  this unit with other files  to produce an executable, --
+-- this  unit  does not  by itself cause  the resulting  executable  to  be --
+-- covered  by the  GNU  General  Public  License.  This exception does not --
+-- however invalidate  any other reasons why  the executable file  might be --
+-- covered by the  GNU Public License.                                      --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+package System is
+pragma Pure (System);
+--  Note that we take advantage of the implementation permission to
+--  make this unit Pure instead of Preelaborable, see RM 13.7(36)
+
+   type Name is (SYSTEM_NAME_GNAT);
+   System_Name : constant Name := SYSTEM_NAME_GNAT;
+
+   --  System-Dependent Named Numbers
+
+   Min_Int               : constant := Long_Long_Integer'First;
+   Max_Int               : constant := Long_Long_Integer'Last;
+
+   Max_Binary_Modulus    : constant := 2 ** Long_Long_Integer'Size;
+   Max_Nonbinary_Modulus : constant := Integer'Last;
+
+   Max_Base_Digits       : constant := Long_Long_Float'Digits;
+   Max_Digits            : constant := Long_Long_Float'Digits;
+
+   Max_Mantissa          : constant := 63;
+   Fine_Delta            : constant := 2.0 ** (-Max_Mantissa);
+
+   Tick                  : constant := 0.000_001;
+
+   --  Storage-related Declarations
+
+   type Address is private;
+   Null_Address : constant Address;
+
+   Storage_Unit : constant := 8;
+   Word_Size    : constant := 32;
+   Memory_Size  : constant := 2 ** 32;
+
+   --  Address comparison
+
+   function "<"  (Left, Right : Address) return Boolean;
+   function "<=" (Left, Right : Address) return Boolean;
+   function ">"  (Left, Right : Address) return Boolean;
+   function ">=" (Left, Right : Address) return Boolean;
+   function "="  (Left, Right : Address) return Boolean;
+
+   pragma Import (Intrinsic, "<");
+   pragma Import (Intrinsic, "<=");
+   pragma Import (Intrinsic, ">");
+   pragma Import (Intrinsic, ">=");
+   pragma Import (Intrinsic, "=");
+
+   --  Other System-Dependent Declarations
+
+   type Bit_Order is (High_Order_First, Low_Order_First);
+   Default_Bit_Order : constant Bit_Order := High_Order_First;
+
+   --  Priority-related Declarations (RM D.1)
+
+   Max_Priority           : constant Positive := 30;
+   Max_Interrupt_Priority : constant Positive := 31;
+
+   subtype Any_Priority       is Integer      range  0 .. 31;
+   subtype Priority           is Any_Priority range  0 .. 30;
+   subtype Interrupt_Priority is Any_Priority range 31 .. 31;
+
+   Default_Priority : constant Priority := 15;
+
+private
+
+   type Address is mod Memory_Size;
+   Null_Address : constant Address := 0;
+
+   --------------------------------------
+   -- System Implementation Parameters --
+   --------------------------------------
+
+   --  These parameters provide information about the target that is used
+   --  by the compiler. They are in the private part of System, where they
+   --  can be accessed using the special circuitry in the Targparm unit
+   --  whose source should be consulted for more detailed descriptions
+   --  of the individual switch values.
+
+   AAMP                      : constant Boolean := False;
+   Backend_Divide_Checks     : constant Boolean := False;
+   Backend_Overflow_Checks   : constant Boolean := False;
+   Command_Line_Args         : constant Boolean := True;
+   Configurable_Run_Time     : constant Boolean := False;
+   Denorm                    : constant Boolean := True;
+   Duration_32_Bits          : constant Boolean := False;
+   Exit_Status_Supported     : constant Boolean := True;
+   Fractional_Fixed_Ops      : constant Boolean := False;
+   Frontend_Layout           : constant Boolean := False;
+   Functions_Return_By_DSP   : constant Boolean := False;
+   Machine_Overflows         : constant Boolean := False;
+   Machine_Rounds            : constant Boolean := True;
+   OpenVMS                   : constant Boolean := False;
+   Preallocated_Stacks       : constant Boolean := False;
+   Signed_Zeros              : constant Boolean := True;
+   Stack_Check_Default       : constant Boolean := False;
+   Stack_Check_Probes        : constant Boolean := False;
+   Support_64_Bit_Divides    : constant Boolean := True;
+   Support_Aggregates        : constant Boolean := True;
+   Support_Composite_Assign  : constant Boolean := True;
+   Support_Composite_Compare : constant Boolean := True;
+   Support_Long_Shifts       : constant Boolean := True;
+   Suppress_Standard_Library : constant Boolean := False;
+   Use_Ada_Main_Program_Name : constant Boolean := False;
+   ZCX_By_Default            : constant Boolean := False;
+   GCC_ZCX_Support           : constant Boolean := False;
+   Front_End_ZCX_Support     : constant Boolean := False;
+
+   --  Obsolete entries, to be removed eventually (bootstrap issues!)
+
+   High_Integrity_Mode       : constant Boolean := False;
+   Long_Shifts_Inlined       : constant Boolean := True;
+
+end System;