[FFmpeg-devel] Visibility implementation

Uoti Urpala uoti.urpala
Wed Jul 30 17:24:11 CEST 2008

On Wed, 2008-07-30 at 15:40 +0100, M?ns Rullg?rd wrote:
> Uoti Urpala wrote:
> > On Wed, 2008-07-30 at 08:16 +0200, matthieu castet wrote:
> >> Did you see any code change with your attribute patch ?
> >
> > Yes, if compiling with -fPIC.
> On which architecture?  How did it compare to vanilla code without -fPIC?

I think it should change the resulting code on any architecture, but
exactly how differs.

On AMD64 hidden visibility should make most code identical to the
version without -fPIC; as accesses are PC-relative anyway using -fPIC
adds no indirection overhead when you know that the symbol will be in
the same library, at a constant offset from the current position.

On x86 -fPIC will still add overhead as there are no PC-relative
addressing modes and it reserves one of the few registers. Hidden
visibility does reduce the amount of indirection required however.

Here's an example of gcc-4.3 output with and without hidden visibility.
void g(int i);
extern int ii;
void f(int a) { g(a + ii); }

x86, no -fPIC:
	movl	4(%esp), %eax
	addl	ii, %eax
	movl	%eax, 4(%esp)
	jmp	g

x86, -fPIC with g and ii marked hidden:
	call	__i686.get_pc_thunk.cx
	addl	$_GLOBAL_OFFSET_TABLE_, %ecx
	movl	4(%esp), %eax
	addl	ii at GOTOFF(%ecx), %eax
	movl	%eax, 4(%esp)
	jmp	g

x86, -fPIC without visibility:
	pushl	%ebx
	call	__i686.get_pc_thunk.bx
	addl	$_GLOBAL_OFFSET_TABLE_, %ebx
	subl	$8, %esp
	movl	16(%esp), %eax
	movl	ii at GOT(%ebx), %edx
	addl	(%edx), %eax
	movl	%eax, (%esp)
	call	g at PLT
	addl	$8, %esp
	popl	%ebx

AMD64, -fPIC with g and ii marked hidden: (same as without -fPIC)
	addl	ii(%rip), %edi
	jmp	g

AMD64, -fPIC without visibility:
	movq	ii at GOTPCREL(%rip), %rax
	addl	(%rax), %edi
	jmp	g at PLT

More information about the ffmpeg-devel mailing list