]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
sem_res.adb (Resolve_Selected_Component): do not generate a discriminant check if...
authorGeert Bosch <bosch@gcc.gnu.org>
Wed, 19 Dec 2001 00:31:42 +0000 (01:31 +0100)
committerGeert Bosch <bosch@gcc.gnu.org>
Wed, 19 Dec 2001 00:31:42 +0000 (01:31 +0100)
* sem_res.adb (Resolve_Selected_Component): do not generate a
discriminant check if the selected component is a component of
the argument of an initialization procedure.

* trans.c (tree_transform, case of arithmetic operators): If result
type is private, the gnu_type is the base type of the full view,
given that the full view itself may be a subtype.

* sem_res.adb: Minor reformatting

* trans.c (tree_transform, case N_Real_Literal): Add missing third
parameter in call to Machine (unknown horrible effects from this
omission).

* urealp.h: Add definition of Round_Even for call to Machine
Add third parameter for Machine

* sem_warn.adb (Check_One_Unit): Suppress warnings completely on
predefined units in No_Run_Time mode.

* misc.c (insn-codes.h): Now include.

* a-except.adb: Preparation work for future integration of the GCC 3
exception handling mechanism
(Notify_Handled_Exception, Notify_Unhandled_Exception): New routines
to factorize previous code sequences and make them externally callable,
e.g. for the Ada personality routine when the GCC 3 mechanism is used.
(Propagate_Exception, Raise_Current_Excep, Raise_From_Signal_Handler):
Use the new notification routines.

* prj-tree.ads (First_Choice_Of): Document the when others case

* bindgen.adb (Gen_Ada_Init_*): Set priority of environment task in
HI-E mode, in order to support Ravenscar profile properly.

* cstand.adb (Create_Standard): Duration is a 32 bit type in HI-E
mode on 32 bits targets.

* fmap.adb: Initial version.

* fmap.ads: Initial version.

* fname-uf.adb (Get_File_Name): Use mapping if unit name mapped.
If search is successfully done, add to mapping.

* frontend.adb: Initialize the mapping if a -gnatem switch was used.

* make.adb:
(Gnatmake): Add new local variable Mapping_File_Name.
 Create mapping file when using project file(s).
 Delete mapping file before exiting.

* opt.ads (Mapping_File_Name): New variable

* osint.adb (Find_File): Use path name found in mapping, if any.

* prj-env.adb (Create_Mapping_File): New procedure

* prj-env.ads (Create_Mapping_File): New procedure.

* switch.adb (Scan_Front_End_Switches): Add processing for -gnatem
(Mapping_File)

* usage.adb: Add entry for new switch -gnatem.

* Makefile.in: Add dependencies for fmap.o.

* sem_ch10.adb (Analyze_With_Clause): Retrieve proper entity when unit
is a package instantiation rewritten as a package body.
(Install_Withed_Unit): Undo previous change, now redundant.

* layout.adb:
(Compute_Length): Move conversion to Unsigned to callers.
(Get_Max_Size): Convert Len expression to Unsigned after calls to
Compute_Length and Determine_Range.
(Layout_Array_Type): Convert Len expression to Unsigned after calls to
Compute_Length and Determine_Range.
Above changes fix problem with length computation for supernull arrays
where Max (Len, 0) wasn't getting applied due to the Unsigned
conversion used by Compute_Length.

* rtsfind.ads:
(OK_To_Use_In_No_Run_Time_Mode): Allow Ada.Exceptions and
 System.Secondary_Stack.
(OK_To_Use_In_Ravenscar_Mode): New table needed to implement Ravenscar
 in HI-E mode.
Remove unused entity RE_Exception_Data.

* rtsfind.adb (RTE): Allow Ravenscar Profile in HI mode.

* rident.ads (No_Secondary_Stack): New restriction.

From-SVN: r48168

27 files changed:
gcc/ada/ChangeLog
gcc/ada/Makefile.in
gcc/ada/a-except.adb
gcc/ada/bindgen.adb
gcc/ada/cstand.adb
gcc/ada/fmap.adb [new file with mode: 0644]
gcc/ada/fmap.ads [new file with mode: 0644]
gcc/ada/fname-uf.adb
gcc/ada/frontend.adb
gcc/ada/layout.adb
gcc/ada/make.adb
gcc/ada/misc.c
gcc/ada/opt.ads
gcc/ada/osint.adb
gcc/ada/prj-env.adb
gcc/ada/prj-env.ads
gcc/ada/prj-tree.ads
gcc/ada/rident.ads
gcc/ada/rtsfind.adb
gcc/ada/rtsfind.ads
gcc/ada/sem_ch10.adb
gcc/ada/sem_res.adb
gcc/ada/sem_warn.adb
gcc/ada/switch.adb
gcc/ada/trans.c
gcc/ada/urealp.h
gcc/ada/usage.adb

index 78e89807b2337838843f7066ad7c38e7f2fe24d6..abffb95904c3d7963ccc6f1a4e40218c58ca19d2 100644 (file)
@@ -1,3 +1,117 @@
+2001-12-17  Ed Schonberg <schonber@gnat.com>
+
+       * sem_res.adb (Resolve_Selected_Component): do not generate a 
+       discriminant check if the selected component is a component of 
+       the argument of an initialization procedure.
+
+       * trans.c (tree_transform, case of arithmetic operators): If result 
+       type is private, the gnu_type is the base type of the full view, 
+       given that the full view itself may be a subtype.
+       
+2001-12-17  Robert Dewar <dewar@gnat.com>
+
+       * sem_res.adb: Minor reformatting
+       
+       * trans.c (tree_transform, case N_Real_Literal): Add missing third 
+       parameter in call to Machine (unknown horrible effects from this 
+       omission).
+       
+       * urealp.h: Add definition of Round_Even for call to Machine
+       Add third parameter for Machine
+       
+2001-12-17  Ed Schonberg <schonber@gnat.com>
+
+       * sem_warn.adb (Check_One_Unit): Suppress warnings completely on 
+       predefined units in No_Run_Time mode.
+       
+2001-12-17  Richard Kenner <kenner@gnat.com>
+
+       * misc.c (insn-codes.h): Now include.
+       
+2001-12-17  Olivier Hainque <hainque@gnat.com>
+
+       * a-except.adb: Preparation work for future integration of the GCC 3 
+       exception handling mechanism
+       (Notify_Handled_Exception, Notify_Unhandled_Exception): New routines
+       to factorize previous code sequences and make them externally callable,
+       e.g. for the Ada personality routine when the GCC 3 mechanism is used.
+       (Propagate_Exception, Raise_Current_Excep, Raise_From_Signal_Handler):
+       Use the new notification routines.
+       
+2001-12-17  Emmanuel Briot <briot@gnat.com>
+
+       * prj-tree.ads (First_Choice_Of): Document the when others case
+       
+2001-12-17  Arnaud Charlet <charlet@gnat.com>
+
+       * bindgen.adb (Gen_Ada_Init_*): Set priority of environment task in 
+       HI-E mode, in order to support Ravenscar profile properly.
+       
+       * cstand.adb (Create_Standard): Duration is a 32 bit type in HI-E 
+       mode on 32 bits targets.
+       
+2001-12-17  Vincent Celier <celier@gnat.com>
+
+       * fmap.adb: Initial version.
+       
+       * fmap.ads: Initial version.
+       
+       * fname-uf.adb (Get_File_Name): Use mapping if unit name mapped.
+       If search is successfully done, add to mapping.
+       
+       * frontend.adb: Initialize the mapping if a -gnatem switch was used.
+       
+       * make.adb:
+       (Gnatmake): Add new local variable Mapping_File_Name.
+        Create mapping file when using project file(s).
+        Delete mapping file before exiting.
+       
+       * opt.ads (Mapping_File_Name): New variable
+       
+       * osint.adb (Find_File): Use path name found in mapping, if any.
+       
+       * prj-env.adb (Create_Mapping_File): New procedure
+       
+       * prj-env.ads (Create_Mapping_File): New procedure.
+       
+       * switch.adb (Scan_Front_End_Switches): Add processing for -gnatem 
+       (Mapping_File)
+       
+       * usage.adb: Add entry for new switch -gnatem.
+       
+       * Makefile.in: Add dependencies for fmap.o.
+       
+2001-12-17  Ed Schonberg <schonber@gnat.com>
+
+       * sem_ch10.adb (Analyze_With_Clause): Retrieve proper entity when unit 
+       is a package instantiation rewritten as a package body.
+       (Install_Withed_Unit): Undo previous change, now redundant.
+       
+2001-12-17  Gary Dismukes <dismukes@gnat.com>
+
+       * layout.adb:
+       (Compute_Length): Move conversion to Unsigned to callers.
+       (Get_Max_Size): Convert Len expression to Unsigned after calls to
+       Compute_Length and Determine_Range.
+       (Layout_Array_Type): Convert Len expression to Unsigned after calls to
+       Compute_Length and Determine_Range.
+       Above changes fix problem with length computation for supernull arrays
+       where Max (Len, 0) wasn't getting applied due to the Unsigned 
+       conversion used by Compute_Length.
+       
+2001-12-17  Arnaud Charlet <charlet@gnat.com>
+
+       * rtsfind.ads:
+       (OK_To_Use_In_No_Run_Time_Mode): Allow Ada.Exceptions and
+        System.Secondary_Stack.
+       (OK_To_Use_In_Ravenscar_Mode): New table needed to implement Ravenscar
+        in HI-E mode.
+       Remove unused entity RE_Exception_Data.
+       
+       * rtsfind.adb (RTE): Allow Ravenscar Profile in HI mode.
+       
+       * rident.ads (No_Secondary_Stack): New restriction.
+
 2001-12-17  Joel Brobecker <brobecke@gnat.com>
 
        * gnat_rm.texi: Fix minor typos. Found while reading the section 
