OSDN Git Service

* stor-layout.c (reference_types_internal): New variable.
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Feb 2001 13:04:43 +0000 (13:04 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 6 Feb 2001 13:04:43 +0000 (13:04 +0000)
(internal_reference_types): New function.
(layout_type, case REFERENCE_TYPE): Make Pmode if internal.
* tree.h (internal_reference_types): New declaration.

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

gcc/ChangeLog
gcc/stor-layout.c
gcc/tree.h

index 121a527..e0a23ad 100644 (file)
@@ -1,5 +1,10 @@
 Tue Feb  6 07:54:51 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
+       * stor-layout.c (reference_types_internal): New variable.
+       (internal_reference_types): New function.
+       (layout_type, case REFERENCE_TYPE): Make Pmode if internal.
+       * tree.h (internal_reference_types): New declaration.
+
        * cse.c (find_best_addr): Fix typo in computing cost.
 
 Mon Feb  5 21:56:16 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
index 0f057ef..7bb5b4a 100644 (file)
@@ -1,6 +1,6 @@
 /* C-compiler utilities for types and variables storage layout
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1996, 1998,
-   1999, 2000 Free Software Foundation, Inc.
+   1999, 2000, 2001 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -50,6 +50,11 @@ unsigned int maximum_field_alignment;
    May be overridden by front-ends.  */
 unsigned int set_alignment = 0;
 
+/* Nonzero if all REFERENCE_TYPEs are internal and hence should be
+   allocated in Pmode, not ptr_mode.   Set only by internal_reference_types
+   called only by a front end.  */
+static int reference_types_internal = 0;
+
 static void finalize_record_size       PARAMS ((record_layout_info));
 static void finalize_type_size         PARAMS ((tree));
 static void place_union_field          PARAMS ((record_layout_info, tree));
@@ -64,6 +69,15 @@ static tree pending_sizes;
 
 int immediate_size_expand;
 
+/* Show that REFERENCE_TYPES are internal and should be Pmode.  Called only
+   by front end.  */
+
+void
+internal_reference_types ()
+{
+  reference_types_internal = 1;
+}
+
 /* Get a list of all the objects put on the pending sizes list.  */
 
 tree
@@ -1315,11 +1329,17 @@ layout_type (type)
 
     case POINTER_TYPE:
     case REFERENCE_TYPE:
-      TYPE_MODE (type) = ptr_mode;
-      TYPE_SIZE (type) = bitsize_int (POINTER_SIZE);
-      TYPE_SIZE_UNIT (type) = size_int (POINTER_SIZE / BITS_PER_UNIT);
-      TREE_UNSIGNED (type) = 1;
-      TYPE_PRECISION (type) = POINTER_SIZE;
+      {
+       int nbits = ((TREE_CODE (type) == REFERENCE_TYPE
+                     && reference_types_internal)
+                    ? GET_MODE_BITSIZE (Pmode) : POINTER_SIZE);
+
+       TYPE_MODE (type) = nbits == POINTER_SIZE ? ptr_mode : Pmode;
+       TYPE_SIZE (type) = bitsize_int (nbits);
+       TYPE_SIZE_UNIT (type) = size_int (nbits / BITS_PER_UNIT);
+       TREE_UNSIGNED (type) = 1;
+       TYPE_PRECISION (type) = nbits;
+      }
       break;
 
     case ARRAY_TYPE:
index f9da7c9..33597d6 100644 (file)
@@ -2773,6 +2773,7 @@ extern void set_yydebug                   PARAMS ((int));
 
 /* In stor-layout.c */
 extern void fixup_signed_type          PARAMS ((tree));
+extern void internal_reference_types   PARAMS ((void));
 
 /* varasm.c */
 extern void make_decl_rtl              PARAMS ((tree, const char *));