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**)&note_section, &note_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(&timestruct, &tt);
+#else
+  gmtime_r(&tt, &timestruct);
+#endif
+
+  char timestr[20];
+  int rv = strftime(timestr, 20, "%Y-%m-%d %H:%M:%S", &timestruct);
+  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(&timestruct, reinterpret_cast<time_t*>(&header_.time_date_stamp));
-#else
-  gmtime_r(reinterpret_cast<time_t*>(&header_.time_date_stamp), &timestruct);
-#endif
-  char timestr[20];
-  strftime(timestr, 20, "%Y-%m-%d %H:%M:%S", &timestruct);
-  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="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
-				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="&quot;$(VSInstallDir)\DIA SDK\lib&quot;"
-			/>
-			<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="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
-				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="&quot;$(VSInstallDir)\DIA SDK\lib&quot;"
-			/>
-			<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="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
-				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="&quot;$(VSInstallDir)\DIA SDK\lib&quot;"
-			/>
-			<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="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
-				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="&quot;$(VSInstallDir)\DIA SDK\lib&quot;"
-			/>
-			<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',
       ],
     },
   ],