index 66b7b5f43b97f213452992d9affdbfa5dbcd2a8d..0bd940bc09888554bfde2e71730adff163a148fb 100644 (file)
@@ -296,7 +296,7 @@ GNAT_ADA_OBJS = \
  exp_code.o exp_dbug.o exp_disp.o exp_dist.o exp_fixd.o exp_aggr.o exp_imgv.o \
  exp_intr.o exp_pakd.o exp_prag.o exp_smem.o \
  exp_strm.o exp_tss.o exp_util.o exp_vfpt.o expander.o fname.o fname-uf.o \
- freeze.o frontend.o gnat.o g-hesora.o g-htable.o g-os_lib.o \
+ fmap.o freeze.o frontend.o gnat.o g-hesora.o g-htable.o g-os_lib.o \
  g-speche.o s-crc32.o get_targ.o gnatvsn.o \
  hlo.o hostparm.o impunit.o \
  interfac.o itypes.o inline.o krunch.o lib.o \
@@ -326,7 +326,7 @@ GNATBIND_OBJS = \
  alloc.o bcheck.o binde.o \
  binderr.o bindgen.o bindusg.o \
  butil.o casing.o csets.o \
- debug.o fname.o gnat.o g-hesora.o g-htable.o \
+ debug.o fmap.o fname.o gnat.o g-hesora.o g-htable.o \
  g-os_lib.o gnatbind.o gnatvsn.o hostparm.o \
  krunch.o namet.o opt.o osint.o output.o rident.o s-crc32.o s-assert.o \
  s-parame.o s-sopco3.o s-sopco4.o s-sopco5.o s-stache.o s-stalib.o \
@@ -364,7 +364,7 @@ GNATCMD_RTL_OBJS = adaint.o argv.o raise.o exit.o final.o init.o \
    s-stache.o s-sopco3.o s-sopco4.o s-sopco5.o \
    s-strops.o s-soflin.o s-wchcon.o s-wchcnv.o s-wchjis.o s-unstyp.o 
 
-GNATCMD_OBJS = alloc.o debug.o fname.o gnatcmd.o gnatvsn.o hostparm.o \
+GNATCMD_OBJS = alloc.o debug.o fmap.o fname.o gnatcmd.o gnatvsn.o hostparm.o \
    krunch.o namet.o opt.o osint.o casing.o csets.o widechar.o \
    output.o sdefault.o switch.o stylesw.o validsw.o table.o tree_io.o types.o \
    $(GNATCMD_RTL_OBJS) $(EXTRA_GNATTOOLS_OBJS)
@@ -394,7 +394,7 @@ GNATLINK_RTL_OBJS = \
    s-memory.o s-traceb.o s-wchcnv.o s-wchcon.o s-wchjis.o
 
 GNATLINK_OBJS = gnatlink.o link.o \
-   alloc.o debug.o gnatvsn.o hostparm.o namet.o \
+   alloc.o debug.o fmap.o gnatvsn.o hostparm.o namet.o \
    opt.o osint.o output.o sdefault.o stylesw.o validsw.o \
    switch.o table.o tree_io.o types.o widechar.o \
    $(GNATLINK_RTL_OBJS) $(EXTRA_GNATTOOLS_OBJS)
@@ -483,6 +483,7 @@ GNATLS_OBJS = \
  einfo.o    \
  elists.o   \
  errout.o   \
+ fmap.o     \
  fname.o    \
  gnatls.o   \
  gnatvsn.o  \
@@ -553,7 +554,7 @@ GNATMAKE_RTL_OBJS = adaint.o argv.o raise.o exit.o a-comlin.o \
 
 GNATMAKE_OBJS = ali.o ali-util.o \
  alloc.o atree.o binderr.o butil.o casing.o csets.o debug.o einfo.o elists.o \
- errout.o fname.o fname-uf.o fname-sf.o \
+ errout.o fmap.o fname.o fname-uf.o fname-sf.o \
  gnatmake.o gnatvsn.o hostparm.o krunch.o lib.o make.o makeusg.o \
  mlib.o mlib-fil.o mlib-prj.o mlib-tgt.o mlib-utl.o \
  namet.o nlists.o opt.o osint.o output.o \
@@ -706,7 +707,7 @@ GNATXREF_RTL_OBJS =  \
    s-valuti.o s-valuns.o s-valint.o s-wchcon.o s-wchjis.o s-wchcnv.o
 
 GNATXREF_OBJS = gnatxref.o xr_tabls.o xref_lib.o \
-   alloc.o debug.o gnatvsn.o hostparm.o types.o output.o \
+   alloc.o debug.o fmap.o gnatvsn.o hostparm.o types.o output.o \
    sdefault.o stylesw.o validsw.o tree_io.o opt.o table.o osint.o \
    switch.o widechar.o namet.o \
    $(GNATXREF_RTL_OBJS) $(EXTRA_GNATTOOLS_OBJS)
@@ -729,7 +730,7 @@ GNATFIND_RTL_OBJS = \
    s-valuns.o s-valuti.o s-wchcnv.o s-wchcon.o s-wchjis.o
 
 GNATFIND_OBJS = gnatfind.o xr_tabls.o xref_lib.o \
-   alloc.o debug.o gnatvsn.o hostparm.o namet.o opt.o \
+   alloc.o debug.o fmap.o gnatvsn.o hostparm.o namet.o opt.o \
    osint.o output.o sdefault.o stylesw.o validsw.o switch.o table.o \
    tree_io.o types.o widechar.o \
    $(GNATFIND_RTL_OBJS) $(EXTRA_GNATTOOLS_OBJS)
@@ -3129,6 +3130,9 @@ fname.o : ada.ads a-except.ads alloc.ads debug.ads fname.ads fname.adb \
    system.ads s-assert.ads s-exctab.ads s-stalib.ads s-wchcon.ads \
    table.ads table.adb tree_io.ads types.ads unchconv.ads unchdeal.ads 
 
+fmap.o : alloc.ads debug.ads fmap.ads fmap.adb hostparm.ads namet.ads opt.ads \
+   osint.ads output.ads table.ads table.adb tree_io.ads types.ads
+
 fname-sf.o : alloc.ads casing.ads fname.ads fname-sf.ads fname-sf.adb \
    fname-uf.ads gnat.ads g-os_lib.ads namet.ads osint.ads sfn_scan.ads \
    system.ads s-exctab.ads s-stalib.ads s-stoele.ads table.ads types.ads \
@@ -3522,12 +3526,12 @@ opt.o : ada.ads a-except.ads gnat.ads g-os_lib.ads gnatvsn.ads \
    hostparm.ads opt.ads opt.adb system.ads s-exctab.ads s-stalib.ads \
    s-wchcon.ads tree_io.ads types.ads unchconv.ads unchdeal.ads 
 
-osint.o : ada.ads a-except.ads a-uncdea.ads alloc.ads debug.ads gnat.ads \
-   g-htable.ads g-htable.adb g-os_lib.ads hostparm.ads namet.ads opt.ads \
-   osint.ads osint.adb output.ads sdefault.ads system.ads s-assert.ads \
-   s-exctab.ads s-secsta.ads s-soflin.ads s-stache.ads s-stalib.ads \
-   s-stoele.ads s-wchcon.ads table.ads table.adb tree_io.ads types.ads \
-   unchconv.ads unchdeal.ads 
+osint.o : ada.ads a-except.ads a-uncdea.ads alloc.ads debug.ads fmap.ads \
+   gnat.ads g-htable.ads g-htable.adb g-os_lib.ads hostparm.ads namet.ads \
+   opt.ads osint.ads osint.adb output.ads sdefault.ads system.ads \
+   s-assert.ads s-exctab.ads s-secsta.ads s-soflin.ads s-stache.ads \
+   s-stalib.ads s-stoele.ads s-wchcon.ads table.ads table.adb tree_io.ads \
+   types.ads  unchconv.ads unchdeal.ads
 
 output.o : gnat.ads g-os_lib.ads output.ads output.adb system.ads \
    s-exctab.ads s-stalib.ads types.ads unchconv.ads unchdeal.ads 
index de21237587c4755b92097cedd6e3b5e2c38a3cd5..cc21e035e04c1313b60706635be23434fa756f08 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                            $Revision: 1.1 $
+--                            $Revision$
 --                                                                          --
 --          Copyright (C) 1992-2001 Free Software Foundation, Inc.          --
 --                                                                          --
