diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 69677329f34..0fb85cae6c2 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -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 diff --git a/gcc/flags.h b/gcc/flags.h index 07ea73490ee..a1b6738c2f9 100644 --- a/gcc/flags.h +++ b/gcc/flags.h @@ -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; /* Other basic status info about current function. */ diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index a3c4f5c265a..669a1de2523 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -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 #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. */ diff --git a/gcc/toplev.c b/gcc/toplev.c index e40f756c23d..3b8874c6db3 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -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} };