ISPC: DynamicLibrary test now passes on windows.

The MSVC linker needs to know what MSVC runtime a shared library
needs. ISPC objects don't have a '/DIRECTIVE' entry for the
MSVC runtime as they have no dependency on it. Therefore
we need to add a C or C++ source to each shared library so
the MSVC linker knows what runtime to embed
This commit is contained in:
Robert Maynard
2020-09-10 13:21:07 -04:00
committed by Brad King
parent a83521e082
commit 8de145cae1
5 changed files with 45 additions and 12 deletions

View File

@@ -9,12 +9,14 @@ endif()
add_library(ispc_objects1 STATIC extra.ispc extra.cxx)
add_library(ispc_objects2 SHARED simple.ispc)
target_sources(ispc_objects2 PRIVATE simple.cxx)
set_target_properties(ispc_objects1 PROPERTIES POSITION_INDEPENDENT_CODE ON)
set_target_properties(ispc_objects1 PROPERTIES ISPC_INSTRUCTION_SETS "sse2-i32x4;avx1-i32x16;avx2-i32x4")
set_target_properties(ispc_objects2 PROPERTIES ISPC_INSTRUCTION_SETS "sse2-i32x4")
target_link_libraries(ispc_objects2 PRIVATE ispc_objects1)
target_link_libraries(ispc_objects2 PUBLIC ispc_objects1)
add_executable(ISPCDynamicLibrary main.cxx)
target_link_libraries(ISPCDynamicLibrary PUBLIC ispc_objects2)

View File

@@ -2,7 +2,13 @@
#include "extra.ispc.h"
int extra()
#ifdef _WIN32
# define EXPORT __declspec(dllexport)
#else
# define EXPORT
#endif
EXPORT int extra()
{
float vin[16], vout[16];
for (int i = 0; i < 16; ++i)

View File

@@ -1,15 +1,17 @@
#include <stdio.h>
#include "simple.ispc.h"
#ifdef _WIN32
# define IMPORT __declspec(dllimport)
#else
# define IMPORT
#endif
IMPORT int simple();
int extra();
int main()
{
float vin[16], vout[16];
for (int i = 0; i < 16; ++i)
vin[i] = i;
ispc::simple(vin, vout, 16);
for (int i = 0; i < 16; ++i)
printf("%d: simple(%f) = %f\n", i, vin[i], vout[i]);
extra();
simple();
return 0;
}

View File

View File

@@ -0,0 +1,23 @@
#include <stdio.h>
#include "simple.ispc.h"
#ifdef _WIN32
# define EXPORT __declspec(dllexport)
#else
# define EXPORT
#endif
EXPORT int simple()
{
float vin[16], vout[16];
for (int i = 0; i < 16; ++i)
vin[i] = i;
ispc::simple(vin, vout, 16);
for (int i = 0; i < 16; ++i)
printf("%d: extra(%f) = %f\n", i, vin[i], vout[i]);
return 0;
}