@@ -365,6 +365,34 @@ package body Ada.Exceptions is
    --            Basic_Exc_Tback    Or    Tback_Decorator
    --          if no decorator set           otherwise
 
+   ----------------------------------------------
+   -- Run-Time Exception Notification Routines --
+   ----------------------------------------------
+
+   --  The notification routines described above are low level "handles" for
+   --  the debugger but what needs to be done at the notification points
+   --  always involves more than just calling one of these routines. The
+   --  routines below provide a common run-time interface for this purpose,
+   --  with variations depending on the handled/not handled status of the
+   --  occurrence. They are exported to be usable by the Ada exception
+   --  handling personality routine when the GCC 3 mechanism is used.
+
+   procedure Notify_Handled_Exception
+     (Handler    : Code_Loc;
+      Is_Others  : Boolean;
+      Low_Notify : Boolean);
+   pragma Export (C, Notify_Handled_Exception,
+      "__gnat_notify_handled_exception");
+   --  Routine to call when a handled occurrence is about to be propagated.
+   --  Low_Notify might be set to false to skip the low level debugger
+   --  notification, which is useful when the information it requires is
+   --  not available, like in the SJLJ case.
+
+   procedure Notify_Unhandled_Exception (Id : Exception_Id);
+   pragma Export (C, Notify_Unhandled_Exception,
+     "__gnat_notify_unhandled_exception");
+   --  Routine to call when an unhandled occurrence is about to be propagated.
+
    --------------------------------
    -- Import Run-Time C Routines --
    --------------------------------
@@ -953,29 +981,10 @@ package body Ada.Exceptions is
                  or else (Hrec.Id = Others_Id
                             and not Excep.Id.Not_Handled_By_Others)
                then
-                  --  Notify the debugger that we have found a handler
-                  --  and are about to propagate an exception.
-
-                  Notify_Exception
-                    (Excep.Id, Hrec.Handler, Hrec.Id = Others_Id);
-
-                  --  Output some exception information if necessary, as
-                  --  specified by GNAT.Exception_Traces. Take care not to
-                  --  output information about internal exceptions.
-                  --
-                  --  ??? The traceback entries we have at this point only
-                  --  consist in the ones we stored while walking up the
-                  --  stack *up to the handler*. All the frames above the
-                  --  subprogram in which the handler is found are missing.
-
-                  if Exception_Trace = Every_Raise
-                    and then not Excep.Id.Not_Handled_By_Others
-                  then
-                     To_Stderr (Nline);
-                     To_Stderr ("Exception raised");
-                     To_Stderr (Nline);
-                     To_Stderr (Tailored_Exception_Information (Excep.all));
-                  end if;
+                  --  Perform the necessary notification tasks.
+
+                  Notify_Handled_Exception
+                    (Hrec.Handler, Hrec.Id = Others_Id, True);
 
                   --  If we already encountered a finalization handler, then
                   --  reset the context to that handler, and enter it.
@@ -1002,15 +1011,10 @@ package body Ada.Exceptions is
          Pop_Frame (Mstate, Info);
       end loop Main_Loop;
 
-      --  Fall through if no "real" exception handler found. First thing
-      --  is to call the dummy Unhandled_Exception routine with the stack
-      --  intact, so that the debugger can get control.
-
-      Unhandled_Exception;
-
-      --  Also make the appropriate Notify_Exception call for the debugger.
+      --  Fall through if no "real" exception handler found. First thing is to
+      --  perform the necessary notification tasks with the stack intact.
 
-      Notify_Exception (Excep.Id, Null_Loc, False);
+      Notify_Unhandled_Exception (Excep.Id);
 
       --  If there were finalization handlers, then enter the top one.
       --  Just because there is no handler does not mean we don't have
@@ -1066,30 +1070,14 @@ package body Ada.Exceptions is
             Call_Chain (Excep);
          end if;
 
-         if not Excep.Exception_Raised then
-            --  This is not a reraise.
+         --  Perform the necessary notification tasks if this is not a
+         --  reraise. Actually ask to skip the low level debugger notification
+         --  call since we do not have the necessary information to "feed"
+         --  it properly.
 
+         if not Excep.Exception_Raised then
             Excep.Exception_Raised := True;
-
-            --  Output some exception information if necessary, as specified
-            --  by GNAT.Exception_Traces. Take care not to output information
-            --  about internal exceptions.
-
-            if Exception_Trace = Every_Raise
-              and then not Excep.Id.Not_Handled_By_Others
-            then
-               begin
-                  --  This is in a block because of the call to
-                  --  Tailored_Exception_Information which might
-                  --  require an exception handler for secondary
-                  --  stack cleanup.
-
-                  To_Stderr (Nline);
-                  To_Stderr ("Exception raised");
-                  To_Stderr (Nline);
-                  To_Stderr (Tailored_Exception_Information (Excep.all));
-               end;
-            end if;
+            Notify_Handled_Exception (Null_Loc, False, False);
          end if;
 
          builtin_longjmp (Jumpbuf_Ptr, 1);
@@ -1112,8 +1100,7 @@ package body Ada.Exceptions is
             Call_Chain (Get_Current_Excep.all);
          end if;
 
-         Unhandled_Exception;
-         Notify_Exception (E, Null_Loc, False);
+         Notify_Unhandled_Exception (E);
          Unhandled_Exception_Terminate;
       end if;
    end Raise_Current_Excep;
@@ -1179,9 +1166,10 @@ package body Ada.Exceptions is
       --  the signal handler that passed control here has already set the
       --  machine state directly.
       --
