add info about gcc's sadistic alignment - and how to disable it
authorDenis Vlasenko <vda.linux@googlemail.com>
Wed, 21 Mar 2007 10:07:01 +0000 (10:07 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Wed, 21 Mar 2007 10:07:01 +0000 (10:07 -0000)
docs/keep_data_small.txt

index 15e41aefd11fd02a747f229df3d1d127842079a6..3c3d27396d48856d31096ce4ca6f72c914972586 100644 (file)
@@ -178,5 +178,29 @@ struct {
 char vc31[31] = { 1 }; // unaligned
 char vc32[32] = { 1 }; // aligned to 32 bytes
 
--fpack-struct=1 reduces alignment of s28 to 1 (but probably will break layout
-of many libc structs) but s32 and vc32 are still aligned to 32 bytes.
+-fpack-struct=1 reduces alignment of s28 to 1 (but probably
+will break layout of many libc structs) but s32 and vc32
+are still aligned to 32 bytes.
+
+I will try to cook up a patch to add a gcc option for disabling it.
+Meanwhile, this is where it can be disabled in gcc source:
+
+gcc/config/i386/i386.c
+int
+ix86_data_alignment (tree type, int align)
+{
+#if 0
+  if (AGGREGATE_TYPE_P (type)
+       && TYPE_SIZE (type)
+       && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
+       && (TREE_INT_CST_LOW (TYPE_SIZE (type)) >= 256
+           || TREE_INT_CST_HIGH (TYPE_SIZE (type))) && align < 256)
+    return 256;
+#endif
+
+Result (non-static busybox built against glibc):
+
+# size /usr/srcdevel/bbox/fix/busybox.t0/busybox busybox
+   text    data     bss     dec     hex filename
+ 634416    2736   23856  661008   a1610 busybox
+ 632580    2672   22944  658196   a0b14 busybox_noalign