* c-common.c (decl_attributes): Set DECL_SIZE_UNIT.
authorkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 20 Feb 2000 01:11:00 +0000 (01:11 +0000)
committerkenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 20 Feb 2000 01:11:00 +0000 (01:11 +0000)
* c-decl.c (duplicate_decls, finish_enum): Likewise.
(finish_decl): Remove -Wlarger-than code from here.
* flags.h (id_clash_len): Now int.
(larger_than_size): Now HOST_WIDE_INT.
* fold-const.c (size_int_wide): No more HIGH parm; NUMBER is signed.
Clean up checking to see if in table.
(make_bit_field_ref): Remove extra parm to bitsize_int.
* ggc-common.c (ggc_mark_tree_children): Mark DECL_SIZE_UNIT.
* print-tree.c (print_node): Print DECL_SIZE_UNIT and TYPE_SIZE_UNIT.
* stmt.c (expand_decl): Use DECL_SIZE_UNIT for stack checking size
and for computing size of decl.
* stor-layout.c (layout_decl): Set DECL_SIZE_UNIT.
Move -Wlarger-than code to here.
(layout_record): Remove extra arg to bitsize_int.
Set TYPE_BINFO_SIZE_UNIT.
(layout_union): Remove extra arg to bitsize_int.
Use proper type for size of QUAL_UNION.
(layout_type): Remove extra arg to bitsize_int.
* toplev.c (id_clash_len): Now int.
(larger_than_size): Now HOST_WIDE_INT.
(decode_W_option): Clean up id-clash and larger-than- cases.
* tree.c (get_identifier, maybe_get_identifier): Remove unneeded casts.
(expr_align, case FUNCTION_DECL): DECL_ALIGN is not defined.
* tree.h (BINFO_SIZE_UNIT, TYPE_BINFO_SIZE_UNIT, DECL_SIZE_UNIT): New.
(struct tree_decl): New field size_unit.
(size_int_wide): No HIGH operand; NUMBER is now signed.
(size_int_2): Deleted.
(size_int, bitsize_int): Don't use it and rework args.
* varasm.c (assemble_variable, output_constructor): Use DECL_SIZE_UNIT.
* ch/decl.c (layout_enum): Set DECL_SIZE_UNIT.
* ch/satisfy.c (safe_satisfy_decl): Likewise.
* cp/class.c (build_primary_vtable, layout_vtable_decl): Likewise.
(avoid_overlap, build_base_field): Likewise.
(build_base_field, build_base_fields, is_empty_class):
Test DECL_SIZE with integer_zero.
(layout_class_type): Set CLASSTYPE_SIZE_UNIT.
* cp/cp-tree.h (struct lang_type): New field size_unit.
(CLASSTYPE_SIZE_UNIT): New macro.
* cp/decl.c (init_decl_processing): Set DECL_SIZE_UNIT.
(cp_finish_decl): Delete -Wlarger-than processing.
* cp/optimize.c (remap_decl): Walk DECL_SIZE_UNIT.
* cp/pt.c (tsubst_decl): Set DECL_SIZE_UNIT.
* cp/tree.c (make_binfo): binfo vector is one entry longer.
(walk_tree): Walk DECL_SIZE_UNIT.
* f/com.c (ffecom_sym_transform): Use DECL_SIZE_UNIT.
(ffecom_transform_common_, ffecom_transform_equiv_): Likewise.
(duplicate_decls): Likewise.
(ffecom_tree_canonize_ptr_): Delete extra arg to bitsize_int.
(finish_decl): Delete -Wlarger-than processing.
* java/class.c (build_class_ref, push_super_field): Set DECL_SIZE_UNIT.
* java/constants.c (build_constants_constructor): Likewise.

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

26 files changed:
gcc/ChangeLog
gcc/c-common.c
gcc/c-decl.c
gcc/c-typeck.c
gcc/ch/decl.c
gcc/ch/satisfy.c
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/optimize.c
gcc/cp/pt.c
gcc/cp/tree.c
gcc/dwarf2out.c
gcc/expr.c
gcc/f/com.c
gcc/flags.h
gcc/fold-const.c
gcc/ggc-common.c
gcc/java/class.c
gcc/java/constants.c
gcc/print-tree.c
gcc/sdbout.c
gcc/stor-layout.c
gcc/tree.c
gcc/tree.h
gcc/varasm.c

index 382538e..76b64cb 100644 (file)
@@ -1,3 +1,58 @@
+Sat Feb 19 18:43:13 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * c-common.c (decl_attributes): Set DECL_SIZE_UNIT.
+       * c-decl.c (duplicate_decls, finish_enum): Likewise.
+       (finish_decl): Remove -Wlarger-than code from here.
+       * flags.h (id_clash_len): Now int.
+       (larger_than_size): Now HOST_WIDE_INT.
+       * fold-const.c (size_int_wide): No more HIGH parm; NUMBER is signed.
+       Clean up checking to see if in table.
+       (make_bit_field_ref): Remove extra parm to bitsize_int.
+       * ggc-common.c (ggc_mark_tree_children): Mark DECL_SIZE_UNIT.
+       * print-tree.c (print_node): Print DECL_SIZE_UNIT and TYPE_SIZE_UNIT.
+       * stmt.c (expand_decl): Use DECL_SIZE_UNIT for stack checking size
+       and for computing size of decl.
+       * stor-layout.c (layout_decl): Set DECL_SIZE_UNIT.
+       Move -Wlarger-than code to here.
+       (layout_record): Remove extra arg to bitsize_int.
+       Set TYPE_BINFO_SIZE_UNIT.
+       (layout_union): Remove extra arg to bitsize_int.
+       Use proper type for size of QUAL_UNION.
+       (layout_type): Remove extra arg to bitsize_int.
+       * toplev.c (id_clash_len): Now int.
+       (larger_than_size): Now HOST_WIDE_INT.
+       (decode_W_option): Clean up id-clash and larger-than- cases.
+       * tree.c (get_identifier, maybe_get_identifier): Remove unneeded casts.
+       (expr_align, case FUNCTION_DECL): DECL_ALIGN is not defined.
+       * tree.h (BINFO_SIZE_UNIT, TYPE_BINFO_SIZE_UNIT, DECL_SIZE_UNIT): New.
+       (struct tree_decl): New field size_unit.
+       (size_int_wide): No HIGH operand; NUMBER is now signed.
+       (size_int_2): Deleted.
+       (size_int, bitsize_int): Don't use it and rework args.
+       * varasm.c (assemble_variable, output_constructor): Use DECL_SIZE_UNIT.
+       * ch/decl.c (layout_enum): Set DECL_SIZE_UNIT.  
+       * ch/satisfy.c (safe_satisfy_decl): Likewise.
+       * cp/class.c (build_primary_vtable, layout_vtable_decl): Likewise.
+       (avoid_overlap, build_base_field): Likewise.
+       (build_base_field, build_base_fields, is_empty_class): 
+       Test DECL_SIZE with integer_zero.
+       (layout_class_type): Set CLASSTYPE_SIZE_UNIT.
+       * cp/cp-tree.h (struct lang_type): New field size_unit.
+       (CLASSTYPE_SIZE_UNIT): New macro.
+       * cp/decl.c (init_decl_processing): Set DECL_SIZE_UNIT.
+       (cp_finish_decl): Delete -Wlarger-than processing.
+       * cp/optimize.c (remap_decl): Walk DECL_SIZE_UNIT.
+       * cp/pt.c (tsubst_decl): Set DECL_SIZE_UNIT.
+       * cp/tree.c (make_binfo): binfo vector is one entry longer.
+       (walk_tree): Walk DECL_SIZE_UNIT.
+       * f/com.c (ffecom_sym_transform): Use DECL_SIZE_UNIT.
+       (ffecom_transform_common_, ffecom_transform_equiv_): Likewise.
+       (duplicate_decls): Likewise.
+       (ffecom_tree_canonize_ptr_): Delete extra arg to bitsize_int.
+       (finish_decl): Delete -Wlarger-than processing.
+       * java/class.c (build_class_ref, push_super_field): Set DECL_SIZE_UNIT.
+       * java/constants.c (build_constants_constructor): Likewise.
+
 Fri Feb 18 20:01:58 2000  Jeffrey A Law  (law@cygnus.com)
 
        * pa/quadlib.asm (_U_QFgt, _U_Qfge): Fix flags for _U_Qfcmp call.
