Author: Mehdi Amini
Date: 2025-08-13T21:34:23+02:00
New Revision: 5dc4aba4b2de3a6388ecf9c46ae4e5a1ff906d30

URL: 
https://github.com/llvm/llvm-project/commit/5dc4aba4b2de3a6388ecf9c46ae4e5a1ff906d30
DIFF: 
https://github.com/llvm/llvm-project/commit/5dc4aba4b2de3a6388ecf9c46ae4e5a1ff906d30.diff

LOG: Revert "[MLIR] Split ExecutionEngine Initialization out of ctor into an 
expli…"

This reverts commit 2f93693f76fab9841810ef988087c95887728a91.

Added: 
    

Modified: 
    mlir/include/mlir-c/ExecutionEngine.h
    mlir/include/mlir/ExecutionEngine/ExecutionEngine.h
    mlir/lib/Bindings/Python/ExecutionEngineModule.cpp
    mlir/lib/CAPI/ExecutionEngine/ExecutionEngine.cpp
    mlir/lib/ExecutionEngine/ExecutionEngine.cpp
    mlir/lib/ExecutionEngine/JitRunner.cpp
    mlir/test/CAPI/execution_engine.c
    mlir/unittests/ExecutionEngine/Invoke.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir-c/ExecutionEngine.h 
b/mlir/include/mlir-c/ExecutionEngine.h
index 1a58d68533f24..99cddc5c2598d 100644
--- a/mlir/include/mlir-c/ExecutionEngine.h
+++ b/mlir/include/mlir-c/ExecutionEngine.h
@@ -46,13 +46,6 @@ MLIR_CAPI_EXPORTED MlirExecutionEngine 
mlirExecutionEngineCreate(
     MlirModule op, int optLevel, int numPaths,
     const MlirStringRef *sharedLibPaths, bool enableObjectDump);
 
-/// Initialize the ExecutionEngine. Global constructors specified by
-/// `llvm.mlir.global_ctors` will be run. One common scenario is that kernel
-/// binary compiled from `gpu.module` gets loaded during initialization. Make
-/// sure all symbols are resolvable before initialization by calling
-/// `mlirExecutionEngineRegisterSymbol` or including shared libraries.
-MLIR_CAPI_EXPORTED void mlirExecutionEngineInitialize(MlirExecutionEngine jit);
-
 /// Destroy an ExecutionEngine instance.
 MLIR_CAPI_EXPORTED void mlirExecutionEngineDestroy(MlirExecutionEngine jit);
 

diff  --git a/mlir/include/mlir/ExecutionEngine/ExecutionEngine.h 
b/mlir/include/mlir/ExecutionEngine/ExecutionEngine.h
index 5bd71d68d253a..96ccebcd5685e 100644
--- a/mlir/include/mlir/ExecutionEngine/ExecutionEngine.h
+++ b/mlir/include/mlir/ExecutionEngine/ExecutionEngine.h
@@ -227,13 +227,6 @@ class ExecutionEngine {
       llvm::function_ref<llvm::orc::SymbolMap(llvm::orc::MangleAndInterner)>
           symbolMap);
 
-  /// Initialize the ExecutionEngine. Global constructors specified by
-  /// `llvm.mlir.global_ctors` will be run. One common scenario is that kernel
-  /// binary compiled from `gpu.module` gets loaded during initialization. Make
-  /// sure all symbols are resolvable before initialization by calling
-  /// `registerSymbols` or including shared libraries.
-  void initialize();
-
 private:
   /// Ordering of llvmContext and jit is important for destruction purposes: 
the
   /// jit must be destroyed before the context.
@@ -257,8 +250,6 @@ class ExecutionEngine {
   /// Destroy functions in the libraries loaded by the ExecutionEngine that are
   /// called when this ExecutionEngine is destructed.
   SmallVector<LibraryDestroyFn> destroyFns;
-
-  bool isInitialized = false;
 };
 
 } // namespace mlir

diff  --git a/mlir/lib/Bindings/Python/ExecutionEngineModule.cpp 
b/mlir/lib/Bindings/Python/ExecutionEngineModule.cpp
index 4f7a4a628e246..81dada3553622 100644
--- a/mlir/lib/Bindings/Python/ExecutionEngineModule.cpp
+++ b/mlir/lib/Bindings/Python/ExecutionEngineModule.cpp
@@ -7,8 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "mlir-c/ExecutionEngine.h"
-#include "mlir/Bindings/Python/Nanobind.h"
 #include "mlir/Bindings/Python/NanobindAdaptors.h"
+#include "mlir/Bindings/Python/Nanobind.h"
 
 namespace nb = nanobind;
 using namespace mlir;
@@ -124,17 +124,6 @@ NB_MODULE(_mlirExecutionEngine, m) {
           },
           nb::arg("name"), nb::arg("callback"),
           "Register `callback` as the runtime symbol `name`.")
