Refactor the logic of resolving source line info into helper class.

http://breakpad.appspot.com/459002/


git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@1068 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
SiyangXie@gmail.com 2012-10-10 21:41:52 +00:00
parent f72b9c6ff4
commit bab770045b
22 changed files with 813 additions and 926 deletions

View file

@ -132,6 +132,7 @@ src_libbreakpad_a_SOURCES = \
src/google_breakpad/processor/source_line_resolver_interface.h \ src/google_breakpad/processor/source_line_resolver_interface.h \
src/google_breakpad/processor/stack_frame.h \ src/google_breakpad/processor/stack_frame.h \
src/google_breakpad/processor/stack_frame_cpu.h \ src/google_breakpad/processor/stack_frame_cpu.h \
src/google_breakpad/processor/stack_frame_symbolizer.h \
src/google_breakpad/processor/stackwalker.h \ src/google_breakpad/processor/stackwalker.h \
src/google_breakpad/processor/symbol_supplier.h \ src/google_breakpad/processor/symbol_supplier.h \
src/google_breakpad/processor/system_info.h \ src/google_breakpad/processor/system_info.h \
@ -183,6 +184,7 @@ src_libbreakpad_a_SOURCES = \
src/processor/windows_frame_info.h \ src/processor/windows_frame_info.h \
src/processor/source_line_resolver_base_types.h \ src/processor/source_line_resolver_base_types.h \
src/processor/source_line_resolver_base.cc \ src/processor/source_line_resolver_base.cc \
src/processor/stack_frame_symbolizer.cc \
src/processor/stackwalker.cc \ src/processor/stackwalker.cc \
src/processor/stackwalker_amd64.cc \ src/processor/stackwalker_amd64.cc \
src/processor/stackwalker_amd64.h \ src/processor/stackwalker_amd64.h \
@ -613,6 +615,7 @@ src_processor_exploitability_unittest_LDADD = \
src/processor/minidump.o \ src/processor/minidump.o \
src/processor/pathname_stripper.o \ src/processor/pathname_stripper.o \
src/processor/source_line_resolver_base.o \ src/processor/source_line_resolver_base.o \
src/processor/stack_frame_symbolizer.o \
src/processor/stackwalker.o \ src/processor/stackwalker.o \
src/processor/stackwalker_amd64.o \ src/processor/stackwalker_amd64.o \
src/processor/stackwalker_arm.o \ src/processor/stackwalker_arm.o \
@ -700,6 +703,7 @@ src_processor_minidump_processor_unittest_LDADD = \
src/processor/pathname_stripper.o \ src/processor/pathname_stripper.o \
src/processor/process_state.o \ src/processor/process_state.o \
src/processor/source_line_resolver_base.o \ src/processor/source_line_resolver_base.o \
src/processor/stack_frame_symbolizer.o \
src/processor/stackwalker.o \ src/processor/stackwalker.o \
src/processor/stackwalker_amd64.o \ src/processor/stackwalker_amd64.o \
src/processor/stackwalker_arm.o \ src/processor/stackwalker_arm.o \
@ -823,6 +827,7 @@ src_processor_stackwalker_selftest_LDADD = \
src/processor/minidump.o \ src/processor/minidump.o \
src/processor/pathname_stripper.o \ src/processor/pathname_stripper.o \
src/processor/source_line_resolver_base.o \ src/processor/source_line_resolver_base.o \
src/processor/stack_frame_symbolizer.o \
src/processor/stackwalker.o \ src/processor/stackwalker.o \
src/processor/stackwalker_amd64.o \ src/processor/stackwalker_amd64.o \
src/processor/stackwalker_arm.o \ src/processor/stackwalker_arm.o \
@ -942,6 +947,7 @@ src_processor_minidump_stackwalk_LDADD = \
src/processor/process_state.o \ src/processor/process_state.o \
src/processor/simple_symbol_supplier.o \ src/processor/simple_symbol_supplier.o \
src/processor/source_line_resolver_base.o \ src/processor/source_line_resolver_base.o \
src/processor/stack_frame_symbolizer.o \
src/processor/stackwalker.o \ src/processor/stackwalker.o \
src/processor/stackwalker_amd64.o \ src/processor/stackwalker_amd64.o \
src/processor/stackwalker_arm.o \ src/processor/stackwalker_arm.o \

View file