index ede62f7..815c8e1 100644 (file)
@@ -1,5 +1,6 @@
 /* Subroutines shared by all languages that are variants of C.
-   Copyright (C) 1992, 93-98, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -733,7 +734,7 @@ decl_attributes (node, attributes, prefix_attributes)
              else
                {
                  TREE_TYPE (decl) = type = typefm;
-                 DECL_SIZE (decl) = 0;
+                 DECL_SIZE (decl) = DECL_SIZE_UNIT (decl) = 0;
                  layout_decl (decl, 0);
                }
            }
index ed15761..87fcef8 100644 (file)
@@ -1,5 +1,6 @@
 /* Process declarations and variables for C compiler.
-   Copyright (C) 1988, 92-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -1796,6 +1797,7 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
        {
          /* Since the type is OLDDECL's, make OLDDECL's size go with.  */
          DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
+         DECL_SIZE_UNIT (newdecl) = DECL_SIZE_UNIT (olddecl);
          DECL_MODE (newdecl) = DECL_MODE (olddecl);
          if (TREE_CODE (olddecl) != FUNCTION_DECL)
            if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
@@ -3477,8 +3479,7 @@ finish_decl (decl, init, asmspec_tree)
 
   if (TREE_CODE (decl) == VAR_DECL)
     {
-      if (DECL_SIZE (decl) == 0
-         && TYPE_SIZE (TREE_TYPE (decl)) != 0)
+      if (DECL_SIZE (decl) == 0 && TYPE_SIZE (TREE_TYPE (decl)) != 0)
        layout_decl (decl, 0);
 
       if (DECL_SIZE (decl) == 0
@@ -3565,23 +3566,6 @@ finish_decl (decl, init, asmspec_tree)
       rest_of_decl_compilation (decl, NULL_PTR, DECL_CONTEXT (decl) == 0, 0);
     }
 
-  /* If requested, warn about definitions of large data objects.  */
-
-  if (warn_larger_than
-      && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
-      && !DECL_EXTERNAL (decl))
-    {
-      register tree decl_size = DECL_SIZE (decl);
-
-      if (decl_size && TREE_CODE (decl_size) == INTEGER_CST)
-       {
-          unsigned units = TREE_INT_CST_LOW(decl_size) / BITS_PER_UNIT;
-
-         if (units > larger_than_size)
-           warning_with_decl (decl, "size of `%s' is %u bytes", units);
-       }
-    }
-
   /* At the end of a declaration, throw away any variable type sizes
      of types defined inside that declaration.  There is no use
      computing them in the following function definition.  */
@@ -5497,6 +5481,7 @@ finish_enum (enumtype, values, attributes)
 
          TREE_TYPE (enu) = enumtype;
          DECL_SIZE (enu) = TYPE_SIZE (enumtype);
+         DECL_SIZE_UNIT (enu) = TYPE_SIZE_UNIT (enumtype);
          DECL_ALIGN (enu) = TYPE_ALIGN (enumtype);
          DECL_MODE (enu) = TYPE_MODE (enumtype);
          DECL_INITIAL (enu) = convert (enumtype, DECL_INITIAL (enu));
index 8bf54cb..7a5941e 100644 (file)
@@ -1,5 +1,6 @@
 /* Build expressions with type checking for C compiler.
-   Copyright (C) 1987, 88, 91-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
+   1998, 1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -3498,43 +3499,6 @@ build_conditional_expr (ifexp, op1, op2)
   if (result_type != TREE_TYPE (op2))
     op2 = convert_and_check (result_type, op2);
     
-#if 0
-  if (code1 == RECORD_TYPE || code1 == UNION_TYPE)
-    {
-      result_type = TREE_TYPE (op1);
-      if (TREE_CONSTANT (ifexp))
-       return pedantic_non_lvalue (integer_zerop (ifexp) ? op2 : op1);
-
-      if (TYPE_MODE (result_type) == BLKmode)
-       {
-         register tree tempvar
-           = build_decl (VAR_DECL, NULL_TREE, result_type);
-         register tree xop1 = build_modify_expr (tempvar, op1);
-         register tree xop2 = build_modify_expr (tempvar, op2);
-         register tree result = fold (build (COND_EXPR, result_type,
-                                             ifexp, xop1, xop2));
-
-         layout_decl (tempvar, TYPE_ALIGN (result_type));
-         /* No way to handle variable-sized objects here.
-            I fear that the entire handling of BLKmode conditional exprs
-            needs to be redone.  */
-         if (TREE_CODE (DECL_SIZE (tempvar)) != INTEGER_CST)
-           abort ();
-         DECL_RTL (tempvar)
-           = assign_stack_local (DECL_MODE (tempvar),
-                                 (TREE_INT_CST_LOW (DECL_SIZE (tempvar))
-                                  + BITS_PER_UNIT - 1)
-                                 / BITS_PER_UNIT,
-                                 0);
-
-         TREE_SIDE_EFFECTS (result)
-           = TREE_SIDE_EFFECTS (ifexp) | TREE_SIDE_EFFECTS (op1)
-             | TREE_SIDE_EFFECTS (op2);
-         return build (COMPOUND_EXPR, result_type, result, tempvar);
-       }
-    }
-#endif /* 0 */
-    
   if (TREE_CODE (ifexp) == INTEGER_CST)
     return pedantic_non_lvalue (integer_zerop (ifexp) ? op2 : op1);
 
