xref: /aosp_15_r20/external/sandboxed-api/cmake/libunwind.cmake (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
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