diff options
author | Richard Kenner <kenner@vlsi1.ultra.nyu.edu> | 2001-02-06 13:04:43 +0000 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2001-02-06 08:04:43 -0500 |
commit | b5d6a2ff232a9a8086eddef40b2f8b19828b9f88 (patch) | |
tree | d22dbc3d309e7347d0d13e819614684b6f5096bf /gcc | |
parent | 05bd3d4156671cc44d299e8945112586d769f2c6 (diff) | |
download | gcc-b5d6a2ff232a9a8086eddef40b2f8b19828b9f88.zip gcc-b5d6a2ff232a9a8086eddef40b2f8b19828b9f88.tar.gz gcc-b5d6a2ff232a9a8086eddef40b2f8b19828b9f88.tar.bz2 |
stor-layout.c (reference_types_internal): New variable.
* 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.
From-SVN: r39491
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/stor-layout.c | 32 | ||||
-rw-r--r-- | gcc/tree.h | 1 |
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: @@ -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 *)); |