0
Files
src/docs/win_order_files.md
Egor Pasko 5d9fd59d6e [docs] windows orderfile: nit
TBR=hans@chromium.org

Bug: None
Change-Id: I0007fb38499a66a50cddf89b65ef1dc8fc58e077
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1948934
Reviewed-by: Egor Pasko <pasko@chromium.org>
Reviewed-by: Hans Wennborg <hans@chromium.org>
Commit-Queue: Egor Pasko <pasko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#721008}
2019-12-03 16:34:37 +00:00

87 lines
2.9 KiB
Markdown

# Updating the Windows .order files
The `chrome/build/*.orderfile` files are used to specify the order in which
the linker should lay out symbols in the binary it's producing. By ordering
functions in the order they're typically executed during start-up, the start-up
time can be reduced slightly.
The order files are used automatically when building with Clang for Windows with
the gn flag `is_official_build` set to `true`.
To update the order files:
1. Build with instrumentation enabled:
The instrumentation will capture the couple of million function calls
in a binary as it runs and write them to a file in the `\src\tmp` directory.
Make sure this directory exists.
```shell
gn gen out\instrument --args="is_debug=false is_official_build=true generate_order_files=true symbol_level=1"
ninja -C out\instrument chrome
```
(If you have access to Goma, add `use_goma=true` to the gn args and `-j500`
to the Ninja invocation.)
1. Run the instrumented binaries:
(Some binaries such as `mksnapshot`, `yasm`, and `protoc` already ran with
instrumentation during the build process. The instrumentation output should
be available under `\src\tmp`.)
Open the Task Manager's Details tab or
[Process Explorer](https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer)
to be able to see the Process IDs of running programs.
Run Chrome:
```shell
out\instrument\chrome
```
Note the Process ID of the browser process.
Check in `\src\tmp\` for instrumentation output from the process, for
example `cygprofile_14652.txt`. The files are only written once a certain
number of function calls have been made, so sometimes you need to browse a
bit for the file to be produced.
1. If the file appears to have sensible contents (a long list of function names
that eventually seem related to what the browser should
do), copy it into `chrome\build\`:
```shell
copy \src\tmp\cygprofile_25392.txt chrome\build\chrome.x64.orderfile
```
1. Re-build the `chrome` target. This will re-link `chrome.dll`
using the new order file and surface any link errors if
the order file is broken.
```shell
ninja -C out\instrument chrome
```
1. Repeat the previous steps with a 32-bit build, i.e. passing
`target_cpu="x86"` to gn and storing the file as `.x86.orderfile`.
1. Upload the order files to Google Cloud Storage. They will get downloaded
by a `gclient` hook based on the contents of the `.orderfile.sha1` files.
You need to have write access to the `chromium-browser-clang` GCS bucket
for this step.
```shell
cd chrome\build\
upload_to_google_storage.py -b chromium-browser-clang/orderfiles -z orderfile chrome.x64.orderfile chrome.x86.orderfile
gsutil.py setacl public-read gs://chromium-browser-clang/orderfiles/*
```
1. Check in the `.sha1` files corresponding to the orderfiles created by the
previous step.