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