[build] Only apply thin_lto_enable_optimizations to select targets

Link-time optimization enables greater performance, but leads to
significantly longer link times. This change turns off optimization
in the link step except for select targets such as the actual browser
executable/shared lib.

Source files are still compiled with the usual optimization flags, and
the ThinLTO mechanism is still used for all links; this only affects
whether optimizations are also performed in the link step or not.

The motivation is to speed up builds with thin_lto_enable_optimizations
so that this can be enabled in official builds on all targets.

Currently only ChromeOS and Android use thin_lto_enable_optimizations,
and in terms of production builds this is a no-op since the optimization
is applied to the shipping binaries as before. However it means that tests
and auxiliary binaries won't be optimized during the link step.


In terms of build speed, this reduces the link time of
v8_context_snapshot_generator in a Linux build with
thin_lto_enable_optimizations from 173 to 39 CPU minutes.

On Windows, the link time of the same target goes from 2m50 to 1m40
(wall-clock time). Linking unit_tests goes from 8m50 to 5m40.


Build timings (best of two) of official "all" builds on my Win
workstation:

- Without ThinLTO:                25m
- With ThinLTO opts:            4h36m
- With ThinLTO opts+this patch: 2h39m

With the ThinLTO cache enabled (requires fixing crbug.com/871962):
- With ThinLTO opts+this patch: 1h52m

Hopefully this patch (esp. if we can also fix the thinlto cache bug)
would make win-official survive enabling thin_lto_enable_optimizations
in official builds.


Build timings of official "all" builds on my Linux workstation:
(ThinLTO without opts is already enabled in official builds due to
CFI, so I didn't measure with it disabled.)

- With ThinLTO opts:              4h00m
- With ThinLTO + this patch:      1h12m


Note that this means test binaries and the shipping browser see
different levels of optimization. We think that is the right trade-off:
the difference should only matter in case of compiler/linker bugs, and
we believe the browser binary gets enough testing (e.g. by perf bots)
that such bugs will still be caught. Also to some extent this is
already the case: most testing is done on non-official builds, and
official builds use different optimizations (notably PGO).

We have more ideas for speeding up linking of the
non-link-time-optimized targets, but we hope this is enough to enable
ThinLTO in official Windows and Linux builds.

Bug: 110124, 1057737
Change-Id: I4130c02d0b7fe7012e52c92e51a0b255b576ad2b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2628955
Commit-Queue: Hans Wennborg <hans@chromium.org>
Reviewed-by: Nico Weber <thakis@chromium.org>
Reviewed-by: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/master@{#845618}
5 files changed
tree: 8201f74495f5c9ecc5a2292af6987a94cfcc018a
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. codelabs/
  14. components/
  15. content/
  16. courgette/
  17. crypto/
  18. dbus/
  19. device/
  20. docs/
  21. extensions/
  22. fuchsia/
  23. gin/
  24. google_apis/
  25. google_update/
  26. gpu/
  27. headless/
  28. infra/
  29. ios/
  30. ipc/
  31. jingle/
  32. media/
  33. mojo/
  34. native_client_sdk/
  35. net/
  36. pdf/
  37. ppapi/
  38. printing/
  39. remoting/
  40. rlz/
  41. sandbox/
  42. services/
  43. skia/
  44. sql/
  45. storage/
  46. styleguide/
  47. testing/
  48. third_party/
  49. tools/
  50. ui/
  51. url/
  52. weblayer/
  53. .clang-format
  54. .clang-tidy
  55. .eslintrc.js
  56. .git-blame-ignore-revs
  57. .gitattributes
  58. .gitignore
  59. .gn
  60. .vpython
  61. .vpython3
  62. .yapfignore
  63. AUTHORS
  64. BUILD.gn
  65. CODE_OF_CONDUCT.md
  66. codereview.settings
  67. DEPS
  68. DIR_METADATA
  69. ENG_REVIEW_OWNERS
  70. LICENSE
  71. LICENSE.chromium_os
  72. OWNERS
  73. PRESUBMIT.py
  74. PRESUBMIT_test.py
  75. PRESUBMIT_test_mocks.py
  76. README.md
  77. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

To check out the source code locally, don't use git clone! Instead, follow the instructions on how to get the code.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.