Is it a gcc bug? Optimization doesn't work

lapo.pasqui@tele2.it lapo.pasqui@tele2.it
Wed Sep 15 12:10:00 GMT 2004


Hi all,
I've upgraded my cross gcc compiler from version 3.3.1 to 3.4.1 and I've noticed a few unresolved symbols on a project (u-boot) used to compile without any problem.
After a quick investigation I've noticed the optimization flag -0s caused a few functions not to be in the .o files.
Here's a code that reproduces the problem

unsigned long get_version(void);
int getc(void);
int tstc(void);
void putc(const char);

void app_startup(char **);

enum {
XF_get_version ,
XF_getc ,
XF_tstc ,
XF_putc ,
 XF_MAX
};

typedef unsigned int size_t;
typedef struct global_data
{
   void **jt;
} gd_t;

static void __attribute__((unused)) dummy(void)
{
asm volatile ( "        .globl " "get_version" "\n" "get_version" ":\n" "       lwz     %%r11, %0(%%r29)\n" "   lwz     %%r11, %1(%%r11)\n" "   mtctr   %%r11\n" "      bctr\n" : : "i"(((size_t) &((gd_t *)0)->jt)), "i"(XF_get_version * sizeof(void *)) : "r11");
asm volatile ( "        .globl " "getc" "\n" "getc" ":\n" "     lwz     %%r11, %0(%%r29)\n" "   lwz     %%r11, %1(%%r11)\n" "   mtctr   %%r11\n" "      bctr\n" : : "i"(((size_t) &((gd_t *)0)->jt)), "i"(XF_getc * sizeof(void *)) : "r11");
asm volatile ( "        .globl " "tstc" "\n" "tstc" ":\n" "     lwz     %%r11, %0(%%r29)\n" "   lwz     %%r11, %1(%%r11)\n" "   mtctr   %%r11\n" "      bctr\n" : : "i"(((size_t) &((gd_t *)0)->jt)), "i"(XF_tstc * sizeof(void *)) : "r11");
asm volatile ( "        .globl " "putc" "\n" "putc" ":\n" "     lwz     %%r11, %0(%%r29)\n" "   lwz     %%r11, %1(%%r11)\n" "   mtctr   %%r11\n" "      bctr\n" : : "i"(((size_t) &((gd_t *)0)->jt)), "i"(XF_putc * sizeof(void *)) : "r11");
}

extern unsigned long __bss_start, _end;

void app_startup(char **argv)
{
 unsigned long * cp = &__bss_start;
 while (cp < &_end) {
  *cp++ = 0;
 }

}

Compiling it with optimization less then 2 (e.g. powerpc-linux-gcc  stubs.i -c -O1), I get this symbols

nm -C --defined-only stub.o

00000044 T app_startup
00000000 t dummy
00000010 T getc
00000000 T get_version
00000030 T putc
00000020 T tstc


Instead, using a different optimization (e.g. powerpc-linux-gcc  stubs.i -c -O2), I get this symbols

nm -C --defined-only stub.o
00000000 T app_startup

Using a previous version of gcc, I've not this different behaviour

My questions are (as I'm not am assembler guru):

Can you see anything wrong on this code that some new feature of the gcc try to overcome?
Is it indeed a regression of gcc 3.4.1




-------------------------------------------------
WebMail Tele2 http://www.tele2.it
-------------------------------------------------



More information about the Gcc-help mailing list