diff -Nru google-breakpad-0.1.0/aclocal.m4 google-breakpad-0.1.0/aclocal.m4 --- google-breakpad-0.1.0/aclocal.m4 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/aclocal.m4 2019-03-26 03:56:45.000000000 +0000 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -20,7 +20,7 @@ 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'.])]) -# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# Copyright (C) 2002-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -35,7 +35,7 @@ [am__api_version='1.15' 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. -m4_if([$1], [1.15], [], +m4_if([$1], [1.15.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -51,12 +51,12 @@ # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.15])dnl +[AM_AUTOMAKE_VERSION([1.15.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) -# Copyright (C) 2011-2014 Free Software Foundation, Inc. +# Copyright (C) 2011-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -118,7 +118,7 @@ # Figure out how to run the assembler. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -138,7 +138,7 @@ # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -190,7 +190,7 @@ # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -221,7 +221,7 @@ Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -412,7 +412,7 @@ # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -488,7 +488,7 @@ # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -685,7 +685,7 @@ done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -706,7 +706,7 @@ fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# Copyright (C) 2003-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -728,7 +728,7 @@ # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -763,7 +763,7 @@ # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -813,7 +813,7 @@ # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -854,7 +854,7 @@ # Obsolete and "removed" macros, that must however still report explicit # error messages when used, to smooth transition. # -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -881,7 +881,7 @@ # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -910,7 +910,7 @@ AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -957,7 +957,7 @@ # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -976,7 +976,7 @@ # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1057,7 +1057,7 @@ rm -f conftest.file ]) -# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# Copyright (C) 2009-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1117,7 +1117,7 @@ _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1145,7 +1145,7 @@ INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# Copyright (C) 2006-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -1164,7 +1164,7 @@ # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# Copyright (C) 2004-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff -Nru google-breakpad-0.1.0/autotools/root-test-driver google-breakpad-0.1.0/autotools/root-test-driver --- google-breakpad-0.1.0/autotools/root-test-driver 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/autotools/root-test-driver 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,3 @@ +#!/bin/sh +# -E to keep the environment variables needed to run the tests. +exec sudo -E "$@" diff -Nru google-breakpad-0.1.0/configure google-breakpad-0.1.0/configure --- google-breakpad-0.1.0/configure 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/configure 2019-03-26 03:56:45.000000000 +0000 @@ -626,6 +626,8 @@ am__EXEEXT_TRUE LTLIBOBJS LIBOBJS +TESTS_AS_ROOT_FALSE +TESTS_AS_ROOT_TRUE RUST_DEMANGLE_LIBS RUST_DEMANGLE_CFLAGS SELFTEST_FALSE @@ -777,6 +779,7 @@ enable_system_test_libs enable_selftest with_rust_demangle +with_tests_as_root ' ac_precious_vars='build_alias host_alias @@ -1444,6 +1447,9 @@ Link against the rust-demangle library to demangle Rust language symbols during symbol dumping (default is no) Pass the path to the crate root. + --with-tests-as-root Run the tests as root. Use this on platforms like + travis-ci.org that require root privileges to use + ptrace (default is no) Some influential environment variables: CC C compiler command @@ -6092,7 +6098,7 @@ We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -6138,7 +6144,7 @@ We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -6162,7 +6168,7 @@ We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -6207,7 +6213,7 @@ We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -6231,7 +6237,7 @@ We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; @@ -7870,6 +7876,33 @@ + +# Check whether --with-tests-as-root was given. +if test "${with_tests_as_root+set}" = set; then : + withval=$with_tests_as_root; case "${withval}" in + yes) + tests_as_root=true + ;; + no) + tests_as_root=false + ;; + *) + as_fn_error $? "--with-tests-as-root can only be \"yes\" or \"no\"" "$LINENO" 5 + ;; + esac +else + tests_as_root=false +fi + + if test x$tests_as_root = xtrue; then + TESTS_AS_ROOT_TRUE= + TESTS_AS_ROOT_FALSE='#' +else + TESTS_AS_ROOT_TRUE='#' + TESTS_AS_ROOT_FALSE= +fi + + ac_config_files="$ac_config_files breakpad.pc breakpad-client.pc Makefile" @@ -8049,6 +8082,10 @@ as_fn_error $? "conditional \"SELFTEST\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${TESTS_AS_ROOT_TRUE}" && test -z "${TESTS_AS_ROOT_FALSE}"; then + as_fn_error $? "conditional \"TESTS_AS_ROOT\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 diff -Nru google-breakpad-0.1.0/configure.ac google-breakpad-0.1.0/configure.ac --- google-breakpad-0.1.0/configure.ac 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/configure.ac 2019-03-26 03:56:45.000000000 +0000 @@ -246,6 +246,25 @@ AC_ARG_VAR([RUST_DEMANGLE_CFLAGS], [Compiler flags for rust-demangle]) AC_ARG_VAR([RUST_DEMANGLE_LIBS], [Linker flags for rust-demangle]) +AC_ARG_WITH(tests-as-root, + AS_HELP_STRING([--with-tests-as-root], + [Run the tests as root. Use this on platforms] + [like travis-ci.org that require root privileges] + [to use ptrace (default is no)]), + [case "${withval}" in + yes) + tests_as_root=true + ;; + no) + tests_as_root=false + ;; + *) + AC_MSG_ERROR(--with-tests-as-root can only be "yes" or "no") + ;; + esac], + [tests_as_root=false]) +AM_CONDITIONAL(TESTS_AS_ROOT, test x$tests_as_root = xtrue) + AC_CONFIG_FILES(m4_flatten([ breakpad.pc breakpad-client.pc diff -Nru google-breakpad-0.1.0/debian/changelog google-breakpad-0.1.0/debian/changelog --- google-breakpad-0.1.0/debian/changelog 2018-06-17 12:40:21.000000000 +0000 +++ google-breakpad-0.1.0/debian/changelog 2019-03-26 03:56:54.000000000 +0000 @@ -1,8 +1,8 @@ -google-breakpad (0.1.0-2~ppa~quentier~201806171240~ubuntu18.10.1) cosmic; urgency=low +google-breakpad (0.1.0-2~ppa~quentier~201903260356~ubuntu18.10.1) cosmic; urgency=low * Auto build. - -- Dmitry Ivanov Sun, 17 Jun 2018 12:40:21 +0000 + -- Dmitry Ivanov Tue, 26 Mar 2019 03:56:54 +0000 google-breakpad (0.1.0-2) unstable; urgency=medium diff -Nru google-breakpad-0.1.0/debian/git-build-recipe.manifest google-breakpad-0.1.0/debian/git-build-recipe.manifest --- google-breakpad-0.1.0/debian/git-build-recipe.manifest 2018-06-17 12:40:21.000000000 +0000 +++ google-breakpad-0.1.0/debian/git-build-recipe.manifest 2019-03-26 03:56:54.000000000 +0000 @@ -1,4 +1,4 @@ -# git-build-recipe format 0.4 deb-version {debversion}~ppa~quentier~201806171240 -lp:breakpad git-commit:4f9988b2546456070904dc5c6f83a952915593c9 -nest lss lp:linux-syscall-support src/third_party/lss git-commit:a89bf7903f3169e6bc7b8efc10a73a7571de21cf +# git-build-recipe format 0.4 deb-version {debversion}~ppa~quentier~201903260356 +lp:breakpad git-commit:a86aedb515c3b2bd778b342402f09bc6009e8d7b +nest lss lp:linux-syscall-support src/third_party/lss git-commit:8048ece6c16c91acfe0d36d1d3cc0890ab6e945c nest-part packaging lp:quentier-deb-packaging google-breakpad/debian debian git-commit:51211f6edd3c559b2d3b777d920e70271b12d431 diff -Nru google-breakpad-0.1.0/default.xml google-breakpad-0.1.0/default.xml --- google-breakpad-0.1.0/default.xml 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/default.xml 2019-03-26 03:56:45.000000000 +0000 @@ -27,12 +27,12 @@ `FUNC` _address_ _size_ _parameter\_size_ _name_ +> `FUNC` _[m]_ _address_ _size_ _parameter\_size_ _name_ -For example: `FUNC c184 30 0 nsQueryInterfaceWithError::operator()(nsID const&, +For example: `FUNC m c184 30 0 nsQueryInterfaceWithError::operator()(nsID const&, void**) const ` +The _m_ field is optional. If present it indicates that multiple symbols +reference this function's instructions. (In which case, only one symbol name is +mentioned within the breakpad file.) Multiple symbols referencing the same +instructions may occur due to identical code folding by the linker. + The _address_ and _size_ fields are hexadecimal numbers indicating the start address and length in bytes of the machine code instructions the function occupies. (Breakpad symbol files cannot accurately describe functions whose code @@ -158,9 +163,9 @@ to identify an assembly language entry point or region of memory. It has the form: -> PUBLIC _address_ _parameter\_size_ _name_ +> PUBLIC _[m]_ _address_ _parameter\_size_ _name_ -For example: `PUBLIC 2160 0 Public2_1 +For example: `PUBLIC m 2160 0 Public2_1 ` The Breakpad processor essentially treats a `PUBLIC` record as defining a @@ -168,6 +173,11 @@ the next address mentioned. If a given address is covered by both a `PUBLIC` record and a `FUNC` record, the processor uses the `FUNC` data. +The _m_ field is optional. If present it indicates that multiple symbols +reference this function's instructions. (In which case, only one symbol name is +mentioned within the breakpad file.) Multiple symbols referencing the same +instructions may occur due to identical code folding by the linker. + The _address_ field is a hexadecimal number indicating the symbol's address, relative to the module's load address. diff -Nru google-breakpad-0.1.0/.github/mistaken-pull-closer.yml google-breakpad-0.1.0/.github/mistaken-pull-closer.yml --- google-breakpad-0.1.0/.github/mistaken-pull-closer.yml 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/.github/mistaken-pull-closer.yml 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,17 @@ +# The JSONPath filter expression used to identify which PRs to close. +# The data filtered is the pull request data along with other metadata passed in +# by probot. +# See http://goessner.net/articles/JsonPath/ +# `true` will close all PRs. +filters: + - true + +# The message to post to the closed PR. +commentBody: | + Thanks for your contribution! Unfortunately, we don't use GitHub pull + requests to manage code contributions to this repository. Instead, please + see [README.md](../blob/master/README.md) which provides full instructions + on how to get involved. + +# Whether to add a label to the closed PR. +addLabel: false diff -Nru google-breakpad-0.1.0/Makefile.am google-breakpad-0.1.0/Makefile.am --- google-breakpad-0.1.0/Makefile.am 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/Makefile.am 2019-03-26 03:56:45.000000000 +0000 @@ -233,6 +233,8 @@ src/processor/cfi_frame_info.h \ src/processor/contained_range_map-inl.h \ src/processor/contained_range_map.h \ + src/processor/convert_old_arm64_context.cc \ + src/processor/convert_old_arm64_context.h \ src/processor/disassembler_x86.h \ src/processor/disassembler_x86.cc \ src/processor/dump_context.cc \ @@ -446,8 +448,12 @@ LOG_DRIVER = $(top_srcdir)/android/test-driver else # The default Autotools test driver script. +if TESTS_AS_ROOT +LOG_DRIVER = $(top_srcdir)/autotools/root-test-driver $(top_srcdir)/autotools/test-driver +else LOG_DRIVER = $(top_srcdir)/autotools/test-driver -endif +endif !TESTS_AS_ROOT +endif !ANDROID_HOST if LINUX_HOST src_client_linux_linux_dumper_unittest_helper_SOURCES = \ @@ -483,6 +489,7 @@ src/common/tests/file_utils.cc \ src/common/tests/file_utils.h \ src/processor/basic_code_modules.cc \ + src/processor/convert_old_arm64_context.cc \ src/processor/dump_context.cc \ src/processor/dump_object.cc \ src/processor/logging.cc \ @@ -567,6 +574,7 @@ src/common/dwarf_cfi_to_module.cc \ src/common/dwarf_cu_to_module.cc \ src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc \ src/common/language.cc \ src/common/module.cc \ src/common/path_helper.cc \ @@ -615,6 +623,7 @@ src/common/dwarf_cfi_to_module.cc \ src/common/dwarf_cu_to_module.cc \ src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc \ src/common/language.cc \ src/common/md5.cc \ src/common/module.cc \ @@ -654,6 +663,7 @@ src/common/dwarf_cu_to_module_unittest.cc \ src/common/dwarf_line_to_module.cc \ src/common/dwarf_line_to_module_unittest.cc \ + src/common/dwarf_range_list_handler.cc \ src/common/language.cc \ src/common/memory_range_unittest.cc \ src/common/module.cc \ @@ -807,6 +817,7 @@ src_processor_exploitability_unittest_CPPFLAGS = \ $(AM_CPPFLAGS) $(TEST_CFLAGS) src_processor_exploitability_unittest_LDADD = \ + src/processor/convert_old_arm64_context.o \ src/processor/minidump_processor.o \ src/processor/process_state.o \ src/processor/disassembler_x86.o \ @@ -888,6 +899,7 @@ src/processor/basic_code_modules.o \ src/processor/basic_source_line_resolver.o \ src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ src/processor/cfi_frame_info.o \ src/processor/dump_context.o \ src/processor/dump_object.o \ @@ -922,6 +934,7 @@ src/processor/basic_source_line_resolver.o \ src/processor/call_stack.o \ src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ src/processor/disassembler_x86.o \ src/processor/dump_context.o \ src/processor/dump_object.o \ @@ -961,6 +974,7 @@ $(AM_CPPFLAGS) $(TEST_CFLAGS) src_processor_minidump_unittest_LDADD = \ src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ src/processor/dump_context.o \ src/processor/dump_object.o \ src/processor/logging.o \ @@ -1182,6 +1196,7 @@ src/processor/minidump_dump.cc src_processor_minidump_dump_LDADD = \ src/processor/basic_code_modules.o \ + src/processor/convert_old_arm64_context.o \ src/processor/dump_context.o \ src/processor/dump_object.o \ src/processor/logging.o \ @@ -1196,6 +1211,7 @@ src/processor/basic_code_modules.o \ src/processor/basic_source_line_resolver.o \ src/processor/call_stack.o \ + src/processor/convert_old_arm64_context.o \ src/processor/cfi_frame_info.o \ src/processor/disassembler_x86.o \ src/processor/dump_context.o \ @@ -1231,6 +1247,7 @@ src/processor/basic_source_line_resolver.o \ src/processor/call_stack.o \ src/processor/cfi_frame_info.o \ + src/processor/convert_old_arm64_context.o \ src/processor/disassembler_x86.o \ src/processor/dump_context.o \ src/processor/dump_object.o \ diff -Nru google-breakpad-0.1.0/Makefile.in google-breakpad-0.1.0/Makefile.in --- google-breakpad-0.1.0/Makefile.in 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/Makefile.in 2019-03-26 03:56:45.000000000 +0000 @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2014 Free Software Foundation, Inc. +# Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -385,6 +385,8 @@ src/processor/cfi_frame_info.h \ src/processor/contained_range_map-inl.h \ src/processor/contained_range_map.h \ + src/processor/convert_old_arm64_context.cc \ + src/processor/convert_old_arm64_context.h \ src/processor/disassembler_x86.h \ src/processor/disassembler_x86.cc \ src/processor/dump_context.cc src/processor/dump_object.cc \ @@ -455,6 +457,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.$(OBJEXT) \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.$(OBJEXT) \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.$(OBJEXT) \ @@ -626,6 +629,7 @@ src/common/tests/auto_tempdir.h src/common/tests/file_utils.cc \ src/common/tests/file_utils.h \ src/processor/basic_code_modules.cc \ + src/processor/convert_old_arm64_context.cc \ src/processor/dump_context.cc src/processor/dump_object.cc \ src/processor/logging.cc src/processor/minidump.cc \ src/processor/pathname_stripper.cc \ @@ -656,6 +660,7 @@ @LINUX_HOST_TRUE@ src/common/src_client_linux_linux_client_unittest_shlib-memory_allocator_unittest.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/common/tests/src_client_linux_linux_client_unittest_shlib-file_utils.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-basic_code_modules.$(OBJEXT) \ +@LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-dump_context.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-dump_object.$(OBJEXT) \ @LINUX_HOST_TRUE@ src/processor/src_client_linux_linux_client_unittest_shlib-logging.$(OBJEXT) \ @@ -689,10 +694,10 @@ src/common/dwarf_cu_to_module_unittest.cc \ src/common/dwarf_line_to_module.cc \ src/common/dwarf_line_to_module_unittest.cc \ - src/common/language.cc src/common/memory_range_unittest.cc \ - src/common/module.cc src/common/module_unittest.cc \ - src/common/path_helper.cc src/common/stabs_reader.cc \ - src/common/stabs_reader_unittest.cc \ + src/common/dwarf_range_list_handler.cc src/common/language.cc \ + src/common/memory_range_unittest.cc src/common/module.cc \ + src/common/module_unittest.cc src/common/path_helper.cc \ + src/common/stabs_reader.cc src/common/stabs_reader_unittest.cc \ src/common/stabs_to_module.cc \ src/common/stabs_to_module_unittest.cc \ src/common/test_assembler.cc src/common/dwarf/bytereader.cc \ @@ -735,6 +740,7 @@ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_common_dumper_unittest-dwarf_cu_to_module_unittest.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_common_dumper_unittest-dwarf_line_to_module.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_common_dumper_unittest-dwarf_line_to_module_unittest.$(OBJEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_common_dumper_unittest-dwarf_range_list_handler.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_common_dumper_unittest-language.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_common_dumper_unittest-memory_range_unittest.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_common_dumper_unittest-module.$(OBJEXT) \ @@ -906,7 +912,7 @@ @DISABLE_PROCESSOR_FALSE@am_src_processor_exploitability_unittest_OBJECTS = src/processor/src_processor_exploitability_unittest-exploitability_unittest.$(OBJEXT) src_processor_exploitability_unittest_OBJECTS = \ $(am_src_processor_exploitability_unittest_OBJECTS) -@DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_DEPENDENCIES = \ +@DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_DEPENDENCIES = src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ @@ -979,6 +985,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @@ -1014,6 +1021,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @@ -1047,6 +1055,7 @@ $(am_src_processor_minidump_dump_OBJECTS) @DISABLE_PROCESSOR_FALSE@src_processor_minidump_dump_DEPENDENCIES = \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ @@ -1063,6 +1072,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @@ -1105,6 +1115,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @@ -1146,6 +1157,7 @@ $(am_src_processor_minidump_unittest_OBJECTS) @DISABLE_PROCESSOR_FALSE@src_processor_minidump_unittest_DEPENDENCIES = \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ @@ -1391,7 +1403,8 @@ am__src_tools_linux_dump_syms_dump_syms_SOURCES_DIST = \ src/common/dwarf_cfi_to_module.cc \ src/common/dwarf_cu_to_module.cc \ - src/common/dwarf_line_to_module.cc src/common/language.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc src/common/language.cc \ src/common/module.cc src/common/path_helper.cc \ src/common/stabs_reader.cc src/common/stabs_to_module.cc \ src/common/dwarf/bytereader.cc \ @@ -1410,6 +1423,7 @@ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_linux_dump_syms_dump_syms_OBJECTS = src/common/src_tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_linux_dump_syms_dump_syms-dwarf_line_to_module.$(OBJEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_linux_dump_syms_dump_syms-language.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_linux_dump_syms_dump_syms-module.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_linux_dump_syms_dump_syms-path_helper.$(OBJEXT) \ @@ -1475,7 +1489,8 @@ am__src_tools_mac_dump_syms_dump_syms_mac_SOURCES_DIST = \ src/common/dwarf_cfi_to_module.cc \ src/common/dwarf_cu_to_module.cc \ - src/common/dwarf_line_to_module.cc src/common/language.cc \ + src/common/dwarf_line_to_module.cc \ + src/common/dwarf_range_list_handler.cc src/common/language.cc \ src/common/md5.cc src/common/module.cc \ src/common/path_helper.cc src/common/stabs_reader.cc \ src/common/stabs_to_module.cc src/common/dwarf/bytereader.cc \ @@ -1494,6 +1509,7 @@ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@am_src_tools_mac_dump_syms_dump_syms_mac_OBJECTS = src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.$(OBJEXT) \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_mac_dump_syms_dump_syms_mac-language.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_mac_dump_syms_dump_syms_mac-md5.$(OBJEXT) \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/src_tools_mac_dump_syms_dump_syms_mac-module.$(OBJEXT) \ @@ -2031,6 +2047,7 @@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -2179,6 +2196,8 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.h \ @DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map-inl.h \ @DISABLE_PROCESSOR_FALSE@ src/processor/contained_range_map.h \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.cc \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.h \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.h \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.cc \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.cc \ @@ -2291,8 +2310,9 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump_stackwalk_machine_readable_test TESTS = $(check_PROGRAMS) $(check_SCRIPTS) +@ANDROID_HOST_FALSE@@TESTS_AS_ROOT_FALSE@LOG_DRIVER = $(top_srcdir)/autotools/test-driver # The default Autotools test driver script. -@ANDROID_HOST_FALSE@LOG_DRIVER = $(top_srcdir)/autotools/test-driver +@ANDROID_HOST_FALSE@@TESTS_AS_ROOT_TRUE@LOG_DRIVER = $(top_srcdir)/autotools/root-test-driver $(top_srcdir)/autotools/test-driver # Since Autotools 1.2, tests are run through a special "test driver" script. # Unfortunately, it's not possible anymore to specify an alternative shell to @@ -2329,6 +2349,7 @@ @LINUX_HOST_TRUE@ src/common/tests/file_utils.cc \ @LINUX_HOST_TRUE@ src/common/tests/file_utils.h \ @LINUX_HOST_TRUE@ src/processor/basic_code_modules.cc \ +@LINUX_HOST_TRUE@ src/processor/convert_old_arm64_context.cc \ @LINUX_HOST_TRUE@ src/processor/dump_context.cc \ @LINUX_HOST_TRUE@ src/processor/dump_object.cc \ @LINUX_HOST_TRUE@ src/processor/logging.cc \ @@ -2397,6 +2418,7 @@ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cfi_to_module.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cu_to_module.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module.cc \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_range_list_handler.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/language.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/module.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/path_helper.cc \ @@ -2447,6 +2469,7 @@ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cfi_to_module.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cu_to_module.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module.cc \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_range_list_handler.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/language.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/md5.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/module.cc \ @@ -2488,6 +2511,7 @@ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_cu_to_module_unittest.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_line_to_module_unittest.cc \ +@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf_range_list_handler.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/language.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/memory_range_unittest.cc \ @DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/module.cc \ @@ -2653,6 +2677,7 @@ @DISABLE_PROCESSOR_FALSE@ $(AM_CPPFLAGS) $(TEST_CFLAGS) @DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_LDADD = \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/minidump_processor.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/process_state.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ @@ -2742,6 +2767,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @@ -2778,6 +2804,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @@ -2819,6 +2846,7 @@ @DISABLE_PROCESSOR_FALSE@src_processor_minidump_unittest_LDADD = \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ @@ -3072,6 +3100,7 @@ @DISABLE_PROCESSOR_FALSE@src_processor_minidump_dump_LDADD = \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/logging.o \ @@ -3087,6 +3116,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_code_modules.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @@ -3123,6 +3153,7 @@ @DISABLE_PROCESSOR_FALSE@ src/processor/basic_source_line_resolver.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/call_stack.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/cfi_frame_info.o \ +@DISABLE_PROCESSOR_FALSE@ src/processor/convert_old_arm64_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/disassembler_x86.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_context.o \ @DISABLE_PROCESSOR_FALSE@ src/processor/dump_object.o \ @@ -3664,6 +3695,9 @@ src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/cfi_frame_info.$(OBJEXT): src/processor/$(am__dirstamp) \ src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/convert_old_arm64_context.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/disassembler_x86.$(OBJEXT): \ src/processor/$(am__dirstamp) \ src/processor/$(DEPDIR)/$(am__dirstamp) @@ -3965,6 +3999,9 @@ src/processor/src_client_linux_linux_client_unittest_shlib-basic_code_modules.$(OBJEXT): \ src/processor/$(am__dirstamp) \ src/processor/$(DEPDIR)/$(am__dirstamp) +src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.$(OBJEXT): \ + src/processor/$(am__dirstamp) \ + src/processor/$(DEPDIR)/$(am__dirstamp) src/processor/src_client_linux_linux_client_unittest_shlib-dump_context.$(OBJEXT): \ src/processor/$(am__dirstamp) \ src/processor/$(DEPDIR)/$(am__dirstamp) @@ -4024,6 +4061,9 @@ src/common/src_common_dumper_unittest-dwarf_line_to_module_unittest.$(OBJEXT): \ src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) +src/common/src_common_dumper_unittest-dwarf_range_list_handler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) src/common/src_common_dumper_unittest-language.$(OBJEXT): \ src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) @@ -4531,6 +4571,9 @@ src/common/src_tools_linux_dump_syms_dump_syms-dwarf_line_to_module.$(OBJEXT): \ src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) +src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) src/common/src_tools_linux_dump_syms_dump_syms-language.$(OBJEXT): \ src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) @@ -4652,6 +4695,9 @@ src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.$(OBJEXT): \ src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) +src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.$(OBJEXT): \ + src/common/$(am__dirstamp) \ + src/common/$(DEPDIR)/$(am__dirstamp) src/common/src_tools_mac_dump_syms_dump_syms_mac-language.$(OBJEXT): \ src/common/$(am__dirstamp) \ src/common/$(DEPDIR)/$(am__dirstamp) @@ -4782,6 +4828,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_cu_to_module_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_line_to_module.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_line_to_module_unittest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_range_list_handler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_common_dumper_unittest-language.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_common_dumper_unittest-memory_range_unittest.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_common_dumper_unittest-module.Po@am__quote@ @@ -4816,6 +4863,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_cfi_to_module.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_cu_to_module.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_line_to_module.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-language.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-module.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-path_helper.Po@am__quote@ @@ -4824,6 +4872,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_cfi_to_module.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_cu_to_module.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-language.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-md5.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-module.Po@am__quote@ @@ -4920,6 +4969,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/call_stack.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/cfi_frame_info.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/contained_range_map_unittest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/convert_old_arm64_context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/disassembler_x86.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/dump_context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/dump_object.Po@am__quote@ @@ -4946,6 +4996,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/simple_symbol_supplier.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/source_line_resolver_base.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-basic_code_modules.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-dump_context.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-dump_object.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-logging.Po@am__quote@ @@ -5391,6 +5442,20 @@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_client_linux_linux_client_unittest_shlib-basic_code_modules.obj `if test -f 'src/processor/basic_code_modules.cc'; then $(CYGPATH_W) 'src/processor/basic_code_modules.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/basic_code_modules.cc'; fi` +src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o: src/processor/convert_old_arm64_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o -MD -MP -MF src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Tpo -c -o src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o `test -f 'src/processor/convert_old_arm64_context.cc' || echo '$(srcdir)/'`src/processor/convert_old_arm64_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Tpo src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/convert_old_arm64_context.cc' object='src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.o `test -f 'src/processor/convert_old_arm64_context.cc' || echo '$(srcdir)/'`src/processor/convert_old_arm64_context.cc + +src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj: src/processor/convert_old_arm64_context.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj -MD -MP -MF src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Tpo -c -o src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj `if test -f 'src/processor/convert_old_arm64_context.cc'; then $(CYGPATH_W) 'src/processor/convert_old_arm64_context.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/convert_old_arm64_context.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Tpo src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/processor/convert_old_arm64_context.cc' object='src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_client_linux_linux_client_unittest_shlib-convert_old_arm64_context.obj `if test -f 'src/processor/convert_old_arm64_context.cc'; then $(CYGPATH_W) 'src/processor/convert_old_arm64_context.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/convert_old_arm64_context.cc'; fi` + src/processor/src_client_linux_linux_client_unittest_shlib-dump_context.o: src/processor/dump_context.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_client_linux_linux_client_unittest_shlib_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_client_linux_linux_client_unittest_shlib-dump_context.o -MD -MP -MF src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-dump_context.Tpo -c -o src/processor/src_client_linux_linux_client_unittest_shlib-dump_context.o `test -f 'src/processor/dump_context.cc' || echo '$(srcdir)/'`src/processor/dump_context.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-dump_context.Tpo src/processor/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-dump_context.Po @@ -5615,6 +5680,20 @@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_common_dumper_unittest-dwarf_line_to_module_unittest.obj `if test -f 'src/common/dwarf_line_to_module_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module_unittest.cc'; fi` +src/common/src_common_dumper_unittest-dwarf_range_list_handler.o: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_common_dumper_unittest-dwarf_range_list_handler.o -MD -MP -MF src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_range_list_handler.Tpo -c -o src/common/src_common_dumper_unittest-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/src_common_dumper_unittest-dwarf_range_list_handler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_common_dumper_unittest-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc + +src/common/src_common_dumper_unittest-dwarf_range_list_handler.obj: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_common_dumper_unittest-dwarf_range_list_handler.obj -MD -MP -MF src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_range_list_handler.Tpo -c -o src/common/src_common_dumper_unittest-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/src_common_dumper_unittest-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/src_common_dumper_unittest-dwarf_range_list_handler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_common_dumper_unittest-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` + src/common/src_common_dumper_unittest-language.o: src/common/language.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_common_dumper_unittest-language.o -MD -MP -MF src/common/$(DEPDIR)/src_common_dumper_unittest-language.Tpo -c -o src/common/src_common_dumper_unittest-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_common_dumper_unittest-language.Tpo src/common/$(DEPDIR)/src_common_dumper_unittest-language.Po @@ -7071,6 +7150,20 @@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_tools_linux_dump_syms_dump_syms-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` +src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o -MD -MP -MF src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Tpo -c -o src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc + +src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj -MD -MP -MF src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Tpo -c -o src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_tools_linux_dump_syms_dump_syms-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` + src/common/src_tools_linux_dump_syms_dump_syms-language.o: src/common/language.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_linux_dump_syms_dump_syms_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_tools_linux_dump_syms_dump_syms-language.o -MD -MP -MF src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-language.Tpo -c -o src/common/src_tools_linux_dump_syms_dump_syms-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-language.Tpo src/common/$(DEPDIR)/src_tools_linux_dump_syms_dump_syms-language.Po @@ -7379,6 +7472,20 @@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_line_to_module.obj `if test -f 'src/common/dwarf_line_to_module.cc'; then $(CYGPATH_W) 'src/common/dwarf_line_to_module.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_line_to_module.cc'; fi` +src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o -MD -MP -MF src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Tpo -c -o src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.o `test -f 'src/common/dwarf_range_list_handler.cc' || echo '$(srcdir)/'`src/common/dwarf_range_list_handler.cc + +src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj: src/common/dwarf_range_list_handler.cc +@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj -MD -MP -MF src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Tpo -c -o src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` +@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Tpo src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/common/dwarf_range_list_handler.cc' object='src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -c -o src/common/src_tools_mac_dump_syms_dump_syms_mac-dwarf_range_list_handler.obj `if test -f 'src/common/dwarf_range_list_handler.cc'; then $(CYGPATH_W) 'src/common/dwarf_range_list_handler.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf_range_list_handler.cc'; fi` + src/common/src_tools_mac_dump_syms_dump_syms_mac-language.o: src/common/language.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(src_tools_mac_dump_syms_dump_syms_mac_CXXFLAGS) $(CXXFLAGS) -MT src/common/src_tools_mac_dump_syms_dump_syms_mac-language.o -MD -MP -MF src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-language.Tpo -c -o src/common/src_tools_mac_dump_syms_dump_syms_mac-language.o `test -f 'src/common/language.cc' || echo '$(srcdir)/'`src/common/language.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-language.Tpo src/common/$(DEPDIR)/src_tools_mac_dump_syms_dump_syms_mac-language.Po @@ -8397,7 +8504,7 @@ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir @@ -8423,7 +8530,7 @@ @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir @@ -8441,7 +8548,7 @@ distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ @@ -8451,7 +8558,7 @@ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac diff -Nru google-breakpad-0.1.0/scripts/travis-build.sh google-breakpad-0.1.0/scripts/travis-build.sh --- google-breakpad-0.1.0/scripts/travis-build.sh 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/scripts/travis-build.sh 2019-03-26 03:56:45.000000000 +0000 @@ -43,7 +43,7 @@ # Do an in-tree build and make sure tests pass. build() { - ./configure + ./configure --with-tests-as-root make -j${JOBS} check VERBOSE=1 make distclean } @@ -52,7 +52,7 @@ build_out_of_tree() { mkdir -p build/native pushd build/native >/dev/null - ../../configure + ../../configure --with-tests-as-root make -j${JOBS} distcheck VERBOSE=1 popd >/dev/null } diff -Nru google-breakpad-0.1.0/src/client/ios/BreakpadController.h google-breakpad-0.1.0/src/client/ios/BreakpadController.h --- google-breakpad-0.1.0/src/client/ios/BreakpadController.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/ios/BreakpadController.h 2019-03-26 03:56:45.000000000 +0000 @@ -112,6 +112,9 @@ // Unregisters the crash handlers. - (void)stop; +// Returns whether or not the controller is started. +- (BOOL)isStarted; + // Enables or disables uploading of crash reports, but does not stop the // BreakpadController. - (void)setUploadingEnabled:(BOOL)enabled; @@ -131,6 +134,9 @@ - (void)getNextReportConfigurationOrSendDelay: (void(^)(NSDictionary*, int))callback; +// Get the date of the most recent crash report. +- (void)getDateOfMostRecentCrashReport:(void(^)(NSDate *))callback; + // Sends synchronously the report specified by |configuration|. This method is // NOT thread safe and must be called from the breakpad thread. - (void)threadUnsafeSendReportWithConfiguration:(NSDictionary*)configuration diff -Nru google-breakpad-0.1.0/src/client/ios/BreakpadController.mm google-breakpad-0.1.0/src/client/ios/BreakpadController.mm --- google-breakpad-0.1.0/src/client/ios/BreakpadController.mm 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/ios/BreakpadController.mm 2019-03-26 03:56:45.000000000 +0000 @@ -156,6 +156,10 @@ }); } +- (BOOL)isStarted { + return started_; +} + // This method must be called from the breakpad queue. - (void)threadUnsafeSendReportWithConfiguration:(NSDictionary*)configuration withBreakpadRef:(BreakpadRef)ref { @@ -249,10 +253,8 @@ } - (void)withBreakpadRef:(void(^)(BreakpadRef))callback { - NSAssert(started_, - @"The controller must be started before withBreakpadRef is called"); dispatch_async(queue_, ^{ - callback(breakpadRef_); + callback(started_ ? breakpadRef_ : NULL); }); } @@ -291,6 +293,18 @@ }); } +- (void)getDateOfMostRecentCrashReport:(void(^)(NSDate *))callback { + NSAssert(started_, @"The controller must be started before " + "getDateOfMostRecentCrashReport is called"); + dispatch_async(queue_, ^{ + if (!breakpadRef_) { + callback(nil); + return; + } + callback(BreakpadGetDateOfMostRecentCrashReport(breakpadRef_)); + }); +} + #pragma mark - - (int)sendDelay { diff -Nru google-breakpad-0.1.0/src/client/ios/Breakpad.h google-breakpad-0.1.0/src/client/ios/Breakpad.h --- google-breakpad-0.1.0/src/client/ios/Breakpad.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/ios/Breakpad.h 2019-03-26 03:56:45.000000000 +0000 @@ -202,6 +202,9 @@ // Returns the next upload configuration. The report file is deleted. NSDictionary *BreakpadGetNextReportConfiguration(BreakpadRef ref); +// Returns the date of the most recent crash report. +NSDate *BreakpadGetDateOfMostRecentCrashReport(BreakpadRef ref); + // Upload next report to the server. void BreakpadUploadNextReport(BreakpadRef ref); diff -Nru google-breakpad-0.1.0/src/client/ios/Breakpad.mm google-breakpad-0.1.0/src/client/ios/Breakpad.mm --- google-breakpad-0.1.0/src/client/ios/Breakpad.mm 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/ios/Breakpad.mm 2019-03-26 03:56:45.000000000 +0000 @@ -42,7 +42,6 @@ #import "client/ios/handler/ios_exception_minidump_generator.h" #import "client/mac/crash_generation/ConfigFile.h" -#import "client/mac/handler/exception_handler.h" #import "client/mac/handler/minidump_generator.h" #import "client/mac/handler/protected_memory_allocator.h" #import "client/mac/sender/uploader.h" @@ -51,7 +50,7 @@ #if !TARGET_OS_TV && !TARGET_OS_WATCH #import "client/mac/handler/exception_handler.h" #else -#import "client/ios/handler/exception_handler_no_mach.h" +#import "client/ios/exception_handler_no_mach.h" #endif // !TARGET_OS_TV && !TARGET_OS_WATCH #if !defined(__EXCEPTIONS) || (__clang__ && !__has_feature(cxx_exceptions)) @@ -121,7 +120,7 @@ // Then unlock the mutex __attribute__((unused)) int rv = pthread_mutex_unlock(mutex_); assert(rv == 0); - }; + } private: ProtectedMemoryLocker(); @@ -162,6 +161,7 @@ NSArray *CrashReportsToUpload(); NSString *NextCrashReportToUpload(); NSDictionary *NextCrashReportConfiguration(); + NSDate *DateOfMostRecentCrashReport(); void UploadNextReport(NSDictionary *server_parameters); void UploadReportWithConfiguration(NSDictionary *configuration, NSDictionary *server_parameters); @@ -469,6 +469,30 @@ } //============================================================================= +NSDate *Breakpad::DateOfMostRecentCrashReport() { + NSString *directory = KeyValue(@BREAKPAD_DUMP_DIRECTORY); + if (!directory) { + return nil; + } + NSFileManager *fileManager = [NSFileManager defaultManager]; + NSArray *dirContents = [fileManager contentsOfDirectoryAtPath:directory error:nil]; + NSArray *dumps = [dirContents filteredArrayUsingPredicate:[NSPredicate + predicateWithFormat:@"self ENDSWITH '.dmp'"]]; + NSDate *mostRecentCrashReportDate = nil; + for (NSString *dump in dumps) { + NSString *filePath = [directory stringByAppendingPathComponent:dump]; + NSDate *crashReportDate = + [[fileManager attributesOfItemAtPath:filePath error:nil] fileCreationDate]; + if (!mostRecentCrashReportDate) { + mostRecentCrashReportDate = crashReportDate; + } else if (crashReportDate) { + mostRecentCrashReportDate = [mostRecentCrashReportDate laterDate:crashReportDate]; + } + } + return mostRecentCrashReportDate; +} + +//============================================================================= void Breakpad::HandleNetworkResponse(NSDictionary *configuration, NSData *data, NSError *error) { @@ -840,6 +864,19 @@ } return nil; } + +//============================================================================= +NSDate *BreakpadGetDateOfMostRecentCrashReport(BreakpadRef ref) { + try { + Breakpad *breakpad = (Breakpad *)ref; + if (breakpad) { + return breakpad->DateOfMostRecentCrashReport(); + } + } catch (...) { // don't let exceptions leave this C API + fprintf(stderr, "BreakpadGetDateOfMostRecentCrashReport() : error\n"); + } + return nil; +} //============================================================================= void BreakpadUploadReportWithParametersAndConfiguration( diff -Nru google-breakpad-0.1.0/src/client/ios/exception_handler_no_mach.cc google-breakpad-0.1.0/src/client/ios/exception_handler_no_mach.cc --- google-breakpad-0.1.0/src/client/ios/exception_handler_no_mach.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/ios/exception_handler_no_mach.cc 2019-03-26 03:56:45.000000000 +0000 @@ -31,7 +31,7 @@ #include #include "client/mac/handler/minidump_generator.h" -#include "client/ios/handler/exception_handler_no_mach.h" +#include "client/ios/exception_handler_no_mach.h" #ifndef USE_PROTECTED_ALLOCATIONS #if TARGET_OS_TV @@ -198,10 +198,8 @@ bool ExceptionHandler::InstallHandlers() { // If a handler is already installed, something is really wrong. - if (gProtectedData.handler != NULL) { + if (gProtectedData.handler != NULL) return false; - } - gProtectedData.handler = this; for (int i = 0; i < kNumHandledSignals; ++i) { struct sigaction sa; memset(&sa, 0, sizeof(sa)); @@ -213,11 +211,12 @@ if (sigaction(kExceptionSignals[i], &sa, old_handlers[i].get()) == -1) { return false; } + } + gProtectedData.handler = this; #if USE_PROTECTED_ALLOCATIONS - assert(((size_t)(gProtectedData.protected_buffer) & PAGE_MASK) == 0); - mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ); + assert(((size_t)(gProtectedData.protected_buffer) & PAGE_MASK) == 0); + mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ); #endif // USE_PROTECTED_ALLOCATIONS - } installed_exception_handler_ = true; return true; } @@ -226,13 +225,13 @@ for (int i = 0; i < kNumHandledSignals; ++i) { if (old_handlers[i].get()) { sigaction(kExceptionSignals[i], old_handlers[i].get(), NULL); -#if USE_PROTECTED_ALLOCATIONS - mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ | PROT_WRITE); -#endif // USE_PROTECTED_ALLOCATIONS old_handlers[i].reset(); } - gProtectedData.handler = NULL; } +#if USE_PROTECTED_ALLOCATIONS + mprotect(gProtectedData.protected_buffer, PAGE_SIZE, PROT_READ | PROT_WRITE); +#endif // USE_PROTECTED_ALLOCATIONS + gProtectedData.handler = NULL; installed_exception_handler_ = false; return true; } diff -Nru google-breakpad-0.1.0/src/client/ios/handler/ios_exception_minidump_generator.mm google-breakpad-0.1.0/src/client/ios/handler/ios_exception_minidump_generator.mm --- google-breakpad-0.1.0/src/client/ios/handler/ios_exception_minidump_generator.mm 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/ios/handler/ios_exception_minidump_generator.mm 2019-03-26 03:56:45.000000000 +0000 @@ -108,13 +108,13 @@ #ifdef HAS_ARM64_SUPPORT bool IosExceptionMinidumpGenerator::WriteCrashingContextARM64( MDLocationDescriptor *register_location) { - TypedMDRVA context(&writer_); + TypedMDRVA context(&writer_); if (!context.Allocate()) return false; *register_location = context.location(); - MDRawContextARM64 *context_ptr = context.get(); + MDRawContextARM64_Old *context_ptr = context.get(); memset(context_ptr, 0, sizeof(*context_ptr)); - context_ptr->context_flags = MD_CONTEXT_ARM64_FULL; + context_ptr->context_flags = MD_CONTEXT_ARM64_FULL_OLD; context_ptr->iregs[MD_CONTEXT_ARM64_REG_FP] = kExpectedFinalFp; // FP context_ptr->iregs[MD_CONTEXT_ARM64_REG_SP] = kExpectedFinalSp; // SP context_ptr->iregs[MD_CONTEXT_ARM64_REG_LR] = GetLRFromException(); // LR diff -Nru google-breakpad-0.1.0/src/client/linux/dump_writer_common/raw_context_cpu.h google-breakpad-0.1.0/src/client/linux/dump_writer_common/raw_context_cpu.h --- google-breakpad-0.1.0/src/client/linux/dump_writer_common/raw_context_cpu.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/dump_writer_common/raw_context_cpu.h 2019-03-26 03:56:45.000000000 +0000 @@ -41,7 +41,7 @@ #elif defined(__ARM_EABI__) typedef MDRawContextARM RawContextCPU; #elif defined(__aarch64__) -typedef MDRawContextARM64 RawContextCPU; +typedef MDRawContextARM64_Old RawContextCPU; #elif defined(__mips__) typedef MDRawContextMIPS RawContextCPU; #else diff -Nru google-breakpad-0.1.0/src/client/linux/dump_writer_common/thread_info.cc google-breakpad-0.1.0/src/client/linux/dump_writer_common/thread_info.cc --- google-breakpad-0.1.0/src/client/linux/dump_writer_common/thread_info.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/dump_writer_common/thread_info.cc 2019-03-26 03:56:45.000000000 +0000 @@ -214,7 +214,7 @@ } void ThreadInfo::FillCPUContext(RawContextCPU* out) const { - out->context_flags = MD_CONTEXT_ARM64_FULL; + out->context_flags = MD_CONTEXT_ARM64_FULL_OLD; out->cpsr = static_cast(regs.pstate); for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i) diff -Nru google-breakpad-0.1.0/src/client/linux/dump_writer_common/ucontext_reader.cc google-breakpad-0.1.0/src/client/linux/dump_writer_common/ucontext_reader.cc --- google-breakpad-0.1.0/src/client/linux/dump_writer_common/ucontext_reader.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/dump_writer_common/ucontext_reader.cc 2019-03-26 03:56:45.000000000 +0000 @@ -194,7 +194,7 @@ void UContextReader::FillCPUContext(RawContextCPU *out, const ucontext_t *uc, const struct fpsimd_context* fpregs) { - out->context_flags = MD_CONTEXT_ARM64_FULL; + out->context_flags = MD_CONTEXT_ARM64_FULL_OLD; out->cpsr = static_cast(uc->uc_mcontext.pstate); for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i) diff -Nru google-breakpad-0.1.0/src/client/linux/handler/exception_handler.cc google-breakpad-0.1.0/src/client/linux/handler/exception_handler.cc --- google-breakpad-0.1.0/src/client/linux/handler/exception_handler.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/handler/exception_handler.cc 2019-03-26 03:56:45.000000000 +0000 @@ -353,6 +353,7 @@ // will call the function with the right arguments. struct sigaction cur_handler; if (sigaction(sig, NULL, &cur_handler) == 0 && + cur_handler.sa_sigaction == SignalHandler && (cur_handler.sa_flags & SA_SIGINFO) == 0) { // Reset signal handler with the right flags. sigemptyset(&cur_handler.sa_mask); @@ -548,7 +549,7 @@ // Allow the child to ptrace us sys_prctl(PR_SET_PTRACER, child, 0, 0, 0); SendContinueSignalToChild(); - int status; + int status = 0; const int r = HANDLE_EINTR(sys_waitpid(child, &status, __WALL)); sys_close(fdes[1]); diff -Nru google-breakpad-0.1.0/src/client/linux/handler/exception_handler.h google-breakpad-0.1.0/src/client/linux/handler/exception_handler.h --- google-breakpad-0.1.0/src/client/linux/handler/exception_handler.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/handler/exception_handler.h 2019-03-26 03:56:45.000000000 +0000 @@ -262,7 +262,7 @@ // can do this. We create a pipe which we can use to block the // cloned process after creating it, until we have explicitly enabled // ptrace. This is used to store the file descriptors for the pipe - int fdes[2]; + int fdes[2] = {-1, -1}; // Callers can add extra info about mappings for cases where the // dumper code cannot extract enough information from /proc//maps. @@ -273,8 +273,7 @@ AppMemoryList app_memory_list_; }; - -typedef bool (*FirstChanceHandler)(int, void*, void*); +typedef bool (*FirstChanceHandler)(int, siginfo_t*, void*); void SetFirstChanceExceptionHandler(FirstChanceHandler callback); } // namespace google_breakpad diff -Nru google-breakpad-0.1.0/src/client/linux/handler/exception_handler_unittest.cc google-breakpad-0.1.0/src/client/linux/handler/exception_handler_unittest.cc --- google-breakpad-0.1.0/src/client/linux/handler/exception_handler_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/handler/exception_handler_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -27,6 +27,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +#include #include #include #include @@ -257,6 +258,66 @@ ASSERT_NO_FATAL_FAILURE(ChildCrash(true)); } +#if !defined(__ANDROID_API__) || __ANDROID_API__ >= __ANDROID_API_N__ +static void* SleepFunction(void* unused) { + while (true) usleep(1000000); + return NULL; +} + +static void* CrashFunction(void* b_ptr) { + pthread_barrier_t* b = reinterpret_cast(b_ptr); + pthread_barrier_wait(b); + DoNullPointerDereference(); + return NULL; +} + +// Tests that concurrent crashes do not enter a loop by alternately triggering +// the signal handler. +TEST(ExceptionHandlerTest, ParallelChildCrashesDontHang) { + AutoTempDir temp_dir; + const pid_t child = fork(); + if (child == 0) { + google_breakpad::scoped_ptr handler( + new ExceptionHandler(MinidumpDescriptor(temp_dir.path()), NULL, NULL, + NULL, true, -1)); + + // We start a number of threads to make sure handling the signal takes + // enough time for the second thread to enter the signal handler. + int num_sleep_threads = 100; + google_breakpad::scoped_array sleep_threads( + new pthread_t[num_sleep_threads]); + for (int i = 0; i < num_sleep_threads; ++i) { + ASSERT_EQ(0, pthread_create(&sleep_threads[i], NULL, SleepFunction, + NULL)); + } + + int num_crash_threads = 2; + google_breakpad::scoped_array crash_threads( + new pthread_t[num_crash_threads]); + // Barrier to synchronize crashing both threads at the same time. + pthread_barrier_t b; + ASSERT_EQ(0, pthread_barrier_init(&b, NULL, num_crash_threads + 1)); + for (int i = 0; i < num_crash_threads; ++i) { + ASSERT_EQ(0, pthread_create(&crash_threads[i], NULL, CrashFunction, &b)); + } + pthread_barrier_wait(&b); + for (int i = 0; i < num_crash_threads; ++i) { + ASSERT_EQ(0, pthread_join(crash_threads[i], NULL)); + } + } + + // Wait a while until the child should have crashed. + usleep(1000000); + // Kill the child if it is still running. + kill(child, SIGKILL); + + // If the child process terminated by itself, it will have returned SIGSEGV. + // If however it got stuck in a loop, it will have been killed by the + // SIGKILL. + ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGSEGV)); +} +#endif // !defined(__ANDROID_API__) || __ANDROID_API__ >= __ANDROID_API_N__ + static bool DoneCallbackReturnFalse(const MinidumpDescriptor& descriptor, void* context, bool succeeded) { @@ -467,7 +528,7 @@ namespace { const int kSimpleFirstChanceReturnStatus = 42; -bool SimpleFirstChanceHandler(int, void*, void*) { +bool SimpleFirstChanceHandler(int, siginfo_t*, void*) { _exit(kSimpleFirstChanceReturnStatus); } } diff -Nru google-breakpad-0.1.0/src/client/linux/handler/minidump_descriptor.h google-breakpad-0.1.0/src/client/linux/handler/minidump_descriptor.h --- google-breakpad-0.1.0/src/client/linux/handler/minidump_descriptor.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/handler/minidump_descriptor.h 2019-03-26 03:56:45.000000000 +0000 @@ -137,7 +137,7 @@ MicrodumpExtraInfo* microdump_extra_info() { assert(IsMicrodumpOnConsole()); return µdump_extra_info_; - }; + } private: enum DumpMode { diff -Nru google-breakpad-0.1.0/src/client/linux/microdump_writer/microdump_writer.cc google-breakpad-0.1.0/src/client/linux/microdump_writer/microdump_writer.cc --- google-breakpad-0.1.0/src/client/linux/microdump_writer/microdump_writer.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/microdump_writer/microdump_writer.cc 2019-03-26 03:56:45.000000000 +0000 @@ -648,9 +648,7 @@ if (blob_size != sizeof(ExceptionHandler::CrashContext)) return false; context = reinterpret_cast(blob); - dumper.set_crash_address( - reinterpret_cast(context->siginfo.si_addr)); - dumper.set_crash_signal(context->siginfo.si_signo); + dumper.SetCrashInfoFromSigInfo(context->siginfo); dumper.set_crash_thread(context->tid); } MicrodumpWriter writer(context, mappings, diff -Nru google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_core_dumper.cc google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_core_dumper.cc --- google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_core_dumper.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_core_dumper.cc 2019-03-26 03:56:45.000000000 +0000 @@ -43,6 +43,7 @@ #include #endif +#include "common/linux/elf_gnu_compat.h" #include "common/linux/linux_libc_support.h" namespace google_breakpad { @@ -165,6 +166,7 @@ // ------------------------------------------------------------------- // 1st thread CORE NT_PRSTATUS // process-wide CORE NT_PRPSINFO + // process-wide CORE NT_SIGINFO // process-wide CORE NT_AUXV // 1st thread CORE NT_FPREGSET // 1st thread LINUX NT_PRXFPREG @@ -212,12 +214,47 @@ if (first_thread) { crash_thread_ = pid; crash_signal_ = status->pr_info.si_signo; + crash_signal_code_ = status->pr_info.si_code; } first_thread = false; threads_.push_back(pid); thread_infos_.push_back(info); break; } + case NT_SIGINFO: { + if (description.length() != sizeof(siginfo_t)) { + fprintf(stderr, "Found NT_SIGINFO descriptor of unexpected size\n"); + return false; + } + + const siginfo_t* info = + reinterpret_cast(description.data()); + + // Set crash_address when si_addr is valid for the signal. + switch (info->si_signo) { + case MD_EXCEPTION_CODE_LIN_SIGBUS: + case MD_EXCEPTION_CODE_LIN_SIGFPE: + case MD_EXCEPTION_CODE_LIN_SIGILL: + case MD_EXCEPTION_CODE_LIN_SIGSEGV: + case MD_EXCEPTION_CODE_LIN_SIGSYS: + case MD_EXCEPTION_CODE_LIN_SIGTRAP: + crash_address_ = reinterpret_cast(info->si_addr); + break; + } + + // Set crash_exception_info for common signals. + switch (info->si_signo) { + case MD_EXCEPTION_CODE_LIN_SIGKILL: + set_crash_exception_info({info->si_pid, info->si_uid}); + break; + case MD_EXCEPTION_CODE_LIN_SIGSYS: +#ifdef si_syscall + set_crash_exception_info({info->si_syscall, info->si_arch}); +#endif + break; + } + break; + } #if defined(__i386) || defined(__x86_64) case NT_FPREGSET: { if (thread_infos_.empty()) diff -Nru google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc --- google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -109,7 +109,7 @@ EXPECT_TRUE(dumper.ThreadsSuspend()); EXPECT_TRUE(dumper.ThreadsResume()); - // LinuxCoreDumper cannot determine the crash address and thus it always + // Linux does not set the crash address with SIGABRT, so make sure it always // sets the crash address to 0. EXPECT_EQ(0U, dumper.crash_address()); EXPECT_EQ(kCrashSignal, dumper.crash_signal()); @@ -126,3 +126,54 @@ EXPECT_EQ(getpid(), info.ppid); } } + +TEST(LinuxCoreDumperTest, VerifyExceptionDetails) { + CrashGenerator crash_generator; + if (!crash_generator.HasDefaultCorePattern()) { + fprintf(stderr, "LinuxCoreDumperTest.VerifyDumpWithMultipleThreads test " + "is skipped due to non-default core pattern\n"); + return; + } + +#ifndef si_syscall + fprintf(stderr, "LinuxCoreDumperTest.VerifyDumpWithMultipleThreads test is " + "skipped due to old kernel/C library headers\n"); + return; +#endif + + const unsigned kNumOfThreads = 2; + const unsigned kCrashThread = 1; + const int kCrashSignal = SIGSYS; + pid_t child_pid; + ASSERT_TRUE(crash_generator.CreateChildCrash(kNumOfThreads, kCrashThread, + kCrashSignal, &child_pid)); + + const string core_file = crash_generator.GetCoreFilePath(); + const string procfs_path = crash_generator.GetDirectoryOfProcFilesCopy(); + +#if defined(__ANDROID__) + struct stat st; + if (stat(core_file.c_str(), &st) != 0) { + fprintf(stderr, "LinuxCoreDumperTest.VerifyExceptionDetails test is " + "skipped due to no core file being generated"); + return; + } +#endif + + LinuxCoreDumper dumper(child_pid, core_file.c_str(), procfs_path.c_str()); + + EXPECT_TRUE(dumper.Init()); + + EXPECT_TRUE(dumper.IsPostMortem()); + + // Check the exception details. + EXPECT_NE(0U, dumper.crash_address()); + EXPECT_EQ(kCrashSignal, dumper.crash_signal()); + EXPECT_EQ(crash_generator.GetThreadId(kCrashThread), + dumper.crash_thread()); + + // We check the length, but not the actual fields. We sent SIGSYS ourselves + // instead of the kernel, so the extended fields are garbage. + const std::vector info(dumper.crash_exception_info()); + EXPECT_EQ(2U, info.size()); +} diff -Nru google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_dumper.cc google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_dumper.cc --- google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_dumper.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_dumper.cc 2019-03-26 03:56:45.000000000 +0000 @@ -283,6 +283,7 @@ root_prefix_(root_prefix), crash_address_(0), crash_signal_(0), + crash_signal_code_(0), crash_thread_(pid), threads_(&allocator_, 8), mappings_(&allocator_), @@ -354,6 +355,12 @@ return success; } +void LinuxDumper::SetCrashInfoFromSigInfo(const siginfo_t& siginfo) { + set_crash_address(reinterpret_cast(siginfo.si_addr)); + set_crash_signal(siginfo.si_signo); + set_crash_signal_code(siginfo.si_code); +} + const char* LinuxDumper::GetCrashSignalString() const { switch (static_cast(crash_signal_)) { case MD_EXCEPTION_CODE_LIN_SIGHUP: diff -Nru google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_dumper.h google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_dumper.h --- google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_dumper.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/minidump_writer/linux_dumper.h 2019-03-26 03:56:45.000000000 +0000 @@ -38,6 +38,7 @@ #ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_ #define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_ +#include #include #if defined(__ANDROID__) #include @@ -47,6 +48,8 @@ #include #include +#include + #include "client/linux/dump_writer_common/mapping_info.h" #include "client/linux/dump_writer_common/thread_info.h" #include "common/linux/file_id.h" @@ -170,6 +173,8 @@ unsigned int mapping_id, wasteful_vector& identifier); + void SetCrashInfoFromSigInfo(const siginfo_t& siginfo); + uintptr_t crash_address() const { return crash_address_; } void set_crash_address(uintptr_t crash_address) { crash_address_ = crash_address; @@ -179,6 +184,17 @@ void set_crash_signal(int crash_signal) { crash_signal_ = crash_signal; } const char* GetCrashSignalString() const; + void set_crash_signal_code(int code) { crash_signal_code_ = code; } + int crash_signal_code() const { return crash_signal_code_; } + + void set_crash_exception_info(const std::vector& exception_info) { + assert(exception_info.size() <= MD_EXCEPTION_MAXIMUM_PARAMETERS); + crash_exception_info_ = exception_info; + } + const std::vector& crash_exception_info() const { + return crash_exception_info_; + } + pid_t crash_thread() const { return crash_thread_; } void set_crash_thread(pid_t crash_thread) { crash_thread_ = crash_thread; } @@ -228,6 +244,12 @@ // Signal that terminated the crashed process. int crash_signal_; + // The code associated with |crash_signal_|. + int crash_signal_code_; + + // The additional fields associated with |crash_signal_|. + std::vector crash_exception_info_; + // ID of the crashed thread. pid_t crash_thread_; diff -Nru google-breakpad-0.1.0/src/client/linux/minidump_writer/minidump_writer.cc google-breakpad-0.1.0/src/client/linux/minidump_writer/minidump_writer.cc --- google-breakpad-0.1.0/src/client/linux/minidump_writer/minidump_writer.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/linux/minidump_writer/minidump_writer.cc 2019-03-26 03:56:45.000000000 +0000 @@ -702,15 +702,24 @@ TypedMDRVA exc(&minidump_writer_); if (!exc.Allocate()) return false; - my_memset(exc.get(), 0, sizeof(MDRawExceptionStream)); + + MDRawExceptionStream* stream = exc.get(); + my_memset(stream, 0, sizeof(MDRawExceptionStream)); dirent->stream_type = MD_EXCEPTION_STREAM; dirent->location = exc.location(); - exc.get()->thread_id = GetCrashThread(); - exc.get()->exception_record.exception_code = dumper_->crash_signal(); - exc.get()->exception_record.exception_address = dumper_->crash_address(); - exc.get()->thread_context = crashing_thread_context_; + stream->thread_id = GetCrashThread(); + stream->exception_record.exception_code = dumper_->crash_signal(); + stream->exception_record.exception_flags = dumper_->crash_signal_code(); + stream->exception_record.exception_address = dumper_->crash_address(); + const std::vector crash_exception_info = + dumper_->crash_exception_info(); + stream->exception_record.number_parameters = crash_exception_info.size(); + memcpy(stream->exception_record.exception_information, + crash_exception_info.data(), + sizeof(uint64_t) * crash_exception_info.size()); + stream->thread_context = crashing_thread_context_; return true; } @@ -1039,7 +1048,7 @@ // processor_architecture should always be set, do this first sys_info->processor_architecture = #if defined(__aarch64__) - MD_CPU_ARCHITECTURE_ARM64; + MD_CPU_ARCHITECTURE_ARM64_OLD; #else MD_CPU_ARCHITECTURE_ARM; #endif @@ -1366,9 +1375,7 @@ if (blob_size != sizeof(ExceptionHandler::CrashContext)) return false; context = reinterpret_cast(blob); - dumper.set_crash_address( - reinterpret_cast(context->siginfo.si_addr)); - dumper.set_crash_signal(context->siginfo.si_signo); + dumper.SetCrashInfoFromSigInfo(context->siginfo); dumper.set_crash_thread(context->tid); } MinidumpWriter writer(minidump_path, minidump_fd, context, mappings, diff -Nru google-breakpad-0.1.0/src/client/mac/Breakpad.xcodeproj/project.pbxproj google-breakpad-0.1.0/src/client/mac/Breakpad.xcodeproj/project.pbxproj --- google-breakpad-0.1.0/src/client/mac/Breakpad.xcodeproj/project.pbxproj 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/mac/Breakpad.xcodeproj/project.pbxproj 2019-03-26 03:56:45.000000000 +0000 @@ -52,6 +52,10 @@ 3329D4ED0FA16D820007BBC5 /* Breakpad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3329D4EC0FA16D820007BBC5 /* Breakpad.xib */; }; 33880C800F9E097100817F82 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 33880C7E0F9E097100817F82 /* InfoPlist.strings */; }; 4084699D0F5D9CF900FDCA37 /* crash_report_sender.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */; }; + 421BC5BC21110C0300B8042E /* convert_old_arm64_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = 421BC5AD21110C0300B8042E /* convert_old_arm64_context.cc */; }; + 421BC5BD21110C0300B8042E /* convert_old_arm64_context.h in Headers */ = {isa = PBXBuildFile; fileRef = 421BC5BB21110C0300B8042E /* convert_old_arm64_context.h */; }; + 421BC5BE21110C1000B8042E /* convert_old_arm64_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = 421BC5AD21110C0300B8042E /* convert_old_arm64_context.cc */; }; + 4247E6412110D7A300482558 /* memory_allocator_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244540A12439BA0009BBCE0 /* memory_allocator_unittest.cc */; }; 4D61A25F14F43CFC002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; 4D61A26B14F43D3C002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; 4D61A26C14F43D42002D5862 /* bootstrap_compat.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */; }; @@ -85,7 +89,6 @@ D244536B12426F00009BBCE0 /* minidump.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535212426EBB009BBCE0 /* minidump.cc */; }; D244536C12426F00009BBCE0 /* pathname_stripper.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244535312426EBB009BBCE0 /* pathname_stripper.cc */; }; D244536D12426F00009BBCE0 /* basic_code_modules.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244534F12426E98009BBCE0 /* basic_code_modules.cc */; }; - D244540B12439BA0009BBCE0 /* memory_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = D244540A12439BA0009BBCE0 /* memory_unittest.cc */; }; D246417012BAA40E005170D0 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; }; D246417112BAA41C005170D0 /* crash_generation_client.cc in Sources */ = {isa = PBXBuildFile; fileRef = D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */; }; D246417512BAA438005170D0 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; }; @@ -577,6 +580,8 @@ 3329D4EC0FA16D820007BBC5 /* Breakpad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Breakpad.xib; path = sender/Breakpad.xib; sourceTree = ""; }; 33880C7F0F9E097100817F82 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/InfoPlist.strings; sourceTree = ""; }; 4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = crash_report_sender.icns; path = sender/crash_report_sender.icns; sourceTree = ""; }; + 421BC5AD21110C0300B8042E /* convert_old_arm64_context.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = convert_old_arm64_context.cc; path = ../../processor/convert_old_arm64_context.cc; sourceTree = ""; }; + 421BC5BB21110C0300B8042E /* convert_old_arm64_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert_old_arm64_context.h; path = ../../processor/convert_old_arm64_context.h; sourceTree = ""; }; 4D61A25D14F43CFC002D5862 /* bootstrap_compat.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bootstrap_compat.cc; path = ../../common/mac/bootstrap_compat.cc; sourceTree = SOURCE_ROOT; }; 4D61A25E14F43CFC002D5862 /* bootstrap_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bootstrap_compat.h; path = ../../common/mac/bootstrap_compat.h; sourceTree = SOURCE_ROOT; }; 4D72CA0D13DFAD5C006CABE3 /* md5.cc */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = md5.cc; path = ../../common/md5.cc; sourceTree = SOURCE_ROOT; }; @@ -594,12 +599,12 @@ D244535112426EBB009BBCE0 /* logging.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = logging.cc; path = ../../processor/logging.cc; sourceTree = SOURCE_ROOT; }; D244535212426EBB009BBCE0 /* minidump.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump.cc; path = ../../processor/minidump.cc; sourceTree = SOURCE_ROOT; }; D244535312426EBB009BBCE0 /* pathname_stripper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pathname_stripper.cc; path = ../../processor/pathname_stripper.cc; sourceTree = SOURCE_ROOT; }; - D244540A12439BA0009BBCE0 /* memory_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = memory_unittest.cc; path = ../../common/memory_unittest.cc; sourceTree = SOURCE_ROOT; }; + D244540A12439BA0009BBCE0 /* memory_allocator_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = memory_allocator_unittest.cc; path = ../../common/memory_allocator_unittest.cc; sourceTree = SOURCE_ROOT; }; D2F9A3D41212F87C002747C1 /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler_test.cc; path = tests/exception_handler_test.cc; sourceTree = ""; }; D2F9A41512131EF0002747C1 /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; }; - D2F9A43C12131F55002747C1 /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gmock-all.cc"; path = "../../testing/src/gmock-all.cc"; sourceTree = SOURCE_ROOT; }; - D2F9A43E12131F65002747C1 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gtest_main.cc; path = ../../testing/gtest/src/gtest_main.cc; sourceTree = ""; }; - D2F9A43F12131F65002747C1 /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-all.cc"; path = "../../testing/gtest/src/gtest-all.cc"; sourceTree = ""; }; + D2F9A43C12131F55002747C1 /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gmock-all.cc"; path = "../../testing/googlemock/src/gmock-all.cc"; sourceTree = SOURCE_ROOT; }; + D2F9A43E12131F65002747C1 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gtest_main.cc; path = ../../testing/googletest/src/gtest_main.cc; sourceTree = ""; }; + D2F9A43F12131F65002747C1 /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-all.cc"; path = "../../testing/googletest/src/gtest-all.cc"; sourceTree = ""; }; D2F9A4C4121336C7002747C1 /* client_info.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = client_info.h; path = crash_generation/client_info.h; sourceTree = ""; }; D2F9A4C5121336C7002747C1 /* crash_generation_client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_generation_client.h; path = crash_generation/crash_generation_client.h; sourceTree = ""; }; D2F9A4C6121336C7002747C1 /* crash_generation_client.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = crash_generation_client.cc; path = crash_generation/crash_generation_client.cc; sourceTree = ""; }; @@ -896,6 +901,8 @@ D244536912426EE7009BBCE0 /* processor */ = { isa = PBXGroup; children = ( + 421BC5AD21110C0300B8042E /* convert_old_arm64_context.cc */, + 421BC5BB21110C0300B8042E /* convert_old_arm64_context.h */, D244535112426EBB009BBCE0 /* logging.cc */, D244535212426EBB009BBCE0 /* minidump.cc */, D244535312426EBB009BBCE0 /* pathname_stripper.cc */, @@ -936,7 +943,7 @@ F92C53600ECCE3D6009BE4BA /* common */ = { isa = PBXGroup; children = ( - D244540A12439BA0009BBCE0 /* memory_unittest.cc */, + D244540A12439BA0009BBCE0 /* memory_allocator_unittest.cc */, F92C53870ECCE6C0009BE4BA /* convert_UTF.c */, F92C53880ECCE6C0009BE4BA /* convert_UTF.h */, 4D72CA0D13DFAD5C006CABE3 /* md5.cc */, @@ -1154,6 +1161,7 @@ D2F9A4CC121336C7002747C1 /* crash_generation_server.h in Headers */, 163201D61443019E00C4DBF5 /* ConfigFile.h in Headers */, 16C7C918147D45AE00776EAD /* BreakpadDefines.h in Headers */, + 421BC5BD21110C0300B8042E /* convert_old_arm64_context.h in Headers */, 162F64F3161C577500CD68D5 /* arch_utilities.h in Headers */, F4DAB1DE19F1027100A5A838 /* launch_reporter.h in Headers */, 1EEEB6241720829E00F7E689 /* simple_string_dictionary.h in Headers */, @@ -1399,6 +1407,8 @@ /* Begin PBXProject section */ 0867D690FE84028FC02AAC07 /* Project object */ = { isa = PBXProject; + attributes = { + }; buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Breakpad" */; compatibilityVersion = "Xcode 3.1"; developmentRegion = English; @@ -1684,6 +1694,7 @@ 163201D71443019E00C4DBF5 /* ConfigFile.mm in Sources */, 162F64F2161C577500CD68D5 /* arch_utilities.cc in Sources */, 1EEEB6231720829E00F7E689 /* simple_string_dictionary.cc in Sources */, + 421BC5BC21110C0300B8042E /* convert_old_arm64_context.cc in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1842,6 +1853,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 421BC5BE21110C1000B8042E /* convert_old_arm64_context.cc in Sources */, + 4247E6412110D7A300482558 /* memory_allocator_unittest.cc in Sources */, D244536A12426F00009BBCE0 /* logging.cc in Sources */, D244536B12426F00009BBCE0 /* minidump.cc in Sources */, D244536C12426F00009BBCE0 /* pathname_stripper.cc in Sources */, @@ -1862,7 +1875,6 @@ F93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */, F93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */, D2F9A3D51212F87C002747C1 /* exception_handler_test.cc in Sources */, - D244540B12439BA0009BBCE0 /* memory_unittest.cc in Sources */, 4D72CA3813DFAE91006CABE3 /* md5.cc in Sources */, 4D61A26E14F43D45002D5862 /* bootstrap_compat.cc in Sources */, 1EEEB6271720831E00F7E689 /* BreakpadFramework_Test.mm in Sources */, @@ -2193,10 +2205,10 @@ GCC_OPTIMIZATION_LEVEL = 0; HEADER_SEARCH_PATHS = ( "$(inherited)", - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, ); PREBINDING = NO; PRODUCT_NAME = gtest; @@ -2209,10 +2221,10 @@ ALWAYS_SEARCH_USER_PATHS = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, ); PREBINDING = NO; PRODUCT_NAME = gtest; @@ -2228,10 +2240,10 @@ GCC_ENABLE_FIX_AND_CONTINUE = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, ); PREBINDING = NO; PRODUCT_NAME = gtest; @@ -2248,10 +2260,10 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; HEADER_SEARCH_PATHS = ( ../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -2266,10 +2278,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( ../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -2284,10 +2296,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( ../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, + ../../testing/googletest, + ../../testing/googletest/include, ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -2368,10 +2380,8 @@ HEADER_SEARCH_PATHS = ( ../.., ../../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock/include, + ../../testing/googletest/include, ); PRODUCT_NAME = generator_test; }; @@ -2383,10 +2393,8 @@ HEADER_SEARCH_PATHS = ( ../.., ../../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock/include, + ../../testing/googletest/include, ); PRODUCT_NAME = generator_test; }; @@ -2418,10 +2426,10 @@ HEADER_SEARCH_PATHS = ( ../../.., ../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googletest, + ../../testing/googletest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -2437,10 +2445,10 @@ HEADER_SEARCH_PATHS = ( ../../.., ../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googletest, + ../../testing/googletest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -2543,10 +2551,8 @@ HEADER_SEARCH_PATHS = ( ../.., ../../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googlemock/include, + ../../testing/googletest/include, ); PRODUCT_NAME = generator_test; }; @@ -2566,10 +2572,10 @@ HEADER_SEARCH_PATHS = ( ../../.., ../.., - ../../testing, - ../../testing/include, - ../../testing/gtest, - ../../testing/gtest/include, + ../../testing/googletest, + ../../testing/googletest/include, + ../../testing/googlemock, + ../../testing/googlemock/include, ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", diff -Nru google-breakpad-0.1.0/src/client/mac/crash_generation/ConfigFile.h google-breakpad-0.1.0/src/client/mac/crash_generation/ConfigFile.h --- google-breakpad-0.1.0/src/client/mac/crash_generation/ConfigFile.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/mac/crash_generation/ConfigFile.h 2019-03-26 03:56:45.000000000 +0000 @@ -44,10 +44,10 @@ config_file_ = -1; config_file_path_[0] = 0; has_created_file_ = false; - }; + } ~ConfigFile() { - }; + } void WriteFile(const char* directory, const SimpleStringDictionary *configurationParameters, diff -Nru google-breakpad-0.1.0/src/client/mac/crash_generation/Inspector.h google-breakpad-0.1.0/src/client/mac/crash_generation/Inspector.h --- google-breakpad-0.1.0/src/client/mac/crash_generation/Inspector.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/mac/crash_generation/Inspector.h 2019-03-26 03:56:45.000000000 +0000 @@ -98,7 +98,7 @@ (MinidumpGenerator::UniqueNameInDirectory(dump_path, &next_minidump_id)); strlcpy(minidump_id_, next_minidump_id.c_str(), sizeof(minidump_id_)); - }; + } const char *GetPath() { return minidump_dir_path_; } const char *GetID() { return minidump_id_; } @@ -111,7 +111,7 @@ //============================================================================= class Inspector { public: - Inspector() {}; + Inspector() {} // given a bootstrap service name, receives mach messages // from a crashed process, then inspects it, creates a minidump file diff -Nru google-breakpad-0.1.0/src/client/mac/Framework/Breakpad.mm google-breakpad-0.1.0/src/client/mac/Framework/Breakpad.mm --- google-breakpad-0.1.0/src/client/mac/Framework/Breakpad.mm 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/mac/Framework/Breakpad.mm 2019-03-26 03:56:45.000000000 +0000 @@ -117,7 +117,7 @@ // Then unlock the mutex __attribute__((unused)) int rv = pthread_mutex_unlock(mutex_); assert(rv == 0); - }; + } private: ProtectedMemoryLocker(); diff -Nru google-breakpad-0.1.0/src/client/mac/Framework/OnDemandServer.h google-breakpad-0.1.0/src/client/mac/Framework/OnDemandServer.h --- google-breakpad-0.1.0/src/client/mac/Framework/OnDemandServer.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/mac/Framework/OnDemandServer.h 2019-03-26 03:56:45.000000000 +0000 @@ -127,7 +127,7 @@ // This is the port we need to send a mach message to after calling // LaunchOnDemand(). Sending a message causing an immediate launch // of the server - mach_port_t GetServicePort() { return service_port_; }; + mach_port_t GetServicePort() { return service_port_; } private: // Disallow copy constructor diff -Nru google-breakpad-0.1.0/src/client/mac/Framework/OnDemandServer.mm google-breakpad-0.1.0/src/client/mac/Framework/OnDemandServer.mm --- google-breakpad-0.1.0/src/client/mac/Framework/OnDemandServer.mm 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/mac/Framework/OnDemandServer.mm 2019-03-26 03:56:45.000000000 +0000 @@ -71,7 +71,7 @@ delete server; return NULL; -}; +} //============================================================================== kern_return_t OnDemandServer::Initialize(const char *server_command, diff -Nru google-breakpad-0.1.0/src/client/mac/handler/breakpad_nlist_64.h google-breakpad-0.1.0/src/client/mac/handler/breakpad_nlist_64.h --- google-breakpad-0.1.0/src/client/mac/handler/breakpad_nlist_64.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/mac/handler/breakpad_nlist_64.h 2019-03-26 03:56:45.000000000 +0000 @@ -32,6 +32,7 @@ // nlist function implemented to work on 64-bit. #ifndef CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ +#define CLIENT_MAC_HANDLER_BREAKPAD_NLIST_H__ #include diff -Nru google-breakpad-0.1.0/src/client/mac/handler/minidump_generator.cc google-breakpad-0.1.0/src/client/mac/handler/minidump_generator.cc --- google-breakpad-0.1.0/src/client/mac/handler/minidump_generator.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/mac/handler/minidump_generator.cc 2019-03-26 03:56:45.000000000 +0000 @@ -545,7 +545,7 @@ MinidumpGenerator::WriteContextARM64(breakpad_thread_state_data_t state, MDLocationDescriptor *register_location) { - TypedMDRVA context(&writer_); + TypedMDRVA context(&writer_); arm_thread_state64_t *machine_state = reinterpret_cast(state); @@ -553,8 +553,8 @@ return false; *register_location = context.location(); - MDRawContextARM64 *context_ptr = context.get(); - context_ptr->context_flags = MD_CONTEXT_ARM64_FULL; + MDRawContextARM64_Old *context_ptr = context.get(); + context_ptr->context_flags = MD_CONTEXT_ARM64_FULL_OLD; #define AddGPR(a) context_ptr->iregs[a] = \ REGISTER_FROM_THREADSTATE(machine_state, x[a]) @@ -1191,7 +1191,7 @@ #endif #ifdef HAS_ARM64_SUPPORT case CPU_TYPE_ARM64: - info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_ARM64; + info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_ARM64_OLD; break; #endif #ifdef HAS_PPC_SUPPORT diff -Nru google-breakpad-0.1.0/src/client/windows/crash_generation/minidump_generator.cc google-breakpad-0.1.0/src/client/windows/crash_generation/minidump_generator.cc --- google-breakpad-0.1.0/src/client/windows/crash_generation/minidump_generator.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/windows/crash_generation/minidump_generator.cc 2019-03-26 03:56:45.000000000 +0000 @@ -176,7 +176,7 @@ stream_data->Reserved = 0; std::copy(operations_.begin(), operations_.end(), -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(_LIBCPP_STD_VER) stdext::checked_array_iterator( reinterpret_cast(stream_data + 1), operations_.size()) diff -Nru google-breakpad-0.1.0/src/client/windows/handler/exception_handler.cc google-breakpad-0.1.0/src/client/windows/handler/exception_handler.cc --- google-breakpad-0.1.0/src/client/windows/handler/exception_handler.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/windows/handler/exception_handler.cc 2019-03-26 03:56:45.000000000 +0000 @@ -388,7 +388,7 @@ assert(self->handler_start_semaphore_ != NULL); assert(self->handler_finish_semaphore_ != NULL); - while (true) { + for (;;) { if (WaitForSingleObject(self->handler_start_semaphore_, INFINITE) == WAIT_OBJECT_0) { // Perform the requested action. @@ -976,7 +976,9 @@ #if defined(_M_IX86) exinfo->ContextRecord->Eip; #elif defined(_M_AMD64) - exinfo->ContextRecord->Rip; + exinfo->ContextRecord->Rip; +#elif defined(_M_ARM64) + exinfo->ContextRecord->Pc; #else #error Unsupported platform #endif diff -Nru google-breakpad-0.1.0/src/client/windows/unittests/client_tests.gyp google-breakpad-0.1.0/src/client/windows/unittests/client_tests.gyp --- google-breakpad-0.1.0/src/client/windows/unittests/client_tests.gyp 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/client/windows/unittests/client_tests.gyp 2019-03-26 03:56:45.000000000 +0000 @@ -68,6 +68,7 @@ 'sources': [ '<(DEPTH)/common/string_conversion.cc', '<(DEPTH)/processor/basic_code_modules.cc', + '<(DEPTH)/processor/convert_old_arm64_context.cc', '<(DEPTH)/processor/dump_context.cc', '<(DEPTH)/processor/dump_object.cc', '<(DEPTH)/processor/logging.cc', diff -Nru google-breakpad-0.1.0/src/common/android/breakpad_getcontext.S google-breakpad-0.1.0/src/common/android/breakpad_getcontext.S --- google-breakpad-0.1.0/src/common/android/breakpad_getcontext.S 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/android/breakpad_getcontext.S 2019-03-26 03:56:45.000000000 +0000 @@ -230,16 +230,13 @@ #elif defined(__mips__) // This implementation is inspired by implementation of getcontext in glibc. +#include +#include #if _MIPS_SIM == _ABIO32 -#include -#include -#include -#else -#include -#include +#include #endif -// from asm/asm.h +// from asm-mips/asm.h #if _MIPS_SIM == _ABIO32 #define ALSZ 7 #define ALMASK ~7 diff -Nru google-breakpad-0.1.0/src/common/android/include/asm-mips/asm.h google-breakpad-0.1.0/src/common/android/include/asm-mips/asm.h --- google-breakpad-0.1.0/src/common/android/include/asm-mips/asm.h 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/common/android/include/asm-mips/asm.h 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,270 @@ +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_ASM_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_ASM_H + +#if defined(__has_include_next) && __has_include_next() +#include_next +#else + +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ + +#include +#ifndef CAT +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#ifdef __STDC__ +#define __CAT(str1, str2) str1##str2 +#else +#define __CAT(str1, str2) str1 str2 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#define CAT(str1, str2) __CAT(str1, str2) +#endif +#ifdef __PIC__ +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define CPRESTORE(register) .cprestore register +#define CPADD(register) .cpadd register +#define CPLOAD(register) .cpload register +#else +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define CPRESTORE(register) +#define CPADD(register) +#define CPLOAD(register) +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LEAF(symbol) .globl symbol; .align 2; .type symbol, @function; .ent symbol, 0; symbol: .frame sp, 0, ra +#define NESTED(symbol, framesize, rpc) .globl symbol; .align 2; .type symbol, @function; .ent symbol, 0; symbol: .frame sp, framesize, rpc +#define END(function) .end function; .size function, .-function +#define EXPORT(symbol) .globl symbol; symbol: +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define FEXPORT(symbol) .globl symbol; .type symbol, @function; symbol: +#define ABS(symbol,value) .globl symbol; symbol = value +#define PANIC(msg) .set push; .set reorder; PTR_LA a0, 8f; jal panic; 9: b 9b; .set pop; TEXT(msg) +#define PRINT(string) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define TEXT(msg) .pushsection .data; 8: .asciiz msg; .popsection; +#define TTABLE(string) .pushsection .text; .word 1f; .popsection .pushsection .data; 1: .asciiz string; .popsection +#define PREF(hint, addr) +#define PREFX(hint, addr) +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_ISA == _MIPS_ISA_MIPS1 +#define MOVN(rd, rs, rt) .set push; .set reorder; beqz rt, 9f; move rd, rs; .set pop; 9: +#define MOVZ(rd, rs, rt) .set push; .set reorder; bnez rt, 9f; move rd, rs; .set pop; 9: +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_ISA == _MIPS_ISA_MIPS2 || _MIPS_ISA == _MIPS_ISA_MIPS3 +#define MOVN(rd, rs, rt) .set push; .set noreorder; bnezl rt, 9f; move rd, rs; .set pop; 9: +#define MOVZ(rd, rs, rt) .set push; .set noreorder; beqzl rt, 9f; move rd, rs; .set pop; 9: +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_ISA == _MIPS_ISA_MIPS4 || _MIPS_ISA == _MIPS_ISA_MIPS5 || _MIPS_ISA == _MIPS_ISA_MIPS32 || _MIPS_ISA == _MIPS_ISA_MIPS64 +#define MOVN(rd, rs, rt) movn rd, rs, rt +#define MOVZ(rd, rs, rt) movz rd, rs, rt +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_SIM == _MIPS_SIM_ABI32 +#define ALSZ 7 +#define ALMASK ~7 +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#if _MIPS_SIM == _MIPS_SIM_NABI32 || _MIPS_SIM == _MIPS_SIM_ABI64 +#define ALSZ 15 +#define ALMASK ~15 +#endif +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#ifdef __mips64 +#define SZREG 8 +#else +#define SZREG 4 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SIM == _MIPS_SIM_ABI32 +#define REG_S sw +#define REG_L lw +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define REG_SUBU subu +#define REG_ADDU addu +#endif +#if _MIPS_SIM == _MIPS_SIM_NABI32 || _MIPS_SIM == _MIPS_SIM_ABI64 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define REG_S sd +#define REG_L ld +#define REG_SUBU dsubu +#define REG_ADDU daddu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZINT == 32 +#define INT_ADD add +#define INT_ADDU addu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_ADDI addi +#define INT_ADDIU addiu +#define INT_SUB sub +#define INT_SUBU subu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_L lw +#define INT_S sw +#define INT_SLL sll +#define INT_SLLV sllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_SRL srl +#define INT_SRLV srlv +#define INT_SRA sra +#define INT_SRAV srav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZINT == 64 +#define INT_ADD dadd +#define INT_ADDU daddu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_ADDI daddi +#define INT_ADDIU daddiu +#define INT_SUB dsub +#define INT_SUBU dsubu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_L ld +#define INT_S sd +#define INT_SLL dsll +#define INT_SLLV dsllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define INT_SRL dsrl +#define INT_SRLV dsrlv +#define INT_SRA dsra +#define INT_SRAV dsrav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZLONG == 32 +#define LONG_ADD add +#define LONG_ADDU addu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_ADDI addi +#define LONG_ADDIU addiu +#define LONG_SUB sub +#define LONG_SUBU subu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_L lw +#define LONG_S sw +#define LONG_SLL sll +#define LONG_SLLV sllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_SRL srl +#define LONG_SRLV srlv +#define LONG_SRA sra +#define LONG_SRAV srav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG .word +#define LONGSIZE 4 +#define LONGMASK 3 +#define LONGLOG 2 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZLONG == 64 +#define LONG_ADD dadd +#define LONG_ADDU daddu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_ADDI daddi +#define LONG_ADDIU daddiu +#define LONG_SUB dsub +#define LONG_SUBU dsubu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_L ld +#define LONG_S sd +#define LONG_SLL dsll +#define LONG_SLLV dsllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG_SRL dsrl +#define LONG_SRLV dsrlv +#define LONG_SRA dsra +#define LONG_SRAV dsrav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define LONG .dword +#define LONGSIZE 8 +#define LONGMASK 7 +#define LONGLOG 3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SZPTR == 32 +#define PTR_ADD add +#define PTR_ADDU addu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_ADDI addi +#define PTR_ADDIU addiu +#define PTR_SUB sub +#define PTR_SUBU subu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_L lw +#define PTR_S sw +#define PTR_LA la +#define PTR_LI li +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SLL sll +#define PTR_SLLV sllv +#define PTR_SRL srl +#define PTR_SRLV srlv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SRA sra +#define PTR_SRAV srav +#define PTR_SCALESHIFT 2 +#define PTR .word +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTRSIZE 4 +#define PTRLOG 2 +#endif +#if _MIPS_SZPTR == 64 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_ADD dadd +#define PTR_ADDU daddu +#define PTR_ADDI daddi +#define PTR_ADDIU daddiu +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SUB dsub +#define PTR_SUBU dsubu +#define PTR_L ld +#define PTR_S sd +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_LA dla +#define PTR_LI dli +#define PTR_SLL dsll +#define PTR_SLLV dsllv +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SRL dsrl +#define PTR_SRLV dsrlv +#define PTR_SRA dsra +#define PTR_SRAV dsrav +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define PTR_SCALESHIFT 3 +#define PTR .dword +#define PTRSIZE 8 +#define PTRLOG 3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SIM == _MIPS_SIM_ABI32 +#define MFC0 mfc0 +#define MTC0 mtc0 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#if _MIPS_SIM == _MIPS_SIM_NABI32 || _MIPS_SIM == _MIPS_SIM_ABI64 +#define MFC0 dmfc0 +#define MTC0 dmtc0 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#define SSNOP sll zero, zero, 1 +#define R10KCBARRIER(addr) +#endif // defined(__has_include_next) && __has_include_next() +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_ASM_H +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ diff -Nru google-breakpad-0.1.0/src/common/android/include/asm-mips/fpregdef.h google-breakpad-0.1.0/src/common/android/include/asm-mips/fpregdef.h --- google-breakpad-0.1.0/src/common/android/include/asm-mips/fpregdef.h 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/common/android/include/asm-mips/fpregdef.h 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,117 @@ +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_FPREGDEF_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_FPREGDEF_H + +#if defined(__has_include_next) && __has_include_next() +#include_next +#else + +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ + +#include +#if _MIPS_SIM == _MIPS_SIM_ABI32 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fv0 $f0 +#define fv0f $f1 +#define fv1 $f2 +#define fv1f $f3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fa0 $f12 +#define fa0f $f13 +#define fa1 $f14 +#define fa1f $f15 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft0 $f4 +#define ft0f $f5 +#define ft1 $f6 +#define ft1f $f7 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft2 $f8 +#define ft2f $f9 +#define ft3 $f10 +#define ft3f $f11 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft4 $f16 +#define ft4f $f17 +#define ft5 $f18 +#define ft5f $f19 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs0 $f20 +#define fs0f $f21 +#define fs1 $f22 +#define fs1f $f23 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs2 $f24 +#define fs2f $f25 +#define fs3 $f26 +#define fs3f $f27 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs4 $f28 +#define fs4f $f29 +#define fs5 $f30 +#define fs5f $f31 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fcr31 $31 +#endif +#if _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32 +#define fv0 $f0 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fv1 $f2 +#define fa0 $f12 +#define fa1 $f13 +#define fa2 $f14 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fa3 $f15 +#define fa4 $f16 +#define fa5 $f17 +#define fa6 $f18 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fa7 $f19 +#define ft0 $f4 +#define ft1 $f5 +#define ft2 $f6 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft3 $f7 +#define ft4 $f8 +#define ft5 $f9 +#define ft6 $f10 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft7 $f11 +#define ft8 $f20 +#define ft9 $f21 +#define ft10 $f22 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define ft11 $f23 +#define ft12 $f1 +#define ft13 $f3 +#define fs0 $f24 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs1 $f25 +#define fs2 $f26 +#define fs3 $f27 +#define fs4 $f28 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define fs5 $f29 +#define fs6 $f30 +#define fs7 $f31 +#define fcr31 $31 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#endif +#endif // defined(__has_include_next) && __has_include_next() +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_FPREGDEF_H diff -Nru google-breakpad-0.1.0/src/common/android/include/asm-mips/README.md google-breakpad-0.1.0/src/common/android/include/asm-mips/README.md --- google-breakpad-0.1.0/src/common/android/include/asm-mips/README.md 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/common/android/include/asm-mips/README.md 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,9 @@ +# asm-mips + +The files in this directory are almost direct copies from Android NDK r12, with +the exception of changing the include guards to Breakpad ones. They are copied +from the MIPS asm/ directory, but are meant to be used as replacements for both +asm/ and machine/ includes since the files in each are largely duplicates. + +Some MIPS asm/ and all machine/ headers were removed in the move to unified NDK +headers, so Breakpad fails to compile on newer NDK versions without these files. \ No newline at end of file diff -Nru google-breakpad-0.1.0/src/common/android/include/asm-mips/regdef.h google-breakpad-0.1.0/src/common/android/include/asm-mips/regdef.h --- google-breakpad-0.1.0/src/common/android/include/asm-mips/regdef.h 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/common/android/include/asm-mips/regdef.h 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,125 @@ +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_REGDEF_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_REGDEF_H + +#if defined(__has_include_next) && __has_include_next() +#include_next +#else + +/**************************************************************************** + **************************************************************************** + *** + *** This header was automatically generated from a Linux kernel header + *** of the same name, to make information necessary for userspace to + *** call into the kernel available to libc. It contains only constants, + *** structures, and macros generated from the original header, and thus, + *** contains no copyrightable information. + *** + *** To edit the content of this header, modify the corresponding + *** source file (e.g. under external/kernel-headers/original/) then + *** run bionic/libc/kernel/tools/update_all.py + *** + *** Any manual change here will be lost the next time this script will + *** be run. You've been warned! + *** + **************************************************************************** + ****************************************************************************/ + +#include +#if _MIPS_SIM == _MIPS_SIM_ABI32 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define zero $0 +#define AT $1 +#define v0 $2 +#define v1 $3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t0 $8 +#define t1 $9 +#define t2 $10 +#define t3 $11 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t4 $12 +#define t5 $13 +#define t6 $14 +#define t7 $15 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s8 $30 +#define ra $31 +#endif +#if _MIPS_SIM == _MIPS_SIM_ABI64 || _MIPS_SIM == _MIPS_SIM_NABI32 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define zero $0 +#define AT $at +#define v0 $2 +#define v1 $3 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define a0 $4 +#define a1 $5 +#define a2 $6 +#define a3 $7 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define a4 $8 +#define ta0 $8 +#define a5 $9 +#define ta1 $9 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define a6 $10 +#define ta2 $10 +#define a7 $11 +#define ta3 $11 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t0 $12 +#define t1 $13 +#define t2 $14 +#define t3 $15 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s0 $16 +#define s1 $17 +#define s2 $18 +#define s3 $19 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s4 $20 +#define s5 $21 +#define s6 $22 +#define s7 $23 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define t8 $24 +#define t9 $25 +#define jp $25 +#define k0 $26 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define k1 $27 +#define gp $28 +#define sp $29 +#define fp $30 +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define s8 $30 +#define ra $31 +#endif +#endif // defined(__has_include_next) && __has_include_next() +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_ASM_MIPS_REGDEF_H +/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ diff -Nru google-breakpad-0.1.0/src/common/android/include/sgidefs.h google-breakpad-0.1.0/src/common/android/include/sgidefs.h --- google-breakpad-0.1.0/src/common/android/include/sgidefs.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/android/include/sgidefs.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -// Copyright (c) 2013, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef GOOGLE_BREAKPAD_ANDROID_INCLUDE_SGIDEFS_H -#define GOOGLE_BREAKPAD_ANDROID_INCLUDE_SGIDEFS_H - -#ifdef __mips__ - -// Android doesn't contain sgidefs.h, but does have which -// contains what we need. -#include - -#endif // __mips__ - -#endif // GOOGLE_BREAKPAD_ANDROID_INCLUDE_SGIDEFS_H diff -Nru google-breakpad-0.1.0/src/common/common.gyp google-breakpad-0.1.0/src/common/common.gyp --- google-breakpad-0.1.0/src/common/common.gyp 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/common.gyp 2019-03-26 03:56:45.000000000 +0000 @@ -50,7 +50,6 @@ 'android/breakpad_getcontext.S', 'android/include/elf.h', 'android/include/link.h', - 'android/include/sgidefs.h', 'android/include/stab.h', 'android/include/sys/procfs.h', 'android/include/sys/signal.h', diff -Nru google-breakpad-0.1.0/src/common/dwarf/dwarf2reader.cc google-breakpad-0.1.0/src/common/dwarf/dwarf2reader.cc --- google-breakpad-0.1.0/src/common/dwarf/dwarf2reader.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf/dwarf2reader.cc 2019-03-26 03:56:45.000000000 +0000 @@ -1247,6 +1247,41 @@ after_header_ = lengthstart + header_.total_length; } +RangeListReader::RangeListReader(const uint8_t *buffer, uint64 size, + ByteReader *reader, RangeListHandler *handler) + : buffer_(buffer), size_(size), reader_(reader), handler_(handler) { } + +bool RangeListReader::ReadRangeList(uint64 offset) { + const uint64 max_address = + (reader_->AddressSize() == 4) ? 0xffffffffUL + : 0xffffffffffffffffULL; + const uint64 entry_size = reader_->AddressSize() * 2; + bool list_end = false; + + do { + if (offset > size_ - entry_size) { + return false; // Invalid range detected + } + + uint64 start_address = reader_->ReadAddress(buffer_ + offset); + uint64 end_address = + reader_->ReadAddress(buffer_ + offset + reader_->AddressSize()); + + if (start_address == max_address) { // Base address selection + handler_->SetBaseAddress(end_address); + } else if (start_address == 0 && end_address == 0) { // End-of-list + handler_->Finish(); + list_end = true; + } else { // Add a range entry + handler_->AddRange(start_address, end_address); + } + + offset += entry_size; + } while (!list_end); + + return true; +} + // A DWARF rule for recovering the address or value of a register, or // computing the canonical frame address. There is one subclass of this for // each '*Rule' member function in CallFrameInfo::Handler. diff -Nru google-breakpad-0.1.0/src/common/dwarf/dwarf2reader.h google-breakpad-0.1.0/src/common/dwarf/dwarf2reader.h --- google-breakpad-0.1.0/src/common/dwarf/dwarf2reader.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf/dwarf2reader.h 2019-03-26 03:56:45.000000000 +0000 @@ -187,6 +187,36 @@ uint32 file_num, uint32 line_num, uint32 column_num) { } }; +class RangeListHandler { + public: + RangeListHandler() { } + + virtual ~RangeListHandler() { } + + // Add a range. + virtual void AddRange(uint64 begin, uint64 end) { }; + + // A new base address must be set for computing the ranges' addresses. + virtual void SetBaseAddress(uint64 base_address) { }; + + // Finish processing the range list. + virtual void Finish() { }; +}; + +class RangeListReader { + public: + RangeListReader(const uint8_t *buffer, uint64 size, ByteReader *reader, + RangeListHandler *handler); + + bool ReadRangeList(uint64 offset); + + private: + const uint8_t *buffer_; + uint64 size_; + ByteReader* reader_; + RangeListHandler *handler_; +}; + // This class is the main interface between the reader and the // client. The virtual functions inside this get called for // interesting events that happen during DWARF2 reading. diff -Nru google-breakpad-0.1.0/src/common/dwarf/functioninfo.cc google-breakpad-0.1.0/src/common/dwarf/functioninfo.cc --- google-breakpad-0.1.0/src/common/dwarf/functioninfo.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf/functioninfo.cc 2019-03-26 03:56:45.000000000 +0000 @@ -184,6 +184,9 @@ case DW_AT_decl_file: current_function_info_->file = files_->at(data).name; break; + case DW_AT_ranges: + current_function_info_->ranges = data; + break; default: break; } diff -Nru google-breakpad-0.1.0/src/common/dwarf/functioninfo.h google-breakpad-0.1.0/src/common/dwarf/functioninfo.h --- google-breakpad-0.1.0/src/common/dwarf/functioninfo.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf/functioninfo.h 2019-03-26 03:56:45.000000000 +0000 @@ -58,6 +58,8 @@ uint64 lowpc; // End address for this function. uint64 highpc; + // Ranges offset + uint64 ranges; }; struct SourceFileInfo { diff -Nru google-breakpad-0.1.0/src/common/dwarf_cu_to_module.cc google-breakpad-0.1.0/src/common/dwarf_cu_to_module.cc --- google-breakpad-0.1.0/src/common/dwarf_cu_to_module.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf_cu_to_module.cc 2019-03-26 03:56:45.000000000 +0000 @@ -44,6 +44,7 @@ #include #include +#include #include #include "common/dwarf_line_to_module.h" @@ -51,6 +52,7 @@ namespace google_breakpad { +using std::accumulate; using std::map; using std::pair; using std::sort; @@ -167,10 +169,15 @@ // parsing. This is for data shared across the CU's entire DIE tree, // and parameters from the code invoking the CU parser. struct DwarfCUToModule::CUContext { - CUContext(FileContext *file_context_arg, WarningReporter *reporter_arg) + CUContext(FileContext *file_context_arg, WarningReporter *reporter_arg, + RangesHandler *ranges_handler_arg) : file_context(file_context_arg), reporter(reporter_arg), - language(Language::CPlusPlus) {} + ranges_handler(ranges_handler_arg), + language(Language::CPlusPlus), + low_pc(0), + high_pc(0), + ranges(0) {} ~CUContext() { for (vector::iterator it = functions.begin(); @@ -185,9 +192,19 @@ // For printing error messages. WarningReporter *reporter; + // For reading ranges from the .debug_ranges section + RangesHandler *ranges_handler; + // The source language of this compilation unit. const Language *language; + // Addresses covered by this CU. If high_pc_ is non-zero then the CU covers + // low_pc to high_pc, otherwise ranges is non-zero and low_pc represents + // the base address of the ranges covered by the CU. + uint64 low_pc; + uint64 high_pc; + uint64 ranges; + // The functions defined in this compilation unit. We accumulate // them here during parsing. Then, in DwarfCUToModule::Finish, we // assign them lines and add them to file_context->module. @@ -285,6 +302,10 @@ // string if the DIE has no such attribute or its content could not be // demangled. string demangled_name_; + + // The non-demangled value of the DW_AT_MIPS_linkage_name attribute, + // it its content count not be demangled. + string raw_name_; }; void DwarfCUToModule::GenericDIEHandler::ProcessAttributeUnsigned( @@ -362,6 +383,7 @@ // fallthrough case Language::kDontDemangle: demangled_name_.clear(); + raw_name_ = AddStringToPool(data); break; } break; @@ -392,6 +414,8 @@ unqualified_name = &name_attribute_; else if (specification_) unqualified_name = &specification_->unqualified_name; + else if (!raw_name_.empty()) + unqualified_name = &raw_name_; // Find the name of the enclosing context. If this DIE has a // specification, it's the specification's enclosing context that @@ -438,7 +462,7 @@ uint64 offset) : GenericDIEHandler(cu_context, parent_context, offset), low_pc_(0), high_pc_(0), high_pc_form_(dwarf2reader::DW_FORM_addr), - abstract_origin_(NULL), inline_(false) { } + ranges_(0), abstract_origin_(NULL), inline_(false) { } void ProcessAttributeUnsigned(enum DwarfAttribute attr, enum DwarfForm form, uint64 data); @@ -458,6 +482,7 @@ string name_; uint64 low_pc_, high_pc_; // DW_AT_low_pc, DW_AT_high_pc DwarfForm high_pc_form_; // DW_AT_high_pc can be length or address. + uint64 ranges_; // DW_AT_ranges const AbstractOrigin* abstract_origin_; bool inline_; }; @@ -477,6 +502,9 @@ high_pc_form_ = form; high_pc_ = data; break; + case dwarf2reader::DW_AT_ranges: + ranges_ = data; + break; default: GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data); @@ -530,17 +558,48 @@ return true; } +static bool IsEmptyRange(const vector& ranges) { + uint64 size = accumulate(ranges.cbegin(), ranges.cend(), 0, + [](uint64 total, Module::Range entry) { + return total + entry.size; + } + ); + + return size == 0; +} + void DwarfCUToModule::FuncHandler::Finish() { - // Make high_pc_ an address, if it isn't already. - if (high_pc_form_ != dwarf2reader::DW_FORM_addr) { - high_pc_ += low_pc_; + vector ranges; + + if (!ranges_) { + // Make high_pc_ an address, if it isn't already. + if (high_pc_form_ != dwarf2reader::DW_FORM_addr && + high_pc_form_ != dwarf2reader::DW_FORM_GNU_addr_index) { + high_pc_ += low_pc_; + } + + Module::Range range(low_pc_, high_pc_ - low_pc_); + ranges.push_back(range); + } else { + RangesHandler *ranges_handler = cu_context_->ranges_handler; + + if (ranges_handler) { + if (!ranges_handler->ReadRanges(ranges_, cu_context_->low_pc, &ranges)) { + ranges.clear(); + cu_context_->reporter->MalformedRangeList(ranges_); + } + } else { + cu_context_->reporter->MissingRanges(); + } } // Did we collect the information we need? Not all DWARF function - // entries have low and high addresses (for example, inlined - // functions that were never used), but all the ones we're - // interested in cover a non-empty range of bytes. - if (low_pc_ < high_pc_) { + // entries are non-empty (for example, inlined functions that were never + // used), but all the ones we're interested in cover a non-empty range of + // bytes. + if (!IsEmptyRange(ranges)) { + low_pc_ = ranges.front().address; + // Malformed DWARF may omit the name, but all Module::Functions must // have names. string name; @@ -554,7 +613,7 @@ // Create a Module::Function based on the data we've gathered, and // add it to the functions_ list. scoped_ptr func(new Module::Function(name, low_pc_)); - func->size = high_pc_ - low_pc_; + func->ranges = ranges; func->parameter_size = 0; if (func->address) { // If the function address is zero this is a sign that this function @@ -656,7 +715,7 @@ return; UncoveredHeading(); fprintf(stderr, " function%s: %s\n", - function.size == 0 ? " (zero-length)" : "", + IsEmptyRange(function.ranges) ? " (zero-length)" : "", function.name.c_str()); } @@ -690,11 +749,25 @@ filename_.c_str(), offset, target); } +void DwarfCUToModule::WarningReporter::MalformedRangeList(uint64 offset) { + CUHeading(); + fprintf(stderr, "%s: warning: the range list at offset 0x%llx falls out of " + "the .debug_ranges section.\n", + filename_.c_str(), offset); +} + +void DwarfCUToModule::WarningReporter::MissingRanges() { + CUHeading(); + fprintf(stderr, "%s: warning: A DW_AT_ranges attribute was encountered but " + "the .debug_ranges section is missing.\n", filename_.c_str()); +} + DwarfCUToModule::DwarfCUToModule(FileContext *file_context, LineToModuleHandler *line_reader, + RangesHandler *ranges_handler, WarningReporter *reporter) : line_reader_(line_reader), - cu_context_(new CUContext(file_context, reporter)), + cu_context_(new CUContext(file_context, reporter, ranges_handler)), child_context_(new DIEContext()), has_source_line_info_(false) { } @@ -725,6 +798,16 @@ case dwarf2reader::DW_AT_language: // source language of this CU SetLanguage(static_cast(data)); break; + case dwarf2reader::DW_AT_low_pc: + cu_context_->low_pc = data; + break; + case dwarf2reader::DW_AT_high_pc: + cu_context_->high_pc = data; + break; + case dwarf2reader::DW_AT_ranges: + cu_context_->ranges = data; + break; + default: break; } @@ -834,6 +917,49 @@ } namespace { +class FunctionRange { + public: + FunctionRange(const Module::Range &range, Module::Function *function) : + address(range.address), size(range.size), function(function) { } + + void AddLine(Module::Line &line) { + function->lines.push_back(line); + } + + Module::Address address; + Module::Address size; + Module::Function *function; +}; + +// Fills an array of ranges with pointers to the functions which owns +// them. The array is sorted in ascending order and the ranges are non +// empty and non-overlapping. + +static void FillSortedFunctionRanges(vector &dest_ranges, + vector *functions) { + for (vector::const_iterator func_it = functions->cbegin(); + func_it != functions->cend(); + func_it++) + { + Module::Function *func = *func_it; + vector &ranges = func->ranges; + for (vector::const_iterator ranges_it = ranges.cbegin(); + ranges_it != ranges.cend(); + ++ranges_it) { + FunctionRange range(*ranges_it, func); + if (range.size != 0) { + dest_ranges.push_back(range); + } + } + } + + sort(dest_ranges.begin(), dest_ranges.end(), + [](const FunctionRange &fr1, const FunctionRange &fr2) { + return fr1.address < fr2.address; + } + ); +} + // Return true if ADDRESS falls within the range of ITEM. template inline bool within(const T &item, Module::Address address) { @@ -873,47 +999,50 @@ const Module::Function *last_function_cited = NULL; const Module::Line *last_line_cited = NULL; - // Make a single pass through both vectors from lower to higher - // addresses, populating each Function's lines vector with lines - // from our lines_ vector that fall within the function's address - // range. - vector::iterator func_it = functions->begin(); + // Prepare a sorted list of ranges with range-to-function mapping + vector sorted_ranges; + FillSortedFunctionRanges(sorted_ranges, functions); + + // Make a single pass through both the range and line vectors from lower to + // higher addresses, populating each range's function lines vector with lines + // from our lines_ vector that fall within the range. + vector::iterator range_it = sorted_ranges.begin(); vector::const_iterator line_it = lines_.begin(); Module::Address current; // Pointers to the referents of func_it and line_it, or NULL if the // iterator is at the end of the sequence. - Module::Function *func; + FunctionRange *range; const Module::Line *line; // Start current at the beginning of the first line or function, // whichever is earlier. - if (func_it != functions->end() && line_it != lines_.end()) { - func = *func_it; + if (range_it != sorted_ranges.end() && line_it != lines_.end()) { + range = &*range_it; line = &*line_it; - current = std::min(func->address, line->address); + current = std::min(range->address, line->address); } else if (line_it != lines_.end()) { - func = NULL; + range = NULL; line = &*line_it; current = line->address; - } else if (func_it != functions->end()) { - func = *func_it; + } else if (range_it != sorted_ranges.end()) { + range = &*range_it; line = NULL; - current = (*func_it)->address; + current = range->address; } else { return; } - while (func || line) { + while (range || line) { // This loop has two invariants that hold at the top. // // First, at least one of the iterators is not at the end of its // sequence, and those that are not refer to the earliest - // function or line that contains or starts after CURRENT. + // range or line that contains or starts after CURRENT. // // Note that every byte is in one of four states: it is covered - // or not covered by a function, and, independently, it is + // or not covered by a range, and, independently, it is // covered or not covered by a line. // // The second invariant is that CURRENT refers to a byte whose @@ -923,7 +1052,7 @@ // // Note that, although each iteration advances CURRENT from one // transition address to the next in each iteration, it might - // not advance the iterators. Suppose we have a function that + // not advance the iterators. Suppose we have a range that // starts with a line, has a gap, and then a second line, and // suppose that we enter an iteration with CURRENT at the end of // the first line. The next transition address is the start of @@ -931,11 +1060,11 @@ // advance CURRENT to that point. At the head of that iteration, // the invariants require that the line iterator be pointing at // the second line. But this is also true at the head of the - // next. And clearly, the iteration must not change the function + // next. And clearly, the iteration must not change the range // iterator. So neither iterator moves. // Assert the first invariant (see above). - assert(!func || current < func->address || within(*func, current)); + assert(!range || current < range->address || within(*range, current)); assert(!line || current < line->address || within(*line, current)); // The next transition after CURRENT. @@ -943,33 +1072,33 @@ // Figure out which state we're in, add lines or warn, and compute // the next transition address. - if (func && current >= func->address) { + if (range && current >= range->address) { if (line && current >= line->address) { - // Covered by both a line and a function. - Module::Address func_left = func->size - (current - func->address); + // Covered by both a line and a range. + Module::Address range_left = range->size - (current - range->address); Module::Address line_left = line->size - (current - line->address); // This may overflow, but things work out. - next_transition = current + std::min(func_left, line_left); + next_transition = current + std::min(range_left, line_left); Module::Line l = *line; l.address = current; l.size = next_transition - current; - func->lines.push_back(l); + range->AddLine(l); last_line_used = line; } else { - // Covered by a function, but no line. - if (func != last_function_cited) { - reporter->UncoveredFunction(*func); - last_function_cited = func; + // Covered by a range, but no line. + if (range->function != last_function_cited) { + reporter->UncoveredFunction(*(range->function)); + last_function_cited = range->function; } - if (line && within(*func, line->address)) + if (line && within(*range, line->address)) next_transition = line->address; else // If this overflows, we'll catch it below. - next_transition = func->address + func->size; + next_transition = range->address + range->size; } } else { if (line && current >= line->address) { - // Covered by a line, but no function. + // Covered by a line, but no range. // // If GCC emits padding after one function to align the start // of the next, then it will attribute the padding @@ -981,27 +1110,27 @@ // start of the next function, then assume this is what // happened, and don't warn. if (line != last_line_cited - && !(func + && !(range && line == last_line_used - && func->address - line->address == line->size)) { + && range->address - line->address == line->size)) { reporter->UncoveredLine(*line); last_line_cited = line; } - if (func && within(*line, func->address)) - next_transition = func->address; + if (range && within(*line, range->address)) + next_transition = range->address; else // If this overflows, we'll catch it below. next_transition = line->address + line->size; } else { - // Covered by neither a function nor a line. By the invariant, - // both func and line begin after CURRENT. The next transition - // is the start of the next function or next line, whichever + // Covered by neither a range nor a line. By the invariant, + // both range and line begin after CURRENT. The next transition + // is the start of the next range or next line, whichever // is earliest. - assert(func || line); - if (func && line) - next_transition = std::min(func->address, line->address); - else if (func) - next_transition = func->address; + assert(range || line); + if (range && line) + next_transition = std::min(range->address, line->address); + else if (range) + next_transition = range->address; else next_transition = line->address; } @@ -1018,11 +1147,11 @@ // then we could go around more than once. We don't worry too much // about what result we produce in that case, just as long as we don't // hang or crash. - while (func_it != functions->end() - && next_transition >= (*func_it)->address - && !within(**func_it, next_transition)) - func_it++; - func = (func_it != functions->end()) ? *func_it : NULL; + while (range_it != sorted_ranges.end() + && next_transition >= range_it->address + && !within(*range_it, next_transition)) + range_it++; + range = (range_it != sorted_ranges.end()) ? &(*range_it) : NULL; while (line_it != lines_.end() && next_transition >= line_it->address && !within(*line_it, next_transition)) diff -Nru google-breakpad-0.1.0/src/common/dwarf_cu_to_module.h google-breakpad-0.1.0/src/common/dwarf_cu_to_module.h --- google-breakpad-0.1.0/src/common/dwarf_cu_to_module.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf_cu_to_module.h 2019-03-26 03:56:45.000000000 +0000 @@ -123,6 +123,22 @@ scoped_ptr file_private_; }; + // An abstract base class for handlers that handle DWARF range lists for + // DwarfCUToModule. + class RangesHandler { + public: + RangesHandler() { } + virtual ~RangesHandler() { } + + // Called when finishing a function to populate the function's ranges. + // The ranges' entries are read starting from offset in the .debug_ranges + // section, base_address holds the base PC the range list values are + // offsets off. Return false if the rangelist falls out of the + // .debug_ranges section. + virtual bool ReadRanges(uint64 offset, Module::Address base_address, + vector* ranges) = 0; + }; + // An abstract base class for handlers that handle DWARF line data // for DwarfCUToModule. DwarfCUToModule could certainly just use // dwarf2reader::LineInfo itself directly, but decoupling things @@ -208,6 +224,14 @@ // FilePrivate did not retain the inter-CU specification data. virtual void UnhandledInterCUReference(uint64 offset, uint64 target); + // The DW_AT_ranges at offset is malformed (truncated or outside of the + // .debug_ranges section's bound). + virtual void MalformedRangeList(uint64 offset); + + // A DW_AT_ranges attribute was encountered but the no .debug_ranges + // section was found. + virtual void MissingRanges(); + uint64 cu_offset() const { return cu_offset_; } @@ -235,6 +259,7 @@ // data we find. DwarfCUToModule(FileContext *file_context, LineToModuleHandler *line_reader, + RangesHandler *ranges_handler, WarningReporter *reporter); ~DwarfCUToModule(); diff -Nru google-breakpad-0.1.0/src/common/dwarf_cu_to_module_unittest.cc google-breakpad-0.1.0/src/common/dwarf_cu_to_module_unittest.cc --- google-breakpad-0.1.0/src/common/dwarf_cu_to_module_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf_cu_to_module_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -128,7 +128,8 @@ language_signed_(false), appender_(&lines_), reporter_("dwarf-filename", 0xcf8f9bb6443d29b5LL), - root_handler_(&file_context_, &line_reader_, &reporter_), + root_handler_(&file_context_, &line_reader_, + /* ranges_reader */ nullptr, &reporter_), functions_filled_(false) { // By default, expect no warnings to be reported, and expect the // compilation unit's name to be provided. The test can override @@ -597,7 +598,7 @@ Module::Function *function = functions_[i]; EXPECT_EQ(name, function->name); EXPECT_EQ(address, function->address); - EXPECT_EQ(size, function->size); + EXPECT_EQ(size, function->ranges[0].size); EXPECT_EQ(0U, function->parameter_size); } @@ -1515,7 +1516,7 @@ // First CU. Declares class_A. { - DwarfCUToModule root1_handler(&fc, &lr, &reporter_); + DwarfCUToModule root1_handler(&fc, &lr, nullptr, &reporter_); ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3)); ASSERT_TRUE(root1_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit)); @@ -1528,7 +1529,7 @@ // Second CU. Defines class_A, declares member_func_B. { - DwarfCUToModule root2_handler(&fc, &lr, &reporter_); + DwarfCUToModule root2_handler(&fc, &lr, nullptr, &reporter_); ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3)); ASSERT_TRUE(root2_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit)); @@ -1545,7 +1546,7 @@ // Third CU. Defines member_func_B. { - DwarfCUToModule root3_handler(&fc, &lr, &reporter_); + DwarfCUToModule root3_handler(&fc, &lr, nullptr, &reporter_); ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3)); ASSERT_TRUE(root3_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit)); @@ -1574,7 +1575,7 @@ // First CU. Declares class_A. { - DwarfCUToModule root1_handler(&fc, &lr, &reporter_); + DwarfCUToModule root1_handler(&fc, &lr, nullptr, &reporter_); ASSERT_TRUE(root1_handler.StartCompilationUnit(0, 1, 2, 3, 3)); ASSERT_TRUE(root1_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit)); @@ -1587,7 +1588,7 @@ // Second CU. Defines class_A, declares member_func_B. { - DwarfCUToModule root2_handler(&fc, &lr, &reporter_); + DwarfCUToModule root2_handler(&fc, &lr, nullptr, &reporter_); ASSERT_TRUE(root2_handler.StartCompilationUnit(0, 1, 2, 3, 3)); ASSERT_TRUE(root2_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit)); @@ -1605,7 +1606,7 @@ // Third CU. Defines member_func_B. { - DwarfCUToModule root3_handler(&fc, &lr, &reporter_); + DwarfCUToModule root3_handler(&fc, &lr, nullptr, &reporter_); ASSERT_TRUE(root3_handler.StartCompilationUnit(0, 1, 2, 3, 3)); ASSERT_TRUE(root3_handler.StartRootDIE(1, dwarf2reader::DW_TAG_compile_unit)); @@ -1791,7 +1792,8 @@ file("source file name") { reporter.SetCUName("compilation-unit-name"); - function.size = 0x89808a5bdfa0a6a3ULL; + Module::Range range(0x19c45c30770c1eb0ULL, 0x89808a5bdfa0a6a3ULL); + function.ranges.push_back(range); function.parameter_size = 0x6a329f18683dcd51ULL; line.address = 0x3606ac6267aebeccULL; diff -Nru google-breakpad-0.1.0/src/common/dwarf_range_list_handler.cc google-breakpad-0.1.0/src/common/dwarf_range_list_handler.cc --- google-breakpad-0.1.0/src/common/dwarf_range_list_handler.cc 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf_range_list_handler.cc 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,60 @@ +// Copyright (c) 2018 Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Gabriele Svelto +// + +// dwarf_range_list_handler.cc: Implementation of DwarfRangeListHandler class. +// See dwarf_range_list_handler.h for details. + +#include + +#include "common/dwarf_range_list_handler.h" + +namespace google_breakpad { + +void DwarfRangeListHandler::AddRange(uint64 begin, uint64 end) { + Module::Range r(begin + base_address_, end - begin); + + ranges_->push_back(r); +} + +void DwarfRangeListHandler::SetBaseAddress(uint64 base_address) { + base_address_ = base_address; +} + +void DwarfRangeListHandler::Finish() { + std::sort(ranges_->begin(), ranges_->end(), + [](const Module::Range &a, const Module::Range &b) { + return a.address < b.address; + } + ); +} + +} // namespace google_breakpad diff -Nru google-breakpad-0.1.0/src/common/dwarf_range_list_handler.h google-breakpad-0.1.0/src/common/dwarf_range_list_handler.h --- google-breakpad-0.1.0/src/common/dwarf_range_list_handler.h 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/common/dwarf_range_list_handler.h 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,79 @@ +// -*- mode: c++ -*- + +// Copyright (c) 2018 Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Original author: Gabriele Svelto +// + +// The DwarfRangeListHandler class accepts rangelist data from a DWARF parser +// and adds it to a google_breakpad::Function or other objects supporting +// ranges. + +#ifndef COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H +#define COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H + +#include + +#include "common/module.h" +#include "common/dwarf/dwarf2reader.h" + +namespace google_breakpad { + +// A class for producing a vector of google_breakpad::Module::Range +// instances from a parsed DWARF range list. + +class DwarfRangeListHandler: public dwarf2reader::RangeListHandler { + public: + DwarfRangeListHandler(uint64 base_address, vector *ranges) + : base_address_(base_address), ranges_(ranges) { } + + ~DwarfRangeListHandler() { } + + // Add a range to the list + void AddRange(uint64 begin, uint64 end); + + // Record the new base address and use it for the following entries + void SetBaseAddress(uint64 base_address); + + // Sort the ranges so that they are in ascending order of starting address + void Finish(); + + private: + // The current PC to add to every entry, this can be overridden by a special + // list entry + uint64 base_address_; + + // The list of ranges to be populated + vector *ranges_; +}; + +} // namespace google_breakpad + +#endif // COMMON_LINUX_DWARF_RANGE_LIST_HANDLER_H diff -Nru google-breakpad-0.1.0/src/common/linux/dump_symbols.cc google-breakpad-0.1.0/src/common/linux/dump_symbols.cc --- google-breakpad-0.1.0/src/common/linux/dump_symbols.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/linux/dump_symbols.cc 2019-03-26 03:56:45.000000000 +0000 @@ -58,6 +58,7 @@ #include "common/dwarf_cfi_to_module.h" #include "common/dwarf_cu_to_module.h" #include "common/dwarf_line_to_module.h" +#include "common/dwarf_range_list_handler.h" #include "common/linux/crc32.h" #include "common/linux/eintr_wrapper.h" #include "common/linux/elfutils.h" @@ -81,6 +82,7 @@ using google_breakpad::DwarfCFIToModule; using google_breakpad::DwarfCUToModule; using google_breakpad::DwarfLineToModule; +using google_breakpad::DwarfRangeListHandler; using google_breakpad::ElfClass; using google_breakpad::ElfClass32; using google_breakpad::ElfClass64; @@ -207,6 +209,30 @@ } #endif // NO_STABS_SUPPORT +// A range handler that accepts rangelist data parsed by +// dwarf2reader::RangeListReader and populates a range vector (typically +// owned by a function) with the results. +class DumperRangesHandler : public DwarfCUToModule::RangesHandler { + public: + DumperRangesHandler(const uint8_t *buffer, uint64 size, + dwarf2reader::ByteReader* reader) + : buffer_(buffer), size_(size), reader_(reader) { } + + bool ReadRanges(uint64 offset, Module::Address base_address, + vector* ranges) { + DwarfRangeListHandler handler(base_address, ranges); + dwarf2reader::RangeListReader rangelist_reader(buffer_, size_, reader_, + &handler); + + return rangelist_reader.ReadRangeList(offset); + } + + private: + const uint8_t *buffer_; + uint64 size_; + dwarf2reader::ByteReader* reader_; +}; + // A line-to-module loader that accepts line number info parsed by // dwarf2reader::LineInfo and populates a Module and a line vector // with the results. @@ -261,6 +287,18 @@ file_context.AddSectionToSectionMap(name, contents, section->sh_size); } + // Optional .debug_ranges reader + scoped_ptr ranges_handler; + dwarf2reader::SectionMap::const_iterator ranges_entry = + file_context.section_map().find(".debug_ranges"); + if (ranges_entry != file_context.section_map().end()) { + const std::pair& ranges_section = + ranges_entry->second; + ranges_handler.reset( + new DumperRangesHandler(ranges_section.first, ranges_section.second, + &byte_reader)); + } + // Parse all the compilation units in the .debug_info section. DumperLineToModule line_to_module(&byte_reader); dwarf2reader::SectionMap::const_iterator debug_info_entry = @@ -276,7 +314,8 @@ // Make a handler for the root DIE that populates MODULE with the // data that was found. DwarfCUToModule::WarningReporter reporter(dwarf_filename, offset); - DwarfCUToModule root_handler(&file_context, &line_to_module, &reporter); + DwarfCUToModule root_handler(&file_context, &line_to_module, + ranges_handler.get(), &reporter); // Make a Dwarf2Handler that drives the DIEHandler. dwarf2reader::DIEDispatcher die_dispatcher(&root_handler); // Make a DWARF parser for the compilation unit at OFFSET. diff -Nru google-breakpad-0.1.0/src/common/linux/dump_symbols_unittest.cc google-breakpad-0.1.0/src/common/linux/dump_symbols_unittest.cc --- google-breakpad-0.1.0/src/common/linux/dump_symbols_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/linux/dump_symbols_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -85,7 +85,7 @@ typedef Types ElfClasses; -TYPED_TEST_CASE(DumpSymbols, ElfClasses); +TYPED_TEST_SUITE(DumpSymbols, ElfClasses); TYPED_TEST(DumpSymbols, Invalid) { Elf32_Ehdr header; diff -Nru google-breakpad-0.1.0/src/common/linux/elf_gnu_compat.h google-breakpad-0.1.0/src/common/linux/elf_gnu_compat.h --- google-breakpad-0.1.0/src/common/linux/elf_gnu_compat.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/linux/elf_gnu_compat.h 2019-03-26 03:56:45.000000000 +0000 @@ -43,4 +43,9 @@ #define NT_GNU_BUILD_ID 3 #endif +// Newer Linux systems offer this. +#ifndef NT_SIGINFO +#define NT_SIGINFO 0x53494749 +#endif + #endif // COMMON_LINUX_ELF_GNU_COMPAT_H_ diff -Nru google-breakpad-0.1.0/src/common/linux/file_id_unittest.cc google-breakpad-0.1.0/src/common/linux/file_id_unittest.cc --- google-breakpad-0.1.0/src/common/linux/file_id_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/linux/file_id_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -138,7 +138,7 @@ typedef Types ElfClasses; -TYPED_TEST_CASE(FileIDTest, ElfClasses); +TYPED_TEST_SUITE(FileIDTest, ElfClasses); TYPED_TEST(FileIDTest, ElfClass) { const char expected_identifier_string[] = diff -Nru google-breakpad-0.1.0/src/common/linux/synth_elf_unittest.cc google-breakpad-0.1.0/src/common/linux/synth_elf_unittest.cc --- google-breakpad-0.1.0/src/common/linux/synth_elf_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/linux/synth_elf_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -193,7 +193,7 @@ typedef Types ElfClasses; -TYPED_TEST_CASE(BasicElf, ElfClasses); +TYPED_TEST_SUITE(BasicElf, ElfClasses); TYPED_TEST(BasicElf, EmptyLE) { typedef typename TypeParam::Ehdr Ehdr; diff -Nru google-breakpad-0.1.0/src/common/mac/arch_utilities.cc google-breakpad-0.1.0/src/common/mac/arch_utilities.cc --- google-breakpad-0.1.0/src/common/mac/arch_utilities.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/mac/arch_utilities.cc 2019-03-26 03:56:45.000000000 +0000 @@ -46,15 +46,31 @@ #define CPU_SUBTYPE_ARM64_ALL (static_cast(0)) #endif // CPU_SUBTYPE_ARM64_ALL +#ifndef CPU_SUBTYPE_ARM64_E +#define CPU_SUBTYPE_ARM64_E (static_cast(2)) +#endif // CPU_SUBTYPE_ARM64_E + namespace { -const NXArchInfo* ArchInfo_arm64() { +const NXArchInfo* ArchInfo_arm64(cpu_subtype_t cpu_subtype) { + const char* name = NULL; + switch (cpu_subtype) { + case CPU_SUBTYPE_ARM64_ALL: + name = "arm64"; + break; + case CPU_SUBTYPE_ARM64_E: + name = "arm64e"; + break; + default: + return NULL; + } + NXArchInfo* arm64 = new NXArchInfo; *arm64 = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM, CPU_SUBTYPE_ARM_V7); - arm64->name = "arm64"; + arm64->name = name; arm64->cputype = CPU_TYPE_ARM64; - arm64->cpusubtype = CPU_SUBTYPE_ARM64_ALL; + arm64->cpusubtype = cpu_subtype; arm64->description = "arm 64"; return arm64; } @@ -79,6 +95,10 @@ return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM64, CPU_SUBTYPE_ARM64_ALL); + if (!strcmp("arm64e", arch_name)) + return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM64, + CPU_SUBTYPE_ARM64_E); + // TODO: Remove this when the OS knows about armv7s. if (!strcmp("armv7s", arch_name)) return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM, CPU_SUBTYPE_ARM_V7S); @@ -90,10 +110,15 @@ cpu_subtype_t cpu_subtype) { // TODO: Remove this when the OS knows about arm64. if (cpu_type == CPU_TYPE_ARM64 && cpu_subtype == CPU_SUBTYPE_ARM64_ALL) { - static const NXArchInfo* arm64 = ArchInfo_arm64(); + static const NXArchInfo* arm64 = ArchInfo_arm64(cpu_subtype); return arm64; } + if (cpu_type == CPU_TYPE_ARM64 && cpu_subtype == CPU_SUBTYPE_ARM64_E) { + static const NXArchInfo* arm64e = ArchInfo_arm64(cpu_subtype); + return arm64e; + } + // TODO: Remove this when the OS knows about armv7s. if (cpu_type == CPU_TYPE_ARM && cpu_subtype == CPU_SUBTYPE_ARM_V7S) { static const NXArchInfo* armv7s = ArchInfo_armv7s(); @@ -114,6 +139,7 @@ kArch_x86_64h, kArch_arm, kArch_arm64, + kArch_arm64e, kArch_ppc, // This must be last. kNumArchitectures @@ -158,6 +184,13 @@ "ARM64" }, { + "arm64e", + CPU_TYPE_ARM64, + CPU_SUBTYPE_ARM64_E, + NX_LittleEndian, + "ARM64e" + }, + { "ppc", CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL, diff -Nru google-breakpad-0.1.0/src/common/mac/dump_syms.cc google-breakpad-0.1.0/src/common/mac/dump_syms.cc --- google-breakpad-0.1.0/src/common/mac/dump_syms.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/mac/dump_syms.cc 2019-03-26 03:56:45.000000000 +0000 @@ -55,6 +55,7 @@ #include "common/dwarf_cfi_to_module.h" #include "common/dwarf_cu_to_module.h" #include "common/dwarf_line_to_module.h" +#include "common/dwarf_range_list_handler.h" #include "common/mac/file_id.h" #include "common/mac/arch_utilities.h" #include "common/mac/macho_reader.h" @@ -76,6 +77,7 @@ using dwarf2reader::ByteReader; using google_breakpad::DwarfCUToModule; using google_breakpad::DwarfLineToModule; +using google_breakpad::DwarfRangeListHandler; using google_breakpad::FileID; using google_breakpad::mach_o::FatReader; using google_breakpad::mach_o::Section; @@ -303,6 +305,31 @@ return compacted; } +// A range handler that accepts rangelist data parsed by +// dwarf2reader::RangeListReader and populates a range vector (typically +// owned by a function) with the results. +class DumpSymbols::DumperRangesHandler: + public DwarfCUToModule::RangesHandler { + public: + DumperRangesHandler(const uint8_t *buffer, uint64 size, + dwarf2reader::ByteReader* reader) + : buffer_(buffer), size_(size), reader_(reader) { } + + bool ReadRanges(uint64 offset, Module::Address base_address, + vector* ranges) { + DwarfRangeListHandler handler(base_address, ranges); + dwarf2reader::RangeListReader rangelist_reader(buffer_, size_, reader_, + &handler); + + return rangelist_reader.ReadRangeList(offset); + } + + private: + const uint8_t *buffer_; + uint64 size_; + dwarf2reader::ByteReader* reader_; +}; + // A line-to-module loader that accepts line number info parsed by // dwarf2reader::LineInfo and populates a Module and a line vector // with the results. @@ -425,6 +452,18 @@ // Build a line-to-module loader for the root handler to use. DumperLineToModule line_to_module(&byte_reader); + // Optional .debug_ranges reader + scoped_ptr ranges_handler; + dwarf2reader::SectionMap::const_iterator ranges_entry = + file_context.section_map().find("__debug_ranges"); + if (ranges_entry != file_context.section_map().end()) { + const std::pair& ranges_section = + ranges_entry->second; + ranges_handler.reset( + new DumperRangesHandler(ranges_section.first, ranges_section.second, + &byte_reader)); + } + // Walk the __debug_info section, one compilation unit at a time. uint64 debug_info_length = debug_info_section.second; for (uint64 offset = 0; offset < debug_info_length;) { @@ -432,7 +471,8 @@ // debug info. DwarfCUToModule::WarningReporter reporter(selected_object_name_, offset); - DwarfCUToModule root_handler(&file_context, &line_to_module, &reporter); + DwarfCUToModule root_handler(&file_context, &line_to_module, + ranges_handler.get(), &reporter); // Make a Dwarf2Handler that drives our DIEHandler. dwarf2reader::DIEDispatcher die_dispatcher(&root_handler); // Make a DWARF parser for the compilation unit at OFFSET. diff -Nru google-breakpad-0.1.0/src/common/mac/dump_syms.h google-breakpad-0.1.0/src/common/mac/dump_syms.h --- google-breakpad-0.1.0/src/common/mac/dump_syms.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/mac/dump_syms.h 2019-03-26 03:56:45.000000000 +0000 @@ -125,6 +125,7 @@ private: // Used internally. class DumperLineToModule; + class DumperRangesHandler; class LoadCommandDumper; // This method behaves similarly to NXFindBestFatArch, but it supports diff -Nru google-breakpad-0.1.0/src/common/mac/file_id.h google-breakpad-0.1.0/src/common/mac/file_id.h --- google-breakpad-0.1.0/src/common/mac/file_id.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/mac/file_id.h 2019-03-26 03:56:45.000000000 +0000 @@ -42,7 +42,7 @@ class FileID { public: FileID(const char *path); - ~FileID() {}; + ~FileID() {} // Load the identifier for the file path specified in the constructor into // |identifier|. Return false if the identifier could not be created for the diff -Nru google-breakpad-0.1.0/src/common/mac/MachIPC.h google-breakpad-0.1.0/src/common/mac/MachIPC.h --- google-breakpad-0.1.0/src/common/mac/MachIPC.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/mac/MachIPC.h 2019-03-26 03:56:45.000000000 +0000 @@ -236,7 +236,7 @@ //============================================================================== class MachReceiveMessage : public MachMessage { public: - MachReceiveMessage() : MachMessage() {}; + MachReceiveMessage() : MachMessage() {} }; //============================================================================== diff -Nru google-breakpad-0.1.0/src/common/module.cc google-breakpad-0.1.0/src/common/module.cc --- google-breakpad-0.1.0/src/common/module.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/module.cc 2019-03-26 03:56:45.000000000 +0000 @@ -44,7 +44,6 @@ namespace google_breakpad { using std::dec; -using std::endl; using std::hex; @@ -100,10 +99,12 @@ #if _DEBUG { // There should be no other PUBLIC symbols that overlap with the function. - Extern debug_ext(function->address); - ExternSet::iterator it_debug = externs_.lower_bound(&ext); - assert(it_debug == externs_.end() || - (*it_debug)->address >= function->address + function->size); + for (const Range& range : function->ranges) { + Extern debug_ext(range.address); + ExternSet::iterator it_debug = externs_.lower_bound(&ext); + assert(it_debug == externs_.end() || + (*it_debug)->address >= range.address + range.size); + } } #endif @@ -233,12 +234,12 @@ bool Module::Write(std::ostream &stream, SymbolData symbol_data) { stream << "MODULE " << os_ << " " << architecture_ << " " - << id_ << " " << name_ << endl; + << id_ << " " << name_ << "\n"; if (!stream.good()) return ReportError(); if (!code_id_.empty()) { - stream << "INFO CODE_ID " << code_id_ << endl; + stream << "INFO CODE_ID " << code_id_ << "\n"; } if (symbol_data != ONLY_CFI) { @@ -249,7 +250,7 @@ file_it != files_.end(); ++file_it) { File *file = file_it->second; if (file->source_id >= 0) { - stream << "FILE " << file->source_id << " " << file->name << endl; + stream << "FILE " << file->source_id << " " << file->name << "\n"; if (!stream.good()) return ReportError(); } @@ -259,24 +260,33 @@ for (FunctionSet::const_iterator func_it = functions_.begin(); func_it != functions_.end(); ++func_it) { Function *func = *func_it; - stream << "FUNC " << hex - << (func->address - load_address_) << " " - << func->size << " " - << func->parameter_size << " " - << func->name << dec << endl; - if (!stream.good()) - return ReportError(); + vector::iterator line_it = func->lines.begin(); + for (auto range_it = func->ranges.cbegin(); + range_it != func->ranges.cend(); ++range_it) { + stream << "FUNC " << hex + << (range_it->address - load_address_) << " " + << range_it->size << " " + << func->parameter_size << " " + << func->name << dec << "\n"; - for (vector::iterator line_it = func->lines.begin(); - line_it != func->lines.end(); ++line_it) { - stream << hex - << (line_it->address - load_address_) << " " - << line_it->size << " " - << dec - << line_it->number << " " - << line_it->file->source_id << endl; if (!stream.good()) return ReportError(); + + while ((line_it != func->lines.end()) && + (line_it->address >= range_it->address) && + (line_it->address < (range_it->address + range_it->size))) { + stream << hex + << (line_it->address - load_address_) << " " + << line_it->size << " " + << dec + << line_it->number << " " + << line_it->file->source_id << "\n"; + + if (!stream.good()) + return ReportError(); + + ++line_it; + } } } @@ -286,7 +296,7 @@ Extern *ext = *extern_it; stream << "PUBLIC " << hex << (ext->address - load_address_) << " 0 " - << ext->name << dec << endl; + << ext->name << dec << "\n"; } } @@ -303,7 +313,7 @@ || !WriteRuleMap(entry->initial_rules, stream)) return ReportError(); - stream << endl; + stream << "\n"; // Write out this entry's delta rules as 'STACK CFI' records. for (RuleChangeMap::const_iterator delta_it = entry->rule_changes.begin(); @@ -314,7 +324,7 @@ || !WriteRuleMap(delta_it->second, stream)) return ReportError(); - stream << endl; + stream << "\n"; } } } diff -Nru google-breakpad-0.1.0/src/common/module.h google-breakpad-0.1.0/src/common/module.h --- google-breakpad-0.1.0/src/common/module.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/module.h 2019-03-26 03:56:45.000000000 +0000 @@ -85,10 +85,19 @@ int source_id; }; + // An address range. + struct Range { + Range(const Address address_input, const Address size_input) : + address(address_input), size(size_input) { } + + Address address; + Address size; + }; + // A function. struct Function { Function(const string &name_input, const Address &address_input) : - name(name_input), address(address_input), size(0), parameter_size(0) {} + name(name_input), address(address_input), parameter_size(0) {} // For sorting by address. (Not style-guide compliant, but it's // stupid not to put this in the struct.) @@ -99,9 +108,9 @@ // The function's name. const string name; - // The start address and length of the function's code. + // The start address and the address ranges covered by the function. const Address address; - Address size; + vector ranges; // The function's parameter size. Address parameter_size; diff -Nru google-breakpad-0.1.0/src/common/module_unittest.cc google-breakpad-0.1.0/src/common/module_unittest.cc --- google-breakpad-0.1.0/src/common/module_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/module_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -55,7 +55,8 @@ const Module::Address DUP_PARAMETER_SIZE = 0xf14ac4fed48c4a99LL; Module::Function *function = new Module::Function(name, DUP_ADDRESS); - function->size = DUP_SIZE; + Module::Range range(DUP_ADDRESS, DUP_SIZE); + function->ranges.push_back(range); function->parameter_size = DUP_PARAMETER_SIZE; return function; } @@ -92,7 +93,8 @@ Module::File *file = m.FindFile("file_name.cc"); Module::Function *function = new Module::Function( "function_name", 0xe165bf8023b9d9abLL); - function->size = 0x1e4bb0eb1cbf5b09LL; + Module::Range range(0xe165bf8023b9d9abLL, 0x1e4bb0eb1cbf5b09LL); + function->ranges.push_back(range); function->parameter_size = 0x772beee89114358aLL; Module::Line line = { 0xe165bf8023b9d9abLL, 0x1e4bb0eb1cbf5b09LL, file, 67519080 }; @@ -120,7 +122,8 @@ // A function. Module::Function *function = new Module::Function( "A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)", 0xbec774ea5dd935f3LL); - function->size = 0x2922088f98d3f6fcLL; + Module::Range range(0xbec774ea5dd935f3LL, 0x2922088f98d3f6fcLL); + function->ranges.push_back(range); function->parameter_size = 0xe5e9aa008bd5f0d0LL; // Some source lines. The module should not sort these. @@ -177,13 +180,14 @@ // Create a function. Module::Function *function = new Module::Function( "function_name", 0x9b926d464f0b9384LL); - function->size = 0x4f524a4ba795e6a6LL; + Module::Range range(0x9b926d464f0b9384LL, 0x4f524a4ba795e6a6LL); + function->ranges.push_back(range); function->parameter_size = 0xbbe8133a6641c9b7LL; // Source files that refer to some files, but not others. - Module::Line line1 = { 0x595fa44ebacc1086LL, 0x1e1e0191b066c5b3LL, + Module::Line line1 = { 0xab415089485e1a20LL, 0x126e3124979291f2LL, file1, 137850127 }; - Module::Line line2 = { 0x401ce8c8a12d25e3LL, 0x895751c41b8d2ce2LL, + Module::Line line2 = { 0xb2675b5c3c2ed33fLL, 0x1df77f5551dbd68cLL, file3, 28113549 }; function->lines.push_back(line1); function->lines.push_back(line2); @@ -210,8 +214,8 @@ "FILE 1 filename3\n" "FUNC 9b926d464f0b9384 4f524a4ba795e6a6 bbe8133a6641c9b7" " function_name\n" - "595fa44ebacc1086 1e1e0191b066c5b3 137850127 0\n" - "401ce8c8a12d25e3 895751c41b8d2ce2 28113549 1\n", + "ab415089485e1a20 126e3124979291f2 137850127 0\n" + "b2675b5c3c2ed33f 1df77f5551dbd68c 28113549 1\n", contents.c_str()); } @@ -225,7 +229,8 @@ // A function. Module::Function *function = new Module::Function( "A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)", 0xbec774ea5dd935f3LL); - function->size = 0x2922088f98d3f6fcLL; + Module::Range range(0xbec774ea5dd935f3LL, 0x2922088f98d3f6fcLL); + function->ranges.push_back(range); function->parameter_size = 0xe5e9aa008bd5f0d0LL; // Some source lines. The module should not sort these. @@ -267,12 +272,14 @@ // Two functions. Module::Function *function1 = new Module::Function( "_without_form", 0xd35024aa7ca7da5cLL); - function1->size = 0x200b26e605f99071LL; + Module::Range r1(0xd35024aa7ca7da5cLL, 0x200b26e605f99071LL); + function1->ranges.push_back(r1); function1->parameter_size = 0xf14ac4fed48c4a99LL; Module::Function *function2 = new Module::Function( "_and_void", 0x2987743d0b35b13fLL); - function2->size = 0xb369db048deb3010LL; + Module::Range r2(0x2987743d0b35b13fLL, 0xb369db048deb3010LL); + function2->ranges.push_back(r2); function2->parameter_size = 0x938e556cb5a79988LL; // Put them in a vector. @@ -504,7 +511,8 @@ m.AddExtern(extern2); Module::Function* function = new Module::Function("_xyz", 0xfff0); - function->size = 0x10; + Module::Range range(0xfff0, 0x10); + function->ranges.push_back(range); function->parameter_size = 0; m.AddFunction(function); @@ -541,7 +549,8 @@ // The corresponding function from the DWARF debug data have the actual // address. Module::Function* function = new Module::Function("_thumb_xyz", 0xfff0); - function->size = 0x10; + Module::Range range(0xfff0, 0x10); + function->ranges.push_back(range); function->parameter_size = 0; m.AddFunction(function); diff -Nru google-breakpad-0.1.0/src/common/path_helper.cc google-breakpad-0.1.0/src/common/path_helper.cc --- google-breakpad-0.1.0/src/common/path_helper.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/path_helper.cc 2019-03-26 03:56:45.000000000 +0000 @@ -31,6 +31,7 @@ #include #include +#include #include namespace google_breakpad { diff -Nru google-breakpad-0.1.0/src/common/stabs_to_module.cc google-breakpad-0.1.0/src/common/stabs_to_module.cc --- google-breakpad-0.1.0/src/common/stabs_to_module.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/stabs_to_module.cc 2019-03-26 03:56:45.000000000 +0000 @@ -91,7 +91,8 @@ uint64_t address) { assert(!current_function_); Module::Function *f = new Module::Function(Demangle(name), address); - f->size = 0; // We compute this in StabsToModule::Finalize(). + Module::Range r(address, 0); // We compute this in StabsToModule::Finalize(). + f->ranges.push_back(r); f->parameter_size = 0; // We don't provide this information. current_function_ = f; boundaries_.push_back(static_cast(address)); @@ -167,14 +168,14 @@ vector::const_iterator boundary = std::upper_bound(boundaries_.begin(), boundaries_.end(), f->address); if (boundary != boundaries_.end()) - f->size = *boundary - f->address; + f->ranges[0].size = *boundary - f->address; else // If this is the last function in the module, and the STABS // reader was unable to give us its ending address, then assign // it a bogus, very large value. This will happen at most once // per module: since we've added all functions' addresses to the // boundary table, only one can be the last. - f->size = kFallbackSize; + f->ranges[0].size = kFallbackSize; // Compute sizes for each of the function f's lines --- if it has any. if (!f->lines.empty()) { @@ -185,7 +186,8 @@ line_it != last_line; line_it++) line_it[0].size = line_it[1].address - line_it[0].address; // Compute the size of the last line from f's end address. - last_line->size = (f->address + f->size) - last_line->address; + last_line->size = + (f->ranges[0].address + f->ranges[0].size) - last_line->address; } } // Now that everything has a size, add our functions to the module, and diff -Nru google-breakpad-0.1.0/src/common/stabs_to_module_unittest.cc google-breakpad-0.1.0/src/common/stabs_to_module_unittest.cc --- google-breakpad-0.1.0/src/common/stabs_to_module_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/stabs_to_module_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -64,7 +64,7 @@ Module::Function *function = functions[0]; EXPECT_STREQ("function", function->name.c_str()); EXPECT_EQ(0xfde4abbed390c394LL, function->address); - EXPECT_EQ(0x10U, function->size); + EXPECT_EQ(0x10U, function->ranges[0].size); EXPECT_EQ(0U, function->parameter_size); ASSERT_EQ((size_t) 1, function->lines.size()); Module::Line *line = &function->lines[0]; @@ -130,7 +130,7 @@ Module::Function *function = functions[0]; EXPECT_EQ(0xf2cfda36ecf7f46dLL, function->address); - EXPECT_LT(0U, function->size); // should have used dummy size + EXPECT_LT(0U, function->ranges[0].size); // should have used dummy size EXPECT_EQ(0U, function->parameter_size); ASSERT_EQ(0U, function->lines.size()); } @@ -166,7 +166,7 @@ Module::Function *function = functions[0]; EXPECT_STREQ("function", function->name.c_str()); EXPECT_EQ(0xb4513962eff94e92LL, function->address); - EXPECT_EQ(0x1000100000000ULL, function->size); // inferred from CU end + EXPECT_EQ(0x1000100000000ULL, function->ranges[0].size); // inferred from CU end EXPECT_EQ(0U, function->parameter_size); ASSERT_EQ((size_t) 2, function->lines.size()); @@ -216,7 +216,7 @@ "push_back(unsigned long long const&)", function->name.c_str()); EXPECT_EQ(0xf2cfda63cef7f46dLL, function->address); - EXPECT_LT(0U, function->size); // should have used dummy size + EXPECT_LT(0U, function->ranges[0].size); // should have used dummy size EXPECT_EQ(0U, function->parameter_size); ASSERT_EQ(0U, function->lines.size()); } diff -Nru google-breakpad-0.1.0/src/common/unordered.h google-breakpad-0.1.0/src/common/unordered.h --- google-breakpad-0.1.0/src/common/unordered.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/unordered.h 2019-03-26 03:56:45.000000000 +0000 @@ -42,9 +42,9 @@ #include "util/hash/hash.h" template > -struct unordered_map : public hash_map {}; +struct unordered_map : public __gnu_cxx::hash_map {}; template > -struct unordered_set : public hash_set {}; +struct unordered_set : public __gnu_cxx::hash_set {}; #elif defined(_LIBCPP_VERSION) // c++11 #include diff -Nru google-breakpad-0.1.0/src/common/windows/pdb_source_line_writer.cc google-breakpad-0.1.0/src/common/windows/pdb_source_line_writer.cc --- google-breakpad-0.1.0/src/common/windows/pdb_source_line_writer.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/windows/pdb_source_line_writer.cc 2019-03-26 03:56:45.000000000 +0000 @@ -37,8 +37,11 @@ #include #include +#include #include +#include #include +#include #include "common/windows/dia_util.h" #include "common/windows/guid_string.h" @@ -106,6 +109,54 @@ using std::vector; +// The symbol (among possibly many) selected to represent an rva. +struct SelectedSymbol { + SelectedSymbol(const CComPtr& symbol, bool is_public) + : symbol(symbol), is_public(is_public), is_multiple(false) {} + + // The symbol to use for an rva. + CComPtr symbol; + // Whether this is a public or function symbol. + bool is_public; + // Whether the rva has multiple associated symbols. An rva will correspond to + // multiple symbols in the case of linker identical symbol folding. + bool is_multiple; +}; + +// Maps rva to the symbol to use for that address. +typedef std::map SymbolMap; + +// Record this in the map as the selected symbol for the rva if it satisfies the +// necessary conditions. +void MaybeRecordSymbol(DWORD rva, + const CComPtr symbol, + bool is_public, + SymbolMap* map) { + SymbolMap::iterator loc = map->find(rva); + if (loc == map->end()) { + map->insert(std::make_pair(rva, SelectedSymbol(symbol, is_public))); + return; + } + + // Prefer function symbols to public symbols. + if (is_public && !loc->second.is_public) { + return; + } + + loc->second.is_multiple = true; + + // Take the 'least' symbol by lexicographical order of the decorated name. We + // use the decorated rather than undecorated name because computing the latter + // is expensive. + BSTR current_name, new_name; + loc->second.symbol->get_name(¤t_name); + symbol->get_name(&new_name); + if (wcscmp(new_name, current_name) < 0) { + loc->second.symbol = symbol; + loc->second.is_public = is_public; + } +} + // A helper class to scope a PLOADED_IMAGE. class AutoImage { public: @@ -284,7 +335,8 @@ } bool PDBSourceLineWriter::PrintFunction(IDiaSymbol *function, - IDiaSymbol *block) { + IDiaSymbol *block, + bool has_multiple_symbols) { // The function format is: // FUNC
DWORD rva; @@ -320,9 +372,9 @@ MapAddressRange(image_map_, AddressRange(rva, static_cast(length)), &ranges); for (size_t i = 0; i < ranges.size(); ++i) { - fprintf(output_, "FUNC %lx %lx %x %ws\n", - ranges[i].rva, ranges[i].length, stack_param_size, - name.m_str); + const char* optional_multiple_field = has_multiple_symbols ? "m " : ""; + fprintf(output_, "FUNC %s%lx %lx %x %ws\n", optional_multiple_field, + ranges[i].rva, ranges[i].length, stack_param_size, name.m_str); } CComPtr lines; @@ -400,7 +452,7 @@ CComPtr symbols = NULL; // Find all function symbols first. - std::set rvas; + SymbolMap rva_symbol; hr = global->findChildren(SymTagFunction, NULL, nsNone, &symbols); if (SUCCEEDED(hr)) { @@ -408,9 +460,8 @@ while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1) { if (SUCCEEDED(symbol->get_relativeVirtualAddress(&rva))) { - // To maintain existing behavior of one symbol per address, place the - // rva onto a set here to uniquify them. - rvas.insert(rva); + // Potentially record this as the canonical symbol for this rva. + MaybeRecordSymbol(rva, symbol, false, &rva_symbol); } else { fprintf(stderr, "get_relativeVirtualAddress failed on the symbol\n"); return false; @@ -422,9 +473,8 @@ symbols.Release(); } - // Find all public symbols. Store public symbols that are not also private - // symbols for later. - std::set public_only_rvas; + // Find all public symbols and record public symbols that are not also private + // symbols. hr = global->findChildren(SymTagPublicSymbol, NULL, nsNone, &symbols); if (SUCCEEDED(hr)) { @@ -432,10 +482,8 @@ while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1) { if (SUCCEEDED(symbol->get_relativeVirtualAddress(&rva))) { - if (rvas.count(rva) == 0) { - rvas.insert(rva); // Keep symbols in rva order. - public_only_rvas.insert(rva); - } + // Potentially record this as the canonical symbol for this rva. + MaybeRecordSymbol(rva, symbol, true, &rva_symbol); } else { fprintf(stderr, "get_relativeVirtualAddress failed on the symbol\n"); return false; @@ -447,39 +495,17 @@ symbols.Release(); } - std::set::iterator it; - - // For each rva, dump the first symbol DIA knows about at the address. - for (it = rvas.begin(); it != rvas.end(); ++it) { - CComPtr symbol = NULL; - // If the symbol is not in the public list, look for SymTagFunction. This is - // a workaround to a bug where DIA will hang if searching for a private - // symbol at an address where only a public symbol exists. - // See http://connect.microsoft.com/VisualStudio/feedback/details/722366 - if (public_only_rvas.count(*it) == 0) { - if (SUCCEEDED(session_->findSymbolByRVA(*it, SymTagFunction, &symbol))) { - // Sometimes findSymbolByRVA returns S_OK, but NULL. - if (symbol) { - if (!PrintFunction(symbol, symbol)) - return false; - symbol.Release(); - } - } else { - fprintf(stderr, "findSymbolByRVA SymTagFunction failed\n"); + // For each rva, dump the selected symbol at the address. + SymbolMap::iterator it; + for (it = rva_symbol.begin(); it != rva_symbol.end(); ++it) { + CComPtr symbol = it->second.symbol; + // Only print public symbols if there is no function symbol for the address. + if (!it->second.is_public) { + if (!PrintFunction(symbol, symbol, it->second.is_multiple)) return false; - } - } else if (SUCCEEDED(session_->findSymbolByRVA(*it, - SymTagPublicSymbol, - &symbol))) { - // Sometimes findSymbolByRVA returns S_OK, but NULL. - if (symbol) { - if (!PrintCodePublicSymbol(symbol)) - return false; - symbol.Release(); - } } else { - fprintf(stderr, "findSymbolByRVA SymTagPublicSymbol failed\n"); - return false; + if (!PrintCodePublicSymbol(symbol, it->second.is_multiple)) + return false; } } @@ -522,7 +548,7 @@ SUCCEEDED(parent->get_relativeVirtualAddress(&func_rva)) && SUCCEEDED(parent->get_length(&func_length))) { if (block_rva < func_rva || block_rva > (func_rva + func_length)) { - if (!PrintFunction(parent, block)) { + if (!PrintFunction(parent, block, false)) { return false; } } @@ -839,7 +865,8 @@ return false; } -bool PDBSourceLineWriter::PrintCodePublicSymbol(IDiaSymbol *symbol) { +bool PDBSourceLineWriter::PrintCodePublicSymbol(IDiaSymbol *symbol, + bool has_multiple_symbols) { BOOL is_code; if (FAILED(symbol->get_code(&is_code))) { return false; @@ -862,8 +889,9 @@ AddressRangeVector ranges; MapAddressRange(image_map_, AddressRange(rva, 1), &ranges); for (size_t i = 0; i < ranges.size(); ++i) { - fprintf(output_, "PUBLIC %lx %x %ws\n", ranges[i].rva, - stack_param_size > 0 ? stack_param_size : 0, + const char* optional_multiple_field = has_multiple_symbols ? "m " : ""; + fprintf(output_, "PUBLIC %s%lx %x %ws\n", optional_multiple_field, + ranges[i].rva, stack_param_size > 0 ? stack_param_size : 0, name.m_str); } diff -Nru google-breakpad-0.1.0/src/common/windows/pdb_source_line_writer.h google-breakpad-0.1.0/src/common/windows/pdb_source_line_writer.h --- google-breakpad-0.1.0/src/common/windows/pdb_source_line_writer.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/common/windows/pdb_source_line_writer.h 2019-03-26 03:56:45.000000000 +0000 @@ -138,11 +138,12 @@ bool PrintLines(IDiaEnumLineNumbers *lines); // Outputs a function address and name, followed by its source line list. - // block can be the same object as function, or it can be a reference - // to a code block that is lexically part of this function, but - // resides at a separate address. - // Returns true on success. - bool PrintFunction(IDiaSymbol *function, IDiaSymbol *block); + // block can be the same object as function, or it can be a reference to a + // code block that is lexically part of this function, but resides at a + // separate address. If has_multiple_symbols is true, this function's + // instructions correspond to multiple symbols. Returns true on success. + bool PrintFunction(IDiaSymbol *function, IDiaSymbol *block, + bool has_multiple_symbols); // Outputs all functions as described above. Returns true on success. bool PrintFunctions(); @@ -167,8 +168,10 @@ // Outputs a single public symbol address and name, if the symbol corresponds // to a code address. Returns true on success. If symbol is does not - // correspond to code, returns true without outputting anything. - bool PrintCodePublicSymbol(IDiaSymbol *symbol); + // correspond to code, returns true without outputting anything. If + // has_multiple_symbols is true, the symbol corresponds to a code address and + // the instructions correspond to multiple symbols. + bool PrintCodePublicSymbol(IDiaSymbol *symbol, bool has_multiple_symbols); // Outputs a line identifying the PDB file that is being dumped, along with // its uuid and age. diff -Nru google-breakpad-0.1.0/src/google_breakpad/common/minidump_cpu_arm64.h google-breakpad-0.1.0/src/google_breakpad/common/minidump_cpu_arm64.h --- google-breakpad-0.1.0/src/google_breakpad/common/minidump_cpu_arm64.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/google_breakpad/common/minidump_cpu_arm64.h 2019-03-26 03:56:45.000000000 +0000 @@ -66,7 +66,61 @@ #ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ #define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ +#include "google_breakpad/common/breakpad_types.h" + #define MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT 32 +#define MD_CONTEXT_ARM64_GPR_COUNT 33 + +typedef struct { + /* 32 128-bit floating point registers, d0 .. d31. */ + uint128_struct regs[MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT]; + + uint32_t fpcr; /* FPU control register */ + uint32_t fpsr; /* FPU status register */ +} MDFloatingSaveAreaARM64; + +/* For (MDRawContextARM64).context_flags. These values indicate the type of + * context stored in the structure. */ +#define MD_CONTEXT_ARM64 0x00400000 +#define MD_CONTEXT_ARM64_CONTROL (MD_CONTEXT_ARM64 | 0x00000001) +#define MD_CONTEXT_ARM64_INTEGER (MD_CONTEXT_ARM64 | 0x00000002) +#define MD_CONTEXT_ARM64_FLOATING_POINT (MD_CONTEXT_ARM64 | 0x00000004) +#define MD_CONTEXT_ARM64_DEBUG (MD_CONTEXT_ARM64 | 0x00000008) +#define MD_CONTEXT_ARM64_FULL (MD_CONTEXT_ARM64_CONTROL | \ + MD_CONTEXT_ARM64_INTEGER | \ + MD_CONTEXT_ARM64_FLOATING_POINT) +#define MD_CONTEXT_ARM64_ALL (MD_CONTEXT_ARM64_FULL | MD_CONTEXT_ARM64_DEBUG) + +typedef struct { + /* Determines which fields of this struct are populated */ + uint32_t context_flags; + + /* CPSR (flags, basically): 32 bits: + bit 31 - N (negative) + bit 30 - Z (zero) + bit 29 - C (carry) + bit 28 - V (overflow) + bit 27 - Q (saturation flag, sticky) + All other fields -- ignore */ + uint32_t cpsr; + + /* 33 64-bit integer registers, x0 .. x31 + the PC + * Note the following fixed uses: + * x29 is the frame pointer + * x30 is the link register + * x31 is the stack pointer + * The PC is effectively x32. + */ + uint64_t iregs[MD_CONTEXT_ARM64_GPR_COUNT]; + + /* The next field is included with MD_CONTEXT64_ARM_FLOATING_POINT */ + MDFloatingSaveAreaARM64 float_save; + + uint32_t bcr[8]; + uint64_t bvr[8]; + uint32_t wcr[2]; + uint64_t wvr[2]; +} MDRawContextARM64; typedef struct { uint32_t fpsr; /* FPU status register */ @@ -74,9 +128,7 @@ /* 32 128-bit floating point registers, d0 .. d31. */ uint128_struct regs[MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT]; -} MDFloatingSaveAreaARM64; - -#define MD_CONTEXT_ARM64_GPR_COUNT 33 +} MDFloatingSaveAreaARM64_Old; /* Use the same 32-bit alignment when accessing this structure from 64-bit code * as is used natively in 32-bit code. */ @@ -107,9 +159,9 @@ uint32_t cpsr; /* The next field is included with MD_CONTEXT64_ARM_FLOATING_POINT */ - MDFloatingSaveAreaARM64 float_save; + MDFloatingSaveAreaARM64_Old float_save; -} MDRawContextARM64; +} MDRawContextARM64_Old; #pragma pack(pop) @@ -123,18 +175,18 @@ MD_CONTEXT_ARM64_REG_PC = 32 }; -/* For (MDRawContextARM64).context_flags. These values indicate the type of - * context stored in the structure. MD_CONTEXT_ARM64 is Breakpad-defined. +/* For (MDRawContextARM64_Old).context_flags. These values indicate the type of + * context stored in the structure. MD_CONTEXT_ARM64_OLD is Breakpad-defined. * This value was chosen to avoid likely conflicts with MD_CONTEXT_* * for other CPUs. */ -#define MD_CONTEXT_ARM64 0x80000000 -#define MD_CONTEXT_ARM64_INTEGER (MD_CONTEXT_ARM64 | 0x00000002) -#define MD_CONTEXT_ARM64_FLOATING_POINT (MD_CONTEXT_ARM64 | 0x00000004) +#define MD_CONTEXT_ARM64_OLD 0x80000000 +#define MD_CONTEXT_ARM64_INTEGER_OLD (MD_CONTEXT_ARM64_OLD | 0x00000002) +#define MD_CONTEXT_ARM64_FLOATING_POINT_OLD (MD_CONTEXT_ARM64_OLD | 0x00000004) -#define MD_CONTEXT_ARM64_FULL (MD_CONTEXT_ARM64_INTEGER | \ - MD_CONTEXT_ARM64_FLOATING_POINT) +#define MD_CONTEXT_ARM64_FULL_OLD (MD_CONTEXT_ARM64_INTEGER_OLD | \ + MD_CONTEXT_ARM64_FLOATING_POINT_OLD) -#define MD_CONTEXT_ARM64_ALL (MD_CONTEXT_ARM64_INTEGER | \ - MD_CONTEXT_ARM64_FLOATING_POINT) +#define MD_CONTEXT_ARM64_ALL_OLD (MD_CONTEXT_ARM64_INTEGER_OLD | \ + MD_CONTEXT_ARM64_FLOATING_POINT_OLD) #endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM64_H__ */ diff -Nru google-breakpad-0.1.0/src/google_breakpad/common/minidump_exception_linux.h google-breakpad-0.1.0/src/google_breakpad/common/minidump_exception_linux.h --- google-breakpad-0.1.0/src/google_breakpad/common/minidump_exception_linux.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/google_breakpad/common/minidump_exception_linux.h 2019-03-26 03:56:45.000000000 +0000 @@ -84,4 +84,42 @@ dump requested. */ } MDExceptionCodeLinux; +/* For (MDException).exception_flags. These values come from + * asm-generic/siginfo.h. + */ +typedef enum { + /* SIGILL */ + MD_EXCEPTION_FLAG_LIN_ILL_ILLOPC = 1, + MD_EXCEPTION_FLAG_LIN_ILL_ILLOPN = 2, + MD_EXCEPTION_FLAG_LIN_ILL_ILLADR = 3, + MD_EXCEPTION_FLAG_LIN_ILL_ILLTRP = 4, + MD_EXCEPTION_FLAG_LIN_ILL_PRVOPC = 5, + MD_EXCEPTION_FLAG_LIN_ILL_PRVREG = 6, + MD_EXCEPTION_FLAG_LIN_ILL_COPROC = 7, + MD_EXCEPTION_FLAG_LIN_ILL_BADSTK = 8, + + /* SIGFPE */ + MD_EXCEPTION_FLAG_LIN_FPE_INTDIV = 1, + MD_EXCEPTION_FLAG_LIN_FPE_INTOVF = 2, + MD_EXCEPTION_FLAG_LIN_FPE_FLTDIV = 3, + MD_EXCEPTION_FLAG_LIN_FPE_FLTOVF = 4, + MD_EXCEPTION_FLAG_LIN_FPE_FLTUND = 5, + MD_EXCEPTION_FLAG_LIN_FPE_FLTRES = 6, + MD_EXCEPTION_FLAG_LIN_FPE_FLTINV = 7, + MD_EXCEPTION_FLAG_LIN_FPE_FLTSUB = 8, + + /* SIGSEGV */ + MD_EXCEPTION_FLAG_LIN_SEGV_MAPERR = 1, + MD_EXCEPTION_FLAG_LIN_SEGV_ACCERR = 2, + MD_EXCEPTION_FLAG_LIN_SEGV_BNDERR = 3, + MD_EXCEPTION_FLAG_LIN_SEGV_PKUERR = 4, + + /* SIGBUS */ + MD_EXCEPTION_FLAG_LIN_BUS_ADRALN = 1, + MD_EXCEPTION_FLAG_LIN_BUS_ADRERR = 2, + MD_EXCEPTION_FLAG_LIN_BUS_OBJERR = 3, + MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AR = 4, + MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AO = 5, +} MDExceptionFlagLinux; + #endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */ diff -Nru google-breakpad-0.1.0/src/google_breakpad/common/minidump_format.h google-breakpad-0.1.0/src/google_breakpad/common/minidump_format.h --- google-breakpad-0.1.0/src/google_breakpad/common/minidump_format.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/google_breakpad/common/minidump_format.h 2019-03-26 03:56:45.000000000 +0000 @@ -654,9 +654,10 @@ MD_CPU_ARCHITECTURE_AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */ MD_CPU_ARCHITECTURE_X86_WIN64 = 10, /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */ + MD_CPU_ARCHITECTURE_ARM64 = 12, /* PROCESSOR_ARCHITECTURE_ARM64 */ MD_CPU_ARCHITECTURE_SPARC = 0x8001, /* Breakpad-defined value for SPARC */ MD_CPU_ARCHITECTURE_PPC64 = 0x8002, /* Breakpad-defined value for PPC64 */ - MD_CPU_ARCHITECTURE_ARM64 = 0x8003, /* Breakpad-defined value for ARM64 */ + MD_CPU_ARCHITECTURE_ARM64_OLD = 0x8003, /* Breakpad-defined value for ARM64 */ MD_CPU_ARCHITECTURE_MIPS64 = 0x8004, /* Breakpad-defined value for MIPS64 */ MD_CPU_ARCHITECTURE_UNKNOWN = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */ } MDCPUArchitecture; diff -Nru google-breakpad-0.1.0/src/google_breakpad/processor/basic_source_line_resolver.h google-breakpad-0.1.0/src/google_breakpad/processor/basic_source_line_resolver.h --- google-breakpad-0.1.0/src/google_breakpad/processor/basic_source_line_resolver.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/google_breakpad/processor/basic_source_line_resolver.h 2019-03-26 03:56:45.000000000 +0000 @@ -95,12 +95,14 @@ char **filename); // out // Parses a |function_line| declaration. Returns true on success. - // Format: FUNC
. + // Format: FUNC []
. // Notice, that this method modifies the input |function_line| which is why it - // can't be const. On success,
, , , and - // are stored in |*address|, |*size|, |*stack_param_size|, and |*name|. - // No allocation is done, |*name| simply points inside |function_line|. + // can't be const. On success, the presence of ,
, , + // , and are stored in |*is_multiple|, |*address|, + // |*size|, |*stack_param_size|, and |*name|. No allocation is done, |*name| + // simply points inside |function_line|. static bool ParseFunction(char *function_line, // in + bool *is_multiple, // out uint64_t *address, // out uint64_t *size, // out long *stack_param_size, // out @@ -119,12 +121,14 @@ long *source_file); // out // Parses a |public_line| declaration. Returns true on success. - // Format: PUBLIC
+ // Format: PUBLIC []
// Notice, that this method modifies the input |function_line| which is why - // it can't be const. On success,
, , - // are stored in |*address|, |*stack_param_size|, and |*name|. - // No allocation is done, |*name| simply points inside |public_line|. + // it can't be const. On success, the presence of ,
, + // , are stored in |*is_multiple|, |*address|, + // |*stack_param_size|, and |*name|. No allocation is done, |*name| simply + // points inside |public_line|. static bool ParsePublicSymbol(char *public_line, // in + bool *is_multiple, // out uint64_t *address, // out long *stack_param_size, // out char **name); // out diff -Nru google-breakpad-0.1.0/src/google_breakpad/processor/minidump.h google-breakpad-0.1.0/src/google_breakpad/processor/minidump.h --- google-breakpad-0.1.0/src/google_breakpad/processor/minidump.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/google_breakpad/processor/minidump.h 2019-03-26 03:56:45.000000000 +0000 @@ -541,6 +541,12 @@ bool Read(uint32_t expected_size); + bool StoreRange(const MinidumpModule& module, + uint64_t base_address, + uint32_t module_index, + uint32_t module_count, + bool is_android); + // The largest number of modules that will be read from a minidump. The // default is 1024. static uint32_t max_modules_; @@ -1254,6 +1260,8 @@ bool swap() const { return valid_ ? swap_ : false; } + bool is_big_endian() const { return valid_ ? is_big_endian_ : false; } + // Print a human-readable representation of the object to stdout. void Print(); @@ -1319,6 +1327,9 @@ // same-endian, this will be false. bool swap_; + // true if the minidump was produced by a big-endian cpu. + bool is_big_endian_; + // Validity of the Minidump structure, false immediately after // construction or after a failed Read(); true following a successful // Read(). diff -Nru google-breakpad-0.1.0/src/google_breakpad/processor/stack_frame.h google-breakpad-0.1.0/src/google_breakpad/processor/stack_frame.h --- google-breakpad-0.1.0/src/google_breakpad/processor/stack_frame.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/google_breakpad/processor/stack_frame.h 2019-03-26 03:56:45.000000000 +0000 @@ -84,7 +84,7 @@ default: return "unknown"; } - }; + } // Return the actual return address, as saved on the stack or in a // register. See the comments for 'instruction', below, for details. diff -Nru google-breakpad-0.1.0/src/processor/basic_source_line_resolver.cc google-breakpad-0.1.0/src/processor/basic_source_line_resolver.cc --- google-breakpad-0.1.0/src/processor/basic_source_line_resolver.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/basic_source_line_resolver.cc 2019-03-26 03:56:45.000000000 +0000 @@ -62,6 +62,42 @@ #define strtoull _strtoui64 #endif +namespace { + +// Utility function to tokenize given the presence of an optional initial +// field. In this case, optional_field is the expected string for the optional +// field, and max_tokens is the maximum number of tokens including the optional +// field. Refer to the documentation for Tokenize for descriptions of the other +// arguments. +bool TokenizeWithOptionalField(char *line, + const char *optional_field, + const char *separators, + int max_tokens, + vector *tokens) { + // First tokenize assuming the optional field is not present. If we then see + // the optional field, additionally tokenize the last token into two tokens. + if (!Tokenize(line, separators, max_tokens - 1, tokens)) { + return false; + } + + if (strcmp(tokens->front(), optional_field) == 0) { + // The optional field is present. Split the last token in two to recover the + // field prior to the last. + vector last_tokens; + if (!Tokenize(tokens->back(), separators, 2, &last_tokens)) { + return false; + } + // Replace the previous last token with the two new tokens. + tokens->pop_back(); + tokens->push_back(last_tokens[0]); + tokens->push_back(last_tokens[1]); + } + + return true; +} + +} // namespace + static const char *kWhitespace = " \r\n"; static const int kMaxErrorsPrinted = 5; static const int kMaxErrorsBeforeBailing = 100; @@ -323,13 +359,14 @@ BasicSourceLineResolver::Function* BasicSourceLineResolver::Module::ParseFunction(char *function_line) { + bool is_multiple; uint64_t address; uint64_t size; long stack_param_size; char *name; - if (SymbolParseHelper::ParseFunction(function_line, &address, &size, - &stack_param_size, &name)) { - return new Function(name, address, size, stack_param_size); + if (SymbolParseHelper::ParseFunction(function_line, &is_multiple, &address, + &size, &stack_param_size, &name)) { + return new Function(name, address, size, stack_param_size, is_multiple); } return NULL; } @@ -349,11 +386,12 @@ } bool BasicSourceLineResolver::Module::ParsePublicSymbol(char *public_line) { + bool is_multiple; uint64_t address; long stack_param_size; char *name; - if (SymbolParseHelper::ParsePublicSymbol(public_line, &address, + if (SymbolParseHelper::ParsePublicSymbol(public_line, &is_multiple, &address, &stack_param_size, &name)) { // A few public symbols show up with an address of 0. This has been seen // in the dumped output of ntdll.pdb for symbols such as _CIlog, _CIpow, @@ -366,7 +404,8 @@ } linked_ptr symbol(new PublicSymbol(name, address, - stack_param_size)); + stack_param_size, + is_multiple)); return public_symbols_.Store(address, symbol); } return false; @@ -491,36 +530,39 @@ } // static -bool SymbolParseHelper::ParseFunction(char *function_line, uint64_t *address, - uint64_t *size, long *stack_param_size, - char **name) { - // FUNC
+bool SymbolParseHelper::ParseFunction(char *function_line, bool *is_multiple, + uint64_t *address, uint64_t *size, + long *stack_param_size, char **name) { + // FUNC []
assert(strncmp(function_line, "FUNC ", 5) == 0); function_line += 5; // skip prefix vector tokens; - if (!Tokenize(function_line, kWhitespace, 4, &tokens)) { + if (!TokenizeWithOptionalField(function_line, "m", kWhitespace, 5, &tokens)) { return false; } + *is_multiple = strcmp(tokens[0], "m") == 0; + int next_token = *is_multiple ? 1 : 0; + char *after_number; - *address = strtoull(tokens[0], &after_number, 16); + *address = strtoull(tokens[next_token++], &after_number, 16); if (!IsValidAfterNumber(after_number) || *address == std::numeric_limits::max()) { return false; } - *size = strtoull(tokens[1], &after_number, 16); + *size = strtoull(tokens[next_token++], &after_number, 16); if (!IsValidAfterNumber(after_number) || *size == std::numeric_limits::max()) { return false; } - *stack_param_size = strtol(tokens[2], &after_number, 16); + *stack_param_size = strtol(tokens[next_token++], &after_number, 16); if (!IsValidAfterNumber(after_number) || *stack_param_size == std::numeric_limits::max() || *stack_param_size < 0) { return false; } - *name = tokens[3]; + *name = tokens[next_token++]; return true; } @@ -571,32 +613,35 @@ } // static -bool SymbolParseHelper::ParsePublicSymbol(char *public_line, +bool SymbolParseHelper::ParsePublicSymbol(char *public_line, bool *is_multiple, uint64_t *address, long *stack_param_size, char **name) { - // PUBLIC
+ // PUBLIC []
assert(strncmp(public_line, "PUBLIC ", 7) == 0); public_line += 7; // skip prefix vector tokens; - if (!Tokenize(public_line, kWhitespace, 3, &tokens)) { + if (!TokenizeWithOptionalField(public_line, "m", kWhitespace, 4, &tokens)) { return false; } + *is_multiple = strcmp(tokens[0], "m") == 0; + int next_token = *is_multiple ? 1 : 0; + char *after_number; - *address = strtoull(tokens[0], &after_number, 16); + *address = strtoull(tokens[next_token++], &after_number, 16); if (!IsValidAfterNumber(after_number) || *address == std::numeric_limits::max()) { return false; } - *stack_param_size = strtol(tokens[1], &after_number, 16); + *stack_param_size = strtol(tokens[next_token++], &after_number, 16); if (!IsValidAfterNumber(after_number) || *stack_param_size == std::numeric_limits::max() || *stack_param_size < 0) { return false; } - *name = tokens[2]; + *name = tokens[next_token++]; return true; } diff -Nru google-breakpad-0.1.0/src/processor/basic_source_line_resolver_types.h google-breakpad-0.1.0/src/processor/basic_source_line_resolver_types.h --- google-breakpad-0.1.0/src/processor/basic_source_line_resolver_types.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/basic_source_line_resolver_types.h 2019-03-26 03:56:45.000000000 +0000 @@ -60,11 +60,13 @@ Function(const string &function_name, MemAddr function_address, MemAddr code_size, - int set_parameter_size) : Base(function_name, - function_address, - code_size, - set_parameter_size), - lines() { } + int set_parameter_size, + bool is_mutiple) : Base(function_name, + function_address, + code_size, + set_parameter_size, + is_mutiple), + lines() { } RangeMap< MemAddr, linked_ptr > lines; private: typedef SourceLineResolverBase::Function Base; diff -Nru google-breakpad-0.1.0/src/processor/basic_source_line_resolver_unittest.cc google-breakpad-0.1.0/src/processor/basic_source_line_resolver_unittest.cc --- google-breakpad-0.1.0/src/processor/basic_source_line_resolver_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/basic_source_line_resolver_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -455,16 +455,19 @@ } // Test parsing of valid FUNC lines. The format is: -// FUNC
+// FUNC []
TEST(SymbolParseHelper, ParseFunctionValid) { + bool multiple; uint64_t address; uint64_t size; long stack_param_size; char *name; char kTestLine[] = "FUNC 1 2 3 function name"; - ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine, &address, &size, - &stack_param_size, &name)); + ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine, &multiple, &address, + &size, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); EXPECT_EQ(1ULL, address); EXPECT_EQ(2ULL, size); EXPECT_EQ(3, stack_param_size); @@ -472,25 +475,41 @@ // Test hex address, size, and param size. char kTestLine1[] = "FUNC a1 a2 a3 function name"; - ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine1, &address, &size, - &stack_param_size, &name)); + ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine1, &multiple, &address, + &size, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); EXPECT_EQ(0xa1ULL, address); EXPECT_EQ(0xa2ULL, size); EXPECT_EQ(0xa3, stack_param_size); EXPECT_EQ("function name", string(name)); char kTestLine2[] = "FUNC 0 0 0 function name"; - ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine2, &address, &size, - &stack_param_size, &name)); + ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine2, &multiple, &address, + &size, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); EXPECT_EQ(0ULL, address); EXPECT_EQ(0ULL, size); EXPECT_EQ(0, stack_param_size); EXPECT_EQ("function name", string(name)); + + // Test optional multiple field. + char kTestLine3[] = "FUNC m a1 a2 a3 function name"; + ASSERT_TRUE(SymbolParseHelper::ParseFunction(kTestLine3, &multiple, &address, + &size, &stack_param_size, + &name)); + EXPECT_TRUE(multiple); + EXPECT_EQ(0xa1ULL, address); + EXPECT_EQ(0xa2ULL, size); + EXPECT_EQ(0xa3, stack_param_size); + EXPECT_EQ("function name", string(name)); } // Test parsing of invalid FUNC lines. The format is: -// FUNC
+// FUNC []
TEST(SymbolParseHelper, ParseFunctionInvalid) { + bool multiple; uint64_t address; uint64_t size; long stack_param_size; @@ -498,36 +517,49 @@ // Test missing function name. char kTestLine[] = "FUNC 1 2 3 "; - ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine, &address, &size, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine, &multiple, &address, + &size, &stack_param_size, + &name)); // Test bad address. char kTestLine1[] = "FUNC 1z 2 3 function name"; - ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine1, &address, &size, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine1, &multiple, &address, + &size, &stack_param_size, + &name)); // Test large address. char kTestLine2[] = "FUNC 123123123123123123123123123 2 3 function name"; - ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine2, &address, &size, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine2, &multiple, &address, + &size, &stack_param_size, + &name)); // Test bad size. char kTestLine3[] = "FUNC 1 z2 3 function name"; - ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine3, &address, &size, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine3, &multiple, &address, + &size, &stack_param_size, + &name)); // Test large size. char kTestLine4[] = "FUNC 1 231231231231231231231231232 3 function name"; - ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine4, &address, &size, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine4, &multiple, &address, + &size, &stack_param_size, + &name)); // Test bad param size. char kTestLine5[] = "FUNC 1 2 3z function name"; - ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine5, &address, &size, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine5, &multiple, &address, + &size, &stack_param_size, + &name)); // Test large param size. char kTestLine6[] = "FUNC 1 2 312312312312312312312312323 function name"; - ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine6, &address, &size, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine6, &multiple, &address, + &size, &stack_param_size, + &name)); // Negative param size. char kTestLine7[] = "FUNC 1 2 -5 function name"; - ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine7, &address, &size, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine7, &multiple, &address, + &size, &stack_param_size, + &name)); + // Test invalid optional field. + char kTestLine8[] = "FUNC x 1 2 5 function name"; + ASSERT_FALSE(SymbolParseHelper::ParseFunction(kTestLine8, &multiple, &address, + &size, &stack_param_size, + &name)); } // Test parsing of valid lines. The format is: @@ -612,67 +644,96 @@ } // Test parsing of valid PUBLIC lines. The format is: -// PUBLIC
+// PUBLIC []
TEST(SymbolParseHelper, ParsePublicSymbolValid) { + bool multiple; uint64_t address; long stack_param_size; char *name; char kTestLine[] = "PUBLIC 1 2 3"; - ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine, &address, - &stack_param_size, &name)); + ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine, &multiple, + &address, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); EXPECT_EQ(1ULL, address); EXPECT_EQ(2, stack_param_size); EXPECT_EQ("3", string(name)); // Test hex size and address. char kTestLine1[] = "PUBLIC a1 a2 function name"; - ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine1, &address, - &stack_param_size, &name)); + ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine1, &multiple, + &address, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); EXPECT_EQ(0xa1ULL, address); EXPECT_EQ(0xa2, stack_param_size); EXPECT_EQ("function name", string(name)); // Test 0 is a valid address. char kTestLine2[] = "PUBLIC 0 a2 function name"; - ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine2, &address, - &stack_param_size, &name)); + ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine2, &multiple, + &address, &stack_param_size, + &name)); + EXPECT_FALSE(multiple); EXPECT_EQ(0ULL, address); EXPECT_EQ(0xa2, stack_param_size); EXPECT_EQ("function name", string(name)); + + // Test optional multiple field. + char kTestLine3[] = "PUBLIC m a1 a2 function name"; + ASSERT_TRUE(SymbolParseHelper::ParsePublicSymbol(kTestLine3, &multiple, + &address, &stack_param_size, + &name)); + EXPECT_TRUE(multiple); + EXPECT_EQ(0xa1ULL, address); + EXPECT_EQ(0xa2, stack_param_size); + EXPECT_EQ("function name", string(name)); } // Test parsing of invalid PUBLIC lines. The format is: -// PUBLIC
+// PUBLIC []
TEST(SymbolParseHelper, ParsePublicSymbolInvalid) { + bool multiple; uint64_t address; long stack_param_size; char *name; // Test missing source function name. char kTestLine[] = "PUBLIC 1 2 "; - ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine, &address, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine, &multiple, + &address, &stack_param_size, + &name)); // Test bad address. char kTestLine1[] = "PUBLIC 1z 2 3"; - ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine1, &address, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine1, &multiple, + &address, &stack_param_size, + &name)); // Test large address. char kTestLine2[] = "PUBLIC 123123123123123123123123 2 3"; - ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine2, &address, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine2, &multiple, + &address, &stack_param_size, + &name)); // Test bad param stack size. char kTestLine3[] = "PUBLIC 1 z2 3"; - ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine3, &address, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine3, &multiple, + &address, &stack_param_size, + &name)); // Test large param stack size. char kTestLine4[] = "PUBLIC 1 123123123123123123123123123 3"; - ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine4, &address, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine4, &multiple, + &address, &stack_param_size, + &name)); // Test negative param stack size. char kTestLine5[] = "PUBLIC 1 -5 3"; - ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine5, &address, - &stack_param_size, &name)); + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine5, &multiple, + &address, &stack_param_size, + &name)); + // Test invalid optional field. + char kTestLine6[] = "PUBLIC x 1 5 3"; + ASSERT_FALSE(SymbolParseHelper::ParsePublicSymbol(kTestLine6, &multiple, + &address, &stack_param_size, + &name)); } } // namespace diff -Nru google-breakpad-0.1.0/src/processor/convert_old_arm64_context.cc google-breakpad-0.1.0/src/processor/convert_old_arm64_context.cc --- google-breakpad-0.1.0/src/processor/convert_old_arm64_context.cc 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/convert_old_arm64_context.cc 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,67 @@ +// Copyright (c) 2018, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "processor/convert_old_arm64_context.h" + +#include + +namespace google_breakpad { + +void ConvertOldARM64Context(const MDRawContextARM64_Old& old, + MDRawContextARM64* context) { + context->context_flags = MD_CONTEXT_ARM64; + if (old.context_flags & MD_CONTEXT_ARM64_INTEGER_OLD) { + context->context_flags |= + MD_CONTEXT_ARM64_INTEGER | MD_CONTEXT_ARM64_CONTROL; + } + if (old.context_flags & MD_CONTEXT_ARM64_FLOATING_POINT_OLD) { + context->context_flags |= MD_CONTEXT_ARM64_FLOATING_POINT; + } + + context->cpsr = old.cpsr; + + static_assert(sizeof(old.iregs) == sizeof(context->iregs), + "iregs size mismatch"); + memcpy(context->iregs, old.iregs, sizeof(context->iregs)); + + static_assert(sizeof(old.float_save.regs) == sizeof(context->float_save.regs), + "float_save.regs size mismatch"); + memcpy(context->float_save.regs, + old.float_save.regs, + sizeof(context->float_save.regs)); + context->float_save.fpcr = old.float_save.fpcr; + context->float_save.fpsr = old.float_save.fpsr; + + memset(context->bcr, 0, sizeof(context->bcr)); + memset(context->bvr, 0, sizeof(context->bvr)); + memset(context->wcr, 0, sizeof(context->wcr)); + memset(context->wvr, 0, sizeof(context->wvr)); +} + +} // namespace google_breakpad diff -Nru google-breakpad-0.1.0/src/processor/convert_old_arm64_context.h google-breakpad-0.1.0/src/processor/convert_old_arm64_context.h --- google-breakpad-0.1.0/src/processor/convert_old_arm64_context.h 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/convert_old_arm64_context.h 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,42 @@ +// Copyright (c) 2018, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef PROCESSOR_CONVERT_OLD_ARM64_CONTEXT_H__ +#define PROCESSOR_CONVERT_OLD_ARM64_CONTEXT_H__ + +#include "google_breakpad/common/minidump_cpu_arm64.h" + +namespace google_breakpad { + +void ConvertOldARM64Context(const MDRawContextARM64_Old& old, + MDRawContextARM64* context); + +} // namespace google_breakpad + +#endif // PROCESSOR_CONVERT_OLD_ARM64_CONTEXT_H__ diff -Nru google-breakpad-0.1.0/src/processor/dump_context.cc google-breakpad-0.1.0/src/processor/dump_context.cc --- google-breakpad-0.1.0/src/processor/dump_context.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/dump_context.cc 2019-03-26 03:56:45.000000000 +0000 @@ -584,7 +584,7 @@ case MD_CONTEXT_ARM64: { const MDRawContextARM64* context_arm64 = GetContextARM64(); printf("MDRawContextARM64\n"); - printf(" context_flags = 0x%" PRIx64 "\n", + printf(" context_flags = 0x%x\n", context_arm64->context_flags); for (unsigned int ireg_index = 0; ireg_index < MD_CONTEXT_ARM64_GPR_COUNT; @@ -603,6 +603,7 @@ printf(" float_save.regs[%2d] = 0x%" PRIx64 "%" PRIx64 "\n", freg_index, fp_value.high, fp_value.low); } + break; } diff -Nru google-breakpad-0.1.0/src/processor/logging.cc google-breakpad-0.1.0/src/processor/logging.cc --- google-breakpad-0.1.0/src/processor/logging.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/logging.cc 2019-03-26 03:56:45.000000000 +0000 @@ -69,6 +69,9 @@ case SEVERITY_ERROR: severity_string = "ERROR"; break; + case SEVERITY_CRITICAL: + severity_string = "CRITICAL"; + break; } stream_ << time_string << ": " << PathnameStripper::File(file) << ":" << diff -Nru google-breakpad-0.1.0/src/processor/logging.h google-breakpad-0.1.0/src/processor/logging.h --- google-breakpad-0.1.0/src/processor/logging.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/logging.h 2019-03-26 03:56:45.000000000 +0000 @@ -94,7 +94,8 @@ public: enum Severity { SEVERITY_INFO, - SEVERITY_ERROR + SEVERITY_ERROR, + SEVERITY_CRITICAL }; // Begin logging a message to the stream identified by |stream|, at the @@ -146,9 +147,11 @@ #define BPLOG_INIT(pargc, pargv) #endif // BPLOG_INIT +#ifndef BPLOG_LAZY_STREAM #define BPLOG_LAZY_STREAM(stream, condition) \ !(condition) ? (void) 0 : \ google_breakpad::LogMessageVoidify() & (BPLOG_ ## stream) +#endif #ifndef BPLOG_MINIMUM_SEVERITY #define BPLOG_MINIMUM_SEVERITY SEVERITY_INFO @@ -180,7 +183,18 @@ __FILE__, __LINE__) #endif // BPLOG_ERROR +#ifndef BPLOG_CRITICAL +#ifndef BPLOG_CRITICAL_STREAM +#define BPLOG_CRITICAL_STREAM std::cerr +#endif // BPLOG_CRITICAL_STREAM +#define BPLOG_CRITICAL google_breakpad::LogStream(BPLOG_CRITICAL_STREAM, \ + google_breakpad::LogStream::SEVERITY_CRITICAL, \ + __FILE__, __LINE__) +#endif // BPLOG_CRITICAL + +#ifndef BPLOG_IF #define BPLOG_IF(severity, condition) \ BPLOG_LAZY_STREAM(severity, ((condition) && BPLOG_LOG_IS_ON(severity))) +#endif // BPLOG_IF #endif // PROCESSOR_LOGGING_H__ diff -Nru google-breakpad-0.1.0/src/processor/microdump.cc google-breakpad-0.1.0/src/processor/microdump.cc --- google-breakpad-0.1.0/src/processor/microdump.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/microdump.cc 2019-03-26 03:56:45.000000000 +0000 @@ -44,6 +44,7 @@ #include "google_breakpad/common/minidump_cpu_arm.h" #include "google_breakpad/processor/code_module.h" #include "processor/basic_code_module.h" +#include "processor/convert_old_arm64_context.h" #include "processor/linked_ptr.h" #include "processor/logging.h" #include "processor/range_map-inl.h" @@ -311,15 +312,22 @@ memcpy(arm, &cpu_state_raw[0], cpu_state_raw.size()); context_->SetContextARM(arm); } else if (strcmp(arch.c_str(), kArm64Architecture) == 0) { - if (cpu_state_raw.size() != sizeof(MDRawContextARM64)) { + if (cpu_state_raw.size() == sizeof(MDRawContextARM64)) { + MDRawContextARM64* arm = new MDRawContextARM64(); + memcpy(arm, &cpu_state_raw[0], cpu_state_raw.size()); + context_->SetContextARM64(arm); + } else if (cpu_state_raw.size() == sizeof(MDRawContextARM64_Old)) { + MDRawContextARM64_Old old_arm; + memcpy(&old_arm, &cpu_state_raw[0], cpu_state_raw.size()); + MDRawContextARM64* new_arm = new MDRawContextARM64(); + ConvertOldARM64Context(old_arm, new_arm); + context_->SetContextARM64(new_arm); + } else { std::cerr << "Malformed CPU context. Got " << cpu_state_raw.size() << " bytes instead of " << sizeof(MDRawContextARM64) << std::endl; continue; } - MDRawContextARM64* arm = new MDRawContextARM64(); - memcpy(arm, &cpu_state_raw[0], cpu_state_raw.size()); - context_->SetContextARM64(arm); } else if (strcmp(arch.c_str(), kX86Architecture) == 0) { if (cpu_state_raw.size() != sizeof(MDRawContextX86)) { std::cerr << "Malformed CPU context. Got " << cpu_state_raw.size() diff -Nru google-breakpad-0.1.0/src/processor/minidump.cc google-breakpad-0.1.0/src/processor/minidump.cc --- google-breakpad-0.1.0/src/processor/minidump.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/minidump.cc 2019-03-26 03:56:45.000000000 +0000 @@ -59,21 +59,39 @@ #include "google_breakpad/processor/dump_context.h" #include "processor/basic_code_module.h" #include "processor/basic_code_modules.h" +#include "processor/convert_old_arm64_context.h" #include "processor/logging.h" -namespace google_breakpad { +// All intentional fallthroughs in breakpad are in this file, so define +// this macro locally. +// If you ever move this to a .h file, make sure it's defined in a +// private header file: clang suggests the first macro expanding to +// [[clang::fallthrough]] in its diagnostics, so if BP_FALLTHROUGH +// is visible in code depending on breakpad, clang would suggest +// BP_FALLTHROUGH for code depending on breakpad, instead of the +// client code's own fallthrough macro. +// TODO(thakis): Once everyone uses C++17, use its [[fallthrough]] instead. +#if defined(__clang__) +#define BP_FALLTHROUGH [[clang::fallthrough]] +#else +#define BP_FALLTHROUGH +#endif +namespace google_breakpad { + using std::istream; using std::ifstream; using std::numeric_limits; using std::vector; +namespace { + // Returns true iff |context_size| matches exactly one of the sizes of the // various MDRawContext* types. // TODO(blundell): This function can be removed once // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=550 is fixed. -static bool IsContextSizeUnique(uint32_t context_size) { +bool IsContextSizeUnique(uint32_t context_size) { int num_matching_contexts = 0; if (context_size == sizeof(MDRawContextX86)) num_matching_contexts++; @@ -89,6 +107,8 @@ num_matching_contexts++; if (context_size == sizeof(MDRawContextARM64)) num_matching_contexts++; + if (context_size == sizeof(MDRawContextARM64_Old)) + num_matching_contexts++; if (context_size == sizeof(MDRawContextMIPS)) num_matching_contexts++; return num_matching_contexts == 1; @@ -106,9 +126,7 @@ // to account for certain templatized operations that require swapping for // wider types but handle uint8_t too // (MinidumpMemoryRegion::GetMemoryAtAddressInternal). -static inline void Swap(uint8_t* value) { -} - +inline void Swap(uint8_t* value) {} // Optimization: don't need to AND the furthest right shift, because we're // shifting an unsigned quantity. The standard requires zero-filling in this @@ -116,22 +134,18 @@ // right shift to avoid an arithmetic shift (which retains the sign bit). // The furthest left shift never needs to be ANDed bitmask. - -static inline void Swap(uint16_t* value) { - *value = (*value >> 8) | - (*value << 8); +inline void Swap(uint16_t* value) { + *value = (*value >> 8) | (*value << 8); } - -static inline void Swap(uint32_t* value) { +inline void Swap(uint32_t* value) { *value = (*value >> 24) | ((*value >> 8) & 0x0000ff00) | ((*value << 8) & 0x00ff0000) | (*value << 24); } - -static inline void Swap(uint64_t* value) { +inline void Swap(uint64_t* value) { uint32_t* value32 = reinterpret_cast(value); Swap(&value32[0]); Swap(&value32[1]); @@ -143,7 +157,7 @@ // Given a pointer to a 128-bit int in the minidump data, set the "low" // and "high" fields appropriately. -static void Normalize128(uint128_struct* value, bool is_big_endian) { +void Normalize128(uint128_struct* value, bool is_big_endian) { // The struct format is [high, low], so if the format is big-endian, // the most significant bytes will already be in the high field. if (!is_big_endian) { @@ -155,36 +169,34 @@ // This just swaps each int64 half of the 128-bit value. // The value should also be normalized by calling Normalize128(). -static void Swap(uint128_struct* value) { +void Swap(uint128_struct* value) { Swap(&value->low); Swap(&value->high); } // Swapping signed integers -static inline void Swap(int32_t* value) { +inline void Swap(int32_t* value) { Swap(reinterpret_cast(value)); } -static inline void Swap(MDLocationDescriptor* location_descriptor) { +inline void Swap(MDLocationDescriptor* location_descriptor) { Swap(&location_descriptor->data_size); Swap(&location_descriptor->rva); } - -static inline void Swap(MDMemoryDescriptor* memory_descriptor) { +inline void Swap(MDMemoryDescriptor* memory_descriptor) { Swap(&memory_descriptor->start_of_memory_range); Swap(&memory_descriptor->memory); } - -static inline void Swap(MDGUID* guid) { +inline void Swap(MDGUID* guid) { Swap(&guid->data1); Swap(&guid->data2); Swap(&guid->data3); // Don't swap guid->data4[] because it contains 8-bit quantities. } -static inline void Swap(MDSystemTime* system_time) { +inline void Swap(MDSystemTime* system_time) { Swap(&system_time->year); Swap(&system_time->month); Swap(&system_time->day_of_week); @@ -195,12 +207,12 @@ Swap(&system_time->milliseconds); } -static inline void Swap(MDXStateFeature* xstate_feature) { +inline void Swap(MDXStateFeature* xstate_feature) { Swap(&xstate_feature->offset); Swap(&xstate_feature->size); } -static inline void Swap(MDXStateConfigFeatureMscInfo* xstate_feature_info) { +inline void Swap(MDXStateConfigFeatureMscInfo* xstate_feature_info) { Swap(&xstate_feature_info->size_of_info); Swap(&xstate_feature_info->context_size); Swap(&xstate_feature_info->enabled_features); @@ -210,12 +222,12 @@ } } -static inline void Swap(MDRawSimpleStringDictionaryEntry* entry) { +inline void Swap(MDRawSimpleStringDictionaryEntry* entry) { Swap(&entry->key); Swap(&entry->value); } -static inline void Swap(uint16_t* data, size_t size_in_bytes) { +inline void Swap(uint16_t* data, size_t size_in_bytes) { size_t data_length = size_in_bytes / sizeof(data[0]); for (size_t i = 0; i < data_length; i++) { Swap(&data[i]); @@ -236,8 +248,7 @@ // parameter, a converter that uses iconv would also need to take the host // CPU's endianness into consideration. It doesn't seems worth the trouble // of making it a dependency when we don't care about anything but UTF-16. -static string* UTF16ToUTF8(const vector& in, - bool swap) { +string* UTF16ToUTF8(const vector& in, bool swap) { scoped_ptr out(new string()); // Set the string's initial capacity to the number of UTF-16 characters, @@ -310,14 +321,14 @@ // Return the smaller of the number of code units in the UTF-16 string, // not including the terminating null word, or maxlen. -static size_t UTF16codeunits(const uint16_t *string, size_t maxlen) { +size_t UTF16codeunits(const uint16_t* string, size_t maxlen) { size_t count = 0; while (count < maxlen && string[count] != 0) count++; return count; } -static inline void Swap(MDTimeZoneInformation* time_zone) { +inline void Swap(MDTimeZoneInformation* time_zone) { Swap(&time_zone->bias); // Skip time_zone->standard_name. No need to swap UTF-16 fields. // The swap will be done as part of the conversion to UTF-8. @@ -329,10 +340,10 @@ Swap(&time_zone->daylight_bias); } -static void ConvertUTF16BufferToUTF8String(const uint16_t* utf16_data, - size_t max_length_in_bytes, - string* utf8_result, - bool swap) { +void ConvertUTF16BufferToUTF8String(const uint16_t* utf16_data, + size_t max_length_in_bytes, + string* utf8_result, + bool swap) { // Since there is no explicit byte length for each string, use // UTF16codeunits to calculate word length, then derive byte // length from that. @@ -361,9 +372,9 @@ kNumberFormatHexadecimal, }; -static void PrintValueOrInvalid(bool valid, - NumberFormat number_format, - uint32_t value) { +void PrintValueOrInvalid(bool valid, + NumberFormat number_format, + uint32_t value) { if (!valid) { printf("(invalid)\n"); } else if (number_format == kNumberFormatDecimal) { @@ -374,7 +385,7 @@ } // Converts a time_t to a string showing the time in UTC. -static string TimeTToUTCString(time_t tt) { +string TimeTToUTCString(time_t tt) { struct tm timestruct; #ifdef _WIN32 gmtime_s(×truct, &tt); @@ -391,8 +402,7 @@ return string(timestr); } - -static string MDGUIDToString(const MDGUID& uuid) { +string MDGUIDToString(const MDGUID& uuid) { char buf[37]; snprintf(buf, sizeof(buf), "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", uuid.data1, @@ -409,6 +419,12 @@ return std::string(buf); } +bool IsDevAshmem(const string& filename) { + const string kDevAshmem("/dev/ashmem/"); + return filename.compare(0, kDevAshmem.length(), kDevAshmem) == 0; +} + +} // namespace // // MinidumpObject @@ -458,8 +474,8 @@ << "other raw context"; return false; } - if (!IsContextSizeUnique(sizeof(MDRawContextARM64))) { - BPLOG(ERROR) << "sizeof(MDRawContextARM64) cannot match the size of any " + if (!IsContextSizeUnique(sizeof(MDRawContextARM64_Old))) { + BPLOG(ERROR) << "sizeof(MDRawContextARM64_Old) cannot match the size of any " << "other raw context"; return false; } @@ -665,8 +681,8 @@ } SetContextPPC64(context_ppc64.release()); - } else if (expected_size == sizeof(MDRawContextARM64)) { - // |context_flags| of MDRawContextARM64 is 64 bits, but other MDRawContext + } else if (expected_size == sizeof(MDRawContextARM64_Old)) { + // |context_flags| of MDRawContextARM64_Old is 64 bits, but other MDRawContext // in the else case have 32 bits |context_flags|, so special case it here. uint64_t context_flags; @@ -679,7 +695,7 @@ if (minidump_->swap()) Swap(&context_flags); - scoped_ptr context_arm64(new MDRawContextARM64()); + scoped_ptr context_arm64(new MDRawContextARM64_Old()); uint32_t cpu_type = context_flags & MD_CONTEXT_CPU_MASK; if (cpu_type == 0) { @@ -691,7 +707,7 @@ } } - if (cpu_type != MD_CONTEXT_ARM64) { + if (cpu_type != MD_CONTEXT_ARM64_OLD) { // TODO: Fall through to switch below. // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=550 BPLOG(ERROR) << "MinidumpContext not actually arm64 context"; @@ -707,7 +723,7 @@ uint8_t* context_after_flags = reinterpret_cast(context_arm64.get()) + flags_size; if (!minidump_->ReadBytes(context_after_flags, - sizeof(MDRawContextARM64) - flags_size)) { + sizeof(MDRawContextARM64_Old) - flags_size)) { BPLOG(ERROR) << "MinidumpContext could not read arm64 context"; return false; } @@ -732,24 +748,16 @@ for (unsigned int fpr_index = 0; fpr_index < MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT; ++fpr_index) { - // While ARM64 is bi-endian, iOS (currently the only platform - // for which ARM64 support has been brought up) uses ARM64 exclusively - // in little-endian mode. - Normalize128(&context_arm64->float_save.regs[fpr_index], false); + Normalize128(&context_arm64->float_save.regs[fpr_index], + minidump_->is_big_endian()); Swap(&context_arm64->float_save.regs[fpr_index]); } } - SetContextFlags(static_cast(context_arm64->context_flags)); - // Check for data loss when converting context flags from uint64_t into - // uint32_t - if (static_cast(GetContextFlags()) != - context_arm64->context_flags) { - BPLOG(ERROR) << "Data loss detected when converting ARM64 context_flags"; - return false; - } - - SetContextARM64(context_arm64.release()); + scoped_ptr new_context(new MDRawContextARM64()); + ConvertOldARM64Context(*context_arm64.get(), new_context.get()); + SetContextFlags(new_context->context_flags); + SetContextARM64(new_context.release()); } else { uint32_t context_flags; if (!minidump_->ReadBytes(&context_flags, sizeof(context_flags))) { @@ -1046,6 +1054,58 @@ break; } + case MD_CONTEXT_ARM64: { + if (expected_size != sizeof(MDRawContextARM64)) { + BPLOG(ERROR) << "MinidumpContext arm64 size mismatch, " << + expected_size << " != " << sizeof(MDRawContextARM64); + return false; + } + + scoped_ptr context_arm64(new MDRawContextARM64()); + + // Set the context_flags member, which has already been read, and + // read the rest of the structure beginning with the first member + // after context_flags. + context_arm64->context_flags = context_flags; + + size_t flags_size = sizeof(context_arm64->context_flags); + uint8_t* context_after_flags = + reinterpret_cast(context_arm64.get()) + flags_size; + if (!minidump_->ReadBytes(context_after_flags, + sizeof(*context_arm64) - flags_size)) { + BPLOG(ERROR) << "MinidumpContext could not read arm64 context"; + return false; + } + + // Do this after reading the entire MDRawContext structure because + // GetSystemInfo may seek minidump to a new position. + if (!CheckAgainstSystemInfo(cpu_type)) { + BPLOG(ERROR) << "MinidumpContext arm does not match system info"; + return false; + } + + if (minidump_->swap()) { + // context_arm64->context_flags was already swapped. + for (unsigned int ireg_index = 0; + ireg_index < MD_CONTEXT_ARM64_GPR_COUNT; + ++ireg_index) { + Swap(&context_arm64->iregs[ireg_index]); + } + Swap(&context_arm64->cpsr); + Swap(&context_arm64->float_save.fpsr); + Swap(&context_arm64->float_save.fpcr); + for (unsigned int fpr_index = 0; + fpr_index < MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT; + ++fpr_index) { + Normalize128(&context_arm64->float_save.regs[fpr_index], + minidump_->is_big_endian()); + Swap(&context_arm64->float_save.regs[fpr_index]); + } + } + SetContextARM64(context_arm64.release()); + break; + } + case MD_CONTEXT_MIPS: case MD_CONTEXT_MIPS64: { if (expected_size != sizeof(MDRawContextMIPS)) { @@ -1191,6 +1251,11 @@ return_value = true; break; + case MD_CONTEXT_ARM64_OLD: + if (system_info_cpu_type == MD_CPU_ARCHITECTURE_ARM64_OLD) + return_value = true; + break; + case MD_CONTEXT_MIPS: if (system_info_cpu_type == MD_CPU_ARCHITECTURE_MIPS) return_value = true; @@ -1969,6 +2034,7 @@ break; } // Otherwise fall through to the case below. + BP_FALLTHROUGH; } case MD_OS_MAC_OS_X: @@ -2333,7 +2399,11 @@ module_.cv_record.data_size; return NULL; } - // There's nothing to swap in CVInfoELF, it's just raw bytes. + if (minidump_->swap()) { + MDCVInfoELF* cv_record_elf = + reinterpret_cast(&(*cv_record)[0]); + Swap(&cv_record_elf->cv_signature); + } } // If the signature doesn't match something above, it's not something @@ -2665,8 +2735,7 @@ scoped_ptr modules( new MinidumpModules(module_count, MinidumpModule(minidump_))); - for (unsigned int module_index = 0; - module_index < module_count; + for (uint32_t module_index = 0; module_index < module_count; ++module_index) { MinidumpModule* module = &(*modules)[module_index]; @@ -2684,17 +2753,16 @@ // included in the loop above, additional seeks would be needed where // none are now to read contiguous data. uint64_t last_end_address = 0; - for (unsigned int module_index = 0; - module_index < module_count; + for (uint32_t module_index = 0; module_index < module_count; ++module_index) { - MinidumpModule* module = &(*modules)[module_index]; + MinidumpModule& module = (*modules)[module_index]; // ReadAuxiliaryData fails if any data that the module indicates should // exist is missing, but we treat some such cases as valid anyway. See // issue #222: if a debugging record is of a format that's too large to // handle, it shouldn't render the entire dump invalid. Check module // validity before giving up. - if (!module->ReadAuxiliaryData() && !module->valid()) { + if (!module.ReadAuxiliaryData() && !module.valid()) { BPLOG(ERROR) << "MinidumpModuleList could not read required module " "auxiliary data for module " << module_index << "/" << module_count; @@ -2704,52 +2772,54 @@ // It is safe to use module->code_file() after successfully calling // module->ReadAuxiliaryData or noting that the module is valid. - uint64_t base_address = module->base_address(); - uint64_t module_size = module->size(); + uint64_t base_address = module.base_address(); + uint64_t module_size = module.size(); if (base_address == static_cast(-1)) { - BPLOG(ERROR) << "MinidumpModuleList found bad base address " - "for module " << module_index << "/" << module_count << - ", " << module->code_file(); + BPLOG(ERROR) << "MinidumpModuleList found bad base address for module " + << module_index << "/" << module_count << ", " + << module.code_file(); return false; } - if (!range_map_->StoreRange(base_address, module_size, module_index)) { - // Android's shared memory implementation /dev/ashmem can contain - // duplicate entries for JITted code, so ignore these. - // TODO(wfh): Remove this code when Android is fixed. - // See https://crbug.com/439531 - const string kDevAshmem("/dev/ashmem/"); - if (module->code_file().compare( - 0, kDevAshmem.length(), kDevAshmem) != 0) { - if (base_address < last_end_address) { - // If failed due to apparent range overlap the cause may be - // the client correction applied for Android packed relocations. - // If this is the case, back out the client correction and retry. - module_size -= last_end_address - base_address; - base_address = last_end_address; - if (!range_map_->StoreRange(base_address, - module_size, module_index)) { - BPLOG(ERROR) << "MinidumpModuleList could not store module " << - module_index << "/" << module_count << ", " << - module->code_file() << ", " << - HexString(base_address) << "+" << - HexString(module_size) << ", after adjusting"; - return false; - } - } else { - BPLOG(ERROR) << "MinidumpModuleList could not store module " << - module_index << "/" << module_count << ", " << - module->code_file() << ", " << - HexString(base_address) << "+" << - HexString(module_size); - return false; - } - } else { - BPLOG(INFO) << "MinidumpModuleList ignoring overlapping module " << - module_index << "/" << module_count << ", " << - module->code_file() << ", " << - HexString(base_address) << "+" << - HexString(module_size); + // Some minidumps have additional modules in the list that are duplicates. + // Ignore them. See https://crbug.com/838322 + uint32_t existing_module_index; + if (range_map_->RetrieveRange(base_address, &existing_module_index, + nullptr, nullptr, nullptr) && + existing_module_index < module_count) { + const MinidumpModule& existing_module = + (*modules)[existing_module_index]; + if (existing_module.base_address() == module.base_address() && + existing_module.size() == module.size() && + existing_module.code_file() == module.code_file() && + existing_module.code_identifier() == module.code_identifier()) { + continue; + } + } + + const bool is_android = minidump_->IsAndroid(); + if (!StoreRange(module, base_address, module_index, module_count, + is_android)) { + if (!is_android || base_address >= last_end_address) { + BPLOG(ERROR) << "MinidumpModuleList could not store module " + << module_index << "/" << module_count << ", " + << module.code_file() << ", " << HexString(base_address) + << "+" << HexString(module_size); + return false; + } + + // If failed due to apparent range overlap the cause may be the client + // correction applied for Android packed relocations. If this is the + // case, back out the client correction and retry. + assert(is_android); + module_size -= last_end_address - base_address; + base_address = last_end_address; + if (!range_map_->StoreRange(base_address, module_size, module_index)) { + BPLOG(ERROR) << "MinidumpModuleList could not store module " + << module_index << "/" << module_count << ", " + << module.code_file() << ", " << HexString(base_address) + << "+" << HexString(module_size) << ", after adjusting"; + return false; } } last_end_address = base_address + module_size; @@ -2764,6 +2834,28 @@ return true; } +bool MinidumpModuleList::StoreRange(const MinidumpModule& module, + uint64_t base_address, + uint32_t module_index, + uint32_t module_count, + bool is_android) { + if (range_map_->StoreRange(base_address, module.size(), module_index)) + return true; + + // Android's shared memory implementation /dev/ashmem can contain duplicate + // entries for JITted code, so ignore these. + // TODO(wfh): Remove this code when Android is fixed. + // See https://crbug.com/439531 + if (is_android && IsDevAshmem(module.code_file())) { + BPLOG(INFO) << "MinidumpModuleList ignoring overlapping module " + << module_index << "/" << module_count << ", " + << module.code_file() << ", " << HexString(base_address) << "+" + << HexString(module.size()); + return true; + } + + return false; +} const MinidumpModule* MinidumpModuleList::GetModuleForAddress( uint64_t address) const { @@ -3452,6 +3544,7 @@ break; case MD_CPU_ARCHITECTURE_ARM64: + case MD_CPU_ARCHITECTURE_ARM64_OLD: cpu = "arm64"; break; @@ -4904,7 +4997,7 @@ MDGUIDToString(crashpad_info_.report_id).c_str()); printf(" client_id = %s\n", MDGUIDToString(crashpad_info_.client_id).c_str()); - for (std::map::const_iterator iterator = + for (std::map::const_iterator iterator = simple_annotations_.begin(); iterator != simple_annotations_.end(); ++iterator) { @@ -4928,7 +5021,7 @@ module_crashpad_info_list_annotations_ [module_index][annotation_index].c_str()); } - for (std::map::const_iterator iterator = + for (std::map::const_iterator iterator = module_crashpad_info_simple_annotations_[module_index].begin(); iterator != module_crashpad_info_simple_annotations_[module_index].end(); @@ -4958,6 +5051,7 @@ path_(path), stream_(NULL), swap_(false), + is_big_endian_(false), valid_(false), hexdump_(hexdump), hexdump_width_(hexdump_width) { @@ -4970,6 +5064,7 @@ path_(), stream_(&stream), swap_(false), + is_big_endian_(false), valid_(false), hexdump_(false), hexdump_width_(0) { @@ -5053,6 +5148,9 @@ case MD_CPU_ARCHITECTURE_ARM64: *context_cpu_flags = MD_CONTEXT_ARM64; break; + case MD_CPU_ARCHITECTURE_ARM64_OLD: + *context_cpu_flags = MD_CONTEXT_ARM64_OLD; + break; case MD_CPU_ARCHITECTURE_IA64: *context_cpu_flags = MD_CONTEXT_IA64; break; @@ -5125,6 +5223,13 @@ swap_ = false; } +#if defined(__BIG_ENDIAN__) || \ + (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + is_big_endian_ = !swap_; +#else + is_big_endian_ = swap_; +#endif + BPLOG(INFO) << "Minidump " << (swap_ ? "" : "not ") << "byte-swapping minidump"; @@ -5199,7 +5304,7 @@ stream_type << ", but can only deal with one"; return false; } - // Fall through to default + BP_FALLTHROUGH; } default: { @@ -5800,5 +5905,4 @@ return *stream; } - } // namespace google_breakpad diff -Nru google-breakpad-0.1.0/src/processor/minidump_dump.cc google-breakpad-0.1.0/src/processor/minidump_dump.cc --- google-breakpad-0.1.0/src/processor/minidump_dump.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/minidump_dump.cc 2019-03-26 03:56:45.000000000 +0000 @@ -121,6 +121,9 @@ thread_list->Print(); } + // It's useful to be able to see the full list of modules here even if it + // would cause minidump_stackwalk to fail. + MinidumpModuleList::set_max_modules(UINT32_MAX); MinidumpModuleList *module_list = minidump.GetModuleList(); if (!module_list) { ++errors; diff -Nru google-breakpad-0.1.0/src/processor/minidump_processor.cc google-breakpad-0.1.0/src/processor/minidump_processor.cc --- google-breakpad-0.1.0/src/processor/minidump_processor.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/minidump_processor.cc 2019-03-26 03:56:45.000000000 +0000 @@ -355,6 +355,26 @@ return minidump_system_info->system_info(); } +static uint64_t GetAddressForArchitecture(const MDCPUArchitecture architecture, + size_t raw_address) +{ + switch (architecture) { + case MD_CPU_ARCHITECTURE_X86: + case MD_CPU_ARCHITECTURE_MIPS: + case MD_CPU_ARCHITECTURE_PPC: + case MD_CPU_ARCHITECTURE_SHX: + case MD_CPU_ARCHITECTURE_ARM: + case MD_CPU_ARCHITECTURE_X86_WIN64: + // 32-bit architectures, mask the upper bits. + return raw_address & 0xffffffffULL; + + default: + // All other architectures either have 64-bit pointers or it's impossible + // to tell from the minidump (e.g. MSIL or SPARC) so use 64-bits anyway. + return raw_address; + } +} + // Extract CPU info string from ARM-specific MDRawSystemInfo structure. // raw_info: pointer to source MDRawSystemInfo. // cpu_info: address of target string, cpu info text will be appended to it. @@ -535,7 +555,8 @@ break; } - case MD_CPU_ARCHITECTURE_ARM64: { + case MD_CPU_ARCHITECTURE_ARM64: + case MD_CPU_ARCHITECTURE_ARM64_OLD: { info->cpu = "arm64"; break; } @@ -735,7 +756,7 @@ if (raw_system_info->processor_architecture == MD_CPU_ARCHITECTURE_ARM || raw_system_info->processor_architecture == - MD_CPU_ARCHITECTURE_ARM64) { + MD_CPU_ARCHITECTURE_ARM64_OLD) { switch (exception_flags) { case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN: reason.append("EXC_ARM_DA_ALIGN"); @@ -789,7 +810,7 @@ reason = "EXC_BAD_INSTRUCTION / "; switch (raw_system_info->processor_architecture) { case MD_CPU_ARCHITECTURE_ARM: - case MD_CPU_ARCHITECTURE_ARM64: { + case MD_CPU_ARCHITECTURE_ARM64_OLD: { switch (exception_flags) { case MD_EXCEPTION_CODE_MAC_ARM_UNDEFINED: reason.append("EXC_ARM_UNDEFINED"); @@ -893,6 +914,7 @@ break; case MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST: reason.append("EXC_PPC_ALTIVECASSIST"); + break; default: reason.append(flags_string); BPLOG(INFO) << "Unknown exception reason " << reason; @@ -971,7 +993,7 @@ reason = "EXC_BREAKPOINT / "; switch (raw_system_info->processor_architecture) { case MD_CPU_ARCHITECTURE_ARM: - case MD_CPU_ARCHITECTURE_ARM64: { + case MD_CPU_ARCHITECTURE_ARM64_OLD: { switch (exception_flags) { case MD_EXCEPTION_CODE_MAC_ARM_DA_ALIGN: reason.append("EXC_ARM_DA_ALIGN"); @@ -1217,6 +1239,8 @@ case MD_OS_ANDROID: case MD_OS_LINUX: { + char flags_string[11]; + snprintf(flags_string, sizeof(flags_string), "0x%08x", exception_flags); switch (exception_code) { case MD_EXCEPTION_CODE_LIN_SIGHUP: reason = "SIGHUP"; @@ -1228,7 +1252,37 @@ reason = "SIGQUIT"; break; case MD_EXCEPTION_CODE_LIN_SIGILL: - reason = "SIGILL"; + reason = "SIGILL / "; + switch (exception_flags) { + case MD_EXCEPTION_FLAG_LIN_ILL_ILLOPC: + reason.append("ILL_ILLOPC"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_ILLOPN: + reason.append("ILL_ILLOPN"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_ILLADR: + reason.append("ILL_ILLADR"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_ILLTRP: + reason.append("ILL_ILLTRP"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_PRVOPC: + reason.append("ILL_PRVOPC"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_PRVREG: + reason.append("ILL_PRVREG"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_COPROC: + reason.append("ILL_COPROC"); + break; + case MD_EXCEPTION_FLAG_LIN_ILL_BADSTK: + reason.append("ILL_BADSTK"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } break; case MD_EXCEPTION_CODE_LIN_SIGTRAP: reason = "SIGTRAP"; @@ -1237,10 +1291,61 @@ reason = "SIGABRT"; break; case MD_EXCEPTION_CODE_LIN_SIGBUS: - reason = "SIGBUS"; + reason = "SIGBUS / "; + switch (exception_flags) { + case MD_EXCEPTION_FLAG_LIN_BUS_ADRALN: + reason.append("BUS_ADALN"); + break; + case MD_EXCEPTION_FLAG_LIN_BUS_ADRERR: + reason.append("BUS_ADRERR"); + break; + case MD_EXCEPTION_FLAG_LIN_BUS_OBJERR: + reason.append("BUS_OBJERR"); + break; + case MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AR: + reason.append("BUS_MCEERR_AR"); + break; + case MD_EXCEPTION_FLAG_LIN_BUS_MCEERR_AO: + reason.append("BUS_MCEERR_AO"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } break; case MD_EXCEPTION_CODE_LIN_SIGFPE: - reason = "SIGFPE"; + reason = "SIGFPE / "; + switch (exception_flags) { + case MD_EXCEPTION_FLAG_LIN_FPE_INTDIV: + reason.append("FPE_INTDIV"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_INTOVF: + reason.append("FPE_INTOVF"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTDIV: + reason.append("FPE_FLTDIV"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTOVF: + reason.append("FPE_FLTOVF"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTUND: + reason.append("FPE_FLTUND"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTRES: + reason.append("FPE_FLTRES"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTINV: + reason.append("FPE_FLTINV"); + break; + case MD_EXCEPTION_FLAG_LIN_FPE_FLTSUB: + reason.append("FPE_FLTSUB"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } break; case MD_EXCEPTION_CODE_LIN_SIGKILL: reason = "SIGKILL"; @@ -1249,7 +1354,25 @@ reason = "SIGUSR1"; break; case MD_EXCEPTION_CODE_LIN_SIGSEGV: - reason = "SIGSEGV"; + reason = "SIGSEGV /"; + switch (exception_flags) { + case MD_EXCEPTION_FLAG_LIN_SEGV_MAPERR: + reason.append("SEGV_MAPERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_ACCERR: + reason.append("SEGV_ACCERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_BNDERR: + reason.append("SEGV_BNDERR"); + break; + case MD_EXCEPTION_FLAG_LIN_SEGV_PKUERR: + reason.append("SEGV_PKUERR"); + break; + default: + reason.append(flags_string); + BPLOG(INFO) << "Unknown exception reason " << reason; + break; + } break; case MD_EXCEPTION_CODE_LIN_SIGUSR2: reason = "SIGUSR2"; @@ -1534,6 +1657,12 @@ } } + if (address) { + *address = GetAddressForArchitecture( + static_cast(raw_system_info->processor_architecture), + *address); + } + return reason; } diff -Nru google-breakpad-0.1.0/src/processor/minidump_processor_unittest.cc google-breakpad-0.1.0/src/processor/minidump_processor_unittest.cc --- google-breakpad-0.1.0/src/processor/minidump_processor_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/minidump_processor_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -203,6 +203,12 @@ #define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2)) +static string GetTestDataPath() { + char *srcdir = getenv("srcdir"); + + return string(srcdir ? srcdir : ".") + "/src/processor/testdata/"; +} + class TestSymbolSupplier : public SymbolSupplier { public: TestSymbolSupplier() : interrupt_(false) {} @@ -249,10 +255,8 @@ } if (module && module->code_file() == "c:\\test_app.exe") { - *symbol_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/symbols/test_app.pdb/" + - module->debug_identifier() + - "/test_app.sym"; + *symbol_file = GetTestDataPath() + "symbols/test_app.pdb/" + + module->debug_identifier() + "/test_app.sym"; return FOUND; } @@ -460,8 +464,7 @@ BasicSourceLineResolver resolver; MinidumpProcessor processor(&supplier, &resolver); - string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/minidump2.dmp"; + string minidump_file = GetTestDataPath() + "minidump2.dmp"; ProcessState state; EXPECT_CALL(supplier, GetCStringSymbolData( Property(&google_breakpad::CodeModule::code_file, @@ -501,8 +504,7 @@ BasicSourceLineResolver resolver; MinidumpProcessor processor(&supplier, &resolver); - string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") + - "/src/processor/testdata/minidump2.dmp"; + string minidump_file = GetTestDataPath() + "minidump2.dmp"; ProcessState state; ASSERT_EQ(processor.Process(minidump_file, &state), @@ -739,6 +741,26 @@ ASSERT_EQ(0U, state.threads()->at(0)->frames()->size()); } +TEST_F(MinidumpProcessorTest, Test32BitCrashingAddress) { + TestSymbolSupplier supplier; + BasicSourceLineResolver resolver; + MinidumpProcessor processor(&supplier, &resolver); + + string minidump_file = GetTestDataPath() + "minidump_32bit_crash_addr.dmp"; + + ProcessState state; + ASSERT_EQ(processor.Process(minidump_file, &state), + google_breakpad::PROCESS_OK); + ASSERT_EQ(state.system_info()->os, kSystemInfoOS); + ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort); + ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion); + ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU); + ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo); + ASSERT_TRUE(state.crashed()); + ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION_WRITE"); + ASSERT_EQ(state.crash_address(), 0x45U); +} + } // namespace int main(int argc, char *argv[]) { diff -Nru google-breakpad-0.1.0/src/processor/processor.gyp google-breakpad-0.1.0/src/processor/processor.gyp --- google-breakpad-0.1.0/src/processor/processor.gyp 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/processor.gyp 2019-03-26 03:56:45.000000000 +0000 @@ -49,6 +49,8 @@ 'cfi_frame_info.h', 'contained_range_map-inl.h', 'contained_range_map.h', + 'convert_old_arm64_context.cc', + 'convert_old_arm64_context.h', 'disassembler_x86.cc', 'disassembler_x86.h', 'dump_context.cc', diff -Nru google-breakpad-0.1.0/src/processor/source_line_resolver_base_types.h google-breakpad-0.1.0/src/processor/source_line_resolver_base_types.h --- google-breakpad-0.1.0/src/processor/source_line_resolver_base_types.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/source_line_resolver_base_types.h 2019-03-26 03:56:45.000000000 +0000 @@ -85,9 +85,10 @@ Function(const string &function_name, MemAddr function_address, MemAddr code_size, - int set_parameter_size) + int set_parameter_size, + bool is_multiple) : name(function_name), address(function_address), size(code_size), - parameter_size(set_parameter_size) { } + parameter_size(set_parameter_size), is_multiple(is_multiple) { } string name; MemAddr address; @@ -95,16 +96,21 @@ // The size of parameters passed to this function on the stack. int32_t parameter_size; + + // If the function's instructions correspond to multiple symbols. + bool is_multiple; }; struct SourceLineResolverBase::PublicSymbol { PublicSymbol() { } PublicSymbol(const string& set_name, MemAddr set_address, - int set_parameter_size) + int set_parameter_size, + bool is_multiple) : name(set_name), address(set_address), - parameter_size(set_parameter_size) {} + parameter_size(set_parameter_size), + is_multiple(is_multiple) {} string name; MemAddr address; @@ -113,6 +119,9 @@ // is set to the size of the parameters passed to the funciton on the // stack, if known. int32_t parameter_size; + + // If the function's instructions correspond to multiple symbols. + bool is_multiple; }; class SourceLineResolverBase::Module { diff -Nru google-breakpad-0.1.0/src/processor/stackwalker_arm.cc google-breakpad-0.1.0/src/processor/stackwalker_arm.cc --- google-breakpad-0.1.0/src/processor/stackwalker_arm.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/stackwalker_arm.cc 2019-03-26 03:56:45.000000000 +0000 @@ -40,6 +40,7 @@ #include "google_breakpad/processor/memory_region.h" #include "google_breakpad/processor/source_line_resolver_interface.h" #include "google_breakpad/processor/stack_frame_cpu.h" +#include "google_breakpad/processor/system_info.h" #include "processor/cfi_frame_info.h" #include "processor/logging.h" #include "processor/stackwalker_arm.h" @@ -249,10 +250,14 @@ scoped_ptr frame; // See if there is DWARF call frame information covering this address. - scoped_ptr cfi_frame_info( - frame_symbolizer_->FindCFIFrameInfo(last_frame)); - if (cfi_frame_info.get()) - frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); + // TODO(jperaza): Ignore iOS CFI info until it is properly collected. + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=764 + if (!system_info_ || system_info_->os != "iOS") { + scoped_ptr cfi_frame_info( + frame_symbolizer_->FindCFIFrameInfo(last_frame)); + if (cfi_frame_info.get()) + frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get())); + } // If CFI failed, or there wasn't CFI available, fall back // to frame pointer, if this is configured. diff -Nru google-breakpad-0.1.0/src/processor/stackwalker_arm_unittest.cc google-breakpad-0.1.0/src/processor/stackwalker_arm_unittest.cc --- google-breakpad-0.1.0/src/processor/stackwalker_arm_unittest.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/processor/stackwalker_arm_unittest.cc 2019-03-26 03:56:45.000000000 +0000 @@ -782,8 +782,12 @@ class StackwalkerARMFixtureIOS : public StackwalkerARMFixture { public: StackwalkerARMFixtureIOS() { - system_info.os = "iOS"; - system_info.os_short = "ios"; + // iOS_test is used instead of iOS because the stackwalker has a check to + // avoid using CFI for iOS dumps. This is a workaround for bad CFI being + // produced by dump_syms for iOS. + // https://bugs.chromium.org/p/google-breakpad/issues/detail?id=764 + system_info.os = "iOS_test"; + system_info.os_short = "ios_test"; } }; Binary files /tmp/tmpjfyaBP/G9RZtOntlb/google-breakpad-0.1.0/src/processor/testdata/minidump_32bit_crash_addr.dmp and /tmp/tmpjfyaBP/huAPr7R575/google-breakpad-0.1.0/src/processor/testdata/minidump_32bit_crash_addr.dmp differ diff -Nru google-breakpad-0.1.0/src/third_party/curl/curlbuild.h google-breakpad-0.1.0/src/third_party/curl/curlbuild.h --- google-breakpad-0.1.0/src/third_party/curl/curlbuild.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/third_party/curl/curlbuild.h 2019-03-26 03:56:45.000000000 +0000 @@ -155,7 +155,8 @@ /* The size of `long', as computed by sizeof. */ #if defined(_M_X64) || (defined(__x86_64__) && !defined(__ILP32__)) || \ - defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABI64) + defined(__aarch64__) || (defined(__mips__) && _MIPS_SIM == _ABI64) || \ + defined(__powerpc64__) || defined(__s390x__) || defined(__LP64__) #define CURL_SIZEOF_LONG 8 #else #define CURL_SIZEOF_LONG 4 diff -Nru google-breakpad-0.1.0/src/third_party/lss/linux_syscall_support.h google-breakpad-0.1.0/src/third_party/lss/linux_syscall_support.h --- google-breakpad-0.1.0/src/third_party/lss/linux_syscall_support.h 2018-06-17 12:40:18.000000000 +0000 +++ google-breakpad-0.1.0/src/third_party/lss/linux_syscall_support.h 2019-03-26 03:56:45.000000000 +0000 @@ -1964,7 +1964,7 @@ __asm__ volatile(LSS_ENTRYPOINT \ : "=a" (__res) \ : "0" (__NR_##name) \ - : "esp", "memory"); \ + : "memory"); \ LSS_RETURN(type,__res); \ } #undef _syscall1 @@ -2405,7 +2405,7 @@ "d"(LSS_SYSCALL_ARG(parent_tidptr)), "r"(LSS_SYSCALL_ARG(newtls)), "r"(LSS_SYSCALL_ARG(child_tidptr)) - : "rsp", "memory", "r8", "r10", "r11", "rcx"); + : "memory", "r8", "r10", "r11", "rcx"); } LSS_RETURN(int, __res); } diff -Nru google-breakpad-0.1.0/src/third_party/lss/README.md google-breakpad-0.1.0/src/third_party/lss/README.md --- google-breakpad-0.1.0/src/third_party/lss/README.md 2018-06-17 12:40:18.000000000 +0000 +++ google-breakpad-0.1.0/src/third_party/lss/README.md 2019-03-26 03:56:45.000000000 +0000 @@ -108,20 +108,23 @@ ### Review You get your change reviewed, you can upload it to -[Rietveld](https://codereview.chromium.org) +[Gerrit](https://chromium-review.googlesource.com/q/project:linux-syscall-support+status:open) using `git cl upload` from -[Chromium's depot-tools](http://dev.chromium.org/developers/how-tos/depottools). +[Chromium's depot-tools](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html). ### Testing -Unfortunately, LSS has no automated test suite. +Tests are found in the [tests/](./tests/) subdirectory. It does not (yet) offer +100% coverage, but should grow over time. -You can test LSS by patching it into Chromium, building Chromium, and running -Chromium's tests. +New commits that update/change/add syscall wrappers should include tests for +them too. Consult the [test documentation](./tests/README.md) for more details. -You can compile-test LSS by running: +To run, just run `make` inside the tests directory. It will compile & execute +the tests locally. - gcc -Wall -Wextra -Wstrict-prototypes -c linux_syscall_support.h +There is some limited cross-compile coverage available if you run `make cross`. +It only compiles things (does not execute at all). ### Rolling into Chromium diff -Nru google-breakpad-0.1.0/src/third_party/lss/tests/Makefile google-breakpad-0.1.0/src/third_party/lss/tests/Makefile --- google-breakpad-0.1.0/src/third_party/lss/tests/Makefile 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/third_party/lss/tests/Makefile 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,129 @@ +# Copyright 2018, Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +top_srcdir ?= .. + +DEF_FLAGS = -g -pipe +DEF_WFLAGS = -Wall +CFLAGS ?= $(DEF_FLAGS) +CXXFLAGS ?= $(DEF_FLAGS) +CFLAGS += $(DEF_WFLAGS) -Wstrict-prototypes +CXXFLAGS += $(DEF_WFLAGS) +CPPFLAGS += -I$(top_srcdir) +# We use static linking here so that if people run through qemu/etc... by hand, +# it's a lot easier to run/debug. Same for strace output. +LDFLAGS += -static + +TESTS = \ + unlink \ + +all: check + +%_test: %.c test_skel.h $(top_srcdir)/linux_syscall_support.h + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< + +%_test: %.cc test_skel.h $(top_srcdir)/linux_syscall_support.h + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $< + +%_run: %_test + @t=$(@:_run=_test); \ + echo "./$$t"; \ + if ! env -i ./$$t; then \ + env -i strace -f -v ./$$t; \ + echo "TRY: gdb -q -ex r -ex bt ./$$t"; \ + exit 1; \ + fi + +ALL_TEST_TARGETS = $(TESTS:=_test) +compile_tests: $(ALL_TEST_TARGETS) + +ALL_RUN_TARGETS = $(TESTS:=_run) +check: $(ALL_RUN_TARGETS) + +# The "tempfile" targets are the names we use with temp files. +# Clean them out in case some tests crashed in the middle. +clean: + rm -f *~ *.o tempfile.* a.out core $(ALL_TEST_TARGETS) + +.SUFFIXES: +.PHONY: all check clean compile_tests +.SECONDARY: $(ALL_TEST_TARGETS) + +# Try to cross-compile the tests for all our supported arches. We test with +# both gcc and clang. We don't support execution (yet?), but just compiling +# & linking helps catch common bugs. +.PHONY: cross compile_cross +cross_compile: + @echo "Running: $(MAKE) $@ CC='$(CC)' CXX='$(CXX)'"; \ + if (echo '#include ' | $(CC) -x c -c -o /dev/null -) 2>/dev/null; then \ + $(MAKE) -s clean; \ + $(MAKE) -k --no-print-directory compile_tests; \ + else \ + echo "Skipping $(CC) test: not installed"; \ + fi; \ + echo + +# The names here are a best effort. Not easy to probe for. +cross: + @for cc in \ + "x86_64-pc-linux-gnu-gcc" \ + "i686-pc-linux-gnu-gcc" \ + "x86_64-pc-linux-gnu-gcc -mx32" \ + "armv7a-unknown-linux-gnueabi-gcc -marm -mhard-float" \ + "armv7a-unknown-linux-gnueabi-gcc -mthumb -mhard-float" \ + "powerpc-unknown-linux-gnu-gcc" \ + "aarch64-unknown-linux-gnu-gcc" \ + "mips64-unknown-linux-gnu-gcc -mabi=64" \ + "mips64-unknown-linux-gnu-gcc -mabi=32" \ + "mips64-unknown-linux-gnu-gcc -mabi=n32" \ + "s390-ibm-linux-gnu-gcc" \ + "s390x-ibm-linux-gnu-gcc" \ + ; do \ + cxx=`echo "$$cc" | sed 's:-gcc:-g++:'`; \ + $(MAKE) --no-print-directory CC="$$cc" CXX="$$cxx" cross_compile; \ + \ + sysroot=`$$cc --print-sysroot 2>/dev/null`; \ + gccdir=`$$cc -print-file-name=libgcc.a 2>/dev/null`; \ + gccdir=`dirname "$$gccdir"`; \ + : Skip building for clang for mips/o32 and s390/31-bit until it works.; \ + case $$cc in \ + mips64*-mabi=32) continue;; \ + s390-*) continue;; \ + esac; \ + set -- $$cc; \ + tuple=$${1%-gcc}; \ + shift; \ + cc="clang -target $$tuple $$*"; \ + : Assume the build system is x86_64 based, so ignore the sysroot.; \ + case $$tuple in \ + x86_64*) ;; \ + *) cc="$$cc --sysroot $$sysroot -B$$gccdir -L$$gccdir";; \ + esac; \ + cxx=`echo "$$cc" | sed 's:^clang:clang++:'`; \ + $(MAKE) --no-print-directory CC="$$cc" CXX="$$cxx" cross_compile; \ + done diff -Nru google-breakpad-0.1.0/src/third_party/lss/tests/README.md google-breakpad-0.1.0/src/third_party/lss/tests/README.md --- google-breakpad-0.1.0/src/third_party/lss/tests/README.md 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/third_party/lss/tests/README.md 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,52 @@ +# LSS Tests + +## Source Layout + +The general layout of the tests: +* [test_skel.h]: Test helpers for common checks/etc... +* xxx.c: Unittest for the xxx syscall (e.g. `open.c`). +* [Makefile]: New tests should be registered in the `TESTS` variable. + +## Test Guidelines + +The unittest itself generally follows the conventions: +* Written in C (unless a very specific language behavior is needed). +* You should only need to `#include "test_skel.h"`. For new system headers, try + to add them here rather than copying to exact unittest (if possible). + It might slow compilation down slightly, but makes the code easier to manage. + Make sure it is included first. +* Use `assert()` on everything to check return values. +* Use `sys_xxx()` to access the syscall via LSS (compared to `xxx()` which tends + to come from the C library). +* If you need a tempfile, use `tempfile.XXXXXX` for templates with helpers like + `mkstemp`. Try to clean them up when you're done with them. + These will be created in the cwd, but that's fine. +* Don't worry about trying to verify the kernel/C library API and various edge + cases. The goal of LSS is to make sure that we pass args along correctly to + the syscall only. +* Make sure to leave comments in the test so it's clear what behavior you're + trying to verify (and how). + +Feel free to extend [test_skel.h] with more helpers if they're useful to more +than one test. + +If you're looking for a simple example, start with [unlink.c](./unlink.c). +You should be able to copy this over and replace the content of `main()`. + +## Running The Tests + +Simply run `make`. This will compile & execute all the tests on your local +system. A standard `make clean` will clean up all the objects. + +If you need to debug something, then the programs are simply named `xxx_test` +and can easily be thrown into `gdb ./xxx_test`. + +We have rudimentary cross-compile testing via gcc and clang. Try running +`make cross` -- for any toolchains you don't have available, it should skip +things automatically. This only verifies the compilation & linking stages +though. + +The cross-compilers can be created using . + +[Makefile]: ./Makefile +[test_skel.h]: ./test_skel.h diff -Nru google-breakpad-0.1.0/src/third_party/lss/tests/test_skel.h google-breakpad-0.1.0/src/third_party/lss/tests/test_skel.h --- google-breakpad-0.1.0/src/third_party/lss/tests/test_skel.h 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/third_party/lss/tests/test_skel.h 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,70 @@ +/* Copyright 2018, Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Make sure it's defined before including anything else. A number of syscalls + * are GNU extensions and rely on being exported by glibc. + */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +/* + * Make sure the assert checks aren't removed as all the unittests are based + * on them. + */ +#undef NDEBUG + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "linux_syscall_support.h" + +void assert_buffers_eq_len(const void *buf1, const void *buf2, size_t len) { + const uint8_t *u8_1 = (const uint8_t *)buf1; + const uint8_t *u8_2 = (const uint8_t *)buf2; + size_t i; + + for (i = 0; i < len; ++i) { + if (u8_1[i] != u8_2[i]) + printf("offset %zu: %02x != %02x\n", i, u8_1[i], u8_2[i]); + } +} +#define assert_buffers_eq(obj1, obj2) assert_buffers_eq_len(obj1, obj2, sizeof(*obj1)) diff -Nru google-breakpad-0.1.0/src/third_party/lss/tests/unlink.c google-breakpad-0.1.0/src/third_party/lss/tests/unlink.c --- google-breakpad-0.1.0/src/third_party/lss/tests/unlink.c 1970-01-01 00:00:00.000000000 +0000 +++ google-breakpad-0.1.0/src/third_party/lss/tests/unlink.c 2019-03-26 03:56:45.000000000 +0000 @@ -0,0 +1,48 @@ +/* Copyright 2018, Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "test_skel.h" + +int main(int argc, char *argv[]) { + // Get a unique path to play with. + char foo[] = "tempfile.XXXXXX"; + int fd = mkstemp(foo); + assert(fd != -1); + + // Make sure it exists. + assert(access(foo, F_OK) == 0); + + // Then delete it. + assert(sys_unlink(foo) == 0); + + // Make sure it's gone. + assert(access(foo, F_OK) != 0); + + return 0; +} diff -Nru google-breakpad-0.1.0/src/tools/linux/core2md/core2md.cc google-breakpad-0.1.0/src/tools/linux/core2md/core2md.cc --- google-breakpad-0.1.0/src/tools/linux/core2md/core2md.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/linux/core2md/core2md.cc 2019-03-26 03:56:45.000000000 +0000 @@ -64,7 +64,7 @@ if (!WriteMinidumpFromCore(minidump_file, core_file, procfs_dir)) { - fprintf(stderr, "Unable to generate minidump.\n"); + perror("core2md: Unable to generate minidump"); return 1; } diff -Nru google-breakpad-0.1.0/src/tools/linux/md2core/minidump-2-core.cc google-breakpad-0.1.0/src/tools/linux/md2core/minidump-2-core.cc --- google-breakpad-0.1.0/src/tools/linux/md2core/minidump-2-core.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/linux/md2core/minidump-2-core.cc 2019-03-26 03:56:45.000000000 +0000 @@ -480,17 +480,28 @@ static void ParseThreadRegisters(CrashedProcess::Thread* thread, const MinidumpMemoryRange& range) { - const MDRawContextARM64* rawregs = range.GetData(0); - - for (int i = 0; i < 31; ++i) - thread->regs.regs[i] = rawregs->iregs[i]; - thread->regs.sp = rawregs->iregs[MD_CONTEXT_ARM64_REG_SP]; - thread->regs.pc = rawregs->iregs[MD_CONTEXT_ARM64_REG_PC]; - thread->regs.pstate = rawregs->cpsr; - - memcpy(thread->fpregs.vregs, rawregs->float_save.regs, 8 * 32); - thread->fpregs.fpsr = rawregs->float_save.fpsr; - thread->fpregs.fpcr = rawregs->float_save.fpcr; +#define COPY_REGS(rawregs) \ + do { \ + for (int i = 0; i < 31; ++i) \ + thread->regs.regs[i] = rawregs->iregs[i]; \ + thread->regs.sp = rawregs->iregs[MD_CONTEXT_ARM64_REG_SP]; \ + thread->regs.pc = rawregs->iregs[MD_CONTEXT_ARM64_REG_PC]; \ + thread->regs.pstate = rawregs->cpsr; \ + \ + memcpy(thread->fpregs.vregs, rawregs->float_save.regs, 8 * 32); \ + thread->fpregs.fpsr = rawregs->float_save.fpsr; \ + thread->fpregs.fpcr = rawregs->float_save.fpcr; \ + } while (false) + + if (range.length() == sizeof(MDRawContextARM64_Old)) { + const MDRawContextARM64_Old* rawregs = + range.GetData(0); + COPY_REGS(rawregs); + } else { + const MDRawContextARM64* rawregs = range.GetData(0); + COPY_REGS(rawregs); + } +#undef COPY_REGS } #elif defined(__mips__) static void @@ -590,7 +601,7 @@ exit(1); } #elif defined(__aarch64__) - if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_ARM64) { + if (sysinfo->processor_architecture != MD_CPU_ARCHITECTURE_ARM64_OLD) { fprintf(stderr, "This version of minidump-2-core only supports ARM (64bit).\n"); exit(1); diff -Nru google-breakpad-0.1.0/src/tools/linux/tools_linux.gypi google-breakpad-0.1.0/src/tools/linux/tools_linux.gypi --- google-breakpad-0.1.0/src/tools/linux/tools_linux.gypi 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/linux/tools_linux.gypi 2019-03-26 03:56:45.000000000 +0000 @@ -58,7 +58,7 @@ 'target_name': 'minidump_upload', 'type': 'executable', 'sources': [ - 'symupload/minidump_upload.m', + 'symupload/minidump_upload.cc', ], 'dependencies': [ '../common/common.gyp:common', diff -Nru google-breakpad-0.1.0/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj google-breakpad-0.1.0/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj --- google-breakpad-0.1.0/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj 2019-03-26 03:56:45.000000000 +0000 @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 162F64FE161C5ECB00CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64FC161C5ECB00CD68D5 /* arch_utilities.cc */; }; + 4214B800211109A600B769FA /* convert_old_arm64_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4214B7FE211109A600B769FA /* convert_old_arm64_context.cc */; }; + 4247E6402110D5A500482558 /* path_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4247E63F2110D5A500482558 /* path_helper.cc */; }; 4D2C721B126F9ACC00B43EAF /* source_line_resolver_base.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D2C721A126F9ACC00B43EAF /* source_line_resolver_base.cc */; }; 4D2C721F126F9ADE00B43EAF /* exploitability.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D2C721E126F9ADE00B43EAF /* exploitability.cc */; }; 4D2C7223126F9AF900B43EAF /* exploitability_win.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D2C7222126F9AF900B43EAF /* exploitability_win.cc */; }; @@ -81,6 +83,10 @@ 08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 162F64FC161C5ECB00CD68D5 /* arch_utilities.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = arch_utilities.cc; path = ../../../common/mac/arch_utilities.cc; sourceTree = ""; }; 162F64FD161C5ECB00CD68D5 /* arch_utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arch_utilities.h; path = ../../../common/mac/arch_utilities.h; sourceTree = ""; }; + 4214B7FE211109A600B769FA /* convert_old_arm64_context.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = convert_old_arm64_context.cc; path = ../../../processor/convert_old_arm64_context.cc; sourceTree = ""; }; + 4214B7FF211109A600B769FA /* convert_old_arm64_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert_old_arm64_context.h; path = ../../../processor/convert_old_arm64_context.h; sourceTree = ""; }; + 4247E63E2110D5A500482558 /* path_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path_helper.h; path = ../../../common/path_helper.h; sourceTree = ""; }; + 4247E63F2110D5A500482558 /* path_helper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path_helper.cc; path = ../../../common/path_helper.cc; sourceTree = ""; }; 4D2C721A126F9ACC00B43EAF /* source_line_resolver_base.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = source_line_resolver_base.cc; path = ../../../processor/source_line_resolver_base.cc; sourceTree = SOURCE_ROOT; }; 4D2C721E126F9ADE00B43EAF /* exploitability.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exploitability.cc; path = ../../../processor/exploitability.cc; sourceTree = SOURCE_ROOT; }; 4D2C7222126F9AF900B43EAF /* exploitability_win.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exploitability_win.cc; path = ../../../processor/exploitability_win.cc; sourceTree = SOURCE_ROOT; }; @@ -215,6 +221,10 @@ 08FB7794FE84155DC02AAC07 /* crash_report */ = { isa = PBXGroup; children = ( + 4214B7FE211109A600B769FA /* convert_old_arm64_context.cc */, + 4214B7FF211109A600B769FA /* convert_old_arm64_context.h */, + 4247E63F2110D5A500482558 /* path_helper.cc */, + 4247E63E2110D5A500482558 /* path_helper.h */, 8B31025311F0D2D400FCF3E4 /* Breakpad.xcconfig */, 8B3102DA11F0D65600FCF3E4 /* BreakpadDebug.xcconfig */, 8B3102DB11F0D65600FCF3E4 /* BreakpadRelease.xcconfig */, @@ -446,8 +456,11 @@ /* Begin PBXProject section */ 08FB7793FE84155DC02AAC07 /* Project object */ = { isa = PBXProject; + attributes = { + }; buildConfigurationList = 1DEB927808733DD40010E9CD /* Build configuration list for PBXProject "crash_report" */; compatibilityVersion = "Xcode 3.1"; + developmentRegion = en; hasScannedForEncodings = 1; knownRegions = ( English, @@ -517,6 +530,7 @@ 4D2C7223126F9AF900B43EAF /* exploitability_win.cc in Sources */, 4D2C7227126F9B0F00B43EAF /* disassembler_x86.cc in Sources */, F407DC48185773C10064622B /* exploitability_linux.cc in Sources */, + 4214B800211109A600B769FA /* convert_old_arm64_context.cc in Sources */, 4D2C722B126F9B5A00B43EAF /* x86_disasm.c in Sources */, 4D2C722D126F9B6E00B43EAF /* x86_misc.c in Sources */, 4D2C722F126F9B8300B43EAF /* x86_operand_list.c in Sources */, @@ -526,6 +540,7 @@ 4D2C7246126F9C0B00B43EAF /* ia32_insn.c in Sources */, 4D2C724A126F9C2300B43EAF /* ia32_opcode_tables.c in Sources */, 4D2C724C126F9C3800B43EAF /* ia32_implicit.c in Sources */, + 4247E6402110D5A500482558 /* path_helper.cc in Sources */, F44DDD8919C85CD50047280E /* microdump_processor.cc in Sources */, 4D2C724E126F9C4D00B43EAF /* ia32_reg.c in Sources */, 4D2C725B126F9C8000B43EAF /* ia32_operand.c in Sources */, diff -Nru google-breakpad-0.1.0/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj google-breakpad-0.1.0/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj --- google-breakpad-0.1.0/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj 2019-03-26 03:56:45.000000000 +0000 @@ -35,6 +35,9 @@ /* Begin PBXBuildFile section */ 162F64FA161C591500CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F8161C591500CD68D5 /* arch_utilities.cc */; }; 162F6500161C5F2200CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F8161C591500CD68D5 /* arch_utilities.cc */; }; + 4247E63D2110D4B200482558 /* path_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = EB06C7511FEBC515000214D9 /* path_helper.cc */; }; + 4262382721AC496F00E5A3A6 /* dwarf_range_list_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */; }; + 4262382821AC49A000E5A3A6 /* dwarf_range_list_handler.h in Sources */ = {isa = PBXBuildFile; fileRef = 4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */; }; 4D72CAF513DFBAC2006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CAF413DFBAC2006CABE3 /* md5.cc */; }; 8BCAAA4C1CE3A7980046090B /* elf_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8BCAAA4A1CE3A7980046090B /* elf_reader.cc */; }; 8BCAAA4D1CE3B1260046090B /* elf_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8BCAAA4A1CE3A7980046090B /* elf_reader.cc */; }; @@ -105,6 +108,7 @@ D21F97D711CBA12300239E38 /* test_assembler_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D9116CEC0600407530 /* test_assembler_unittest.cc */; }; D21F97D811CBA13D00239E38 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; }; D21F97E911CBA1FF00239E38 /* test_assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE0911665B5700407530 /* test_assembler.cc */; }; + EB06C7531FEBC516000214D9 /* path_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = EB06C7511FEBC515000214D9 /* path_helper.cc */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -276,6 +280,8 @@ 08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 162F64F8161C591500CD68D5 /* arch_utilities.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = arch_utilities.cc; path = ../../../common/mac/arch_utilities.cc; sourceTree = ""; }; 162F64F9161C591500CD68D5 /* arch_utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arch_utilities.h; path = ../../../common/mac/arch_utilities.h; sourceTree = ""; }; + 4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_range_list_handler.cc; path = ../../../common/dwarf_range_list_handler.cc; sourceTree = ""; }; + 4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_range_list_handler.h; path = ../../../common/dwarf_range_list_handler.h; sourceTree = ""; }; 4D72CAF413DFBAC2006CABE3 /* md5.cc */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = md5.cc; path = ../../../common/md5.cc; sourceTree = SOURCE_ROOT; }; 557800890BE1F3AB00EC23E0 /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../../common/mac/macho_utilities.cc; sourceTree = SOURCE_ROOT; }; 5578008A0BE1F3AB00EC23E0 /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; }; @@ -341,12 +347,14 @@ B89E0E701166573700DD08C9 /* macho_dump.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = macho_dump.cc; sourceTree = ""; }; B89E0E741166575200DD08C9 /* macho_dump */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = macho_dump; sourceTree = BUILT_PRODUCTS_DIR; }; B89E0E9511665A6400DD08C9 /* macho_reader_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = macho_reader_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; - B89E0E9F11665AC300DD08C9 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gtest_main.cc; path = ../../../testing/gtest/src/gtest_main.cc; sourceTree = SOURCE_ROOT; }; - B89E0EA011665AC300DD08C9 /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-all.cc"; path = "../../../testing/gtest/src/gtest-all.cc"; sourceTree = SOURCE_ROOT; }; - B89E0EA311665AEA00DD08C9 /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gmock-all.cc"; path = "../../../testing/src/gmock-all.cc"; sourceTree = SOURCE_ROOT; }; + B89E0E9F11665AC300DD08C9 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = gtest_main.cc; path = ../../../testing/googletest/src/gtest_main.cc; sourceTree = SOURCE_ROOT; }; + B89E0EA011665AC300DD08C9 /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gtest-all.cc"; path = "../../../testing/googletest/src/gtest-all.cc"; sourceTree = SOURCE_ROOT; }; + B89E0EA311665AEA00DD08C9 /* gmock-all.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "gmock-all.cc"; path = "../../../testing/googlemock/src/gmock-all.cc"; sourceTree = SOURCE_ROOT; }; B8C5B5111166531A00D34F4E /* dump_syms */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dump_syms; sourceTree = BUILT_PRODUCTS_DIR; }; B8E8CA0C1156C854009E61B2 /* byteswap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = byteswap.h; path = ../../../common/mac/byteswap.h; sourceTree = SOURCE_ROOT; }; D21F97D211CBA0F200239E38 /* test_assembler_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = test_assembler_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + EB06C7511FEBC515000214D9 /* path_helper.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = path_helper.cc; path = ../../../common/path_helper.cc; sourceTree = ""; }; + EB06C7521FEBC516000214D9 /* path_helper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = path_helper.h; path = ../../../common/path_helper.h; sourceTree = ""; }; F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "bytereader-inl.h"; path = "../../../common/dwarf/bytereader-inl.h"; sourceTree = SOURCE_ROOT; }; F95B422C0E0E22D100DBDE83 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; }; F95B422D0E0E22D100DBDE83 /* bytereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bytereader.h; path = ../../../common/dwarf/bytereader.h; sourceTree = SOURCE_ROOT; }; @@ -501,6 +509,8 @@ 9BDF186E0B1BB43700F8391B /* dump_syms_tool.cc */, B89E0E701166573700DD08C9 /* macho_dump.cc */, 4D72CAF413DFBAC2006CABE3 /* md5.cc */, + EB06C7511FEBC515000214D9 /* path_helper.cc */, + EB06C7521FEBC516000214D9 /* path_helper.h */, 08FB779DFE84155DC02AAC07 /* External Frameworks and Libraries */, 1AB674ADFE9D54B511CA2CBB /* Products */, ); @@ -607,6 +617,8 @@ B88FAF35116A595400407530 /* cfi_assembler.h */, F95B422E0E0E22D100DBDE83 /* dwarf2enums.h */, F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */, + 4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */, + 4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */, F95B42300E0E22D100DBDE83 /* dwarf2reader.h */, B88FAF36116A595400407530 /* dwarf2reader_cfi_unittest.cc */, F95B422D0E0E22D100DBDE83 /* bytereader.h */, @@ -1059,6 +1071,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4247E63D2110D4B200482558 /* path_helper.cc in Sources */, 162F6500161C5F2200CD68D5 /* arch_utilities.cc in Sources */, B89E0E781166576C00DD08C9 /* macho_reader.cc in Sources */, B89E0E7A1166576C00DD08C9 /* macho_dump.cc in Sources */, @@ -1078,10 +1091,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 4262382821AC49A000E5A3A6 /* dwarf_range_list_handler.h in Sources */, 162F64FA161C591500CD68D5 /* arch_utilities.cc in Sources */, B88FAE2C1166606200407530 /* macho_reader.cc in Sources */, 8BCAAA4C1CE3A7980046090B /* elf_reader.cc in Sources */, B8C5B5171166534700D34F4E /* dwarf2reader.cc in Sources */, + EB06C7531FEBC516000214D9 /* path_helper.cc in Sources */, B8C5B5181166534700D34F4E /* bytereader.cc in Sources */, B8C5B5191166534700D34F4E /* macho_utilities.cc in Sources */, B8C5B51A1166534700D34F4E /* file_id.cc in Sources */, @@ -1092,6 +1107,7 @@ B88FAE1911665FE400407530 /* dwarf2diehandler.cc in Sources */, B88FAE261166603300407530 /* dwarf_cu_to_module.cc in Sources */, B88FAE271166603300407530 /* dwarf_line_to_module.cc in Sources */, + 4262382721AC496F00E5A3A6 /* dwarf_range_list_handler.cc in Sources */, B88FAE281166603300407530 /* language.cc in Sources */, B88FAE291166603300407530 /* module.cc in Sources */, B88FAE351166673E00407530 /* dwarf_cfi_to_module.cc in Sources */, @@ -1235,6 +1251,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 8B3102D411F0D60300FCF3E4 /* BreakpadDebug.xcconfig */; buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; HEADER_SEARCH_PATHS = ( ../../.., ../../../common/mac/include/, @@ -1247,6 +1264,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 8B3102D511F0D60300FCF3E4 /* BreakpadRelease.xcconfig */; buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; HEADER_SEARCH_PATHS = ( ../../.., ../../../common/mac/include/, @@ -1260,10 +1278,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = stabs_to_module_unittest; }; @@ -1274,10 +1292,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = stabs_to_module_unittest; }; @@ -1288,10 +1306,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -1307,10 +1325,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -1341,10 +1359,10 @@ GCC_PREPROCESSOR_DEFINITIONS = HAVE_MACH_O_NLIST_H; HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = stabs_reader_unittest; }; @@ -1356,10 +1374,10 @@ GCC_PREPROCESSOR_DEFINITIONS = HAVE_MACH_O_NLIST_H; HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = stabs_reader_unittest; }; @@ -1370,10 +1388,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = gtestmockall; }; @@ -1384,10 +1402,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = gtestmockall; }; @@ -1398,10 +1416,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = module_unittest; }; @@ -1412,10 +1430,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = module_unittest; }; @@ -1426,10 +1444,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = dwarf2diehandler_unittest; }; @@ -1440,10 +1458,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = dwarf2diehandler_unittest; }; @@ -1454,10 +1472,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = dwarf_line_to_module_unittest; }; @@ -1468,10 +1486,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = dwarf_line_to_module_unittest; }; @@ -1482,10 +1500,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = dwarf_cu_to_module_unittest; }; @@ -1496,10 +1514,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = dwarf_cu_to_module_unittest; }; @@ -1510,10 +1528,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = dwarf_cfi_to_module_unittest; }; @@ -1524,10 +1542,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = dwarf_cfi_to_module_unittest; }; @@ -1538,10 +1556,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = bytereader_unittest; }; @@ -1552,10 +1570,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, + ../../../testing/googletest, + ../../../testing/googletest/include, ); PRODUCT_NAME = bytereader_unittest; }; @@ -1566,10 +1584,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, ); PRODUCT_NAME = byte_cursor_unittest; }; @@ -1580,10 +1598,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, ); PRODUCT_NAME = byte_cursor_unittest; }; @@ -1608,10 +1626,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, ); PRODUCT_NAME = macho_reader_unittest; }; @@ -1622,10 +1640,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, ); PRODUCT_NAME = macho_reader_unittest; }; @@ -1654,10 +1672,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, ); PRODUCT_NAME = test_assembler_unittest; }; @@ -1668,10 +1686,10 @@ buildSettings = { HEADER_SEARCH_PATHS = ( $inherited, - ../../../testing, - ../../../testing/include, - ../../../testing/gtest, - ../../../testing/gtest/include, + ../../../testing/googletest, + ../../../testing/googletest/include, + ../../../testing/googlemock, + ../../../testing/googlemock/include, ); PRODUCT_NAME = test_assembler_unittest; }; diff -Nru google-breakpad-0.1.0/src/tools/mac/upload_system_symbols/arch_constants.h google-breakpad-0.1.0/src/tools/mac/upload_system_symbols/arch_constants.h --- google-breakpad-0.1.0/src/tools/mac/upload_system_symbols/arch_constants.h 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/mac/upload_system_symbols/arch_constants.h 2019-03-26 03:56:45.000000000 +0000 @@ -43,10 +43,15 @@ #define CPU_SUBTYPE_ARM64_ALL 0 #endif +#ifndef CPU_SUBTYPE_ARM64_E +#define CPU_SUBTYPE_ARM64_E 2 +#endif + const cpu_type_t kCPU_TYPE_ARM = CPU_TYPE_ARM; const cpu_type_t kCPU_TYPE_ARM64 = CPU_TYPE_ARM64; const cpu_subtype_t kCPU_SUBTYPE_ARM64_ALL = CPU_SUBTYPE_ARM64_ALL; +const cpu_subtype_t kCPU_SUBTYPE_ARM64_E = CPU_SUBTYPE_ARM64_E; const cpu_subtype_t kCPU_SUBTYPE_ARM_V7S = CPU_SUBTYPE_ARM_V7S; const char* GetNXArchInfoName(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) { diff -Nru google-breakpad-0.1.0/src/tools/mac/upload_system_symbols/arch_reader.go google-breakpad-0.1.0/src/tools/mac/upload_system_symbols/arch_reader.go --- google-breakpad-0.1.0/src/tools/mac/upload_system_symbols/arch_reader.go 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/mac/upload_system_symbols/arch_reader.go 2019-03-26 03:56:45.000000000 +0000 @@ -47,6 +47,9 @@ if header.Cpu == C.kCPU_TYPE_ARM64 && header.SubCpu == C.kCPU_SUBTYPE_ARM64_ALL { return "arm64" } + if header.Cpu == C.kCPU_TYPE_ARM64 && header.SubCpu == C.kCPU_SUBTYPE_ARM64_E { + return "arm64e" + } if header.Cpu == C.kCPU_TYPE_ARM && header.SubCpu == C.kCPU_SUBTYPE_ARM_V7S { return "armv7s" } Binary files /tmp/tmpjfyaBP/G9RZtOntlb/google-breakpad-0.1.0/src/tools/windows/binaries/dump_syms.exe and /tmp/tmpjfyaBP/huAPr7R575/google-breakpad-0.1.0/src/tools/windows/binaries/dump_syms.exe differ Binary files /tmp/tmpjfyaBP/G9RZtOntlb/google-breakpad-0.1.0/src/tools/windows/binaries/symupload.exe and /tmp/tmpjfyaBP/huAPr7R575/google-breakpad-0.1.0/src/tools/windows/binaries/symupload.exe differ diff -Nru google-breakpad-0.1.0/src/tools/windows/dump_syms/dump_syms.cc google-breakpad-0.1.0/src/tools/windows/dump_syms/dump_syms.cc --- google-breakpad-0.1.0/src/tools/windows/dump_syms/dump_syms.cc 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/windows/dump_syms/dump_syms.cc 2019-03-26 03:56:45.000000000 +0000 @@ -31,6 +31,7 @@ // a text-based format that we can use from the minidump processor. #include +#include #include diff -Nru google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym --- google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym 2019-03-26 03:56:45.000000000 +0000 @@ -322,7 +322,7 @@ FILE 10933 f:\dd\vctools\crt\crtw32\eh\hooks.cpp FILE 11032 f:\dd\vctools\crt\crtw32\rtc\initsect.cpp FILE 11055 f:\dd\vctools\crt\crtw32\h\rtcpriv.h -FUNC 1000 6 0 google_breakpad::i +FUNC 1000 6 0 static int google_breakpad::i() 1000 0 51 1 1000 5 52 1 1005 1 53 1 @@ -352,7 +352,7 @@ 1178 0 20 6742 1178 5 23 6742 FUNC 1180 39 0 type_info::`scalar deleting destructor'(unsigned int) -FUNC 11bc 180 0 __tmainCRTStartup +FUNC 11bc 180 0 static int __tmainCRTStartup() 11bc a 172 9116 11c6 c 188 9116 11d2 4e 196 9116 @@ -384,7 +384,7 @@ 1329 6 278 9116 132f 2 282 9116 1331 b 283 9116 -FUNC 133c 2c 0 fast_error_exit +FUNC 133c 2c 0 static void fast_error_exit(int) 133c 6 305 9116 1342 b 315 9116 134d 5 317 9116 @@ -652,7 +652,7 @@ 1b85 8 889 9790 1b8d 5 900 9790 1b92 5 893 9790 -FUNC 1b98 60 0 _initterm +FUNC 1b98 60 0 static void _initterm( * *, * *) 1b98 30 941 9790 1bc8 5 948 9790 1bcd 8 953 9790 @@ -673,7 +673,7 @@ FUNC 1c40 a 0 unlockexit 1c40 0 851 9790 1c40 a 852 9790 -FUNC 1c4c 195 0 doexit +FUNC 1c4c 195 0 static void doexit(int, int, int) 1c4c 24 552 9790 1c70 b 568 9790 1c7b d 571 9790 @@ -799,7 +799,7 @@ 221c 4 177 9411 2220 3 138 9411 2223 10 178 9411 -FUNC 2234 1c7 0 parse_cmdline +FUNC 2234 1c7 0 static void parse_cmdline(char *, char * *, char *, int *, int *) 2234 1d 223 9411 2251 15 230 9411 2266 7 231 9411 @@ -1524,7 +1524,7 @@ 3f8e 2 260 208 3f90 7 262 208 3f97 9 264 208 -FUNC 3fa0 7d 0 getSystemCP +FUNC 3fa0 7d 0 static int getSystemCP(int) 3fa0 8 295 8253 3fa8 c 297 8253 3fb4 7 298 8253 @@ -1538,7 +1538,7 @@ 3ff0 12 320 8253 4002 15 323 8253 4017 6 324 8253 -FUNC 4020 8e 0 setSBCS +FUNC 4020 8e 0 static void setSBCS(struct threadmbcinfostruct *) 4020 14 374 8253 4034 7 378 8253 403b 12 379 8253 @@ -1550,7 +1550,7 @@ 4080 c 395 8253 408c d 396 8253 4099 15 397 8253 -FUNC 40b0 1e1 0 setSBUpLow +FUNC 40b0 1e1 0 static void setSBUpLow(struct threadmbcinfostruct *) 40b0 2e 413 8253 40de e 423 8253 40ec 14 426 8253 @@ -1872,7 +1872,7 @@ 4f2d 5 342 5182 4f32 8 343 5182 4f3a b 351 5182 -FUNC 4f48 79 0 x_ismbbtype_l +FUNC 4f48 79 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) 4f48 11 223 8159 4f59 13 224 8159 4f6c 45 232 8159 @@ -2332,7 +2332,7 @@ 5e48 c 331 3520 5e54 c 333 3520 5e60 6 336 3520 -FUNC 5e68 2ec 0 __crtLCMapStringA_stat +FUNC 5e68 2ec 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, const wchar_t *, unsigned long, const char *, int, char *, int, int, int) 5e68 2d 96 8449 5e95 13 101 8449 5ea8 21 102 8449 @@ -2368,7 +2368,7 @@ 6166 13 259 8449 6179 5f 271 8449 61d8 12 272 8449 -FUNC 61ec 176 0 __crtGetStringTypeA_stat +FUNC 61ec 176 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int) 61ec 2d 60 8545 6219 14 80 8545 622d 7 81 8545 @@ -2841,7 +2841,7 @@ FUNC 6c98 a 0 flushall 6c98 0 193 5660 6c98 a 194 5660 -FUNC 6ca4 e6 0 flsall +FUNC 6ca4 e6 0 static int flsall(int) 6ca4 1c 228 5660 6cc0 2 230 5660 6cc2 2 231 5660 @@ -3645,7 +3645,7 @@ 9e7e 4 626 9904 9e82 16 628 9904 9e98 20 629 9904 -FUNC 9eb8 1f9 0 _cftoe2_l +FUNC 9eb8 1f9 0 static int _cftoe2_l(char *, unsigned __int64, int, int, struct _strflt *, char, struct localeinfo_struct *) 9eb8 20 242 9904 9ed8 1a 246 9904 9ef2 5 249 9904 @@ -3691,7 +3691,7 @@ a15e 2 377 9904 a160 32 380 9904 a192 19 383 9904 -FUNC a1ac 161 0 _cftof2_l +FUNC a1ac 161 0 static int _cftof2_l(char *, unsigned __int64, int, struct _strflt *, char, struct localeinfo_struct *) a1ac 19 638 9904 a1c5 7 640 9904 a1cc 19 641 9904 @@ -4097,76 +4097,76 @@ b967 15 136 9988 PUBLIC b97c 0 RtlUnwindEx PUBLIC b982 0 IsProcessorFeaturePresent -FUNC b990 1e 0 __tmainCRTStartup$filt$0 +FUNC b990 1e 0 static __tmainCRTStartup$filt$0() b990 1e 267 9116 -FUNC b9ae 19 0 `type_info::_Type_info_dtor'::`1'::fin$0 +FUNC b9ae 19 0 static `type_info::_Type_info_dtor'::`1'::fin$0() b9ae 9 72 10741 b9b7 10 73 10741 -FUNC b9c7 19 0 _freefls$fin$1 +FUNC b9c7 19 0 static _freefls$fin$1() b9c7 9 413 9313 b9d0 10 414 9313 -FUNC b9e0 19 0 _freefls$fin$0 +FUNC b9e0 19 0 static _freefls$fin$0() b9e0 9 429 9313 b9e9 10 430 9313 -FUNC b9f9 19 0 _initptd$fin$1 +FUNC b9f9 19 0 static _initptd$fin$1() b9f9 9 226 9313 ba02 10 228 9313 -FUNC ba12 19 0 _initptd$fin$0 +FUNC ba12 19 0 static _initptd$fin$0() ba12 9 247 9313 ba1b 10 248 9313 -FUNC ba2b 24 0 doexit$fin$0 +FUNC ba2b 24 0 static doexit$fin$0() ba2b 9 665 9790 ba34 9 666 9790 ba3d 12 667 9790 -FUNC ba4f 1b 0 _ioinit$fin$0 +FUNC ba4f 1b 0 static _ioinit$fin$0() ba4f 9 325 1584 ba58 12 326 1584 -FUNC ba6a 1d 0 _mtinitlocknum$fin$0 +FUNC ba6a 1d 0 static _mtinitlocknum$fin$0() ba6a 9 292 9509 ba73 14 293 9509 -FUNC ba87 19 0 __updatetlocinfo$fin$0 +FUNC ba87 19 0 static __updatetlocinfo$fin$0() ba87 9 293 3702 ba90 10 295 3702 -FUNC baa0 19 0 __updatetmbcinfo$fin$0 +FUNC baa0 19 0 static __updatetmbcinfo$fin$0() baa0 9 538 8253 baa9 10 540 8253 -FUNC bab9 19 0 _setmbcp$fin$0 +FUNC bab9 19 0 static _setmbcp$fin$0() bab9 9 659 8253 bac2 10 661 8253 -FUNC bae0 20 0 _IsNonwritableInCurrentImage$filt$0 +FUNC bae0 20 0 static _IsNonwritableInCurrentImage$filt$0() bae0 20 181 3978 -FUNC bb00 14 0 _onexit$fin$0 +FUNC bb00 14 0 static _onexit$fin$0() bb00 e 89 3795 bb0e 6 90 3795 -FUNC bb14 1e 0 raise$fin$0 +FUNC bb14 1e 0 static raise$fin$0() bb14 9 574 4150 bb1d 6 575 4150 bb23 f 576 4150 -FUNC bb32 28 0 flsall$fin$0 +FUNC bb32 28 0 static flsall$fin$0() bb32 9 276 5660 bb3b 1f 277 5660 -FUNC bb5a 19 0 flsall$fin$1 +FUNC bb5a 19 0 static flsall$fin$1() bb5a 9 282 5660 bb63 10 283 5660 -FUNC bb73 19 0 _fcloseall$fin$0 +FUNC bb73 19 0 static _fcloseall$fin$0() bb73 9 69 5472 bb7c 10 70 5472 -FUNC bb8c 19 0 _locterm$fin$0 +FUNC bb8c 19 0 static _locterm$fin$0() bb8c 9 193 4530 bb95 10 195 4530 -FUNC bba5 17 0 _commit$fin$0 +FUNC bba5 17 0 static _commit$fin$0() bba5 9 72 1490 bbae e 73 1490 -FUNC bbbc 17 0 _write$fin$0 +FUNC bbbc 17 0 static _write$fin$0() bbbc 9 81 1964 bbc5 e 82 1964 -FUNC bbd3 18 0 fclose$fin$0 +FUNC bbd3 18 0 static fclose$fin$0() bbd3 9 58 5556 bbdc f 59 5556 -FUNC bbeb 19 0 __lock_fhandle$fin$0 +FUNC bbeb 19 0 static __lock_fhandle$fin$0() bbeb 9 451 1865 bbf4 10 452 1865 -FUNC bc04 17 0 _close$fin$0 +FUNC bc04 17 0 static _close$fin$0() bc04 9 60 1396 bc0d e 61 1396 STACK CFI INIT 1010 6a .cfa: $rsp .ra: .cfa 8 - ^ diff -Nru google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym --- google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym 2019-03-26 03:56:45.000000000 +0000 @@ -290,7 +290,7 @@ 102f f 62 1 103e 12 64 1 1050 4 65 1 -FUNC 1060 a 0 google_breakpad::i +FUNC 1060 a 0 static int google_breakpad::i() 1060 3 51 1 1063 5 52 1 1068 2 53 1 @@ -316,14 +316,14 @@ 117d 5 20 2875 1182 1 24 2875 1183 5 23 2875 -FUNC 1188 29 0 fast_error_exit +FUNC 1188 29 0 static void fast_error_exit(int) 1188 5 326 4250 118d 9 335 4250 1196 5 337 4250 119b 8 339 4250 11a3 c 340 4250 11af 2 341 4250 -FUNC 11b1 161 0 __tmainCRTStartup +FUNC 11b1 161 0 static int __tmainCRTStartup() 11b1 c 196 4250 11bd a 214 4250 11c7 b 216 4250 @@ -505,7 +505,7 @@ 15d5 c 303 4186 15e1 2 307 4186 15e3 2 308 4186 -FUNC 15e5 140 0 doexit +FUNC 15e5 140 0 static void doexit(int, int, int) 15e5 c 489 4186 15f1 8 507 4186 15f9 4 508 4186 @@ -675,7 +675,7 @@ 1ba8 7 130 3838 1baf 5 131 3838 1bb4 d 133 3838 -FUNC 1bc1 19a 0 parse_cmdline +FUNC 1bc1 19a 0 static void parse_cmdline(char *, char * *, char *, int *, int *) 1bc1 6 221 3891 1bc7 9 229 3891 1bd0 2 232 3891 @@ -1194,7 +1194,7 @@ 2d1a 3 113 504 2d1d 2 122 504 FUNC 2d20 90 0 _local_unwind4 -FUNC 2db0 46 0 _unwind_handler4 +FUNC 2db0 46 0 static void _unwind_handler4() FUNC 2df6 1c 4 _seh_longjmp_unwind4 FUNC 2e12 17 0 _EH4_CallFilterFunc FUNC 2e29 19 0 _EH4_TransferToHandler @@ -1242,7 +1242,7 @@ 2f23 5 60 2311 2f28 5 61 2311 2f2d 2 62 2311 -FUNC 2f2f 37 0 siglookup +FUNC 2f2f 37 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) 2f2f 5 629 2311 2f34 a 630 2311 2f3e 14 639 2311 @@ -1328,7 +1328,7 @@ 3165 2 139 2820 3167 2 136 2820 3169 2 139 2820 -FUNC 316b b6 0 _onexit_nolock +FUNC 316b b6 0 static * _onexit_nolock( *) 316b 8 100 1969 3173 f 103 1969 3182 f 104 1969 @@ -1535,7 +1535,7 @@ 386a 5 79 333 386f 4 82 333 3873 2 83 333 -FUNC 3875 2f 0 CPtoLCID +FUNC 3875 2f 0 static int CPtoLCID(int) 3875 0 329 3326 3875 14 330 3326 3889 2 345 3326 @@ -1548,7 +1548,7 @@ 389d 1 346 3326 389e 5 333 3326 38a3 1 346 3326 -FUNC 38a4 64 0 setSBCS +FUNC 38a4 64 0 static void setSBCS(struct threadmbcinfostruct *) 38a4 6 363 3326 38aa 11 368 3326 38bb 1b 379 3326 @@ -1557,7 +1557,7 @@ 38f1 b 384 3326 38fc 9 385 3326 3905 3 386 3326 -FUNC 3908 190 0 setSBUpLow +FUNC 3908 190 0 static void setSBUpLow(struct threadmbcinfostruct *) 3908 17 402 3326 391f 10 412 3326 392f f 415 3326 @@ -1623,7 +1623,7 @@ 3bb0 2 255 111 3bb2 a 257 111 3bbc 7 259 111 -FUNC 3bc3 7c 0 getSystemCP +FUNC 3bc3 7c 0 static int getSystemCP(int) 3bc3 9 282 3326 3bcc b 284 3326 3bd7 6 285 3326 @@ -1734,7 +1734,7 @@ 3fd3 a 853 3326 3fdd 2 858 3326 3fdf 1 859 3326 -FUNC 3fe0 53 0 x_ismbbtype_l +FUNC 3fe0 53 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) 3fe0 8 213 3271 3fe8 b 214 3271 3ff3 4 219 3271 @@ -1953,12 +1953,12 @@ 44a1 1 180 2806 44a2 3 182 2806 FUNC 44b0 20 0 _global_unwind2 -FUNC 44d0 45 0 __unwind_handler +FUNC 44d0 45 0 static void __unwind_handler() FUNC 4515 84 0 _local_unwind2 FUNC 4599 23 0 _abnormal_termination FUNC 45bc 9 0 _NLG_Notify1 FUNC 45c5 1f 0 _NLG_Notify -PUBLIC 45dc 0 _NLG_Dispatch2 +PUBLIC m 45dc 0 _NLG_Dispatch FUNC 45e4 3 0 _NLG_Call PUBLIC 45e6 0 _NLG_Return2 FUNC 45e7 33 0 abort @@ -2301,7 +2301,7 @@ 4bf6 2 112 618 4bf8 16 103 618 4c0e 4 105 618 -FUNC 4c12 1e7 0 __crtLCMapStringA_stat +FUNC 4c12 1e7 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) 4c12 12 96 3447 4c24 c 101 3447 4c30 17 102 3447 @@ -2338,7 +2338,7 @@ 4e01 b 259 3447 4e0c 31 271 3447 4e3d 2 272 3447 -FUNC 4e3f e7 0 __crtGetStringTypeA_stat +FUNC 4e3f e7 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) 4e3f 12 63 3507 4e51 7 67 3507 4e58 5 83 3507 diff -Nru google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym --- google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym 2019-03-26 03:56:45.000000000 +0000 @@ -290,7 +290,7 @@ 2d1b f 62 1 2d2a 12 64 1 2d3c 4 65 1 -FUNC 4b70 a 0 google_breakpad::i +FUNC 4b70 a 0 static int google_breakpad::i() 4b70 3 51 1 4b73 5 52 1 4b78 2 53 1 @@ -320,10 +320,10 @@ 12a0 5 20 2875 12a5 1 24 2875 12a6 5 23 2875 -FUNC 198c 4 0 fast_error_exit -FUNC 1ff0 18 0 fast_error_exit -FUNC 455c 12 0 fast_error_exit -FUNC 4d0c 5 0 fast_error_exit +FUNC 198c 4 0 static void fast_error_exit(int) +FUNC 1ff0 18 0 static void fast_error_exit(int) +FUNC 455c 12 0 static void fast_error_exit(int) +FUNC 4d0c 5 0 static void fast_error_exit(int) 1ff0 5 326 4250 1ff5 13 335 4250 4d0c 5 337 4250 @@ -331,7 +331,7 @@ 198c 2 340 4250 4564 a 340 4250 198e 2 341 4250 -FUNC 38be 161 0 __tmainCRTStartup +FUNC 38be 161 0 static int __tmainCRTStartup() 38be c 196 4250 38ca a 214 4250 38d4 b 216 4250 @@ -556,7 +556,7 @@ 1d44 c 303 4186 4bf8 2 307 4186 6f60 2 308 4186 -FUNC 35a7 140 0 doexit +FUNC 35a7 140 0 static void doexit(int, int, int) 35a7 c 489 4186 35b3 8 507 4186 35bb 4 508 4186 @@ -809,61 +809,61 @@ 41fc 7 130 3838 4203 5 131 3838 4208 d 133 3838 -FUNC 1018 8 0 parse_cmdline -FUNC 19b4 e 0 parse_cmdline -FUNC 19f4 2 0 parse_cmdline -FUNC 1dd0 14 0 parse_cmdline -FUNC 1fac 28 0 parse_cmdline -FUNC 2058 f 0 parse_cmdline -FUNC 209c 9 0 parse_cmdline -FUNC 2364 1a 0 parse_cmdline -FUNC 253c 4 0 parse_cmdline -FUNC 2598 9 0 parse_cmdline -FUNC 25cc 10 0 parse_cmdline -FUNC 2718 b 0 parse_cmdline -FUNC 2730 e 0 parse_cmdline -FUNC 28a8 a 0 parse_cmdline -FUNC 28fc 2 0 parse_cmdline -FUNC 290c 14 0 parse_cmdline -FUNC 2b34 f 0 parse_cmdline -FUNC 2bfc 10 0 parse_cmdline -FUNC 2d88 7 0 parse_cmdline -FUNC 3730 d 0 parse_cmdline -FUNC 377c 2 0 parse_cmdline -FUNC 37b0 10 0 parse_cmdline -FUNC 3c38 24 0 parse_cmdline -FUNC 3c84 10 0 parse_cmdline -FUNC 3db8 1b 0 parse_cmdline -FUNC 3e90 e 0 parse_cmdline -FUNC 3efc 13 0 parse_cmdline -FUNC 4110 12 0 parse_cmdline -FUNC 42dc f 0 parse_cmdline -FUNC 42f0 10 0 parse_cmdline -FUNC 4518 6 0 parse_cmdline -FUNC 4610 7 0 parse_cmdline -FUNC 4684 11 0 parse_cmdline -FUNC 46f8 13 0 parse_cmdline -FUNC 4848 a 0 parse_cmdline -FUNC 4994 f 0 parse_cmdline -FUNC 49bc e 0 parse_cmdline -FUNC 4aac 1 0 parse_cmdline -FUNC 4cb8 f 0 parse_cmdline -FUNC 4ed8 24 0 parse_cmdline -FUNC 4f10 3 0 parse_cmdline -FUNC 4f30 e 0 parse_cmdline -FUNC 501c 10 0 parse_cmdline -FUNC 5518 3 0 parse_cmdline -FUNC 569c 3 0 parse_cmdline -FUNC 57bc 12 0 parse_cmdline -FUNC 5a50 10 0 parse_cmdline -FUNC 5cc0 14 0 parse_cmdline -FUNC 5e84 f 0 parse_cmdline -FUNC 6448 f 0 parse_cmdline -FUNC 6530 e 0 parse_cmdline -FUNC 66b0 13 0 parse_cmdline -FUNC 6970 4 0 parse_cmdline -FUNC 6aec 7 0 parse_cmdline -FUNC 6f30 e 0 parse_cmdline +FUNC 1018 8 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 19b4 e 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 19f4 2 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 1dd0 14 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 1fac 28 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2058 f 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 209c 9 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2364 1a 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 253c 4 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2598 9 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 25cc 10 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2718 b 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2730 e 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 28a8 a 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 28fc 2 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 290c 14 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2b34 f 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2bfc 10 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2d88 7 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 3730 d 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 377c 2 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 37b0 10 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 3c38 24 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 3c84 10 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 3db8 1b 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 3e90 e 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 3efc 13 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4110 12 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 42dc f 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 42f0 10 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4518 6 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4610 7 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4684 11 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 46f8 13 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4848 a 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4994 f 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 49bc e 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4aac 1 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4cb8 f 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4ed8 24 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4f10 3 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 4f30 e 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 501c 10 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 5518 3 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 569c 3 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 57bc 12 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 5a50 10 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 5cc0 14 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 5e84 f 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 6448 f 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 6530 e 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 66b0 13 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 6970 4 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 6aec 7 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 6f30 e 0 static void parse_cmdline(char *, char * *, char *, int *, int *) 1fac 6 221 3891 1fb2 9 229 3891 1fbb 2 232 3891 @@ -1632,7 +1632,7 @@ 5b9e 2 113 504 22f5 2 122 504 FUNC 297c 90 0 _local_unwind4 -FUNC 2a0c 46 0 _unwind_handler4 +FUNC 2a0c 46 0 static void _unwind_handler4() FUNC 2a52 1c 4 _seh_longjmp_unwind4 FUNC 2a6e 17 0 _EH4_CallFilterFunc FUNC 2a85 19 0 _EH4_TransferToHandler @@ -1687,13 +1687,13 @@ 15ca 5 60 2311 15cf 5 61 2311 15d4 2 62 2311 -FUNC 15d8 18 0 siglookup -FUNC 3538 f 0 siglookup -FUNC 42c8 14 0 siglookup -FUNC 45c8 2 0 siglookup -FUNC 4e1c f 0 siglookup -FUNC 55f0 2 0 siglookup -FUNC 63ac f 0 siglookup +FUNC 15d8 18 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) +FUNC 3538 f 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) +FUNC 42c8 14 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) +FUNC 45c8 2 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) +FUNC 4e1c f 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) +FUNC 55f0 2 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) +FUNC 63ac f 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) 63ac 5 629 2311 63b1 a 630 2311 15d8 18 639 2311 @@ -1785,19 +1785,19 @@ 6c1b 2 139 2820 60b0 2 136 2820 60b2 2 139 2820 -FUNC 2274 12 0 _onexit_nolock -FUNC 2484 10 0 _onexit_nolock -FUNC 2640 2 0 _onexit_nolock -FUNC 2b88 10 0 _onexit_nolock -FUNC 32ac 13 0 _onexit_nolock -FUNC 4124 15 0 _onexit_nolock -FUNC 43e8 33 0 _onexit_nolock -FUNC 45f8 18 0 _onexit_nolock -FUNC 4a2c 20 0 _onexit_nolock -FUNC 4b68 2 0 _onexit_nolock -FUNC 4bb8 18 0 _onexit_nolock -FUNC 4d84 5 0 _onexit_nolock -FUNC 6a0c 1a 0 _onexit_nolock +FUNC 2274 12 0 static * _onexit_nolock( *) +FUNC 2484 10 0 static * _onexit_nolock( *) +FUNC 2640 2 0 static * _onexit_nolock( *) +FUNC 2b88 10 0 static * _onexit_nolock( *) +FUNC 32ac 13 0 static * _onexit_nolock( *) +FUNC 4124 15 0 static * _onexit_nolock( *) +FUNC 43e8 33 0 static * _onexit_nolock( *) +FUNC 45f8 18 0 static * _onexit_nolock( *) +FUNC 4a2c 20 0 static * _onexit_nolock( *) +FUNC 4b68 2 0 static * _onexit_nolock( *) +FUNC 4bb8 18 0 static * _onexit_nolock( *) +FUNC 4d84 5 0 static * _onexit_nolock( *) +FUNC 6a0c 1a 0 static * _onexit_nolock( *) 43e8 8 100 1969 43f0 f 103 1969 43ff f 104 1969 @@ -2170,15 +2170,15 @@ 2b5e e 79 333 38b8 4 82 333 38bc 2 83 333 -FUNC 28b4 c 0 CPtoLCID -FUNC 3d08 6 0 CPtoLCID -FUNC 5510 6 0 CPtoLCID -FUNC 5600 6 0 CPtoLCID -FUNC 5f14 3 0 CPtoLCID -FUNC 6294 f 0 CPtoLCID -FUNC 68f4 10 0 CPtoLCID -FUNC 69cc 6 0 CPtoLCID -FUNC 6fe0 e 0 CPtoLCID +FUNC 28b4 c 0 static int CPtoLCID(int) +FUNC 3d08 6 0 static int CPtoLCID(int) +FUNC 5510 6 0 static int CPtoLCID(int) +FUNC 5600 6 0 static int CPtoLCID(int) +FUNC 5f14 3 0 static int CPtoLCID(int) +FUNC 6294 f 0 static int CPtoLCID(int) +FUNC 68f4 10 0 static int CPtoLCID(int) +FUNC 69cc 6 0 static int CPtoLCID(int) +FUNC 6fe0 e 0 static int CPtoLCID(int) 68f4 0 329 3326 28b4 c 330 3326 6294 f 330 3326 @@ -2194,11 +2194,11 @@ 69d1 1 346 3326 5600 5 333 3326 5605 1 346 3326 -FUNC 2208 f 0 setSBCS -FUNC 387c 3 0 setSBCS -FUNC 48ac f 0 setSBCS -FUNC 5900 44 0 setSBCS -FUNC 6be0 b 0 setSBCS +FUNC 2208 f 0 static void setSBCS(struct threadmbcinfostruct *) +FUNC 387c 3 0 static void setSBCS(struct threadmbcinfostruct *) +FUNC 48ac f 0 static void setSBCS(struct threadmbcinfostruct *) +FUNC 5900 44 0 static void setSBCS(struct threadmbcinfostruct *) +FUNC 6be0 b 0 static void setSBCS(struct threadmbcinfostruct *) 5900 6 363 3326 5906 11 368 3326 5917 1b 379 3326 @@ -2207,32 +2207,32 @@ 6be0 b 384 3326 48ac f 385 3326 387c 3 386 3326 -FUNC 12dc 18 0 setSBUpLow -FUNC 1794 f 0 setSBUpLow -FUNC 1b6c 7 0 setSBUpLow -FUNC 2548 e 0 setSBUpLow -FUNC 2c0c 39 0 setSBUpLow -FUNC 3238 8 0 setSBUpLow -FUNC 3e54 2 0 setSBUpLow -FUNC 3ee0 16 0 setSBUpLow -FUNC 445c 20 0 setSBUpLow -FUNC 4800 f 0 setSBUpLow -FUNC 4910 8 0 setSBUpLow -FUNC 4a8c 12 0 setSBUpLow -FUNC 4d8c e 0 setSBUpLow -FUNC 566c f 0 setSBUpLow -FUNC 56fc c 0 setSBUpLow -FUNC 59e4 14 0 setSBUpLow -FUNC 5aa8 6 0 setSBUpLow -FUNC 5b08 17 0 setSBUpLow -FUNC 5b60 14 0 setSBUpLow -FUNC 5db4 12 0 setSBUpLow -FUNC 6060 c 0 setSBUpLow -FUNC 60b4 6 0 setSBUpLow -FUNC 6218 f 0 setSBUpLow -FUNC 62b8 6a 0 setSBUpLow -FUNC 697c 3 0 setSBUpLow -FUNC 6b44 1b 0 setSBUpLow +FUNC 12dc 18 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 1794 f 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 1b6c 7 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 2548 e 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 2c0c 39 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 3238 8 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 3e54 2 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 3ee0 16 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 445c 20 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 4800 f 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 4910 8 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 4a8c 12 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 4d8c e 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 566c f 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 56fc c 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 59e4 14 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 5aa8 6 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 5b08 17 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 5b60 14 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 5db4 12 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 6060 c 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 60b4 6 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 6218 f 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 62b8 6a 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 697c 3 0 static void setSBUpLow(struct threadmbcinfostruct *) +FUNC 6b44 1b 0 static void setSBUpLow(struct threadmbcinfostruct *) 2c0c 17 402 3326 2c23 10 412 3326 2c33 12 415 3326 @@ -2317,17 +2317,17 @@ 4d7c 6 255 111 5f68 a 257 111 2904 7 259 111 -FUNC 19fc e 0 getSystemCP -FUNC 2690 7 0 getSystemCP -FUNC 2b98 3 0 getSystemCP -FUNC 3b80 28 0 getSystemCP -FUNC 3e18 c 0 getSystemCP -FUNC 4710 f 0 getSystemCP -FUNC 4868 10 0 getSystemCP -FUNC 56bc 16 0 getSystemCP -FUNC 5e20 16 0 getSystemCP -FUNC 6020 1f 0 getSystemCP -FUNC 6f64 2 0 getSystemCP +FUNC 19fc e 0 static int getSystemCP(int) +FUNC 2690 7 0 static int getSystemCP(int) +FUNC 2b98 3 0 static int getSystemCP(int) +FUNC 3b80 28 0 static int getSystemCP(int) +FUNC 3e18 c 0 static int getSystemCP(int) +FUNC 4710 f 0 static int getSystemCP(int) +FUNC 4868 10 0 static int getSystemCP(int) +FUNC 56bc 16 0 static int getSystemCP(int) +FUNC 5e20 16 0 static int getSystemCP(int) +FUNC 6020 1f 0 static int getSystemCP(int) +FUNC 6f64 2 0 static int getSystemCP(int) 3b80 9 282 3326 3b89 b 284 3326 3b94 6 285 3326 @@ -2485,15 +2485,15 @@ 5ddc a 853 3326 165c 2 858 3326 165e 1 859 3326 -FUNC 1674 7 0 x_ismbbtype_l -FUNC 1c0c 2c 0 x_ismbbtype_l -FUNC 3d74 2 0 x_ismbbtype_l -FUNC 4c90 e 0 x_ismbbtype_l -FUNC 5430 16 0 x_ismbbtype_l -FUNC 59b0 2 0 x_ismbbtype_l -FUNC 6254 10 0 x_ismbbtype_l -FUNC 643c 3 0 x_ismbbtype_l -FUNC 6498 10 0 x_ismbbtype_l +FUNC 1674 7 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 1c0c 2c 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 3d74 2 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 4c90 e 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 5430 16 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 59b0 2 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 6254 10 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 643c 3 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 6498 10 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) 1c0c 8 213 3271 1c14 b 214 3271 1c1f 4 219 3271 @@ -2804,12 +2804,12 @@ 3482 1 180 2806 3483 3 182 2806 FUNC 675b 20 0 _global_unwind2 -FUNC 677b 45 0 __unwind_handler +FUNC 677b 45 0 static void __unwind_handler() FUNC 67c0 84 0 _local_unwind2 FUNC 6844 23 0 _abnormal_termination FUNC 6867 9 0 _NLG_Notify1 FUNC 6870 1f 0 _NLG_Notify -PUBLIC 6887 0 _NLG_Dispatch2 +PUBLIC m 6887 0 _NLG_Dispatch FUNC 688f 3 0 _NLG_Call PUBLIC 6891 0 _NLG_Return2 FUNC 4695 33 0 abort @@ -3199,52 +3199,52 @@ 5976 6 112 618 1048 16 103 618 2ae0 8 105 618 -FUNC 1000 7 0 __crtLCMapStringA_stat -FUNC 11b0 14 0 __crtLCMapStringA_stat -FUNC 17c4 8 0 __crtLCMapStringA_stat -FUNC 1ac4 6 0 __crtLCMapStringA_stat -FUNC 21f4 c 0 __crtLCMapStringA_stat -FUNC 2234 9 0 __crtLCMapStringA_stat -FUNC 2354 f 0 __crtLCMapStringA_stat -FUNC 242c 12 0 __crtLCMapStringA_stat -FUNC 2710 3 0 __crtLCMapStringA_stat -FUNC 2794 b 0 __crtLCMapStringA_stat -FUNC 28d0 13 0 __crtLCMapStringA_stat -FUNC 31f8 5 0 __crtLCMapStringA_stat -FUNC 327c 14 0 __crtLCMapStringA_stat -FUNC 32c0 4a 0 __crtLCMapStringA_stat -FUNC 336c 20 0 __crtLCMapStringA_stat -FUNC 36f8 f 0 __crtLCMapStringA_stat -FUNC 37e0 10 0 __crtLCMapStringA_stat -FUNC 3c30 1 0 __crtLCMapStringA_stat -FUNC 3f94 e 0 __crtLCMapStringA_stat -FUNC 4300 14 0 __crtLCMapStringA_stat -FUNC 4338 11 0 __crtLCMapStringA_stat -FUNC 497c 16 0 __crtLCMapStringA_stat -FUNC 4b10 15 0 __crtLCMapStringA_stat -FUNC 4c70 14 0 __crtLCMapStringA_stat -FUNC 4ce8 10 0 __crtLCMapStringA_stat -FUNC 4db4 1e 0 __crtLCMapStringA_stat -FUNC 4e68 12 0 __crtLCMapStringA_stat -FUNC 54e8 3 0 __crtLCMapStringA_stat -FUNC 5574 14 0 __crtLCMapStringA_stat -FUNC 55d0 2 0 __crtLCMapStringA_stat -FUNC 55f8 8 0 __crtLCMapStringA_stat -FUNC 5628 8 0 __crtLCMapStringA_stat -FUNC 578c 3 0 __crtLCMapStringA_stat -FUNC 5838 24 0 __crtLCMapStringA_stat -FUNC 58f4 c 0 __crtLCMapStringA_stat -FUNC 5f44 7 0 __crtLCMapStringA_stat -FUNC 61fc f 0 __crtLCMapStringA_stat -FUNC 6328 14 0 __crtLCMapStringA_stat -FUNC 63a0 c 0 __crtLCMapStringA_stat -FUNC 6404 6 0 __crtLCMapStringA_stat -FUNC 65e8 28 0 __crtLCMapStringA_stat -FUNC 6624 10 0 __crtLCMapStringA_stat -FUNC 6ad4 16 0 __crtLCMapStringA_stat -FUNC 6d80 e 0 __crtLCMapStringA_stat -FUNC 6eb4 3 0 __crtLCMapStringA_stat -FUNC 6f10 f 0 __crtLCMapStringA_stat +FUNC 1000 7 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 11b0 14 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 17c4 8 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 1ac4 6 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 21f4 c 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 2234 9 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 2354 f 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 242c 12 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 2710 3 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 2794 b 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 28d0 13 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 31f8 5 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 327c 14 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 32c0 4a 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 336c 20 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 36f8 f 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 37e0 10 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 3c30 1 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 3f94 e 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 4300 14 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 4338 11 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 497c 16 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 4b10 15 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 4c70 14 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 4ce8 10 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 4db4 1e 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 4e68 12 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 54e8 3 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 5574 14 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 55d0 2 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 55f8 8 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 5628 8 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 578c 3 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 5838 24 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 58f4 c 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 5f44 7 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 61fc f 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 6328 14 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 63a0 c 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 6404 6 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 65e8 28 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 6624 10 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 6ad4 16 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 6d80 e 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 6eb4 3 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) +FUNC 6f10 f 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) 65e8 12 96 3447 65fa 16 101 3447 2354 f 102 3447 @@ -3307,24 +3307,24 @@ 3c24 7 271 3447 611f 34 271 3447 3204 2 272 3447 -FUNC 1198 3 0 __crtGetStringTypeA_stat -FUNC 17b4 e 0 __crtGetStringTypeA_stat -FUNC 19ac 2 0 __crtGetStringTypeA_stat -FUNC 24a4 14 0 __crtGetStringTypeA_stat -FUNC 3318 33 0 __crtGetStringTypeA_stat -FUNC 357c 2b 0 __crtGetStringTypeA_stat -FUNC 43c4 b 0 __crtGetStringTypeA_stat -FUNC 4624 14 0 __crtGetStringTypeA_stat -FUNC 4d9c 11 0 __crtGetStringTypeA_stat -FUNC 5094 a 0 __crtGetStringTypeA_stat -FUNC 5b4c 12 0 __crtGetStringTypeA_stat -FUNC 5efc c 0 __crtGetStringTypeA_stat -FUNC 5f38 6 0 __crtGetStringTypeA_stat -FUNC 6420 c 0 __crtGetStringTypeA_stat -FUNC 68c0 14 0 __crtGetStringTypeA_stat -FUNC 6910 12 0 __crtGetStringTypeA_stat -FUNC 6bf0 28 0 __crtGetStringTypeA_stat -FUNC 6c20 8 0 __crtGetStringTypeA_stat +FUNC 1198 3 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 17b4 e 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 19ac 2 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 24a4 14 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 3318 33 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 357c 2b 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 43c4 b 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 4624 14 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 4d9c 11 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 5094 a 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 5b4c 12 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 5efc c 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 5f38 6 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 6420 c 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 68c0 14 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 6910 12 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 6bf0 28 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) +FUNC 6c20 8 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) 6bf0 12 63 3507 6c02 7 67 3507 6c09 f 83 3507 diff -Nru google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym --- google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym 2019-03-26 03:56:45.000000000 +0000 @@ -290,7 +290,7 @@ 4211 f 62 1 4220 12 64 1 4232 4 65 1 -FUNC 4242 a 0 google_breakpad::i +FUNC 4242 a 0 static int google_breakpad::i() 4242 3 51 1 4245 5 52 1 424a 2 53 1 @@ -316,14 +316,14 @@ 2307 5 20 2875 230c 1 24 2875 230d 5 23 2875 -FUNC 3238 29 0 fast_error_exit +FUNC 3238 29 0 static void fast_error_exit(int) 3238 5 326 4250 323d 9 335 4250 3246 5 337 4250 324b 8 339 4250 3253 c 340 4250 325f 2 341 4250 -FUNC 32ed 161 0 __tmainCRTStartup +FUNC 32ed 161 0 static int __tmainCRTStartup() 32ed c 196 4250 32f9 a 214 4250 3303 b 216 4250 @@ -505,7 +505,7 @@ 1506 c 303 4186 1512 2 307 4186 1514 2 308 4186 -FUNC 4504 140 0 doexit +FUNC 4504 140 0 static void doexit(int, int, int) 4504 c 489 4186 4510 8 507 4186 4518 4 508 4186 @@ -675,7 +675,7 @@ 261f 7 130 3838 2626 5 131 3838 262b d 133 3838 -FUNC 54b7 19a 0 parse_cmdline +FUNC 54b7 19a 0 static void parse_cmdline(char *, char * *, char *, int *, int *) 54b7 6 221 3891 54bd 9 229 3891 54c6 2 232 3891 @@ -1194,7 +1194,7 @@ 23a1 3 113 504 23a4 2 122 504 FUNC 43b2 90 0 _local_unwind4 -FUNC 4442 46 0 _unwind_handler4 +FUNC 4442 46 0 static void _unwind_handler4() FUNC 4488 1c 4 _seh_longjmp_unwind4 FUNC 44a4 17 0 _EH4_CallFilterFunc FUNC 44bb 19 0 _EH4_TransferToHandler @@ -1242,7 +1242,7 @@ 216c 5 60 2311 2171 5 61 2311 2176 2 62 2311 -FUNC 24f8 37 0 siglookup +FUNC 24f8 37 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) 24f8 5 629 2311 24fd a 630 2311 2507 14 639 2311 @@ -1328,7 +1328,7 @@ 4666 2 139 2820 4668 2 136 2820 466a 2 139 2820 -FUNC 4c24 b6 0 _onexit_nolock +FUNC 4c24 b6 0 static * _onexit_nolock( *) 4c24 8 100 1969 4c2c f 103 1969 4c3b f 104 1969 @@ -1535,7 +1535,7 @@ 4e7c 5 79 333 4e81 4 82 333 4e85 2 83 333 -FUNC 2bc5 2f 0 CPtoLCID +FUNC 2bc5 2f 0 static int CPtoLCID(int) 2bc5 0 329 3326 2bc5 14 330 3326 2bd9 2 345 3326 @@ -1548,7 +1548,7 @@ 2bed 1 346 3326 2bee 5 333 3326 2bf3 1 346 3326 -FUNC 1f3c 64 0 setSBCS +FUNC 1f3c 64 0 static void setSBCS(struct threadmbcinfostruct *) 1f3c 6 363 3326 1f42 11 368 3326 1f53 1b 379 3326 @@ -1557,7 +1557,7 @@ 1f89 b 384 3326 1f94 9 385 3326 1f9d 3 386 3326 -FUNC 466c 190 0 setSBUpLow +FUNC 466c 190 0 static void setSBUpLow(struct threadmbcinfostruct *) 466c 17 402 3326 4683 10 412 3326 4693 f 415 3326 @@ -1623,7 +1623,7 @@ 496d 2 255 111 496f a 257 111 4979 7 259 111 -FUNC 10e5 7c 0 getSystemCP +FUNC 10e5 7c 0 static int getSystemCP(int) 10e5 9 282 3326 10ee b 284 3326 10f9 6 285 3326 @@ -1734,7 +1734,7 @@ 1ce4 a 853 3326 1cee 2 858 3326 1cf0 1 859 3326 -FUNC 2638 53 0 x_ismbbtype_l +FUNC 2638 53 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) 2638 8 213 3271 2640 b 214 3271 264b 4 219 3271 @@ -1953,12 +1953,12 @@ 12b4 1 180 2806 12b5 3 182 2806 FUNC 28d7 20 0 _global_unwind2 -FUNC 28f7 45 0 __unwind_handler +FUNC 28f7 45 0 static void __unwind_handler() FUNC 293c 84 0 _local_unwind2 FUNC 29c0 23 0 _abnormal_termination FUNC 29e3 9 0 _NLG_Notify1 FUNC 29ec 1f 0 _NLG_Notify -PUBLIC 2a03 0 _NLG_Dispatch2 +PUBLIC m 2a03 0 _NLG_Dispatch FUNC 2a0b 3 0 _NLG_Call PUBLIC 2a0d 0 _NLG_Return2 FUNC 2862 33 0 abort @@ -2301,7 +2301,7 @@ 50f8 2 112 618 50fa 16 103 618 5110 4 105 618 -FUNC 1904 1e7 0 __crtLCMapStringA_stat +FUNC 1904 1e7 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) 1904 12 96 3447 1916 c 101 3447 1922 17 102 3447 @@ -2338,7 +2338,7 @@ 22ab b 259 3447 22b6 31 271 3447 22e7 2 272 3447 -FUNC 47fc e7 0 __crtGetStringTypeA_stat +FUNC 47fc e7 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) 47fc 12 63 3507 480e 7 67 3507 4815 5 83 3507 diff -Nru google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym --- google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym 2019-03-26 03:56:45.000000000 +0000 @@ -290,7 +290,7 @@ 102f f 62 1 103e 12 64 1 1050 4 65 1 -FUNC 1060 a 0 google_breakpad::i +FUNC 1060 a 0 static int google_breakpad::i() 1060 3 51 1 1063 5 52 1 1068 2 53 1 @@ -316,14 +316,14 @@ 1197 5 20 2875 119c 1 24 2875 119d 5 23 2875 -FUNC 11a2 29 0 fast_error_exit +FUNC 11a2 29 0 static void fast_error_exit(int) 11a2 5 326 4250 11a7 9 335 4250 11b0 5 337 4250 11b5 8 339 4250 11bd c 340 4250 11c9 2 341 4250 -FUNC 11cb 161 0 __tmainCRTStartup +FUNC 11cb 161 0 static int __tmainCRTStartup() 11cb c 196 4250 11d7 a 214 4250 11e1 b 216 4250 @@ -505,7 +505,7 @@ 1631 c 303 4186 163d 2 307 4186 163f 2 308 4186 -FUNC 1641 140 0 doexit +FUNC 1641 140 0 static void doexit(int, int, int) 1641 c 489 4186 164d 8 507 4186 1655 4 508 4186 @@ -675,7 +675,7 @@ 1d21 7 130 3838 1d28 5 131 3838 1d2d d 133 3838 -FUNC 1d3a 309 0 parse_cmdline +FUNC 1d3a 309 0 static void parse_cmdline(char *, char * *, char *, int *, int *) 1d3a 6 221 3891 1d40 13 229 3891 1d53 2 232 3891 @@ -1194,7 +1194,7 @@ 33bd 3 113 504 33c0 2 122 504 FUNC 33c2 90 0 _local_unwind4 -FUNC 3452 46 0 _unwind_handler4 +FUNC 3452 46 0 static void _unwind_handler4() FUNC 3498 1c 4 _seh_longjmp_unwind4 FUNC 34b4 17 0 _EH4_CallFilterFunc FUNC 34cb 19 0 _EH4_TransferToHandler @@ -1242,7 +1242,7 @@ 35c5 5 60 2311 35ca 5 61 2311 35cf 2 62 2311 -FUNC 35d1 4b 0 siglookup +FUNC 35d1 4b 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) 35d1 5 629 2311 35d6 a 630 2311 35e0 1e 639 2311 @@ -1328,7 +1328,7 @@ 381b 2 139 2820 381d 2 136 2820 381f 2 139 2820 -FUNC 3821 c0 0 _onexit_nolock +FUNC 3821 c0 0 static * _onexit_nolock( *) 3821 8 100 1969 3829 f 103 1969 3838 f 104 1969 @@ -1535,7 +1535,7 @@ 407b 5 79 333 4080 4 82 333 4084 2 83 333 -FUNC 4086 2f 0 CPtoLCID +FUNC 4086 2f 0 static int CPtoLCID(int) 4086 0 329 3326 4086 14 330 3326 409a 2 345 3326 @@ -1548,7 +1548,7 @@ 40ae 1 346 3326 40af 5 333 3326 40b4 1 346 3326 -FUNC 40b5 be 0 setSBCS +FUNC 40b5 be 0 static void setSBCS(struct threadmbcinfostruct *) 40b5 6 363 3326 40bb 11 368 3326 40cc 4b 379 3326 @@ -1557,7 +1557,7 @@ 4147 b 384 3326 4152 1e 385 3326 4170 3 386 3326 -FUNC 4173 246 0 setSBUpLow +FUNC 4173 246 0 static void setSBUpLow(struct threadmbcinfostruct *) 4173 17 402 3326 418a 1a 412 3326 41a4 f 415 3326 @@ -1623,7 +1623,7 @@ 457f 2 255 111 4581 32 257 111 45b3 7 259 111 -FUNC 45ba 9a 0 getSystemCP +FUNC 45ba 9a 0 static int getSystemCP(int) 45ba 9 282 3326 45c3 b 284 3326 45ce 6 285 3326 @@ -1734,7 +1734,7 @@ 4ad1 a 853 3326 4adb 2 858 3326 4add 1 859 3326 -FUNC 4ade 80 0 x_ismbbtype_l +FUNC 4ade 80 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) 4ade 8 213 3271 4ae6 b 214 3271 4af1 4 219 3271 @@ -1953,12 +1953,12 @@ 51fa 1 180 2806 51fb 3 182 2806 FUNC 51fe 20 0 _global_unwind2 -FUNC 521e 45 0 __unwind_handler +FUNC 521e 45 0 static void __unwind_handler() FUNC 5263 84 0 _local_unwind2 FUNC 52e7 23 0 _abnormal_termination FUNC 530a 9 0 _NLG_Notify1 FUNC 5313 1f 0 _NLG_Notify -PUBLIC 532a 0 _NLG_Dispatch2 +PUBLIC m 532a 0 _NLG_Dispatch FUNC 5332 3 0 _NLG_Call PUBLIC 5334 0 _NLG_Return2 FUNC 5335 33 0 abort @@ -2301,7 +2301,7 @@ 5984 2 112 618 5986 20 103 618 59a6 4 105 618 -FUNC 59aa 22d 0 __crtLCMapStringA_stat +FUNC 59aa 22d 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) 59aa 12 96 3447 59bc c 101 3447 59c8 21 102 3447 @@ -2338,7 +2338,7 @@ 5bdf b 259 3447 5bea 3b 271 3447 5c25 2 272 3447 -FUNC 5c27 112 0 __crtGetStringTypeA_stat +FUNC 5c27 112 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) 5c27 12 63 3507 5c39 7 67 3507 5c40 5 83 3507 diff -Nru google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_stretched.sym google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_stretched.sym --- google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_stretched.sym 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/src/tools/windows/dump_syms/testdata/omap_stretched.sym 2019-03-26 03:56:45.000000000 +0000 @@ -290,7 +290,7 @@ 102f f 62 1 103e 12 64 1 1050 4 65 1 -FUNC 1060 a 0 google_breakpad::i +FUNC 1060 a 0 static int google_breakpad::i() 1060 3 51 1 1063 5 52 1 1068 2 53 1 @@ -320,14 +320,14 @@ 1197 5 20 2875 119c 1 24 2875 119d 5 23 2875 -FUNC 11a2 29 0 fast_error_exit +FUNC 11a2 29 0 static void fast_error_exit(int) 11a2 5 326 4250 11a7 9 335 4250 11b0 5 337 4250 11b5 8 339 4250 11bd c 340 4250 11c9 2 341 4250 -FUNC 11cb 161 0 __tmainCRTStartup +FUNC 11cb 161 0 static int __tmainCRTStartup() 11cb c 196 4250 11d7 a 214 4250 11e1 b 216 4250 @@ -511,7 +511,7 @@ 1631 c 303 4186 163d 2 307 4186 163f 2 308 4186 -FUNC 1641 140 0 doexit +FUNC 1641 140 0 static void doexit(int, int, int) 1641 c 489 4186 164d 8 507 4186 1655 4 508 4186 @@ -684,9 +684,9 @@ 1d21 7 130 3838 1d28 5 131 3838 1d2d d 133 3838 -FUNC 1d3a 2ee 0 parse_cmdline -FUNC 2032 3 0 parse_cmdline -FUNC 203f 4 0 parse_cmdline +FUNC 1d3a 2ee 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 2032 3 0 static void parse_cmdline(char *, char * *, char *, int *, int *) +FUNC 203f 4 0 static void parse_cmdline(char *, char * *, char *, int *, int *) 1d3a 6 221 3891 1d40 7 229 3891 1d51 2 229 3891 @@ -1237,7 +1237,7 @@ 33bd 3 113 504 33c0 2 122 504 FUNC 33c2 90 0 _local_unwind4 -FUNC 3452 46 0 _unwind_handler4 +FUNC 3452 46 0 static void _unwind_handler4() FUNC 3498 1c 4 _seh_longjmp_unwind4 FUNC 34b4 17 0 _EH4_CallFilterFunc FUNC 34cb 19 0 _EH4_TransferToHandler @@ -1285,8 +1285,8 @@ 35c5 5 60 2311 35ca 5 61 2311 35cf 2 62 2311 -FUNC 35d1 38 0 siglookup -FUNC 3613 9 0 siglookup +FUNC 35d1 38 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) +FUNC 3613 9 0 static struct _XCPT_ACTION * siglookup(int, struct _XCPT_ACTION *) 35d1 5 629 2311 35d6 a 630 2311 35ea 14 639 2311 @@ -1373,7 +1373,7 @@ 381b 2 139 2820 381d 2 136 2820 381f 2 139 2820 -FUNC 3821 c0 0 _onexit_nolock +FUNC 3821 c0 0 static * _onexit_nolock( *) 3821 8 100 1969 3829 f 103 1969 3838 f 104 1969 @@ -1599,7 +1599,7 @@ 407b 5 79 333 4080 4 82 333 4084 2 83 333 -FUNC 4086 2f 0 CPtoLCID +FUNC 4086 2f 0 static int CPtoLCID(int) 4086 0 329 3326 4086 14 330 3326 409a 2 345 3326 @@ -1612,8 +1612,8 @@ 40ae 1 346 3326 40af 5 333 3326 40b4 1 346 3326 -FUNC 40b5 ab 0 setSBCS -FUNC 416a 9 0 setSBCS +FUNC 40b5 ab 0 static void setSBCS(struct threadmbcinfostruct *) +FUNC 416a 9 0 static void setSBCS(struct threadmbcinfostruct *) 40b5 6 363 3326 40bb 11 368 3326 40cc 36 379 3326 @@ -1627,7 +1627,7 @@ 415d 3 385 3326 416a 6 385 3326 4170 3 386 3326 -FUNC 4173 246 0 setSBUpLow +FUNC 4173 246 0 static void setSBUpLow(struct threadmbcinfostruct *) 4173 17 402 3326 418a 7 412 3326 419b 9 412 3326 @@ -1706,8 +1706,8 @@ 45a3 3 257 111 45b0 3 257 111 45b3 7 259 111 -FUNC 45ba 87 0 getSystemCP -FUNC 464b 9 0 getSystemCP +FUNC 45ba 87 0 static int getSystemCP(int) +FUNC 464b 9 0 static int getSystemCP(int) 45ba 9 282 3326 45c3 b 284 3326 45ce 6 285 3326 @@ -1828,8 +1828,8 @@ 4ad1 a 853 3326 4adb 2 858 3326 4add 1 859 3326 -FUNC 4ade 70 0 x_ismbbtype_l -FUNC 4b58 6 0 x_ismbbtype_l +FUNC 4ade 70 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) +FUNC 4b58 6 0 static int x_ismbbtype_l(struct localeinfo_struct *, unsigned int, int, int) 4ade 8 213 3271 4ae6 b 214 3271 4af1 4 219 3271 @@ -2062,12 +2062,12 @@ 51fa 1 180 2806 51fb 3 182 2806 FUNC 51fe 20 0 _global_unwind2 -FUNC 521e 45 0 __unwind_handler +FUNC 521e 45 0 static void __unwind_handler() FUNC 5263 84 0 _local_unwind2 FUNC 52e7 23 0 _abnormal_termination FUNC 530a 9 0 _NLG_Notify1 FUNC 5313 1f 0 _NLG_Notify -PUBLIC 532a 0 _NLG_Dispatch2 +PUBLIC m 532a 0 _NLG_Dispatch FUNC 5332 3 0 _NLG_Call PUBLIC 5334 0 _NLG_Return2 FUNC 5335 33 0 abort @@ -2416,7 +2416,7 @@ 5986 14 103 618 59a4 2 103 618 59a6 4 105 618 -FUNC 59aa 22d 0 __crtLCMapStringA_stat +FUNC 59aa 22d 0 static int __crtLCMapStringA_stat(struct localeinfo_struct *, unsigned long, unsigned long, const char *, int, char *, int, int, int) 59aa 12 96 3447 59bc c 101 3447 59c8 21 102 3447 @@ -2457,7 +2457,7 @@ 5bea 2d 271 3447 5c21 4 271 3447 5c25 2 272 3447 -FUNC 5c27 112 0 __crtGetStringTypeA_stat +FUNC 5c27 112 0 static int __crtGetStringTypeA_stat(struct localeinfo_struct *, unsigned long, const char *, int, unsigned short *, int, int, int) 5c27 12 63 3507 5c39 7 67 3507 5c40 5 83 3507 diff -Nru google-breakpad-0.1.0/.travis.yml google-breakpad-0.1.0/.travis.yml --- google-breakpad-0.1.0/.travis.yml 2018-06-17 12:40:17.000000000 +0000 +++ google-breakpad-0.1.0/.travis.yml 2019-03-26 03:56:45.000000000 +0000 @@ -2,6 +2,8 @@ # https://docs.travis-ci.com/ language: cpp +sudo: required + addons: apt: sources: