# CMake support related to building libbacktrace.

function(setup_libbacktrace)

  set(BACKTRACE_SUPPORTED 1)

  # Libbacktrace needs to be told ELF-32 or ELF-64.
  if( ${goarch} STREQUAL "amd64")
    set(BACKTRACE_ELF_SIZE 64)
    set(HAVE_GETIPINFO 1)
  else()
    message(SEND_ERROR "Libbacktrace config setup not implemented for ${goarch}")
  endif()

  if(NOT HAVE_MMAP)
    message(SEND_ERROR "Support for mmap() is required -- setup failed.")
  endif()
  set(BACKTRACE_USES_MALLOC 0)

  # Support for pthreads is similarly required. HAVE_LIBPTHREAD is normally
  # set up by the main LLVM cmake config support.
  if(NOT HAVE_LIBPTHREAD)
    message(SEND_ERROR "Support for pthreads is required -- setup failed.")
  endif()
  set(BACKTRACE_SUPPORTS_THREADS 1)

  # Assume ELF/DWARF, meaning that BACKTRACE_SUPPORTS_DATA is hard-coded on.
  set(BACKTRACE_SUPPORTS_DATA 1)

  # We already tested for syncs at the parent level
  if(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_4)
    if(HAVE_SYNC_BOOL_COMPARE_AND_SWAP_8)
      set(HAVE_SYNC_FUNCTIONS 1)
    endif()
  endif()

  # Generate backtrace-supported.h based on the above.
  configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/backtrace-supported.h.cmake
    ${libgo_binroot}/backtrace-supported.h)

  file(MAKE_DIRECTORY "${libgo_binroot}/libbacktrace")

  # Generate libbacktrace-specific config.h based on the above.
  configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/backtrace-config.h.cmake
    ${libgo_binroot}/libbacktrace/config.h)

  # libbacktrace sources. 
  set(libbacktracecfiles
    "${libbacktrace_srcroot}/atomic.c"
    "${libbacktrace_srcroot}/backtrace.c"
    "${libbacktrace_srcroot}/dwarf.c"
    "${libbacktrace_srcroot}/elf.c"
    "${libbacktrace_srcroot}/fileline.c"
    "${libbacktrace_srcroot}/mmapio.c"
    "${libbacktrace_srcroot}/mmap.c"
    "${libbacktrace_srcroot}/posix.c"
    "${libbacktrace_srcroot}/print.c"
    "${libbacktrace_srcroot}/simple.c"
    "${libbacktrace_srcroot}/sort.c"
    "${libbacktrace_srcroot}/state.c")

  set(libbacktraceflags "-fsplit-stack")

  # Object libraries built from libbacktrace sources.
  # Note: this build uses -fsplit-stack, whereas in the gccgo
  # libgo it does not. In theory this should be a good thing.

  # nonpic
  add_library(libbacktrace_nonpiclib
    OBJECT EXCLUDE_FROM_ALL ${libbacktracecfiles})
  set_target_properties(libbacktrace_nonpiclib
    PROPERTIES COMPILE_FLAGS "${libbacktraceflags}")
  target_include_directories(libbacktrace_nonpiclib
    BEFORE PRIVATE "${libgo_binroot}/libbacktrace")

  # pic
  string(APPEND libbacktraceflags " -fPIC")
  add_library(libbacktrace_piclib
    OBJECT EXCLUDE_FROM_ALL ${libbacktracecfiles})
  target_include_directories(libbacktrace_piclib
    BEFORE PRIVATE "${libgo_binroot}/libbacktrace")
  set_target_properties(libbacktrace_piclib
    PROPERTIES COMPILE_FLAGS "${libbacktraceflags}")

endfunction()
