Commit 36bb2be2 authored by krasin's avatar krasin Committed by Commit bot

Clang toolchain: ship lld; build the whole toolchain with LTO.

This only affects the Linux build.

BUG=607968

Review-Url: https://codereview.chromium.org/2158753003
Cr-Commit-Position: refs/heads/master@{#407702}
parent f6194e36
...@@ -178,7 +178,7 @@ def main(): ...@@ -178,7 +178,7 @@ def main():
opt_flags = [] opt_flags = []
if sys.platform.startswith('linux'): if sys.platform.startswith('linux'):
opt_flags += ['--lto-gold-plugin'] opt_flags += ['--lto']
build_cmd = [sys.executable, os.path.join(THIS_DIR, 'update.py'), build_cmd = [sys.executable, os.path.join(THIS_DIR, 'update.py'),
'--bootstrap', '--force-local-build', '--bootstrap', '--force-local-build',
'--run-tests'] + opt_flags '--run-tests'] + opt_flags
...@@ -217,6 +217,7 @@ def main(): ...@@ -217,6 +217,7 @@ def main():
'lib/clang/*/lib/darwin/*profile_osx*', 'lib/clang/*/lib/darwin/*profile_osx*',
]) ])
elif sys.platform.startswith('linux'): elif sys.platform.startswith('linux'):
want.append('bin/lld')
# Copy the libstdc++.so.6 we linked Clang against so it can run. # Copy the libstdc++.so.6 we linked Clang against so it can run.
want.append('lib/libstdc++.so.6') want.append('lib/libstdc++.so.6')
# Copy only # Copy only
......
...@@ -437,8 +437,7 @@ def UpdateClang(args): ...@@ -437,8 +437,7 @@ def UpdateClang(args):
Checkout('LLVM', LLVM_REPO_URL + '/llvm/trunk', LLVM_DIR) Checkout('LLVM', LLVM_REPO_URL + '/llvm/trunk', LLVM_DIR)
Checkout('Clang', LLVM_REPO_URL + '/cfe/trunk', CLANG_DIR) Checkout('Clang', LLVM_REPO_URL + '/cfe/trunk', CLANG_DIR)
if sys.platform == 'win32' or use_head_revision: Checkout('LLD', LLVM_REPO_URL + '/lld/trunk', LLD_DIR)
Checkout('LLD', LLVM_REPO_URL + '/lld/trunk', LLD_DIR)
Checkout('compiler-rt', LLVM_REPO_URL + '/compiler-rt/trunk', COMPILER_RT_DIR) Checkout('compiler-rt', LLVM_REPO_URL + '/compiler-rt/trunk', COMPILER_RT_DIR)
if sys.platform == 'darwin': if sys.platform == 'darwin':
# clang needs a libc++ checkout, else -stdlib=libc++ won't find includes # clang needs a libc++ checkout, else -stdlib=libc++ won't find includes
...@@ -529,40 +528,34 @@ def UpdateClang(args): ...@@ -529,40 +528,34 @@ def UpdateClang(args):
# Build LLVM gold plugin with LTO. That speeds up the linker by ~10%. # Build LLVM gold plugin with LTO. That speeds up the linker by ~10%.
# We only use LTO for Linux now. # We only use LTO for Linux now.
if args.bootstrap and args.lto_gold_plugin: if args.bootstrap and args.lto:
print 'Building LTO LLVM Gold plugin' print 'Building LTO LLVM Gold plugin'
if os.path.exists(LLVM_LTO_GOLD_PLUGIN_DIR): if os.path.exists(LLVM_LTO_GOLD_PLUGIN_DIR):
RmTree(LLVM_LTO_GOLD_PLUGIN_DIR) RmTree(LLVM_LTO_GOLD_PLUGIN_DIR)
EnsureDirExists(LLVM_LTO_GOLD_PLUGIN_DIR) EnsureDirExists(LLVM_LTO_GOLD_PLUGIN_DIR)
os.chdir(LLVM_LTO_GOLD_PLUGIN_DIR) os.chdir(LLVM_LTO_GOLD_PLUGIN_DIR)
# Create a symlink to LLVMgold.so build in the previous step so that ar
# and ranlib could find it while linking LLVMgold.so with LTO.
EnsureDirExists(BFD_PLUGINS_DIR)
RunCommand(['ln', '-sf',
os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'lib', 'LLVMgold.so'),
os.path.join(BFD_PLUGINS_DIR, 'LLVMgold.so')])
lto_cflags = ['-flto'] lto_cflags = ['-flto']
lto_ldflags = ['-fuse-ld=gold'] lto_cxxflags = ['-flto']
lto_ldflags = ['-fuse-ld=lld']
if args.gcc_toolchain: if args.gcc_toolchain:
# Tell the bootstrap compiler to use a specific gcc prefix to search # Tell the bootstrap compiler to use a specific gcc prefix to search
# for standard library headers and shared object files. # for standard library headers and shared object files.
lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain] lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain]
lto_cxxflags += ['--gcc-toolchain=' + args.gcc_toolchain]
lto_cmake_args = base_cmake_args + [ lto_cmake_args = base_cmake_args + [
'-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir,
'-DCMAKE_C_COMPILER=' + cc, '-DCMAKE_C_COMPILER=' + cc,
'-DCMAKE_CXX_COMPILER=' + cxx, '-DCMAKE_CXX_COMPILER=' + cxx,
'-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags), '-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags),
'-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cflags), '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cxxflags),
'-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags), '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags),
'-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags), '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags),
'-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)] '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)]
# We need to use the proper binutils which support LLVM Gold plugin. # We need to use the proper binutils which support LTO.
lto_env = os.environ.copy() lto_env = os.environ.copy()
lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '') lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '')
RmCmakeCache('.') RmCmakeCache('.')
RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env) RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env)
RunCommand(['ninja', 'LLVMgold'], env=lto_env) RunCommand(['ninja', 'LLVMgold'], env=lto_env)
...@@ -597,10 +590,27 @@ def UpdateClang(args): ...@@ -597,10 +590,27 @@ def UpdateClang(args):
CreateChromeToolsShim() CreateChromeToolsShim()
deployment_env = None llvm_build_cflags = cflags
llvm_build_cxxflags = cxxflags
llvm_build_ldflags = ldflags
llvm_build_env = None
if sys.platform != 'win32':
# On Windows, the line below might add some Unicode entries
# and that will fail if passed into popen. See
# http://stackoverflow.com/questions/12253014/why-does-popen-fail-on-windows-if-the-env-parameter-contains-a-unicode-object
# Since we don't need to add anything into environment on Windows,
# just workaround this, until we moved into Python 3, where it's
# supposedly fixed.
llvm_build_env = os.environ.copy()
if deployment_target: if deployment_target:
deployment_env = os.environ.copy() llvm_build_env['MACOSX_DEPLOYMENT_TARGET'] = deployment_target
deployment_env['MACOSX_DEPLOYMENT_TARGET'] = deployment_target if args.lto:
# Put proper binutils for building with LTO
llvm_build_env['PATH'] = (BINUTILS_BIN_DIR + os.pathsep +
llvm_build_env.get('PATH', ''))
llvm_build_cflags += ['-flto']
llvm_build_cxxflags += ['-flto']
llvm_build_ldflags += ['-fuse-ld=lld']
cmake_args = [] cmake_args = []
# TODO(thakis): Unconditionally append this to base_cmake_args instead once # TODO(thakis): Unconditionally append this to base_cmake_args instead once
...@@ -610,11 +620,11 @@ def UpdateClang(args): ...@@ -610,11 +620,11 @@ def UpdateClang(args):
if cxx is not None: cc_args.append('-DCMAKE_CXX_COMPILER=' + cxx) if cxx is not None: cc_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
cmake_args += base_cmake_args + [ cmake_args += base_cmake_args + [
'-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir,
'-DCMAKE_C_FLAGS=' + ' '.join(cflags), '-DCMAKE_C_FLAGS=' + ' '.join(llvm_build_cflags),
'-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags), '-DCMAKE_CXX_FLAGS=' + ' '.join(llvm_build_cxxflags),
'-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags), '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(llvm_build_ldflags),
'-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags), '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(llvm_build_ldflags),
'-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags), '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(llvm_build_ldflags),
'-DCMAKE_INSTALL_PREFIX=' + LLVM_BUILD_DIR, '-DCMAKE_INSTALL_PREFIX=' + LLVM_BUILD_DIR,
# TODO(thakis): Remove this once official builds pass -Wl,--build-id # TODO(thakis): Remove this once official builds pass -Wl,--build-id
# explicitly, https://crbug.com/622775 # explicitly, https://crbug.com/622775
...@@ -626,7 +636,7 @@ def UpdateClang(args): ...@@ -626,7 +636,7 @@ def UpdateClang(args):
os.chdir(LLVM_BUILD_DIR) os.chdir(LLVM_BUILD_DIR)
RmCmakeCache('.') RmCmakeCache('.')
RunCommand(['cmake'] + cmake_args + [LLVM_DIR], RunCommand(['cmake'] + cmake_args + [LLVM_DIR],
msvc_arch='x64', env=deployment_env) msvc_arch='x64', env=llvm_build_env)
if args.gcc_toolchain: if args.gcc_toolchain:
# Copy in the right stdlibc++.so.6 so clang can start. # Copy in the right stdlibc++.so.6 so clang can start.
...@@ -666,8 +676,8 @@ def UpdateClang(args): ...@@ -666,8 +676,8 @@ def UpdateClang(args):
#cflags += ['-m32'] #cflags += ['-m32']
#cxxflags += ['-m32'] #cxxflags += ['-m32']
compiler_rt_args = base_cmake_args + [ compiler_rt_args = base_cmake_args + [
'-DCMAKE_C_FLAGS=' + ' '.join(cflags), '-DCMAKE_C_FLAGS=' + ' '.join(llvm_build_cflags),
'-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags)] '-DCMAKE_CXX_FLAGS=' + ' '.join(llvm_build_cxxflags)]
if sys.platform != 'win32': if sys.platform != 'win32':
compiler_rt_args += ['-DLLVM_CONFIG_PATH=' + compiler_rt_args += ['-DLLVM_CONFIG_PATH=' +
os.path.join(LLVM_BUILD_DIR, 'bin', 'llvm-config'), os.path.join(LLVM_BUILD_DIR, 'bin', 'llvm-config'),
...@@ -677,7 +687,7 @@ def UpdateClang(args): ...@@ -677,7 +687,7 @@ def UpdateClang(args):
RmCmakeCache('.') RmCmakeCache('.')
RunCommand(['cmake'] + compiler_rt_args + RunCommand(['cmake'] + compiler_rt_args +
[LLVM_DIR if sys.platform == 'win32' else COMPILER_RT_DIR], [LLVM_DIR if sys.platform == 'win32' else COMPILER_RT_DIR],
msvc_arch='x86', env=deployment_env) msvc_arch='x86', env=llvm_build_env)
RunCommand(['ninja', 'compiler-rt'], msvc_arch='x86') RunCommand(['ninja', 'compiler-rt'], msvc_arch='x86')
# Copy select output to the main tree. # Copy select output to the main tree.
...@@ -808,8 +818,8 @@ def main(): ...@@ -808,8 +818,8 @@ def main():
parser.add_argument('--gcc-toolchain', help='set the version for which gcc ' parser.add_argument('--gcc-toolchain', help='set the version for which gcc '
'version be used for building; --gcc-toolchain=/opt/foo ' 'version be used for building; --gcc-toolchain=/opt/foo '
'picks /opt/foo/bin/gcc') 'picks /opt/foo/bin/gcc')
parser.add_argument('--lto-gold-plugin', action='store_true', parser.add_argument('--lto', action='store_true',
help='build LLVM Gold plugin with LTO') help='build Clang toolchain with LTO')
parser.add_argument('--llvm-force-head-revision', action='store_true', parser.add_argument('--llvm-force-head-revision', action='store_true',
help=('use the revision in the repo when printing ' help=('use the revision in the repo when printing '
'the revision')) 'the revision'))
...@@ -828,12 +838,12 @@ def main(): ...@@ -828,12 +838,12 @@ def main():
default=sys.platform.startswith('linux')) default=sys.platform.startswith('linux'))
args = parser.parse_args() args = parser.parse_args()
if args.lto_gold_plugin and not args.bootstrap: if args.lto and not args.bootstrap:
print '--lto-gold-plugin requires --bootstrap' print '--lto requires --bootstrap'
return 1 return 1
if args.lto_gold_plugin and not sys.platform.startswith('linux'): if args.lto and not sys.platform.startswith('linux'):
print '--lto-gold-plugin is only effective on Linux. Ignoring the option.' print '--lto is only effective on Linux. Ignoring the option.'
args.lto_gold_plugin = False args.lto = False
if args.if_needed: if args.if_needed:
is_clang_required = False is_clang_required = False
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment