[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.

Previous version of this patch broke depencies on TableGen
targets.  This appears to be because it compiled all
libraries to OBJECT libraries (probably because cmake
is generating different target names).  Avoiding object
libraries results in correct dependencies.

(updated by Stephen Neuendorffer)

Differential Revision: https://reviews.llvm.org/D73130
This commit is contained in:
Valentin Churavy 2020-02-08 19:27:54 -08:00 committed by Stephen Neuendorffer
parent 4594d0e943
commit 7c64f6bf52
19 changed files with 90 additions and 29 deletions

View File

@ -34,9 +34,11 @@ include_directories( ${MLIR_INCLUDE_DIR})
add_subdirectory(include/mlir) add_subdirectory(include/mlir)
add_subdirectory(lib) add_subdirectory(lib)
add_subdirectory(tools)
add_subdirectory(unittests) add_subdirectory(unittests)
add_subdirectory(test) 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 ) if( LLVM_INCLUDE_EXAMPLES )
add_subdirectory(examples) add_subdirectory(examples)

View File

@ -49,14 +49,20 @@ function(add_mlir_dialect dialect dialect_doc_filename)
add_dependencies(mlir-doc ${dialect_doc_filename}DocGen) add_dependencies(mlir-doc ${dialect_doc_filename}DocGen)
endfunction() endfunction()
# Declare a library which can be compiled in libMLIR.so
macro(add_mlir_library name)
set_property(GLOBAL APPEND PROPERTY MLIR_ALL_LIBS ${name})
add_llvm_library(${ARGV})
endmacro(add_mlir_library)
# Declare the library associated with a dialect. # Declare the library associated with a dialect.
function(add_mlir_dialect_library name) function(add_mlir_dialect_library name)
set_property(GLOBAL APPEND PROPERTY MLIR_DIALECT_LIBS ${name}) set_property(GLOBAL APPEND PROPERTY MLIR_DIALECT_LIBS ${name})
add_llvm_library(${ARGV}) add_mlir_library(${ARGV})
endfunction(add_mlir_dialect_library) endfunction(add_mlir_dialect_library)
# Declare the library associated with a conversion. # Declare the library associated with a conversion.
function(add_mlir_conversion_library name) function(add_mlir_conversion_library name)
set_property(GLOBAL APPEND PROPERTY MLIR_CONVERSION_LIBS ${name}) set_property(GLOBAL APPEND PROPERTY MLIR_CONVERSION_LIBS ${name})
add_llvm_library(${ARGV}) add_mlir_library(${ARGV})
endfunction(add_mlir_conversion_library) endfunction(add_mlir_conversion_library)

View File

