[MLIR] Add support for libMLIR.so
Putting this up mainly for discussion on
how this should be done. I am interested in MLIR from
the Julia side and we currently have a strong preference
to dynamically linking against the LLVM shared library,
and would like to have a MLIR shared library.
This patch adds a new cmake function add_mlir_library()
which accumulates a list of targets to be compiled into
libMLIR.so. Note that not all libraries make sense to
be compiled into libMLIR.so. In particular, we want
to avoid libraries which primarily exist to support
certain tools (such as mlir-opt and mlir-cpu-runner).
Note that the resulting libMLIR.so depends on LLVM, but
does not contain any LLVM components. As a result, it
is necessary to link with libLLVM.so to avoid linkage
errors. So, libMLIR.so requires LLVM_BUILD_LLVM_DYLIB=on
FYI, Currently it appears that LLVM_LINK_LLVM_DYLIB is broken
because mlir-tblgen is linked against libLLVM.so and
and independent LLVM components
(updated by Stephen Neuendorffer)
Differential Revision: https://reviews.llvm.org/D73130
GitOrigin-RevId: 1246e867164b06fc3f0de6bfaaa0922d99cb5ce9
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5afb039..50c1223 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -34,9 +34,11 @@
add_subdirectory(include/mlir)
add_subdirectory(lib)
-add_subdirectory(tools)
add_subdirectory(unittests)
add_subdirectory(test)
+# Tools needs to come late to ensure that MLIR_ALL_LIBS is populated.
+# Generally things after this point may depend on MLIR_ALL_LIBS or libMLIR.so.
+add_subdirectory(tools)
if( LLVM_INCLUDE_EXAMPLES )
add_subdirectory(examples)
diff --git a/cmake/modules/AddMLIR.cmake b/cmake/modules/AddMLIR.cmake
index d894453..cd7860c 100644
--- a/cmake/modules/AddMLIR.cmake
+++ b/cmake/modules/AddMLIR.cmake
@@ -49,14 +49,41 @@
add_dependencies(mlir-doc ${dialect_doc_filename}DocGen)
endfunction()
+# Declare a library which can be compiled in libMLIR.so
+macro(add_mlir_library name)
+ cmake_parse_arguments(ARG
+ "SHARED;INSTALL_WITH_TOOLCHAIN"
+ ""
+ "ADDITIONAL_HEADERS"
+ ${ARGN})
+ set(srcs)
+ if(ARG_SHARED)
+ set(LIBTYPE SHARED)
+ else()
+ # llvm_add_library ignores BUILD_SHARED_LIBS if STATIC is explicitly set,
+ # so we need to handle it here.
+ if(BUILD_SHARED_LIBS)
+ set(LIBTYPE SHARED)
+ else()
+ set(LIBTYPE STATIC)
+ endif()
+ if(NOT XCODE)
+ # The Xcode generator doesn't handle object libraries correctly.
+ list(APPEND LIBTYPE OBJECT)
+ endif()
+ set_property(GLOBAL APPEND PROPERTY MLIR_ALL_LIBS ${name})
+ endif()
+ add_llvm_library(${name} ${LIBTYPE} ${ARG_UNPARSED_ARGUMENTS} ${srcs})
+endmacro(add_mlir_library)
+
# Declare the library associated with a dialect.
function(add_mlir_dialect_library name)
set_property(GLOBAL APPEND PROPERTY MLIR_DIALECT_LIBS ${name})
- add_llvm_library(${ARGV})
+ add_mlir_library(${ARGV})
endfunction(add_mlir_dialect_library)
# Declare the library associated with a conversion.
function(add_mlir_conversion_library name)
set_property(GLOBAL APPEND PROPERTY MLIR_CONVERSION_LIBS ${name})
- add_llvm_library(${ARGV})
+ add_mlir_library(${ARGV})
endfunction(add_mlir_conversion_library)
diff --git a/lib/Analysis/CMakeLists.txt b/lib/Analysis/CMakeLists.txt
index 5df7fce..77bae1d 100644
--- a/lib/Analysis/CMakeLists.txt
+++ b/lib/Analysis/CMakeLists.txt
@@ -12,7 +12,7 @@
Verifier.cpp
)
-add_llvm_library(MLIRAnalysis
+add_mlir_library(MLIRAnalysis
CallGraph.cpp
InferTypeOpInterface.cpp
Liveness.cpp
@@ -35,7 +35,7 @@
LLVMSupport
)
-add_llvm_library(MLIRLoopAnalysis
+add_mlir_library(MLIRLoopAnalysis
AffineAnalysis.cpp
AffineStructures.cpp
LoopAnalysis.cpp
diff --git a/lib/Dialect/CMakeLists.txt b/lib/Dialect/CMakeLists.txt
index d9d91b9..180ab07 100644
--- a/lib/Dialect/CMakeLists.txt
+++ b/lib/Dialect/CMakeLists.txt
@@ -12,12 +12,11 @@
add_subdirectory(StandardOps)
add_subdirectory(VectorOps)
-
set(LLVM_OPTIONAL_SOURCES
Traits.cpp
)
-add_llvm_library(MLIRDialect
+add_mlir_library(MLIRDialect
Traits.cpp
ADDITIONAL_HEADER_DIRS
diff --git a/lib/EDSC/CMakeLists.txt b/lib/EDSC/CMakeLists.txt
index 660efc5..0a4f275 100644
--- a/lib/EDSC/CMakeLists.txt
+++ b/lib/EDSC/CMakeLists.txt
@@ -3,7 +3,7 @@
CoreAPIs.cpp
)
-add_llvm_library(MLIREDSC
+add_mlir_library(MLIREDSC
Builders.cpp
ADDITIONAL_HEADER_DIRS
@@ -15,7 +15,7 @@
LLVMSupport
)
-add_llvm_library(MLIREDSCInterface
+add_mlir_library(MLIREDSCInterface
CoreAPIs.cpp
ADDITIONAL_HEADER_DIRS
diff --git a/lib/ExecutionEngine/CMakeLists.txt b/lib/ExecutionEngine/CMakeLists.txt
index c24917c..92673da 100644
--- a/lib/ExecutionEngine/CMakeLists.txt
+++ b/lib/ExecutionEngine/CMakeLists.txt
@@ -6,7 +6,7 @@
)
llvm_map_components_to_libnames(outlibs "nativecodegen" "IPO")
-add_llvm_library(MLIRExecutionEngine
+add_mlir_library(MLIRExecutionEngine
ExecutionEngine.cpp
OptUtils.cpp
diff --git a/lib/IR/CMakeLists.txt b/lib/IR/CMakeLists.txt
index 80a9e4f..61313c5 100644
--- a/lib/IR/CMakeLists.txt
+++ b/lib/IR/CMakeLists.txt
@@ -1,5 +1,5 @@
file(GLOB globbed *.c *.cpp)
-add_llvm_library(MLIRIR
+add_mlir_library(MLIRIR
${globbed}
ADDITIONAL_HEADER_DIRS
diff --git a/lib/Parser/CMakeLists.txt b/lib/Parser/CMakeLists.txt
index 978a674..14d64b3 100644
--- a/lib/Parser/CMakeLists.txt
+++ b/lib/Parser/CMakeLists.txt
@@ -1,4 +1,4 @@
-add_llvm_library(MLIRParser
+add_mlir_library(MLIRParser
Lexer.cpp
Parser.cpp
Token.cpp
diff --git a/lib/Pass/CMakeLists.txt b/lib/Pass/CMakeLists.txt
index 9df404c..df116bf 100644
--- a/lib/Pass/CMakeLists.txt
+++ b/lib/Pass/CMakeLists.txt
@@ -1,5 +1,5 @@
file(GLOB globbed *.c *.cpp)
-add_llvm_library(MLIRPass
+add_mlir_library(MLIRPass
${globbed}
ADDITIONAL_HEADER_DIRS
diff --git a/lib/Quantizer/CMakeLists.txt b/lib/Quantizer/CMakeLists.txt
index 5b52b2a..f646f6a 100644
--- a/lib/Quantizer/CMakeLists.txt
+++ b/lib/Quantizer/CMakeLists.txt
@@ -1,5 +1,5 @@
# Support.
-add_llvm_library(MLIRQuantizerSupport
+add_mlir_library(MLIRQuantizerSupport
Support/Configuration.cpp
Support/ConstraintAnalysisGraph.cpp
Support/Metadata.cpp
@@ -19,7 +19,7 @@
)
# Configurations.
-add_llvm_library(MLIRQuantizerFxpMathConfig
+add_mlir_library(MLIRQuantizerFxpMathConfig
Configurations/FxpMathConfig.cpp
ADDITIONAL_HEADER_DIRS
@@ -38,7 +38,7 @@
)
# Transforms.
-add_llvm_library(MLIRQuantizerTransforms
+add_mlir_library(MLIRQuantizerTransforms
Transforms/AddDefaultStatsTestPass.cpp
Transforms/InferQuantizedTypesPass.cpp
Transforms/RemoveInstrumentationPass.cpp
diff --git a/lib/Support/CMakeLists.txt b/lib/Support/CMakeLists.txt
index 140c2ce..ae68601 100644
--- a/lib/Support/CMakeLists.txt
+++ b/lib/Support/CMakeLists.txt
@@ -7,7 +7,7 @@
TranslateClParser.cpp
)
-add_llvm_library(MLIRSupport
+add_mlir_library(MLIRSupport
FileUtilities.cpp
StorageUniquer.cpp
ToolUtilities.cpp
@@ -20,7 +20,7 @@
${LLVM_PTHREAD_LIB}
)
-add_llvm_library(MLIROptLib
+add_mlir_library(MLIROptLib
MlirOptMain.cpp
ADDITIONAL_HEADER_DIRS
@@ -34,7 +34,7 @@
LLVMSupport
)
-add_llvm_library(MLIRTranslateClParser
+add_mlir_library(MLIRTranslateClParser
TranslateClParser.cpp
ADDITIONAL_HEADER_DIRS
diff --git a/lib/Target/CMakeLists.txt b/lib/Target/CMakeLists.txt
index 93f997f..f5cfa91 100644
--- a/lib/Target/CMakeLists.txt
+++ b/lib/Target/CMakeLists.txt
@@ -1,4 +1,4 @@
-add_llvm_library(MLIRTargetLLVMIRModuleTranslation
+add_mlir_library(MLIRTargetLLVMIRModuleTranslation
LLVMIR/DebugTranslation.cpp
LLVMIR/ModuleTranslation.cpp
@@ -19,7 +19,7 @@
MLIRTranslation
)
-add_llvm_library(MLIRTargetLLVMIR
+add_mlir_library(MLIRTargetLLVMIR
LLVMIR/ConvertFromLLVMIR.cpp
LLVMIR/ConvertToLLVMIR.cpp
@@ -36,7 +36,8 @@
LLVMIRReader
LLVMSupport
)
-add_llvm_library(MLIRTargetNVVMIR
+
+add_mlir_library(MLIRTargetNVVMIR
LLVMIR/ConvertToNVVMIR.cpp
ADDITIONAL_HEADER_DIRS
@@ -56,7 +57,7 @@
LLVMSupport
)
-add_llvm_library(MLIRTargetROCDLIR
+add_mlir_library(MLIRTargetROCDLIR
LLVMIR/ConvertToROCDLIR.cpp
ADDITIONAL_HEADER_DIRS
diff --git a/lib/Transforms/CMakeLists.txt b/lib/Transforms/CMakeLists.txt
index 980a357..8a1c53b 100644
--- a/lib/Transforms/CMakeLists.txt
+++ b/lib/Transforms/CMakeLists.txt
@@ -1,6 +1,6 @@
add_subdirectory(Utils)
-add_llvm_library(MLIRTransforms
+add_mlir_library(MLIRTransforms
AffineDataCopyGeneration.cpp
AffineLoopInvariantCodeMotion.cpp
Canonicalizer.cpp
diff --git a/lib/Transforms/Utils/CMakeLists.txt b/lib/Transforms/Utils/CMakeLists.txt
index de33511..f58f085 100644
--- a/lib/Transforms/Utils/CMakeLists.txt
+++ b/lib/Transforms/Utils/CMakeLists.txt
@@ -1,4 +1,4 @@
-add_llvm_library(MLIRTransformUtils
+add_mlir_library(MLIRTransformUtils
FoldUtils.cpp
GreedyPatternRewriteDriver.cpp
InliningUtils.cpp
diff --git a/lib/Translation/CMakeLists.txt b/lib/Translation/CMakeLists.txt
index b8e809f..feb94a2 100644
--- a/lib/Translation/CMakeLists.txt
+++ b/lib/Translation/CMakeLists.txt
@@ -1,4 +1,4 @@
-add_llvm_library(MLIRTranslation
+add_mlir_library(MLIRTranslation
Translation.cpp
ADDITIONAL_HEADER_DIRS
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index e3faaca..1fd8945 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -4,3 +4,4 @@
add_subdirectory(mlir-tblgen)
add_subdirectory(mlir-translate)
add_subdirectory(mlir-vulkan-runner)
+add_subdirectory(mlir-shlib)
diff --git a/tools/mlir-opt/CMakeLists.txt b/tools/mlir-opt/CMakeLists.txt
index 0eaed46..d419e10 100644
--- a/tools/mlir-opt/CMakeLists.txt
+++ b/tools/mlir-opt/CMakeLists.txt
@@ -4,6 +4,7 @@
set(LIB_LIBS
MLIRAnalysis
+ MLIRIR
MLIRLLVMIR
MLIROptLib
MLIRParser
diff --git a/tools/mlir-shlib/CMakeLists.txt b/tools/mlir-shlib/CMakeLists.txt
new file mode 100644
index 0000000..e9b2963
--- /dev/null
+++ b/tools/mlir-shlib/CMakeLists.txt
@@ -0,0 +1,42 @@
+# Building libmlir-cpp.so fails if LLVM_ENABLE_PIC=Off
+if (NOT LLVM_ENABLE_PIC)
+ return()
+endif()
+
+# Building libmlir-cpp.so may not work on MSVC
+if (MSVC)
+ return()
+endif()
+
+get_property(mlir_libs GLOBAL PROPERTY MLIR_ALL_LIBS)
+list(REMOVE_DUPLICATES mlir_libs)
+
+foreach (lib ${mlir_libs})
+ if(XCODE)
+ # Xcode doesn't support object libraries, so we have to trick it into
+ # linking the static libraries instead.
+ list(APPEND _DEPS "-force_load" ${lib})
+ else()
+ list(APPEND _OBJECTS $<TARGET_OBJECTS:obj.${lib}>)
+ endif()
+ list(APPEND _DEPS $<TARGET_PROPERTY:${lib},LINK_LIBRARIES>)
+endforeach ()
+
+if(MLIR_LINK_MLIR_DYLIB)
+ set(INSTALL_WITH_TOOLCHAIN INSTALL_WITH_TOOLCHAIN)
+endif()
+
+# libMLIR.so depends on LLVM components. To avoid multiple
+# copies of those LLVM components, libMLIR.so depends on libLLVM.so.
+# This probably won't work if some LLVM components are not included
+# in libLLVM.so.
+if(LLVM_BUILD_LLVM_DYLIB)
+ add_llvm_library(MLIR
+ SHARED
+ ${INSTALL_WITH_TOOLCHAIN}
+
+ mlir-shlib.cpp
+ )
+ target_link_libraries(MLIR PRIVATE LLVM ${LLVM_PTHREAD_LIB})
+ whole_archive_link(MLIR ${mlir_libs})
+endif()
diff --git a/tools/mlir-shlib/mlir-shlib.cpp b/tools/mlir-shlib/mlir-shlib.cpp
new file mode 100644
index 0000000..0093622
--- /dev/null
+++ b/tools/mlir-shlib/mlir-shlib.cpp
@@ -0,0 +1 @@
+// Intentionally empty source file to make CMake happy