Specify each lib only once; allow llvm build in shared libs mode. (#77)
* Specify each lib only once; allow llvm build in shared libs mode. * Remove debug code. * For library targets, retain dependency information using add_dependencies, but do not link using taget_link_libraries. * Do not set LD_PRELOAD by default. Co-authored-by: Gong Su <gongsu@us.ibm.com> Co-authored-by: Gheorghe-Teodor Bercea <gt.bercea@gmail.com>
This commit is contained in:
		
							parent
							
								
									fa8962753c
								
							
						
					
					
						commit
						d06dbfefdd
					
				
							
								
								
									
										125
									
								
								MLIR.cmake
								
								
								
								
							
							
						
						
									
										125
									
								
								MLIR.cmake
								
								
								
								
							|  | @ -44,14 +44,26 @@ set( | |||
| ) | ||||
| include_directories(${MLIR_INCLUDE_PATHS}) | ||||
| 
 | ||||
| # Force BUILD_SHARED_LIBS to be the same as LLVM build | ||||
| file(STRINGS ${LLVM_PROJ_BUILD}/CMakeCache.txt shared REGEX BUILD_SHARED_LIBS) | ||||
| string(REGEX REPLACE "BUILD_SHARED_LIBS:BOOL=" "" shared ${shared}) | ||||
| set(BUILD_SHARED_LIBS ${shared} CACHE BOOL "" FORCE) | ||||
| message(STATUS "BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}") | ||||
| 
 | ||||
| # Threading libraries required due to parallel pass execution. | ||||
| find_package(Threads REQUIRED) | ||||
| # libcurses and libz required by libLLVMSupport | ||||
| find_package(Curses REQUIRED) | ||||
| find_package(ZLIB REQUIRED) | ||||
| 
 | ||||
| function(find_mlir_lib lib) | ||||
|   find_library(${lib} | ||||
|           NAMES ${lib} | ||||
|           PATHS ${LLVM_PROJECT_LIB} | ||||
|           NO_DEFAULT_PATH) | ||||
|   if(${${lib}} STREQUAL ${lib}-NOTFOUND) | ||||
|     message(FATAL_ERROR "${lib} not found") | ||||
|   endif() | ||||
| endfunction(find_mlir_lib) | ||||
| 
 | ||||
| find_mlir_lib(MLIRAffine) | ||||
|  | @ -106,26 +118,15 @@ find_mlir_lib(LLVMProfileData) | |||
| find_mlir_lib(LLVMDemangle) | ||||
| find_mlir_lib(LLVMFrontendOpenMP) | ||||
| 
 | ||||
| 
 | ||||
| set(MLIRLibsOnce | ||||
|         ${LLVMAnalysis} | ||||
|         ${LLVMAsmParser} | ||||
|         ${LLVMBinaryFormat} | ||||
|         ${LLVMBitReader} | ||||
|         ${LLVMBitstreamReader} | ||||
|         ${LLVMBitWriter} | ||||
|         ${LLVMCore} | ||||
|         ${LLVMFrontendOpenMP} | ||||
|         ${LLVMIRReader} | ||||
|         ${LLVMMC} | ||||
|         ${LLVMMCParser} | ||||
|         ${LLVMMLIRTableGen}         | ||||
|         ${LLVMObject} | ||||
|         ${LLVMRemarks} | ||||
|         ${LLVMSupport} | ||||
|         ${LLVMTransformUtils} | ||||
|         ${LLVMProfileData} | ||||
|         ${LLVMDemangle} | ||||
| set(MLIRLibs | ||||
|         ${MLIRLLVMIR} | ||||
|         ${MLIROptLib} | ||||
|         ${MLIRParser} | ||||
|         ${MLIRPass} | ||||
|         ${MLIRTargetLLVMIR} | ||||
|         ${MLIRTargetLLVMIRModuleTranslation} | ||||
|         ${MLIRTransforms} | ||||
|         ${MLIRTransformUtils} | ||||
|         ${MLIRAffine} | ||||
|         ${MLIRAffineToStandard} | ||||
|         ${MLIRAnalysis} | ||||
|  | @ -135,7 +136,6 @@ set(MLIRLibsOnce | |||
|         ${MLIREDSC} | ||||
|         ${MLIRExecutionEngine} | ||||
|         ${MLIRIR} | ||||
|         ${MLIRLLVMIR} | ||||
|         ${MLIRLLVMIRTransforms}         | ||||
|         ${MLIRLoopToStandard} | ||||
|         ${MLIRLoopOps} | ||||
|  | @ -143,24 +143,39 @@ set(MLIRLibsOnce | |||
|         ${MLIRLoopLikeInterface} | ||||
|         ${MLIROpenMP} | ||||
|         ${MLIRMlirOptMain} | ||||
|         ${MLIROptLib} | ||||
|         ${MLIRParser} | ||||
|         ${MLIRPass} | ||||
|         ${MLIRSideEffects}         | ||||
|         ${MLIRStandardOps} | ||||
|         ${MLIRStandardToLLVM} | ||||
|         ${MLIRSupport} | ||||
|         ${MLIRTargetLLVMIR} | ||||
|         ${MLIRTargetLLVMIRModuleTranslation} | ||||
|         ${MLIRTransforms} | ||||
|         ${MLIRTransformUtils} | ||||
|         ${MLIRTranslation}) | ||||
| 
 | ||||
| set(MLIRLibs | ||||
|         ${MLIRLibsOnce} | ||||
|         ${MLIRLibsOnce} | ||||
|         Threads::Threads) | ||||
|         ${MLIRTranslation} | ||||
|         # strict order verified | ||||
|         ${LLVMBitWriter} | ||||
|         ${LLVMObject} | ||||
|         ${LLVMBitReader} | ||||
|         # strict order verified | ||||
|         ${LLVMFrontendOpenMP} | ||||
|         ${LLVMTransformUtils} | ||||
|         ${LLVMAnalysis} | ||||
|         # strict order verified | ||||
|         ${LLVMAsmParser} | ||||
|         ${LLVMCore} | ||||
|         # strict order not yet verified | ||||
|         ${LLVMRemarks} | ||||
|         ${LLVMMCParser} | ||||
|         ${LLVMMC} | ||||
|         ${LLVMProfileData} | ||||
|         ${LLVMBinaryFormat} | ||||
|         ${LLVMBitstreamReader} | ||||
|         ${LLVMIRReader} | ||||
|         ${LLVMMLIRTableGen} | ||||
|         ${LLVMSupport} | ||||
|         ${LLVMDemangle} | ||||
|         ${CMAKE_THREAD_LIBS_INIT} | ||||
| 	${CURSES_LIBRARIES} | ||||
| 	${ZLIB_LIBRARIES}) | ||||
| 
 | ||||
| # MLIR libraries that must be linked with --whole-archive for static build or | ||||
| # must be specified on LD_PRELOAD for shared build. | ||||
| set(MLIRWholeArchiveLibs | ||||
|         MLIRAffineToStandard | ||||
|         MLIRAffine | ||||
|  | @ -172,6 +187,20 @@ set(MLIRWholeArchiveLibs | |||
|         MLIRVector | ||||
|         MLIRLoopOps) | ||||
| 
 | ||||
| # ONNX MLIR libraries that must be linked with --whole-archive for static build or | ||||
| # must be specified on LD_PRELOAD for shared build. | ||||
| set(ONNXMLIRWholeArchiveLibs | ||||
|         OMKrnlToAffine | ||||
|         OMKrnlToLLVM | ||||
|         OMONNXToKrnl | ||||
|         OMONNXRewrite | ||||
|         OMShapeInference | ||||
|         OMShapeInferenceOpInterface | ||||
|         OMAttributePromotion | ||||
|         OMPromotableConstOperandsOpInterface) | ||||
| 
 | ||||
| # Function to construct linkage option for the static libraries that must be | ||||
| # linked with --whole-archive (or equivalent). | ||||
| function(whole_archive_link target lib_dir) | ||||
|   get_property(link_flags TARGET ${target} PROPERTY LINK_FLAGS) | ||||
|   if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") | ||||
|  | @ -194,15 +223,39 @@ function(whole_archive_link target lib_dir) | |||
|   set_target_properties(${target} PROPERTIES LINK_FLAGS ${link_flags}) | ||||
| endfunction(whole_archive_link) | ||||
| 
 | ||||
| # Function to construct LD_PRELOAD value for the shared libraries whose | ||||
| # static counterpart need --whole-archive linkage option. | ||||
| function(ld_preload_libs target lib_dir) | ||||
|   foreach(lib ${ARGN}) | ||||
|     if("${${lib}}" STREQUAL "") | ||||
|       set(ONNX_MLIR_LD_PRELOAD_${target} | ||||
| 	"${ONNX_MLIR_LD_PRELOAD_${target}}:${lib_dir}/lib${lib}.so" | ||||
| 	CACHE STRING "" FORCE) | ||||
|     else() | ||||
|       set(ONNX_MLIR_LD_PRELOAD_${target} | ||||
| 	"${ONNX_MLIR_LD_PRELOAD_${target}}:${${lib}}" | ||||
| 	CACHE STRING "" FORCE) | ||||
|     endif() | ||||
|   endforeach(lib) | ||||
| endfunction(ld_preload_libs) | ||||
| 
 | ||||
| function(whole_archive_link_mlir target) | ||||
|   whole_archive_link(${target} ${LLVM_PROJ_BUILD}/lib ${ARGN}) | ||||
|   if(BUILD_SHARED_LIBS) | ||||
|     ld_preload_libs(${target} ${LLVM_PROJ_BUILD}/lib ${ARGN}) | ||||
|   else() | ||||
|     whole_archive_link(${target} ${LLVM_PROJ_BUILD}/lib ${ARGN}) | ||||
|   endif() | ||||
| endfunction(whole_archive_link_mlir) | ||||
| 
 | ||||
| function(whole_archive_link_onnx_mlir target) | ||||
|   foreach(lib_target ${ARGN}) | ||||
|     add_dependencies(${target} ${lib_target}) | ||||
|   endforeach(lib_target) | ||||
|   whole_archive_link(${target} ${CMAKE_BINARY_DIR}/lib ${ARGN}) | ||||
|   if(BUILD_SHARED_LIBS) | ||||
|     ld_preload_libs(${target} ${CMAKE_BINARY_DIR}/lib ${ARGN}) | ||||
|   else() | ||||
|     whole_archive_link(${target} ${CMAKE_BINARY_DIR}/lib ${ARGN}) | ||||
|   endif() | ||||
| endfunction(whole_archive_link_onnx_mlir) | ||||
| 
 | ||||
| set(LLVM_CMAKE_DIR | ||||
|  |  | |||
|  | @ -8,14 +8,19 @@ target_include_directories(OMBuilder PRIVATE ${ONNX_MLIR_SRC_ROOT}) | |||
| target_include_directories(OMBuilder PRIVATE ${CMAKE_BINARY_DIR}) | ||||
| target_include_directories(OMBuilder PRIVATE ${ONNX_MLIR_BIN_ROOT}) | ||||
| 
 | ||||
| # This will cause onnx to be built. More importantly, some variable definitions | ||||
| # when building onnx such as -DONNX_ML=1 -DONNX_NAMESPACE=onnx will be carried over | ||||
| # when compiling FrontendDialectHelper.cpp, etc. | ||||
| target_link_libraries(OMBuilder | ||||
|         OMONNXOps | ||||
|         onnx | ||||
|         ${MLIRLibs} | ||||
|         curses | ||||
|         mpark_variant) | ||||
| target_include_directories(OMBuilder | ||||
|                            PUBLIC | ||||
|                            ${ONNX_MLIR_SRC_ROOT}/third_party/onnx | ||||
|                            ${ONNX_MLIR_SRC_ROOT}/third_party/variant | ||||
|                            ${ONNX_MLIR_SRC_ROOT}) | ||||
| # If you add onnx here, it will also cause onnx to be built. However, some | ||||
| # variable definitions when building onnx such as -DONNX_ML=1 -DONNX_NAMESPACE=onnx | ||||
| # will NOT be carried over when compiling FrontendDialectHelper.cpp, etc. so | ||||
| # the compilation will fail. | ||||
| add_dependencies(OMBuilder OMONNXOps) | ||||
|  |  | |||
|  | @ -10,24 +10,36 @@ add_executable(onnx-mlir | |||
|         MainUtils.hpp | ||||
|         MainUtils.cpp | ||||
|         main.cpp) | ||||
| 
 | ||||
| set(ONNX_MLIR_LD_PRELOAD_onnx-mlir "" CACHE STRING "" FORCE) | ||||
| whole_archive_link_mlir(onnx-mlir ${MLIRWholeArchiveLibs}) | ||||
| if(BUILD_SHARED_LIBS) | ||||
|   message(STATUS "To run dynamically linked onnx-mlir, you must specify:") | ||||
|   message(STATUS "LD_PRELOAD=${ONNX_MLIR_LD_PRELOAD_onnx-mlir}") | ||||
| endif() | ||||
| 
 | ||||
| # Libraries specified on the target_link_libraries for the add_subdirectory | ||||
| # targets get added to the end of the list here. This creates two problems: | ||||
| # 1. It produces duplicated libraries being specified for the link command. | ||||
| # 2. The libraries added at the end may depend on other libraries thus | ||||
| #    cause linkage errors due to undefined symbols. | ||||
| # So it's better not to use target_link_libraries for the add_subdirectory | ||||
| # targets, or only use it for libraries that have no further dependencies | ||||
| # (except system libraries such as libc). | ||||
| target_link_libraries(onnx-mlir | ||||
|         ${MLIRLibs} | ||||
|         OMBuilder | ||||
|         OMKrnlOps | ||||
|         OMONNXOps | ||||
|         OMShapeInference | ||||
|         OMShapeInferenceOpInterface | ||||
|         OMAttributePromotion | ||||
|         OMPromotableConstOperandsOpInterface | ||||
|         OMKrnlToAffine | ||||
|         OMKrnlToLLVM | ||||
|         OMShapeInference | ||||
|         OMONNXToKrnl | ||||
|         OMONNXRewrite | ||||
|         OMAttributePromotion | ||||
|         ${CMAKE_THREAD_LIBS_INIT} | ||||
|         ${MLIRLibs} | ||||
|         ${CMAKE_DL_LIBS}) | ||||
| whole_archive_link_mlir(onnx-mlir | ||||
|         ${MLIRWholeArchiveLibs}) | ||||
| 
 | ||||
| find_package(ZLIB REQUIRED) | ||||
| target_link_libraries(onnx-mlir ${ZLIB_LIBRARIES}) | ||||
| 
 | ||||
| target_include_directories(onnx-mlir PRIVATE ${ONNX_MLIR_SRC_ROOT}) | ||||
| target_include_directories(onnx-mlir PRIVATE ${CMAKE_BINARY_DIR}) | ||||
|  |  | |||
|  | @ -22,6 +22,7 @@ target_include_directories(OMONNXToKrnl | |||
|         ${ONNX_MLIR_SRC_ROOT} | ||||
|         ${ONNX_MLIR_BIN_ROOT} | ||||
|         ${ONNX_MLIR_SRC_ROOT}) | ||||
| target_link_libraries(OMONNXToKrnl | ||||
|         ${MLIRLibs} | ||||
| 
 | ||||
| # Linking dependencies: | ||||
| add_dependencies(OMONNXToKrnl | ||||
|         OMKrnlOps) | ||||
|  |  | |||
|  | @ -13,7 +13,8 @@ target_include_directories(OMONNXOps | |||
|         ${ONNX_MLIR_BIN_ROOT} | ||||
|         ${ONNX_MLIR_SRC_ROOT}) | ||||
| add_dependencies(OMONNXOps OMONNXOpsIncGen) | ||||
| target_link_libraries(OMONNXOps | ||||
| # Linking dependencies: | ||||
| add_dependencies(OMONNXOps | ||||
|         OMPromotableConstOperandsOpInterface | ||||
|         OMShapeInferenceOpInterface) | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,22 +4,17 @@ add_dependencies(onnx-mlir-opt OMKrnlOpsIncGen) | |||
| target_include_directories(onnx-mlir-opt PRIVATE ${ONNX_MLIR_SRC_ROOT}) | ||||
| target_include_directories(onnx-mlir-opt PRIVATE ${ONNX_MLIR_BIN_ROOT}) | ||||
| 
 | ||||
| set(ONNX_MLIR_LD_PRELOAD_onnx-mlir-opt "" CACHE STRING "" FORCE) | ||||
| whole_archive_link_onnx_mlir(onnx-mlir-opt ${ONNXMLIRWholeArchiveLibs}) | ||||
| whole_archive_link_mlir(onnx-mlir-opt ${MLIRWholeArchiveLibs}) | ||||
| if(BUILD_SHARED_LIBS) | ||||
|   message(STATUS "To run dynamically linked onnx-mlir-opt, you must specify:") | ||||
|   message(STATUS "LD_PRELOAD=${ONNX_MLIR_LD_PRELOAD_onnx-mlir-opt}") | ||||
| endif() | ||||
| 
 | ||||
| target_link_libraries(onnx-mlir-opt | ||||
|         ${MLIRLibs} | ||||
|         OMBuilder | ||||
|         OMKrnlOps | ||||
|         OMKrnlToAffine | ||||
|         OMKrnlToLLVM | ||||
|         OMShapeInference | ||||
|         OMONNXToKrnl | ||||
|         OMPromotableConstOperandsOpInterface | ||||
|         curses) | ||||
| whole_archive_link_mlir(onnx-mlir-opt | ||||
|         ${MLIRWholeArchiveLibs}) | ||||
| whole_archive_link_onnx_mlir(onnx-mlir-opt | ||||
|         OMKrnlToAffine | ||||
|         OMKrnlToLLVM | ||||
|         OMONNXToKrnl | ||||
|         OMONNXOps | ||||
|         OMONNXRewrite | ||||
|         OMShapeInference | ||||
|         OMAttributePromotion) | ||||
|         ${MLIRLibs}) | ||||
|  |  | |||
|  | @ -5,8 +5,9 @@ target_include_directories(OMKrnlToAffine | |||
|         ${ONNX_MLIR_SRC_ROOT} | ||||
|         ${ONNX_MLIR_BIN_ROOT} | ||||
|         ${ONNX_MLIR_SRC_ROOT}) | ||||
| target_link_libraries(OMKrnlToAffine | ||||
|         ${MLIRLibs} | ||||
| 
 | ||||
| # Linking dependencies: | ||||
| add_dependencies(OMKrnlToAffine | ||||
|         OMKrnlOps | ||||
|         OMONNXOps) | ||||
| 
 | ||||
|  | @ -17,9 +18,10 @@ target_include_directories(OMKrnlToLLVM | |||
|         ${ONNX_MLIR_SRC_ROOT} | ||||
|         ${ONNX_MLIR_BIN_ROOT} | ||||
|         ${ONNX_MLIR_SRC_ROOT}) | ||||
| target_link_libraries(OMKrnlToLLVM | ||||
|         ${MLIRLibs} | ||||
| 
 | ||||
| #Linking dependencies: | ||||
| add_dependencies(OMKrnlToLLVM | ||||
|         OMKrnlOps | ||||
|         OMONNXOps) | ||||
| 
 | ||||
| add_subdirectory(ONNX) | ||||
| add_subdirectory(ONNX) | ||||
|  |  | |||
|  | @ -3,7 +3,9 @@ add_library(OMAttributePromotion | |||
| target_include_directories(OMAttributePromotion | ||||
|         PRIVATE ${ONNX_MLIR_SRC_ROOT} ${ONNX_MLIR_BIN_ROOT} | ||||
|         ${ONNF_MLIR_SRC_ROOT}) | ||||
| target_link_libraries(OMAttributePromotion | ||||
| 
 | ||||
| # Linking dependencies: | ||||
| add_dependencies(OMAttributePromotion | ||||
|         OMPromotableConstOperandsOpInterface) | ||||
| 
 | ||||
| set(LLVM_TARGET_DEFINITIONS ONNXRewrite.td) | ||||
|  | @ -25,18 +27,19 @@ add_library(OMONNXRewrite | |||
| target_include_directories(OMONNXRewrite | ||||
|         PRIVATE ${ONNX_MLIR_SRC_ROOT} ${ONNX_MLIR_BIN_ROOT} | ||||
|         ${ONNF_MLIR_SRC_ROOT}) | ||||
| target_link_libraries(OMONNXRewrite | ||||
|         OMONNXOps) | ||||
| add_dependencies(OMONNXRewrite | ||||
|         OMONNXRewriteIncGen | ||||
|         OMONNXDecomposeIncGen | ||||
|         OMONNXCombineIncGen) | ||||
| # Linking dependencies: | ||||
| add_dependencies(OMONNXRewrite | ||||
|         OMONNXOps) | ||||
| 
 | ||||
| add_library(OMShapeInference ShapeInferencePass.cpp) | ||||
| target_include_directories(OMShapeInference | ||||
|         PRIVATE ${ONNX_MLIR_SRC_ROOT} ${ONNX_MLIR_BIN_ROOT} | ||||
|         ${ONNX_MLIR_SRC_ROOT}) | ||||
| target_link_libraries(OMShapeInference | ||||
|         ${MLIRLibs} | ||||
| add_dependencies(OMShapeInference ShapeInferenceOpInterfaceIncGen) | ||||
| # Linking dependencies: | ||||
| add_dependencies(OMShapeInference | ||||
|         OMShapeInferenceOpInterface) | ||||
| add_dependencies(OMShapeInference ShapeInferenceOpInterfaceIncGen) | ||||
|  | @ -1,6 +1,9 @@ | |||
| 
 | ||||
| import lit.llvm | ||||
| 
 | ||||
| if '@BUILD_SHARED_LIBS@' == 'ON': | ||||
|     config.environment['LD_PRELOAD'] = "@ONNX_MLIR_LD_PRELOAD_onnx-mlir-opt@" | ||||
| 
 | ||||
| config.llvm_tools_dir = "@MLIR_TOOLS_DIR@" | ||||
| config.mlir_obj_root = "@LLVM_PROJ_BUILD@" | ||||
| config.mlir_tools_dir = "@MLIR_TOOLS_DIR@" | ||||
|  | @ -13,4 +16,4 @@ config.onnx_mlir_test_build_dir = "@ONNX_MLIR_LIT_TEST_BUILD_DIR@" | |||
| lit.llvm.initialize(lit_config, config) | ||||
| 
 | ||||
| # Let the main config do the real work. | ||||
| lit_config.load_config(config, "@ONNX_MLIR_LIT_TEST_SRC_DIR@/lit.cfg.py") | ||||
| lit_config.load_config(config, "@ONNX_MLIR_LIT_TEST_SRC_DIR@/lit.cfg.py") | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue