diff --git a/mlir/include/mlir/ExecutionEngine/RunnerUtils.h b/mlir/include/mlir/ExecutionEngine/RunnerUtils.h --- a/mlir/include/mlir/ExecutionEngine/RunnerUtils.h +++ b/mlir/include/mlir/ExecutionEngine/RunnerUtils.h @@ -16,21 +16,6 @@ #ifndef MLIR_EXECUTIONENGINE_RUNNERUTILS_H #define MLIR_EXECUTIONENGINE_RUNNERUTILS_H -#ifdef _WIN32 -#ifndef MLIR_RUNNERUTILS_EXPORT -#ifdef mlir_runner_utils_EXPORTS -// We are building this library -#define MLIR_RUNNERUTILS_EXPORT __declspec(dllexport) -#else -// We are using this library -#define MLIR_RUNNERUTILS_EXPORT __declspec(dllimport) -#endif // mlir_runner_utils_EXPORTS -#endif // MLIR_RUNNERUTILS_EXPORT -#else -// Non-windows: use visibility attributes. -#define MLIR_RUNNERUTILS_EXPORT __attribute__((visibility("default"))) -#endif // _WIN32 - #include #include #include @@ -349,113 +334,93 @@ //////////////////////////////////////////////////////////////////////////////// // Currently exposed C API. //////////////////////////////////////////////////////////////////////////////// -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemrefShapeI8(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemrefShapeI8(UnrankedMemRefType *m); +extern "C" void _mlir_ciface_printMemrefShapeI32(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemrefShapeI64(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemrefShapeF32(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemrefShapeF64(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemrefShapeF32(UnrankedMemRefType *m); +extern "C" void _mlir_ciface_printMemrefShapeF64(UnrankedMemRefType *m); +extern "C" void _mlir_ciface_printMemrefShapeInd(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemrefShapeC32(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemrefShapeC64(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemrefI8(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemrefI32(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemrefI64(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemrefF32(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemrefF64(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemrefI8(UnrankedMemRefType *m); +extern "C" void _mlir_ciface_printMemrefI32(UnrankedMemRefType *m); +extern "C" void _mlir_ciface_printMemrefI64(UnrankedMemRefType *m); +extern "C" void _mlir_ciface_printMemrefF32(UnrankedMemRefType *m); +extern "C" void _mlir_ciface_printMemrefF64(UnrankedMemRefType *m); +extern "C" void _mlir_ciface_printMemrefInd(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemrefC32(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemrefC64(UnrankedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t _mlir_ciface_nanoTime(); - -extern "C" MLIR_RUNNERUTILS_EXPORT void printMemrefI32(int64_t rank, void *ptr); -extern "C" MLIR_RUNNERUTILS_EXPORT void printMemrefI64(int64_t rank, void *ptr); -extern "C" MLIR_RUNNERUTILS_EXPORT void printMemrefF32(int64_t rank, void *ptr); -extern "C" MLIR_RUNNERUTILS_EXPORT void printMemrefF64(int64_t rank, void *ptr); -extern "C" MLIR_RUNNERUTILS_EXPORT void printMemrefInd(int64_t rank, void *ptr); -extern "C" MLIR_RUNNERUTILS_EXPORT void printMemrefC32(int64_t rank, void *ptr); -extern "C" MLIR_RUNNERUTILS_EXPORT void printMemrefC64(int64_t rank, void *ptr); -extern "C" MLIR_RUNNERUTILS_EXPORT void printCString(char *str); - -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref0dF32(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref1dF32(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref2dF32(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref3dF32(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref4dF32(StridedMemRefType *m); - -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref1dI8(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref1dI32(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref1dI64(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void -_mlir_ciface_printMemref1dF64(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" int64_t _mlir_ciface_nanoTime(); + +extern "C" void printMemrefI32(int64_t rank, void *ptr); +extern "C" void printMemrefI64(int64_t rank, void *ptr); +extern "C" void printMemrefF32(int64_t rank, void *ptr); +extern "C" void printMemrefF64(int64_t rank, void *ptr); +extern "C" void printMemrefInd(int64_t rank, void *ptr); +extern "C" void printMemrefC32(int64_t rank, void *ptr); +extern "C" void printMemrefC64(int64_t rank, void *ptr); +extern "C" void printCString(char *str); + +extern "C" void _mlir_ciface_printMemref0dF32(StridedMemRefType *m); +extern "C" void _mlir_ciface_printMemref1dF32(StridedMemRefType *m); +extern "C" void _mlir_ciface_printMemref2dF32(StridedMemRefType *m); +extern "C" void _mlir_ciface_printMemref3dF32(StridedMemRefType *m); +extern "C" void _mlir_ciface_printMemref4dF32(StridedMemRefType *m); + +extern "C" void _mlir_ciface_printMemref1dI8(StridedMemRefType *m); +extern "C" void _mlir_ciface_printMemref1dI32(StridedMemRefType *m); +extern "C" void _mlir_ciface_printMemref1dI64(StridedMemRefType *m); +extern "C" void _mlir_ciface_printMemref1dF64(StridedMemRefType *m); +extern "C" void _mlir_ciface_printMemref1dInd(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemref1dC32(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void +extern "C" void _mlir_ciface_printMemref1dC64(StridedMemRefType *m); -extern "C" MLIR_RUNNERUTILS_EXPORT void _mlir_ciface_printMemrefVector4x4xf32( +extern "C" void _mlir_ciface_printMemrefVector4x4xf32( StridedMemRefType, 2> *m); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t _mlir_ciface_verifyMemRefI32( - UnrankedMemRefType *actual, UnrankedMemRefType *expected); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t _mlir_ciface_verifyMemRefF32( - UnrankedMemRefType *actual, UnrankedMemRefType *expected); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t _mlir_ciface_verifyMemRefF64( - UnrankedMemRefType *actual, UnrankedMemRefType *expected); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t +extern "C" int64_t +_mlir_ciface_verifyMemRefI32(UnrankedMemRefType *actual, + UnrankedMemRefType *expected); +extern "C" int64_t +_mlir_ciface_verifyMemRefF32(UnrankedMemRefType *actual, + UnrankedMemRefType *expected); +extern "C" int64_t +_mlir_ciface_verifyMemRefF64(UnrankedMemRefType *actual, + UnrankedMemRefType *expected); +extern "C" int64_t _mlir_ciface_verifyMemRefInd(UnrankedMemRefType *actual, UnrankedMemRefType *expected); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t +extern "C" int64_t _mlir_ciface_verifyMemRefC32(UnrankedMemRefType *actual, UnrankedMemRefType *expected); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t +extern "C" int64_t _mlir_ciface_verifyMemRefC64(UnrankedMemRefType *actual, UnrankedMemRefType *expected); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t verifyMemRefI32(int64_t rank, - void *actualPtr, - void *expectedPtr); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t verifyMemRefF32(int64_t rank, - void *actualPtr, - void *expectedPtr); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t verifyMemRefF64(int64_t rank, - void *actualPtr, - void *expectedPtr); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t verifyMemRefInd(int64_t rank, - void *actualPtr, - void *expectedPtr); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t verifyMemRefC32(int64_t rank, - void *actualPtr, - void *expectedPtr); -extern "C" MLIR_RUNNERUTILS_EXPORT int64_t verifyMemRefC64(int64_t rank, - void *actualPtr, - void *expectedPtr); +extern "C" int64_t verifyMemRefI32(int64_t rank, void *actualPtr, + void *expectedPtr); +extern "C" int64_t verifyMemRefF32(int64_t rank, void *actualPtr, + void *expectedPtr); +extern "C" int64_t verifyMemRefF64(int64_t rank, void *actualPtr, + void *expectedPtr); +extern "C" int64_t verifyMemRefInd(int64_t rank, void *actualPtr, + void *expectedPtr); +extern "C" int64_t verifyMemRefC32(int64_t rank, void *actualPtr, + void *expectedPtr); +extern "C" int64_t verifyMemRefC64(int64_t rank, void *actualPtr, + void *expectedPtr); #endif // MLIR_EXECUTIONENGINE_RUNNERUTILS_H diff --git a/mlir/lib/ExecutionEngine/CMakeLists.txt b/mlir/lib/ExecutionEngine/CMakeLists.txt --- a/mlir/lib/ExecutionEngine/CMakeLists.txt +++ b/mlir/lib/ExecutionEngine/CMakeLists.txt @@ -156,7 +156,14 @@ EXCLUDE_FROM_LIBMLIR ) + set_property(TARGET mlir_runner_utils PROPERTY CXX_VISIBILITY_PRESET hidden) target_compile_definitions(mlir_runner_utils PRIVATE mlir_runner_utils_EXPORTS) + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + # Don't export symbols from link-time dependencies, these are internal + # implementation details. + # FIXME: Add a similar fix for Windows. + target_link_options(mlir_runner_utils PRIVATE "-Wl,-exclude-libs,ALL") + endif() add_mlir_library(mlir_async_runtime SHARED diff --git a/mlir/lib/ExecutionEngine/RunnerUtils.cpp b/mlir/lib/ExecutionEngine/RunnerUtils.cpp --- a/mlir/lib/ExecutionEngine/RunnerUtils.cpp +++ b/mlir/lib/ExecutionEngine/RunnerUtils.cpp @@ -14,6 +14,7 @@ //===----------------------------------------------------------------------===// #include "mlir/ExecutionEngine/RunnerUtils.h" +#include "llvm/ADT/StringMap.h" #include // NOLINTBEGIN(*-identifier-naming) @@ -287,4 +288,93 @@ return _mlir_ciface_verifyMemRefC64(&actualDesc, &expectedDesc); } +//===----------------------------------------------------------------------===// +// MLIR ExecutionEngine dynamic library integration. +//===----------------------------------------------------------------------===// + +// Export symbols for the MLIR ExecutionEngine integration. All other symbols +// are hidden. +#ifdef _WIN32 +#define MLIR_RUNNERUTILS_EXPORT __declspec(dllexport) +#else +#define MLIR_RUNNERUTILS_EXPORT __attribute__((visibility("default"))) +#endif + +// Visual Studio had a bug that fails to compile nested generic lambdas +// inside an `extern "C"` function. +// https://developercommunity.visualstudio.com/content/problem/475494/clexe-error-with-lambda-inside-function-templates.html +// The bug is fixed in VS2019 16.1. Separating the declaration and definition is +// a work around for older versions of Visual Studio. +extern "C" MLIR_RUNNERUTILS_EXPORT void +__mlir_execution_engine_init(llvm::StringMap &exportSymbols); + +void __mlir_execution_engine_init(llvm::StringMap &exportSymbols) { + auto exportSymbol = [&](llvm::StringRef name, auto ptr) { + assert(exportSymbols.count(name) == 0 && "symbol already exists"); + exportSymbols[name] = reinterpret_cast(ptr); + }; + + exportSymbol("_mlir_ciface_printMemrefShapeI8", + &_mlir_ciface_printMemrefShapeI8); + exportSymbol("_mlir_ciface_printMemrefShapeI32", + &_mlir_ciface_printMemrefShapeI32); + exportSymbol("_mlir_ciface_printMemrefShapeI64", + &_mlir_ciface_printMemrefShapeI64); + exportSymbol("_mlir_ciface_printMemrefShapeF32", + &_mlir_ciface_printMemrefShapeF32); + exportSymbol("_mlir_ciface_printMemrefShapeF64", + &_mlir_ciface_printMemrefShapeF64); + exportSymbol("_mlir_ciface_printMemrefShapeInd", + &_mlir_ciface_printMemrefShapeInd); + exportSymbol("_mlir_ciface_printMemrefShapeC32", + &_mlir_ciface_printMemrefShapeC32); + exportSymbol("_mlir_ciface_printMemrefShapeC64", + &_mlir_ciface_printMemrefShapeC64); + exportSymbol("_mlir_ciface_printMemrefI8", &_mlir_ciface_printMemrefI8); + exportSymbol("_mlir_ciface_printMemrefI32", &_mlir_ciface_printMemrefI32); + exportSymbol("_mlir_ciface_printMemrefI64", &_mlir_ciface_printMemrefI64); + exportSymbol("_mlir_ciface_printMemrefF32", &_mlir_ciface_printMemrefF32); + exportSymbol("_mlir_ciface_printMemrefF64", &_mlir_ciface_printMemrefF64); + exportSymbol("_mlir_ciface_printMemrefInd", &_mlir_ciface_printMemrefInd); + exportSymbol("_mlir_ciface_printMemrefC32", &_mlir_ciface_printMemrefC32); + exportSymbol("_mlir_ciface_printMemrefC64", &_mlir_ciface_printMemrefC64); + exportSymbol("_mlir_ciface_nanoTime", &_mlir_ciface_nanoTime); + exportSymbol("printMemrefI32", &printMemrefI32); + exportSymbol("printMemrefI64", &printMemrefI64); + exportSymbol("printMemrefF32", &printMemrefF32); + exportSymbol("printMemrefF64", &printMemrefF64); + exportSymbol("printMemrefInd", &printMemrefInd); + exportSymbol("printMemrefC32", &printMemrefC32); + exportSymbol("printMemrefC64", &printMemrefC64); + exportSymbol("printCString", &printCString); + exportSymbol("_mlir_ciface_printMemref0dF32", &_mlir_ciface_printMemref0dF32); + exportSymbol("_mlir_ciface_printMemref1dF32", &_mlir_ciface_printMemref1dF32); + exportSymbol("_mlir_ciface_printMemref2dF32", &_mlir_ciface_printMemref2dF32); + exportSymbol("_mlir_ciface_printMemref3dF32", &_mlir_ciface_printMemref3dF32); + exportSymbol("_mlir_ciface_printMemref4dF32", &_mlir_ciface_printMemref4dF32); + exportSymbol("_mlir_ciface_printMemref1dI8", &_mlir_ciface_printMemref1dI8); + exportSymbol("_mlir_ciface_printMemref1dI32", &_mlir_ciface_printMemref1dI32); + exportSymbol("_mlir_ciface_printMemref1dI64", &_mlir_ciface_printMemref1dI64); + exportSymbol("_mlir_ciface_printMemref1dF64", &_mlir_ciface_printMemref1dF64); + exportSymbol("_mlir_ciface_printMemref1dInd", &_mlir_ciface_printMemref1dInd); + exportSymbol("_mlir_ciface_printMemref1dC32", &_mlir_ciface_printMemref1dC32); + exportSymbol("_mlir_ciface_printMemref1dC64", &_mlir_ciface_printMemref1dC64); + exportSymbol("_mlir_ciface_printMemrefVector4x4xf32", + &_mlir_ciface_printMemrefVector4x4xf32); + exportSymbol("_mlir_ciface_verifyMemRefI32", &_mlir_ciface_verifyMemRefI32); + exportSymbol("_mlir_ciface_verifyMemRefF32", &_mlir_ciface_verifyMemRefF32); + exportSymbol("_mlir_ciface_verifyMemRefF64", &_mlir_ciface_verifyMemRefF64); + exportSymbol("_mlir_ciface_verifyMemRefInd", &_mlir_ciface_verifyMemRefInd); + exportSymbol("_mlir_ciface_verifyMemRefC32", &_mlir_ciface_verifyMemRefC32); + exportSymbol("_mlir_ciface_verifyMemRefC64", &_mlir_ciface_verifyMemRefC64); + exportSymbol("verifyMemRefI32", &verifyMemRefI32); + exportSymbol("verifyMemRefF32", &verifyMemRefF32); + exportSymbol("verifyMemRefF64", &verifyMemRefF64); + exportSymbol("verifyMemRefInd", &verifyMemRefInd); + exportSymbol("verifyMemRefC32", &verifyMemRefC32); + exportSymbol("verifyMemRefC64", &verifyMemRefC64); +} + +extern "C" MLIR_RUNNERUTILS_EXPORT void __mlir_execution_engine_destroy() {} + // NOLINTEND(*-identifier-naming)