Open source SuperPMI
authorBruce Forstall <brucefo@microsoft.com>
Fri, 19 Aug 2016 22:56:04 +0000 (15:56 -0700)
committerBruce Forstall <brucefo@microsoft.com>
Fri, 19 Aug 2016 22:56:04 +0000 (15:56 -0700)
commit07ed9e9c7e9df709487453dba575f95fe180466c
treefdbc0bc27287f4502e034fd22e14c5f963996300
parent93055ec2ace98050f3aa1dc93beafeefdb74ebd4
Open source SuperPMI

OVERVIEW
========

This directory contains the SuperPMI tool used for testing the .NET
just-in-time (JIT) compiler.

SuperPMI has two uses:
1. Verification that a JIT code change doesn't cause any asserts.
2. Finding test code where two JIT compilers generate different code, or verifying
that the two compilers generate the same code.

Case dotnet/coreclr#1 is useful for doing quick regression checking when making a source
code change to the JIT compiler. The process is: (a) make a JIT source code
change, (b) run that newly built JIT through a SuperPMI run to verify no
asserts have been introduced.

Case dotnet/coreclr#2 is useful for generating assembly language diffs, to help analyze the
impact of a JIT code change.

SuperPMI works in two phases: collection and playback. In the collection phase,
the system is configured to collect SuperPMI data. Then, run any set of .NET managed
programs. When these managed programs invoke the JIT compiler, SuperPMI gathers and
captures all information passed between the JIT and its .NET host. In the
playback phase, SuperPMI loads the JIT directly, and causes it to compile all
the functions that it previously compiled, but using the collected data to
provide answers to various questions that the JIT needs to ask. The .NET
execution engine (EE) is not invoked at all.

TOOLS
==========

There are two native executable tools: superpmi and mcs. There is a .NET Core
C# program that is built as part of the coreclr repo tests build called
superpmicollect.exe.

All will show a help screen if passed -?.

COLLECTION
==========

Set the following environment variables:

SuperPMIShimLogPath=<full path to an empty temporary directory>
SuperPMIShimPath=<full path to clrjit.dll, the "standalone" JIT>
COMPlus_AltJit=*
COMPlus_AltJitName=superpmi-shim-collector.dll

(On Linux, use libclrjit.so and libsuperpmi-shim-collector.so. On Mac,
use libclrjit.dylib and libsuperpmi-shim-collector.dylib.)

Then, run some managed programs. When done running programs, un-set these variables.

Now, you will have a large number of .mc files. Merge these using the mcs
tool:

mcs -merge base.mch *.mc

One benefit of SuperPMI is the ability to remove duplicated compilations, so
on replay only unique functions are compiled. Use the following to create a
"unique" set of functions:

mcs -removeDup -thin base.mch unique.mch

Note that -thin is not required. However, it will delete all the compilation
result collected during the collection phase, which makes the resulting MCH
file smaller. Those compilation results are not required for playback.

Use the superpmicollect.exe tool to automate and simplify this process.

PLAYBACK
========

Once you have a merged, de-duplicated MCH collection, you can play it back
using:

superpmi unique.mch clrjit.dll

You can do this much faster by utilizing all the processors on your machine,
and replaying in parallel, using:

superpmi -p unique.mch clrjit.dll

REMAINING WORK
=============

The basic of assembly diffing are there, using the "coredistools"
package. The open source build needs to be altered to use this package
to wire up the correct build steps.

[tfs-changeset: 1623347]

Commit migrated from https://github.com/dotnet/coreclr/commit/d85eb92698be624b181ae9685f9cceb09524f75f
164 files changed:
src/coreclr/src/ToolBox/CMakeLists.txt
src/coreclr/src/ToolBox/superpmi/.gitmirror [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/CMakeLists.txt [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/.gitmirror [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/CMakeLists.txt [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/commandline.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/commandline.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/mcs.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/mcs.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbasmdump.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbasmdump.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbconcat.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbconcat.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbdump.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbdump.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbdumpmap.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbdumpmap.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbdumptoc.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbdumptoc.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbfracture.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbfracture.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbildump.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbildump.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbinteg.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbinteg.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbmerge.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbmerge.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbremovedup.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbremovedup.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbsmarty.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbsmarty.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbstat.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbstat.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbstrip.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbstrip.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbtoc.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/mcs/verbtoc.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/readme.txt [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/.gitmirror [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/asmdumper.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/asmdumper.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/callutils.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/callutils.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/crlwmlist.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/errorhandling.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/errorhandling.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/icorjitcompilerimpl.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/icorjithostimpl.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/icorjitinfoimpl.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/lightweightmap.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/logging.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/logging.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/lwmlist.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/mclist.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/mclist.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontextiterator.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontextiterator.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontextreader.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontextreader.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/registertablexarch.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/runtimedetails.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/simpletimer.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/simpletimer.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/spmiutil.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/spmiutil.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/standardpch.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/standardpch.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/tocfile.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/tocfile.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/typeutils.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shared/typeutils.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/.gitmirror [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/CMakeLists.txt [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/coreclrcallbacks.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/coreclrcallbacks.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitcompiler.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitcompiler.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/ieememorymanager.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/ieememorymanager.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/iexecutionengine.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/iexecutionengine.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/jithost.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/jithost.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/superpmi-shim-collector.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/superpmi-shim-collector.def [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/superpmi-shim-collector.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/.gitmirror [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/CMakeLists.txt [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/coreclrcallbacks.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/coreclrcallbacks.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/icorjitcompiler.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/icorjitcompiler.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/icorjitinfo.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/ieememorymanager.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/ieememorymanager.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/iexecutionengine.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/iexecutionengine.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/jithost.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/jithost.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/methodcallsummarizer.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/methodcallsummarizer.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/superpmi-shim-counter.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/superpmi-shim-counter.def [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/superpmi-shim-counter.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/.gitmirror [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/CMakeLists.txt [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/coreclrcallbacks.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/coreclrcallbacks.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/icorjitcompiler.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/icorjitcompiler.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/icorjitinfo.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/ieememorymanager.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/ieememorymanager.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/iexecutionengine.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/iexecutionengine.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/jithost.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/jithost.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/superpmi-shim-simple.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/superpmi-shim-simple.def [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/superpmi-shim-simple.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/.gitmirror [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/CMakeLists.txt [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/commandline.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/commandline.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/coreclrcallbacks.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/coreclrcallbacks.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/cycletimer.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/cycletimer.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/filecache.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/filecache.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/ieememorymanager.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/ieememorymanager.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/iexecutionengine.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/iexecutionengine.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/jitdebugger.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/jitdebugger.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/jithost.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/jithost.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/jitinstance.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/methodstatsemitter.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/methodstatsemitter.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/neardiffer.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/neardiffer.h [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/parallelsuperpmi.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/superpmi.cpp [new file with mode: 0644]
src/coreclr/src/ToolBox/superpmi/superpmi/superpmi.h [new file with mode: 0644]
src/coreclr/tests/src/JIT/superpmi/app.config [new file with mode: 0644]
src/coreclr/tests/src/JIT/superpmi/collect_alltests.cmd [new file with mode: 0644]
src/coreclr/tests/src/JIT/superpmi/collect_alltests.sh [new file with mode: 0755]
src/coreclr/tests/src/JIT/superpmi/collect_runtest.cmd [new file with mode: 0644]
src/coreclr/tests/src/JIT/superpmi/runtests.sh [new file with mode: 0755]
src/coreclr/tests/src/JIT/superpmi/superpmicollect.cs [new file with mode: 0644]
src/coreclr/tests/src/JIT/superpmi/superpmicollect.csproj [new file with mode: 0644]