@@ -5985,6 +5949,7 @@ output_init_element (value, type, field, pending)
                {
                  tree temp = size_binop (PLUS_EXPR, DECL_FIELD_BITPOS (field),
                                          DECL_SIZE (field));
+
                  TREE_INT_CST_LOW (constructor_bit_index)
                    = TREE_INT_CST_LOW (temp);
                  TREE_INT_CST_HIGH (constructor_bit_index)
index cc352d3..ffda9ab 100644 (file)
@@ -1,21 +1,22 @@
 /* Process declarations and variables for GNU CHILL compiler.
-   Copyright (C) 1992, 93, 94, 98, 99, 2000 Free Software Foundation, Inc. 
+   Copyright (C) 1992, 1993, 1994, 1998, 1999, 2000
+   Free Software Foundation, Inc. 
    
-   This file is part of GNU CC.
-   
-   GNU CC is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+This file is part of GNU CC.
+
+GNU CC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
    
-   GNU CC is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
+GNU CC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
    
-   You should have received a copy of the GNU General Public License
-   along with GNU CC; see the file COPYING.  If not, write to
-   the Free Software Foundation, 59 Temple Place - Suite 330,
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING.  If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
 
@@ -4606,7 +4607,9 @@ layout_enum (enumtype)
   for (pair = values; pair; pair = TREE_CHAIN (pair))
     {
       tree decl = TREE_VALUE (pair);
+
       DECL_SIZE (decl) = TYPE_SIZE (enumtype);
+      DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (enumtype);
       DECL_ALIGN (decl) = TYPE_ALIGN (enumtype);
 
       /* Set the TREE_VALUE to the name, rather than the decl,
index a747669..fa30030 100644 (file)
@@ -1,5 +1,5 @@
 /* Name-satisfaction for GNU Chill compiler.
-   Copyright (C) 1993, 98, 99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1998, 1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -186,6 +186,8 @@ safe_satisfy_decl (decl, prev_chain)
                }
              /* DECL_SIZE is set to prevent re-doing this stuff. */
              DECL_SIZE (decl) = TYPE_SIZE (TREE_TYPE (decl));
+             DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (TREE_TYPE (decl));
+
              if (! TREE_CONSTANT (DECL_INITIAL (decl))
                  && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK)
                {
index f223199..a8ba1bd 100644 (file)
@@ -1,5 +1,6 @@
 /* Functions related to building classes and their related objects.
-   Copyright (C) 1987, 92-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+   1999, 2000 Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GNU CC.
@@ -1068,6 +1069,8 @@ build_primary_vtable (binfo, type)
       virtuals = copy_list (BINFO_VIRTUALS (binfo));
       TREE_TYPE (decl) = TREE_TYPE (BINFO_VTABLE (binfo));
       DECL_SIZE (decl) = TYPE_SIZE (TREE_TYPE (BINFO_VTABLE (binfo)));
+      DECL_SIZE_UNIT (decl)
+       = TYPE_SIZE_UNIT (TREE_TYPE (BINFO_VTABLE (binfo)));
 
       /* Now do rtti stuff.  */
       offset = get_derived_offset (TYPE_BINFO (type), NULL_TREE);
@@ -2529,14 +2532,16 @@ layout_vtable_decl (binfo, n)
   /* We may have to grow the vtable.  */
   if (!same_type_p (TREE_TYPE (BINFO_VTABLE (binfo)), atype))
     {
-      TREE_TYPE (BINFO_VTABLE (binfo)) = atype;
-      DECL_SIZE (BINFO_VTABLE (binfo)) = 0;
-      layout_decl (BINFO_VTABLE (binfo), 0);
+      tree vtable = BINFO_VTABLE (binfo);
+
+      TREE_TYPE (vtable) = atype;
+      DECL_SIZE (vtable) = DECL_SIZE_UNIT (vtable) = 0;
+      layout_decl (vtable, 0);
+
       /* At one time the vtable info was grabbed 2 words at a time.  This
-        fails on sparc unless you have 8-byte alignment.  (tiemann) */
-      DECL_ALIGN (BINFO_VTABLE (binfo))
-       = MAX (TYPE_ALIGN (double_type_node),
-              DECL_ALIGN (BINFO_VTABLE (binfo)));
+        fails on Sparc unless you have 8-byte alignment.  */
+      DECL_ALIGN (vtable) = MAX (TYPE_ALIGN (double_type_node),
+                                DECL_ALIGN (vtable));
     }
 }
 
@@ -4030,7 +4035,8 @@ avoid_overlap (decl, newdecl, empty_p)
        field = TREE_CHAIN (field))
     ;
 
-  DECL_SIZE (field) = integer_one_node;
+  DECL_SIZE (field) = bitsize_int (1);
+  DECL_SIZE_UNIT (field) = 0;
   /* The containing class cannot be empty; this field takes up space.  */
   *empty_p = 0;
 
@@ -4062,9 +4068,10 @@ build_base_field (t, binfo, empty_p, saw_empty_p, base_align)
   DECL_ARTIFICIAL (decl) = 1;
   DECL_FIELD_CONTEXT (decl) = t;
   DECL_SIZE (decl) = CLASSTYPE_SIZE (basetype);
+  DECL_SIZE_UNIT (decl) = CLASSTYPE_SIZE_UNIT (basetype);
   DECL_ALIGN (decl) = CLASSTYPE_ALIGN (basetype);
   
-  if (flag_new_abi && DECL_SIZE (decl) == integer_zero_node)
+  if (flag_new_abi && integer_zerop (DECL_SIZE (decl)))
     {
       *saw_empty_p = 1;
       return decl;
@@ -4085,6 +4092,9 @@ build_base_field (t, binfo, empty_p, saw_empty_p, base_align)
       DECL_SIZE (decl)
        = size_int (MAX (TREE_INT_CST_LOW (DECL_SIZE (decl)),
                         (int) (*base_align)));
+      DECL_SIZE_UNIT (decl)
+       = size_int (MAX (TREE_INT_CST_LOW (DECL_SIZE_UNIT (decl)),
+                        (int) *base_align / BITS_PER_UNIT));
     }
 
   return decl;
@@ -4156,17 +4166,15 @@ build_base_fields (rec, empty_p)
   if (flag_new_abi && saw_empty)
     for (decl = base_decls; decl; decl = TREE_CHAIN (decl))
       {
-       if (DECL_SIZE (decl) == integer_zero_node)
+       if (integer_zerop (DECL_SIZE (decl)))
          {
            /* First step through the following bases until we find
               an overlap or a non-empty base.  */
            for (nextdecl = TREE_CHAIN (decl); nextdecl;
                 nextdecl = TREE_CHAIN (nextdecl))
-             {
-               if (avoid_overlap (decl, nextdecl, empty_p)
-                   || DECL_SIZE (nextdecl) != integer_zero_node)
-                 goto nextbase;
-             }
+             if (avoid_overlap (decl, nextdecl, empty_p)
+                 || ! integer_zerop (DECL_SIZE (nextdecl)))
+               goto nextbase;
 
            /* If we're still looking, also check against the first
               field.  */
@@ -4822,12 +4830,22 @@ layout_class_type (t, empty_p, has_virtual_p,
   /* Remember the size and alignment of the class before adding
      the virtual bases.  */
   if (*empty_p && flag_new_abi)
-    CLASSTYPE_SIZE (t) = integer_zero_node;
+    {
+      CLASSTYPE_SIZE (t) = bitsize_int (0);
+      CLASSTYPE_SIZE_UNIT (t) = size_int (0);
+    }
   else if (flag_new_abi && TYPE_HAS_COMPLEX_INIT_REF (t)
           && TYPE_HAS_COMPLEX_ASSIGN_REF (t))
-    CLASSTYPE_SIZE (t) = TYPE_BINFO_SIZE (t);
+    {
+      CLASSTYPE_SIZE (t) = TYPE_BINFO_SIZE (t);
+      CLASSTYPE_SIZE_UNIT (t) = TYPE_BINFO_SIZE_UNIT (t);
+    }
   else
-    CLASSTYPE_SIZE (t) = TYPE_SIZE (t);
+    {
+      CLASSTYPE_SIZE (t) = TYPE_SIZE (t);
+      CLASSTYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (t);
+    }
+
   CLASSTYPE_ALIGN (t) = TYPE_ALIGN (t);
 
   /* Set the TYPE_DECL for this type to contain the right
@@ -6217,7 +6235,7 @@ is_empty_class (type)
     return 0;
 
   if (flag_new_abi)
-    return CLASSTYPE_SIZE (type) == integer_zero_node;
+    return integer_zerop (CLASSTYPE_SIZE (type));
 
   if (TYPE_BINFO_BASETYPES (type))
     return 0;
index 8f3408d..f560de9 100644 (file)
@@ -1,6 +1,7 @@
 /* Definitions for C++ parsing and type checking.
-   Copyright (C) 1987, 92-97, 1998, 1999, 2000 Free Software Foundation, Inc.
-   Hacked by Michael Tiemann (tiemann@cygnus.com)
+   Copyright (C) 1987, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
+   Contributed by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GNU CC.
 
@@ -1358,6 +1359,7 @@ struct lang_type
   union tree_node *search_slot;
 
   union tree_node *size;
+  union tree_node *size_unit;
 
   union tree_node *pure_virtuals;
   union tree_node *friend_classes;
@@ -1561,6 +1563,7 @@ struct lang_type
 /* These are the size, mode and alignment of the type without its
    virtual base classes, for when we use this type as a base itself.  */
 #define CLASSTYPE_SIZE(NODE) (TYPE_LANG_SPECIFIC(NODE)->size)
+#define CLASSTYPE_SIZE_UNIT(NODE) (TYPE_LANG_SPECIFIC(NODE)->size_unit)
 #define CLASSTYPE_ALIGN(NODE) (TYPE_LANG_SPECIFIC(NODE)->align)
 
 /* A cons list of virtual functions which cannot be inherited by
index 0b8e318..a948c30 100644 (file)
@@ -1,5 +1,6 @@
 /* Process declarations and variables for C compiler.
-   Copyright (C) 1988, 92-98, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GNU CC.
@@ -6295,6 +6296,7 @@ init_decl_processing ()
       DECL_NAME (fields[3]) = delta2_identifier;
       DECL_MODE (fields[3]) = TYPE_MODE (delta_type_node);
       DECL_SIZE (fields[3]) = TYPE_SIZE (delta_type_node);
+      DECL_SIZE_UNIT (fields[3]) = TYPE_SIZE_UNIT (delta_type_node);
       TREE_UNSIGNED (fields[3]) = 0;
       TREE_CHAIN (fields[2]) = fields[3];
       vtable_entry_type = build_qualified_type (vtable_entry_type,
@@ -7108,7 +7110,7 @@ layout_var_decl (decl)
      `extern X x' for some incomplete type `X'.)  */
   if (!DECL_EXTERNAL (decl))
     complete_type (type);
-  if (!DECL_SIZE (decl)&& TYPE_SIZE (type))
+  if (!DECL_SIZE (decl) && TYPE_SIZE (type))
     layout_decl (decl, 0);
 
   if (!DECL_EXTERNAL (decl) && DECL_SIZE (decl) == NULL_TREE)
@@ -7868,24 +7870,6 @@ cp_finish_decl (decl, init, asmspec_tree, flags)
 
  finish_end:
 
-  /* If requested, warn about definitions of large data objects.  */
-
-  if (warn_larger_than
-      && ! processing_template_decl
-      && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
-      && !DECL_EXTERNAL (decl))
-    {
-      register tree decl_size = DECL_SIZE (decl);
-
-      if (decl_size && TREE_CODE (decl_size) == INTEGER_CST)
-       {
-         unsigned units = TREE_INT_CST_LOW (decl_size) / BITS_PER_UNIT;
-
-         if (units > larger_than_size)
-           warning_with_decl (decl, "size of `%s' is %u bytes", units);
-       }
-    }
-
   if (was_readonly)
     TREE_READONLY (decl) = 1;
 }
index c2cb029..f668ec4 100644 (file)
@@ -1,24 +1,23 @@
 /* Perform optimizations on tree structure.
-
    Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
    Written by Mark Michell (mark@codesourcery.com).
 
-   This file is part of GNU CC.
+This file is part of GNU CC.
 
-   GNU CC is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
-   
-   GNU CC is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+GNU CC is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU CC is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
    
-   You should have received a copy of the GNU General Public License
-   along with GNU CC; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA
+02111-1307, USA.  */
 
 #include "config.h"
 #include "system.h"
@@ -109,6 +108,7 @@ remap_decl (decl, id)
         in which case some fields need to be remapped because they may
         contain SAVE_EXPRs.  */
       walk_tree (&DECL_SIZE (t), copy_body_r, id);
+      walk_tree (&DECL_SIZE_UNIT (t), copy_body_r, id);
       if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
          && TYPE_DOMAIN (TREE_TYPE (t)))
        walk_tree (&TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (t))),
