From 5501bee55bd9ca0eb998c9502746b03a3e875320 Mon Sep 17 00:00:00 2001 From: papertager <2567587994@qq.com> Date: Fri, 5 Jun 2026 11:27:47 +0800 Subject: [PATCH 1/2] Improve MACA compiler failure diagnostics --- python/tvm/contrib/mxcc.py | 21 +++++-- .../python/contrib/test_mxcc_error_message.py | 59 +++++++++++++++++++ 2 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 tests/python/contrib/test_mxcc_error_message.py diff --git a/python/tvm/contrib/mxcc.py b/python/tvm/contrib/mxcc.py index c5ad9eca5969..04bb20b02a9a 100644 --- a/python/tvm/contrib/mxcc.py +++ b/python/tvm/contrib/mxcc.py @@ -19,6 +19,7 @@ import re import os +import shlex import subprocess import warnings from typing import Tuple @@ -31,6 +32,21 @@ from . import utils +def _format_mxcc_error(cmd, compiler_output, code): + """Format an mxcc failure with enough context for reproduction.""" + return "\n".join( + [ + "MACA compilation failed.", + "Command:", + shlex.join(cmd), + "Compiler output:", + py_str(compiler_output), + "Source:", + code, + ] + ) + + def compile_maca( code, target_format="mcbin", arch=None, options=None, path_target=None ): # pylint: disable=unused-argument @@ -108,10 +124,7 @@ def compile_maca( (out, _) = proc.communicate() if proc.returncode != 0: - msg = code - msg += "\nCompilation error:\n" - msg += py_str(out) - raise RuntimeError(msg) + raise RuntimeError(_format_mxcc_error(cmd, out, code)) with open(file_target, "rb") as f: data = bytearray(f.read()) diff --git a/tests/python/contrib/test_mxcc_error_message.py b/tests/python/contrib/test_mxcc_error_message.py new file mode 100644 index 000000000000..8d175cf1503a --- /dev/null +++ b/tests/python/contrib/test_mxcc_error_message.py @@ -0,0 +1,59 @@ +import importlib.util +import sys +import types +import unittest +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parents[3] +MXCC_PATH = REPO_ROOT / "python" / "tvm" / "contrib" / "mxcc.py" + +tvm_ffi = types.ModuleType("tvm_ffi") +tvm_ffi.register_global_func = lambda *args, **kwargs: ( + (lambda func: func) if args and callable(args[0]) else (lambda func: func) +) +tvm_ffi.get_global_func = lambda _name: None +sys.modules["tvm_ffi"] = tvm_ffi + +tvm = types.ModuleType("tvm") +tvm.maca = lambda *_args, **_kwargs: types.SimpleNamespace(exist=False) +tvm.target = types.ModuleType("tvm.target") +tvm.target.Target = object +sys.modules["tvm"] = tvm +sys.modules["tvm.target"] = tvm.target + +tvm_base = types.ModuleType("tvm.base") +tvm_base.py_str = lambda value: value.decode("utf-8") if isinstance(value, bytes) else str(value) +sys.modules["tvm.base"] = tvm_base + +tvm_contrib = types.ModuleType("tvm.contrib") +tvm_contrib.__path__ = [] +sys.modules["tvm.contrib"] = tvm_contrib + +tvm_contrib_utils = types.ModuleType("tvm.contrib.utils") +tvm_contrib_utils.tempdir = lambda: None +sys.modules["tvm.contrib.utils"] = tvm_contrib_utils + +spec = importlib.util.spec_from_file_location("tvm.contrib.mxcc", MXCC_PATH) +mxcc = importlib.util.module_from_spec(spec) +mxcc.__package__ = "tvm.contrib" +sys.modules["tvm.contrib.mxcc"] = mxcc +assert spec.loader is not None +spec.loader.exec_module(mxcc) + + +class TestMXCCErrorMessage(unittest.TestCase): + + def test_error_message_includes_reproducible_command(self): + cmd = ["mxcc", "-device-obj", "-o", "/tmp/out.mcbin", "/tmp/in.maca"] + source = "extern \"C\" __global__ void broken() {}" + message = mxcc._format_mxcc_error(cmd, b"syntax error", source) + + self.assertIn("MACA compilation failed.", message) + self.assertIn("mxcc -device-obj -o /tmp/out.mcbin /tmp/in.maca", message) + self.assertIn("syntax error", message) + self.assertIn(source, message) + + +if __name__ == "__main__": + unittest.main() From 070ea114df26f6297e81e95a273a6587946fdc1e Mon Sep 17 00:00:00 2001 From: ghangz <152254226+ghangz@users.noreply.github.com> Date: Wed, 24 Jun 2026 17:05:42 +0800 Subject: [PATCH 2/2] Harden mxcc error formatting --- python/tvm/contrib/mxcc.py | 9 ++- .../python/contrib/test_mxcc_error_message.py | 64 ++++--------------- 2 files changed, 20 insertions(+), 53 deletions(-) diff --git a/python/tvm/contrib/mxcc.py b/python/tvm/contrib/mxcc.py index 04bb20b02a9a..880f499b5f3c 100644 --- a/python/tvm/contrib/mxcc.py +++ b/python/tvm/contrib/mxcc.py @@ -34,13 +34,18 @@ def _format_mxcc_error(cmd, compiler_output, code): """Format an mxcc failure with enough context for reproduction.""" + command_text = shlex.join([str(part) for part in cmd]) + if isinstance(compiler_output, bytes): + compiler_text = compiler_output.decode("utf-8", errors="replace") + else: + compiler_text = py_str(compiler_output) return "\n".join( [ "MACA compilation failed.", "Command:", - shlex.join(cmd), + command_text, "Compiler output:", - py_str(compiler_output), + compiler_text, "Source:", code, ] diff --git a/tests/python/contrib/test_mxcc_error_message.py b/tests/python/contrib/test_mxcc_error_message.py index 8d175cf1503a..8e518039a017 100644 --- a/tests/python/contrib/test_mxcc_error_message.py +++ b/tests/python/contrib/test_mxcc_error_message.py @@ -1,59 +1,21 @@ -import importlib.util -import sys -import types -import unittest from pathlib import Path +from tvm.contrib import mxcc -REPO_ROOT = Path(__file__).resolve().parents[3] -MXCC_PATH = REPO_ROOT / "python" / "tvm" / "contrib" / "mxcc.py" -tvm_ffi = types.ModuleType("tvm_ffi") -tvm_ffi.register_global_func = lambda *args, **kwargs: ( - (lambda func: func) if args and callable(args[0]) else (lambda func: func) -) -tvm_ffi.get_global_func = lambda _name: None -sys.modules["tvm_ffi"] = tvm_ffi +def test_error_message_includes_reproducible_command(): + cmd = ["mxcc", "-device-obj", "-o", Path("/tmp/out.mcbin"), "/tmp/in.maca"] + source = 'extern "C" __global__ void broken() {}' + message = mxcc._format_mxcc_error(cmd, b"syntax error", source) -tvm = types.ModuleType("tvm") -tvm.maca = lambda *_args, **_kwargs: types.SimpleNamespace(exist=False) -tvm.target = types.ModuleType("tvm.target") -tvm.target.Target = object -sys.modules["tvm"] = tvm -sys.modules["tvm.target"] = tvm.target + assert "MACA compilation failed." in message + assert "mxcc -device-obj -o /tmp/out.mcbin /tmp/in.maca" in message + assert "syntax error" in message + assert source in message -tvm_base = types.ModuleType("tvm.base") -tvm_base.py_str = lambda value: value.decode("utf-8") if isinstance(value, bytes) else str(value) -sys.modules["tvm.base"] = tvm_base -tvm_contrib = types.ModuleType("tvm.contrib") -tvm_contrib.__path__ = [] -sys.modules["tvm.contrib"] = tvm_contrib +def test_error_message_replaces_non_utf8_output(): + message = mxcc._format_mxcc_error(["mxcc"], b"\xff", "__kernel") -tvm_contrib_utils = types.ModuleType("tvm.contrib.utils") -tvm_contrib_utils.tempdir = lambda: None -sys.modules["tvm.contrib.utils"] = tvm_contrib_utils - -spec = importlib.util.spec_from_file_location("tvm.contrib.mxcc", MXCC_PATH) -mxcc = importlib.util.module_from_spec(spec) -mxcc.__package__ = "tvm.contrib" -sys.modules["tvm.contrib.mxcc"] = mxcc -assert spec.loader is not None -spec.loader.exec_module(mxcc) - - -class TestMXCCErrorMessage(unittest.TestCase): - - def test_error_message_includes_reproducible_command(self): - cmd = ["mxcc", "-device-obj", "-o", "/tmp/out.mcbin", "/tmp/in.maca"] - source = "extern \"C\" __global__ void broken() {}" - message = mxcc._format_mxcc_error(cmd, b"syntax error", source) - - self.assertIn("MACA compilation failed.", message) - self.assertIn("mxcc -device-obj -o /tmp/out.mcbin /tmp/in.maca", message) - self.assertIn("syntax error", message) - self.assertIn(source, message) - - -if __name__ == "__main__": - unittest.main() + assert "Compiler output:" in message + assert "\ufffd" in message