@ -1,9 +1,9 @@
# Makefile.in generated by automake 1.11.6 from Makefile.am. # Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
# Foundation, Inc. # Inc.
# This Makefile.in is free software; the Free Software Foundation # This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
@ -48,23 +48,6 @@
VPATH = @srcdir@ VPATH = @srcdir@
am__make_dryrun = \
{ \
am__dry=no; \
case $$MAKEFLAGS in \
*\\[\ \ ]*) \
echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
| grep '^AM OK$$' >/dev/null || am__dry=yes;; \
*) \
for am__flg in $$MAKEFLAGS; do \
case $$am__flg in \
*=*|--*) ;; \
*n*) am__dry=yes; break;; \
esac; \
done;; \
esac; \
test $$am__dry = yes; \
}
pkgdatadir = $(datadir)/@PACKAGE@ pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@
@ -210,12 +193,6 @@ am__nobase_list = $(am__nobase_strip_setup); \
am__base_list = \ am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
am__uninstall_files_from_dir = { \
test -z "$$files" \
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(docdir)" "$(DESTDIR)$(docdir)"
LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES) LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES)
@ -283,6 +260,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/google_breakpad/processor/source_line_resolver_interface.h \ src/google_breakpad/processor/source_line_resolver_interface.h \
src/google_breakpad/processor/stack_frame.h \ src/google_breakpad/processor/stack_frame.h \
src/google_breakpad/processor/stack_frame_cpu.h \ src/google_breakpad/processor/stack_frame_cpu.h \
src/google_breakpad/processor/stack_frame_symbolizer.h \
src/google_breakpad/processor/stackwalker.h \ src/google_breakpad/processor/stackwalker.h \
src/google_breakpad/processor/symbol_supplier.h \ src/google_breakpad/processor/symbol_supplier.h \
src/google_breakpad/processor/system_info.h \ src/google_breakpad/processor/system_info.h \
@ -325,6 +303,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
src/processor/windows_frame_info.h \ src/processor/windows_frame_info.h \
src/processor/source_line_resolver_base_types.h \ src/processor/source_line_resolver_base_types.h \
src/processor/source_line_resolver_base.cc \ src/processor/source_line_resolver_base.cc \
src/processor/stack_frame_symbolizer.cc \
src/processor/stackwalker.cc \ src/processor/stackwalker.cc \
src/processor/stackwalker_amd64.cc \ src/processor/stackwalker_amd64.cc \
src/processor/stackwalker_amd64.h \ src/processor/stackwalker_amd64.h \
@ -364,6 +343,7 @@ am__src_libbreakpad_a_SOURCES_DIST = \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/process_state.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.$(OBJEXT) \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.$(OBJEXT) \
@ -730,6 +710,7 @@ src_processor_exploitability_unittest_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@ -806,6 +787,7 @@ src_processor_minidump_processor_unittest_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@ -837,6 +819,7 @@ src_processor_minidump_stackwalk_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@ -946,6 +929,7 @@ src_processor_stackwalker_selftest_OBJECTS = \
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@ -1222,11 +1206,6 @@ DIST_SOURCES = \
$(am__src_tools_linux_md2core_minidump_2_core_unittest_SOURCES_DIST) \ $(am__src_tools_linux_md2core_minidump_2_core_unittest_SOURCES_DIST) \
$(am__src_tools_linux_symupload_minidump_upload_SOURCES_DIST) \ $(am__src_tools_linux_symupload_minidump_upload_SOURCES_DIST) \
$(am__src_tools_linux_symupload_sym_upload_SOURCES_DIST) $(am__src_tools_linux_symupload_sym_upload_SOURCES_DIST)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \
esac
DATA = $(dist_doc_DATA) DATA = $(dist_doc_DATA)
ETAGS = etags ETAGS = etags
CTAGS = ctags CTAGS = ctags
@ -1236,16 +1215,12 @@ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION) distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir) top_distdir = $(distdir)
am__remove_distdir = \ am__remove_distdir = \
if test -d "$(distdir)"; then \ { test ! -d "$(distdir)" \
find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -rf "$(distdir)" \ && rm -fr "$(distdir)"; }; }
|| { sleep 5 && rm -rf "$(distdir)"; }; \
else :; fi
DIST_ARCHIVES = $(distdir).tar.gz DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print distuninstallcheck_listfiles = find . -type f -print
am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
| sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
distcleancheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@ ACLOCAL = @ACLOCAL@
AMTAR = @AMTAR@ AMTAR = @AMTAR@
@ -1407,6 +1382,7 @@ lib_LIBRARIES = $(am__append_5) $(am__append_7)
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/source_line_resolver_interface.h \ @DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/source_line_resolver_interface.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame.h \ @DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame_cpu.h \ @DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame_cpu.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stack_frame_symbolizer.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stackwalker.h \ @DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/stackwalker.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/symbol_supplier.h \ @DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/symbol_supplier.h \
@DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/system_info.h \ @DISABLE_PROCESSOR_FALSE@ src/google_breakpad/processor/system_info.h \
@ -1458,6 +1434,7 @@ lib_LIBRARIES = $(am__append_5) $(am__append_7)
@DISABLE_PROCESSOR_FALSE@ src/processor/windows_frame_info.h \ @DISABLE_PROCESSOR_FALSE@ src/processor/windows_frame_info.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base_types.h \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base_types.h \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.cc \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.cc \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.cc \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.cc \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.h \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.h \
@ -1803,6 +1780,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@ -1898,6 +1876,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@ -2035,6 +2014,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
@DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/pathname_stripper.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@ -2161,6 +2141,7 @@ TESTS = $(check_PROGRAMS) $(check_SCRIPTS)
@DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/simple_symbol_supplier.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/source_line_resolver_base.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stack_frame_symbolizer.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_amd64.o \
@DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/stackwalker_arm.o \
@ -2311,7 +2292,7 @@ all: all-am
.SUFFIXES: .SUFFIXES:
.SUFFIXES: .S .c .cc .o .obj .SUFFIXES: .S .c .cc .o .obj
am--refresh: Makefile am--refresh:
@: @:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \ @for dep in $?; do \
@ -2347,8 +2328,10 @@ $(ACLOCAL_M4): $(am__aclocal_m4_deps)
$(am__aclocal_m4_deps): $(am__aclocal_m4_deps):
src/config.h: src/stamp-h1 src/config.h: src/stamp-h1
@if test ! -f $@; then rm -f src/stamp-h1; else :; fi @if test ! -f $@; then \
@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; else :; fi rm -f src/stamp-h1; \
$(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; \
else :; fi
src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status
@rm -f src/stamp-h1 @rm -f src/stamp-h1
@ -2362,6 +2345,7 @@ distclean-hdr:
-rm -f src/config.h src/stamp-h1 -rm -f src/config.h src/stamp-h1
install-libLIBRARIES: $(lib_LIBRARIES) install-libLIBRARIES: $(lib_LIBRARIES)
@$(NORMAL_INSTALL) @$(NORMAL_INSTALL)
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
list2=; for p in $$list; do \ list2=; for p in $$list; do \
if test -f $$p; then \ if test -f $$p; then \
@ -2369,8 +2353,6 @@ install-libLIBRARIES: $(lib_LIBRARIES)
else :; fi; \ else :; fi; \
done; \ done; \
test -z "$$list2" || { \ test -z "$$list2" || { \
echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
$(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \ echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
$(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; } $(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
@$(POST_INSTALL) @$(POST_INSTALL)
@ -2387,7 +2369,9 @@ uninstall-libLIBRARIES:
@$(NORMAL_UNINSTALL) @$(NORMAL_UNINSTALL)
@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \ @list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir) test -n "$$files" || exit 0; \
echo " ( cd '$(DESTDIR)$(libdir)' && rm -f "$$files" )"; \
cd "$(DESTDIR)$(libdir)" && rm -f $$files
clean-libLIBRARIES: clean-libLIBRARIES:
-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
@ -2496,7 +2480,7 @@ src/common/android/breakpad_getcontext.$(OBJEXT): \
src/client/linux/$(am__dirstamp): src/client/linux/$(am__dirstamp):
@$(MKDIR_P) src/client/linux @$(MKDIR_P) src/client/linux
@: > src/client/linux/$(am__dirstamp) @: > src/client/linux/$(am__dirstamp)
src/client/linux/libbreakpad_client.a: $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_DEPENDENCIES) $(EXTRA_src_client_linux_libbreakpad_client_a_DEPENDENCIES) src/client/linux/$(am__dirstamp) src/client/linux/libbreakpad_client.a: $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_DEPENDENCIES) src/client/linux/$(am__dirstamp)
-rm -f src/client/linux/libbreakpad_client.a -rm -f src/client/linux/libbreakpad_client.a
$(src_client_linux_libbreakpad_client_a_AR) src/client/linux/libbreakpad_client.a $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_LIBADD) $(src_client_linux_libbreakpad_client_a_AR) src/client/linux/libbreakpad_client.a $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_LIBADD)
$(RANLIB) src/client/linux/libbreakpad_client.a $(RANLIB) src/client/linux/libbreakpad_client.a
@ -2553,6 +2537,9 @@ src/processor/simple_symbol_supplier.$(OBJEXT): \
src/processor/source_line_resolver_base.$(OBJEXT): \ src/processor/source_line_resolver_base.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/stack_frame_symbolizer.$(OBJEXT): \
src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/stackwalker.$(OBJEXT): src/processor/$(am__dirstamp) \ src/processor/stackwalker.$(OBJEXT): src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/stackwalker_amd64.$(OBJEXT): \ src/processor/stackwalker_amd64.$(OBJEXT): \
@ -2575,7 +2562,7 @@ src/processor/tokenize.$(OBJEXT): src/processor/$(am__dirstamp) \
src/$(am__dirstamp): src/$(am__dirstamp):
@$(MKDIR_P) src @$(MKDIR_P) src
@: > src/$(am__dirstamp) @: > src/$(am__dirstamp)
src/libbreakpad.a: $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_DEPENDENCIES) $(EXTRA_src_libbreakpad_a_DEPENDENCIES) src/$(am__dirstamp) src/libbreakpad.a: $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_DEPENDENCIES) src/$(am__dirstamp)
-rm -f src/libbreakpad.a -rm -f src/libbreakpad.a
$(src_libbreakpad_a_AR) src/libbreakpad.a $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_LIBADD) $(src_libbreakpad_a_AR) src/libbreakpad.a $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_LIBADD)
$(RANLIB) src/libbreakpad.a $(RANLIB) src/libbreakpad.a
@ -2627,17 +2614,14 @@ src/third_party/libdisasm/x86_misc.$(OBJEXT): \
src/third_party/libdisasm/x86_operand_list.$(OBJEXT): \ src/third_party/libdisasm/x86_operand_list.$(OBJEXT): \
src/third_party/libdisasm/$(am__dirstamp) \ src/third_party/libdisasm/$(am__dirstamp) \
src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp) src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp)
src/third_party/libdisasm/libdisasm.a: $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_DEPENDENCIES) $(EXTRA_src_third_party_libdisasm_libdisasm_a_DEPENDENCIES) src/third_party/libdisasm/$(am__dirstamp) src/third_party/libdisasm/libdisasm.a: $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_DEPENDENCIES) src/third_party/libdisasm/$(am__dirstamp)
-rm -f src/third_party/libdisasm/libdisasm.a -rm -f src/third_party/libdisasm/libdisasm.a
$(src_third_party_libdisasm_libdisasm_a_AR) src/third_party/libdisasm/libdisasm.a $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_LIBADD) $(src_third_party_libdisasm_libdisasm_a_AR) src/third_party/libdisasm/libdisasm.a $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_LIBADD)
$(RANLIB) src/third_party/libdisasm/libdisasm.a $(RANLIB) src/third_party/libdisasm/libdisasm.a
install-binPROGRAMS: $(bin_PROGRAMS) install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL) @$(NORMAL_INSTALL)
test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
$(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
fi; \
for p in $$list; do echo "$$p $$p"; done | \ for p in $$list; do echo "$$p $$p"; done | \
sed 's/$(EXEEXT)$$//' | \ sed 's/$(EXEEXT)$$//' | \
while read p p1; do if test -f $$p; \ while read p p1; do if test -f $$p; \
@ -2677,7 +2661,7 @@ clean-checkPROGRAMS:
clean-noinstPROGRAMS: clean-noinstPROGRAMS:
-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
src/client/linux/linux_client_unittest$(EXEEXT): $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_DEPENDENCIES) $(EXTRA_src_client_linux_linux_client_unittest_DEPENDENCIES) src/client/linux/$(am__dirstamp) src/client/linux/linux_client_unittest$(EXEEXT): $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_DEPENDENCIES) src/client/linux/$(am__dirstamp)
@rm -f src/client/linux/linux_client_unittest$(EXEEXT) @rm -f src/client/linux/linux_client_unittest$(EXEEXT)
$(src_client_linux_linux_client_unittest_LINK) $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_LDADD) $(LIBS) $(src_client_linux_linux_client_unittest_LINK) $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_LDADD) $(LIBS)
src/client/linux/handler/src_client_linux_linux_client_unittest_shlib-exception_handler_unittest.$(OBJEXT): \ src/client/linux/handler/src_client_linux_linux_client_unittest_shlib-exception_handler_unittest.$(OBJEXT): \
@ -2770,13 +2754,13 @@ src/common/android/src_client_linux_linux_client_unittest_shlib-breakpad_getcont
src/common/android/src_client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.$(OBJEXT): \ src/common/android/src_client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.$(OBJEXT): \
src/common/android/$(am__dirstamp) \ src/common/android/$(am__dirstamp) \
src/common/android/$(DEPDIR)/$(am__dirstamp) src/common/android/$(DEPDIR)/$(am__dirstamp)
src/client/linux/linux_client_unittest_shlib$(EXEEXT): $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_DEPENDENCIES) $(EXTRA_src_client_linux_linux_client_unittest_shlib_DEPENDENCIES) src/client/linux/$(am__dirstamp) src/client/linux/linux_client_unittest_shlib$(EXEEXT): $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_DEPENDENCIES) src/client/linux/$(am__dirstamp)
@rm -f src/client/linux/linux_client_unittest_shlib$(EXEEXT) @rm -f src/client/linux/linux_client_unittest_shlib$(EXEEXT)
$(src_client_linux_linux_client_unittest_shlib_LINK) $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_LDADD) $(LIBS) $(src_client_linux_linux_client_unittest_shlib_LINK) $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_LDADD) $(LIBS)
src/client/linux/minidump_writer/src_client_linux_linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT): \ src/client/linux/minidump_writer/src_client_linux_linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT): \
src/client/linux/minidump_writer/$(am__dirstamp) \ src/client/linux/minidump_writer/$(am__dirstamp) \
src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp) src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp)
src/client/linux/linux_dumper_unittest_helper$(EXEEXT): $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_DEPENDENCIES) $(EXTRA_src_client_linux_linux_dumper_unittest_helper_DEPENDENCIES) src/client/linux/$(am__dirstamp) src/client/linux/linux_dumper_unittest_helper$(EXEEXT): $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_DEPENDENCIES) src/client/linux/$(am__dirstamp)
@rm -f src/client/linux/linux_dumper_unittest_helper$(EXEEXT) @rm -f src/client/linux/linux_dumper_unittest_helper$(EXEEXT)
$(src_client_linux_linux_dumper_unittest_helper_LINK) $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_LDADD) $(LIBS) $(src_client_linux_linux_dumper_unittest_helper_LINK) $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_LDADD) $(LIBS)
src/common/src_common_dumper_unittest-byte_cursor_unittest.$(OBJEXT): \ src/common/src_common_dumper_unittest-byte_cursor_unittest.$(OBJEXT): \
@ -2920,7 +2904,7 @@ src/testing/gtest/src/src_common_dumper_unittest-gtest_main.$(OBJEXT): \
src/testing/src/src_common_dumper_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_common_dumper_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/common/dumper_unittest$(EXEEXT): $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_DEPENDENCIES) $(EXTRA_src_common_dumper_unittest_DEPENDENCIES) src/common/$(am__dirstamp) src/common/dumper_unittest$(EXEEXT): $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_DEPENDENCIES) src/common/$(am__dirstamp)
@rm -f src/common/dumper_unittest$(EXEEXT) @rm -f src/common/dumper_unittest$(EXEEXT)
$(CXXLINK) $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_LDADD) $(LIBS)
src/common/src_common_test_assembler_unittest-test_assembler.$(OBJEXT): \ src/common/src_common_test_assembler_unittest-test_assembler.$(OBJEXT): \
@ -2938,13 +2922,13 @@ src/testing/gtest/src/src_common_test_assembler_unittest-gtest_main.$(OBJEXT):
src/testing/src/src_common_test_assembler_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_common_test_assembler_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/common/test_assembler_unittest$(EXEEXT): $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_DEPENDENCIES) $(EXTRA_src_common_test_assembler_unittest_DEPENDENCIES) src/common/$(am__dirstamp) src/common/test_assembler_unittest$(EXEEXT): $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_DEPENDENCIES) src/common/$(am__dirstamp)
@rm -f src/common/test_assembler_unittest$(EXEEXT) @rm -f src/common/test_assembler_unittest$(EXEEXT)
$(CXXLINK) $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_LDADD) $(LIBS)
src/processor/address_map_unittest.$(OBJEXT): \ src/processor/address_map_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/address_map_unittest$(EXEEXT): $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/address_map_unittest$(EXEEXT): $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/address_map_unittest$(EXEEXT) @rm -f src/processor/address_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_LDADD) $(LIBS)
src/processor/src_processor_basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.$(OBJEXT): \ src/processor/src_processor_basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.$(OBJEXT): \
@ -2956,7 +2940,7 @@ src/testing/gtest/src/src_processor_basic_source_line_resolver_unittest-gtest-al
src/testing/src/src_processor_basic_source_line_resolver_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_basic_source_line_resolver_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/basic_source_line_resolver_unittest$(EXEEXT): $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_DEPENDENCIES) $(EXTRA_src_processor_basic_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/basic_source_line_resolver_unittest$(EXEEXT): $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/basic_source_line_resolver_unittest$(EXEEXT) @rm -f src/processor/basic_source_line_resolver_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_LDADD) $(LIBS)
src/processor/src_processor_binarystream_unittest-binarystream_unittest.$(OBJEXT): \ src/processor/src_processor_binarystream_unittest-binarystream_unittest.$(OBJEXT): \
@ -2968,7 +2952,7 @@ src/testing/gtest/src/src_processor_binarystream_unittest-gtest-all.$(OBJEXT):
src/testing/src/src_processor_binarystream_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_binarystream_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/binarystream_unittest$(EXEEXT): $(src_processor_binarystream_unittest_OBJECTS) $(src_processor_binarystream_unittest_DEPENDENCIES) $(EXTRA_src_processor_binarystream_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/binarystream_unittest$(EXEEXT): $(src_processor_binarystream_unittest_OBJECTS) $(src_processor_binarystream_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/binarystream_unittest$(EXEEXT) @rm -f src/processor/binarystream_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_binarystream_unittest_OBJECTS) $(src_processor_binarystream_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_binarystream_unittest_OBJECTS) $(src_processor_binarystream_unittest_LDADD) $(LIBS)
src/processor/src_processor_cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT): \ src/processor/src_processor_cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT): \
@ -2983,13 +2967,13 @@ src/testing/gtest/src/src_processor_cfi_frame_info_unittest-gtest_main.$(OBJEXT)
src/testing/src/src_processor_cfi_frame_info_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_cfi_frame_info_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/cfi_frame_info_unittest$(EXEEXT): $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_DEPENDENCIES) $(EXTRA_src_processor_cfi_frame_info_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/cfi_frame_info_unittest$(EXEEXT): $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/cfi_frame_info_unittest$(EXEEXT) @rm -f src/processor/cfi_frame_info_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_LDADD) $(LIBS)
src/processor/contained_range_map_unittest.$(OBJEXT): \ src/processor/contained_range_map_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/contained_range_map_unittest$(EXEEXT): $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/contained_range_map_unittest$(EXEEXT): $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/contained_range_map_unittest$(EXEEXT) @rm -f src/processor/contained_range_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_LDADD) $(LIBS)
src/processor/src_processor_disassembler_x86_unittest-disassembler_x86_unittest.$(OBJEXT): \ src/processor/src_processor_disassembler_x86_unittest-disassembler_x86_unittest.$(OBJEXT): \
@ -3004,7 +2988,7 @@ src/testing/gtest/src/src_processor_disassembler_x86_unittest-gtest_main.$(OBJEX
src/testing/src/src_processor_disassembler_x86_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_disassembler_x86_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/disassembler_x86_unittest$(EXEEXT): $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_DEPENDENCIES) $(EXTRA_src_processor_disassembler_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/disassembler_x86_unittest$(EXEEXT): $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/disassembler_x86_unittest$(EXEEXT) @rm -f src/processor/disassembler_x86_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_LDADD) $(LIBS)
src/processor/src_processor_exploitability_unittest-exploitability_unittest.$(OBJEXT): \ src/processor/src_processor_exploitability_unittest-exploitability_unittest.$(OBJEXT): \
@ -3019,7 +3003,7 @@ src/testing/gtest/src/src_processor_exploitability_unittest-gtest_main.$(OBJEXT)
src/testing/src/src_processor_exploitability_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_exploitability_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/exploitability_unittest$(EXEEXT): $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_DEPENDENCIES) $(EXTRA_src_processor_exploitability_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/exploitability_unittest$(EXEEXT): $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/exploitability_unittest$(EXEEXT) @rm -f src/processor/exploitability_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_LDADD) $(LIBS)
src/processor/src_processor_fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.$(OBJEXT): \ src/processor/src_processor_fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.$(OBJEXT): \
@ -3031,7 +3015,7 @@ src/testing/gtest/src/src_processor_fast_source_line_resolver_unittest-gtest-all
src/testing/src/src_processor_fast_source_line_resolver_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_fast_source_line_resolver_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/fast_source_line_resolver_unittest$(EXEEXT): $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_DEPENDENCIES) $(EXTRA_src_processor_fast_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/fast_source_line_resolver_unittest$(EXEEXT): $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/fast_source_line_resolver_unittest$(EXEEXT) @rm -f src/processor/fast_source_line_resolver_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_LDADD) $(LIBS)
src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.$(OBJEXT): \ src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.$(OBJEXT): \
@ -3043,12 +3027,12 @@ src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.$(OBJEXT)
src/testing/src/src_processor_map_serializers_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_map_serializers_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/map_serializers_unittest$(EXEEXT): $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_DEPENDENCIES) $(EXTRA_src_processor_map_serializers_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/map_serializers_unittest$(EXEEXT): $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/map_serializers_unittest$(EXEEXT) @rm -f src/processor/map_serializers_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_LDADD) $(LIBS)
src/processor/minidump_dump.$(OBJEXT): src/processor/$(am__dirstamp) \ src/processor/minidump_dump.$(OBJEXT): src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/minidump_dump$(EXEEXT): $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_DEPENDENCIES) $(EXTRA_src_processor_minidump_dump_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/minidump_dump$(EXEEXT): $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/minidump_dump$(EXEEXT) @rm -f src/processor/minidump_dump$(EXEEXT)
$(CXXLINK) $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_LDADD) $(LIBS) $(CXXLINK) $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_LDADD) $(LIBS)
src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT): \ src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT): \
@ -3060,13 +3044,13 @@ src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.$(OBJE
src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/minidump_processor_unittest$(EXEEXT): $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_DEPENDENCIES) $(EXTRA_src_processor_minidump_processor_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/minidump_processor_unittest$(EXEEXT): $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/minidump_processor_unittest$(EXEEXT) @rm -f src/processor/minidump_processor_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_LDADD) $(LIBS)
src/processor/minidump_stackwalk.$(OBJEXT): \ src/processor/minidump_stackwalk.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/minidump_stackwalk$(EXEEXT): $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_DEPENDENCIES) $(EXTRA_src_processor_minidump_stackwalk_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/minidump_stackwalk$(EXEEXT): $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/minidump_stackwalk$(EXEEXT) @rm -f src/processor/minidump_stackwalk$(EXEEXT)
$(CXXLINK) $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_LDADD) $(LIBS) $(CXXLINK) $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_LDADD) $(LIBS)
src/common/src_processor_minidump_unittest-test_assembler.$(OBJEXT): \ src/common/src_processor_minidump_unittest-test_assembler.$(OBJEXT): \
@ -3087,25 +3071,25 @@ src/testing/gtest/src/src_processor_minidump_unittest-gtest_main.$(OBJEXT): \
src/testing/src/src_processor_minidump_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_minidump_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/minidump_unittest$(EXEEXT): $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_DEPENDENCIES) $(EXTRA_src_processor_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/minidump_unittest$(EXEEXT): $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/minidump_unittest$(EXEEXT) @rm -f src/processor/minidump_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_LDADD) $(LIBS)
src/processor/pathname_stripper_unittest.$(OBJEXT): \ src/processor/pathname_stripper_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/pathname_stripper_unittest$(EXEEXT): $(src_processor_pathname_stripper_unittest_OBJECTS) $(src_processor_pathname_stripper_unittest_DEPENDENCIES) $(EXTRA_src_processor_pathname_stripper_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/pathname_stripper_unittest$(EXEEXT): $(src_processor_pathname_stripper_unittest_OBJECTS) $(src_processor_pathname_stripper_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/pathname_stripper_unittest$(EXEEXT) @rm -f src/processor/pathname_stripper_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_pathname_stripper_unittest_OBJECTS) $(src_processor_pathname_stripper_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_pathname_stripper_unittest_OBJECTS) $(src_processor_pathname_stripper_unittest_LDADD) $(LIBS)
src/processor/postfix_evaluator_unittest.$(OBJEXT): \ src/processor/postfix_evaluator_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/postfix_evaluator_unittest$(EXEEXT): $(src_processor_postfix_evaluator_unittest_OBJECTS) $(src_processor_postfix_evaluator_unittest_DEPENDENCIES) $(EXTRA_src_processor_postfix_evaluator_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/postfix_evaluator_unittest$(EXEEXT): $(src_processor_postfix_evaluator_unittest_OBJECTS) $(src_processor_postfix_evaluator_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/postfix_evaluator_unittest$(EXEEXT) @rm -f src/processor/postfix_evaluator_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_postfix_evaluator_unittest_OBJECTS) $(src_processor_postfix_evaluator_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_postfix_evaluator_unittest_OBJECTS) $(src_processor_postfix_evaluator_unittest_LDADD) $(LIBS)
src/processor/range_map_unittest.$(OBJEXT): \ src/processor/range_map_unittest.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/range_map_unittest$(EXEEXT): $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/range_map_unittest$(EXEEXT): $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/range_map_unittest$(EXEEXT) @rm -f src/processor/range_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_LDADD) $(LIBS)
src/common/src_processor_stackwalker_amd64_unittest-test_assembler.$(OBJEXT): \ src/common/src_processor_stackwalker_amd64_unittest-test_assembler.$(OBJEXT): \
@ -3123,7 +3107,7 @@ src/testing/gtest/src/src_processor_stackwalker_amd64_unittest-gtest_main.$(OBJE
src/testing/src/src_processor_stackwalker_amd64_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_stackwalker_amd64_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/stackwalker_amd64_unittest$(EXEEXT): $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_amd64_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/stackwalker_amd64_unittest$(EXEEXT): $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/stackwalker_amd64_unittest$(EXEEXT) @rm -f src/processor/stackwalker_amd64_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_LDADD) $(LIBS)
src/common/src_processor_stackwalker_arm_unittest-test_assembler.$(OBJEXT): \ src/common/src_processor_stackwalker_arm_unittest-test_assembler.$(OBJEXT): \
@ -3141,13 +3125,13 @@ src/testing/gtest/src/src_processor_stackwalker_arm_unittest-gtest_main.$(OBJEXT
src/testing/src/src_processor_stackwalker_arm_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_stackwalker_arm_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/stackwalker_arm_unittest$(EXEEXT): $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_arm_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/stackwalker_arm_unittest$(EXEEXT): $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/stackwalker_arm_unittest$(EXEEXT) @rm -f src/processor/stackwalker_arm_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_LDADD) $(LIBS)
src/processor/stackwalker_selftest.$(OBJEXT): \ src/processor/stackwalker_selftest.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/stackwalker_selftest$(EXEEXT): $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_selftest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/stackwalker_selftest$(EXEEXT): $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/stackwalker_selftest$(EXEEXT) @rm -f src/processor/stackwalker_selftest$(EXEEXT)
$(CXXLINK) $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_LDADD) $(LIBS)
src/common/src_processor_stackwalker_x86_unittest-test_assembler.$(OBJEXT): \ src/common/src_processor_stackwalker_x86_unittest-test_assembler.$(OBJEXT): \
@ -3165,7 +3149,7 @@ src/testing/gtest/src/src_processor_stackwalker_x86_unittest-gtest_main.$(OBJEXT
src/testing/src/src_processor_stackwalker_x86_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_stackwalker_x86_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/stackwalker_x86_unittest$(EXEEXT): $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/stackwalker_x86_unittest$(EXEEXT): $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/stackwalker_x86_unittest$(EXEEXT) @rm -f src/processor/stackwalker_x86_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_LDADD) $(LIBS)
src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.$(OBJEXT): \ src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.$(OBJEXT): \
@ -3177,7 +3161,7 @@ src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.$(OBJE
src/testing/src/src_processor_static_address_map_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_static_address_map_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/static_address_map_unittest$(EXEEXT): $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/static_address_map_unittest$(EXEEXT): $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/static_address_map_unittest$(EXEEXT) @rm -f src/processor/static_address_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_LDADD) $(LIBS)
src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT): \ src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT): \
@ -3189,7 +3173,7 @@ src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-al
src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/static_contained_range_map_unittest$(EXEEXT): $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/static_contained_range_map_unittest$(EXEEXT): $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/static_contained_range_map_unittest$(EXEEXT) @rm -f src/processor/static_contained_range_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_LDADD) $(LIBS)
src/processor/src_processor_static_map_unittest-static_map_unittest.$(OBJEXT): \ src/processor/src_processor_static_map_unittest-static_map_unittest.$(OBJEXT): \
@ -3201,7 +3185,7 @@ src/testing/gtest/src/src_processor_static_map_unittest-gtest-all.$(OBJEXT): \
src/testing/src/src_processor_static_map_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_static_map_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/static_map_unittest$(EXEEXT): $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/static_map_unittest$(EXEEXT): $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/static_map_unittest$(EXEEXT) @rm -f src/processor/static_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_LDADD) $(LIBS)
src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.$(OBJEXT): \ src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.$(OBJEXT): \
@ -3213,7 +3197,7 @@ src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.$(OBJEXT
src/testing/src/src_processor_static_range_map_unittest-gmock-all.$(OBJEXT): \ src/testing/src/src_processor_static_range_map_unittest-gmock-all.$(OBJEXT): \
src/testing/src/$(am__dirstamp) \ src/testing/src/$(am__dirstamp) \
src/testing/src/$(DEPDIR)/$(am__dirstamp) src/testing/src/$(DEPDIR)/$(am__dirstamp)
src/processor/static_range_map_unittest$(EXEEXT): $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/static_range_map_unittest$(EXEEXT): $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/static_range_map_unittest$(EXEEXT) @rm -f src/processor/static_range_map_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_LDADD) $(LIBS)
src/common/src_processor_synth_minidump_unittest-test_assembler.$(OBJEXT): \ src/common/src_processor_synth_minidump_unittest-test_assembler.$(OBJEXT): \
@ -3234,7 +3218,7 @@ src/testing/src/src_processor_synth_minidump_unittest-gmock-all.$(OBJEXT): \
src/processor/src_processor_synth_minidump_unittest-synth_minidump.$(OBJEXT): \ src/processor/src_processor_synth_minidump_unittest-synth_minidump.$(OBJEXT): \
src/processor/$(am__dirstamp) \ src/processor/$(am__dirstamp) \
src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/$(DEPDIR)/$(am__dirstamp)
src/processor/synth_minidump_unittest$(EXEEXT): $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_DEPENDENCIES) $(EXTRA_src_processor_synth_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp) src/processor/synth_minidump_unittest$(EXEEXT): $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
@rm -f src/processor/synth_minidump_unittest$(EXEEXT) @rm -f src/processor/synth_minidump_unittest$(EXEEXT)
$(CXXLINK) $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_LDADD) $(LIBS)
src/tools/linux/core2md/$(am__dirstamp): src/tools/linux/core2md/$(am__dirstamp):
@ -3252,7 +3236,7 @@ src/client/linux/minidump_writer/linux_core_dumper.$(OBJEXT): \
src/common/linux/elf_core_dump.$(OBJEXT): \ src/common/linux/elf_core_dump.$(OBJEXT): \
src/common/linux/$(am__dirstamp) \ src/common/linux/$(am__dirstamp) \
src/common/linux/$(DEPDIR)/$(am__dirstamp) src/common/linux/$(DEPDIR)/$(am__dirstamp)
src/tools/linux/core2md/core2md$(EXEEXT): $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_DEPENDENCIES) $(EXTRA_src_tools_linux_core2md_core2md_DEPENDENCIES) src/tools/linux/core2md/$(am__dirstamp) src/tools/linux/core2md/core2md$(EXEEXT): $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_DEPENDENCIES) src/tools/linux/core2md/$(am__dirstamp)
@rm -f src/tools/linux/core2md/core2md$(EXEEXT) @rm -f src/tools/linux/core2md/core2md$(EXEEXT)
$(CXXLINK) $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_LDADD) $(LIBS) $(CXXLINK) $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_LDADD) $(LIBS)
src/common/dwarf_cfi_to_module.$(OBJEXT): src/common/$(am__dirstamp) \ src/common/dwarf_cfi_to_module.$(OBJEXT): src/common/$(am__dirstamp) \
@ -3293,7 +3277,7 @@ src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp):
src/tools/linux/dump_syms/dump_syms.$(OBJEXT): \ src/tools/linux/dump_syms/dump_syms.$(OBJEXT): \
src/tools/linux/dump_syms/$(am__dirstamp) \ src/tools/linux/dump_syms/$(am__dirstamp) \
src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp) src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp)
src/tools/linux/dump_syms/dump_syms$(EXEEXT): $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_DEPENDENCIES) $(EXTRA_src_tools_linux_dump_syms_dump_syms_DEPENDENCIES) src/tools/linux/dump_syms/$(am__dirstamp) src/tools/linux/dump_syms/dump_syms$(EXEEXT): $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_DEPENDENCIES) src/tools/linux/dump_syms/$(am__dirstamp)
@rm -f src/tools/linux/dump_syms/dump_syms$(EXEEXT) @rm -f src/tools/linux/dump_syms/dump_syms$(EXEEXT)
$(CXXLINK) $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_LDADD) $(LIBS) $(CXXLINK) $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_LDADD) $(LIBS)
src/tools/linux/md2core/$(am__dirstamp): src/tools/linux/md2core/$(am__dirstamp):
@ -3305,7 +3289,7 @@ src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp):
src/tools/linux/md2core/minidump-2-core.$(OBJEXT): \ src/tools/linux/md2core/minidump-2-core.$(OBJEXT): \
src/tools/linux/md2core/$(am__dirstamp) \ src/tools/linux/md2core/$(am__dirstamp) \
src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp) src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp)
src/tools/linux/md2core/minidump-2-core$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_DEPENDENCIES) $(EXTRA_src_tools_linux_md2core_minidump_2_core_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp) src/tools/linux/md2core/minidump-2-core$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp)
@rm -f src/tools/linux/md2core/minidump-2-core$(EXEEXT) @rm -f src/tools/linux/md2core/minidump-2-core$(EXEEXT)
$(CXXLINK) $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_LDADD) $(LIBS) $(CXXLINK) $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_LDADD) $(LIBS)
src/testing/gtest/src/src_tools_linux_md2core_minidump_2_core_unittest-gtest-all.$(OBJEXT): \ src/testing/gtest/src/src_tools_linux_md2core_minidump_2_core_unittest-gtest-all.$(OBJEXT): \
@ -3320,7 +3304,7 @@ src/testing/src/src_tools_linux_md2core_minidump_2_core_unittest-gmock-all.$(OBJ
src/tools/linux/md2core/src_tools_linux_md2core_minidump_2_core_unittest-minidump_memory_range_unittest.$(OBJEXT): \ src/tools/linux/md2core/src_tools_linux_md2core_minidump_2_core_unittest-minidump_memory_range_unittest.$(OBJEXT): \
src/tools/linux/md2core/$(am__dirstamp) \ src/tools/linux/md2core/$(am__dirstamp) \
src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp) src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp)
src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES) $(EXTRA_src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp) src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp)
@rm -f src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT) @rm -f src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT)
$(CXXLINK) $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_LDADD) $(LIBS) $(CXXLINK) $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_LDADD) $(LIBS)
src/common/linux/http_upload.$(OBJEXT): \ src/common/linux/http_upload.$(OBJEXT): \
@ -3335,13 +3319,13 @@ src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp):
src/tools/linux/symupload/minidump_upload.$(OBJEXT): \ src/tools/linux/symupload/minidump_upload.$(OBJEXT): \
src/tools/linux/symupload/$(am__dirstamp) \ src/tools/linux/symupload/$(am__dirstamp) \
src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp) src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp)
src/tools/linux/symupload/minidump_upload$(EXEEXT): $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_DEPENDENCIES) $(EXTRA_src_tools_linux_symupload_minidump_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp) src/tools/linux/symupload/minidump_upload$(EXEEXT): $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp)
@rm -f src/tools/linux/symupload/minidump_upload$(EXEEXT) @rm -f src/tools/linux/symupload/minidump_upload$(EXEEXT)
$(CXXLINK) $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_LDADD) $(LIBS) $(CXXLINK) $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_LDADD) $(LIBS)
src/tools/linux/symupload/sym_upload.$(OBJEXT): \ src/tools/linux/symupload/sym_upload.$(OBJEXT): \
src/tools/linux/symupload/$(am__dirstamp) \ src/tools/linux/symupload/$(am__dirstamp) \
src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp) src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp)
src/tools/linux/symupload/sym_upload$(EXEEXT): $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_DEPENDENCIES) $(EXTRA_src_tools_linux_symupload_sym_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp) src/tools/linux/symupload/sym_upload$(EXEEXT): $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp)
@rm -f src/tools/linux/symupload/sym_upload$(EXEEXT) @rm -f src/tools/linux/symupload/sym_upload$(EXEEXT)
$(CXXLINK) $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_LDADD) $(LIBS) $(CXXLINK) $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_LDADD) $(LIBS)
@ -3494,6 +3478,7 @@ mostlyclean-compile:
-rm -f src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.$(OBJEXT) -rm -f src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.$(OBJEXT)
-rm -f src/processor/src_processor_synth_minidump_unittest-synth_minidump.$(OBJEXT) -rm -f src/processor/src_processor_synth_minidump_unittest-synth_minidump.$(OBJEXT)
-rm -f src/processor/src_processor_synth_minidump_unittest-synth_minidump_unittest.$(OBJEXT) -rm -f src/processor/src_processor_synth_minidump_unittest-synth_minidump_unittest.$(OBJEXT)
-rm -f src/processor/stack_frame_symbolizer.$(OBJEXT)
-rm -f src/processor/stackwalker.$(OBJEXT) -rm -f src/processor/stackwalker.$(OBJEXT)
-rm -f src/processor/stackwalker_amd64.$(OBJEXT) -rm -f src/processor/stackwalker_amd64.$(OBJEXT)
-rm -f src/processor/stackwalker_arm.$(OBJEXT) -rm -f src/processor/stackwalker_arm.$(OBJEXT)
@ -3727,6 +3712,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_static_range_map_unittest-static_range_map_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_synth_minidump_unittest-synth_minidump.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_synth_minidump_unittest-synth_minidump.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_synth_minidump_unittest-synth_minidump_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_synth_minidump_unittest-synth_minidump_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stack_frame_symbolizer.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_amd64.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_amd64.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_arm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_arm.Po@am__quote@
@ -5861,11 +5847,8 @@ src/tools/linux/md2core/src_tools_linux_md2core_minidump_2_core_unittest-minidum
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/linux/md2core/src_tools_linux_md2core_minidump_2_core_unittest-minidump_memory_range_unittest.obj `if test -f 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; then $(CYGPATH_W) 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/linux/md2core/minidump_memory_range_unittest.cc'; fi` @am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/linux/md2core/src_tools_linux_md2core_minidump_2_core_unittest-minidump_memory_range_unittest.obj `if test -f 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; then $(CYGPATH_W) 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/linux/md2core/minidump_memory_range_unittest.cc'; fi`
install-dist_docDATA: $(dist_doc_DATA) install-dist_docDATA: $(dist_doc_DATA)
@$(NORMAL_INSTALL) @$(NORMAL_INSTALL)
test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)"
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
$(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
fi; \
for p in $$list; do \ for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \ echo "$$d$$p"; \
@ -5879,7 +5862,9 @@ uninstall-dist_docDATA:
@$(NORMAL_UNINSTALL) @$(NORMAL_UNINSTALL)
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) test -n "$$files" || exit 0; \
echo " ( cd '$(DESTDIR)$(docdir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(docdir)" && rm -f $$files
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@ -6014,15 +5999,14 @@ check-TESTS: $(TESTS)
fi; \ fi; \
dashes=`echo "$$dashes" | sed s/./=/g`; \ dashes=`echo "$$dashes" | sed s/./=/g`; \
if test "$$failed" -eq 0; then \ if test "$$failed" -eq 0; then \
col="$$grn"; \ echo "$$grn$$dashes"; \
else \ else \
col="$$red"; \ echo "$$red$$dashes"; \
fi; \ fi; \
echo "$${col}$$dashes$${std}"; \ echo "$$banner"; \
echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$$skipped"; \
test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$$report"; \
test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$$dashes$$std"; \
echo "$${col}$$dashes$${std}"; \
test "$$failed" -eq 0; \ test "$$failed" -eq 0; \
else :; fi else :; fi
@ -6070,11 +6054,7 @@ dist-gzip: distdir
$(am__remove_distdir) $(am__remove_distdir)
dist-bzip2: distdir dist-bzip2: distdir
tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-lzip: distdir
tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
$(am__remove_distdir) $(am__remove_distdir)
dist-lzma: distdir dist-lzma: distdir
@ -6082,7 +6062,7 @@ dist-lzma: distdir
$(am__remove_distdir) $(am__remove_distdir)
dist-xz: distdir dist-xz: distdir
tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
$(am__remove_distdir) $(am__remove_distdir)
dist-tarZ: distdir dist-tarZ: distdir
@ -6113,8 +6093,6 @@ distcheck: dist
bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.lzma*) \ *.tar.lzma*) \
lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
*.tar.lz*) \
lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
*.tar.xz*) \ *.tar.xz*) \
xz -dc $(distdir).tar.xz | $(am__untar) ;;\ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
*.tar.Z*) \ *.tar.Z*) \
@ -6124,7 +6102,7 @@ distcheck: dist
*.zip*) \ *.zip*) \
unzip $(distdir).zip ;;\ unzip $(distdir).zip ;;\
esac esac
chmod -R a-w $(distdir); chmod u+w $(distdir) chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/_build mkdir $(distdir)/_build
mkdir $(distdir)/_inst mkdir $(distdir)/_inst
chmod a-w $(distdir) chmod a-w $(distdir)
@ -6134,7 +6112,6 @@ distcheck: dist
&& am__cwd=`pwd` \ && am__cwd=`pwd` \
&& $(am__cd) $(distdir)/_build \ && $(am__cd) $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
$(DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) dvi \
@ -6163,16 +6140,8 @@ distcheck: dist
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
distuninstallcheck: distuninstallcheck:
@test -n '$(distuninstallcheck_dir)' || { \ @$(am__cd) '$(distuninstallcheck_dir)' \
echo 'ERROR: trying to run $@ with an empty' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
'$$(distuninstallcheck_dir)' >&2; \
exit 1; \
}; \
$(am__cd) '$(distuninstallcheck_dir)' || { \
echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
exit 1; \
}; \
test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left after uninstall:" ; \ || { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \ if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \ echo " (check DESTDIR support)"; \
@ -6207,15 +6176,10 @@ install-am: all-am
installcheck: installcheck-am installcheck: installcheck-am
install-strip: install-strip:
if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \
install; \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic: mostlyclean-generic:
clean-generic: clean-generic:
@ -6347,8 +6311,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-dist_docDATA \
.PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \ .PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \
clean clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
clean-libLIBRARIES clean-noinstLIBRARIES clean-noinstPROGRAMS \ clean-libLIBRARIES clean-noinstLIBRARIES clean-noinstPROGRAMS \
ctags dist dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma \ ctags dist dist-all dist-bzip2 dist-gzip dist-lzma dist-shar \
dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \ dist-tarZ dist-xz dist-zip distcheck distclean \
distclean-compile distclean-generic distclean-hdr \ distclean-compile distclean-generic distclean-hdr \
distclean-tags distcleancheck distdir distuninstallcheck dvi \ distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am html html-am info info-am install install-am \ dvi-am html html-am info info-am install install-am \

