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

  1. Pass --base_jit_path <path> to supply a baseline clrjit directly and bypass auto-discovery entirely.
  2. Pass --base_git_hash <sha> of a commit you know was built by the rolling build, and ensure network access to Azure Storage.
  3. Check the spmi/basejit cache directory and the logged blob URIs to see which candidates were attempted.
  4. 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

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


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)