| # llvm-profdata - Profile data tool | |
| :::{program} llvm-profdata | |
| ::: | |
| ## SYNOPSIS | |
| {program}`llvm-profdata` *command* \[*args...*\] | |
| ## DESCRIPTION | |
| The {program}`llvm-profdata` tool is a small utility for working with profile | |
| data files. | |
| ## COMMANDS | |
| - {ref}`merge <profdata-merge>` | |
| - {ref}`show <profdata-show>` | |
| - {ref}`overlap <profdata-overlap>` | |
| - {ref}`order <profdata-order>` | |
| :::{program} llvm-profdata merge | |
| ::: | |
| (profdata-merge)= | |
| ## MERGE | |
| ### SYNOPSIS | |
| {program}`llvm-profdata merge` \[*options*\] \[*filename...*\] | |
| ### DESCRIPTION | |
| {program}`llvm-profdata merge` takes several profile data files | |
| generated by PGO instrumentation and merges them together into a single | |
| indexed profile data file. | |
| By default profile data is merged without modification. This means that the | |
| relative importance of each input file is proportional to the number of samples | |
| or counts it contains. In general, the input from a longer training run will be | |
| interpreted as relatively more important than a shorter run. Depending on the | |
| nature of the training runs it may be useful to adjust the weight given to each | |
| input file by using the `-weighted-input` option. | |
| Profiles passed in via `-weighted-input`, `-input-files`, or via positional | |
| arguments are processed once for each time they are seen. | |
| ### OPTIONS | |
| :::{option} --help | |
| Print a summary of command line options. | |
| ::: | |
| :::{option} --output=<output>, -o | |
| Specify the output file name. *Output* cannot be `-` as the resulting | |
| indexed profile data can't be written to standard output. | |
| ::: | |
| :::{option} --weighted-input=<weight,filename> | |
| Specify an input file name along with a weight. The profile counts of the | |
| supplied `filename` will be scaled (multiplied) by the supplied | |
| `weight`, where `weight` is a decimal integer >= 1. | |
| Input files specified without using this option are assigned a default | |
| weight of 1. Examples are shown below. | |
| ::: | |
| :::{option} --input-files=<path>, -f | |
| Specify a file which contains a list of files to merge. The entries in this | |
| file are newline-separated. Lines starting with '#' are skipped. Entries may | |
| be of the form \<filename> or \<weight>,\<filename>. | |
| ::: | |
| :::{option} --remapping-file=<path>, -r | |
| Specify a file which contains a remapping from symbol names in the input | |
| profile to the symbol names that should be used in the output profile. The | |
| file should consist of lines of the form `<input-symbol> <output-symbol>`. | |
| Blank lines and lines starting with `#` are skipped. | |
| The {doc}`llvm-cxxmap <llvm-cxxmap>` tool can be used to generate the symbol | |
| remapping file. | |
| ::: | |
| :::{option} --instr (default) | |
| Specify that the input profile is an instrumentation-based profile. | |
| ::: | |
| ::::{option} --sample | |
| Specify that the input profile is a sample-based profile. | |
| The format of the generated file can be generated in one of three ways: | |
| :::{option} --binary (default) | |
| ::: | |
| Emit the profile using a binary encoding. For instrumentation-based profile | |
| the output format is the indexed binary format. | |
| :::{option} --extbinary | |
| ::: | |
| Emit the profile using an extensible binary encoding. This option can only | |
| be used with sample-based profile. The extensible binary encoding can be | |
| more compact with compression enabled and can be loaded faster than the | |
| default binary encoding. | |
| :::{option} --text | |
| ::: | |
| Emit the profile in text mode. This option can also be used with both | |
| sample-based and instrumentation-based profile. When this option is used | |
| the profile will be dumped in the text format that is parsable by the profile | |
| reader. | |
| :::{option} --gcc | |
| ::: | |
| Emit the profile using GCC's gcov format (Not yet supported). | |
| :::: | |
| :::{option} --sparse[=true|false] | |
| Do not emit function records with 0 execution count. Can only be used in | |
| conjunction with -instr. Defaults to false, since it can inhibit compiler | |
| optimization during PGO. | |
| ::: | |
| :::{option} --num-threads=<N>, -j | |
| Use N threads to perform profile merging. When N=0, llvm-profdata auto-detects | |
| an appropriate number of threads to use. This is the default. | |
| ::: | |
| :::{option} --failure-mode=[any|all] | |
| Set the failure mode. There are two options: 'any' causes the merge command to | |
| fail if any profiles are invalid, and 'all' causes the merge command to fail | |
| only if all profiles are invalid. If 'all' is set, information from any | |
| invalid profiles is excluded from the final merged product. The default | |
| failure mode is 'any'. | |
| ::: | |
| :::{option} --prof-sym-list=<path> | |
| Specify a file which contains a list of symbols to generate profile symbol | |
| list in the profile. This option can only be used with sample-based profile | |
| in extbinary format. The entries in this file are newline-separated. | |
| ::: | |
| :::{option} --compress-all-sections=[true|false] | |
| Compress all sections when writing the profile. This option can only be used | |
| with sample-based profile in extbinary format. | |
| ::: | |
| :::{option} --use-md5=[true|false] | |
| Use MD5 to represent string in name table when writing the profile. | |
| This option can only be used with sample-based profile in extbinary format. | |
| ::: | |
| :::{option} --gen-partial-profile=[true|false] | |
| Mark the profile to be a partial profile which only provides partial profile | |
| coverage for the optimized target. This option can only be used with | |
| sample-based profile in extbinary format. | |
| ::: | |
| :::{option} --split-layout=[true|false] | |
| Split the profile data section to two with one containing sample profiles with | |
| inlined functions and the other not. This option can only be used with | |
| sample-based profile in extbinary format. | |
| ::: | |
| :::{option} --convert-sample-profile-layout=[nest|flat] | |
| Convert the merged profile into a profile with a new layout. Supported | |
| layout are `nest` (Nested profile, the input should be CS flat profile) and | |
| `flat` (Profile with nested inlinees flattened out). | |
| ::: | |
| :::{option} --supplement-instr-with-sample=<file> | |
| Supplement an instrumentation profile with sample profile. The sample profile | |
| is the input of the flag. Output will be in instrumentation format (only works | |
| with -instr). | |
| ::: | |
| :::{option} --zero-counter-threshold=<float> | |
| For the function which is cold in instr profile but hot in sample profile, if | |
| the ratio of the number of zero counters divided by the total number of | |
| counters is above the threshold, the profile of the function will be regarded | |
| as being harmful for performance and will be dropped. | |
| ::: | |
| :::{option} --instr-prof-cold-threshold=<int> | |
| User specified cold threshold for instr profile which will override the cold | |
| threshold got from profile summary. | |
| ::: | |
| :::{option} --suppl-min-size-threshold=<int> | |
| If the size of a function is smaller than the threshold, assume it can be | |
| inlined by PGO early inliner and it will not be adjusted based on sample | |
| profile. | |
| ::: | |
| :::{option} --debug-info=<path> | |
| Specify the executable or `.dSYM` that contains debug info for the raw profile. | |
| When `--debug-info-correlate` or `--profile-correlate=debug-info` was used | |
| for instrumentation, use this option to correlate the raw profile. | |
| ::: | |
| :::{option} --binary-file=<path> | |
| Specify the executable that contains profile data and profile name sections for | |
| the raw profile. When `-profile-correlate=binary` was used for | |
| instrumentation, use this option to correlate the raw profile. | |
| ::: | |
| :::{option} --debuginfod | |
| Use debuginfod to find the associated executables that contain profile data and | |
| name sections for the raw profiles to correlate them. | |
| When -profile-correlate=binary was used for instrumentation, this option can be | |
| used for correlation. | |
| ::: | |
| :::{option} --debug-file-directory=<dir> | |
| Use provided local directories to search for executables that contain profile | |
| data and name sections for the raw profiles to correlate them. | |
| When -profile-correlate=binary was used for instrumentation, this option can be | |
| used for correlation. | |
| ::: | |
| :::{option} --correlate=<kind> | |
| Specify the correlation kind (debug_info or binary) to use when -debuginfod or | |
| -debug-file-directory=\<dir> option is provided. | |
| ::: | |
| :::{option} --temporal-profile-trace-reservoir-size | |
| The maximum number of temporal profile traces to be stored in the output | |
| profile. If more traces are added, we will use reservoir sampling to select | |
| which traces to keep. Note that changing this value between different merge | |
| invocations on the same indexed profile could result in sample bias. The | |
| default value is 100. | |
| ::: | |
| :::{option} --temporal-profile-max-trace-length | |
| The maximum number of functions in a single temporal profile trace. Longer | |
| traces will be truncated. The default value is 1000. | |
| ::: | |
| :::{option} --function=<string> | |
| Only keep functions matching the regex in the output, all others are erased | |
| from the profile. | |
| ::: | |
| :::{option} --no-function=<string> | |
| Remove functions matching the regex from the profile. If both --function and | |
| --no-function are specified and a function matches both, it is removed. | |
| ::: | |
| ### EXAMPLES | |
| #### Basic Usage | |
| Merge three profiles: | |
| ``` | |
| llvm-profdata merge foo.profdata bar.profdata baz.profdata -output merged.profdata | |
| ``` | |
| #### Weighted Input | |
| The input file `foo.profdata` is especially important, multiply its counts by 10: | |
| ``` | |
| llvm-profdata merge --weighted-input=10,foo.profdata bar.profdata baz.profdata --output merged.profdata | |
| ``` | |
| Exactly equivalent to the previous invocation (explicit form; useful for programmatic invocation): | |
| ``` | |
| llvm-profdata merge --weighted-input=10,foo.profdata --weighted-input=1,bar.profdata --weighted-input=1,baz.profdata --output merged.profdata | |
| ``` | |
| :::{program} llvm-profdata show | |
| ::: | |
| (profdata-show)= | |
| ## SHOW | |
| ### SYNOPSIS | |
| {program}`llvm-profdata show` \[*options*\] \[*filename*\] | |
| ### DESCRIPTION | |
| {program}`llvm-profdata show` takes a profile data file and displays the | |
| information about the profile counters for this file and | |
| for any of the specified function(s). | |
| If *filename* is omitted or is `-`, then **llvm-profdata show** reads its | |
| input from standard input. | |
| ### OPTIONS | |
| :::{option} --all-functions | |
| Print details for every function. | |
| ::: | |
| :::{option} --binary-ids | |
| Print embedded binary ids in a profile. | |
| ::: | |
| :::{option} --counts | |
| Print the counter values for the displayed functions. | |
| ::: | |
| :::{option} --show-format=<text|json|yaml> | |
| Emit output in the selected format if supported by the provided profile type. | |
| ::: | |
| :::{option} --function=<string> | |
| Print details for a function if the function's name contains the given string. | |
| ::: | |
| :::{option} --help | |
| Print a summary of command line options. | |
| ::: | |
| :::{option} --output=<output>, -o | |
| Specify the output file name. If *output* is `-` or it isn't specified, | |
| then the output is sent to standard output. | |
| ::: | |
| :::{option} --instr (default) | |
| Specify that the input profile is an instrumentation-based profile. | |
| ::: | |
| :::{option} --text | |
| Instruct the profile dumper to show profile counts in the text format of the | |
| instrumentation-based profile data representation. By default, the profile | |
| information is dumped in a more human-readable form (also in text) with | |
| annotations. | |
| ::: | |
| :::{option} --topn=<n> | |
| Instruct the profile dumper to show the top `n` functions with the | |
| hottest basic blocks in the summary section. By default, the topn functions | |
| are not dumped. | |
| ::: | |
| :::{option} --sample | |
| Specify that the input profile is a sample-based profile. | |
| ::: | |
| :::{option} --memop-sizes | |
| Show the profiled sizes of the memory intrinsic calls for shown functions. | |
| ::: | |
| :::{option} --value-cutoff=<n> | |
| Show only those functions whose max count values are greater or equal to `n`. | |
| By default, the value-cutoff is set to 0. | |
| ::: | |
| :::{option} --list-below-cutoff | |
| Only output names of functions whose max count value are below the cutoff | |
| value. | |
| ::: | |
| :::{option} --profile-version | |
| Print profile version. | |
| ::: | |
| :::{option} --showcs | |
| Only show context sensitive profile counts. The default is to filter all | |
| context sensitive profile counts. | |
| ::: | |
| :::{option} --show-prof-sym-list=[true|false] | |
| Show profile symbol list if it exists in the profile. This option is only | |
| meaningful for sample-based profile in extbinary format. | |
| ::: | |
| :::{option} --show-sec-info-only=[true|false] | |
| Show basic information about each section in the profile. This option is | |
| only meaningful for sample-based profile in extbinary format. | |
| ::: | |
| :::{option} --show-composite-info-only=[true|false] | |
| Show the per-function composite block structure. This option is only meaningful | |
| for sample-based profiles in the composite extbinary format, introduced in | |
| version 105. | |
| ::: | |
| :::{option} --debug-info=<path> | |
| Specify the executable or `.dSYM` that contains debug info for the raw profile. | |
| When `--debug-info-correlate` or `--profile-correlate=debug-info` was used | |
| for instrumentation, use this option to show the correlated functions from the | |
| raw profile. | |
| ::: | |
| :::{option} --covered | |
| Show only the functions that have been executed, i.e., functions with non-zero | |
| counts. | |
| ::: | |
| :::{program} llvm-profdata overlap | |
| ::: | |
| (profdata-overlap)= | |
| ## OVERLAP | |
| ### SYNOPSIS | |
| {program}`llvm-profdata overlap` \[*options*\] \[*base profile file*\] \[*test profile file*\] | |
| ### DESCRIPTION | |
| {program}`llvm-profdata overlap` takes two profile data files and displays the | |
| *overlap* of counter distribution between the whole files and between any of the | |
| specified functions. | |
| In this command, *overlap* is defined as follows: | |
| Suppose *base profile file* has the following counts: | |
| {c1_1, c1_2, ..., c1_n, c1_u_1, c2_u_2, ..., c2_u_s}, | |
| and *test profile file* has | |
| {c2_1, c2_2, ..., c2_n, c2_v_1, c2_v_2, ..., c2_v_t}. | |
| Here c{1|2}\_i (i = 1 .. n) are matched counters and c1_u_i (i = 1 .. s) and | |
| c2_v_i (i = 1 .. v) are unmatched counters (or counters only existing in) | |
| *base profile file* and *test profile file*, respectively. | |
| Let sum_1 = c1_1 + c1_2 + ... + c1_n + c1_u_1 + c2_u_2 + ... + c2_u_s, and | |
| sum_2 = c2_1 + c2_2 + ... + c2_n + c2_v_1 + c2_v_2 + ... + c2_v_t. | |
| *overlap* = min(c1_1/sum_1, c2_1/sum_2) + min(c1_2/sum_1, c2_2/sum_2) + ... | |
| \+ min(c1_n/sum_1, c2_n/sum_2). | |
| The result overlap distribution is a percentage number, ranging from 0.0% to | |
| 100.0%, where 0.0% means there is no overlap and 100.0% means a perfect | |
| overlap. | |
| Here is an example, if *base profile file* has counts of {400, 600}, and | |
| *test profile file* has matched counts of {60000, 40000}. The *overlap* is 80%. | |
| ### OPTIONS | |
| :::{option} --function=<string> | |
| Print details for a function if the function's name contains the given string. | |
| ::: | |
| :::{option} --help | |
| Print a summary of command line options. | |
| ::: | |
| :::{option} --output=<output>, -o | |
| Specify the output file name. If *output* is `-` or it isn't specified, | |
| then the output is sent to standard output. | |
| ::: | |
| :::{option} --value-cutoff=<n> | |
| Show only those functions whose max count values are greater or equal to `n`. | |
| By default, the value-cutoff is set to max of unsigned long long. | |
| ::: | |
| :::{option} --cs | |
| Only show overlap for the context sensitive profile counts. The default is to show | |
| non-context sensitive profile counts. | |
| ::: | |
| :::{program} llvm-profdata order | |
| ::: | |
| (profdata-order)= | |
| ## ORDER | |
| ### SYNOPSIS | |
| {program}`llvm-profdata order` \[*options*\] \[*filename*\] | |
| ### DESCRIPTION | |
| {program}`llvm-profdata order` uses temporal profiling traces from a profile and | |
| finds a function order that reduces the number of page faults for those traces. | |
| This output can be directly passed to `lld` via `--symbol-ordering-file=` | |
| for ELF or `-order-file` for Mach-O. If the traces found in the profile are | |
| representative of the real world, then this order should improve startup | |
| performance. | |
| ### OPTIONS | |
| :::{option} --help | |
| Print a summary of command line options. | |
| ::: | |
| :::{option} --output=<output>, -o | |
| Specify the output file name. If *output* is `-` or it isn't specified, | |
| then the output is sent to standard output. | |
| ::: | |
| ## EXIT STATUS | |
| {program}`llvm-profdata` returns 1 if the command is omitted or is invalid, | |
| if it cannot read input files, or if there is a mismatch between their data. | |