This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GCC-4.0 vs GCC-3.3.6 ia32 -Os: code size increase from 261 to 5339 bytes


  Hello,

  This stripped down extract of a real file (main.c of Gujin-1.1) gives:
etienne@cygne:~/projet/gujin$ gcc -Os tst.c -c -o tst.o && size tst.o
   text    data     bss     dec     hex filename
    261       0       0     261     105 tst.o
etienne@cygne:~/projet/gujin$ ../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
etienne@cygne:~/projet/gujin$

  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};
      }
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

  Shall I enter that on Bugzillia or is that a known problem?

  Thanks,
  Etienne.

etienne@cygne:~/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)

etienne@cygne:~/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



	

	
		
_____________________________________________________________________________ 
Découvrez le nouveau Yahoo! Mail : 1 Go d'espace de stockage pour vos mails, photos et vidéos ! 
Créez votre Yahoo! Mail sur http://fr.mail.yahoo.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]