Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: tools/clang/scripts/update.py

Issue 2848113002: clang: Link lld against tcmalloc. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """This script is used to download prebuilt clang binaries. 6 """This script is used to download prebuilt clang binaries.
7 7
8 It is also used by package.py to build the prebuilt clang binaries.""" 8 It is also used by package.py to build the prebuilt clang binaries."""
9 9
10 import argparse 10 import argparse
(...skipping 16 matching lines...) Expand all
27 # Do NOT CHANGE this if you don't know what you're doing -- see 27 # Do NOT CHANGE this if you don't know what you're doing -- see
28 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md 28 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
29 # Reverting problematic clang rolls is safe, though. 29 # Reverting problematic clang rolls is safe, though.
30 CLANG_REVISION = '300839' 30 CLANG_REVISION = '300839'
31 31
32 use_head_revision = 'LLVM_FORCE_HEAD_REVISION' in os.environ 32 use_head_revision = 'LLVM_FORCE_HEAD_REVISION' in os.environ
33 if use_head_revision: 33 if use_head_revision:
34 CLANG_REVISION = 'HEAD' 34 CLANG_REVISION = 'HEAD'
35 35
36 # This is incremented when pushing a new build of Clang at the same revision. 36 # This is incremented when pushing a new build of Clang at the same revision.
37 CLANG_SUB_REVISION=1 37 CLANG_SUB_REVISION=2
38 38
39 PACKAGE_VERSION = "%s-%s" % (CLANG_REVISION, CLANG_SUB_REVISION) 39 PACKAGE_VERSION = "%s-%s" % (CLANG_REVISION, CLANG_SUB_REVISION)
40 40
41 # Path constants. (All of these should be absolute paths.) 41 # Path constants. (All of these should be absolute paths.)
42 THIS_DIR = os.path.abspath(os.path.dirname(__file__)) 42 THIS_DIR = os.path.abspath(os.path.dirname(__file__))
43 CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..')) 43 CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..'))
44 THIRD_PARTY_DIR = os.path.join(CHROMIUM_DIR, 'third_party') 44 THIRD_PARTY_DIR = os.path.join(CHROMIUM_DIR, 'third_party')
45 LLVM_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm') 45 LLVM_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm')
46 LLVM_BOOTSTRAP_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm-bootstrap') 46 LLVM_BOOTSTRAP_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm-bootstrap')
47 LLVM_BOOTSTRAP_INSTALL_DIR = os.path.join(THIRD_PARTY_DIR, 47 LLVM_BOOTSTRAP_INSTALL_DIR = os.path.join(THIRD_PARTY_DIR,
(...skipping 11 matching lines...) Expand all
59 if sys.platform == 'win32': 59 if sys.platform == 'win32':
60 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt') 60 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt')
61 else: 61 else:
62 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'compiler-rt') 62 COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'compiler-rt')
63 LIBCXX_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxx') 63 LIBCXX_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxx')
64 LIBCXXABI_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxxabi') 64 LIBCXXABI_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxxabi')
65 LLVM_BUILD_TOOLS_DIR = os.path.abspath( 65 LLVM_BUILD_TOOLS_DIR = os.path.abspath(
66 os.path.join(LLVM_DIR, '..', 'llvm-build-tools')) 66 os.path.join(LLVM_DIR, '..', 'llvm-build-tools'))
67 STAMP_FILE = os.path.normpath( 67 STAMP_FILE = os.path.normpath(
68 os.path.join(LLVM_DIR, '..', 'llvm-build', 'cr_build_revision')) 68 os.path.join(LLVM_DIR, '..', 'llvm-build', 'cr_build_revision'))
69 BINUTILS_DIR = os.path.join(THIRD_PARTY_DIR, 'binutils') 69 BINUTILS_DIR = os.path.join(THIRD_PARTY_DIR, 'binutils', 'Linux_x64', 'Release')
70 BINUTILS_BIN_DIR = os.path.join(BINUTILS_DIR, BINUTILS_DIR, 70 BINUTILS_BIN_DIR = os.path.join(BINUTILS_DIR, 'bin')
71 'Linux_x64', 'Release', 'bin') 71 BINUTILS_LIB_DIR = os.path.join(BINUTILS_DIR, 'lib')
72 BFD_PLUGINS_DIR = os.path.join(BINUTILS_DIR, 'Linux_x64', 'Release', 72 BFD_PLUGINS_DIR = os.path.join(BINUTILS_LIB_DIR, 'bfd-plugins')
73 'lib', 'bfd-plugins')
74 VERSION = '5.0.0' 73 VERSION = '5.0.0'
75 ANDROID_NDK_DIR = os.path.join( 74 ANDROID_NDK_DIR = os.path.join(
76 CHROMIUM_DIR, 'third_party', 'android_tools', 'ndk') 75 CHROMIUM_DIR, 'third_party', 'android_tools', 'ndk')
77 76
78 # URL for pre-built binaries. 77 # URL for pre-built binaries.
79 CDS_URL = os.environ.get('CDS_CLANG_BUCKET_OVERRIDE', 78 CDS_URL = os.environ.get('CDS_CLANG_BUCKET_OVERRIDE',
80 'https://commondatastorage.googleapis.com/chromium-browser-clang') 79 'https://commondatastorage.googleapis.com/chromium-browser-clang')
81 80
82 LLVM_REPO_URL='https://llvm.org/svn/llvm-project' 81 LLVM_REPO_URL='https://llvm.org/svn/llvm-project'
83 if 'LLVM_REPO_URL' in os.environ: 82 if 'LLVM_REPO_URL' in os.environ:
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 495
497 base_cmake_args = ['-GNinja', 496 base_cmake_args = ['-GNinja',
498 '-DCMAKE_BUILD_TYPE=Release', 497 '-DCMAKE_BUILD_TYPE=Release',
499 '-DLLVM_ENABLE_ASSERTIONS=ON', 498 '-DLLVM_ENABLE_ASSERTIONS=ON',
500 # Statically link MSVCRT to avoid DLL dependencies. 499 # Statically link MSVCRT to avoid DLL dependencies.
501 '-DLLVM_USE_CRT_RELEASE=MT', 500 '-DLLVM_USE_CRT_RELEASE=MT',
502 ] 501 ]
503 502
504 binutils_incdir = '' 503 binutils_incdir = ''
505 if sys.platform.startswith('linux'): 504 if sys.platform.startswith('linux'):
506 binutils_incdir = os.path.join(BINUTILS_DIR, 'Linux_x64/Release/include') 505 binutils_incdir = os.path.join(BINUTILS_DIR, 'include')
507 506
508 if args.bootstrap: 507 if args.bootstrap:
509 print 'Building bootstrap compiler' 508 print 'Building bootstrap compiler'
510 EnsureDirExists(LLVM_BOOTSTRAP_DIR) 509 EnsureDirExists(LLVM_BOOTSTRAP_DIR)
511 os.chdir(LLVM_BOOTSTRAP_DIR) 510 os.chdir(LLVM_BOOTSTRAP_DIR)
512 bootstrap_args = base_cmake_args + [ 511 bootstrap_args = base_cmake_args + [
513 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, 512 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir,
514 '-DLLVM_TARGETS_TO_BUILD=host', 513 '-DLLVM_TARGETS_TO_BUILD=host',
515 '-DCMAKE_INSTALL_PREFIX=' + LLVM_BOOTSTRAP_INSTALL_DIR, 514 '-DCMAKE_INSTALL_PREFIX=' + LLVM_BOOTSTRAP_INSTALL_DIR,
516 '-DCMAKE_C_FLAGS=' + ' '.join(cflags), 515 '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 EnsureDirExists(LLVM_LTO_GOLD_PLUGIN_DIR) 557 EnsureDirExists(LLVM_LTO_GOLD_PLUGIN_DIR)
559 os.chdir(LLVM_LTO_GOLD_PLUGIN_DIR) 558 os.chdir(LLVM_LTO_GOLD_PLUGIN_DIR)
560 559
561 # Create a symlink to LLVMgold.so build in the previous step so that ar 560 # Create a symlink to LLVMgold.so build in the previous step so that ar
562 # and ranlib could find it while linking LLVMgold.so with LTO. 561 # and ranlib could find it while linking LLVMgold.so with LTO.
563 EnsureDirExists(BFD_PLUGINS_DIR) 562 EnsureDirExists(BFD_PLUGINS_DIR)
564 RunCommand(['ln', '-sf', 563 RunCommand(['ln', '-sf',
565 os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'lib', 'LLVMgold.so'), 564 os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'lib', 'LLVMgold.so'),
566 os.path.join(BFD_PLUGINS_DIR, 'LLVMgold.so')]) 565 os.path.join(BFD_PLUGINS_DIR, 'LLVMgold.so')])
567 566
567 # Link against binutils's copy of tcmalloc to speed up the linker by ~10%.
568 tcmalloc_ldflags = [
569 '-L' + BINUTILS_LIB_DIR, '-ltcmalloc_minimal',
570 '-Wl,-rpath,\\$ORIGIN/../../../binutils/Linux_x64/Release/lib']
hans 2017/04/28 23:23:26 Does package.py need an update to include the .so?
pcc1 2017/04/28 23:27:16 The .so is part of binutils, so wouldn't it come w
571
568 lto_cflags = ['-flto=thin'] 572 lto_cflags = ['-flto=thin']
569 lto_ldflags = ['-fuse-ld=lld'] 573 lto_ldflags = ['-fuse-ld=lld']
570 if args.gcc_toolchain: 574 if args.gcc_toolchain:
571 # Tell the bootstrap compiler to use a specific gcc prefix to search 575 # Tell the bootstrap compiler to use a specific gcc prefix to search
572 # for standard library headers and shared object files. 576 # for standard library headers and shared object files.
573 lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain] 577 lto_cflags += ['--gcc-toolchain=' + args.gcc_toolchain]
574 lto_cmake_args = base_cmake_args + [ 578 lto_cmake_args = base_cmake_args + [
575 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir, 579 '-DLLVM_BINUTILS_INCDIR=' + binutils_incdir,
576 '-DCMAKE_C_COMPILER=' + cc, 580 '-DCMAKE_C_COMPILER=' + cc,
577 '-DCMAKE_CXX_COMPILER=' + cxx, 581 '-DCMAKE_CXX_COMPILER=' + cxx,
578 '-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags), 582 '-DCMAKE_C_FLAGS=' + ' '.join(lto_cflags),
579 '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cflags), 583 '-DCMAKE_CXX_FLAGS=' + ' '.join(lto_cflags),
580 '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags), 584 '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(lto_ldflags + tcmalloc_ldflags),
581 '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags), 585 '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(lto_ldflags),
582 '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)] 586 '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(lto_ldflags)]
583 587
584 # We need to use the proper binutils which support LLVM Gold plugin. 588 # We need to use the proper binutils which support LLVM Gold plugin.
585 lto_env = os.environ.copy() 589 lto_env = os.environ.copy()
586 lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '') 590 lto_env['PATH'] = BINUTILS_BIN_DIR + os.pathsep + lto_env.get('PATH', '')
587 591
592 # Also need to make sure that tblgen can find the tcmalloc DSO.
593 lto_env['LD_LIBRARY_PATH'] = \
594 BINUTILS_LIB_DIR + os.pathsep + lto_env.get('LD_LIBRARY_PATH', '')
595
588 RmCmakeCache('.') 596 RmCmakeCache('.')
589 RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env) 597 RunCommand(['cmake'] + lto_cmake_args + [LLVM_DIR], env=lto_env)
590 RunCommand(['ninja', 'LLVMgold', 'lld'], env=lto_env) 598 RunCommand(['ninja', 'LLVMgold', 'lld'], env=lto_env)
591 599
592 600
593 # LLVM uses C++11 starting in llvm 3.5. On Linux, this means libstdc++4.7+ is 601 # LLVM uses C++11 starting in llvm 3.5. On Linux, this means libstdc++4.7+ is
594 # needed, on OS X it requires libc++. clang only automatically links to libc++ 602 # needed, on OS X it requires libc++. clang only automatically links to libc++
595 # when targeting OS X 10.9+, so add stdlib=libc++ explicitly so clang can run 603 # when targeting OS X 10.9+, so add stdlib=libc++ explicitly so clang can run
596 # on OS X versions as old as 10.7. 604 # on OS X versions as old as 10.7.
597 deployment_target = '' 605 deployment_target = ''
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 args.force_local_build = True 916 args.force_local_build = True
909 if 'OS=android' not in os.environ.get('GYP_DEFINES', ''): 917 if 'OS=android' not in os.environ.get('GYP_DEFINES', ''):
910 # Only build the Android ASan rt on ToT bots when targetting Android. 918 # Only build the Android ASan rt on ToT bots when targetting Android.
911 args.with_android = False 919 args.with_android = False
912 920
913 return UpdateClang(args) 921 return UpdateClang(args)
914 922
915 923
916 if __name__ == '__main__': 924 if __name__ == '__main__':
917 sys.exit(main()) 925 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698