[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 27 Apr 2004 10:49:37 +0000 (12:49 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 27 Apr 2004 10:49:37 +0000 (12:49 +0200)
2004-04-27  Ed Schonberg  <schonberg@gnat.com>

* a-wtmoio.ads: Formal type must be a modular type, not a signed
integer type.

2004-04-27  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>

* decl.c (gnat_to_gnu_entity, case object): Call
__builtin_update_setjmp_buf.

* gigi.h (update_setjmp_buf): Deleted.
(ADT_update_setjmp_buf_decl, update_setjmp_buf_decl): New.

* misc.c: (update_setjmp_buf): Deleted.

* trans.c (gnat_to_gnu): Call do_pending_stack_adjust and emit_queue
around block of RTL.

* utils.c (init_gigi_decls): Initialize update_setjmp_buf.

From-SVN: r81218

gcc/ada/ChangeLog
gcc/ada/a-wtmoio.ads
gcc/ada/decl.c
gcc/ada/gigi.h
gcc/ada/misc.c
gcc/ada/trans.c
gcc/ada/utils.c

index b7d9daa7daa8dde65ae89c68cd4feb4e9e02277f..80e49c378ed199a77c5a91f9b56b2142dd1d5bee 100644 (file)
@@ -1,3 +1,23 @@
+2004-04-27  Ed Schonberg  <schonberg@gnat.com>
+
+       * a-wtmoio.ads: Formal type must be a modular type, not a signed
+       integer type.
+
+2004-04-27  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * decl.c (gnat_to_gnu_entity, case object): Call
+       __builtin_update_setjmp_buf.
+
+       * gigi.h (update_setjmp_buf): Deleted.
+       (ADT_update_setjmp_buf_decl, update_setjmp_buf_decl): New.
+
+       * misc.c: (update_setjmp_buf): Deleted.
+
+       * trans.c (gnat_to_gnu): Call do_pending_stack_adjust and emit_queue
+       around block of RTL.
+
+       * utils.c (init_gigi_decls): Initialize update_setjmp_buf.
+
 2004-04-26  Thomas Quinot  <quinot@act-europe.fr>
 
        * sem_dist.adb, exp_dist.adb: When constructing a RAS value for a local
index b123223e0da0bdc84d516b2b9950121f2d6e5c79..cec719317ba824593f5281786bacded2c0e3cca8 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-1997 Free Software Foundation, Inc.          --
+--          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 --
@@ -42,7 +42,7 @@
 --  difference in semantics so that it is invisible to the Ada programmer.
 
 private generic
-   type Num is range <>;
+   type Num is mod <>;
 
 package Ada.Wide_Text_IO.Modular_IO is
 
index 289617b3699bd1e7d7d64745b70d604387764456..73c35c511dc3fdbd91c87f9c83f068dbd6be6290 100644 (file)
@@ -1048,7 +1048,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
                || (flag_stack_check && ! STACK_CHECK_BUILTIN
                    && 0 < compare_tree_int (DECL_SIZE_UNIT (gnu_decl),
                                             STACK_CHECK_MAX_VAR_SIZE))))
-         update_setjmp_buf (TREE_VALUE (gnu_block_stack));
+         expand_expr_stmt
+           (build_call_1_expr (update_setjmp_buf_decl,
+                               build_unary_op
+                               (ADDR_EXPR, NULL_TREE,
+                                TREE_VALUE (gnu_block_stack))));
 
        /* If this is a public constant or we're not optimizing and we're not
           making a VAR_DECL for it, make one just for export or debugger
index 5f5b995fc617cd6b3bf1987674a60f17e5e025d9..99b858b223e740d9c13a35e645c7afbcd8b5b769 100644 (file)
@@ -58,10 +58,6 @@ extern tree emit_stack_check (tree);
 /* Make a TRANSFORM_EXPR to later expand GNAT_NODE into code.  */
 extern tree make_transform_expr (Node_Id);
 
-/* Update the setjmp buffer BUF with the current stack pointer.  We assume
-   here that a __builtin_setjmp was done to BUF.  */
-extern void update_setjmp_buf (tree);
-
 /* GNU_TYPE is a type. Determine if it should be passed by reference by
    default.  */
 extern int default_pass_by_ref (tree);
@@ -346,6 +342,7 @@ enum standard_datatypes
   ADT_get_excptr_decl,
   ADT_setjmp_decl,
   ADT_longjmp_decl,
+  ADT_update_setjmp_buf_decl,
   ADT_raise_nodefer_decl,
   ADT_begin_handler_decl,
   ADT_end_handler_decl,