-      --  ??? Updates related to the implementation of automatic backtraces
-      --  have not been done here. Some action will be required when dealing
-      --  the remaining problems in ZCX mode (incomplete backtraces so far).
+      --  We also do not compute the backtrace for the occurrence since going
+      --  through the signal handler is far from trivial and it is not a
+      --  problem to fail providing a backtrace in the "raised from signal
+      --  handler" case.
 
       --  If the jump buffer pointer is non-null, it means that a jump
       --  buffer was allocated (obviously that happens only in the case
@@ -1204,7 +1192,7 @@ package body Ada.Exceptions is
       --  have no finalizations to do other than at the outer level.
 
       else
-         Unhandled_Exception;
+         Notify_Unhandled_Exception (E);
          Unhandled_Exception_Terminate;
       end if;
    end Raise_From_Signal_Handler;
@@ -1833,6 +1821,58 @@ package body Ada.Exceptions is
       null;
    end Notify_Exception;
 
+   ------------------------------
+   -- Notify_Handled_Exception --
+   ------------------------------
+
+   procedure Notify_Handled_Exception
+     (Handler    : Code_Loc;
+      Is_Others  : Boolean;
+      Low_Notify : Boolean)
+   is
+      Excep  : constant EOA := Get_Current_Excep.all;
+
+   begin
+      --  Notify the debugger that we have found a handler and are about to
+      --  propagate an exception, but only if specifically told to do so.
+
+      if Low_Notify then
+         Notify_Exception (Excep.Id, Handler, Is_Others);
+      end if;
+
+      --  Output some exception information if necessary, as specified by
+      --  GNAT.Exception_Traces. Take care not to output information about
+      --  internal exceptions.
+      --
+      --  ??? In the ZCX case, the traceback entries we have at this point
+      --  only include the ones we stored while walking up the stack *up to
+      --  the handler*. All the frames above the subprogram in which the
+      --  handler is found are missing.
+
+      if Exception_Trace = Every_Raise
+        and then not Excep.Id.Not_Handled_By_Others
+      then
+         To_Stderr (Nline);
+         To_Stderr ("Exception raised");
+         To_Stderr (Nline);
+         To_Stderr (Tailored_Exception_Information (Excep.all));
+      end if;
+
+   end Notify_Handled_Exception;
+
+   ------------------------------
+   -- Notify_Handled_Exception --
+   ------------------------------
+
+   procedure Notify_Unhandled_Exception (Id : Exception_Id) is
+   begin
+      --  Simply perform the two necessary low level notification calls.
+
+      Unhandled_Exception;
+      Notify_Exception (Id, Null_Loc, False);
+
+   end Notify_Unhandled_Exception;
+
    -----------------------------------
    -- Unhandled_Exception_Terminate --
    -----------------------------------
index a45e7923e1f46da1769a8e7fe1eda4b669297a39..b1f19af6e13ef3440ffc7901deda7cc9fdf2ff2a 100644 (file)
@@ -286,6 +286,7 @@ package body Bindgen is
    ---------------------
 
    procedure Gen_Adainit_Ada is
+      Main_Priority : Int renames ALIs.Table (ALIs.First).Main_Priority;
    begin
       WBI ("   procedure " & Ada_Init_Name.all & " is");
 
@@ -347,7 +348,32 @@ package body Bindgen is
       --  the routine call, rather than define the globals in the binder
       --  file to deal with cross-library calls in some systems.
 
-      if not No_Run_Time_Specified then
+      if No_Run_Time_Specified then
+         --  Case of pragma No_Run_Time present. The only global variable
+         --  that might be needed (by the Ravenscar profile) is
+         --  the environment task's priority. Also no exception tables are
+         --  needed.
+
+         if Main_Priority /= No_Main_Priority then
+            WBI ("      Main_Priority : Integer;");
+            WBI ("      pragma Import (C, Main_Priority," &
+                 " ""__gl_main_priority"");");
+            WBI ("");
+         end if;
+
+         WBI ("   begin");
+
+         if Main_Priority /= No_Main_Priority then
+            Set_String ("      Main_Priority := ");
+            Set_Int    (Main_Priority);
+            Set_Char   (';');
+            Write_Statement_Buffer;
+
+         else
+            WBI ("      null;");
+         end if;
+
+      else
          WBI ("");
          WBI ("      procedure Set_Globals");
          WBI ("        (Main_Priority            : Integer;");
@@ -383,7 +409,7 @@ package body Bindgen is
          WBI ("      Set_Globals");
 
          Set_String ("        (Main_Priority            => ");
-         Set_Int    (ALIs.Table (ALIs.First).Main_Priority);
+         Set_Int    (Main_Priority);
          Set_Char   (',');
          Write_Statement_Buffer;
 
@@ -449,14 +475,6 @@ package body Bindgen is
          WBI ("      if Handler_Installed = 0 then");
          WBI ("        Install_Handler;");
          WBI ("      end if;");
-
-      --  Case of pragma No_Run_Time present. Globals are not needed since
-      --  there are no runtime routines to make use of them, and no routine
-      --  to store them in any case! Also no exception tables are needed.
-
-      else
-         WBI ("   begin");
-         WBI ("      null;");
       end if;
 
       Gen_Elab_Calls_Ada;
@@ -469,6 +487,7 @@ package body Bindgen is
    --------------------
 
    procedure Gen_Adainit_C is
+      Main_Priority : Int renames ALIs.Table (ALIs.First).Main_Priority;
    begin
       WBI ("void " & Ada_Init_Name.all & " ()");
       WBI ("{");
@@ -493,9 +512,19 @@ package body Bindgen is
 
       Write_Statement_Buffer;
 
-      --  Code for normal case (no pragma No_Run_Time in use)
+      if No_Run_Time_Specified then
+         --  Case where No_Run_Time pragma is present.
+         --  Set __gl_main_priority if needed for the Ravenscar profile.
 
-      if not No_Run_Time_Specified then
+         if Main_Priority /= No_Main_Priority then
+            Set_String ("   extern int __gl_main_priority = ");
+            Set_Int    (Main_Priority);
+            Set_Char   (';');
+            Write_Statement_Buffer;
+         end if;
+
+      else
+         --  Code for normal case (no pragma No_Run_Time in use)
 
          Gen_Exception_Table_C;
 
@@ -510,7 +539,7 @@ package body Bindgen is
          WBI ("   __gnat_set_globals (");
 
          Set_String ("      ");
-         Set_Int (ALIs.Table (ALIs.First).Main_Priority);
+         Set_Int (Main_Priority);
          Set_Char (',');
          Tab_To (15);
          Set_String ("/* Main_Priority              */");
@@ -584,12 +613,6 @@ package body Bindgen is
          WBI ("     {");
          WBI ("        __gnat_install_handler ();");
          WBI ("     }");
-
-      --  Case where No_Run_Time pragma is present (no globals required)
-      --  Nothing more needs to be done in this case.
-
-      else
-         null;
       end if;
 
       WBI ("");
index fc29af096cc134ad7e4a470059d420cbaaa8164c..1527ce10cf82be3241282857bf2d2267cd01b9fe 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                            $Revision: 1.2 $
+--                            $Revision$
 --                                                                          --
 --          Copyright (C) 1992-2001 Free Software Foundation, Inc.          --
 --                                                                          --
@@ -1003,14 +1003,27 @@ package body CStand is
 
       --  Create type declaration for Duration, using a 64-bit size.
       --  Delta is 1 nanosecond.
+      --  Except on 32 bits machine in No_Run_Time mode, in which case Duration
+      --  is a 32 bits value whose delta is 10E-4 seconds.
 
       Build_Duration : declare
-         Dlo : constant Uint := Intval (Type_Low_Bound (Standard_Integer_64));
-         Dhi : constant Uint := Intval (Type_High_Bound (Standard_Integer_64));
-
-         Delta_Val : constant Ureal := UR_From_Components (Uint_1, Uint_9, 10);
+         Dlo         : Uint;
+         Dhi         : Uint;
+         Delta_Val   : Ureal;
+         Use_32_Bits : constant Boolean :=
+           No_Run_Time and then System_Word_Size = 32;
 
       begin
+         if Use_32_Bits then
+            Dlo := Intval (Type_Low_Bound (Standard_Integer_32));
+            Dhi := Intval (Type_High_Bound (Standard_Integer_32));
+            Delta_Val := UR_From_Components (Uint_1, Uint_4, 10);
+         else
+            Dlo := Intval (Type_Low_Bound (Standard_Integer_64));
+            Dhi := Intval (Type_High_Bound (Standard_Integer_64));
+            Delta_Val := UR_From_Components (Uint_1, Uint_9, 10);
+         end if;
+
          Decl :=
            Make_Full_Type_Declaration (Stloc,
              Defining_Identifier => Standard_Duration,
@@ -1024,9 +1037,15 @@ package body CStand is
                      High_Bound => Make_Real_Literal (Stloc,
                        Realval => Dhi * Delta_Val))));
 
-         Set_Ekind          (Standard_Duration, E_Ordinary_Fixed_Point_Type);
-         Set_Etype          (Standard_Duration, Standard_Duration);
-         Init_Size          (Standard_Duration, 64);
+         Set_Ekind (Standard_Duration, E_Ordinary_Fixed_Point_Type);
+         Set_Etype (Standard_Duration, Standard_Duration);
+
+         if Use_32_Bits then
+            Init_Size (Standard_Duration, 32);
+         else
+            Init_Size (Standard_Duration, 64);
+         end if;
+
          Set_Prim_Alignment (Standard_Duration);
          Set_Delta_Value    (Standard_Duration, Delta_Val);
          Set_Small_Value    (Standard_Duration, Delta_Val);
