google-breakpad: Merge with upstream breakpad r1356
BUG=None
TEST=Tested the following on x86-alex (x86), peppy (amd64), daisy_spring (arm):
1. `FEATURES=test emerge-${BOARD} google-breakpad`
2. `USE='asan clang' FEATURES=test emerge-${BOARD} google-breakpad`
3. Run the following autotest tests:
- logging_CrashSender
- logging_UserCrash
Change-Id: Idb4f206ff22c14f1f910986657a6aaf003811ddf
diff --git a/.gitignore b/.gitignore
index b8b50fc..ee33755 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-# Copyright 2014, Google Inc. All rights reserved.
+# Copyright 2014 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
@@ -30,6 +30,7 @@
*.filters
*.sdf
*.sln
+*.suo
*.vcproj
*.vcxproj
diff --git a/DEPS b/DEPS
index b395368..b63afa6 100644
--- a/DEPS
+++ b/DEPS
@@ -1,4 +1,4 @@
-# Copyright 2010, Google Inc. All rights reserved.
+# Copyright 2010 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
diff --git a/Makefile.am b/Makefile.am
index 3198ad5..b052975 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -463,6 +463,7 @@
src/common/dwarf/bytereader.cc \
src/common/dwarf/dwarf2diehandler.cc \
src/common/dwarf/dwarf2reader.cc \
+ src/common/linux/crc32.cc \
src/common/linux/dump_symbols.cc \
src/common/linux/elf_symbols_to_module.cc \
src/common/linux/elfutils.cc \
@@ -507,6 +508,7 @@
src/common/dwarf/dwarf2reader.cc \
src/common/dwarf/dwarf2reader_cfi_unittest.cc \
src/common/dwarf/dwarf2reader_die_unittest.cc \
+ src/common/linux/crc32.cc \
src/common/linux/dump_symbols.cc \
src/common/linux/dump_symbols_unittest.cc \
src/common/linux/elf_core_dump.cc \
@@ -1126,6 +1128,7 @@
src/client/windows/sender/crash_report_sender.vcproj \
src/common/convert_UTF.c \
src/common/convert_UTF.h \
+ src/common/linux/crc32.cc \
src/common/linux/dump_symbols.cc \
src/common/linux/dump_symbols.h \
src/common/linux/elf_symbols_to_module.cc \
diff --git a/Makefile.in b/Makefile.in
index 5896e20..80712d0 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -48,6 +48,23 @@
VPATH = @srcdir@
+am__make_dryrun = \
+ { \
+ am__dry=no; \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \
+ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \
+ *) \
+ for am__flg in $$MAKEFLAGS; do \
+ case $$am__flg in \
+ *=*|--*) ;; \
+ *n*) am__dry=yes; break;; \
+ esac; \
+ done;; \
+ esac; \
+ test $$am__dry = yes; \
+ }
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
@@ -563,7 +580,7 @@
src/common/dwarf/dwarf2reader.cc \
src/common/dwarf/dwarf2reader_cfi_unittest.cc \
src/common/dwarf/dwarf2reader_die_unittest.cc \
- src/common/linux/dump_symbols.cc \
+ src/common/linux/crc32.cc src/common/linux/dump_symbols.cc \
src/common/linux/dump_symbols_unittest.cc \
src/common/linux/elf_core_dump.cc \
src/common/linux/elf_core_dump_unittest.cc \
@@ -607,6 +624,7 @@
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/src_common_dumper_unittest-dwarf2reader.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/src_common_dumper_unittest-dwarf2reader_cfi_unittest.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/src_common_dumper_unittest-dwarf2reader_die_unittest.$(OBJEXT) \
+@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/src_common_dumper_unittest-crc32.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/src_common_dumper_unittest-dump_symbols.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/src_common_dumper_unittest-dump_symbols_unittest.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/src_common_dumper_unittest-elf_core_dump.$(OBJEXT) \
@@ -1164,7 +1182,7 @@
src/common/module.cc src/common/stabs_reader.cc \
src/common/stabs_to_module.cc src/common/dwarf/bytereader.cc \
src/common/dwarf/dwarf2diehandler.cc \
- src/common/dwarf/dwarf2reader.cc \
+ src/common/dwarf/dwarf2reader.cc src/common/linux/crc32.cc \
src/common/linux/dump_symbols.cc \
src/common/linux/elf_symbols_to_module.cc \
src/common/linux/elfutils.cc src/common/linux/file_id.cc \
@@ -1182,6 +1200,7 @@
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2diehandler.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader.$(OBJEXT) \
+@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/crc32.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dump_symbols.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_symbols_to_module.$(OBJEXT) \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elfutils.$(OBJEXT) \
@@ -1331,6 +1350,11 @@
$(am__src_tools_linux_md2core_minidump_2_core_unittest_SOURCES_DIST) \
$(am__src_tools_linux_symupload_minidump_upload_SOURCES_DIST) \
$(am__src_tools_linux_symupload_sym_upload_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
DATA = $(dist_doc_DATA)
ETAGS = etags
CTAGS = ctags
@@ -1732,6 +1756,7 @@
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/bytereader.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2diehandler.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader.cc \
+@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/crc32.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dump_symbols.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_symbols_to_module.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elfutils.cc \
@@ -1776,6 +1801,7 @@
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader_cfi_unittest.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/dwarf/dwarf2reader_die_unittest.cc \
+@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/crc32.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dump_symbols.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/dump_symbols_unittest.cc \
@DISABLE_TOOLS_FALSE@@LINUX_HOST_TRUE@ src/common/linux/elf_core_dump.cc \
@@ -2430,6 +2456,7 @@
src/client/windows/sender/crash_report_sender.vcproj \
src/common/convert_UTF.c \
src/common/convert_UTF.h \
+ src/common/linux/crc32.cc \
src/common/linux/dump_symbols.cc \
src/common/linux/dump_symbols.h \
src/common/linux/elf_symbols_to_module.cc \
@@ -2575,7 +2602,6 @@
-rm -f src/config.h src/stamp-h1
install-libLIBRARIES: $(lib_LIBRARIES)
@$(NORMAL_INSTALL)
- test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
list2=; for p in $$list; do \
if test -f $$p; then \
@@ -2583,6 +2609,8 @@
else :; fi; \
done; \
test -z "$$list2" || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
echo " $(INSTALL_DATA) $$list2 '$(DESTDIR)$(libdir)'"; \
$(INSTALL_DATA) $$list2 "$(DESTDIR)$(libdir)" || exit $$?; }
@$(POST_INSTALL)
@@ -2866,8 +2894,11 @@
$(RANLIB) src/third_party/libdisasm/libdisasm.a
install-binPROGRAMS: $(bin_PROGRAMS)
@$(NORMAL_INSTALL)
- test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
for p in $$list; do echo "$$p $$p"; done | \
sed 's/$(EXEEXT)$$//' | \
while read p p1; do if test -f $$p; \
@@ -3093,6 +3124,9 @@
src/common/dwarf/src_common_dumper_unittest-dwarf2reader_die_unittest.$(OBJEXT): \
src/common/dwarf/$(am__dirstamp) \
src/common/dwarf/$(DEPDIR)/$(am__dirstamp)
+src/common/linux/src_common_dumper_unittest-crc32.$(OBJEXT): \
+ src/common/linux/$(am__dirstamp) \
+ src/common/linux/$(DEPDIR)/$(am__dirstamp)
src/common/linux/src_common_dumper_unittest-dump_symbols.$(OBJEXT): \
src/common/linux/$(am__dirstamp) \
src/common/linux/$(DEPDIR)/$(am__dirstamp)
@@ -3568,6 +3602,8 @@
src/common/dwarf/dwarf2reader.$(OBJEXT): \
src/common/dwarf/$(am__dirstamp) \
src/common/dwarf/$(DEPDIR)/$(am__dirstamp)
+src/common/linux/crc32.$(OBJEXT): src/common/linux/$(am__dirstamp) \
+ src/common/linux/$(DEPDIR)/$(am__dirstamp)
src/common/linux/dump_symbols.$(OBJEXT): \
src/common/linux/$(am__dirstamp) \
src/common/linux/$(DEPDIR)/$(am__dirstamp)
@@ -3677,6 +3713,7 @@
-rm -f src/common/dwarf_cu_to_module.$(OBJEXT)
-rm -f src/common/dwarf_line_to_module.$(OBJEXT)
-rm -f src/common/language.$(OBJEXT)
+ -rm -f src/common/linux/crc32.$(OBJEXT)
-rm -f src/common/linux/dump_symbols.$(OBJEXT)
-rm -f src/common/linux/elf_core_dump.$(OBJEXT)
-rm -f src/common/linux/elf_symbols_to_module.$(OBJEXT)
@@ -3689,6 +3726,7 @@
-rm -f src/common/linux/safe_readlink.$(OBJEXT)
-rm -f src/common/linux/src_client_linux_linux_client_unittest_shlib-elf_core_dump.$(OBJEXT)
-rm -f src/common/linux/src_client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.$(OBJEXT)
+ -rm -f src/common/linux/src_common_dumper_unittest-crc32.$(OBJEXT)
-rm -f src/common/linux/src_common_dumper_unittest-dump_symbols.$(OBJEXT)
-rm -f src/common/linux/src_common_dumper_unittest-dump_symbols_unittest.$(OBJEXT)
-rm -f src/common/linux/src_common_dumper_unittest-elf_core_dump.$(OBJEXT)
@@ -3966,6 +4004,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/src_common_dumper_unittest-dwarf2reader.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/src_common_dumper_unittest-dwarf2reader_cfi_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/dwarf/$(DEPDIR)/src_common_dumper_unittest-dwarf2reader_die_unittest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/crc32.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/dump_symbols.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/elf_core_dump.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/elf_symbols_to_module.Po@am__quote@
@@ -3978,6 +4017,7 @@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/safe_readlink.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-elf_core_dump.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/src_client_linux_linux_client_unittest_shlib-linux_libc_support_unittest.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/src_common_dumper_unittest-crc32.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/src_common_dumper_unittest-dump_symbols.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/src_common_dumper_unittest-dump_symbols_unittest.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/common/linux/$(DEPDIR)/src_common_dumper_unittest-elf_core_dump.Po@am__quote@
@@ -4882,6 +4922,20 @@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/dwarf/src_common_dumper_unittest-dwarf2reader_die_unittest.obj `if test -f 'src/common/dwarf/dwarf2reader_die_unittest.cc'; then $(CYGPATH_W) 'src/common/dwarf/dwarf2reader_die_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/dwarf/dwarf2reader_die_unittest.cc'; fi`
+src/common/linux/src_common_dumper_unittest-crc32.o: src/common/linux/crc32.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/src_common_dumper_unittest-crc32.o -MD -MP -MF src/common/linux/$(DEPDIR)/src_common_dumper_unittest-crc32.Tpo -c -o src/common/linux/src_common_dumper_unittest-crc32.o `test -f 'src/common/linux/crc32.cc' || echo '$(srcdir)/'`src/common/linux/crc32.cc
+@am__fastdepCXX_TRUE@ $(am__mv) src/common/linux/$(DEPDIR)/src_common_dumper_unittest-crc32.Tpo src/common/linux/$(DEPDIR)/src_common_dumper_unittest-crc32.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/common/linux/crc32.cc' object='src/common/linux/src_common_dumper_unittest-crc32.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/src_common_dumper_unittest-crc32.o `test -f 'src/common/linux/crc32.cc' || echo '$(srcdir)/'`src/common/linux/crc32.cc
+
+src/common/linux/src_common_dumper_unittest-crc32.obj: src/common/linux/crc32.cc
+@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/src_common_dumper_unittest-crc32.obj -MD -MP -MF src/common/linux/$(DEPDIR)/src_common_dumper_unittest-crc32.Tpo -c -o src/common/linux/src_common_dumper_unittest-crc32.obj `if test -f 'src/common/linux/crc32.cc'; then $(CYGPATH_W) 'src/common/linux/crc32.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/crc32.cc'; fi`
+@am__fastdepCXX_TRUE@ $(am__mv) src/common/linux/$(DEPDIR)/src_common_dumper_unittest-crc32.Tpo src/common/linux/$(DEPDIR)/src_common_dumper_unittest-crc32.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='src/common/linux/crc32.cc' object='src/common/linux/src_common_dumper_unittest-crc32.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/common/linux/src_common_dumper_unittest-crc32.obj `if test -f 'src/common/linux/crc32.cc'; then $(CYGPATH_W) 'src/common/linux/crc32.cc'; else $(CYGPATH_W) '$(srcdir)/src/common/linux/crc32.cc'; fi`
+
src/common/linux/src_common_dumper_unittest-dump_symbols.o: src/common/linux/dump_symbols.cc
@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_common_dumper_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/common/linux/src_common_dumper_unittest-dump_symbols.o -MD -MP -MF src/common/linux/$(DEPDIR)/src_common_dumper_unittest-dump_symbols.Tpo -c -o src/common/linux/src_common_dumper_unittest-dump_symbols.o `test -f 'src/common/linux/dump_symbols.cc' || echo '$(srcdir)/'`src/common/linux/dump_symbols.cc
@am__fastdepCXX_TRUE@ $(am__mv) src/common/linux/$(DEPDIR)/src_common_dumper_unittest-dump_symbols.Tpo src/common/linux/$(DEPDIR)/src_common_dumper_unittest-dump_symbols.Po
@@ -6437,8 +6491,11 @@
@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_tools_linux_md2core_minidump_2_core_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/tools/linux/md2core/src_tools_linux_md2core_minidump_2_core_unittest-minidump_memory_range_unittest.obj `if test -f 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; then $(CYGPATH_W) 'src/tools/linux/md2core/minidump_memory_range_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/tools/linux/md2core/minidump_memory_range_unittest.cc'; fi`
install-dist_docDATA: $(dist_doc_DATA)
@$(NORMAL_INSTALL)
- test -z "$(docdir)" || $(MKDIR_P) "$(DESTDIR)$(docdir)"
@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \
+ fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
@@ -6697,7 +6754,7 @@
*.zip*) \
unzip $(distdir).zip ;;\
esac
- chmod -R a-w $(distdir); chmod a+w $(distdir)
+ chmod -R a-w $(distdir); chmod u+w $(distdir)
mkdir $(distdir)/_build
mkdir $(distdir)/_inst
chmod a-w $(distdir)
diff --git a/aclocal.m4 b/aclocal.m4
index 8b91572..d5e3cb3 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.6 -*- Autoconf -*-
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
@@ -14,8 +14,8 @@
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
-[m4_warning([this file was generated for autoconf 2.68.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,
+[m4_warning([this file was generated for autoconf 2.69.
You have another version of autoconf. It may work, but is not guaranteed to.
If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically `autoreconf'.])])
@@ -38,7 +38,7 @@
[am__api_version='1.11'
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.11.3], [],
+m4_if([$1], [1.11.6], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -54,7 +54,7 @@
# 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.11.3])dnl
+[AM_AUTOMAKE_VERSION([1.11.6])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -637,17 +637,20 @@
# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
# From Jim Meyering
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
+# 2011 Free Software Foundation, Inc.
#
# This file is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
+# serial 5
+
# AM_MAINTAINER_MODE([DEFAULT-MODE])
# ----------------------------------
# Control maintainer-specific portions of Makefiles.
-# Default is to disable them, unless 'enable' is passed literally.
-# For symmetry, 'disable' may be passed as well. Anyway, the user
+# Default is to disable them, unless `enable' is passed literally.
+# For symmetry, `disable' may be passed as well. Anyway, the user
# can override the default with the --enable/--disable switch.
AC_DEFUN([AM_MAINTAINER_MODE],
[m4_case(m4_default([$1], [disable]),
@@ -658,11 +661,10 @@
AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
dnl maintainer-mode's default is 'disable' unless 'enable' is passed
AC_ARG_ENABLE([maintainer-mode],
- [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
- am_maintainer_other[ make rules and dependencies not useful
- (and sometimes confusing) to the casual installer])],
- [USE_MAINTAINER_MODE=$enableval],
- [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+[ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
AC_MSG_RESULT([$USE_MAINTAINER_MODE])
AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
MAINT=$MAINTAINER_MODE_TRUE
@@ -670,6 +672,8 @@
]
)
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
# Check to see how 'make' treats includes. -*- Autoconf -*-
# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc.
diff --git a/configure b/configure
index e695730..ff6d249 100755
--- a/configure
+++ b/configure
@@ -1,13 +1,11 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for breakpad 0.1.
+# Generated by GNU Autoconf 2.69 for breakpad 0.1.
#
# Report bugs to <google-breakpad-dev@googlegroups.com>.
#
#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -136,6 +134,31 @@
# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+as_fn_exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
emulate sh
@@ -169,7 +192,8 @@
else
exitcode=1; echo positional parameters were not saved.
fi
-test x\$exitcode = x0 || exit 1"
+test x\$exitcode = x0 || exit 1
+test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
@@ -214,21 +238,25 @@
if test "x$CONFIG_SHELL" != x; then :
- # We cannot yet assume a decent shell, so we have to provide a
- # neutralization value for shells without unset; and this also
- # works around shells that cannot unset nonexistent variables.
- # Preserve -v and -x to the replacement shell.
- BASH_ENV=/dev/null
- ENV=/dev/null
- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
- export CONFIG_SHELL
- case $- in # ((((
- *v*x* | *x*v* ) as_opts=-vx ;;
- *v* ) as_opts=-v ;;
- *x* ) as_opts=-x ;;
- * ) as_opts= ;;
- esac
- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
if test x$as_have_required = xno; then :
@@ -331,6 +359,14 @@
} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
@@ -452,6 +488,10 @@
chmod +x "$as_me.lineno" ||
{ $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
# Don't try to exec as it changes $[0], causing all sort of problems
# (the dirname of $[0] is not the place where we might find the
# original and so on. Autoconf is especially sensitive to this).
@@ -486,16 +526,16 @@
# ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
+ # In both cases, we have to default to `cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
@@ -507,28 +547,8 @@
as_mkdir_p=false
fi
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in #(
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -1212,8 +1232,6 @@
if test "x$host_alias" != x; then
if test "x$build_alias" = x; then
cross_compiling=maybe
- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
- If a cross compiler is detected then cross compile mode will be used" >&2
elif test "x$build_alias" != "x$host_alias"; then
cross_compiling=yes
fi
@@ -1377,9 +1395,8 @@
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --enable-maintainer-mode
- enable make rules and dependencies not useful (and
- sometimes confusing) to the casual installer
+ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer
--disable-dependency-tracking speeds up one-time build
--enable-dependency-tracking do not reject slow dependency extractors
--enable-m32 Compile/build with -m32 (default is no)
@@ -1472,9 +1489,9 @@
if $ac_init_version; then
cat <<\_ACEOF
breakpad configure 0.1
-generated by GNU Autoconf 2.68
+generated by GNU Autoconf 2.69
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1667,7 +1684,7 @@
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
- $as_test_x conftest$ac_exeext
+ test -x conftest$ac_exeext
}; then :
ac_retval=0
else
@@ -1812,7 +1829,7 @@
running configure, to aid debugging if configure makes a mistake.
It was created by breakpad $as_me 0.1, which was
-generated by GNU Autoconf 2.68. Invocation command line was
+generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2301,7 +2318,7 @@
# by default.
for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
@@ -2470,7 +2487,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_STRIP="${ac_tool_prefix}strip"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -2510,7 +2527,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_STRIP="strip"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -2561,7 +2578,7 @@
test -z "$as_dir" && as_dir=.
for ac_prog in mkdir gmkdir; do
for ac_exec_ext in '' $ac_executable_extensions; do
- { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
'mkdir (GNU coreutils) '* | \
'mkdir (coreutils) '* | \
@@ -2614,7 +2631,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_AWK="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -2932,7 +2949,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -2972,7 +2989,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -3025,7 +3042,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -3066,7 +3083,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
@@ -3124,7 +3141,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -3168,7 +3185,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -3614,8 +3631,7 @@
/* end confdefs.h. */
#include <stdarg.h>
#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -3983,7 +3999,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -4023,7 +4039,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -4076,7 +4092,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -4117,7 +4133,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
@@ -4175,7 +4191,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -4219,7 +4235,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -4415,8 +4431,7 @@
/* end confdefs.h. */
#include <stdarg.h>
#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
+struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
@@ -4920,7 +4935,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -4964,7 +4979,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CXX="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -5294,7 +5309,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -5334,7 +5349,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_RANLIB="ranlib"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -5416,7 +5431,7 @@
for ac_prog in grep ggrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+ as_fn_executable_p "$ac_path_GREP" || continue
# Check for GNU ac_path_GREP and select it if it is found.
# Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in
@@ -5482,7 +5497,7 @@
for ac_prog in egrep; do
for ac_exec_ext in '' $ac_executable_extensions; do
ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+ as_fn_executable_p "$ac_path_EGREP" || continue
# Check for GNU ac_path_EGREP and select it if it is found.
# Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in
@@ -5838,6 +5853,8 @@
esac
rm -rf conftest*
fi
+
+
fi
# ===========================================================================
@@ -6079,7 +6096,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_ax_pthread_config="yes"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6240,7 +6257,7 @@
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_prog_PTHREAD_CC="$ac_prog"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
@@ -6960,16 +6977,16 @@
# ... but there are two gotchas:
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
- # In both cases, we have to default to `cp -p'.
+ # In both cases, we have to default to `cp -pR'.
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
elif ln conf$$.file conf$$ 2>/dev/null; then
as_ln_s=ln
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
else
- as_ln_s='cp -p'
+ as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null
@@ -7029,28 +7046,16 @@
as_mkdir_p=false
fi
-if test -x / >/dev/null 2>&1; then
- as_test_x='test -x'
-else
- if ls -dL / >/dev/null 2>&1; then
- as_ls_L_option=L
- else
- as_ls_L_option=
- fi
- as_test_x='
- eval sh -c '\''
- if test -d "$1"; then
- test -d "$1/.";
- else
- case $1 in #(
- -*)set "./$1";;
- esac;
- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
- ???[sx]*):;;*)false;;esac;fi
- '\'' sh
- '
-fi
-as_executable_p=$as_test_x
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
@@ -7072,7 +7077,7 @@
# values after options handling.
ac_log="
This file was extended by breakpad $as_me 0.1, which was
-generated by GNU Autoconf 2.68. Invocation command line was
+generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -7138,10 +7143,10 @@
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
breakpad config.status 0.1
-configured by $0, generated by GNU Autoconf 2.68,
+configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2010 Free Software Foundation, Inc.
+Copyright (C) 2012 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -7232,7 +7237,7 @@
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
\$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
diff --git a/src/client/windows/build/common.gypi b/src/build/common.gypi
similarity index 82%
rename from src/client/windows/build/common.gypi
rename to src/build/common.gypi
index 2c792d5..097fadc 100644
--- a/src/client/windows/build/common.gypi
+++ b/src/build/common.gypi
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 2010 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
@@ -32,34 +31,13 @@
# since gyp_chromium is automatically forcing its inclusion.
{
'variables': {
- # .gyp files or targets should set chromium_code to 1 if they build
- # Chromium-specific code, as opposed to external code. This variable is
- # used to control such things as the set of warnings to enable, and
- # whether warnings are treated as errors.
- 'chromium_code%': 0,
-
# Variables expected to be overriden on the GYP command line (-D) or by
# ~/.gyp/include.gypi.
# Putting a variables dict inside another variables dict looks kind of
- # weird. This is done so that "branding" and "buildtype" are defined as
- # variables within the outer variables dict here. This is necessary
- # to get these variables defined for the conditions within this variables
- # dict that operate on these variables.
+ # weird. This is necessary to get these variables defined for the conditions
+ # within this variables dict that operate on these variables.
'variables': {
- # Override branding to select the desired branding flavor.
- 'branding%': 'Chromium',
-
- # Override buildtype to select the desired build flavor.
- # Dev - everyday build for development/testing
- # Official - release build (generally implies additional processing)
- # TODO(mmoss) Once 'buildtype' is fully supported (e.g. Windows gyp
- # conversion is done), some of the things which are now controlled by
- # 'branding', such as symbol generation, will need to be refactored based
- # on 'buildtype' (i.e. we don't care about saving symbols for non-Official
- # builds).
- 'buildtype%': 'Dev',
-
'variables': {
# Compute the architecture that we're building on.
'conditions': [
@@ -73,49 +51,19 @@
'host_arch%': 'ia32',
}],
],
-
- # Whether we're building a ChromeOS build. We set the initial
- # value at this level of nesting so it's available for the
- # toolkit_views test below.
- 'chromeos%': '0',
},
- # Set default value of toolkit_views on for Windows and Chrome OS.
- # We set it at this level of nesting so the value is available for
- # other conditionals below.
- 'conditions': [
- ['OS=="win" or chromeos==1', {
- 'toolkit_views%': 1,
- }, {
- 'toolkit_views%': 0,
- }],
- ],
-
'host_arch%': '<(host_arch)',
# Default architecture we're building for is the architecture we're
# building on.
'target_arch%': '<(host_arch)',
- # We do want to build Chromium with Breakpad support in certain
- # situations. I.e. for Chrome bot.
- 'linux_chromium_breakpad%': 0,
- # And if we want to dump symbols.
- 'linux_chromium_dump_symbols%': 0,
- # Also see linux_strip_binary below.
-
- # Copy conditionally-set chromeos variable out one scope.
- 'chromeos%': '<(chromeos)',
-
# This variable tells WebCore.gyp and JavaScriptCore.gyp whether they are
# are built under a chromium full build (1) or a webkit.org chromium
# build (0).
'inside_chromium_build%': 1,
- # Set to 1 to enable fast builds. It disables debug info for fastest
- # compilation.
- 'fastbuild%': 0,
-
# Set to 1 compile with -fPIC cflag on linux. This is a must for shared
# libraries on linux x86-64 and arm.
'linux_fpic%': 0,
@@ -136,16 +84,9 @@
'disable_sse2%': 0,
},
- # Define branding and buildtype on the basis of their settings within the
- # variables sub-dict above, unless overridden.
- 'branding%': '<(branding)',
- 'buildtype%': '<(buildtype)',
'target_arch%': '<(target_arch)',
'host_arch%': '<(host_arch)',
- 'toolkit_views%': '<(toolkit_views)',
- 'chromeos%': '<(chromeos)',
'inside_chromium_build%': '<(inside_chromium_build)',
- 'fastbuild%': '<(fastbuild)',
'linux_fpic%': '<(linux_fpic)',
'python_ver%': '<(python_ver)',
'arm_version%': '<(arm_version)',
@@ -268,55 +209,14 @@
'gcc_version%': '<!(python <(DEPTH)/build/compiler_version.py)',
# Figure out the python architecture to decide if we build pyauto.
'python_arch%': '<!(<(DEPTH)/build/linux/python_arch.sh <(sysroot)/usr/lib/libpython<(python_ver).so.1.0)',
- 'conditions': [
- ['branding=="Chrome" or linux_chromium_breakpad==1', {
- 'linux_breakpad%': 1,
- }, {
- 'linux_breakpad%': 0,
- }],
- # All Chrome builds have breakpad symbols, but only process the
- # symbols from official builds.
- # TODO(mmoss) dump_syms segfaults on x64. Enable once dump_syms and
- # crash server handle 64-bit symbols.
- ['linux_chromium_dump_symbols==1 or '
- '(branding=="Chrome" and buildtype=="Official" and '
- 'target_arch=="ia32")', {
- 'linux_dump_symbols%': 1,
- }, {
- 'linux_dump_symbols%': 0,
- }],
- ['toolkit_views==0', {
- # GTK wants Title Case strings
- 'use_titlecase_in_grd_files%': 1,
- }],
- ],
+ 'linux_breakpad%': 1,
+ 'linux_dump_symbols%': 1,
}], # OS=="linux" or OS=="freebsd" or OS=="openbsd"
['OS=="mac"', {
# Mac wants Title Case strings
'use_titlecase_in_grd_files%': 1,
- 'conditions': [
- # mac_product_name is set to the name of the .app bundle as it should
- # appear on disk. This duplicates data from
- # chrome/app/theme/chromium/BRANDING and
- # chrome/app/theme/google_chrome/BRANDING, but is necessary to get
- # these names into the build system.
- ['branding=="Chrome"', {
- 'mac_product_name%': 'Google Chrome',
- }, { # else: branding!="Chrome"
- 'mac_product_name%': 'Chromium',
- }],
-
- # Feature variables for enabling Mac Breakpad and Keystone auto-update
- # support. Both features are on by default in official builds with
- # Chrome branding.
- ['branding=="Chrome" and buildtype=="Official"', {
- 'mac_breakpad%': 1,
- 'mac_keystone%': 1,
- }, { # else: branding!="Chrome" or buildtype!="Official"
- 'mac_breakpad%': 0,
- 'mac_keystone%': 0,
- }],
- ],
+ 'mac_breakpad%': 0,
+ 'mac_keystone%': 0,
}], # OS=="mac"
# Whether to use multiple cores to compile with visual studio. This is
# optional because it sometimes causes corruption on VS 2005.
@@ -352,7 +252,7 @@
}],
# Compute based on OS, target architecture and device whether GLES
# is supported
- [ 'OS=="linux" and target_arch=="arm" and chromeos==1', {
+ [ 'OS=="linux" and target_arch=="arm"', {
# Enable a variable used elsewhere throughout the GYP files to determine
# whether to compile in the sources for the GLES support.
'enable_gles%': 1,
@@ -374,17 +274,6 @@
},
'target_defaults': {
'variables': {
- # The condition that operates on chromium_code is in a target_conditions
- # section, and will not have access to the default fallback value of
- # chromium_code at the top of this file, or to the chromium_code
- # variable placed at the root variables scope of .gyp files, because
- # those variables are not set at target scope. As a workaround,
- # if chromium_code is not set at target scope, define it in target scope
- # to contain whatever value it has during early variable expansion.
- # That's enough to make it available during target conditional
- # processing.
- 'chromium_code%': '<(chromium_code)',
-
# See http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Optimize-Options.html
'mac_release_optimization%': '3', # Use -O3 unless overridden
'mac_debug_optimization%': '0', # Use -O0 unless overridden
@@ -400,34 +289,6 @@
'release_valgrind_build%': 0,
},
'conditions': [
- ['branding=="Chrome"', {
- 'defines': ['GOOGLE_CHROME_BUILD'],
- }, { # else: branding!="Chrome"
- 'defines': ['CHROMIUM_BUILD'],
- }],
- ['toolkit_views==1', {
- 'defines': ['TOOLKIT_VIEWS=1'],
- }],
- ['chromeos==1', {
- 'defines': ['OS_CHROMEOS=1'],
- }],
- ['fastbuild!=0', {
- 'conditions': [
- # Finally, for Windows, we simply turn on profiling.
- ['OS=="win"', {
- 'msvs_settings': {
- 'VCLinkerTool': {
- 'GenerateDebugInformation': 'false',
- },
- 'VCCLCompilerTool': {
- 'DebugInformationFormat': '0',
- }
- }
- }, { # else: OS != "win"
- 'cflags': [ '-g1' ],
- }],
- ], # conditions for fastbuild.
- }], # fastbuild!=0
['selinux==1', {
'defines': ['CHROMIUM_SELINUX=1'],
}],
@@ -489,82 +350,34 @@
}], # coverage!=0
], # conditions for 'target_defaults'
'target_conditions': [
- ['chromium_code==0', {
- 'conditions': [
- [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
- 'cflags!': [
- '-Wall',
- '-Wextra',
- '-Werror',
- ],
- }],
- [ 'OS=="win"', {
- 'defines': [
- '_CRT_SECURE_NO_DEPRECATE',
- '_CRT_NONSTDC_NO_WARNINGS',
- '_CRT_NONSTDC_NO_DEPRECATE',
- ],
- 'msvs_disabled_warnings': [4800],
- 'msvs_settings': {
- 'VCCLCompilerTool': {
- 'WarnAsError': 'true',
- 'Detect64BitPortabilityProblems': 'false',
- },
- },
- }],
- [ 'OS=="mac"', {
- 'xcode_settings': {
- 'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',
- 'WARNING_CFLAGS!': ['-Wall'],
- },
- }],
+ [ 'OS=="linux" or OS=="freebsd" or OS=="openbsd"', {
+ 'cflags!': [
+ '-Wall',
+ '-Wextra',
+ '-Werror',
],
- }, {
- # In Chromium code, we define __STDC_FORMAT_MACROS in order to get the
- # C99 macros on Mac and Linux.
+ }],
+ [ 'OS=="win"', {
'defines': [
- '__STDC_FORMAT_MACROS',
+ '_CRT_SECURE_NO_DEPRECATE',
+ '_CRT_NONSTDC_NO_WARNINGS',
+ '_CRT_NONSTDC_NO_DEPRECATE',
+ # This is required for ATL to use XP-safe versions of its functions.
+ '_USING_V110_SDK71_',
],
- 'conditions': [
- ['OS!="win"', {
- 'sources/': [ ['exclude', '_win(_unittest)?\\.cc$'],
- ['exclude', '/win/'],
- ['exclude', '/win_[^/]*\\.cc$'] ],
- }],
- ['OS!="mac"', {
- 'sources/': [ ['exclude', '_(cocoa|mac)(_unittest)?\\.cc$'],
- ['exclude', '/(cocoa|mac)/'],
- ['exclude', '\.mm?$' ] ],
- }],
- ['OS!="linux" and OS!="freebsd" and OS!="openbsd"', {
- 'sources/': [
- ['exclude', '_(chromeos|gtk|x|x11|xdg)(_unittest)?\\.cc$'],
- ['exclude', '/gtk/'],
- ['exclude', '/(gtk|x11)_[^/]*\\.cc$'],
- ],
- }],
- ['OS!="linux"', {
- 'sources/': [
- ['exclude', '_linux(_unittest)?\\.cc$'],
- ['exclude', '/linux/'],
- ],
- }],
- # We use "POSIX" to refer to all non-Windows operating systems.
- ['OS=="win"', {
- 'sources/': [ ['exclude', '_posix\\.cc$'] ],
- }],
- # Though Skia is conceptually shared by Linux and Windows,
- # the only _skia files in our tree are Linux-specific.
- ['OS!="linux" and OS!="freebsd" and OS!="openbsd"', {
- 'sources/': [ ['exclude', '_skia\\.cc$'] ],
- }],
- ['chromeos!=1', {
- 'sources/': [ ['exclude', '_chromeos\\.cc$'] ]
- }],
- ['toolkit_views==0', {
- 'sources/': [ ['exclude', '_views\\.cc$'] ]
- }],
- ],
+ 'msvs_disabled_warnings': [4800],
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'WarnAsError': 'true',
+ 'Detect64BitPortabilityProblems': 'false',
+ },
+ },
+ }],
+ [ 'OS=="mac"', {
+ 'xcode_settings': {
+ 'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',
+ 'WARNING_CFLAGS!': ['-Wall'],
+ },
}],
], # target_conditions for 'target_defaults'
'default_configuration': 'Debug',
@@ -590,6 +403,7 @@
'abstract': 1,
'msvs_settings': {
'VCLinkerTool': {
+ 'MinimumRequiredVersion': '5.01', # XP.
'TargetMachine': '1',
},
},
@@ -715,7 +529,30 @@
'inherit_from': ['Common_Base', 'x86_Base', 'Release_Base'],
'conditions': [
['msvs_use_common_release', {
- 'includes': ['release.gypi'],
+ 'defines': ['OFFICIAL_BUILD'],
+ 'msvs_settings': {
+ 'VCCLCompilerTool': {
+ 'Optimization': '3',
+ 'StringPooling': 'true',
+ 'OmitFramePointers': 'true',
+ 'InlineFunctionExpansion': '2',
+ 'EnableIntrinsicFunctions': 'true',
+ 'FavorSizeOrSpeed': '2',
+ 'OmitFramePointers': 'true',
+ 'EnableFiberSafeOptimizations': 'true',
+ 'WholeProgramOptimization': 'true',
+ },
+ 'VCLibrarianTool': {
+ 'AdditionalOptions': ['/ltcg', '/expectedoutputsize:120000000'],
+ },
+ 'VCLinkerTool': {
+ 'LinkIncremental': '1',
+ 'OptimizeReferences': '2',
+ 'EnableCOMDATFolding': '2',
+ 'OptimizeForWindows98': '1',
+ 'LinkTimeCodeGeneration': '1',
+ },
+ },
}],
]
},
@@ -932,22 +769,13 @@
# compiler optimized the code, since the value is always kept
# in its specified precision.
'conditions': [
- ['branding=="Chromium" and disable_sse2==0', {
+ ['disable_sse2==0', {
'cflags': [
'-march=pentium4',
'-msse2',
'-mfpmath=sse',
],
}],
- # ChromeOS targets Pinetrail, which is sse3, but most of the
- # benefit comes from sse2 so this setting allows ChromeOS
- # to build on other CPUs. In the future -march=atom would help
- # but requires a newer compiler.
- ['chromeos==1 and disable_sse2==0', {
- 'cflags': [
- '-msse2',
- ],
- }],
],
# -mmmx allows mmintrin.h to be used for mmx intrinsics.
# video playback is mmx and sse2 optimized.
@@ -1023,9 +851,6 @@
'cflags': [ '-gstabs' ],
'defines': ['USE_LINUX_BREAKPAD'],
}],
- ['linux_use_seccomp_sandbox==1 and buildtype!="Official"', {
- 'defines': ['USE_SECCOMP_SANDBOX'],
- }],
['library=="shared_library"', {
# When building with shared libraries, remove the visiblity-hiding
# flag.
@@ -1324,9 +1149,3 @@
'SYMROOT': '<(DEPTH)/xcodebuild',
},
}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/client/ios/Breakpad.mm b/src/client/ios/Breakpad.mm
index 6612559..5c4043c 100644
--- a/src/client/ios/Breakpad.mm
+++ b/src/client/ios/Breakpad.mm
@@ -258,6 +258,7 @@
if (current_breakpad_) {
current_breakpad_->HandleUncaughtException(exception);
}
+ BreakpadRelease(current_breakpad_);
}
//=============================================================================
diff --git a/src/client/linux/crash_generation/crash_generation_client.cc b/src/client/linux/crash_generation/crash_generation_client.cc
index 6ede779..2522c95 100644
--- a/src/client/linux/crash_generation/crash_generation_client.cc
+++ b/src/client/linux/crash_generation/crash_generation_client.cc
@@ -27,66 +27,79 @@
// (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 "client/linux/crash_generation/crash_generation_client.h"
+
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <algorithm>
-#include "client/linux/crash_generation/crash_generation_client.h"
#include "common/linux/eintr_wrapper.h"
#include "common/linux/ignore_ret.h"
-#include "common/linux/linux_libc_support.h"
#include "third_party/lss/linux_syscall_support.h"
namespace google_breakpad {
-bool
-CrashGenerationClient::RequestDump(const void* blob, size_t blob_size)
-{
- int fds[2];
- sys_socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
- static const unsigned kControlMsgSize = CMSG_SPACE(sizeof(int));
+namespace {
- struct kernel_msghdr msg;
- my_memset(&msg, 0, sizeof(struct kernel_msghdr));
- struct kernel_iovec iov[1];
- iov[0].iov_base = const_cast<void*>(blob);
- iov[0].iov_len = blob_size;
+class CrashGenerationClientImpl : public CrashGenerationClient {
+ public:
+ explicit CrashGenerationClientImpl(int server_fd) : server_fd_(server_fd) {}
+ virtual ~CrashGenerationClientImpl() {}
- msg.msg_iov = iov;
- msg.msg_iovlen = sizeof(iov) / sizeof(iov[0]);
- char cmsg[kControlMsgSize];
- my_memset(cmsg, 0, kControlMsgSize);
- msg.msg_control = cmsg;
- msg.msg_controllen = sizeof(cmsg);
+ virtual bool RequestDump(const void* blob, size_t blob_size) {
+ int fds[2];
+ if (sys_socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0)
+ return false;
+ static const unsigned kControlMsgSize = CMSG_SPACE(sizeof(int));
- struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg);
- hdr->cmsg_level = SOL_SOCKET;
- hdr->cmsg_type = SCM_RIGHTS;
- hdr->cmsg_len = CMSG_LEN(sizeof(int));
- int* p = reinterpret_cast<int*>(CMSG_DATA(hdr));
- *p = fds[1];
+ struct kernel_iovec iov;
+ iov.iov_base = const_cast<void*>(blob);
+ iov.iov_len = blob_size;
- ssize_t ret = HANDLE_EINTR(sys_sendmsg(server_fd_, &msg, 0));
- sys_close(fds[1]);
- if (ret <= 0)
- return false;
+ struct kernel_msghdr msg = { 0 };
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ char cmsg[kControlMsgSize] = "";
+ msg.msg_control = cmsg;
+ msg.msg_controllen = sizeof(cmsg);
- // wait for an ACK from the server
- char b;
- IGNORE_RET(HANDLE_EINTR(sys_read(fds[0], &b, 1)));
+ struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg);
+ hdr->cmsg_level = SOL_SOCKET;
+ hdr->cmsg_type = SCM_RIGHTS;
+ hdr->cmsg_len = CMSG_LEN(sizeof(int));
+ int* p = reinterpret_cast<int*>(CMSG_DATA(hdr));
+ *p = fds[1];
- return true;
-}
+ ssize_t ret = HANDLE_EINTR(sys_sendmsg(server_fd_, &msg, 0));
+ sys_close(fds[1]);
+ if (ret < 0) {
+ sys_close(fds[0]);
+ return false;
+ }
-//static
-CrashGenerationClient*
-CrashGenerationClient::TryCreate(int server_fd)
-{
- if (0 > server_fd)
+ // Wait for an ACK from the server.
+ char b;
+ IGNORE_RET(HANDLE_EINTR(sys_read(fds[0], &b, 1)));
+ sys_close(fds[0]);
+
+ return true;
+ }
+
+ private:
+ int server_fd_;
+
+ DISALLOW_COPY_AND_ASSIGN(CrashGenerationClientImpl);
+};
+
+} // namespace
+
+// static
+CrashGenerationClient* CrashGenerationClient::TryCreate(int server_fd) {
+ if (server_fd < 0)
return NULL;
- return new CrashGenerationClient(server_fd);
+ return new CrashGenerationClientImpl(server_fd);
}
-}
+} // namespace google_breakpad
diff --git a/src/client/linux/crash_generation/crash_generation_client.h b/src/client/linux/crash_generation/crash_generation_client.h
index 7139dff..4e68424 100644
--- a/src/client/linux/crash_generation/crash_generation_client.h
+++ b/src/client/linux/crash_generation/crash_generation_client.h
@@ -30,40 +30,36 @@
#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
+#include "common/basictypes.h"
+
#include <stddef.h>
namespace google_breakpad {
+// CrashGenerationClient is an interface for implementing out-of-process crash
+// dumping. The default implementation, accessed via the TryCreate() factory,
+// works in conjunction with the CrashGenerationServer to generate a minidump
+// via a remote process.
class CrashGenerationClient {
-public:
- ~CrashGenerationClient()
- {
- }
+ public:
+ CrashGenerationClient() {}
+ virtual ~CrashGenerationClient() {}
- // Request the crash server to generate a dump. |blob| is a hack,
- // see exception_handler.h and minidump_writer.h
- //
- // Return true if the dump was successful; false otherwise.
- bool RequestDump(const void* blob, size_t blob_size);
+ // Request the crash server to generate a dump. |blob| is an opaque
+ // CrashContext pointer from exception_handler.h.
+ // Returns true if the dump was successful; false otherwise.
+ virtual bool RequestDump(const void* blob, size_t blob_size) = 0;
- // Return a new CrashGenerationClient if |server_fd| is valid and
+ // Returns a new CrashGenerationClient if |server_fd| is valid and
// connects to a CrashGenerationServer. Otherwise, return NULL.
// The returned CrashGenerationClient* is owned by the caller of
// this function.
static CrashGenerationClient* TryCreate(int server_fd);
-private:
- CrashGenerationClient(int server_fd) : server_fd_(server_fd)
- {
- }
-
- int server_fd_;
-
- // prevent copy construction and assignment
- CrashGenerationClient(const CrashGenerationClient&);
- CrashGenerationClient& operator=(const CrashGenerationClient&);
+ private:
+ DISALLOW_COPY_AND_ASSIGN(CrashGenerationClient);
};
-} // namespace google_breakpad
+} // namespace google_breakpad
-#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
+#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_
diff --git a/src/client/linux/handler/exception_handler.cc b/src/client/linux/handler/exception_handler.cc
index e5aaecd..f30e459 100644
--- a/src/client/linux/handler/exception_handler.cc
+++ b/src/client/linux/handler/exception_handler.cc
@@ -142,7 +142,7 @@
// SIGSTKSZ may be too small to prevent the signal handlers from overrunning
// the alternative stack. Ensure that the size of the alternative stack is
// large enough.
- static const unsigned kSigStackSize = std::max(8192, SIGSTKSZ);
+ static const unsigned kSigStackSize = std::max(16384, SIGSTKSZ);
// Only set an alternative stack if there isn't already one, or if the current
// one is too small.
@@ -230,6 +230,8 @@
std::find(handler_stack_->begin(), handler_stack_->end(), this);
handler_stack_->erase(handler);
if (handler_stack_->empty()) {
+ delete handler_stack_;
+ handler_stack_ = NULL;
RestoreAlternateStackLocked();
RestoreHandlersLocked();
}
@@ -474,19 +476,25 @@
logger::write(no_pipe_msg, sizeof(no_pipe_msg) - 1);
logger::write(strerror(errno), strlen(strerror(errno)));
logger::write("\n", 1);
+
+ // Ensure fdes[0] and fdes[1] are invalid file descriptors.
+ fdes[0] = fdes[1] = -1;
}
const pid_t child = sys_clone(
ThreadEntry, stack, CLONE_FILES | CLONE_FS | CLONE_UNTRACED,
&thread_arg, NULL, NULL, NULL);
+ if (child == -1) {
+ sys_close(fdes[0]);
+ sys_close(fdes[1]);
+ return false;
+ }
- int r, status;
// Allow the child to ptrace us
sys_prctl(PR_SET_PTRACER, child, 0, 0, 0);
SendContinueSignalToChild();
- do {
- r = sys_waitpid(child, &status, __WALL);
- } while (r == -1 && errno == EINTR);
+ int status;
+ const int r = HANDLE_EINTR(sys_waitpid(child, &status, __WALL));
sys_close(fdes[0]);
sys_close(fdes[1]);
diff --git a/src/client/linux/handler/exception_handler.h b/src/client/linux/handler/exception_handler.h
index e906e7a..bb88b95 100644
--- a/src/client/linux/handler/exception_handler.h
+++ b/src/client/linux/handler/exception_handler.h
@@ -146,6 +146,10 @@
crash_handler_ = callback;
}
+ void set_crash_generation_client(CrashGenerationClient* client) {
+ crash_generation_client_.reset(client);
+ }
+
// Writes a minidump immediately. This can be used to capture the execution
// state independently of a crash.
// Returns true on success.
@@ -200,7 +204,7 @@
// Returns whether out-of-process dump generation is used or not.
bool IsOutOfProcess() const {
- return crash_generation_client_.get() != NULL;
+ return crash_generation_client_.get() != NULL;
}
// Add information about a memory mapping. This can be used if
@@ -248,7 +252,11 @@
MinidumpDescriptor minidump_descriptor_;
- HandlerCallback crash_handler_;
+ // Must be volatile. The compiler is unaware of the code which runs in
+ // the signal handler which reads this variable. Without volatile the
+ // compiler is free to optimise away writes to this variable which it
+ // believes are never read.
+ volatile HandlerCallback crash_handler_;
// The global exception handler stack. This is need becuase there may exist
// multiple ExceptionHandler instances in a process. Each will have itself
diff --git a/src/client/linux/handler/exception_handler_unittest.cc b/src/client/linux/handler/exception_handler_unittest.cc
index 976f9f4..fc81f61 100644
--- a/src/client/linux/handler/exception_handler_unittest.cc
+++ b/src/client/linux/handler/exception_handler_unittest.cc
@@ -193,6 +193,20 @@
#ifndef ADDRESS_SANITIZER
+// This is a replacement for "*reinterpret_cast<volatile int*>(NULL) = 0;"
+// It is needed because GCC is allowed to assume that the program will
+// not execute any undefined behavior (UB) operation. Further, when GCC
+// observes that UB statement is reached, it can assume that all statements
+// leading to the UB one are never executed either, and can completely
+// optimize them out. In the case of ExceptionHandlerTest::ExternalDumper,
+// GCC-4.9 optimized out the entire set up of ExceptionHandler, causing
+// test failure.
+volatile int *p_null; // external linkage, so GCC can't tell that it
+ // remains NULL. Volatile just for a good measure.
+static void DoNullPointerDereference() {
+ *p_null = 1;
+}
+
void ChildCrash(bool use_fd) {
AutoTempDir temp_dir;
int fds[2] = {0};
@@ -219,7 +233,7 @@
true, -1));
}
// Crash with the exception handler in scope.
- *reinterpret_cast<volatile int*>(NULL) = 0;
+ DoNullPointerDereference();
}
}
if (!use_fd)
@@ -295,7 +309,7 @@
ExceptionHandler handler(
MinidumpDescriptor(path), filter, done, NULL, true, -1);
// Crash with the exception handler in scope.
- *reinterpret_cast<volatile int*>(NULL) = 0;
+ DoNullPointerDereference();
}
TEST(ExceptionHandlerTest, RedeliveryOnFilterCallbackFalse) {
@@ -386,7 +400,7 @@
reinterpret_cast<void*>(SIG_ERR));
// Crash with the exception handler in scope.
- *reinterpret_cast<volatile int*>(NULL) = 0;
+ DoNullPointerDereference();
}
// SIGKILL means Breakpad's signal handler didn't crash.
ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL));
@@ -922,7 +936,7 @@
ExceptionHandler handler(MinidumpDescriptor("/tmp1"), NULL, NULL,
reinterpret_cast<void*>(fds[1]), true, -1);
handler.set_crash_handler(CrashHandler);
- *reinterpret_cast<volatile int*>(NULL) = 0;
+ DoNullPointerDereference();
}
close(fds[1]);
struct msghdr msg = {0};
diff --git a/src/client/linux/minidump_writer/linux_core_dumper.cc b/src/client/linux/minidump_writer/linux_core_dumper.cc
index eb9e3fd..3eab44d 100644
--- a/src/client/linux/minidump_writer/linux_core_dumper.cc
+++ b/src/client/linux/minidump_writer/linux_core_dumper.cc
@@ -124,7 +124,7 @@
}
bool LinuxCoreDumper::EnumerateThreads() {
- if (!mapped_core_file_.Map(core_path_)) {
+ if (!mapped_core_file_.Map(core_path_, 0)) {
fprintf(stderr, "Could not map core dump file into memory\n");
return false;
}
@@ -188,7 +188,19 @@
memset(&info, 0, sizeof(ThreadInfo));
info.tgid = status->pr_pgrp;
info.ppid = status->pr_ppid;
+#if defined(__mips__)
+ for (int i = EF_REG0; i <= EF_REG31; i++)
+ info.regs.regs[i - EF_REG0] = status->pr_reg[i];
+
+ info.regs.lo = status->pr_reg[EF_LO];
+ info.regs.hi = status->pr_reg[EF_HI];
+ info.regs.epc = status->pr_reg[EF_CP0_EPC];
+ info.regs.badvaddr = status->pr_reg[EF_CP0_BADVADDR];
+ info.regs.status = status->pr_reg[EF_CP0_STATUS];
+ info.regs.cause = status->pr_reg[EF_CP0_CAUSE];
+#else
memcpy(&info.regs, status->pr_reg, sizeof(info.regs));
+#endif
if (first_thread) {
crash_thread_ = pid;
crash_signal_ = status->pr_info.si_signo;
diff --git a/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc b/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc
index 449aab3..8f6a423 100644
--- a/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc
+++ b/src/client/linux/minidump_writer/linux_core_dumper_unittest.cc
@@ -79,7 +79,18 @@
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.VerifyDumpWithMultipleThreads 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());
diff --git a/src/client/linux/minidump_writer/linux_dumper.cc b/src/client/linux/minidump_writer/linux_dumper.cc
index e09da91..c1e77c9 100644
--- a/src/client/linux/minidump_writer/linux_dumper.cc
+++ b/src/client/linux/minidump_writer/linux_dumper.cc
@@ -38,12 +38,14 @@
#include "client/linux/minidump_writer/linux_dumper.h"
#include <assert.h>
+#include <elf.h>
#include <fcntl.h>
#include <limits.h>
#include <stddef.h>
#include <string.h>
#include "client/linux/minidump_writer/line_reader.h"
+#include "common/linux/elfutils.h"
#include "common/linux/file_id.h"
#include "common/linux/linux_libc_support.h"
#include "common/linux/memory_mapped_file.h"
@@ -115,15 +117,16 @@
char filename[NAME_MAX];
size_t filename_len = my_strlen(mapping.name);
- assert(filename_len < NAME_MAX);
- if (filename_len >= NAME_MAX)
+ if (filename_len >= NAME_MAX) {
+ assert(false);
return false;
+ }
my_memcpy(filename, mapping.name, filename_len);
filename[filename_len] = '\0';
bool filename_modified = HandleDeletedFileInMapping(filename);
- MemoryMappedFile mapped_file(filename);
- if (!mapped_file.data()) // Should probably check if size >= ElfW(Ehdr)?
+ MemoryMappedFile mapped_file(filename, mapping.offset);
+ if (!mapped_file.data() || mapped_file.size() < SELFMAG)
return false;
bool success =
@@ -136,6 +139,80 @@
return success;
}
+namespace {
+bool ElfFileSoNameFromMappedFile(
+ const void* elf_base, char* soname, size_t soname_size) {
+ if (!IsValidElf(elf_base)) {
+ // Not ELF
+ return false;
+ }
+
+ const void* segment_start;
+ size_t segment_size;
+ int elf_class;
+ if (!FindElfSection(elf_base, ".dynamic", SHT_DYNAMIC,
+ &segment_start, &segment_size, &elf_class)) {
+ // No dynamic section
+ return false;
+ }
+
+ const void* dynstr_start;
+ size_t dynstr_size;
+ if (!FindElfSection(elf_base, ".dynstr", SHT_STRTAB,
+ &dynstr_start, &dynstr_size, &elf_class)) {
+ // No dynstr section
+ return false;
+ }
+
+ const ElfW(Dyn)* dynamic = static_cast<const ElfW(Dyn)*>(segment_start);
+ size_t dcount = segment_size / sizeof(ElfW(Dyn));
+ for (const ElfW(Dyn)* dyn = dynamic; dyn < dynamic + dcount; ++dyn) {
+ if (dyn->d_tag == DT_SONAME) {
+ const char* dynstr = static_cast<const char*>(dynstr_start);
+ if (dyn->d_un.d_val >= dynstr_size) {
+ // Beyond the end of the dynstr section
+ return false;
+ }
+ const char* str = dynstr + dyn->d_un.d_val;
+ const size_t maxsize = dynstr_size - dyn->d_un.d_val;
+ my_strlcpy(soname, str, maxsize < soname_size ? maxsize : soname_size);
+ return true;
+ }
+ }
+
+ // Did not find SONAME
+ return false;
+}
+} // namespace
+
+// static
+bool LinuxDumper::ElfFileSoName(
+ const MappingInfo& mapping, char* soname, size_t soname_size) {
+ if (IsMappedFileOpenUnsafe(mapping)) {
+ // Not safe
+ return false;
+ }
+
+ char filename[NAME_MAX];
+ size_t filename_len = my_strlen(mapping.name);
+ if (filename_len >= NAME_MAX) {
+ assert(false);
+ // name too long
+ return false;
+ }
+
+ my_memcpy(filename, mapping.name, filename_len);
+ filename[filename_len] = '\0';
+
+ MemoryMappedFile mapped_file(filename, mapping.offset);
+ if (!mapped_file.data() || mapped_file.size() < SELFMAG) {
+ // mmap failed
+ return false;
+ }
+
+ return ElfFileSoNameFromMappedFile(mapped_file.data(), soname, soname_size);
+}
+
bool LinuxDumper::ReadAuxv() {
char auxv_path[NAME_MAX];
if (!BuildProcPath(auxv_path, pid_, "auxv")) {
@@ -195,6 +272,7 @@
if (*i1 == '-') {
const char* i2 = my_read_hex_ptr(&end_addr, i1 + 1);
if (*i2 == ' ') {
+ bool exec = (*(i2 + 3) == 'x');
const char* i3 = my_read_hex_ptr(&offset, i2 + 6 /* skip ' rwxp ' */);
if (*i3 == ' ') {
const char* name = NULL;
@@ -223,6 +301,7 @@
module->start_addr = start_addr;
module->size = end_addr - start_addr;
module->offset = offset;
+ module->exec = exec;
if (name != NULL) {
const unsigned l = my_strlen(name);
if (l < sizeof(module->name))
diff --git a/src/client/linux/minidump_writer/linux_dumper.h b/src/client/linux/minidump_writer/linux_dumper.h
index 335a2ce..ad2af01 100644
--- a/src/client/linux/minidump_writer/linux_dumper.h
+++ b/src/client/linux/minidump_writer/linux_dumper.h
@@ -107,6 +107,7 @@
uintptr_t start_addr;
size_t size;
size_t offset; // offset into the backed file.
+ bool exec; // true if the mapping has the execute bit set.
char name[NAME_MAX];
};
@@ -162,6 +163,13 @@
unsigned int mapping_id,
uint8_t identifier[sizeof(MDGUID)]);
+ // Find the shared object name (SONAME) by examining the ELF information
+ // for |mapping|. If the SONAME is found copy it into the passed buffer
+ // |soname| and return true. The size of the buffer is |soname_size|.
+ // The SONAME will be truncated if it is too long to fit in the buffer.
+ static bool ElfFileSoName(
+ const MappingInfo& mapping, char* soname, size_t soname_size);
+
uintptr_t crash_address() const { return crash_address_; }
void set_crash_address(uintptr_t crash_address) {
crash_address_ = crash_address;
diff --git a/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc b/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
index 461a6cf..4ccb720 100644
--- a/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
+++ b/src/client/linux/minidump_writer/linux_dumper_unittest_helper.cc
@@ -43,6 +43,8 @@
#if defined(__ARM_EABI__)
#define TID_PTR_REGISTER "r3"
+#elif defined(__aarch64__)
+#define TID_PTR_REGISTER "x3"
#elif defined(__i386)
#define TID_PTR_REGISTER "ecx"
#elif defined(__x86_64)
diff --git a/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc b/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
index 065d471..57202d3 100644
--- a/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
+++ b/src/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc
@@ -437,6 +437,8 @@
// specific register. Check that we can recover its value.
#if defined(__ARM_EABI__)
pid_t* process_tid_location = (pid_t*)(one_thread.regs.uregs[3]);
+#elif defined(__aarch64__)
+ pid_t* process_tid_location = (pid_t*)(one_thread.regs.regs[3]);
#elif defined(__i386)
pid_t* process_tid_location = (pid_t*)(one_thread.regs.ecx);
#elif defined(__x86_64)
diff --git a/src/client/linux/minidump_writer/minidump_writer.cc b/src/client/linux/minidump_writer/minidump_writer.cc
index ce8503d..86cec55 100644
--- a/src/client/linux/minidump_writer/minidump_writer.cc
+++ b/src/client/linux/minidump_writer/minidump_writer.cc
@@ -378,12 +378,34 @@
void CPUFillFromThreadInfo(MDRawContextARM64* out,
const google_breakpad::ThreadInfo& info) {
- // TODO(rmcilroy): Implement for arm64.
+ out->context_flags = MD_CONTEXT_ARM64_FULL;
+
+ out->cpsr = static_cast<uint32_t>(info.regs.pstate);
+ for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i)
+ out->iregs[i] = info.regs.regs[i];
+ out->iregs[MD_CONTEXT_ARM64_REG_SP] = info.regs.sp;
+ out->iregs[MD_CONTEXT_ARM64_REG_PC] = info.regs.pc;
+
+ out->float_save.fpsr = info.fpregs.fpsr;
+ out->float_save.fpcr = info.fpregs.fpcr;
+ my_memcpy(&out->float_save.regs, &info.fpregs.vregs,
+ MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT * 16);
}
void CPUFillFromUContext(MDRawContextARM64* out, const ucontext* uc,
const struct fpsimd_context* fpregs) {
- // TODO(rmcilroy): Implement for arm64.
+ out->context_flags = MD_CONTEXT_ARM64_FULL;
+
+ out->cpsr = static_cast<uint32_t>(uc->uc_mcontext.pstate);
+ for (int i = 0; i < MD_CONTEXT_ARM64_REG_SP; ++i)
+ out->iregs[i] = uc->uc_mcontext.regs[i];
+ out->iregs[MD_CONTEXT_ARM64_REG_SP] = uc->uc_mcontext.sp;
+ out->iregs[MD_CONTEXT_ARM64_REG_PC] = uc->uc_mcontext.pc;
+
+ out->float_save.fpsr = fpregs->fpsr;
+ out->float_save.fpcr = fpregs->fpcr;
+ my_memcpy(&out->float_save.regs, &fpregs->vregs,
+ MD_FLOATINGSAVEAREA_ARM64_FPR_COUNT * 16);
}
#elif defined(__mips__)
@@ -916,7 +938,9 @@
static bool ShouldIncludeMapping(const MappingInfo& mapping) {
if (mapping.name[0] == 0 || // only want modules with filenames.
- mapping.offset || // only want to include one mapping per shared lib.
+ // Only want to include one mapping per shared lib.
+ // Avoid filtering executable mappings.
+ (mapping.offset != 0 && !mapping.exec) ||
mapping.size < 4096) { // too small to get a signature for.
return false;
}
@@ -1007,7 +1031,8 @@
mod.base_of_image = mapping.start_addr;
mod.size_of_image = mapping.size;
- const size_t filepath_len = my_strlen(mapping.name);
+ const char* filepath_ptr = mapping.name;
+ size_t filepath_len = my_strlen(mapping.name);
// Figure out file name from path
const char* filename_ptr = mapping.name + filepath_len - 1;
@@ -1018,7 +1043,31 @@
}
filename_ptr++;
- const size_t filename_len = mapping.name + filepath_len - filename_ptr;
+ size_t filename_len = mapping.name + filepath_len - filename_ptr;
+
+ // If an executable is mapped from a non-zero offset, this is likely
+ // because the executable was loaded directly from inside an archive
+ // file. We try to find the name of the shared object (SONAME) by
+ // looking in the file for ELF sections.
+
+ char soname[NAME_MAX];
+ char pathname[NAME_MAX];
+ if (mapping.exec && mapping.offset != 0 &&
+ LinuxDumper::ElfFileSoName(mapping, soname, sizeof(soname))) {
+ filename_ptr = soname;
+ filename_len = my_strlen(soname);
+
+ if (filepath_len + filename_len + 1 < NAME_MAX) {
+ // It doesn't have a real pathname, but tools such as stackwalk
+ // extract the basename, so simulating a pathname is helpful.
+ my_memcpy(pathname, filepath_ptr, filepath_len);
+ pathname[filepath_len] = '/';
+ my_memcpy(pathname + filepath_len + 1, filename_ptr, filename_len);
+ pathname[filepath_len + filename_len + 1] = '\0';
+ filepath_ptr = pathname;
+ filepath_len = filepath_len + filename_len + 1;
+ }
+ }
uint8_t cv_buf[MDCVInfoPDB70_minsize + NAME_MAX];
uint8_t* cv_ptr = cv_buf;
@@ -1048,7 +1097,7 @@
mod.cv_record = cv.location();
MDLocationDescriptor ld;
- if (!minidump_writer_.WriteString(mapping.name, filepath_len, &ld))
+ if (!minidump_writer_.WriteString(filepath_ptr, filepath_len, &ld))
return false;
mod.module_name_rva = ld.rva;
return true;
@@ -1328,7 +1377,7 @@
bool found;
} cpu_info_table[] = {
{ "processor", -1, false },
-#if !defined(__mips__)
+#if defined(__i386__) || defined(__x86_64__)
{ "model", 0, false },
{ "stepping", 0, false },
{ "cpu family", 0, false },
@@ -1402,7 +1451,7 @@
cpu_info_table[0].value++;
sys_info->number_of_processors = cpu_info_table[0].value;
-#if !defined(__mips__)
+#if defined(__i386__) || defined(__x86_64__)
sys_info->processor_level = cpu_info_table[3].value;
sys_info->processor_revision = cpu_info_table[1].value << 8 |
cpu_info_table[2].value;
@@ -1414,7 +1463,7 @@
}
return true;
}
-#elif defined(__arm__)
+#elif defined(__arm__) || defined(__aarch64__)
bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
// The CPUID value is broken up in several entries in /proc/cpuinfo.
// This table is used to rebuild it from the entries.
@@ -1436,6 +1485,7 @@
const char* tag;
uint32_t hwcaps;
} cpu_features_entries[] = {
+#if defined(__arm__)
{ "swp", MD_CPU_ARM_ELF_HWCAP_SWP },
{ "half", MD_CPU_ARM_ELF_HWCAP_HALF },
{ "thumb", MD_CPU_ARM_ELF_HWCAP_THUMB },
@@ -1456,10 +1506,18 @@
{ "idiva", MD_CPU_ARM_ELF_HWCAP_IDIVA },
{ "idivt", MD_CPU_ARM_ELF_HWCAP_IDIVT },
{ "idiv", MD_CPU_ARM_ELF_HWCAP_IDIVA | MD_CPU_ARM_ELF_HWCAP_IDIVT },
+#elif defined(__aarch64__)
+ // No hwcaps on aarch64.
+#endif
};
// processor_architecture should always be set, do this first
- sys_info->processor_architecture = MD_CPU_ARCHITECTURE_ARM;
+ sys_info->processor_architecture =
+#if defined(__aarch64__)
+ MD_CPU_ARCHITECTURE_ARM64;
+#else
+ MD_CPU_ARCHITECTURE_ARM;
+#endif
// /proc/cpuinfo is not readable under various sandboxed environments
// (e.g. Android services with the android:isolatedProcess attribute)
@@ -1543,13 +1601,14 @@
sys_info->cpu.arm_cpu_info.cpuid |=
static_cast<uint32_t>(result);
}
+#if defined(__arm__)
// Get the architecture version from the "Processor" field.
// Note that it is also available in the "CPU architecture" field,
// however, some existing kernels are misconfigured and will report
// invalid values here (e.g. 6, while the CPU is ARMv7-A based).
// The "Processor" field doesn't have this issue.
if (!my_strcmp(field, "Processor")) {
- unsigned value_len;
+ size_t value_len;
const char* value = reader->GetValueAndLen(&value_len);
// Expected format: <text> (v<level><endian>)
// Where <text> is some text like "ARMv7 Processor rev 2"
@@ -1568,9 +1627,23 @@
sys_info->processor_level = static_cast<uint16_t>(arch_level);
}
}
+#elif defined(__aarch64__)
+ // The aarch64 architecture does not provide the architecture level
+ // in the Processor field, so we instead check the "CPU architecture"
+ // field.
+ if (!my_strcmp(field, "CPU architecture")) {
+ uintptr_t arch_level = 0;
+ const char* value = reader->GetValue();
+ const char* p = value;
+ p = my_read_decimal_ptr(&arch_level, value);
+ if (p == value)
+ continue;
+ sys_info->processor_level = static_cast<uint16_t>(arch_level);
+ }
+#endif
// Rebuild the ELF hwcaps from the 'Features' field.
if (!my_strcmp(field, "Features")) {
- unsigned value_len;
+ size_t value_len;
const char* value = reader->GetValueAndLen(&value_len);
// Parse each space-separated tag.
@@ -1605,11 +1678,6 @@
return true;
}
-#elif defined(__aarch64__)
- bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
- // TODO(rmcilroy): Implement for arm64.
- return false;
- }
#else
# error "Unsupported CPU"
#endif
@@ -1717,23 +1785,6 @@
space_left -= info_len;
}
-#ifdef __ANDROID__
- // On Android, try to get the build fingerprint and append it.
- // Fail gracefully because there is no guarantee that the system
- // property will always be available or accessible.
- char fingerprint[PROP_VALUE_MAX];
- int fingerprint_len = __system_property_get("ro.build.fingerprint",
- fingerprint);
- // System property values shall always be zero-terminated.
- // Be paranoid and don't trust the system.
- if (fingerprint_len > 0 && fingerprint_len < PROP_VALUE_MAX) {
- const char* separator = " ";
- if (!first_item)
- my_strlcat(buf, separator, sizeof(buf));
- my_strlcat(buf, fingerprint, sizeof(buf));
- }
-#endif
-
MDLocationDescriptor location;
if (!minidump_writer_.WriteString(buf, 0, &location))
return false;
diff --git a/src/client/linux/minidump_writer/minidump_writer_unittest.cc b/src/client/linux/minidump_writer/minidump_writer_unittest.cc
index 2433035..7dbff73 100644
--- a/src/client/linux/minidump_writer/minidump_writer_unittest.cc
+++ b/src/client/linux/minidump_writer/minidump_writer_unittest.cc
@@ -527,26 +527,19 @@
// Fake the child's stack pointer for its crashing thread. NOTE: This must
// be an invalid memory address for the child process (stack or otherwise).
-#if defined(__i386)
// Try 1MB below the current stack.
uintptr_t invalid_stack_pointer =
reinterpret_cast<uintptr_t>(&context) - 1024*1024;
+#if defined(__i386)
context.context.uc_mcontext.gregs[REG_ESP] = invalid_stack_pointer;
#elif defined(__x86_64)
- // Try 1MB below the current stack.
- uintptr_t invalid_stack_pointer =
- reinterpret_cast<uintptr_t>(&context) - 1024*1024;
context.context.uc_mcontext.gregs[REG_RSP] = invalid_stack_pointer;
#elif defined(__ARM_EABI__)
- // Try 1MB below the current stack.
- uintptr_t invalid_stack_pointer =
- reinterpret_cast<uintptr_t>(&context) - 1024*1024;
context.context.uc_mcontext.arm_sp = invalid_stack_pointer;
+#elif defined(__aarch64__)
+ context.context.uc_mcontext.sp = invalid_stack_pointer;
#elif defined(__mips__)
- // Try 1MB below the current stack.
- uintptr_t invalid_stack_pointer =
- reinterpret_cast<uintptr_t>(&context) - 1024 * 1024;
- context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] =
+ context.context.uc_mcontext.gregs[MD_CONTEXT_MIPS_REG_SP] =
invalid_stack_pointer;
#else
# error "This code has not been ported to your platform yet."
@@ -631,7 +624,7 @@
ASSERT_EQ(1, r);
ASSERT_TRUE(pfd.revents & POLLIN);
uint8_t junk;
- ASSERT_EQ(read(fds[0], &junk, sizeof(junk)),
+ ASSERT_EQ(read(fds[0], &junk, sizeof(junk)),
static_cast<ssize_t>(sizeof(junk)));
}
close(fds[0]);
diff --git a/src/client/mac/handler/breakpad_nlist_64.cc b/src/client/mac/handler/breakpad_nlist_64.cc
index f6e1d95..3492b82 100644
--- a/src/client/mac/handler/breakpad_nlist_64.cc
+++ b/src/client/mac/handler/breakpad_nlist_64.cc
@@ -202,17 +202,6 @@
if (CFSwapInt32BigToHost(*((uint32_t *)&buf)) == FAT_MAGIC ||
/* The following is the big-endian ppc64 check */
*((unsigned int *)&buf) == FAT_MAGIC) {
- /* Get host info */
- host_t host = mach_host_self();
- unsigned hic = HOST_BASIC_INFO_COUNT;
- struct host_basic_info hbi;
- kern_return_t kr;
- if ((kr = host_info(host, HOST_BASIC_INFO,
- (host_info_t)(&hbi), &hic)) != KERN_SUCCESS) {
- return -1;
- }
- mach_port_deallocate(mach_task_self(), host);
-
/* Read in the fat header */
struct fat_header fh;
if (lseek(fd, 0, SEEK_SET) == -1) {
diff --git a/src/client/mac/handler/exception_handler.cc b/src/client/mac/handler/exception_handler.cc
index 2445cb2..6928e98 100644
--- a/src/client/mac/handler/exception_handler.cc
+++ b/src/client/mac/handler/exception_handler.cc
@@ -74,8 +74,12 @@
static union {
#if USE_PROTECTED_ALLOCATIONS
+#if defined PAGE_MAX_SIZE
+ char protected_buffer[PAGE_MAX_SIZE] __attribute__((aligned(PAGE_MAX_SIZE)));
+#else
char protected_buffer[PAGE_SIZE] __attribute__((aligned(PAGE_SIZE)));
-#endif
+#endif // defined PAGE_MAX_SIZE
+#endif // USE_PROTECTED_ALLOCATIONS
google_breakpad::ExceptionHandler *handler;
} gProtectedData;
diff --git a/src/client/minidump_file_writer.h b/src/client/minidump_file_writer.h
index 538e854..ce32b6d 100644
--- a/src/client/minidump_file_writer.h
+++ b/src/client/minidump_file_writer.h
@@ -74,8 +74,8 @@
MinidumpFileWriter();
~MinidumpFileWriter();
- // Open |path| as the destination of the minidump data. Any existing file
- // will be overwritten.
+ // Open |path| as the destination of the minidump data. If |path| already
+ // exists, then Open() will fail.
// Return true on success, or false on failure.
bool Open(const char *path);
diff --git a/src/client/windows/breakpad_client.gyp b/src/client/windows/breakpad_client.gyp
index ae26b91..6479753 100644
--- a/src/client/windows/breakpad_client.gyp
+++ b/src/client/windows/breakpad_client.gyp
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 2010 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
@@ -29,7 +28,7 @@
{
'includes': [
- 'build/common.gypi',
+ '../../build/common.gypi',
],
'targets': [
{
diff --git a/src/client/windows/build/internal/release_defaults.gypi b/src/client/windows/build/internal/release_defaults.gypi
deleted file mode 100644
index 1bf6bbe..0000000
--- a/src/client/windows/build/internal/release_defaults.gypi
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- 'msvs_settings': {
- 'VCCLCompilerTool': {
- 'Optimization': '2',
- 'StringPooling': 'true',
- 'OmitFramePointers': 'true',
- },
- 'VCLinkerTool': {
- 'LinkIncremental': '1',
- 'OptimizeReferences': '2',
- 'EnableCOMDATFolding': '2',
- 'OptimizeForWindows98': '1',
- },
- },
-}
diff --git a/src/client/windows/build/internal/release_impl.gypi b/src/client/windows/build/internal/release_impl.gypi
deleted file mode 100644
index aff06dc..0000000
--- a/src/client/windows/build/internal/release_impl.gypi
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- 'includes': ['release_defaults.gypi'],
-}
diff --git a/src/client/windows/build/internal/release_impl_official.gypi b/src/client/windows/build/internal/release_impl_official.gypi
deleted file mode 100644
index 18f7928..0000000
--- a/src/client/windows/build/internal/release_impl_official.gypi
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- 'includes': ['release_defaults.gypi'],
- 'defines': ['OFFICIAL_BUILD'],
- 'msvs_settings': {
- 'VCCLCompilerTool': {
- 'Optimization': '3',
- 'InlineFunctionExpansion': '2',
- 'EnableIntrinsicFunctions': 'true',
- 'FavorSizeOrSpeed': '2',
- 'OmitFramePointers': 'true',
- 'EnableFiberSafeOptimizations': 'true',
- 'WholeProgramOptimization': 'true',
- },
- 'VCLibrarianTool': {
- 'AdditionalOptions': ['/ltcg', '/expectedoutputsize:120000000'],
- },
- 'VCLinkerTool': {
- 'LinkTimeCodeGeneration': '1',
- },
- },
-}
diff --git a/src/client/windows/build/release.gypi b/src/client/windows/build/release.gypi
deleted file mode 100644
index c12526b..0000000
--- a/src/client/windows/build/release.gypi
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- 'conditions': [
- # Handle build types.
- ['buildtype=="Dev"', {
- 'includes': ['internal/release_impl.gypi'],
- }],
- ['buildtype=="Official"', {
- 'includes': ['internal/release_impl_official.gypi'],
- }],
- # TODO(bradnelson): may also need:
- # checksenabled
- # coverage
- # dom_stats
- # pgo_instrument
- # pgo_optimize
- # purify
- ],
-}
-
diff --git a/src/client/windows/crash_generation/crash_generation.gyp b/src/client/windows/crash_generation/crash_generation.gyp
index 23862d7..ba34376 100644
--- a/src/client/windows/crash_generation/crash_generation.gyp
+++ b/src/client/windows/crash_generation/crash_generation.gyp
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 2010 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
@@ -29,7 +28,7 @@
{
'includes': [
- '../build/common.gypi',
+ '../../../build/common.gypi',
],
'targets': [
{
diff --git a/src/client/windows/handler/exception_handler.gyp b/src/client/windows/handler/exception_handler.gyp
index 7729362..c573327 100644
--- a/src/client/windows/handler/exception_handler.gyp
+++ b/src/client/windows/handler/exception_handler.gyp
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 2010 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
@@ -29,7 +28,7 @@
{
'includes': [
- '../build/common.gypi',
+ '../../../build/common.gypi',
],
'targets': [
{
diff --git a/src/client/windows/sender/crash_report_sender.gyp b/src/client/windows/sender/crash_report_sender.gyp
index e4db3a8..dc8583a 100644
--- a/src/client/windows/sender/crash_report_sender.gyp
+++ b/src/client/windows/sender/crash_report_sender.gyp
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 2010 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
@@ -29,7 +28,7 @@
{
'includes': [
- '../build/common.gypi',
+ '../../../build/common.gypi',
],
'targets': [
{
diff --git a/src/client/windows/tests/crash_generation_app/crash_generation_app.cc b/src/client/windows/tests/crash_generation_app/crash_generation_app.cc
index 7a6c1a9..fa4e634 100644
--- a/src/client/windows/tests/crash_generation_app/crash_generation_app.cc
+++ b/src/client/windows/tests/crash_generation_app/crash_generation_app.cc
@@ -283,6 +283,12 @@
}
std::wstring dump_path = L"C:\\Dumps\\";
+
+ if (_wmkdir(dump_path.c_str()) && (errno != EEXIST)) {
+ MessageBoxW(NULL, L"Unable to create dump directory", L"Dumper", MB_OK);
+ return;
+ }
+
crash_server = new CrashGenerationServer(kPipeName,
NULL,
ShowClientConnected,
diff --git a/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp b/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp
index 963d9cd..3ce307d 100644
--- a/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp
+++ b/src/client/windows/tests/crash_generation_app/crash_generation_app.gyp
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 2010 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
@@ -29,7 +28,7 @@
{
'includes': [
- '../../build/common.gypi',
+ '../../../../build/common.gypi',
],
'targets': [
{
diff --git a/src/client/windows/unittests/client_tests.gyp b/src/client/windows/unittests/client_tests.gyp
index 6dc9fe7..ba1b3d2 100644
--- a/src/client/windows/unittests/client_tests.gyp
+++ b/src/client/windows/unittests/client_tests.gyp
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 2010 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
@@ -29,7 +28,7 @@
{
'includes': [
- '../build/common.gypi',
+ '../../../build/common.gypi',
],
'targets': [
{
diff --git a/src/client/windows/unittests/testing.gyp b/src/client/windows/unittests/testing.gyp
index 3234f46..141d0ed 100644
--- a/src/client/windows/unittests/testing.gyp
+++ b/src/client/windows/unittests/testing.gyp
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 2010 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
@@ -29,7 +28,7 @@
{
'includes': [
- '../build/common.gypi',
+ '../../../build/common.gypi',
],
'target_defaults': {
},
diff --git a/src/common/android/breakpad_getcontext.S b/src/common/android/breakpad_getcontext.S
index b41cb05..79fe88d 100644
--- a/src/common/android/breakpad_getcontext.S
+++ b/src/common/android/breakpad_getcontext.S
@@ -90,6 +90,9 @@
#elif defined(__aarch64__)
+#define _NSIG 64
+#define __NR_rt_sigprocmask 135
+
.text
.global breakpad_getcontext
.hidden breakpad_getcontext
@@ -302,6 +305,87 @@
END (breakpad_getcontext)
+#elif defined(__x86_64__)
+/* The x64 implementation of breakpad_getcontext was derived in part
+ from the implementation of libunwind which requires the following
+ notice. */
+/* libunwind - a platform-independent unwind library
+ Copyright (C) 2008 Google, Inc
+ Contributed by Paul Pluzhnikov <ppluzhnikov@google.com>
+ Copyright (C) 2010 Konstantin Belousov <kib@freebsd.org>
+
+This file is part of libunwind.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+
+ .text
+ .global breakpad_getcontext
+ .hidden breakpad_getcontext
+ .align 4
+ .type breakpad_getcontext, @function
+
+breakpad_getcontext:
+ .cfi_startproc
+
+ /* Callee saved: RBX, RBP, R12-R15 */
+ movq %r12, MCONTEXT_GREGS_R12(%rdi)
+ movq %r13, MCONTEXT_GREGS_R13(%rdi)
+ movq %r14, MCONTEXT_GREGS_R14(%rdi)
+ movq %r15, MCONTEXT_GREGS_R15(%rdi)
+ movq %rbp, MCONTEXT_GREGS_RBP(%rdi)
+ movq %rbx, MCONTEXT_GREGS_RBX(%rdi)
+
+ /* Save argument registers (not strictly needed, but setcontext
+ restores them, so don't restore garbage). */
+ movq %r8, MCONTEXT_GREGS_R8(%rdi)
+ movq %r9, MCONTEXT_GREGS_R9(%rdi)
+ movq %rdi, MCONTEXT_GREGS_RDI(%rdi)
+ movq %rsi, MCONTEXT_GREGS_RSI(%rdi)
+ movq %rdx, MCONTEXT_GREGS_RDX(%rdi)
+ movq %rax, MCONTEXT_GREGS_RAX(%rdi)
+ movq %rcx, MCONTEXT_GREGS_RCX(%rdi)
+
+ /* Save fp state (not needed, except for setcontext not
+ restoring garbage). */
+ leaq MCONTEXT_FPREGS_MEM(%rdi),%r8
+ movq %r8, MCONTEXT_FPREGS_PTR(%rdi)
+ fnstenv (%r8)
+ stmxcsr FPREGS_OFFSET_MXCSR(%r8)
+
+ leaq 8(%rsp), %rax /* exclude this call. */
+ movq %rax, MCONTEXT_GREGS_RSP(%rdi)
+
+ movq 0(%rsp), %rax
+ movq %rax, MCONTEXT_GREGS_RIP(%rdi)
+
+ /* Save signal mask: sigprocmask(SIGBLOCK, NULL, &uc->uc_sigmask) */
+ leaq UCONTEXT_SIGMASK_OFFSET(%rdi), %rdx // arg3
+ xorq %rsi, %rsi // arg2 NULL
+ xorq %rdi, %rdi // arg1 SIGBLOCK == 0
+ call sigprocmask@PLT
+
+ /* Always return 0 for success, even if sigprocmask failed. */
+ xorl %eax, %eax
+ ret
+ .cfi_endproc
+ .size breakpad_getcontext, . - breakpad_getcontext
#else
#error "This file has not been ported for your CPU!"
diff --git a/src/common/android/breakpad_getcontext_unittest.cc b/src/common/android/breakpad_getcontext_unittest.cc
index c1b69c2..2c550bf 100644
--- a/src/common/android/breakpad_getcontext_unittest.cc
+++ b/src/common/android/breakpad_getcontext_unittest.cc
@@ -27,17 +27,45 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#if defined(__x86_64__)
+#include <asm/sigcontext.h>
+#endif
+
#include <sys/ucontext.h>
#include "breakpad_googletest_includes.h"
#include "common/android/ucontext_constants.h"
+template <int left, int right>
+struct CompileAssertEquals {
+ // a compilation error here indicates left and right are not equal.
+ char left_too_large[right - left];
+ // a compilation error here indicates left and right are not equal.
+ char right_too_large[left - right];
+};
+
+#define COMPILE_ASSERT_EQ(left, right, tag) \
+ CompileAssertEquals<left, right> tag;
+
TEST(AndroidUContext, GRegsOffset) {
-#ifdef __arm__
+#if defined(__arm__)
// There is no gregs[] array on ARM, so compare to the offset of
// first register fields, since they're stored in order.
ASSERT_EQ(static_cast<size_t>(MCONTEXT_GREGS_OFFSET),
offsetof(ucontext_t,uc_mcontext.arm_r0));
+#elif defined(__aarch64__)
+ // There is no gregs[] array on ARM, so compare to the offset of
+ // first register fields, since they're stored in order.
+ ASSERT_EQ(static_cast<size_t>(MCONTEXT_GREGS_OFFSET),
+ offsetof(ucontext_t,uc_mcontext.regs[0]));
+ ASSERT_EQ(static_cast<size_t>(MCONTEXT_SP_OFFSET),
+ offsetof(ucontext_t,uc_mcontext.sp));
+ ASSERT_EQ(static_cast<size_t>(MCONTEXT_PC_OFFSET),
+ offsetof(ucontext_t,uc_mcontext.pc));
+ ASSERT_EQ(static_cast<size_t>(MCONTEXT_PSTATE_OFFSET),
+ offsetof(ucontext_t,uc_mcontext.pstate));
+ ASSERT_EQ(static_cast<size_t>(MCONTEXT_EXTENSION_OFFSET),
+ offsetof(ucontext_t,uc_mcontext.__reserved));
#elif defined(__i386__)
ASSERT_EQ(static_cast<size_t>(MCONTEXT_GREGS_OFFSET),
offsetof(ucontext_t,uc_mcontext.gregs));
@@ -82,6 +110,70 @@
ASSERT_EQ(static_cast<size_t>(MCONTEXT_FPC_CSR),
offsetof(ucontext_t,uc_mcontext.fpc_csr));
+#elif defined(__x86_64__)
+
+ COMPILE_ASSERT_EQ(static_cast<size_t>(MCONTEXT_GREGS_OFFSET),
+ offsetof(ucontext_t,uc_mcontext.gregs),
+ mcontext_gregs_offset);
+#define CHECK_REG(x) \
+ COMPILE_ASSERT_EQ(static_cast<size_t>(MCONTEXT_GREGS_##x), \
+ offsetof(ucontext_t,uc_mcontext.gregs[REG_##x]), reg_##x)
+ CHECK_REG(R8);
+ CHECK_REG(R9);
+ CHECK_REG(R10);
+ CHECK_REG(R11);
+ CHECK_REG(R12);
+ CHECK_REG(R13);
+ CHECK_REG(R14);
+ CHECK_REG(R15);
+ CHECK_REG(RDI);
+ CHECK_REG(RSI);
+ CHECK_REG(RBP);
+ CHECK_REG(RBX);
+ CHECK_REG(RDX);
+ CHECK_REG(RAX);
+ CHECK_REG(RCX);
+ CHECK_REG(RSP);
+ CHECK_REG(RIP);
+
+ // sigcontext is an analog to mcontext_t. The layout should be the same.
+ COMPILE_ASSERT_EQ(offsetof(mcontext_t,fpregs),
+ offsetof(sigcontext,fpstate), sigcontext_fpstate);
+ // Check that _fpstate from asm/sigcontext.h is essentially the same
+ // as _libc_fpstate.
+ COMPILE_ASSERT_EQ(sizeof(_libc_fpstate), sizeof(_fpstate),
+ sigcontext_fpstate_size);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,cwd),offsetof(_fpstate,cwd),
+ sigcontext_fpstate_cwd);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,swd),offsetof(_fpstate,swd),
+ sigcontext_fpstate_swd);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,ftw),offsetof(_fpstate,twd),
+ sigcontext_fpstate_twd);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,fop),offsetof(_fpstate,fop),
+ sigcontext_fpstate_fop);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,rip),offsetof(_fpstate,rip),
+ sigcontext_fpstate_rip);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,rdp),offsetof(_fpstate,rdp),
+ sigcontext_fpstate_rdp);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,mxcsr),offsetof(_fpstate,mxcsr),
+ sigcontext_fpstate_mxcsr);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,mxcr_mask),
+ offsetof(_fpstate,mxcsr_mask),
+ sigcontext_fpstate_mxcsr_mask);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,_st), offsetof(_fpstate,st_space),
+ sigcontext_fpstate_stspace);
+ COMPILE_ASSERT_EQ(offsetof(_libc_fpstate,_xmm), offsetof(_fpstate,xmm_space),
+ sigcontext_fpstate_xmm_space);
+
+ COMPILE_ASSERT_EQ(MCONTEXT_FPREGS_PTR,
+ offsetof(ucontext_t,uc_mcontext.fpregs),
+ mcontext_fpregs_ptr);
+ COMPILE_ASSERT_EQ(MCONTEXT_FPREGS_MEM, offsetof(ucontext_t,__fpregs_mem),
+ mcontext_fpregs_mem);
+ COMPILE_ASSERT_EQ(FPREGS_OFFSET_MXCSR, offsetof(_libc_fpstate,mxcsr),
+ fpregs_offset_mxcsr);
+ COMPILE_ASSERT_EQ(UCONTEXT_SIGMASK_OFFSET, offsetof(ucontext_t, uc_sigmask),
+ ucontext_sigmask);
#else
ASSERT_EQ(static_cast<size_t>(MCONTEXT_GREGS_OFFSET),
offsetof(ucontext_t,uc_mcontext.gregs));
diff --git a/src/common/android/include/sys/procfs.h b/src/common/android/include/sys/procfs.h
index ec65b91..bedae34 100644
--- a/src/common/android/include/sys/procfs.h
+++ b/src/common/android/include/sys/procfs.h
@@ -36,6 +36,7 @@
#else
+#include <asm/ptrace.h>
#include <sys/cdefs.h>
#include <sys/user.h>
#include <unistd.h>
@@ -54,6 +55,8 @@
#define ELF_NGREG (sizeof(struct user_regs) / sizeof(elf_greg_t))
#elif defined(__aarch64__)
#define ELF_NGREG (sizeof(struct user_pt_regs) / sizeof(elf_greg_t))
+#elif defined(__mips__)
+#define ELF_NGREG 45
#else
#define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
#endif
@@ -94,6 +97,9 @@
#ifdef __x86_64__
unsigned int pr_uid;
unsigned int pr_gid;
+#elif defined(__mips__)
+ unsigned long pr_uid;
+ unsigned long pr_gid;
#else
unsigned short pr_uid;
unsigned short pr_gid;
diff --git a/src/common/android/include/sys/ucontext.h b/src/common/android/include/sys/ucontext.h
index 8bd5877..8014928 100644
--- a/src/common/android/include/sys/ucontext.h
+++ b/src/common/android/include/sys/ucontext.h
@@ -72,6 +72,7 @@
struct ucontext *uc_link;
stack_t uc_stack;
sigset_t uc_sigmask;
+ char __padding[128 - sizeof(sigset_t)];
mcontext_t uc_mcontext;
} ucontext_t;
@@ -174,6 +175,73 @@
// Other fields are not used by Google Breakpad. Don't define them.
} ucontext_t;
+#elif defined(__x86_64__)
+enum {
+ REG_R8 = 0,
+ REG_R9,
+ REG_R10,
+ REG_R11,
+ REG_R12,
+ REG_R13,
+ REG_R14,
+ REG_R15,
+ REG_RDI,
+ REG_RSI,
+ REG_RBP,
+ REG_RBX,
+ REG_RDX,
+ REG_RAX,
+ REG_RCX,
+ REG_RSP,
+ REG_RIP,
+ REG_EFL,
+ REG_CSGSFS,
+ REG_ERR,
+ REG_TRAPNO,
+ REG_OLDMASK,
+ REG_CR2,
+ NGREG
+};
+
+// This struct is essentially the same as _fpstate in asm/sigcontext.h
+// except that the individual field names are chosen here to match the
+// ones used in breakpad for other x86_64 platforms.
+struct _libc_fpstate {
+ /* 64-bit FXSAVE format. */
+ uint16_t cwd;
+ uint16_t swd;
+ uint16_t ftw;
+ uint16_t fop;
+ uint64_t rip;
+ uint64_t rdp;
+ uint32_t mxcsr;
+ uint32_t mxcr_mask;
+ uint32_t _st[32]; // 128 bytes for the ST/MM registers 0-7
+ uint32_t _xmm[64]; // 256 bytes for the XMM registers 0-7
+ uint32_t padding[24]; // 96 bytes
+};
+
+typedef long greg_t;
+typedef greg_t gregset_t[NGREG];
+
+typedef struct _libc_fpstate* fpregset_t;
+
+typedef struct {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ uint64_t __reserved1[8];
+} mcontext_t;
+
+typedef struct ucontext {
+ unsigned long uc_flags;
+ struct ucontext* uc_link;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ sigset_t uc_sigmask;
+ uint64_t __padding[18];
+ _libc_fpstate __fpregs_mem;
+} ucontext_t;
+
#else
# error "Unsupported Android CPU ABI!"
#endif
diff --git a/src/common/android/include/sys/user.h b/src/common/android/include/sys/user.h
index 257cd80..f7b6706 100644
--- a/src/common/android/include/sys/user.h
+++ b/src/common/android/include/sys/user.h
@@ -127,6 +127,54 @@
#define _ASM_USER_H 1 // Prevent <asm/user.h> conflicts
+#define EF_REG0 6
+#define EF_REG1 7
+#define EF_REG2 8
+#define EF_REG3 9
+#define EF_REG4 10
+#define EF_REG5 11
+#define EF_REG6 12
+#define EF_REG7 13
+#define EF_REG8 14
+#define EF_REG9 15
+#define EF_REG10 16
+#define EF_REG11 17
+#define EF_REG12 18
+#define EF_REG13 19
+#define EF_REG14 20
+#define EF_REG15 21
+#define EF_REG16 22
+#define EF_REG17 23
+#define EF_REG18 24
+#define EF_REG19 25
+#define EF_REG20 26
+#define EF_REG21 27
+#define EF_REG22 28
+#define EF_REG23 29
+#define EF_REG24 30
+#define EF_REG25 31
+
+/*
+ * k0/k1 unsaved
+ */
+#define EF_REG26 32
+#define EF_REG27 33
+
+#define EF_REG28 34
+#define EF_REG29 35
+#define EF_REG30 36
+#define EF_REG31 37
+
+/*
+ * Saved special registers
+ */
+#define EF_LO 38
+#define EF_HI 39
+#define EF_CP0_EPC 40
+#define EF_CP0_BADVADDR 41
+#define EF_CP0_STATUS 42
+#define EF_CP0_CAUSE 43
+
struct user_regs_struct {
unsigned long long regs[32];
unsigned long long lo;
@@ -143,6 +191,33 @@
unsigned int fir;
};
+#elif defined(__x86_64__)
+
+// Bionic's user_fpregs_struct calls the tag word twd instead of ftw. To avoid
+// changing lots of Bionic, use an ugly macro renaming trick with
+// #include_next.
+// TODO(rmcilroy): Remove when NDK headers are fixed.
+#define user_fpregs_struct __bionic_user_fpregs_struct
+#include_next <sys/user.h>
+#undef user_fpregs_struct
+
+// This struct is the same as user_fpregs_struct in Bionic's sys/user.h
+// except that the struct name and individual field names are chosen here
+// to match the ones used in breakpad for other x86_64 platforms.
+struct user_fpregs_struct {
+ __u16 cwd;
+ __u16 swd;
+ __u16 ftw;
+ __u16 fop;
+ __u64 rip;
+ __u64 rdp;
+ __u32 mxcsr;
+ __u32 mxcr_mask;
+ __u32 st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */
+ __u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg = 256 bytes */
+ __u32 padding[24];
+};
+
#else
# error "Unsupported Android CPU ABI"
#endif
diff --git a/src/common/android/ucontext_constants.h b/src/common/android/ucontext_constants.h
index 4b00ae2..0796805 100644
--- a/src/common/android/ucontext_constants.h
+++ b/src/common/android/ucontext_constants.h
@@ -49,11 +49,11 @@
#define UCONTEXT_SIGMASK_OFFSET 40
-#define MCONTEXT_GREGS_OFFSET 56
-#define MCONTEXT_SP_OFFSET 304
-#define MCONTEXT_PC_OFFSET 312
-#define MCONTEXT_PSTATE_OFFSET 320
-#define MCONTEXT_EXTENSION_OFFSET 336
+#define MCONTEXT_GREGS_OFFSET 184
+#define MCONTEXT_SP_OFFSET 432
+#define MCONTEXT_PC_OFFSET 440
+#define MCONTEXT_PSTATE_OFFSET 448
+#define MCONTEXT_EXTENSION_OFFSET 464
#define FPSIMD_MAGIC 0x46508001
@@ -67,9 +67,6 @@
#define REGISTER_SIZE 8
#define SIMD_REGISTER_SIZE 16
-#define _NSIG 64
-#define __NR_rt_sigprocmask 135
-
#elif defined(__i386__)
#define MCONTEXT_GREGS_OFFSET 20
@@ -106,6 +103,32 @@
#define MCONTEXT_FPC_CSR 556
#define UCONTEXT_SIGMASK_OFFSET 616
+#elif defined(__x86_64__)
+
+#define MCONTEXT_GREGS_OFFSET 40
+#define UCONTEXT_SIGMASK_OFFSET 296
+
+#define MCONTEXT_GREGS_R8 40
+#define MCONTEXT_GREGS_R9 48
+#define MCONTEXT_GREGS_R10 56
+#define MCONTEXT_GREGS_R11 64
+#define MCONTEXT_GREGS_R12 72
+#define MCONTEXT_GREGS_R13 80
+#define MCONTEXT_GREGS_R14 88
+#define MCONTEXT_GREGS_R15 96
+#define MCONTEXT_GREGS_RDI 104
+#define MCONTEXT_GREGS_RSI 112
+#define MCONTEXT_GREGS_RBP 120
+#define MCONTEXT_GREGS_RBX 128
+#define MCONTEXT_GREGS_RDX 136
+#define MCONTEXT_GREGS_RAX 144
+#define MCONTEXT_GREGS_RCX 152
+#define MCONTEXT_GREGS_RSP 160
+#define MCONTEXT_GREGS_RIP 168
+#define MCONTEXT_FPREGS_PTR 224
+#define MCONTEXT_FPREGS_MEM 448
+#define FPREGS_OFFSET_MXCSR 24
+
#else
#error "This header has not been ported for your CPU"
#endif
diff --git a/src/common/dwarf_cfi_to_module.cc b/src/common/dwarf_cfi_to_module.cc
index d0056f3..1bf1d96 100644
--- a/src/common/dwarf_cfi_to_module.cc
+++ b/src/common/dwarf_cfi_to_module.cc
@@ -105,6 +105,26 @@
return MakeVector(names, sizeof(names) / sizeof(names[0]));
}
+// Per ARM IHI 0057A, section 3.1
+vector<string> DwarfCFIToModule::RegisterNames::ARM64() {
+ static const char *const names[] = {
+ "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
+ "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
+ "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
+ "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "", "", "", "", "", "", "", "",
+ "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
+ "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
+ "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
+ "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
+ };
+
+ return MakeVector(names, sizeof(names) / sizeof(names[0]));
+}
+
vector<string> DwarfCFIToModule::RegisterNames::MIPS() {
static const char* const kRegisterNames[] = {
"$zero", "$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3",
@@ -118,7 +138,7 @@
"$f28", "$f29", "$f30", "$f31", "$fcsr", "$fir"
};
- return MakeVector(kRegisterNames,
+ return MakeVector(kRegisterNames,
sizeof(kRegisterNames) / sizeof(kRegisterNames[0]));
}
diff --git a/src/common/dwarf_cfi_to_module.h b/src/common/dwarf_cfi_to_module.h
index d5a8b1c..084b8f5 100644
--- a/src/common/dwarf_cfi_to_module.h
+++ b/src/common/dwarf_cfi_to_module.h
@@ -108,7 +108,10 @@
// ARM.
static vector<string> ARM();
-
+
+ // ARM64, aka AARCH64.
+ static vector<string> ARM64();
+
// MIPS.
static vector<string> MIPS();
@@ -185,7 +188,7 @@
// A set of strings used by this CFI. Before storing a string in one of
// our data structures, insert it into this set, and then use the string
// from the set.
- //
+ //
// Because std::string uses reference counting internally, simply using
// strings from this set, even if passed by value, assigned, or held
// directly in structures and containers (map<string, ...>, for example),
diff --git a/src/common/dwarf_cu_to_module.cc b/src/common/dwarf_cu_to_module.cc
index 8246daf..444e9a9 100644
--- a/src/common/dwarf_cu_to_module.cc
+++ b/src/common/dwarf_cu_to_module.cc
@@ -46,16 +46,15 @@
#include <stdio.h>
#include <algorithm>
-#include <set>
#include <utility>
#include "common/dwarf_line_to_module.h"
+#include "common/unordered.h"
namespace google_breakpad {
using std::map;
using std::pair;
-using std::set;
using std::sort;
using std::vector;
@@ -118,7 +117,7 @@
// so this set will actually hold yet another copy of the string (although
// everything will still work). To improve memory consumption portably,
// we will probably need to use pointers to strings held in this set.
- set<string> common_strings;
+ unordered_set<string> common_strings;
// A map from offsets of DIEs within the .debug_info section to
// Specifications describing those DIEs. Specification references can
@@ -337,7 +336,7 @@
}
string DwarfCUToModule::GenericDIEHandler::AddStringToPool(const string &str) {
- pair<set<string>::iterator, bool> result =
+ pair<unordered_set<string>::iterator, bool> result =
cu_context_->file_context->file_private_->common_strings.insert(str);
return *result.first;
}
@@ -531,7 +530,7 @@
if (low_pc_ < high_pc_) {
// Create a Module::Function based on the data we've gathered, and
// add it to the functions_ list.
- Module::Function *func = new Module::Function;
+ scoped_ptr<Module::Function> func(new Module::Function);
// Malformed DWARF may omit the name, but all Module::Functions must
// have names.
if (!name_.empty()) {
@@ -546,7 +545,7 @@
if (func->address) {
// If the function address is zero this is a sign that this function
// description is just empty debug data and should just be discarded.
- cu_context_->functions.push_back(func);
+ cu_context_->functions.push_back(func.release());
}
} else if (inline_) {
AbstractOrigin origin(name_);
diff --git a/src/common/linux/crc32.cc b/src/common/linux/crc32.cc
new file mode 100644
index 0000000..8df636c
--- /dev/null
+++ b/src/common/linux/crc32.cc
@@ -0,0 +1,70 @@
+// Copyright 2014 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 "common/linux/crc32.h"
+
+namespace google_breakpad {
+
+// This implementation is based on the sample implementation in RFC 1952.
+
+// CRC32 polynomial, in reversed form.
+// See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check
+static const uint32_t kCrc32Polynomial = 0xEDB88320;
+static uint32_t kCrc32Table[256] = { 0 };
+
+#define arraysize(f) (sizeof(f) / sizeof(*f))
+
+static void EnsureCrc32TableInited() {
+ if (kCrc32Table[arraysize(kCrc32Table) - 1])
+ return; // already inited
+ for (uint32_t i = 0; i < arraysize(kCrc32Table); ++i) {
+ uint32_t c = i;
+ for (size_t j = 0; j < 8; ++j) {
+ if (c & 1) {
+ c = kCrc32Polynomial ^ (c >> 1);
+ } else {
+ c >>= 1;
+ }
+ }
+ kCrc32Table[i] = c;
+ }
+}
+
+uint32_t UpdateCrc32(uint32_t start, const void* buf, size_t len) {
+ EnsureCrc32TableInited();
+
+ uint32_t c = start ^ 0xFFFFFFFF;
+ const uint8_t* u = static_cast<const uint8_t*>(buf);
+ for (size_t i = 0; i < len; ++i) {
+ c = kCrc32Table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
+ }
+ return c ^ 0xFFFFFFFF;
+}
+
+} // namespace google_breakpad
diff --git a/src/common/linux/crc32.h b/src/common/linux/crc32.h
new file mode 100644
index 0000000..e3d9db9
--- /dev/null
+++ b/src/common/linux/crc32.h
@@ -0,0 +1,53 @@
+// Copyright 2014 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 COMMON_LINUX_CRC32_H_
+#define COMMON_LINUX_CRC32_H_
+
+#include <stdint.h>
+
+#include <string>
+
+namespace google_breakpad {
+
+// Updates a CRC32 checksum with |len| bytes from |buf|. |initial| holds the
+// checksum result from the previous update; for the first call, it should be 0.
+uint32_t UpdateCrc32(uint32_t initial, const void* buf, size_t len);
+
+// Computes a CRC32 checksum using |len| bytes from |buf|.
+inline uint32_t ComputeCrc32(const void* buf, size_t len) {
+ return UpdateCrc32(0, buf, len);
+}
+inline uint32_t ComputeCrc32(const std::string& str) {
+ return ComputeCrc32(str.c_str(), str.size());
+}
+
+} // namespace google_breakpad
+
+#endif // COMMON_LINUX_CRC32_H_
diff --git a/src/common/linux/dump_symbols.cc b/src/common/linux/dump_symbols.cc
index 75dcfd4..a4686d2 100644
--- a/src/common/linux/dump_symbols.cc
+++ b/src/common/linux/dump_symbols.cc
@@ -57,6 +57,8 @@
#include "common/dwarf_cfi_to_module.h"
#include "common/dwarf_cu_to_module.h"
#include "common/dwarf_line_to_module.h"
+#include "common/linux/crc32.h"
+#include "common/linux/eintr_wrapper.h"
#include "common/linux/elfutils.h"
#include "common/linux/elfutils-inl.h"
#include "common/linux/elf_symbols_to_module.h"
@@ -88,6 +90,11 @@
#endif
using google_breakpad::scoped_ptr;
+// Define AARCH64 ELF architecture if host machine does not include this define.
+#ifndef EM_AARCH64
+#define EM_AARCH64 183
+#endif
+
//
// FDWrapper
//
@@ -141,7 +148,7 @@
private:
bool is_set_;
- void *base_;
+ void* base_;
size_t size_;
};
@@ -204,8 +211,8 @@
void StartCompilationUnit(const string& compilation_dir) {
compilation_dir_ = compilation_dir;
}
- void ReadProgram(const char *program, uint64 length,
- Module *module, std::vector<Module::Line> *lines) {
+ void ReadProgram(const char* program, uint64 length,
+ Module* module, std::vector<Module::Line>* lines) {
DwarfLineToModule handler(module, compilation_dir_, lines);
dwarf2reader::LineInfo parser(program, length, byte_reader_, &handler);
parser.Start();
@@ -291,6 +298,9 @@
case EM_ARM:
*register_names = DwarfCFIToModule::RegisterNames::ARM();
return true;
+ case EM_AARCH64:
+ *register_names = DwarfCFIToModule::RegisterNames::ARM64();
+ return true;
case EM_MIPS:
*register_names = DwarfCFIToModule::RegisterNames::MIPS();
return true;
@@ -369,7 +379,7 @@
obj_file.c_str(), strerror(errno));
return false;
}
- void *obj_base = mmap(NULL, st.st_size,
+ void* obj_base = mmap(NULL, st.st_size,
PROT_READ | PROT_WRITE, MAP_PRIVATE, obj_fd, 0);
if (obj_base == MAP_FAILED) {
fprintf(stderr, "Failed to mmap ELF file '%s': %s\n",
@@ -405,19 +415,19 @@
// Read the .gnu_debuglink and get the debug file name. If anything goes
// wrong, return an empty string.
-template<typename ElfClass>
string ReadDebugLink(const char* debuglink,
- size_t debuglink_size,
+ const size_t debuglink_size,
+ const bool big_endian,
const string& obj_file,
const std::vector<string>& debug_dirs) {
- size_t debuglink_len = strlen(debuglink) + 5; // '\0' + CRC32.
- debuglink_len = 4 * ((debuglink_len + 3) / 4); // Round to nearest 4 bytes.
+ size_t debuglink_len = strlen(debuglink) + 5; // Include '\0' + CRC32.
+ debuglink_len = 4 * ((debuglink_len + 3) / 4); // Round up to 4 bytes.
// Sanity check.
if (debuglink_len != debuglink_size) {
fprintf(stderr, "Mismatched .gnu_debuglink string / section size: "
"%zx %zx\n", debuglink_len, debuglink_size);
- return "";
+ return string();
}
bool found = false;
@@ -428,10 +438,39 @@
const string& debug_dir = *it;
debuglink_path = debug_dir + "/" + debuglink;
debuglink_fd = open(debuglink_path.c_str(), O_RDONLY);
- if (debuglink_fd >= 0) {
- found = true;
- break;
+ if (debuglink_fd < 0)
+ continue;
+
+ FDWrapper debuglink_fd_wrapper(debuglink_fd);
+
+ // The CRC is the last 4 bytes in |debuglink|.
+ const dwarf2reader::Endianness endianness = big_endian ?
+ dwarf2reader::ENDIANNESS_BIG : dwarf2reader::ENDIANNESS_LITTLE;
+ dwarf2reader::ByteReader byte_reader(endianness);
+ uint32_t expected_crc =
+ byte_reader.ReadFourBytes(&debuglink[debuglink_size - 4]);
+
+ uint32_t actual_crc = 0;
+ while (true) {
+ const size_t kReadSize = 4096;
+ char buf[kReadSize];
+ ssize_t bytes_read = HANDLE_EINTR(read(debuglink_fd, &buf, kReadSize));
+ if (bytes_read < 0) {
+ fprintf(stderr, "Error reading debug ELF file %s.\n",
+ debuglink_path.c_str());
+ return string();
+ }
+ if (bytes_read == 0)
+ break;
+ actual_crc = google_breakpad::UpdateCrc32(actual_crc, buf, bytes_read);
}
+ if (actual_crc != expected_crc) {
+ fprintf(stderr, "Error reading debug ELF file - CRC32 mismatch: %s\n",
+ debuglink_path.c_str());
+ continue;
+ }
+ found = true;
+ break;
}
if (!found) {
@@ -441,13 +480,9 @@
const string debug_dir = *it;
fprintf(stderr, " %s/%s\n", debug_dir.c_str(), debuglink);
}
- return "";
+ return string();
}
- FDWrapper debuglink_fd_wrapper(debuglink_fd);
- // TODO(thestig) check the CRC-32 at the end of the .gnu_debuglink
- // section.
-
return debuglink_path;
}
@@ -545,7 +580,7 @@
module->SetLoadAddress(loading_addr);
info->set_loading_addr(loading_addr, obj_file);
- Word debug_section_type =
+ Word debug_section_type =
elf_header->e_machine == EM_MIPS ? SHT_MIPS_DWARF : SHT_PROGBITS;
const Shdr* sections =
GetOffset<ElfClass, Shdr>(elf_header, elf_header->e_shoff);
@@ -657,10 +692,12 @@
const char* debuglink_contents =
GetOffset<ElfClass, char>(elf_header,
gnu_debuglink_section->sh_offset);
- string debuglink_file
- = ReadDebugLink<ElfClass>(debuglink_contents,
- gnu_debuglink_section->sh_size,
- obj_file, info->debug_dirs());
+ string debuglink_file =
+ ReadDebugLink(debuglink_contents,
+ gnu_debuglink_section->sh_size,
+ big_endian,
+ obj_file,
+ info->debug_dirs());
info->set_debuglink_file(debuglink_file);
} else {
fprintf(stderr, ".gnu_debuglink section found in '%s', "
@@ -725,6 +762,7 @@
switch (arch) {
case EM_386: return "x86";
case EM_ARM: return "arm";
+ case EM_AARCH64: return "arm64";
case EM_MIPS: return "mips";
case EM_PPC64: return "ppc64";
case EM_PPC: return "ppc";
@@ -759,7 +797,7 @@
// last slash, or the whole filename if there are no slashes.
string BaseFileName(const string &filename) {
// Lots of copies! basename's behavior is less than ideal.
- char *c_filename = strdup(filename.c_str());
+ char* c_filename = strdup(filename.c_str());
string base = basename(c_filename);
free(c_filename);
return base;
diff --git a/src/common/linux/elf_core_dump_unittest.cc b/src/common/linux/elf_core_dump_unittest.cc
index 4eae968..9b41dce 100644
--- a/src/common/linux/elf_core_dump_unittest.cc
+++ b/src/common/linux/elf_core_dump_unittest.cc
@@ -70,7 +70,7 @@
ElfCoreDump core;
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header) - 1));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_FALSE(core.IsValid());
EXPECT_EQ(NULL, core.GetHeader());
@@ -80,49 +80,49 @@
EXPECT_FALSE(core.GetFirstNote().IsValid());
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_FALSE(core.IsValid());
header.e_ident[0] = ELFMAG0;
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_FALSE(core.IsValid());
header.e_ident[1] = ELFMAG1;
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_FALSE(core.IsValid());
header.e_ident[2] = ELFMAG2;
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_FALSE(core.IsValid());
header.e_ident[3] = ELFMAG3;
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_FALSE(core.IsValid());
header.e_ident[4] = ElfCoreDump::kClass;
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_FALSE(core.IsValid());
header.e_version = EV_CURRENT;
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_FALSE(core.IsValid());
header.e_type = ET_CORE;
ASSERT_TRUE(WriteFile(core_file, &header, sizeof(header)));
- ASSERT_TRUE(mapped_core_file.Map(core_file));
+ ASSERT_TRUE(mapped_core_file.Map(core_file, 0));
core.SetContent(mapped_core_file.content());
EXPECT_TRUE(core.IsValid());
}
@@ -146,8 +146,18 @@
expected_thread_ids.insert(crash_generator.GetThreadId(i));
}
+#if defined(__ANDROID__)
+ struct stat st;
+ if (stat(crash_generator.GetCoreFilePath().c_str(), &st) != 0) {
+ fprintf(stderr, "ElfCoreDumpTest.ValidCoreFile test is skipped "
+ "due to no core file being generated");
+ return;
+ }
+#endif
+
MemoryMappedFile mapped_core_file;
- ASSERT_TRUE(mapped_core_file.Map(crash_generator.GetCoreFilePath().c_str()));
+ ASSERT_TRUE(
+ mapped_core_file.Map(crash_generator.GetCoreFilePath().c_str(), 0));
ElfCoreDump core;
core.SetContent(mapped_core_file.content());
diff --git a/src/common/linux/elfutils.cc b/src/common/linux/elfutils.cc
index 1fd504d..a79391c 100644
--- a/src/common/linux/elfutils.cc
+++ b/src/common/linux/elfutils.cc
@@ -44,7 +44,7 @@
const char *section_name,
typename ElfClass::Word section_type,
const void **section_start,
- int *section_size) {
+ size_t *section_size) {
typedef typename ElfClass::Ehdr Ehdr;
typedef typename ElfClass::Shdr Shdr;
@@ -58,10 +58,10 @@
assert(elf_header->e_ident[EI_CLASS] == ElfClass::kClass);
const Shdr* sections =
- GetOffset<ElfClass,Shdr>(elf_header, elf_header->e_shoff);
+ GetOffset<ElfClass, Shdr>(elf_header, elf_header->e_shoff);
const Shdr* section_names = sections + elf_header->e_shstrndx;
const char* names =
- GetOffset<ElfClass,char>(elf_header, section_names->sh_offset);
+ GetOffset<ElfClass, char>(elf_header, section_names->sh_offset);
const char *names_end = names + section_names->sh_size;
const Shdr* section =
@@ -79,7 +79,7 @@
void FindElfClassSegment(const char *elf_base,
typename ElfClass::Word segment_type,
const void **segment_start,
- int *segment_size) {
+ size_t *segment_size) {
typedef typename ElfClass::Ehdr Ehdr;
typedef typename ElfClass::Phdr Phdr;
@@ -93,7 +93,7 @@
assert(elf_header->e_ident[EI_CLASS] == ElfClass::kClass);
const Phdr* phdrs =
- GetOffset<ElfClass,Phdr>(elf_header, elf_header->e_phoff);
+ GetOffset<ElfClass, Phdr>(elf_header, elf_header->e_phoff);
for (int i = 0; i < elf_header->e_phnum; ++i) {
if (phdrs[i].p_type == segment_type) {
@@ -122,7 +122,7 @@
const char *section_name,
uint32_t section_type,
const void **section_start,
- int *section_size,
+ size_t *section_size,
int *elfclass) {
assert(elf_mapped_base);
assert(section_start);
@@ -158,7 +158,7 @@
bool FindElfSegment(const void *elf_mapped_base,
uint32_t segment_type,
const void **segment_start,
- int *segment_size,
+ size_t *segment_size,
int *elfclass) {
assert(elf_mapped_base);
assert(segment_start);
diff --git a/src/common/linux/elfutils.h b/src/common/linux/elfutils.h
index fe12e25..dccdc23 100644
--- a/src/common/linux/elfutils.h
+++ b/src/common/linux/elfutils.h
@@ -30,8 +30,8 @@
// elfutils.h: Utilities for dealing with ELF files.
//
-#ifndef COMMON_LINUX_ELFUTILS_H__
-#define COMMON_LINUX_ELFUTILS_H__
+#ifndef COMMON_LINUX_ELFUTILS_H_
+#define COMMON_LINUX_ELFUTILS_H_
#include <elf.h>
#include <link.h>
@@ -79,7 +79,7 @@
const char *section_name,
uint32_t section_type,
const void **section_start,
- int *section_size,
+ size_t *section_size,
int *elfclass);
// Internal helper method, exposed for convenience for callers
@@ -101,7 +101,7 @@
bool FindElfSegment(const void *elf_mapped_base,
uint32_t segment_type,
const void **segment_start,
- int *segment_size,
+ size_t *segment_size,
int *elfclass);
// Convert an offset from an Elf header into a pointer to the mapped
@@ -115,4 +115,4 @@
} // namespace google_breakpad
-#endif // COMMON_LINUX_ELFUTILS_H__
+#endif // COMMON_LINUX_ELFUTILS_H_
diff --git a/src/common/linux/file_id.cc b/src/common/linux/file_id.cc
index 31ea9da..00b3731 100644
--- a/src/common/linux/file_id.cc
+++ b/src/common/linux/file_id.cc
@@ -57,7 +57,7 @@
// and use the syscall/libc wrappers instead of direct syscalls or libc.
template<typename ElfClass>
-static bool ElfClassBuildIDNoteIdentifier(const void *section, int length,
+static bool ElfClassBuildIDNoteIdentifier(const void *section, size_t length,
uint8_t identifier[kMDGUIDSize]) {
typedef typename ElfClass::Nhdr Nhdr;
@@ -92,7 +92,8 @@
static bool FindElfBuildIDNote(const void *elf_mapped_base,
uint8_t identifier[kMDGUIDSize]) {
void* note_section;
- int note_size, elfclass;
+ size_t note_size;
+ int elfclass;
if ((!FindElfSegment(elf_mapped_base, PT_NOTE,
(const void**)¬e_section, ¬e_size, &elfclass) ||
note_size == 0) &&
@@ -118,7 +119,7 @@
static bool HashElfTextSection(const void *elf_mapped_base,
uint8_t identifier[kMDGUIDSize]) {
void* text_section;
- int text_size;
+ size_t text_size;
if (!FindElfSection(elf_mapped_base, ".text", SHT_PROGBITS,
(const void**)&text_section, &text_size, NULL) ||
text_size == 0) {
@@ -127,7 +128,7 @@
my_memset(identifier, 0, kMDGUIDSize);
const uint8_t* ptr = reinterpret_cast<const uint8_t*>(text_section);
- const uint8_t* ptr_end = ptr + std::min(text_size, 4096);
+ const uint8_t* ptr_end = ptr + std::min(text_size, static_cast<size_t>(4096));
while (ptr < ptr_end) {
for (unsigned i = 0; i < kMDGUIDSize; i++)
identifier[i] ^= ptr[i];
@@ -148,7 +149,7 @@
}
bool FileID::ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]) {
- MemoryMappedFile mapped_file(path_.c_str());
+ MemoryMappedFile mapped_file(path_.c_str(), 0);
if (!mapped_file.data()) // Should probably check if size >= ElfW(Ehdr)?
return false;
diff --git a/src/common/linux/google_crashdump_uploader.cc b/src/common/linux/google_crashdump_uploader.cc
index ea72a86..4da1f5e 100644
--- a/src/common/linux/google_crashdump_uploader.cc
+++ b/src/common/linux/google_crashdump_uploader.cc
@@ -29,7 +29,6 @@
#include "common/linux/google_crashdump_uploader.h"
-#include "common/linux/libcurl_wrapper.h"
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/src/common/linux/google_crashdump_uploader.h b/src/common/linux/google_crashdump_uploader.h
index c8d8b8a..4490162 100644
--- a/src/common/linux/google_crashdump_uploader.h
+++ b/src/common/linux/google_crashdump_uploader.h
@@ -31,13 +31,12 @@
#include <string>
#include <map>
+#include "common/linux/libcurl_wrapper.h"
#include "common/scoped_ptr.h"
#include "common/using_std_string.h"
namespace google_breakpad {
-class LibcurlWrapper;
-
class GoogleCrashdumpUploader {
public:
GoogleCrashdumpUploader(const string& product,
diff --git a/src/common/linux/libcurl_wrapper.cc b/src/common/linux/libcurl_wrapper.cc
index 08307f0..4ff9bb0 100644
--- a/src/common/linux/libcurl_wrapper.cc
+++ b/src/common/linux/libcurl_wrapper.cc
@@ -57,6 +57,8 @@
return;
}
+LibcurlWrapper::~LibcurlWrapper() {}
+
bool LibcurlWrapper::SetProxy(const string& proxy_host,
const string& proxy_userpwd) {
if (!init_ok_) {
diff --git a/src/common/linux/libcurl_wrapper.h b/src/common/linux/libcurl_wrapper.h
index 3b72b5e..3d46c2e 100644
--- a/src/common/linux/libcurl_wrapper.h
+++ b/src/common/linux/libcurl_wrapper.h
@@ -40,6 +40,7 @@
class LibcurlWrapper {
public:
LibcurlWrapper();
+ ~LibcurlWrapper();
virtual bool Init();
virtual bool SetProxy(const string& proxy_host,
const string& proxy_userpwd);
diff --git a/src/common/linux/memory_mapped_file.cc b/src/common/linux/memory_mapped_file.cc
index 0f0fcb2..064326b 100644
--- a/src/common/linux/memory_mapped_file.cc
+++ b/src/common/linux/memory_mapped_file.cc
@@ -46,15 +46,15 @@
MemoryMappedFile::MemoryMappedFile() {}
-MemoryMappedFile::MemoryMappedFile(const char* path) {
- Map(path);
+MemoryMappedFile::MemoryMappedFile(const char* path, size_t offset) {
+ Map(path, offset);
}
MemoryMappedFile::~MemoryMappedFile() {
Unmap();
}
-bool MemoryMappedFile::Map(const char* path) {
+bool MemoryMappedFile::Map(const char* path, size_t offset) {
Unmap();
int fd = sys_open(path, O_RDONLY, 0);
@@ -73,25 +73,33 @@
return false;
}
- // If the file size is zero, simply use an empty MemoryRange and return
- // true. Don't bother to call mmap() even though mmap() can handle an
- // empty file on some platforms.
- if (st.st_size == 0) {
+ // Strangely file size can be negative, but we check above that it is not.
+ size_t file_len = static_cast<size_t>(st.st_size);
+ // If the file does not extend beyond the offset, simply use an empty
+ // MemoryRange and return true. Don't bother to call mmap()
+ // even though mmap() can handle an empty file on some platforms.
+ if (offset >= file_len) {
sys_close(fd);
return true;
}
#if defined(__x86_64__) || defined(__aarch64__)
- void* data = sys_mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ void* data = sys_mmap(NULL, file_len, PROT_READ, MAP_PRIVATE, fd, offset);
#else
- void* data = sys_mmap2(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+ if ((offset & 4095) != 0) {
+ // Not page aligned.
+ sys_close(fd);
+ return false;
+ }
+ void* data = sys_mmap2(
+ NULL, file_len, PROT_READ, MAP_PRIVATE, fd, offset >> 12);
#endif
sys_close(fd);
if (data == MAP_FAILED) {
return false;
}
- content_.Set(data, st.st_size);
+ content_.Set(data, file_len - offset);
return true;
}
diff --git a/src/common/linux/memory_mapped_file.h b/src/common/linux/memory_mapped_file.h
index 6abd5b0..fa660cc 100644
--- a/src/common/linux/memory_mapped_file.h
+++ b/src/common/linux/memory_mapped_file.h
@@ -33,6 +33,7 @@
#ifndef COMMON_LINUX_MEMORY_MAPPED_FILE_H_
#define COMMON_LINUX_MEMORY_MAPPED_FILE_H_
+#include <stddef.h>
#include "common/basictypes.h"
#include "common/memory_range.h"
@@ -47,7 +48,7 @@
// Constructor that calls Map() to map a file at |path| into memory.
// If Map() fails, the object behaves as if it is default constructed.
- explicit MemoryMappedFile(const char* path);
+ MemoryMappedFile(const char* path, size_t offset);
~MemoryMappedFile();
@@ -56,7 +57,7 @@
// success. Mapping an empty file will succeed but with data() and size()
// returning NULL and 0, respectively. An existing mapping is unmapped
// before a new mapping is created.
- bool Map(const char* path);
+ bool Map(const char* path, size_t offset);
// Unmaps the memory for the mapped file. It's a no-op if no file is
// mapped.
diff --git a/src/common/linux/memory_mapped_file_unittest.cc b/src/common/linux/memory_mapped_file_unittest.cc
index 4fa50cf..fad59f4 100644
--- a/src/common/linux/memory_mapped_file_unittest.cc
+++ b/src/common/linux/memory_mapped_file_unittest.cc
@@ -71,12 +71,12 @@
TEST_F(MemoryMappedFileTest, MapNonexistentFile) {
{
- MemoryMappedFile mapped_file("nonexistent-file");
+ MemoryMappedFile mapped_file("nonexistent-file", 0);
ExpectNoMappedData(mapped_file);
}
{
MemoryMappedFile mapped_file;
- EXPECT_FALSE(mapped_file.Map("nonexistent-file"));
+ EXPECT_FALSE(mapped_file.Map("nonexistent-file", 0));
ExpectNoMappedData(mapped_file);
}
}
@@ -87,12 +87,12 @@
ASSERT_TRUE(WriteFile(test_file.c_str(), NULL, 0));
{
- MemoryMappedFile mapped_file(test_file.c_str());
+ MemoryMappedFile mapped_file(test_file.c_str(), 0);
ExpectNoMappedData(mapped_file);
}
{
MemoryMappedFile mapped_file;
- EXPECT_TRUE(mapped_file.Map(test_file.c_str()));
+ EXPECT_TRUE(mapped_file.Map(test_file.c_str(), 0));
ExpectNoMappedData(mapped_file);
}
}
@@ -109,7 +109,7 @@
ASSERT_TRUE(WriteFile(test_file.c_str(), data, data_size));
{
- MemoryMappedFile mapped_file(test_file.c_str());
+ MemoryMappedFile mapped_file(test_file.c_str(), 0);
EXPECT_FALSE(mapped_file.content().IsEmpty());
EXPECT_TRUE(mapped_file.data() != NULL);
EXPECT_EQ(data_size, mapped_file.size());
@@ -117,7 +117,7 @@
}
{
MemoryMappedFile mapped_file;
- EXPECT_TRUE(mapped_file.Map(test_file.c_str()));
+ EXPECT_TRUE(mapped_file.Map(test_file.c_str(), 0));
EXPECT_FALSE(mapped_file.content().IsEmpty());
EXPECT_TRUE(mapped_file.data() != NULL);
EXPECT_EQ(data_size, mapped_file.size());
@@ -145,13 +145,13 @@
ASSERT_TRUE(WriteFile(test_file2.c_str(), data2, data2_size));
{
- MemoryMappedFile mapped_file(test_file1.c_str());
+ MemoryMappedFile mapped_file(test_file1.c_str(), 0);
EXPECT_FALSE(mapped_file.content().IsEmpty());
EXPECT_TRUE(mapped_file.data() != NULL);
EXPECT_EQ(data1_size, mapped_file.size());
EXPECT_EQ(0, memcmp(data1, mapped_file.data(), data1_size));
- mapped_file.Map(test_file2.c_str());
+ mapped_file.Map(test_file2.c_str(), 0);
EXPECT_FALSE(mapped_file.content().IsEmpty());
EXPECT_TRUE(mapped_file.data() != NULL);
EXPECT_EQ(data2_size, mapped_file.size());
@@ -159,16 +159,50 @@
}
{
MemoryMappedFile mapped_file;
- EXPECT_TRUE(mapped_file.Map(test_file1.c_str()));
+ EXPECT_TRUE(mapped_file.Map(test_file1.c_str(), 0));
EXPECT_FALSE(mapped_file.content().IsEmpty());
EXPECT_TRUE(mapped_file.data() != NULL);
EXPECT_EQ(data1_size, mapped_file.size());
EXPECT_EQ(0, memcmp(data1, mapped_file.data(), data1_size));
- mapped_file.Map(test_file2.c_str());
+ mapped_file.Map(test_file2.c_str(), 0);
EXPECT_FALSE(mapped_file.content().IsEmpty());
EXPECT_TRUE(mapped_file.data() != NULL);
EXPECT_EQ(data2_size, mapped_file.size());
EXPECT_EQ(0, memcmp(data2, mapped_file.data(), data2_size));
}
}
+
+TEST_F(MemoryMappedFileTest, MapWithOffset) {
+ // Put more data in the test file this time. Offsets can only be
+ // done on page boundaries, so we need a two page file to test this.
+ const int page_size = 4096;
+ char data1[2 * page_size];
+ size_t data1_size = sizeof(data1);
+ for (size_t i = 0; i < data1_size; ++i) {
+ data1[i] = i & 0x7f;
+ }
+
+ AutoTempDir temp_dir;
+ string test_file1 = temp_dir.path() + "/test_file1";
+ ASSERT_TRUE(WriteFile(test_file1.c_str(), data1, data1_size));
+ {
+ MemoryMappedFile mapped_file(test_file1.c_str(), page_size);
+ EXPECT_FALSE(mapped_file.content().IsEmpty());
+ EXPECT_TRUE(mapped_file.data() != NULL);
+ EXPECT_EQ(data1_size - page_size, mapped_file.size());
+ EXPECT_EQ(
+ 0,
+ memcmp(data1 + page_size, mapped_file.data(), data1_size - page_size));
+ }
+ {
+ MemoryMappedFile mapped_file;
+ mapped_file.Map(test_file1.c_str(), page_size);
+ EXPECT_FALSE(mapped_file.content().IsEmpty());
+ EXPECT_TRUE(mapped_file.data() != NULL);
+ EXPECT_EQ(data1_size - page_size, mapped_file.size());
+ EXPECT_EQ(
+ 0,
+ memcmp(data1 + page_size, mapped_file.data(), data1_size - page_size));
+ }
+}
diff --git a/src/common/linux/tests/crash_generator.cc b/src/common/linux/tests/crash_generator.cc
index f25086d..c9491f6 100644
--- a/src/common/linux/tests/crash_generator.cc
+++ b/src/common/linux/tests/crash_generator.cc
@@ -199,19 +199,32 @@
fprintf(stderr, "CrashGenerator: Failed to copy proc files\n");
exit(1);
}
- if (tkill(*GetThreadIdPointer(crash_thread), crash_signal) == -1) {
- perror("CrashGenerator: Failed to kill thread by signal");
- } else {
- // At this point, we've queued the signal for delivery, but there's no
- // guarantee when it'll be delivered. We don't want the main thread to
- // race and exit before the thread we signaled is processed. So sleep
- // long enough that we won't flake even under fairly high load.
- // TODO: See if we can't be a bit more deterministic. There doesn't
- // seem to be an API to check on signal delivery status, so we can't
- // really poll and wait for the kernel to declare the signal has been
- // delivered. If it has, and things worked, we'd be killed, so the
- // sleep length doesn't really matter.
- sleep(10 * 60);
+ // On Android the signal sometimes doesn't seem to get sent even though
+ // tkill returns '0'. Retry a couple of times if the signal doesn't get
+ // through on the first go:
+ // https://code.google.com/p/google-breakpad/issues/detail?id=579
+#if defined(__ANDROID__)
+ const int kRetries = 60;
+ const unsigned int kSleepTimeInSeconds = 1;
+#else
+ const int kRetries = 1;
+ const unsigned int kSleepTimeInSeconds = 600;
+#endif
+ for (int i = 0; i < kRetries; i++) {
+ if (tkill(*GetThreadIdPointer(crash_thread), crash_signal) == -1) {
+ perror("CrashGenerator: Failed to kill thread by signal");
+ } else {
+ // At this point, we've queued the signal for delivery, but there's no
+ // guarantee when it'll be delivered. We don't want the main thread to
+ // race and exit before the thread we signaled is processed. So sleep
+ // long enough that we won't flake even under fairly high load.
+ // TODO: See if we can't be a bit more deterministic. There doesn't
+ // seem to be an API to check on signal delivery status, so we can't
+ // really poll and wait for the kernel to declare the signal has been
+ // delivered. If it has, and things worked, we'd be killed, so the
+ // sleep length doesn't really matter.
+ sleep(kSleepTimeInSeconds);
+ }
}
} else {
perror("CrashGenerator: Failed to set core limit");
diff --git a/src/common/mac/dump_syms.mm b/src/common/mac/dump_syms.mm
index 2e3a6a9..f2420f1 100644
--- a/src/common/mac/dump_syms.mm
+++ b/src/common/mac/dump_syms.mm
@@ -62,6 +62,10 @@
#define CPU_TYPE_ARM (static_cast<cpu_type_t>(12))
#endif // CPU_TYPE_ARM
+#ifndef CPU_TYPE_ARM64
+#define CPU_TYPE_ARM64 (static_cast<cpu_type_t>(16777228))
+#endif // CPU_TYPE_ARM64
+
using dwarf2reader::ByteReader;
using google_breakpad::DwarfCUToModule;
using google_breakpad::DwarfLineToModule;
@@ -329,6 +333,9 @@
case CPU_TYPE_ARM:
register_names = DwarfCFIToModule::RegisterNames::ARM();
break;
+ case CPU_TYPE_ARM64:
+ register_names = DwarfCFIToModule::RegisterNames::ARM64();
+ break;
default: {
const NXArchInfo *arch = google_breakpad::BreakpadGetArchInfoFromCpuType(
macho_reader.cpu_type(), macho_reader.cpu_subtype());
diff --git a/src/common/memory.h b/src/common/memory.h
index a4cad94..03228f0 100644
--- a/src/common/memory.h
+++ b/src/common/memory.h
@@ -38,6 +38,10 @@
#include <memory>
#include <vector>
+#if defined(MEMORY_SANITIZER)
+#include <sanitizer/msan_interface.h>
+#endif
+
#ifdef __APPLE__
#define sys_mmap mmap
#define sys_mmap2 mmap
@@ -120,6 +124,12 @@
if (a == MAP_FAILED)
return NULL;
+#if defined(MEMORY_SANITIZER)
+ // We need to indicate to MSan that memory allocated through sys_mmap is
+ // initialized, since linux_syscall_support.h doesn't have MSan hooks.
+ __msan_unpoison(a, page_size_ * num_pages);
+#endif
+
struct PageHeader *header = reinterpret_cast<PageHeader*>(a);
header->next = last_;
header->num_pages = num_pages;
diff --git a/src/common/unordered.h b/src/common/unordered.h
new file mode 100644
index 0000000..ec665cc
--- /dev/null
+++ b/src/common/unordered.h
@@ -0,0 +1,62 @@
+// Copyright (c) 2010 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 this file to use unordered_map and unordered_set. If tr1
+// or C++11 is not available, you can switch to using hash_set and
+// hash_map by defining BP_USE_HASH_SET.
+
+#ifndef COMMON_UNORDERED_H_
+#define COMMON_UNORDERED_H_
+
+#if defined(BP_USE_HASH_SET)
+#include <hash_map>
+#include <hash_set>
+
+// For hash<string>.
+#include "util/hash/hash.h"
+
+template <class T, class U, class H = __gnu_cxx::hash<T> >
+struct unordered_map : public hash_map<T, U, H> {};
+template <class T, class H = __gnu_cxx::hash<T> >
+struct unordered_set : public hash_set<T, H> {};
+
+#elif defined(_LIBCPP_VERSION) // c++11
+#include <unordered_map>
+#include <unordered_set>
+using std::unordered_map;
+using std::unordered_set;
+
+#else // Fallback to tr1::unordered
+#include <tr1/unordered_map>
+#include <tr1/unordered_set>
+using std::tr1::unordered_map;
+using std::tr1::unordered_set;
+#endif
+
+#endif // COMMON_UNORDERED_H_
diff --git a/src/common/windows/common_windows.gyp b/src/common/windows/common_windows.gyp
index 6b87775..aadc21a 100644
--- a/src/common/windows/common_windows.gyp
+++ b/src/common/windows/common_windows.gyp
@@ -28,7 +28,7 @@
{
'includes': [
- '../../client/windows/build/common.gypi',
+ '../../build/common.gypi',
],
'targets': [
{
diff --git a/src/common/windows/dia_util.h b/src/common/windows/dia_util.h
index 4b259b4..b9e0df2 100644
--- a/src/common/windows/dia_util.h
+++ b/src/common/windows/dia_util.h
@@ -1,59 +1,64 @@
-// Copyright 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.
-
-// Utilities for loading debug streams and tables from a PDB file.
-
-#include <Windows.h>
-#include <dia2.h>
-
-namespace google_breakpad {
-
-// Find the debug stream of the given |name| in the given |session|. Returns
-// true on success, false on error of if the stream does not exist. On success
-// the stream will be returned via |debug_stream|.
-bool FindDebugStream(const wchar_t* name,
- IDiaSession* session,
- IDiaEnumDebugStreamData** debug_stream);
-
-// Finds the first table implementing the COM interface with ID |iid| in the
-// given |session|. Returns true on success, false on error or if no such
-// table is found. On success the table will be returned via |table|.
-bool FindTable(REFIID iid, IDiaSession* session, void** table);
-
-// A templated version of FindTable. Finds the first table implementing type
-// |InterfaceType| in the given |session|. Returns true on success, false on
-// error or if no such table is found. On success the table will be returned via
-// |table|.
-template<typename InterfaceType>
-bool FindTable(IDiaSession* session, InterfaceType** table) {
- return FindTable(__uuidof(InterfaceType),
- session,
- reinterpret_cast<void**>(table));
-}
-
-} // namespace google_breakpad
+// Copyright 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.
+
+// Utilities for loading debug streams and tables from a PDB file.
+
+#ifndef COMMON_WINDOWS_DIA_UTIL_H_
+#define COMMON_WINDOWS_DIA_UTIL_H_
+
+#include <Windows.h>
+#include <dia2.h>
+
+namespace google_breakpad {
+
+// Find the debug stream of the given |name| in the given |session|. Returns
+// true on success, false on error of if the stream does not exist. On success
+// the stream will be returned via |debug_stream|.
+bool FindDebugStream(const wchar_t* name,
+ IDiaSession* session,
+ IDiaEnumDebugStreamData** debug_stream);
+
+// Finds the first table implementing the COM interface with ID |iid| in the
+// given |session|. Returns true on success, false on error or if no such
+// table is found. On success the table will be returned via |table|.
+bool FindTable(REFIID iid, IDiaSession* session, void** table);
+
+// A templated version of FindTable. Finds the first table implementing type
+// |InterfaceType| in the given |session|. Returns true on success, false on
+// error or if no such table is found. On success the table will be returned via
+// |table|.
+template<typename InterfaceType>
+bool FindTable(IDiaSession* session, InterfaceType** table) {
+ return FindTable(__uuidof(InterfaceType),
+ session,
+ reinterpret_cast<void**>(table));
+}
+
+} // namespace google_breakpad
+
+#endif // COMMON_WINDOWS_DIA_UTIL_H_
diff --git a/src/common/windows/guid_string.h b/src/common/windows/guid_string.h
index f8aa8a2..6b92675 100644
--- a/src/common/windows/guid_string.h
+++ b/src/common/windows/guid_string.h
@@ -29,8 +29,8 @@
// guid_string.cc: Convert GUIDs to strings.
-#ifndef COMMON_WINDOWS_GUID_STRING_H__
-#define COMMON_WINDOWS_GUID_STRING_H__
+#ifndef COMMON_WINDOWS_GUID_STRING_H_
+#define COMMON_WINDOWS_GUID_STRING_H_
#include <Guiddef.h>
@@ -55,4 +55,4 @@
} // namespace google_breakpad
-#endif // COMMON_WINDOWS_GUID_STRING_H__
+#endif // COMMON_WINDOWS_GUID_STRING_H_
diff --git a/src/common/windows/http_upload.h b/src/common/windows/http_upload.h
index 8a17aab..0594cde 100644
--- a/src/common/windows/http_upload.h
+++ b/src/common/windows/http_upload.h
@@ -31,12 +31,12 @@
// request using wininet. It currently supports requests that contain
// a set of string parameters (key/value pairs), and a file to upload.
-#ifndef COMMON_WINDOWS_HTTP_UPLOAD_H__
-#define COMMON_WINDOWS_HTTP_UPLOAD_H__
+#ifndef COMMON_WINDOWS_HTTP_UPLOAD_H_
+#define COMMON_WINDOWS_HTTP_UPLOAD_H_
-#pragma warning( push )
+#pragma warning(push)
// Disable exception handler warnings.
-#pragma warning( disable : 4530 )
+#pragma warning(disable : 4530)
#include <Windows.h>
#include <WinInet.h>
@@ -121,6 +121,6 @@
} // namespace google_breakpad
-#pragma warning( pop )
+#pragma warning(pop)
-#endif // COMMON_WINDOWS_HTTP_UPLOAD_H__
+#endif // COMMON_WINDOWS_HTTP_UPLOAD_H_
diff --git a/src/common/windows/omap.h b/src/common/windows/omap.h
index 88e8589..bc293af 100644
--- a/src/common/windows/omap.h
+++ b/src/common/windows/omap.h
@@ -1,72 +1,72 @@
-// Copyright 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.
-
-// Provides an API for mapping symbols through OMAP information, if a PDB file
-// is augmented with it. This allows breakpad to work with addresses in
-// transformed images by transforming the symbols themselves, rather than
-// transforming addresses prior to querying symbols (the way it is typically
-// done by Windows-native tools, including the DIA).
-
-#ifndef COMMON_WINDOWS_OMAP_H__
-#define COMMON_WINDOWS_OMAP_H__
-
-#include "common/windows/omap_internal.h"
-
-namespace google_breakpad {
-
-// If the given session contains OMAP data this extracts it, populating
-// |omap_data|, and then disabling automatic translation for the session.
-// OMAP data is present in the PDB if |omap_data| is not empty. This returns
-// true on success, false otherwise.
-bool GetOmapDataAndDisableTranslation(IDiaSession* dia_session,
- OmapData* omap_data);
-
-// Given raw OMAP data builds an ImageMap. This can be used to query individual
-// image ranges using MapAddressRange.
-// |omap_data|| is the OMAP data extracted from the PDB.
-// |image_map| will be populated with a description of the image mapping. If
-// |omap_data| is empty then this will also be empty.
-void BuildImageMap(const OmapData& omap_data, ImageMap* image_map);
-
-// Given an address range in the original image space determines how exactly it
-// has been tranformed.
-// |omap_data| is the OMAP data extracted from the PDB, which must not be
-// empty.
-// |original_range| is the address range in the original image being queried.
-// |mapped_ranges| will be populated with a full description of the mapping.
-// They may be disjoint in the transformed image so a vector is needed to
-// fully represent the mapping. This will be appended to if it is not
-// empty. If |omap_data| is empty then |mapped_ranges| will simply be
-// populated with a copy of |original_range| (the identity transform).
-void MapAddressRange(const ImageMap& image_map,
- const AddressRange& original_range,
- AddressRangeVector* mapped_ranges);
-
-} // namespace google_breakpad
-
-#endif // COMMON_WINDOWS_OMAP_H__
+// Copyright 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.
+
+// Provides an API for mapping symbols through OMAP information, if a PDB file
+// is augmented with it. This allows breakpad to work with addresses in
+// transformed images by transforming the symbols themselves, rather than
+// transforming addresses prior to querying symbols (the way it is typically
+// done by Windows-native tools, including the DIA).
+
+#ifndef COMMON_WINDOWS_OMAP_H_
+#define COMMON_WINDOWS_OMAP_H_
+
+#include "common/windows/omap_internal.h"
+
+namespace google_breakpad {
+
+// If the given session contains OMAP data this extracts it, populating
+// |omap_data|, and then disabling automatic translation for the session.
+// OMAP data is present in the PDB if |omap_data| is not empty. This returns
+// true on success, false otherwise.
+bool GetOmapDataAndDisableTranslation(IDiaSession* dia_session,
+ OmapData* omap_data);
+
+// Given raw OMAP data builds an ImageMap. This can be used to query individual
+// image ranges using MapAddressRange.
+// |omap_data|| is the OMAP data extracted from the PDB.
+// |image_map| will be populated with a description of the image mapping. If
+// |omap_data| is empty then this will also be empty.
+void BuildImageMap(const OmapData& omap_data, ImageMap* image_map);
+
+// Given an address range in the original image space determines how exactly it
+// has been tranformed.
+// |omap_data| is the OMAP data extracted from the PDB, which must not be
+// empty.
+// |original_range| is the address range in the original image being queried.
+// |mapped_ranges| will be populated with a full description of the mapping.
+// They may be disjoint in the transformed image so a vector is needed to
+// fully represent the mapping. This will be appended to if it is not
+// empty. If |omap_data| is empty then |mapped_ranges| will simply be
+// populated with a copy of |original_range| (the identity transform).
+void MapAddressRange(const ImageMap& image_map,
+ const AddressRange& original_range,
+ AddressRangeVector* mapped_ranges);
+
+} // namespace google_breakpad
+
+#endif // COMMON_WINDOWS_OMAP_H_
diff --git a/src/common/windows/omap_internal.h b/src/common/windows/omap_internal.h
index 1364eb9..3f904d7 100644
--- a/src/common/windows/omap_internal.h
+++ b/src/common/windows/omap_internal.h
@@ -1,137 +1,137 @@
-// Copyright 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.
-
-// Declares internal implementation details for functionality in omap.h and
-// omap.cc.
-
-#ifndef COMMON_WINDOWS_OMAP_INTERNAL_H__
-#define COMMON_WINDOWS_OMAP_INTERNAL_H__
-
-#include <windows.h>
-#include <dia2.h>
-
-#include <vector>
-
-namespace google_breakpad {
-
-// The OMAP struct is defined by debughlp.h, which doesn't play nicely with
-// imagehlp.h. We simply redefine it.
-struct OMAP {
- DWORD rva;
- DWORD rvaTo;
-};
-static_assert(sizeof(OMAP) == 8, "Wrong size for OMAP structure.");
-typedef std::vector<OMAP> OmapTable;
-
-// This contains the OMAP data extracted from an image.
-struct OmapData {
- // The table of OMAP entries describing the transformation from the
- // original image to the transformed image.
- OmapTable omap_from;
- // The table of OMAP entries describing the transformation from the
- // instrumented image to the original image.
- OmapTable omap_to;
- // The length of the original untransformed image.
- DWORD length_original;
-
- OmapData() : length_original(0) { }
-};
-
-// This represents a range of addresses in an image.
-struct AddressRange {
- DWORD rva;
- DWORD length;
-
- AddressRange() : rva(0), length(0) { }
- AddressRange(DWORD rva, DWORD length) : rva(rva), length(length) { }
-
- // Returns the end address of this range.
- DWORD end() const { return rva + length; }
-
- // Addreses only compare as less-than or greater-than if they are not
- // overlapping. Otherwise, they compare equal.
- int Compare(const AddressRange& rhs) const;
- bool operator<(const AddressRange& rhs) const { return Compare(rhs) == -1; }
- bool operator>(const AddressRange& rhs) const { return Compare(rhs) == 1; }
-
- // Equality operators compare exact values.
- bool operator==(const AddressRange& rhs) const {
- return rva == rhs.rva && length == rhs.length;
- }
- bool operator!=(const AddressRange& rhs) const { return !((*this) == rhs); }
-};
-
-typedef std::vector<AddressRange> AddressRangeVector;
-
-// This represents an address range in an original image, and its corresponding
-// range in the transformed image.
-struct MappedRange {
- // An address in the original image.
- DWORD rva_original;
- // The corresponding addresses in the transformed image.
- DWORD rva_transformed;
- // The length of the address range.
- DWORD length;
- // It is possible for code to be injected into a transformed image, for which
- // there is no corresponding code in the original image. If this range of
- // transformed image is immediately followed by such injected code we maintain
- // a record of its length here.
- DWORD injected;
- // It is possible for code to be removed from the original image. This happens
- // for things like padding between blocks. There is no actual content lost,
- // but the spacing between items may be lost. This keeps track of any removed
- // content immediately following the |original| range.
- DWORD removed;
-};
-// A vector of mapped ranges is used as a more useful representation of
-// OMAP data.
-typedef std::vector<MappedRange> Mapping;
-
-// Used as a secondary search structure accompanying a Mapping.
-struct EndpointIndex {
- DWORD endpoint;
- size_t index;
-};
-typedef std::vector<EndpointIndex> EndpointIndexMap;
-
-// An ImageMap is vector of mapped ranges, plus a secondary index into it for
-// doing interval searches. (An interval tree would also work, but is overkill
-// because we don't need insertion and deletion.)
-struct ImageMap {
- // This is a description of the mapping between original and transformed
- // image, sorted by addresses in the original image.
- Mapping mapping;
- // For all interval endpoints in |mapping| this stores the minimum index of
- // an interval in |mapping| that contains the endpoint. Useful for doing
- // interval intersection queries.
- EndpointIndexMap endpoint_index_map;
-};
-
-} // namespace google_breakpad
-
-#endif // COMMON_WINDOWS_OMAP_INTERNAL_H__
+// Copyright 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.
+
+// Declares internal implementation details for functionality in omap.h and
+// omap.cc.
+
+#ifndef COMMON_WINDOWS_OMAP_INTERNAL_H_
+#define COMMON_WINDOWS_OMAP_INTERNAL_H_
+
+#include <windows.h>
+#include <dia2.h>
+
+#include <vector>
+
+namespace google_breakpad {
+
+// The OMAP struct is defined by debughlp.h, which doesn't play nicely with
+// imagehlp.h. We simply redefine it.
+struct OMAP {
+ DWORD rva;
+ DWORD rvaTo;
+};
+static_assert(sizeof(OMAP) == 8, "Wrong size for OMAP structure.");
+typedef std::vector<OMAP> OmapTable;
+
+// This contains the OMAP data extracted from an image.
+struct OmapData {
+ // The table of OMAP entries describing the transformation from the
+ // original image to the transformed image.
+ OmapTable omap_from;
+ // The table of OMAP entries describing the transformation from the
+ // instrumented image to the original image.
+ OmapTable omap_to;
+ // The length of the original untransformed image.
+ DWORD length_original;
+
+ OmapData() : length_original(0) { }
+};
+
+// This represents a range of addresses in an image.
+struct AddressRange {
+ DWORD rva;
+ DWORD length;
+
+ AddressRange() : rva(0), length(0) { }
+ AddressRange(DWORD rva, DWORD length) : rva(rva), length(length) { }
+
+ // Returns the end address of this range.
+ DWORD end() const { return rva + length; }
+
+ // Addreses only compare as less-than or greater-than if they are not
+ // overlapping. Otherwise, they compare equal.
+ int Compare(const AddressRange& rhs) const;
+ bool operator<(const AddressRange& rhs) const { return Compare(rhs) == -1; }
+ bool operator>(const AddressRange& rhs) const { return Compare(rhs) == 1; }
+
+ // Equality operators compare exact values.
+ bool operator==(const AddressRange& rhs) const {
+ return rva == rhs.rva && length == rhs.length;
+ }
+ bool operator!=(const AddressRange& rhs) const { return !((*this) == rhs); }
+};
+
+typedef std::vector<AddressRange> AddressRangeVector;
+
+// This represents an address range in an original image, and its corresponding
+// range in the transformed image.
+struct MappedRange {
+ // An address in the original image.
+ DWORD rva_original;
+ // The corresponding addresses in the transformed image.
+ DWORD rva_transformed;
+ // The length of the address range.
+ DWORD length;
+ // It is possible for code to be injected into a transformed image, for which
+ // there is no corresponding code in the original image. If this range of
+ // transformed image is immediately followed by such injected code we maintain
+ // a record of its length here.
+ DWORD injected;
+ // It is possible for code to be removed from the original image. This happens
+ // for things like padding between blocks. There is no actual content lost,
+ // but the spacing between items may be lost. This keeps track of any removed
+ // content immediately following the |original| range.
+ DWORD removed;
+};
+// A vector of mapped ranges is used as a more useful representation of
+// OMAP data.
+typedef std::vector<MappedRange> Mapping;
+
+// Used as a secondary search structure accompanying a Mapping.
+struct EndpointIndex {
+ DWORD endpoint;
+ size_t index;
+};
+typedef std::vector<EndpointIndex> EndpointIndexMap;
+
+// An ImageMap is vector of mapped ranges, plus a secondary index into it for
+// doing interval searches. (An interval tree would also work, but is overkill
+// because we don't need insertion and deletion.)
+struct ImageMap {
+ // This is a description of the mapping between original and transformed
+ // image, sorted by addresses in the original image.
+ Mapping mapping;
+ // For all interval endpoints in |mapping| this stores the minimum index of
+ // an interval in |mapping| that contains the endpoint. Useful for doing
+ // interval intersection queries.
+ EndpointIndexMap endpoint_index_map;
+};
+
+} // namespace google_breakpad
+
+#endif // COMMON_WINDOWS_OMAP_INTERNAL_H_
diff --git a/src/common/windows/pdb_source_line_writer.cc b/src/common/windows/pdb_source_line_writer.cc
index 5de7ade..9f4041d 100644
--- a/src/common/windows/pdb_source_line_writer.cc
+++ b/src/common/windows/pdb_source_line_writer.cc
@@ -37,6 +37,7 @@
#include <stdio.h>
#include <limits>
+#include <set>
#include "common/windows/dia_util.h"
#include "common/windows/guid_string.h"
@@ -54,9 +55,12 @@
*
*/
typedef unsigned char UBYTE;
+
+#if !defined(_WIN64)
#define UNW_FLAG_EHANDLER 0x01
#define UNW_FLAG_UHANDLER 0x02
#define UNW_FLAG_CHAININFO 0x04
+#endif
union UnwindCode {
struct {
@@ -74,7 +78,7 @@
UWOP_SET_FPREG, /* no info, FP = RSP + UNWIND_INFO.FPRegOffset*16 */
UWOP_SAVE_NONVOL, /* info == register number, offset in next slot */
UWOP_SAVE_NONVOL_FAR, /* info == register number, offset in next 2 slots */
- //XXX: these are missing from MSDN!
+ // XXX: these are missing from MSDN!
// See: http://www.osronline.com/ddkx/kmarch/64bitamd_4rs7.htm
UWOP_SAVE_XMM,
UWOP_SAVE_XMM_FAR,
@@ -125,8 +129,19 @@
PDBSourceLineWriter::~PDBSourceLineWriter() {
}
+bool PDBSourceLineWriter::SetCodeFile(const wstring &exe_file) {
+ if (code_file_.empty()) {
+ code_file_ = exe_file;
+ return true;
+ }
+ // Setting a different code file path is an error. It is success only if the
+ // file paths are the same.
+ return exe_file == code_file_;
+}
+
bool PDBSourceLineWriter::Open(const wstring &file, FileFormat format) {
Close();
+ code_file_.clear();
if (FAILED(CoInitialize(NULL))) {
fprintf(stderr, "CoInitialize failed\n");
@@ -140,6 +155,7 @@
StringFromGUID2(CLSID_DiaSource, classid, kGuidSize);
// vc80 uses bce36434-2c24-499e-bf49-8bd99b0eeb68.
// vc90 uses 4C41678E-887B-4365-A09E-925D28DB33C2.
+ // vc100 uses B86AE24D-BF2F-4AC9-B5A2-34B14E4CE11D.
fprintf(stderr, "CoCreateInstance CLSID_DiaSource %S failed "
"(msdia*.dll unregistered?)\n", classid);
return false;
@@ -162,7 +178,8 @@
case ANY_FILE:
if (FAILED(data_source->loadDataFromPdb(file.c_str()))) {
if (FAILED(data_source->loadDataForExe(file.c_str(), NULL, NULL))) {
- fprintf(stderr, "loadDataForPdb and loadDataFromExe failed for %ws\n", file.c_str());
+ fprintf(stderr, "loadDataForPdb and loadDataFromExe failed for %ws\n",
+ file.c_str());
return false;
}
code_file_ = file;
@@ -327,47 +344,101 @@
}
bool PDBSourceLineWriter::PrintFunctions() {
- CComPtr<IDiaEnumSymbolsByAddr> symbols;
- if (FAILED(session_->getSymbolsByAddr(&symbols))) {
- fprintf(stderr, "failed to get symbol enumerator\n");
+ ULONG count = 0;
+ DWORD rva = 0;
+ CComPtr<IDiaSymbol> global;
+ HRESULT hr;
+
+ if (FAILED(session_->get_globalScope(&global))) {
+ fprintf(stderr, "get_globalScope failed\n");
return false;
}
- CComPtr<IDiaSymbol> symbol;
- if (FAILED(symbols->symbolByAddr(1, 0, &symbol))) {
- fprintf(stderr, "failed to enumerate symbols\n");
- return false;
+ CComPtr<IDiaEnumSymbols> symbols = NULL;
+
+ // Find all function symbols first.
+ std::set<DWORD> rvas;
+ hr = global->findChildren(SymTagFunction, NULL, nsNone, &symbols);
+
+ if (SUCCEEDED(hr)) {
+ CComPtr<IDiaSymbol> symbol = NULL;
+
+ 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);
+ } else {
+ fprintf(stderr, "get_relativeVirtualAddress failed on the symbol\n");
+ return false;
+ }
+
+ symbol.Release();
+ }
+
+ symbols.Release();
}
- DWORD rva_last = 0;
- if (FAILED(symbol->get_relativeVirtualAddress(&rva_last))) {
- fprintf(stderr, "failed to get symbol rva\n");
- return false;
+ // Find all public symbols. Store public symbols that are not also private
+ // symbols for later.
+ std::set<DWORD> public_only_rvas;
+ hr = global->findChildren(SymTagPublicSymbol, NULL, nsNone, &symbols);
+
+ if (SUCCEEDED(hr)) {
+ CComPtr<IDiaSymbol> symbol = NULL;
+
+ 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);
+ }
+ } else {
+ fprintf(stderr, "get_relativeVirtualAddress failed on the symbol\n");
+ return false;
+ }
+
+ symbol.Release();
+ }
+
+ symbols.Release();
}
- ULONG count;
- do {
- DWORD tag;
- if (FAILED(symbol->get_symTag(&tag))) {
- fprintf(stderr, "failed to get symbol tag\n");
+ std::set<DWORD>::iterator it;
+
+ // For each rva, dump the first symbol DIA knows about at the address.
+ for (it = rvas.begin(); it != rvas.end(); ++it) {
+ CComPtr<IDiaSymbol> 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");
+ 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;
}
-
- // For a given function, DIA seems to give either a symbol with
- // SymTagFunction or SymTagPublicSymbol, but not both. This means
- // that PDBSourceLineWriter will output either a FUNC or PUBLIC line,
- // but not both.
- if (tag == SymTagFunction) {
- if (!PrintFunction(symbol, symbol)) {
- return false;
- }
- } else if (tag == SymTagPublicSymbol) {
- if (!PrintCodePublicSymbol(symbol)) {
- return false;
- }
- }
- symbol.Release();
- } while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1);
+ }
// When building with PGO, the compiler can split functions into
// "hot" and "cold" blocks, and move the "cold" blocks out to separate
@@ -376,12 +447,6 @@
// that are children of them. We can then find the lexical parents
// of those blocks and print out an extra FUNC line for blocks
// that are not contained in their parent functions.
- CComPtr<IDiaSymbol> global;
- if (FAILED(session_->get_globalScope(&global))) {
- fprintf(stderr, "get_globalScope failed\n");
- return false;
- }
-
CComPtr<IDiaEnumSymbols> compilands;
if (FAILED(global->findChildren(SymTagCompiland, NULL,
nsNone, &compilands))) {
@@ -427,6 +492,7 @@
compiland.Release();
}
+ global.Release();
return true;
}
@@ -641,7 +707,7 @@
unwind_rva,
&img->LastRvaSection));
- DWORD stack_size = 8; // minimal stack size is 8 for RIP
+ DWORD stack_size = 8; // minimal stack size is 8 for RIP
DWORD rip_offset = 8;
do {
for (UBYTE c = 0; c < unwind_info->count_of_codes; c++) {
@@ -674,12 +740,12 @@
break;
case UWOP_SAVE_NONVOL:
case UWOP_SAVE_XMM128: {
- c++; //skip slot with offset
+ c++; // skip slot with offset
break;
}
case UWOP_SAVE_NONVOL_FAR:
case UWOP_SAVE_XMM128_FAR: {
- c += 2; //skip 2 slots with offset
+ c += 2; // skip 2 slots with offset
break;
}
case UWOP_PUSH_MACHFRAME: {
@@ -832,7 +898,7 @@
CComBSTR symbols_file;
if (SUCCEEDED(global->get_symbolsFileName(&symbols_file))) {
wstring file(symbols_file);
-
+
// Look for an EXE or DLL file.
const wchar_t *extensions[] = { L"exe", L"dll" };
for (int i = 0; i < sizeof(extensions) / sizeof(extensions[0]); i++) {
@@ -1064,7 +1130,7 @@
// This is not a critical piece of the symbol file.
PrintPEInfo();
ret = ret &&
- PrintSourceFiles() &&
+ PrintSourceFiles() &&
PrintFunctions() &&
PrintFrameData();
@@ -1206,8 +1272,7 @@
if (opt->Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) {
// 64-bit PE file.
SizeOfImage = opt->SizeOfImage;
- }
- else {
+ } else {
// 32-bit PE file.
SizeOfImage = img->FileHeader->OptionalHeader.SizeOfImage;
}
diff --git a/src/common/windows/pdb_source_line_writer.h b/src/common/windows/pdb_source_line_writer.h
index d928a60..9aeb2a4 100644
--- a/src/common/windows/pdb_source_line_writer.h
+++ b/src/common/windows/pdb_source_line_writer.h
@@ -30,8 +30,8 @@
// PDBSourceLineWriter uses a pdb file produced by Visual C++ to output
// a line/address map for use with BasicSourceLineResolver.
-#ifndef _PDB_SOURCE_LINE_WRITER_H__
-#define _PDB_SOURCE_LINE_WRITER_H__
+#ifndef COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_
+#define COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_
#include <atlcomcli.h>
@@ -101,10 +101,14 @@
// Returns true on success.
bool Open(const wstring &file, FileFormat format);
- // Locates the pdb file for the given executable (exe or dll) file,
- // and opens it. If there is already a pdb file open, it is automatically
- // closed. Returns true on success.
- bool OpenExecutable(const wstring &exe_file);
+ // Sets the code file full path. This is optional for 32-bit modules. It is
+ // also optional for 64-bit modules when there is an executable file stored
+ // in the same directory as the PDB file. It is only required for 64-bit
+ // modules when the executable file is not in the same location as the PDB
+ // file and it must be called after Open() and before WriteMap().
+ // If Open() was called for an executable file, then it is an error to call
+ // SetCodeFile() with a different file path and it will return false.
+ bool SetCodeFile(const wstring &exe_file);
// Writes a map file from the current pdb file to the given file stream.
// Returns true on success.
@@ -179,12 +183,12 @@
// and an ID is stored for it, or false if it has not.
bool FileIDIsCached(const wstring &file) {
return unique_files_.find(file) != unique_files_.end();
- };
+ }
// Cache this filename and ID for later reuse.
void CacheFileID(const wstring &file, DWORD id) {
unique_files_[file] = id;
- };
+ }
// Store this ID in the cache as a duplicate for this filename.
void StoreDuplicateFileID(const wstring &file, DWORD id) {
@@ -193,7 +197,7 @@
// map this id to the previously seen one
file_ids_[id] = iter->second;
}
- };
+ }
// Given a file's unique ID, return the ID that should be used to
// reference it. There may be multiple files with identical filenames
@@ -204,7 +208,7 @@
if (iter == file_ids_.end())
return id;
return iter->second;
- };
+ }
// Find the PE file corresponding to the loaded PDB file, and
// set the code_file_ member. Returns false on failure.
@@ -250,4 +254,4 @@
} // namespace google_breakpad
-#endif // _PDB_SOURCE_LINE_WRITER_H__
+#endif // COMMON_WINDOWS_PDB_SOURCE_LINE_WRITER_H_
diff --git a/src/common/windows/string_utils-inl.h b/src/common/windows/string_utils-inl.h
index d281aaa..9b63607 100644
--- a/src/common/windows/string_utils-inl.h
+++ b/src/common/windows/string_utils-inl.h
@@ -30,8 +30,8 @@
// string_utils-inl.h: Safer string manipulation on Windows, supporting
// pre-MSVC8 environments.
-#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H__
-#define COMMON_WINDOWS_STRING_UTILS_INL_H__
+#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H_
+#define COMMON_WINDOWS_STRING_UTILS_INL_H_
#include <stdarg.h>
#include <wchar.h>
@@ -139,4 +139,4 @@
} // namespace google_breakpad
-#endif // COMMON_WINDOWS_STRING_UTILS_INL_H__
+#endif // COMMON_WINDOWS_STRING_UTILS_INL_H_
diff --git a/src/google_breakpad/common/minidump_format.h b/src/google_breakpad/common/minidump_format.h
index b7ad7bd..109c72e 100644
--- a/src/google_breakpad/common/minidump_format.h
+++ b/src/google_breakpad/common/minidump_format.h
@@ -724,8 +724,8 @@
uint32_t process_kernel_time; /* seconds of kernel CPU time */
/* The following fields are not present in MINIDUMP_MISC_INFO but are
- * in MINIDUMP_MISC_INFO_2. When this struct is populated, these value
- * may not be set. Use flags1 or size_of_info to determine whether these
+ * in MINIDUMP_MISC_INFO_2. When this struct is populated, these values
+ * may not be set. Use flags1 and size_of_info to determine whether these
* values are present. These are only valid when flags1 contains
* MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */
uint32_t processor_max_mhz;
@@ -735,8 +735,8 @@
uint32_t processor_current_idle_state;
/* The following fields are not present in MINIDUMP_MISC_INFO_2 but are
- * in MINIDUMP_MISC_INFO_3. When this struct is populated, these value
- * may not be set. Use flags1 or size_of_info to determine whether these
+ * in MINIDUMP_MISC_INFO_3. When this struct is populated, these values
+ * may not be set. Use flags1 and size_of_info to determine whether these
* values are present. */
/* The following field is only valid if flags1 contains
@@ -757,16 +757,17 @@
MDTimeZoneInformation time_zone;
/* The following fields are not present in MINIDUMP_MISC_INFO_3 but are
- * in MINIDUMP_MISC_INFO_4. When this struct is populated, these value
- * may not be set. Use size_of_info to determine whether these values are
- * present. */
+ * in MINIDUMP_MISC_INFO_4. When this struct is populated, these values
+ * may not be set. Use flags1 and size_of_info to determine whether these
+ * values are present. */
- /* The following 2 fields are only valid if
- * size_of_info is >= MD_MISCINFO4_SIZE */
+ /* The following 2 fields are only valid if flags1 contains
+ * MD_MISCINFO_FLAGS1_BUILDSTRING. */
uint16_t build_string[MD_MAX_PATH]; /* UTF-16-encoded, 0-terminated */
uint16_t dbg_bld_str[40]; /* UTF-16-encoded, 0-terminated */
-} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO2,
- * MINIDUMP_MISC_INFO3, MINIDUMP_MISC_INFO4 */
+} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO_2,
+ * MINIDUMP_MISC_INFO_3, MINIDUMP_MISC_INFO_4,
+ * MINIDUMP_MISC_INFO_N */
static const size_t MD_MISCINFO_SIZE =
offsetof(MDRawMiscInfo, processor_max_mhz);
@@ -793,6 +794,8 @@
/* MINIDUMP_MISC3_TIMEZONE */
MD_MISCINFO_FLAGS1_PROTECTED_PROCESS = 0x00000080,
/* MINIDUMP_MISC3_PROTECTED_PROCESS */
+ MD_MISCINFO_FLAGS1_BUILDSTRING = 0x00000100,
+ /* MINIDUMP_MISC4_BUILDSTRING */
} MDMiscInfoFlags1;
/*
diff --git a/src/processor/basic_code_modules.cc b/src/processor/basic_code_modules.cc
index 71874be..588140c 100644
--- a/src/processor/basic_code_modules.cc
+++ b/src/processor/basic_code_modules.cc
@@ -64,9 +64,9 @@
// GetModuleAtIndex because ordering is unimportant when slurping the
// entire list, and GetModuleAtIndex may be faster than
// GetModuleAtSequence.
- const CodeModule *module = that->GetModuleAtIndex(module_sequence)->Copy();
- if (!map_->StoreRange(module->base_address(), module->size(),
- linked_ptr<const CodeModule>(module))) {
+ linked_ptr<const CodeModule> module(
+ that->GetModuleAtIndex(module_sequence)->Copy());
+ if (!map_->StoreRange(module->base_address(), module->size(), module)) {
BPLOG(ERROR) << "Module " << module->code_file() <<
" could not be stored";
}
diff --git a/src/processor/minidump.cc b/src/processor/minidump.cc
index 5e81e67..ee93671 100644
--- a/src/processor/minidump.cc
+++ b/src/processor/minidump.cc
@@ -344,6 +344,47 @@
}
}
+
+// For fields that may or may not be valid, PrintValueOrInvalid will print the
+// string "(invalid)" if the field is not valid, and will print the value if
+// the field is valid. The value is printed as hexadecimal or decimal.
+
+enum NumberFormat {
+ kNumberFormatDecimal,
+ kNumberFormatHexadecimal,
+};
+
+static void PrintValueOrInvalid(bool valid,
+ NumberFormat number_format,
+ uint32_t value) {
+ if (!valid) {
+ printf("(invalid)\n");
+ } else if (number_format == kNumberFormatDecimal) {
+ printf("%d\n", value);
+ } else {
+ printf("0x%x\n", value);
+ }
+}
+
+// Converts a time_t to a string showing the time in UTC.
+string TimeTToUTCString(time_t tt) {
+ struct tm timestruct;
+#ifdef _WIN32
+ gmtime_s(×truct, &tt);
+#else
+ gmtime_r(&tt, ×truct);
+#endif
+
+ char timestr[20];
+ int rv = strftime(timestr, 20, "%Y-%m-%d %H:%M:%S", ×truct);
+ if (rv == 0) {
+ return string();
+ }
+
+ return string(timestr);
+}
+
+
//
// MinidumpObject
//
@@ -2774,8 +2815,9 @@
module_.size_of_image);
printf(" checksum = 0x%x\n",
module_.checksum);
- printf(" time_date_stamp = 0x%x\n",
- module_.time_date_stamp);
+ printf(" time_date_stamp = 0x%x %s\n",
+ module_.time_date_stamp,
+ TimeTToUTCString(module_.time_date_stamp).c_str());
printf(" module_name_rva = 0x%x\n",
module_.module_name_rva);
printf(" version_info.signature = 0x%x\n",
@@ -2849,8 +2891,9 @@
cv_record_20->cv_header.signature);
printf(" (cv_record).cv_header.offset = 0x%x\n",
cv_record_20->cv_header.offset);
- printf(" (cv_record).signature = 0x%x\n",
- cv_record_20->signature);
+ printf(" (cv_record).signature = 0x%x %s\n",
+ cv_record_20->signature,
+ TimeTToUTCString(cv_record_20->signature).c_str());
printf(" (cv_record).age = %d\n",
cv_record_20->age);
printf(" (cv_record).pdb_file_name = \"%s\"\n",
@@ -2876,13 +2919,19 @@
misc_record->length);
printf(" (misc_record).unicode = %d\n",
misc_record->unicode);
- // Don't bother printing the UTF-16, we don't really even expect to ever
- // see this misc_record anyway.
- if (misc_record->unicode)
+ if (misc_record->unicode) {
+ string misc_record_data_utf8;
+ ConvertUTF16BufferToUTF8String(
+ reinterpret_cast<const uint16_t*>(misc_record->data),
+ misc_record->length - offsetof(MDImageDebugMisc, data),
+ &misc_record_data_utf8,
+ false); // already swapped
+ printf(" (misc_record).data = \"%s\"\n",
+ misc_record_data_utf8.c_str());
+ } else {
printf(" (misc_record).data = \"%s\"\n",
misc_record->data);
- else
- printf(" (misc_record).data = (UTF-16)\n");
+ }
} else {
printf(" (misc_record) = (null)\n");
}
@@ -3785,7 +3834,7 @@
}
printf("MDRawSystemInfo\n");
- printf(" processor_architecture = %d\n",
+ printf(" processor_architecture = 0x%x\n",
system_info_.processor_architecture);
printf(" processor_level = %d\n",
system_info_.processor_level);
@@ -3801,12 +3850,18 @@
system_info_.minor_version);
printf(" build_number = %d\n",
system_info_.build_number);
- printf(" platform_id = %d\n",
+ printf(" platform_id = 0x%x\n",
system_info_.platform_id);
printf(" csd_version_rva = 0x%x\n",
system_info_.csd_version_rva);
printf(" suite_mask = 0x%x\n",
system_info_.suite_mask);
+ if (system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86 ||
+ system_info_.processor_architecture == MD_CPU_ARCHITECTURE_X86_WIN64) {
+ printf(" cpu.x86_cpu_info (valid):\n");
+ } else {
+ printf(" cpu.x86_cpu_info (invalid):\n");
+ }
for (unsigned int i = 0; i < 3; ++i) {
printf(" cpu.x86_cpu_info.vendor_id[%d] = 0x%x\n",
i, system_info_.cpu.x86_cpu_info.vendor_id[i]);
@@ -3817,6 +3872,14 @@
system_info_.cpu.x86_cpu_info.feature_information);
printf(" cpu.x86_cpu_info.amd_extended_cpu_features = 0x%x\n",
system_info_.cpu.x86_cpu_info.amd_extended_cpu_features);
+ if (system_info_.processor_architecture != MD_CPU_ARCHITECTURE_X86 &&
+ system_info_.processor_architecture != MD_CPU_ARCHITECTURE_X86_WIN64) {
+ printf(" cpu.other_cpu_info (valid):\n");
+ for (unsigned int i = 0; i < 2; ++i) {
+ printf(" cpu.other_cpu_info.processor_features[%d] = 0x%" PRIx64 "\n",
+ i, system_info_.cpu.other_cpu_info.processor_features[i]);
+ }
+ }
const string* csd_version = GetCSDVersion();
if (csd_version) {
printf(" (csd_version) = \"%s\"\n",
@@ -3937,43 +4000,114 @@
// Print version 1 fields
printf(" size_of_info = %d\n", misc_info_.size_of_info);
printf(" flags1 = 0x%x\n", misc_info_.flags1);
- printf(" process_id = 0x%x\n", misc_info_.process_id);
- printf(" process_create_time = 0x%x\n",
- misc_info_.process_create_time);
- printf(" process_user_time = 0x%x\n",
- misc_info_.process_user_time);
- printf(" process_kernel_time = 0x%x\n",
- misc_info_.process_kernel_time);
+ printf(" process_id = ");
+ PrintValueOrInvalid(misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_ID,
+ kNumberFormatDecimal, misc_info_.process_id);
+ if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES) {
+ printf(" process_create_time = 0x%x %s\n",
+ misc_info_.process_create_time,
+ TimeTToUTCString(misc_info_.process_create_time).c_str());
+ } else {
+ printf(" process_create_time = (invalid)\n");
+ }
+ printf(" process_user_time = ");
+ PrintValueOrInvalid(misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES,
+ kNumberFormatDecimal, misc_info_.process_user_time);
+ printf(" process_kernel_time = ");
+ PrintValueOrInvalid(misc_info_.flags1 & MD_MISCINFO_FLAGS1_PROCESS_TIMES,
+ kNumberFormatDecimal, misc_info_.process_kernel_time);
if (misc_info_.size_of_info > MD_MISCINFO_SIZE) {
// Print version 2 fields
- printf(" processor_max_mhz = %d\n",
- misc_info_.processor_max_mhz);
- printf(" processor_current_mhz = %d\n",
- misc_info_.processor_current_mhz);
- printf(" processor_mhz_limit = %d\n",
- misc_info_.processor_mhz_limit);
- printf(" processor_max_idle_state = 0x%x\n",
- misc_info_.processor_max_idle_state);
- printf(" processor_current_idle_state = 0x%x\n",
- misc_info_.processor_current_idle_state);
+ printf(" processor_max_mhz = ");
+ PrintValueOrInvalid(misc_info_.flags1 &
+ MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO,
+ kNumberFormatDecimal, misc_info_.processor_max_mhz);
+ printf(" processor_current_mhz = ");
+ PrintValueOrInvalid(misc_info_.flags1 &
+ MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO,
+ kNumberFormatDecimal, misc_info_.processor_current_mhz);
+ printf(" processor_mhz_limit = ");
+ PrintValueOrInvalid(misc_info_.flags1 &
+ MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO,
+ kNumberFormatDecimal, misc_info_.processor_mhz_limit);
+ printf(" processor_max_idle_state = ");
+ PrintValueOrInvalid(misc_info_.flags1 &
+ MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO,
+ kNumberFormatDecimal,
+ misc_info_.processor_max_idle_state);
+ printf(" processor_current_idle_state = ");
+ PrintValueOrInvalid(misc_info_.flags1 &
+ MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO,
+ kNumberFormatDecimal,
+ misc_info_.processor_current_idle_state);
}
if (misc_info_.size_of_info > MD_MISCINFO2_SIZE) {
// Print version 3 fields
- printf(" process_integrity_level = 0x%x\n",
- misc_info_.process_integrity_level);
- printf(" process_execute_flags = 0x%x\n",
- misc_info_.process_execute_flags);
- printf(" protected_process = %d\n",
- misc_info_.protected_process);
- printf(" time_zone_id = %d\n", misc_info_.time_zone_id);
- printf(" time_zone.bias = %d\n", misc_info_.time_zone.bias);
- printf(" time_zone.standard_name = %s\n", standard_name_.c_str());
- printf(" time_zone.daylight_name = %s\n", daylight_name_.c_str());
+ printf(" process_integrity_level = ");
+ PrintValueOrInvalid(misc_info_.flags1 &
+ MD_MISCINFO_FLAGS1_PROCESS_INTEGRITY,
+ kNumberFormatHexadecimal,
+ misc_info_.process_integrity_level);
+ printf(" process_execute_flags = ");
+ PrintValueOrInvalid(misc_info_.flags1 &
+ MD_MISCINFO_FLAGS1_PROCESS_EXECUTE_FLAGS,
+ kNumberFormatHexadecimal,
+ misc_info_.process_execute_flags);
+ printf(" protected_process = ");
+ PrintValueOrInvalid(misc_info_.flags1 &
+ MD_MISCINFO_FLAGS1_PROTECTED_PROCESS,
+ kNumberFormatDecimal, misc_info_.protected_process);
+ printf(" time_zone_id = ");
+ PrintValueOrInvalid(misc_info_.flags1 & MD_MISCINFO_FLAGS1_TIMEZONE,
+ kNumberFormatDecimal, misc_info_.time_zone_id);
+ if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_TIMEZONE) {
+ printf(" time_zone.bias = %d\n",
+ misc_info_.time_zone.bias);
+ printf(" time_zone.standard_name = %s\n", standard_name_.c_str());
+ printf(" time_zone.standard_date = "
+ "%04d-%02d-%02d (%d) %02d:%02d:%02d.%03d\n",
+ misc_info_.time_zone.standard_date.year,
+ misc_info_.time_zone.standard_date.month,
+ misc_info_.time_zone.standard_date.day,
+ misc_info_.time_zone.standard_date.day_of_week,
+ misc_info_.time_zone.standard_date.hour,
+ misc_info_.time_zone.standard_date.minute,
+ misc_info_.time_zone.standard_date.second,
+ misc_info_.time_zone.standard_date.milliseconds);
+ printf(" time_zone.standard_bias = %d\n",
+ misc_info_.time_zone.standard_bias);
+ printf(" time_zone.daylight_name = %s\n", daylight_name_.c_str());
+ printf(" time_zone.daylight_date = "
+ "%04d-%02d-%02d (%d) %02d:%02d:%02d.%03d\n",
+ misc_info_.time_zone.daylight_date.year,
+ misc_info_.time_zone.daylight_date.month,
+ misc_info_.time_zone.daylight_date.day,
+ misc_info_.time_zone.daylight_date.day_of_week,
+ misc_info_.time_zone.daylight_date.hour,
+ misc_info_.time_zone.daylight_date.minute,
+ misc_info_.time_zone.daylight_date.second,
+ misc_info_.time_zone.daylight_date.milliseconds);
+ printf(" time_zone.daylight_bias = %d\n",
+ misc_info_.time_zone.daylight_bias);
+ } else {
+ printf(" time_zone.bias = (invalid)\n");
+ printf(" time_zone.standard_name = (invalid)\n");
+ printf(" time_zone.standard_date = (invalid)\n");
+ printf(" time_zone.standard_bias = (invalid)\n");
+ printf(" time_zone.daylight_name = (invalid)\n");
+ printf(" time_zone.daylight_date = (invalid)\n");
+ printf(" time_zone.daylight_bias = (invalid)\n");
+ }
}
if (misc_info_.size_of_info > MD_MISCINFO3_SIZE) {
// Print version 4 fields
- printf(" build_string = %s\n", build_string_.c_str());
- printf(" dbg_bld_str = %s\n", dbg_bld_str_.c_str());
+ if (misc_info_.flags1 & MD_MISCINFO_FLAGS1_BUILDSTRING) {
+ printf(" build_string = %s\n", build_string_.c_str());
+ printf(" dbg_bld_str = %s\n", dbg_bld_str_.c_str());
+ } else {
+ printf(" build_string = (invalid)\n");
+ printf(" dbg_bld_str = (invalid)\n");
+ }
}
printf("\n");
}
@@ -4067,19 +4201,15 @@
printf("MDRawBreakpadInfo\n");
printf(" validity = 0x%x\n", breakpad_info_.validity);
-
- if (breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID) {
- printf(" dump_thread_id = 0x%x\n", breakpad_info_.dump_thread_id);
- } else {
- printf(" dump_thread_id = (invalid)\n");
- }
-
- if (breakpad_info_.validity & MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID) {
- printf(" requesting_thread_id = 0x%x\n",
- breakpad_info_.requesting_thread_id);
- } else {
- printf(" requesting_thread_id = (invalid)\n");
- }
+ printf(" dump_thread_id = ");
+ PrintValueOrInvalid(breakpad_info_.validity &
+ MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID,
+ kNumberFormatHexadecimal, breakpad_info_.dump_thread_id);
+ printf(" requesting_thread_id = ");
+ PrintValueOrInvalid(breakpad_info_.validity &
+ MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID,
+ kNumberFormatHexadecimal,
+ breakpad_info_.requesting_thread_id);
printf("\n");
}
@@ -4673,6 +4803,72 @@
return GetStream(&memory_info_list);
}
+static const char* get_stream_name(uint32_t stream_type) {
+ switch (stream_type) {
+ case MD_UNUSED_STREAM:
+ return "MD_UNUSED_STREAM";
+ case MD_RESERVED_STREAM_0:
+ return "MD_RESERVED_STREAM_0";
+ case MD_RESERVED_STREAM_1:
+ return "MD_RESERVED_STREAM_1";
+ case MD_THREAD_LIST_STREAM:
+ return "MD_THREAD_LIST_STREAM";
+ case MD_MODULE_LIST_STREAM:
+ return "MD_MODULE_LIST_STREAM";
+ case MD_MEMORY_LIST_STREAM:
+ return "MD_MEMORY_LIST_STREAM";
+ case MD_EXCEPTION_STREAM:
+ return "MD_EXCEPTION_STREAM";
+ case MD_SYSTEM_INFO_STREAM:
+ return "MD_SYSTEM_INFO_STREAM";
+ case MD_THREAD_EX_LIST_STREAM:
+ return "MD_THREAD_EX_LIST_STREAM";
+ case MD_MEMORY_64_LIST_STREAM:
+ return "MD_MEMORY_64_LIST_STREAM";
+ case MD_COMMENT_STREAM_A:
+ return "MD_COMMENT_STREAM_A";
+ case MD_COMMENT_STREAM_W:
+ return "MD_COMMENT_STREAM_W";
+ case MD_HANDLE_DATA_STREAM:
+ return "MD_HANDLE_DATA_STREAM";
+ case MD_FUNCTION_TABLE_STREAM:
+ return "MD_FUNCTION_TABLE_STREAM";
+ case MD_UNLOADED_MODULE_LIST_STREAM:
+ return "MD_UNLOADED_MODULE_LIST_STREAM";
+ case MD_MISC_INFO_STREAM:
+ return "MD_MISC_INFO_STREAM";
+ case MD_MEMORY_INFO_LIST_STREAM:
+ return "MD_MEMORY_INFO_LIST_STREAM";
+ case MD_THREAD_INFO_LIST_STREAM:
+ return "MD_THREAD_INFO_LIST_STREAM";
+ case MD_HANDLE_OPERATION_LIST_STREAM:
+ return "MD_HANDLE_OPERATION_LIST_STREAM";
+ case MD_LAST_RESERVED_STREAM:
+ return "MD_LAST_RESERVED_STREAM";
+ case MD_BREAKPAD_INFO_STREAM:
+ return "MD_BREAKPAD_INFO_STREAM";
+ case MD_ASSERTION_INFO_STREAM:
+ return "MD_ASSERTION_INFO_STREAM";
+ case MD_LINUX_CPU_INFO:
+ return "MD_LINUX_CPU_INFO";
+ case MD_LINUX_PROC_STATUS:
+ return "MD_LINUX_PROC_STATUS";
+ case MD_LINUX_LSB_RELEASE:
+ return "MD_LINUX_LSB_RELEASE";
+ case MD_LINUX_CMD_LINE:
+ return "MD_LINUX_CMD_LINE";
+ case MD_LINUX_ENVIRON:
+ return "MD_LINUX_ENVIRON";
+ case MD_LINUX_AUXV:
+ return "MD_LINUX_AUXV";
+ case MD_LINUX_MAPS:
+ return "MD_LINUX_MAPS";
+ case MD_LINUX_DSO_DEBUG:
+ return "MD_LINUX_DSO_DEBUG";
+ default:
+ return "unknown";
+ }
+}
void Minidump::Print() {
if (!valid_) {
@@ -4686,16 +4882,9 @@
printf(" stream_count = %d\n", header_.stream_count);
printf(" stream_directory_rva = 0x%x\n", header_.stream_directory_rva);
printf(" checksum = 0x%x\n", header_.checksum);
- struct tm timestruct;
-#ifdef _WIN32
- gmtime_s(×truct, reinterpret_cast<time_t*>(&header_.time_date_stamp));
-#else
- gmtime_r(reinterpret_cast<time_t*>(&header_.time_date_stamp), ×truct);
-#endif
- char timestr[20];
- strftime(timestr, 20, "%Y-%m-%d %H:%M:%S", ×truct);
- printf(" time_date_stamp = 0x%x %s\n", header_.time_date_stamp,
- timestr);
+ printf(" time_date_stamp = 0x%x %s\n",
+ header_.time_date_stamp,
+ TimeTToUTCString(header_.time_date_stamp).c_str());
printf(" flags = 0x%" PRIx64 "\n", header_.flags);
printf("\n");
@@ -4706,7 +4895,8 @@
printf("mDirectory[%d]\n", stream_index);
printf("MDRawDirectory\n");
- printf(" stream_type = %d\n", directory_entry->stream_type);
+ printf(" stream_type = 0x%x (%s)\n", directory_entry->stream_type,
+ get_stream_name(directory_entry->stream_type));
printf(" location.data_size = %d\n",
directory_entry->location.data_size);
printf(" location.rva = 0x%x\n", directory_entry->location.rva);
@@ -4719,7 +4909,9 @@
++iterator) {
uint32_t stream_type = iterator->first;
MinidumpStreamInfo info = iterator->second;
- printf(" stream type 0x%x at index %d\n", stream_type, info.stream_index);
+ printf(" stream type 0x%x (%s) at index %d\n", stream_type,
+ get_stream_name(stream_type),
+ info.stream_index);
}
printf("\n");
}
diff --git a/src/processor/minidump_stackwalk.cc b/src/processor/minidump_stackwalk.cc
index d43edd3..47e0857 100644
--- a/src/processor/minidump_stackwalk.cc
+++ b/src/processor/minidump_stackwalk.cc
@@ -205,8 +205,30 @@
const StackFrameAMD64 *frame_amd64 =
reinterpret_cast<const StackFrameAMD64*>(frame);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RAX)
+ sequence = PrintRegister64("rax", frame_amd64->context.rax, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RDX)
+ sequence = PrintRegister64("rdx", frame_amd64->context.rdx, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RCX)
+ sequence = PrintRegister64("rcx", frame_amd64->context.rcx, sequence);
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBX)
sequence = PrintRegister64("rbx", frame_amd64->context.rbx, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSI)
+ sequence = PrintRegister64("rsi", frame_amd64->context.rsi, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RDI)
+ sequence = PrintRegister64("rdi", frame_amd64->context.rdi, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP)
+ sequence = PrintRegister64("rbp", frame_amd64->context.rbp, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSP)
+ sequence = PrintRegister64("rsp", frame_amd64->context.rsp, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R8)
+ sequence = PrintRegister64("r8", frame_amd64->context.r8, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R9)
+ sequence = PrintRegister64("r9", frame_amd64->context.r9, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R10)
+ sequence = PrintRegister64("r10", frame_amd64->context.r10, sequence);
+ if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R11)
+ sequence = PrintRegister64("r11", frame_amd64->context.r11, sequence);
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R12)
sequence = PrintRegister64("r12", frame_amd64->context.r12, sequence);
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_R13)
@@ -217,10 +239,6 @@
sequence = PrintRegister64("r15", frame_amd64->context.r15, sequence);
if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RIP)
sequence = PrintRegister64("rip", frame_amd64->context.rip, sequence);
- if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RSP)
- sequence = PrintRegister64("rsp", frame_amd64->context.rsp, sequence);
- if (frame_amd64->context_validity & StackFrameAMD64::CONTEXT_VALID_RBP)
- sequence = PrintRegister64("rbp", frame_amd64->context.rbp, sequence);
} else if (cpu == "sparc") {
const StackFrameSPARC *frame_sparc =
reinterpret_cast<const StackFrameSPARC*>(frame);
diff --git a/src/processor/stackwalker_amd64.cc b/src/processor/stackwalker_amd64.cc
index b2ffdb8..f252a33 100644
--- a/src/processor/stackwalker_amd64.cc
+++ b/src/processor/stackwalker_amd64.cc
@@ -147,6 +147,52 @@
return frame.release();
}
+StackFrameAMD64* StackwalkerAMD64::GetCallerByFramePointerRecovery(
+ const vector<StackFrame*>& frames) {
+ StackFrameAMD64* last_frame = static_cast<StackFrameAMD64*>(frames.back());
+ uint64_t last_rsp = last_frame->context.rsp;
+ uint64_t last_rbp = last_frame->context.rbp;
+
+ // Assume the presence of a frame pointer. This is not mandated by the
+ // AMD64 ABI, c.f. section 3.2.2 footnote 7, though it is typical for
+ // compilers to still preserve the frame pointer and not treat %rbp as a
+ // general purpose register.
+ //
+ // With this assumption, the CALL instruction pushes the return address
+ // onto the stack and sets %rip to the procedure to enter. The procedure
+ // then establishes the stack frame with a prologue that PUSHes the current
+ // %rbp onto the stack, MOVes the current %rsp to %rbp, and then allocates
+ // space for any local variables. Using this procedure linking information,
+ // it is possible to locate frame information for the callee:
+ //
+ // %caller_rsp = *(%callee_rbp + 16)
+ // %caller_rip = *(%callee_rbp + 8)
+ // %caller_rbp = *(%callee_rbp)
+
+ uint64_t caller_rip, caller_rbp;
+ if (memory_->GetMemoryAtAddress(last_rbp + 8, &caller_rip) &&
+ memory_->GetMemoryAtAddress(last_rbp, &caller_rbp)) {
+ uint64_t caller_rsp = last_rbp + 16;
+
+ // Simple sanity check that the stack is growing downwards as expected.
+ if (caller_rbp < last_rbp || caller_rsp < last_rsp)
+ return NULL;
+
+ StackFrameAMD64* frame = new StackFrameAMD64();
+ frame->trust = StackFrame::FRAME_TRUST_FP;
+ frame->context = last_frame->context;
+ frame->context.rip = caller_rip;
+ frame->context.rsp = caller_rsp;
+ frame->context.rbp = caller_rbp;
+ frame->context_validity = StackFrameAMD64::CONTEXT_VALID_RIP |
+ StackFrameAMD64::CONTEXT_VALID_RSP |
+ StackFrameAMD64::CONTEXT_VALID_RBP;
+ return frame;
+ }
+
+ return NULL;
+}
+
StackFrameAMD64* StackwalkerAMD64::GetCallerByStackScan(
const vector<StackFrame*> &frames) {
StackFrameAMD64* last_frame = static_cast<StackFrameAMD64*>(frames.back());
@@ -214,8 +260,12 @@
if (cfi_frame_info.get())
new_frame.reset(GetCallerByCFIFrameInfo(frames, cfi_frame_info.get()));
- // If CFI failed, or there wasn't CFI available, fall back
- // to stack scanning.
+ // If CFI was not available or failed, try using frame pointer recovery.
+ if (!new_frame.get()) {
+ new_frame.reset(GetCallerByFramePointerRecovery(frames));
+ }
+
+ // If all else fails, fall back to stack scanning.
if (stack_scan_allowed && !new_frame.get()) {
new_frame.reset(GetCallerByStackScan(frames));
}
diff --git a/src/processor/stackwalker_amd64.h b/src/processor/stackwalker_amd64.h
index acdd2c2..8f3dbd5 100644
--- a/src/processor/stackwalker_amd64.h
+++ b/src/processor/stackwalker_amd64.h
@@ -78,6 +78,14 @@
StackFrameAMD64* GetCallerByCFIFrameInfo(const vector<StackFrame*> &frames,
CFIFrameInfo* cfi_frame_info);
+ // Assumes a traditional frame layout where the frame pointer has not been
+ // omitted. The expectation is that caller's %rbp is pushed to the stack
+ // after the return address of the callee, and that the callee's %rsp can
+ // be used to find the pushed %rbp.
+ // Caller owns the returned frame object. Returns NULL on failure.
+ StackFrameAMD64* GetCallerByFramePointerRecovery(
+ const vector<StackFrame*>& frames);
+
// Scan the stack for plausible return addresses. The caller takes ownership
// of the returned frame. Return NULL on failure.
StackFrameAMD64* GetCallerByStackScan(const vector<StackFrame*> &frames);
diff --git a/src/processor/stackwalker_amd64_unittest.cc b/src/processor/stackwalker_amd64_unittest.cc
index 3148910..a54198b 100644
--- a/src/processor/stackwalker_amd64_unittest.cc
+++ b/src/processor/stackwalker_amd64_unittest.cc
@@ -491,7 +491,7 @@
EXPECT_EQ(0x40000000c0000100ULL, frame0->function_base);
StackFrameAMD64 *frame1 = static_cast<StackFrameAMD64 *>(frames->at(1));
- EXPECT_EQ(StackFrame::FRAME_TRUST_SCAN, frame1->trust);
+ EXPECT_EQ(StackFrame::FRAME_TRUST_FP, frame1->trust);
ASSERT_EQ((StackFrameAMD64::CONTEXT_VALID_RIP |
StackFrameAMD64::CONTEXT_VALID_RSP |
StackFrameAMD64::CONTEXT_VALID_RBP),
diff --git a/src/processor/stackwalker_arm64.cc b/src/processor/stackwalker_arm64.cc
index f82c9cb..31119a9 100644
--- a/src/processor/stackwalker_arm64.cc
+++ b/src/processor/stackwalker_arm64.cc
@@ -78,8 +78,77 @@
StackFrameARM64* StackwalkerARM64::GetCallerByCFIFrameInfo(
const vector<StackFrame*> &frames,
CFIFrameInfo* cfi_frame_info) {
- // Obtaining the stack frame from CFI info is not yet supported for ARM64.
- return NULL;
+ StackFrameARM64* last_frame = static_cast<StackFrameARM64*>(frames.back());
+
+ static const char* register_names[] = {
+ "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7",
+ "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15",
+ "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
+ "x24", "x25", "x26", "x27", "x28", "x29", "x30", "sp",
+ "pc", NULL
+ };
+
+ // Populate a dictionary with the valid register values in last_frame.
+ CFIFrameInfo::RegisterValueMap<uint64_t> callee_registers;
+ for (int i = 0; register_names[i]; i++) {
+ if (last_frame->context_validity & StackFrameARM64::RegisterValidFlag(i))
+ callee_registers[register_names[i]] = last_frame->context.iregs[i];
+ }
+
+ // Use the STACK CFI data to recover the caller's register values.
+ CFIFrameInfo::RegisterValueMap<uint64_t> caller_registers;
+ if (!cfi_frame_info->FindCallerRegs(callee_registers, *memory_,
+ &caller_registers)) {
+ return NULL;
+ }
+ // Construct a new stack frame given the values the CFI recovered.
+ scoped_ptr<StackFrameARM64> frame(new StackFrameARM64());
+ for (int i = 0; register_names[i]; i++) {
+ CFIFrameInfo::RegisterValueMap<uint64_t>::iterator entry =
+ caller_registers.find(register_names[i]);
+ if (entry != caller_registers.end()) {
+ // We recovered the value of this register; fill the context with the
+ // value from caller_registers.
+ frame->context_validity |= StackFrameARM64::RegisterValidFlag(i);
+ frame->context.iregs[i] = entry->second;
+ } else if (19 <= i && i <= 29 && (last_frame->context_validity &
+ StackFrameARM64::RegisterValidFlag(i))) {
+ // If the STACK CFI data doesn't mention some callee-saves register, and
+ // it is valid in the callee, assume the callee has not yet changed it.
+ // Registers r19 through r29 are callee-saves, according to the Procedure
+ // Call Standard for the ARM AARCH64 Architecture, which the Linux ABI
+ // follows.
+ frame->context_validity |= StackFrameARM64::RegisterValidFlag(i);
+ frame->context.iregs[i] = last_frame->context.iregs[i];
+ }
+ }
+ // If the CFI doesn't recover the PC explicitly, then use .ra.
+ if (!(frame->context_validity & StackFrameARM64::CONTEXT_VALID_PC)) {
+ CFIFrameInfo::RegisterValueMap<uint64_t>::iterator entry =
+ caller_registers.find(".ra");
+ if (entry != caller_registers.end()) {
+ frame->context_validity |= StackFrameARM64::CONTEXT_VALID_PC;
+ frame->context.iregs[MD_CONTEXT_ARM64_REG_PC] = entry->second;
+ }
+ }
+ // If the CFI doesn't recover the SP explicitly, then use .cfa.
+ if (!(frame->context_validity & StackFrameARM64::CONTEXT_VALID_SP)) {
+ CFIFrameInfo::RegisterValueMap<uint64_t>::iterator entry =
+ caller_registers.find(".cfa");
+ if (entry != caller_registers.end()) {
+ frame->context_validity |= StackFrameARM64::CONTEXT_VALID_SP;
+ frame->context.iregs[MD_CONTEXT_ARM64_REG_SP] = entry->second;
+ }
+ }
+
+ // If we didn't recover the PC and the SP, then the frame isn't very useful.
+ static const uint64_t essentials = (StackFrameARM64::CONTEXT_VALID_SP
+ | StackFrameARM64::CONTEXT_VALID_PC);
+ if ((frame->context_validity & essentials) != essentials)
+ return NULL;
+
+ frame->trust = StackFrame::FRAME_TRUST_CFI;
+ return frame.release();
}
StackFrameARM64* StackwalkerARM64::GetCallerByStackScan(
diff --git a/src/processor/stackwalker_arm64.h b/src/processor/stackwalker_arm64.h
index fc7f776..121e824 100644
--- a/src/processor/stackwalker_arm64.h
+++ b/src/processor/stackwalker_arm64.h
@@ -63,7 +63,9 @@
// Change the context validity mask of the frame returned by
// GetContextFrame to VALID. This is only for use by unit tests; the
// default behavior is correct for all application code.
- void SetContextFrameValidity(int valid) { context_frame_validity_ = valid; }
+ void SetContextFrameValidity(uint64_t valid) {
+ context_frame_validity_ = valid;
+ }
private:
// Implementation of Stackwalker, using arm64 context and stack conventions.
diff --git a/src/processor/stackwalker_arm64_unittest.cc b/src/processor/stackwalker_arm64_unittest.cc
index 1502c8f..dd617f6 100644
--- a/src/processor/stackwalker_arm64_unittest.cc
+++ b/src/processor/stackwalker_arm64_unittest.cc
@@ -76,8 +76,7 @@
// for tests to play with.
module1(0x40000000, 0x10000, "module1", "version1"),
module2(0x50000000, 0x10000, "module2", "version2") {
- // Identify the system as an iOS system, since that is the only platform
- // for which ARM64 support is currently enabled.
+ // Identify the system as an iOS system.
system_info.os = "iOS";
system_info.os_short = "ios";
system_info.cpu = "arm64";
@@ -534,3 +533,348 @@
EXPECT_EQ(frame2_sp.Value(), frame2->context.iregs[MD_CONTEXT_ARM64_REG_SP]);
EXPECT_EQ(0U, frame2->context.iregs[MD_CONTEXT_ARM64_REG_FP]);
}
+
+struct CFIFixture: public StackwalkerARM64Fixture {
+ CFIFixture() {
+ // Provide a bunch of STACK CFI records; we'll walk to the caller
+ // from every point in this series, expecting to find the same set
+ // of register values.
+ SetModuleSymbols(&module1,
+ // The youngest frame's function.
+ "FUNC 4000 1000 10 enchiridion\n"
+ // Initially, nothing has been pushed on the stack,
+ // and the return address is still in the link
+ // register (x30).
+ "STACK CFI INIT 4000 100 .cfa: sp 0 + .ra: x30\n"
+ // Push x19, x20, the frame pointer and the link register.
+ "STACK CFI 4001 .cfa: sp 32 + .ra: .cfa -8 + ^"
+ " x19: .cfa -32 + ^ x20: .cfa -24 + ^ "
+ " x29: .cfa -16 + ^\n"
+ // Save x19..x22 in x0..x3: verify that we populate
+ // the youngest frame with all the values we have.
+ "STACK CFI 4002 x19: x0 x20: x1 x21: x2 x22: x3\n"
+ // Restore x19..x22. Save the non-callee-saves register x1.
+ "STACK CFI 4003 .cfa: sp 40 + x1: .cfa 40 - ^"
+ " x19: x19 x20: x20 x21: x21 x22: x22\n"
+ // Move the .cfa back eight bytes, to point at the return
+ // address, and restore the sp explicitly.
+ "STACK CFI 4005 .cfa: sp 32 + x1: .cfa 32 - ^"
+ " x29: .cfa 8 - ^ .ra: .cfa ^ sp: .cfa 8 +\n"
+ // Recover the PC explicitly from a new stack slot;
+ // provide garbage for the .ra.
+ "STACK CFI 4006 .cfa: sp 40 + pc: .cfa 40 - ^\n"
+
+ // The calling function.
+ "FUNC 5000 1000 10 epictetus\n"
+ // Mark it as end of stack.
+ "STACK CFI INIT 5000 1000 .cfa: 0 .ra: 0\n"
+
+ // A function whose CFI makes the stack pointer
+ // go backwards.
+ "FUNC 6000 1000 20 palinal\n"
+ "STACK CFI INIT 6000 1000 .cfa: sp 8 - .ra: x30\n"
+
+ // A function with CFI expressions that can't be
+ // evaluated.
+ "FUNC 7000 1000 20 rhetorical\n"
+ "STACK CFI INIT 7000 1000 .cfa: moot .ra: ambiguous\n");
+
+ // Provide some distinctive values for the caller's registers.
+ expected.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040005510L;
+ expected.iregs[MD_CONTEXT_ARM64_REG_SP] = 0x0000000080000000L;
+ expected.iregs[19] = 0x5e68b5d5b5d55e68L;
+ expected.iregs[20] = 0x34f3ebd1ebd134f3L;
+ expected.iregs[21] = 0x74bca31ea31e74bcL;
+ expected.iregs[22] = 0x16b32dcb2dcb16b3L;
+ expected.iregs[23] = 0x21372ada2ada2137L;
+ expected.iregs[24] = 0x557dbbbbbbbb557dL;
+ expected.iregs[25] = 0x8ca748bf48bf8ca7L;
+ expected.iregs[26] = 0x21f0ab46ab4621f0L;
+ expected.iregs[27] = 0x146732b732b71467L;
+ expected.iregs[28] = 0xa673645fa673645fL;
+ expected.iregs[MD_CONTEXT_ARM64_REG_FP] = 0xe11081128112e110L;
+
+ // Expect CFI to recover all callee-saves registers. Since CFI is the
+ // only stack frame construction technique we have, aside from the
+ // context frame itself, there's no way for us to have a set of valid
+ // registers smaller than this.
+ expected_validity = (StackFrameARM64::CONTEXT_VALID_PC |
+ StackFrameARM64::CONTEXT_VALID_SP |
+ StackFrameARM64::CONTEXT_VALID_X19 |
+ StackFrameARM64::CONTEXT_VALID_X20 |
+ StackFrameARM64::CONTEXT_VALID_X21 |
+ StackFrameARM64::CONTEXT_VALID_X22 |
+ StackFrameARM64::CONTEXT_VALID_X23 |
+ StackFrameARM64::CONTEXT_VALID_X24 |
+ StackFrameARM64::CONTEXT_VALID_X25 |
+ StackFrameARM64::CONTEXT_VALID_X26 |
+ StackFrameARM64::CONTEXT_VALID_X27 |
+ StackFrameARM64::CONTEXT_VALID_X28 |
+ StackFrameARM64::CONTEXT_VALID_FP);
+
+ // By default, context frames provide all registers, as normal.
+ context_frame_validity = StackFrameARM64::CONTEXT_VALID_ALL;
+
+ // By default, registers are unchanged.
+ raw_context = expected;
+ }
+
+ // Walk the stack, using stack_section as the contents of the stack
+ // and raw_context as the current register values. (Set the stack
+ // pointer to the stack's starting address.) Expect two stack
+ // frames; in the older frame, expect the callee-saves registers to
+ // have values matching those in 'expected'.
+ void CheckWalk() {
+ RegionFromSection();
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = stack_section.start().Value();
+
+ StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
+ StackwalkerARM64 walker(&system_info, &raw_context, &stack_region,
+ &modules, &frame_symbolizer);
+ walker.SetContextFrameValidity(context_frame_validity);
+ vector<const CodeModule*> modules_without_symbols;
+ vector<const CodeModule*> modules_with_corrupt_symbols;
+ ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols,
+ &modules_with_corrupt_symbols));
+ ASSERT_EQ(0U, modules_without_symbols.size());
+ ASSERT_EQ(0U, modules_with_corrupt_symbols.size());
+ frames = call_stack.frames();
+ ASSERT_EQ(2U, frames->size());
+
+ StackFrameARM64 *frame0 = static_cast<StackFrameARM64 *>(frames->at(0));
+ EXPECT_EQ(StackFrame::FRAME_TRUST_CONTEXT, frame0->trust);
+ ASSERT_EQ(context_frame_validity, frame0->context_validity);
+ EXPECT_EQ("enchiridion", frame0->function_name);
+ EXPECT_EQ(0x0000000040004000UL, frame0->function_base);
+
+ StackFrameARM64 *frame1 = static_cast<StackFrameARM64 *>(frames->at(1));
+ EXPECT_EQ(StackFrame::FRAME_TRUST_CFI, frame1->trust);
+ ASSERT_EQ(expected_validity, frame1->context_validity);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X1)
+ EXPECT_EQ(expected.iregs[1], frame1->context.iregs[1]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X19)
+ EXPECT_EQ(expected.iregs[19], frame1->context.iregs[19]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X20)
+ EXPECT_EQ(expected.iregs[20], frame1->context.iregs[20]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X21)
+ EXPECT_EQ(expected.iregs[21], frame1->context.iregs[21]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X22)
+ EXPECT_EQ(expected.iregs[22], frame1->context.iregs[22]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X23)
+ EXPECT_EQ(expected.iregs[23], frame1->context.iregs[23]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X24)
+ EXPECT_EQ(expected.iregs[24], frame1->context.iregs[24]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X25)
+ EXPECT_EQ(expected.iregs[25], frame1->context.iregs[25]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X26)
+ EXPECT_EQ(expected.iregs[26], frame1->context.iregs[26]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X27)
+ EXPECT_EQ(expected.iregs[27], frame1->context.iregs[27]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_X28)
+ EXPECT_EQ(expected.iregs[28], frame1->context.iregs[28]);
+ if (expected_validity & StackFrameARM64::CONTEXT_VALID_FP)
+ EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM64_REG_FP],
+ frame1->context.iregs[MD_CONTEXT_ARM64_REG_FP]);
+
+ // We would never have gotten a frame in the first place if the SP
+ // and PC weren't valid or ->instruction weren't set.
+ EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM64_REG_SP],
+ frame1->context.iregs[MD_CONTEXT_ARM64_REG_SP]);
+ EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM64_REG_PC],
+ frame1->context.iregs[MD_CONTEXT_ARM64_REG_PC]);
+ EXPECT_EQ(expected.iregs[MD_CONTEXT_ARM64_REG_PC],
+ frame1->instruction + 4);
+ EXPECT_EQ("epictetus", frame1->function_name);
+ }
+
+ // The values we expect to find for the caller's registers.
+ MDRawContextARM64 expected;
+
+ // The validity mask for expected.
+ uint64_t expected_validity;
+
+ // The validity mask to impose on the context frame.
+ uint64_t context_frame_validity;
+};
+
+class CFI: public CFIFixture, public Test { };
+
+TEST_F(CFI, At4000) {
+ stack_section.start() = expected.iregs[MD_CONTEXT_ARM64_REG_SP];
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004000L;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_LR] = 0x0000000040005510L;
+ CheckWalk();
+}
+
+TEST_F(CFI, At4001) {
+ Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP];
+ stack_section
+ .D64(0x5e68b5d5b5d55e68L) // saved x19
+ .D64(0x34f3ebd1ebd134f3L) // saved x20
+ .D64(0xe11081128112e110L) // saved fp
+ .D64(0x0000000040005510L) // return address
+ .Mark(&frame1_sp); // This effectively sets stack_section.start().
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004001L;
+ // distinct callee x19, x20 and fp
+ raw_context.iregs[19] = 0xadc9f635a635adc9L;
+ raw_context.iregs[20] = 0x623135ac35ac6231L;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L;
+ CheckWalk();
+}
+
+// As above, but unwind from a context that has only the PC and SP.
+TEST_F(CFI, At4001LimitedValidity) {
+ Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP];
+ stack_section
+ .D64(0x5e68b5d5b5d55e68L) // saved x19
+ .D64(0x34f3ebd1ebd134f3L) // saved x20
+ .D64(0xe11081128112e110L) // saved fp
+ .D64(0x0000000040005510L) // return address
+ .Mark(&frame1_sp); // This effectively sets stack_section.start().
+ context_frame_validity =
+ StackFrameARM64::CONTEXT_VALID_PC | StackFrameARM64::CONTEXT_VALID_SP;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004001L;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L;
+
+ expected_validity = (StackFrameARM64::CONTEXT_VALID_PC
+ | StackFrameARM64::CONTEXT_VALID_SP
+ | StackFrameARM64::CONTEXT_VALID_FP
+ | StackFrameARM64::CONTEXT_VALID_X19
+ | StackFrameARM64::CONTEXT_VALID_X20);
+ CheckWalk();
+}
+
+TEST_F(CFI, At4002) {
+ Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP];
+ stack_section
+ .D64(0xff3dfb81fb81ff3dL) // no longer saved x19
+ .D64(0x34f3ebd1ebd134f3L) // no longer saved x20
+ .D64(0xe11081128112e110L) // saved fp
+ .D64(0x0000000040005510L) // return address
+ .Mark(&frame1_sp); // This effectively sets stack_section.start().
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004002L;
+ raw_context.iregs[0] = 0x5e68b5d5b5d55e68L; // saved x19
+ raw_context.iregs[1] = 0x34f3ebd1ebd134f3L; // saved x20
+ raw_context.iregs[2] = 0x74bca31ea31e74bcL; // saved x21
+ raw_context.iregs[3] = 0x16b32dcb2dcb16b3L; // saved x22
+ raw_context.iregs[19] = 0xadc9f635a635adc9L; // distinct callee x19
+ raw_context.iregs[20] = 0x623135ac35ac6231L; // distinct callee x20
+ raw_context.iregs[21] = 0xac4543564356ac45L; // distinct callee x21
+ raw_context.iregs[22] = 0x2561562f562f2561L; // distinct callee x22
+ // distinct callee fp
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L;
+ CheckWalk();
+}
+
+TEST_F(CFI, At4003) {
+ Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP];
+ stack_section
+ .D64(0xdd5a48c848c8dd5aL) // saved x1 (even though it's not callee-saves)
+ .D64(0xff3dfb81fb81ff3dL) // no longer saved x19
+ .D64(0x34f3ebd1ebd134f3L) // no longer saved x20
+ .D64(0xe11081128112e110L) // saved fp
+ .D64(0x0000000040005510L) // return address
+ .Mark(&frame1_sp); // This effectively sets stack_section.start().
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004003L;
+ // distinct callee x1 and fp
+ raw_context.iregs[1] = 0xfb756319fb756319L;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L;
+ // caller's x1
+ expected.iregs[1] = 0xdd5a48c848c8dd5aL;
+ expected_validity |= StackFrameARM64::CONTEXT_VALID_X1;
+ CheckWalk();
+}
+
+// We have no new rule at module offset 0x4004, so the results here should
+// be the same as those at module offset 0x4003.
+TEST_F(CFI, At4004) {
+ Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP];
+ stack_section
+ .D64(0xdd5a48c848c8dd5aL) // saved x1 (even though it's not callee-saves)
+ .D64(0xff3dfb81fb81ff3dL) // no longer saved x19
+ .D64(0x34f3ebd1ebd134f3L) // no longer saved x20
+ .D64(0xe11081128112e110L) // saved fp
+ .D64(0x0000000040005510L) // return address
+ .Mark(&frame1_sp); // This effectively sets stack_section.start().
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004004L;
+ // distinct callee x1 and fp
+ raw_context.iregs[1] = 0xfb756319fb756319L;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_FP] = 0x5fc4be14be145fc4L;
+ // caller's x1
+ expected.iregs[1] = 0xdd5a48c848c8dd5aL;
+ expected_validity |= StackFrameARM64::CONTEXT_VALID_X1;
+ CheckWalk();
+}
+
+// Here we move the .cfa, but provide an explicit rule to recover the SP,
+// so again there should be no change in the registers recovered.
+TEST_F(CFI, At4005) {
+ Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP];
+ stack_section
+ .D64(0xdd5a48c848c8dd5aL) // saved x1 (even though it's not callee-saves)
+ .D64(0xff3dfb81fb81ff3dL) // no longer saved x19
+ .D64(0x34f3ebd1ebd134f3L) // no longer saved x20
+ .D64(0xe11081128112e110L) // saved fp
+ .D64(0x0000000040005510L) // return address
+ .Mark(&frame1_sp); // This effectively sets stack_section.start().
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004005L;
+ raw_context.iregs[1] = 0xfb756319fb756319L; // distinct callee x1
+ expected.iregs[1] = 0xdd5a48c848c8dd5aL; // caller's x1
+ expected_validity |= StackFrameARM64::CONTEXT_VALID_X1;
+ CheckWalk();
+}
+
+// Here we provide an explicit rule for the PC, and have the saved .ra be
+// bogus.
+TEST_F(CFI, At4006) {
+ Label frame1_sp = expected.iregs[MD_CONTEXT_ARM64_REG_SP];
+ stack_section
+ .D64(0x0000000040005510L) // saved pc
+ .D64(0xdd5a48c848c8dd5aL) // saved x1 (even though it's not callee-saves)
+ .D64(0xff3dfb81fb81ff3dL) // no longer saved x19
+ .D64(0x34f3ebd1ebd134f3L) // no longer saved x20
+ .D64(0xe11081128112e110L) // saved fp
+ .D64(0xf8d157835783f8d1L) // .ra rule recovers this, which is garbage
+ .Mark(&frame1_sp); // This effectively sets stack_section.start().
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040004006L;
+ raw_context.iregs[1] = 0xfb756319fb756319L; // distinct callee x1
+ expected.iregs[1] = 0xdd5a48c848c8dd5aL; // caller's x1
+ expected_validity |= StackFrameARM64::CONTEXT_VALID_X1;
+ CheckWalk();
+}
+
+// Check that we reject rules that would cause the stack pointer to
+// move in the wrong direction.
+TEST_F(CFI, RejectBackwards) {
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040006000L;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = 0x0000000080000000L;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_LR] = 0x0000000040005510L;
+ StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
+ StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules,
+ &frame_symbolizer);
+ vector<const CodeModule*> modules_without_symbols;
+ vector<const CodeModule*> modules_with_corrupt_symbols;
+ ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols,
+ &modules_with_corrupt_symbols));
+ ASSERT_EQ(0U, modules_without_symbols.size());
+ ASSERT_EQ(0U, modules_with_corrupt_symbols.size());
+ frames = call_stack.frames();
+ ASSERT_EQ(1U, frames->size());
+}
+
+// Check that we reject rules whose expressions' evaluation fails.
+TEST_F(CFI, RejectBadExpressions) {
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_PC] = 0x0000000040007000L;
+ raw_context.iregs[MD_CONTEXT_ARM64_REG_SP] = 0x0000000080000000L;
+ StackFrameSymbolizer frame_symbolizer(&supplier, &resolver);
+ StackwalkerARM64 walker(&system_info, &raw_context, &stack_region, &modules,
+ &frame_symbolizer);
+ vector<const CodeModule*> modules_without_symbols;
+ vector<const CodeModule*> modules_with_corrupt_symbols;
+ ASSERT_TRUE(walker.Walk(&call_stack, &modules_without_symbols,
+ &modules_with_corrupt_symbols));
+ ASSERT_EQ(0U, modules_without_symbols.size());
+ ASSERT_EQ(0U, modules_with_corrupt_symbols.size());
+ frames = call_stack.frames();
+ ASSERT_EQ(1U, frames->size());
+}
diff --git a/src/processor/testdata/minidump2.dump.out b/src/processor/testdata/minidump2.dump.out
index d8816e5..8585c89 100644
--- a/src/processor/testdata/minidump2.dump.out
+++ b/src/processor/testdata/minidump2.dump.out
@@ -9,67 +9,67 @@
mDirectory[0]
MDRawDirectory
- stream_type = 3
+ stream_type = 0x3 (MD_THREAD_LIST_STREAM)
location.data_size = 100
location.rva = 0x184
mDirectory[1]
MDRawDirectory
- stream_type = 4
+ stream_type = 0x4 (MD_MODULE_LIST_STREAM)
location.data_size = 1408
location.rva = 0x1e8
mDirectory[2]
MDRawDirectory
- stream_type = 5
+ stream_type = 0x5 (MD_MEMORY_LIST_STREAM)
location.data_size = 52
location.rva = 0x1505
mDirectory[3]
MDRawDirectory
- stream_type = 6
+ stream_type = 0x6 (MD_EXCEPTION_STREAM)
location.data_size = 168
location.rva = 0xdc
mDirectory[4]
MDRawDirectory
- stream_type = 7
+ stream_type = 0x7 (MD_SYSTEM_INFO_STREAM)
location.data_size = 56
location.rva = 0x8c
mDirectory[5]
MDRawDirectory
- stream_type = 15
+ stream_type = 0xf (MD_MISC_INFO_STREAM)
location.data_size = 24
location.rva = 0xc4
mDirectory[6]
MDRawDirectory
- stream_type = 1197932545
+ stream_type = 0x47670001 (MD_BREAKPAD_INFO_STREAM)
location.data_size = 12
location.rva = 0x14f9
mDirectory[7]
MDRawDirectory
- stream_type = 0
+ stream_type = 0x0 (MD_UNUSED_STREAM)
location.data_size = 0
location.rva = 0x0
mDirectory[8]
MDRawDirectory
- stream_type = 0
+ stream_type = 0x0 (MD_UNUSED_STREAM)
location.data_size = 0
location.rva = 0x0
Streams:
- stream type 0x0 at index 8
- stream type 0x3 at index 0
- stream type 0x4 at index 1
- stream type 0x5 at index 2
- stream type 0x6 at index 3
- stream type 0x7 at index 4
- stream type 0xf at index 5
- stream type 0x47670001 at index 6
+ stream type 0x0 (MD_UNUSED_STREAM) at index 8
+ stream type 0x3 (MD_THREAD_LIST_STREAM) at index 0
+ stream type 0x4 (MD_MODULE_LIST_STREAM) at index 1
+ stream type 0x5 (MD_MEMORY_LIST_STREAM) at index 2
+ stream type 0x6 (MD_EXCEPTION_STREAM) at index 3
+ stream type 0x7 (MD_SYSTEM_INFO_STREAM) at index 4
+ stream type 0xf (MD_MISC_INFO_STREAM) at index 5
+ stream type 0x47670001 (MD_BREAKPAD_INFO_STREAM) at index 6
MinidumpThreadList
thread_count = 2
@@ -184,7 +184,7 @@
base_of_image = 0x400000
size_of_image = 0x2d000
checksum = 0x0
- time_date_stamp = 0x45d35f6c
+ time_date_stamp = 0x45d35f6c 2007-02-14 19:13:48
module_name_rva = 0x78a
version_info.signature = 0x0
version_info.struct_version = 0x0
@@ -216,7 +216,7 @@
base_of_image = 0x7c900000
size_of_image = 0xb0000
checksum = 0xaf2f7
- time_date_stamp = 0x411096b4
+ time_date_stamp = 0x411096b4 2004-08-04 07:56:36
module_name_rva = 0x7ae
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -248,7 +248,7 @@
base_of_image = 0x7c800000
size_of_image = 0xf4000
checksum = 0xf724d
- time_date_stamp = 0x44ab9a84
+ time_date_stamp = 0x44ab9a84 2006-07-05 10:55:00
module_name_rva = 0x7ee
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -280,7 +280,7 @@
base_of_image = 0x774e0000
size_of_image = 0x13d000
checksum = 0x13dc6b
- time_date_stamp = 0x42e5be93
+ time_date_stamp = 0x42e5be93 2005-07-26 04:39:47
module_name_rva = 0x834
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -312,7 +312,7 @@
base_of_image = 0x77dd0000
size_of_image = 0x9b000
checksum = 0xa0de4
- time_date_stamp = 0x411096a7
+ time_date_stamp = 0x411096a7 2004-08-04 07:56:23
module_name_rva = 0x874
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -344,7 +344,7 @@
base_of_image = 0x77e70000
size_of_image = 0x91000
checksum = 0x9c482
- time_date_stamp = 0x411096ae
+ time_date_stamp = 0x411096ae 2004-08-04 07:56:30
module_name_rva = 0x8ba
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -376,7 +376,7 @@
base_of_image = 0x77f10000
size_of_image = 0x47000
checksum = 0x4d0d0
- time_date_stamp = 0x43b34feb
+ time_date_stamp = 0x43b34feb 2005-12-29 02:54:35
module_name_rva = 0x8fc
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -408,7 +408,7 @@
base_of_image = 0x77d40000
size_of_image = 0x90000
checksum = 0x9505c
- time_date_stamp = 0x42260159
+ time_date_stamp = 0x42260159 2005-03-02 18:09:29
module_name_rva = 0x93c
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -440,7 +440,7 @@
base_of_image = 0x77c10000
size_of_image = 0x58000
checksum = 0x57cd3
- time_date_stamp = 0x41109752
+ time_date_stamp = 0x41109752 2004-08-04 07:59:14
module_name_rva = 0x97e
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -472,7 +472,7 @@
base_of_image = 0x76390000
size_of_image = 0x1d000
checksum = 0x2a024
- time_date_stamp = 0x411096ae
+ time_date_stamp = 0x411096ae 2004-08-04 07:56:30
module_name_rva = 0x9c0
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -504,7 +504,7 @@
base_of_image = 0x59a60000
size_of_image = 0xa1000
checksum = 0xa8824
- time_date_stamp = 0x4110969a
+ time_date_stamp = 0x4110969a 2004-08-04 07:56:10
module_name_rva = 0xa00
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -536,7 +536,7 @@
base_of_image = 0x77c00000
size_of_image = 0x8000
checksum = 0x11d78
- time_date_stamp = 0x411096b7
+ time_date_stamp = 0x411096b7 2004-08-04 07:56:39
module_name_rva = 0xa44
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -568,7 +568,7 @@
base_of_image = 0x76bf0000
size_of_image = 0xb000
checksum = 0xa29b
- time_date_stamp = 0x411096ca
+ time_date_stamp = 0x411096ca 2004-08-04 07:56:58
module_name_rva = 0xa88
version_info.signature = 0xfeef04bd
version_info.struct_version = 0x10000
@@ -670,7 +670,7 @@
extended_registers[512] = 0x7f0200000000220000000000000000000000000000000000801f0000ffff00000000000018b72200000100000000000018b72200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004509917c4e09917c38b622002400020024b42200020000009041917c0070fd7f0510907cccb22200000000009cb3220018ee907c7009917cc0e4977c6f3e917c623e917c08020000dcb62200b4b622001e000000000000000000000000000000000000002eb42200000000000f000000020000001e00200000fcfd7f2f63796764726976652f632f444f43554d457e312f4d4d454e544f7e312f4c4f43414c537e312f54656d7000000000000000000130b422000000004300000000000000001efcfd7f4509917c4e09917c5ad9000008b32200b4b62200
MDRawSystemInfo
- processor_architecture = 0
+ processor_architecture = 0x0
processor_level = 6
processor_revision = 0xd08
number_of_processors = 1
@@ -678,9 +678,10 @@
major_version = 5
minor_version = 1
build_number = 2600
- platform_id = 2
+ platform_id = 0x2
csd_version_rva = 0x768
suite_mask = 0x100
+ cpu.x86_cpu_info (valid):
cpu.x86_cpu_info.vendor_id[0] = 0x756e6547
cpu.x86_cpu_info.vendor_id[1] = 0x49656e69
cpu.x86_cpu_info.vendor_id[2] = 0x6c65746e
@@ -693,10 +694,10 @@
MDRawMiscInfo
size_of_info = 24
flags1 = 0x3
- process_id = 0xf5c
- process_create_time = 0x45d35f73
- process_user_time = 0x0
- process_kernel_time = 0x0
+ process_id = 3932
+ process_create_time = 0x45d35f73 2007-02-14 19:13:55
+ process_user_time = 0
+ process_kernel_time = 0
MDRawBreakpadInfo
validity = 0x3
diff --git a/src/tools/linux/md2core/minidump-2-core.cc b/src/tools/linux/md2core/minidump-2-core.cc
index e796dfe..815e6e7 100644
--- a/src/tools/linux/md2core/minidump-2-core.cc
+++ b/src/tools/linux/md2core/minidump-2-core.cc
@@ -86,6 +86,7 @@
static const MDRVA kInvalidMDRVA = static_cast<MDRVA>(-1);
static bool verbose;
+static std::string g_custom_so_basedir;
static int usage(const char* argv0) {
fprintf(stderr, "Usage: %s [-v] <minidump file>\n", argv0);
@@ -365,7 +366,7 @@
for (int i = 0; i < MD_CONTEXT_MIPS_GPR_COUNT; ++i)
thread->regs.regs[i] = rawregs->iregs[i];
-
+
thread->regs.lo = rawregs->mdlo;
thread->regs.hi = rawregs->mdhi;
thread->regs.epc = rawregs->epc;
@@ -375,7 +376,7 @@
for (int i = 0; i < MD_FLOATINGSAVEAREA_MIPS_FPR_COUNT; ++i)
thread->fpregs.regs[i] = rawregs->float_save.regs[i];
-
+
thread->fpregs.fpcsr = rawregs->float_save.fpcsr;
thread->fpregs.fir = rawregs->float_save.fir;
}
@@ -575,7 +576,7 @@
ParseEnvironment(CrashedProcess* crashinfo, const MinidumpMemoryRange& range) {
if (verbose) {
fputs("MD_LINUX_ENVIRON:\n", stderr);
- char *env = new char[range.length()];
+ char* env = new char[range.length()];
memcpy(env, range.data(), range.length());
int nul_count = 0;
for (char *ptr = env;;) {
@@ -814,8 +815,13 @@
std::string basename = slash == std::string::npos ?
filename : filename.substr(slash + 1);
if (strcmp(guid, "00000000-0000-0000-0000-000000000000")) {
- crashinfo->signatures[rawmodule->base_of_image] =
- std::string("/var/lib/breakpad/") + guid + "-" + basename;
+ std::string prefix;
+ if (!g_custom_so_basedir.empty())
+ prefix = g_custom_so_basedir;
+ else
+ prefix = std::string("/var/lib/breakpad/") + guid + "-" + basename;
+
+ crashinfo->signatures[rawmodule->base_of_image] = prefix + basename;
}
if (verbose) {
@@ -974,6 +980,14 @@
while (argi < argc && argv[argi][0] == '-') {
if (!strcmp(argv[argi], "-v")) {
verbose = true;
+ } else if (!strcmp(argv[argi], "--sobasedir")) {
+ argi++;
+ if (argi >= argc) {
+ fprintf(stderr, "--sobasedir expects an argument.");
+ return usage(argv[0]);
+ }
+
+ g_custom_so_basedir = argv[argi];
} else {
return usage(argv[0]);
}
@@ -983,7 +997,7 @@
if (argc != argi + 1)
return usage(argv[0]);
- MemoryMappedFile mapped_file(argv[argi]);
+ MemoryMappedFile mapped_file(argv[argi], 0);
if (!mapped_file.data()) {
fprintf(stderr, "Failed to mmap dump file\n");
return 1;
diff --git a/src/tools/windows/converter/ms_symbol_server_converter.cc b/src/tools/windows/converter/ms_symbol_server_converter.cc
index 2b6278b..fad35fa 100644
--- a/src/tools/windows/converter/ms_symbol_server_converter.cc
+++ b/src/tools/windows/converter/ms_symbol_server_converter.cc
@@ -113,10 +113,12 @@
assert(symbol_servers.size() > 0);
+#if !defined(NDEBUG)
// These are characters that are interpreted as having special meanings in
// symbol_path_.
- const char *kInvalidCharacters = "*;";
+ const char kInvalidCharacters[] = "*;";
assert(local_cache.find_first_of(kInvalidCharacters) == string::npos);
+#endif // !defined(NDEBUG)
for (vector<string>::const_iterator symbol_server = symbol_servers.begin();
symbol_server != symbol_servers.end();
@@ -183,7 +185,7 @@
// are supported by calling Delete().
class AutoDeleter {
public:
- AutoDeleter(const string &path) : path_(path) {}
+ explicit AutoDeleter(const string &path) : path_(path) {}
~AutoDeleter() {
int error;
@@ -213,18 +215,20 @@
};
MSSymbolServerConverter::LocateResult
-MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing,
- string *symbol_file) {
- assert(symbol_file);
- symbol_file->clear();
+MSSymbolServerConverter::LocateFile(const string &debug_or_code_file,
+ const string &debug_or_code_id,
+ const string &version,
+ string *file_name) {
+ assert(file_name);
+ file_name->clear();
GUIDOrSignatureIdentifier identifier;
- if (!identifier.InitializeFromString(missing.debug_identifier)) {
+ if (!identifier.InitializeFromString(debug_or_code_id)) {
fprintf(stderr,
- "LocateSymbolFile: Unparseable debug_identifier for %s %s %s\n",
- missing.debug_file.c_str(),
- missing.debug_identifier.c_str(),
- missing.version.c_str());
+ "LocateFile: Unparseable identifier for %s %s %s\n",
+ debug_or_code_file.c_str(),
+ debug_or_code_id.c_str(),
+ version.c_str());
return LOCATE_FAILURE;
}
@@ -233,22 +237,22 @@
if (!symsrv.Initialize(process,
const_cast<char *>(symbol_path_.c_str()),
false)) {
- fprintf(stderr, "LocateSymbolFile: SymInitialize: error %d for %s %s %s\n",
+ fprintf(stderr, "LocateFile: SymInitialize: error %d for %s %s %s\n",
GetLastError(),
- missing.debug_file.c_str(),
- missing.debug_identifier.c_str(),
- missing.version.c_str());
+ debug_or_code_file.c_str(),
+ debug_or_code_id.c_str(),
+ version.c_str());
return LOCATE_FAILURE;
}
if (!SymRegisterCallback64(process, SymCallback,
reinterpret_cast<ULONG64>(this))) {
fprintf(stderr,
- "LocateSymbolFile: SymRegisterCallback64: error %d for %s %s %s\n",
+ "LocateFile: SymRegisterCallback64: error %d for %s %s %s\n",
GetLastError(),
- missing.debug_file.c_str(),
- missing.debug_identifier.c_str(),
- missing.version.c_str());
+ debug_or_code_file.c_str(),
+ debug_or_code_id.c_str(),
+ version.c_str());
return LOCATE_FAILURE;
}
@@ -267,7 +271,7 @@
char path[MAX_PATH];
if (!SymFindFileInPath(
process, NULL,
- const_cast<char *>(missing.debug_file.c_str()),
+ const_cast<char *>(debug_or_code_file.c_str()),
const_cast<void *>(identifier.guid_or_signature_pointer()),
identifier.age(), 0,
identifier.type() == GUIDOrSignatureIdentifier::TYPE_GUID ?
@@ -286,11 +290,11 @@
// This is an authoritiative file-not-found message.
if (fail_not_found_) {
fprintf(stderr,
- "LocateSymbolFile: SymFindFileInPath: LOCATE_NOT_FOUND error "
+ "LocateFile: SymFindFileInPath: LOCATE_NOT_FOUND error "
"for %s %s %s\n",
- missing.debug_file.c_str(),
- missing.debug_identifier.c_str(),
- missing.version.c_str());
+ debug_or_code_file.c_str(),
+ debug_or_code_id.c_str(),
+ version.c_str());
return LOCATE_NOT_FOUND;
}
@@ -299,14 +303,17 @@
}
fprintf(stderr,
- "LocateSymbolFile: SymFindFileInPath: error %d for %s %s %s\n",
+ "LocateFile: SymFindFileInPath: error %d for %s %s %s\n",
error,
- missing.debug_file.c_str(),
- missing.debug_identifier.c_str(),
- missing.version.c_str());
+ debug_or_code_file.c_str(),
+ debug_or_code_id.c_str(),
+ version.c_str());
return LOCATE_FAILURE;
}
+ // Making sure path is null-terminated.
+ path[MAX_PATH - 1] = '\0';
+
// The AutoDeleter ensures that the file is only kept when returning
// LOCATE_SUCCESS.
AutoDeleter deleter(path);
@@ -314,20 +321,37 @@
// Do the cleanup here even though it will happen when symsrv goes out of
// scope, to allow it to influence the return value.
if (!symsrv.Cleanup()) {
- fprintf(stderr, "LocateSymbolFile: SymCleanup: error %d for %s %s %s\n",
+ fprintf(stderr, "LocateFile: SymCleanup: error %d for %s %s %s\n",
GetLastError(),
- missing.debug_file.c_str(),
- missing.debug_identifier.c_str(),
- missing.version.c_str());
+ debug_or_code_file.c_str(),
+ debug_or_code_id.c_str(),
+ version.c_str());
return LOCATE_FAILURE;
}
deleter.Release();
- *symbol_file = path;
+ printf("Downloaded: %s\n", path);
+ *file_name = path;
return LOCATE_SUCCESS;
}
+
+MSSymbolServerConverter::LocateResult
+MSSymbolServerConverter::LocatePEFile(const MissingSymbolInfo &missing,
+ string *pe_file) {
+ return LocateFile(missing.code_file, missing.code_identifier,
+ missing.version, pe_file);
+}
+
+MSSymbolServerConverter::LocateResult
+MSSymbolServerConverter::LocateSymbolFile(const MissingSymbolInfo &missing,
+ string *symbol_file) {
+ return LocateFile(missing.debug_file, missing.debug_identifier,
+ missing.version, symbol_file);
+}
+
+
// static
BOOL CALLBACK MSSymbolServerConverter::SymCallback(HANDLE process,
ULONG action,
@@ -341,7 +365,7 @@
IMAGEHLP_CBA_EVENT *cba_event =
reinterpret_cast<IMAGEHLP_CBA_EVENT *>(data);
- // Put the string into a string object to be able to use string::find
+ // Put the string into a string object to be able to use string::find
// for substring matching. This is important because the not-found
// message does not use the entire string but is appended to the URL
// that SymSrv attempted to retrieve.
@@ -398,7 +422,7 @@
// static
BOOL CALLBACK MSSymbolServerConverter::SymFindFileInPathCallback(
- char *filename, void *context) {
+ const char *filename, void *context) {
// FALSE ends the search, indicating that the located symbol file is
// satisfactory.
return FALSE;
@@ -408,8 +432,10 @@
MSSymbolServerConverter::LocateAndConvertSymbolFile(
const MissingSymbolInfo &missing,
bool keep_symbol_file,
+ bool keep_pe_file,
string *converted_symbol_file,
- string *symbol_file) {
+ string *symbol_file,
+ string *out_pe_file) {
assert(converted_symbol_file);
converted_symbol_file->clear();
if (symbol_file) {
@@ -426,11 +452,26 @@
*symbol_file = pdb_file;
}
+ // The conversion of a symbol file for a Windows 64-bit module requires
+ // loading of the executable file. If there is no executable file, convert
+ // using only the PDB file. Without an executable file, the conversion will
+ // fail for 64-bit modules but it should succeed for 32-bit modules.
+ string pe_file;
+ result = LocatePEFile(missing, &pe_file);
+ if (result != LOCATE_SUCCESS) {
+ fprintf(stderr, "WARNING: Could not download: %s\n", pe_file.c_str());
+ }
+
+ if (out_pe_file && keep_pe_file) {
+ *out_pe_file = pe_file;
+ }
+
// Conversion may fail because the file is corrupt. If a broken file is
// kept in the local cache, LocateSymbolFile will not hit the network again
// to attempt to locate it. To guard against problems like this, the
// symbol file in the local cache will be removed if conversion fails.
AutoDeleter pdb_deleter(pdb_file);
+ AutoDeleter pe_deleter(pe_file);
// Be sure that it's a .pdb file, since we'll be replacing .pdb with .sym
// for the converted file's name.
@@ -438,19 +479,7 @@
// strcasecmp is called _stricmp here.
if (_stricmp(pdb_extension.c_str(), ".pdb") != 0) {
fprintf(stderr, "LocateAndConvertSymbolFile: "
- "LocateSymbolFile: no .pdb extension for %s %s %s %s\n",
- missing.debug_file.c_str(),
- missing.debug_identifier.c_str(),
- missing.version.c_str(),
- pdb_file.c_str());
- return LOCATE_FAILURE;
- }
-
- // PDBSourceLineWriter wants the filename as a wstring, so convert it.
- wstring pdb_file_w;
- if (!WindowsStringUtils::safe_mbstowcs(pdb_file, &pdb_file_w)) {
- fprintf(stderr, "LocateAndConvertSymbolFile: "
- "WindowsStringUtils::safe_mbstowcs failed for %s %s %s %s\n",
+ "no .pdb extension for %s %s %s %s\n",
missing.debug_file.c_str(),
missing.debug_identifier.c_str(),
missing.version.c_str(),
@@ -459,15 +488,36 @@
}
PDBSourceLineWriter writer;
- if (!writer.Open(pdb_file_w, PDBSourceLineWriter::PDB_FILE)) {
- fprintf(stderr, "LocateAndConvertSymbolFile: "
- "PDBSourceLineWriter::Open failed for %s %s %s %ws\n",
- missing.debug_file.c_str(),
- missing.debug_identifier.c_str(),
- missing.version.c_str(),
+ wstring pe_file_w;
+ if (!WindowsStringUtils::safe_mbstowcs(pe_file, &pe_file_w)) {
+ fprintf(stderr,
+ "LocateAndConvertSymbolFile: "
+ "WindowsStringUtils::safe_mbstowcs failed for %s\n",
+ pe_file.c_str());
+ return LOCATE_FAILURE;
+ }
+ wstring pdb_file_w;
+ if (!WindowsStringUtils::safe_mbstowcs(pdb_file, &pdb_file_w)) {
+ fprintf(stderr,
+ "LocateAndConvertSymbolFile: "
+ "WindowsStringUtils::safe_mbstowcs failed for %s\n",
pdb_file_w.c_str());
return LOCATE_FAILURE;
}
+ if (!writer.Open(pdb_file_w, PDBSourceLineWriter::PDB_FILE)) {
+ fprintf(stderr,
+ "ERROR: PDBSourceLineWriter::Open failed for %s %s %s %ws\n",
+ missing.debug_file.c_str(), missing.debug_identifier.c_str(),
+ missing.version.c_str(), pdb_file_w.c_str());
+ return LOCATE_FAILURE;
+ }
+ if (!writer.SetCodeFile(pe_file_w)) {
+ fprintf(stderr,
+ "ERROR: PDBSourceLineWriter::SetCodeFile failed for %s %s %s %ws\n",
+ missing.debug_file.c_str(), missing.debug_identifier.c_str(),
+ missing.version.c_str(), pe_file_w.c_str());
+ return LOCATE_FAILURE;
+ }
*converted_symbol_file = pdb_file.substr(0, pdb_file.length() - 4) + ".sym";
@@ -514,6 +564,10 @@
pdb_deleter.Release();
}
+ if (keep_pe_file) {
+ pe_deleter.Release();
+ }
+
sym_deleter.Release();
return LOCATE_SUCCESS;
diff --git a/src/client/windows/build/external_code.gypi b/src/tools/windows/converter/ms_symbol_server_converter.gyp
similarity index 60%
rename from src/client/windows/build/external_code.gypi
rename to src/tools/windows/converter/ms_symbol_server_converter.gyp
index 906cfe0..57ec790 100644
--- a/src/client/windows/build/external_code.gypi
+++ b/src/tools/windows/converter/ms_symbol_server_converter.gyp
@@ -1,5 +1,4 @@
-# Copyright (c) 2010, Google Inc.
-# All rights reserved.
+# Copyright 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
@@ -28,44 +27,20 @@
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
- 'conditions': [
- [ 'OS=="linux"', {
- 'target_defaults': {
- 'cflags!': [
- '-Wall',
- '-Werror',
- ],
- },
- }],
- [ 'OS=="win"', {
- 'target_defaults': {
- 'defines': [
- '_CRT_SECURE_NO_DEPRECATE',
- '_CRT_NONSTDC_NO_WARNINGS',
- '_CRT_NONSTDC_NO_DEPRECATE',
- ],
- 'msvs_disabled_warnings': [4800],
- 'msvs_settings': {
- 'VCCLCompilerTool': {
- 'WarnAsError': 'false',
- 'Detect64BitPortabilityProblems': 'false',
- },
- },
- },
- }],
- [ 'OS=="mac"', {
- 'target_defaults': {
- 'xcode_settings': {
- 'GCC_TREAT_WARNINGS_AS_ERRORS': 'NO',
- 'WARNING_CFLAGS!': ['-Wall'],
- },
- },
- }],
+ 'includes': [
+ '../../../build/common.gypi',
+ ],
+ 'targets': [
+ {
+ 'target_name': 'ms_symbol_server_converter',
+ 'type': 'static_library',
+ 'msvs_guid': '1463C4CD-23FC-4DE9-BFDE-283338200157',
+ 'sources': [
+ 'ms_symbol_server_converter.cc',
+ ],
+ 'dependencies': [
+ '../../../common/windows/common_windows.gyp:common_windows_lib',
+ ],
+ },
],
}
-
-# Local Variables:
-# tab-width:2
-# indent-tabs-mode:nil
-# End:
-# vim: set expandtab tabstop=2 shiftwidth=2:
diff --git a/src/tools/windows/converter/ms_symbol_server_converter.h b/src/tools/windows/converter/ms_symbol_server_converter.h
index fffb7b8..3db84f4 100644
--- a/src/tools/windows/converter/ms_symbol_server_converter.h
+++ b/src/tools/windows/converter/ms_symbol_server_converter.h
@@ -55,16 +55,15 @@
// attempting to load symbols from their server (.reload).
//
// This code has been tested with dbghelp.dll 6.5.3.7 and symsrv.dll 6.5.3.8,
-// included with Microsoft Visual Studio 8 in Common7/IDE. This has also
-// been tested with dbghelp.dll and symsrv.dll 6.6.7.5, included with that
-// version of Debugging Tools for Windows, available at
+// included with Microsoft Visual Studio 8 in Common7/IDE. This has also been
+// tested with dbghelp.dll and symsrv.dll versions 6.6.7.5 and 6.12.2.633,
+// included with the same versions of Debugging Tools for Windows, available at
// http://www.microsoft.com/whdc/devtools/debugging/ .
//
// Author: Mark Mentovai
-
-#ifndef MS_SYMBOL_SERVER_CONVERTER_H__
-#define MS_SYMBOL_SERVER_CONVERTER_H__
+#ifndef TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_
+#define TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_
#include <Windows.h>
@@ -145,6 +144,13 @@
MSSymbolServerConverter(const string &local_cache,
const vector<string> &symbol_servers);
+ // Locates the PE file (DLL or EXE) specified by the identifying information
+ // in |missing|, by checking the symbol stores identified when the object
+ // was created. When returning LOCATE_SUCCESS, pe_file is set to
+ // the pathname of the decompressed PE file as it is stored in the
+ // local cache.
+ LocateResult LocatePEFile(const MissingSymbolInfo &missing, string *pe_file);
+
// Locates the symbol file specified by the identifying information in
// |missing|, by checking the symbol stores identified when the object
// was created. When returning LOCATE_SUCCESS, symbol_file is set to
@@ -159,16 +165,28 @@
// value of LocateSymbolFile, or if LocateSymbolFile succeeds but
// conversion fails, returns LOCATE_FAILURE. The pathname to the
// pdb file and to the converted symbol file are returned in
- // converted_symbol_file and symbol_file. symbol_file is optional and
- // may be NULL. If only the converted symbol file is desired, set
- // keep_symbol_file to false to indicate that the original symbol file
- // (pdb) should be deleted after conversion.
+ // |converted_symbol_file|, |symbol_file|, and |pe_file|. |symbol_file| and
+ // |pe_file| are optional and may be NULL. If only the converted symbol file
+ // is desired, set |keep_symbol_file| and |keep_pe_file| to false to indicate
+ // that the original symbol file (pdb) and executable file (exe, dll) should
+ // be deleted after conversion.
LocateResult LocateAndConvertSymbolFile(const MissingSymbolInfo &missing,
bool keep_symbol_file,
+ bool keep_pe_file,
string *converted_symbol_file,
- string *symbol_file);
+ string *symbol_file,
+ string *pe_file);
private:
+ // Locates the PDB or PE file (DLL or EXE) specified by the identifying
+ // information in |debug_or_code_file| and |debug_or_code_id|, by checking
+ // the symbol stores identified when the object was created. When
+ // returning LOCATE_SUCCESS, file_name is set to the pathname of the
+ // decompressed PDB or PE file file as it is stored in the local cache.
+ LocateResult LocateFile(const string &debug_or_code_file,
+ const string &debug_or_code_id,
+ const string &version, string *file_name);
+
// Called by various SymSrv functions to report status as progress is made
// and to allow the callback to influence processing. Messages sent to this
// callback can be used to distinguish between the various failure modes
@@ -181,7 +199,7 @@
// SymFindFileInPath actually seems to accept NULL for a callback function
// and behave properly for our needs in that case, but the documentation
// doesn't mention it, so this little callback is provided.
- static BOOL CALLBACK SymFindFileInPathCallback(char *filename,
+ static BOOL CALLBACK SymFindFileInPathCallback(const char *filename,
void *context);
// The search path used by SymSrv, built based on the arguments to the
@@ -198,4 +216,4 @@
} // namespace google_breakpad
-#endif // MS_SYMBOL_SERVER_CONVERTER_H__
+#endif // TOOLS_WINDOWS_MS_SYMBOL_SERVER_CONVERTER_H_
diff --git a/src/tools/windows/converter/ms_symbol_server_converter.vcproj b/src/tools/windows/converter/ms_symbol_server_converter.vcproj
index 6a72ec0..ee1263a 100644
--- a/src/tools/windows/converter/ms_symbol_server_converter.vcproj
+++ b/src/tools/windows/converter/ms_symbol_server_converter.vcproj
@@ -1,319 +1,368 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="8.00"
- Name="ms_symbol_server_converter"
- ProjectGUID="{1463C4CD-23FC-4DE9-BFDE-283338200157}"
- >
- <Platforms>
- <Platform
- Name="Win32"
- />
- </Platforms>
- <ToolFiles>
- </ToolFiles>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""$(VSInstallDir)\DIA SDK\include";..\..\.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- AdditionalDependencies="dbghelp.lib diaguids.lib"
- AdditionalLibraryDirectories=""$(VSInstallDir)\DIA SDK\lib""
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(VSInstallDir)\DIA SDK\include";..\..\.."
- PreprocessorDefinitions="WIN32;_CONSOLE;WIN32_LEAN_AND_MEAN"
- RuntimeLibrary="2"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- AdditionalDependencies="dbghelp.lib diaguids.lib"
- AdditionalLibraryDirectories=""$(VSInstallDir)\DIA SDK\lib""
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="DebugStaticCRT|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories=""$(VSInstallDir)\DIA SDK\include";..\..\.."
- PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN"
- MinimalRebuild="true"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="4"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- AdditionalDependencies="dbghelp.lib diaguids.lib"
- AdditionalLibraryDirectories=""$(VSInstallDir)\DIA SDK\lib""
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- <Configuration
- Name="ReleaseStaticCRT|Win32"
- OutputDirectory="$(SolutionDir)$(ConfigurationName)"
- IntermediateDirectory="$(ConfigurationName)"
- ConfigurationType="4"
- >
- <Tool
- Name="VCPreBuildEventTool"
- />
- <Tool
- Name="VCCustomBuildTool"
- />
- <Tool
- Name="VCXMLDataGeneratorTool"
- />
- <Tool
- Name="VCWebServiceProxyGeneratorTool"
- />
- <Tool
- Name="VCMIDLTool"
- />
- <Tool
- Name="VCCLCompilerTool"
- AdditionalIncludeDirectories=""$(VSInstallDir)\DIA SDK\include";..\..\.."
- PreprocessorDefinitions="WIN32;_CONSOLE;WIN32_LEAN_AND_MEAN"
- RuntimeLibrary="0"
- WarningLevel="3"
- Detect64BitPortabilityProblems="true"
- DebugInformationFormat="3"
- />
- <Tool
- Name="VCManagedResourceCompilerTool"
- />
- <Tool
- Name="VCResourceCompilerTool"
- />
- <Tool
- Name="VCPreLinkEventTool"
- />
- <Tool
- Name="VCLibrarianTool"
- AdditionalDependencies="dbghelp.lib diaguids.lib"
- AdditionalLibraryDirectories=""$(VSInstallDir)\DIA SDK\lib""
- />
- <Tool
- Name="VCALinkTool"
- />
- <Tool
- Name="VCXDCMakeTool"
- />
- <Tool
- Name="VCBscMakeTool"
- />
- <Tool
- Name="VCFxCopTool"
- />
- <Tool
- Name="VCPostBuildEventTool"
- />
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
- UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
- >
- <File
- RelativePath="..\..\..\common\windows\guid_string.cc"
- >
- </File>
- <File
- RelativePath=".\ms_symbol_server_converter.cc"
- >
- </File>
- <File
- RelativePath="..\..\..\common\windows\pdb_source_line_writer.cc"
- >
- </File>
- <File
- RelativePath="..\..\..\common\windows\string_utils.cc"
- >
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl;inc;xsd"
- UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
- >
- <File
- RelativePath="..\..\..\common\windows\guid_string.h"
- >
- </File>
- <File
- RelativePath=".\ms_symbol_server_converter.h"
- >
- </File>
- <File
- RelativePath="..\..\..\common\windows\pdb_source_line_writer.h"
- >
- </File>
- <File
- RelativePath="..\..\..\common\windows\string_utils-inl.h"
- >
- </File>
- </Filter>
- <Filter
- Name="Resource Files"
- Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
- UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
- >
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Purify|Win32">
+ <Configuration>Purify</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Purify|x64">
+ <Configuration>Purify</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{1463C4CD-23FC-4DE9-BFDE-283338200157}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>ms_symbol_server_converter</RootNamespace>
+ <IgnoreWarnCompileDuplicatedFilename>true</IgnoreWarnCompileDuplicatedFilename>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>
+ <PropertyGroup Label="Configuration">
+ <CharacterSet>Unicode</CharacterSet>
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>
+ <ImportGroup Label="ExtensionSettings"/>
+ <ImportGroup Label="PropertySheets">
+ <Import Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props"/>
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros"/>
+ <PropertyGroup>
+ <ExecutablePath>$(ExecutablePath);$(MSBuildProjectDirectory)\..\..\..\third_party\cygwin\bin\;$(MSBuildProjectDirectory)\..\..\..\third_party\python_26\</ExecutablePath>
+ <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
+ <IntDir>$(OutDir)obj\$(ProjectName)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Purify|Win32'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Purify|x64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <TargetName>$(ProjectName)</TargetName>
+ <TargetPath>$(OutDir)lib\$(ProjectName)$(TargetExt)</TargetPath>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <ExceptionHandling>false</ExceptionHandling>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <MinimalRebuild>false</MinimalRebuild>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ </ClCompile>
+ <Lib>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <Link>
+ <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
+ <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+ <FixedBaseAddress>false</FixedBaseAddress>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
+ <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Midl>
+ <DllDataFileName>dlldata.c</DllDataFileName>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <HeaderFileName>%(Filename).h</HeaderFileName>
+ <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
+ <OutputDirectory>$(IntDir)</OutputDirectory>
+ <ProxyFileName>%(Filename)_p.c</ProxyFileName>
+ <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <Culture>0x0409</Culture>
+ <PreprocessorDefinitions>_DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
+ <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <ExceptionHandling>false</ExceptionHandling>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <MinimalRebuild>false</MinimalRebuild>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ </ClCompile>
+ <Lib>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <Link>
+ <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
+ <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+ <FixedBaseAddress>false</FixedBaseAddress>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
+ <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <Midl>
+ <DllDataFileName>dlldata.c</DllDataFileName>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <HeaderFileName>%(Filename).h</HeaderFileName>
+ <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
+ <OutputDirectory>$(IntDir)</OutputDirectory>
+ <ProxyFileName>%(Filename)_p.c</ProxyFileName>
+ <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <Culture>0x0409</Culture>
+ <PreprocessorDefinitions>_DEBUG;_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Purify|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <ExceptionHandling>false</ExceptionHandling>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <MinimalRebuild>false</MinimalRebuild>
+ <Optimization>MaxSpeed</Optimization>
+ <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ </ClCompile>
+ <Lib>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <Link>
+ <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
+ <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+ <FixedBaseAddress>false</FixedBaseAddress>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
+ <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Midl>
+ <DllDataFileName>dlldata.c</DllDataFileName>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <HeaderFileName>%(Filename).h</HeaderFileName>
+ <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
+ <OutputDirectory>$(IntDir)</OutputDirectory>
+ <ProxyFileName>%(Filename)_p.c</ProxyFileName>
+ <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <Culture>0x0409</Culture>
+ <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Purify|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <ExceptionHandling>false</ExceptionHandling>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <MinimalRebuild>false</MinimalRebuild>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ </ClCompile>
+ <Lib>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <Link>
+ <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
+ <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+ <EnableCOMDATFolding>false</EnableCOMDATFolding>
+ <FixedBaseAddress>false</FixedBaseAddress>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
+ <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <Midl>
+ <DllDataFileName>dlldata.c</DllDataFileName>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <HeaderFileName>%(Filename).h</HeaderFileName>
+ <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
+ <OutputDirectory>$(IntDir)</OutputDirectory>
+ <ProxyFileName>%(Filename)_p.c</ProxyFileName>
+ <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <Culture>0x0409</Culture>
+ <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;PURIFY;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <ExceptionHandling>false</ExceptionHandling>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <MinimalRebuild>false</MinimalRebuild>
+ <OmitFramePointers>true</OmitFramePointers>
+ <Optimization>MaxSpeed</Optimization>
+ <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <StringPooling>true</StringPooling>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ </ClCompile>
+ <Lib>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <Link>
+ <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/safeseh /dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
+ <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <FixedBaseAddress>false</FixedBaseAddress>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
+ <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
+ <OptimizeReferences>true</OptimizeReferences>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ <Midl>
+ <DllDataFileName>dlldata.c</DllDataFileName>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <HeaderFileName>%(Filename).h</HeaderFileName>
+ <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
+ <OutputDirectory>$(IntDir)</OutputDirectory>
+ <ProxyFileName>%(Filename)_p.c</ProxyFileName>
+ <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <Culture>0x0409</Culture>
+ <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
+ <BufferSecurityCheck>true</BufferSecurityCheck>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ <DisableSpecificWarnings>4100;4127;4396;4503;4512;4819;4995;4702;4800;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ <ExceptionHandling>false</ExceptionHandling>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <MinimalRebuild>false</MinimalRebuild>
+ <Optimization>MaxSpeed</Optimization>
+ <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <RuntimeTypeInfo>false</RuntimeTypeInfo>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <WarningLevel>Level4</WarningLevel>
+ </ClCompile>
+ <Lib>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/ignore:4221 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)lib\$(ProjectName)$(TargetExt)</OutputFile>
+ </Lib>
+ <Link>
+ <AdditionalDependencies>wininet.lib;version.lib;msimg32.lib;ws2_32.lib;usp10.lib;psapi.lib;dbghelp.lib;$(VSInstallDir)\DIA SDK\lib\diaguids.lib;imagehlp.lib</AdditionalDependencies>
+ <AdditionalLibraryDirectories>../../../third_party/platformsdk_win7/files/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalOptions>/dynamicbase /ignore:4199 /ignore:4221 /nxcompat %(AdditionalOptions)</AdditionalOptions>
+ <DelayLoadDLLs>dbghelp.dll;dwmapi.dll;uxtheme.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
+ <FixedBaseAddress>false</FixedBaseAddress>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ImportLibrary>$(OutDir)lib\$(TargetName).lib</ImportLibrary>
+ <MapFileName>$(OutDir)$(TargetName).map</MapFileName>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <Midl>
+ <DllDataFileName>dlldata.c</DllDataFileName>
+ <GenerateStublessProxies>true</GenerateStublessProxies>
+ <HeaderFileName>%(Filename).h</HeaderFileName>
+ <InterfaceIdentifierFileName>%(Filename)_i.c</InterfaceIdentifierFileName>
+ <OutputDirectory>$(IntDir)</OutputDirectory>
+ <ProxyFileName>%(Filename)_p.c</ProxyFileName>
+ <TypeLibraryName>%(Filename).tlb</TypeLibraryName>
+ </Midl>
+ <ResourceCompile>
+ <AdditionalIncludeDirectories>../../..;..\..\..;$(VSInstallDir)\DIA SDK\include;..\..\..\third_party\platformsdk_win7\files\Include;$(VSInstallDir)\VC\atlmfc\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <Culture>0x0409</Culture>
+ <PreprocessorDefinitions>_WIN32_WINNT=0x0600;WINVER=0x0600;WIN32;_WINDOWS;_HAS_EXCEPTIONS=0;NOMINMAX;_CRT_RAND_S;CERT_CHAIN_PARA_HAS_EXTRA_FIELDS;WIN32_LEAN_AND_MEAN;_SECURE_ATL;CHROMIUM_BUILD;TOOLKIT_VIEWS=1;ENABLE_GPU=1;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;NO_TCMALLOC;NDEBUG;NVALGRIND;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ResourceCompile>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <None Include="ms_symbol_server_converter.gyp"/>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="ms_symbol_server_converter.cc"/>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/>
+ <ImportGroup Label="ExtensionTargets"/>
+</Project>
diff --git a/src/tools/windows/dump_syms/dump_syms.gyp b/src/tools/windows/dump_syms/dump_syms.gyp
index d4964b4..b815574 100644
--- a/src/tools/windows/dump_syms/dump_syms.gyp
+++ b/src/tools/windows/dump_syms/dump_syms.gyp
@@ -28,7 +28,7 @@
{
'includes': [
- '../../../client/windows/build/common.gypi',
+ '../../../build/common.gypi',
],
'targets': [
{
@@ -38,7 +38,7 @@
'dump_syms.cc',
],
'dependencies': [
- '<(DEPTH)/common/windows/common_windows.gyp:common_windows_lib',
+ '../../../common/windows/common_windows.gyp:common_windows_lib',
],
},
{
diff --git a/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym b/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym
index fe1662c..72d147e 100644
--- a/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym
+++ b/src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym
@@ -1,5 +1,4 @@
MODULE windows x86 9214611565FA4C538FE724A797B860F71 dump_syms_regtest.pdb
-INFO CODE_ID 517C17D7C000 dump_syms_regtest.exe
FILE 1 c:\src\breakpad\src\src\tools\windows\dump_syms\testdata\dump_syms_regtest.cc
FILE 2 f:\dd\public\sdk\inc\internal\pebteb.h
FILE 3 f:\dd\public\sdk\inc\internal\ntldr.h
@@ -282,7 +281,7 @@
FILE 4643 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\rtc\initsect.cpp
FILE 4664 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcapi.h
FILE 4680 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcpriv.h
-FUNC 1000 54 8 main
+FUNC 1000 54 0 main
1000 6 57 1
1006 8 58 1
100e e 59 1
@@ -299,13 +298,13 @@
1070 21 37 1
FUNC 10a0 14 0 google_breakpad::C::~C()
10a0 14 38 1
-FUNC 10c0 16 8 google_breakpad::C::set_member(int)
+FUNC 10c0 16 0 google_breakpad::C::set_member(int)
10c0 16 40 1
FUNC 10e0 1e 0 google_breakpad::C::f()
10e0 1e 43 1
FUNC 1100 10 0 google_breakpad::C::g()
1100 10 44 1
-FUNC 1110 7 4 google_breakpad::C::h(google_breakpad::C const &)
+FUNC 1110 7 0 google_breakpad::C::h(google_breakpad::C const &)
1110 7 45 1
FUNC 1120 2c 0 google_breakpad::C::`scalar deleting destructor'(unsigned int)
FUNC 114c 10 0 type_info::~type_info()
@@ -313,11 +312,11 @@
114e d 50 4531
115b 1 51 4531
FUNC 115c 21 0 type_info::`scalar deleting destructor'(unsigned int)
-FUNC 117d b 4 operator delete(void *)
+FUNC 117d b 0 operator delete(void *)
117d 5 20 2875
1182 1 24 2875
1183 5 23 2875
-FUNC 1188 29 4 fast_error_exit
+FUNC 1188 29 0 fast_error_exit
1188 5 326 4250
118d 9 335 4250
1196 5 337 4250
@@ -364,7 +363,7 @@
1312 0 179 4250
1312 5 186 4250
1317 5 188 4250
-FUNC 131c 70 4 type_info::_Type_info_dtor(type_info *)
+FUNC 131c 70 0 type_info::_Type_info_dtor(type_info *)
131c c 62 4473
1328 8 63 4473
1330 4 64 4473
@@ -381,7 +380,7 @@
137f 2 83 4473
1381 2 72 4473
1383 9 104 4473
-FUNC 1390 88 8 strcmp
+FUNC 1390 88 0 strcmp
1390 0 65 2791
1390 4 73 2791
1394 4 74 2791
@@ -436,14 +435,14 @@
1411 2 148 2791
1413 3 149 2791
1416 2 150 2791
-FUNC 1418 3a 4 free
+FUNC 1418 3a 0 free
1418 5 40 389
141d 6 45 389
1423 11 50 389
1434 4 51 389
1438 18 53 389
1450 2 55 389
-FUNC 1452 42 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 1452 42 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
1452 5 67 4397
1457 32 68 4397
1489 5 69 4397
@@ -454,7 +453,7 @@
1494 b 89 4397
149f 2 90 4397
14a1 1 91 4397
-FUNC 14a2 2b 4 __crtCorExitProcess
+FUNC 14a2 2b 0 __crtCorExitProcess
14a2 5 675 4186
14a7 b 679 4186
14b2 4 680 4186
@@ -462,7 +461,7 @@
14c2 4 682 4186
14c6 5 683 4186
14cb 2 693 4186
-FUNC 14cd 18 4 __crtExitProcess
+FUNC 14cd 18 0 __crtExitProcess
14cd 5 698 4186
14d2 9 699 4186
14db a 708 4186
@@ -484,7 +483,7 @@
1519 6 816 4186
151f a 817 4186
1529 1 818 4186
-FUNC 152a 24 8 _initterm_e
+FUNC 152a 24 0 _initterm_e
152a 6 908 4186
1530 b 917 4186
153b 6 922 4186
@@ -492,7 +491,7 @@
1543 3 924 4186
1546 6 917 4186
154c 2 928 4186
-FUNC 154e 97 4 _cinit
+FUNC 154e 97 0 _cinit
154e 5 258 4186
1553 18 268 4186
156b a 270 4186
@@ -506,7 +505,7 @@
15d5 c 303 4186
15e1 2 307 4186
15e3 2 308 4186
-FUNC 15e5 140 c doexit
+FUNC 15e5 140 0 doexit
15e5 c 489 4186
15f1 8 507 4186
15f9 4 508 4186
@@ -541,11 +540,11 @@
1710 6 609 4186
1716 9 610 4186
171f 6 622 4186
-FUNC 1725 16 4 exit
+FUNC 1725 16 0 exit
1725 5 392 4186
172a f 393 4186
1739 2 394 4186
-FUNC 173b 16 4 _exit
+FUNC 173b 16 0 _exit
173b 5 400 4186
1740 f 401 4186
174f 2 402 4186
@@ -557,12 +556,12 @@
1760 0 414 4186
1760 e 415 4186
176e 1 416 4186
-FUNC 176f 1e 4 _amsg_exit
+FUNC 176f 1e 0 _amsg_exit
176f 5 439 4186
1774 5 440 4186
1779 9 441 4186
1782 b 442 4186
-FUNC 178d 26 4 _GET_RTERRMSG
+FUNC 178d 26 0 _GET_RTERRMSG
178d 5 165 4012
1792 2 168 4012
1794 c 169 4012
@@ -571,7 +570,7 @@
17a8 2 173 4012
17aa 7 170 4012
17b1 2 173 4012
-FUNC 17b3 1af 4 _NMSG_WRITE
+FUNC 17b3 1af 0 _NMSG_WRITE
17b3 1b 196 4012
17ce 8 197 4012
17d6 11 199 4012
@@ -601,7 +600,7 @@
1984 a 140 4012
198e c 141 4012
199a 1 143 4012
-FUNC 199b 14a 8 _XcptFilter
+FUNC 199b 14a 0 _XcptFilter
199b 6 195 2369
19a1 7 202 2369
19a8 8 203 2369
@@ -676,7 +675,7 @@
1ba8 7 130 3838
1baf 5 131 3838
1bb4 d 133 3838
-FUNC 1bc1 19a c parse_cmdline
+FUNC 1bc1 19a 0 parse_cmdline
1bc1 6 221 3891
1bc7 9 229 3891
1bd0 2 232 3891
@@ -868,7 +867,7 @@
21ae 7 343 3774
21b5 7 344 3774
21bc 5 352 3774
-FUNC 21c1 b4 8 _initptd
+FUNC 21c1 b4 0 _initptd
21c1 c 379 3774
21cd b 381 3774
21d8 a 384 3774
@@ -990,7 +989,7 @@
25cf 1 60 453
FUNC 25d0 45 0 _SEH_prolog4
FUNC 2615 14 0 _SEH_epilog4
-FUNC 2630 18f 10 _except_handler4
+FUNC 2630 18f 0 _except_handler4
FUNC 27bf 9b 0 __security_init_cookie
27bf 8 97 1455
27c7 21 114 1455
@@ -1010,11 +1009,11 @@
2847 6 172 1455
284d b 173 1455
2858 2 175 1455
-FUNC 285a f 4 _initp_misc_invarg
+FUNC 285a f 0 _initp_misc_invarg
285a 5 64 3583
285f 8 65 3583
2867 2 66 3583
-FUNC 2869 129 c _call_reportfault
+FUNC 2869 129 0 _call_reportfault
2869 16 164 3583
287f 9 166 3583
2888 7 167 3583
@@ -1046,12 +1045,12 @@
2970 d 254 3583
297d 7 255 3583
2984 e 257 3583
-FUNC 2992 25 14 _invoke_watson
+FUNC 2992 25 0 _invoke_watson
2992 3 146 3583
2995 12 155 3583
29a7 f 156 3583
29b6 1 157 3583
-FUNC 29b7 2d 14 _invalid_parameter
+FUNC 29b7 2d 0 _invalid_parameter
29b7 5 96 3583
29bc c 103 3583
29c8 4 104 3583
@@ -1085,11 +1084,11 @@
2a84 3 220 3954
2a87 b 214 3954
2a92 3 223 3954
-FUNC 2a95 17 4 _unlock
+FUNC 2a95 17 0 _unlock
2a95 5 370 3954
2a9a 10 374 3954
2aaa 2 375 3954
-FUNC 2aac c2 4 _mtinitlocknum
+FUNC 2aac c2 0 _mtinitlocknum
2aac c 258 3954
2ab8 6 260 3954
2abe a 268 3954
@@ -1116,14 +1115,14 @@
2b5c 3 303 3954
2b5f 6 304 3954
2b65 9 300 3954
-FUNC 2b6e 33 4 _lock
+FUNC 2b6e 33 0 _lock
2b6e 5 332 3954
2b73 10 337 3954
2b83 b 339 3954
2b8e 8 340 3954
2b96 9 347 3954
2b9f 2 348 3954
-FUNC 2ba1 5f c strcpy_s
+FUNC 2ba1 5f 0 strcpy_s
2ba1 5 13 2523
2ba6 23 18 2523
2bc9 b 19 2523
@@ -1133,7 +1132,7 @@
2bec e 30 2523
2bfa 4 33 2523
2bfe 2 34 2523
-FUNC 2c00 8b 4 strlen
+FUNC 2c00 8b 0 strlen
2c00 0 54 2796
2c00 4 63 2796
2c04 6 64 2796
@@ -1179,7 +1178,7 @@
2c84 4 119 2796
2c88 2 120 2796
2c8a 1 121 2796
-FUNC 2c8b 94 4 malloc
+FUNC 2c8b 94 0 malloc
2c8b 6 81 504
2c91 a 85 504
2c9b 3d 89 504
@@ -1201,7 +1200,7 @@
FUNC 2e29 19 0 _EH4_TransferToHandler
FUNC 2e42 19 0 _EH4_GlobalUnwind2
FUNC 2e5b 17 8 _EH4_LocalUnwind
-FUNC 2e72 42 4 _get_errno_from_oserr
+FUNC 2e72 42 0 _get_errno_from_oserr
2e72 5 119 224
2e77 5 123 224
2e7c 9 124 224
@@ -1232,18 +1231,18 @@
2eee 7 106 4591
2ef5 5 114 4591
2efa 6 115 4591
-FUNC 2f00 11 4 _initp_eh_hooks
+FUNC 2f00 11 0 _initp_eh_hooks
2f00 0 69 4591
2f00 10 70 4591
2f10 1 71 4591
-FUNC 2f11 1e 4 _initp_misc_winsig
+FUNC 2f11 1e 0 _initp_misc_winsig
2f11 5 57 2311
2f16 8 58 2311
2f1e 5 59 2311
2f23 5 60 2311
2f28 5 61 2311
2f2d 2 62 2311
-FUNC 2f2f 37 4 siglookup
+FUNC 2f2f 37 0 siglookup
2f2f 5 629 2311
2f34 a 630 2311
2f3e 14 639 2311
@@ -1255,7 +1254,7 @@
2f66 0 669 2311
2f66 c 670 2311
2f72 1 671 2311
-FUNC 2f73 1a3 4 raise
+FUNC 2f73 1a3 0 raise
2f73 c 450 2311
2f7f 5 457 2311
2f84 3 458 2311
@@ -1309,19 +1308,19 @@
3108 6 600 2311
310e 2 603 2311
3110 6 604 2311
-FUNC 3116 f 4 _initp_misc_rand_s
+FUNC 3116 f 0 _initp_misc_rand_s
3116 5 58 2186
311b 8 59 2186
3123 2 60 2186
-FUNC 3125 f 4 _initp_misc_purevirt
+FUNC 3125 f 0 _initp_misc_purevirt
3125 5 179 1627
312a 8 180 1627
3132 2 181 1627
-FUNC 3134 f 4 _initp_heap_handler
+FUNC 3134 f 0 _initp_heap_handler
3134 5 31 2820
3139 8 32 2820
3141 2 33 2820
-FUNC 3143 28 4 _callnewh
+FUNC 3143 28 0 _callnewh
3143 5 131 2820
3148 c 133 2820
3154 e 135 2820
@@ -1329,7 +1328,7 @@
3165 2 139 2820
3167 2 136 2820
3169 2 139 2820
-FUNC 316b b6 4 _onexit_nolock
+FUNC 316b b6 0 _onexit_nolock
316b 8 100 1969
3173 f 103 1969
3182 f 104 1969
@@ -1356,7 +1355,7 @@
324b 3 214 1969
324e 3 216 1969
3251 1 217 1969
-FUNC 3252 3c 4 _onexit
+FUNC 3252 3c 0 _onexit
3252 c 81 1969
325e 5 84 1969
3263 4 86 1969
@@ -1365,7 +1364,7 @@
327f 3 93 1969
3282 6 94 1969
3288 6 90 1969
-FUNC 328e 17 4 atexit
+FUNC 328e 17 0 atexit
328e 5 161 1969
3293 10 162 1969
32a3 2 163 1969
@@ -1374,7 +1373,7 @@
32a9 2 56 2419
32ab 1a 58 2419
32c5 3 60 2419
-FUNC 32d0 35 4 _ValidateImageBase
+FUNC 32d0 35 0 _ValidateImageBase
32d0 5 44 2079
32d5 d 50 2079
32e2 2 52 2079
@@ -1384,7 +1383,7 @@
32f1 2 58 2079
32f3 10 62 2079
3303 2 68 2079
-FUNC 3310 44 8 _FindPESection
+FUNC 3310 44 0 _FindPESection
3310 5 92 2079
3315 8 99 2079
331d 18 108 2079
@@ -1392,7 +1391,7 @@
3345 8 108 2079
334d 5 123 2079
3352 2 124 2079
-FUNC 3360 bc 4 _IsNonwritableInCurrentImage
+FUNC 3360 bc 0 _IsNonwritableInCurrentImage
3360 35 149 2079
3395 7 156 2079
339c f 164 2079
@@ -1406,7 +1405,7 @@
33eb 16 187 2079
3401 9 193 2079
340a 12 195 2079
-FUNC 341c 16c c __crtMessageBoxW
+FUNC 341c 16c 0 __crtMessageBoxW
341c 12 41 1053
342e 14 49 1053
3442 4 56 1053
@@ -1443,7 +1442,7 @@
3567 10 158 1053
3577 2 163 1053
3579 f 166 1053
-FUNC 3588 75 c wcscat_s
+FUNC 3588 75 0 wcscat_s
3588 6 13 2468
358e 22 18 2468
35b0 2 46 2468
@@ -1457,7 +1456,7 @@
35d2 14 35 2468
35e6 9 41 2468
35ef e 42 2468
-FUNC 35fd cd 10 wcsncpy_s
+FUNC 35fd cd 0 wcsncpy_s
35fd 5 13 2578
3602 16 17 2578
3618 5 65 2578
@@ -1479,13 +1478,13 @@
36a9 d 59 2578
36b6 3 61 2578
36b9 11 62 2578
-FUNC 36ca 1b 4 wcslen
+FUNC 36ca 1b 0 wcslen
36ca 5 41 2728
36cf 3 42 2728
36d2 b 44 2728
36dd 6 46 2728
36e3 2 47 2728
-FUNC 36e5 63 c wcscpy_s
+FUNC 36e5 63 0 wcscpy_s
36e5 6 13 2523
36eb 22 18 2523
370d 2 34 2523
@@ -1493,7 +1492,7 @@
371b 16 23 2523
3731 9 29 2523
373a e 30 2523
-FUNC 3748 3f 4 _set_error_mode
+FUNC 3748 3f 0 _set_error_mode
3748 5 43 1181
374d 11 46 1181
375e 5 54 1181
@@ -1509,7 +1508,7 @@
378d 2 56 892
378f 2 57 892
3791 5 59 892
-FUNC 3796 45 4 _malloc_crt
+FUNC 3796 45 0 _malloc_crt
3796 7 39 333
379d 2 40 333
379f b 44 333
@@ -1518,7 +1517,7 @@
37d0 5 47 333
37d5 4 50 333
37d9 2 51 333
-FUNC 37db 4c 8 _calloc_crt
+FUNC 37db 4c 0 _calloc_crt
37db 7 54 333
37e2 2 55 333
37e4 12 61 333
@@ -1527,7 +1526,7 @@
381c 5 64 333
3821 4 67 333
3825 2 68 333
-FUNC 3827 4e 8 _realloc_crt
+FUNC 3827 4e 0 _realloc_crt
3827 7 71 333
382e 2 72 333
3830 f 76 333
@@ -1610,7 +1609,7 @@
3b1b 7 524 3326
3b22 11 527 3326
3b33 9 529 3326
-FUNC 3b3c 87 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 3b3c 87 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
3b3c 5 240 111
3b41 e 241 111
3b4f 8 243 111
@@ -1638,7 +1637,7 @@
3c1c 12 305 3326
3c2e f 308 3326
3c3d 2 309 3326
-FUNC 3c3f 1e9 8 _setmbcp_nolock
+FUNC 3c3f 1e9 0 _setmbcp_nolock
3c3f 17 684 3326
3c56 b 691 3326
3c61 9 694 3326
@@ -1681,7 +1680,7 @@
3e10 6 795 3326
3e16 3 744 3326
3e19 f 800 3326
-FUNC 3e28 19a 4 _setmbcp
+FUNC 3e28 19a 0 _setmbcp
3e28 c 572 3326
3e34 4 573 3326
3e38 a 577 3326
@@ -1735,17 +1734,17 @@
3fd3 a 853 3326
3fdd 2 858 3326
3fdf 1 859 3326
-FUNC 3fe0 53 10 x_ismbbtype_l
+FUNC 3fe0 53 0 x_ismbbtype_l
3fe0 8 213 3271
3fe8 b 214 3271
3ff3 4 219 3271
3ff7 3a 222 3271
4031 2 223 3271
-FUNC 4033 18 4 _ismbblead
+FUNC 4033 18 0 _ismbblead
4033 5 171 3271
4038 11 172 3271
4049 2 173 3271
-FUNC 404b 8f 4 __addlocaleref
+FUNC 404b 8f 0 __addlocaleref
404b 7 36 1913
4052 d 39 1913
405f a 41 1913
@@ -1764,7 +1763,7 @@
40bf 8 53 1913
40c7 11 63 1913
40d8 2 64 1913
-FUNC 40da 99 4 __removelocaleref
+FUNC 40da 99 0 __removelocaleref
40da 6 74 1913
40e0 b 77 1913
40eb b 79 1913
@@ -1785,7 +1784,7 @@
415e 10 103 1913
416e 3 106 1913
4171 2 107 1913
-FUNC 4173 14b 4 __freetlocinfo
+FUNC 4173 14b 0 __freetlocinfo
4173 7 129 1913
417a 25 137 1913
419f e 140 1913
@@ -1812,7 +1811,7 @@
42aa 8 179 1913
42b2 a 201 1913
42bc 2 202 1913
-FUNC 42be 4d 8 _updatetlocinfoEx_nolock
+FUNC 42be 4d 0 _updatetlocinfoEx_nolock
42be 6 216 1913
42c4 e 219 1913
42d2 3 222 1913
@@ -1840,11 +1839,11 @@
436a e 292 1913
4378 8 294 1913
4380 4 295 1913
-FUNC 4384 8 4 _crt_debugger_hook
+FUNC 4384 8 0 _crt_debugger_hook
4384 0 62 1145
4384 7 65 1145
438b 1 66 1145
-FUNC 4390 7a c memset
+FUNC 4390 7a 0 memset
4390 0 59 2789
4390 4 68 2789
4394 4 69 2789
@@ -1970,7 +1969,7 @@
45f8 9 81 1011
4601 11 83 1011
4612 8 92 1011
-FUNC 4620 361 c memcpy
+FUNC 4620 361 0 memcpy
4620 3 101 2787
4623 1 113 2787
4624 1 114 2787
@@ -2206,14 +2205,14 @@
497d 1 593 2787
497e 1 594 2787
497f 2 595 2787
-FUNC 4981 20 4 _freea
+FUNC 4981 20 0 _freea
4981 5 235 281
4986 7 237 281
498d 3 239 281
4990 8 241 281
4998 7 243 281
499f 2 252 281
-FUNC 49a1 33 4 _msize
+FUNC 49a1 33 0 _msize
49a1 5 39 561
49a6 19 43 561
49bf 2 50 561
@@ -2260,7 +2259,7 @@
4ac7 8 315 1392
4acf 12 319 1392
4ae1 2 320 1392
-FUNC 4ae3 82 c _calloc_impl
+FUNC 4ae3 82 0 _calloc_impl
4ae3 5 21 291
4ae8 7 26 291
4aef 19 28 291
@@ -2279,7 +2278,7 @@
4b55 7 52 291
4b5c 7 53 291
4b63 2 69 291
-FUNC 4b65 ad 8 realloc
+FUNC 4b65 ad 0 realloc
4b65 5 62 618
4b6a 6 67 618
4b70 9 68 618
@@ -2302,7 +2301,7 @@
4bf6 2 112 618
4bf8 16 103 618
4c0e 4 105 618
-FUNC 4c12 1e7 24 __crtLCMapStringA_stat
+FUNC 4c12 1e7 0 __crtLCMapStringA_stat
4c12 12 96 3447
4c24 c 101 3447
4c30 17 102 3447
@@ -2334,12 +2333,12 @@
4ddb 8 242 3447
4de3 4 244 3447
4de7 12 245 3447
-FUNC 4df9 46 24 __crtLCMapStringA
+FUNC 4df9 46 0 __crtLCMapStringA
4df9 8 258 3447
4e01 b 259 3447
4e0c 31 271 3447
4e3d 2 272 3447
-FUNC 4e3f e7 20 __crtGetStringTypeA_stat
+FUNC 4e3f e7 0 __crtGetStringTypeA_stat
4e3f 12 63 3507
4e51 7 67 3507
4e58 5 83 3507
@@ -2355,12 +2354,12 @@
4f0a 6 118 3507
4f10 4 120 3507
4f14 12 121 3507
-FUNC 4f26 40 20 __crtGetStringTypeA
+FUNC 4f26 40 0 __crtGetStringTypeA
4f26 8 133 3507
4f2e b 134 3507
4f39 2b 145 3507
4f64 2 146 3507
-FUNC 4f66 377 4 __free_lc_time
+FUNC 4f66 377 0 __free_lc_time
4f66 6 228 1800
4f6c b 229 1800
4f77 8 232 1800
@@ -2450,7 +2449,7 @@
52c1 b 328 1800
52cc f 329 1800
52db 2 332 1800
-FUNC 52dd 69 4 __free_lconv_num
+FUNC 52dd 69 0 __free_lconv_num
52dd 6 218 1742
52e3 7 219 1742
52ea a 222 1742
@@ -2464,7 +2463,7 @@
5331 b 234 1742
533c 8 235 1742
5344 2 236 1742
-FUNC 5346 fe 4 __free_lconv_mon
+FUNC 5346 fe 0 __free_lconv_mon
5346 6 270 1685
534c b 271 1685
5357 b 274 1685
@@ -2494,13 +2493,13 @@
542f b 310 1685
543a 8 311 1685
5442 2 312 1685
-FUNC 5444 ba c _VEC_memzero
+FUNC 5444 ba 0 _VEC_memzero
FUNC 54fe 10 0 __sse2_available_init
54fe 0 30 4315
54fe d 31 4315
550b 2 32 4315
550d 1 33 4315
-FUNC 550e 103 c _VEC_memcpy
+FUNC 550e 103 0 _VEC_memcpy
FUNC 5620 2c 0 _alloca_probe_16
5620 0 44 4274
5620 1 46 4274
@@ -2564,7 +2563,7 @@
56b2 5 98 4276
56b7 2 99 4276
56b9 2 100 4276
-FUNC 56c0 46 8 strcspn
+FUNC 56c0 46 0 strcspn
56c0 4 191 2794
56c4 2 198 2794
56c6 1 199 2794
@@ -2594,7 +2593,7 @@
56fe 2 255 2794
5700 3 257 2794
5703 3 259 2794
-FUNC 5710 40 8 strpbrk
+FUNC 5710 40 0 strpbrk
5710 4 191 2794
5714 2 198 2794
5716 1 199 2794
@@ -2622,7 +2621,7 @@
5747 3 248 2794
574a 3 257 2794
574d 3 259 2794
-FUNC 5750 61 c __ascii_strnicmp
+FUNC 5750 61 0 __ascii_strnicmp
5750 6 69 2798
5756 3 75 2798
5759 2 76 2798
@@ -2662,6 +2661,7 @@
57a8 2 135 2798
57aa 2 138 2798
57ac 5 140 2798
+PUBLIC 57b2 10 RtlUnwind
STACK WIN 4 1000 54 6 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 1060 a 3 0 0 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 1070 21 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
diff --git a/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym b/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym
index b690275..6f5cd1b 100644
--- a/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym
+++ b/src/tools/windows/dump_syms/testdata/dump_syms_regtest64.sym
@@ -1,5 +1,5 @@
-MODULE windows x86_64 72E103A85CB249078B76B2E7C06257B11 dump_syms_regtest64.pdb
-INFO CODE_ID 532B4F161A000 dump_syms_regtest64.exe
+MODULE windows x86_64 72E103A85CB249078B76B2E7C06257B13 dump_syms_regtest64.pdb
+INFO CODE_ID 5357F5C01A000 dump_syms_regtest64.exe
FILE 1 d:\src\breakpad\src\tools\windows\dump_syms\testdata\dump_syms_regtest64.cc
FILE 2 f:\dd\vctools\crt\crtw32\misc\amd64\amdsecgs.asm
FILE 3 f:\dd\ExternalAPIs\Windows\WinBlue\sdk\inc\ksamd64.inc
@@ -4095,6 +4095,8 @@
b93d 15 124 9988
b952 15 130 9988
b967 15 136 9988
+PUBLIC b97c 0 RtlUnwindEx
+PUBLIC b982 0 IsProcessorFeaturePresent
FUNC b990 1e 0 __tmainCRTStartup$filt$0
b990 1e 267 9116
FUNC b9ae 19 0 `type_info::_Type_info_dtor'::`1'::fin$0
diff --git a/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym b/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym
index 3585bb7..716bf33 100644
--- a/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym
+++ b/src/tools/windows/dump_syms/testdata/omap_reorder_bbs.sym
@@ -282,7 +282,7 @@
FILE 4643 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\rtc\initsect.cpp
FILE 4664 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcapi.h
FILE 4680 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcpriv.h
-FUNC 2cec 54 8 main
+FUNC 2cec 54 0 main
2cec 6 57 1
2cf2 8 58 1
2cfa e 59 1
@@ -299,13 +299,13 @@
25a8 21 37 1
FUNC 131c 14 0 google_breakpad::C::~C()
131c 14 38 1
-FUNC 1b94 16 8 google_breakpad::C::set_member(int)
+FUNC 1b94 16 0 google_breakpad::C::set_member(int)
1b94 16 40 1
FUNC 11e8 1e 0 google_breakpad::C::f()
11e8 1e 43 1
FUNC 1b3c 10 0 google_breakpad::C::g()
1b3c 10 44 1
-FUNC 669c 7 4 google_breakpad::C::h(google_breakpad::C const &)
+FUNC 669c 7 0 google_breakpad::C::h(google_breakpad::C const &)
669c 7 45 1
FUNC 16d4 20 0 google_breakpad::C::`scalar deleting destructor'(unsigned int)
FUNC 211c c 0 google_breakpad::C::`scalar deleting destructor'(unsigned int)
@@ -317,14 +317,14 @@
FUNC 1fd4 1c 0 type_info::`scalar deleting destructor'(unsigned int)
FUNC 46d8 7 0 type_info::`scalar deleting destructor'(unsigned int)
FUNC 65a8 7 0 type_info::`scalar deleting destructor'(unsigned int)
-FUNC 12a0 b 4 operator delete(void *)
+FUNC 12a0 b 0 operator delete(void *)
12a0 5 20 2875
12a5 1 24 2875
12a6 5 23 2875
-FUNC 198c 4 4 fast_error_exit
-FUNC 1ff0 18 4 fast_error_exit
-FUNC 455c 12 4 fast_error_exit
-FUNC 4d0c 5 4 fast_error_exit
+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
1ff0 5 326 4250
1ff5 13 335 4250
4d0c 5 337 4250
@@ -372,7 +372,7 @@
620c 0 179 4250
620c 5 186 4250
6211 5 188 4250
-FUNC 66c3 70 4 type_info::_Type_info_dtor(type_info *)
+FUNC 66c3 70 0 type_info::_Type_info_dtor(type_info *)
66c3 c 62 4473
66cf 8 63 4473
66d7 4 64 4473
@@ -389,7 +389,7 @@
6726 2 83 4473
6728 2 72 4473
672a 9 104 4473
-FUNC 27ab 88 8 strcmp
+FUNC 27ab 88 0 strcmp
27ab 0 65 2791
27ab 4 73 2791
27af 4 74 2791
@@ -444,24 +444,24 @@
282c 2 148 2791
282e 3 149 2791
2831 2 150 2791
-FUNC 26fc 14 4 free
-FUNC 2bcc 2 4 free
-FUNC 3888 18 4 free
-FUNC 3ea0 1f 4 free
+FUNC 26fc 14 0 free
+FUNC 2bcc 2 0 free
+FUNC 3888 18 0 free
+FUNC 3ea0 1f 0 free
26fc 5 40 389
2701 f 45 389
3ea0 11 50 389
3eb1 e 51 389
3888 18 53 389
2bcc 2 55 389
-FUNC 199c 10 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
-FUNC 2380 6 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
-FUNC 3ce8 10 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
-FUNC 4448 14 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
-FUNC 4778 1c 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
-FUNC 57d0 10 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
-FUNC 5a40 5 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
-FUNC 642c 10 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 199c 10 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 2380 6 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 3ce8 10 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 4448 14 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 4778 1c 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 57d0 10 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 5a40 5 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 642c 10 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
4778 5 67 4397
199c 10 68 4397
3ce8 10 68 4397
@@ -477,10 +477,10 @@
5a28 b 89 4397
5a33 2 90 4397
5a35 1 91 4397
-FUNC 1db0 5 4 __crtCorExitProcess
-FUNC 21a0 1e 4 __crtCorExitProcess
-FUNC 24cc 1a 4 __crtCorExitProcess
-FUNC 4c14 2 4 __crtCorExitProcess
+FUNC 1db0 5 0 __crtCorExitProcess
+FUNC 21a0 1e 0 __crtCorExitProcess
+FUNC 24cc 1a 0 __crtCorExitProcess
+FUNC 4c14 2 0 __crtCorExitProcess
21a0 5 675 4186
21a5 b 679 4186
21b0 e 680 4186
@@ -488,7 +488,7 @@
24d8 e 682 4186
1db0 5 683 4186
4c14 2 693 4186
-FUNC 6a9b 18 4 __crtExitProcess
+FUNC 6a9b 18 0 __crtExitProcess
6a9b 5 698 4186
6aa0 9 699 4186
6aa9 a 708 4186
@@ -510,13 +510,13 @@
45b6 6 816 4186
45bc a 817 4186
45c6 1 818 4186
-FUNC 1bc8 3 8 _initterm_e
-FUNC 1de4 e 8 _initterm_e
-FUNC 22bc 2 8 _initterm_e
-FUNC 2944 10 8 _initterm_e
-FUNC 3dd4 3 8 _initterm_e
-FUNC 3e80 f 8 _initterm_e
-FUNC 6568 10 8 _initterm_e
+FUNC 1bc8 3 0 _initterm_e
+FUNC 1de4 e 0 _initterm_e
+FUNC 22bc 2 0 _initterm_e
+FUNC 2944 10 0 _initterm_e
+FUNC 3dd4 3 0 _initterm_e
+FUNC 3e80 f 0 _initterm_e
+FUNC 6568 10 0 _initterm_e
2944 6 908 4186
1de4 e 917 4186
294a a 917 4186
@@ -526,19 +526,19 @@
1bc8 1 917 4186
3e80 f 917 4186
1bc9 2 928 4186
-FUNC 1d44 c 4 _cinit
-FUNC 2470 10 4 _cinit
-FUNC 2558 27 4 _cinit
-FUNC 2660 14 4 _cinit
-FUNC 269c 18 4 _cinit
-FUNC 27a4 2 4 _cinit
-FUNC 34ec 24 4 _cinit
-FUNC 48dc 10 4 _cinit
-FUNC 4bf8 2 4 _cinit
-FUNC 4dd4 18 4 _cinit
-FUNC 5b74 a 4 _cinit
-FUNC 69e4 18 4 _cinit
-FUNC 6f60 2 4 _cinit
+FUNC 1d44 c 0 _cinit
+FUNC 2470 10 0 _cinit
+FUNC 2558 27 0 _cinit
+FUNC 2660 14 0 _cinit
+FUNC 269c 18 0 _cinit
+FUNC 27a4 2 0 _cinit
+FUNC 34ec 24 0 _cinit
+FUNC 48dc 10 0 _cinit
+FUNC 4bf8 2 0 _cinit
+FUNC 4dd4 18 0 _cinit
+FUNC 5b74 a 0 _cinit
+FUNC 69e4 18 0 _cinit
+FUNC 6f60 2 0 _cinit
69e4 5 258 4186
4dd4 18 268 4186
69e9 13 268 4186
@@ -557,7 +557,7 @@
1d44 c 303 4186
4bf8 2 307 4186
6f60 2 308 4186
-FUNC 35a7 140 c doexit
+FUNC 35a7 140 0 doexit
35a7 c 489 4186
35b3 8 507 4186
35bb 4 508 4186
@@ -592,11 +592,11 @@
36d2 6 609 4186
36d8 9 610 4186
36e1 6 622 4186
-FUNC 6d68 16 4 exit
+FUNC 6d68 16 0 exit
6d68 5 392 4186
6d6d f 393 4186
6d7c 2 394 4186
-FUNC 5464 16 4 _exit
+FUNC 5464 16 0 _exit
5464 5 400 4186
5469 f 401 4186
5478 2 402 4186
@@ -608,16 +608,16 @@
5544 0 414 4186
5544 e 415 4186
5552 1 416 4186
-FUNC 3218 1e 4 _amsg_exit
+FUNC 3218 1e 0 _amsg_exit
3218 5 439 4186
321d 5 440 4186
3222 9 441 4186
322b b 442 4186
-FUNC 1b78 4 4 _GET_RTERRMSG
-FUNC 2888 9 4 _GET_RTERRMSG
-FUNC 44d0 16 4 _GET_RTERRMSG
-FUNC 4858 10 4 _GET_RTERRMSG
-FUNC 6410 7 4 _GET_RTERRMSG
+FUNC 1b78 4 0 _GET_RTERRMSG
+FUNC 2888 9 0 _GET_RTERRMSG
+FUNC 44d0 16 0 _GET_RTERRMSG
+FUNC 4858 10 0 _GET_RTERRMSG
+FUNC 6410 7 0 _GET_RTERRMSG
6410 5 165 4012
6415 2 168 4012
44d0 16 169 4012
@@ -626,29 +626,29 @@
1b7a 2 173 4012
2888 7 170 4012
288f 2 173 4012
-FUNC 11c4 12 4 _NMSG_WRITE
-FUNC 2028 16 4 _NMSG_WRITE
-FUNC 20c0 12 4 _NMSG_WRITE
-FUNC 2460 f 4 _NMSG_WRITE
-FUNC 2648 f 4 _NMSG_WRITE
-FUNC 26c4 1a 4 _NMSG_WRITE
-FUNC 349c 27 4 _NMSG_WRITE
-FUNC 43a4 1e 4 _NMSG_WRITE
-FUNC 4428 a 4 _NMSG_WRITE
-FUNC 47c0 2b 4 _NMSG_WRITE
-FUNC 49a4 18 4 _NMSG_WRITE
-FUNC 4a64 1c 4 _NMSG_WRITE
-FUNC 4d50 17 4 _NMSG_WRITE
-FUNC 4e7c 39 4 _NMSG_WRITE
-FUNC 4f5c 2 4 _NMSG_WRITE
-FUNC 5810 25 4 _NMSG_WRITE
-FUNC 59cc 16 4 _NMSG_WRITE
-FUNC 5d18 34 4 _NMSG_WRITE
-FUNC 64e8 5 4 _NMSG_WRITE
-FUNC 6648 7 4 _NMSG_WRITE
-FUNC 6678 22 4 _NMSG_WRITE
-FUNC 6894 11 4 _NMSG_WRITE
-FUNC 70ac 18 4 _NMSG_WRITE
+FUNC 11c4 12 0 _NMSG_WRITE
+FUNC 2028 16 0 _NMSG_WRITE
+FUNC 20c0 12 0 _NMSG_WRITE
+FUNC 2460 f 0 _NMSG_WRITE
+FUNC 2648 f 0 _NMSG_WRITE
+FUNC 26c4 1a 0 _NMSG_WRITE
+FUNC 349c 27 0 _NMSG_WRITE
+FUNC 43a4 1e 0 _NMSG_WRITE
+FUNC 4428 a 0 _NMSG_WRITE
+FUNC 47c0 2b 0 _NMSG_WRITE
+FUNC 49a4 18 0 _NMSG_WRITE
+FUNC 4a64 1c 0 _NMSG_WRITE
+FUNC 4d50 17 0 _NMSG_WRITE
+FUNC 4e7c 39 0 _NMSG_WRITE
+FUNC 4f5c 2 0 _NMSG_WRITE
+FUNC 5810 25 0 _NMSG_WRITE
+FUNC 59cc 16 0 _NMSG_WRITE
+FUNC 5d18 34 0 _NMSG_WRITE
+FUNC 64e8 5 0 _NMSG_WRITE
+FUNC 6648 7 0 _NMSG_WRITE
+FUNC 6678 22 0 _NMSG_WRITE
+FUNC 6894 11 0 _NMSG_WRITE
+FUNC 70ac 18 0 _NMSG_WRITE
4e7c 1b 196 4012
4e97 8 197 4012
4e9f 16 199 4012
@@ -689,45 +689,45 @@
4ab4 a 140 4012
4abe c 141 4012
1984 1 143 4012
-FUNC 1490 10 8 _XcptFilter
-FUNC 1540 3 8 _XcptFilter
-FUNC 1720 14 8 _XcptFilter
-FUNC 174c 1b 8 _XcptFilter
-FUNC 19d8 2 8 _XcptFilter
-FUNC 2054 3 8 _XcptFilter
-FUNC 2218 9 8 _XcptFilter
-FUNC 2440 c 8 _XcptFilter
-FUNC 2870 e 8 _XcptFilter
-FUNC 2928 c 8 _XcptFilter
-FUNC 2ae8 11 8 _XcptFilter
-FUNC 2d78 10 8 _XcptFilter
-FUNC 356c f 8 _XcptFilter
-FUNC 38a8 10 8 _XcptFilter
-FUNC 3ed0 10 8 _XcptFilter
-FUNC 3fa4 10 8 _XcptFilter
-FUNC 44e8 7 8 _XcptFilter
-FUNC 4810 17 8 _XcptFilter
-FUNC 4cc8 c 8 _XcptFilter
-FUNC 4f50 7 8 _XcptFilter
-FUNC 5564 e 8 _XcptFilter
-FUNC 56d4 10 8 _XcptFilter
-FUNC 57a4 e 8 _XcptFilter
-FUNC 59f8 16 8 _XcptFilter
-FUNC 5bbc e 8 _XcptFilter
-FUNC 5ca4 10 8 _XcptFilter
-FUNC 5d60 c 8 _XcptFilter
-FUNC 5e38 18 8 _XcptFilter
-FUNC 5e60 10 8 _XcptFilter
-FUNC 6090 c 8 _XcptFilter
-FUNC 61f0 7 8 _XcptFilter
-FUNC 6228 c 8 _XcptFilter
-FUNC 648c c 8 _XcptFilter
-FUNC 64dc 5 8 _XcptFilter
-FUNC 650c 1a 8 _XcptFilter
-FUNC 66a4 c 8 _XcptFilter
-FUNC 68e4 10 8 _XcptFilter
-FUNC 6ee8 3 8 _XcptFilter
-FUNC 6f98 c 8 _XcptFilter
+FUNC 1490 10 0 _XcptFilter
+FUNC 1540 3 0 _XcptFilter
+FUNC 1720 14 0 _XcptFilter
+FUNC 174c 1b 0 _XcptFilter
+FUNC 19d8 2 0 _XcptFilter
+FUNC 2054 3 0 _XcptFilter
+FUNC 2218 9 0 _XcptFilter
+FUNC 2440 c 0 _XcptFilter
+FUNC 2870 e 0 _XcptFilter
+FUNC 2928 c 0 _XcptFilter
+FUNC 2ae8 11 0 _XcptFilter
+FUNC 2d78 10 0 _XcptFilter
+FUNC 356c f 0 _XcptFilter
+FUNC 38a8 10 0 _XcptFilter
+FUNC 3ed0 10 0 _XcptFilter
+FUNC 3fa4 10 0 _XcptFilter
+FUNC 44e8 7 0 _XcptFilter
+FUNC 4810 17 0 _XcptFilter
+FUNC 4cc8 c 0 _XcptFilter
+FUNC 4f50 7 0 _XcptFilter
+FUNC 5564 e 0 _XcptFilter
+FUNC 56d4 10 0 _XcptFilter
+FUNC 57a4 e 0 _XcptFilter
+FUNC 59f8 16 0 _XcptFilter
+FUNC 5bbc e 0 _XcptFilter
+FUNC 5ca4 10 0 _XcptFilter
+FUNC 5d60 c 0 _XcptFilter
+FUNC 5e38 18 0 _XcptFilter
+FUNC 5e60 10 0 _XcptFilter
+FUNC 6090 c 0 _XcptFilter
+FUNC 61f0 7 0 _XcptFilter
+FUNC 6228 c 0 _XcptFilter
+FUNC 648c c 0 _XcptFilter
+FUNC 64dc 5 0 _XcptFilter
+FUNC 650c 1a 0 _XcptFilter
+FUNC 66a4 c 0 _XcptFilter
+FUNC 68e4 10 0 _XcptFilter
+FUNC 6ee8 3 0 _XcptFilter
+FUNC 6f98 c 0 _XcptFilter
650c 6 195 2369
6512 7 202 2369
6519 d 203 2369
@@ -810,61 +810,61 @@
41fc 7 130 3838
4203 5 131 3838
4208 d 133 3838
-FUNC 1018 8 c parse_cmdline
-FUNC 19b4 e c parse_cmdline
-FUNC 19f4 2 c parse_cmdline
-FUNC 1dd0 14 c parse_cmdline
-FUNC 1fac 28 c parse_cmdline
-FUNC 2058 f c parse_cmdline
-FUNC 209c 9 c parse_cmdline
-FUNC 2364 1a c parse_cmdline
-FUNC 253c 4 c parse_cmdline
-FUNC 2598 9 c parse_cmdline
-FUNC 25cc 10 c parse_cmdline
-FUNC 2718 b c parse_cmdline
-FUNC 2730 e c parse_cmdline
-FUNC 28a8 a c parse_cmdline
-FUNC 28fc 2 c parse_cmdline
-FUNC 290c 14 c parse_cmdline
-FUNC 2b34 f c parse_cmdline
-FUNC 2bfc 10 c parse_cmdline
-FUNC 2d88 7 c parse_cmdline
-FUNC 3730 d c parse_cmdline
-FUNC 377c 2 c parse_cmdline
-FUNC 37b0 10 c parse_cmdline
-FUNC 3c38 24 c parse_cmdline
-FUNC 3c84 10 c parse_cmdline
-FUNC 3db8 1b c parse_cmdline
-FUNC 3e90 e c parse_cmdline
-FUNC 3efc 13 c parse_cmdline
-FUNC 4110 12 c parse_cmdline
-FUNC 42dc f c parse_cmdline
-FUNC 42f0 10 c parse_cmdline
-FUNC 4518 6 c parse_cmdline
-FUNC 4610 7 c parse_cmdline
-FUNC 4684 11 c parse_cmdline
-FUNC 46f8 13 c parse_cmdline
-FUNC 4848 a c parse_cmdline
-FUNC 4994 f c parse_cmdline
-FUNC 49bc e c parse_cmdline
-FUNC 4aac 1 c parse_cmdline
-FUNC 4cb8 f c parse_cmdline
-FUNC 4ed8 24 c parse_cmdline
-FUNC 4f10 3 c parse_cmdline
-FUNC 4f30 e c parse_cmdline
-FUNC 501c 10 c parse_cmdline
-FUNC 5518 3 c parse_cmdline
-FUNC 569c 3 c parse_cmdline
-FUNC 57bc 12 c parse_cmdline
-FUNC 5a50 10 c parse_cmdline
-FUNC 5cc0 14 c parse_cmdline
-FUNC 5e84 f c parse_cmdline
-FUNC 6448 f c parse_cmdline
-FUNC 6530 e c parse_cmdline
-FUNC 66b0 13 c parse_cmdline
-FUNC 6970 4 c parse_cmdline
-FUNC 6aec 7 c parse_cmdline
-FUNC 6f30 e c parse_cmdline
+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
1fac 6 221 3891
1fb2 9 229 3891
1fbb 2 232 3891
@@ -1173,7 +1173,7 @@
5e0c 7 343 3774
5e13 7 344 3774
5b84 5 352 3774
-FUNC 10ca b4 8 _initptd
+FUNC 10ca b4 0 _initptd
10ca c 379 3774
10d6 b 381 3774
10e1 a 384 3774
@@ -1326,32 +1326,32 @@
4749 1 60 453
FUNC 503b 45 0 _SEH_prolog4
FUNC 5080 14 0 _SEH_epilog4
-FUNC 10b0 1a 10 _except_handler4
-FUNC 1180 c 10 _except_handler4
-FUNC 1528 17 10 _except_handler4
-FUNC 1734 10 10 _except_handler4
-FUNC 1768 2c 10 _except_handler4
-FUNC 210c 10 10 _except_handler4
-FUNC 267c 13 10 _except_handler4
-FUNC 2bd0 20 10 _except_handler4
-FUNC 3270 a 10 _except_handler4
-FUNC 3754 13 10 _except_handler4
-FUNC 3b48 36 10 _except_handler4
-FUNC 3d54 3 10 _except_handler4
-FUNC 3f88 c 10 _except_handler4
-FUNC 42b4 d 10 _except_handler4
-FUNC 4f40 10 10 _except_handler4
-FUNC 5a60 1c 10 _except_handler4
-FUNC 5a84 22 10 _except_handler4
-FUNC 5d88 d 10 _except_handler4
-FUNC 5e70 f 10 _except_handler4
-FUNC 5f50 12 10 _except_handler4
-FUNC 5fcc 12 10 _except_handler4
-FUNC 61bc 1d 10 _except_handler4
-FUNC 6670 3 10 _except_handler4
-FUNC 6a80 14 10 _except_handler4
-FUNC 6b0c 20 10 _except_handler4
-FUNC 6cd8 10 10 _except_handler4
+FUNC 10b0 1a 0 _except_handler4
+FUNC 1180 c 0 _except_handler4
+FUNC 1528 17 0 _except_handler4
+FUNC 1734 10 0 _except_handler4
+FUNC 1768 2c 0 _except_handler4
+FUNC 210c 10 0 _except_handler4
+FUNC 267c 13 0 _except_handler4
+FUNC 2bd0 20 0 _except_handler4
+FUNC 3270 a 0 _except_handler4
+FUNC 3754 13 0 _except_handler4
+FUNC 3b48 36 0 _except_handler4
+FUNC 3d54 3 0 _except_handler4
+FUNC 3f88 c 0 _except_handler4
+FUNC 42b4 d 0 _except_handler4
+FUNC 4f40 10 0 _except_handler4
+FUNC 5a60 1c 0 _except_handler4
+FUNC 5a84 22 0 _except_handler4
+FUNC 5d88 d 0 _except_handler4
+FUNC 5e70 f 0 _except_handler4
+FUNC 5f50 12 0 _except_handler4
+FUNC 5fcc 12 0 _except_handler4
+FUNC 61bc 1d 0 _except_handler4
+FUNC 6670 3 0 _except_handler4
+FUNC 6a80 14 0 _except_handler4
+FUNC 6b0c 20 0 _except_handler4
+FUNC 6cd8 10 0 _except_handler4
FUNC 2244 2f 0 __security_init_cookie
FUNC 2740 48 0 __security_init_cookie
FUNC 33e4 d 0 __security_init_cookie
@@ -1382,11 +1382,11 @@
4396 9 173 1455
61a4 2 173 1455
61a6 2 175 1455
-FUNC 4570 f 4 _initp_misc_invarg
+FUNC 4570 f 0 _initp_misc_invarg
4570 5 64 3583
4575 8 65 3583
457d 2 66 3583
-FUNC 3a1f 129 c _call_reportfault
+FUNC 3a1f 129 0 _call_reportfault
3a1f 16 164 3583
3a35 9 166 3583
3a3e 7 167 3583
@@ -1418,12 +1418,12 @@
3b26 d 254 3583
3b33 7 255 3583
3b3a e 257 3583
-FUNC 5c38 25 14 _invoke_watson
+FUNC 5c38 25 0 _invoke_watson
5c38 3 146 3583
5c3b 12 155 3583
5c4d f 156 3583
5c5c 1 157 3583
-FUNC 6922 2d 14 _invalid_parameter
+FUNC 6922 2d 0 _invalid_parameter
6922 5 96 3583
6927 c 103 3583
6933 4 104 3583
@@ -1475,11 +1475,11 @@
4350 3 220 3954
46e4 14 214 3954
5ec4 3 223 3954
-FUNC 4218 17 4 _unlock
+FUNC 4218 17 0 _unlock
4218 5 370 3954
421d 10 374 3954
422d 2 375 3954
-FUNC 3ff7 c2 4 _mtinitlocknum
+FUNC 3ff7 c2 0 _mtinitlocknum
3ff7 c 258 3954
4003 6 260 3954
4009 a 268 3954
@@ -1506,11 +1506,11 @@
40a7 3 303 3954
40aa 6 304 3954
40b0 9 300 3954
-FUNC 118c b 4 _lock
-FUNC 1af0 14 4 _lock
-FUNC 3718 7 4 _lock
-FUNC 44a0 1f 4 _lock
-FUNC 5bb4 1 4 _lock
+FUNC 118c b 0 _lock
+FUNC 1af0 14 0 _lock
+FUNC 3718 7 0 _lock
+FUNC 44a0 1f 0 _lock
+FUNC 5bb4 1 0 _lock
44a0 5 332 3954
44a5 1a 337 3954
1af0 14 339 3954
@@ -1518,19 +1518,19 @@
5bb4 1 340 3954
118c 9 347 3954
1195 2 348 3954
-FUNC 14ac 10 c strcpy_s
-FUNC 1990 c c strcpy_s
-FUNC 1da4 c c strcpy_s
-FUNC 2580 18 c strcpy_s
-FUNC 2e00 4 c strcpy_s
-FUNC 4674 10 c strcpy_s
-FUNC 470c 4 c strcpy_s
-FUNC 4794 2 c strcpy_s
-FUNC 4d40 e c strcpy_s
-FUNC 59b8 14 c strcpy_s
-FUNC 6158 14 c strcpy_s
-FUNC 6a94 7 c strcpy_s
-FUNC 6c8c a c strcpy_s
+FUNC 14ac 10 0 strcpy_s
+FUNC 1990 c 0 strcpy_s
+FUNC 1da4 c 0 strcpy_s
+FUNC 2580 18 0 strcpy_s
+FUNC 2e00 4 0 strcpy_s
+FUNC 4674 10 0 strcpy_s
+FUNC 470c 4 0 strcpy_s
+FUNC 4794 2 0 strcpy_s
+FUNC 4d40 e 0 strcpy_s
+FUNC 59b8 14 0 strcpy_s
+FUNC 6158 14 0 strcpy_s
+FUNC 6a94 7 0 strcpy_s
+FUNC 6c8c a 0 strcpy_s
2580 5 13 2523
1da4 c 18 2523
2585 13 18 2523
@@ -1547,7 +1547,7 @@
470c 2 33 2523
4794 2 33 2523
470e 2 34 2523
-FUNC 37f0 8b 4 strlen
+FUNC 37f0 8b 0 strlen
37f0 0 54 2796
37f0 4 63 2796
37f4 6 64 2796
@@ -1593,23 +1593,23 @@
3874 4 119 2796
3878 2 120 2796
387a 1 121 2796
-FUNC 14a0 7 4 malloc
-FUNC 22f4 3 4 malloc
-FUNC 2838 e 4 malloc
-FUNC 28e4 7 4 malloc
-FUNC 2da4 a 4 malloc
-FUNC 34d0 8 4 malloc
-FUNC 3d5c 16 4 malloc
-FUNC 4580 13 4 malloc
-FUNC 4a4c 3 4 malloc
-FUNC 4cf8 14 4 malloc
-FUNC 4eb8 1f 4 malloc
-FUNC 5a48 6 4 malloc
-FUNC 5b20 18 4 malloc
-FUNC 5b8c 14 4 malloc
-FUNC 5df8 14 4 malloc
-FUNC 60ec 2 4 malloc
-FUNC 65a0 2 4 malloc
+FUNC 14a0 7 0 malloc
+FUNC 22f4 3 0 malloc
+FUNC 2838 e 0 malloc
+FUNC 28e4 7 0 malloc
+FUNC 2da4 a 0 malloc
+FUNC 34d0 8 0 malloc
+FUNC 3d5c 16 0 malloc
+FUNC 4580 13 0 malloc
+FUNC 4a4c 3 0 malloc
+FUNC 4cf8 14 0 malloc
+FUNC 4eb8 1f 0 malloc
+FUNC 5a48 6 0 malloc
+FUNC 5b20 18 0 malloc
+FUNC 5b8c 14 0 malloc
+FUNC 5df8 14 0 malloc
+FUNC 60ec 2 0 malloc
+FUNC 65a0 2 0 malloc
5b20 6 81 504
5b26 12 85 504
60ec 2 85 504
@@ -1639,12 +1639,12 @@
FUNC 2a85 19 0 _EH4_TransferToHandler
FUNC 2a9e 19 0 _EH4_GlobalUnwind2
FUNC 2ab7 17 8 _EH4_LocalUnwind
-FUNC 1480 5 4 _get_errno_from_oserr
-FUNC 23bc 13 4 _get_errno_from_oserr
-FUNC 3510 12 4 _get_errno_from_oserr
-FUNC 5ec8 10 4 _get_errno_from_oserr
-FUNC 5f78 a 4 _get_errno_from_oserr
-FUNC 6ab4 1f 4 _get_errno_from_oserr
+FUNC 1480 5 0 _get_errno_from_oserr
+FUNC 23bc 13 0 _get_errno_from_oserr
+FUNC 3510 12 0 _get_errno_from_oserr
+FUNC 5ec8 10 0 _get_errno_from_oserr
+FUNC 5f78 a 0 _get_errno_from_oserr
+FUNC 6ab4 1f 0 _get_errno_from_oserr
5f78 5 119 224
5f7d 5 123 224
23bc 13 124 224
@@ -1677,24 +1677,24 @@
465f 7 106 4591
4666 5 114 4591
466b 6 115 4591
-FUNC 4834 11 4 _initp_eh_hooks
+FUNC 4834 11 0 _initp_eh_hooks
4834 0 69 4591
4834 10 70 4591
4844 1 71 4591
-FUNC 15b8 1e 4 _initp_misc_winsig
+FUNC 15b8 1e 0 _initp_misc_winsig
15b8 5 57 2311
15bd 8 58 2311
15c5 5 59 2311
15ca 5 60 2311
15cf 5 61 2311
15d4 2 62 2311
-FUNC 15d8 18 4 siglookup
-FUNC 3538 f 4 siglookup
-FUNC 42c8 14 4 siglookup
-FUNC 45c8 2 4 siglookup
-FUNC 4e1c f 4 siglookup
-FUNC 55f0 2 4 siglookup
-FUNC 63ac f 4 siglookup
+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
63ac 5 629 2311
63b1 a 630 2311
15d8 18 639 2311
@@ -1708,7 +1708,7 @@
3708 0 669 2311
3708 c 670 2311
3714 1 671 2311
-FUNC 17d8 1a3 4 raise
+FUNC 17d8 1a3 0 raise
17d8 c 450 2311
17e4 5 457 2311
17e9 3 458 2311
@@ -1762,22 +1762,22 @@
196d 6 600 2311
1973 2 603 2311
1975 6 604 2311
-FUNC 502c f 4 _initp_misc_rand_s
+FUNC 502c f 0 _initp_misc_rand_s
502c 5 58 2186
5031 8 59 2186
5039 2 60 2186
-FUNC 2848 f 4 _initp_misc_purevirt
+FUNC 2848 f 0 _initp_misc_purevirt
2848 5 179 1627
284d 8 180 1627
2855 2 181 1627
-FUNC 6fd0 f 4 _initp_heap_handler
+FUNC 6fd0 f 0 _initp_heap_handler
6fd0 5 31 2820
6fd5 8 32 2820
6fdd 2 33 2820
-FUNC 1660 14 4 _callnewh
-FUNC 5708 1f 4 _callnewh
-FUNC 60b0 4 4 _callnewh
-FUNC 6c18 5 4 _callnewh
+FUNC 1660 14 0 _callnewh
+FUNC 5708 1f 0 _callnewh
+FUNC 60b0 4 0 _callnewh
+FUNC 6c18 5 0 _callnewh
5708 5 131 2820
570d c 133 2820
1660 14 135 2820
@@ -1786,19 +1786,19 @@
6c1b 2 139 2820
60b0 2 136 2820
60b2 2 139 2820
-FUNC 2274 12 4 _onexit_nolock
-FUNC 2484 10 4 _onexit_nolock
-FUNC 2640 2 4 _onexit_nolock
-FUNC 2b88 10 4 _onexit_nolock
-FUNC 32ac 13 4 _onexit_nolock
-FUNC 4124 15 4 _onexit_nolock
-FUNC 43e8 33 4 _onexit_nolock
-FUNC 45f8 18 4 _onexit_nolock
-FUNC 4a2c 20 4 _onexit_nolock
-FUNC 4b68 2 4 _onexit_nolock
-FUNC 4bb8 18 4 _onexit_nolock
-FUNC 4d84 5 4 _onexit_nolock
-FUNC 6a0c 1a 4 _onexit_nolock
+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
43e8 8 100 1969
43f0 f 103 1969
43ff f 104 1969
@@ -1833,7 +1833,7 @@
2658 3 214 1969
265b 3 216 1969
265e 1 217 1969
-FUNC 157b 3c 4 _onexit
+FUNC 157b 3c 0 _onexit
157b c 81 1969
1587 5 84 1969
158c 4 86 1969
@@ -1842,7 +1842,7 @@
15a8 3 93 1969
15ab 6 94 1969
15b1 6 90 1969
-FUNC 56a4 17 4 atexit
+FUNC 56a4 17 0 atexit
56a4 5 161 1969
56a9 10 162 1969
56b9 2 163 1969
@@ -1853,10 +1853,10 @@
6ec0 2 56 2419
6b70 20 58 2419
6154 3 60 2419
-FUNC 4af8 17 4 _ValidateImageBase
-FUNC 4e40 1c 4 _ValidateImageBase
-FUNC 5608 4 4 _ValidateImageBase
-FUNC 585c 12 4 _ValidateImageBase
+FUNC 4af8 17 0 _ValidateImageBase
+FUNC 4e40 1c 0 _ValidateImageBase
+FUNC 5608 4 0 _ValidateImageBase
+FUNC 585c 12 0 _ValidateImageBase
4e40 5 44 2079
4e45 17 50 2079
5608 2 52 2079
@@ -1866,13 +1866,13 @@
4b03 c 58 2079
585c 10 62 2079
586c 2 68 2079
-FUNC 1234 5 8 _FindPESection
-FUNC 1b2c 2 8 _FindPESection
-FUNC 4948 13 8 _FindPESection
-FUNC 4e08 12 8 _FindPESection
-FUNC 5d9c 10 8 _FindPESection
-FUNC 6d60 3 8 _FindPESection
-FUNC 6fa4 2c 8 _FindPESection
+FUNC 1234 5 0 _FindPESection
+FUNC 1b2c 2 0 _FindPESection
+FUNC 4948 13 0 _FindPESection
+FUNC 4e08 12 0 _FindPESection
+FUNC 5d9c 10 0 _FindPESection
+FUNC 6d60 3 0 _FindPESection
+FUNC 6fa4 2c 0 _FindPESection
6fa4 5 92 2079
6fa9 8 99 2079
6d60 3 108 2079
@@ -1883,7 +1883,7 @@
1234 3 123 2079
1b2c 2 123 2079
1237 2 124 2079
-FUNC 6fee bc 4 _IsNonwritableInCurrentImage
+FUNC 6fee bc 0 _IsNonwritableInCurrentImage
6fee 35 149 2079
7023 7 156 2079
702a f 164 2079
@@ -1897,29 +1897,29 @@
7079 16 187 2079
708f 9 193 2079
7098 12 195 2079
-FUNC 1064 4c c __crtMessageBoxW
-FUNC 123c 1b c __crtMessageBoxW
-FUNC 1460 14 c __crtMessageBoxW
-FUNC 19c4 12 c __crtMessageBoxW
-FUNC 2148 40 c __crtMessageBoxW
-FUNC 2b00 14 c __crtMessageBoxW
-FUNC 31b4 e c __crtMessageBoxW
-FUNC 3290 1a c __crtMessageBoxW
-FUNC 36e8 8 c __crtMessageBoxW
-FUNC 3794 1c c __crtMessageBoxW
-FUNC 474c 1c c __crtMessageBoxW
-FUNC 496c 10 c __crtMessageBoxW
-FUNC 4ca0 10 c __crtMessageBoxW
-FUNC 4d18 1c c __crtMessageBoxW
-FUNC 5640 2 c __crtMessageBoxW
-FUNC 56e4 16 c __crtMessageBoxW
-FUNC 5cf4 10 c __crtMessageBoxW
-FUNC 5e50 10 c __crtMessageBoxW
-FUNC 5ee8 13 c __crtMessageBoxW
-FUNC 5f18 c c __crtMessageBoxW
-FUNC 6f6c f c __crtMessageBoxW
-FUNC 6f7c 14 c __crtMessageBoxW
-FUNC 70d4 10 c __crtMessageBoxW
+FUNC 1064 4c 0 __crtMessageBoxW
+FUNC 123c 1b 0 __crtMessageBoxW
+FUNC 1460 14 0 __crtMessageBoxW
+FUNC 19c4 12 0 __crtMessageBoxW
+FUNC 2148 40 0 __crtMessageBoxW
+FUNC 2b00 14 0 __crtMessageBoxW
+FUNC 31b4 e 0 __crtMessageBoxW
+FUNC 3290 1a 0 __crtMessageBoxW
+FUNC 36e8 8 0 __crtMessageBoxW
+FUNC 3794 1c 0 __crtMessageBoxW
+FUNC 474c 1c 0 __crtMessageBoxW
+FUNC 496c 10 0 __crtMessageBoxW
+FUNC 4ca0 10 0 __crtMessageBoxW
+FUNC 4d18 1c 0 __crtMessageBoxW
+FUNC 5640 2 0 __crtMessageBoxW
+FUNC 56e4 16 0 __crtMessageBoxW
+FUNC 5cf4 10 0 __crtMessageBoxW
+FUNC 5e50 10 0 __crtMessageBoxW
+FUNC 5ee8 13 0 __crtMessageBoxW
+FUNC 5f18 c 0 __crtMessageBoxW
+FUNC 6f6c f 0 __crtMessageBoxW
+FUNC 6f7c 14 0 __crtMessageBoxW
+FUNC 70d4 10 0 __crtMessageBoxW
2148 12 41 1053
215a 14 49 1053
216e 4 56 1053
@@ -1961,21 +1961,21 @@
2b00 14 158 1053
5640 2 163 1053
6f6c f 166 1053
-FUNC 21d0 14 c wcscat_s
-FUNC 28c0 10 c wcscat_s
-FUNC 3784 a c wcscat_s
-FUNC 3d78 18 c wcscat_s
-FUNC 4880 18 c wcscat_s
-FUNC 48bc b c wcscat_s
-FUNC 4b7c 10 c wcscat_s
-FUNC 4f58 4 c wcscat_s
-FUNC 5448 e c wcscat_s
-FUNC 55d8 12 c wcscat_s
-FUNC 5f9c 2 c wcscat_s
-FUNC 5fb4 7 c wcscat_s
-FUNC 6054 c c wcscat_s
-FUNC 6194 10 c wcscat_s
-FUNC 6d50 10 c wcscat_s
+FUNC 21d0 14 0 wcscat_s
+FUNC 28c0 10 0 wcscat_s
+FUNC 3784 a 0 wcscat_s
+FUNC 3d78 18 0 wcscat_s
+FUNC 4880 18 0 wcscat_s
+FUNC 48bc b 0 wcscat_s
+FUNC 4b7c 10 0 wcscat_s
+FUNC 4f58 4 0 wcscat_s
+FUNC 5448 e 0 wcscat_s
+FUNC 55d8 12 0 wcscat_s
+FUNC 5f9c 2 0 wcscat_s
+FUNC 5fb4 7 0 wcscat_s
+FUNC 6054 c 0 wcscat_s
+FUNC 6194 10 0 wcscat_s
+FUNC 6d50 10 0 wcscat_s
3d78 6 13 2468
3784 a 18 2468
3d7e 12 18 2468
@@ -1997,33 +1997,33 @@
21d0 3 41 2468
4b7c 10 41 2468
21d3 11 42 2468
-FUNC 103c c 10 wcsncpy_s
-FUNC 11d8 10 10 wcsncpy_s
-FUNC 12fc b 10 wcsncpy_s
-FUNC 1ae0 e 10 wcsncpy_s
-FUNC 1b4c f 10 wcsncpy_s
-FUNC 1e0c 5 10 wcsncpy_s
-FUNC 21e4 10 10 wcsncpy_s
-FUNC 228c 4 10 wcsncpy_s
-FUNC 22b0 c 10 wcsncpy_s
-FUNC 3720 e 10 wcsncpy_s
-FUNC 37c0 b 10 wcsncpy_s
-FUNC 43d4 14 10 wcsncpy_s
-FUNC 46c8 10 10 wcsncpy_s
-FUNC 4828 c 10 wcsncpy_s
-FUNC 495c a 10 wcsncpy_s
-FUNC 49dc 34 10 wcsncpy_s
-FUNC 4c38 2 10 wcsncpy_s
-FUNC 4c84 5 10 wcsncpy_s
-FUNC 5a38 5 10 wcsncpy_s
-FUNC 5dc8 c 10 wcsncpy_s
-FUNC 61e0 e 10 wcsncpy_s
-FUNC 6288 4 10 wcsncpy_s
-FUNC 63e0 d 10 wcsncpy_s
-FUNC 6a28 10 10 wcsncpy_s
-FUNC 6af4 18 10 wcsncpy_s
-FUNC 6c3c e 10 wcsncpy_s
-FUNC 70c4 10 10 wcsncpy_s
+FUNC 103c c 0 wcsncpy_s
+FUNC 11d8 10 0 wcsncpy_s
+FUNC 12fc b 0 wcsncpy_s
+FUNC 1ae0 e 0 wcsncpy_s
+FUNC 1b4c f 0 wcsncpy_s
+FUNC 1e0c 5 0 wcsncpy_s
+FUNC 21e4 10 0 wcsncpy_s
+FUNC 228c 4 0 wcsncpy_s
+FUNC 22b0 c 0 wcsncpy_s
+FUNC 3720 e 0 wcsncpy_s
+FUNC 37c0 b 0 wcsncpy_s
+FUNC 43d4 14 0 wcsncpy_s
+FUNC 46c8 10 0 wcsncpy_s
+FUNC 4828 c 0 wcsncpy_s
+FUNC 495c a 0 wcsncpy_s
+FUNC 49dc 34 0 wcsncpy_s
+FUNC 4c38 2 0 wcsncpy_s
+FUNC 4c84 5 0 wcsncpy_s
+FUNC 5a38 5 0 wcsncpy_s
+FUNC 5dc8 c 0 wcsncpy_s
+FUNC 61e0 e 0 wcsncpy_s
+FUNC 6288 4 0 wcsncpy_s
+FUNC 63e0 d 0 wcsncpy_s
+FUNC 6a28 10 0 wcsncpy_s
+FUNC 6af4 18 0 wcsncpy_s
+FUNC 6c3c e 0 wcsncpy_s
+FUNC 70c4 10 0 wcsncpy_s
49dc 5 13 2578
1b4c f 17 2578
49e1 17 17 2578
@@ -2058,25 +2058,25 @@
6a2b d 59 2578
43d4 3 61 2578
43d7 11 62 2578
-FUNC 20d4 10 4 wcslen
-FUNC 5520 10 4 wcslen
+FUNC 20d4 10 0 wcslen
+FUNC 5520 10 0 wcslen
20dc 5 41 2728
20e1 3 42 2728
5520 10 44 2728
20d4 6 46 2728
20da 2 47 2728
-FUNC 15f0 18 c wcscpy_s
-FUNC 17cc c c wcscpy_s
-FUNC 23a0 10 c wcscpy_s
-FUNC 2494 a c wcscpy_s
-FUNC 2858 18 c wcscpy_s
-FUNC 3208 10 c wcscpy_s
-FUNC 3ca8 8 c wcscpy_s
-FUNC 4bd0 10 c wcscpy_s
-FUNC 5530 7 c wcscpy_s
-FUNC 5880 4 c wcscpy_s
-FUNC 5f08 4 c wcscpy_s
-FUNC 5f24 14 c wcscpy_s
+FUNC 15f0 18 0 wcscpy_s
+FUNC 17cc c 0 wcscpy_s
+FUNC 23a0 10 0 wcscpy_s
+FUNC 2494 a 0 wcscpy_s
+FUNC 2858 18 0 wcscpy_s
+FUNC 3208 10 0 wcscpy_s
+FUNC 3ca8 8 0 wcscpy_s
+FUNC 4bd0 10 0 wcscpy_s
+FUNC 5530 7 0 wcscpy_s
+FUNC 5880 4 0 wcscpy_s
+FUNC 5f08 4 0 wcscpy_s
+FUNC 5f24 14 0 wcscpy_s
15f0 6 13 2523
15f6 12 18 2523
23a0 10 18 2523
@@ -2092,12 +2092,12 @@
4bd0 10 29 2523
5f24 3 29 2523
5f27 11 30 2523
-FUNC 1268 d 4 _set_error_mode
-FUNC 1b7c 16 4 _set_error_mode
-FUNC 1e04 7 4 _set_error_mode
-FUNC 31c4 f 4 _set_error_mode
-FUNC 49cc f 4 _set_error_mode
-FUNC 5eac 15 4 _set_error_mode
+FUNC 1268 d 0 _set_error_mode
+FUNC 1b7c 16 0 _set_error_mode
+FUNC 1e04 7 0 _set_error_mode
+FUNC 31c4 f 0 _set_error_mode
+FUNC 49cc f 0 _set_error_mode
+FUNC 5eac 15 0 _set_error_mode
1b7c 5 43 1181
1b81 11 46 1181
31c4 f 46 1181
@@ -2115,13 +2115,13 @@
127b 2 56 892
127d 2 57 892
127f 5 59 892
-FUNC 1488 6 4 _malloc_crt
-FUNC 1b04 12 4 _malloc_crt
-FUNC 1d3c 3 4 _malloc_crt
-FUNC 5fe0 1f 4 _malloc_crt
-FUNC 69d4 9 4 _malloc_crt
-FUNC 6c64 18 4 _malloc_crt
-FUNC 6f40 10 4 _malloc_crt
+FUNC 1488 6 0 _malloc_crt
+FUNC 1b04 12 0 _malloc_crt
+FUNC 1d3c 3 0 _malloc_crt
+FUNC 5fe0 1f 0 _malloc_crt
+FUNC 69d4 9 0 _malloc_crt
+FUNC 6c64 18 0 _malloc_crt
+FUNC 6f40 10 0 _malloc_crt
69d4 7 39 333
69db 2 40 333
6c64 b 44 333
@@ -2133,13 +2133,13 @@
6f42 e 47 333
1488 4 50 333
148c 2 51 333
-FUNC 3cd8 10 8 _calloc_crt
-FUNC 541c 12 8 _calloc_crt
-FUNC 553c 6 8 _calloc_crt
-FUNC 5598 9 8 _calloc_crt
-FUNC 6950 3 8 _calloc_crt
-FUNC 6ec8 1f 8 _calloc_crt
-FUNC 6ef0 20 8 _calloc_crt
+FUNC 3cd8 10 0 _calloc_crt
+FUNC 541c 12 0 _calloc_crt
+FUNC 553c 6 0 _calloc_crt
+FUNC 5598 9 0 _calloc_crt
+FUNC 6950 3 0 _calloc_crt
+FUNC 6ec8 1f 0 _calloc_crt
+FUNC 6ef0 20 0 _calloc_crt
5598 7 54 333
559f 2 55 333
6ef0 12 61 333
@@ -2151,14 +2151,14 @@
3cda e 64 333
553c 4 67 333
5540 2 68 333
-FUNC 2674 3 8 _realloc_crt
-FUNC 2b5c 10 8 _realloc_crt
-FUNC 38b8 6 8 _realloc_crt
-FUNC 435c f 8 _realloc_crt
-FUNC 633c 1c 8 _realloc_crt
-FUNC 6580 1f 8 _realloc_crt
-FUNC 65b0 12 8 _realloc_crt
-FUNC 6f20 9 8 _realloc_crt
+FUNC 2674 3 0 _realloc_crt
+FUNC 2b5c 10 0 _realloc_crt
+FUNC 38b8 6 0 _realloc_crt
+FUNC 435c f 0 _realloc_crt
+FUNC 633c 1c 0 _realloc_crt
+FUNC 6580 1f 0 _realloc_crt
+FUNC 65b0 12 0 _realloc_crt
+FUNC 6f20 9 0 _realloc_crt
6f20 7 71 333
6f27 2 72 333
633c f 76 333
@@ -2290,17 +2290,17 @@
2cc8 7 524 3326
2ccf 11 527 3326
2ce0 9 529 3326
-FUNC 12b0 8 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 2084 18 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 2314 7 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 2504 27 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 2904 7 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 3558 14 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 4d74 e 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 560c 13 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 5d04 14 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 5f68 a 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
-FUNC 6cbc 1c 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 12b0 8 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 2084 18 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 2314 7 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 2504 27 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 2904 7 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 3558 14 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 4d74 e 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 560c 13 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 5d04 14 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 5f68 a 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 6cbc 1c 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
6cbc 5 240 111
6cc1 17 241 111
2504 8 243 111
@@ -2347,41 +2347,41 @@
4710 f 308 3326
6f64 2 308 3326
2b99 2 309 3326
-FUNC 1208 29 8 _setmbcp_nolock
-FUNC 16ac 20 8 _setmbcp_nolock
-FUNC 1bc0 3 8 _setmbcp_nolock
-FUNC 2188 11 8 _setmbcp_nolock
-FUNC 23b0 6 8 _setmbcp_nolock
-FUNC 2894 11 8 _setmbcp_nolock
-FUNC 2b28 7 8 _setmbcp_nolock
-FUNC 330c c 8 _setmbcp_nolock
-FUNC 40bc e 8 _setmbcp_nolock
-FUNC 454c f 8 _setmbcp_nolock
-FUNC 4720 6 8 _setmbcp_nolock
-FUNC 4768 f 8 _setmbcp_nolock
-FUNC 4b58 10 8 _setmbcp_nolock
-FUNC 4c40 c 8 _setmbcp_nolock
-FUNC 5404 12 8 _setmbcp_nolock
-FUNC 5728 2a 8 _setmbcp_nolock
-FUNC 5800 e 8 _setmbcp_nolock
-FUNC 5ab0 17 8 _setmbcp_nolock
-FUNC 5adc 11 8 _setmbcp_nolock
-FUNC 5ba8 c 8 _setmbcp_nolock
-FUNC 5bcc 14 8 _setmbcp_nolock
-FUNC 5fa4 8 8 _setmbcp_nolock
-FUNC 6010 f 8 _setmbcp_nolock
-FUNC 6074 1c 8 _setmbcp_nolock
-FUNC 609c 14 8 _setmbcp_nolock
-FUNC 60c0 2a 8 _setmbcp_nolock
-FUNC 60f4 17 8 _setmbcp_nolock
-FUNC 6358 14 8 _setmbcp_nolock
-FUNC 638c 11 8 _setmbcp_nolock
-FUNC 63d4 5 8 _setmbcp_nolock
-FUNC 64a8 34 8 _setmbcp_nolock
-FUNC 64f0 3 8 _setmbcp_nolock
-FUNC 65c4 18 8 _setmbcp_nolock
-FUNC 6974 7 8 _setmbcp_nolock
-FUNC 6a64 f 8 _setmbcp_nolock
+FUNC 1208 29 0 _setmbcp_nolock
+FUNC 16ac 20 0 _setmbcp_nolock
+FUNC 1bc0 3 0 _setmbcp_nolock
+FUNC 2188 11 0 _setmbcp_nolock
+FUNC 23b0 6 0 _setmbcp_nolock
+FUNC 2894 11 0 _setmbcp_nolock
+FUNC 2b28 7 0 _setmbcp_nolock
+FUNC 330c c 0 _setmbcp_nolock
+FUNC 40bc e 0 _setmbcp_nolock
+FUNC 454c f 0 _setmbcp_nolock
+FUNC 4720 6 0 _setmbcp_nolock
+FUNC 4768 f 0 _setmbcp_nolock
+FUNC 4b58 10 0 _setmbcp_nolock
+FUNC 4c40 c 0 _setmbcp_nolock
+FUNC 5404 12 0 _setmbcp_nolock
+FUNC 5728 2a 0 _setmbcp_nolock
+FUNC 5800 e 0 _setmbcp_nolock
+FUNC 5ab0 17 0 _setmbcp_nolock
+FUNC 5adc 11 0 _setmbcp_nolock
+FUNC 5ba8 c 0 _setmbcp_nolock
+FUNC 5bcc 14 0 _setmbcp_nolock
+FUNC 5fa4 8 0 _setmbcp_nolock
+FUNC 6010 f 0 _setmbcp_nolock
+FUNC 6074 1c 0 _setmbcp_nolock
+FUNC 609c 14 0 _setmbcp_nolock
+FUNC 60c0 2a 0 _setmbcp_nolock
+FUNC 60f4 17 0 _setmbcp_nolock
+FUNC 6358 14 0 _setmbcp_nolock
+FUNC 638c 11 0 _setmbcp_nolock
+FUNC 63d4 5 0 _setmbcp_nolock
+FUNC 64a8 34 0 _setmbcp_nolock
+FUNC 64f0 3 0 _setmbcp_nolock
+FUNC 65c4 18 0 _setmbcp_nolock
+FUNC 6974 7 0 _setmbcp_nolock
+FUNC 6a64 f 0 _setmbcp_nolock
64a8 17 684 3326
64bf b 691 3326
64ca 12 694 3326
@@ -2430,7 +2430,7 @@
6392 b 795 3326
64f0 3 744 3326
4768 f 800 3326
-FUNC 1e11 19a 4 _setmbcp
+FUNC 1e11 19a 0 _setmbcp
1e11 c 572 3326
1e1d 4 573 3326
1e21 a 577 3326
@@ -2486,15 +2486,15 @@
5ddc a 853 3326
165c 2 858 3326
165e 1 859 3326
-FUNC 1674 7 10 x_ismbbtype_l
-FUNC 1c0c 2c 10 x_ismbbtype_l
-FUNC 3d74 2 10 x_ismbbtype_l
-FUNC 4c90 e 10 x_ismbbtype_l
-FUNC 5430 16 10 x_ismbbtype_l
-FUNC 59b0 2 10 x_ismbbtype_l
-FUNC 6254 10 10 x_ismbbtype_l
-FUNC 643c 3 10 x_ismbbtype_l
-FUNC 6498 10 10 x_ismbbtype_l
+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
1c0c 8 213 3271
1c14 b 214 3271
1c1f 4 219 3271
@@ -2507,26 +2507,26 @@
643c 3 222 3271
6498 10 222 3271
3d74 2 223 3271
-FUNC 4930 18 4 _ismbblead
+FUNC 4930 18 0 _ismbblead
4930 5 171 3271
4935 11 172 3271
4946 2 173 3271
-FUNC 1bac 12 4 __addlocaleref
-FUNC 26b4 a 4 __addlocaleref
-FUNC 2880 3 4 __addlocaleref
-FUNC 37d8 3 4 __addlocaleref
-FUNC 3c70 14 4 __addlocaleref
-FUNC 3fe4 13 4 __addlocaleref
-FUNC 4a10 1c 4 __addlocaleref
-FUNC 54d8 10 4 __addlocaleref
-FUNC 54f0 3 4 __addlocaleref
-FUNC 5620 3 4 __addlocaleref
-FUNC 5dac 3 4 __addlocaleref
-FUNC 6040 13 4 __addlocaleref
-FUNC 6278 10 4 __addlocaleref
-FUNC 6478 13 4 __addlocaleref
-FUNC 6540 10 4 __addlocaleref
-FUNC 6d08 28 4 __addlocaleref
+FUNC 1bac 12 0 __addlocaleref
+FUNC 26b4 a 0 __addlocaleref
+FUNC 2880 3 0 __addlocaleref
+FUNC 37d8 3 0 __addlocaleref
+FUNC 3c70 14 0 __addlocaleref
+FUNC 3fe4 13 0 __addlocaleref
+FUNC 4a10 1c 0 __addlocaleref
+FUNC 54d8 10 0 __addlocaleref
+FUNC 54f0 3 0 __addlocaleref
+FUNC 5620 3 0 __addlocaleref
+FUNC 5dac 3 0 __addlocaleref
+FUNC 6040 13 0 __addlocaleref
+FUNC 6278 10 0 __addlocaleref
+FUNC 6478 13 0 __addlocaleref
+FUNC 6540 10 0 __addlocaleref
+FUNC 6d08 28 0 __addlocaleref
6d08 7 36 1913
6d0f d 39 1913
6d1c 14 41 1913
@@ -2547,24 +2547,24 @@
1bac 12 53 1913
6040 11 63 1913
6051 2 64 1913
-FUNC 2328 a 4 __removelocaleref
-FUNC 252c 10 4 __removelocaleref
-FUNC 2b14 14 4 __removelocaleref
-FUNC 34c8 3 4 __removelocaleref
-FUNC 3d44 10 4 __removelocaleref
-FUNC 4c00 13 4 __removelocaleref
-FUNC 4f70 14 4 __removelocaleref
-FUNC 54d0 3 4 __removelocaleref
-FUNC 5648 3 4 __removelocaleref
-FUNC 5658 12 4 __removelocaleref
-FUNC 5870 10 4 __removelocaleref
-FUNC 5a7c 5 4 __removelocaleref
-FUNC 5e94 16 4 __removelocaleref
-FUNC 6578 3 4 __removelocaleref
-FUNC 6668 3 4 __removelocaleref
-FUNC 6cf0 10 4 __removelocaleref
-FUNC 6d30 1f 4 __removelocaleref
-FUNC 6d90 1b 4 __removelocaleref
+FUNC 2328 a 0 __removelocaleref
+FUNC 252c 10 0 __removelocaleref
+FUNC 2b14 14 0 __removelocaleref
+FUNC 34c8 3 0 __removelocaleref
+FUNC 3d44 10 0 __removelocaleref
+FUNC 4c00 13 0 __removelocaleref
+FUNC 4f70 14 0 __removelocaleref
+FUNC 54d0 3 0 __removelocaleref
+FUNC 5648 3 0 __removelocaleref
+FUNC 5658 12 0 __removelocaleref
+FUNC 5870 10 0 __removelocaleref
+FUNC 5a7c 5 0 __removelocaleref
+FUNC 5e94 16 0 __removelocaleref
+FUNC 6578 3 0 __removelocaleref
+FUNC 6668 3 0 __removelocaleref
+FUNC 6cf0 10 0 __removelocaleref
+FUNC 6d30 1f 0 __removelocaleref
+FUNC 6d90 1b 0 __removelocaleref
5e94 6 74 1913
5e9a 10 77 1913
6d30 b 79 1913
@@ -2587,34 +2587,34 @@
6cf0 10 103 1913
5a7c 3 106 1913
5a7f 2 107 1913
-FUNC 1dbc 14 4 __freetlocinfo
-FUNC 20ac 14 4 __freetlocinfo
-FUNC 21c0 10 4 __freetlocinfo
-FUNC 22c4 13 4 __freetlocinfo
-FUNC 2b44 c 4 __freetlocinfo
-FUNC 3c5c f 4 __freetlocinfo
-FUNC 3ec0 10 4 __freetlocinfo
-FUNC 40cc 17 4 __freetlocinfo
-FUNC 4294 e 4 __freetlocinfo
-FUNC 44c0 e 4 __freetlocinfo
-FUNC 44f8 20 4 __freetlocinfo
-FUNC 4cd4 13 4 __freetlocinfo
-FUNC 4d34 7 4 __freetlocinfo
-FUNC 4df8 10 4 __freetlocinfo
-FUNC 4f84 13 4 __freetlocinfo
-FUNC 5630 e 4 __freetlocinfo
-FUNC 577c a 4 __freetlocinfo
-FUNC 5af0 13 4 __freetlocinfo
-FUNC 5d74 12 4 __freetlocinfo
-FUNC 5dec 7 4 __freetlocinfo
-FUNC 5ed8 e 4 __freetlocinfo
-FUNC 6000 e 4 __freetlocinfo
-FUNC 61a8 14 4 __freetlocinfo
-FUNC 6634 12 4 __freetlocinfo
-FUNC 6748 13 4 __freetlocinfo
-FUNC 6984 40 4 __freetlocinfo
-FUNC 69fc e 4 __freetlocinfo
-FUNC 6c9c 18 4 __freetlocinfo
+FUNC 1dbc 14 0 __freetlocinfo
+FUNC 20ac 14 0 __freetlocinfo
+FUNC 21c0 10 0 __freetlocinfo
+FUNC 22c4 13 0 __freetlocinfo
+FUNC 2b44 c 0 __freetlocinfo
+FUNC 3c5c f 0 __freetlocinfo
+FUNC 3ec0 10 0 __freetlocinfo
+FUNC 40cc 17 0 __freetlocinfo
+FUNC 4294 e 0 __freetlocinfo
+FUNC 44c0 e 0 __freetlocinfo
+FUNC 44f8 20 0 __freetlocinfo
+FUNC 4cd4 13 0 __freetlocinfo
+FUNC 4d34 7 0 __freetlocinfo
+FUNC 4df8 10 0 __freetlocinfo
+FUNC 4f84 13 0 __freetlocinfo
+FUNC 5630 e 0 __freetlocinfo
+FUNC 577c a 0 __freetlocinfo
+FUNC 5af0 13 0 __freetlocinfo
+FUNC 5d74 12 0 __freetlocinfo
+FUNC 5dec 7 0 __freetlocinfo
+FUNC 5ed8 e 0 __freetlocinfo
+FUNC 6000 e 0 __freetlocinfo
+FUNC 61a8 14 0 __freetlocinfo
+FUNC 6634 12 0 __freetlocinfo
+FUNC 6748 13 0 __freetlocinfo
+FUNC 6984 40 0 __freetlocinfo
+FUNC 69fc e 0 __freetlocinfo
+FUNC 6c9c 18 0 __freetlocinfo
44f8 7 129 1913
44ff 19 137 1913
4df8 10 137 1913
@@ -2652,15 +2652,15 @@
5d74 12 179 1913
2b44 a 201 1913
2b4e 2 202 1913
-FUNC 1d58 16 8 _updatetlocinfoEx_nolock
-FUNC 2338 17 8 _updatetlocinfoEx_nolock
-FUNC 2d40 2 8 _updatetlocinfoEx_nolock
-FUNC 2dc8 3 8 _updatetlocinfoEx_nolock
-FUNC 2dd4 16 8 _updatetlocinfoEx_nolock
-FUNC 4f18 17 8 _updatetlocinfoEx_nolock
-FUNC 5794 10 8 _updatetlocinfoEx_nolock
-FUNC 57b4 8 8 _updatetlocinfoEx_nolock
-FUNC 6c28 12 8 _updatetlocinfoEx_nolock
+FUNC 1d58 16 0 _updatetlocinfoEx_nolock
+FUNC 2338 17 0 _updatetlocinfoEx_nolock
+FUNC 2d40 2 0 _updatetlocinfoEx_nolock
+FUNC 2dc8 3 0 _updatetlocinfoEx_nolock
+FUNC 2dd4 16 0 _updatetlocinfoEx_nolock
+FUNC 4f18 17 0 _updatetlocinfoEx_nolock
+FUNC 5794 10 0 _updatetlocinfoEx_nolock
+FUNC 57b4 8 0 _updatetlocinfoEx_nolock
+FUNC 6c28 12 0 _updatetlocinfoEx_nolock
4f18 6 216 1913
2338 10 219 1913
4f1e 11 219 1913
@@ -2691,11 +2691,11 @@
3f6e e 292 1913
3f7c 8 294 1913
3f84 4 295 1913
-FUNC 1ad0 8 4 _crt_debugger_hook
+FUNC 1ad0 8 0 _crt_debugger_hook
1ad0 0 62 1145
1ad0 7 65 1145
1ad7 1 66 1145
-FUNC 4fa2 7a c memset
+FUNC 4fa2 7a 0 memset
4fa2 0 59 2789
4fa2 4 68 2789
4fa6 4 69 2789
@@ -2821,7 +2821,7 @@
46a6 9 81 1011
46af 11 83 1011
46c0 8 92 1011
-FUNC 50a3 361 c memcpy
+FUNC 50a3 361 0 memcpy
50a3 3 101 2787
50a6 1 113 2787
50a7 1 114 2787
@@ -3057,19 +3057,19 @@
5400 1 593 2787
5401 1 594 2787
5402 2 595 2787
-FUNC 219c 2 4 _freea
-FUNC 4240 14 4 _freea
-FUNC 5a10 16 4 _freea
-FUNC 6904 7 4 _freea
+FUNC 219c 2 0 _freea
+FUNC 4240 14 0 _freea
+FUNC 5a10 16 0 _freea
+FUNC 6904 7 0 _freea
5a10 5 235 281
5a15 11 237 281
4240 3 239 281
4243 11 241 281
6904 7 243 281
219c 2 252 281
-FUNC 19e0 13 4 _msize
-FUNC 4898 14 4 _msize
-FUNC 6b2c 15 4 _msize
+FUNC 19e0 13 0 _msize
+FUNC 4898 14 0 _msize
+FUNC 6b2c 15 0 _msize
4898 5 39 561
489d f 43 561
6b2c 13 43 561
@@ -3119,21 +3119,21 @@
6e95 8 315 1392
6e9d 12 319 1392
6eaf 2 320 1392
-FUNC 1284 1c c _calloc_impl
-FUNC 1b18 14 c _calloc_impl
-FUNC 1b5c 10 c _calloc_impl
-FUNC 2d48 6 c _calloc_impl
-FUNC 3488 14 c _calloc_impl
-FUNC 3e7c 3 c _calloc_impl
-FUNC 40e4 f c _calloc_impl
-FUNC 4c60 10 c _calloc_impl
-FUNC 5650 1 c _calloc_impl
-FUNC 5898 16 c _calloc_impl
-FUNC 5f88 13 c _calloc_impl
-FUNC 5fc0 6 c _calloc_impl
-FUNC 68a8 16 c _calloc_impl
-FUNC 6b60 10 c _calloc_impl
-FUNC 6c7c 8 c _calloc_impl
+FUNC 1284 1c 0 _calloc_impl
+FUNC 1b18 14 0 _calloc_impl
+FUNC 1b5c 10 0 _calloc_impl
+FUNC 2d48 6 0 _calloc_impl
+FUNC 3488 14 0 _calloc_impl
+FUNC 3e7c 3 0 _calloc_impl
+FUNC 40e4 f 0 _calloc_impl
+FUNC 4c60 10 0 _calloc_impl
+FUNC 5650 1 0 _calloc_impl
+FUNC 5898 16 0 _calloc_impl
+FUNC 5f88 13 0 _calloc_impl
+FUNC 5fc0 6 0 _calloc_impl
+FUNC 68a8 16 0 _calloc_impl
+FUNC 6b60 10 0 _calloc_impl
+FUNC 6c7c 8 0 _calloc_impl
5898 5 21 291
589d 11 26 291
40e4 d 28 291
@@ -3155,24 +3155,24 @@
2d48 6 53 291
3e7c 1 53 291
3e7d 2 69 291
-FUNC 1048 16 8 realloc
-FUNC 11a0 e 8 realloc
-FUNC 1744 2 8 realloc
-FUNC 1b34 7 8 realloc
-FUNC 261c 22 8 realloc
-FUNC 2ae0 8 8 realloc
-FUNC 3d30 12 8 realloc
-FUNC 3df8 3 8 realloc
-FUNC 4230 f 8 realloc
-FUNC 4284 10 8 realloc
-FUNC 4cb0 1 8 realloc
-FUNC 5960 1c 8 realloc
-FUNC 62a4 14 8 realloc
-FUNC 6528 1 8 realloc
-FUNC 6550 12 8 realloc
-FUNC 65dc b 8 realloc
-FUNC 6654 12 8 realloc
-FUNC 6734 14 8 realloc
+FUNC 1048 16 0 realloc
+FUNC 11a0 e 0 realloc
+FUNC 1744 2 0 realloc
+FUNC 1b34 7 0 realloc
+FUNC 261c 22 0 realloc
+FUNC 2ae0 8 0 realloc
+FUNC 3d30 12 0 realloc
+FUNC 3df8 3 0 realloc
+FUNC 4230 f 0 realloc
+FUNC 4284 10 0 realloc
+FUNC 4cb0 1 0 realloc
+FUNC 5960 1c 0 realloc
+FUNC 62a4 14 0 realloc
+FUNC 6528 1 0 realloc
+FUNC 6550 12 0 realloc
+FUNC 65dc b 0 realloc
+FUNC 6654 12 0 realloc
+FUNC 6734 14 0 realloc
62a4 5 62 618
62a9 f 67 618
65dc 9 68 618
@@ -3200,52 +3200,52 @@
5976 6 112 618
1048 16 103 618
2ae0 8 105 618
-FUNC 1000 7 24 __crtLCMapStringA_stat
-FUNC 11b0 14 24 __crtLCMapStringA_stat
-FUNC 17c4 8 24 __crtLCMapStringA_stat
-FUNC 1ac4 6 24 __crtLCMapStringA_stat
-FUNC 21f4 c 24 __crtLCMapStringA_stat
-FUNC 2234 9 24 __crtLCMapStringA_stat
-FUNC 2354 f 24 __crtLCMapStringA_stat
-FUNC 242c 12 24 __crtLCMapStringA_stat
-FUNC 2710 3 24 __crtLCMapStringA_stat
-FUNC 2794 b 24 __crtLCMapStringA_stat
-FUNC 28d0 13 24 __crtLCMapStringA_stat
-FUNC 31f8 5 24 __crtLCMapStringA_stat
-FUNC 327c 14 24 __crtLCMapStringA_stat
-FUNC 32c0 4a 24 __crtLCMapStringA_stat
-FUNC 336c 20 24 __crtLCMapStringA_stat
-FUNC 36f8 f 24 __crtLCMapStringA_stat
-FUNC 37e0 10 24 __crtLCMapStringA_stat
-FUNC 3c30 1 24 __crtLCMapStringA_stat
-FUNC 3f94 e 24 __crtLCMapStringA_stat
-FUNC 4300 14 24 __crtLCMapStringA_stat
-FUNC 4338 11 24 __crtLCMapStringA_stat
-FUNC 497c 16 24 __crtLCMapStringA_stat
-FUNC 4b10 15 24 __crtLCMapStringA_stat
-FUNC 4c70 14 24 __crtLCMapStringA_stat
-FUNC 4ce8 10 24 __crtLCMapStringA_stat
-FUNC 4db4 1e 24 __crtLCMapStringA_stat
-FUNC 4e68 12 24 __crtLCMapStringA_stat
-FUNC 54e8 3 24 __crtLCMapStringA_stat
-FUNC 5574 14 24 __crtLCMapStringA_stat
-FUNC 55d0 2 24 __crtLCMapStringA_stat
-FUNC 55f8 8 24 __crtLCMapStringA_stat
-FUNC 5628 8 24 __crtLCMapStringA_stat
-FUNC 578c 3 24 __crtLCMapStringA_stat
-FUNC 5838 24 24 __crtLCMapStringA_stat
-FUNC 58f4 c 24 __crtLCMapStringA_stat
-FUNC 5f44 7 24 __crtLCMapStringA_stat
-FUNC 61fc f 24 __crtLCMapStringA_stat
-FUNC 6328 14 24 __crtLCMapStringA_stat
-FUNC 63a0 c 24 __crtLCMapStringA_stat
-FUNC 6404 6 24 __crtLCMapStringA_stat
-FUNC 65e8 28 24 __crtLCMapStringA_stat
-FUNC 6624 10 24 __crtLCMapStringA_stat
-FUNC 6ad4 16 24 __crtLCMapStringA_stat
-FUNC 6d80 e 24 __crtLCMapStringA_stat
-FUNC 6eb4 3 24 __crtLCMapStringA_stat
-FUNC 6f10 f 24 __crtLCMapStringA_stat
+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
65e8 12 96 3447
65fa 16 101 3447
2354 f 102 3447
@@ -3300,32 +3300,32 @@
21f4 8 242 3447
21fc 4 244 3447
242c 12 245 3447
-FUNC 3204 2 24 __crtLCMapStringA
-FUNC 3c24 7 24 __crtLCMapStringA
-FUNC 610c 47 24 __crtLCMapStringA
+FUNC 3204 2 0 __crtLCMapStringA
+FUNC 3c24 7 0 __crtLCMapStringA
+FUNC 610c 47 0 __crtLCMapStringA
610c 8 258 3447
6114 b 259 3447
3c24 7 271 3447
611f 34 271 3447
3204 2 272 3447
-FUNC 1198 3 20 __crtGetStringTypeA_stat
-FUNC 17b4 e 20 __crtGetStringTypeA_stat
-FUNC 19ac 2 20 __crtGetStringTypeA_stat
-FUNC 24a4 14 20 __crtGetStringTypeA_stat
-FUNC 3318 33 20 __crtGetStringTypeA_stat
-FUNC 357c 2b 20 __crtGetStringTypeA_stat
-FUNC 43c4 b 20 __crtGetStringTypeA_stat
-FUNC 4624 14 20 __crtGetStringTypeA_stat
-FUNC 4d9c 11 20 __crtGetStringTypeA_stat
-FUNC 5094 a 20 __crtGetStringTypeA_stat
-FUNC 5b4c 12 20 __crtGetStringTypeA_stat
-FUNC 5efc c 20 __crtGetStringTypeA_stat
-FUNC 5f38 6 20 __crtGetStringTypeA_stat
-FUNC 6420 c 20 __crtGetStringTypeA_stat
-FUNC 68c0 14 20 __crtGetStringTypeA_stat
-FUNC 6910 12 20 __crtGetStringTypeA_stat
-FUNC 6bf0 28 20 __crtGetStringTypeA_stat
-FUNC 6c20 8 20 __crtGetStringTypeA_stat
+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
6bf0 12 63 3507
6c02 7 67 3507
6c09 f 83 3507
@@ -3349,16 +3349,16 @@
5094 6 118 3507
509a 4 120 3507
6910 12 121 3507
-FUNC 25dc 40 20 __crtGetStringTypeA
-FUNC 4104 7 20 __crtGetStringTypeA
-FUNC 5ca0 2 20 __crtGetStringTypeA
+FUNC 25dc 40 0 __crtGetStringTypeA
+FUNC 4104 7 0 __crtGetStringTypeA
+FUNC 5ca0 2 0 __crtGetStringTypeA
25dc 8 133 3507
25e4 b 134 3507
25ef 2d 145 3507
4104 7 145 3507
5ca0 2 146 3507
-FUNC 2e0c 37b 4 __free_lc_time
-FUNC 641c 3 4 __free_lc_time
+FUNC 2e0c 37b 0 __free_lc_time
+FUNC 641c 3 0 __free_lc_time
2e0c 6 228 1800
2e12 10 229 1800
2e24 8 232 1800
@@ -3449,18 +3449,18 @@
3179 e 329 1800
641c 1 329 1800
641d 2 332 1800
-FUNC 1308 14 4 __free_lconv_num
-FUNC 14ec 7 4 __free_lconv_num
-FUNC 24c0 7 4 __free_lconv_num
-FUNC 2d64 14 4 __free_lconv_num
-FUNC 3194 14 4 __free_lconv_num
-FUNC 33c0 7 4 __free_lconv_num
-FUNC 3c9c 7 4 __free_lconv_num
-FUNC 42ec 3 4 __free_lconv_num
-FUNC 441c 7 4 __free_lconv_num
-FUNC 448c 14 4 __free_lconv_num
-FUNC 5688 14 4 __free_lconv_num
-FUNC 5cdc 17 4 __free_lconv_num
+FUNC 1308 14 0 __free_lconv_num
+FUNC 14ec 7 0 __free_lconv_num
+FUNC 24c0 7 0 __free_lconv_num
+FUNC 2d64 14 0 __free_lconv_num
+FUNC 3194 14 0 __free_lconv_num
+FUNC 33c0 7 0 __free_lconv_num
+FUNC 3c9c 7 0 __free_lconv_num
+FUNC 42ec 3 0 __free_lconv_num
+FUNC 441c 7 0 __free_lconv_num
+FUNC 448c 14 0 __free_lconv_num
+FUNC 5688 14 0 __free_lconv_num
+FUNC 5cdc 17 0 __free_lconv_num
5cdc 6 218 1742
5ce2 11 219 1742
2d64 14 222 1742
@@ -3475,34 +3475,34 @@
14ec 7 235 1742
42ec 1 235 1742
42ed 2 236 1742
-FUNC 1028 14 4 __free_lconv_mon
-FUNC 16f4 14 4 __free_lconv_mon
-FUNC 2040 14 4 __free_lconv_mon
-FUNC 2724 7 4 __free_lconv_mon
-FUNC 2788 7 4 __free_lconv_mon
-FUNC 2834 3 4 __free_lconv_mon
-FUNC 28f0 7 4 __free_lconv_mon
-FUNC 2b7c 7 4 __free_lconv_mon
-FUNC 3360 7 4 __free_lconv_mon
-FUNC 34d8 14 4 __free_lconv_mon
-FUNC 37cc 7 4 __free_lconv_mon
-FUNC 3bac 14 4 __free_lconv_mon
-FUNC 3ddc 14 4 __free_lconv_mon
-FUNC 4a80 7 4 __free_lconv_mon
-FUNC 4aa0 7 4 __free_lconv_mon
-FUNC 4b34 14 4 __free_lconv_mon
-FUNC 4dec 7 4 __free_lconv_mon
-FUNC 4e2c 14 4 __free_lconv_mon
-FUNC 4e5c 7 4 __free_lconv_mon
-FUNC 4efc 14 4 __free_lconv_mon
-FUNC 4f64 7 4 __free_lconv_mon
-FUNC 567c 7 4 __free_lconv_mon
-FUNC 58dc 16 4 __free_lconv_mon
-FUNC 594c 14 4 __free_lconv_mon
-FUNC 5b38 14 4 __free_lconv_mon
-FUNC 5cb4 7 4 __free_lconv_mon
-FUNC 6264 14 4 __free_lconv_mon
-FUNC 64f8 14 4 __free_lconv_mon
+FUNC 1028 14 0 __free_lconv_mon
+FUNC 16f4 14 0 __free_lconv_mon
+FUNC 2040 14 0 __free_lconv_mon
+FUNC 2724 7 0 __free_lconv_mon
+FUNC 2788 7 0 __free_lconv_mon
+FUNC 2834 3 0 __free_lconv_mon
+FUNC 28f0 7 0 __free_lconv_mon
+FUNC 2b7c 7 0 __free_lconv_mon
+FUNC 3360 7 0 __free_lconv_mon
+FUNC 34d8 14 0 __free_lconv_mon
+FUNC 37cc 7 0 __free_lconv_mon
+FUNC 3bac 14 0 __free_lconv_mon
+FUNC 3ddc 14 0 __free_lconv_mon
+FUNC 4a80 7 0 __free_lconv_mon
+FUNC 4aa0 7 0 __free_lconv_mon
+FUNC 4b34 14 0 __free_lconv_mon
+FUNC 4dec 7 0 __free_lconv_mon
+FUNC 4e2c 14 0 __free_lconv_mon
+FUNC 4e5c 7 0 __free_lconv_mon
+FUNC 4efc 14 0 __free_lconv_mon
+FUNC 4f64 7 0 __free_lconv_mon
+FUNC 567c 7 0 __free_lconv_mon
+FUNC 58dc 16 0 __free_lconv_mon
+FUNC 594c 14 0 __free_lconv_mon
+FUNC 5b38 14 0 __free_lconv_mon
+FUNC 5cb4 7 0 __free_lconv_mon
+FUNC 6264 14 0 __free_lconv_mon
+FUNC 64f8 14 0 __free_lconv_mon
58dc 6 270 1685
58e2 10 271 1685
3bac 14 274 1685
@@ -3533,13 +3533,13 @@
2834 1 311 1685
4aa0 7 311 1685
2835 2 312 1685
-FUNC 1a0a ba c _VEC_memzero
+FUNC 1a0a ba 0 _VEC_memzero
FUNC 637c 10 0 __sse2_available_init
637c 0 30 4315
637c d 31 4315
6389 2 32 4315
638b 1 33 4315
-FUNC 1c38 103 c _VEC_memcpy
+FUNC 1c38 103 0 _VEC_memcpy
FUNC 6a38 2c 0 _alloca_probe_16
6a38 0 44 4274
6a38 1 46 4274
@@ -3603,7 +3603,7 @@
16a2 5 98 4276
16a7 2 99 4276
16a9 2 100 4276
-FUNC 5be0 46 8 strcspn
+FUNC 5be0 46 0 strcspn
5be0 4 191 2794
5be4 2 198 2794
5be6 1 199 2794
@@ -3633,7 +3633,7 @@
5c1e 2 255 2794
5c20 3 257 2794
5c23 3 259 2794
-FUNC 1bcb 40 8 strpbrk
+FUNC 1bcb 40 0 strpbrk
1bcb 4 191 2794
1bcf 2 198 2794
1bd1 1 199 2794
@@ -3661,7 +3661,7 @@
1c02 3 248 2794
1c05 3 257 2794
1c08 3 259 2794
-FUNC 3bc0 61 c __ascii_strnicmp
+FUNC 3bc0 61 0 __ascii_strnicmp
3bc0 6 69 2798
3bc6 3 75 2798
3bc9 2 76 2798
@@ -3701,6 +3701,7 @@
3c18 2 135 2798
3c1a 2 138 2798
3c1c 5 140 2798
+PUBLIC 2140 10 RtlUnwind
STACK WIN 4 2cec 54 6 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 4b70 a 3 0 0 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 25a8 21 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
diff --git a/src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym b/src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym
index 04fea86..78da393 100644
--- a/src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym
+++ b/src/tools/windows/dump_syms/testdata/omap_reorder_funcs.sym
@@ -1,5 +1,4 @@
MODULE windows x86 11F7284EDE764667AA5234B0E7B07EEF1 omap_reorder_funcs.pdb
-INFO CODE_ID 517C17D7E000 omap_reorder_funcs.exe
FILE 1 c:\src\breakpad\src\src\tools\windows\dump_syms\testdata\dump_syms_regtest.cc
FILE 2 f:\dd\public\sdk\inc\internal\pebteb.h
FILE 3 f:\dd\public\sdk\inc\internal\ntldr.h
@@ -282,7 +281,7 @@
FILE 4643 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\rtc\initsect.cpp
FILE 4664 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcapi.h
FILE 4680 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcpriv.h
-FUNC 41e2 54 8 main
+FUNC 41e2 54 0 main
41e2 6 57 1
41e8 8 58 1
41f0 e 59 1
@@ -299,13 +298,13 @@
2b6a 21 37 1
FUNC 30dd 14 0 google_breakpad::C::~C()
30dd 14 38 1
-FUNC 21f6 16 8 google_breakpad::C::set_member(int)
+FUNC 21f6 16 0 google_breakpad::C::set_member(int)
21f6 16 40 1
FUNC 22e9 1e 0 google_breakpad::C::f()
22e9 1e 43 1
FUNC 2895 10 0 google_breakpad::C::g()
2895 10 44 1
-FUNC 308e 7 4 google_breakpad::C::h(google_breakpad::C const &)
+FUNC 308e 7 0 google_breakpad::C::h(google_breakpad::C const &)
308e 7 45 1
FUNC 13a0 2c 0 google_breakpad::C::`scalar deleting destructor'(unsigned int)
FUNC 205a 10 0 type_info::~type_info()
@@ -313,11 +312,11 @@
205c d 50 4531
2069 1 51 4531
FUNC 1445 21 0 type_info::`scalar deleting destructor'(unsigned int)
-FUNC 2307 b 4 operator delete(void *)
+FUNC 2307 b 0 operator delete(void *)
2307 5 20 2875
230c 1 24 2875
230d 5 23 2875
-FUNC 3238 29 4 fast_error_exit
+FUNC 3238 29 0 fast_error_exit
3238 5 326 4250
323d 9 335 4250
3246 5 337 4250
@@ -364,7 +363,7 @@
2104 0 179 4250
2104 5 186 4250
2109 5 188 4250
-FUNC 5330 70 4 type_info::_Type_info_dtor(type_info *)
+FUNC 5330 70 0 type_info::_Type_info_dtor(type_info *)
5330 c 62 4473
533c 8 63 4473
5344 4 64 4473
@@ -381,7 +380,7 @@
5393 2 83 4473
5395 2 72 4473
5397 9 104 4473
-FUNC 2f6b 88 8 strcmp
+FUNC 2f6b 88 0 strcmp
2f6b 0 65 2791
2f6b 4 73 2791
2f6f 4 74 2791
@@ -436,14 +435,14 @@
2fec 2 148 2791
2fee 3 149 2791
2ff1 2 150 2791
-FUNC 2b8b 3a 4 free
+FUNC 2b8b 3a 0 free
2b8b 5 40 389
2b90 6 45 389
2b96 11 50 389
2ba7 4 51 389
2bab 18 53 389
2bc3 2 55 389
-FUNC 23da 42 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 23da 42 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
23da 5 67 4397
23df 32 68 4397
2411 5 69 4397
@@ -454,7 +453,7 @@
283a b 89 4397
2845 2 90 4397
2847 1 91 4397
-FUNC 18d9 2b 4 __crtCorExitProcess
+FUNC 18d9 2b 0 __crtCorExitProcess
18d9 5 675 4186
18de b 679 4186
18e9 4 680 4186
@@ -462,7 +461,7 @@
18f9 4 682 4186
18fd 5 683 4186
1902 2 693 4186
-FUNC 5175 18 4 __crtExitProcess
+FUNC 5175 18 0 __crtExitProcess
5175 5 698 4186
517a 9 699 4186
5183 a 708 4186
@@ -484,7 +483,7 @@
1fc2 6 816 4186
1fc8 a 817 4186
1fd2 1 818 4186
-FUNC 5043 24 8 _initterm_e
+FUNC 5043 24 0 _initterm_e
5043 6 908 4186
5049 b 917 4186
5054 6 922 4186
@@ -492,7 +491,7 @@
505c 3 924 4186
505f 6 917 4186
5065 2 928 4186
-FUNC 147f 97 4 _cinit
+FUNC 147f 97 0 _cinit
147f 5 258 4186
1484 18 268 4186
149c a 270 4186
@@ -506,7 +505,7 @@
1506 c 303 4186
1512 2 307 4186
1514 2 308 4186
-FUNC 4504 140 c doexit
+FUNC 4504 140 0 doexit
4504 c 489 4186
4510 8 507 4186
4518 4 508 4186
@@ -541,11 +540,11 @@
462f 6 609 4186
4635 9 610 4186
463e 6 622 4186
-FUNC 315a 16 4 exit
+FUNC 315a 16 0 exit
315a 5 392 4186
315f f 393 4186
316e 2 394 4186
-FUNC 1778 16 4 _exit
+FUNC 1778 16 0 _exit
1778 5 400 4186
177d f 401 4186
178c 2 402 4186
@@ -557,12 +556,12 @@
405e 0 414 4186
405e e 415 4186
406c 1 416 4186
-FUNC 2abf 1e 4 _amsg_exit
+FUNC 2abf 1e 0 _amsg_exit
2abf 5 439 4186
2ac4 5 440 4186
2ac9 9 441 4186
2ad2 b 442 4186
-FUNC 424c 26 4 _GET_RTERRMSG
+FUNC 424c 26 0 _GET_RTERRMSG
424c 5 165 4012
4251 2 168 4012
4253 c 169 4012
@@ -571,7 +570,7 @@
4267 2 173 4012
4269 7 170 4012
4270 2 173 4012
-FUNC 268b 1af 4 _NMSG_WRITE
+FUNC 268b 1af 0 _NMSG_WRITE
268b 1b 196 4012
26a6 8 197 4012
26ae 11 199 4012
@@ -601,7 +600,7 @@
21df a 140 4012
21e9 c 141 4012
21f5 1 143 4012
-FUNC 3ed7 14a 8 _XcptFilter
+FUNC 3ed7 14a 0 _XcptFilter
3ed7 6 195 2369
3edd 7 202 2369
3ee4 8 203 2369
@@ -676,7 +675,7 @@
261f 7 130 3838
2626 5 131 3838
262b d 133 3838
-FUNC 54b7 19a c parse_cmdline
+FUNC 54b7 19a 0 parse_cmdline
54b7 6 221 3891
54bd 9 229 3891
54c6 2 232 3891
@@ -868,7 +867,7 @@
404b 7 343 3774
4052 7 344 3774
4059 5 352 3774
-FUNC 53a0 b4 8 _initptd
+FUNC 53a0 b4 0 _initptd
53a0 c 379 3774
53ac b 381 3774
53b7 a 384 3774
@@ -990,7 +989,7 @@
254c 1 60 453
FUNC 1c7a 45 0 _SEH_prolog4
FUNC 1cbf 14 0 _SEH_epilog4
-FUNC 1aeb 18f 10 _except_handler4
+FUNC 1aeb 18f 0 _except_handler4
FUNC 2ff3 9b 0 __security_init_cookie
2ff3 8 97 1455
2ffb 21 114 1455
@@ -1010,11 +1009,11 @@
307b 6 172 1455
3081 b 173 1455
308c 2 175 1455
-FUNC 1214 f 4 _initp_misc_invarg
+FUNC 1214 f 0 _initp_misc_invarg
1214 5 64 3583
1219 8 65 3583
1221 2 66 3583
-FUNC 4afb 129 c _call_reportfault
+FUNC 4afb 129 0 _call_reportfault
4afb 16 164 3583
4b11 9 166 3583
4b1a 7 167 3583
@@ -1046,12 +1045,12 @@
4c02 d 254 3583
4c0f 7 255 3583
4c16 e 257 3583
-FUNC 5150 25 14 _invoke_watson
+FUNC 5150 25 0 _invoke_watson
5150 3 146 3583
5153 12 155 3583
5165 f 156 3583
5174 1 157 3583
-FUNC 3261 2d 14 _invalid_parameter
+FUNC 3261 2d 0 _invalid_parameter
3261 5 96 3583
3266 c 103 3583
3272 4 104 3583
@@ -1085,11 +1084,11 @@
4daf 3 220 3954
4db2 b 214 3954
4dbd 3 223 3954
-FUNC 2add 17 4 _unlock
+FUNC 2add 17 0 _unlock
2add 5 370 3954
2ae2 10 374 3954
2af2 2 375 3954
-FUNC 12b8 c2 4 _mtinitlocknum
+FUNC 12b8 c2 0 _mtinitlocknum
12b8 c 258 3954
12c4 6 260 3954
12ca a 268 3954
@@ -1116,14 +1115,14 @@
1368 3 303 3954
136b 6 304 3954
1371 9 300 3954
-FUNC 31f6 33 4 _lock
+FUNC 31f6 33 0 _lock
31f6 5 332 3954
31fb 10 337 3954
320b b 339 3954
3216 8 340 3954
321e 9 347 3954
3227 2 348 3954
-FUNC 2a1e 5f c strcpy_s
+FUNC 2a1e 5f 0 strcpy_s
2a1e 5 13 2523
2a23 23 18 2523
2a46 b 19 2523
@@ -1133,7 +1132,7 @@
2a69 e 30 2523
2a77 4 33 2523
2a7b 2 34 2523
-FUNC 4eba 8b 4 strlen
+FUNC 4eba 8b 0 strlen
4eba 0 54 2796
4eba 4 63 2796
4ebe 6 64 2796
@@ -1179,7 +1178,7 @@
4f3e 4 119 2796
4f42 2 120 2796
4f44 1 121 2796
-FUNC 2312 94 4 malloc
+FUNC 2312 94 0 malloc
2312 6 81 504
2318 a 85 504
2322 3d 89 504
@@ -1201,7 +1200,7 @@
FUNC 44bb 19 0 _EH4_TransferToHandler
FUNC 44d4 19 0 _EH4_GlobalUnwind2
FUNC 44ed 17 8 _EH4_LocalUnwind
-FUNC 2a7d 42 4 _get_errno_from_oserr
+FUNC 2a7d 42 0 _get_errno_from_oserr
2a7d 5 119 224
2a82 5 123 224
2a87 9 124 224
@@ -1232,18 +1231,18 @@
31e4 7 106 4591
31eb 5 114 4591
31f0 6 115 4591
-FUNC 43a1 11 4 _initp_eh_hooks
+FUNC 43a1 11 0 _initp_eh_hooks
43a1 0 69 4591
43a1 10 70 4591
43b1 1 71 4591
-FUNC 215a 1e 4 _initp_misc_winsig
+FUNC 215a 1e 0 _initp_misc_winsig
215a 5 57 2311
215f 8 58 2311
2167 5 59 2311
216c 5 60 2311
2171 5 61 2311
2176 2 62 2311
-FUNC 24f8 37 4 siglookup
+FUNC 24f8 37 0 siglookup
24f8 5 629 2311
24fd a 630 2311
2507 14 639 2311
@@ -1255,7 +1254,7 @@
48e3 0 669 2311
48e3 c 670 2311
48ef 1 671 2311
-FUNC 518d 1a3 4 raise
+FUNC 518d 1a3 0 raise
518d c 450 2311
5199 5 457 2311
519e 3 458 2311
@@ -1309,19 +1308,19 @@
5322 6 600 2311
5328 2 603 2311
532a 6 604 2311
-FUNC 254d f 4 _initp_misc_rand_s
+FUNC 254d f 0 _initp_misc_rand_s
254d 5 58 2186
2552 8 59 2186
255a 2 60 2186
-FUNC 37b7 f 4 _initp_misc_purevirt
+FUNC 37b7 f 0 _initp_misc_purevirt
37b7 5 179 1627
37bc 8 180 1627
37c4 2 181 1627
-FUNC 24e9 f 4 _initp_heap_handler
+FUNC 24e9 f 0 _initp_heap_handler
24e9 5 31 2820
24ee 8 32 2820
24f6 2 33 2820
-FUNC 4644 28 4 _callnewh
+FUNC 4644 28 0 _callnewh
4644 5 131 2820
4649 c 133 2820
4655 e 135 2820
@@ -1329,7 +1328,7 @@
4666 2 139 2820
4668 2 136 2820
466a 2 139 2820
-FUNC 4c24 b6 4 _onexit_nolock
+FUNC 4c24 b6 0 _onexit_nolock
4c24 8 100 1969
4c2c f 103 1969
4c3b f 104 1969
@@ -1356,7 +1355,7 @@
120d 3 214 1969
1210 3 216 1969
1213 1 217 1969
-FUNC 5114 3c 4 _onexit
+FUNC 5114 3c 0 _onexit
5114 c 81 1969
5120 5 84 1969
5125 4 86 1969
@@ -1365,7 +1364,7 @@
5141 3 93 1969
5144 6 94 1969
514a 6 90 1969
-FUNC 3ec0 17 4 atexit
+FUNC 3ec0 17 0 atexit
3ec0 5 161 1969
3ec5 10 162 1969
3ed5 2 163 1969
@@ -1374,7 +1373,7 @@
28a9 2 56 2419
28ab 1a 58 2419
28c5 3 60 2419
-FUNC 30a8 35 4 _ValidateImageBase
+FUNC 30a8 35 0 _ValidateImageBase
30a8 5 44 2079
30ad d 50 2079
30ba 2 52 2079
@@ -1384,7 +1383,7 @@
30c9 2 58 2079
30cb 10 62 2079
30db 2 68 2079
-FUNC 32a9 44 8 _FindPESection
+FUNC 32a9 44 0 _FindPESection
32a9 5 92 2079
32ae 8 99 2079
32b6 18 108 2079
@@ -1392,7 +1391,7 @@
32de 8 108 2079
32e6 5 123 2079
32eb 2 124 2079
-FUNC 5651 bc 4 _IsNonwritableInCurrentImage
+FUNC 5651 bc 0 _IsNonwritableInCurrentImage
5651 35 149 2079
5686 7 156 2079
568d f 164 2079
@@ -1406,7 +1405,7 @@
56dc 16 187 2079
56f2 9 193 2079
56fb 12 195 2079
-FUNC 4076 16c c __crtMessageBoxW
+FUNC 4076 16c 0 __crtMessageBoxW
4076 12 41 1053
4088 14 49 1053
409c 4 56 1053
@@ -1443,7 +1442,7 @@
41c1 10 158 1053
41d1 2 163 1053
41d3 f 166 1053
-FUNC 3943 75 c wcscat_s
+FUNC 3943 75 0 wcscat_s
3943 6 13 2468
3949 22 18 2468
396b 2 46 2468
@@ -1457,7 +1456,7 @@
398d 14 35 2468
39a1 9 41 2468
39aa e 42 2468
-FUNC 241c cd 10 wcsncpy_s
+FUNC 241c cd 0 wcsncpy_s
241c 5 13 2578
2421 16 17 2578
2437 5 65 2578
@@ -1479,13 +1478,13 @@
24c8 d 59 2578
24d5 3 61 2578
24d8 11 62 2578
-FUNC 328e 1b 4 wcslen
+FUNC 328e 1b 0 wcslen
328e 5 41 2728
3293 3 42 2728
3296 b 44 2728
32a1 6 46 2728
32a7 2 47 2728
-FUNC 5454 63 c wcscpy_s
+FUNC 5454 63 0 wcscpy_s
5454 6 13 2523
545a 22 18 2523
547c 2 34 2523
@@ -1493,7 +1492,7 @@
548a 16 23 2523
54a0 9 29 2523
54a9 e 30 2523
-FUNC 3d3b 3f 4 _set_error_mode
+FUNC 3d3b 3f 0 _set_error_mode
3d3b 5 43 1181
3d40 11 46 1181
3d51 5 54 1181
@@ -1509,7 +1508,7 @@
28ce 2 56 892
28d0 2 57 892
28d2 5 59 892
-FUNC 2178 45 4 _malloc_crt
+FUNC 2178 45 0 _malloc_crt
2178 7 39 333
217f 2 40 333
2181 b 44 333
@@ -1518,7 +1517,7 @@
21b2 5 47 333
21b7 4 50 333
21bb 2 51 333
-FUNC 210e 4c 8 _calloc_crt
+FUNC 210e 4c 0 _calloc_crt
210e 7 54 333
2115 2 55 333
2117 12 61 333
@@ -1527,7 +1526,7 @@
214f 5 64 333
2154 4 67 333
2158 2 68 333
-FUNC 4e39 4e 8 _realloc_crt
+FUNC 4e39 4e 0 _realloc_crt
4e39 7 71 333
4e40 2 72 333
4e42 f 76 333
@@ -1610,7 +1609,7 @@
3e06 7 524 3326
3e0d 11 527 3326
3e1e 9 529 3326
-FUNC 48f9 87 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 48f9 87 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
48f9 5 240 111
48fe e 241 111
490c 8 243 111
@@ -1638,7 +1637,7 @@
113e 12 305 3326
1150 f 308 3326
115f 2 309 3326
-FUNC 3b52 1e9 8 _setmbcp_nolock
+FUNC 3b52 1e9 0 _setmbcp_nolock
3b52 17 684 3326
3b69 b 691 3326
3b74 9 694 3326
@@ -1681,7 +1680,7 @@
3d23 6 795 3326
3d29 3 744 3326
3d2c f 800 3326
-FUNC 39b8 19a 4 _setmbcp
+FUNC 39b8 19a 0 _setmbcp
39b8 c 572 3326
39c4 4 573 3326
39c8 a 577 3326
@@ -1735,17 +1734,17 @@
1ce4 a 853 3326
1cee 2 858 3326
1cf0 1 859 3326
-FUNC 2638 53 10 x_ismbbtype_l
+FUNC 2638 53 0 x_ismbbtype_l
2638 8 213 3271
2640 b 214 3271
264b 4 219 3271
264f 3a 222 3271
2689 2 223 3271
-FUNC 1516 18 4 _ismbblead
+FUNC 1516 18 0 _ismbblead
1516 5 171 3271
151b 11 172 3271
152c 2 173 3271
-FUNC 4cda 8f 4 __addlocaleref
+FUNC 4cda 8f 0 __addlocaleref
4cda 7 36 1913
4ce1 d 39 1913
4cee a 41 1913
@@ -1764,7 +1763,7 @@
4d4e 8 53 1913
4d56 11 63 1913
4d67 2 64 1913
-FUNC 3e27 99 4 __removelocaleref
+FUNC 3e27 99 0 __removelocaleref
3e27 6 74 1913
3e2d b 77 1913
3e38 b 79 1913
@@ -1785,7 +1784,7 @@
3eab 10 103 1913
3ebb 3 106 1913
3ebe 2 107 1913
-FUNC 178e 14b 4 __freetlocinfo
+FUNC 178e 14b 0 __freetlocinfo
178e 7 129 1913
1795 25 137 1913
17ba e 140 1913
@@ -1812,7 +1811,7 @@
18c5 8 179 1913
18cd a 201 1913
18d7 2 202 1913
-FUNC 3170 4d 8 _updatetlocinfoEx_nolock
+FUNC 3170 4d 0 _updatetlocinfoEx_nolock
3170 6 216 1913
3176 e 219 1913
3184 3 222 1913
@@ -1840,11 +1839,11 @@
4e1f e 292 1913
4e2d 8 294 1913
4e35 4 295 1913
-FUNC 344e 8 4 _crt_debugger_hook
+FUNC 344e 8 0 _crt_debugger_hook
344e 0 62 1145
344e 7 65 1145
3455 1 66 1145
-FUNC 208a 7a c memset
+FUNC 208a 7a 0 memset
208a 0 59 2789
208a 4 68 2789
208e 4 69 2789
@@ -1970,7 +1969,7 @@
2873 9 81 1011
287c 11 83 1011
288d 8 92 1011
-FUNC 3456 361 c memcpy
+FUNC 3456 361 0 memcpy
3456 3 101 2787
3459 1 113 2787
345a 1 114 2787
@@ -2206,14 +2205,14 @@
37b3 1 593 2787
37b4 1 594 2787
37b5 2 595 2787
-FUNC 206a 20 4 _freea
+FUNC 206a 20 0 _freea
206a 5 235 281
206f 7 237 281
2076 3 239 281
2079 8 241 281
2081 7 243 281
2088 2 252 281
-FUNC 4e87 33 4 _msize
+FUNC 4e87 33 0 _msize
4e87 5 39 561
4e8c 19 43 561
4ea5 2 50 561
@@ -2260,7 +2259,7 @@
175c 8 315 1392
1764 12 319 1392
1776 2 320 1392
-FUNC 1161 82 c _calloc_impl
+FUNC 1161 82 0 _calloc_impl
1161 5 21 291
1166 7 26 291
116d 19 28 291
@@ -2279,7 +2278,7 @@
11d3 7 52 291
11da 7 53 291
11e1 2 69 291
-FUNC 5067 ad 8 realloc
+FUNC 5067 ad 0 realloc
5067 5 62 618
506c 6 67 618
5072 9 68 618
@@ -2302,7 +2301,7 @@
50f8 2 112 618
50fa 16 103 618
5110 4 105 618
-FUNC 1904 1e7 24 __crtLCMapStringA_stat
+FUNC 1904 1e7 0 __crtLCMapStringA_stat
1904 12 96 3447
1916 c 101 3447
1922 17 102 3447
@@ -2334,12 +2333,12 @@
1acd 8 242 3447
1ad5 4 244 3447
1ad9 12 245 3447
-FUNC 22a3 46 24 __crtLCMapStringA
+FUNC 22a3 46 0 __crtLCMapStringA
22a3 8 258 3447
22ab b 259 3447
22b6 31 271 3447
22e7 2 272 3447
-FUNC 47fc e7 20 __crtGetStringTypeA_stat
+FUNC 47fc e7 0 __crtGetStringTypeA_stat
47fc 12 63 3507
480e 7 67 3507
4815 5 83 3507
@@ -2355,12 +2354,12 @@
48c7 6 118 3507
48cd 4 120 3507
48d1 12 121 3507
-FUNC 152e 40 20 __crtGetStringTypeA
+FUNC 152e 40 0 __crtGetStringTypeA
152e 8 133 3507
1536 b 134 3507
1541 2b 145 3507
156c 2 146 3507
-FUNC 2bf4 377 4 __free_lc_time
+FUNC 2bf4 377 0 __free_lc_time
2bf4 6 228 1800
2bfa b 229 1800
2c05 8 232 1800
@@ -2450,7 +2449,7 @@
2f4f b 328 1800
2f5a f 329 1800
2f69 2 332 1800
-FUNC 30f1 69 4 __free_lconv_num
+FUNC 30f1 69 0 __free_lconv_num
30f1 6 218 1742
30f7 7 219 1742
30fe a 222 1742
@@ -2464,7 +2463,7 @@
3145 b 234 1742
3150 8 235 1742
3158 2 236 1742
-FUNC 4f45 fe 4 __free_lconv_mon
+FUNC 4f45 fe 0 __free_lconv_mon
4f45 6 270 1685
4f4b b 271 1685
4f56 b 274 1685
@@ -2494,13 +2493,13 @@
502e b 310 1685
5039 8 311 1685
5041 2 312 1685
-FUNC 1000 ba c _VEC_memzero
+FUNC 1000 ba 0 _VEC_memzero
FUNC 2a0e 10 0 __sse2_available_init
2a0e 0 30 4315
2a0e d 31 4315
2a1b 2 32 4315
2a1d 1 33 4315
-FUNC 3840 103 c _VEC_memcpy
+FUNC 3840 103 0 _VEC_memcpy
FUNC 2b3e 2c 0 _alloca_probe_16
2b3e 0 44 4274
2b3e 1 46 4274
@@ -2564,7 +2563,7 @@
10dc 5 98 4276
10e1 2 99 4276
10e3 2 100 4276
-FUNC 37c6 46 8 strcspn
+FUNC 37c6 46 0 strcspn
37c6 4 191 2794
37ca 2 198 2794
37cc 1 199 2794
@@ -2594,7 +2593,7 @@
3804 2 255 2794
3806 3 257 2794
3809 3 259 2794
-FUNC 1577 40 8 strpbrk
+FUNC 1577 40 0 strpbrk
1577 4 191 2794
157b 2 198 2794
157d 1 199 2794
@@ -2622,7 +2621,7 @@
15ae 3 248 2794
15b1 3 257 2794
15b4 3 259 2794
-FUNC 1fd3 61 c __ascii_strnicmp
+FUNC 1fd3 61 0 __ascii_strnicmp
1fd3 6 69 2798
1fd9 3 75 2798
1fdc 2 76 2798
@@ -2662,6 +2661,7 @@
202b 2 135 2798
202d 2 138 2798
202f 5 140 2798
+PUBLIC 1cf1 10 RtlUnwind
STACK WIN 4 41e2 54 6 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 4242 a 3 0 0 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 2b6a 21 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
diff --git a/src/tools/windows/dump_syms/testdata/omap_stretched.sym b/src/tools/windows/dump_syms/testdata/omap_stretched.sym
index b4603fc..ea85854 100644
--- a/src/tools/windows/dump_syms/testdata/omap_stretched.sym
+++ b/src/tools/windows/dump_syms/testdata/omap_stretched.sym
@@ -1,5 +1,4 @@
MODULE windows x86 ABDA3C53D8074326AA40F41DD53824571 omap_stretched.pdb
-INFO CODE_ID 517C17D7F000 omap_stretched.exe
FILE 1 c:\src\breakpad\src\src\tools\windows\dump_syms\testdata\dump_syms_regtest.cc
FILE 2 f:\dd\public\sdk\inc\internal\pebteb.h
FILE 3 f:\dd\public\sdk\inc\internal\ntldr.h
@@ -282,7 +281,7 @@
FILE 4643 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\rtc\initsect.cpp
FILE 4664 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcapi.h
FILE 4680 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcpriv.h
-FUNC 1000 54 8 main
+FUNC 1000 54 0 main
1000 6 57 1
1006 8 58 1
100e e 59 1
@@ -299,8 +298,8 @@
106a 35 37 1
FUNC 109f 1e 0 google_breakpad::C::~C()
109f 1e 38 1
-FUNC 10bd d 8 google_breakpad::C::set_member(int)
-FUNC 10d4 9 8 google_breakpad::C::set_member(int)
+FUNC 10bd d 0 google_breakpad::C::set_member(int)
+FUNC 10d4 9 0 google_breakpad::C::set_member(int)
10bd d 40 1
10d4 9 40 1
FUNC 10dd 2b 0 google_breakpad::C::f()
@@ -309,7 +308,7 @@
1112 7 43 1
FUNC 1119 10 0 google_breakpad::C::g()
1119 10 44 1
-FUNC 1129 7 4 google_breakpad::C::h(google_breakpad::C const &)
+FUNC 1129 7 0 google_breakpad::C::h(google_breakpad::C const &)
1129 7 45 1
FUNC 1130 2c 0 google_breakpad::C::`scalar deleting destructor'(unsigned int)
FUNC 115c 1a 0 type_info::~type_info()
@@ -317,11 +316,11 @@
115e 17 50 4531
1175 1 51 4531
FUNC 1176 21 0 type_info::`scalar deleting destructor'(unsigned int)
-FUNC 1197 b 4 operator delete(void *)
+FUNC 1197 b 0 operator delete(void *)
1197 5 20 2875
119c 1 24 2875
119d 5 23 2875
-FUNC 11a2 29 4 fast_error_exit
+FUNC 11a2 29 0 fast_error_exit
11a2 5 326 4250
11a7 9 335 4250
11b0 5 337 4250
@@ -368,7 +367,7 @@
132c 0 179 4250
132c 5 186 4250
1331 5 188 4250
-FUNC 1336 70 4 type_info::_Type_info_dtor(type_info *)
+FUNC 1336 70 0 type_info::_Type_info_dtor(type_info *)
1336 c 62 4473
1342 8 63 4473
134a 4 64 4473
@@ -385,7 +384,7 @@
1399 2 83 4473
139b 2 72 4473
139d 9 104 4473
-FUNC 13a6 88 8 strcmp
+FUNC 13a6 88 0 strcmp
13a6 0 65 2791
13a6 4 73 2791
13aa 4 74 2791
@@ -440,8 +439,8 @@
1427 2 148 2791
1429 3 149 2791
142c 2 150 2791
-FUNC 142e 35 4 free
-FUNC 146d 5 4 free
+FUNC 142e 35 0 free
+FUNC 146d 5 0 free
142e 5 40 389
1433 6 45 389
1439 11 50 389
@@ -449,7 +448,7 @@
144e 15 53 389
146d 3 53 389
1470 2 55 389
-FUNC 1472 6a 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 1472 6a 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
1472 5 67 4397
1477 5a 68 4397
14d1 5 69 4397
@@ -460,7 +459,7 @@
14dc b 89 4397
14e7 2 90 4397
14e9 1 91 4397
-FUNC 14ea 2b 4 __crtCorExitProcess
+FUNC 14ea 2b 0 __crtCorExitProcess
14ea 5 675 4186
14ef b 679 4186
14fa 4 680 4186
@@ -468,7 +467,7 @@
150a 4 682 4186
150e 5 683 4186
1513 2 693 4186
-FUNC 1515 18 4 __crtExitProcess
+FUNC 1515 18 0 __crtExitProcess
1515 5 698 4186
151a 9 699 4186
1523 a 708 4186
@@ -490,7 +489,7 @@
1561 6 816 4186
1567 a 817 4186
1571 1 818 4186
-FUNC 1572 2e 8 _initterm_e
+FUNC 1572 2e 0 _initterm_e
1572 6 908 4186
1578 b 917 4186
158d 6 922 4186
@@ -498,7 +497,7 @@
1595 3 924 4186
1598 6 917 4186
159e 2 928 4186
-FUNC 15a0 a1 4 _cinit
+FUNC 15a0 a1 0 _cinit
15a0 5 258 4186
15a5 18 268 4186
15bd a 270 4186
@@ -512,7 +511,7 @@
1631 c 303 4186
163d 2 307 4186
163f 2 308 4186
-FUNC 1641 140 c doexit
+FUNC 1641 140 0 doexit
1641 c 489 4186
164d 8 507 4186
1655 4 508 4186
@@ -547,11 +546,11 @@
176c 6 609 4186
1772 9 610 4186
177b 6 622 4186
-FUNC 1781 16 4 exit
+FUNC 1781 16 0 exit
1781 5 392 4186
1786 f 393 4186
1795 2 394 4186
-FUNC 1797 16 4 _exit
+FUNC 1797 16 0 _exit
1797 5 400 4186
179c f 401 4186
17ab 2 402 4186
@@ -563,12 +562,12 @@
17bc 0 414 4186
17bc e 415 4186
17ca 1 416 4186
-FUNC 17cb 1e 4 _amsg_exit
+FUNC 17cb 1e 0 _amsg_exit
17cb 5 439 4186
17d0 5 440 4186
17d5 9 441 4186
17de b 442 4186
-FUNC 17e9 26 4 _GET_RTERRMSG
+FUNC 17e9 26 0 _GET_RTERRMSG
17e9 5 165 4012
17ee 2 168 4012
17f0 c 169 4012
@@ -577,7 +576,7 @@
1804 2 173 4012
1806 7 170 4012
180d 2 173 4012
-FUNC 180f 1c5 4 _NMSG_WRITE
+FUNC 180f 1c5 0 _NMSG_WRITE
180f 1b 196 4012
182a 8 197 4012
1832 11 199 4012
@@ -607,7 +606,7 @@
19f6 a 140 4012
1a00 c 141 4012
1a0c 1 143 4012
-FUNC 1a0d 251 8 _XcptFilter
+FUNC 1a0d 251 0 _XcptFilter
1a0d 6 195 2369
1a13 7 202 2369
1a1a 8 203 2369
@@ -685,9 +684,9 @@
1d21 7 130 3838
1d28 5 131 3838
1d2d d 133 3838
-FUNC 1d3a 2ee c parse_cmdline
-FUNC 2032 3 c parse_cmdline
-FUNC 203f 4 c parse_cmdline
+FUNC 1d3a 2ee 0 parse_cmdline
+FUNC 2032 3 0 parse_cmdline
+FUNC 203f 4 0 parse_cmdline
1d3a 6 221 3891
1d40 7 229 3891
1d51 2 229 3891
@@ -900,7 +899,7 @@
2642 7 343 3774
2649 7 344 3774
2650 5 352 3774
-FUNC 2655 b4 8 _initptd
+FUNC 2655 b4 0 _initptd
2655 c 379 3774
2661 b 381 3774
266c a 384 3774
@@ -1024,7 +1023,7 @@
2a8b 1 60 453
FUNC 2a8c 45 0 _SEH_prolog4
FUNC 2ad1 14 0 _SEH_epilog4
-FUNC 2ae5 2c4 10 _except_handler4
+FUNC 2ae5 2c4 0 _except_handler4
FUNC 2da9 9b 0 __security_init_cookie
2da9 8 97 1455
2db1 21 114 1455
@@ -1044,11 +1043,11 @@
2e31 6 172 1455
2e37 b 173 1455
2e42 2 175 1455
-FUNC 2e44 f 4 _initp_misc_invarg
+FUNC 2e44 f 0 _initp_misc_invarg
2e44 5 64 3583
2e49 8 65 3583
2e51 2 66 3583
-FUNC 2e53 129 c _call_reportfault
+FUNC 2e53 129 0 _call_reportfault
2e53 16 164 3583
2e69 9 166 3583
2e72 7 167 3583
@@ -1080,12 +1079,12 @@
2f5a d 254 3583
2f67 7 255 3583
2f6e e 257 3583
-FUNC 2f7c 25 14 _invoke_watson
+FUNC 2f7c 25 0 _invoke_watson
2f7c 3 146 3583
2f7f 12 155 3583
2f91 f 156 3583
2fa0 1 157 3583
-FUNC 2fa1 2d 14 _invalid_parameter
+FUNC 2fa1 2d 0 _invalid_parameter
2fa1 5 96 3583
2fa6 c 103 3583
2fb2 4 104 3583
@@ -1122,11 +1121,11 @@
30b4 3 220 3954
30b7 b 214 3954
30c2 3 223 3954
-FUNC 30c5 17 4 _unlock
+FUNC 30c5 17 0 _unlock
30c5 5 370 3954
30ca 10 374 3954
30da 2 375 3954
-FUNC 30dc c2 4 _mtinitlocknum
+FUNC 30dc c2 0 _mtinitlocknum
30dc c 258 3954
30e8 6 260 3954
30ee a 268 3954
@@ -1153,7 +1152,7 @@
318c 3 303 3954
318f 6 304 3954
3195 9 300 3954
-FUNC 319e 47 4 _lock
+FUNC 319e 47 0 _lock
319e 5 332 3954
31a3 b 337 3954
31b8 5 337 3954
@@ -1161,7 +1160,7 @@
31c8 8 340 3954
31da 9 347 3954
31e3 2 348 3954
-FUNC 31e5 9c c strcpy_s
+FUNC 31e5 9c 0 strcpy_s
31e5 5 13 2523
31ea 2d 18 2523
3217 7 19 2523
@@ -1173,7 +1172,7 @@
3275 6 30 2523
327b 4 33 2523
327f 2 34 2523
-FUNC 3281 8b 4 strlen
+FUNC 3281 8b 0 strlen
3281 0 54 2796
3281 4 63 2796
3285 6 64 2796
@@ -1219,7 +1218,7 @@
3305 4 119 2796
3309 2 120 2796
330b 1 121 2796
-FUNC 330c b6 4 malloc
+FUNC 330c b6 0 malloc
330c 6 81 504
3312 e 85 504
3320 3d 89 504
@@ -1244,7 +1243,7 @@
FUNC 34cb 19 0 _EH4_TransferToHandler
FUNC 34e4 19 0 _EH4_GlobalUnwind2
FUNC 34fd 17 8 _EH4_LocalUnwind
-FUNC 3514 42 4 _get_errno_from_oserr
+FUNC 3514 42 0 _get_errno_from_oserr
3514 5 119 224
3519 5 123 224
351e 9 124 224
@@ -1275,19 +1274,19 @@
3590 7 106 4591
3597 5 114 4591
359c 6 115 4591
-FUNC 35a2 11 4 _initp_eh_hooks
+FUNC 35a2 11 0 _initp_eh_hooks
35a2 0 69 4591
35a2 10 70 4591
35b2 1 71 4591
-FUNC 35b3 1e 4 _initp_misc_winsig
+FUNC 35b3 1e 0 _initp_misc_winsig
35b3 5 57 2311
35b8 8 58 2311
35c0 5 59 2311
35c5 5 60 2311
35ca 5 61 2311
35cf 2 62 2311
-FUNC 35d1 38 4 siglookup
-FUNC 3613 9 4 siglookup
+FUNC 35d1 38 0 siglookup
+FUNC 3613 9 0 siglookup
35d1 5 629 2311
35d6 a 630 2311
35ea 14 639 2311
@@ -1300,7 +1299,7 @@
361c 0 669 2311
361c c 670 2311
3628 1 671 2311
-FUNC 3629 1a3 4 raise
+FUNC 3629 1a3 0 raise
3629 c 450 2311
3635 5 457 2311
363a 3 458 2311
@@ -1354,19 +1353,19 @@
37be 6 600 2311
37c4 2 603 2311
37c6 6 604 2311
-FUNC 37cc f 4 _initp_misc_rand_s
+FUNC 37cc f 0 _initp_misc_rand_s
37cc 5 58 2186
37d1 8 59 2186
37d9 2 60 2186
-FUNC 37db f 4 _initp_misc_purevirt
+FUNC 37db f 0 _initp_misc_purevirt
37db 5 179 1627
37e0 8 180 1627
37e8 2 181 1627
-FUNC 37ea f 4 _initp_heap_handler
+FUNC 37ea f 0 _initp_heap_handler
37ea 5 31 2820
37ef 8 32 2820
37f7 2 33 2820
-FUNC 37f9 28 4 _callnewh
+FUNC 37f9 28 0 _callnewh
37f9 5 131 2820
37fe c 133 2820
380a e 135 2820
@@ -1374,7 +1373,7 @@
381b 2 139 2820
381d 2 136 2820
381f 2 139 2820
-FUNC 3821 c0 4 _onexit_nolock
+FUNC 3821 c0 0 _onexit_nolock
3821 8 100 1969
3829 f 103 1969
3838 f 104 1969
@@ -1403,7 +1402,7 @@
3915 3 214 1969
3918 3 216 1969
391b 1 217 1969
-FUNC 391c 3c 4 _onexit
+FUNC 391c 3c 0 _onexit
391c c 81 1969
3928 5 84 1969
392d 4 86 1969
@@ -1412,7 +1411,7 @@
3949 3 93 1969
394c 6 94 1969
3952 6 90 1969
-FUNC 3958 17 4 atexit
+FUNC 3958 17 0 atexit
3958 5 161 1969
395d 10 162 1969
396d 2 163 1969
@@ -1421,7 +1420,7 @@
3973 2 56 2419
3975 1a 58 2419
398f 3 60 2419
-FUNC 3992 5d 4 _ValidateImageBase
+FUNC 3992 5d 0 _ValidateImageBase
3992 5 44 2079
3997 8 50 2079
39a9 5 50 2079
@@ -1433,7 +1432,7 @@
39d3 7 62 2079
39e4 9 62 2079
39ed 2 68 2079
-FUNC 39ef 76 8 _FindPESection
+FUNC 39ef 76 0 _FindPESection
39ef 5 92 2079
39f4 3 99 2079
3a01 5 99 2079
@@ -1443,7 +1442,7 @@
3a56 8 108 2079
3a5e 5 123 2079
3a63 2 124 2079
-FUNC 3a65 bc 4 _IsNonwritableInCurrentImage
+FUNC 3a65 bc 0 _IsNonwritableInCurrentImage
3a65 35 149 2079
3a9a 7 156 2079
3aa1 f 164 2079
@@ -1457,7 +1456,7 @@
3af0 16 187 2079
3b06 9 193 2079
3b0f 12 195 2079
-FUNC 3b21 16c c __crtMessageBoxW
+FUNC 3b21 16c 0 __crtMessageBoxW
3b21 12 41 1053
3b33 14 49 1053
3b47 4 56 1053
@@ -1494,8 +1493,8 @@
3c6c 10 158 1053
3c7c 2 163 1053
3c7e f 166 1053
-FUNC 3c8d ac c wcscat_s
-FUNC 3d43 9 c wcscat_s
+FUNC 3c8d ac 0 wcscat_s
+FUNC 3d43 9 0 wcscat_s
3c8d 6 13 2468
3c93 2c 18 2468
3cbf 2 46 2468
@@ -1512,8 +1511,8 @@
3d2e 3 41 2468
3d31 8 42 2468
3d43 9 42 2468
-FUNC 3d4c 12b 10 wcsncpy_s
-FUNC 3e81 9 10 wcsncpy_s
+FUNC 3d4c 12b 0 wcsncpy_s
+FUNC 3e81 9 0 wcsncpy_s
3d4c 5 13 2578
3d51 16 17 2578
3d67 5 65 2578
@@ -1539,14 +1538,14 @@
3e6c 3 61 2578
3e6f 8 62 2578
3e81 9 62 2578
-FUNC 3e8a 25 4 wcslen
+FUNC 3e8a 25 0 wcslen
3e8a 5 41 2728
3e8f 3 42 2728
3e9c b 44 2728
3ea7 6 46 2728
3ead 2 47 2728
-FUNC 3eaf 90 c wcscpy_s
-FUNC 3f49 6 c wcscpy_s
+FUNC 3eaf 90 0 wcscpy_s
+FUNC 3f49 6 0 wcscpy_s
3eaf 6 13 2523
3eb5 2c 18 2523
3ee1 2 34 2523
@@ -1557,7 +1556,7 @@
3f34 3 29 2523
3f37 8 30 2523
3f49 6 30 2523
-FUNC 3f4f 49 4 _set_error_mode
+FUNC 3f4f 49 0 _set_error_mode
3f4f 5 43 1181
3f54 11 46 1181
3f65 5 54 1181
@@ -1573,7 +1572,7 @@
3f9e 2 56 892
3fa0 2 57 892
3fa2 5 59 892
-FUNC 3fa7 45 4 _malloc_crt
+FUNC 3fa7 45 0 _malloc_crt
3fa7 7 39 333
3fae 2 40 333
3fb0 b 44 333
@@ -1582,7 +1581,7 @@
3fe1 5 47 333
3fe6 4 50 333
3fea 2 51 333
-FUNC 3fec 4c 8 _calloc_crt
+FUNC 3fec 4c 0 _calloc_crt
3fec 7 54 333
3ff3 2 55 333
3ff5 12 61 333
@@ -1591,7 +1590,7 @@
402d 5 64 333
4032 4 67 333
4036 2 68 333
-FUNC 4038 4e 8 _realloc_crt
+FUNC 4038 4e 0 _realloc_crt
4038 7 71 333
403f 2 72 333
4041 f 76 333
@@ -1683,7 +1682,7 @@
443c 7 524 3326
4443 11 527 3326
4454 9 529 3326
-FUNC 445d 15d 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 445d 15d 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
445d 5 240 111
4462 6 241 111
4472 c 241 111
@@ -1724,7 +1723,7 @@
4639 8 308 3326
464b 7 308 3326
4652 2 309 3326
-FUNC 4654 2d2 8 _setmbcp_nolock
+FUNC 4654 2d2 0 _setmbcp_nolock
4654 17 684 3326
466b b 691 3326
4676 9 694 3326
@@ -1775,7 +1774,7 @@
490e 6 795 3326
4914 3 744 3326
4917 f 800 3326
-FUNC 4926 19a 4 _setmbcp
+FUNC 4926 19a 0 _setmbcp
4926 c 572 3326
4932 4 573 3326
4936 a 577 3326
@@ -1829,19 +1828,19 @@
4ad1 a 853 3326
4adb 2 858 3326
4add 1 859 3326
-FUNC 4ade 70 10 x_ismbbtype_l
-FUNC 4b58 6 10 x_ismbbtype_l
+FUNC 4ade 70 0 x_ismbbtype_l
+FUNC 4b58 6 0 x_ismbbtype_l
4ade 8 213 3271
4ae6 b 214 3271
4af1 4 219 3271
4af5 59 222 3271
4b58 4 222 3271
4b5c 2 223 3271
-FUNC 4b5e 18 4 _ismbblead
+FUNC 4b5e 18 0 _ismbblead
4b5e 5 171 3271
4b63 11 172 3271
4b74 2 173 3271
-FUNC 4b76 f8 4 __addlocaleref
+FUNC 4b76 f8 0 __addlocaleref
4b76 7 36 1913
4b7d d 39 1913
4b97 a 41 1913
@@ -1862,7 +1861,7 @@
4c46 8 53 1913
4c5b 11 63 1913
4c6c 2 64 1913
-FUNC 4c6e 102 4 __removelocaleref
+FUNC 4c6e 102 0 __removelocaleref
4c6e 6 74 1913
4c74 b 77 1913
4c7f b 79 1913
@@ -1885,7 +1884,7 @@
4d5b 10 103 1913
4d6b 3 106 1913
4d6e 2 107 1913
-FUNC 4d70 293 4 __freetlocinfo
+FUNC 4d70 293 0 __freetlocinfo
4d70 7 129 1913
4d77 47 137 1913
4dc8 8 137 1913
@@ -1919,7 +1918,7 @@
4fef 8 179 1913
4ff7 a 201 1913
5001 2 202 1913
-FUNC 5003 6b 8 _updatetlocinfoEx_nolock
+FUNC 5003 6b 0 _updatetlocinfoEx_nolock
5003 6 216 1913
5009 e 219 1913
5017 1 222 1913
@@ -1949,11 +1948,11 @@
50cd e 292 1913
50db 8 294 1913
50e3 4 295 1913
-FUNC 50e7 8 4 _crt_debugger_hook
+FUNC 50e7 8 0 _crt_debugger_hook
50e7 0 62 1145
50e7 7 65 1145
50ee 1 66 1145
-FUNC 50ef 7a c memset
+FUNC 50ef 7a 0 memset
50ef 0 59 2789
50ef 4 68 2789
50f3 4 69 2789
@@ -2079,7 +2078,7 @@
5346 9 81 1011
534f 11 83 1011
5360 8 92 1011
-FUNC 5368 361 c memcpy
+FUNC 5368 361 0 memcpy
5368 3 101 2787
536b 1 113 2787
536c 1 114 2787
@@ -2315,14 +2314,14 @@
56c5 1 593 2787
56c6 1 594 2787
56c7 2 595 2787
-FUNC 56c9 2a 4 _freea
+FUNC 56c9 2a 0 _freea
56c9 5 235 281
56ce 7 237 281
56d5 3 239 281
56e2 8 241 281
56ea 7 243 281
56f1 2 252 281
-FUNC 56f3 3d 4 _msize
+FUNC 56f3 3d 0 _msize
56f3 5 39 561
56f8 23 43 561
571b 2 50 561
@@ -2369,8 +2368,8 @@
5823 8 315 1392
582b 12 319 1392
583d 2 320 1392
-FUNC 583f 8d c _calloc_impl
-FUNC 58d6 9 c _calloc_impl
+FUNC 583f 8d 0 _calloc_impl
+FUNC 58d6 9 0 _calloc_impl
583f 5 21 291
5844 7 26 291
584b 11 28 291
@@ -2390,8 +2389,8 @@
58c5 7 52 291
58d6 7 53 291
58dd 2 69 291
-FUNC 58df bb 8 realloc
-FUNC 59a4 6 8 realloc
+FUNC 58df bb 0 realloc
+FUNC 59a4 6 0 realloc
58df 5 62 618
58e4 6 67 618
58ea 9 68 618
@@ -2417,7 +2416,7 @@
5986 14 103 618
59a4 2 103 618
59a6 4 105 618
-FUNC 59aa 22d 24 __crtLCMapStringA_stat
+FUNC 59aa 22d 0 __crtLCMapStringA_stat
59aa 12 96 3447
59bc c 101 3447
59c8 21 102 3447
@@ -2451,14 +2450,14 @@
5bb9 8 242 3447
5bc1 4 244 3447
5bc5 12 245 3447
-FUNC 5bd7 40 24 __crtLCMapStringA
-FUNC 5c21 6 24 __crtLCMapStringA
+FUNC 5bd7 40 0 __crtLCMapStringA
+FUNC 5c21 6 0 __crtLCMapStringA
5bd7 8 258 3447
5bdf b 259 3447
5bea 2d 271 3447
5c21 4 271 3447
5c25 2 272 3447
-FUNC 5c27 112 20 __crtGetStringTypeA_stat
+FUNC 5c27 112 0 __crtGetStringTypeA_stat
5c27 12 63 3507
5c39 7 67 3507
5c40 5 83 3507
@@ -2476,14 +2475,14 @@
5d1d 6 118 3507
5d23 4 120 3507
5d27 12 121 3507
-FUNC 5d39 3a 20 __crtGetStringTypeA
-FUNC 5d7d 6 20 __crtGetStringTypeA
+FUNC 5d39 3a 0 __crtGetStringTypeA
+FUNC 5d7d 6 0 __crtGetStringTypeA
5d39 8 133 3507
5d41 b 134 3507
5d4c 27 145 3507
5d7d 4 145 3507
5d81 2 146 3507
-FUNC 5d83 775 4 __free_lc_time
+FUNC 5d83 775 0 __free_lc_time
5d83 6 228 1800
5d89 b 229 1800
5d9e 8 232 1800
@@ -2573,7 +2572,7 @@
64cf b 328 1800
64e7 f 329 1800
64f6 2 332 1800
-FUNC 64f8 9f 4 __free_lconv_num
+FUNC 64f8 9f 0 __free_lconv_num
64f8 6 218 1742
64fe b 219 1742
6513 a 222 1742
@@ -2587,7 +2586,7 @@
6582 b 234 1742
658d 8 235 1742
6595 2 236 1742
-FUNC 6597 180 4 __free_lconv_mon
+FUNC 6597 180 0 __free_lconv_mon
6597 6 270 1685
659d b 271 1685
65b2 b 274 1685
@@ -2617,13 +2616,13 @@
6702 b 310 1685
670d 8 311 1685
6715 2 312 1685
-FUNC 6717 ba c _VEC_memzero
+FUNC 6717 ba 0 _VEC_memzero
FUNC 67d1 10 0 __sse2_available_init
67d1 0 30 4315
67d1 d 31 4315
67de 2 32 4315
67e0 1 33 4315
-FUNC 67e1 103 c _VEC_memcpy
+FUNC 67e1 103 0 _VEC_memcpy
FUNC 68e4 2c 0 _alloca_probe_16
68e4 0 44 4274
68e4 1 46 4274
@@ -2687,7 +2686,7 @@
6966 5 98 4276
696b 2 99 4276
696d 2 100 4276
-FUNC 696f 46 8 strcspn
+FUNC 696f 46 0 strcspn
696f 4 191 2794
6973 2 198 2794
6975 1 199 2794
@@ -2717,7 +2716,7 @@
69ad 2 255 2794
69af 3 257 2794
69b2 3 259 2794
-FUNC 69b5 40 8 strpbrk
+FUNC 69b5 40 0 strpbrk
69b5 4 191 2794
69b9 2 198 2794
69bb 1 199 2794
@@ -2745,7 +2744,7 @@
69ec 3 248 2794
69ef 3 257 2794
69f2 3 259 2794
-FUNC 69f5 61 c __ascii_strnicmp
+FUNC 69f5 61 0 __ascii_strnicmp
69f5 6 69 2798
69fb 3 75 2798
69fe 2 76 2798
@@ -2785,6 +2784,7 @@
6a4d 2 135 2798
6a4f 2 138 2798
6a51 5 140 2798
+PUBLIC 6a56 10 RtlUnwind
STACK WIN 4 1000 54 6 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 1060 a 3 0 0 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 106a 35 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
diff --git a/src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym b/src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym
index c2b9bb8..23a65eb 100644
--- a/src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym
+++ b/src/tools/windows/dump_syms/testdata/omap_stretched_filled.sym
@@ -1,5 +1,4 @@
MODULE windows x86 79B9AD4B6BDE4A5283EB6870045001E91 omap_stretched_filled.pdb
-INFO CODE_ID 517C17D7F000 omap_stretched_filled.exe
FILE 1 c:\src\breakpad\src\src\tools\windows\dump_syms\testdata\dump_syms_regtest.cc
FILE 2 f:\dd\public\sdk\inc\internal\pebteb.h
FILE 3 f:\dd\public\sdk\inc\internal\ntldr.h
@@ -282,7 +281,7 @@
FILE 4643 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\rtc\initsect.cpp
FILE 4664 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcapi.h
FILE 4680 f:\dd\vctools\crt_bld\self_x86\crt\prebuild\h\rtcpriv.h
-FUNC 1000 54 8 main
+FUNC 1000 54 0 main
1000 6 57 1
1006 8 58 1
100e e 59 1
@@ -299,13 +298,13 @@
106a 35 37 1
FUNC 109f 1e 0 google_breakpad::C::~C()
109f 1e 38 1
-FUNC 10bd 20 8 google_breakpad::C::set_member(int)
+FUNC 10bd 20 0 google_breakpad::C::set_member(int)
10bd 20 40 1
FUNC 10dd 3c 0 google_breakpad::C::f()
10dd 3c 43 1
FUNC 1119 10 0 google_breakpad::C::g()
1119 10 44 1
-FUNC 1129 7 4 google_breakpad::C::h(google_breakpad::C const &)
+FUNC 1129 7 0 google_breakpad::C::h(google_breakpad::C const &)
1129 7 45 1
FUNC 1130 2c 0 google_breakpad::C::`scalar deleting destructor'(unsigned int)
FUNC 115c 1a 0 type_info::~type_info()
@@ -313,11 +312,11 @@
115e 17 50 4531
1175 1 51 4531
FUNC 1176 21 0 type_info::`scalar deleting destructor'(unsigned int)
-FUNC 1197 b 4 operator delete(void *)
+FUNC 1197 b 0 operator delete(void *)
1197 5 20 2875
119c 1 24 2875
119d 5 23 2875
-FUNC 11a2 29 4 fast_error_exit
+FUNC 11a2 29 0 fast_error_exit
11a2 5 326 4250
11a7 9 335 4250
11b0 5 337 4250
@@ -364,7 +363,7 @@
132c 0 179 4250
132c 5 186 4250
1331 5 188 4250
-FUNC 1336 70 4 type_info::_Type_info_dtor(type_info *)
+FUNC 1336 70 0 type_info::_Type_info_dtor(type_info *)
1336 c 62 4473
1342 8 63 4473
134a 4 64 4473
@@ -381,7 +380,7 @@
1399 2 83 4473
139b 2 72 4473
139d 9 104 4473
-FUNC 13a6 88 8 strcmp
+FUNC 13a6 88 0 strcmp
13a6 0 65 2791
13a6 4 73 2791
13aa 4 74 2791
@@ -436,14 +435,14 @@
1427 2 148 2791
1429 3 149 2791
142c 2 150 2791
-FUNC 142e 44 4 free
+FUNC 142e 44 0 free
142e 5 40 389
1433 6 45 389
1439 11 50 389
144a 4 51 389
144e 22 53 389
1470 2 55 389
-FUNC 1472 6a 4 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
+FUNC 1472 6a 0 __CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS *)
1472 5 67 4397
1477 5a 68 4397
14d1 5 69 4397
@@ -454,7 +453,7 @@
14dc b 89 4397
14e7 2 90 4397
14e9 1 91 4397
-FUNC 14ea 2b 4 __crtCorExitProcess
+FUNC 14ea 2b 0 __crtCorExitProcess
14ea 5 675 4186
14ef b 679 4186
14fa 4 680 4186
@@ -462,7 +461,7 @@
150a 4 682 4186
150e 5 683 4186
1513 2 693 4186
-FUNC 1515 18 4 __crtExitProcess
+FUNC 1515 18 0 __crtExitProcess
1515 5 698 4186
151a 9 699 4186
1523 a 708 4186
@@ -484,7 +483,7 @@
1561 6 816 4186
1567 a 817 4186
1571 1 818 4186
-FUNC 1572 2e 8 _initterm_e
+FUNC 1572 2e 0 _initterm_e
1572 6 908 4186
1578 b 917 4186
1583 10 922 4186
@@ -492,7 +491,7 @@
1595 3 924 4186
1598 6 917 4186
159e 2 928 4186
-FUNC 15a0 a1 4 _cinit
+FUNC 15a0 a1 0 _cinit
15a0 5 258 4186
15a5 18 268 4186
15bd a 270 4186
@@ -506,7 +505,7 @@
1631 c 303 4186
163d 2 307 4186
163f 2 308 4186
-FUNC 1641 140 c doexit
+FUNC 1641 140 0 doexit
1641 c 489 4186
164d 8 507 4186
1655 4 508 4186
@@ -541,11 +540,11 @@
176c 6 609 4186
1772 9 610 4186
177b 6 622 4186
-FUNC 1781 16 4 exit
+FUNC 1781 16 0 exit
1781 5 392 4186
1786 f 393 4186
1795 2 394 4186
-FUNC 1797 16 4 _exit
+FUNC 1797 16 0 _exit
1797 5 400 4186
179c f 401 4186
17ab 2 402 4186
@@ -557,12 +556,12 @@
17bc 0 414 4186
17bc e 415 4186
17ca 1 416 4186
-FUNC 17cb 1e 4 _amsg_exit
+FUNC 17cb 1e 0 _amsg_exit
17cb 5 439 4186
17d0 5 440 4186
17d5 9 441 4186
17de b 442 4186
-FUNC 17e9 26 4 _GET_RTERRMSG
+FUNC 17e9 26 0 _GET_RTERRMSG
17e9 5 165 4012
17ee 2 168 4012
17f0 c 169 4012
@@ -571,7 +570,7 @@
1804 2 173 4012
1806 7 170 4012
180d 2 173 4012
-FUNC 180f 1c5 4 _NMSG_WRITE
+FUNC 180f 1c5 0 _NMSG_WRITE
180f 1b 196 4012
182a 8 197 4012
1832 11 199 4012
@@ -601,7 +600,7 @@
19f6 a 140 4012
1a00 c 141 4012
1a0c 1 143 4012
-FUNC 1a0d 251 8 _XcptFilter
+FUNC 1a0d 251 0 _XcptFilter
1a0d 6 195 2369
1a13 7 202 2369
1a1a 8 203 2369
@@ -676,7 +675,7 @@
1d21 7 130 3838
1d28 5 131 3838
1d2d d 133 3838
-FUNC 1d3a 309 c parse_cmdline
+FUNC 1d3a 309 0 parse_cmdline
1d3a 6 221 3891
1d40 13 229 3891
1d53 2 232 3891
@@ -868,7 +867,7 @@
2642 7 343 3774
2649 7 344 3774
2650 5 352 3774
-FUNC 2655 b4 8 _initptd
+FUNC 2655 b4 0 _initptd
2655 c 379 3774
2661 b 381 3774
266c a 384 3774
@@ -990,7 +989,7 @@
2a8b 1 60 453
FUNC 2a8c 45 0 _SEH_prolog4
FUNC 2ad1 14 0 _SEH_epilog4
-FUNC 2ae5 2c4 10 _except_handler4
+FUNC 2ae5 2c4 0 _except_handler4
FUNC 2da9 9b 0 __security_init_cookie
2da9 8 97 1455
2db1 21 114 1455
@@ -1010,11 +1009,11 @@
2e31 6 172 1455
2e37 b 173 1455
2e42 2 175 1455
-FUNC 2e44 f 4 _initp_misc_invarg
+FUNC 2e44 f 0 _initp_misc_invarg
2e44 5 64 3583
2e49 8 65 3583
2e51 2 66 3583
-FUNC 2e53 129 c _call_reportfault
+FUNC 2e53 129 0 _call_reportfault
2e53 16 164 3583
2e69 9 166 3583
2e72 7 167 3583
@@ -1046,12 +1045,12 @@
2f5a d 254 3583
2f67 7 255 3583
2f6e e 257 3583
-FUNC 2f7c 25 14 _invoke_watson
+FUNC 2f7c 25 0 _invoke_watson
2f7c 3 146 3583
2f7f 12 155 3583
2f91 f 156 3583
2fa0 1 157 3583
-FUNC 2fa1 2d 14 _invalid_parameter
+FUNC 2fa1 2d 0 _invalid_parameter
2fa1 5 96 3583
2fa6 c 103 3583
2fb2 4 104 3583
@@ -1085,11 +1084,11 @@
30b4 3 220 3954
30b7 b 214 3954
30c2 3 223 3954
-FUNC 30c5 17 4 _unlock
+FUNC 30c5 17 0 _unlock
30c5 5 370 3954
30ca 10 374 3954
30da 2 375 3954
-FUNC 30dc c2 4 _mtinitlocknum
+FUNC 30dc c2 0 _mtinitlocknum
30dc c 258 3954
30e8 6 260 3954
30ee a 268 3954
@@ -1116,14 +1115,14 @@
318c 3 303 3954
318f 6 304 3954
3195 9 300 3954
-FUNC 319e 47 4 _lock
+FUNC 319e 47 0 _lock
319e 5 332 3954
31a3 1a 337 3954
31bd b 339 3954
31c8 8 340 3954
31d0 13 347 3954
31e3 2 348 3954
-FUNC 31e5 9c c strcpy_s
+FUNC 31e5 9c 0 strcpy_s
31e5 5 13 2523
31ea 2d 18 2523
3217 15 19 2523
@@ -1133,7 +1132,7 @@
3263 18 30 2523
327b 4 33 2523
327f 2 34 2523
-FUNC 3281 8b 4 strlen
+FUNC 3281 8b 0 strlen
3281 0 54 2796
3281 4 63 2796
3285 6 64 2796
@@ -1179,7 +1178,7 @@
3305 4 119 2796
3309 2 120 2796
330b 1 121 2796
-FUNC 330c b6 4 malloc
+FUNC 330c b6 0 malloc
330c 6 81 504
3312 e 85 504
3320 3d 89 504
@@ -1201,7 +1200,7 @@
FUNC 34cb 19 0 _EH4_TransferToHandler
FUNC 34e4 19 0 _EH4_GlobalUnwind2
FUNC 34fd 17 8 _EH4_LocalUnwind
-FUNC 3514 42 4 _get_errno_from_oserr
+FUNC 3514 42 0 _get_errno_from_oserr
3514 5 119 224
3519 5 123 224
351e 9 124 224
@@ -1232,18 +1231,18 @@
3590 7 106 4591
3597 5 114 4591
359c 6 115 4591
-FUNC 35a2 11 4 _initp_eh_hooks
+FUNC 35a2 11 0 _initp_eh_hooks
35a2 0 69 4591
35a2 10 70 4591
35b2 1 71 4591
-FUNC 35b3 1e 4 _initp_misc_winsig
+FUNC 35b3 1e 0 _initp_misc_winsig
35b3 5 57 2311
35b8 8 58 2311
35c0 5 59 2311
35c5 5 60 2311
35ca 5 61 2311
35cf 2 62 2311
-FUNC 35d1 4b 4 siglookup
+FUNC 35d1 4b 0 siglookup
35d1 5 629 2311
35d6 a 630 2311
35e0 1e 639 2311
@@ -1255,7 +1254,7 @@
361c 0 669 2311
361c c 670 2311
3628 1 671 2311
-FUNC 3629 1a3 4 raise
+FUNC 3629 1a3 0 raise
3629 c 450 2311
3635 5 457 2311
363a 3 458 2311
@@ -1309,19 +1308,19 @@
37be 6 600 2311
37c4 2 603 2311
37c6 6 604 2311
-FUNC 37cc f 4 _initp_misc_rand_s
+FUNC 37cc f 0 _initp_misc_rand_s
37cc 5 58 2186
37d1 8 59 2186
37d9 2 60 2186
-FUNC 37db f 4 _initp_misc_purevirt
+FUNC 37db f 0 _initp_misc_purevirt
37db 5 179 1627
37e0 8 180 1627
37e8 2 181 1627
-FUNC 37ea f 4 _initp_heap_handler
+FUNC 37ea f 0 _initp_heap_handler
37ea 5 31 2820
37ef 8 32 2820
37f7 2 33 2820
-FUNC 37f9 28 4 _callnewh
+FUNC 37f9 28 0 _callnewh
37f9 5 131 2820
37fe c 133 2820
380a e 135 2820
@@ -1329,7 +1328,7 @@
381b 2 139 2820
381d 2 136 2820
381f 2 139 2820
-FUNC 3821 c0 4 _onexit_nolock
+FUNC 3821 c0 0 _onexit_nolock
3821 8 100 1969
3829 f 103 1969
3838 f 104 1969
@@ -1356,7 +1355,7 @@
390b d 214 1969
3918 3 216 1969
391b 1 217 1969
-FUNC 391c 3c 4 _onexit
+FUNC 391c 3c 0 _onexit
391c c 81 1969
3928 5 84 1969
392d 4 86 1969
@@ -1365,7 +1364,7 @@
3949 3 93 1969
394c 6 94 1969
3952 6 90 1969
-FUNC 3958 17 4 atexit
+FUNC 3958 17 0 atexit
3958 5 161 1969
395d 10 162 1969
396d 2 163 1969
@@ -1374,7 +1373,7 @@
3973 2 56 2419
3975 1a 58 2419
398f 3 60 2419
-FUNC 3992 5d 4 _ValidateImageBase
+FUNC 3992 5d 0 _ValidateImageBase
3992 5 44 2079
3997 17 50 2079
39ae 2 52 2079
@@ -1384,7 +1383,7 @@
39d1 2 58 2079
39d3 1a 62 2079
39ed 2 68 2079
-FUNC 39ef 76 8 _FindPESection
+FUNC 39ef 76 0 _FindPESection
39ef 5 92 2079
39f4 12 99 2079
3a06 2c 108 2079
@@ -1392,7 +1391,7 @@
3a56 8 108 2079
3a5e 5 123 2079
3a63 2 124 2079
-FUNC 3a65 bc 4 _IsNonwritableInCurrentImage
+FUNC 3a65 bc 0 _IsNonwritableInCurrentImage
3a65 35 149 2079
3a9a 7 156 2079
3aa1 f 164 2079
@@ -1406,7 +1405,7 @@
3af0 16 187 2079
3b06 9 193 2079
3b0f 12 195 2079
-FUNC 3b21 16c c __crtMessageBoxW
+FUNC 3b21 16c 0 __crtMessageBoxW
3b21 12 41 1053
3b33 14 49 1053
3b47 4 56 1053
@@ -1443,7 +1442,7 @@
3c6c 10 158 1053
3c7c 2 163 1053
3c7e f 166 1053
-FUNC 3c8d bf c wcscat_s
+FUNC 3c8d bf 0 wcscat_s
3c8d 6 13 2468
3c93 2c 18 2468
3cbf 2 46 2468
@@ -1457,7 +1456,7 @@
3cf5 29 35 2468
3d1e 13 41 2468
3d31 1b 42 2468
-FUNC 3d4c 13e 10 wcsncpy_s
+FUNC 3d4c 13e 0 wcsncpy_s
3d4c 5 13 2578
3d51 16 17 2578
3d67 5 65 2578
@@ -1479,13 +1478,13 @@
3e4a 18 59 2578
3e62 d 61 2578
3e6f 1b 62 2578
-FUNC 3e8a 25 4 wcslen
+FUNC 3e8a 25 0 wcslen
3e8a 5 41 2728
3e8f 3 42 2728
3e92 15 44 2728
3ea7 6 46 2728
3ead 2 47 2728
-FUNC 3eaf a0 c wcscpy_s
+FUNC 3eaf a0 0 wcscpy_s
3eaf 6 13 2523
3eb5 2c 18 2523
3ee1 2 34 2523
@@ -1493,7 +1492,7 @@
3ef9 2b 23 2523
3f24 13 29 2523
3f37 18 30 2523
-FUNC 3f4f 49 4 _set_error_mode
+FUNC 3f4f 49 0 _set_error_mode
3f4f 5 43 1181
3f54 11 46 1181
3f65 5 54 1181
@@ -1509,7 +1508,7 @@
3f9e 2 56 892
3fa0 2 57 892
3fa2 5 59 892
-FUNC 3fa7 45 4 _malloc_crt
+FUNC 3fa7 45 0 _malloc_crt
3fa7 7 39 333
3fae 2 40 333
3fb0 b 44 333
@@ -1518,7 +1517,7 @@
3fe1 5 47 333
3fe6 4 50 333
3fea 2 51 333
-FUNC 3fec 4c 8 _calloc_crt
+FUNC 3fec 4c 0 _calloc_crt
3fec 7 54 333
3ff3 2 55 333
3ff5 12 61 333
@@ -1527,7 +1526,7 @@
402d 5 64 333
4032 4 67 333
4036 2 68 333
-FUNC 4038 4e 8 _realloc_crt
+FUNC 4038 4e 0 _realloc_crt
4038 7 71 333
403f 2 72 333
4041 f 76 333
@@ -1610,7 +1609,7 @@
443c 7 524 3326
4443 11 527 3326
4454 9 529 3326
-FUNC 445d 15d 4 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
+FUNC 445d 15d 0 _LocaleUpdate::_LocaleUpdate(localeinfo_struct *)
445d 5 240 111
4462 1c 241 111
447e 12 243 111
@@ -1638,7 +1637,7 @@
461d 1c 305 3326
4639 19 308 3326
4652 2 309 3326
-FUNC 4654 2d2 8 _setmbcp_nolock
+FUNC 4654 2d2 0 _setmbcp_nolock
4654 17 684 3326
466b b 691 3326
4676 9 694 3326
@@ -1681,7 +1680,7 @@
490e 6 795 3326
4914 3 744 3326
4917 f 800 3326
-FUNC 4926 19a 4 _setmbcp
+FUNC 4926 19a 0 _setmbcp
4926 c 572 3326
4932 4 573 3326
4936 a 577 3326
@@ -1735,17 +1734,17 @@
4ad1 a 853 3326
4adb 2 858 3326
4add 1 859 3326
-FUNC 4ade 80 10 x_ismbbtype_l
+FUNC 4ade 80 0 x_ismbbtype_l
4ade 8 213 3271
4ae6 b 214 3271
4af1 4 219 3271
4af5 67 222 3271
4b5c 2 223 3271
-FUNC 4b5e 18 4 _ismbblead
+FUNC 4b5e 18 0 _ismbblead
4b5e 5 171 3271
4b63 11 172 3271
4b74 2 173 3271
-FUNC 4b76 f8 4 __addlocaleref
+FUNC 4b76 f8 0 __addlocaleref
4b76 7 36 1913
4b7d d 39 1913
4b8a 17 41 1913
@@ -1764,7 +1763,7 @@
4c46 8 53 1913
4c4e 1e 63 1913
4c6c 2 64 1913
-FUNC 4c6e 102 4 __removelocaleref
+FUNC 4c6e 102 0 __removelocaleref
4c6e 6 74 1913
4c74 b 77 1913
4c7f b 79 1913
@@ -1785,7 +1784,7 @@
4d4e 1d 103 1913
4d6b 3 106 1913
4d6e 2 107 1913
-FUNC 4d70 293 4 __freetlocinfo
+FUNC 4d70 293 0 __freetlocinfo
4d70 7 129 1913
4d77 59 137 1913
4dd0 25 140 1913
@@ -1812,7 +1811,7 @@
4fef 8 179 1913
4ff7 a 201 1913
5001 2 202 1913
-FUNC 5003 6b 8 _updatetlocinfoEx_nolock
+FUNC 5003 6b 0 _updatetlocinfoEx_nolock
5003 6 216 1913
5009 e 219 1913
5017 d 222 1913
@@ -1840,11 +1839,11 @@
50cd e 292 1913
50db 8 294 1913
50e3 4 295 1913
-FUNC 50e7 8 4 _crt_debugger_hook
+FUNC 50e7 8 0 _crt_debugger_hook
50e7 0 62 1145
50e7 7 65 1145
50ee 1 66 1145
-FUNC 50ef 7a c memset
+FUNC 50ef 7a 0 memset
50ef 0 59 2789
50ef 4 68 2789
50f3 4 69 2789
@@ -1970,7 +1969,7 @@
5346 9 81 1011
534f 11 83 1011
5360 8 92 1011
-FUNC 5368 361 c memcpy
+FUNC 5368 361 0 memcpy
5368 3 101 2787
536b 1 113 2787
536c 1 114 2787
@@ -2206,14 +2205,14 @@
56c5 1 593 2787
56c6 1 594 2787
56c7 2 595 2787
-FUNC 56c9 2a 4 _freea
+FUNC 56c9 2a 0 _freea
56c9 5 235 281
56ce 7 237 281
56d5 3 239 281
56d8 12 241 281
56ea 7 243 281
56f1 2 252 281
-FUNC 56f3 3d 4 _msize
+FUNC 56f3 3d 0 _msize
56f3 5 39 561
56f8 23 43 561
571b 2 50 561
@@ -2260,7 +2259,7 @@
5823 8 315 1392
582b 12 319 1392
583d 2 320 1392
-FUNC 583f a0 c _calloc_impl
+FUNC 583f a0 0 _calloc_impl
583f 5 21 291
5844 7 26 291
584b 23 28 291
@@ -2279,7 +2278,7 @@
58c5 7 52 291
58cc 11 53 291
58dd 2 69 291
-FUNC 58df cb 8 realloc
+FUNC 58df cb 0 realloc
58df 5 62 618
58e4 6 67 618
58ea 9 68 618
@@ -2302,7 +2301,7 @@
5984 2 112 618
5986 20 103 618
59a6 4 105 618
-FUNC 59aa 22d 24 __crtLCMapStringA_stat
+FUNC 59aa 22d 0 __crtLCMapStringA_stat
59aa 12 96 3447
59bc c 101 3447
59c8 21 102 3447
@@ -2334,12 +2333,12 @@
5bb9 8 242 3447
5bc1 4 244 3447
5bc5 12 245 3447
-FUNC 5bd7 50 24 __crtLCMapStringA
+FUNC 5bd7 50 0 __crtLCMapStringA
5bd7 8 258 3447
5bdf b 259 3447
5bea 3b 271 3447
5c25 2 272 3447
-FUNC 5c27 112 20 __crtGetStringTypeA_stat
+FUNC 5c27 112 0 __crtGetStringTypeA_stat
5c27 12 63 3507
5c39 7 67 3507
5c40 5 83 3507
@@ -2355,12 +2354,12 @@
5d1d 6 118 3507
5d23 4 120 3507
5d27 12 121 3507
-FUNC 5d39 4a 20 __crtGetStringTypeA
+FUNC 5d39 4a 0 __crtGetStringTypeA
5d39 8 133 3507
5d41 b 134 3507
5d4c 35 145 3507
5d81 2 146 3507
-FUNC 5d83 775 4 __free_lc_time
+FUNC 5d83 775 0 __free_lc_time
5d83 6 228 1800
5d89 b 229 1800
5d94 12 232 1800
@@ -2450,7 +2449,7 @@
64c2 18 328 1800
64da 1c 329 1800
64f6 2 332 1800
-FUNC 64f8 9f 4 __free_lconv_num
+FUNC 64f8 9f 0 __free_lconv_num
64f8 6 218 1742
64fe b 219 1742
6509 14 222 1742
@@ -2464,7 +2463,7 @@
6578 15 234 1742
658d 8 235 1742
6595 2 236 1742
-FUNC 6597 180 4 __free_lconv_mon
+FUNC 6597 180 0 __free_lconv_mon
6597 6 270 1685
659d b 271 1685
65a8 15 274 1685
@@ -2494,13 +2493,13 @@
66f8 15 310 1685
670d 8 311 1685
6715 2 312 1685
-FUNC 6717 ba c _VEC_memzero
+FUNC 6717 ba 0 _VEC_memzero
FUNC 67d1 10 0 __sse2_available_init
67d1 0 30 4315
67d1 d 31 4315
67de 2 32 4315
67e0 1 33 4315
-FUNC 67e1 103 c _VEC_memcpy
+FUNC 67e1 103 0 _VEC_memcpy
FUNC 68e4 2c 0 _alloca_probe_16
68e4 0 44 4274
68e4 1 46 4274
@@ -2564,7 +2563,7 @@
6966 5 98 4276
696b 2 99 4276
696d 2 100 4276
-FUNC 696f 46 8 strcspn
+FUNC 696f 46 0 strcspn
696f 4 191 2794
6973 2 198 2794
6975 1 199 2794
@@ -2594,7 +2593,7 @@
69ad 2 255 2794
69af 3 257 2794
69b2 3 259 2794
-FUNC 69b5 40 8 strpbrk
+FUNC 69b5 40 0 strpbrk
69b5 4 191 2794
69b9 2 198 2794
69bb 1 199 2794
@@ -2622,7 +2621,7 @@
69ec 3 248 2794
69ef 3 257 2794
69f2 3 259 2794
-FUNC 69f5 61 c __ascii_strnicmp
+FUNC 69f5 61 0 __ascii_strnicmp
69f5 6 69 2798
69fb 3 75 2798
69fe 2 76 2798
@@ -2662,6 +2661,7 @@
6a4d 2 135 2798
6a4f 2 138 2798
6a51 5 140 2798
+PUBLIC 6a56 10 RtlUnwind
STACK WIN 4 1000 54 6 0 8 0 14 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 1060 a 3 0 0 0 0 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
STACK WIN 4 106a 35 7 0 0 0 4 0 1 $T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + =
diff --git a/src/tools/windows/symupload/symupload.cc b/src/tools/windows/symupload/symupload.cc
index c9d624e..e0d78f4 100644
--- a/src/tools/windows/symupload/symupload.cc
+++ b/src/tools/windows/symupload/symupload.cc
@@ -154,32 +154,30 @@
}
__declspec(noreturn) void printUsageAndExit() {
- wprintf(L"Usage: symupload [--timeout NN] <file.exe|file.dll> <symbol upload URL>\n\n");
+ wprintf(L"Usage: symupload [--timeout NN] <file.exe|file.dll> "
+ L"<symbol upload URL> [...<symbol upload URLs>]\n\n");
wprintf(L"Timeout is in milliseconds, or can be 0 to be unlimited\n\n");
- wprintf(L"Example:\n\n\tsymupload.exe --timeout 0 chrome.dll http://no.free.symbol.server.for.you\n");
+ wprintf(L"Example:\n\n\tsymupload.exe --timeout 0 chrome.dll "
+ L"http://no.free.symbol.server.for.you\n");
exit(0);
}
int wmain(int argc, wchar_t *argv[]) {
- if ((argc != 3) &&
- (argc != 5)) {
+ const wchar_t *module;
+ int timeout = -1;
+ int currentarg = 1;
+ if (argc > 2) {
+ if (!wcscmp(L"--timeout", argv[1])) {
+ timeout = _wtoi(argv[2]);
+ currentarg = 3;
+ }
+ } else {
printUsageAndExit();
}
- const wchar_t *module, *url;
- int timeout = -1;
- if (argc == 3) {
- module = argv[1];
- url = argv[2];
- } else {
- // check for timeout flag
- if (!wcscmp(L"--timeout", argv[1])) {
- timeout = _wtoi(argv[2]);
- module = argv[3];
- url = argv[4];
- } else {
- printUsageAndExit();
- }
- }
+ if (argc >= currentarg + 2)
+ module = argv[currentarg++];
+ else
+ printUsageAndExit();
wstring symbol_file;
PDBModuleInfo pdb_info;
@@ -206,20 +204,27 @@
fwprintf(stderr, L"Warning: Could not get file version for %s\n", module);
}
- bool success = HTTPUpload::SendRequest(url, parameters,
- symbol_file, L"symbol_file",
- timeout == -1 ? NULL : &timeout,
- NULL, NULL);
- _wunlink(symbol_file.c_str());
+ bool success = true;
- if (!success) {
- fwprintf(stderr, L"Symbol file upload failed\n");
- return 1;
+ while (currentarg < argc) {
+ if (!HTTPUpload::SendRequest(argv[currentarg], parameters,
+ symbol_file, L"symbol_file",
+ timeout == -1 ? NULL : &timeout,
+ NULL, NULL)) {
+ success = false;
+ fwprintf(stderr, L"Symbol file upload to %s failed\n", argv[currentarg]);
+ }
+ currentarg++;
}
- wprintf(L"Uploaded symbols for windows-%s/%s/%s (%s %s)\n",
- pdb_info.cpu.c_str(), pdb_info.debug_file.c_str(),
- pdb_info.debug_identifier.c_str(), code_file.c_str(),
- file_version.c_str());
- return 0;
+ _wunlink(symbol_file.c_str());
+
+ if (success) {
+ wprintf(L"Uploaded symbols for windows-%s/%s/%s (%s %s)\n",
+ pdb_info.cpu.c_str(), pdb_info.debug_file.c_str(),
+ pdb_info.debug_identifier.c_str(), code_file.c_str(),
+ file_version.c_str());
+ }
+
+ return success ? 0 : 1;
}
diff --git a/src/tools/windows/symupload/symupload.gyp b/src/tools/windows/symupload/symupload.gyp
index 01fd2ba..d7e5fb7 100644
--- a/src/tools/windows/symupload/symupload.gyp
+++ b/src/tools/windows/symupload/symupload.gyp
@@ -28,7 +28,7 @@
{
'includes': [
- '../../../client/windows/build/common.gypi',
+ '../../../build/common.gypi',
],
'targets': [
{
@@ -38,7 +38,7 @@
'symupload.cc',
],
'dependencies': [
- '<(DEPTH)/common/windows/common_windows.gyp:common_windows_lib',
+ '../../../common/windows/common_windows.gyp:common_windows_lib',
],
},
],