diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a36999265..28a61e7463 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -515,7 +515,7 @@ endif() include(DaemonNacl) if (NACL) add_library(srclibs-nacl-module EXCLUDE_FROM_ALL ${NACLLIST_MODULE}) - set_target_properties(srclibs-nacl-module PROPERTIES POSITION_INDEPENDENT_CODE 1 FOLDER "libs") + set_target_properties(srclibs-nacl-module PROPERTIES POSITION_INDEPENDENT_CODE ${GAME_PIE} FOLDER "libs") set(LIBS_BASE ${LIBS_BASE} srclibs-nacl-module) else() add_library(srclibs-nacl-native EXCLUDE_FROM_ALL ${NACLLIST_NATIVE}) @@ -531,9 +531,11 @@ endif() if (WIN32) set(LIBS_BASE ${LIBS_BASE} winmm ws2_32) elseif (NACL) - find_library(NACL_EXCEPTION nacl_exception) - find_library(NACL_MINIDUMP minidump_generator) - set(LIBS_BASE ${LIBS_BASE} ${NACL_MINIDUMP} ${NACL_EXCEPTION} ) + if (NOT USE_NACL_SAIGO) + find_library(NACL_EXCEPTION nacl_exception) + find_library(NACL_MINIDUMP minidump_generator) + set(LIBS_BASE ${LIBS_BASE} ${NACL_MINIDUMP} ${NACL_EXCEPTION}) + endif() else() find_library(LIBM m) if (LIBM) @@ -634,14 +636,13 @@ if ( USE_STATIC_LIBS ) endif() endif() - # zlib -if (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP OR NACL) +if (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP OR (BUILD_CGAME AND NACL AND NOT USE_NACL_SAIGO)) if (NOT NACL) find_package(ZLIB REQUIRED) else() add_library(srclibs-zlib EXCLUDE_FROM_ALL ${ZLIBLIST}) - set_target_properties(srclibs-zlib PROPERTIES POSITION_INDEPENDENT_CODE 1 FOLDER "libs") + set_target_properties(srclibs-zlib PROPERTIES POSITION_INDEPENDENT_CODE ${GAME_PIE} FOLDER "libs") set(ZLIB_INCLUDE_DIRS ${LIB_DIR}/zlib) set(ZLIB_LIBRARIES srclibs-zlib) endif() diff --git a/cmake/DaemonFlags.cmake b/cmake/DaemonFlags.cmake index 0ddbd16761..fbf3637a86 100644 --- a/cmake/DaemonFlags.cmake +++ b/cmake/DaemonFlags.cmake @@ -258,7 +258,7 @@ else() try_flag(WARNINGS "-Werror") endif() - if (NACL) + if (NACL AND NOT USE_NACL_SAIGO) # PNaCl only supports libc++ as standard library. set_c_cxx_flag("-stdlib=libc++") set_c_cxx_flag("--pnacl-allow-exceptions") @@ -337,8 +337,11 @@ else() try_c_cxx_flag(FNO_STRICT_OVERFLOW "-fno-strict-overflow") try_c_cxx_flag(WSTACK_PROTECTOR "-Wstack-protector") - try_c_cxx_flag(FPIE "-fPIE") - try_linker_flag(LINKER_PIE "-pie") + + if (NOT NACL OR (NACL AND GAME_PIE)) + try_c_cxx_flag(FPIE "-fPIE") + try_linker_flag(LINKER_PIE "-pie") + endif() if ("${FLAG_LINKER_PIE}" AND MINGW) # https://github.com/msys2/MINGW-packages/issues/4100 diff --git a/cmake/DaemonGame.cmake b/cmake/DaemonGame.cmake index 9d3c2a6ff3..515c2d0db8 100644 --- a/cmake/DaemonGame.cmake +++ b/cmake/DaemonGame.cmake @@ -31,6 +31,7 @@ include(DaemonFlags) # Function to setup all the Sgame/Cgame libraries include(CMakeParseArguments) + function(GAMEMODULE) # ParseArguments setup set(oneValueArgs NAME) @@ -66,50 +67,109 @@ function(GAMEMODULE) else() set(VM_GENERATOR ${CMAKE_GENERATOR}) endif() + set(FORK 1 PARENT_SCOPE) include(ExternalProject) - set(vm nacl-vms) set(inherited_option_args) + foreach(inherited_option ${NACL_VM_INHERITED_OPTIONS}) set(inherited_option_args ${inherited_option_args} "-D${inherited_option}=${${inherited_option}}") endforeach(inherited_option) - # Workaround a bug where CMake ExternalProject lists-as-args are cut on first “;” - string(REPLACE ";" "," NACL_TARGETS_STRING "${NACL_TARGETS}") - - ExternalProject_Add(${vm} - SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} - BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${vm} - CMAKE_GENERATOR ${VM_GENERATOR} - CMAKE_ARGS - -DFORK=2 - -DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-pnacl.cmake - -DDAEMON_DIR=${Daemon_SOURCE_DIR} - -DDEPS_DIR=${DEPS_DIR} - -DBUILD_GAME_NACL=ON - -DNACL_TARGETS_STRING=${NACL_TARGETS_STRING} - -DBUILD_GAME_NATIVE_DLL=OFF - -DBUILD_GAME_NATIVE_EXE=OFF - -DBUILD_CLIENT=OFF - -DBUILD_TTY_CLIENT=OFF - -DBUILD_SERVER=OFF - ${inherited_option_args} - INSTALL_COMMAND "" - ) - ExternalProject_Add_Step(${vm} forcebuild - COMMAND ${CMAKE_COMMAND} -E remove - ${CMAKE_CURRENT_BINARY_DIR}/${vm}-prefix/src/${vm}-stamp/${vm}-configure - COMMENT "Forcing build step for '${vm}'" - DEPENDEES build - ALWAYS 1 - ) + if (USE_NACL_SAIGO) + unset(NACL_VMS_PROJECTS) + + foreach(NACL_TARGET ${NACL_TARGETS}) + if (NACL_TARGET STREQUAL "i686") + set(SAIGO_ARCH "i686") + elseif (NACL_TARGET STREQUAL "amd64") + set(SAIGO_ARCH "x86_64") + elseif (NACL_TARGET STREQUAL "armhf") + set(SAIGO_ARCH "arm") + else() + message(FATAL_ERROR "Unknown NaCl architecture ${NACL_TARGET}") + endif() + + set(NACL_VMS_PROJECT nacl-vms-${NACL_TARGET}) + list(APPEND NACL_VMS_PROJECTS ${NACL_VMS_PROJECT}) + + ExternalProject_Add(${NACL_VMS_PROJECT} + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT} + CMAKE_GENERATOR ${VM_GENERATOR} + CMAKE_ARGS + -DFORK=2 + -DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-saigo.cmake + -DDAEMON_DIR=${Daemon_SOURCE_DIR} + -DDEPS_DIR=${DEPS_DIR} + -DBUILD_GAME_NACL=ON + -DUSE_NACL_SAIGO=ON + -DNACL_TARGET=${NACL_TARGET} + -DSAIGO_ARCH=${SAIGO_ARCH} + -DBUILD_GAME_NATIVE_DLL=OFF + -DBUILD_GAME_NATIVE_EXE=OFF + -DBUILD_CLIENT=OFF + -DBUILD_TTY_CLIENT=OFF + -DBUILD_SERVER=OFF + ${inherited_option_args} + INSTALL_COMMAND "" + ) + # Force the rescan and rebuild of the subproject. + ExternalProject_Add_Step(${NACL_VMS_PROJECT} forcebuild + COMMAND ${CMAKE_COMMAND} -E remove + ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}-prefix/src/${NACL_VMS_PROJECT}-stamp/${NACL_VMS_PROJECT}-configure + COMMENT "Forcing build step for '${NACL_VMS_PROJECT}'" + DEPENDEES build + ALWAYS 1 + ) + endforeach() + else() + set(NACL_VMS_PROJECT nacl-vms-pexe) + set(NACL_VMS_PROJECTS ${NACL_VMS_PROJECT}) + + # Workaround a bug where CMake ExternalProject lists-as-args are cut on first “;” + string(REPLACE ";" "," NACL_TARGETS_STRING "${NACL_TARGETS}") + + ExternalProject_Add(${NACL_VMS_PROJECT} + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} + BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT} + CMAKE_GENERATOR ${VM_GENERATOR} + CMAKE_ARGS + -DFORK=2 + -DCMAKE_TOOLCHAIN_FILE=${Daemon_SOURCE_DIR}/cmake/toolchain-pnacl.cmake + -DDAEMON_DIR=${Daemon_SOURCE_DIR} + -DDEPS_DIR=${DEPS_DIR} + -DBUILD_GAME_NACL=ON + -DNACL_TARGETS_STRING=${NACL_TARGETS_STRING} + -DBUILD_GAME_NATIVE_DLL=OFF + -DBUILD_GAME_NATIVE_EXE=OFF + -DBUILD_CLIENT=OFF + -DBUILD_TTY_CLIENT=OFF + -DBUILD_SERVER=OFF + ${inherited_option_args} + INSTALL_COMMAND "" + ) + + # Force the rescan and rebuild of the subproject. + ExternalProject_Add_Step(${NACL_VMS_PROJECT} forcebuild + COMMAND ${CMAKE_COMMAND} -E remove + ${CMAKE_CURRENT_BINARY_DIR}/${NACL_VMS_PROJECT}-prefix/src/${NACL_VMS_PROJECT}-stamp/${NACL_VMS_PROJECT}-configure + COMMENT "Forcing build step for '${NACL_VMS_PROJECT}'" + DEPENDEES build + ALWAYS 1 + ) + endif() endif() else() if (FORK EQUAL 2) - # Put the .nexe and .pexe files in the same directory as the engine - set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/..) + if(USE_NACL_SAIGO) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + else() + # Put the .nexe and .pexe files in the same directory as the engine + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/..) + endif() endif() add_executable(${GAMEMODULE_NAME}-nacl ${PCH_FILE} ${GAMEMODULE_FILES} ${SHAREDLIST_${GAMEMODULE_NAME}} ${SHAREDLIST} ${COMMONLIST}) @@ -127,9 +187,14 @@ function(GAMEMODULE) # Revert a workaround for a bug where CMake ExternalProject lists-as-args are cut on first “;” string(REPLACE "," ";" NACL_TARGETS "${NACL_TARGETS_STRING}") - # Generate NaCl executables for supported architectures. - foreach(NACL_TARGET ${NACL_TARGETS}) - pnacl_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${GAMEMODULE_NAME} ${NACL_TARGET}) - endforeach() + if (USE_NACL_SAIGO) + # Finalize NaCl executables for supported architectures. + saigo_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/.. ${GAMEMODULE_NAME} ${NACL_TARGET}) + else() + # Generate NaCl executables for supported architectures. + foreach(NACL_TARGET ${NACL_TARGETS}) + pnacl_finalize(${CMAKE_RUNTIME_OUTPUT_DIRECTORY} ${GAMEMODULE_NAME} ${NACL_TARGET}) + endforeach() + endif() endif() endfunction() diff --git a/cmake/DaemonNacl.cmake b/cmake/DaemonNacl.cmake index 13df8280be..f3310514ee 100644 --- a/cmake/DaemonNacl.cmake +++ b/cmake/DaemonNacl.cmake @@ -26,13 +26,31 @@ # Native client +option(USE_NACL_SAIGO "Use Saigo toolchain to build NaCl executables" OFF) + if( NACL ) # Build nexe binary. - # Those defines looks to be meaningless to produce arch-independent pexe, - # but they must be set to anything supported by native builds. this - # requirement looks to be a NaCl bug. - add_definitions( -DNACL_BUILD_ARCH=x86 ) - add_definitions( -DNACL_BUILD_SUBARCH=64 ) + if(USE_NACL_SAIGO) + # NACL_ARCH is "pnacl" here, NACL_TARGET carries the architecture. + if (NACL_TARGET STREQUAL "amd64") + add_definitions(-DNACL_BUILD_ARCH=x86) + add_definitions(-DNACL_BUILD_SUBARCH=64) + elseif (NACL_TARGET STREQUAL "i686") + add_definitions(-DNACL_BUILD_ARCH=x86) + add_definitions(-DNACL_BUILD_SUBARCH=32) + elseif (NACL_TARGET STREQUAL "armhf") + add_definitions(-DNACL_BUILD_ARCH=arm) + else() + message(FATAL_ERROR "Unsupported architecture ${NACL_TARGET}") + endif() + else() + # Those defines looks to be meaningless to produce arch-independent pexe + # with PNaCl but they must be set to anything supported by native builds. + # This requirement looks to be a PNaCl bug. + # NACL_ARCH is "pnacl" here, NACL_TARGET is not set. + add_definitions( -DNACL_BUILD_ARCH=x86 ) + add_definitions( -DNACL_BUILD_SUBARCH=64 ) + endif() else() # Build native dll or native exe. if( APPLE ) diff --git a/cmake/DaemonPlatform.cmake b/cmake/DaemonPlatform.cmake index 36c3e86686..28de5c51db 100644 --- a/cmake/DaemonPlatform.cmake +++ b/cmake/DaemonPlatform.cmake @@ -40,4 +40,13 @@ else() message( FATAL_ERROR "Platform not supported" ) endif() +if (NACL AND USE_NACL_SAIGO) + # Saigo clang reports weird errors when building some cgame and sgame arm nexe with PIE. + # Saigo clang crashes when building amd64 cgame with PIE, sgame builds properly though. + set(GAME_PIE 0) +else() + set(GAME_PIE 1) +endif() + + include(DaemonArchitecture) diff --git a/cmake/toolchain-saigo.cmake b/cmake/toolchain-saigo.cmake new file mode 100644 index 0000000000..75374527b3 --- /dev/null +++ b/cmake/toolchain-saigo.cmake @@ -0,0 +1,75 @@ +set(PLATFORM_PREFIX "${DEPS_DIR}/saigo_newlib/bin") +set(PLATFORM_TRIPLET "${SAIGO_ARCH}-nacl") +set(PLATFORM_EXE_SUFFIX ".nexe") + +set(CMAKE_SYSTEM_NAME "Generic") + +set(CMAKE_C_COMPILER "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-clang") +set(CMAKE_CXX_COMPILER "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-clang++") +set(CMAKE_AR "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-ar" CACHE FILEPATH "Archiver" FORCE) +set(CMAKE_RANLIB "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-ranlib") +set(SAIGO_STRIP "${PLATFORM_PREFIX}/${PLATFORM_TRIPLET}-strip") +set(CMAKE_FIND_ROOT_PATH "${PLATFORM_PREFIX}/../${PLATFORM_TRIPLET}") + +# Copy-pasted from the PNaCl toolchain, it's not sure we need it. +set(CMAKE_C_USE_RESPONSE_FILE_FOR_LIBRARIES 1) +set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_LIBRARIES 1) +set(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1) +set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1) +set(CMAKE_C_USE_RESPONSE_FILE_FOR_INCLUDES 1) +set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_INCLUDES 1) +set(CMAKE_C_RESPONSE_FILE_LINK_FLAG "@") +set(CMAKE_CXX_RESPONSE_FILE_LINK_FLAG "@") + +# Copy-pasted from the PNaCl toolchain, it's not sure we need it. +# These commands can fail on windows if there is a space at the beginning +set(CMAKE_C_CREATE_STATIC_LIBRARY " rc ") +set(CMAKE_CXX_CREATE_STATIC_LIBRARY " rc ") + +set(CMAKE_C_COMPILE_OBJECT " -o -c ") +set(CMAKE_CXX_COMPILE_OBJECT " -o -c ") + +set(CMAKE_C_LINK_EXECUTABLE " -o ") +set(CMAKE_CXX_LINK_EXECUTABLE " -o ") + +# Copy-pasted from the PNaCl toolchain, it's not sure we need it. +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) + +set(NACL ON) + +set(CMAKE_C_FLAGS "") +set(CMAKE_CXX_FLAGS "") + +function(saigo_finalize dir module arch) + set(SUBPROJECT_NEXE ${dir}/nacl-vms-${arch}/${module}.nexe) + set(NEXE ${dir}/${module}-${arch}.nexe) + set(STRIPPED_NEXE ${dir}/${module}-${arch}-stripped.nexe) + + add_custom_command( + OUTPUT ${NEXE} + COMMENT "Copying ${module} (${arch})" + DEPENDS ${SUBPROJECT_NEXE} + COMMAND + ${CMAKE_COMMAND} + -E copy + ${SUBPROJECT_NEXE} + ${NEXE} + ) + + add_custom_command( + OUTPUT ${STRIPPED_NEXE} + COMMENT "Stripping ${module} (${arch})" + DEPENDS ${NEXE} + COMMAND + "${SAIGO_STRIP}" + -s + ${NEXE} + -o ${STRIPPED_NEXE} + ) + + add_custom_target(${module}-${arch} ALL DEPENDS ${STRIPPED_NEXE}) + add_dependencies(${module}-${arch} ${module}-nacl) +endfunction() diff --git a/libs/nacl/native_client/src/untrusted/nacl/syscall_bindings_trampoline.h b/libs/nacl/native_client/src/untrusted/nacl/syscall_bindings_trampoline.h index dad0769d34..a3d72716a2 100644 --- a/libs/nacl/native_client/src/untrusted/nacl/syscall_bindings_trampoline.h +++ b/libs/nacl/native_client/src/untrusted/nacl/syscall_bindings_trampoline.h @@ -17,6 +17,7 @@ extern "C" { #include #include +#include #include "native_client/src/trusted/service_runtime/include/bits/nacl_syscalls.h" #include "native_client/src/trusted/service_runtime/nacl_config.h" diff --git a/src/common/System.cpp b/src/common/System.cpp index 612de5f30e..6e598f2ff0 100644 --- a/src/common/System.cpp +++ b/src/common/System.cpp @@ -39,8 +39,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #endif #ifdef __native_client__ +#if !defined(__saigo__) #include #include +#endif #include #else #include @@ -335,8 +337,10 @@ static void CrashHandler(const void* data, size_t n) void SetupCrashHandler() { +#if !defined(__saigo__) nacl_minidump_register_crash_handler(); nacl_minidump_set_callback(CrashHandler); +#endif } #else NORETURN static void CrashHandler(int sig)