76
aclocal.m4 vendored
View file

@ -1,8 +1,7 @@
# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # generated automatically by aclocal 1.11.1 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
# Inc.
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
@ -14,21 +13,18 @@
m4_ifndef([AC_AUTOCONF_VERSION], m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
[m4_warning([this file was generated for autoconf 2.69. [m4_warning([this file was generated for autoconf 2.65.
You have another version of autoconf. It may work, but is not guaranteed to. You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely. If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically `autoreconf'.])]) To do so, use the procedure documented by the package, typically `autoreconf'.])])
# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 1
# AM_AUTOMAKE_VERSION(VERSION) # AM_AUTOMAKE_VERSION(VERSION)
# ---------------------------- # ----------------------------
# Automake X.Y traces this macro to ensure aclocal.m4 has been # Automake X.Y traces this macro to ensure aclocal.m4 has been
@ -38,7 +34,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
[am__api_version='1.11' [am__api_version='1.11'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro. dnl require some minimum version. Point them to the right macro.
m4_if([$1], [1.11.6], [], m4_if([$1], [1.11.1], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
]) ])
@ -54,7 +50,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
[AM_AUTOMAKE_VERSION([1.11.6])dnl [AM_AUTOMAKE_VERSION([1.11.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION], m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@ -83,14 +79,12 @@ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
# AM_AUX_DIR_EXPAND -*- Autoconf -*- # AM_AUX_DIR_EXPAND -*- Autoconf -*-
# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 1
# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
# `$srcdir', `$srcdir/..', or `$srcdir/../..'. # `$srcdir', `$srcdir/..', or `$srcdir/../..'.
@ -172,14 +166,14 @@ AC_CONFIG_COMMANDS_PRE(
Usually this means the macro was only invoked conditionally.]]) Usually this means the macro was only invoked conditionally.]])
fi])]) fi])])
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
# 2010, 2011 Free Software Foundation, Inc. # Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 12 # serial 10
# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
# written in clear, in which case automake, when reading aclocal.m4, # written in clear, in which case automake, when reading aclocal.m4,
@ -219,7 +213,6 @@ AC_CACHE_CHECK([dependency style of $depcc],
# instance it was reported that on HP-UX the gcc test will end up # instance it was reported that on HP-UX the gcc test will end up
# making a dummy file named `D' -- because `-MD' means `put the output # making a dummy file named `D' -- because `-MD' means `put the output
# in D'. # in D'.
rm -rf conftest.dir
mkdir conftest.dir mkdir conftest.dir
# Copy depcomp to subdir because otherwise we won't find it if we're # Copy depcomp to subdir because otherwise we won't find it if we're
# using a relative directory. # using a relative directory.
@ -284,7 +277,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
break break
fi fi
;; ;;
msvc7 | msvc7msys | msvisualcpp | msvcmsys) msvisualcpp | msvcmsys)
# This compiler won't grok `-c -o', but also, the minuso test has # This compiler won't grok `-c -o', but also, the minuso test has
# not run yet. These depmodes are late enough in the game, and # not run yet. These depmodes are late enough in the game, and
# so weak that their functioning should not be impacted. # so weak that their functioning should not be impacted.
@ -349,13 +342,10 @@ AC_DEFUN([AM_DEP_TRACK],
if test "x$enable_dependency_tracking" != xno; then if test "x$enable_dependency_tracking" != xno; then
am_depcomp="$ac_aux_dir/depcomp" am_depcomp="$ac_aux_dir/depcomp"
AMDEPBACKSLASH='\' AMDEPBACKSLASH='\'
am__nodep='_no'
fi fi
AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
AC_SUBST([AMDEPBACKSLASH])dnl AC_SUBST([AMDEPBACKSLASH])dnl
_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
AC_SUBST([am__nodep])dnl
_AM_SUBST_NOTMAKE([am__nodep])dnl
]) ])
# Generate code to set up dependency tracking. -*- Autoconf -*- # Generate code to set up dependency tracking. -*- Autoconf -*-
@ -589,15 +579,12 @@ for _am_header in $config_headers :; do
done done
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc.
# Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 1
# AM_PROG_INSTALL_SH # AM_PROG_INSTALL_SH
# ------------------ # ------------------
# Define $install_sh. # Define $install_sh.
@ -764,15 +751,12 @@ else
fi fi
]) ])
# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
# Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 1
# AM_PROG_MKDIR_P # AM_PROG_MKDIR_P
# --------------- # ---------------
# Check for `mkdir -p'. # Check for `mkdir -p'.
@ -795,14 +779,13 @@ esac
# Helper functions for option handling. -*- Autoconf -*- # Helper functions for option handling. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
# Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 5 # serial 4
# _AM_MANGLE_OPTION(NAME) # _AM_MANGLE_OPTION(NAME)
# ----------------------- # -----------------------
@ -810,13 +793,13 @@ AC_DEFUN([_AM_MANGLE_OPTION],
[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
# _AM_SET_OPTION(NAME) # _AM_SET_OPTION(NAME)
# -------------------- # ------------------------------
# Set option NAME. Presently that only means defining a flag for this option. # Set option NAME. Presently that only means defining a flag for this option.
AC_DEFUN([_AM_SET_OPTION], AC_DEFUN([_AM_SET_OPTION],
[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) [m4_define(_AM_MANGLE_OPTION([$1]), 1)])
# _AM_SET_OPTIONS(OPTIONS) # _AM_SET_OPTIONS(OPTIONS)
# ------------------------ # ----------------------------------
# OPTIONS is a space-separated list of Automake options. # OPTIONS is a space-separated list of Automake options.
AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_SET_OPTIONS],
[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
@ -827,14 +810,12 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION], AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 1
# AM_RUN_LOG(COMMAND) # AM_RUN_LOG(COMMAND)
# ------------------- # -------------------
# Run COMMAND, save the exit status in ac_status, and log it. # Run COMMAND, save the exit status in ac_status, and log it.
@ -911,14 +892,12 @@ Check your system clock])
fi fi
AC_MSG_RESULT(yes)]) AC_MSG_RESULT(yes)])
# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 1
# AM_PROG_INSTALL_STRIP # AM_PROG_INSTALL_STRIP
# --------------------- # ---------------------
# One issue with vendor `install' (even GNU) is that you can't # One issue with vendor `install' (even GNU) is that you can't
@ -941,13 +920,13 @@ fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
AC_SUBST([INSTALL_STRIP_PROGRAM])]) AC_SUBST([INSTALL_STRIP_PROGRAM])])
# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # Copyright (C) 2006, 2008 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
# serial 3 # serial 2
# _AM_SUBST_NOTMAKE(VARIABLE) # _AM_SUBST_NOTMAKE(VARIABLE)
# --------------------------- # ---------------------------
@ -956,13 +935,13 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
AC_DEFUN([_AM_SUBST_NOTMAKE]) AC_DEFUN([_AM_SUBST_NOTMAKE])
# AM_SUBST_NOTMAKE(VARIABLE) # AM_SUBST_NOTMAKE(VARIABLE)
# -------------------------- # ---------------------------
# Public sister of _AM_SUBST_NOTMAKE. # Public sister of _AM_SUBST_NOTMAKE.
AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# Check how to create a tarball. -*- Autoconf -*- # Check how to create a tarball. -*- Autoconf -*-
# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # Copyright (C) 2004, 2005 Free Software Foundation, Inc.
# #
# This file is free software; the Free Software Foundation # This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
@ -984,11 +963,10 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
# a tarball read from stdin. # a tarball read from stdin.
# $(am__untar) < result.tar # $(am__untar) < result.tar
AC_DEFUN([_AM_PROG_TAR], AC_DEFUN([_AM_PROG_TAR],
[# Always define AMTAR for backward compatibility. Yes, it's still used [# Always define AMTAR for backward compatibility.
# in the wild :-( We should find a proper way to deprecate it ... AM_MISSING_PROG([AMTAR], [tar])
AC_SUBST([AMTAR], ['$${TAR-tar}'])
m4_if([$1], [v7], m4_if([$1], [v7],
[am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
[m4_case([$1], [ustar],, [pax],, [m4_case([$1], [ustar],, [pax],,
[m4_fatal([Unknown tar format])]) [m4_fatal([Unknown tar format])])
AC_MSG_CHECKING([how to create a $1 tar archive]) AC_MSG_CHECKING([how to create a $1 tar archive])

750
configure vendored

File diff suppressed because it is too large Load diff

View file

@ -40,6 +40,7 @@ namespace google_breakpad {
class Minidump; class Minidump;
class ProcessState; class ProcessState;
class StackFrameSymbolizer;
class SourceLineResolverInterface; class SourceLineResolverInterface;
class SymbolSupplier; class SymbolSupplier;
struct SystemInfo; struct SystemInfo;
@ -92,37 +93,44 @@ class MinidumpProcessor {
public: public:
// Initializes this MinidumpProcessor. supplier should be an // Initializes this MinidumpProcessor. supplier should be an
// implementation of the SymbolSupplier abstract base class. // implementation of the SymbolSupplier abstract base class.
MinidumpProcessor(SymbolSupplier *supplier, MinidumpProcessor(SymbolSupplier* supplier,
SourceLineResolverInterface *resolver); SourceLineResolverInterface* resolver);
// Initializes the MinidumpProcessor with the option of // Initializes the MinidumpProcessor with the option of
// enabling the exploitability framework to analyze dumps // enabling the exploitability framework to analyze dumps
// for probable security relevance. // for probable security relevance.
MinidumpProcessor(SymbolSupplier *supplier, MinidumpProcessor(SymbolSupplier* supplier,
SourceLineResolverInterface *resolver, SourceLineResolverInterface* resolver,
bool enable_exploitability);
// Initializes the MinidumpProcessor with source line resolver helper, and
// the option of enabling the exploitability framework to analyze dumps
// for probable security relevance.
// Does not take ownership of resolver_helper, which must NOT be NULL.
MinidumpProcessor(StackFrameSymbolizer* stack_frame_symbolizer,
bool enable_exploitability); bool enable_exploitability);
~MinidumpProcessor(); ~MinidumpProcessor();
// Processes the minidump file and fills process_state with the result. // Processes the minidump file and fills process_state with the result.
ProcessResult Process(const string &minidump_file, ProcessResult Process(const string &minidump_file,
ProcessState *process_state); ProcessState* process_state);
// Processes the minidump structure and fills process_state with the // Processes the minidump structure and fills process_state with the
// result. // result.
ProcessResult Process(Minidump *minidump, ProcessResult Process(Minidump* minidump,
ProcessState *process_state); ProcessState* process_state);
// Populates the cpu_* fields of the |info| parameter with textual // Populates the cpu_* fields of the |info| parameter with textual
// representations of the CPU type that the minidump in |dump| was // representations of the CPU type that the minidump in |dump| was
// produced on. Returns false if this information is not available in // produced on. Returns false if this information is not available in
// the minidump. // the minidump.
static bool GetCPUInfo(Minidump *dump, SystemInfo *info); static bool GetCPUInfo(Minidump* dump, SystemInfo* info);
// Populates the os_* fields of the |info| parameter with textual // Populates the os_* fields of the |info| parameter with textual
// representations of the operating system that the minidump in |dump| // representations of the operating system that the minidump in |dump|
// was produced on. Returns false if this information is not available in // was produced on. Returns false if this information is not available in
// the minidump. // the minidump.
static bool GetOSInfo(Minidump *dump, SystemInfo *info); static bool GetOSInfo(Minidump* dump, SystemInfo* info);
// Returns a textual representation of the reason that a crash occurred, // Returns a textual representation of the reason that a crash occurred,
// if the minidump in dump was produced as a result of a crash. Returns // if the minidump in dump was produced as a result of a crash. Returns
@ -132,7 +140,7 @@ class MinidumpProcessor {
// address when the crash was caused by problems such as illegal // address when the crash was caused by problems such as illegal
// instructions or divisions by zero, or a data address when the crash // instructions or divisions by zero, or a data address when the crash
// was caused by a memory access violation. // was caused by a memory access violation.
static string GetCrashReason(Minidump *dump, u_int64_t *address); static string GetCrashReason(Minidump* dump, u_int64_t* address);
// This function returns true if the passed-in error code is // This function returns true if the passed-in error code is
// something unrecoverable(i.e. retry should not happen). For // something unrecoverable(i.e. retry should not happen). For
@ -152,11 +160,12 @@ class MinidumpProcessor {
// Returns a textual representation of an assertion included // Returns a textual representation of an assertion included
// in the minidump. Returns an empty string if this information // in the minidump. Returns an empty string if this information
// does not exist or cannot be determined. // does not exist or cannot be determined.
static string GetAssertion(Minidump *dump); static string GetAssertion(Minidump* dump);
private: private:
SymbolSupplier *supplier_; StackFrameSymbolizer* frame_symbolizer_;
SourceLineResolverInterface *resolver_; // Indicate whether resolver_helper_ is owned by this instance.
bool own_frame_symbolizer_;
// This flag enables the exploitability scanner which attempts to // This flag enables the exploitability scanner which attempts to
// guess how likely it is that the crash represents an exploitable // guess how likely it is that the crash represents an exploitable

View file

@ -70,7 +70,7 @@ struct StackFrameX86 : public StackFrame {
CONTEXT_VALID_ALL = -1 CONTEXT_VALID_ALL = -1
}; };
StackFrameX86() StackFrameX86()
: context(), : context(),
context_validity(CONTEXT_VALID_NONE), context_validity(CONTEXT_VALID_NONE),
windows_frame_info(NULL), windows_frame_info(NULL),
@ -220,7 +220,7 @@ struct StackFrameARM : public StackFrame {
// Return the ContextValidity flag for register rN. // Return the ContextValidity flag for register rN.
static ContextValidity RegisterValidFlag(int n) { static ContextValidity RegisterValidFlag(int n) {
return ContextValidity(1 << n); return ContextValidity(1 << n);
} }
// Register state. This is only fully valid for the topmost frame in a // Register state. This is only fully valid for the topmost frame in a
// stack. In other frames, the values of nonvolatile registers may be // stack. In other frames, the values of nonvolatile registers may be

View file

@ -48,19 +48,16 @@
#include "google_breakpad/common/breakpad_types.h" #include "google_breakpad/common/breakpad_types.h"
#include "google_breakpad/processor/code_modules.h" #include "google_breakpad/processor/code_modules.h"
#include "google_breakpad/processor/memory_region.h" #include "google_breakpad/processor/memory_region.h"
#include "google_breakpad/processor/stack_frame_symbolizer.h"
namespace google_breakpad { namespace google_breakpad {
class CallStack; class CallStack;
class MinidumpContext; class MinidumpContext;
class SourceLineResolverInterface; class StackFrameSymbolizer;
struct StackFrame;
class SymbolSupplier;
struct SystemInfo;
using std::set; using std::set;
class Stackwalker { class Stackwalker {
public: public:
virtual ~Stackwalker() {} virtual ~Stackwalker() {}
@ -69,17 +66,17 @@ class Stackwalker {
// GetCallerFrame. The frames are further processed to fill all available // GetCallerFrame. The frames are further processed to fill all available
// data. Returns true if the stackwalk completed, or false if it was // data. Returns true if the stackwalk completed, or false if it was
// interrupted by SymbolSupplier::GetSymbolFile(). // interrupted by SymbolSupplier::GetSymbolFile().
bool Walk(CallStack *stack); bool Walk(CallStack* stack);
// Returns a new concrete subclass suitable for the CPU that a stack was // Returns a new concrete subclass suitable for the CPU that a stack was
// generated on, according to the CPU type indicated by the context // generated on, according to the CPU type indicated by the context
// argument. If no suitable concrete subclass exists, returns NULL. // argument. If no suitable concrete subclass exists, returns NULL.
static Stackwalker* StackwalkerForCPU(const SystemInfo *system_info, static Stackwalker* StackwalkerForCPU(
MinidumpContext *context, const SystemInfo* system_info,
MemoryRegion *memory, MinidumpContext* context,
const CodeModules *modules, MemoryRegion* memory,
SymbolSupplier *supplier, const CodeModules* modules,
SourceLineResolverInterface *resolver); StackFrameSymbolizer* resolver_helper);
static void set_max_frames(u_int32_t max_frames) { max_frames_ = max_frames; } static void set_max_frames(u_int32_t max_frames) { max_frames_ = max_frames; }
static u_int32_t max_frames() { return max_frames_; } static u_int32_t max_frames() { return max_frames_; }
@ -89,16 +86,15 @@ class Stackwalker {
// memory identifies a MemoryRegion that provides the stack memory // memory identifies a MemoryRegion that provides the stack memory
// for the stack to walk. modules, if non-NULL, is a CodeModules // for the stack to walk. modules, if non-NULL, is a CodeModules
// object that is used to look up which code module each stack frame is // object that is used to look up which code module each stack frame is
// associated with. supplier is an optional caller-supplied SymbolSupplier // associated with. frame_symbolizer is a StackFrameSymbolizer object that
// implementation. If supplier is NULL, source line info will not be // encapsulates the logic of how source line resolver interacts with symbol
// resolved. resolver is an instance of SourceLineResolverInterface // supplier to symbolize stack frame and look up caller frame information
// (see source_line_resolver_interface.h and basic_source_line_resolver.h). // (see stack_frame_symbolizer.h).
// If resolver is NULL, source line info will not be resolved. // frame_symbolizer MUST NOT be NULL (asserted).
Stackwalker(const SystemInfo *system_info, Stackwalker(const SystemInfo* system_info,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* frame_symbolizer);
SourceLineResolverInterface *resolver);
// This can be used to filter out potential return addresses when // This can be used to filter out potential return addresses when
// the stack walker resorts to stack scanning. // the stack walker resorts to stack scanning.
@ -112,8 +108,8 @@ class Stackwalker {
template<typename InstructionType> template<typename InstructionType>
bool ScanForReturnAddress(InstructionType location_start, bool ScanForReturnAddress(InstructionType location_start,
InstructionType *location_found, InstructionType* location_found,
InstructionType *ip_found) { InstructionType* ip_found) {
const int kRASearchWords = 30; const int kRASearchWords = 30;
return ScanForReturnAddress(location_start, location_found, ip_found, return ScanForReturnAddress(location_start, location_found, ip_found,
kRASearchWords); kRASearchWords);
@ -130,8 +126,8 @@ class Stackwalker {
// location in memory. // location in memory.
template<typename InstructionType> template<typename InstructionType>
bool ScanForReturnAddress(InstructionType location_start, bool ScanForReturnAddress(InstructionType location_start,
InstructionType *location_found, InstructionType* location_found,
InstructionType *ip_found, InstructionType* ip_found,
int searchwords) { int searchwords) {
for (InstructionType location = location_start; for (InstructionType location = location_start;
location <= location_start + searchwords * sizeof(InstructionType); location <= location_start + searchwords * sizeof(InstructionType);
@ -142,7 +138,6 @@ class Stackwalker {
if (modules_ && modules_->GetModuleForAddress(ip) && if (modules_ && modules_->GetModuleForAddress(ip) &&
InstructionAddressSeemsValid(ip)) { InstructionAddressSeemsValid(ip)) {
*ip_found = ip; *ip_found = ip;
*location_found = location; *location_found = location;
return true; return true;
@ -154,19 +149,19 @@ class Stackwalker {
// Information about the system that produced the minidump. Subclasses // Information about the system that produced the minidump. Subclasses
// and the SymbolSupplier may find this information useful. // and the SymbolSupplier may find this information useful.
const SystemInfo *system_info_; const SystemInfo* system_info_;
// The stack memory to walk. Subclasses will require this region to // The stack memory to walk. Subclasses will require this region to
// get information from the stack. // get information from the stack.
MemoryRegion *memory_; MemoryRegion* memory_;
// A list of modules, for populating each StackFrame's module information. // A list of modules, for populating each StackFrame's module information.
// This field is optional and may be NULL. // This field is optional and may be NULL.
const CodeModules *modules_; const CodeModules* modules_;
protected: protected:
// The SourceLineResolver implementation. // The StackFrameSymbolizer implementation.
SourceLineResolverInterface *resolver_; StackFrameSymbolizer* frame_symbolizer_;
private: private:
// Obtains the context frame, the innermost called procedure in a stack // Obtains the context frame, the innermost called procedure in a stack
@ -183,15 +178,7 @@ class Stackwalker {
// the end of the stack has been reached). GetCallerFrame allocates a new // the end of the stack has been reached). GetCallerFrame allocates a new
// StackFrame (or StackFrame subclass), ownership of which is taken by // StackFrame (or StackFrame subclass), ownership of which is taken by
// the caller. // the caller.
virtual StackFrame* GetCallerFrame(const CallStack *stack) = 0; virtual StackFrame* GetCallerFrame(const CallStack* stack) = 0;
// The optional SymbolSupplier for resolving source line info.
SymbolSupplier *supplier_;
// A list of modules that we haven't found symbols for. We track
// this in order to avoid repeatedly looking them up again within
// one minidump.
set<string> no_symbol_modules_;
// The maximum number of frames Stackwalker will walk through. // The maximum number of frames Stackwalker will walk through.
// This defaults to 1024 to prevent infinite loops. // This defaults to 1024 to prevent infinite loops.

View file

@ -36,6 +36,7 @@
#include "google_breakpad/processor/minidump.h" #include "google_breakpad/processor/minidump.h"
#include "google_breakpad/processor/process_state.h" #include "google_breakpad/processor/process_state.h"
#include "google_breakpad/processor/exploitability.h" #include "google_breakpad/processor/exploitability.h"
#include "google_breakpad/processor/stack_frame_symbolizer.h"
#include "processor/logging.h" #include "processor/logging.h"
#include "processor/scoped_ptr.h" #include "processor/scoped_ptr.h"
#include "processor/stackwalker_x86.h" #include "processor/stackwalker_x86.h"
@ -44,18 +45,29 @@ namespace google_breakpad {
MinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier, MinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier,
SourceLineResolverInterface *resolver) SourceLineResolverInterface *resolver)
: supplier_(supplier), resolver_(resolver), : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)),
own_frame_symbolizer_(true),
enable_exploitability_(false) { enable_exploitability_(false) {
} }
MinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier, MinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier,
SourceLineResolverInterface *resolver, SourceLineResolverInterface *resolver,
bool enable_exploitability) bool enable_exploitability)
: supplier_(supplier), resolver_(resolver), : frame_symbolizer_(new StackFrameSymbolizer(supplier, resolver)),
own_frame_symbolizer_(true),
enable_exploitability_(enable_exploitability) { enable_exploitability_(enable_exploitability) {
} }
MinidumpProcessor::MinidumpProcessor(StackFrameSymbolizer *frame_symbolizer,
bool enable_exploitability)
: frame_symbolizer_(frame_symbolizer),
own_frame_symbolizer_(false),
enable_exploitability_(enable_exploitability) {
assert(frame_symbolizer_);
}
MinidumpProcessor::~MinidumpProcessor() { MinidumpProcessor::~MinidumpProcessor() {
if (own_frame_symbolizer_) delete frame_symbolizer_;
} }
ProcessResult MinidumpProcessor::Process( ProcessResult MinidumpProcessor::Process(
@ -126,6 +138,10 @@ ProcessResult MinidumpProcessor::Process(
bool interrupted = false; bool interrupted = false;
bool found_requesting_thread = false; bool found_requesting_thread = false;
unsigned int thread_count = threads->thread_count(); unsigned int thread_count = threads->thread_count();
// Reset frame_symbolizer_ at the beginning of stackwalk for each minidump.
frame_symbolizer_->Reset();
for (unsigned int thread_index = 0; for (unsigned int thread_index = 0;
thread_index < thread_count; thread_index < thread_count;
++thread_index) { ++thread_index) {
@ -208,8 +224,7 @@ ProcessResult MinidumpProcessor::Process(
context, context,
thread_memory, thread_memory,
process_state->modules_, process_state->modules_,
supplier_, frame_symbolizer_));
resolver_));
if (!stackwalker.get()) { if (!stackwalker.get()) {
BPLOG(ERROR) << "No stackwalker for " << thread_string; BPLOG(ERROR) << "No stackwalker for " << thread_string;
return PROCESS_ERROR_NO_STACKWALKER_FOR_THREAD; return PROCESS_ERROR_NO_STACKWALKER_FOR_THREAD;
@ -1160,7 +1175,8 @@ string MinidumpProcessor::GetAssertion(Minidump *dump) {
break; break;
default: { default: {
char assertion_type[32]; char assertion_type[32];
sprintf(assertion_type, "0x%08x", raw_assertion->type); snprintf(assertion_type, sizeof(assertion_type),
"0x%08x", raw_assertion->type);
assertion_string = "Unknown assertion type "; assertion_string = "Unknown assertion type ";
assertion_string += assertion_type; assertion_string += assertion_type;
break; break;
@ -1184,7 +1200,7 @@ string MinidumpProcessor::GetAssertion(Minidump *dump) {
if (raw_assertion->line != 0) { if (raw_assertion->line != 0) {
char assertion_line[32]; char assertion_line[32];
sprintf(assertion_line, "%u", raw_assertion->line); snprintf(assertion_line, sizeof(assertion_line), "%u", raw_assertion->line);
assertion_string.append(" at line "); assertion_string.append(" at line ");
assertion_string.append(assertion_line); assertion_string.append(assertion_line);
} }

View file

@ -41,9 +41,8 @@
#include "google_breakpad/processor/code_module.h" #include "google_breakpad/processor/code_module.h"
#include "google_breakpad/processor/code_modules.h" #include "google_breakpad/processor/code_modules.h"
#include "google_breakpad/processor/minidump.h" #include "google_breakpad/processor/minidump.h"
#include "google_breakpad/processor/source_line_resolver_interface.h"
#include "google_breakpad/processor/stack_frame.h" #include "google_breakpad/processor/stack_frame.h"
#include "google_breakpad/processor/symbol_supplier.h" #include "google_breakpad/processor/stack_frame_symbolizer.h"
#include "google_breakpad/processor/system_info.h" #include "google_breakpad/processor/system_info.h"
#include "processor/linked_ptr.h" #include "processor/linked_ptr.h"
#include "processor/logging.h" #include "processor/logging.h"
@ -58,20 +57,19 @@ namespace google_breakpad {
u_int32_t Stackwalker::max_frames_ = 1024; u_int32_t Stackwalker::max_frames_ = 1024;
Stackwalker::Stackwalker(const SystemInfo *system_info, Stackwalker::Stackwalker(const SystemInfo* system_info,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* frame_symbolizer)
SourceLineResolverInterface *resolver)
: system_info_(system_info), : system_info_(system_info),
memory_(memory), memory_(memory),
modules_(modules), modules_(modules),
resolver_(resolver), frame_symbolizer_(frame_symbolizer) {
supplier_(supplier) { assert(frame_symbolizer_);
} }
bool Stackwalker::Walk(CallStack *stack) { bool Stackwalker::Walk(CallStack* stack) {
BPLOG_IF(ERROR, !stack) << "Stackwalker::Walk requires |stack|"; BPLOG_IF(ERROR, !stack) << "Stackwalker::Walk requires |stack|";
assert(stack); assert(stack);
stack->Clear(); stack->Clear();
@ -88,42 +86,12 @@ bool Stackwalker::Walk(CallStack *stack) {
// context frame (above) or a caller frame (below). // context frame (above) or a caller frame (below).
// Resolve the module information, if a module map was provided. // Resolve the module information, if a module map was provided.
if (modules_) { StackFrameSymbolizer::SymbolizerResult symbolizer_result =
const CodeModule *module = frame_symbolizer_->FillSourceLineInfo(modules_, system_info_,
modules_->GetModuleForAddress(frame->instruction); frame.get());
if (module) { if (symbolizer_result == StackFrameSymbolizer::INTERRUPT) {
frame->module = module; BPLOG(INFO) << "Stack walk is interrupted.";
if (resolver_ && return false;
!resolver_->HasModule(frame->module) &&
no_symbol_modules_.find(
module->code_file()) == no_symbol_modules_.end() &&
supplier_) {
string symbol_file;
char *symbol_data = NULL;
SymbolSupplier::SymbolResult symbol_result =
supplier_->GetCStringSymbolData(module,
system_info_,
&symbol_file,
&symbol_data);
switch (symbol_result) {
case SymbolSupplier::FOUND:
resolver_->LoadModuleUsingMemoryBuffer(frame->module,
symbol_data);
break;
case SymbolSupplier::NOT_FOUND:
no_symbol_modules_.insert(module->code_file());
break; // nothing to do
case SymbolSupplier::INTERRUPT:
return false;
}
// Inform symbol supplier to free the unused data memory buffer.
if (resolver_->ShouldDeleteMemoryBufferAfterLoadModule())
supplier_->FreeSymbolData(module);
}
if (resolver_)
resolver_->FillSourceLineInfo(frame.get());
}
} }
// Add the frame to the call stack. Relinquish the ownership claim // Add the frame to the call stack. Relinquish the ownership claim
@ -144,47 +112,42 @@ bool Stackwalker::Walk(CallStack *stack) {
// static // static
Stackwalker* Stackwalker::StackwalkerForCPU( Stackwalker* Stackwalker::StackwalkerForCPU(
const SystemInfo *system_info, const SystemInfo* system_info,
MinidumpContext *context, MinidumpContext* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* frame_symbolizer) {
SourceLineResolverInterface *resolver) {
if (!context) { if (!context) {
BPLOG(ERROR) << "Can't choose a stackwalker implementation without context"; BPLOG(ERROR) << "Can't choose a stackwalker implementation without context";
return NULL; return NULL;
} }
Stackwalker *cpu_stackwalker = NULL; Stackwalker* cpu_stackwalker = NULL;
u_int32_t cpu = context->GetContextCPU(); u_int32_t cpu = context->GetContextCPU();
switch (cpu) { switch (cpu) {
case MD_CONTEXT_X86: case MD_CONTEXT_X86:
cpu_stackwalker = new StackwalkerX86(system_info, cpu_stackwalker = new StackwalkerX86(system_info,
context->GetContextX86(), context->GetContextX86(),
memory, modules, supplier, memory, modules, frame_symbolizer);
resolver);
break; break;
case MD_CONTEXT_PPC: case MD_CONTEXT_PPC:
cpu_stackwalker = new StackwalkerPPC(system_info, cpu_stackwalker = new StackwalkerPPC(system_info,
context->GetContextPPC(), context->GetContextPPC(),
memory, modules, supplier, memory, modules, frame_symbolizer);
resolver);
break; break;
case MD_CONTEXT_AMD64: case MD_CONTEXT_AMD64:
cpu_stackwalker = new StackwalkerAMD64(system_info, cpu_stackwalker = new StackwalkerAMD64(system_info,
context->GetContextAMD64(), context->GetContextAMD64(),
memory, modules, supplier, memory, modules, frame_symbolizer);
resolver);
break; break;
case MD_CONTEXT_SPARC: case MD_CONTEXT_SPARC:
cpu_stackwalker = new StackwalkerSPARC(system_info, cpu_stackwalker = new StackwalkerSPARC(system_info,
context->GetContextSPARC(), context->GetContextSPARC(),
memory, modules, supplier, memory, modules, frame_symbolizer);
resolver);
break; break;
case MD_CONTEXT_ARM: case MD_CONTEXT_ARM:
@ -193,8 +156,8 @@ Stackwalker* Stackwalker::StackwalkerForCPU(
fp_register = MD_CONTEXT_ARM_REG_IOS_FP; fp_register = MD_CONTEXT_ARM_REG_IOS_FP;
cpu_stackwalker = new StackwalkerARM(system_info, cpu_stackwalker = new StackwalkerARM(system_info,
context->GetContextARM(), context->GetContextARM(),
fp_register, memory, modules, fp_register, memory, modules,
supplier, resolver); frame_symbolizer);
break; break;
} }
@ -205,38 +168,28 @@ Stackwalker* Stackwalker::StackwalkerForCPU(
} }
bool Stackwalker::InstructionAddressSeemsValid(u_int64_t address) { bool Stackwalker::InstructionAddressSeemsValid(u_int64_t address) {
const CodeModule *module = modules_->GetModuleForAddress(address); StackFrame frame;
if (!module) { frame.instruction = address;
StackFrameSymbolizer::SymbolizerResult symbolizer_result =
frame_symbolizer_->FillSourceLineInfo(modules_, system_info_, &frame);
if (!frame.module) {
// not inside any loaded module // not inside any loaded module
return false; return false;
} }
if (!resolver_ || !supplier_) { if (!frame_symbolizer_->HasImplementation()) {
// we don't have a resolver and or symbol supplier, // No valid implementation to symbolize stack frame, but the address is
// but we're inside a known module // within a known module.
return true; return true;
} }
if (!resolver_->HasModule(module)) { if (symbolizer_result != StackFrameSymbolizer::NO_ERROR) {
string symbol_file; // Some error occurred during symbolization, but the address is within a
char *symbol_data = NULL; // known module
SymbolSupplier::SymbolResult symbol_result = return true;
supplier_->GetCStringSymbolData(module, system_info_,
&symbol_file, &symbol_data);
if (symbol_result != SymbolSupplier::FOUND ||
!resolver_->LoadModuleUsingMemoryBuffer(module,
symbol_data)) {
// we don't have symbols, but we're inside a loaded module
return true;
}
} }
StackFrame frame;
frame.module = module;
frame.instruction = address;
resolver_->FillSourceLineInfo(&frame);
// we have symbols, so return true if inside a function
return !frame.function_name.empty(); return !frame.function_name.empty();
} }

View file

@ -89,13 +89,12 @@ StackwalkerAMD64::cfi_register_map_[] = {
StackFrameAMD64::CONTEXT_VALID_RIP, &MDRawContextAMD64::rip }, StackFrameAMD64::CONTEXT_VALID_RIP, &MDRawContextAMD64::rip },
}; };
StackwalkerAMD64::StackwalkerAMD64(const SystemInfo *system_info, StackwalkerAMD64::StackwalkerAMD64(const SystemInfo* system_info,
const MDRawContextAMD64 *context, const MDRawContextAMD64* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* resolver_helper)
SourceLineResolverInterface *resolver) : Stackwalker(system_info, memory, modules, resolver_helper),
: Stackwalker(system_info, memory, modules, supplier, resolver),
context_(context), context_(context),
cfi_walker_(cfi_register_map_, cfi_walker_(cfi_register_map_,
(sizeof(cfi_register_map_) / sizeof(cfi_register_map_[0]))) { (sizeof(cfi_register_map_) / sizeof(cfi_register_map_[0]))) {
@ -108,7 +107,7 @@ StackFrame* StackwalkerAMD64::GetContextFrame() {
return NULL; return NULL;
} }
StackFrameAMD64 *frame = new StackFrameAMD64(); StackFrameAMD64* frame = new StackFrameAMD64();
// The instruction pointer is stored directly in a register, so pull it // The instruction pointer is stored directly in a register, so pull it
// straight out of the CPU context structure. // straight out of the CPU context structure.
@ -120,10 +119,10 @@ StackFrame* StackwalkerAMD64::GetContextFrame() {
return frame; return frame;
} }
StackFrameAMD64 *StackwalkerAMD64::GetCallerByCFIFrameInfo( StackFrameAMD64* StackwalkerAMD64::GetCallerByCFIFrameInfo(
const vector<StackFrame *> &frames, const vector<StackFrame*> &frames,
CFIFrameInfo *cfi_frame_info) { CFIFrameInfo* cfi_frame_info) {
StackFrameAMD64 *last_frame = static_cast<StackFrameAMD64*>(frames.back()); StackFrameAMD64* last_frame = static_cast<StackFrameAMD64*>(frames.back());
scoped_ptr<StackFrameAMD64> frame(new StackFrameAMD64()); scoped_ptr<StackFrameAMD64> frame(new StackFrameAMD64());
if (!cfi_walker_ if (!cfi_walker_
@ -142,9 +141,9 @@ StackFrameAMD64 *StackwalkerAMD64::GetCallerByCFIFrameInfo(
return frame.release(); return frame.release();
} }
StackFrameAMD64 *StackwalkerAMD64::GetCallerByStackScan( StackFrameAMD64* StackwalkerAMD64::GetCallerByStackScan(
const vector<StackFrame *> &frames) { const vector<StackFrame*> &frames) {
StackFrameAMD64 *last_frame = static_cast<StackFrameAMD64 *>(frames.back()); StackFrameAMD64* last_frame = static_cast<StackFrameAMD64*>(frames.back());
u_int64_t last_rsp = last_frame->context.rsp; u_int64_t last_rsp = last_frame->context.rsp;
u_int64_t caller_rip_address, caller_rip; u_int64_t caller_rip_address, caller_rip;
@ -155,7 +154,7 @@ StackFrameAMD64 *StackwalkerAMD64::GetCallerByStackScan(
// Create a new stack frame (ownership will be transferred to the caller) // Create a new stack frame (ownership will be transferred to the caller)
// and fill it in. // and fill it in.
StackFrameAMD64 *frame = new StackFrameAMD64(); StackFrameAMD64* frame = new StackFrameAMD64();
frame->trust = StackFrame::FRAME_TRUST_SCAN; frame->trust = StackFrame::FRAME_TRUST_SCAN;
frame->context = last_frame->context; frame->context = last_frame->context;
@ -191,19 +190,19 @@ StackFrameAMD64 *StackwalkerAMD64::GetCallerByStackScan(
return frame; return frame;
} }
StackFrame* StackwalkerAMD64::GetCallerFrame(const CallStack *stack) { StackFrame* StackwalkerAMD64::GetCallerFrame(const CallStack* stack) {
if (!memory_ || !stack) { if (!memory_ || !stack) {
BPLOG(ERROR) << "Can't get caller frame without memory or stack"; BPLOG(ERROR) << "Can't get caller frame without memory or stack";
return NULL; return NULL;
} }
const vector<StackFrame *> &frames = *stack->frames(); const vector<StackFrame*> &frames = *stack->frames();
StackFrameAMD64 *last_frame = static_cast<StackFrameAMD64 *>(frames.back()); StackFrameAMD64* last_frame = static_cast<StackFrameAMD64*>(frames.back());
scoped_ptr<StackFrameAMD64> new_frame; scoped_ptr<StackFrameAMD64> new_frame;
// If we have DWARF CFI information, use it. // If we have DWARF CFI information, use it.
scoped_ptr<CFIFrameInfo> cfi_frame_info( scoped_ptr<CFIFrameInfo> cfi_frame_info(
resolver_ ? resolver_->FindCFIFrameInfo(last_frame) : NULL); frame_symbolizer_->FindCFIFrameInfo(last_frame));
if (cfi_frame_info.get()) if (cfi_frame_info.get())
new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get()));

View file

@ -38,6 +38,7 @@
#ifndef PROCESSOR_STACKWALKER_AMD64_H__ #ifndef PROCESSOR_STACKWALKER_AMD64_H__
#define PROCESSOR_STACKWALKER_AMD64_H__ #define PROCESSOR_STACKWALKER_AMD64_H__
#include <vector>
#include "google_breakpad/common/breakpad_types.h" #include "google_breakpad/common/breakpad_types.h"
#include "google_breakpad/common/minidump_format.h" #include "google_breakpad/common/minidump_format.h"
@ -55,12 +56,11 @@ class StackwalkerAMD64 : public Stackwalker {
// register state corresponding to the innermost called frame to be // register state corresponding to the innermost called frame to be
// included in the stack. The other arguments are passed directly through // included in the stack. The other arguments are passed directly through
// to the base Stackwalker constructor. // to the base Stackwalker constructor.
StackwalkerAMD64(const SystemInfo *system_info, StackwalkerAMD64(const SystemInfo* system_info,
const MDRawContextAMD64 *context, const MDRawContextAMD64* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* frame_symbolizer);
SourceLineResolverInterface *resolver);
private: private:
// A STACK CFI-driven frame walker for the AMD64 // A STACK CFI-driven frame walker for the AMD64
@ -69,21 +69,21 @@ class StackwalkerAMD64 : public Stackwalker {
// Implementation of Stackwalker, using amd64 context (stack pointer in %rsp, // Implementation of Stackwalker, using amd64 context (stack pointer in %rsp,
// stack base in %rbp) and stack conventions (saved stack pointer at 0(%rbp)) // stack base in %rbp) and stack conventions (saved stack pointer at 0(%rbp))
virtual StackFrame* GetContextFrame(); virtual StackFrame* GetContextFrame();
virtual StackFrame* GetCallerFrame(const CallStack *stack); virtual StackFrame* GetCallerFrame(const CallStack* stack);
// Use cfi_frame_info (derived from STACK CFI records) to construct // Use cfi_frame_info (derived from STACK CFI records) to construct
// the frame that called frames.back(). The caller takes ownership // the frame that called frames.back(). The caller takes ownership
// of the returned frame. Return NULL on failure. // of the returned frame. Return NULL on failure.
StackFrameAMD64 *GetCallerByCFIFrameInfo(const vector<StackFrame *> &frames, StackFrameAMD64* GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames,
CFIFrameInfo *cfi_frame_info); CFIFrameInfo* cfi_frame_info);
// Scan the stack for plausible return addresses. The caller takes ownership // Scan the stack for plausible return addresses. The caller takes ownership
// of the returned frame. Return NULL on failure. // of the returned frame. Return NULL on failure.
StackFrameAMD64 *GetCallerByStackScan(const vector<StackFrame *> &frames); StackFrameAMD64* GetCallerByStackScan(const vector<StackFrame*> &frames);
// Stores the CPU context corresponding to the innermost stack frame to // Stores the CPU context corresponding to the innermost stack frame to
// be returned by GetContextFrame. // be returned by GetContextFrame.
const MDRawContextAMD64 *context_; const MDRawContextAMD64* context_;
// Our register map, for cfi_walker_. // Our register map, for cfi_walker_.
static const CFIWalker::RegisterSet cfi_register_map_[]; static const CFIWalker::RegisterSet cfi_register_map_[];

View file

@ -31,8 +31,8 @@
// stackwalker_amd64_unittest.cc: Unit tests for StackwalkerAMD64 class. // stackwalker_amd64_unittest.cc: Unit tests for StackwalkerAMD64 class.
#include <string>
#include <string.h> #include <string.h>
#include <string>
#include <vector> #include <vector>
#include "breakpad_googletest_includes.h" #include "breakpad_googletest_includes.h"
@ -48,6 +48,7 @@
using google_breakpad::BasicSourceLineResolver; using google_breakpad::BasicSourceLineResolver;
using google_breakpad::CallStack; using google_breakpad::CallStack;
using google_breakpad::StackFrameSymbolizer;
using google_breakpad::StackFrame; using google_breakpad::StackFrame;
using google_breakpad::StackFrameAMD64; using google_breakpad::StackFrameAMD64;
using google_breakpad::StackwalkerAMD64; using google_breakpad::StackwalkerAMD64;
@ -112,7 +113,7 @@ class StackwalkerAMD64Fixture {
for (size_t i = 0; i < sizeof(*raw_context); i++) for (size_t i = 0; i < sizeof(*raw_context); i++)
reinterpret_cast<u_int8_t *>(raw_context)[i] = (x += 17); reinterpret_cast<u_int8_t *>(raw_context)[i] = (x += 17);
} }
SystemInfo system_info; SystemInfo system_info;
MDRawContextAMD64 raw_context; MDRawContextAMD64 raw_context;
Section stack_section; Section stack_section;
@ -138,8 +139,9 @@ TEST_F(SanityCheck, NoResolver) {
raw_context.rip = 0x40000000c0000200ULL; raw_context.rip = 0x40000000c0000200ULL;
raw_context.rbp = 0x8000000080000000ULL; raw_context.rbp = 0x8000000080000000ULL;
StackFrameSymbolizer frame_symbolizer(NULL, NULL);
StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,
NULL, NULL); &frame_symbolizer);
// This should succeed even without a resolver or supplier. // This should succeed even without a resolver or supplier.
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
@ -158,8 +160,9 @@ TEST_F(GetContextFrame, Simple) {
raw_context.rip = 0x40000000c0000200ULL; raw_context.rip = 0x40000000c0000200ULL;
raw_context.rbp = 0x8000000080000000ULL; raw_context.rbp = 0x8000000080000000ULL;
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_GE(1U, frames->size()); ASSERT_GE(1U, frames->size());
@ -207,13 +210,14 @@ TEST_F(GetCallerFrame, ScanWithoutSymbols) {
.Append(32, 0); // end of stack .Append(32, 0); // end of stack
RegionFromSection(); RegionFromSection();
raw_context.rip = 0x40000000c0000200ULL; raw_context.rip = 0x40000000c0000200ULL;
raw_context.rbp = frame1_rbp.Value(); raw_context.rbp = frame1_rbp.Value();
raw_context.rsp = stack_section.start().Value(); raw_context.rsp = stack_section.start().Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(3U, frames->size()); ASSERT_EQ(3U, frames->size());
@ -267,7 +271,7 @@ TEST_F(GetCallerFrame, ScanWithFunctionSymbols) {
.Append(32, 0) // end of stack .Append(32, 0) // end of stack
.Mark(&frame1_rbp); .Mark(&frame1_rbp);
RegionFromSection(); RegionFromSection();
raw_context.rip = 0x40000000c0000200ULL; raw_context.rip = 0x40000000c0000200ULL;
raw_context.rbp = frame1_rbp.Value(); raw_context.rbp = frame1_rbp.Value();
raw_context.rsp = stack_section.start().Value(); raw_context.rsp = stack_section.start().Value();
@ -279,8 +283,9 @@ TEST_F(GetCallerFrame, ScanWithFunctionSymbols) {
// The calling frame's function. // The calling frame's function.
"FUNC 100 400 10 echidna\n"); "FUNC 100 400 10 echidna\n");
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -343,8 +348,9 @@ TEST_F(GetCallerFrame, CallerPushedRBP) {
// The calling frame's function. // The calling frame's function.
"FUNC 100 400 10 yeti\n"); "FUNC 100 400 10 yeti\n");
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -418,8 +424,9 @@ struct CFIFixture: public StackwalkerAMD64Fixture {
RegionFromSection(); RegionFromSection();
raw_context.rsp = stack_section.start().Value(); raw_context.rsp = stack_section.start().Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerAMD64 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());

View file

@ -33,6 +33,8 @@
// //
// Author: Mark Mentovai, Ted Mielczarek, Jim Blandy // Author: Mark Mentovai, Ted Mielczarek, Jim Blandy
#include <vector>
#include "google_breakpad/processor/call_stack.h" #include "google_breakpad/processor/call_stack.h"
#include "google_breakpad/processor/memory_region.h" #include "google_breakpad/processor/memory_region.h"
#include "google_breakpad/processor/source_line_resolver_interface.h" #include "google_breakpad/processor/source_line_resolver_interface.h"
@ -45,14 +47,13 @@
namespace google_breakpad { namespace google_breakpad {
StackwalkerARM::StackwalkerARM(const SystemInfo *system_info, StackwalkerARM::StackwalkerARM(const SystemInfo* system_info,
const MDRawContextARM *context, const MDRawContextARM* context,
int fp_register, int fp_register,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* resolver_helper)
SourceLineResolverInterface *resolver) : Stackwalker(system_info, memory, modules, resolver_helper),
: Stackwalker(system_info, memory, modules, supplier, resolver),
context_(context), fp_register_(fp_register), context_(context), fp_register_(fp_register),
context_frame_validity_(StackFrameARM::CONTEXT_VALID_ALL) { } context_frame_validity_(StackFrameARM::CONTEXT_VALID_ALL) { }
@ -63,7 +64,7 @@ StackFrame* StackwalkerARM::GetContextFrame() {
return NULL; return NULL;
} }
StackFrameARM *frame = new StackFrameARM(); StackFrameARM* frame = new StackFrameARM();
// The instruction pointer is stored directly in a register (r15), so pull it // The instruction pointer is stored directly in a register (r15), so pull it
// straight out of the CPU context structure. // straight out of the CPU context structure.
@ -75,12 +76,12 @@ StackFrame* StackwalkerARM::GetContextFrame() {
return frame; return frame;
} }
StackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo( StackFrameARM* StackwalkerARM::GetCallerByCFIFrameInfo(
const vector<StackFrame *> &frames, const vector<StackFrame*> &frames,
CFIFrameInfo *cfi_frame_info) { CFIFrameInfo* cfi_frame_info) {
StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back()); StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
static const char *register_names[] = { static const char* register_names[] = {
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
@ -121,7 +122,7 @@ StackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo(
} }
} }
// If the CFI doesn't recover the PC explicitly, then use .ra. // If the CFI doesn't recover the PC explicitly, then use .ra.
if (! (frame->context_validity & StackFrameARM::CONTEXT_VALID_PC)) { if (!(frame->context_validity & StackFrameARM::CONTEXT_VALID_PC)) {
CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry = CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry =
caller_registers.find(".ra"); caller_registers.find(".ra");
if (entry != caller_registers.end()) { if (entry != caller_registers.end()) {
@ -140,7 +141,7 @@ StackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo(
} }
} }
// If the CFI doesn't recover the SP explicitly, then use .cfa. // If the CFI doesn't recover the SP explicitly, then use .cfa.
if (! (frame->context_validity & StackFrameARM::CONTEXT_VALID_SP)) { if (!(frame->context_validity & StackFrameARM::CONTEXT_VALID_SP)) {
CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry = CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry =
caller_registers.find(".cfa"); caller_registers.find(".cfa");
if (entry != caller_registers.end()) { if (entry != caller_registers.end()) {
@ -159,9 +160,9 @@ StackFrameARM *StackwalkerARM::GetCallerByCFIFrameInfo(
return frame.release(); return frame.release();
} }
StackFrameARM *StackwalkerARM::GetCallerByStackScan( StackFrameARM* StackwalkerARM::GetCallerByStackScan(
const vector<StackFrame *> &frames) { const vector<StackFrame*> &frames) {
StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back()); StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
u_int32_t last_sp = last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP]; u_int32_t last_sp = last_frame->context.iregs[MD_CONTEXT_ARM_REG_SP];
u_int32_t caller_sp, caller_pc; u_int32_t caller_sp, caller_pc;
@ -177,7 +178,7 @@ StackFrameARM *StackwalkerARM::GetCallerByStackScan(
// Create a new stack frame (ownership will be transferred to the caller) // Create a new stack frame (ownership will be transferred to the caller)
// and fill it in. // and fill it in.
StackFrameARM *frame = new StackFrameARM(); StackFrameARM* frame = new StackFrameARM();
frame->trust = StackFrame::FRAME_TRUST_SCAN; frame->trust = StackFrame::FRAME_TRUST_SCAN;
frame->context = last_frame->context; frame->context = last_frame->context;
@ -189,9 +190,9 @@ StackFrameARM *StackwalkerARM::GetCallerByStackScan(
return frame; return frame;
} }
StackFrameARM *StackwalkerARM::GetCallerByFramePointer( StackFrameARM* StackwalkerARM::GetCallerByFramePointer(
const vector<StackFrame *> &frames) { const vector<StackFrame*> &frames) {
StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back()); StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
if (!(last_frame->context_validity & if (!(last_frame->context_validity &
StackFrameARM::RegisterValidFlag(fp_register_))) { StackFrameARM::RegisterValidFlag(fp_register_))) {
@ -219,7 +220,7 @@ StackFrameARM *StackwalkerARM::GetCallerByFramePointer(
// Create a new stack frame (ownership will be transferred to the caller) // Create a new stack frame (ownership will be transferred to the caller)
// and fill it in. // and fill it in.
StackFrameARM *frame = new StackFrameARM(); StackFrameARM* frame = new StackFrameARM();
frame->trust = StackFrame::FRAME_TRUST_FP; frame->trust = StackFrame::FRAME_TRUST_FP;
frame->context = last_frame->context; frame->context = last_frame->context;
@ -235,19 +236,19 @@ StackFrameARM *StackwalkerARM::GetCallerByFramePointer(
return frame; return frame;
} }
StackFrame* StackwalkerARM::GetCallerFrame(const CallStack *stack) { StackFrame* StackwalkerARM::GetCallerFrame(const CallStack* stack) {
if (!memory_ || !stack) { if (!memory_ || !stack) {
BPLOG(ERROR) << "Can't get caller frame without memory or stack"; BPLOG(ERROR) << "Can't get caller frame without memory or stack";
return NULL; return NULL;
} }
const vector<StackFrame *> &frames = *stack->frames(); const vector<StackFrame*> &frames = *stack->frames();
StackFrameARM *last_frame = static_cast<StackFrameARM *>(frames.back()); StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
scoped_ptr<StackFrameARM> frame; scoped_ptr<StackFrameARM> frame;
// See if there is DWARF call frame information covering this address. // See if there is DWARF call frame information covering this address.
scoped_ptr<CFIFrameInfo> cfi_frame_info( scoped_ptr<CFIFrameInfo> cfi_frame_info(
resolver_ ? resolver_->FindCFIFrameInfo(last_frame) : NULL); frame_symbolizer_->FindCFIFrameInfo(last_frame));
if (cfi_frame_info.get()) if (cfi_frame_info.get())
frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get()));

View file

@ -54,13 +54,12 @@ class StackwalkerARM : public Stackwalker {
// register state corresponding to the innermost called frame to be // register state corresponding to the innermost called frame to be
// included in the stack. The other arguments are passed directly through // included in the stack. The other arguments are passed directly through
// to the base Stackwalker constructor. // to the base Stackwalker constructor.
StackwalkerARM(const SystemInfo *system_info, StackwalkerARM(const SystemInfo* system_info,
const MDRawContextARM *context, const MDRawContextARM* context,
int fp_register, int fp_register,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* frame_symbolizer);
SourceLineResolverInterface *resolver);
// Change the context validity mask of the frame returned by // Change the context validity mask of the frame returned by
// GetContextFrame to VALID. This is only for use by unit tests; the // GetContextFrame to VALID. This is only for use by unit tests; the
@ -70,25 +69,25 @@ class StackwalkerARM : public Stackwalker {
private: private:
// Implementation of Stackwalker, using arm context and stack conventions. // Implementation of Stackwalker, using arm context and stack conventions.
virtual StackFrame* GetContextFrame(); virtual StackFrame* GetContextFrame();
virtual StackFrame* GetCallerFrame(const CallStack *stack); virtual StackFrame* GetCallerFrame(const CallStack* stack);
// Use cfi_frame_info (derived from STACK CFI records) to construct // Use cfi_frame_info (derived from STACK CFI records) to construct
// the frame that called frames.back(). The caller takes ownership // the frame that called frames.back(). The caller takes ownership
// of the returned frame. Return NULL on failure. // of the returned frame. Return NULL on failure.
StackFrameARM *GetCallerByCFIFrameInfo(const vector<StackFrame *> &frames, StackFrameARM* GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames,
CFIFrameInfo *cfi_frame_info); CFIFrameInfo* cfi_frame_info);
// Use the frame pointer. The caller takes ownership of the returned frame. // Use the frame pointer. The caller takes ownership of the returned frame.
// Return NULL on failure. // Return NULL on failure.
StackFrameARM *GetCallerByFramePointer(const vector<StackFrame *> &frames); StackFrameARM* GetCallerByFramePointer(const vector<StackFrame*> &frames);
// Scan the stack for plausible return addresses. The caller takes ownership // Scan the stack for plausible return addresses. The caller takes ownership
// of the returned frame. Return NULL on failure. // of the returned frame. Return NULL on failure.
StackFrameARM *GetCallerByStackScan(const vector<StackFrame *> &frames); StackFrameARM* GetCallerByStackScan(const vector<StackFrame*> &frames);
// Stores the CPU context corresponding to the youngest stack frame, to // Stores the CPU context corresponding to the youngest stack frame, to
// be returned by GetContextFrame. // be returned by GetContextFrame.
const MDRawContextARM *context_; const MDRawContextARM* context_;
// The register to use a as frame pointer. The value is -1 if frame pointer // The register to use a as frame pointer. The value is -1 if frame pointer
// cannot be used. // cannot be used.

View file

@ -31,8 +31,8 @@
// stackwalker_arm_unittest.cc: Unit tests for StackwalkerARM class. // stackwalker_arm_unittest.cc: Unit tests for StackwalkerARM class.
#include <string>
#include <string.h> #include <string.h>
#include <string>
#include <vector> #include <vector>
#include "breakpad_googletest_includes.h" #include "breakpad_googletest_includes.h"
@ -49,6 +49,7 @@
using google_breakpad::BasicSourceLineResolver; using google_breakpad::BasicSourceLineResolver;
using google_breakpad::CallStack; using google_breakpad::CallStack;
using google_breakpad::StackFrameSymbolizer;
using google_breakpad::StackFrame; using google_breakpad::StackFrame;
using google_breakpad::StackFrameARM; using google_breakpad::StackFrameARM;
using google_breakpad::StackwalkerARM; using google_breakpad::StackwalkerARM;
@ -134,8 +135,9 @@ TEST_F(SanityCheck, NoResolver) {
// Since we have no call frame information, and all unwinding // Since we have no call frame information, and all unwinding
// requires call frame information, the stack walk will end after // requires call frame information, the stack walk will end after
// the first frame. // the first frame.
StackFrameSymbolizer frame_symbolizer(NULL, NULL);
StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,
NULL, NULL); &frame_symbolizer);
// This should succeed even without a resolver or supplier. // This should succeed even without a resolver or supplier.
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
@ -152,8 +154,9 @@ TEST_F(GetContextFrame, Simple) {
// Since we have no call frame information, and all unwinding // Since we have no call frame information, and all unwinding
// requires call frame information, the stack walk will end after // requires call frame information, the stack walk will end after
// the first frame. // the first frame.
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(1U, frames->size()); ASSERT_EQ(1U, frames->size());
@ -199,8 +202,9 @@ TEST_F(GetCallerFrame, ScanWithoutSymbols) {
raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510; raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40005510;
raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(3U, frames->size()); ASSERT_EQ(3U, frames->size());
@ -262,8 +266,9 @@ TEST_F(GetCallerFrame, ScanWithFunctionSymbols) {
// The calling frame's function. // The calling frame's function.
"FUNC 100 400 10 marsupial\n"); "FUNC 100 400 10 marsupial\n");
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -372,8 +377,9 @@ struct CFIFixture: public StackwalkerARMFixture {
RegionFromSection(); RegionFromSection();
raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region,
&modules, &supplier, &resolver); &modules, &frame_symbolizer);
walker.SetContextFrameValidity(context_frame_validity); walker.SetContextFrameValidity(context_frame_validity);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
@ -564,8 +570,9 @@ TEST_F(CFI, RejectBackwards) {
raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40006000; raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40006000;
raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000; raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000;
raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = 0x40005510; raw_context.iregs[MD_CONTEXT_ARM_REG_LR] = 0x40005510;
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(1U, frames->size()); ASSERT_EQ(1U, frames->size());
@ -575,8 +582,9 @@ TEST_F(CFI, RejectBackwards) {
TEST_F(CFI, RejectBadExpressions) { TEST_F(CFI, RejectBadExpressions) {
raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40007000; raw_context.iregs[MD_CONTEXT_ARM_REG_PC] = 0x40007000;
raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000; raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = 0x80000000;
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules, StackwalkerARM walker(&system_info, &raw_context, -1, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(1U, frames->size()); ASSERT_EQ(1U, frames->size());
@ -631,8 +639,9 @@ TEST_F(GetFramesByFramePointer, OnlyFramePointer) {
raw_context.iregs[MD_CONTEXT_ARM_REG_IOS_FP] = frame1_fp.Value(); raw_context.iregs[MD_CONTEXT_ARM_REG_IOS_FP] = frame1_fp.Value();
raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerARM walker(&system_info, &raw_context, MD_CONTEXT_ARM_REG_IOS_FP, StackwalkerARM walker(&system_info, &raw_context, MD_CONTEXT_ARM_REG_IOS_FP,
&stack_region, &modules, &supplier, &resolver); &stack_region, &modules, &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
@ -720,8 +729,9 @@ TEST_F(GetFramesByFramePointer, FramePointerAndCFI) {
raw_context.iregs[MD_CONTEXT_ARM_REG_IOS_FP] = frame1_fp.Value(); raw_context.iregs[MD_CONTEXT_ARM_REG_IOS_FP] = frame1_fp.Value();
raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value(); raw_context.iregs[MD_CONTEXT_ARM_REG_SP] = stack_section.start().Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerARM walker(&system_info, &raw_context, MD_CONTEXT_ARM_REG_IOS_FP, StackwalkerARM walker(&system_info, &raw_context, MD_CONTEXT_ARM_REG_IOS_FP,
&stack_region, &modules, &supplier, &resolver); &stack_region, &modules, &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();

View file

@ -43,13 +43,12 @@
namespace google_breakpad { namespace google_breakpad {
StackwalkerPPC::StackwalkerPPC(const SystemInfo *system_info, StackwalkerPPC::StackwalkerPPC(const SystemInfo* system_info,
const MDRawContextPPC *context, const MDRawContextPPC* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* resolver_helper)
SourceLineResolverInterface *resolver) : Stackwalker(system_info, memory, modules, resolver_helper),
: Stackwalker(system_info, memory, modules, supplier, resolver),
context_(context) { context_(context) {
if (memory_->GetBase() + memory_->GetSize() - 1 > 0xffffffff) { if (memory_->GetBase() + memory_->GetSize() - 1 > 0xffffffff) {
// This implementation only covers 32-bit ppc CPUs. The limits of the // This implementation only covers 32-bit ppc CPUs. The limits of the
@ -69,7 +68,7 @@ StackFrame* StackwalkerPPC::GetContextFrame() {
return NULL; return NULL;
} }
StackFramePPC *frame = new StackFramePPC(); StackFramePPC* frame = new StackFramePPC();
// The instruction pointer is stored directly in a register, so pull it // The instruction pointer is stored directly in a register, so pull it
// straight out of the CPU context structure. // straight out of the CPU context structure.
@ -82,7 +81,7 @@ StackFrame* StackwalkerPPC::GetContextFrame() {
} }
StackFrame* StackwalkerPPC::GetCallerFrame(const CallStack *stack) { StackFrame* StackwalkerPPC::GetCallerFrame(const CallStack* stack) {
if (!memory_ || !stack) { if (!memory_ || !stack) {
BPLOG(ERROR) << "Can't get caller frame without memory or stack"; BPLOG(ERROR) << "Can't get caller frame without memory or stack";
return NULL; return NULL;
@ -97,7 +96,7 @@ StackFrame* StackwalkerPPC::GetCallerFrame(const CallStack *stack) {
// frame pointer, and what is typically thought of as the frame pointer on // frame pointer, and what is typically thought of as the frame pointer on
// an x86 is usually referred to as the stack pointer on a ppc. // an x86 is usually referred to as the stack pointer on a ppc.
StackFramePPC *last_frame = static_cast<StackFramePPC*>( StackFramePPC* last_frame = static_cast<StackFramePPC*>(
stack->frames()->back()); stack->frames()->back());
// A caller frame must reside higher in memory than its callee frames. // A caller frame must reside higher in memory than its callee frames.
@ -121,7 +120,7 @@ StackFrame* StackwalkerPPC::GetCallerFrame(const CallStack *stack) {
return NULL; return NULL;
} }
StackFramePPC *frame = new StackFramePPC(); StackFramePPC* frame = new StackFramePPC();
frame->context = last_frame->context; frame->context = last_frame->context;
frame->context.srr0 = instruction; frame->context.srr0 = instruction;

View file

@ -53,23 +53,22 @@ class StackwalkerPPC : public Stackwalker {
// register state corresponding to the innermost called frame to be // register state corresponding to the innermost called frame to be
// included in the stack. The other arguments are passed directly through // included in the stack. The other arguments are passed directly through
// to the base Stackwalker constructor. // to the base Stackwalker constructor.
StackwalkerPPC(const SystemInfo *system_info, StackwalkerPPC(const SystemInfo* system_info,
const MDRawContextPPC *context, const MDRawContextPPC* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* frame_symbolizer);
SourceLineResolverInterface *resolver);
private: private:
// Implementation of Stackwalker, using ppc context (stack pointer in %r1, // Implementation of Stackwalker, using ppc context (stack pointer in %r1,
// saved program counter in %srr0) and stack conventions (saved stack // saved program counter in %srr0) and stack conventions (saved stack
// pointer at 0(%r1), return address at 8(0(%r1)). // pointer at 0(%r1), return address at 8(0(%r1)).
virtual StackFrame* GetContextFrame(); virtual StackFrame* GetContextFrame();
virtual StackFrame* GetCallerFrame(const CallStack *stack); virtual StackFrame* GetCallerFrame(const CallStack* stack);
// Stores the CPU context corresponding to the innermost stack frame to // Stores the CPU context corresponding to the innermost stack frame to
// be returned by GetContextFrame. // be returned by GetContextFrame.
const MDRawContextPPC *context_; const MDRawContextPPC* context_;
}; };

View file

@ -43,13 +43,12 @@
namespace google_breakpad { namespace google_breakpad {
StackwalkerSPARC::StackwalkerSPARC(const SystemInfo *system_info, StackwalkerSPARC::StackwalkerSPARC(const SystemInfo* system_info,
const MDRawContextSPARC *context, const MDRawContextSPARC* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* resolver_helper)
SourceLineResolverInterface *resolver) : Stackwalker(system_info, memory, modules, resolver_helper),
: Stackwalker(system_info, memory, modules, supplier, resolver),
context_(context) { context_(context) {
} }
@ -60,7 +59,7 @@ StackFrame* StackwalkerSPARC::GetContextFrame() {
return NULL; return NULL;
} }
StackFrameSPARC *frame = new StackFrameSPARC(); StackFrameSPARC* frame = new StackFrameSPARC();
// The instruction pointer is stored directly in a register, so pull it // The instruction pointer is stored directly in a register, so pull it
// straight out of the CPU context structure. // straight out of the CPU context structure.
@ -73,13 +72,13 @@ StackFrame* StackwalkerSPARC::GetContextFrame() {
} }
StackFrame* StackwalkerSPARC::GetCallerFrame(const CallStack *stack) { StackFrame* StackwalkerSPARC::GetCallerFrame(const CallStack* stack) {
if (!memory_ || !stack) { if (!memory_ || !stack) {
BPLOG(ERROR) << "Can't get caller frame without memory or stack"; BPLOG(ERROR) << "Can't get caller frame without memory or stack";
return NULL; return NULL;
} }
StackFrameSPARC *last_frame = static_cast<StackFrameSPARC*>( StackFrameSPARC* last_frame = static_cast<StackFrameSPARC*>(
stack->frames()->back()); stack->frames()->back());
// new: caller // new: caller
@ -87,7 +86,7 @@ StackFrame* StackwalkerSPARC::GetCallerFrame(const CallStack *stack) {
// %fp, %i6 and g_r[30] is the same, see minidump_format.h // %fp, %i6 and g_r[30] is the same, see minidump_format.h
// %sp, %o6 and g_r[14] is the same, see minidump_format.h // %sp, %o6 and g_r[14] is the same, see minidump_format.h
// %sp_new = %fp_old // %sp_new = %fp_old
// %fp_new = *(%fp_old + 32 + 32 - 8), where the callee's %i6 // %fp_new = *(%fp_old + 32 + 32 - 8), where the callee's %i6
// %pc_new = *(%fp_old + 32 + 32 - 4) + 8 // %pc_new = *(%fp_old + 32 + 32 - 4) + 8
// which is callee's %i7 plus 8 // which is callee's %i7 plus 8
@ -111,14 +110,14 @@ StackFrame* StackwalkerSPARC::GetCallerFrame(const CallStack *stack) {
return NULL; return NULL;
} }
StackFrameSPARC *frame = new StackFrameSPARC(); StackFrameSPARC* frame = new StackFrameSPARC();
frame->context = last_frame->context; frame->context = last_frame->context;
frame->context.g_r[14] = stack_pointer; frame->context.g_r[14] = stack_pointer;
frame->context.g_r[30] = stack_base; frame->context.g_r[30] = stack_base;
// frame->context.pc is the return address, which is 2 instruction // frame->context.pc is the return address, which is 2 instruction
// past the branch that caused us to arrive at the callee, which are // past the branch that caused us to arrive at the callee, which are
// a CALL instruction then a NOP instruction. // a CALL instruction then a NOP instruction.
// frame_ppc->instruction to 8 less than that. Since all sparc // frame_ppc->instruction to 8 less than that. Since all sparc
// instructions are 4 bytes wide, this is the address of the branch // instructions are 4 bytes wide, this is the address of the branch
@ -131,7 +130,7 @@ StackFrame* StackwalkerSPARC::GetCallerFrame(const CallStack *stack) {
StackFrameSPARC::CONTEXT_VALID_SP | StackFrameSPARC::CONTEXT_VALID_SP |
StackFrameSPARC::CONTEXT_VALID_FP; StackFrameSPARC::CONTEXT_VALID_FP;
frame->trust = StackFrame::FRAME_TRUST_FP; frame->trust = StackFrame::FRAME_TRUST_FP;
return frame; return frame;
} }

View file

@ -53,22 +53,21 @@ class StackwalkerSPARC : public Stackwalker {
// register state corresponding to the innermost called frame to be // register state corresponding to the innermost called frame to be
// included in the stack. The other arguments are passed directly through // included in the stack. The other arguments are passed directly through
// to the base Stackwalker constructor. // to the base Stackwalker constructor.
StackwalkerSPARC(const SystemInfo *system_info, StackwalkerSPARC(const SystemInfo* system_info,
const MDRawContextSPARC *context, const MDRawContextSPARC* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* frame_symbolizer);
SourceLineResolverInterface *resolver);
private: private:
// Implementation of Stackwalker, using sparc context (%fp, %sp, %pc) and // Implementation of Stackwalker, using sparc context (%fp, %sp, %pc) and
// stack conventions // stack conventions
virtual StackFrame* GetContextFrame(); virtual StackFrame* GetContextFrame();
virtual StackFrame* GetCallerFrame(const CallStack *stack); virtual StackFrame* GetCallerFrame(const CallStack* stack);
// Stores the CPU context corresponding to the innermost stack frame to // Stores the CPU context corresponding to the innermost stack frame to
// be returned by GetContextFrame. // be returned by GetContextFrame.
const MDRawContextSPARC *context_; const MDRawContextSPARC* context_;
}; };

View file

@ -33,8 +33,7 @@
// //
// Author: Mark Mentovai // Author: Mark Mentovai
#include <string>
#include "processor/postfix_evaluator-inl.h"
#include "google_breakpad/processor/call_stack.h" #include "google_breakpad/processor/call_stack.h"
#include "google_breakpad/processor/code_modules.h" #include "google_breakpad/processor/code_modules.h"
@ -42,6 +41,7 @@
#include "google_breakpad/processor/source_line_resolver_interface.h" #include "google_breakpad/processor/source_line_resolver_interface.h"
#include "google_breakpad/processor/stack_frame_cpu.h" #include "google_breakpad/processor/stack_frame_cpu.h"
#include "processor/logging.h" #include "processor/logging.h"
#include "processor/postfix_evaluator-inl.h"
#include "processor/scoped_ptr.h" #include "processor/scoped_ptr.h"
#include "processor/stackwalker_x86.h" #include "processor/stackwalker_x86.h"
#include "processor/windows_frame_info.h" #include "processor/windows_frame_info.h"
@ -77,13 +77,12 @@ StackwalkerX86::cfi_register_map_[] = {
StackFrameX86::CONTEXT_VALID_EDI, &MDRawContextX86::edi }, StackFrameX86::CONTEXT_VALID_EDI, &MDRawContextX86::edi },
}; };
StackwalkerX86::StackwalkerX86(const SystemInfo *system_info, StackwalkerX86::StackwalkerX86(const SystemInfo* system_info,
const MDRawContextX86 *context, const MDRawContextX86* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* resolver_helper)
SourceLineResolverInterface *resolver) : Stackwalker(system_info, memory, modules, resolver_helper),
: Stackwalker(system_info, memory, modules, supplier, resolver),
context_(context), context_(context),
cfi_walker_(cfi_register_map_, cfi_walker_(cfi_register_map_,
(sizeof(cfi_register_map_) / sizeof(cfi_register_map_[0]))) { (sizeof(cfi_register_map_) / sizeof(cfi_register_map_[0]))) {
@ -106,13 +105,13 @@ StackFrameX86::~StackFrameX86() {
cfi_frame_info = NULL; cfi_frame_info = NULL;
} }
StackFrame *StackwalkerX86::GetContextFrame() { StackFrame* StackwalkerX86::GetContextFrame() {
if (!context_ || !memory_) { if (!context_ || !memory_) {
BPLOG(ERROR) << "Can't get context frame without context or memory"; BPLOG(ERROR) << "Can't get context frame without context or memory";
return NULL; return NULL;
} }
StackFrameX86 *frame = new StackFrameX86(); StackFrameX86* frame = new StackFrameX86();
// The instruction pointer is stored directly in a register, so pull it // The instruction pointer is stored directly in a register, so pull it
// straight out of the CPU context structure. // straight out of the CPU context structure.
@ -124,12 +123,12 @@ StackFrame *StackwalkerX86::GetContextFrame() {
return frame; return frame;
} }
StackFrameX86 *StackwalkerX86::GetCallerByWindowsFrameInfo( StackFrameX86* StackwalkerX86::GetCallerByWindowsFrameInfo(
const vector<StackFrame *> &frames, const vector<StackFrame*> &frames,
WindowsFrameInfo *last_frame_info) { WindowsFrameInfo* last_frame_info) {
StackFrame::FrameTrust trust = StackFrame::FRAME_TRUST_NONE; StackFrame::FrameTrust trust = StackFrame::FRAME_TRUST_NONE;
StackFrameX86 *last_frame = static_cast<StackFrameX86 *>(frames.back()); StackFrameX86* last_frame = static_cast<StackFrameX86*>(frames.back());
// Save the stack walking info we found, in case we need it later to // Save the stack walking info we found, in case we need it later to
// find the callee of the frame we're constructing now. // find the callee of the frame we're constructing now.
@ -176,9 +175,9 @@ StackFrameX86 *StackwalkerX86::GetCallerByWindowsFrameInfo(
u_int32_t last_frame_callee_parameter_size = 0; u_int32_t last_frame_callee_parameter_size = 0;
int frames_already_walked = frames.size(); int frames_already_walked = frames.size();
if (frames_already_walked >= 2) { if (frames_already_walked >= 2) {
const StackFrameX86 *last_frame_callee const StackFrameX86* last_frame_callee
= static_cast<StackFrameX86 *>(frames[frames_already_walked - 2]); = static_cast<StackFrameX86*>(frames[frames_already_walked - 2]);
WindowsFrameInfo *last_frame_callee_info WindowsFrameInfo* last_frame_callee_info
= last_frame_callee->windows_frame_info; = last_frame_callee->windows_frame_info;
if (last_frame_callee_info && if (last_frame_callee_info &&
(last_frame_callee_info->valid (last_frame_callee_info->valid
@ -210,7 +209,7 @@ StackFrameX86 *StackwalkerX86::GetCallerByWindowsFrameInfo(
last_frame_info->saved_register_size; last_frame_info->saved_register_size;
u_int32_t raSearchStartOld = raSearchStart; u_int32_t raSearchStartOld = raSearchStart;
u_int32_t found = 0; // dummy value u_int32_t found = 0; // dummy value
// Scan up to three words above the calculated search value, in case // Scan up to three words above the calculated search value, in case
// the stack was aligned to a quadword boundary. // the stack was aligned to a quadword boundary.
if (ScanForReturnAddress(raSearchStart, &raSearchStart, &found, 3) && if (ScanForReturnAddress(raSearchStart, &raSearchStart, &found, 3) &&
@ -419,7 +418,7 @@ StackFrameX86 *StackwalkerX86::GetCallerByWindowsFrameInfo(
// Create a new stack frame (ownership will be transferred to the caller) // Create a new stack frame (ownership will be transferred to the caller)
// and fill it in. // and fill it in.
StackFrameX86 *frame = new StackFrameX86(); StackFrameX86* frame = new StackFrameX86();
frame->trust = trust; frame->trust = trust;
frame->context = last_frame->context; frame->context = last_frame->context;
@ -448,10 +447,10 @@ StackFrameX86 *StackwalkerX86::GetCallerByWindowsFrameInfo(
return frame; return frame;
} }
StackFrameX86 *StackwalkerX86::GetCallerByCFIFrameInfo( StackFrameX86* StackwalkerX86::GetCallerByCFIFrameInfo(
const vector<StackFrame*> &frames, const vector<StackFrame*> &frames,
CFIFrameInfo *cfi_frame_info) { CFIFrameInfo* cfi_frame_info) {
StackFrameX86 *last_frame = static_cast<StackFrameX86*>(frames.back()); StackFrameX86* last_frame = static_cast<StackFrameX86*>(frames.back());
last_frame->cfi_frame_info = cfi_frame_info; last_frame->cfi_frame_info = cfi_frame_info;
scoped_ptr<StackFrameX86> frame(new StackFrameX86()); scoped_ptr<StackFrameX86> frame(new StackFrameX86());
@ -460,7 +459,7 @@ StackFrameX86 *StackwalkerX86::GetCallerByCFIFrameInfo(
last_frame->context, last_frame->context_validity, last_frame->context, last_frame->context_validity,
&frame->context, &frame->context_validity)) &frame->context, &frame->context_validity))
return NULL; return NULL;
// Make sure we recovered all the essentials. // Make sure we recovered all the essentials.
static const int essentials = (StackFrameX86::CONTEXT_VALID_EIP static const int essentials = (StackFrameX86::CONTEXT_VALID_EIP
| StackFrameX86::CONTEXT_VALID_ESP | StackFrameX86::CONTEXT_VALID_ESP
@ -473,10 +472,10 @@ StackFrameX86 *StackwalkerX86::GetCallerByCFIFrameInfo(
return frame.release(); return frame.release();
} }
StackFrameX86 *StackwalkerX86::GetCallerByEBPAtBase( StackFrameX86* StackwalkerX86::GetCallerByEBPAtBase(
const vector<StackFrame *> &frames) { const vector<StackFrame*> &frames) {
StackFrame::FrameTrust trust; StackFrame::FrameTrust trust;
StackFrameX86 *last_frame = static_cast<StackFrameX86 *>(frames.back()); StackFrameX86* last_frame = static_cast<StackFrameX86*>(frames.back());
u_int32_t last_esp = last_frame->context.esp; u_int32_t last_esp = last_frame->context.esp;
u_int32_t last_ebp = last_frame->context.ebp; u_int32_t last_ebp = last_frame->context.ebp;
@ -532,7 +531,7 @@ StackFrameX86 *StackwalkerX86::GetCallerByEBPAtBase(
// Create a new stack frame (ownership will be transferred to the caller) // Create a new stack frame (ownership will be transferred to the caller)
// and fill it in. // and fill it in.
StackFrameX86 *frame = new StackFrameX86(); StackFrameX86* frame = new StackFrameX86();
frame->trust = trust; frame->trust = trust;
frame->context = last_frame->context; frame->context = last_frame->context;
@ -546,26 +545,26 @@ StackFrameX86 *StackwalkerX86::GetCallerByEBPAtBase(
return frame; return frame;
} }
StackFrame *StackwalkerX86::GetCallerFrame(const CallStack *stack) { StackFrame* StackwalkerX86::GetCallerFrame(const CallStack* stack) {
if (!memory_ || !stack) { if (!memory_ || !stack) {
BPLOG(ERROR) << "Can't get caller frame without memory or stack"; BPLOG(ERROR) << "Can't get caller frame without memory or stack";
return NULL; return NULL;
} }
const vector<StackFrame *> &frames = *stack->frames(); const vector<StackFrame*> &frames = *stack->frames();
StackFrameX86 *last_frame = static_cast<StackFrameX86 *>(frames.back()); StackFrameX86* last_frame = static_cast<StackFrameX86*>(frames.back());
scoped_ptr<StackFrameX86> new_frame; scoped_ptr<StackFrameX86> new_frame;
// If the resolver has Windows stack walking information, use that. // If the resolver has Windows stack walking information, use that.
WindowsFrameInfo *windows_frame_info WindowsFrameInfo* windows_frame_info
= resolver_ ? resolver_->FindWindowsFrameInfo(last_frame) : NULL; = frame_symbolizer_->FindWindowsFrameInfo(last_frame);
if (windows_frame_info) if (windows_frame_info)
new_frame.reset(GetCallerByWindowsFrameInfo(frames, windows_frame_info)); new_frame.reset(GetCallerByWindowsFrameInfo(frames, windows_frame_info));
// If the resolver has DWARF CFI information, use that. // If the resolver has DWARF CFI information, use that.
if (!new_frame.get()) { if (!new_frame.get()) {
CFIFrameInfo *cfi_frame_info = CFIFrameInfo* cfi_frame_info =
resolver_ ? resolver_->FindCFIFrameInfo(last_frame) : NULL; frame_symbolizer_->FindCFIFrameInfo(last_frame);
if (cfi_frame_info) if (cfi_frame_info)
new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info)); new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info));
} }
@ -577,7 +576,7 @@ StackFrame *StackwalkerX86::GetCallerFrame(const CallStack *stack) {
// If nothing worked, tell the caller. // If nothing worked, tell the caller.
if (!new_frame.get()) if (!new_frame.get())
return NULL; return NULL;
// Treat an instruction address of 0 as end-of-stack. // Treat an instruction address of 0 as end-of-stack.
if (new_frame->context.eip == 0) if (new_frame->context.eip == 0)
return NULL; return NULL;

View file

@ -1,4 +1,4 @@
// -*- mode: c++ -*- // -*- mode: c++ -*-
// Copyright (c) 2010 Google Inc. // Copyright (c) 2010 Google Inc.
// All rights reserved. // All rights reserved.
@ -40,6 +40,7 @@
#ifndef PROCESSOR_STACKWALKER_X86_H__ #ifndef PROCESSOR_STACKWALKER_X86_H__
#define PROCESSOR_STACKWALKER_X86_H__ #define PROCESSOR_STACKWALKER_X86_H__
#include <vector>
#include "google_breakpad/common/breakpad_types.h" #include "google_breakpad/common/breakpad_types.h"
#include "google_breakpad/common/minidump_format.h" #include "google_breakpad/common/minidump_format.h"
@ -58,12 +59,11 @@ class StackwalkerX86 : public Stackwalker {
// register state corresponding to the innermost called frame to be // register state corresponding to the innermost called frame to be
// included in the stack. The other arguments are passed directly through // included in the stack. The other arguments are passed directly through
// to the base Stackwalker constructor. // to the base Stackwalker constructor.
StackwalkerX86(const SystemInfo *system_info, StackwalkerX86(const SystemInfo* system_info,
const MDRawContextX86 *context, const MDRawContextX86* context,
MemoryRegion *memory, MemoryRegion* memory,
const CodeModules *modules, const CodeModules* modules,
SymbolSupplier *supplier, StackFrameSymbolizer* frame_symbolizer);
SourceLineResolverInterface *resolver);
private: private:
// A STACK CFI-driven frame walker for the X86. // A STACK CFI-driven frame walker for the X86.
@ -73,32 +73,32 @@ class StackwalkerX86 : public Stackwalker {
// stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or // stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or
// alternate conventions as guided by any WindowsFrameInfo available for the // alternate conventions as guided by any WindowsFrameInfo available for the
// code in question.). // code in question.).
virtual StackFrame *GetContextFrame(); virtual StackFrame* GetContextFrame();
virtual StackFrame *GetCallerFrame(const CallStack *stack); virtual StackFrame* GetCallerFrame(const CallStack* stack);
// Use windows_frame_info (derived from STACK WIN and FUNC records) // Use windows_frame_info (derived from STACK WIN and FUNC records)
// to construct the frame that called frames.back(). The caller // to construct the frame that called frames.back(). The caller
// takes ownership of the returned frame. Return NULL on failure. // takes ownership of the returned frame. Return NULL on failure.
StackFrameX86 *GetCallerByWindowsFrameInfo( StackFrameX86* GetCallerByWindowsFrameInfo(
const vector<StackFrame*> &frames, const vector<StackFrame*> &frames,
WindowsFrameInfo *windows_frame_info); WindowsFrameInfo* windows_frame_info);
// Use cfi_frame_info (derived from STACK CFI records) to construct // Use cfi_frame_info (derived from STACK CFI records) to construct
// the frame that called frames.back(). The caller takes ownership // the frame that called frames.back(). The caller takes ownership
// of the returned frame. Return NULL on failure. // of the returned frame. Return NULL on failure.
StackFrameX86 *GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames, StackFrameX86* GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames,
CFIFrameInfo *cfi_frame_info); CFIFrameInfo* cfi_frame_info);
// Assuming a traditional frame layout --- where the caller's %ebp // Assuming a traditional frame layout --- where the caller's %ebp
// has been pushed just after the return address and the callee's // has been pushed just after the return address and the callee's
// %ebp points to the saved %ebp --- construct the frame that called // %ebp points to the saved %ebp --- construct the frame that called
// frames.back(). The caller takes ownership of the returned frame. // frames.back(). The caller takes ownership of the returned frame.
// Return NULL on failure. // Return NULL on failure.
StackFrameX86 *GetCallerByEBPAtBase(const vector<StackFrame*> &frames); StackFrameX86* GetCallerByEBPAtBase(const vector<StackFrame*> &frames);
// Stores the CPU context corresponding to the innermost stack frame to // Stores the CPU context corresponding to the innermost stack frame to
// be returned by GetContextFrame. // be returned by GetContextFrame.
const MDRawContextX86 *context_; const MDRawContextX86* context_;
// Our register map, for cfi_walker_. // Our register map, for cfi_walker_.
static const CFIWalker::RegisterSet cfi_register_map_[]; static const CFIWalker::RegisterSet cfi_register_map_[];

View file

@ -48,6 +48,7 @@
using google_breakpad::BasicSourceLineResolver; using google_breakpad::BasicSourceLineResolver;
using google_breakpad::CallStack; using google_breakpad::CallStack;
using google_breakpad::StackFrameSymbolizer;
using google_breakpad::StackFrame; using google_breakpad::StackFrame;
using google_breakpad::StackFrameX86; using google_breakpad::StackFrameX86;
using google_breakpad::StackwalkerX86; using google_breakpad::StackwalkerX86;
@ -148,8 +149,9 @@ TEST_F(SanityCheck, NoResolver) {
raw_context.eip = 0x40000200; raw_context.eip = 0x40000200;
raw_context.ebp = 0x80000000; raw_context.ebp = 0x80000000;
StackFrameSymbolizer frame_symbolizer(NULL, NULL);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
NULL, NULL); &frame_symbolizer);
// This should succeed, even without a resolver or supplier. // This should succeed, even without a resolver or supplier.
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
@ -168,8 +170,9 @@ TEST_F(GetContextFrame, Simple) {
raw_context.eip = 0x40000200; raw_context.eip = 0x40000200;
raw_context.ebp = 0x80000000; raw_context.ebp = 0x80000000;
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
StackFrameX86 *frame = static_cast<StackFrameX86 *>(frames->at(0)); StackFrameX86 *frame = static_cast<StackFrameX86 *>(frames->at(0));
@ -200,8 +203,9 @@ TEST_F(GetCallerFrame, Traditional) {
raw_context.esp = stack_section.start().Value(); raw_context.esp = stack_section.start().Value();
raw_context.ebp = frame0_ebp.Value(); raw_context.ebp = frame0_ebp.Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -255,8 +259,9 @@ TEST_F(GetCallerFrame, TraditionalScan) {
// for something that looks like a return address. // for something that looks like a return address.
raw_context.ebp = 0xd43eed6e; raw_context.ebp = 0xd43eed6e;
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -316,8 +321,9 @@ TEST_F(GetCallerFrame, TraditionalScanLongWay) {
// for something that looks like a return address. // for something that looks like a return address.
raw_context.ebp = 0xd43eed6e; raw_context.ebp = 0xd43eed6e;
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -387,8 +393,9 @@ TEST_F(GetCallerFrame, WindowsFrameData) {
raw_context.esp = stack_section.start().Value(); raw_context.esp = stack_section.start().Value();
raw_context.ebp = 0xf052c1de; // should not be needed to walk frame raw_context.ebp = 0xf052c1de; // should not be needed to walk frame
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -458,8 +465,9 @@ TEST_F(GetCallerFrame, WindowsFrameDataAligned) {
raw_context.esp = stack_section.start().Value(); raw_context.esp = stack_section.start().Value();
raw_context.ebp = 0xf052c1de; // should not be needed to walk frame raw_context.ebp = 0xf052c1de; // should not be needed to walk frame
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -540,8 +548,9 @@ TEST_F(GetCallerFrame, WindowsFrameDataParameterSize) {
raw_context.esp = stack_section.start().Value(); raw_context.esp = stack_section.start().Value();
raw_context.ebp = frame0_ebp.Value(); raw_context.ebp = frame0_ebp.Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(3U, frames->size()); ASSERT_EQ(3U, frames->size());
@ -634,8 +643,9 @@ TEST_F(GetCallerFrame, WindowsFrameDataScan) {
raw_context.esp = stack_section.start().Value(); raw_context.esp = stack_section.start().Value();
raw_context.ebp = 0x2ae314cd; // should not be needed to walk frame raw_context.ebp = 0x2ae314cd; // should not be needed to walk frame
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -717,8 +727,9 @@ TEST_F(GetCallerFrame, WindowsFrameDataBadEIPScan) {
raw_context.esp = stack_section.start().Value(); raw_context.esp = stack_section.start().Value();
raw_context.ebp = frame0_ebp.Value(); raw_context.ebp = frame0_ebp.Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -784,8 +795,9 @@ TEST_F(GetCallerFrame, WindowsFPOUnchangedEBP) {
// Frame pointer unchanged from caller. // Frame pointer unchanged from caller.
raw_context.ebp = frame1_ebp.Value(); raw_context.ebp = frame1_ebp.Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -860,8 +872,9 @@ TEST_F(GetCallerFrame, WindowsFPOUsedEBP) {
// RaisedByTheAliens uses %ebp for its own mysterious purposes. // RaisedByTheAliens uses %ebp for its own mysterious purposes.
raw_context.ebp = 0xecbdd1a5; raw_context.ebp = 0xecbdd1a5;
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());
@ -997,8 +1010,9 @@ TEST_F(GetCallerFrame, WindowsFPOSystemCall) {
ASSERT_TRUE(raw_context.esp == frame0_esp.Value()); ASSERT_TRUE(raw_context.esp == frame0_esp.Value());
raw_context.ebp = frame1_ebp.Value(); raw_context.ebp = frame1_ebp.Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
@ -1097,8 +1111,9 @@ struct CFIFixture: public StackwalkerX86Fixture {
RegionFromSection(); RegionFromSection();
raw_context.esp = stack_section.start().Value(); raw_context.esp = stack_section.start().Value();
StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules, StackwalkerX86 walker(&system_info, &raw_context, &stack_region, &modules,
&supplier, &resolver); &frame_symbolizer);
ASSERT_TRUE(walker.Walk(&call_stack)); ASSERT_TRUE(walker.Walk(&call_stack));
frames = call_stack.frames(); frames = call_stack.frames();
ASSERT_EQ(2U, frames->size()); ASSERT_EQ(2U, frames->size());