dotnet/runtime · error · RuntimeError
No baseline JIT found
Error message
No baseline JIT found
What it means
Raised by determine_base_jit after iterating every candidate commit hash (the JIT change list) and finding neither a cached baseline JIT on disk nor a downloadable one from the JIT rolling build in Azure Storage. The function logs 'Error: no baseline JIT found' for each miss, then raises. This means the auto-discovery/download pipeline is exhausted and the user must supply a baseline JIT explicitly.
Solutions
- Pass --base_jit_path <path> to supply a baseline clrjit directly and bypass auto-discovery entirely.
- Pass --base_git_hash <sha> of a commit you know was built by the rolling build, and ensure network access to Azure Storage.
- Check the spmi/basejit cache directory and the logged blob URIs to see which candidates were attempted.
- Verify os/arch/build_type match a rolling build target that actually published a clrjit.
Example fix
// before
for git_hash in change_list_hashes:
...
local_files = download_files(urls, basejit_dir, verbose=False, is_azure_storage=True, fail_if_not_found=False)
if len(local_files) > 0:
...
return
logging.error("Error: no baseline JIT found")
raise RuntimeError("No baseline JIT found")
// after (fix invocation)
python superpmi.py asmdiff --base_jit_path /path/to/baseline/clrjit.dll ... Defensive patterns
Strategy: fallback
Validate before calling
import os
def preflight_base_jit(coreclr_args):
if coreclr_args.base_jit_path is not None:
if not os.path.isfile(coreclr_args.base_jit_path):
raise RuntimeError(f"base_jit_path not a file: {coreclr_args.base_jit_path}")
return coreclr_args.base_jit_path
if coreclr_args.base_git_hash is None:
import subprocess, shutil
if shutil.which('git') is None:
raise RuntimeError('git not on PATH; pass --base_jit_path or --base_git_hash')
rc = subprocess.run(['git', '-C', coreclr_args.runtime_repo_location, 'rev-parse', 'HEAD'], capture_output=True).returncode
if rc != 0:
raise RuntimeError('repo is not a git checkout; pass --base_jit_path explicitly')
return None # auto-discovery will attempt cache + download Try / catch
try:
determine_base_jit(coreclr_args)
except RuntimeError as e:
logging.error('Automatic baseline JIT discovery failed: %s', e)
logging.error('Supply a baseline explicitly: --base_jit_path <clrjit> or --base_git_hash <sha>')
raise Prevention
- Supply --base_jit_path in offline environments to bypass Azure Storage downloads.
- Ensure network access to Azure Storage for auto-download, or pre-populate the spmi/basejit cache.
- Match os/arch/build_type to a rolling build target that published a clrjit.
When it happens
Trigger: The loop over change_list_hashes checks the local cache (spmi/basejit/<hash>.<os>.<arch>.<build_type>/), then downloads from az_blob_storage_jitrollingbuild_container_uri; every candidate returns no file (download_files returns empty and fail_if_not_found=False). After the loop, the RuntimeError is raised. Occurs when the rolling build didn't produce a JIT for any candidate commit, network/download failed, or the Azure container is unreachable.
Common situations: Offline run with an empty basejit cache; the candidate commits predate the rolling build archive; a mismatched os/arch/build_type so no blob matches; transient Azure Storage outage or SAS token expiry; a branch whose commits were never built by CI.
Related errors
- Couldn't determine newest 'main' git hash
- not found
- Couldn't determine baseline git hash
- Couldn't determine current git hash
- Couldn't determine list of JIT changes starting with…
AI-assisted analysis of dotnet/runtime@60108ba66e (2026-08-10).
Data as JSON: /api/errors/29967e13fc438fe3.
Report an issue: GitHub.
Appendix: source
Thrown at src/coreclr/scripts/superpmi.py:4957
if len(local_files) > 0:
if hashnum > 1:
logging.warning("Warning: the baseline found is not built with the first git hash with JIT code changes; there may be extraneous diffs")
# We expect local_files to be length 1, since we only attempted to download a single file.
if len(local_files) > 1:
logging.error("Error: downloaded more than one file?")
coreclr_args.base_jit_path = local_files[0]
logging.info("Downloaded %s", blob_uri)
logging.info("Using baseline %s", coreclr_args.base_jit_path)
return
# We didn't find a baseline; keep looking
hashnum += 1
# We ran out of hashes of JIT changes, and didn't find a baseline. Give up.
logging.error("Error: no baseline JIT found")
raise RuntimeError("No baseline JIT found")
def get_pintools_path(coreclr_args):
""" Get the local path where we expect pintools for this OS to be located
Returns:
A path to the folder.
"""
return os.path.join(coreclr_args.spmi_location, "pintools", pintools_current_version, coreclr_args.host_os.lower())
def get_pin_exe_path(coreclr_args):
""" Get the local path where we expect the pin executable to be located
Returns:
A path to the executable.
"""
root = get_pintools_path(coreclr_args)
exe = "pin.exe" if coreclr_args.host_os.lower() == "windows" else "pin"
return os.path.join(root, exe)View on GitHub (pinned to 60108ba66e)