# 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)