[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] domain.c idle_loop declaration (take 2)
The recent change to the declaration of idle_loop in domain.c fixed a compilation problem on gcc 3.4.2. Enclosed patch is another suggestion on how to solve that problem. Some further analysis, with much help from Jimmy Xenidis of IBM research, shows that the problem was not the declaration of the function as static void, but that the compiler is optimizing the function out of the assembled code. Compile domain.c to assembly: [mdday@mdday xen]$ gcc -nostdinc -fno-builtin -fno-common -fno-strict- aliasing -iwithprefix include -Wall -Werror -pipe - I/home/mdday/src/edited/xen-2.0-testing.bk/xen/include -Wno-pointer- arith -Wredundant-decls -O3 -Wunused-function -Wunused -fomit-frame- pointer -msoft-float -m32 -march=i686 -DNDEBUG -S arch/x86/domain.c - o /tmp/d.S grep for the label idle_loop in the assembled output: [mdday@mdday xen]$ grep idle_loop /tmp/d.S .globl startup_cpu_idle_loop .type startup_cpu_idle_loop, @function startup_cpu_idle_loop: .size startup_cpu_idle_loop, .- startup_cpu_idle_loop movl %eax,%esp; jmp idle_loop Compile domain.c to assembly without optimization: [mdday@mdday xen]$ gcc -nostdinc -fno-builtin -fno-common -fno-strict- aliasing -iwithprefix include -Wall -Werror -pipe - I/home/mdday/src/edited/xen-2.0-testing.bk/xen/include -Wno-pointer- arith -Wredundant-decls -O0 -Wunused-function -Wunused -fomit-frame- pointer -msoft-float -m32 -march=i686 -DNDEBUG -S arch/x86/domain.c - o /tmp/d.S grep for the label idle_loop in the assembled output: [mdday@mdday xen]$ grep idle_loop /tmp/d.S .type idle_loop, @function idle_loop: .size idle_loop, .-idle_loop .globl startup_cpu_idle_loop .type startup_cpu_idle_loop, @function startup_cpu_idle_loop: call idle_loop .size startup_cpu_idle_loop, .-startup_cpu_idle_loop movl %eax,%esp; jmp idle_loop The compiler is probably correct in optimizing out the function. It is only called through inline assembly, and it is static void. Further experiments with -02 -01 and -0s also cause idle_loop to be optimized out. It is a good idea to keep idle_loop declared static void. The patch simply includes a declaration using __attribute__ ((used)) that prevents the compiler from optimizing out the function. -- Mike D. Day Architect, Open Virtualization IBM Linux Technology Center 3039 Cornwallis Road Research Triangle Park, NC 27709 Phone: (919) 543-4283 ncmike@xxxxxxxxxx Attachment:
domain.patch
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |