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