r212437 - in /branches/google/gcc-4_9/gcc: conf...
tmsriram@gcc.gnu.org
tmsriram@gcc.gnu.org
Thu Jul 10 19:47:00 GMT 2014
Author: tmsriram
Date: Thu Jul 10 19:47:28 2014
New Revision: 212437
URL: https://gcc.gnu.org/viewcvs?rev=212437&root=gcc&view=rev
Log:
Google ref b/12177728
Port rev. 210878 from google/gcc-4_8
r210878 | tmsriram | 2014-05-23 13:42:55 -0700 (Fri, 23 May 2014) | 64 lines
Google ref b/12177728
Optimize access to globals with -fpie, x86_64 only:
Currently, with -fPIE/-fpie, GCC accesses globals that are extern to the module
using the GOT. This is two instructions, one to get the address of the global
from the GOT and the other to get the value. If it turns out that the global
gets defined in the executable at link-time, it still needs to go through the
GOT as it is too late then to generate a direct access.
Examples:
foo.cc
int a_glob;
int main () {
return a_glob; // defined in this file
}
With -O2 -fpie -pie, the generated code directly accesses the global via
PC-relative insn:
5e0 <main>:
mov 0x165a(%rip),%eax # 1c40 <a_glob>
foo.cc
extern int a_glob;
int main () {
return a_glob; // defined in this file
}
With -O2 -fpie -pie, the generated code accesses global via GOT using two
memory loads:
6f0 <main>:
mov 0x1609(%rip),%rax # 1d00 <_DYNAMIC+0x230>
mov (%rax),%eax
This is true even if in the latter case the global was defined in the
executable through a different file.
Some experiments on google benchmarks shows that the extra memory loads affects
performance by 1% to 5%.
Solution - Copy Relocations:
When the linker supports copy relocations, GCC can always assume that the
global will be defined in the executable. For globals that are truly extern
(come from shared objects), the linker will create copy relocations and have
them defined in the executable. Result is that no global access needs to go
through the GOT and hence improves performance.
This patch to the gold linker :
https://sourceware.org/ml/binutils/2014-05/msg00092.html
submitted recently allows gold to generate copy relocations for -pie mode when
necessary.
Upstream discussion here:
https://gcc.gnu.org/ml/gcc-patches/2014-05/msg01932.html
Added:
branches/google/gcc-4_9/gcc/testsuite/gcc.target/i386/pie-copyrelocs-1.c
- copied unchanged from r210878, branches/google/gcc-4_8/gcc/testsuite/gcc.target/i386/pie-copyrelocs-1.c
branches/google/gcc-4_9/gcc/testsuite/gcc.target/i386/pie-copyrelocs-2.c
- copied unchanged from r210878, branches/google/gcc-4_8/gcc/testsuite/gcc.target/i386/pie-copyrelocs-2.c
Modified:
branches/google/gcc-4_9/gcc/config/i386/i386.c
branches/google/gcc-4_9/gcc/config/i386/i386.opt
branches/google/gcc-4_9/gcc/doc/invoke.texi
More information about the Gcc-cvs
mailing list