OSDN Git Service

2005-06-14 Jose Ruiz <ruiz@adacore.com>
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Jun 2005 08:38:39 +0000 (08:38 +0000)
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 16 Jun 2005 08:38:39 +0000 (08:38 +0000)
* fe.h: Add entry for Opt.Exception_Locations_Suppressed so that gigi
can determine whether pragma Suppress_Exception_Locations is in effect.

* utils2.c (build_call_raise): Do not pass the file name to the
exception handler if pragma Suppress_Exception_Locations is in effect.
(build_allocator): Add and process arg IGNORE_INIT_TYPE.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@101037 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/fe.h
gcc/ada/utils2.c

index f3228dc..39516a6 100644 (file)
@@ -6,7 +6,7 @@
  *                                                                          *
  *                              C Header File                               *
  *                                                                          *
- *          Copyright (C) 1992-2004 Free Software Foundation, Inc.          *
+ *          Copyright (C) 1992-2005 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- *
@@ -150,13 +150,15 @@ extern Boolean In_Same_Source_Unit              (Node_Id, Node_Id);
 
 /* opt: */
 
-#define Global_Discard_Names   opt__global_discard_names
-#define Exception_Mechanism    opt__exception_mechanism
-#define Back_Annotate_Rep_Info opt__back_annotate_rep_info
+#define Global_Discard_Names           opt__global_discard_names
+#define Exception_Locations_Suppressed opt__exception_locations_suppressed
+#define Exception_Mechanism            opt__exception_mechanism
+#define Back_Annotate_Rep_Info         opt__back_annotate_rep_info
 
 typedef enum {Setjmp_Longjmp, Front_End_ZCX, GCC_ZCX} Exception_Mechanism_Type;
 
 extern Boolean Global_Discard_Names;
+extern Boolean Exception_Locations_Suppressed;
 extern Exception_Mechanism_Type Exception_Mechanism;
 extern Boolean Back_Annotate_Rep_Info;
 
index ae56b42..3611264 100644 (file)
@@ -1430,7 +1430,8 @@ tree
 build_call_raise (int msg)
 {
   tree fndecl = gnat_raise_decls[msg];
-  const char *str = Debug_Flag_NN ? "" : ref_filename;
+  const char *str
+    = (Debug_Flag_NN || Exception_Locations_Suppressed) ? "" : ref_filename;
   int len = strlen (str) + 1;
   tree filename = build_string (len, str);
 
@@ -1751,11 +1752,15 @@ build_call_alloc_dealloc (tree gnu_obj, tree gnu_size, unsigned align,
    initial value is INIT, if INIT is nonzero.  Convert the expression to
    RESULT_TYPE, which must be some type of pointer.  Return the tree.
    GNAT_PROC and GNAT_POOL optionally give the procedure to call and
-   the storage pool to use.  */
+   the storage pool to use.  GNAT_NODE is used to provide an error
+   location for restriction violations messages.  If IGNORE_INIT_TYPE is
+   true, ignore the type of INIT for the purpose of determining the size;
+   this will cause the maximum size to be allocated if TYPE is of
+   self-referential size.  */
 
 tree
 build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc,
-                 Entity_Id gnat_pool, Node_Id gnat_node)
+                 Entity_Id gnat_pool, Node_Id gnat_node, bool ignore_init_type)
 {
   tree size = TYPE_SIZE_UNIT (type);
   tree result;
@@ -1839,7 +1844,7 @@ build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc,
 
   /* If we have an initializing expression, see if its size is simpler
      than the size from the type.  */
-  if (init && TYPE_SIZE_UNIT (TREE_TYPE (init))
+  if (!ignore_init_type && init && TYPE_SIZE_UNIT (TREE_TYPE (init))
       && (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (init))) == INTEGER_CST
          || CONTAINS_PLACEHOLDER_P (size)))
     size = TYPE_SIZE_UNIT (TREE_TYPE (init));
@@ -1850,7 +1855,7 @@ build_allocator (tree type, tree init, tree result_type, Entity_Id gnat_proc,
      the maximum size.  */
   if (CONTAINS_PLACEHOLDER_P (size))
     {
-      if (init)
+      if (!ignore_init_type && init)
        size = substitute_placeholder_in_expr (size, init);
       else
        size = max_size (size, true);