blob: 035b64791fe4ceb8d1c7b9d857e8c8997e6e5c4b [file] [log] [blame]
# CMake support related to building libffi.
include(CheckTypeSize)
include(CheckFunctionExists)
function(setup_libffi libffi_srcroot)
if(${llarch} STREQUAL "aarch64")
set(arch_dir "aarch64")
elseif(${llarch} STREQUAL "x86_64")
set(arch_dir "x86")
else()
message(SEND_ERROR "Arch ${llarch} not yet supported")
endif()
# FIXME: currently hard-coded
set(VERSION "3.99999")
set(STDC_HEADERS 1)
# FIXME: hoist this up into a common config-checking section (combine
# with similar check in libbacktrace cmake).
# For the moment, require that the target system supports mmap.
check_symbol_exists(mmap "sys/mman.h" HAVE_MMAP)
if(NOT HAVE_MMAP)
message(SEND_ERROR "Support for mmap() is required -- setup failed.")
else()
set(HAVE_MMAP_ANON 1)
set(HAVE_MMAP_FILE 1)
endif()
# Is this 32-bit or 64-bit x86?
if(SIZEOF_VOID_P STREQUAL 4)
set(HAVE_64BIT 0)
else()
set(HAVE_64BIT 1)
if(NOT ${llarch} STREQUAL "aarch64")
set(HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1)
endif()
endif()
# Pick up correct sources based on arch.
set(c_srcs
"${libffi_srcroot}/src/closures.c"
"${libffi_srcroot}/src/tramp.c"
"${libffi_srcroot}/src/prep_cif.c"
"${libffi_srcroot}/src/types.c"
"${libffi_srcroot}/src/raw_api.c"
"${libffi_srcroot}/src/java_raw_api.c"
"${libffi_srcroot}/src/${arch_dir}/ffi.c")
set(asm_srcs "${libffi_srcroot}/src/${arch_dir}/sysv.S")
if(HAVE_64BIT AND ${llarch} STREQUAL "x86_64")
list(APPEND c_srcs "${libffi_srcroot}/src/x86/ffi64.c" "${libffi_srcroot}/src/x86/ffiw64.c")
list(APPEND asm_srcs "${libffi_srcroot}/src/x86/unix64.S")
list(APPEND asm_srcs "${libffi_srcroot}/src/x86/win64.S")
endif()
set_source_files_properties(${asm_srcs} PROPERTIES LANGUAGE ASM)
# Set target based on arch.
if(HAVE_64BIT AND ${llarch} STREQUAL "aarch64")
set(TARGET AARCH64)
elseif(HAVE_64BIT)
set(TARGET X86_64)
else()
set(TARGET X86)
endif()
# Misc x86 and llvm setup.
set(HAVE_AS_REGISTER_PSEUDO_OP 0)
set(HAVE_AS_CFI_PSEUDO_OP 1)
set(HAVE_AS_X86_PCREL 1)
set(HAVE_RO_EH_FRAME 1)
set(HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1)
# These are options for FFI that we want to hard-wire on
set(FFI_CLOSURES 1)
set(FFI_GO_CLOSURES 1)
set(FFI_DEBUG off)
set(FFI_EXEC_TRAMPOLINE_TABLE 0)
set(FFI_MMAP_EXEC_WRIT 0)
set(libffiflags "-g")
if(GOLLVM_USE_SPLIT_STACK)
string(APPEND libffiflags " -fsplit-stack ${CFPROTECTION_WORKAROUND}")
endif()
string(APPEND libffiflags " ${GOLLVM_EXTRA_CFLAGS}")
# Copy correct version of ffitarget.h to libgo binary root.
file(COPY "${libffi_srcroot}/src/${arch_dir}/ffitarget.h" DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
# At this point we can generate the necessary headers.
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/fficonfig.h.cmake" "${CMAKE_CURRENT_BINARY_DIR}/fficonfig.h")
configure_file ("${libffi_srcroot}/include/ffi.h.in" "${CMAKE_CURRENT_BINARY_DIR}/ffi.h")
# Create libffi object libraries
add_library(libffi_nonpiclib OBJECT EXCLUDE_FROM_ALL ${c_srcs} ${asm_srcs})
set_target_properties(libffi_nonpiclib PROPERTIES COMPILE_FLAGS "-fno-PIC ${libffiflags}")
target_include_directories(libffi_nonpiclib PUBLIC "${libffi_srcroot}/include")
add_library(libffi_piclib OBJECT EXCLUDE_FROM_ALL ${c_srcs} ${asm_srcs})
set_target_properties(libffi_piclib PROPERTIES COMPILE_FLAGS "-fPIC ${libffiflags}")
target_include_directories(libffi_piclib PUBLIC "${libffi_srcroot}/include")
endfunction()