dotnet/runtime · error · RuntimeError

No baseline JIT found

Error message

No baseline JIT found

What it means

Raised at the end of get_baseline_jit after exhausting all 20 candidate hashes: none existed in the local basejit cache and none were downloadable from the Azure rolling-build blob storage. The script gives up because it cannot obtain any baseline JIT.

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 290d5ab72c)

Solutions

  1. Pre-place a JIT binary in spmi_location/basejit/<hash>.<os>.<arch>.<build_type>/ and re-run.
  2. Check network/proxy access to the Azure storage container used by az_blob_storage_jitrollingbuild_container_uri.
  3. Build a baseline JIT locally for one of the candidate hashes and copy it to the expected cache path.
  4. Use a more recent branch whose rolling builds still exist in storage.

Example fix

// before
# no baseline JIT downloadable -> raises [185]
// after
# copy a locally-built jit into the cache location
mkdir -p $SPMI/basejit/<hash>.<os>.<arch>.Checked
cp <built-jit> $SPMI/basejit/<hash>.<os>.<arch>.Checked/<jit-name>
Defensive patterns

Strategy: fallback

Validate before calling

import os
for h in candidate_hashes:
    p = os.path.join(spmi_location,'basejit',f'{h}.{host_os}.{arch}.{build_type}',jit_name)
    if os.path.isfile(p):
        print('cached baseline JIT available at', p); break
else:
    print('WARNING: no baseline JIT cached and download may fail')

Type guard

def baseline_jit_available(hashes, spmi_location, host_os, arch, build_type, jit_name) -> bool:
    import os
    return any(os.path.isfile(os.path.join(spmi_location,'basejit',f'{h}.{host_os}.{arch}.{build_type}',jit_name)) for h in hashes)

Try / catch

try:
    main(...)
except RuntimeError as e:
    if 'No baseline JIT' in str(e):
        # build a JIT for a baseline commit and place it in the cache, then retry
        stage_baseline_jit(candidate_hashes[0])
        main(...)

Prevention

When it happens

Trigger: For every change-list hash, os.path.isfile(basejit_path) is false AND download_files() returns empty (fail_if_not_found=False). Common when the rolling build for those hashes never published an artifact, or network/azure access is blocked.

Common situations: Old hashes whose rolling builds expired from blob storage; offline/air-gapped run; corporate proxy blocking azure blob endpoint; host_os/arch/build_type combo not built by CI for those hashes.

Related errors


AI-assisted analysis of dotnet/runtime@290d5ab72c (2026-08-06). Data as JSON: /api/errors/29967e13fc438fe3. Report an issue: GitHub.