| # UNSUPPORTED: target=aarch64{{.*}}, target=arm64{{.*}} | |
| # RUN: %PYTHON %s 2>&1 | FileCheck %s | |
| # REQUIRES: host-supports-jit | |
| import gc, sys, os, tempfile | |
| from mlir.ir import * | |
| from mlir.passmanager import * | |
| from mlir.execution_engine import * | |
| from mlir.runtime import * | |
| # Log everything to stderr and flush so that we have a unified stream to match | |
| # errors/info emitted by MLIR to stderr. | |
| def log(*args): | |
| print(*args, file=sys.stderr) | |
| sys.stderr.flush() | |
| def run(f): | |
| log("\nTEST:", f.__name__) | |
| f() | |
| gc.collect() | |
| assert Context._get_live_count() == 0 | |
| def lowerToLLVM(module): | |
| pm = PassManager.parse( | |
| "builtin.module(convert-func-to-llvm,reconcile-unrealized-casts)" | |
| ) | |
| pm.run(module.operation) | |
| return module | |
| # Test JIT callback in global constructor | |
| # CHECK-LABEL: TEST: testJITCallbackInGlobalCtor | |
| def testJITCallbackInGlobalCtor(): | |
| init_cnt = 0 | |
| @ctypes.CFUNCTYPE(None) | |
| def initCallback(): | |
| nonlocal init_cnt | |
| init_cnt += 1 | |
| with Context(): | |
| module = Module.parse( | |
| r""" | |
| llvm.mlir.global_ctors ctors = [@ctor], priorities = [0 : i32], data = [#llvm.zero] | |
| llvm.func @ctor() { | |
| func.call @init_callback() : () -> () | |
| llvm.return | |
| } | |
| func.func private @init_callback() attributes { llvm.emit_c_interface } | |
| """ | |
| ) | |
| # Setup execution engine | |
| execution_engine = ExecutionEngine(lowerToLLVM(module)) | |
| # Validate initialization hasn't run yet | |
| assert init_cnt == 0 | |
| # # Register callback | |
| execution_engine.register_runtime("init_callback", initCallback) | |
| # # Initialize and verify | |
| execution_engine.initialize() | |
| assert init_cnt == 1 | |
| # # Second initialization should be no-op | |
| execution_engine.initialize() | |
| assert init_cnt == 1 | |
| run(testJITCallbackInGlobalCtor) |