index f132fa5..b50976d 100644 (file)
@@ -1,5 +1,6 @@
 /* Handle parameterized types (templates) for GNU C++.
-   Copyright (C) 1992, 93-97, 1998, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
    Written by Ken Raeburn (raeburn@cygnus.com) while at Watchmaker Computing.
    Rewritten by Jason Merrill (jason@cygnus.com).
 
@@ -5909,7 +5910,7 @@ tsubst_decl (t, args, type, in_decl)
           this variable; otherwise we run into circular dependencies.  */
        DECL_INITIAL (r) = NULL_TREE;
        DECL_RTL (r) = 0;
-       DECL_SIZE (r) = 0;
+       DECL_SIZE (r) = DECL_SIZE_UNIT (r) = 0;
        copy_lang_decl (r);
 
        /* For __PRETTY_FUNCTION__ we have to adjust the initializer.  */
index ae908fa..6097302 100644 (file)
@@ -1,5 +1,6 @@
 /* Language-dependent node constructors for parse phase of GNU compiler.
-   Copyright (C) 1987, 88, 92-98, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+   1999, 2000 Free Software Foundation, Inc.
    Hacked by Michael Tiemann (tiemann@cygnus.com)
 
 This file is part of GNU CC.
@@ -845,7 +846,7 @@ make_binfo (offset, binfo, vtable, virtuals)
      tree offset, binfo;
      tree vtable, virtuals;
 {
-  tree new_binfo = make_tree_vec (7);
+  tree new_binfo = make_tree_vec (8);
   tree type;
 
   if (TREE_CODE (binfo) == TREE_VEC)
@@ -1268,6 +1269,7 @@ walk_tree (tp, func, data)
                 refer to the declaration itself.  */
              WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp)));
              WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp)));
+             WALK_SUBTREE (DECL_SIZE_UNIT (DECL_STMT_DECL (*tp)));
            }
 
          WALK_SUBTREE (TREE_CHAIN (*tp));
index 183038d..39b3734 100644 (file)
@@ -1,5 +1,6 @@
 /* Output Dwarf2 format symbol table information from the GNU C compiler.
-   Copyright (C) 1992, 93, 95-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
    Contributed by Gary Funck (gary@intrepid.com).
    Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com).
    Extensively modified by Jason Merrill (jason@cygnus.com).
index 26e23f0..febdbc6 100644 (file)
@@ -1,5 +1,6 @@
 /* Convert tree expression to rtl instructions, for GNU compiler.
-   Copyright (C) 1988, 92-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
index 49560ac..b181f8e 100644 (file)
@@ -1,5 +1,6 @@
 /* com.c -- Implementation File (module.c template V1.0)
-   Copyright (C) 1995-1999 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
    Contributed by James Craig Burley.
 
 This file is part of GNU Fortran.
@@ -7762,15 +7763,12 @@ ffecom_sym_transform_ (ffesymbol s)
 
                finish_decl (t, initexpr, FALSE);
 
-               if ((st != NULL) && (DECL_SIZE (t) != error_mark_node))
+               if (st != NULL && DECL_SIZE (t) != error_mark_node)
                  {
-                   tree size_tree;
-
-                   size_tree = size_binop (CEIL_DIV_EXPR,
-                                           DECL_SIZE (t),
-                                           size_int (BITS_PER_UNIT));
-                   assert (TREE_INT_CST_HIGH (size_tree) == 0);
-                   assert (TREE_INT_CST_LOW (size_tree) == ffestorag_size (st));
+                   assert (TREE_CODE (DECL_SIZE_UNIT (t)) == INTEGER_CST);
+                   assert (TREE_INT_CST_HIGH (DECL_SIZE_UNIT (t)) == 0);
+                   assert (TREE_INT_CST_LOW (DECL_SIZE_UNIT (t))
+                           == ffestorag_size (st));
                  }
 
                resume_momentary (yes);
@@ -8826,15 +8824,10 @@ ffecom_transform_common_ (ffesymbol s)
 
   if (init)
     {
-      tree size_tree;
-
-      assert (DECL_SIZE (cbt) != NULL_TREE);
-      assert (TREE_CODE (DECL_SIZE (cbt)) == INTEGER_CST);
-      size_tree = size_binop (CEIL_DIV_EXPR,
-                             DECL_SIZE (cbt),
-                             size_int (BITS_PER_UNIT));
-      assert (TREE_INT_CST_HIGH (size_tree) == 0);
-      assert (TREE_INT_CST_LOW (size_tree)
+      assert (DECL_SIZE_UNIT (cbt) != NULL_TREE);
+      assert (TREE_CODE (DECL_SIZE_UNIT (cbt)) == INTEGER_CST);
+      assert (TREE_INT_CST_HIGH (DECL_SIZE_UNIT (cbt)) == 0);
+      assert (TREE_INT_CST_LOW (DECL_SIZE_UNIT (cbt))
              == ffeglobal_common_size (g) + ffeglobal_common_pad (g));
     }
 
@@ -8966,13 +8959,9 @@ ffecom_transform_equiv_ (ffestorag eqst)
     ffestorag_set_init (eqst, ffebld_new_any ());
 
   {
-    tree size_tree;
-
-    size_tree = size_binop (CEIL_DIV_EXPR,
-                           DECL_SIZE (eqt),
-                           size_int (BITS_PER_UNIT));
-    assert (TREE_INT_CST_HIGH (size_tree) == 0);
-    assert (TREE_INT_CST_LOW (size_tree)
+    assert (TREE_CODE (DECL_SIZE_UNIT (eqt)) == INTEGER_CST);
+    assert (TREE_INT_CST_HIGH (DECL_SIZE_UNIT (eqt)) == 0);
+    assert (TREE_INT_CST_LOW (DECL_SIZE_UNIT (eqt))
            == ffestorag_size (eqst) + ffestorag_modulo (eqst));
   }
 
@@ -9120,7 +9109,7 @@ ffecom_tree_canonize_ptr_ (tree *decl, tree *offset,
 
     case PARM_DECL:
       *decl = t;
-      *offset = bitsize_int (0L, 0L);
+      *offset = bitsize_int (0);
       break;
 
     case ADDR_EXPR:
@@ -9128,7 +9117,7 @@ ffecom_tree_canonize_ptr_ (tree *decl, tree *offset,
        {
          /* A reference to COMMON.  */
          *decl = TREE_OPERAND (t, 0);
