This stripped down extract of a real file (main.c of Gujin-1.1 in 
sourceforge) gives:

$ gcc -Os tst.c -c -o tst.o && size tst.o
   text    data     bss     dec     hex filename
    261       0       0     261     105 tst.o

$ ../toolchain/bin/gcc -Os tst.c -c -o tst.o && size tst.o
   text    data     bss     dec     hex filename
   5339       0       0    5339    14db tst.o

  Here it is:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
typedef struct
{
  struct gujin_param_attrib
  {
    unsigned verbose:1;
    unsigned lock_bpp:1;
    unsigned lock_text_graphic:1;
    unsigned menu_with_disk:1;
    unsigned menu_with_parttype:1;
    unsigned menu_with_partition:1;
    unsigned menu_with_initrd:1;
    unsigned force_textmode:1;
    unsigned force_probe_root:1;
    unsigned IDE_in_BIOS_order:1;
    unsigned ignore_kernel_option:1;
    unsigned disk_write_enable:1;
    unsigned VGA_interface:1;
    unsigned download_ansi_font:1;
    unsigned VESA_interface:1;
    unsigned enable_VESA_hardwin:1;
    unsigned VESA2_interface:1;
    unsigned enable_joystick:1;
    unsigned search_disk_mbr:1;
    unsigned search_part_mbr:1;
    unsigned hide_unhide_partitions:1;
    unsigned keep_all_part_mbr:1;
    unsigned search_topdir_kernel:1;
    unsigned search_subdir_kernel:1;
    unsigned probe_bios_floppy_disk:1;
    unsigned probe_bios_hard_disk:1;
    unsigned probe_ide_disk:1;
    unsigned probe_cdrom:1;
    unsigned probe_dos_disk:1;
    unsigned short write_disabled_written_once:1;
  } __attribute__ ((packed)) attrib;

  struct autoload_str
  {
    unsigned char last_loaded;
    unsigned char total_loadable;
    unsigned char init_page;
    unsigned char total_page;
  } __attribute__ ((packed)) autoload;
  unsigned char timeout_autoload;
} __attribute__ ((packed)) gujin_param_t;

static inline int
diskconfig_changed (struct gujin_param_attrib first,
                    struct gujin_param_attrib second)
{
  union
  {
    struct gujin_param_attrib bits;
    unsigned all;
  } one, two, mask =
  { bits: {
    IDE_in_BIOS_order: 1,
    probe_dos_disk: 1,
    probe_cdrom: 1,
    probe_ide_disk: 1,
    probe_bios_hard_disk: 1,
    probe_bios_floppy_disk:1,
  }};
  one.bits = first;
  two.bits = second;

  return (one.all & mask.all) != (two.all & mask.all);
}

static inline int
searchconfig_changed (struct gujin_param_attrib first,
                      struct gujin_param_attrib second)
{
  union
  {
    struct gujin_param_attrib bits;
    unsigned all;
  } one, two, mask =
  { bits:{
    search_disk_mbr: 1,
    search_part_mbr: 1,
    keep_all_part_mbr: 1,
    search_topdir_kernel: 1,
    search_subdir_kernel:1,
  }};
  one.bits = first;
  two.bits = second;

  return (one.all & mask.all) != (two.all & mask.all);
}

struct gujin_param_attrib get_gujin_param_attrib (void);
void set_last_boot_default (unsigned char last_loaded,
                       unsigned char total_loadable,
                       unsigned char init_page, unsigned char total_page);

struct autoload_str get_last_boot_default (void);

struct
{
  unsigned short curpage, totalpage, nbperpage, nbtotal, interline;
} Menu;

struct todraw_str
{
  unsigned firstlines:1;
  unsigned topmenu:1;
  unsigned bottommenu:1;
  unsigned advertisement:1;
  unsigned copyright:1;
  unsigned update_bootparam:1;
  unsigned refresh:1;
  unsigned presskey:1;
};

unsigned is_valid_chgmode_keycode (unsigned short key);

unsigned menu (struct gujin_param_attrib gujin_attr)
{
    unsigned timeout = 0;
    unsigned last_boot_default_last_loaded_if_valid = 0xFFFF;
    struct todraw_str toredraw = { 1, 1, 1, 1, 1,.refresh = 1,.presskey = 0
};

    if (gujin_attr.verbose || gujin_attr.disk_write_enable)
      {
        struct autoload_str data = get_last_boot_default ();

        if (data.last_loaded == 0 && data.total_loadable == 1
            && data.init_page == 0 && data.total_page == 1)
            puts ("");
      }

    for (;;)
      {
        unsigned short key;

        toredraw = (struct todraw_str) { 0, 0, 0, 0, 0,.presskey = 0 };

        if (timeout != 0)
          {
            key = UI_getkey (18);
            if (key != 0xFFFE)
              {
                timeout = 0;
                toredraw.advertisement = 1;
                last_boot_default_last_loaded_if_valid = 0xFFFF;
                continue;
              }
            else if (--timeout != 0)
              {
                toredraw.advertisement = 1;
                last_boot_default_last_loaded_if_valid =
get_last_boot_default().last_loaded;
                continue;
              }
          }
        else
          key = UI_getkey (0xFFFFFFFFU);

        if (key == 0x260C)
          {
            UI_clearscreen ();
            toredraw = (struct todraw_str) {
                .firstlines = 1,
                .topmenu = 1,
                .bottommenu = 1,
                .advertisement = 1,
                .copyright = 1,
                .update_bootparam = 0,
                .refresh = 1,
                .presskey = 0
                };
            continue;
          }

        if (is_valid_chgmode_keycode (key))
          {
            if (timeout == 0)
              {
                toredraw.topmenu = 1;
                toredraw.presskey = 1;
              }
          }
        else if ((key == 0x1312) || (key == (0x3900 | ' ')))
          {
            struct gujin_param_attrib params = get_gujin_param_attrib ();


            if (diskconfig_changed (gujin_attr, params))
              {
                probedisk (0xFF);
                disk_analyse (params);
              }
            else if (searchconfig_changed (gujin_attr, params))
              disk_analyse (params);

            gujin_attr = params;
            Menu.nbperpage = 0;

            toredraw = (struct todraw_str) { 1, 1, 1, 1, 1,.presskey = 
0,.refresh =
1};
          }
        else if (gujin_attr.verbose)
            toredraw = (struct todraw_str) { 1, 1, 1, 1, 1,.presskey = 1};
      }
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

[EMAIL PROTECTED]:~/projet/gujin$ gcc -v
Reading specs from /usr/lib/gcc-lib/i486-linux/3.3.6/specs
Configured with: ../src/configure -v
--enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-gxx-include-dir=/usr/include/c++/3.3 --enable-shared
--enable-__cxa_atexit --with-system-zlib --enable-nls
--without-included-gettext --enable-clocale=gnu --enable-debug
--enable-java-gc=boehm --enable-java-awt=xlib --enable-objc-gc i486-linux
Thread model: posix
gcc version 3.3.6 (Debian 1:3.3.6-5)

[EMAIL PROTECTED]:~/projet/gujin$ ../toolchain/bin/gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=/home/etienne/projet/toolchain
--enable-languages=c
Thread model: posix
gcc version 4.0.0

-- 
           Summary: GCC-4.0 vs GCC-3.3.6 ia32 -Os: code size increase from
                    261 to 5339 bytes
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: etienne_lorrain at yahoo dot fr
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i486-pc-linux-gnu
  GCC host triplet: i486-pc-linux-gnu
GCC target triplet: i486-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21680

Reply via email to