scons: Avoid malloc/free compiler optimization when using tcmalloc
According to the tcmalloc readme, the recommended way of compiling applications that make use of tcmalloc is to disable compiler optimizations that make assumptions about malloc and friends. This changeset adds the necessary compiler flags for both gcc and clang. From the tcmalloc readme: "NOTE: When compiling with programs with gcc, that you plan to link with libtcmalloc, it's safest to pass in the flags -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free when compiling."
This commit is contained in:
parent
9e9a47cb9a
commit
468ad10f50
1 changed files with 14 additions and 1 deletions
15
SConstruct
15
SConstruct
|
@ -505,6 +505,12 @@ Export('MakeAction')
|
||||||
main['LTO_CCFLAGS'] = []
|
main['LTO_CCFLAGS'] = []
|
||||||
main['LTO_LDFLAGS'] = []
|
main['LTO_LDFLAGS'] = []
|
||||||
|
|
||||||
|
# According to the readme, tcmalloc works best if the compiler doesn't
|
||||||
|
# assume that we're using the builtin malloc and friends. These flags
|
||||||
|
# are compiler-specific, so we need to set them after we detect which
|
||||||
|
# compiler we're using.
|
||||||
|
main['TCMALLOC_CCFLAGS'] = []
|
||||||
|
|
||||||
CXX_version = readCommand([main['CXX'],'--version'], exception=False)
|
CXX_version = readCommand([main['CXX'],'--version'], exception=False)
|
||||||
CXX_V = readCommand([main['CXX'],'-V'], exception=False)
|
CXX_V = readCommand([main['CXX'],'-V'], exception=False)
|
||||||
|
|
||||||
|
@ -581,6 +587,9 @@ if main['GCC']:
|
||||||
main['LTO_LDFLAGS'] = ['-flto=%d' % GetOption('num_jobs'),
|
main['LTO_LDFLAGS'] = ['-flto=%d' % GetOption('num_jobs'),
|
||||||
'-fuse-linker-plugin']
|
'-fuse-linker-plugin']
|
||||||
|
|
||||||
|
main.Append(TCMALLOC_CCFLAGS=['-fno-builtin-malloc', '-fno-builtin-calloc',
|
||||||
|
'-fno-builtin-realloc', '-fno-builtin-free'])
|
||||||
|
|
||||||
elif main['CLANG']:
|
elif main['CLANG']:
|
||||||
# Check for a supported version of clang, >= 2.9 is needed to
|
# Check for a supported version of clang, >= 2.9 is needed to
|
||||||
# support similar features as gcc 4.4. See
|
# support similar features as gcc 4.4. See
|
||||||
|
@ -607,6 +616,8 @@ elif main['CLANG']:
|
||||||
'-Wno-parentheses',
|
'-Wno-parentheses',
|
||||||
'-Wno-self-assign'])
|
'-Wno-self-assign'])
|
||||||
|
|
||||||
|
main.Append(TCMALLOC_CCFLAGS=['-fno-builtin'])
|
||||||
|
|
||||||
# On Mac OS X/Darwin we need to also use libc++ (part of XCode) as
|
# On Mac OS X/Darwin we need to also use libc++ (part of XCode) as
|
||||||
# opposed to libstdc++ to make the transition from TR1 to
|
# opposed to libstdc++ to make the transition from TR1 to
|
||||||
# C++11. See http://libcxx.llvm.org. However, clang has chosen a
|
# C++11. See http://libcxx.llvm.org. However, clang has chosen a
|
||||||
|
@ -914,7 +925,9 @@ have_posix_clock = \
|
||||||
conf.CheckLibWithHeader('rt', 'time.h', 'C',
|
conf.CheckLibWithHeader('rt', 'time.h', 'C',
|
||||||
'clock_nanosleep(0,0,NULL,NULL);')
|
'clock_nanosleep(0,0,NULL,NULL);')
|
||||||
|
|
||||||
if not conf.CheckLib('tcmalloc_minimal'):
|
if conf.CheckLib('tcmalloc_minimal'):
|
||||||
|
main.Append(CCFLAGS=main['TCMALLOC_CCFLAGS'])
|
||||||
|
else:
|
||||||
print termcap.Yellow + termcap.Bold + \
|
print termcap.Yellow + termcap.Bold + \
|
||||||
"You can get a 12% performance improvement by installing tcmalloc "\
|
"You can get a 12% performance improvement by installing tcmalloc "\
|
||||||
"(libgoogle-perftools-dev package on Ubuntu or RedHat)." + \
|
"(libgoogle-perftools-dev package on Ubuntu or RedHat)." + \
|
||||||
|
|
Loading…
Reference in a new issue