-         *offset = bitsize_int (0L, 0L);
+         *offset = bitsize_int (0);
          break;
        }
       /* Fall through.  */
@@ -9249,7 +9238,7 @@ ffecom_tree_canonize_ref_ (tree *decl, tree *offset,
     case VAR_DECL:
     case PARM_DECL:
       *decl = t;
-      *offset = bitsize_int (0L, 0L);
+      *offset = bitsize_int (0);
       *size = TYPE_SIZE (TREE_TYPE (t));
       return;
 
@@ -13839,6 +13828,7 @@ duplicate_decls (tree newdecl, tree olddecl)
        {
          /* Since the type is OLDDECL's, make OLDDECL's size go with.  */
          DECL_SIZE (newdecl) = DECL_SIZE (olddecl);
+         DECL_SIZE_UNIT (newdecl) = DECL_SIZE_UNIT (olddecl);
          if (TREE_CODE (olddecl) != FUNCTION_DECL)
            if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
              DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
@@ -14148,23 +14138,6 @@ finish_decl (tree decl, tree init, bool is_top_level)
        }
     }
 
-  /* If requested, warn about definitions of large data objects.  */
-
-  if (warn_larger_than
-      && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
-      && !DECL_EXTERNAL (decl))
-    {
-      register tree decl_size = DECL_SIZE (decl);
-
-      if (decl_size && TREE_CODE (decl_size) == INTEGER_CST)
-       {
-          unsigned units = TREE_INT_CST_LOW (decl_size) / BITS_PER_UNIT;
-
-         if (units > larger_than_size)
-           warning_with_decl (decl, "size of `%s' is %u bytes", units);
-       }
-    }
-
   /* If we have gone back from temporary to permanent allocation, actually
      free the temporary space that we no longer need.  */
   if (temporary && !allocation_temporary_p ())
index 8b8e995..1d7e782 100644 (file)
@@ -1,5 +1,6 @@
 /* Compilation switch flag definitions for GNU CC.
-   Copyright (C) 1987, 88, 94-98, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -122,14 +123,14 @@ extern int warn_template_debugging;
    characters.  The value N is in `id_clash_len'.  */
 
 extern int warn_id_clash;
-extern unsigned id_clash_len;
+extern int id_clash_len;
 
 /* Nonzero means warn about any objects definitions whose size is larger
    than N bytes.  Also want about function definitions whose returned
    values are larger than N bytes. The value N is in `larger_than_size'.  */
 
 extern int warn_larger_than;
-extern unsigned larger_than_size;
+extern HOST_WIDE_INT larger_than_size;
 
 /* Warn if a function returns an aggregate,
    since there are often incompatible calling conventions for doing this.  */
index e98a7f7..ff925c9 100644 (file)
@@ -1,5 +1,6 @@
 /* Fold a constant sub-tree into a single node for C-compiler
-   Copyright (C) 1987, 88, 92-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+   1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -1795,16 +1796,16 @@ const_binop (code, arg1, arg2, notrunc)
   return 0;
 }
 \f
-/* Return an INTEGER_CST with value whose HOST_BITS_PER_WIDE_INT bits are
-   given by HIGH and whose HOST_BITS_PER_WIDE_INT bits are given by NUMBER.
+/* Return an INTEGER_CST with value whose low-order HOST_BITS_PER_WIDE_INT
+   bits are given by NUMBER.
 
    If BIT_P is nonzero, this represents a size in bit and the type of the
    result will be bitsizetype, othewise it represents a size in bytes and
    the type of the result will be sizetype.  */
 
 tree
-size_int_wide (number, high, bit_p)
-     unsigned HOST_WIDE_INT number, high;
+size_int_wide (number, bit_p)
+     HOST_WIDE_INT number;
      int bit_p;
 {
   /* Type-size nodes already made for small sizes.  */
@@ -1819,12 +1820,15 @@ size_int_wide (number, high, bit_p)
       init_p = 1;
     }
 
