1# Copyright 2019 Google LLC 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# https://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15FetchContent_Declare(libunwind 16 URL https://github.com/libunwind/libunwind/releases/download/v1.6.2/libunwind-1.6.2.tar.gz 17 URL_HASH SHA256=4a6aec666991fb45d0889c44aede8ad6eb108071c3554fcdff671f9c94794976 18) 19FetchContent_GetProperties(libunwind) 20if(NOT libunwind_POPULATED) 21 FetchContent_Populate(libunwind) 22 set(libunwind_STATUS_FILE "${libunwind_SOURCE_DIR}/config.status") 23 if(EXISTS "${libunwind_STATUS_FILE}") 24 file(SHA256 "${libunwind_STATUS_FILE}" _sapi_CONFIG_STATUS) 25 endif() 26 if(NOT _sapi_CONFIG_STATUS STREQUAL "${libunwind_CONFIG_STATUS}") 27 message("-- Running ./configure for libunwind...") 28 execute_process( 29 COMMAND ./configure --disable-dependency-tracking 30 --disable-minidebuginfo 31 --disable-shared 32 --enable-ptrace 33 --quiet 34 WORKING_DIRECTORY "${libunwind_SOURCE_DIR}" 35 RESULT_VARIABLE _sapi_libunwind_config_result 36 ) 37 if(NOT _sapi_libunwind_config_result EQUAL "0") 38 message(FATAL_ERROR "Configuration of libunwind dependency failed") 39 endif() 40 file(SHA256 "${libunwind_SOURCE_DIR}/config.status" _sapi_CONFIG_STATUS) 41 set(libunwind_CONFIG_STATUS "${_sapi_CONFIG_STATUS}" CACHE INTERNAL "") 42 endif() 43endif() 44 45if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") 46 set(_unwind_cpu "x86_64") 47 list(APPEND _unwind_platform_srcs 48 ${libunwind_SOURCE_DIR}/src/x86_64/Gcreate_addr_space.c 49 ${libunwind_SOURCE_DIR}/src/x86_64/Gglobal.c 50 ${libunwind_SOURCE_DIR}/src/x86_64/Ginit.c 51 ${libunwind_SOURCE_DIR}/src/x86_64/Gos-linux.c 52 ${libunwind_SOURCE_DIR}/src/x86_64/Gregs.c 53 ${libunwind_SOURCE_DIR}/src/x86_64/Gresume.c 54 ${libunwind_SOURCE_DIR}/src/x86_64/Gstash_frame.c 55 ${libunwind_SOURCE_DIR}/src/x86_64/Gstep.c 56 ${libunwind_SOURCE_DIR}/src/x86_64/is_fpreg.c 57 ${libunwind_SOURCE_DIR}/src/x86_64/setcontext.S 58 ) 59 list(APPEND _unwind_ptrace_srcs 60 ${libunwind_SOURCE_DIR}/src/x86_64/Ginit_remote.c 61 ) 62elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64") 63 set(_unwind_cpu "ppc64") 64 list(APPEND _unwind_platform_srcs 65 ${libunwind_SOURCE_DIR}/src/ppc/Gis_signal_frame.c 66 ${libunwind_SOURCE_DIR}/src/ppc64/Gcreate_addr_space.c 67 ${libunwind_SOURCE_DIR}/src/ppc64/Gglobal.c 68 ${libunwind_SOURCE_DIR}/src/ppc64/Ginit.c 69 ${libunwind_SOURCE_DIR}/src/ppc64/Gregs.c 70 ${libunwind_SOURCE_DIR}/src/ppc64/Gresume.c 71 ${libunwind_SOURCE_DIR}/src/ppc64/Gstep.c 72 ${libunwind_SOURCE_DIR}/src/ppc64/get_func_addr.c 73 ${libunwind_SOURCE_DIR}/src/ppc64/is_fpreg.c 74 ) 75 list(APPEND _unwind_ptrace_srcs 76 ${libunwind_SOURCE_DIR}/src/ppc/Ginit_remote.c 77 ) 78elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") 79 set(_unwind_cpu "aarch64") 80 list(APPEND _unwind_platform_srcs 81 ${libunwind_SOURCE_DIR}/src/aarch64/Gcreate_addr_space.c 82 ${libunwind_SOURCE_DIR}/src/aarch64/Gglobal.c 83 ${libunwind_SOURCE_DIR}/src/aarch64/Ginit.c 84 ${libunwind_SOURCE_DIR}/src/aarch64/Gis_signal_frame.c 85 ${libunwind_SOURCE_DIR}/src/aarch64/Gregs.c 86 ${libunwind_SOURCE_DIR}/src/aarch64/Gresume.c 87 ${libunwind_SOURCE_DIR}/src/aarch64/Gstash_frame.c 88 ${libunwind_SOURCE_DIR}/src/aarch64/Gstep.c 89 ${libunwind_SOURCE_DIR}/src/aarch64/is_fpreg.c 90 ) 91 list(APPEND _unwind_ptrace_srcs 92 ${libunwind_SOURCE_DIR}/src/aarch64/Ginit_remote.c 93 ) 94elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm") 95 set(_unwind_cpu "arm") 96 list(APPEND _unwind_platform_srcs 97 ${libunwind_SOURCE_DIR}/src/arm/Gcreate_addr_space.c 98 ${libunwind_SOURCE_DIR}/src/arm/Gex_tables.c 99 ${libunwind_SOURCE_DIR}/src/arm/Gglobal.c 100 ${libunwind_SOURCE_DIR}/src/arm/Ginit.c 101 ${libunwind_SOURCE_DIR}/src/arm/Gis_signal_frame.c 102 ${libunwind_SOURCE_DIR}/src/arm/Gregs.c 103 ${libunwind_SOURCE_DIR}/src/arm/Gresume.c 104 ${libunwind_SOURCE_DIR}/src/arm/Gstash_frame.c 105 ${libunwind_SOURCE_DIR}/src/arm/Gstep.c 106 ${libunwind_SOURCE_DIR}/src/arm/is_fpreg.c 107 ) 108 list(APPEND _unwind_ptrace_srcs 109 ${libunwind_SOURCE_DIR}/src/arm/Ginit_remote.c 110 ) 111endif() 112 113add_library(unwind_ptrace STATIC 114 # internal_headers 115 ${libunwind_SOURCE_DIR}/include/compiler.h 116 ${libunwind_SOURCE_DIR}/include/config.h 117 ${libunwind_SOURCE_DIR}/include/dwarf.h 118 ${libunwind_SOURCE_DIR}/include/dwarf-eh.h 119 ${libunwind_SOURCE_DIR}/include/dwarf_i.h 120 ${libunwind_SOURCE_DIR}/include/libunwind.h 121 ${libunwind_SOURCE_DIR}/include/libunwind-common.h 122 ${libunwind_SOURCE_DIR}/include/libunwind-coredump.h 123 ${libunwind_SOURCE_DIR}/include/libunwind-dynamic.h 124 ${libunwind_SOURCE_DIR}/include/libunwind-ptrace.h 125 ${libunwind_SOURCE_DIR}/include/libunwind-x86_64.h 126 ${libunwind_SOURCE_DIR}/include/libunwind_i.h 127 ${libunwind_SOURCE_DIR}/include/mempool.h 128 ${libunwind_SOURCE_DIR}/include/remote.h 129 ${libunwind_SOURCE_DIR}/include/tdep-x86_64/dwarf-config.h 130 ${libunwind_SOURCE_DIR}/include/tdep-x86_64/libunwind_i.h 131 ${libunwind_SOURCE_DIR}/include/tdep/dwarf-config.h 132 ${libunwind_SOURCE_DIR}/include/tdep/libunwind_i.h 133 ${libunwind_SOURCE_DIR}/include/unwind.h 134 ${libunwind_SOURCE_DIR}/src/elf32.h 135 ${libunwind_SOURCE_DIR}/src/elf64.h 136 ${libunwind_SOURCE_DIR}/src/elfxx.h 137 ${libunwind_SOURCE_DIR}/src/os-linux.h 138 ${libunwind_SOURCE_DIR}/src/x86_64/init.h 139 ${libunwind_SOURCE_DIR}/src/x86_64/offsets.h 140 ${libunwind_SOURCE_DIR}/src/x86_64/ucontext_i.h 141 ${libunwind_SOURCE_DIR}/src/x86_64/unwind_i.h 142 # included_sources 143 ${libunwind_SOURCE_DIR}/src/elf64.h 144 ${libunwind_SOURCE_DIR}/src/elfxx.h 145 ${libunwind_SOURCE_DIR}/src/elfxx.c 146 # sources_common 147 ${libunwind_SOURCE_DIR}/src/dwarf/Gexpr.c 148 ${libunwind_SOURCE_DIR}/src/dwarf/Gfde.c 149 ${libunwind_SOURCE_DIR}/src/dwarf/Gfind_proc_info-lsb.c 150 ${libunwind_SOURCE_DIR}/src/dwarf/Gfind_unwind_table.c 151 ${libunwind_SOURCE_DIR}/src/dwarf/Gparser.c 152 ${libunwind_SOURCE_DIR}/src/dwarf/Gpe.c 153 ${libunwind_SOURCE_DIR}/src/dwarf/global.c 154 ${libunwind_SOURCE_DIR}/src/mi/Gdestroy_addr_space.c 155 ${libunwind_SOURCE_DIR}/src/mi/Gdyn-extract.c 156 ${libunwind_SOURCE_DIR}/src/mi/Gfind_dynamic_proc_info.c 157 ${libunwind_SOURCE_DIR}/src/mi/Gget_accessors.c 158 ${libunwind_SOURCE_DIR}/src/mi/Gget_proc_name.c 159 ${libunwind_SOURCE_DIR}/src/mi/Gget_reg.c 160 ${libunwind_SOURCE_DIR}/src/mi/Gput_dynamic_unwind_info.c 161 ${libunwind_SOURCE_DIR}/src/mi/flush_cache.c 162 ${libunwind_SOURCE_DIR}/src/mi/init.c 163 ${libunwind_SOURCE_DIR}/src/mi/mempool.c 164 ${libunwind_SOURCE_DIR}/src/os-linux.c 165 ${_unwind_platform_srcs} 166 # srcs 167 ${libunwind_SOURCE_DIR}/src/mi/Gdyn-remote.c 168 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_access_fpreg.c 169 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_access_mem.c 170 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_access_reg.c 171 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_accessors.c 172 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_create.c 173 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_destroy.c 174 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_elf.c 175 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_find_proc_info.c 176 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_get_dyn_info_list_addr.c 177 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_get_proc_name.c 178 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_internal.h 179 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_put_unwind_info.c 180 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_reg_offset.c 181 ${libunwind_SOURCE_DIR}/src/ptrace/_UPT_resume.c 182 # hdrs 183 ${libunwind_SOURCE_DIR}/include/config.h 184 ${libunwind_SOURCE_DIR}/include/libunwind.h 185 # source_ptrace 186 ${_unwind_ptrace_srcs} 187) 188add_library(unwind::unwind_ptrace ALIAS unwind_ptrace) 189target_include_directories(unwind_ptrace PUBLIC 190 ${libunwind_SOURCE_DIR}/include 191 ${libunwind_SOURCE_DIR}/include/tdep 192 ${libunwind_SOURCE_DIR}/include/tdep-${_unwind_cpu} 193 ${libunwind_SOURCE_DIR}/src 194) 195target_compile_options(unwind_ptrace PRIVATE 196 -fno-common 197 -Wno-cpp 198) 199target_compile_definitions(unwind_ptrace 200 PRIVATE -DHAVE_CONFIG_H 201 -D_GNU_SOURCE 202 -DNO_FRAME_POINTER 203) 204target_link_libraries(unwind_ptrace PRIVATE 205 sapi::base 206) 207