SuperPMI is a tool for developing and testing the JIT compiler. General information on SuperPMI can be found here.
superpmi.py is a tool to simplify the use of SuperPMI. The tool has three primary modes: collect, replay, and asmdiffs. Below you will find more specific information on each of the different modes.
superpmi.py lives in the dotnet/runtime GitHub repo, src\coreclr\scripts directory.
From the usage message:
usage: superpmi.py [-h] {collect,replay,asmdiffs,upload,download,list-collections,merge-mch} ...
Script to run SuperPMI replay, ASM diffs, and collections. The script also manages the Azure
store of pre-created SuperPMI collection files. Help for each individual command can be shown
by asking for help on the individual command, for example `superpmi.py collect --help`.
positional arguments:
{collect,replay,asmdiffs,upload,download,list-collections,merge-mch}
Command to invoke
optional arguments:
-h, --help show this help message and exit
The simplest usage is to replay using:
python f:\gh\runtime\src\coreclr\scripts\superpmi.py replay
In this case, everything needed is found using defaults:
- The processor architecture is assumed to be the current default (e.g., x64).
- The build type is assumed to be Checked.
- Core_Root is found by assuming superpmi.py is in the normal location in the
clone of the repo, and using the processor architecture, build type, and current
OS, to find it in the default
artifacts
directory location. Note that you must have performed a product build for this platform / build type combination, and created the appropriate Core_Root directory as well. - The SuperPMI tool and JIT to use for replay is found in Core_Root.
- The SuperPMI collections to use for replay are found in the Azure store of precomputed collections for this JIT-EE interface GUID, OS, and processor architecture.
If you want to use a specific MCH file collection, use the -mch_files
argument to specify
one or more MCH files on your machine:
python f:\gh\runtime\src\coreclr\scripts\superpmi.py replay -mch_files f:\spmi\collections\tests.pmi.windows.x64.Release.mch
The -mch_files
argument takes a list of one or more directories or files to use. For
each directory, all the MCH files in that directory are used.
If you want to use just a subset of the collections, either default collections or collections
specified by -mch_files
, use the -filter
argument to restrict the MCH files used, e.g.:
python f:\gh\runtime\src\coreclr\scripts\superpmi.py replay -filter tests
To generate ASM diffs, use the asmdiffs
command. This requires a "diff" and "baseline"
JIT. By default, the "diff" JIT is determined automatically as for the "replay" command,
described above. Also by default, the baseline JIT is determined based on comparing the
state of your branch with the main
branch, and downloading an appropriate baseline JIT from the JIT
rolling build system. Alternatively, you can specify the path to a baseline JIT
compiler using the -base_jit_path
argument.
Example:
python f:\gh\runtime\src\coreclr\scripts\superpmi.py asmdiffs
ASM diffs requires the coredistools library. The script attempts to find or download an appropriate version that can be used.
As for the "replay" case, the set of collections used defaults to the set available
in Azure, or can be specified using the mch_files
argument. In either case, the
-filter
argument can restrict the set used.
SuperPMI requires a collection to enable replay. You can do a collection
yourself using the superpmi.py collect
command, but it is more convenient
to use existing precomputed collections stored in Azure.
You can see which collections are available for your current settings using
the list-collections
command. You can also see all the available collections
using the list-collections --all
command. Finally, you can see which Azure stored
collections have been locally cached on your machine in the default cache location
by using list-collections --local
.
Note that when collections are downloaded, they are cached locally. If there are
any cached collections, then no download attempt is made. To force re-download,
use the --force_download
argument to the replay
, asmdiffs
, or download
command.
Example commands to create a collection (on Linux, by running the tests):
# First, build the product, possibly the tests, and create a Core_Root directory.
/Users/jashoo/runtime/src/coreclr/scripts/superpmi.py collect bash "/Users/jashoo/runtime/src/tests/runtest.sh x64 checked"
The above command collects over all of the managed code called by the child process. Note that this allows many different invocations of any managed code.
You can also collect using PMI instead of running code. Do with with the --pmi
and -assemblies
arguments. E.g.:
python f:\gh\runtime\src\coreclr\scripts\superpmi.py collect --pmi -assemblies f:\assembly_store -output_mch_path f:\collections\my_collection.mch
You can alternatively collect by running crossgen
on a set of assemblies, e.g.:
python f:\gh\runtime\src\coreclr\scripts\superpmi.py collect --crossgen -assemblies f:\assembly_store -output_mch_path f:\collections\my_collection.mch
You can specify both --pmi
and --crossgen
to do both types of collections across the
same set of specified assemblies, with the results being accumulated into a single collection.
Note that the collection process generates gigabytes of data. Most of this data will
be removed when the collection is finished. It is recommended to set the TEMP variable
to a location with adequate space, and preferably on a fast SSD to improve performance,
before running collect
to avoid running out of disk space.
As stated above, you can use the list-collections
command to see which collections
are available in Azure.
There is also a download
command to download one or more Azure stored collection
to the local cache, as well as an upload
command to populate the Azure collection
set.