From: Richard Kenner Date: Tue, 6 Feb 2001 13:04:43 +0000 (+0000) Subject: stor-layout.c (reference_types_internal): New variable. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b5d6a2ff232a9a8086eddef40b2f8b19828b9f88;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 121a527554a..e0a23adc1dd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ Tue Feb 6 07:54:51 2001 Richard Kenner + * 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 diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 0f057efd4a0..7bb5b4a2636 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 f9da7c9a5b1..33597d6f556 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 *));