@ -13,7 +13,7 @@ set(LLVM_OPTIONAL_SOURCES
Verifier.cpp Verifier.cpp
) )
add_llvm_library(MLIRAnalysis add_mlir_library(MLIRAnalysis
CallGraph.cpp CallGraph.cpp
ControlFlowInterfaces.cpp ControlFlowInterfaces.cpp
InferTypeOpInterface.cpp InferTypeOpInterface.cpp
@ -37,7 +37,7 @@ target_link_libraries(MLIRAnalysis
MLIRLoopOps MLIRLoopOps
) )
add_llvm_library(MLIRLoopAnalysis add_mlir_library(MLIRLoopAnalysis
AffineAnalysis.cpp AffineAnalysis.cpp
AffineStructures.cpp AffineStructures.cpp
LoopAnalysis.cpp LoopAnalysis.cpp

View File

@ -12,12 +12,11 @@ add_subdirectory(SPIRV)
add_subdirectory(StandardOps) add_subdirectory(StandardOps)
add_subdirectory(VectorOps) add_subdirectory(VectorOps)
set(LLVM_OPTIONAL_SOURCES set(LLVM_OPTIONAL_SOURCES
Traits.cpp Traits.cpp
) )
add_llvm_library(MLIRDialect add_mlir_library(MLIRDialect
Traits.cpp Traits.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS

View File

@ -3,7 +3,7 @@ set(LLVM_OPTIONAL_SOURCES
CoreAPIs.cpp CoreAPIs.cpp
) )
add_llvm_library(MLIREDSC add_mlir_library(MLIREDSC
Builders.cpp Builders.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS
@ -16,7 +16,7 @@ target_link_libraries(MLIREDSC
MLIRSupport MLIRSupport
) )
add_llvm_library(MLIREDSCInterface add_mlir_library(MLIREDSCInterface
CoreAPIs.cpp CoreAPIs.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS

View File

@ -6,7 +6,7 @@ set(LLVM_OPTIONAL_SOURCES
) )
llvm_map_components_to_libnames(outlibs "nativecodegen" "IPO") llvm_map_components_to_libnames(outlibs "nativecodegen" "IPO")
add_llvm_library(MLIRExecutionEngine add_mlir_library(MLIRExecutionEngine
ExecutionEngine.cpp ExecutionEngine.cpp
OptUtils.cpp OptUtils.cpp

View File

@ -1,5 +1,5 @@
file(GLOB globbed *.c *.cpp) file(GLOB globbed *.c *.cpp)
add_llvm_library(MLIRIR add_mlir_library(MLIRIR
${globbed} ${globbed}
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS

View File

@ -1,4 +1,4 @@
add_llvm_library(MLIRParser add_mlir_library(MLIRParser
Lexer.cpp Lexer.cpp
Parser.cpp Parser.cpp
Token.cpp Token.cpp

View File

@ -1,5 +1,5 @@
file(GLOB globbed *.c *.cpp) file(GLOB globbed *.c *.cpp)
add_llvm_library(MLIRPass add_mlir_library(MLIRPass
${globbed} ${globbed}
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS

View File

@ -1,5 +1,5 @@
# Support. # Support.
add_llvm_library(MLIRQuantizerSupport add_mlir_library(MLIRQuantizerSupport
Support/Configuration.cpp Support/Configuration.cpp
Support/ConstraintAnalysisGraph.cpp Support/ConstraintAnalysisGraph.cpp
Support/Metadata.cpp Support/Metadata.cpp
@ -21,7 +21,7 @@ target_link_libraries(MLIRQuantizerSupport
) )
# Configurations. # Configurations.
add_llvm_library(MLIRQuantizerFxpMathConfig add_mlir_library(MLIRQuantizerFxpMathConfig
Configurations/FxpMathConfig.cpp Configurations/FxpMathConfig.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS
@ -42,7 +42,7 @@ target_link_libraries(MLIRQuantizerFxpMathConfig
) )
# Transforms. # Transforms.
add_llvm_library(MLIRQuantizerTransforms add_mlir_library(MLIRQuantizerTransforms
Transforms/AddDefaultStatsTestPass.cpp Transforms/AddDefaultStatsTestPass.cpp
Transforms/InferQuantizedTypesPass.cpp Transforms/InferQuantizedTypesPass.cpp
Transforms/RemoveInstrumentationPass.cpp Transforms/RemoveInstrumentationPass.cpp

View File

@ -7,7 +7,7 @@ set(LLVM_OPTIONAL_SOURCES
TranslateClParser.cpp TranslateClParser.cpp
) )
add_llvm_library(MLIRSupport add_mlir_library(MLIRSupport
FileUtilities.cpp FileUtilities.cpp
StorageUniquer.cpp StorageUniquer.cpp
ToolUtilities.cpp ToolUtilities.cpp
@ -20,7 +20,7 @@ target_link_libraries(MLIRSupport
LLVMSupport LLVMSupport
${LLVM_PTHREAD_LIB}) ${LLVM_PTHREAD_LIB})
add_llvm_library(MLIROptLib add_mlir_library(MLIROptLib
MlirOptMain.cpp MlirOptMain.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS
@ -34,7 +34,7 @@ target_link_libraries(MLIROptLib
MLIRSupport MLIRSupport
) )
add_llvm_library(MLIRTranslateClParser add_mlir_library(MLIRTranslateClParser
TranslateClParser.cpp TranslateClParser.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS

View File

@ -1,4 +1,4 @@
add_llvm_library(MLIRTargetLLVMIRModuleTranslation add_mlir_library(MLIRTargetLLVMIRModuleTranslation
LLVMIR/DebugTranslation.cpp LLVMIR/DebugTranslation.cpp
LLVMIR/ModuleTranslation.cpp LLVMIR/ModuleTranslation.cpp
@ -9,9 +9,15 @@ add_llvm_library(MLIRTargetLLVMIRModuleTranslation
) )
target_link_libraries(MLIRTargetLLVMIRModuleTranslation target_link_libraries(MLIRTargetLLVMIRModuleTranslation
PUBLIC PUBLIC
MLIRLLVMIR LLVMCore LLVMIRReader LLVMSupport LLVMTransformUtils MLIRLLVMIR
MLIRTranslation) LLVMCore
add_llvm_library(MLIRTargetLLVMIR LLVMIRReader
LLVMSupport
LLVMTransformUtils
MLIRTranslation
)
add_mlir_library(MLIRTargetLLVMIR
LLVMIR/ConvertFromLLVMIR.cpp LLVMIR/ConvertFromLLVMIR.cpp
LLVMIR/ConvertToLLVMIR.cpp LLVMIR/ConvertToLLVMIR.cpp
@ -20,8 +26,10 @@ add_llvm_library(MLIRTargetLLVMIR
) )
target_link_libraries(MLIRTargetLLVMIR target_link_libraries(MLIRTargetLLVMIR
PUBLIC PUBLIC
MLIRTargetLLVMIRModuleTranslation) MLIRTargetLLVMIRModuleTranslation
add_llvm_library(MLIRTargetNVVMIR )
add_mlir_library(MLIRTargetNVVMIR
LLVMIR/ConvertToNVVMIR.cpp LLVMIR/ConvertToNVVMIR.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS
@ -37,7 +45,8 @@ target_link_libraries(MLIRTargetNVVMIR
MLIRNVVMIR MLIRNVVMIR
MLIRTargetLLVMIRModuleTranslation MLIRTargetLLVMIRModuleTranslation
) )
add_llvm_library(MLIRTargetROCDLIR
add_mlir_library(MLIRTargetROCDLIR
LLVMIR/ConvertToROCDLIR.cpp LLVMIR/ConvertToROCDLIR.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS

View File

@ -1,6 +1,6 @@
add_subdirectory(Utils) add_subdirectory(Utils)
add_llvm_library(MLIRTransforms add_mlir_library(MLIRTransforms
AffineDataCopyGeneration.cpp AffineDataCopyGeneration.cpp
AffineLoopInvariantCodeMotion.cpp AffineLoopInvariantCodeMotion.cpp
Canonicalizer.cpp Canonicalizer.cpp

View File

@ -1,4 +1,4 @@
add_llvm_library(MLIRTransformUtils add_mlir_library(MLIRTransformUtils
FoldUtils.cpp FoldUtils.cpp
GreedyPatternRewriteDriver.cpp GreedyPatternRewriteDriver.cpp
InliningUtils.cpp InliningUtils.cpp

View File

@ -1,4 +1,4 @@
add_llvm_library(MLIRTranslation add_mlir_library(MLIRTranslation
Translation.cpp Translation.cpp
ADDITIONAL_HEADER_DIRS ADDITIONAL_HEADER_DIRS

View File

@ -4,3 +4,4 @@ add_subdirectory(mlir-opt)
add_subdirectory(mlir-tblgen) add_subdirectory(mlir-tblgen)
add_subdirectory(mlir-translate) add_subdirectory(mlir-translate)
add_subdirectory(mlir-vulkan-runner) add_subdirectory(mlir-vulkan-runner)
add_subdirectory(mlir-shlib)

View File

@ -4,6 +4,7 @@ set(LLVM_OPTIONAL_SOURCES
set(LIB_LIBS set(LIB_LIBS
MLIRAnalysis MLIRAnalysis
MLIRIR
MLIRLLVMIR MLIRLLVMIR
MLIROptLib MLIROptLib
MLIRParser MLIRParser

View File

@ -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()

View File

@ -0,0 +1 @@
// Intentionally empty source file to make CMake happy