dotnet/runtime · error · RuntimeError

No JIT changes found starting with baseline hash

Error message

No JIT changes found starting with baseline hash

What it means

Raised by determine_base_jit when the 'git log' over the last 20 commits from the baseline touched no JIT source files, yielding an empty change list. With no candidate commits, there is nothing to download a baseline JIT from, so the function aborts. This is a data-condition failure rather than a git error: the command succeeded but returned zero lines.

Solutions

  1. Pass --base_git_hash <sha> pointing at a commit known to contain JIT changes so the candidate list is non-empty.
  2. Verify the src/coreclr/jit pathspec is correct for your checkout layout.
  3. If the baseline genuinely has no recent JIT changes, pick an older baseline commit that does, or supply --base_jit_path directly.

Example fix

// before
change_list_hashes = stdout_change_list.decode('utf-8').strip().splitlines()
if len(change_list_hashes) == 0:
    raise RuntimeError("No JIT changes found starting with baseline hash")
// after (fix invocation)
python superpmi.py asmdiff --base_git_hash <commit-with-jit-changes> ...
Defensive patterns

Strategy: validation

Validate before calling

import subprocess
def ensure_jit_changes_exist(repo_location, baseline_hash):
    cmd = ['git', '-C', repo_location, 'log', '--pretty=format:%H', baseline_hash, '-20', '--', 'src/coreclr/jit/*', 'src/coreclr/inc/jiteeversionguid.h']
    out = subprocess.run(cmd, capture_output=True).stdout.decode('utf-8').strip().splitlines()
    if len(out) == 0:
        raise RuntimeError(f"No JIT changes in last 20 commits from {baseline_hash}; pass --base_git_hash <commit-with-jit-changes>")
    return out

Prevention

When it happens

Trigger: After git log returns code 0, stdout_change_list.decode().strip().splitlines() is empty (len == 0), so the RuntimeError fires. Happens when the last 20 commits from the baseline include none that modified src/coreclr/jit/* or jiteeversionguid.h, or when the baseline is at HEAD with no prior JIT changes in range.

Common situations: A branch where recent work is entirely outside the JIT (e.g. libraries/VM changes); the baseline_hash being very close to HEAD; a pathspec mismatch where JIT sources live elsewhere; an extremely fresh repo with fewer than 20 commits.

Related errors


AI-assisted analysis of dotnet/runtime@60108ba66e (2026-08-10). Data as JSON: /api/errors/5b5775e06ff518bb. Report an issue: GitHub.

Appendix: source

Thrown at src/coreclr/scripts/superpmi.py:4913

            logging.info("Baseline hash: %s", baseline_hash)
        else:
            baseline_hash = coreclr_args.base_git_hash

        if coreclr_args.base_git_hash is None:
            # Enumerate the last 20 changes, starting with the baseline, that included JIT and JIT-EE GUID changes.
            command = [ "git", "log", "--pretty=format:%H", baseline_hash, "-20", "--", "src/coreclr/jit/*", "src/coreclr/inc/jiteeversionguid.h" ]
            logging.debug("Invoking: %s", " ".join(command))
            proc = subprocess.Popen(command, stdout=subprocess.PIPE)
            stdout_change_list, _ = proc.communicate()
            return_code = proc.returncode
            change_list_hashes = []
            if return_code == 0:
                change_list_hashes = stdout_change_list.decode('utf-8').strip().splitlines()
            else:
                raise RuntimeError("Couldn't determine list of JIT changes starting with baseline hash")

            if len(change_list_hashes) == 0:
                raise RuntimeError("No JIT changes found starting with baseline hash")
        else:
            # If `-base_git_hash` is specified, then we use exactly that hash and no other for the baseline.
            change_list_hashes = [ coreclr_args.base_git_hash ]

        # For each hash, (1) see if we have the JIT already, and if not (2) try to download the corresponding JIT from the rolling build.

        hashnum = 1
        for git_hash in change_list_hashes:
            logging.debug("%s: %s", hashnum, git_hash)

            jit_name = get_jit_name(coreclr_args)
            basejit_dir = os.path.join(default_basejit_root_dir, "{}.{}.{}.{}".format(git_hash, coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type))
            basejit_path = os.path.join(basejit_dir, jit_name)
            if os.path.isfile(basejit_path):
                # We found this baseline JIT in our cache; use it!
                coreclr_args.base_jit_path = basejit_path
                logging.info("Using baseline %s", coreclr_args.base_jit_path)
                return

View on GitHub (pinned to 60108ba66e)