aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/stor-layout.c32
-rw-r--r--gcc/tree.h1
3 files changed, 32 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 121a527..e0a23ad 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 0f057ef..7bb5b4a 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -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:
diff --git a/gcc/tree.h b/gcc/tree.h
index f9da7c9..33597d6 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -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 *));