-  if (number < 2*HOST_BITS_PER_WIDE_INT + 1 && high == 0
-      && size_table[number][bit_p] != 0)
-    return size_table[number][bit_p];
-
-  if (number < 2*HOST_BITS_PER_WIDE_INT + 1 && high == 0)
+  /* If this is a positive number that fits in the table we use to hold
+     cached entries, see if it is already in the table and put it there
+     if not.  */
+  if (number >= 0
+      && number < (int) (sizeof size_table / sizeof size_table[0]) / 2)
     {
+      if (size_table[number][bit_p] != 0)
+       return size_table[number][bit_p];
+
       if (! ggc_p)
        {
          /* Make this a permanent node.  */
@@ -1842,7 +1846,7 @@ size_int_wide (number, high, bit_p)
       return t;
     }
 
-  t = build_int_2 (number, high);
+  t = build_int_2 (number, 0);
   TREE_TYPE (t) = bit_p ? bitsizetype : sizetype;
   TREE_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (t) = force_fit_type (t, 0);
   return t;
@@ -2809,7 +2813,7 @@ make_bit_field_ref (inner, type, bitsize, bitpos, unsignedp)
      int unsignedp;
 {
   tree result = build (BIT_FIELD_REF, type, inner,
-                      size_int (bitsize), bitsize_int (bitpos, 0L));
+                      size_int (bitsize), bitsize_int (bitpos));
 
   TREE_UNSIGNED (result) = unsignedp;
 
index bc2a9dc..50a610e 100644 (file)
@@ -378,6 +378,7 @@ ggc_mark_tree_children (t)
     case 'd': /* A decl node.  */
       ggc_mark_string (DECL_SOURCE_FILE (t));
       ggc_mark_tree (DECL_SIZE (t));
+      ggc_mark_tree (DECL_SIZE_UNIT (t));
       ggc_mark_tree (DECL_NAME (t));
       ggc_mark_tree (DECL_CONTEXT (t));
       ggc_mark_tree (DECL_ARGUMENTS (t));
index a441040..a62f890 100644 (file)
@@ -1,5 +1,5 @@
 /* Functions related to building classes and their related objects.
-   Copyright (C) 1996, 97-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -800,6 +800,7 @@ build_class_ref (type)
              push_obstacks (&permanent_obstack, &permanent_obstack);
              decl = build_decl (VAR_DECL, decl_name, class_type_node);
              DECL_SIZE (decl) = TYPE_SIZE (class_type_node);
+             DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (class_type_node);
              TREE_STATIC (decl) = 1;
              TREE_PUBLIC (decl) = 1;
              DECL_IGNORED_P (decl) = 1;
@@ -1600,6 +1601,7 @@ push_super_field (this_class, super_class)
   TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
   TYPE_FIELDS (this_class) = base_decl;
   DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
+  DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
 }
 
 /* Handle the different manners we may have to lay out a super class.  */
index e426515..b747ac8 100644 (file)
@@ -1,5 +1,5 @@
 /* Handle the constant pool of the Java(TM) Virtual Machine.
-   Copyright (C) 1997, 98-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -457,7 +457,8 @@ build_constants_constructor ()
       DECL_INITIAL (data_decl) = build (CONSTRUCTOR, TREE_TYPE (data_decl),
                                        NULL_TREE, data_list);
       DECL_SIZE (data_decl) = TYPE_SIZE (TREE_TYPE (data_decl));
-      rest_of_decl_compilation (data_decl, (char*) 0, 1, 0);
+      DECL_SIZE_UNIT (data_decl) = TYPE_SIZE_UNIT (TREE_TYPE (data_decl));
+      rest_of_decl_compilation (data_decl, (char *) 0, 1, 0);
       data_value = build_address_of (data_decl);
 
       tags_type = build_array_type (unsigned_byte_type_node, index_type);
index caf2aee..7c82d0a 100644 (file)
@@ -1,5 +1,6 @@
 /* Prints out tree in human readable form - GNU C-compiler
-   Copyright (C) 1990, 91, 93-98, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -396,6 +397,8 @@ print_node (file, prefix, node, indent)
               DECL_SOURCE_FILE (node), DECL_SOURCE_LINE (node));
 
       print_node (file, "size", DECL_SIZE (node), indent + 4);
+      print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4);
+      
       indent_to (file, indent + 3);
       if (TREE_CODE (node) != FUNCTION_DECL)
        fprintf (file, " align %d", DECL_ALIGN (node));
@@ -478,6 +481,7 @@ print_node (file, prefix, node, indent)
       fprintf (file, " %s", GET_MODE_NAME(mode));
 
       print_node (file, "size", TYPE_SIZE (node), indent + 4);
+      print_node (file, "unit size", TYPE_SIZE_UNIT (node), indent + 4);
       indent_to (file, indent + 3);
 
       fprintf (file, " align %d", TYPE_ALIGN (node));
index bdf74a2..de16c0f 100644 (file)
@@ -1,5 +1,6 @@
 /* Output sdb-format symbol table information from GNU compiler.
-   Copyright (C) 1988, 92-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
index 707d0a0..be27fae 100644 (file)
@@ -1,5 +1,6 @@
 /* C-compiler utilities for types and variables storage layout
-   Copyright (C) 1987, 88, 92-98, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1996, 1998,
+   1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -265,7 +266,10 @@ layout_decl (decl, known_align)
   DECL_MODE (decl) = TYPE_MODE (type);
   TREE_UNSIGNED (decl) = TREE_UNSIGNED (type);
   if (DECL_SIZE (decl) == 0)
-    DECL_SIZE (decl) = TYPE_SIZE (type);
+    {
+      DECL_SIZE (decl) = TYPE_SIZE (type);
+      DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (type);
+    }
 
   if (code == FIELD_DECL && DECL_BIT_FIELD (decl))
     {
@@ -273,8 +277,13 @@ layout_decl (decl, known_align)
        abort ();
 
       /* Size is specified in number of bits.  */
-      DECL_SIZE (decl) = bitsize_int (spec_size, 0);
+      DECL_SIZE (decl) = bitsize_int (spec_size);
+      if (spec_size % BITS_PER_UNIT == 0)
+       DECL_SIZE_UNIT (decl) = size_int (spec_size / BITS_PER_UNIT);
+      else
+       DECL_SIZE_UNIT (decl) = 0;
     }
+
   /* Force alignment required for the data type.
      But if the decl itself wants greater alignment, don't override that.
      Likewise, if the decl is packed, don't override it.  */
@@ -308,7 +317,8 @@ layout_decl (decl, known_align)
          DECL_ALIGN (decl) = MAX (GET_MODE_ALIGNMENT (xmode),
                                   DECL_ALIGN (decl));
          DECL_MODE (decl) = xmode;
-         DECL_SIZE (decl) = bitsize_int (GET_MODE_BITSIZE (xmode), 0);
+         DECL_SIZE (decl) = bitsize_int (GET_MODE_BITSIZE (xmode));
+         DECL_SIZE_UNIT (decl) = size_int (GET_MODE_SIZE (xmode));
          /* This no longer needs to be accessed as a bit field.  */
          DECL_BIT_FIELD (decl) = 0;
        }
@@ -317,15 +327,38 @@ layout_decl (decl, known_align)
   /* Turn off DECL_BIT_FIELD if we won't need it set.  */
   if (DECL_BIT_FIELD (decl) && TYPE_MODE (type) == BLKmode
       && known_align % TYPE_ALIGN (type) == 0
-      && DECL_SIZE (decl) != 0
-      && (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST
-         || (TREE_INT_CST_LOW (DECL_SIZE (decl)) % BITS_PER_UNIT) == 0)
+      && DECL_SIZE_UNIT (decl) != 0
       && DECL_ALIGN (decl) >= TYPE_ALIGN (type))
     DECL_BIT_FIELD (decl) = 0;
 
   /* Evaluate nonconstant size only once, either now or as soon as safe.  */
   if (DECL_SIZE (decl) != 0 && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
     DECL_SIZE (decl) = variable_size (DECL_SIZE (decl));
+  if (DECL_SIZE_UNIT (decl) != 0
+      && TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST)
+    DECL_SIZE_UNIT (decl) = variable_size (DECL_SIZE_UNIT (decl));
+
+  /* If requested, warn about definitions of large data objects.  */
+  if (warn_larger_than
+      && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
+      && ! DECL_EXTERNAL (decl))
+    {
+      tree size = DECL_SIZE_UNIT (decl);
+
+      if (size != 0 && TREE_CODE (size) == INTEGER_CST
+         && (TREE_INT_CST_HIGH (size) != 0
+             || TREE_INT_CST_LOW (size) > larger_than_size))
+       {
+         int size_as_int = TREE_INT_CST_LOW (size);
+
+         if (size_as_int == TREE_INT_CST_LOW (size)
+             && TREE_INT_CST_HIGH (size) == 0)
+           warning_with_decl (decl, "size of `%s' is %d bytes", size_as_int);
+         else
+           warning_with_decl (decl, "size of `%s' is larger than %d bytes",
+                              larger_than_size);
+       }
+    }
 }
 \f
 /* Lay out a RECORD_TYPE type (a C struct).
@@ -485,7 +518,7 @@ layout_record (rec)
            {
              if (const_size > 0)
                var_size = size_binop (PLUS_EXPR, var_size,
-                                      bitsize_int (const_size, 0L));
+                                      bitsize_int (const_size));
              const_size = 0;
              var_size = round_up (var_size, desired_align);
              var_align = MIN (var_align, desired_align);
@@ -549,12 +582,12 @@ layout_record (rec)
 
       if (var_size && const_size)
        DECL_FIELD_BITPOS (field)
-         = size_binop (PLUS_EXPR, var_size, bitsize_int (const_size, 0L));
+         = size_binop (PLUS_EXPR, var_size, bitsize_int (const_size));
       else if (var_size)
        DECL_FIELD_BITPOS (field) = var_size;
       else
        {
-         DECL_FIELD_BITPOS (field) = bitsize_int (const_size, 0L);
+         DECL_FIELD_BITPOS (field) = bitsize_int (const_size);
 
          /* If this field ended up more aligned than we thought it
             would be (we approximate this by seeing if its position
@@ -595,12 +628,12 @@ layout_record (rec)
      Round it up to a multiple of the record's alignment.  */
 
   if (var_size == NULL_TREE)
