Rewrite libbacktrace using C++.
The old code was essentially trying to be C++ in C and was awkward. This
change makes it all objects with a thin layer that C code can use.
There is a C++ backtrace object that is not very useful, this code will
replace it.
This change also includes moving the backtrace test to a gtest, and adding
coverage of all major functionality.
Bug: 8410085
Change-Id: Iae0f1b09b3dd60395f71ed66010c1ea5cdd37841
diff --git a/libbacktrace/Android.mk b/libbacktrace/Android.mk
index 4197bbb..66d7e62 100644
--- a/libbacktrace/Android.mk
+++ b/libbacktrace/Android.mk
@@ -1,67 +1,109 @@
LOCAL_PATH:= $(call my-dir)
+common_src := \
+ Backtrace.cpp \
+ BacktraceThread.cpp \
+ map_info.c \
+ thread_utils.c \
+
+common_cflags := \
+ -Wall \
+ -Wno-unused-parameter \
+ -Werror \
+
+common_conlyflags := \
+ -std=gnu99 \
+
+common_cppflags := \
+ -std=gnu++11 \
+
+common_shared_libs := \
+ libcutils \
+ libgccdemangle \
+ liblog \
+
+# To enable using libunwind on each arch, add it to the list below.
+ifeq ($(TARGET_ARCH),$(filter $(TARGET_ARCH),))
+
#----------------------------------------------------------------------------
-# The libbacktrace library using libunwind
+# The native libbacktrace library with libunwind.
#----------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
- unwind.c \
- unwind_remote.c \
- unwind_local.c \
- common.c \
- demangle.c \
- map_info.c \
+ $(common_src) \
+ UnwindCurrent.cpp \
+ UnwindPtrace.cpp \
LOCAL_CFLAGS := \
- -Wall \
- -Wno-unused-parameter \
- -Werror \
- -std=gnu99 \
+ $(common_cflags) \
+
+LOCAL_CONLYFLAGS += \
+ $(common_conlyflags) \
+
+LOCAL_CPPFLAGS += \
+ $(common_cppflags) \
LOCAL_MODULE := libbacktrace
LOCAL_MODULE_TAGS := optional
-LOCAL_SHARED_LIBRARIES := \
- liblog \
- libunwind \
- libunwind-ptrace \
- libgccdemangle \
-
LOCAL_C_INCLUDES := \
+ $(common_c_includes) \
external/libunwind/include \
-# The libunwind code is not in the tree yet, so don't build this library yet.
-#include $(BUILD_SHARED_LIBRARY)
+LOCAL_SHARED_LIBRARIES := \
+ $(common_shared_libs) \
+ libunwind \
+ libunwind-ptrace \
+
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/Android.mk
+
+include external/stlport/libstlport.mk
+
+include $(BUILD_SHARED_LIBRARY)
+
+else
#----------------------------------------------------------------------------
-# The libbacktrace library using libcorkscrew
+# The native libbacktrace library with libcorkscrew.
#----------------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
- corkscrew.c \
- common.c \
- demangle.c \
- map_info.c \
+ $(common_src) \
+ Corkscrew.cpp \
LOCAL_CFLAGS := \
- -Wall \
- -Wno-unused-parameter \
- -Werror \
- -std=gnu99 \
+ $(common_cflags) \
+
+LOCAL_CONLYFLAGS += \
+ $(common_conlyflags) \
+
+LOCAL_CPPFLAGS += \
+ $(common_cppflags) \
LOCAL_MODULE := libbacktrace
LOCAL_MODULE_TAGS := optional
+LOCAL_C_INCLUDES := \
+ $(common_c_includes) \
+ system/core/libcorkscrew \
+
LOCAL_SHARED_LIBRARIES := \
+ $(common_shared_libs) \
libcorkscrew \
libdl \
- libgccdemangle \
- liblog \
+
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/Android.mk
+
+include external/stlport/libstlport.mk
include $(BUILD_SHARED_LIBRARY)
+endif
+
#----------------------------------------------------------------------------
# libbacktrace test library, all optimizations turned off
#----------------------------------------------------------------------------
@@ -77,6 +119,9 @@
-std=gnu99 \
-O0 \
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/Android.mk
+
include $(BUILD_SHARED_LIBRARY)
#----------------------------------------------------------------------------
@@ -88,16 +133,36 @@
LOCAL_MODULE_FLAGS := debug
LOCAL_SRC_FILES := \
- backtrace_test.c \
+ backtrace_test.cpp \
+ thread_utils.c \
LOCAL_CFLAGS += \
- -std=gnu99 \
+ -fno-builtin \
+ -fstack-protector-all \
+ -O0 \
+ -g \
+ -DGTEST_OS_LINUX_ANDROID \
+ -DGTEST_HAS_STD_STRING \
-LOCAL_SHARED_LIBRARIES := \
+LOCAL_CONLYFLAGS += \
+ $(common_conlyflags) \
+
+LOCAL_CPPFLAGS += \
+ $(common_cppflags) \
+ -fpermissive \
+
+LOCAL_SHARED_LIBRARIES += \
+ libcutils \
libbacktrace_test \
libbacktrace \
-include $(BUILD_EXECUTABLE)
+LOCAL_LDLIBS := \
+ -lpthread \
+
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/Android.mk
+
+include $(BUILD_NATIVE_TEST)
#----------------------------------------------------------------------------
# Only linux-x86 host versions of libbacktrace supported.
@@ -110,22 +175,26 @@
include $(CLEAR_VARS)
LOCAL_SRC_FILES += \
- corkscrew.c \
- common.c \
- demangle.c \
- map_info.c \
+ $(common_src) \
+ Corkscrew.cpp \
LOCAL_CFLAGS += \
- -Wall \
- -Wno-unused-parameter \
- -Werror \
- -std=gnu99 \
+ $(common_cflags) \
+
+LOCAL_CONLYFLAGS += \
+ $(common_conlyflags) \
+
+LOCAL_CPPFLAGS += \
+ $(common_cppflags) \
+
+LOCAL_C_INCLUDES := \
+ $(common_c_includes) \
+ system/core/libcorkscrew \
LOCAL_SHARED_LIBRARIES := \
- liblog \
- libcorkscrew \
libgccdemangle \
liblog \
+ libcorkscrew \
LOCAL_LDLIBS += \
-ldl \
@@ -134,6 +203,9 @@
LOCAL_MODULE := libbacktrace
LOCAL_MODULE_TAGS := optional
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/Android.mk
+
include $(BUILD_HOST_SHARED_LIBRARY)
#----------------------------------------------------------------------------
@@ -151,6 +223,9 @@
-std=gnu99 \
-O0 \
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/Android.mk
+
include $(BUILD_HOST_SHARED_LIBRARY)
#----------------------------------------------------------------------------
@@ -162,15 +237,29 @@
LOCAL_MODULE_FLAGS := debug
LOCAL_SRC_FILES := \
- backtrace_test.c \
+ backtrace_test.cpp \
+ thread_utils.c \
LOCAL_CFLAGS += \
- -std=gnu99 \
+ -fno-builtin \
+ -fstack-protector-all \
+ -O0 \
+ -g \
+ -DGTEST_HAS_STD_STRING \
LOCAL_SHARED_LIBRARIES := \
libbacktrace_test \
libbacktrace \
-include $(BUILD_HOST_EXECUTABLE)
+LOCAL_CPPFLAGS += \
+ -fpermissive \
+
+LOCAL_LDLIBS := \
+ -lpthread \
+
+LOCAL_ADDITIONAL_DEPENDENCIES := \
+ $(LOCAL_PATH)/Android.mk
+
+include $(BUILD_HOST_NATIVE_TEST)
endif # HOST_OS-HOST_ARCH == linux-x86