@@ -369,6 +366,7 @@ extern GTY(()) tree gnat_raise_decls[(int) LAST_REASON_CODE + 1];
 #define get_excptr_decl gnat_std_decls[(int) ADT_get_excptr_decl]
 #define setjmp_decl gnat_std_decls[(int) ADT_setjmp_decl]
 #define longjmp_decl gnat_std_decls[(int) ADT_longjmp_decl]
+#define update_setjmp_buf_decl gnat_std_decls[(int) ADT_update_setjmp_buf_decl]
 #define raise_nodefer_decl gnat_std_decls[(int) ADT_raise_nodefer_decl]
 #define begin_handler_decl gnat_std_decls[(int) ADT_begin_handler_decl]
 #define end_handler_decl gnat_std_decls[(int) ADT_end_handler_decl]
index 7be3b5d6a98c136a441c8fa20673fca8dfc6ffce..f40d2728367121cd3c67bdb1d60d9ad26438f171 100644 (file)
@@ -671,40 +671,6 @@ make_transform_expr (Node_Id gnat_node)
   return gnu_result;
 }
 \f
-/* Update the setjmp buffer BUF with the current stack pointer.  We assume
-   here that a __builtin_setjmp was done to BUF.  */
-
-void
-update_setjmp_buf (tree buf)
-{
-  enum machine_mode sa_mode = Pmode;
-  rtx stack_save;
-
-#ifdef HAVE_save_stack_nonlocal
-  if (HAVE_save_stack_nonlocal)
-    sa_mode = insn_data[(int) CODE_FOR_save_stack_nonlocal].operand[0].mode;
-#endif
-#ifdef STACK_SAVEAREA_MODE
-  sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
-#endif
-
-  stack_save
-    = gen_rtx_MEM (sa_mode,
-                  memory_address
-                  (sa_mode,
-                   plus_constant (expand_expr
-                                  (build_unary_op (ADDR_EXPR, NULL_TREE, buf),
-                                   NULL_RTX, VOIDmode, 0),
-                                  2 * GET_MODE_SIZE (Pmode))));
-
-#ifdef HAVE_setjmp
-  if (HAVE_setjmp)
-    emit_insn (gen_setjmp ());
-#endif
-
-  emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
-}
-\f
 /* These routines are used in conjunction with GCC exception handling.  */
 
 /* Map compile-time to run-time tree for GCC exception handling scheme.  */
index 9c2534e89e785f2e9159a9ed4d01c446b4ddacc1..841d5c8e629f783f986e0d327165fec8ed56a989 100644 (file)
@@ -265,6 +265,8 @@ gnat_to_gnu (Node_Id gnat_node)
      we do generates RTL and returns error_mark_node.  */
   if (!global_bindings_p ())
     {
+      do_pending_stack_adjust ();
+      emit_queue ();
       start_sequence ();
       emit_note (NOTE_INSN_DELETED);
       made_sequence = true;
@@ -285,14 +287,19 @@ gnat_to_gnu (Node_Id gnat_node)
            gigi_abort (303);
        }
 
+      do_pending_stack_adjust ();
+      emit_queue ();
       gnu_root = make_expr_stmt_from_rtl (first_nondeleted_insn (get_insns ()),
                                          gnat_node);
       end_sequence ();
     }
   else if (made_sequence)
     {
-      rtx insns = first_nondeleted_insn (get_insns ());
+      rtx insns;
 
+      do_pending_stack_adjust ();
+      emit_queue ();
+      insns = first_nondeleted_insn (get_insns ());
       end_sequence ();
 
       if (insns)
index 8c25f489a740b06da2488572da417c404661c7f6..01be1603930ffa86c7a95cf72de62c3221ae4f6e 100644 (file)
@@ -688,6 +688,18 @@ init_gigi_decls (tree long_long_float_type, tree exception_type)
   DECL_BUILT_IN_CLASS (setjmp_decl) = BUILT_IN_NORMAL;
   DECL_FUNCTION_CODE (setjmp_decl) = BUILT_IN_SETJMP;
 
+  /* update_setjmp_buf updates a setjmp buffer from the current stack pointer
+     address.  */
+  update_setjmp_buf_decl
+    = create_subprog_decl
+      (get_identifier ("__builtin_update_setjmp_buf"), NULL_TREE,
+       build_function_type (void_type_node,
+                           tree_cons (NULL_TREE,  jmpbuf_ptr_type, endlink)),
+       NULL_TREE, 0, 1, 1, 0);
+
+  DECL_BUILT_IN_CLASS (update_setjmp_buf_decl) = BUILT_IN_NORMAL;
+  DECL_FUNCTION_CODE (update_setjmp_buf_decl) = BUILT_IN_UPDATE_SETJMP_BUF;
+
   main_identifier_node = get_identifier ("main");
 }
 \f