CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
117 lines
4.0 KiB
Python
117 lines
4.0 KiB
Python
import os
|
|
import pathlib
|
|
import shutil
|
|
|
|
import pytest
|
|
|
|
# Configure Windows console for UTF-8 output before any test output
|
|
from rocm_kpack.platform_utils import configure_windows_console
|
|
|
|
configure_windows_console()
|
|
|
|
from rocm_kpack.binutils import Toolchain
|
|
from elf_test_utils import patch_hip_fatbin_size
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def test_assets_dir() -> pathlib.Path:
|
|
"""Provides a pathlib.Path to the shared test_assets directory."""
|
|
test_assets_path = pathlib.Path(__file__).parent.parent / "test_assets"
|
|
if not test_assets_path.is_dir():
|
|
raise FileNotFoundError(
|
|
f"test_assets directory not found at: {test_assets_path}"
|
|
)
|
|
return test_assets_path.resolve()
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def toolchain() -> Toolchain:
|
|
"""Provides a Toolchain, using ROCm installation if available.
|
|
|
|
Tool discovery order:
|
|
1. KPACK_LLVM_BIN environment variable (path to LLVM bin directory)
|
|
2. System PATH (via shutil.which)
|
|
|
|
Set KPACK_LLVM_BIN to your LLVM bin directory if tools aren't on PATH:
|
|
export KPACK_LLVM_BIN=/opt/rocm/llvm/bin
|
|
"""
|
|
llvm_bin = os.environ.get("KPACK_LLVM_BIN")
|
|
|
|
# Check KPACK_LLVM_BIN first
|
|
if llvm_bin:
|
|
llvm_bin_path = pathlib.Path(llvm_bin)
|
|
bundler = llvm_bin_path / "clang-offload-bundler"
|
|
if not bundler.exists():
|
|
# Try with .exe extension on Windows
|
|
bundler = llvm_bin_path / "clang-offload-bundler.exe"
|
|
if bundler.exists():
|
|
return Toolchain(clang_offload_bundler=bundler)
|
|
|
|
# Fall back to system PATH
|
|
bundler_path = shutil.which("clang-offload-bundler")
|
|
if bundler_path:
|
|
return Toolchain(clang_offload_bundler=pathlib.Path(bundler_path))
|
|
|
|
# Return default Toolchain - will fail on first tool access with helpful error
|
|
return Toolchain()
|
|
|
|
|
|
# =============================================================================
|
|
# Patched binary fixtures for edge case testing
|
|
# =============================================================================
|
|
#
|
|
# These fixtures create modified versions of test binaries to trigger edge
|
|
# cases that are difficult to reproduce with real compiled code. See
|
|
# tests/elf_test_utils.py for detailed background on why these cases matter.
|
|
|
|
|
|
@pytest.fixture
|
|
def small_hip_fatbin_binary(
|
|
test_assets_dir: pathlib.Path, tmp_path: pathlib.Path
|
|
) -> pathlib.Path:
|
|
"""
|
|
Create a binary with a .hip_fatbin section too small to zero-page.
|
|
|
|
The section is set to 3000 bytes, which is less than one 4KB page.
|
|
This means conservative_zero_page() cannot find any full pages to
|
|
remove, causing it to fail.
|
|
|
|
This reproduces CI failures like:
|
|
WARNING: Section too small or misaligned - no full pages to zero
|
|
Section range: [0xf000, 0xfd6d)
|
|
Error: Zero-page optimization failed
|
|
|
|
Returns:
|
|
Path to the patched binary
|
|
"""
|
|
source = test_assets_dir / "bundled_binaries/linux/cov5/test_kernel_single.exe"
|
|
output = tmp_path / "small_hip_fatbin.exe"
|
|
return patch_hip_fatbin_size(source, output, new_size=3000)
|
|
|
|
|
|
@pytest.fixture
|
|
def marginal_hip_fatbin_binary(
|
|
test_assets_dir: pathlib.Path, tmp_path: pathlib.Path
|
|
) -> pathlib.Path:
|
|
"""
|
|
Create a binary where kpack overhead exceeds zero-page savings.
|
|
|
|
The section is set to 5000 bytes (~1.2 pages). Zero-paging can remove
|
|
one full page (4KB), but the structural changes required add more:
|
|
- Padding for mmap alignment (up to 4KB)
|
|
- PHDR table relocation with spare slots
|
|
- Section data relocation for alignment
|
|
|
|
Net result: binary grows by ~1-2KB instead of shrinking.
|
|
|
|
This reproduces CI failures like:
|
|
Error: Binary was not stripped or grew in size: .../test_tuple
|
|
Original: 764864 bytes, New: 766019 bytes
|
|
|
|
Returns:
|
|
Path to the patched binary
|
|
"""
|
|
source = test_assets_dir / "bundled_binaries/linux/cov5/test_kernel_single.exe"
|
|
output = tmp_path / "marginal_hip_fatbin.exe"
|
|
return patch_hip_fatbin_size(source, output, new_size=5000)
|