Two C file (p.c and q.c) attached bellows. With an inline assembly line (even just a comment), the code sequence is different. As a result, the function foo() in q.c is working OK but not the foo() in p.c.
*** Command line *** $ /utils/gcc/3.4.3/mipsel-linux-uclibc/i386/bin/mipsel-linux-gcc -v Reading specs from /utils/gcc/3.4.3/mipsel-linux-uclibc/i386/lib/gcc/mipsel-linux-uclibc/3.4.3/specs Configured with: /home/YH/MIPS/BR/buildroot/toolchain_build_mipsel/gcc-3.4.3/configure --prefix=/utils/gcc/3.4.3/mipsel-linux-uclibc/i386 --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=mipsel-linux-uclibc --enable-languages=c,c++ --enable-shared --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-nls --enable-multilib --enable-sjlj-exceptions Thread model: posix gcc version 3.4.3 $ /utils/gcc/3.4.3/mipsel-linux-uclibc/i386/bin/mipsel-linux-gcc -mno-abicalls -O2 -c -o p.o p.c $ /utils/gcc/3.4.3/mipsel-linux-uclibc/i386/bin/mipsel-linux-objdump -S p.o > p.dasm $ /utils/gcc/3.4.3/mipsel-linux-uclibc/i386/bin/mipsel-linux-gcc -mno-abicalls -O2 -c -o q.o q.c $ /utils/gcc/3.4.3/mipsel-linux-uclibc/i386/bin/mipsel-linux-objdump -S q.o > q.dasm ==== p.c ==== int foo(int x, int y, int z) { __asm__ __volatile__ ("/* TEST */\n"); return((x + y) / z); } ==== end of p.c ==== ==== q.c ==== int foo(int x, int y, int z) { // __asm__ __volatile__ ("/* TEST */\n"); return((x + y) / z); } ==== end of q.c ==== ====> with the inline assembly (p.dasm) p.o: file format elf32-tradlittlemips Disassembly of section .text: 00000000 <foo>: 0: 00851021 addu v0,a0,a1 4: 14c00002 bnez a2,10 <foo+0x10> 8: 0046001a div zero,v0,a2 c: 0007000d break 0x7 10: 00001012 mflo v0 14: 03e00008 jr ra 18: 00000000 nop 1c: 00000000 nop ====> without the inline assembly (q.dasm) q.o: file format elf32-tradlittlemips Disassembly of section .text: 00000000 <foo>: 0: 00851021 addu v0,a0,a1 4: 0046001a div zero,v0,a2 8: 14c00002 bnez a2,14 <foo+0x14> c: 00000000 nop 10: 0007000d break 0x7 14: 00001012 mflo v0 18: 03e00008 jr ra 1c: 00000000 nop ----> assembly file (p.s) .file 1 "p.c" .section .mdebug.abi32 .previous .text .align 2 .globl foo .ent foo .type foo, @function foo: .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0 .mask 0x00000000,0 .fmask 0x00000000,0 #APP /* TEST */ #NO_APP addu $2,$4,$5 div $0,$2,$6 bne $6,$0,1f break 7 1: mflo $2 j $31 .end foo .ident "GCC: (GNU) 3.4.3" ----> assembly file (q.s) .file 1 "q.c" .section .mdebug.abi32 .previous .text .align 2 .globl foo .ent foo .type foo, @function foo: .frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0 .mask 0x00000000,0 .fmask 0x00000000,0 .set noreorder .set nomacro addu $2,$4,$5 div $0,$2,$6 bne $6,$0,1f nop break 7 1: mflo $2 j $31 nop .set macro .set reorder .end foo .ident "GCC: (GNU) 3.4.3" -- Summary: Empty inline assembly cause the generated code to be wrong? Product: gcc Version: 3.4.3 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: yhlin at sdesigns dot com CC: gcc-bugs at gcc dot gnu dot org,yhlin at sdesigns dot com GCC build triplet: i686-pc-linux GCC host triplet: i686-pc-linux GCC target triplet: mipsel-linux-gcc http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21535