1# 2# Copyright (C) 2014 The Android Open Source Project 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17LOCAL_PATH := $(call my-dir) 18 19libunwind_build_host := false 20ifeq ($(HOST_OS),linux) 21libunwind_build_host := true 22endif 23 24# Set to true to enable a debug build of the libraries. 25# To control what is logged, set the environment variable UNW_DEBUG_LEVEL=x, 26# where x controls the verbosity (from 1 to 20). 27libunwind_debug := false 28 29libunwind_common_cppflags := \ 30 -Wno-old-style-cast \ 31 32libunwind_common_cflags := \ 33 -Wno-unused-parameter \ 34 -Werror \ 35 36# gcc 4.8 appears to be overeager declaring that a variable is uninitialized, 37# under certain circumstances. Turn off this warning only for target so that 38# coverage is still present for the host code. When the entire build system 39# is switched to 4.9, then this can be removed. 40libunwind_common_cflags_target := \ 41 -Wno-maybe-uninitialized \ 42 43# src/mi/backtrace.c is misdetected as a bogus header guard by clang 3.5 44# src/x86_64/Gstash_frame.c has unnecessary calls to labs. 45libunwind_common_clang_cflags += \ 46 -Wno-header-guard \ 47 -Wno-absolute-value \ 48 49# The latest clang (r230699) does not allow SP/PC to be declared in inline asm lists. 50libunwind_common_clang_cflags += \ 51 -Wno-inline-asm 52 53ifneq ($(libunwind_debug),true) 54libunwind_common_cflags += \ 55 -DHAVE_CONFIG_H \ 56 -DNDEBUG \ 57 -D_GNU_SOURCE \ 58 59else 60libunwind_common_cflags += \ 61 -DHAVE_CONFIG_H \ 62 -DDEBUG \ 63 -D_GNU_SOURCE \ 64 -U_FORTIFY_SOURCE \ 65 66endif 67 68libunwind_common_c_includes := \ 69 $(LOCAL_PATH)/src \ 70 $(LOCAL_PATH)/include \ 71 72# Since mips and mips64 use the same source, only generate includes/srcs 73# for the below set of arches. 74libunwind_generate_arches := arm arm64 mips x86 x86_64 75# The complete list of arches used by Android.build.mk to set arch 76# variables. 77libunwind_arches := $(libunwind_generate_arches) mips64 78 79$(foreach arch,$(libunwind_generate_arches), \ 80 $(eval libunwind_common_c_includes_$(arch) := $(LOCAL_PATH)/include/tdep-$(arch))) 81 82#----------------------------------------------------------------------- 83# libunwind shared library 84#----------------------------------------------------------------------- 85libunwind_src_files := \ 86 src/mi/init.c \ 87 src/mi/flush_cache.c \ 88 src/mi/mempool.c \ 89 src/mi/strerror.c \ 90 src/mi/backtrace.c \ 91 src/mi/dyn-cancel.c \ 92 src/mi/dyn-info-list.c \ 93 src/mi/dyn-register.c \ 94 src/mi/map.c \ 95 src/mi/Lmap.c \ 96 src/mi/Ldyn-extract.c \ 97 src/mi/Lfind_dynamic_proc_info.c \ 98 src/mi/Lget_proc_info_by_ip.c \ 99 src/mi/Lget_proc_name.c \ 100 src/mi/Lput_dynamic_unwind_info.c \ 101 src/mi/Ldestroy_addr_space.c \ 102 src/mi/Lget_reg.c \ 103 src/mi/Lset_reg.c \ 104 src/mi/Lget_fpreg.c \ 105 src/mi/Lset_fpreg.c \ 106 src/mi/Lset_caching_policy.c \ 107 src/mi/Gdyn-extract.c \ 108 src/mi/Gdyn-remote.c \ 109 src/mi/Gfind_dynamic_proc_info.c \ 110 src/mi/Gget_accessors.c \ 111 src/mi/Gget_proc_info_by_ip.c \ 112 src/mi/Gget_proc_name.c \ 113 src/mi/Gput_dynamic_unwind_info.c \ 114 src/mi/Gdestroy_addr_space.c \ 115 src/mi/Gget_reg.c \ 116 src/mi/Gset_reg.c \ 117 src/mi/Gget_fpreg.c \ 118 src/mi/Gset_fpreg.c \ 119 src/mi/Gset_caching_policy.c \ 120 src/dwarf/Lexpr.c \ 121 src/dwarf/Lfde.c \ 122 src/dwarf/Lparser.c \ 123 src/dwarf/Lpe.c \ 124 src/dwarf/Lstep_dwarf.c \ 125 src/dwarf/Lfind_proc_info-lsb.c \ 126 src/dwarf/Lfind_unwind_table.c \ 127 src/dwarf/Gexpr.c \ 128 src/dwarf/Gfde.c \ 129 src/dwarf/Gfind_proc_info-lsb.c \ 130 src/dwarf/Gfind_unwind_table.c \ 131 src/dwarf/Gparser.c \ 132 src/dwarf/Gpe.c \ 133 src/dwarf/Gstep_dwarf.c \ 134 src/dwarf/global.c \ 135 src/os-common.c \ 136 src/os-linux.c \ 137 src/Los-common.c \ 138 139# ptrace files for remote unwinding. 140libunwind_src_files += \ 141 src/ptrace/_UPT_accessors.c \ 142 src/ptrace/_UPT_access_fpreg.c \ 143 src/ptrace/_UPT_access_mem.c \ 144 src/ptrace/_UPT_access_reg.c \ 145 src/ptrace/_UPT_create.c \ 146 src/ptrace/_UPT_destroy.c \ 147 src/ptrace/_UPT_find_proc_info.c \ 148 src/ptrace/_UPT_get_dyn_info_list_addr.c \ 149 src/ptrace/_UPT_put_unwind_info.c \ 150 src/ptrace/_UPT_get_proc_name.c \ 151 src/ptrace/_UPT_reg_offset.c \ 152 src/ptrace/_UPT_resume.c \ 153 154# Arch specific source files. 155$(foreach arch,$(libunwind_generate_arches), \ 156 $(eval libunwind_src_files_$(arch) += \ 157 src/$(arch)/is_fpreg.c \ 158 src/$(arch)/regname.c \ 159 src/$(arch)/Gcreate_addr_space.c \ 160 src/$(arch)/Gget_proc_info.c \ 161 src/$(arch)/Gget_save_loc.c \ 162 src/$(arch)/Gglobal.c \ 163 src/$(arch)/Ginit.c \ 164 src/$(arch)/Ginit_local.c \ 165 src/$(arch)/Ginit_remote.c \ 166 src/$(arch)/Gregs.c \ 167 src/$(arch)/Gresume.c \ 168 src/$(arch)/Gstep.c \ 169 src/$(arch)/Lcreate_addr_space.c \ 170 src/$(arch)/Lget_proc_info.c \ 171 src/$(arch)/Lget_save_loc.c \ 172 src/$(arch)/Lglobal.c \ 173 src/$(arch)/Linit.c \ 174 src/$(arch)/Linit_local.c \ 175 src/$(arch)/Linit_remote.c \ 176 src/$(arch)/Lregs.c \ 177 src/$(arch)/Lresume.c \ 178 src/$(arch)/Lstep.c \ 179 )) 180 181libunwind_src_files_arm += \ 182 src/arm/getcontext.S \ 183 src/arm/Gis_signal_frame.c \ 184 src/arm/Gex_tables.c \ 185 src/arm/Lis_signal_frame.c \ 186 src/arm/Lex_tables.c \ 187 188libunwind_src_files_arm64 += \ 189 src/aarch64/Gis_signal_frame.c \ 190 src/aarch64/Lis_signal_frame.c \ 191 192libunwind_src_files_mips += \ 193 src/mips/getcontext-android.S \ 194 src/mips/Gis_signal_frame.c \ 195 src/mips/Lis_signal_frame.c \ 196 197libunwind_src_files_x86 += \ 198 src/x86/getcontext-linux.S \ 199 src/x86/Gos-linux.c \ 200 src/x86/Los-linux.c \ 201 202libunwind_src_files_x86_64 += \ 203 src/x86_64/getcontext.S \ 204 src/x86_64/Gstash_frame.c \ 205 src/x86_64/Gtrace.c \ 206 src/x86_64/Gos-linux.c \ 207 src/x86_64/Lstash_frame.c \ 208 src/x86_64/Ltrace.c \ 209 src/x86_64/Los-linux.c \ 210 src/x86_64/setcontext.S \ 211 212# mips and mips64 use the same sources but define _MIP_SIM differently 213# to change the behavior. 214# mips uses o32 abi (_MIPS_SIM == _ABIO32). 215# mips64 uses n64 abi (_MIPS_SIM == _ABI64). 216libunwind_common_c_includes_mips64 := $(LOCAL_PATH)/include/tdep-mips 217libunwind_src_files_mips64 := $(libunwind_src_files_mips) 218 219# 64-bit architectures 220libunwind_src_files_arm64 += src/elf64.c 221libunwind_src_files_mips64 += src/elf64.c 222libunwind_src_files_x86_64 += src/elf64.c 223 224# 32-bit architectures 225libunwind_src_files_arm += src/elf32.c 226libunwind_src_files_mips += src/elf32.c 227libunwind_src_files_x86 += src/elf32.c 228 229libunwind_shared_libraries_target := \ 230 libdl \ 231 232libunwind_ldflags_host := \ 233 -nostdlib 234 235libunwind_ldlibs_host := \ 236 -lc \ 237 -lpthread \ 238 239libunwind_export_c_include_dirs := \ 240 $(LOCAL_PATH)/include 241 242ifeq ($(libunwind_debug),true) 243libunwind_shared_libraries += \ 244 liblog \ 245 246endif 247 248libunwind_module := libunwind 249libunwind_module_tag := optional 250libunwind_build_type := target 251libunwind_build_target := SHARED_LIBRARY 252include $(LOCAL_PATH)/Android.build.mk 253libunwind_build_type := host 254include $(LOCAL_PATH)/Android.build.mk 255libunwind_build_type := target 256# Make sure the static library functions do not interfere with shared version. 257libunwind_cflags += -DUNW_ADDITIONAL_PREFIX 258libunwind_build_target := STATIC_LIBRARY 259include $(LOCAL_PATH)/Android.build.mk 260libunwind_build_type := host 261include $(LOCAL_PATH)/Android.build.mk 262 263#----------------------------------------------------------------------- 264# libunwindbacktrace static library 265#----------------------------------------------------------------------- 266libunwindbacktrace_src_files += \ 267 src/unwind/BacktraceWrapper.c \ 268 src/unwind/DeleteException.c \ 269 src/unwind/FindEnclosingFunction.c \ 270 src/unwind/ForcedUnwind.c \ 271 src/unwind/GetBSP.c \ 272 src/unwind/GetCFA.c \ 273 src/unwind/GetDataRelBase.c \ 274 src/unwind/GetGR.c \ 275 src/unwind/GetIP.c \ 276 src/unwind/GetIPInfo.c \ 277 src/unwind/GetLanguageSpecificData.c \ 278 src/unwind/GetRegionStart.c \ 279 src/unwind/GetTextRelBase.c \ 280 src/unwind/RaiseException.c \ 281 src/unwind/Resume.c \ 282 src/unwind/Resume_or_Rethrow.c \ 283 src/unwind/SetGR.c \ 284 src/unwind/SetIP.c \ 285 286libunwindbacktrace_cflags += \ 287 -Wno-old-style-declaration \ 288 -fvisibility=hidden \ 289 -DUNW_ADDITIONAL_PREFIX \ 290 291libunwind_module := libunwindbacktrace 292libunwind_module_tag := optional 293libunwind_build_type := target 294libunwind_build_target := STATIC_LIBRARY 295libunwindbacktrace_whole_static_libraries := libunwind 296include $(LOCAL_PATH)/Android.build.mk 297libunwind_build_type := host 298include $(LOCAL_PATH)/Android.build.mk 299 300#----------------------------------------------------------------------- 301# libunwind testing 302#----------------------------------------------------------------------- 303libunwind-unit-tests_cflags := \ 304 -fno-builtin \ 305 -O0 \ 306 -g \ 307 308libunwind-unit-tests_c_includes := \ 309 $(LOCAL_PATH)/include \ 310 311libunwind-unit-tests_src_files := \ 312 android/tests/local_test.cpp \ 313 314libunwind-unit-tests_shared_libraries := \ 315 libunwind \ 316 317libunwind-unit-tests_multilib := both 318libunwind_module := libunwind-unit-tests 319libunwind_module_tag := optional 320libunwind_build_type := target 321libunwind_build_target := NATIVE_TEST 322include $(LOCAL_PATH)/Android.build.mk 323libunwind_build_type := host 324include $(LOCAL_PATH)/Android.build.mk 325 326# Run the unit tests built for x86 or x86_64. 327ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86 x86_64)) 328ifneq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),x86)) 329LINKER = linker64 330TEST_SUFFIX = 64 331else 332LINKER = linker 333TEST_SUFFIX = 32 334endif 335 336libunwind-unit-tests-run-on-host: libunwind-unit-tests $(TARGET_OUT_EXECUTABLES)/$(LINKER) $(TARGET_OUT_EXECUTABLES)/sh 337 if [ ! -d /system -o ! -d /system/bin ]; then \ 338 echo "Attempting to create /system/bin"; \ 339 sudo mkdir -p -m 0777 /system/bin; \ 340 fi 341 mkdir -p $(TARGET_OUT_DATA)/local/tmp 342 cp $(TARGET_OUT_EXECUTABLES)/$(LINKER) /system/bin 343 cp $(TARGET_OUT_EXECUTABLES)/sh /system/bin 344 ANDROID_DATA=$(TARGET_OUT_DATA) \ 345 ANDROID_ROOT=$(TARGET_OUT) \ 346 LD_LIBRARY_PATH=$(TARGET_OUT_SHARED_LIBRARIES) \ 347 $(TARGET_OUT_DATA_NATIVE_TESTS)/libunwind-unit-tests/libunwind-unit-tests$(TEST_SUFFIX) $(LIBUNWIND_TEST_FLAGS) 348endif 349