-
Notifications
You must be signed in to change notification settings - Fork 15.4k
Description
Disclaimer: everything below is currently re Linux but Mac/Windows can/should be discussed.
Some people would like to
- Build MLIR with
MLIR_LINK_MLIR_DYLIB=ON; - Build external
DialectXYZas a dylib using artifacts of step 1; - Runtime load
libDialectXYZ.so.
This is actually possible today using DialectPlugin; examples/standalone/standalone-plugin basically demos/exercises this (modulo the MLIR_LINK_MLIR_DYLIB=ON but I've tested with DYLIB=ON too). For C++ API users there are no issues; so e.g., mlir-opt, being a C++ API user, has no problems because mlir-opt and libMLIRStandalone.so will both link against the same libMLIR.so.
What's not possible today is doing this same type of thing through the C API because currently libMLIR-C doesn't link against libMLIR even in the case of MLIR_LINK_MLIR_DYLIB=ON because of some logic I don't quite understand. So today what occurs is
$ ldd libStandaloneCAPI.so
libMLIRStandalone.so -> libMLIR.so
libMLIR-C.so
where libMLIR-C.so duplicates everything in libMLIR.so (typeids, etc) and so everything blows up.
What you want is
$ ldd libStandaloneCAPI.so
libMLIRStandalone.so -┐
|-> libMLIR.so
libMLIR-C.so ---------┘
and then everything will work.
Turns out an MVP patch is very small:
diff --git a/mlir/cmake/modules/AddMLIR.cmake b/mlir/cmake/modules/AddMLIR.cmake
index a3324705c525..700a8de26723 100644
--- a/mlir/cmake/modules/AddMLIR.cmake
+++ b/mlir/cmake/modules/AddMLIR.cmake
@@ -410,7 +410,11 @@ function(add_mlir_library name)
# which excludes it if the ultimate link target is excluding the library.
set(NEW_LINK_LIBRARIES)
get_target_property(CURRENT_LINK_LIBRARIES ${name} LINK_LIBRARIES)
- get_mlir_filtered_link_libraries(NEW_LINK_LIBRARIES ${CURRENT_LINK_LIBRARIES})
+ if(MLIR_LINK_MLIR_DYLIB)
+ set(NEW_LINK_LIBRARIES "MLIR")
+ else()
+ get_mlir_filtered_link_libraries(NEW_LINK_LIBRARIES ${CURRENT_LINK_LIBRARIES})
+ endif()
set_target_properties(${name} PROPERTIES LINK_LIBRARIES "${NEW_LINK_LIBRARIES}")
list(APPEND AGGREGATE_DEPS ${NEW_LINK_LIBRARIES})
set_target_properties(${name} PROPERTIES(tested/verified here).
And now I open the floor for discussion; possible topics include:
- Windows and Mac (although I'm not sure if
ENABLE_AGGREGATIONis supported on Windows?); - Some alternative approach such as alluded to here https://discourse.llvm.org/t/extensible-standalone-capi/71865/6