diff --git a/gcc/ada/fmap.adb b/gcc/ada/fmap.adb
new file mode 100644 (file)
index 0000000..89b3fd8
--- /dev/null
@@ -0,0 +1,332 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT COMPILER COMPONENTS                         --
+--                                                                          --
+--                                 F M A P                                  --
+--                                                                          --
+--                                 B o d y                                  --
+--                                                                          --
+--                            $Revision$
+--                                                                          --
+--          Copyright (C) 1992-2001, Free Software Foundation, Inc.         --
+--                                                                          --
+-- 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.                                                      --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
+--                                                                          --
+------------------------------------------------------------------------------
+
+with GNAT.HTable;
+with Namet;          use Namet;
+with Osint;          use Osint;
+with Output;         use Output;
+with Table;
+
+with Unchecked_Conversion;
+
+package body Fmap is
+
+   subtype Big_String is String (Positive);
+   type Big_String_Ptr is access all Big_String;
+
+   function To_Big_String_Ptr is new Unchecked_Conversion
+     (Source_Buffer_Ptr, Big_String_Ptr);
+
+   package File_Mapping is new Table.Table (
+     Table_Component_Type => File_Name_Type,
+     Table_Index_Type     => Int,
+     Table_Low_Bound      => 0,
+     Table_Initial        => 1_000,
+     Table_Increment      => 1_000,
+     Table_Name           => "Fmap.File_Mapping");
+   --  Mapping table to map unit names to file names.
+
+   package Path_Mapping is new Table.Table (
+     Table_Component_Type => File_Name_Type,
+     Table_Index_Type     => Int,
+     Table_Low_Bound      => 0,
+     Table_Initial        => 1_000,
+     Table_Increment      => 1_000,
+     Table_Name           => "Fmap.Path_Mapping");
+   --  Mapping table to map file names to path names
+
+   type Header_Num is range 0 .. 1_000;
+
+   function Hash (F : Unit_Name_Type) return Header_Num;
+
+   No_Entry : constant Int := -1;
+   --  Signals no entry in following table
+
+   package Unit_Hash_Table is new GNAT.HTable.Simple_HTable (
+     Header_Num => Header_Num,
+     Element    => Int,
+     No_Element => No_Entry,
+     Key        => Unit_Name_Type,
+     Hash       => Hash,
+     Equal      => "=");
+   --  Hash table to map unit names to file names. Used in conjunction with
+   --  table File_Mapping above.
+
+   package File_Hash_Table is new GNAT.HTable.Simple_HTable (
+     Header_Num => Header_Num,
+     Element    => Int,
+     No_Element => No_Entry,
+     Key        => File_Name_Type,
+     Hash       => Hash,
+     Equal      => "=");
+   --  Hash table to map file names to path names. Used in conjunction with
+   --  table Path_Mapping above.
+
+   ---------
+   -- Add --
+   ---------
+
+   procedure Add
+     (Unit_Name : Unit_Name_Type;
+      File_Name : File_Name_Type;
+      Path_Name : File_Name_Type) is
+   begin
+      File_Mapping.Increment_Last;
+      Unit_Hash_Table.Set (Unit_Name, File_Mapping.Last);
+      File_Mapping.Table (File_Mapping.Last) := File_Name;
+      Path_Mapping.Increment_Last;
+      File_Hash_Table.Set (File_Name, Path_Mapping.Last);
+      Path_Mapping.Table (Path_Mapping.Last) := Path_Name;
+   end Add;
+
+   ------------------
+   -- File_Name_Of --
+   ------------------
+
+   function File_Name_Of (Unit : Unit_Name_Type) return File_Name_Type is
+      The_Index : constant Int := Unit_Hash_Table.Get (Unit);
+   begin
+      if The_Index = No_Entry then
+         return No_File;
+
+      else
+         return File_Mapping.Table (The_Index);
+      end if;
+
+   end File_Name_Of;
+
+   ----------
+   -- Hash --
+   ----------
+
+   function Hash (F : Unit_Name_Type) return Header_Num is
+   begin
+      return Header_Num (Int (F) rem Header_Num'Range_Length);
+   end Hash;
+
+   ----------------
+   -- Initialize --
+   ----------------
+
+   procedure Initialize (File_Name : String) is
+      Src : Source_Buffer_Ptr;
+      Hi  : Source_Ptr;
+      BS  : Big_String_Ptr;
+      SP  : String_Ptr;
+
+      Deb : Positive := 1;
+      Fin : Natural  := 0;
+
+      Uname : Unit_Name_Type;
+      Fname : Name_Id;
+      Pname : Name_Id;
+
+      procedure Empty_Tables;
+      --  Remove all entries in case of incorrect mapping file
+
+      procedure Get_Line;
+      --  Get a line from the mapping file
+
+      procedure Report_Truncated;
+      --  Report a warning when the mapping file is truncated
+      --  (number of lines is not a multiple of 3).
+
+      ------------------
+      -- Empty_Tables --
+      ------------------
+
+      procedure Empty_Tables is
+      begin
+         Unit_Hash_Table.Reset;
+         File_Hash_Table.Reset;
+         Path_Mapping.Set_Last (0);
+         File_Mapping.Set_Last (0);
+      end Empty_Tables;
+
+      --------------
+      -- Get_Line --
+      --------------
+
+      procedure Get_Line is
+         use ASCII;
+      begin
+         Deb := Fin + 1;
+
+         --  If not at the end of file, skip the end of line
+         while Deb < SP'Last
+           and then (SP (Deb) = CR
+                     or else SP (Deb) = LF
+                     or else SP (Deb) = EOF)
+         loop
+            Deb := Deb + 1;
+         end loop;
+
+         --  If not at the end of line, find the end of this new line
+
+         if Deb < SP'Last and then SP (Deb) /= EOF then
+            Fin := Deb;
+
+            while Fin < SP'Last
+              and then SP (Fin + 1) /= CR
+              and then SP (Fin + 1) /= LF
+              and then SP (Fin + 1) /= EOF
+            loop
+               Fin := Fin + 1;
+            end loop;
+
+         end if;
+      end Get_Line;
+
+      ----------------------
+      -- Report_Truncated --
+      ----------------------
+
+      procedure Report_Truncated is
+      begin
+         Write_Str ("warning: mapping file """);
+         Write_Str (File_Name);
+         Write_Line (""" is truncated");
+      end Report_Truncated;
+
+   --  start of procedure Initialize
+
+   begin
+      Name_Len := File_Name'Length;
+      Name_Buffer (1 .. Name_Len) := File_Name;
+      Read_Source_File (Name_Enter, 0, Hi, Src, Config);
+
+      if Src = null then
+         Write_Str ("warning: could not read mapping file """);
+         Write_Str (File_Name);
+         Write_Line ("""");
+
+      else
+         BS := To_Big_String_Ptr (Src);
+         SP := BS (1 .. Natural (Hi))'Unrestricted_Access;
+
+         loop
+
+            --  Get the unit name
+
+            Get_Line;
+
+            --  Exit if end of file has been reached
+
+            exit when Deb > Fin;
+
+            pragma Assert (Fin >= Deb + 2);
+            pragma Assert (SP (Fin - 1) = '%');
+            pragma Assert (SP (Fin) = 's' or else SP (Fin) = 'b');
+
+            Name_Len := Fin - Deb + 1;
+            Name_Buffer (1 .. Name_Len) := SP (Deb .. Fin);
+            Uname := Name_Find;
+
+            --  Get the file name
+
+            Get_Line;
+
+            --  If end of line has been reached, file is truncated
+
+            if Deb > Fin then
+               Report_Truncated;
+               Empty_Tables;
+               return;
+            end if;
+
+            Name_Len := Fin - Deb + 1;
+            Name_Buffer (1 .. Name_Len) := SP (Deb .. Fin);
+            Fname := Name_Find;
+
+            --  Get the path name
+
+            Get_Line;
+
+            --  If end of line has been reached, file is truncated
+
+            if Deb > Fin then
+               Report_Truncated;
+               Empty_Tables;
+               return;
+            end if;
+
+            Name_Len := Fin - Deb + 1;
+            Name_Buffer (1 .. Name_Len) := SP (Deb .. Fin);
+            Pname := Name_Find;
+
+            --  Check for duplicate entries
+
+            if Unit_Hash_Table.Get (Uname) /= No_Entry then
+               Write_Str ("warning: duplicate entry """);
+               Write_Str (Get_Name_String (Uname));
+               Write_Str (""" in mapping file """);
+               Write_Str (File_Name);
+               Write_Line ("""");
+               Empty_Tables;
+               return;
+            end if;
+
+            if File_Hash_Table.Get (Fname) /= No_Entry then
+               Write_Str ("warning: duplicate entry """);
+               Write_Str (Get_Name_String (Fname));
+               Write_Str (""" in mapping file """);
+               Write_Str (File_Name);
+               Write_Line ("""");
+               Empty_Tables;
+               return;
+            end if;
+
+            --  Add the mappings for this unit name
+
+            Add (Uname, Fname, Pname);
+
+         end loop;
+
+      end if;
+
+   end Initialize;
+
+   ------------------
+   -- Path_Name_Of --
+   ------------------
+
+   function Path_Name_Of (File : File_Name_Type) return File_Name_Type is
+      Index : Int := No_Entry;
+   begin
+      Index := File_Hash_Table.Get (File);
+
+      if Index = No_Entry then
+         return No_File;
+
+      else
+         return Path_Mapping.Table (Index);
+      end if;
+
+   end Path_Name_Of;
+
+end Fmap;
diff --git a/gcc/ada/fmap.ads b/gcc/ada/fmap.ads
new file mode 100644 (file)
index 0000000..ac9c0e5
--- /dev/null
@@ -0,0 +1,55 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                         GNAT COMPILER COMPONENTS                         --
+--                                                                          --
+--                                 F M A P                                  --
+--                                                                          --
+--                                 S p e c                                  --
+--                                                                          --
+--                            $Revision$
+--                                                                          --
+--          Copyright (C) 1992-2001, Free Software Foundation, Inc.         --
+--                                                                          --
+-- 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.                                                      --
+--                                                                          --
+-- GNAT was originally developed  by the GNAT team at  New York University. --
+-- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
+--                                                                          --
+------------------------------------------------------------------------------
+
+--  This package keeps two mappings: from unit names to file names,
+--  and from file names to path names.
+
+with Types; use Types;
+
+package Fmap is
+
+   procedure Initialize (File_Name : String);
+   --  Initialize the mappings from the mapping file File_Name.
+   --  If the mapping file is incorrect (non existent file, truncated file,
+   --  duplicate entries), output a warning and do not initialize the mappings.
+
+   function Path_Name_Of (File : File_Name_Type) return File_Name_Type;
+   --  Return the path name mapped to the file name File.
+   --  Return No_File if File is not mapped.
+
+   function File_Name_Of (Unit : Unit_Name_Type) return File_Name_Type;
+   --  Return the file name mapped to the unit name Unit.
+   --  Return No_File if Unit is not mapped.
+
+   procedure Add
+     (Unit_Name : Unit_Name_Type;
+      File_Name : File_Name_Type;
+      Path_Name : File_Name_Type);
+   --  Add mapping of Unit_Name to File_Name and of File_Name to Path_Name
+
+end Fmap;
index 37fe82c5c43a24dc9a04714a078ce575e171861f..3572d1a6f7a13df2cccdc6db37fa9fdcebe5cded 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                            $Revision: 1.1 $
+--                            $Revision$
 --                                                                          --
 --          Copyright (C) 1992-2001, Free Software Foundation, Inc.         --
 --                                                                          --
@@ -28,6 +28,7 @@
 
 with Alloc;
 with Debug;    use Debug;
+with Fmap;
 with Krunch;
 with Namet;    use Namet;
 with Opt;      use Opt;
@@ -137,6 +138,9 @@ package body Fname.UF is
 
       N : Int;
 
+      Pname : File_Name_Type := No_File;
+      Fname : File_Name_Type := No_File;
+
    begin
       --  Null or error name means that some previous error occurred
       --  This is an unrecoverable error, so signal it.
@@ -145,6 +149,19 @@ package body Fname.UF is
          raise Unrecoverable_Error;
       end if;
 
+      --  Look into the mapping from unit names to file names
+
+      Fname := Fmap.File_Name_Of (Uname);
+
+      --  If the unit name is already mapped, return the corresponding
+      --  file name.
+
+      if Fname /= No_File then
+         return Fname;
+      end if;
+
+      --  If there is a specific SFN pragma, return the corresponding file name
+
       N := SFN_HTable.Get (Uname);
 
       if N /= No_Entry then
@@ -367,14 +384,25 @@ package body Fname.UF is
 
                   --  Check if file exists and if so, return the entry
 
-                  elsif Find_File (Fnam, Source) /= No_File then
-                     return Fnam;
+                  else
+                     Pname := Find_File (Fnam, Source);
+
+                  --  Check if file exists and if so, return the entry
 
-                  --  This entry does not match after all, because this is
-                  --  the first search loop, and the file does not exist.
+                     if Pname /= No_File then
 
-                  else
-                     Fnam := No_File;
+                        --  Add to mapping, so that we don't do another
+                        --  path search in Find_File for this file name
+
+                        Fmap.Add (Get_File_Name.Uname, Fnam, Pname);
+                        return Fnam;
+
+                     --  This entry does not match after all, because this is
+                     --  the first search loop, and the file does not exist.
+
+                     else
+                        Fnam := No_File;
+                     end if;
                   end if;
                end if;
 
index bbfdaee5c8c5adc4dd61a9e25e3bc9f429fcf0c8..a42626a07ab4eb78e9a2ce35158cdb998ba0bc06 100644 (file)
@@ -33,6 +33,7 @@ with Debug;    use Debug;
 with Elists;
 with Exp_Ch11;
 with Exp_Dbug;
+with Fmap;
 with Fname.UF;
 with Hostparm; use Hostparm;
 with Inline;   use Inline;
@@ -184,6 +185,13 @@ begin
 
    end if;
 
+   --  If there was a -gnatem switch, initialize the mappings of unit names to
+   --  file names and of file names to path names from the mapping file.
+
+   if Mapping_File_Name /= null then
+      Fmap.Initialize (Mapping_File_Name.all);
+   end if;
+
    --  We have now processed the command line switches, and the gnat.adc
    --  file, so this is the point at which we want to capture the values
    --  of the configuration switches (see Opt for further details).
index 311a6e4f86cbfc392761fce88cf58a8723e706d6..2cf97cb2fb8de82c13bb167b2deec578449456d2 100644 (file)
@@ -524,13 +524,12 @@ package body Layout is
       end if;
 
       return
-        Convert_To (Standard_Unsigned,
-          Assoc_Add (Loc,
-            Left_Opnd =>
-              Assoc_Subtract (Loc,
-                Left_Opnd  => Hi_Op,
-                Right_Opnd => Lo_Op),
-            Right_Opnd => Make_Integer_Literal (Loc, 1)));
+        Assoc_Add (Loc,
+          Left_Opnd =>
+            Assoc_Subtract (Loc,
+              Left_Opnd  => Hi_Op,
+              Right_Opnd => Lo_Op),
+          Right_Opnd => Make_Integer_Literal (Loc, 1));
    end Compute_Length;
 
    ----------------------
@@ -749,6 +748,8 @@ package body Layout is
                Set_Parent (Len, E);
                Determine_Range (Len, OK, LLo, LHi);
 
+               Len := Convert_To (Standard_Unsigned, Len);
+
                --  If we cannot verify that range cannot be super-flat,
                --  we need a max with zero, since length must be non-neg.
 
@@ -1059,6 +1060,8 @@ package body Layout is
                Set_Parent (Len, E);
                Determine_Range (Len, OK, LLo, LHi);
 
+               Len := Convert_To (Standard_Unsigned, Len);
+
                --  If range definitely flat or superflat, result size is zero
 
                if OK and then LHi <= 0 then
index a18c81e68cd1b9ca057543d2f0cc5af7bd9210d0..7e0fd58cfb5058d55ba4d4b1e30e440cf63a74d0 100644 (file)
@@ -2508,6 +2508,10 @@ package body Make is
       --  be rebuild (if we rebuild mains), even in the case when it is not
       --  really necessary, because it is too hard to decide.
 
+      Mapping_File_Name : Temp_File_Name;
+      --  The name of the temporary mapping file that is copmmunicated
+      --  to the compiler through a -gnatem switch, when using project files.
+
    begin
       Do_Compile_Step := True;
       Do_Bind_Step    := True;
@@ -2854,7 +2858,7 @@ package body Make is
          --  in procedure Compile_Sources.
 
          The_Saved_Gcc_Switches :=
-           new Argument_List (1 .. Saved_Gcc_Switches.Last + 1);
+           new Argument_List (1 .. Saved_Gcc_Switches.Last + 2);
 
          for J in 1 .. Saved_Gcc_Switches.Last loop
             The_Saved_Gcc_Switches (J) := Saved_Gcc_Switches.Table (J);
@@ -2863,9 +2867,19 @@ package body Make is
 
          --  We never use gnat.adc when a project file is used
 
-         The_Saved_Gcc_Switches (The_Saved_Gcc_Switches'Last) :=
+         The_Saved_Gcc_Switches (The_Saved_Gcc_Switches'Last - 1) :=
            No_gnat_adc;
 
+         --  Create a temporary mapping file and add the switch -gnatem
+         --  with its name to the compiler.
+
+         Prj.Env.Create_Mapping_File (Name => Mapping_File_Name);
+         The_Saved_Gcc_Switches (The_Saved_Gcc_Switches'Last) :=
+           new String'("-gnatem" & Mapping_File_Name);
+
+         --  Check if there are any relative search paths in the switches.
+         --  Fail if there is one.
+
          for J in 1 .. Gcc_Switches.Last loop
             Test_If_Relative_Path (Gcc_Switches.Table (J));
          end loop;
@@ -3184,7 +3198,7 @@ package body Make is
                  and then not No_Main_Subprogram
                then
                   if Osint.Number_Of_Files = 1 then
-                     return;
+                     exit Multiple_Main_Loop;
 
                   else
                      goto Next_Main;
@@ -3231,7 +3245,7 @@ package body Make is
                      end if;
 
                      if Osint.Number_Of_Files = 1 then
-                        return;
+                        exit Multiple_Main_Loop;
 
                      else
                         goto Next_Main;
@@ -3477,6 +3491,19 @@ package body Make is
          end if;
       end loop Multiple_Main_Loop;
 
+      --  Delete the temporary mapping file that was created if we are
+      --  using project files.
+
+      if Main_Project /= No_Project then
+         declare
+            Success : Boolean;
+
+         begin
+            Delete_File (Name => Mapping_File_Name, Success => Success);
+         end;
+
+      end if;
+
       Exit_Program (E_Success);
 
    exception
index 9a01430b7be0d8400df56d745595350615e73b97..d422f60f9b265282bade4046b232742a007b7d6d 100644 (file)
@@ -45,6 +45,7 @@
 #include "expr.h"
 #include "ggc.h"
 #include "flags.h"
+#include "insn-codes.h"
 #include "insn-flags.h"
 #include "insn-config.h"
 #include "optabs.h"
index 9ed3579266d2f24afff8242fbf921c7ed36e8fee..5dcc8c7de4850a55f1ae91a67d68eb9b587c5c6a 100644 (file)
@@ -470,6 +470,11 @@ package Opt is
    --  When True we are allowed to look in the primary directory to locate
    --  other source or library files.
 
+   Mapping_File_Name : String_Ptr := null;
+   --  GNAT
+   --  File name of mapping between unit names, file names and path names.
+   --  (given by switch -gnatem)
+
    Maximum_Errors : Int := 9999;
    --  GNAT, GNATBIND
    --  Maximum number of errors before compilation is terminated
index ba527b41b02e2195c324edf993f6f180af6480c5..1856f16d6c9d1385d3932ea58cd81fb1a266379e 100644 (file)
@@ -26,6 +26,7 @@
 --                                                                          --
 ------------------------------------------------------------------------------
 
+with Fmap;
 with Hostparm;
 with Namet;    use Namet;
 with Opt;      use Opt;
@@ -1001,6 +1002,18 @@ package body Osint is
          --  Otherwise do standard search for source file
 
          else
+
+            --  Check the mapping of this file name
+
+            File := Fmap.Path_Name_Of (N);
+
+            --  If the file name is mapped to a path name, return the
+            --  corresponding path name
+
+            if File /= No_File then
+               return File;
+            end if;
+
             --  First place to look is in the primary directory (i.e. the same
             --  directory as the source) unless this has been disabled with -I-
 
index 65f282b183cc8ef93081d12d2c7a51574f78cd95..e52165d167a09980a468c0ba71739767bbbc0a9b 100644 (file)
@@ -788,6 +788,95 @@ package body Prj.Env is
 
    end Create_Config_Pragmas_File;
 
+   -------------------------
+   -- Create_Mapping_File --
+   -------------------------
+
+   procedure Create_Mapping_File (Name : in out Temp_File_Name) is
+      File          : File_Descriptor := Invalid_FD;
+      The_Unit_Data : Unit_Data;
+      Data          : File_Name_Data;
+
+      procedure Put (S : String);
+      --  Put a line in the mapping file
+
+      procedure Put_Data (Spec : Boolean);
+      --  Put the mapping of the spec or body contained in Data in the file
+      --  (3 lines).
+
+      procedure Put (S : String) is
+         Last : Natural;
+
+      begin
+         Last := Write (File, S'Address, S'Length);
+
+         if Last /= S'Length then
+            Osint.Fail ("Disk full");
+         end if;
+
+      end Put;
+
+      procedure Put_Data (Spec : Boolean) is
+      begin
+         Put (Get_Name_String (The_Unit_Data.Name));
+
+         if Spec then
+            Put ("%s");
+         else
+            Put ("%b");
+         end if;
+
+         Put (S => (1 => ASCII.LF));
+         Put (Get_Name_String (Data.Name));
+         Put (S => (1 => ASCII.LF));
+         Put (Get_Name_String (Data.Path));
+         Put (S => (1 => ASCII.LF));
+      end Put_Data;
+
+   begin
+      GNAT.OS_Lib.Create_Temp_File (File, Name => Name);
+
+      if File = Invalid_FD then
+         Osint.Fail
+           ("unable to create temporary mapping file");
+
+      elsif Opt.Verbose_Mode then
+         Write_Str ("Creating temp mapping file """);
+         Write_Str (Name);
+         Write_Line ("""");
+      end if;
+
+      --  For all units in table Units
+
+      for Unit in 1 .. Units.Last loop
+         The_Unit_Data := Units.Table (Unit);
+
+         --  If the unit has a valid name
+
+         if The_Unit_Data.Name /= No_Name then
+            Data := The_Unit_Data.File_Names (Specification);
+
+            --  If there is a spec, put it mapping in the file
+
+            if Data.Name /= No_Name then
+               Put_Data (Spec => True);
+            end if;
+
+            Data := The_Unit_Data.File_Names (Body_Part);
+
+            --  If there is a body (or subunit) put its mapping in the file
+
+            if Data.Name /= No_Name then
+               Put_Data (Spec => False);
+            end if;
+
+         end if;
+      end loop;
+
+      GNAT.OS_Lib.Close (File);
+
+   end Create_Mapping_File;
+
    ------------------------------------
    -- File_Name_Of_Library_Unit_Body --
    ------------------------------------
index 272c559282a67eacefad82c91c657c1ad7afc5cb..f418dc34cec3a846c1873c23611bc180701add5b 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---                            $Revision: 1.10 $
+--                            $Revision$
 --                                                                          --
 --             Copyright (C) 2001 Free Software Foundation, Inc.            --
 --                                                                          --
@@ -39,6 +39,11 @@ package Prj.Env is
    procedure Print_Sources;
    --  Output the list of sources, after Project files have been scanned
 
+   procedure Create_Mapping_File (Name : in out Temp_File_Name);
+   --  Create a temporary mapping file.
+   --  For each unit, put the mapping of its spec and or body to its
+   --  file name and path name in this file.
+
    procedure Create_Config_Pragmas_File
      (For_Project  : Project_Id;
       Main_Project : Project_Id);
index 6cc7c6b99d8a9ad16a1f8447d245fc21cf761e05..c5526b8527e05177aff04b11d8e6733c4d1587b2 100644 (file)
@@ -299,7 +299,8 @@ package Prj.Tree is
    function First_Choice_Of
      (Node  : Project_Node_Id)
       return  Project_Node_Id;
-   --  Only valid for N_Case_Item nodes
+   --  Return the first choice in a N_Case_Item, or Empty_Node if
+   --  this is when others.
 
    function Next_Case_Item
      (Node  : Project_Node_Id)
@@ -708,7 +709,8 @@ package Prj.Tree is
       --    --  Name:      not used
       --    --  Path_Name: not used
       --    --  Expr_Kind: not used
-      --    --  Field1:    first choice (literal string)
+      --    --  Field1:    first choice (literal string), or Empty_Node
+      --    --             for when others
       --    --  Field2:    first declarative item
       --    --  Field3:    next case item
       --    --  Value:     not used
index 3eb65408433b2a7018eff4a0155f33a31b79f323..2a9f875a59eb0009519dae0b58720291744143e6 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---                            $Revision: 1.12 $
+--                            $Revision$
 --                                                                          --
 --          Copyright (C) 1992-2001 Free Software Foundation, Inc.          --
 --                                                                          --
@@ -73,6 +73,7 @@ package Rident is
       No_Reentrancy,                           -- (RM H.4(23))
       No_Relative_Delay,                       -- GNAT
       No_Requeue,                              -- GNAT
+      No_Secondary_Stack,                      -- GNAT
       No_Select_Statements,                    -- GNAT (Ravenscar)
       No_Standard_Storage_Pools,               -- GNAT
       No_Streams,                              -- GNAT
index 08b6e5e2a18f4a649328f08f6c7dc10493f819b8..2723e4f79c6da9ee5a25d3cc92290db6d82c0a3a 100644 (file)
@@ -582,6 +582,8 @@ package body Rtsfind is
       Pkg_Ent  : Entity_Id;
       Ename    : Name_Id;
 
+      Ravenscar : constant Boolean := Restricted_Profile;
+
       procedure Check_RPC;
       --  Reject programs that make use of distribution features not supported
       --  on the current target. On such targets (VMS, Vxworks, others?) we
@@ -712,13 +714,17 @@ package body Rtsfind is
    --  Start of processing for RTE
 
    begin
-      --  Check violation of no run time mode
+      --  Check violation of no run time and ravenscar mode
 
       if No_Run_Time
         and then not OK_To_Use_In_No_Run_Time_Mode (U_Id)
       then
-         Disallow_In_No_Run_Time_Mode (Current_Error_Node);
-         return Empty;
+         if not Ravenscar
+           or else not OK_To_Use_In_Ravenscar_Mode (U_Id)
+         then
+            Disallow_In_No_Run_Time_Mode (Current_Error_Node);
+            return Empty;
+         end if;
       end if;
 
       --  Doing a rtsfind in system.ads is special, as we cannot do this
@@ -843,6 +849,7 @@ package body Rtsfind is
         and then not
           Is_Predefined_File_Name
             (Unit_File_Name (Get_Source_Unit (Current_Error_Node)))
+        and then not Ravenscar
       then
          Disallow_In_No_Run_Time_Mode (Current_Error_Node);
       end if;
index 6b30cf154dfcf880c4fa5181df5d1f88c6ca0222..fe6c31b0dc2261ebc0824d1f39569fb320a29559 100644 (file)
@@ -378,6 +378,7 @@ package Rtsfind is
 
    OK_To_Use_In_No_Run_Time_Mode : array (RTU_Id) of Boolean :=
      (Ada_Tags                => True,
+      Ada_Exceptions          => True,
       Interfaces              => True,
       System                  => True,
       System_Fat_Flt          => True,
@@ -387,12 +388,28 @@ package Rtsfind is
       System_Machine_Code     => True,
       System_Storage_Elements => True,
       System_Unsigned_Types   => True,
+      System_Secondary_Stack  => True,
       others                  => False);
    --  This array defines the set of packages that can legitimately be
    --  accessed by Rtsfind in No_Run_Time mode. Any attempt to load
    --  any other package in this mode will result in a message noting
    --  use of a feature not supported in high integrity mode.
 
+   OK_To_Use_In_Ravenscar_Mode : array (RTU_Id) of Boolean :=
+     (System_Interrupts                             => True,
+      System_Tasking                                => True,
+      System_Tasking_Protected_Objects              => True,
+      System_Tasking_Restricted_Stages              => True,
+      System_Tasking_Protected_Objects_Single_Entry => True,
+      System_Task_Info                              => True,
+      System_Parameters                             => True,
+      Ada_Real_Time                                 => True,
+      Ada_Real_Time_Delays                          => True,
+      others                                        => False);
+   --  This array defines the set of packages that can legitimately be
+   --  accessed by Rtsfind in Ravenscar mode, in addition to the
+   --  No_Run_Time units which are also allowed.
+
    --------------------------
    -- Runtime Entity Table --
    --------------------------
@@ -1032,7 +1049,6 @@ package Rtsfind is
      RE_Shared_Var_WOpen,                -- System.Shared_Storage
 
      RE_Abort_Undefer_Direct,            -- System.Standard_Library
-     RE_Exception_Data,                  -- System.Standard_Library
      RE_Exception_Data_Ptr,              -- System.Standard_Library
 
      RE_Integer_Address,                 -- System.Storage_Elements
@@ -1953,7 +1969,6 @@ package Rtsfind is
      RE_Shared_Var_WOpen                 => System_Shared_Storage,
 
      RE_Abort_Undefer_Direct             => System_Standard_Library,
-     RE_Exception_Data                   => System_Standard_Library,
      RE_Exception_Data_Ptr               => System_Standard_Library,
 
      RE_Integer_Address                  => System_Storage_Elements,
index 1ef523c23a31e40e94e6d9f35c6dbbe8c7f57c50..a85d8a1a364abf55bd5bbf414e527e8b9b093cc9 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                            $Revision: 1.2 $
+--                            $Revision$
 --                                                                          --
 --          Copyright (C) 1992-2001 Free Software Foundation, Inc.          --
 --                                                                          --
@@ -1486,15 +1486,16 @@ package body Sem_Ch10 is
          E_Name := Defining_Entity (U);
 
       --  Note: in the following test, Unit_Kind is the original Nkind, but
-      --  in the case of an instantiation, the call to Semantics above will
-      --  have replaced the unit by its instantiated version.
-
-      elsif Unit_Kind = N_Package_Instantiation
+      --  in the case of an instantiation, semantic analysis above will
+      --  have replaced the unit by its instantiated version. If the instance
+      --  body has been generated, the instance now denotes the body entity.
+      --  For visibility purposes we need the entity of its spec.
+
+      elsif (Unit_Kind = N_Package_Instantiation
+              or else Nkind (Original_Node (Unit (Library_Unit (N)))) =
+                N_Package_Instantiation)
         and then Nkind (U) = N_Package_Body
       then
-         --  Instantiation node is replaced with body of instance.
-         --  Unit name is defining unit name in corresponding spec.
-
          E_Name := Corresponding_Spec (U);
 
       elsif Unit_Kind = N_Package_Instantiation
@@ -2712,17 +2713,6 @@ package body Sem_Ch10 is
       P     : constant Entity_Id := Scope (Uname);
 
    begin
-      --  If the unit is a package instantiation, its body may have been
-      --  generated for an inner instance, and the instance now denotes the
-      --  body entity. For visibility purposes we need the instance in the
-      --  specification.
-
-      if Ekind (Uname) = E_Package_Body
-        and then Is_Generic_Instance (Uname)
-      then
-         Uname := Spec_Entity (Uname);
-      end if;
-
       --  We do not apply the restrictions to an internal unit unless
       --  we are compiling the internal unit as a main unit. This check
       --  is also skipped for dummy units (for missing packages).
index e48319ff055b2237a294ed85c94afe02eb1b74c8..09b55850ac7aada5d5084fefd4dc0f343b7c8b52 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                            $Revision: 1.4 $
+--                            $Revision$
 --                                                                          --
 --          Copyright (C) 1992-2001, Free Software Foundation, Inc.         --
 --                                                                          --
@@ -5033,6 +5033,25 @@ package body Sem_Res is
       It1   : Interp;
       Found : Boolean;
 
+      function Init_Component return Boolean;
+      --  Check whether this is the initialization of a component within an
+      --  init_proc (by assignment or call to another init_proc). If true,
+      --  there is no need for a discriminant check.
+
+      --------------------
+      -- Init_Component --
+      --------------------
+
+      function Init_Component return Boolean is
+      begin
+         return Inside_Init_Proc
+           and then Nkind (Prefix (N)) = N_Identifier
+           and then Chars (Prefix (N)) = Name_uInit
+           and then Nkind (Parent (Parent (N))) = N_Case_Statement_Alternative;
+      end Init_Component;
+
+   --  Start of processing for Resolve_Selected_Component
+
    begin
       if Is_Overloaded (P) then
 
@@ -5128,6 +5147,7 @@ package body Sem_Res is
         and then Present (Discriminant_Checking_Func
                            (Original_Record_Component (Entity (S))))
         and then not Discriminant_Checks_Suppressed (T)
+        and then not Init_Component
       then
          Set_Do_Discriminant_Check (N);
       end if;
index f6f5020118a46e364405ae9d00bcdc5cb4a68a60..c6107e49e9bf81a420186f3ea9fcefcad7a56314 100644 (file)
@@ -643,6 +643,15 @@ package body Sem_Warn is
 
          if not In_Extended_Main_Source_Unit (Cnode) then
             return;
+
+         --  In No_Run_Time_Mode, we remove the bodies of non-
+         --  inlined subprograms, which may lead to spurious
+         --  warnings, clearly undesirable.
+
+         elsif No_Run_Time
+           and then Is_Predefined_File_Name (Unit_File_Name (Unit))
+         then
+            return;
          end if;
 
          --  Loop through context items in this unit
@@ -674,15 +683,6 @@ package body Sem_Warn is
                      if Unit = Spec_Unit then
                         Set_Unreferenced_In_Spec (Item);
 
-                     --  In No_Run_Time_Mode, we remove the bodies of non-
-                     --  inlined subprograms, which may lead to spurious
-                     --  warnings, clearly undesirable.
-
-                     elsif No_Run_Time
-                       and then Is_Predefined_File_Name (Unit_File_Name (Unit))
-                     then
-                        null;
-
                      --  Otherwise simple unreferenced message
 
                      else
index 5749e0ff7114d342d3a50261c3610a45e044afe9..36ada8c4c6fb7ecae589794a16d6a7bacc9fe2ae 100644 (file)
@@ -606,6 +606,8 @@ package body Switch is
 
                case Switch_Chars (Ptr) is
 
+                  --  Configuration pragmas
+
                   when 'c' =>
                      Ptr := Ptr + 1;
                      if Ptr > Max then
@@ -617,6 +619,19 @@ package body Switch is
 
                      return;
 
+                  --  Mapping file
+
+                  when 'm' =>
+                     Ptr := Ptr + 1;
+                     if Ptr > Max then
+                        Osint.Fail ("Invalid switch: ", "em");
+                     end if;
+
+                     Mapping_File_Name :=
+                       new String'(Switch_Chars (Ptr .. Max));
+
+                     return;
+
                   when others =>
                      Osint.Fail ("Invalid switch: ",
                                    (1 => 'e', 2 => Switch_Chars (Ptr)));
index 1d6bf9825595b8d15b8bcc3308c9d21d113928ce..9864efa750b2f6b2ca94068310a8bbda1819d841 100644 (file)
@@ -585,9 +585,9 @@ tree_transform (gnat_node)
          else
            {
              if (! Is_Machine_Number (gnat_node))
-               ur_realval =
-                   Machine (Base_Type (Underlying_Type (Etype (gnat_node))),
-                                     ur_realval);
+               ur_realval
+                 = Machine (Base_Type (Underlying_Type (Etype (gnat_node))),
+                            ur_realval, Round_Even);
 
              gnu_result
                = UI_To_gnu (Numerator (ur_realval), gnu_result_type);
@@ -1858,6 +1858,13 @@ tree_transform (gnat_node)
            gnu_rhs = maybe_unconstrained_array (gnu_rhs);
          }
 
+       /* If the result type is a private type, its full view may be a
+          numeric subtype. The representation we need is that of its base
+          type, given that it is the result of an arithmetic operation.  */
+        else if (Is_Private_Type (Etype (gnat_node))) 
+         gnu_type = gnu_result_type
+           = get_unpadded_type (Base_Type (Full_View (Etype (gnat_node))));
+
        /* If this is a shift whose count is not guaranteed to be correct,
           we need to adjust the shift count.  */
        if (IN (Nkind (gnat_node), N_Op_Shift)
index 24afb55b598a5fbbaccf2dfcf5f5c7e0d6a0cdbd..3d0efadf593acaf5939e26eda47b367cf72da717 100644 (file)
@@ -6,7 +6,7 @@
  *                                                                          *
  *                              C Header File                               *
  *                                                                          *
- *                            $Revision: 1.1 $
+ *                            $Revision$
  *                                                                          *
  *          Copyright (C) 1992-2001 Free Software Foundation, Inc.          *
  *                                                                          *
@@ -46,5 +46,8 @@ extern Boolean UR_Is_Negative PARAMS ((Ureal));
 #define UR_Is_Zero urealp__ur_is_zero
 extern Boolean UR_Is_Zero      PARAMS ((Ureal));
 
+enum Rounding_Mode {Floor = 0, Ceiling = 1, Round = 2, Round_Even = 3};
+
 #define Machine eval_fat__machine
-extern Ureal Machine           PARAMS ((Entity_Id, Ureal));
+extern Ureal Machine           PARAMS ((Entity_Id, Ureal,
+                                        enum Rounding_Mode));
index 7d64c148c5fabea22d1ce958d4f8168207a68c7c..4393df19e85a567ba7ad938d1b9a30c94ef629fd 100644 (file)
@@ -155,6 +155,11 @@ begin
    Write_Switch_Char ("ec?");
    Write_Line ("Specify configuration pragmas file, e.g. -gnatec/x/f.adc");
 
+   --  Line for -gnatem switch
+
+   Write_Switch_Char ("em?");
+   Write_Line ("Specify mapping file, e.g. -gnatemmapping");
+
    --  Line for -gnatE switch
 
    Write_Switch_Char ("E");