From 01914b49cd7845b9349598d7f3d56bfee14c92d0 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 22 Nov 2019 19:24:16 +0200 Subject: [PATCH] Fixes for cmake build with visual studio (#144) * Fixed CMake configuration for visual studio build Added proper asm source and set correct type. * Disabled stadard layout check of randomx_cache for visual studio debug Required to silence static_assert which fails on Visual Studio Debug configuation. * Fixed warning message and defines check * Removed unsupported flags for MSVC compiler * Enabled AVX2 for msvc * Fixed formatting in CmakeLists * Added generation of configuration.asm by CMake for MSVC --- CMakeLists.txt | 68 +++++++++++++++++++++++++++++++++---------------- src/dataset.hpp | 9 +++++++ 2 files changed, 55 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 40f0354..f3f07ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,9 @@ cmake_minimum_required(VERSION 2.8.7) -set (randomx_sources +project(RandomX) + +set(randomx_sources src/aes_hash.cpp src/argon2_ref.c src/argon2_ssse3.c @@ -94,32 +96,50 @@ function(add_flag flag) endfunction() # x86-64 -if (ARCH_ID STREQUAL "x86_64" OR ARCH_ID STREQUAL "x86-64" OR ARCH_ID STREQUAL "amd64") +if(ARCH_ID STREQUAL "x86_64" OR ARCH_ID STREQUAL "x86-64" OR ARCH_ID STREQUAL "amd64") list(APPEND randomx_sources - src/jit_compiler_x86_static.S src/jit_compiler_x86.cpp) - # cheat because cmake and ccache hate each other - set_property(SOURCE src/jit_compiler_x86_static.S PROPERTY LANGUAGE C) - set_property(SOURCE src/jit_compiler_x86_static.S PROPERTY XCODE_EXPLICIT_FILE_TYPE sourcecode.asm) - if(ARCH STREQUAL "native") - add_flag("-march=native") + if(MSVC) + enable_language(ASM_MASM) + list(APPEND randomx_sources src/jit_compiler_x86_static.asm) + + set_property(SOURCE src/jit_compiler_x86_static.asm PROPERTY LANGUAGE ASM_MASM) + + set_source_files_properties(src/argon2_avx2.c COMPILE_FLAGS /arch:AVX2) + + add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/src/asm/configuration.asm + COMMAND powershell -ExecutionPolicy Bypass -File h2inc.ps1 ..\\src\\configuration.h > ..\\src\\asm\\configuration.asm SET ERRORLEVEL = 0 + COMMENT "Generating configuration.asm at ${CMAKE_CURRENT_SOURCE_DIR}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/vcxproj) + add_custom_target(generate-asm + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/asm/configuration.asm) else() - # default build has hardware AES enabled (software AES can be selected at runtime) - add_flag("-maes") - check_c_compiler_flag(-mssse3 HAVE_SSSE3) - if(HAVE_SSSE3) - set_source_files_properties(src/argon2_ssse3.c COMPILE_FLAGS -mssse3) - endif() - check_c_compiler_flag(-mavx2 HAVE_AVX2) - if(HAVE_AVX2) - set_source_files_properties(src/argon2_avx2.c COMPILE_FLAGS -mavx2) + list(APPEND randomx_sources src/jit_compiler_x86_static.S) + + # cheat because cmake and ccache hate each other + set_property(SOURCE src/jit_compiler_x86_static.S PROPERTY LANGUAGE C) + set_property(SOURCE src/jit_compiler_x86_static.S PROPERTY XCODE_EXPLICIT_FILE_TYPE sourcecode.asm) + + if(ARCH STREQUAL "native") + add_flag("-march=native") + else() + # default build has hardware AES enabled (software AES can be selected at runtime) + add_flag("-maes") + check_c_compiler_flag(-mssse3 HAVE_SSSE3) + if(HAVE_SSSE3) + set_source_files_properties(src/argon2_ssse3.c COMPILE_FLAGS -mssse3) + endif() + check_c_compiler_flag(-mavx2 HAVE_AVX2) + if(HAVE_AVX2) + set_source_files_properties(src/argon2_avx2.c COMPILE_FLAGS -mavx2) + endif() endif() endif() endif() # PowerPC -if (ARCH_ID STREQUAL "ppc64" OR ARCH_ID STREQUAL "ppc64le") +if(ARCH_ID STREQUAL "ppc64" OR ARCH_ID STREQUAL "ppc64le") if(ARCH STREQUAL "native") add_flag("-mcpu=native") endif() @@ -127,7 +147,7 @@ if (ARCH_ID STREQUAL "ppc64" OR ARCH_ID STREQUAL "ppc64le") endif() # ARMv8 -if (ARM_ID STREQUAL "aarch64" OR ARM_ID STREQUAL "arm64" OR ARM_ID STREQUAL "armv8-a") +if(ARM_ID STREQUAL "aarch64" OR ARM_ID STREQUAL "arm64" OR ARM_ID STREQUAL "armv8-a") list(APPEND randomx_sources src/jit_compiler_a64_static.S src/jit_compiler_a64.cpp) @@ -152,8 +172,12 @@ endif() set(RANDOMX_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/src" CACHE STRING "RandomX Include path") -add_library(randomx - ${randomx_sources}) +add_library(randomx ${randomx_sources}) + +if(TARGET generate-asm) + add_dependencies(randomx generate-asm) +endif() + set_property(TARGET randomx PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET randomx PROPERTY CXX_STANDARD 11) set_property(TARGET randomx PROPERTY CXX_STANDARD_REQUIRED ON) @@ -176,7 +200,7 @@ target_link_libraries(randomx-codegen set_property(TARGET randomx-codegen PROPERTY POSITION_INDEPENDENT_CODE ON) set_property(TARGET randomx-codegen PROPERTY CXX_STANDARD 11) -if (NOT Threads_FOUND AND UNIX AND NOT APPLE) +if(NOT Threads_FOUND AND UNIX AND NOT APPLE) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads) endif() diff --git a/src/dataset.hpp b/src/dataset.hpp index 083a5d7..d01911f 100644 --- a/src/dataset.hpp +++ b/src/dataset.hpp @@ -61,8 +61,17 @@ struct randomx_cache { //A pointer to a standard-layout struct object points to its initial member static_assert(std::is_standard_layout(), "randomx_dataset must be a standard-layout struct"); + //the following assert fails when compiling Debug in Visual Studio (JIT mode will crash in Debug) +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && defined(_DEBUG) +#define TO_STR(x) #x +#define STR(x) TO_STR(x) +#pragma message ( __FILE__ "(" STR(__LINE__) ") warning: check std::is_standard_layout() is disabled for Debug configuration. JIT mode will crash." ) +#undef STR +#undef TO_STR +#else static_assert(std::is_standard_layout(), "randomx_cache must be a standard-layout struct"); +#endif namespace randomx {