# 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()