-      .def(
-          "initialize",
-          [](PyExecutionEngine &executionEngine) {
-            mlirExecutionEngineInitialize(executionEngine.get());
-          },
-          "Initialize the ExecutionEngine. Global constructors specified by "
-          "`llvm.mlir.global_ctors` will be run. One common scenario is that "
-          "kernel binary compiled from `gpu.module` gets loaded during "
-          "initialization. Make sure all symbols are resolvable before "
-          "initialization by calling `raw_register_runtime` or including "
-          "shared libraries.")
       .def(
           "dump_to_object_file",
           [](PyExecutionEngine &executionEngine, const std::string &fileName) {

diff  --git a/mlir/lib/CAPI/ExecutionEngine/ExecutionEngine.cpp 
b/mlir/lib/CAPI/ExecutionEngine/ExecutionEngine.cpp
index 2dbb993b1640f..306cebd236be9 100644
--- a/mlir/lib/CAPI/ExecutionEngine/ExecutionEngine.cpp
+++ b/mlir/lib/CAPI/ExecutionEngine/ExecutionEngine.cpp
@@ -68,10 +68,6 @@ mlirExecutionEngineCreate(MlirModule op, int optLevel, int 
numPaths,
   return wrap(jitOrError->release());
 }
 
-extern "C" void mlirExecutionEngineInitialize(MlirExecutionEngine jit) {
-  unwrap(jit)->initialize();
-}
-
 extern "C" void mlirExecutionEngineDestroy(MlirExecutionEngine jit) {
   delete (unwrap(jit));
 }
@@ -110,8 +106,9 @@ extern "C" void 
mlirExecutionEngineRegisterSymbol(MlirExecutionEngine jit,
                                                   void *sym) {
   unwrap(jit)->registerSymbols([&](llvm::orc::MangleAndInterner interner) {
     llvm::orc::SymbolMap symbolMap;
-    symbolMap[interner(unwrap(name))] = {llvm::orc::ExecutorAddr::fromPtr(sym),
-                                         llvm::JITSymbolFlags::Exported};
+    symbolMap[interner(unwrap(name))] =
+        { llvm::orc::ExecutorAddr::fromPtr(sym),
+          llvm::JITSymbolFlags::Exported };
     return symbolMap;
   });
 }

diff  --git a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp 
b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
index 52162a43aeae3..f704fbfbe8fff 100644
--- a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
+++ b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp
@@ -106,7 +106,7 @@ void ExecutionEngine::dumpToObjectFile(StringRef filename) {
   }
   // Compilation is lazy and it doesn't populate object cache unless requested.
   // In case object dump is requested before cache is populated, we need to
-  // force compilation manually.
+  // force compilation manually. 
   if (cache->isEmpty()) {
     for (std::string &functionName : functionNames) {
       auto result = lookupPacked(functionName);
@@ -400,6 +400,13 @@ ExecutionEngine::create(Operation *m, const 
ExecutionEngineOptions &options,
     return symbolMap;
   };
   engine->registerSymbols(runtimeSymbolMap);
+
+  // Execute the global constructors from the module being processed.
+  // TODO: Allow JIT initialize for AArch64. Currently there's a bug causing a
+  // crash for AArch64 see related issue #71963.
+  if (!engine->jit->getTargetTriple().isAArch64())
+    cantFail(engine->jit->initialize(engine->jit->getMainJITDylib()));
+
   return std::move(engine);
 }
 
@@ -435,7 +442,6 @@ Expected<void *> ExecutionEngine::lookup(StringRef name) 
const {
 
 Error ExecutionEngine::invokePacked(StringRef name,
                                     MutableArrayRef<void *> args) {
-  initialize();
   auto expectedFPtr = lookupPacked(name);
   if (!expectedFPtr)
     return expectedFPtr.takeError();
@@ -445,13 +451,3 @@ Error ExecutionEngine::invokePacked(StringRef name,
 
   return Error::success();
 }
-
-void ExecutionEngine::initialize() {
-  if (isInitialized)
-    return;
-  // TODO: Allow JIT initialize for AArch64. Currently there's a bug causing a
-  // crash for AArch64 see related issue #71963.
-  if (!jit->getTargetTriple().isAArch64())
-    cantFail(jit->initialize(jit->getMainJITDylib()));
-  isInitialized = true;
-}

diff  --git a/mlir/lib/ExecutionEngine/JitRunner.cpp 
b/mlir/lib/ExecutionEngine/JitRunner.cpp
index 0ada4cc96570a..2107df37d1997 100644
--- a/mlir/lib/ExecutionEngine/JitRunner.cpp
+++ b/mlir/lib/ExecutionEngine/JitRunner.cpp
@@ -202,8 +202,6 @@ compileAndExecute(Options &options, Operation *module, 
StringRef entryPoint,
 
   auto engine = std::move(*expectedEngine);
 
-  engine->initialize();
-
   auto expectedFPtr = engine->lookupPacked(entryPoint);
   if (!expectedFPtr)
     return expectedFPtr.takeError();

diff  --git a/mlir/test/CAPI/execution_engine.c 
b/mlir/test/CAPI/execution_engine.c
index 900588aeea2da..4751288c3ee4b 100644
--- a/mlir/test/CAPI/execution_engine.c
+++ b/mlir/test/CAPI/execution_engine.c
@@ -137,60 +137,6 @@ void testOmpCreation(void) {
   mlirContextDestroy(ctx);
 }
 
-// Helper variable to track callback invocations
-static int initCnt = 0;
-
-// Callback function that will be called during JIT initialization
-static void initCallback(void) { initCnt += 1; }
-
-// CHECK-LABEL: Running test 'testGlobalCtorJitCallback'
-void testGlobalCtorJitCallback(void) {
-  MlirContext ctx = mlirContextCreate();
-  registerAllUpstreamDialects(ctx);
-
-  // Create module with global constructor that calls our callback
-  MlirModule module = mlirModuleCreateParse(
-      ctx, mlirStringRefCreateFromCString(
-               // clang-format off
-"module {                                                                      
 \n"
-"  llvm.mlir.global_ctors ctors = [@ctor], priorities = [0 : i32], data = 
[#llvm.zero] \n"
-"  llvm.func @ctor() {                                                         
 \n"
-"    func.call @init_callback() : () -> ()                                     
 \n"
-"    llvm.return                                                               
 \n"
-"  }                                                                           
 \n"
-"  func.func private @init_callback() attributes { llvm.emit_c_interface }     
 \n"
-"}                                                                             
 \n"
-               // clang-format on
-               ));
-
-  lowerModuleToLLVM(ctx, module);
-  mlirRegisterAllLLVMTranslations(ctx);
-
-  // Create execution engine with initialization disabled
-  MlirExecutionEngine jit = mlirExecutionEngineCreate(
-      module, /*optLevel=*/2, /*numPaths=*/0, /*sharedLibPaths=*/NULL,
-      /*enableObjectDump=*/false);
-
-  if (mlirExecutionEngineIsNull(jit)) {
-    fprintf(stderr, "Execution engine creation failed");
-    exit(2);
-  }
-
-  // Register callback symbol before initialization
-  mlirExecutionEngineRegisterSymbol(
-      jit, mlirStringRefCreateFromCString("_mlir_ciface_init_callback"),
-      (void *)(uintptr_t)initCallback);
-
-  mlirExecutionEngineInitialize(jit);
-
-  // CHECK: Init count: 1
-  printf("Init count: %d\n", initCnt);
-
-  mlirExecutionEngineDestroy(jit);
-  mlirModuleDestroy(module);
-  mlirContextDestroy(ctx);
-}
-
 int main(void) {
 
 #define _STRINGIFY(x) #x
@@ -201,6 +147,5 @@ int main(void) {
 
   TEST(testSimpleExecution);
   TEST(testOmpCreation);
-  TEST(testGlobalCtorJitCallback);
   return 0;
 }

diff  --git a/mlir/unittests/ExecutionEngine/Invoke.cpp 
b/mlir/unittests/ExecutionEngine/Invoke.cpp
index 712d4c49a2afe..312b10f28143f 100644
--- a/mlir/unittests/ExecutionEngine/Invoke.cpp
+++ b/mlir/unittests/ExecutionEngine/Invoke.cpp
@@ -322,42 +322,4 @@ TEST(NativeMemRefJit, MAYBE_JITCallback) {
     ASSERT_EQ(elt, coefficient * count++);
 }
 
-static int initCnt = 0;
-// A helper function that will be called during the JIT's initialization.
-static void initCallback() { initCnt += 1; }
-
-TEST(GlobalCtorJit, MAYBE_JITCallback) {
-  std::string moduleStr = R"mlir(
-  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 }
-  )mlir";
-
-  DialectRegistry registry;
-  registerAllDialects(registry);
-  registerBuiltinDialectTranslation(registry);
-  registerLLVMDialectTranslation(registry);
-  MLIRContext context(registry);
-  auto module = parseSourceString<ModuleOp>(moduleStr, &context);
-  ASSERT_TRUE(!!module);
-  ASSERT_TRUE(succeeded(lowerToLLVMDialect(*module)));
-  ExecutionEngineOptions jitOptions;
-  auto jitOrError = ExecutionEngine::create(*module, jitOptions);
-  ASSERT_TRUE(!!jitOrError);
-  auto jit = std::move(jitOrError.get());
-  // Define any extra symbols so they're available at initialization.
-  jit->registerSymbols([&](llvm::orc::MangleAndInterner interner) {
-    llvm::orc::SymbolMap symbolMap;
-    symbolMap[interner("_mlir_ciface_init_callback")] = {
-        llvm::orc::ExecutorAddr::fromPtr(initCallback),
-        llvm::JITSymbolFlags::Exported};
-    return symbolMap;
-  });
-  jit->initialize();
-  ASSERT_EQ(initCnt, 1);
-}
-
 #endif // _WIN32


        
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to