-    TYPE_SIZE (rec) = bitsize_int (const_size, 0L);
+    TYPE_SIZE (rec) = bitsize_int (const_size);
   else
     {
       if (const_size)
        var_size
-         = size_binop (PLUS_EXPR, var_size, bitsize_int (const_size, 0L));
+         = size_binop (PLUS_EXPR, var_size, bitsize_int (const_size));
       TYPE_SIZE (rec) = var_size;
     }
 
@@ -614,7 +647,13 @@ layout_record (rec)
   /* Record the un-rounded size in the binfo node.  But first we check
      the size of TYPE_BINFO to make sure that BINFO_SIZE is available.  */
   if (TYPE_BINFO (rec) && TREE_VEC_LENGTH (TYPE_BINFO (rec)) > 6)
-    TYPE_BINFO_SIZE (rec) = TYPE_SIZE (rec);
+    {
+      TYPE_BINFO_SIZE (rec) = TYPE_SIZE (rec);
+      TYPE_BINFO_SIZE_UNIT (rec)
+       = convert (sizetype,
+                  size_binop (FLOOR_DIV_EXPR, TYPE_SIZE (rec),
+                              size_int (BITS_PER_UNIT)));
+    }
   
   {
     tree unpadded_size = TYPE_SIZE (rec);
@@ -718,7 +757,7 @@ layout_union (rec)
        continue;
 
       layout_decl (field, 0);
-      DECL_FIELD_BITPOS (field) = bitsize_int (0L, 0L);
+      DECL_FIELD_BITPOS (field) = bitsize_int (0);
 
       /* Union must be at least as aligned as any field requires.  */
 
@@ -749,9 +788,9 @@ layout_union (rec)
            var_size = size_binop (MAX_EXPR, var_size, dsize);
        }
       else if (TREE_CODE (rec) == QUAL_UNION_TYPE)
-       var_size = fold (build (COND_EXPR, sizetype, DECL_QUALIFIER (field),
+       var_size = fold (build (COND_EXPR, bitsizetype, DECL_QUALIFIER (field),
                                DECL_SIZE (field),
-                               var_size ? var_size : bitsize_int (0L, 0L)));
+                               var_size ? var_size : bitsize_int (0)));
       }
 
   if (TREE_CODE (rec) == QUAL_UNION_TYPE)
@@ -759,13 +798,14 @@ layout_union (rec)
 
   /* Determine the ultimate size of the union (in bytes).  */
   if (NULL == var_size)
-    TYPE_SIZE (rec) = bitsize_int (CEIL (const_size, BITS_PER_UNIT)
-                                  * BITS_PER_UNIT, 0L);
+    TYPE_SIZE (rec)
+      = bitsize_int (CEIL (const_size, BITS_PER_UNIT) * BITS_PER_UNIT);
+
   else if (const_size == 0)
     TYPE_SIZE (rec) = var_size;
   else
     TYPE_SIZE (rec) = size_binop (MAX_EXPR, var_size,
-                                 round_up (bitsize_int (const_size, 0L),
+                                 round_up (bitsize_int (const_size),
                                            BITS_PER_UNIT));
 
   /* Determine the desired alignment.  */
@@ -839,13 +879,13 @@ layout_type (type)
 
       TYPE_MODE (type) = smallest_mode_for_size (TYPE_PRECISION (type),
                                                 MODE_INT);
-      TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)), 0L);
+      TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
       TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type)));
       break;
 
     case REAL_TYPE:
       TYPE_MODE (type) = mode_for_size (TYPE_PRECISION (type), MODE_FLOAT, 0);
-      TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)), 0L);
+      TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
       TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type)));
       break;
 
@@ -856,7 +896,7 @@ layout_type (type)
                         (TREE_CODE (TREE_TYPE (type)) == INTEGER_TYPE
                          ? MODE_COMPLEX_INT : MODE_COMPLEX_FLOAT),
                         0);
-      TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)), 0L);
+      TYPE_SIZE (type) = bitsize_int (GET_MODE_BITSIZE (TYPE_MODE (type)));
       TYPE_SIZE_UNIT (type) = size_int (GET_MODE_SIZE (TYPE_MODE (type)));
       break;
 
@@ -868,7 +908,7 @@ layout_type (type)
       break;
 
     case OFFSET_TYPE:
-      TYPE_SIZE (type) = bitsize_int (POINTER_SIZE, 0L);
+      TYPE_SIZE (type) = bitsize_int (POINTER_SIZE);
       TYPE_SIZE_UNIT (type) = size_int (POINTER_SIZE / BITS_PER_UNIT);
       TYPE_MODE (type) = ptr_mode;
       break;
@@ -876,14 +916,14 @@ layout_type (type)
     case FUNCTION_TYPE:
     case METHOD_TYPE:
       TYPE_MODE (type) = mode_for_size (2 * POINTER_SIZE, MODE_INT, 0);
-      TYPE_SIZE (type) = bitsize_int (2 * POINTER_SIZE, 0);
+      TYPE_SIZE (type) = bitsize_int (2 * POINTER_SIZE);
       TYPE_SIZE_UNIT (type) = size_int ((2 * POINTER_SIZE) / BITS_PER_UNIT);
       break;
 
     case POINTER_TYPE:
     case REFERENCE_TYPE:
       TYPE_MODE (type) = ptr_mode;
-      TYPE_SIZE (type) = bitsize_int (POINTER_SIZE, 0L);
+      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;
@@ -1159,7 +1199,7 @@ layout_type (type)
          else
            TYPE_MODE (type) = mode_for_size (alignment, MODE_INT, 1);
 
-         TYPE_SIZE (type) = bitsize_int (rounded_size, 0L);
+         TYPE_SIZE (type) = bitsize_int (rounded_size);
          TYPE_SIZE_UNIT (type) = size_int (rounded_size / BITS_PER_UNIT);
          TYPE_ALIGN (type) = alignment;
          TYPE_PRECISION (type) = size_in_bits;
index c01d46e..4c5a7ef 100644 (file)
@@ -1,5 +1,6 @@
 /* Language-independent node constructors for parse phase of GNU compiler.
-   Copyright (C) 1987, 88, 92-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
+   1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -1263,7 +1264,7 @@ get_identifier (text)
 
   /* Decide how much of that length to hash on */
   hash_len = len;
-  if (warn_id_clash && (unsigned)len > id_clash_len)
+  if (warn_id_clash && len > id_clash_len)
     hash_len = id_clash_len;
 
   /* Compute hash code */
@@ -1282,7 +1283,7 @@ get_identifier (text)
       return idp;              /* <-- return if found */
 
   /* Not found; optionally warn about a similar identifier */
-  if (warn_id_clash && do_identifier_warnings && (unsigned)len >= id_clash_len)
+  if (warn_id_clash && do_identifier_warnings && len >= id_clash_len)
     for (idp = hash_table[hi]; idp; idp = TREE_CHAIN (idp))
       if (!strncmp (IDENTIFIER_POINTER (idp), text, id_clash_len))
        {
@@ -1329,7 +1330,7 @@ maybe_get_identifier (text)
 
   /* Decide how much of that length to hash on */
   hash_len = len;
-  if (warn_id_clash && (unsigned)len > id_clash_len)
+  if (warn_id_clash && len > id_clash_len)
     hash_len = id_clash_len;
 
   /* Compute hash code */
@@ -2282,12 +2283,15 @@ expr_align (t)
       align1 = expr_align (TREE_OPERAND (t, 2));
       return MIN (align0, align1);
 
-    case FUNCTION_DECL:  case LABEL_DECL:  case CONST_DECL:
+    case LABEL_DECL:     case CONST_DECL:
     case VAR_DECL:       case PARM_DECL:   case RESULT_DECL:
       if (DECL_ALIGN (t) != 0)
        return DECL_ALIGN (t);
       break;
 
+    case FUNCTION_DECL:
+      return FUNCTION_BOUNDARY;
+
     default:
       break;
     }
