This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Builtins-vs-libcalls-vs-optimised-away-vs-still-emitting-an-undefined-symbol-reference
- From: "Dave Korn" <dave dot korn at artimi dot com>
- To: <gcc at gcc dot gnu dot org>
- Date: Tue, 24 Apr 2007 12:50:34 +0100
- Subject: Builtins-vs-libcalls-vs-optimised-away-vs-still-emitting-an-undefined-symbol-reference
Hi everyone,
Although I'm seeing this on 3.3.3, it appears to be determined by the
backend, so I think it's still reasonable to ask:
I have some code that calls __builtin_ffs, but entirely on compile-time
constants. When I compile it (using an inhouse custom ELF-target backend)
with -O2, it gets totally optimised away, but the compiler still emits an
undefined symbol reference to the library ffs() function:
---------------------------------<snip!>---------------------------------
/tmp $ ${libexecdir}/3.3.3/cc1.exe -O2 - -o -
int foo ()
{
return __builtin_ffs (32);
}
.file "<stdin>"
foo .global _ffs
.text
.align 2
.proc _foo
.global _foo
.type _foo, @function
_foo:
addi r1,r0,0x6
jr r15
.endproc _foo
.size _foo, .-_foo
.ident "GCC: (GNU) 3.3.3 (artimi-1.19)"
---------------------------------<snip!>---------------------------------
When I retarget the same gcc at x86/cygwin, no such reference is emitted:
---------------------------------<snip!>---------------------------------
/tmp $ /repository/gcc-build/gcc-x86/gcc/cc1.exe -O2 - -o -
int foo ()
{
return __builtin_ffs (32);
}
.file "<stdin>"
foo .text
.p2align 4,,15
.globl _foo
.def _foo; .scl 2; .type 32; .endef
_foo:
pushl %ebp
movl $6, %eax
movl %esp, %ebp
popl %ebp
ret
---------------------------------<snip!>---------------------------------
Does anyone know off the top of their head if this is simply a side-effect
of the fact that i386.md supplies an rtl insn for ffs, where my custom target
doesn't? Or is it perhaps an elf-vs-PE difference? I couldn't find anything
to explain this behaviour in the manual.
I can kind-of work around it by tricking the compiler into thinking
__builtin_ffs can be elided (as no body is ever required by a static
inline[*])
---------------------------------<snip!>---------------------------------
/tmp $ ./cc1.exe -O2 - -o -
static inline int __builtin_ffs (int);
int foo ()
{
return __builtin_ffs (32);
}
.file "<stdin>"
foo
.text
.align 2
.proc _foo
.global _foo
.type _foo, @function
_foo:
; 010000000000000000000000000000000000000000000000000000000000000
; frame size 0: local_vars_size 0 out_args_size 0 pretend_args_size 0
; mul_save_size 0 gpr_save_size 0 lr_save_ 0 iar_save_ 0 fp_save_ 0
addi r1,r0,0x20
j ___builtin_ffs ; sibcall_value insn ;
.endproc _foo
.size _foo, .-_foo
?
<stdin>:1: warning: `__builtin_ffs' used but never defined
.ident "GCC: (GNU) 3.3.3 (artimi-1.19)"
---------------------------------<snip!>---------------------------------
but that leaves me with an ugly warning. Does anyone know a better way to
eliminate the undefined reference? (I'm currently just supplying a dummy
version of _ffs() in my source solely in order to satisfy the linker).
cheers,
DaveK
[*] - before the recent changes for C99 compatibility, of course!
--
Can't think of a witty .sigline today....