aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <meissner@gcc.gnu.org>1995-03-31 14:35:03 +0000
committerMichael Meissner <meissner@gcc.gnu.org>1995-03-31 14:35:03 +0000
commit566cdc73b667b4de2f1c98458f26e71a2facd2b0 (patch)
treef2c75cf7bb2136590dae5f5d4bc8703039ed9264
parent7b09543e23a742fb42db0a0796b73b7b679854b0 (diff)
downloadgcc-566cdc73b667b4de2f1c98458f26e71a2facd2b0.zip
gcc-566cdc73b667b4de2f1c98458f26e71a2facd2b0.tar.gz
gcc-566cdc73b667b4de2f1c98458f26e71a2facd2b0.tar.bz2
Add -fpack-struct.
From-SVN: r9275
-rw-r--r--gcc/Makefile.in2
-rw-r--r--gcc/flags.h5
-rw-r--r--gcc/stor-layout.c10
-rw-r--r--gcc/toplev.c4
4 files changed, 18 insertions, 3 deletions
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 6967732..0fb85ca 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 07ea734..a1b6738 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 a3c4f5c..669a1de 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 <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. */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index e40f756..3b8874c 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}
};