# 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.