index 02fa95b..a5a6d51 100644 (file)
@@ -1,5 +1,6 @@
 /* Front-end tree definitions for GNU compiler.
-   Copyright (C) 1989, 93-98, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -1045,9 +1046,11 @@ struct tree_type
 #define BINFO_VPTR_FIELD(NODE) TREE_VEC_ELT ((NODE), 5)
 
 /* The size of a base class subobject of this type.  Not all frontends
-   currently allocate the space for this field.  */
+   currently allocate the space for these fields.  */
 #define BINFO_SIZE(NODE) TREE_VEC_ELT ((NODE), 6)
+#define BINFO_SIZE_UNIT(NODE) TREE_VEC_ELT ((NODE), 7)
 #define TYPE_BINFO_SIZE(NODE) BINFO_SIZE (TYPE_BINFO (NODE))
+#define TYPE_BINFO_SIZE_UNIT(NODE) BINFO_SIZE_UNIT (TYPE_BINFO (NODE))
 
 /* Slot used to build a chain that represents a use of inheritance.
    For example, if X is derived from Y, and Y is derived from Z,
@@ -1113,16 +1116,18 @@ struct tree_type
 #define DECL_INITIAL(NODE) (DECL_CHECK (NODE)->decl.initial)
 /* For a PARM_DECL, records the data type used to pass the argument,
    which may be different from the type seen in the program.  */
-#define DECL_ARG_TYPE(NODE) (DECL_CHECK (NODE)->decl.initial)   /* In PARM_DECL.  */
+#define DECL_ARG_TYPE(NODE) (DECL_CHECK (NODE)->decl.initial)
 /* For a FIELD_DECL in a QUAL_UNION_TYPE, records the expression, which
    if nonzero, indicates that the field occupies the type.  */
 #define DECL_QUALIFIER(NODE) (DECL_CHECK (NODE)->decl.initial)
 /* These two fields describe where in the source code the declaration was.  */
 #define DECL_SOURCE_FILE(NODE) (DECL_CHECK (NODE)->decl.filename)
 #define DECL_SOURCE_LINE(NODE) (DECL_CHECK (NODE)->decl.linenum)
-/* Holds the size of the datum, as a tree expression.
+/* Holds the size of the datum, in bits, as a tree expression.
    Need not be constant.  */
 #define DECL_SIZE(NODE) (DECL_CHECK (NODE)->decl.size)
+/* Likewise for the size in bytes.  */
+#define DECL_SIZE_UNIT(NODE) (DECL_CHECK (NODE)->decl.size_unit)
 /* Holds the alignment required for the datum.  */
 #define DECL_ALIGN(NODE) (DECL_CHECK (NODE)->decl.frame_size.u)
 /* Holds the machine mode corresponding to the declaration of a variable or
@@ -1417,11 +1422,12 @@ struct tree_decl
       } f;
   } frame_size;
 
+  union tree_node *size_unit;
   union tree_node *name;
   union tree_node *context;
-  union tree_node *arguments;
-  union tree_node *result;
-  union tree_node *initial;
+  union tree_node *arguments;  /* Also used for DECL_FIELD_BITPOS */
+  union tree_node *result;     /* Also used for DECL_BIT_FIELD_TYPE */
+  union tree_node *initial;    /* Also used for DECL_QUALIFIER */
   union tree_node *abstract_origin;
   union tree_node *assembler_name;
   union tree_node *section_name;
@@ -1429,6 +1435,7 @@ struct tree_decl
   struct rtx_def *rtl; /* acts as link to register transfer language
                                   (rtl) info */
   struct rtx_def *live_range_rtl;
+
   /* For FUNCTION_DECLs: points to insn that constitutes its definition
      on the permanent obstack.  For FIELD_DECL, this is DECL_FIELD_SIZE.  */
   union {
@@ -1773,13 +1780,10 @@ extern tree size_in_bytes               PARAMS ((tree));
 extern HOST_WIDE_INT int_size_in_bytes PARAMS ((tree));
 extern tree size_binop                 PARAMS ((enum tree_code, tree, tree));
 extern tree ssize_binop                        PARAMS ((enum tree_code, tree, tree));
-extern tree size_int_wide              PARAMS ((unsigned HOST_WIDE_INT,
-                                              unsigned HOST_WIDE_INT, int));
-#define size_int(L) size_int_2 ((L), 0, 0)
-#define bitsize_int(L, H) size_int_2 ((L), (H), 1)
-#define size_int_2(L, H, T)                    \
-  size_int_wide ((unsigned HOST_WIDE_INT) (L), \
-                (unsigned HOST_WIDE_INT) (H), (T))
+extern tree size_int_wide              PARAMS ((HOST_WIDE_INT, int));
+
+#define size_int(L) size_int_wide ((HOST_WIDE_INT) (L), 0)
+#define bitsize_int(L) size_int_wide ((HOST_WIDE_INT) (L), 1)
 
 extern tree round_up                   PARAMS ((tree, int));
 extern tree get_pending_sizes          PARAMS ((void));
index bfce0d8..e71ba3a 100644 (file)
@@ -1,5 +1,6 @@
 /* Output variables, constants and external declarations, for GNU compiler.
-   Copyright (C) 1987, 88, 89, 92-99, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997,
+   1998, 1999, 2000 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -1418,14 +1419,12 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
     {
       int size;
 
-      if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
+      if (TREE_CODE (DECL_SIZE_UNIT (decl)) != INTEGER_CST)
        goto finish;
 
-      /* This is better than explicit arithmetic, since it avoids overflow.  */
-      size_tree = size_binop (CEIL_DIV_EXPR,
-                             DECL_SIZE (decl), size_int (BITS_PER_UNIT));
-
+      size_tree = DECL_SIZE_UNIT (decl);
       size = TREE_INT_CST_LOW (size_tree);
+
       if (TREE_INT_CST_HIGH (size_tree) != 0
          || size != TREE_INT_CST_LOW (size_tree))
        {
@@ -1435,7 +1434,6 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
     }
 
   name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
-
   if (TREE_PUBLIC (decl) && DECL_NAME (decl)
       && ! first_global_object_name
       && ! (DECL_COMMON (decl) && (DECL_INITIAL (decl) == 0
@@ -4427,21 +4425,10 @@ output_constructor (exp, size)
          /* Determine size this element should occupy.  */
          if (field)
            {
-             if (TREE_CODE (DECL_SIZE (field)) != INTEGER_CST)
+             if (TREE_CODE (DECL_SIZE_UNIT (field)) != INTEGER_CST)
                abort ();
-             if (TREE_INT_CST_LOW (DECL_SIZE (field)) > 100000)
-               {
-                 /* This avoids overflow trouble.  */
-                 tree size_tree = size_binop (CEIL_DIV_EXPR,
-                                              DECL_SIZE (field),
-                                              size_int (BITS_PER_UNIT));
-                 fieldsize = TREE_INT_CST_LOW (size_tree);
-               }
-             else
-               {
-                 fieldsize = TREE_INT_CST_LOW (DECL_SIZE (field));
-                 fieldsize = (fieldsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
-               }
+
+             fieldsize = TREE_INT_CST_LOW (DECL_SIZE_UNIT (field));
            }
          else
            fieldsize = int_size_in_bytes (TREE_TYPE (TREE_TYPE (exp)));