Add -fpack-struct.
authorMichael Meissner <meissner@gcc.gnu.org>
Fri, 31 Mar 1995 14:35:03 +0000 (14:35 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Fri, 31 Mar 1995 14:35:03 +0000 (14:35 +0000)
From-SVN: r9275

gcc/Makefile.in
gcc/flags.h
gcc/stor-layout.c
gcc/toplev.c

index 69677329f347a2d3c0f92cb688f85e701d0a9f33..0fb85cae6c26e32ea8a52ac579bee1895d3ebace 100644 (file)
@@ -1083,7 +1083,7 @@ convert.o: convert.c $(CONFIG_H) $(TREE_H) flags.h convert.h
 
 tree.o : tree.c $(CONFIG_H) $(TREE_H) flags.h function.h
 print-tree.o : print-tree.c $(CONFIG_H) $(TREE_H)
-stor-layout.o : stor-layout.c $(CONFIG_H) $(TREE_H) function.h
+stor-layout.o : stor-layout.c $(CONFIG_H) $(TREE_H) flags.h function.h
 fold-const.o : fold-const.c $(CONFIG_H) $(TREE_H) flags.h 
 toplev.o : toplev.c $(CONFIG_H) $(TREE_H) $(RTL_H) flags.h input.h \
    insn-attr.h xcoffout.h defaults.h output.h
index 07ea73490eec0e4624cda0f2fa054c69d60ee6ae..a1b6738c2f97340d19bddaeae92cf046cb9ed38d 100644 (file)
@@ -1,5 +1,5 @@
 /* Compilation switch flag definitions for GNU CC.
-   Copyright (C) 1987, 1988, 1994 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1994, 1995 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -334,6 +334,9 @@ extern int flag_verbose_asm;
 /* -fgnu-linker specifies use of the GNU linker for initializations.
    -fno-gnu-linker says that collect will be used.  */
 extern int flag_gnu_linker;
+
+/* Tag all structures with __attribute__(packed) */
+extern int flag_pack_struct;
 \f
 /* Other basic status info about current function.  */
 
index a3c4f5c265a49a7fa1fbf1dc8d1c7f69037b68a8..669a1de2523ee76c4e71020e0b983ba6446bf130 100644 (file)
@@ -1,5 +1,5 @@
 /* C-compiler utilities for types and variables storage layout
-   Copyright (C) 1987, 1988, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
 
 This file is part of GNU CC.
 
@@ -22,6 +22,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <stdio.h>
 
 #include "tree.h"
+#include "flags.h"
 #include "function.h"
 
 #define CEIL(x,y) (((x) + (y) - 1) / (y))
@@ -241,6 +242,8 @@ layout_decl (decl, known_align)
       DECL_BIT_FIELD_TYPE (decl) = DECL_BIT_FIELD (decl) ? type : 0;
       if (maximum_field_alignment != 0)
        DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment);
+      else if (flag_pack_struct)
+       DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT);
     }
 
   if (DECL_BIT_FIELD (decl)
@@ -364,6 +367,8 @@ layout_record (rec)
              int type_align = TYPE_ALIGN (TREE_TYPE (field));
              if (maximum_field_alignment != 0)
                type_align = MIN (type_align, maximum_field_alignment);
+             else if (flag_pack_struct)
+               type_align = MIN (type_align, BITS_PER_UNIT);
 
              record_align = MAX (record_align, type_align);
            }
@@ -406,6 +411,7 @@ layout_record (rec)
          && !DECL_PACKED (field)
          /* If #pragma pack is in effect, turn off this feature.  */
          && maximum_field_alignment == 0
+         && !flag_pack_struct
          && !integer_zerop (DECL_SIZE (field)))
        {
          int type_align = TYPE_ALIGN (TREE_TYPE (field));
@@ -440,6 +446,8 @@ layout_record (rec)
 
          if (maximum_field_alignment != 0)
            type_align = MIN (type_align, maximum_field_alignment);
+         else if (flag_pack_struct)
+           type_align = MIN (type_align, BITS_PER_UNIT);
 
          /* A bit field may not span the unit of alignment of its type.
             Advance to next boundary if necessary.  */
index e40f756c23dde8d193bfdd1eea46735bd73427a2..3b8874c6db3591377f69453a8aa4eec039a1f81e 100644 (file)
@@ -513,6 +513,9 @@ int flag_gnu_linker = 0;
 int flag_gnu_linker = 1;
 #endif
 
+/* Tag all structures with __attribute__(packed) */
+int flag_pack_struct = 0;
+
 /* Table of language-independent -f options.
    STRING is the option name.  VARIABLE is the address of the variable.
    ON_VALUE is the value to store in VARIABLE
@@ -558,6 +561,7 @@ struct { char *string; int *variable; int on_value;} f_options[] =
   {"inhibit-size-directive", &flag_inhibit_size_directive, 1},
   {"verbose-asm", &flag_verbose_asm, 1},
   {"gnu-linker", &flag_gnu_linker, 1},
+  {"pack-struct", &flag_pack_struct, 1},
   {"bytecode", &output_bytecode, 1}
 };