mozilla-breakpad-update.patch
changeset 43 3a1561dda105
child 46 c743908ffe6f
equal deleted inserted replaced
42:6ee6583389c7 43:3a1561dda105
       
     1 diff --git a/profile/dirserviceprovider/src/nsProfileLock.cpp b/profile/dirserviceprovider/src/nsProfileLock.cpp
       
     2 --- a/profile/dirserviceprovider/src/nsProfileLock.cpp
       
     3 +++ b/profile/dirserviceprovider/src/nsProfileLock.cpp
       
     4 @@ -154,17 +154,18 @@ void nsProfileLock::RemovePidLockFiles()
       
     5  static struct sigaction SIGHUP_oldact;
       
     6  static struct sigaction SIGINT_oldact;
       
     7  static struct sigaction SIGQUIT_oldact;
       
     8  static struct sigaction SIGILL_oldact;
       
     9  static struct sigaction SIGABRT_oldact;
       
    10  static struct sigaction SIGSEGV_oldact;
       
    11  static struct sigaction SIGTERM_oldact;
       
    12  
       
    13 -void nsProfileLock::FatalSignalHandler(int signo)
       
    14 +void nsProfileLock::FatalSignalHandler(int signo, siginfo_t *info,
       
    15 +                                       void *context)
       
    16  {
       
    17      // Remove any locks still held.
       
    18      RemovePidLockFiles();
       
    19  
       
    20      // Chain to the old handler, which may exit.
       
    21      struct sigaction *oldact = nsnull;
       
    22  
       
    23      switch (signo) {
       
    24 @@ -206,16 +207,20 @@ void nsProfileLock::FatalSignalHandler(i
       
    25              sigset_t unblock_sigs;
       
    26              sigemptyset(&unblock_sigs);
       
    27              sigaddset(&unblock_sigs, signo);
       
    28  
       
    29              sigprocmask(SIG_UNBLOCK, &unblock_sigs, NULL);
       
    30  
       
    31              raise(signo);
       
    32          }
       
    33 +        else if (oldact->sa_sigaction &&
       
    34 +                 (oldact->sa_flags & SA_SIGINFO) == SA_SIGINFO) {
       
    35 +            oldact->sa_sigaction(signo, info, context);
       
    36 +        }
       
    37          else if (oldact->sa_handler && oldact->sa_handler != SIG_IGN)
       
    38          {
       
    39              oldact->sa_handler(signo);
       
    40          }
       
    41      }
       
    42  
       
    43      // Backstop exit call, just in case.
       
    44      _exit(signo);
       
    45 @@ -382,18 +387,18 @@ nsresult nsProfileLock::LockWithSymlink(
       
    46                  // Clean up on normal termination.
       
    47                  atexit(RemovePidLockFiles);
       
    48  
       
    49                  // Clean up on abnormal termination, using POSIX sigaction.
       
    50                  // Don't arm a handler if the signal is being ignored, e.g.,
       
    51                  // because mozilla is run via nohup.
       
    52                  if (!sDisableSignalHandling) {
       
    53                      struct sigaction act, oldact;
       
    54 -                    act.sa_handler = FatalSignalHandler;
       
    55 -                    act.sa_flags = 0;
       
    56 +                    act.sa_sigaction = FatalSignalHandler;
       
    57 +                    act.sa_flags = SA_SIGINFO;
       
    58                      sigfillset(&act.sa_mask);
       
    59  
       
    60  #define CATCH_SIGNAL(signame)                                           \
       
    61  PR_BEGIN_MACRO                                                          \
       
    62    if (sigaction(signame, NULL, &oldact) == 0 &&                         \
       
    63        oldact.sa_handler != SIG_IGN)                                     \
       
    64    {                                                                     \
       
    65        sigaction(signame, &act, &signame##_oldact);                      \
       
    66 diff --git a/profile/dirserviceprovider/src/nsProfileLock.h b/profile/dirserviceprovider/src/nsProfileLock.h
       
    67 --- a/profile/dirserviceprovider/src/nsProfileLock.h
       
    68 +++ b/profile/dirserviceprovider/src/nsProfileLock.h
       
    69 @@ -50,16 +50,17 @@ class nsIProfileUnlocker;
       
    70  
       
    71  #if defined (XP_OS2)
       
    72  #define INCL_DOSERRORS
       
    73  #define INCL_DOSFILEMGR
       
    74  #include <os2.h>
       
    75  #endif
       
    76  
       
    77  #if defined (XP_UNIX)
       
    78 +#include <signal.h>
       
    79  #include "prclist.h"
       
    80  #endif
       
    81  
       
    82  class nsProfileLock
       
    83  #if defined (XP_UNIX)
       
    84    : public PRCList
       
    85  #endif
       
    86  {
       
    87 @@ -87,17 +88,18 @@ private:
       
    88      PRPackedBool            mHaveLock;
       
    89  
       
    90  #if defined (XP_WIN)
       
    91      HANDLE                  mLockFileHandle;
       
    92  #elif defined (XP_OS2)
       
    93      LHANDLE                 mLockFileHandle;
       
    94  #elif defined (XP_UNIX)
       
    95      static void             RemovePidLockFiles();
       
    96 -    static void             FatalSignalHandler(int signo);
       
    97 +    static void             FatalSignalHandler(int signo, siginfo_t *info,
       
    98 +                                               void *context);
       
    99      static PRCList          mPidLockList;
       
   100  
       
   101      nsresult                LockWithFcntl(const nsACString& lockFilePath);
       
   102  
       
   103      /**
       
   104       * @param aHaveFcntlLock if true, we've already acquired an fcntl lock so this
       
   105       * lock is merely an "obsolete" lock to keep out old Firefoxes
       
   106       */
       
   107 diff --git a/toolkit/crashreporter/Makefile.in b/toolkit/crashreporter/Makefile.in
       
   108 --- a/toolkit/crashreporter/Makefile.in
       
   109 +++ b/toolkit/crashreporter/Makefile.in
       
   110 @@ -77,16 +77,17 @@ endif
       
   111  ifeq ($(OS_ARCH),Linux)
       
   112  # there's no define for this normally
       
   113  DEFINES += -DXP_LINUX
       
   114  DIRS += \
       
   115    google-breakpad/src/common \
       
   116    google-breakpad/src/common/linux \
       
   117    google-breakpad/src/client \
       
   118    google-breakpad/src/client/linux/handler \
       
   119 +  google-breakpad/src/client/linux/minidump_writer \
       
   120    google-breakpad/src/tools/linux/dump_syms \
       
   121    $(NULL)
       
   122  endif
       
   123  
       
   124  ifeq ($(OS_ARCH),SunOS)
       
   125  # there's no define for this normally
       
   126  DEFINES += -DXP_SOLARIS
       
   127  DIRS += \
       
   128 diff --git a/toolkit/crashreporter/client/Makefile.in b/toolkit/crashreporter/client/Makefile.in
       
   129 --- a/toolkit/crashreporter/client/Makefile.in
       
   130 +++ b/toolkit/crashreporter/client/Makefile.in
       
   131 @@ -80,29 +80,27 @@ endif
       
   132  ifeq ($(OS_ARCH),Linux)
       
   133  CPPSRCS += crashreporter_linux.cpp
       
   134  LIBS += \
       
   135    $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/linux/$(LIB_PREFIX)breakpad_linux_common_s.$(LIB_SUFFIX) \
       
   136    $(NULL)
       
   137  LOCAL_INCLUDES += -I$(srcdir)
       
   138  OS_CXXFLAGS += $(MOZ_GTK2_CFLAGS) $(MOZ_GTHREAD_CFLAGS)
       
   139  OS_LIBS += $(MOZ_GTK2_LIBS) $(MOZ_GTHREAD_LIBS)
       
   140 -CPPSRCS += http_upload.cc
       
   141  FORCE_USE_PIC=1
       
   142  endif
       
   143  
       
   144  ifeq ($(OS_ARCH),SunOS)
       
   145  CPPSRCS += crashreporter_linux.cpp
       
   146  LIBS += \
       
   147    $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/solaris/$(LIB_PREFIX)breakpad_solaris_common_s.$(LIB_SUFFIX) \
       
   148    $(NULL)
       
   149  LOCAL_INCLUDES += -I$(srcdir)
       
   150  OS_CXXFLAGS += $(MOZ_GTK2_CFLAGS) $(MOZ_GTHREAD_CFLAGS)
       
   151  OS_LIBS += $(MOZ_GTK2_LIBS) $(MOZ_GTHREAD_LIBS)
       
   152 -CPPSRCS += http_upload.cc
       
   153  FORCE_USE_PIC=1
       
   154  endif
       
   155  
       
   156  include $(topsrcdir)/config/rules.mk
       
   157  
       
   158  ifeq ($(OS_ARCH),Darwin)
       
   159  libs::
       
   160  	$(NSINSTALL) -D $(DIST)/bin/crashreporter.app
       
   161 @@ -110,14 +108,11 @@ libs::
       
   162  	sed -e "s/%APP_NAME%/$(MOZ_APP_DISPLAYNAME)/" $(srcdir)/macbuild/Contents/Resources/English.lproj/InfoPlist.strings.in | \
       
   163  	  iconv -f UTF-8 -t UTF-16 > $(DIST)/bin/crashreporter.app/Contents/Resources/English.lproj/InfoPlist.strings
       
   164  	$(NSINSTALL) -D $(DIST)/bin/crashreporter.app/Contents/MacOS
       
   165  	$(NSINSTALL) $(DIST)/bin/crashreporter $(DIST)/bin/crashreporter.app/Contents/MacOS
       
   166  	rm -f $(DIST)/bin/crashreporter
       
   167  endif
       
   168  
       
   169  ifeq (,$(filter-out Linux SunOS,$(OS_ARCH)))
       
   170 -export:: $(srcdir)/../google-breakpad/src/common/linux/http_upload.cc
       
   171 -	$(INSTALL) $^ .
       
   172 -
       
   173  libs:: $(topsrcdir)/toolkit/themes/winstripe/global/throbber/Throbber-small.gif
       
   174  	$(INSTALL) $^ $(DIST)/bin
       
   175  endif
       
   176 diff --git a/toolkit/crashreporter/google-breakpad/Makefile.am b/toolkit/crashreporter/google-breakpad/Makefile.am
       
   177 --- a/toolkit/crashreporter/google-breakpad/Makefile.am
       
   178 +++ b/toolkit/crashreporter/google-breakpad/Makefile.am
       
   179 @@ -90,16 +90,18 @@ src_libbreakpad_la_SOURCES = \
       
   180  	src/processor/range_map.h \
       
   181  	src/processor/scoped_ptr.h \
       
   182  	src/processor/simple_symbol_supplier.cc \
       
   183  	src/processor/simple_symbol_supplier.h \
       
   184  	src/processor/stack_frame_info.h \
       
   185  	src/processor/stackwalker.cc \
       
   186  	src/processor/stackwalker_amd64.cc \
       
   187  	src/processor/stackwalker_amd64.h \
       
   188 +	src/processor/stackwalker_arm.cc \
       
   189 +	src/processor/stackwalker_arm.h \
       
   190  	src/processor/stackwalker_ppc.cc \
       
   191  	src/processor/stackwalker_ppc.h \
       
   192  	src/processor/stackwalker_sparc.cc \
       
   193  	src/processor/stackwalker_sparc.h \
       
   194  	src/processor/stackwalker_x86.cc \
       
   195  	src/processor/stackwalker_x86.h
       
   196  
       
   197  
       
   198 @@ -110,16 +112,17 @@ bin_PROGRAMS = \
       
   199  
       
   200  
       
   201  ## Tests
       
   202  check_PROGRAMS = \
       
   203  	src/processor/address_map_unittest \
       
   204  	src/processor/basic_source_line_resolver_unittest \
       
   205  	src/processor/contained_range_map_unittest \
       
   206  	src/processor/minidump_processor_unittest \
       
   207 +	src/processor/minidump_unittest \
       
   208  	src/processor/pathname_stripper_unittest \
       
   209  	src/processor/postfix_evaluator_unittest \
       
   210  	src/processor/range_map_unittest
       
   211  
       
   212  if SELFTEST
       
   213  check_PROGRAMS += \
       
   214  	src/processor/stackwalker_selftest
       
   215  endif SELFTEST
       
   216 @@ -147,32 +150,55 @@ src_processor_basic_source_line_resolver
       
   217  
       
   218  src_processor_contained_range_map_unittest_SOURCES = \
       
   219  	src/processor/contained_range_map_unittest.cc
       
   220  src_processor_contained_range_map_unittest_LDADD = \
       
   221  	src/processor/logging.lo \
       
   222  	src/processor/pathname_stripper.lo
       
   223  
       
   224  src_processor_minidump_processor_unittest_SOURCES = \
       
   225 -	src/processor/minidump_processor_unittest.cc
       
   226 +	src/processor/minidump_processor_unittest.cc \
       
   227 +	src/testing/gtest/src/gtest-all.cc \
       
   228 +	src/testing/src/gmock-all.cc
       
   229 +src_processor_minidump_processor_unittest_CPPFLAGS = \
       
   230 +	-I$(top_srcdir)/src/testing/include \
       
   231 +        -I$(top_srcdir)/src/testing/gtest/include \
       
   232 +	-I$(top_srcdir)/src/testing/gtest \
       
   233 +	-I$(top_srcdir)/src/testing
       
   234  src_processor_minidump_processor_unittest_LDADD = \
       
   235  	src/processor/basic_code_modules.lo \
       
   236  	src/processor/basic_source_line_resolver.lo \
       
   237  	src/processor/call_stack.lo \
       
   238  	src/processor/logging.lo \
       
   239  	src/processor/minidump_processor.lo \
       
   240  	src/processor/minidump.lo \
       
   241  	src/processor/pathname_stripper.lo \
       
   242  	src/processor/process_state.lo \
       
   243  	src/processor/stackwalker.lo \
       
   244  	src/processor/stackwalker_amd64.lo \
       
   245 +	src/processor/stackwalker_arm.lo \
       
   246  	src/processor/stackwalker_ppc.lo \
       
   247  	src/processor/stackwalker_sparc.lo \
       
   248  	src/processor/stackwalker_x86.lo
       
   249  
       
   250 +src_processor_minidump_unittest_SOURCES = \
       
   251 +	src/processor/minidump_unittest.cc \
       
   252 +	src/testing/gtest/src/gtest-all.cc \
       
   253 +	src/testing/src/gmock-all.cc
       
   254 +src_processor_minidump_unittest_CPPFLAGS = \
       
   255 +	-I$(top_srcdir)/src/testing/include \
       
   256 +        -I$(top_srcdir)/src/testing/gtest/include \
       
   257 +	-I$(top_srcdir)/src/testing/gtest \
       
   258 +	-I$(top_srcdir)/src/testing
       
   259 +src_processor_minidump_unittest_LDADD = \
       
   260 +	src/processor/basic_code_modules.lo \
       
   261 +	src/processor/logging.lo \
       
   262 +	src/processor/minidump.lo \
       
   263 +	src/processor/pathname_stripper.lo
       
   264 +
       
   265  src_processor_pathname_stripper_unittest_SOURCES = \
       
   266  	src/processor/pathname_stripper_unittest.cc
       
   267  src_processor_pathname_stripper_unittest_LDADD = \
       
   268  	src/processor/pathname_stripper.lo
       
   269  
       
   270  src_processor_postfix_evaluator_unittest_SOURCES = \
       
   271  	src/processor/postfix_evaluator_unittest.cc
       
   272  src_processor_postfix_evaluator_unittest_LDADD = \
       
   273 @@ -191,16 +217,17 @@ src_processor_stackwalker_selftest_LDADD
       
   274  	src/processor/basic_code_modules.lo \
       
   275  	src/processor/basic_source_line_resolver.lo \
       
   276  	src/processor/call_stack.lo \
       
   277  	src/processor/logging.lo \
       
   278  	src/processor/minidump.lo \
       
   279  	src/processor/pathname_stripper.lo \
       
   280  	src/processor/stackwalker.lo \
       
   281  	src/processor/stackwalker_amd64.lo \
       
   282 +	src/processor/stackwalker_arm.lo \
       
   283  	src/processor/stackwalker_ppc.lo \
       
   284  	src/processor/stackwalker_sparc.lo \
       
   285  	src/processor/stackwalker_x86.lo
       
   286  
       
   287  ## Non-installables
       
   288  noinst_PROGRAMS =
       
   289  noinst_SCRIPTS = $(check_SCRIPTS)
       
   290  
       
   291 @@ -221,16 +248,17 @@ src_processor_minidump_stackwalk_LDADD =
       
   292  	src/processor/logging.lo \
       
   293  	src/processor/minidump.lo \
       
   294  	src/processor/minidump_processor.lo \
       
   295  	src/processor/pathname_stripper.lo \
       
   296  	src/processor/process_state.lo \
       
   297  	src/processor/simple_symbol_supplier.lo \
       
   298  	src/processor/stackwalker.lo \
       
   299  	src/processor/stackwalker_amd64.lo \
       
   300 +	src/processor/stackwalker_arm.lo \
       
   301  	src/processor/stackwalker_ppc.lo \
       
   302  	src/processor/stackwalker_sparc.lo \
       
   303  	src/processor/stackwalker_x86.lo
       
   304  
       
   305  
       
   306  ## Additional files to be included in a source distribution
       
   307  ##
       
   308  ## find src/client src/common src/processor/testdata src/tools \
       
   309 diff --git a/toolkit/crashreporter/google-breakpad/Makefile.in b/toolkit/crashreporter/google-breakpad/Makefile.in
       
   310 --- a/toolkit/crashreporter/google-breakpad/Makefile.in
       
   311 +++ b/toolkit/crashreporter/google-breakpad/Makefile.in
       
   312 @@ -142,18 +142,19 @@ src_processor_contained_range_map_unitte
       
   313  	src/processor/logging.lo src/processor/pathname_stripper.lo
       
   314  am_src_processor_minidump_dump_OBJECTS =  \
       
   315  	src/processor/minidump_dump.$(OBJEXT)
       
   316  src_processor_minidump_dump_OBJECTS =  \
       
   317  	$(am_src_processor_minidump_dump_OBJECTS)
       
   318  src_processor_minidump_dump_DEPENDENCIES =  \
       
   319  	src/processor/basic_code_modules.lo src/processor/logging.lo \
       
   320  	src/processor/minidump.lo src/processor/pathname_stripper.lo
       
   321 -am_src_processor_minidump_processor_unittest_OBJECTS =  \
       
   322 -	src/processor/minidump_processor_unittest.$(OBJEXT)
       
   323 +am_src_processor_minidump_processor_unittest_OBJECTS = src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT) \
       
   324 +	src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.$(OBJEXT) \
       
   325 +	src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT)
       
   326  src_processor_minidump_processor_unittest_OBJECTS =  \
       
   327  	$(am_src_processor_minidump_processor_unittest_OBJECTS)
       
   328  src_processor_minidump_processor_unittest_DEPENDENCIES =  \
       
   329  	src/processor/basic_code_modules.lo \
       
   330  	src/processor/basic_source_line_resolver.lo \
       
   331  	src/processor/call_stack.lo src/processor/logging.lo \
       
   332  	src/processor/minidump_processor.lo src/processor/minidump.lo \
       
   333  	src/processor/pathname_stripper.lo \
       
   334 @@ -284,16 +285,17 @@ CPP = @CPP@
       
   335  CPPFLAGS = @CPPFLAGS@
       
   336  CXX = @CXX@
       
   337  CXXCPP = @CXXCPP@
       
   338  CXXDEPMODE = @CXXDEPMODE@
       
   339  CXXFLAGS = @CXXFLAGS@
       
   340  CYGPATH_W = @CYGPATH_W@
       
   341  DEFS = @DEFS@
       
   342  DEPDIR = @DEPDIR@
       
   343 +DSYMUTIL = @DSYMUTIL@
       
   344  ECHO = @ECHO@
       
   345  ECHO_C = @ECHO_C@
       
   346  ECHO_N = @ECHO_N@
       
   347  ECHO_T = @ECHO_T@
       
   348  EGREP = @EGREP@
       
   349  EXEEXT = @EXEEXT@
       
   350  F77 = @F77@
       
   351  FFLAGS = @FFLAGS@
       
   352 @@ -307,25 +309,27 @@ LDFLAGS = @LDFLAGS@
       
   353  LIBOBJS = @LIBOBJS@
       
   354  LIBS = @LIBS@
       
   355  LIBTOOL = @LIBTOOL@
       
   356  LIBTOOL_DEPS = @LIBTOOL_DEPS@
       
   357  LN_S = @LN_S@
       
   358  LTLIBOBJS = @LTLIBOBJS@
       
   359  MAKEINFO = @MAKEINFO@
       
   360  MKDIR_P = @MKDIR_P@
       
   361 +NMEDIT = @NMEDIT@
       
   362  OBJEXT = @OBJEXT@
       
   363  PACKAGE = @PACKAGE@
       
   364  PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
       
   365  PACKAGE_NAME = @PACKAGE_NAME@
       
   366  PACKAGE_STRING = @PACKAGE_STRING@
       
   367  PACKAGE_TARNAME = @PACKAGE_TARNAME@
       
   368  PACKAGE_VERSION = @PACKAGE_VERSION@
       
   369  PATH_SEPARATOR = @PATH_SEPARATOR@
       
   370  RANLIB = @RANLIB@
       
   371 +SED = @SED@
       
   372  SET_MAKE = @SET_MAKE@
       
   373  SHELL = @SHELL@
       
   374  STRIP = @STRIP@
       
   375  VERSION = @VERSION@
       
   376  abs_builddir = @abs_builddir@
       
   377  abs_srcdir = @abs_srcdir@
       
   378  abs_top_builddir = @abs_top_builddir@
       
   379  abs_top_srcdir = @abs_top_srcdir@
       
   380 @@ -466,17 +470,25 @@ src_processor_basic_source_line_resolver
       
   381  src_processor_contained_range_map_unittest_SOURCES = \
       
   382  	src/processor/contained_range_map_unittest.cc
       
   383  
       
   384  src_processor_contained_range_map_unittest_LDADD = \
       
   385  	src/processor/logging.lo \
       
   386  	src/processor/pathname_stripper.lo
       
   387  
       
   388  src_processor_minidump_processor_unittest_SOURCES = \
       
   389 -	src/processor/minidump_processor_unittest.cc
       
   390 +	src/processor/minidump_processor_unittest.cc \
       
   391 +	src/testing/gtest/src/gtest-all.cc \
       
   392 +	src/testing/src/gmock-all.cc
       
   393 +
       
   394 +src_processor_minidump_processor_unittest_CPPFLAGS = \
       
   395 +	-I$(top_srcdir)/src/testing/include \
       
   396 +        -I$(top_srcdir)/src/testing/gtest/include \
       
   397 +	-I$(top_srcdir)/src/testing/gtest \
       
   398 +	-I$(top_srcdir)/src/testing
       
   399  
       
   400  src_processor_minidump_processor_unittest_LDADD = \
       
   401  	src/processor/basic_code_modules.lo \
       
   402  	src/processor/basic_source_line_resolver.lo \
       
   403  	src/processor/call_stack.lo \
       
   404  	src/processor/logging.lo \
       
   405  	src/processor/minidump_processor.lo \
       
   406  	src/processor/minidump.lo \
       
   407 @@ -866,19 +878,37 @@ src/processor/contained_range_map_unitte
       
   408  src/processor/contained_range_map_unittest$(EXEEXT): $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
       
   409  	@rm -f src/processor/contained_range_map_unittest$(EXEEXT)
       
   410  	$(CXXLINK) $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_LDADD) $(LIBS)
       
   411  src/processor/minidump_dump.$(OBJEXT): src/processor/$(am__dirstamp) \
       
   412  	src/processor/$(DEPDIR)/$(am__dirstamp)
       
   413  src/processor/minidump_dump$(EXEEXT): $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_DEPENDENCIES) src/processor/$(am__dirstamp)
       
   414  	@rm -f src/processor/minidump_dump$(EXEEXT)
       
   415  	$(CXXLINK) $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_LDADD) $(LIBS)
       
   416 -src/processor/minidump_processor_unittest.$(OBJEXT):  \
       
   417 +src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT):  \
       
   418  	src/processor/$(am__dirstamp) \
       
   419  	src/processor/$(DEPDIR)/$(am__dirstamp)
       
   420 +src/testing/gtest/src/$(am__dirstamp):
       
   421 +	@$(MKDIR_P) src/testing/gtest/src
       
   422 +	@: > src/testing/gtest/src/$(am__dirstamp)
       
   423 +src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp):
       
   424 +	@$(MKDIR_P) src/testing/gtest/src/$(DEPDIR)
       
   425 +	@: > src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
       
   426 +src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.$(OBJEXT):  \
       
   427 +	src/testing/gtest/src/$(am__dirstamp) \
       
   428 +	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
       
   429 +src/testing/src/$(am__dirstamp):
       
   430 +	@$(MKDIR_P) src/testing/src
       
   431 +	@: > src/testing/src/$(am__dirstamp)
       
   432 +src/testing/src/$(DEPDIR)/$(am__dirstamp):
       
   433 +	@$(MKDIR_P) src/testing/src/$(DEPDIR)
       
   434 +	@: > src/testing/src/$(DEPDIR)/$(am__dirstamp)
       
   435 +src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT):  \
       
   436 +	src/testing/src/$(am__dirstamp) \
       
   437 +	src/testing/src/$(DEPDIR)/$(am__dirstamp)
       
   438  src/processor/minidump_processor_unittest$(EXEEXT): $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
       
   439  	@rm -f src/processor/minidump_processor_unittest$(EXEEXT)
       
   440  	$(CXXLINK) $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_LDADD) $(LIBS)
       
   441  src/processor/minidump_stackwalk.$(OBJEXT):  \
       
   442  	src/processor/$(am__dirstamp) \
       
   443  	src/processor/$(DEPDIR)/$(am__dirstamp)
       
   444  src/processor/minidump_stackwalk$(EXEEXT): $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_DEPENDENCIES) src/processor/$(am__dirstamp)
       
   445  	@rm -f src/processor/minidump_stackwalk$(EXEEXT)
       
   446 @@ -921,66 +951,70 @@ mostlyclean-compile:
       
   447  	-rm -f src/processor/contained_range_map_unittest.$(OBJEXT)
       
   448  	-rm -f src/processor/logging.$(OBJEXT)
       
   449  	-rm -f src/processor/logging.lo
       
   450  	-rm -f src/processor/minidump.$(OBJEXT)
       
   451  	-rm -f src/processor/minidump.lo
       
   452  	-rm -f src/processor/minidump_dump.$(OBJEXT)
       
   453  	-rm -f src/processor/minidump_processor.$(OBJEXT)
       
   454  	-rm -f src/processor/minidump_processor.lo
       
   455 -	-rm -f src/processor/minidump_processor_unittest.$(OBJEXT)
       
   456  	-rm -f src/processor/minidump_stackwalk.$(OBJEXT)
       
   457  	-rm -f src/processor/pathname_stripper.$(OBJEXT)
       
   458  	-rm -f src/processor/pathname_stripper.lo
       
   459  	-rm -f src/processor/pathname_stripper_unittest.$(OBJEXT)
       
   460  	-rm -f src/processor/postfix_evaluator_unittest.$(OBJEXT)
       
   461  	-rm -f src/processor/process_state.$(OBJEXT)
       
   462  	-rm -f src/processor/process_state.lo
       
   463  	-rm -f src/processor/range_map_unittest.$(OBJEXT)
       
   464  	-rm -f src/processor/simple_symbol_supplier.$(OBJEXT)
       
   465  	-rm -f src/processor/simple_symbol_supplier.lo
       
   466 +	-rm -f src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT)
       
   467  	-rm -f src/processor/stackwalker.$(OBJEXT)
       
   468  	-rm -f src/processor/stackwalker.lo
       
   469  	-rm -f src/processor/stackwalker_amd64.$(OBJEXT)
       
   470  	-rm -f src/processor/stackwalker_amd64.lo
       
   471  	-rm -f src/processor/stackwalker_ppc.$(OBJEXT)
       
   472  	-rm -f src/processor/stackwalker_ppc.lo
       
   473  	-rm -f src/processor/stackwalker_selftest.$(OBJEXT)
       
   474  	-rm -f src/processor/stackwalker_sparc.$(OBJEXT)
       
   475  	-rm -f src/processor/stackwalker_sparc.lo
       
   476  	-rm -f src/processor/stackwalker_x86.$(OBJEXT)
       
   477  	-rm -f src/processor/stackwalker_x86.lo
       
   478 +	-rm -f src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.$(OBJEXT)
       
   479 +	-rm -f src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT)
       
   480  
       
   481  distclean-compile:
       
   482  	-rm -f *.tab.c
       
   483  
       
   484  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/address_map_unittest.Po@am__quote@
       
   485  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/basic_code_modules.Plo@am__quote@
       
   486  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/basic_source_line_resolver.Plo@am__quote@
       
   487  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/basic_source_line_resolver_unittest.Po@am__quote@
       
   488  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/call_stack.Plo@am__quote@
       
   489  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/contained_range_map_unittest.Po@am__quote@
       
   490  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/logging.Plo@am__quote@
       
   491  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump.Plo@am__quote@
       
   492  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_dump.Po@am__quote@
       
   493  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_processor.Plo@am__quote@
       
   494 -@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_processor_unittest.Po@am__quote@
       
   495  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/minidump_stackwalk.Po@am__quote@
       
   496  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/pathname_stripper.Plo@am__quote@
       
   497  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/pathname_stripper_unittest.Po@am__quote@
       
   498  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/postfix_evaluator_unittest.Po@am__quote@
       
   499  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/process_state.Plo@am__quote@
       
   500  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/range_map_unittest.Po@am__quote@
       
   501  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/simple_symbol_supplier.Plo@am__quote@
       
   502 +@AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Po@am__quote@
       
   503  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker.Plo@am__quote@
       
   504  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_amd64.Plo@am__quote@
       
   505  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_ppc.Plo@am__quote@
       
   506  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_selftest.Po@am__quote@
       
   507  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_sparc.Plo@am__quote@
       
   508  @AMDEP_TRUE@@am__include@ @am__quote@src/processor/$(DEPDIR)/stackwalker_x86.Plo@am__quote@
       
   509 +@AMDEP_TRUE@@am__include@ @am__quote@src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Po@am__quote@
       
   510 +@AMDEP_TRUE@@am__include@ @am__quote@src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Po@am__quote@
       
   511  
       
   512  .cc.o:
       
   513  @am__fastdepCXX_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
       
   514  @am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
       
   515  @am__fastdepCXX_TRUE@	mv -f $$depbase.Tpo $$depbase.Po
       
   516  @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
       
   517  @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
       
   518  @am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
       
   519 @@ -996,16 +1030,58 @@ distclean-compile:
       
   520  .cc.lo:
       
   521  @am__fastdepCXX_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
       
   522  @am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
       
   523  @am__fastdepCXX_TRUE@	mv -f $$depbase.Tpo $$depbase.Plo
       
   524  @AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
       
   525  @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
       
   526  @am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
       
   527  
       
   528 +src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.o: src/processor/minidump_processor_unittest.cc
       
   529 +@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.o -MD -MP -MF src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Tpo -c -o src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.o `test -f 'src/processor/minidump_processor_unittest.cc' || echo '$(srcdir)/'`src/processor/minidump_processor_unittest.cc
       
   530 +@am__fastdepCXX_TRUE@	mv -f src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Tpo src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Po
       
   531 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='src/processor/minidump_processor_unittest.cc' object='src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.o' libtool=no @AMDEPBACKSLASH@
       
   532 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
       
   533 +@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.o `test -f 'src/processor/minidump_processor_unittest.cc' || echo '$(srcdir)/'`src/processor/minidump_processor_unittest.cc
       
   534 +
       
   535 +src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.obj: src/processor/minidump_processor_unittest.cc
       
   536 +@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.obj -MD -MP -MF src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Tpo -c -o src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.obj `if test -f 'src/processor/minidump_processor_unittest.cc'; then $(CYGPATH_W) 'src/processor/minidump_processor_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/minidump_processor_unittest.cc'; fi`
       
   537 +@am__fastdepCXX_TRUE@	mv -f src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Tpo src/processor/$(DEPDIR)/src_processor_minidump_processor_unittest-minidump_processor_unittest.Po
       
   538 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='src/processor/minidump_processor_unittest.cc' object='src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.obj' libtool=no @AMDEPBACKSLASH@
       
   539 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
       
   540 +@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.obj `if test -f 'src/processor/minidump_processor_unittest.cc'; then $(CYGPATH_W) 'src/processor/minidump_processor_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/src/processor/minidump_processor_unittest.cc'; fi`
       
   541 +
       
   542 +src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.o: src/testing/gtest/src/gtest-all.cc
       
   543 +@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.o -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
       
   544 +@am__fastdepCXX_TRUE@	mv -f src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Po
       
   545 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.o' libtool=no @AMDEPBACKSLASH@
       
   546 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
       
   547 +@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.o `test -f 'src/testing/gtest/src/gtest-all.cc' || echo '$(srcdir)/'`src/testing/gtest/src/gtest-all.cc
       
   548 +
       
   549 +src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.obj: src/testing/gtest/src/gtest-all.cc
       
   550 +@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.obj -MD -MP -MF src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Tpo -c -o src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
       
   551 +@am__fastdepCXX_TRUE@	mv -f src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Tpo src/testing/gtest/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gtest-all.Po
       
   552 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='src/testing/gtest/src/gtest-all.cc' object='src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
       
   553 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
       
   554 +@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.obj `if test -f 'src/testing/gtest/src/gtest-all.cc'; then $(CYGPATH_W) 'src/testing/gtest/src/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/gtest/src/gtest-all.cc'; fi`
       
   555 +
       
   556 +src/testing/src/src_processor_minidump_processor_unittest-gmock-all.o: src/testing/src/gmock-all.cc
       
   557 +@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_minidump_processor_unittest-gmock-all.o -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_minidump_processor_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
       
   558 +@am__fastdepCXX_TRUE@	mv -f src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Po
       
   559 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_minidump_processor_unittest-gmock-all.o' libtool=no @AMDEPBACKSLASH@
       
   560 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
       
   561 +@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_minidump_processor_unittest-gmock-all.o `test -f 'src/testing/src/gmock-all.cc' || echo '$(srcdir)/'`src/testing/src/gmock-all.cc
       
   562 +
       
   563 +src/testing/src/src_processor_minidump_processor_unittest-gmock-all.obj: src/testing/src/gmock-all.cc
       
   564 +@am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/testing/src/src_processor_minidump_processor_unittest-gmock-all.obj -MD -MP -MF src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Tpo -c -o src/testing/src/src_processor_minidump_processor_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
       
   565 +@am__fastdepCXX_TRUE@	mv -f src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Tpo src/testing/src/$(DEPDIR)/src_processor_minidump_processor_unittest-gmock-all.Po
       
   566 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='src/testing/src/gmock-all.cc' object='src/testing/src/src_processor_minidump_processor_unittest-gmock-all.obj' libtool=no @AMDEPBACKSLASH@
       
   567 +@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
       
   568 +@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_processor_minidump_processor_unittest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/testing/src/src_processor_minidump_processor_unittest-gmock-all.obj `if test -f 'src/testing/src/gmock-all.cc'; then $(CYGPATH_W) 'src/testing/src/gmock-all.cc'; else $(CYGPATH_W) '$(srcdir)/src/testing/src/gmock-all.cc'; fi`
       
   569 +
       
   570  mostlyclean-libtool:
       
   571  	-rm -f *.lo
       
   572  
       
   573  clean-libtool:
       
   574  	-rm -rf .libs _libs
       
   575  	-rm -rf src/.libs src/_libs
       
   576  	-rm -rf src/processor/.libs src/processor/_libs
       
   577  
       
   578 @@ -1304,29 +1380,33 @@ mostlyclean-generic:
       
   579  
       
   580  clean-generic:
       
   581  
       
   582  distclean-generic:
       
   583  	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
       
   584  	-rm -f src/$(am__dirstamp)
       
   585  	-rm -f src/processor/$(DEPDIR)/$(am__dirstamp)
       
   586  	-rm -f src/processor/$(am__dirstamp)
       
   587 +	-rm -f src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
       
   588 +	-rm -f src/testing/gtest/src/$(am__dirstamp)
       
   589 +	-rm -f src/testing/src/$(DEPDIR)/$(am__dirstamp)
       
   590 +	-rm -f src/testing/src/$(am__dirstamp)
       
   591  
       
   592  maintainer-clean-generic:
       
   593  	@echo "This command is intended for maintainers to use"
       
   594  	@echo "it deletes files that may require special tools to rebuild."
       
   595  clean: clean-am
       
   596  
       
   597  clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
       
   598  	clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \
       
   599  	mostlyclean-am
       
   600  
       
   601  distclean: distclean-am
       
   602  	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
       
   603 -	-rm -rf src/processor/$(DEPDIR)
       
   604 +	-rm -rf src/processor/$(DEPDIR) src/testing/gtest/src/$(DEPDIR) src/testing/src/$(DEPDIR)
       
   605  	-rm -f Makefile
       
   606  distclean-am: clean-am distclean-compile distclean-generic \
       
   607  	distclean-hdr distclean-libtool distclean-tags
       
   608  
       
   609  dvi: dvi-am
       
   610  
       
   611  dvi-am:
       
   612  
       
   613 @@ -1352,17 +1432,17 @@ install-pdf: install-pdf-am
       
   614  
       
   615  install-ps: install-ps-am
       
   616  
       
   617  installcheck-am:
       
   618  
       
   619  maintainer-clean: maintainer-clean-am
       
   620  	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
       
   621  	-rm -rf $(top_srcdir)/autom4te.cache
       
   622 -	-rm -rf src/processor/$(DEPDIR)
       
   623 +	-rm -rf src/processor/$(DEPDIR) src/testing/gtest/src/$(DEPDIR) src/testing/src/$(DEPDIR)
       
   624  	-rm -f Makefile
       
   625  maintainer-clean-am: distclean-am maintainer-clean-generic
       
   626  
       
   627  mostlyclean: mostlyclean-am
       
   628  
       
   629  mostlyclean-am: mostlyclean-compile mostlyclean-generic \
       
   630  	mostlyclean-libtool
       
   631  
       
   632 diff --git a/toolkit/crashreporter/google-breakpad/aclocal.m4 b/toolkit/crashreporter/google-breakpad/aclocal.m4
       
   633 --- a/toolkit/crashreporter/google-breakpad/aclocal.m4
       
   634 +++ b/toolkit/crashreporter/google-breakpad/aclocal.m4
       
   635 @@ -13,17 +13,17 @@
       
   636  
       
   637  m4_if(m4_PACKAGE_VERSION, [2.61],,
       
   638  [m4_fatal([this file was generated for autoconf 2.61.
       
   639  You have another version of autoconf.  If you want to use that,
       
   640  you should regenerate the build system entirely.], [63])])
       
   641  
       
   642  # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
       
   643  
       
   644 -# serial 48 AC_PROG_LIBTOOL
       
   645 +# serial 52 AC_PROG_LIBTOOL
       
   646  
       
   647  
       
   648  # AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
       
   649  # -----------------------------------------------------------
       
   650  # If this macro is not defined by Autoconf, define it here.
       
   651  m4_ifdef([AC_PROVIDE_IFELSE],
       
   652           [],
       
   653           [m4_define([AC_PROVIDE_IFELSE],
       
   654 @@ -101,17 +101,16 @@ AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
       
   655  AC_REQUIRE([AC_PROG_NM])dnl
       
   656  
       
   657  AC_REQUIRE([AC_PROG_LN_S])dnl
       
   658  AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
       
   659  # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
       
   660  AC_REQUIRE([AC_OBJEXT])dnl
       
   661  AC_REQUIRE([AC_EXEEXT])dnl
       
   662  dnl
       
   663 -
       
   664  AC_LIBTOOL_SYS_MAX_CMD_LEN
       
   665  AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
       
   666  AC_LIBTOOL_OBJDIR
       
   667  
       
   668  AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
       
   669  _LT_AC_PROG_ECHO_BACKSLASH
       
   670  
       
   671  case $host_os in
       
   672 @@ -176,17 +175,17 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file
       
   673  test -z "$NM" && NM=nm
       
   674  test -z "$SED" && SED=sed
       
   675  test -z "$OBJDUMP" && OBJDUMP=objdump
       
   676  test -z "$RANLIB" && RANLIB=:
       
   677  test -z "$STRIP" && STRIP=:
       
   678  test -z "$ac_objext" && ac_objext=o
       
   679  
       
   680  # Determine commands to create old-style static archives.
       
   681 -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
       
   682 +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
       
   683  old_postinstall_cmds='chmod 644 $oldlib'
       
   684  old_postuninstall_cmds=
       
   685  
       
   686  if test -n "$RANLIB"; then
       
   687    case $host_os in
       
   688    openbsd*)
       
   689      old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
       
   690      ;;
       
   691 @@ -203,16 +202,18 @@ _LT_CC_BASENAME([$compiler])
       
   692  case $deplibs_check_method in
       
   693  file_magic*)
       
   694    if test "$file_magic_cmd" = '$MAGIC_CMD'; then
       
   695      AC_PATH_MAGIC
       
   696    fi
       
   697    ;;
       
   698  esac
       
   699  
       
   700 +_LT_REQUIRED_DARWIN_CHECKS
       
   701 +
       
   702  AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
       
   703  AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
       
   704  enable_win32_dll=yes, enable_win32_dll=no)
       
   705  
       
   706  AC_ARG_ENABLE([libtool-lock],
       
   707      [AC_HELP_STRING([--disable-libtool-lock],
       
   708  	[avoid locking (might break parallel builds)])])
       
   709  test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
       
   710 @@ -263,52 +264,133 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -
       
   711  ])
       
   712  
       
   713  
       
   714  # _LT_COMPILER_BOILERPLATE
       
   715  # ------------------------
       
   716  # Check for compiler boilerplate output or warnings with
       
   717  # the simple compiler test code.
       
   718  AC_DEFUN([_LT_COMPILER_BOILERPLATE],
       
   719 -[ac_outfile=conftest.$ac_objext
       
   720 -printf "$lt_simple_compile_test_code" >conftest.$ac_ext
       
   721 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
   722 +ac_outfile=conftest.$ac_objext
       
   723 +echo "$lt_simple_compile_test_code" >conftest.$ac_ext
       
   724  eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
   725  _lt_compiler_boilerplate=`cat conftest.err`
       
   726  $rm conftest*
       
   727  ])# _LT_COMPILER_BOILERPLATE
       
   728  
       
   729  
       
   730  # _LT_LINKER_BOILERPLATE
       
   731  # ----------------------
       
   732  # Check for linker boilerplate output or warnings with
       
   733  # the simple link test code.
       
   734  AC_DEFUN([_LT_LINKER_BOILERPLATE],
       
   735 -[ac_outfile=conftest.$ac_objext
       
   736 -printf "$lt_simple_link_test_code" >conftest.$ac_ext
       
   737 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
   738 +ac_outfile=conftest.$ac_objext
       
   739 +echo "$lt_simple_link_test_code" >conftest.$ac_ext
       
   740  eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
   741  _lt_linker_boilerplate=`cat conftest.err`
       
   742 -$rm conftest*
       
   743 +$rm -r conftest*
       
   744  ])# _LT_LINKER_BOILERPLATE
       
   745  
       
   746 +# _LT_REQUIRED_DARWIN_CHECKS
       
   747 +# --------------------------
       
   748 +# Check for some things on darwin
       
   749 +AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[
       
   750 +  case $host_os in
       
   751 +    rhapsody* | darwin*)
       
   752 +    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
       
   753 +    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
       
   754 +
       
   755 +    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
       
   756 +      [lt_cv_apple_cc_single_mod=no
       
   757 +      if test -z "${LT_MULTI_MODULE}"; then
       
   758 +   # By default we will add the -single_module flag. You can override
       
   759 +   # by either setting the environment variable LT_MULTI_MODULE
       
   760 +   # non-empty at configure time, or by adding -multi_module to the
       
   761 +   # link flags.
       
   762 +   echo "int foo(void){return 1;}" > conftest.c
       
   763 +   $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
       
   764 +     -dynamiclib ${wl}-single_module conftest.c
       
   765 +   if test -f libconftest.dylib; then
       
   766 +     lt_cv_apple_cc_single_mod=yes
       
   767 +     rm -rf libconftest.dylib*
       
   768 +   fi
       
   769 +   rm conftest.c
       
   770 +      fi])
       
   771 +    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
       
   772 +      [lt_cv_ld_exported_symbols_list],
       
   773 +      [lt_cv_ld_exported_symbols_list=no
       
   774 +      save_LDFLAGS=$LDFLAGS
       
   775 +      echo "_main" > conftest.sym
       
   776 +      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
       
   777 +      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
       
   778 +   [lt_cv_ld_exported_symbols_list=yes],
       
   779 +   [lt_cv_ld_exported_symbols_list=no])
       
   780 +   LDFLAGS="$save_LDFLAGS"
       
   781 +    ])
       
   782 +    case $host_os in
       
   783 +    rhapsody* | darwin1.[[0123]])
       
   784 +      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
       
   785 +    darwin1.*)
       
   786 +     _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
       
   787 +    darwin*)
       
   788 +      # if running on 10.5 or later, the deployment target defaults
       
   789 +      # to the OS version, if on x86, and 10.4, the deployment
       
   790 +      # target defaults to 10.4. Don't you love it?
       
   791 +      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
       
   792 +   10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
       
   793 +     _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
       
   794 +   10.[[012]]*)
       
   795 +     _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
       
   796 +   10.*)
       
   797 +     _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
       
   798 +      esac
       
   799 +    ;;
       
   800 +  esac
       
   801 +    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
       
   802 +      _lt_dar_single_mod='$single_module'
       
   803 +    fi
       
   804 +    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
       
   805 +      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
       
   806 +    else
       
   807 +      _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}"
       
   808 +    fi
       
   809 +    if test "$DSYMUTIL" != ":"; then
       
   810 +      _lt_dsymutil="~$DSYMUTIL \$lib || :"
       
   811 +    else
       
   812 +      _lt_dsymutil=
       
   813 +    fi
       
   814 +    ;;
       
   815 +  esac
       
   816 +])
       
   817  
       
   818  # _LT_AC_SYS_LIBPATH_AIX
       
   819  # ----------------------
       
   820  # Links a minimal program and checks the executable
       
   821  # for the system default hardcoded library path. In most cases,
       
   822  # this is /usr/lib:/lib, but when the MPI compilers are used
       
   823  # the location of the communication and MPI libs are included too.
       
   824  # If we don't find anything, use the default library path according
       
   825  # to the aix ld manual.
       
   826  AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
       
   827 -[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
       
   828 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
   829 -}'`
       
   830 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
   831 +AC_LINK_IFELSE(AC_LANG_PROGRAM,[
       
   832 +lt_aix_libpath_sed='
       
   833 +    /Import File Strings/,/^$/ {
       
   834 +	/^0/ {
       
   835 +	    s/^0  *\(.*\)$/\1/
       
   836 +	    p
       
   837 +	}
       
   838 +    }'
       
   839 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
   840  # Check for a 64-bit object if we didn't find anything.
       
   841 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
   842 -}'`; fi],[])
       
   843 +if test -z "$aix_libpath"; then
       
   844 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
   845 +fi],[])
       
   846  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
       
   847  ])# _LT_AC_SYS_LIBPATH_AIX
       
   848  
       
   849  
       
   850  # _LT_AC_SHELL_INIT(ARG)
       
   851  # ----------------------
       
   852  AC_DEFUN([_LT_AC_SHELL_INIT],
       
   853  [ifdef([AC_DIVERSION_NOTICE],
       
   854 @@ -529,39 +611,46 @@ ia64-*-hpux*)
       
   855        LD="${LD-ld} -64"
       
   856        ;;
       
   857      esac
       
   858     fi
       
   859    fi
       
   860    rm -rf conftest*
       
   861    ;;
       
   862  
       
   863 -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
       
   864 +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
       
   865 +s390*-*linux*|sparc*-*linux*)
       
   866    # Find out which ABI we are using.
       
   867    echo 'int i;' > conftest.$ac_ext
       
   868    if AC_TRY_EVAL(ac_compile); then
       
   869      case `/usr/bin/file conftest.o` in
       
   870      *32-bit*)
       
   871        case $host in
       
   872 +        x86_64-*kfreebsd*-gnu)
       
   873 +          LD="${LD-ld} -m elf_i386_fbsd"
       
   874 +          ;;
       
   875          x86_64-*linux*)
       
   876            LD="${LD-ld} -m elf_i386"
       
   877            ;;
       
   878          ppc64-*linux*|powerpc64-*linux*)
       
   879            LD="${LD-ld} -m elf32ppclinux"
       
   880            ;;
       
   881          s390x-*linux*)
       
   882            LD="${LD-ld} -m elf_s390"
       
   883            ;;
       
   884          sparc64-*linux*)
       
   885            LD="${LD-ld} -m elf32_sparc"
       
   886            ;;
       
   887        esac
       
   888        ;;
       
   889      *64-bit*)
       
   890        case $host in
       
   891 +        x86_64-*kfreebsd*-gnu)
       
   892 +          LD="${LD-ld} -m elf_x86_64_fbsd"
       
   893 +          ;;
       
   894          x86_64-*linux*)
       
   895            LD="${LD-ld} -m elf_x86_64"
       
   896            ;;
       
   897          ppc*-*linux*|powerpc*-*linux*)
       
   898            LD="${LD-ld} -m elf64ppc"
       
   899            ;;
       
   900          s390*-*linux*)
       
   901            LD="${LD-ld} -m elf64_s390"
       
   902 @@ -592,17 +681,21 @@ x86_64-*linux*|ppc*-*linux*|powerpc*-*li
       
   903  sparc*-*solaris*)
       
   904    # Find out which ABI we are using.
       
   905    echo 'int i;' > conftest.$ac_ext
       
   906    if AC_TRY_EVAL(ac_compile); then
       
   907      case `/usr/bin/file conftest.o` in
       
   908      *64-bit*)
       
   909        case $lt_cv_prog_gnu_ld in
       
   910        yes*) LD="${LD-ld} -m elf64_sparc" ;;
       
   911 -      *)    LD="${LD-ld} -64" ;;
       
   912 +      *)
       
   913 +        if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
       
   914 +	  LD="${LD-ld} -64"
       
   915 +	fi
       
   916 +	;;
       
   917        esac
       
   918        ;;
       
   919      esac
       
   920    fi
       
   921    rm -rf conftest*
       
   922    ;;
       
   923  
       
   924  AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
       
   925 @@ -623,17 +716,17 @@ need_locks="$enable_libtool_lock"
       
   926  #		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
       
   927  # ----------------------------------------------------------------
       
   928  # Check whether the given compiler option works
       
   929  AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
       
   930  [AC_REQUIRE([LT_AC_PROG_SED])
       
   931  AC_CACHE_CHECK([$1], [$2],
       
   932    [$2=no
       
   933    ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
       
   934 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
   935 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
   936     lt_compiler_flag="$3"
       
   937     # Insert the option either (1) after the last *FLAGS variable, or
       
   938     # (2) before a word containing "conftest.", or (3) at the end.
       
   939     # Note that $ac_compile itself does not contain backslashes and begins
       
   940     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
   941     # The option is referenced via a variable to avoid confusing sed.
       
   942     lt_compile=`echo "$ac_compile" | $SED \
       
   943     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
   944 @@ -664,37 +757,38 @@ fi
       
   945  ])# AC_LIBTOOL_COMPILER_OPTION
       
   946  
       
   947  
       
   948  # AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
       
   949  #                          [ACTION-SUCCESS], [ACTION-FAILURE])
       
   950  # ------------------------------------------------------------
       
   951  # Check whether the given compiler option works
       
   952  AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
       
   953 -[AC_CACHE_CHECK([$1], [$2],
       
   954 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
   955 +AC_CACHE_CHECK([$1], [$2],
       
   956    [$2=no
       
   957     save_LDFLAGS="$LDFLAGS"
       
   958     LDFLAGS="$LDFLAGS $3"
       
   959 -   printf "$lt_simple_link_test_code" > conftest.$ac_ext
       
   960 +   echo "$lt_simple_link_test_code" > conftest.$ac_ext
       
   961     if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
       
   962       # The linker can only warn and ignore the option if not recognized
       
   963       # So say no if there are warnings
       
   964       if test -s conftest.err; then
       
   965         # Append any errors to the config.log.
       
   966         cat conftest.err 1>&AS_MESSAGE_LOG_FD
       
   967         $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
       
   968         $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
   969         if diff conftest.exp conftest.er2 >/dev/null; then
       
   970           $2=yes
       
   971         fi
       
   972       else
       
   973         $2=yes
       
   974       fi
       
   975     fi
       
   976 -   $rm conftest*
       
   977 +   $rm -r conftest*
       
   978     LDFLAGS="$save_LDFLAGS"
       
   979  ])
       
   980  
       
   981  if test x"[$]$2" = xyes; then
       
   982      ifelse([$4], , :, [$4])
       
   983  else
       
   984      ifelse([$5], , :, [$5])
       
   985  fi
       
   986 @@ -782,34 +876,37 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [d
       
   987      kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
       
   988      if test -n "$kargmax"; then
       
   989        lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ 	]]//'`
       
   990      else
       
   991        lt_cv_sys_max_cmd_len=32768
       
   992      fi
       
   993      ;;
       
   994    *)
       
   995 -    # If test is not a shell built-in, we'll probably end up computing a
       
   996 -    # maximum length that is only half of the actual maximum length, but
       
   997 -    # we can't tell.
       
   998 -    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       
   999 -    while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
       
  1000 +    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
       
  1001 +    if test -n "$lt_cv_sys_max_cmd_len"; then
       
  1002 +      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       
  1003 +      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
       
  1004 +    else
       
  1005 +      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       
  1006 +      while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
       
  1007  	       = "XX$teststring") >/dev/null 2>&1 &&
       
  1008 -	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
       
  1009 -	    lt_cv_sys_max_cmd_len=$new_result &&
       
  1010 -	    test $i != 17 # 1/2 MB should be enough
       
  1011 -    do
       
  1012 -      i=`expr $i + 1`
       
  1013 -      teststring=$teststring$teststring
       
  1014 -    done
       
  1015 -    teststring=
       
  1016 -    # Add a significant safety factor because C++ compilers can tack on massive
       
  1017 -    # amounts of additional arguments before passing them to the linker.
       
  1018 -    # It appears as though 1/2 is a usable value.
       
  1019 -    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
       
  1020 +	      new_result=`expr "X$teststring" : ".*" 2>&1` &&
       
  1021 +	      lt_cv_sys_max_cmd_len=$new_result &&
       
  1022 +	      test $i != 17 # 1/2 MB should be enough
       
  1023 +      do
       
  1024 +        i=`expr $i + 1`
       
  1025 +        teststring=$teststring$teststring
       
  1026 +      done
       
  1027 +      teststring=
       
  1028 +      # Add a significant safety factor because C++ compilers can tack on massive
       
  1029 +      # amounts of additional arguments before passing them to the linker.
       
  1030 +      # It appears as though 1/2 is a usable value.
       
  1031 +      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
       
  1032 +    fi
       
  1033      ;;
       
  1034    esac
       
  1035  ])
       
  1036  if test -n $lt_cv_sys_max_cmd_len ; then
       
  1037    AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
       
  1038  else
       
  1039    AC_MSG_RESULT(none)
       
  1040  fi
       
  1041 @@ -952,25 +1049,25 @@ else
       
  1042      lt_cv_dlopen_self=yes
       
  1043      ])
       
  1044     ;;
       
  1045  
       
  1046    *)
       
  1047      AC_CHECK_FUNC([shl_load],
       
  1048  	  [lt_cv_dlopen="shl_load"],
       
  1049        [AC_CHECK_LIB([dld], [shl_load],
       
  1050 -	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
       
  1051 +	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
       
  1052  	[AC_CHECK_FUNC([dlopen],
       
  1053  	      [lt_cv_dlopen="dlopen"],
       
  1054  	  [AC_CHECK_LIB([dl], [dlopen],
       
  1055  		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
       
  1056  	    [AC_CHECK_LIB([svld], [dlopen],
       
  1057  		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
       
  1058  	      [AC_CHECK_LIB([dld], [dld_link],
       
  1059 -		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
       
  1060 +		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
       
  1061  	      ])
       
  1062  	    ])
       
  1063  	  ])
       
  1064  	])
       
  1065        ])
       
  1066      ;;
       
  1067    esac
       
  1068  
       
  1069 @@ -1026,25 +1123,26 @@ else
       
  1070  fi
       
  1071  ])# AC_LIBTOOL_DLOPEN_SELF
       
  1072  
       
  1073  
       
  1074  # AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
       
  1075  # ---------------------------------
       
  1076  # Check to see if options -c and -o are simultaneously supported by compiler
       
  1077  AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
       
  1078 -[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
       
  1079 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
  1080 +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
       
  1081  AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
       
  1082    [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
       
  1083    [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
       
  1084     $rm -r conftest 2>/dev/null
       
  1085     mkdir conftest
       
  1086     cd conftest
       
  1087     mkdir out
       
  1088 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  1089 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  1090  
       
  1091     lt_compiler_flag="-o out/conftest2.$ac_objext"
       
  1092     # Insert the option either (1) after the last *FLAGS variable, or
       
  1093     # (2) before a word containing "conftest.", or (3) at the end.
       
  1094     # Note that $ac_compile itself does not contain backslashes and begins
       
  1095     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  1096     lt_compile=`echo "$ac_compile" | $SED \
       
  1097     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  1098 @@ -1174,16 +1272,17 @@ if test -n "$STRIP" && $STRIP -V 2>&1 | 
       
  1099    test -z "$striplib" && striplib="$STRIP --strip-unneeded"
       
  1100    AC_MSG_RESULT([yes])
       
  1101  else
       
  1102  # FIXME - insert some real tests, host_os isn't really good enough
       
  1103    case $host_os in
       
  1104     darwin*)
       
  1105         if test -n "$STRIP" ; then
       
  1106           striplib="$STRIP -x"
       
  1107 +         old_striplib="$STRIP -S"
       
  1108           AC_MSG_RESULT([yes])
       
  1109         else
       
  1110    AC_MSG_RESULT([no])
       
  1111  fi
       
  1112         ;;
       
  1113     *)
       
  1114    AC_MSG_RESULT([no])
       
  1115      ;;
       
  1116 @@ -1191,44 +1290,83 @@ fi
       
  1117  fi
       
  1118  ])# AC_LIBTOOL_SYS_LIB_STRIP
       
  1119  
       
  1120  
       
  1121  # AC_LIBTOOL_SYS_DYNAMIC_LINKER
       
  1122  # -----------------------------
       
  1123  # PORTME Fill in your ld.so characteristics
       
  1124  AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
       
  1125 -[AC_MSG_CHECKING([dynamic linker characteristics])
       
  1126 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
  1127 +AC_MSG_CHECKING([dynamic linker characteristics])
       
  1128  library_names_spec=
       
  1129  libname_spec='lib$name'
       
  1130  soname_spec=
       
  1131  shrext_cmds=".so"
       
  1132  postinstall_cmds=
       
  1133  postuninstall_cmds=
       
  1134  finish_cmds=
       
  1135  finish_eval=
       
  1136  shlibpath_var=
       
  1137  shlibpath_overrides_runpath=unknown
       
  1138  version_type=none
       
  1139  dynamic_linker="$host_os ld.so"
       
  1140  sys_lib_dlsearch_path_spec="/lib /usr/lib"
       
  1141 +m4_if($1,[],[
       
  1142  if test "$GCC" = yes; then
       
  1143 -  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
       
  1144 -  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
       
  1145 +  case $host_os in
       
  1146 +    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
       
  1147 +    *) lt_awk_arg="/^libraries:/" ;;
       
  1148 +  esac
       
  1149 +  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
       
  1150 +  if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then
       
  1151      # if the path contains ";" then we assume it to be the separator
       
  1152      # otherwise default to the standard path separator (i.e. ":") - it is
       
  1153      # assumed that no part of a normal pathname contains ";" but that should
       
  1154      # okay in the real world where ";" in dirpaths is itself problematic.
       
  1155 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       
  1156 +    lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'`
       
  1157    else
       
  1158 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       
  1159 +    lt_search_path_spec=`echo "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       
  1160    fi
       
  1161 +  # Ok, now we have the path, separated by spaces, we can step through it
       
  1162 +  # and add multilib dir if necessary.
       
  1163 +  lt_tmp_lt_search_path_spec=
       
  1164 +  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
       
  1165 +  for lt_sys_path in $lt_search_path_spec; do
       
  1166 +    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
       
  1167 +      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
       
  1168 +    else
       
  1169 +      test -d "$lt_sys_path" && \
       
  1170 +	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
       
  1171 +    fi
       
  1172 +  done
       
  1173 +  lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk '
       
  1174 +BEGIN {RS=" "; FS="/|\n";} {
       
  1175 +  lt_foo="";
       
  1176 +  lt_count=0;
       
  1177 +  for (lt_i = NF; lt_i > 0; lt_i--) {
       
  1178 +    if ($lt_i != "" && $lt_i != ".") {
       
  1179 +      if ($lt_i == "..") {
       
  1180 +        lt_count++;
       
  1181 +      } else {
       
  1182 +        if (lt_count == 0) {
       
  1183 +          lt_foo="/" $lt_i lt_foo;
       
  1184 +        } else {
       
  1185 +          lt_count--;
       
  1186 +        }
       
  1187 +      }
       
  1188 +    }
       
  1189 +  }
       
  1190 +  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
       
  1191 +  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
       
  1192 +}'`
       
  1193 +  sys_lib_search_path_spec=`echo $lt_search_path_spec`
       
  1194  else
       
  1195    sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
       
  1196 -fi
       
  1197 +fi])
       
  1198  need_lib_prefix=unknown
       
  1199  hardcode_into_libs=no
       
  1200  
       
  1201  # when you set need_version to no, make sure it does not cause -set_version
       
  1202  # flags to be left without arguments
       
  1203  need_version=unknown
       
  1204  
       
  1205  case $host_os in
       
  1206 @@ -1236,17 +1374,17 @@ aix3*)
       
  1207    version_type=linux
       
  1208    library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
       
  1209    shlibpath_var=LIBPATH
       
  1210  
       
  1211    # AIX 3 has no versioning support, so we append a major version to the name.
       
  1212    soname_spec='${libname}${release}${shared_ext}$major'
       
  1213    ;;
       
  1214  
       
  1215 -aix4* | aix5*)
       
  1216 +aix[[4-9]]*)
       
  1217    version_type=linux
       
  1218    need_lib_prefix=no
       
  1219    need_version=no
       
  1220    hardcode_into_libs=yes
       
  1221    if test "$host_cpu" = ia64; then
       
  1222      # AIX 5 supports IA64
       
  1223      library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
       
  1224      shlibpath_var=LD_LIBRARY_PATH
       
  1225 @@ -1375,50 +1513,34 @@ darwin* | rhapsody*)
       
  1226    version_type=darwin
       
  1227    need_lib_prefix=no
       
  1228    need_version=no
       
  1229    library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
       
  1230    soname_spec='${libname}${release}${major}$shared_ext'
       
  1231    shlibpath_overrides_runpath=yes
       
  1232    shlibpath_var=DYLD_LIBRARY_PATH
       
  1233    shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
       
  1234 -  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
       
  1235 -  if test "$GCC" = yes; then
       
  1236 -    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
       
  1237 -  else
       
  1238 -    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
       
  1239 -  fi
       
  1240 +  m4_if([$1], [],[
       
  1241 +  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) 
       
  1242    sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
       
  1243    ;;
       
  1244  
       
  1245  dgux*)
       
  1246    version_type=linux
       
  1247    need_lib_prefix=no
       
  1248    need_version=no
       
  1249    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
       
  1250    soname_spec='${libname}${release}${shared_ext}$major'
       
  1251    shlibpath_var=LD_LIBRARY_PATH
       
  1252    ;;
       
  1253  
       
  1254  freebsd1*)
       
  1255    dynamic_linker=no
       
  1256    ;;
       
  1257  
       
  1258 -kfreebsd*-gnu)
       
  1259 -  version_type=linux
       
  1260 -  need_lib_prefix=no
       
  1261 -  need_version=no
       
  1262 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  1263 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  1264 -  shlibpath_var=LD_LIBRARY_PATH
       
  1265 -  shlibpath_overrides_runpath=no
       
  1266 -  hardcode_into_libs=yes
       
  1267 -  dynamic_linker='GNU ld.so'
       
  1268 -  ;;
       
  1269 -
       
  1270  freebsd* | dragonfly*)
       
  1271    # DragonFly does not have aout.  When/if they implement a new
       
  1272    # versioning mechanism, adjust this.
       
  1273    if test -x /usr/bin/objformat; then
       
  1274      objformat=`/usr/bin/objformat`
       
  1275    else
       
  1276      case $host_os in
       
  1277      freebsd[[123]]*) objformat=aout ;;
       
  1278 @@ -1446,17 +1568,17 @@ freebsd* | dragonfly*)
       
  1279      shlibpath_overrides_runpath=yes
       
  1280      hardcode_into_libs=yes
       
  1281      ;;
       
  1282    freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
       
  1283    freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
       
  1284      shlibpath_overrides_runpath=no
       
  1285      hardcode_into_libs=yes
       
  1286      ;;
       
  1287 -  freebsd*) # from 4.6 on
       
  1288 +  *) # from 4.6 on, and DragonFly
       
  1289      shlibpath_overrides_runpath=yes
       
  1290      hardcode_into_libs=yes
       
  1291      ;;
       
  1292    esac
       
  1293    ;;
       
  1294  
       
  1295  gnu*)
       
  1296    version_type=linux
       
  1297 @@ -1509,17 +1631,17 @@ hpux9* | hpux10* | hpux11*)
       
  1298      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  1299      soname_spec='${libname}${release}${shared_ext}$major'
       
  1300      ;;
       
  1301    esac
       
  1302    # HP-UX runs *really* slowly unless shared libraries are mode 555.
       
  1303    postinstall_cmds='chmod 555 $lib'
       
  1304    ;;
       
  1305  
       
  1306 -interix3*)
       
  1307 +interix[[3-9]]*)
       
  1308    version_type=linux
       
  1309    need_lib_prefix=no
       
  1310    need_version=no
       
  1311    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  1312    soname_spec='${libname}${release}${shared_ext}$major'
       
  1313    dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
       
  1314    shlibpath_var=LD_LIBRARY_PATH
       
  1315    shlibpath_overrides_runpath=no
       
  1316 @@ -1564,57 +1686,45 @@ irix5* | irix6* | nonstopux*)
       
  1317    ;;
       
  1318  
       
  1319  # No shared lib support for Linux oldld, aout, or coff.
       
  1320  linux*oldld* | linux*aout* | linux*coff*)
       
  1321    dynamic_linker=no
       
  1322    ;;
       
  1323  
       
  1324  # This must be Linux ELF.
       
  1325 -linux*)
       
  1326 +linux* | k*bsd*-gnu)
       
  1327    version_type=linux
       
  1328    need_lib_prefix=no
       
  1329    need_version=no
       
  1330    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  1331    soname_spec='${libname}${release}${shared_ext}$major'
       
  1332    finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
       
  1333    shlibpath_var=LD_LIBRARY_PATH
       
  1334    shlibpath_overrides_runpath=no
       
  1335    # This implies no fast_install, which is unacceptable.
       
  1336    # Some rework will be needed to allow for fast_install
       
  1337    # before this can be enabled.
       
  1338    hardcode_into_libs=yes
       
  1339  
       
  1340    # Append ld.so.conf contents to the search path
       
  1341    if test -f /etc/ld.so.conf; then
       
  1342 -    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  1343 +    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  1344      sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
       
  1345    fi
       
  1346  
       
  1347    # We used to test for /lib/ld.so.1 and disable shared libraries on
       
  1348    # powerpc, because MkLinux only supported shared libraries with the
       
  1349    # GNU dynamic linker.  Since this was broken with cross compilers,
       
  1350    # most powerpc-linux boxes support dynamic linking these days and
       
  1351    # people can always --disable-shared, the test was removed, and we
       
  1352    # assume the GNU/Linux dynamic linker is in use.
       
  1353    dynamic_linker='GNU/Linux ld.so'
       
  1354    ;;
       
  1355  
       
  1356 -knetbsd*-gnu)
       
  1357 -  version_type=linux
       
  1358 -  need_lib_prefix=no
       
  1359 -  need_version=no
       
  1360 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  1361 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  1362 -  shlibpath_var=LD_LIBRARY_PATH
       
  1363 -  shlibpath_overrides_runpath=no
       
  1364 -  hardcode_into_libs=yes
       
  1365 -  dynamic_linker='GNU ld.so'
       
  1366 -  ;;
       
  1367 -
       
  1368  netbsd*)
       
  1369    version_type=sunos
       
  1370    need_lib_prefix=no
       
  1371    need_version=no
       
  1372    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  1373      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
       
  1374      finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
       
  1375      dynamic_linker='NetBSD (a.out) ld.so'
       
  1376 @@ -1686,16 +1796,20 @@ osf3* | osf4* | osf5*)
       
  1377    need_version=no
       
  1378    soname_spec='${libname}${release}${shared_ext}$major'
       
  1379    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  1380    shlibpath_var=LD_LIBRARY_PATH
       
  1381    sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
       
  1382    sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
       
  1383    ;;
       
  1384  
       
  1385 +rdos*)
       
  1386 +  dynamic_linker=no
       
  1387 +  ;;
       
  1388 +
       
  1389  solaris*)
       
  1390    version_type=linux
       
  1391    need_lib_prefix=no
       
  1392    need_version=no
       
  1393    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  1394    soname_spec='${libname}${release}${shared_ext}$major'
       
  1395    shlibpath_var=LD_LIBRARY_PATH
       
  1396    shlibpath_overrides_runpath=yes
       
  1397 @@ -1781,27 +1895,35 @@ uts4*)
       
  1398  
       
  1399  *)
       
  1400    dynamic_linker=no
       
  1401    ;;
       
  1402  esac
       
  1403  AC_MSG_RESULT([$dynamic_linker])
       
  1404  test "$dynamic_linker" = no && can_build_shared=no
       
  1405  
       
  1406 +AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec],
       
  1407 +[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"])
       
  1408 +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
       
  1409 +AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec],
       
  1410 +[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"])
       
  1411 +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
       
  1412 +
       
  1413  variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
       
  1414  if test "$GCC" = yes; then
       
  1415    variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
       
  1416  fi
       
  1417  ])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
       
  1418  
       
  1419  
       
  1420  # _LT_AC_TAGCONFIG
       
  1421  # ----------------
       
  1422  AC_DEFUN([_LT_AC_TAGCONFIG],
       
  1423 -[AC_ARG_WITH([tags],
       
  1424 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
  1425 +AC_ARG_WITH([tags],
       
  1426      [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
       
  1427          [include additional configurations @<:@automatic@:>@])],
       
  1428      [tagnames="$withval"])
       
  1429  
       
  1430  if test -f "$ltmain" && test -n "$tagnames"; then
       
  1431    if test ! -f "${ofile}"; then
       
  1432      AC_MSG_WARN([output file `$ofile' does not exist])
       
  1433    fi
       
  1434 @@ -2052,17 +2174,17 @@ m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC
       
  1435      fi])
       
  1436   EGREP=$ac_cv_prog_egrep
       
  1437   AC_SUBST([EGREP])
       
  1438  ])])
       
  1439  
       
  1440  
       
  1441  # AC_PATH_TOOL_PREFIX
       
  1442  # -------------------
       
  1443 -# find a file program which can recognise shared library
       
  1444 +# find a file program which can recognize shared library
       
  1445  AC_DEFUN([AC_PATH_TOOL_PREFIX],
       
  1446  [AC_REQUIRE([AC_PROG_EGREP])dnl
       
  1447  AC_MSG_CHECKING([for $1])
       
  1448  AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
       
  1449  [case $MAGIC_CMD in
       
  1450  [[\\/*] |  ?:[\\/]*])
       
  1451    lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
       
  1452    ;;
       
  1453 @@ -2115,17 +2237,17 @@ if test -n "$MAGIC_CMD"; then
       
  1454  else
       
  1455    AC_MSG_RESULT(no)
       
  1456  fi
       
  1457  ])# AC_PATH_TOOL_PREFIX
       
  1458  
       
  1459  
       
  1460  # AC_PATH_MAGIC
       
  1461  # -------------
       
  1462 -# find a file program which can recognise a shared library
       
  1463 +# find a file program which can recognize a shared library
       
  1464  AC_DEFUN([AC_PATH_MAGIC],
       
  1465  [AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
       
  1466  if test -z "$lt_cv_path_MAGIC_CMD"; then
       
  1467    if test -n "$ac_tool_prefix"; then
       
  1468      AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
       
  1469    else
       
  1470      MAGIC_CMD=:
       
  1471    fi
       
  1472 @@ -2262,34 +2384,34 @@ esac
       
  1473  ])# AC_PROG_LD_RELOAD_FLAG
       
  1474  
       
  1475  
       
  1476  # AC_DEPLIBS_CHECK_METHOD
       
  1477  # -----------------------
       
  1478  # how to check for library dependencies
       
  1479  #  -- PORTME fill in with the dynamic library characteristics
       
  1480  AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
       
  1481 -[AC_CACHE_CHECK([how to recognise dependent libraries],
       
  1482 +[AC_CACHE_CHECK([how to recognize dependent libraries],
       
  1483  lt_cv_deplibs_check_method,
       
  1484  [lt_cv_file_magic_cmd='$MAGIC_CMD'
       
  1485  lt_cv_file_magic_test_file=
       
  1486  lt_cv_deplibs_check_method='unknown'
       
  1487  # Need to set the preceding variable on all platforms that support
       
  1488  # interlibrary dependencies.
       
  1489  # 'none' -- dependencies not supported.
       
  1490  # `unknown' -- same as none, but documents that we really don't know.
       
  1491  # 'pass_all' -- all dependencies passed with no checks.
       
  1492  # 'test_compile' -- check by making test program.
       
  1493  # 'file_magic [[regex]]' -- check by looking for files in library path
       
  1494  # which responds to the $file_magic_cmd with a given extended regex.
       
  1495  # If you have `file' or equivalent on your system and you're not sure
       
  1496  # whether `pass_all' will *always* work, you probably want this one.
       
  1497  
       
  1498  case $host_os in
       
  1499 -aix4* | aix5*)
       
  1500 +aix[[4-9]]*)
       
  1501    lt_cv_deplibs_check_method=pass_all
       
  1502    ;;
       
  1503  
       
  1504  beos*)
       
  1505    lt_cv_deplibs_check_method=pass_all
       
  1506    ;;
       
  1507  
       
  1508  bsdi[[45]]*)
       
  1509 @@ -2301,26 +2423,32 @@ bsdi[[45]]*)
       
  1510  cygwin*)
       
  1511    # func_win32_libid is a shell function defined in ltmain.sh
       
  1512    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
       
  1513    lt_cv_file_magic_cmd='func_win32_libid'
       
  1514    ;;
       
  1515  
       
  1516  mingw* | pw32*)
       
  1517    # Base MSYS/MinGW do not provide the 'file' command needed by
       
  1518 -  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
       
  1519 -  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
       
  1520 -  lt_cv_file_magic_cmd='$OBJDUMP -f'
       
  1521 +  # func_win32_libid shell function, so use a weaker test based on 'objdump',
       
  1522 +  # unless we find 'file', for example because we are cross-compiling.
       
  1523 +  if ( file / ) >/dev/null 2>&1; then
       
  1524 +    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
       
  1525 +    lt_cv_file_magic_cmd='func_win32_libid'
       
  1526 +  else
       
  1527 +    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
       
  1528 +    lt_cv_file_magic_cmd='$OBJDUMP -f'
       
  1529 +  fi
       
  1530    ;;
       
  1531  
       
  1532  darwin* | rhapsody*)
       
  1533    lt_cv_deplibs_check_method=pass_all
       
  1534    ;;
       
  1535  
       
  1536 -freebsd* | kfreebsd*-gnu | dragonfly*)
       
  1537 +freebsd* | dragonfly*)
       
  1538    if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
       
  1539      case $host_cpu in
       
  1540      i*86 )
       
  1541        # Not sure whether the presence of OpenBSD here was a mistake.
       
  1542        # Let's accept both of them until this is cleared up.
       
  1543        lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
       
  1544        lt_cv_file_magic_cmd=/usr/bin/file
       
  1545        lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
       
  1546 @@ -2348,33 +2476,33 @@ hpux10.20* | hpux11*)
       
  1547      ;;
       
  1548    *)
       
  1549      lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
       
  1550      lt_cv_file_magic_test_file=/usr/lib/libc.sl
       
  1551      ;;
       
  1552    esac
       
  1553    ;;
       
  1554  
       
  1555 -interix3*)
       
  1556 +interix[[3-9]]*)
       
  1557    # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
       
  1558    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
       
  1559    ;;
       
  1560  
       
  1561  irix5* | irix6* | nonstopux*)
       
  1562    case $LD in
       
  1563    *-32|*"-32 ") libmagic=32-bit;;
       
  1564    *-n32|*"-n32 ") libmagic=N32;;
       
  1565    *-64|*"-64 ") libmagic=64-bit;;
       
  1566    *) libmagic=never-match;;
       
  1567    esac
       
  1568    lt_cv_deplibs_check_method=pass_all
       
  1569    ;;
       
  1570  
       
  1571  # This must be Linux ELF.
       
  1572 -linux*)
       
  1573 +linux* | k*bsd*-gnu)
       
  1574    lt_cv_deplibs_check_method=pass_all
       
  1575    ;;
       
  1576  
       
  1577  netbsd*)
       
  1578    if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
       
  1579      lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
       
  1580    else
       
  1581      lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
       
  1582 @@ -2398,16 +2526,20 @@ openbsd*)
       
  1583      lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
       
  1584    fi
       
  1585    ;;
       
  1586  
       
  1587  osf3* | osf4* | osf5*)
       
  1588    lt_cv_deplibs_check_method=pass_all
       
  1589    ;;
       
  1590  
       
  1591 +rdos*)
       
  1592 +  lt_cv_deplibs_check_method=pass_all
       
  1593 +  ;;
       
  1594 +
       
  1595  solaris*)
       
  1596    lt_cv_deplibs_check_method=pass_all
       
  1597    ;;
       
  1598  
       
  1599  sysv4 | sysv4.3*)
       
  1600    case $host_vendor in
       
  1601    motorola)
       
  1602      lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
       
  1603 @@ -2450,17 +2582,17 @@ test -z "$deplibs_check_method" && depli
       
  1604  # find the pathname to a BSD-compatible name lister
       
  1605  AC_DEFUN([AC_PROG_NM],
       
  1606  [AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
       
  1607  [if test -n "$NM"; then
       
  1608    # Let the user override the test.
       
  1609    lt_cv_path_NM="$NM"
       
  1610  else
       
  1611    lt_nm_to_check="${ac_tool_prefix}nm"
       
  1612 -  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then 
       
  1613 +  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
       
  1614      lt_nm_to_check="$lt_nm_to_check nm"
       
  1615    fi
       
  1616    for lt_tmp_nm in $lt_nm_to_check; do
       
  1617      lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
       
  1618      for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
       
  1619        IFS="$lt_save_ifs"
       
  1620        test -z "$ac_dir" && ac_dir=.
       
  1621        tmp_nm="$ac_dir/$lt_tmp_nm"
       
  1622 @@ -2666,20 +2798,20 @@ AC_LANG_PUSH(C)
       
  1623  # Source file extension for C test sources.
       
  1624  ac_ext=c
       
  1625  
       
  1626  # Object file extension for compiled C test sources.
       
  1627  objext=o
       
  1628  _LT_AC_TAGVAR(objext, $1)=$objext
       
  1629  
       
  1630  # Code to be used in simple compile tests
       
  1631 -lt_simple_compile_test_code="int some_variable = 0;\n"
       
  1632 +lt_simple_compile_test_code="int some_variable = 0;"
       
  1633  
       
  1634  # Code to be used in simple link tests
       
  1635 -lt_simple_link_test_code='int main(){return(0);}\n'
       
  1636 +lt_simple_link_test_code='int main(){return(0);}'
       
  1637  
       
  1638  _LT_AC_SYS_COMPILER
       
  1639  
       
  1640  # save warnings/boilerplate of simple test code
       
  1641  _LT_COMPILER_BOILERPLATE
       
  1642  _LT_LINKER_BOILERPLATE
       
  1643  
       
  1644  AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
       
  1645 @@ -2705,17 +2837,17 @@ case $host_os in
       
  1646  aix3*)
       
  1647    test "$enable_shared" = yes && enable_static=no
       
  1648    if test -n "$RANLIB"; then
       
  1649      archive_cmds="$archive_cmds~\$RANLIB \$lib"
       
  1650      postinstall_cmds='$RANLIB $lib'
       
  1651    fi
       
  1652    ;;
       
  1653  
       
  1654 -aix4* | aix5*)
       
  1655 +aix[[4-9]]*)
       
  1656    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
       
  1657      test "$enable_shared" = yes && enable_static=no
       
  1658    fi
       
  1659      ;;
       
  1660  esac
       
  1661  AC_MSG_RESULT([$enable_shared])
       
  1662  
       
  1663  AC_MSG_CHECKING([whether to build static libraries])
       
  1664 @@ -2762,29 +2894,30 @@ _LT_AC_TAGVAR(whole_archive_flag_spec, $
       
  1665  _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
       
  1666  
       
  1667  # Dependencies to place before and after the object being linked:
       
  1668  _LT_AC_TAGVAR(predep_objects, $1)=
       
  1669  _LT_AC_TAGVAR(postdep_objects, $1)=
       
  1670  _LT_AC_TAGVAR(predeps, $1)=
       
  1671  _LT_AC_TAGVAR(postdeps, $1)=
       
  1672  _LT_AC_TAGVAR(compiler_lib_search_path, $1)=
       
  1673 +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=
       
  1674  
       
  1675  # Source file extension for C++ test sources.
       
  1676  ac_ext=cpp
       
  1677  
       
  1678  # Object file extension for compiled C++ test sources.
       
  1679  objext=o
       
  1680  _LT_AC_TAGVAR(objext, $1)=$objext
       
  1681  
       
  1682  # Code to be used in simple compile tests
       
  1683 -lt_simple_compile_test_code="int some_variable = 0;\n"
       
  1684 +lt_simple_compile_test_code="int some_variable = 0;"
       
  1685  
       
  1686  # Code to be used in simple link tests
       
  1687 -lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
       
  1688 +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
       
  1689  
       
  1690  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
       
  1691  _LT_AC_SYS_COMPILER
       
  1692  
       
  1693  # save warnings/boilerplate of simple test code
       
  1694  _LT_COMPILER_BOILERPLATE
       
  1695  _LT_LINKER_BOILERPLATE
       
  1696  
       
  1697 @@ -2871,30 +3004,30 @@ fi
       
  1698  # PORTME: fill in a description of your system's C++ link characteristics
       
  1699  AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
       
  1700  _LT_AC_TAGVAR(ld_shlibs, $1)=yes
       
  1701  case $host_os in
       
  1702    aix3*)
       
  1703      # FIXME: insert proper C++ library support
       
  1704      _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  1705      ;;
       
  1706 -  aix4* | aix5*)
       
  1707 +  aix[[4-9]]*)
       
  1708      if test "$host_cpu" = ia64; then
       
  1709        # On IA64, the linker does run time linking by default, so we don't
       
  1710        # have to do anything special.
       
  1711        aix_use_runtimelinking=no
       
  1712        exp_sym_flag='-Bexport'
       
  1713        no_entry_flag=""
       
  1714      else
       
  1715        aix_use_runtimelinking=no
       
  1716  
       
  1717        # Test if we are trying to use run time linking or normal
       
  1718        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
       
  1719        # need to do runtime linking.
       
  1720 -      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
       
  1721 +      case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
       
  1722  	for ld_flag in $LDFLAGS; do
       
  1723  	  case $ld_flag in
       
  1724  	  *-brtl*)
       
  1725  	    aix_use_runtimelinking=yes
       
  1726  	    break
       
  1727  	    ;;
       
  1728  	  esac
       
  1729  	done
       
  1730 @@ -2920,17 +3053,17 @@ case $host_os in
       
  1731        case $host_os in aix4.[[012]]|aix4.[[012]].*)
       
  1732        # We only want to do this on AIX 4.2 and lower, the check
       
  1733        # below for broken collect2 doesn't work under 4.3+
       
  1734  	collect2name=`${CC} -print-prog-name=collect2`
       
  1735  	if test -f "$collect2name" && \
       
  1736  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
       
  1737  	then
       
  1738  	  # We have reworked collect2
       
  1739 -	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  1740 +	  :
       
  1741  	else
       
  1742  	  # We have old collect2
       
  1743  	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
       
  1744  	  # It fails to find uninstalled libraries when the uninstalled
       
  1745  	  # path is not listed in the libpath.  Setting hardcode_minus_L
       
  1746  	  # to unsupported forces relinking
       
  1747  	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
       
  1748  	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       
  1749 @@ -3030,69 +3163,41 @@ case $host_os in
       
  1750  	cat $export_symbols >> $output_objdir/$soname.def;
       
  1751        fi~
       
  1752        $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  1753      else
       
  1754        _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  1755      fi
       
  1756    ;;
       
  1757        darwin* | rhapsody*)
       
  1758 -        case $host_os in
       
  1759 -        rhapsody* | darwin1.[[012]])
       
  1760 -         _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
       
  1761 -         ;;
       
  1762 -       *) # Darwin 1.3 on
       
  1763 -         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
       
  1764 -           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
       
  1765 -         else
       
  1766 -           case ${MACOSX_DEPLOYMENT_TARGET} in
       
  1767 -             10.[[012]])
       
  1768 -               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
       
  1769 -               ;;
       
  1770 -             10.*)
       
  1771 -               _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
       
  1772 -               ;;
       
  1773 -           esac
       
  1774 -         fi
       
  1775 -         ;;
       
  1776 -        esac
       
  1777        _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
       
  1778        _LT_AC_TAGVAR(hardcode_direct, $1)=no
       
  1779        _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
       
  1780        _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
       
  1781        _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
       
  1782        _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
       
  1783 -
       
  1784 -    if test "$GXX" = yes ; then
       
  1785 -      lt_int_apple_cc_single_mod=no
       
  1786 +      _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
       
  1787 +      if test "$GXX" = yes ; then
       
  1788        output_verbose_link_cmd='echo'
       
  1789 -      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
       
  1790 -       lt_int_apple_cc_single_mod=yes
       
  1791 +      _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
       
  1792 +      _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
       
  1793 +      _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
       
  1794 +      _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
       
  1795 +      if test "$lt_cv_apple_cc_single_mod" != "yes"; then
       
  1796 +        _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
       
  1797 +        _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
       
  1798        fi
       
  1799 -      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
       
  1800 -       _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
       
  1801 -      else
       
  1802 -          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
       
  1803 -        fi
       
  1804 -        _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  1805 -        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  1806 -          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
       
  1807 -            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  1808 -          else
       
  1809 -            _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  1810 -          fi
       
  1811 -            _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  1812        else
       
  1813        case $cc_basename in
       
  1814          xlc*)
       
  1815           output_verbose_link_cmd='echo'
       
  1816 -          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
       
  1817 +          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
       
  1818            _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  1819            # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  1820 -          _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  1821 +          _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  1822            _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  1823            ;;
       
  1824         *)
       
  1825           _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  1826            ;;
       
  1827        esac
       
  1828        fi
       
  1829          ;;
       
  1830 @@ -3116,17 +3221,17 @@ case $host_os in
       
  1831      ;;
       
  1832    freebsd[[12]]*)
       
  1833      # C++ shared libraries reported to be fairly broken before switch to ELF
       
  1834      _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  1835      ;;
       
  1836    freebsd-elf*)
       
  1837      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
       
  1838      ;;
       
  1839 -  freebsd* | kfreebsd*-gnu | dragonfly*)
       
  1840 +  freebsd* | dragonfly*)
       
  1841      # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
       
  1842      # conventions
       
  1843      _LT_AC_TAGVAR(ld_shlibs, $1)=yes
       
  1844      ;;
       
  1845    gnu*)
       
  1846      ;;
       
  1847    hpux9*)
       
  1848      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
       
  1849 @@ -3165,19 +3270,17 @@ case $host_os in
       
  1850      esac
       
  1851      ;;
       
  1852    hpux10*|hpux11*)
       
  1853      if test $with_gnu_ld = no; then
       
  1854        _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
       
  1855        _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
       
  1856  
       
  1857        case $host_cpu in
       
  1858 -      hppa*64*|ia64*)
       
  1859 -	_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
       
  1860 -        ;;
       
  1861 +      hppa*64*|ia64*) ;;
       
  1862        *)
       
  1863  	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
       
  1864          ;;
       
  1865        esac
       
  1866      fi
       
  1867      case $host_cpu in
       
  1868      hppa*64*|ia64*)
       
  1869        _LT_AC_TAGVAR(hardcode_direct, $1)=no
       
  1870 @@ -3235,17 +3338,17 @@ case $host_os in
       
  1871  	  fi
       
  1872  	else
       
  1873  	  # FIXME: insert proper C++ library support
       
  1874  	  _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  1875  	fi
       
  1876  	;;
       
  1877      esac
       
  1878      ;;
       
  1879 -  interix3*)
       
  1880 +  interix[[3-9]]*)
       
  1881      _LT_AC_TAGVAR(hardcode_direct, $1)=no
       
  1882      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  1883      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  1884      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
       
  1885      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       
  1886      # Instead, shared libraries are loaded at an image base (0x10000000 by
       
  1887      # default) and relocated if they conflict, which is a slow very memory
       
  1888      # consuming and fragmenting process.  To avoid this, we pick a random,
       
  1889 @@ -3275,17 +3378,17 @@ case $host_os in
       
  1890  	  fi
       
  1891  	fi
       
  1892  	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
       
  1893  	;;
       
  1894      esac
       
  1895      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
       
  1896      _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
       
  1897      ;;
       
  1898 -  linux*)
       
  1899 +  linux* | k*bsd*-gnu)
       
  1900      case $cc_basename in
       
  1901        KCC*)
       
  1902  	# Kuck and Associates, Inc. (KAI) C++ Compiler
       
  1903  
       
  1904  	# KCC will only create a shared library if the output file
       
  1905  	# ends with ".so" (or ".sl" for HP-UX), so rename the library
       
  1906  	# to its proper name (with version) after linking.
       
  1907  	_LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
       
  1908 @@ -3327,17 +3430,17 @@ case $host_os in
       
  1909  	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       
  1910  	  ;;
       
  1911  	esac
       
  1912  	_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
       
  1913  	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  1914  	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
       
  1915  	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
       
  1916  	;;
       
  1917 -      pgCC*)
       
  1918 +      pgCC* | pgcpp*)
       
  1919          # Portland Group C++ compiler
       
  1920  	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
       
  1921    	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
       
  1922  
       
  1923  	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
       
  1924  	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
       
  1925  	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  1926          ;;
       
  1927 @@ -3355,16 +3458,39 @@ case $host_os in
       
  1928  	# linking a shared library.
       
  1929  	#
       
  1930  	# There doesn't appear to be a way to prevent this compiler from
       
  1931  	# explicitly linking system object files so we need to strip them
       
  1932  	# from the output so that they don't get included in the library
       
  1933  	# dependencies.
       
  1934  	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
       
  1935  	;;
       
  1936 +      *)
       
  1937 +	case `$CC -V 2>&1 | sed 5q` in
       
  1938 +	*Sun\ C*)
       
  1939 +	  # Sun C++ 5.9
       
  1940 +	  _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
       
  1941 +	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
       
  1942 +	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
       
  1943 +	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
       
  1944 +	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  1945 +
       
  1946 +	  # Not sure whether something based on
       
  1947 +	  # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
       
  1948 +	  # would be better.
       
  1949 +	  output_verbose_link_cmd='echo'
       
  1950 +
       
  1951 +	  # Archives containing C++ object files must be created using
       
  1952 +	  # "CC -xar", where "CC" is the Sun C++ compiler.  This is
       
  1953 +	  # necessary to make sure instantiated templates are included
       
  1954 +	  # in the archive.
       
  1955 +	  _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
       
  1956 +	  ;;
       
  1957 +	esac
       
  1958 +	;;
       
  1959      esac
       
  1960      ;;
       
  1961    lynxos*)
       
  1962      # FIXME: insert proper C++ library support
       
  1963      _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  1964      ;;
       
  1965    m88k*)
       
  1966      # FIXME: insert proper C++ library support
       
  1967 @@ -3393,26 +3519,30 @@ case $host_os in
       
  1968      # Workaround some broken pre-1.5 toolchains
       
  1969      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
       
  1970      ;;
       
  1971    openbsd2*)
       
  1972      # C++ shared libraries are fairly broken
       
  1973      _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  1974      ;;
       
  1975    openbsd*)
       
  1976 -    _LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  1977 -    _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  1978 -    _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
       
  1979 -    _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  1980 -    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  1981 -      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
       
  1982 -      _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
       
  1983 -      _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
       
  1984 +    if test -f /usr/libexec/ld.so; then
       
  1985 +      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  1986 +      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  1987 +      _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
       
  1988 +      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  1989 +      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  1990 +	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
       
  1991 +	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
       
  1992 +	_LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
       
  1993 +      fi
       
  1994 +      output_verbose_link_cmd='echo'
       
  1995 +    else
       
  1996 +      _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  1997      fi
       
  1998 -    output_verbose_link_cmd='echo'
       
  1999      ;;
       
  2000    osf3*)
       
  2001      case $cc_basename in
       
  2002        KCC*)
       
  2003  	# Kuck and Associates, Inc. (KAI) C++ Compiler
       
  2004  
       
  2005  	# KCC will only create a shared library if the output file
       
  2006  	# ends with ".so" (or ".sl" for HP-UX), so rename the library
       
  2007 @@ -3564,25 +3694,20 @@ case $host_os in
       
  2008  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
       
  2009  	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
       
  2010  
       
  2011  	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
       
  2012  	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  2013  	case $host_os in
       
  2014  	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       
  2015  	  *)
       
  2016 -	    # The C++ compiler is used as linker so we must use $wl
       
  2017 -	    # flag to pass the commands to the underlying system
       
  2018 -	    # linker. We must also pass each convience library through
       
  2019 -	    # to the system linker between allextract/defaultextract.
       
  2020 -	    # The C++ compiler will combine linker options so we
       
  2021 -	    # cannot just pass the convience library names through
       
  2022 -	    # without $wl.
       
  2023 +	    # The compiler driver will combine and reorder linker options,
       
  2024 +	    # but understands `-z linker_flag'.
       
  2025  	    # Supported since Solaris 2.6 (maybe 2.5.1?)
       
  2026 -	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
       
  2027 +	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
       
  2028  	    ;;
       
  2029  	esac
       
  2030  	_LT_AC_TAGVAR(link_all_deplibs, $1)=yes
       
  2031  
       
  2032  	output_verbose_link_cmd='echo'
       
  2033  
       
  2034  	# Archives containing C++ object files must be created using
       
  2035  	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
       
  2036 @@ -3619,16 +3744,22 @@ case $host_os in
       
  2037  
       
  2038  	    # Commands to make compiler produce verbose output that lists
       
  2039  	    # what "hidden" libraries, object files and flags are used when
       
  2040  	    # linking a shared library.
       
  2041  	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
       
  2042  	  fi
       
  2043  
       
  2044  	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
       
  2045 +	  case $host_os in
       
  2046 +	  solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       
  2047 +	  *)
       
  2048 +	    _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
       
  2049 +	    ;;
       
  2050 +	  esac
       
  2051  	fi
       
  2052  	;;
       
  2053      esac
       
  2054      ;;
       
  2055    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
       
  2056      _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
       
  2057      _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
       
  2058      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  2059 @@ -3734,17 +3865,18 @@ lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
       
  2060  ])# AC_LIBTOOL_LANG_CXX_CONFIG
       
  2061  
       
  2062  # AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
       
  2063  # ------------------------------------
       
  2064  # Figure out "hidden" library dependencies from verbose
       
  2065  # compiler output when linking a shared library.
       
  2066  # Parse the compiler output and extract the necessary
       
  2067  # objects, libraries and library flags.
       
  2068 -AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
       
  2069 +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],
       
  2070 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
  2071  dnl we can't use the lt_simple_compile_test_code here,
       
  2072  dnl because it contains code intended for an executable,
       
  2073  dnl not a library.  It's possible we should let each
       
  2074  dnl tag define a new lt_????_link_test_code variable,
       
  2075  dnl but it's only used here...
       
  2076  ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
       
  2077  int a;
       
  2078  void foo (void) { a = 0; }
       
  2079 @@ -3859,40 +3991,77 @@ if AC_TRY_EVAL(ac_compile); then
       
  2080    # Clean up.
       
  2081    rm -f a.out a.exe
       
  2082  else
       
  2083    echo "libtool.m4: error: problem compiling $1 test program"
       
  2084  fi
       
  2085  
       
  2086  $rm -f confest.$objext
       
  2087  
       
  2088 +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=
       
  2089 +if test -n "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
       
  2090 +  _LT_AC_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_AC_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
       
  2091 +fi
       
  2092 +
       
  2093  # PORTME: override above test on systems where it is broken
       
  2094  ifelse([$1],[CXX],
       
  2095  [case $host_os in
       
  2096 -interix3*)
       
  2097 +interix[[3-9]]*)
       
  2098    # Interix 3.5 installs completely hosed .la files for C++, so rather than
       
  2099    # hack all around it, let's just trust "g++" to DTRT.
       
  2100    _LT_AC_TAGVAR(predep_objects,$1)=
       
  2101    _LT_AC_TAGVAR(postdep_objects,$1)=
       
  2102    _LT_AC_TAGVAR(postdeps,$1)=
       
  2103    ;;
       
  2104  
       
  2105 +linux*)
       
  2106 +  case `$CC -V 2>&1 | sed 5q` in
       
  2107 +  *Sun\ C*)
       
  2108 +    # Sun C++ 5.9
       
  2109 +    #
       
  2110 +    # The more standards-conforming stlport4 library is
       
  2111 +    # incompatible with the Cstd library. Avoid specifying
       
  2112 +    # it if it's in CXXFLAGS. Ignore libCrun as
       
  2113 +    # -library=stlport4 depends on it.
       
  2114 +    case " $CXX $CXXFLAGS " in
       
  2115 +    *" -library=stlport4 "*)
       
  2116 +      solaris_use_stlport4=yes
       
  2117 +      ;;
       
  2118 +    esac
       
  2119 +    if test "$solaris_use_stlport4" != yes; then
       
  2120 +      _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
       
  2121 +    fi
       
  2122 +    ;;
       
  2123 +  esac
       
  2124 +  ;;
       
  2125 +
       
  2126  solaris*)
       
  2127    case $cc_basename in
       
  2128    CC*)
       
  2129 +    # The more standards-conforming stlport4 library is
       
  2130 +    # incompatible with the Cstd library. Avoid specifying
       
  2131 +    # it if it's in CXXFLAGS. Ignore libCrun as
       
  2132 +    # -library=stlport4 depends on it.
       
  2133 +    case " $CXX $CXXFLAGS " in
       
  2134 +    *" -library=stlport4 "*)
       
  2135 +      solaris_use_stlport4=yes
       
  2136 +      ;;
       
  2137 +    esac
       
  2138 +
       
  2139      # Adding this requires a known-good setup of shared libraries for
       
  2140      # Sun compiler versions before 5.6, else PIC objects from an old
       
  2141      # archive will be linked into the output, leading to subtle bugs.
       
  2142 -    _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun'
       
  2143 +    if test "$solaris_use_stlport4" != yes; then
       
  2144 +      _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
       
  2145 +    fi
       
  2146      ;;
       
  2147    esac
       
  2148    ;;
       
  2149  esac
       
  2150  ])
       
  2151 -
       
  2152  case " $_LT_AC_TAGVAR(postdeps, $1) " in
       
  2153  *" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
       
  2154  esac
       
  2155  ])# AC_LIBTOOL_POSTDEP_PREDEP
       
  2156  
       
  2157  # AC_LIBTOOL_LANG_F77_CONFIG
       
  2158  # --------------------------
       
  2159  # Ensure that the configuration vars for the C compiler are
       
  2160 @@ -3925,20 +4094,27 @@ _LT_AC_TAGVAR(enable_shared_with_static_
       
  2161  # Source file extension for f77 test sources.
       
  2162  ac_ext=f
       
  2163  
       
  2164  # Object file extension for compiled f77 test sources.
       
  2165  objext=o
       
  2166  _LT_AC_TAGVAR(objext, $1)=$objext
       
  2167  
       
  2168  # Code to be used in simple compile tests
       
  2169 -lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
       
  2170 +lt_simple_compile_test_code="\
       
  2171 +      subroutine t
       
  2172 +      return
       
  2173 +      end
       
  2174 +"
       
  2175  
       
  2176  # Code to be used in simple link tests
       
  2177 -lt_simple_link_test_code="      program t\n      end\n"
       
  2178 +lt_simple_link_test_code="\
       
  2179 +      program t
       
  2180 +      end
       
  2181 +"
       
  2182  
       
  2183  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
       
  2184  _LT_AC_SYS_COMPILER
       
  2185  
       
  2186  # save warnings/boilerplate of simple test code
       
  2187  _LT_COMPILER_BOILERPLATE
       
  2188  _LT_LINKER_BOILERPLATE
       
  2189  
       
  2190 @@ -3960,17 +4136,17 @@ test "$can_build_shared" = "no" && enabl
       
  2191  case $host_os in
       
  2192  aix3*)
       
  2193    test "$enable_shared" = yes && enable_static=no
       
  2194    if test -n "$RANLIB"; then
       
  2195      archive_cmds="$archive_cmds~\$RANLIB \$lib"
       
  2196      postinstall_cmds='$RANLIB $lib'
       
  2197    fi
       
  2198    ;;
       
  2199 -aix4* | aix5*)
       
  2200 +aix[[4-9]]*)
       
  2201    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
       
  2202      test "$enable_shared" = yes && enable_static=no
       
  2203    fi
       
  2204    ;;
       
  2205  esac
       
  2206  AC_MSG_RESULT([$enable_shared])
       
  2207  
       
  2208  AC_MSG_CHECKING([whether to build static libraries])
       
  2209 @@ -4007,20 +4183,20 @@ AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
       
  2210  # Source file extension for Java test sources.
       
  2211  ac_ext=java
       
  2212  
       
  2213  # Object file extension for compiled Java test sources.
       
  2214  objext=o
       
  2215  _LT_AC_TAGVAR(objext, $1)=$objext
       
  2216  
       
  2217  # Code to be used in simple compile tests
       
  2218 -lt_simple_compile_test_code="class foo {}\n"
       
  2219 +lt_simple_compile_test_code="class foo {}"
       
  2220  
       
  2221  # Code to be used in simple link tests
       
  2222 -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
       
  2223 +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
       
  2224  
       
  2225  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
       
  2226  _LT_AC_SYS_COMPILER
       
  2227  
       
  2228  # save warnings/boilerplate of simple test code
       
  2229  _LT_COMPILER_BOILERPLATE
       
  2230  _LT_LINKER_BOILERPLATE
       
  2231  
       
  2232 @@ -4063,17 +4239,17 @@ AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
       
  2233  # Source file extension for RC test sources.
       
  2234  ac_ext=rc
       
  2235  
       
  2236  # Object file extension for compiled RC test sources.
       
  2237  objext=o
       
  2238  _LT_AC_TAGVAR(objext, $1)=$objext
       
  2239  
       
  2240  # Code to be used in simple compile tests
       
  2241 -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
       
  2242 +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
       
  2243  
       
  2244  # Code to be used in simple link tests
       
  2245  lt_simple_link_test_code="$lt_simple_compile_test_code"
       
  2246  
       
  2247  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
       
  2248  _LT_AC_SYS_COMPILER
       
  2249  
       
  2250  # save warnings/boilerplate of simple test code
       
  2251 @@ -4137,31 +4313,33 @@ if test -f "$ltmain"; then
       
  2252      _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
       
  2253      _LT_AC_TAGVAR(old_archive_cmds, $1) \
       
  2254      _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
       
  2255      _LT_AC_TAGVAR(predep_objects, $1) \
       
  2256      _LT_AC_TAGVAR(postdep_objects, $1) \
       
  2257      _LT_AC_TAGVAR(predeps, $1) \
       
  2258      _LT_AC_TAGVAR(postdeps, $1) \
       
  2259      _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
       
  2260 +    _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \
       
  2261      _LT_AC_TAGVAR(archive_cmds, $1) \
       
  2262      _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
       
  2263      _LT_AC_TAGVAR(postinstall_cmds, $1) \
       
  2264      _LT_AC_TAGVAR(postuninstall_cmds, $1) \
       
  2265      _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
       
  2266      _LT_AC_TAGVAR(allow_undefined_flag, $1) \
       
  2267      _LT_AC_TAGVAR(no_undefined_flag, $1) \
       
  2268      _LT_AC_TAGVAR(export_symbols_cmds, $1) \
       
  2269      _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
       
  2270      _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
       
  2271      _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
       
  2272      _LT_AC_TAGVAR(hardcode_automatic, $1) \
       
  2273      _LT_AC_TAGVAR(module_cmds, $1) \
       
  2274      _LT_AC_TAGVAR(module_expsym_cmds, $1) \
       
  2275      _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
       
  2276 +    _LT_AC_TAGVAR(fix_srcfile_path, $1) \
       
  2277      _LT_AC_TAGVAR(exclude_expsyms, $1) \
       
  2278      _LT_AC_TAGVAR(include_expsyms, $1); do
       
  2279  
       
  2280      case $var in
       
  2281      _LT_AC_TAGVAR(old_archive_cmds, $1) | \
       
  2282      _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
       
  2283      _LT_AC_TAGVAR(archive_cmds, $1) | \
       
  2284      _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
       
  2285 @@ -4198,17 +4376,17 @@ ifelse([$1], [],
       
  2286    cat <<__EOF__ >> "$cfgfile"
       
  2287  ifelse([$1], [],
       
  2288  [#! $SHELL
       
  2289  
       
  2290  # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
       
  2291  # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
       
  2292  # NOTE: Changes made to this file will be lost: look at ltmain.sh.
       
  2293  #
       
  2294 -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
       
  2295 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
       
  2296  # Free Software Foundation, Inc.
       
  2297  #
       
  2298  # This file is part of GNU Libtool:
       
  2299  # Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
       
  2300  #
       
  2301  # This program is free software; you can redistribute it and/or modify
       
  2302  # it under the terms of the GNU General Public License as published by
       
  2303  # the Free Software Foundation; either version 2 of the License, or
       
  2304 @@ -4435,16 +4613,20 @@ postdep_objects=$lt_[]_LT_AC_TAGVAR(post
       
  2305  # Dependencies to place before the objects being linked to create a
       
  2306  # shared library.
       
  2307  predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
       
  2308  
       
  2309  # Dependencies to place after the objects being linked to create a
       
  2310  # shared library.
       
  2311  postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
       
  2312  
       
  2313 +# The directories searched by this compiler when creating a shared
       
  2314 +# library
       
  2315 +compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)
       
  2316 +
       
  2317  # The library search path used internally by the compiler when linking
       
  2318  # a shared library.
       
  2319  compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
       
  2320  
       
  2321  # Method to check whether dependent libraries are shared objects.
       
  2322  deplibs_check_method=$lt_deplibs_check_method
       
  2323  
       
  2324  # Command to use when deplibs_check_method == file_magic.
       
  2325 @@ -4523,17 +4705,17 @@ link_all_deplibs=$_LT_AC_TAGVAR(link_all
       
  2326  
       
  2327  # Compile-time system search path for libraries
       
  2328  sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
       
  2329  
       
  2330  # Run-time system search path for libraries
       
  2331  sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
       
  2332  
       
  2333  # Fix the shell variable \$srcfile for the compiler.
       
  2334 -fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
       
  2335 +fix_srcfile_path=$lt_fix_srcfile_path
       
  2336  
       
  2337  # Set to yes if exported symbols are required.
       
  2338  always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
       
  2339  
       
  2340  # The commands to list exported symbols.
       
  2341  export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
       
  2342  
       
  2343  # The commands to extract the exported symbol list from a shared archive.
       
  2344 @@ -4606,16 +4788,17 @@ if test "$GCC" = yes; then
       
  2345  fi
       
  2346  ])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
       
  2347  
       
  2348  
       
  2349  # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
       
  2350  # ---------------------------------
       
  2351  AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
       
  2352  [AC_REQUIRE([AC_CANONICAL_HOST])
       
  2353 +AC_REQUIRE([LT_AC_PROG_SED])
       
  2354  AC_REQUIRE([AC_PROG_NM])
       
  2355  AC_REQUIRE([AC_OBJEXT])
       
  2356  # Check for command to grab the raw symbol name followed by C symbol from nm.
       
  2357  AC_MSG_CHECKING([command to parse $NM output from $compiler object])
       
  2358  AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
       
  2359  [
       
  2360  # These are sane defaults that work on at least a few old systems.
       
  2361  # [They come from Ultrix.  What could be older than Ultrix?!! ;)]
       
  2362 @@ -4642,17 +4825,17 @@ cygwin* | mingw* | pw32*)
       
  2363    ;;
       
  2364  hpux*) # Its linker distinguishes data from code symbols
       
  2365    if test "$host_cpu" = ia64; then
       
  2366      symcode='[[ABCDEGRST]]'
       
  2367    fi
       
  2368    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
       
  2369    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
       
  2370    ;;
       
  2371 -linux*)
       
  2372 +linux* | k*bsd*-gnu)
       
  2373    if test "$host_cpu" = ia64; then
       
  2374      symcode='[[ABCDGIRSTW]]'
       
  2375      lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
       
  2376      lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
       
  2377    fi
       
  2378    ;;
       
  2379  irix* | nonstopux*)
       
  2380    symcode='[[BCDEGRST]]'
       
  2381 @@ -4783,17 +4966,17 @@ EOF
       
  2382        fi
       
  2383      else
       
  2384        echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
       
  2385      fi
       
  2386    else
       
  2387      echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
       
  2388      cat conftest.$ac_ext >&5
       
  2389    fi
       
  2390 -  rm -f conftest* conftst*
       
  2391 +  rm -rf conftest* conftst*
       
  2392  
       
  2393    # Do not use the global_symbol_pipe unless it works.
       
  2394    if test "$pipe_works" = yes; then
       
  2395      break
       
  2396    else
       
  2397      lt_cv_sys_global_symbol_pipe=
       
  2398    fi
       
  2399  done
       
  2400 @@ -4832,34 +5015,37 @@ AC_MSG_CHECKING([for $compiler option to
       
  2401        fi
       
  2402        ;;
       
  2403      amigaos*)
       
  2404        # FIXME: we need at least 68020 code to build shared libraries, but
       
  2405        # adding the `-m68020' flag to GCC prevents building anything better,
       
  2406        # like `-m68040'.
       
  2407        _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
       
  2408        ;;
       
  2409 -    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  2410 +    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  2411        # PIC is the default for these OSes.
       
  2412        ;;
       
  2413 -    mingw* | os2* | pw32*)
       
  2414 +    mingw* | cygwin* | os2* | pw32*)
       
  2415        # This hack is so that the source file can tell whether it is being
       
  2416        # built for inclusion in a dll (and should export symbols for example).
       
  2417 -      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
       
  2418 +      # Although the cygwin gcc ignores -fPIC, still need this for old-style
       
  2419 +      # (--disable-auto-import) libraries
       
  2420 +      m4_if([$1], [GCJ], [],
       
  2421 +	[_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
       
  2422        ;;
       
  2423      darwin* | rhapsody*)
       
  2424        # PIC is the default on this platform
       
  2425        # Common symbols not allowed in MH_DYLIB files
       
  2426        _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
       
  2427        ;;
       
  2428      *djgpp*)
       
  2429        # DJGPP does not support shared libraries at all
       
  2430        _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
       
  2431        ;;
       
  2432 -    interix3*)
       
  2433 +    interix[[3-9]]*)
       
  2434        # Interix 3.x gcc -fpic/-fPIC options generate broken code.
       
  2435        # Instead, we relocate shared libraries at runtime.
       
  2436        ;;
       
  2437      sysv4*MP*)
       
  2438        if test -d /usr/nec; then
       
  2439  	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
       
  2440        fi
       
  2441        ;;
       
  2442 @@ -4875,17 +5061,17 @@ AC_MSG_CHECKING([for $compiler option to
       
  2443        esac
       
  2444        ;;
       
  2445      *)
       
  2446        _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       
  2447        ;;
       
  2448      esac
       
  2449    else
       
  2450      case $host_os in
       
  2451 -      aix4* | aix5*)
       
  2452 +      aix[[4-9]]*)
       
  2453  	# All AIX code is PIC.
       
  2454  	if test "$host_cpu" = ia64; then
       
  2455  	  # AIX 5 now supports IA64 processor
       
  2456  	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       
  2457  	else
       
  2458  	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
       
  2459  	fi
       
  2460  	;;
       
  2461 @@ -4915,17 +5101,17 @@ AC_MSG_CHECKING([for $compiler option to
       
  2462  	  ghcx*)
       
  2463  	    # Green Hills C++ Compiler
       
  2464  	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
       
  2465  	    ;;
       
  2466  	  *)
       
  2467  	    ;;
       
  2468  	esac
       
  2469  	;;
       
  2470 -      freebsd* | kfreebsd*-gnu | dragonfly*)
       
  2471 +      freebsd* | dragonfly*)
       
  2472  	# FreeBSD uses GNU C++
       
  2473  	;;
       
  2474        hpux9* | hpux10* | hpux11*)
       
  2475  	case $cc_basename in
       
  2476  	  CC*)
       
  2477  	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2478  	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
       
  2479  	    if test "$host_cpu" != ia64; then
       
  2480 @@ -4958,43 +5144,51 @@ AC_MSG_CHECKING([for $compiler option to
       
  2481  	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2482  	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       
  2483  	    # CC pic flag -KPIC is the default.
       
  2484  	    ;;
       
  2485  	  *)
       
  2486  	    ;;
       
  2487  	esac
       
  2488  	;;
       
  2489 -      linux*)
       
  2490 +      linux* | k*bsd*-gnu)
       
  2491  	case $cc_basename in
       
  2492  	  KCC*)
       
  2493  	    # KAI C++ Compiler
       
  2494  	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
       
  2495  	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       
  2496  	    ;;
       
  2497  	  icpc* | ecpc*)
       
  2498  	    # Intel C++
       
  2499  	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2500  	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       
  2501  	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
       
  2502  	    ;;
       
  2503 -	  pgCC*)
       
  2504 +	  pgCC* | pgcpp*)
       
  2505  	    # Portland Group C++ compiler.
       
  2506  	    _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2507  	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
       
  2508  	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       
  2509  	    ;;
       
  2510  	  cxx*)
       
  2511  	    # Compaq C++
       
  2512  	    # Make sure the PIC flag is empty.  It appears that all Alpha
       
  2513  	    # Linux and Compaq Tru64 Unix objects are PIC.
       
  2514  	    _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
       
  2515  	    _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       
  2516  	    ;;
       
  2517  	  *)
       
  2518 +	    case `$CC -V 2>&1 | sed 5q` in
       
  2519 +	    *Sun\ C*)
       
  2520 +	      # Sun C++ 5.9
       
  2521 +	      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       
  2522 +	      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       
  2523 +	      _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
       
  2524 +	      ;;
       
  2525 +	    esac
       
  2526  	    ;;
       
  2527  	esac
       
  2528  	;;
       
  2529        lynxos*)
       
  2530  	;;
       
  2531        m88k*)
       
  2532  	;;
       
  2533        mvs*)
       
  2534 @@ -5105,33 +5299,36 @@ AC_MSG_CHECKING([for $compiler option to
       
  2535  
       
  2536      amigaos*)
       
  2537        # FIXME: we need at least 68020 code to build shared libraries, but
       
  2538        # adding the `-m68020' flag to GCC prevents building anything better,
       
  2539        # like `-m68040'.
       
  2540        _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
       
  2541        ;;
       
  2542  
       
  2543 -    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  2544 +    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  2545        # PIC is the default for these OSes.
       
  2546        ;;
       
  2547  
       
  2548 -    mingw* | pw32* | os2*)
       
  2549 +    mingw* | cygwin* | pw32* | os2*)
       
  2550        # This hack is so that the source file can tell whether it is being
       
  2551        # built for inclusion in a dll (and should export symbols for example).
       
  2552 -      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
       
  2553 +      # Although the cygwin gcc ignores -fPIC, still need this for old-style
       
  2554 +      # (--disable-auto-import) libraries
       
  2555 +      m4_if([$1], [GCJ], [],
       
  2556 +	[_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
       
  2557        ;;
       
  2558  
       
  2559      darwin* | rhapsody*)
       
  2560        # PIC is the default on this platform
       
  2561        # Common symbols not allowed in MH_DYLIB files
       
  2562        _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
       
  2563        ;;
       
  2564  
       
  2565 -    interix3*)
       
  2566 +    interix[[3-9]]*)
       
  2567        # Interix 3.x gcc -fpic/-fPIC options generate broken code.
       
  2568        # Instead, we relocate shared libraries at runtime.
       
  2569        ;;
       
  2570  
       
  2571      msdosdjgpp*)
       
  2572        # Just because we use GCC doesn't mean we suddenly get shared libraries
       
  2573        # on systems that don't support them.
       
  2574        _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
       
  2575 @@ -5179,20 +5376,21 @@ AC_MSG_CHECKING([for $compiler option to
       
  2576         case $cc_basename in
       
  2577           xlc*)
       
  2578           _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
       
  2579           _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2580           ;;
       
  2581         esac
       
  2582         ;;
       
  2583  
       
  2584 -    mingw* | pw32* | os2*)
       
  2585 +    mingw* | cygwin* | pw32* | os2*)
       
  2586        # This hack is so that the source file can tell whether it is being
       
  2587        # built for inclusion in a dll (and should export symbols for example).
       
  2588 -      _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
       
  2589 +      m4_if([$1], [GCJ], [],
       
  2590 +	[_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
       
  2591        ;;
       
  2592  
       
  2593      hpux9* | hpux10* | hpux11*)
       
  2594        _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2595        # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
       
  2596        # not for PA HP-UX.
       
  2597        case $host_cpu in
       
  2598        hppa*64*|ia64*)
       
  2599 @@ -5212,17 +5410,17 @@ AC_MSG_CHECKING([for $compiler option to
       
  2600        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       
  2601        ;;
       
  2602  
       
  2603      newsos6)
       
  2604        _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       
  2605        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       
  2606        ;;
       
  2607  
       
  2608 -    linux*)
       
  2609 +    linux* | k*bsd*-gnu)
       
  2610        case $cc_basename in
       
  2611        icc* | ecc*)
       
  2612  	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2613  	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       
  2614  	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
       
  2615          ;;
       
  2616        pgcc* | pgf77* | pgf90* | pgf95*)
       
  2617          # Portland Group compilers (*not* the Pentium gcc compiler,
       
  2618 @@ -5231,25 +5429,45 @@ AC_MSG_CHECKING([for $compiler option to
       
  2619  	_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
       
  2620  	_LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       
  2621          ;;
       
  2622        ccc*)
       
  2623          _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2624          # All Alpha code is PIC.
       
  2625          _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       
  2626          ;;
       
  2627 +      *)
       
  2628 +        case `$CC -V 2>&1 | sed 5q` in
       
  2629 +	*Sun\ C*)
       
  2630 +	  # Sun C 5.9
       
  2631 +	  _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       
  2632 +	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       
  2633 +	  _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2634 +	  ;;
       
  2635 +	*Sun\ F*)
       
  2636 +	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
       
  2637 +	  _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       
  2638 +	  _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       
  2639 +	  _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=''
       
  2640 +	  ;;
       
  2641 +	esac
       
  2642 +	;;
       
  2643        esac
       
  2644        ;;
       
  2645  
       
  2646      osf3* | osf4* | osf5*)
       
  2647        _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
       
  2648        # All OSF/1 code is PIC.
       
  2649        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       
  2650        ;;
       
  2651  
       
  2652 +    rdos*)
       
  2653 +      _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       
  2654 +      ;;
       
  2655 +
       
  2656      solaris*)
       
  2657        _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
       
  2658        _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       
  2659        case $cc_basename in
       
  2660        f77* | f90* | f95*)
       
  2661  	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
       
  2662        *)
       
  2663  	_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
       
  2664 @@ -5299,17 +5517,17 @@ AC_MSG_CHECKING([for $compiler option to
       
  2665  ])
       
  2666  AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
       
  2667  
       
  2668  #
       
  2669  # Check to make sure the PIC flag actually works.
       
  2670  #
       
  2671  if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
       
  2672    AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
       
  2673 -    _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
       
  2674 +    _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1),
       
  2675      [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
       
  2676      [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
       
  2677       "" | " "*) ;;
       
  2678       *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
       
  2679       esac],
       
  2680      [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
       
  2681       _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
       
  2682  fi
       
  2683 @@ -5323,50 +5541,52 @@ case $host_os in
       
  2684      ;;
       
  2685  esac
       
  2686  
       
  2687  #
       
  2688  # Check to make sure the static flag actually works.
       
  2689  #
       
  2690  wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
       
  2691  AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
       
  2692 -  _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
       
  2693 +  _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1),
       
  2694    $lt_tmp_static_flag,
       
  2695    [],
       
  2696    [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
       
  2697  ])
       
  2698  
       
  2699  
       
  2700  # AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
       
  2701  # ------------------------------------
       
  2702  # See if the linker supports building shared libraries.
       
  2703  AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
       
  2704 -[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
       
  2705 +[AC_REQUIRE([LT_AC_PROG_SED])dnl
       
  2706 +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
       
  2707  ifelse([$1],[CXX],[
       
  2708    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
       
  2709    case $host_os in
       
  2710 -  aix4* | aix5*)
       
  2711 +  aix[[4-9]]*)
       
  2712      # If we're using GNU nm, then we don't want the "-C" option.
       
  2713      # -C means demangle to AIX nm, but means don't demangle with GNU nm
       
  2714      if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
       
  2715        _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
       
  2716      else
       
  2717        _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
       
  2718      fi
       
  2719      ;;
       
  2720    pw32*)
       
  2721      _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
       
  2722    ;;
       
  2723    cygwin* | mingw*)
       
  2724 -    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
       
  2725 +    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
       
  2726    ;;
       
  2727    *)
       
  2728      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
       
  2729    ;;
       
  2730    esac
       
  2731 +  _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
       
  2732  ],[
       
  2733    runpath_var=
       
  2734    _LT_AC_TAGVAR(allow_undefined_flag, $1)=
       
  2735    _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
       
  2736    _LT_AC_TAGVAR(archive_cmds, $1)=
       
  2737    _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
       
  2738    _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
       
  2739    _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
       
  2740 @@ -5387,22 +5607,24 @@ ifelse([$1],[CXX],[
       
  2741    _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
       
  2742    # include_expsyms should be a list of space-separated symbols to be *always*
       
  2743    # included in the symbol list
       
  2744    _LT_AC_TAGVAR(include_expsyms, $1)=
       
  2745    # exclude_expsyms can be an extended regexp of symbols to exclude
       
  2746    # it will be wrapped by ` (' and `)$', so one must not match beginning or
       
  2747    # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
       
  2748    # as well as any symbol that contains `d'.
       
  2749 -  _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
       
  2750 +  _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
       
  2751    # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
       
  2752    # platforms (ab)use it in PIC code, but their linkers get confused if
       
  2753    # the symbol is explicitly referenced.  Since portable code cannot
       
  2754    # rely on this symbol name, it's probably fine to never include it in
       
  2755    # preloaded symbol tables.
       
  2756 +  # Exclude shared library initialization/finalization symbols.
       
  2757 +dnl Note also adjust exclude_expsyms for C++ above.
       
  2758    extract_expsyms_cmds=
       
  2759    # Just being paranoid about ensuring that cc_basename is set.
       
  2760    _LT_CC_BASENAME([$compiler])
       
  2761    case $host_os in
       
  2762    cygwin* | mingw* | pw32*)
       
  2763      # FIXME: the MSVC++ port hasn't been tested in a loooong time
       
  2764      # When not using gcc, we currently assume that we are using
       
  2765      # Microsoft Visual C++.
       
  2766 @@ -5442,17 +5664,17 @@ ifelse([$1],[CXX],[
       
  2767        *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
       
  2768        *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
       
  2769        *\ 2.11.*) ;; # other 2.11 versions
       
  2770        *) supports_anon_versioning=yes ;;
       
  2771      esac
       
  2772  
       
  2773      # See if GNU ld supports shared libraries.
       
  2774      case $host_os in
       
  2775 -    aix3* | aix4* | aix5*)
       
  2776 +    aix[[3-9]]*)
       
  2777        # On AIX/PPC, the GNU linker is very broken
       
  2778        if test "$host_cpu" != ia64; then
       
  2779  	_LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  2780  	cat <<EOF 1>&2
       
  2781  
       
  2782  *** Warning: the GNU linker, at least up to release 2.9.1, is reported
       
  2783  *** to be unable to reliably create shared libraries on AIX.
       
  2784  *** Therefore, libtool is disabling shared libraries support.  If you
       
  2785 @@ -5490,17 +5712,17 @@ EOF
       
  2786  
       
  2787      cygwin* | mingw* | pw32*)
       
  2788        # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
       
  2789        # as there is no search path for DLLs.
       
  2790        _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       
  2791        _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
       
  2792        _LT_AC_TAGVAR(always_export_symbols, $1)=no
       
  2793        _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       
  2794 -      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
       
  2795 +      _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
       
  2796  
       
  2797        if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
       
  2798          _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  2799  	# If the export-symbols file already is a .def file (1st line
       
  2800  	# is EXPORTS), use it as is; otherwise, prepend...
       
  2801  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
       
  2802  	  cp $export_symbols $output_objdir/$soname.def;
       
  2803  	else
       
  2804 @@ -5508,32 +5730,32 @@ EOF
       
  2805  	  cat $export_symbols >> $output_objdir/$soname.def;
       
  2806  	fi~
       
  2807  	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  2808        else
       
  2809  	_LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  2810        fi
       
  2811        ;;
       
  2812  
       
  2813 -    interix3*)
       
  2814 +    interix[[3-9]]*)
       
  2815        _LT_AC_TAGVAR(hardcode_direct, $1)=no
       
  2816        _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  2817        _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  2818        _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
       
  2819        # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       
  2820        # Instead, shared libraries are loaded at an image base (0x10000000 by
       
  2821        # default) and relocated if they conflict, which is a slow very memory
       
  2822        # consuming and fragmenting process.  To avoid this, we pick a random,
       
  2823        # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       
  2824        # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
       
  2825        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       
  2826        _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       
  2827        ;;
       
  2828  
       
  2829 -    linux*)
       
  2830 +    gnu* | linux* | k*bsd*-gnu)
       
  2831        if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
       
  2832  	tmp_addflag=
       
  2833  	case $cc_basename,$host_cpu in
       
  2834  	pgcc*)				# Portland Group C compiler
       
  2835  	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  2836  	  tmp_addflag=' $pic_flag'
       
  2837  	  ;;
       
  2838  	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
       
  2839 @@ -5541,23 +5763,32 @@ EOF
       
  2840  	  tmp_addflag=' $pic_flag -Mnomain' ;;
       
  2841  	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
       
  2842  	  tmp_addflag=' -i_dynamic' ;;
       
  2843  	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
       
  2844  	  tmp_addflag=' -i_dynamic -nofor_main' ;;
       
  2845  	ifc* | ifort*)			# Intel Fortran compiler
       
  2846  	  tmp_addflag=' -nofor_main' ;;
       
  2847  	esac
       
  2848 -	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       
  2849 +	case `$CC -V 2>&1 | sed 5q` in
       
  2850 +	*Sun\ C*)			# Sun C 5.9
       
  2851 +	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  2852 +	  tmp_sharedflag='-G' ;;
       
  2853 +	*Sun\ F*)			# Sun Fortran 8.3
       
  2854 +	  tmp_sharedflag='-G' ;;
       
  2855 +	*)
       
  2856 +	  tmp_sharedflag='-shared' ;;
       
  2857 +	esac
       
  2858 +	_LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       
  2859  
       
  2860  	if test $supports_anon_versioning = yes; then
       
  2861  	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
       
  2862    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
       
  2863    $echo "local: *; };" >> $output_objdir/$libname.ver~
       
  2864 -	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
       
  2865 +	  $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
       
  2866  	fi
       
  2867        else
       
  2868  	_LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  2869        fi
       
  2870        ;;
       
  2871  
       
  2872      netbsd*)
       
  2873        if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  2874 @@ -5587,17 +5818,17 @@ EOF
       
  2875  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       
  2876        else
       
  2877  	_LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  2878        fi
       
  2879        ;;
       
  2880  
       
  2881      sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
       
  2882        case `$LD -v 2>&1` in
       
  2883 -        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) 
       
  2884 +        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
       
  2885  	_LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  2886  	cat <<_LT_EOF 1>&2
       
  2887  
       
  2888  *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
       
  2889  *** reliably create shared libraries on SCO systems.  Therefore, libtool
       
  2890  *** is disabling shared libraries support.  We urge you to upgrade GNU
       
  2891  *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
       
  2892  *** your PATH or compiler configuration so that the native linker is
       
  2893 @@ -5652,17 +5883,17 @@ _LT_EOF
       
  2894        _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
       
  2895        if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
       
  2896  	# Neither direct hardcoding nor static linking is supported with a
       
  2897  	# broken collect2.
       
  2898  	_LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
       
  2899        fi
       
  2900        ;;
       
  2901  
       
  2902 -    aix4* | aix5*)
       
  2903 +    aix[[4-9]]*)
       
  2904        if test "$host_cpu" = ia64; then
       
  2905  	# On IA64, the linker does run time linking by default, so we don't
       
  2906  	# have to do anything special.
       
  2907  	aix_use_runtimelinking=no
       
  2908  	exp_sym_flag='-Bexport'
       
  2909  	no_entry_flag=""
       
  2910        else
       
  2911  	# If we're using GNU nm, then we don't want the "-C" option.
       
  2912 @@ -5672,17 +5903,17 @@ _LT_EOF
       
  2913  	else
       
  2914  	  _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
       
  2915  	fi
       
  2916  	aix_use_runtimelinking=no
       
  2917  
       
  2918  	# Test if we are trying to use run time linking or normal
       
  2919  	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
       
  2920  	# need to do runtime linking.
       
  2921 -	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
       
  2922 +	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
       
  2923  	  for ld_flag in $LDFLAGS; do
       
  2924    	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
       
  2925    	    aix_use_runtimelinking=yes
       
  2926    	    break
       
  2927    	  fi
       
  2928  	  done
       
  2929  	  ;;
       
  2930  	esac
       
  2931 @@ -5706,17 +5937,17 @@ _LT_EOF
       
  2932  	case $host_os in aix4.[[012]]|aix4.[[012]].*)
       
  2933  	# We only want to do this on AIX 4.2 and lower, the check
       
  2934  	# below for broken collect2 doesn't work under 4.3+
       
  2935  	  collect2name=`${CC} -print-prog-name=collect2`
       
  2936  	  if test -f "$collect2name" && \
       
  2937    	   strings "$collect2name" | grep resolve_lib_name >/dev/null
       
  2938  	  then
       
  2939    	  # We have reworked collect2
       
  2940 -  	  _LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  2941 +  	  :
       
  2942  	  else
       
  2943    	  # We have old collect2
       
  2944    	  _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
       
  2945    	  # It fails to find uninstalled libraries when the uninstalled
       
  2946    	  # path is not listed in the libpath.  Setting hardcode_minus_L
       
  2947    	  # to unsupported forces relinking
       
  2948    	  _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
       
  2949    	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       
  2950 @@ -5799,17 +6030,17 @@ _LT_EOF
       
  2951        libext=lib
       
  2952        # Tell ltmain to make .dll files, not .so files.
       
  2953        shrext_cmds=".dll"
       
  2954        # FIXME: Setting linknames here is a bad hack.
       
  2955        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
       
  2956        # The linker will automatically build a .lib file if we build a DLL.
       
  2957        _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
       
  2958        # FIXME: Should let the user specify the lib program.
       
  2959 -      _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
       
  2960 +      _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
       
  2961        _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
       
  2962        _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       
  2963        ;;
       
  2964  
       
  2965      darwin* | rhapsody*)
       
  2966        case $host_os in
       
  2967          rhapsody* | darwin1.[[012]])
       
  2968           _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
       
  2969 @@ -5832,29 +6063,28 @@ _LT_EOF
       
  2970        _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
       
  2971        _LT_AC_TAGVAR(hardcode_direct, $1)=no
       
  2972        _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
       
  2973        _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
       
  2974        _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
       
  2975        _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
       
  2976      if test "$GCC" = yes ; then
       
  2977      	output_verbose_link_cmd='echo'
       
  2978 -        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
       
  2979 -      _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  2980 -      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  2981 -      _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  2982 -      _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  2983 +        _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
       
  2984 +        _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
       
  2985 +        _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
       
  2986 +        _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
       
  2987      else
       
  2988        case $cc_basename in
       
  2989          xlc*)
       
  2990           output_verbose_link_cmd='echo'
       
  2991 -         _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
       
  2992 +         _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
       
  2993           _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  2994            # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  2995 -         _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  2996 +         _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  2997            _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  2998            ;;
       
  2999         *)
       
  3000           _LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  3001            ;;
       
  3002        esac
       
  3003      fi
       
  3004        ;;
       
  3005 @@ -5884,17 +6114,17 @@ _LT_EOF
       
  3006      freebsd2*)
       
  3007        _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  3008        _LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  3009        _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
       
  3010        _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  3011        ;;
       
  3012  
       
  3013      # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
       
  3014 -    freebsd* | kfreebsd*-gnu | dragonfly*)
       
  3015 +    freebsd* | dragonfly*)
       
  3016        _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
       
  3017        _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
       
  3018        _LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  3019        _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  3020        ;;
       
  3021  
       
  3022      hpux9*)
       
  3023        if test "$GCC" = yes; then
       
  3024 @@ -6006,34 +6236,38 @@ _LT_EOF
       
  3025        _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       
  3026        _LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  3027        _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
       
  3028        _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
       
  3029        _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  3030        ;;
       
  3031  
       
  3032      openbsd*)
       
  3033 -      _LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  3034 -      _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  3035 -      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  3036 -	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  3037 -	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
       
  3038 -	_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  3039 -	_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
       
  3040 +      if test -f /usr/libexec/ld.so; then
       
  3041 +	_LT_AC_TAGVAR(hardcode_direct, $1)=yes
       
  3042 +	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  3043 +	if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  3044 +	  _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  3045 +	  _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
       
  3046 +	  _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  3047 +	  _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
       
  3048 +	else
       
  3049 +	  case $host_os in
       
  3050 +	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
       
  3051 +	     _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  3052 +	     _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
       
  3053 +	     ;;
       
  3054 +	   *)
       
  3055 +	     _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  3056 +	     _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  3057 +	     ;;
       
  3058 +	  esac
       
  3059 +        fi
       
  3060        else
       
  3061 -       case $host_os in
       
  3062 -	 openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
       
  3063 -	   _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  3064 -	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
       
  3065 -	   ;;
       
  3066 -	 *)
       
  3067 -	   _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  3068 -	   _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
       
  3069 -	   ;;
       
  3070 -       esac
       
  3071 +	_LT_AC_TAGVAR(ld_shlibs, $1)=no
       
  3072        fi
       
  3073        ;;
       
  3074  
       
  3075      os2*)
       
  3076        _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       
  3077        _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
       
  3078        _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
       
  3079        _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
       
  3080 @@ -6082,27 +6316,26 @@ _LT_EOF
       
  3081  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
       
  3082    	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
       
  3083        fi
       
  3084        _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
       
  3085        _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  3086        case $host_os in
       
  3087        solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       
  3088        *)
       
  3089 - 	# The compiler driver will combine linker options so we
       
  3090 - 	# cannot just pass the convience library names through
       
  3091 - 	# without $wl, iff we do not link with $LD.
       
  3092 - 	# Luckily, gcc supports the same syntax we need for Sun Studio.
       
  3093 +	# The compiler driver will combine and reorder linker options,
       
  3094 +	# but understands `-z linker_flag'.  GCC discards it without `$wl',
       
  3095 +	# but is careful enough not to reorder.
       
  3096   	# Supported since Solaris 2.6 (maybe 2.5.1?)
       
  3097 - 	case $wlarc in
       
  3098 - 	'')
       
  3099 - 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
       
  3100 - 	*)
       
  3101 - 	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
       
  3102 - 	esac ;;
       
  3103 +	if test "$GCC" = yes; then
       
  3104 +	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
       
  3105 +	else
       
  3106 +	  _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
       
  3107 +	fi
       
  3108 +	;;
       
  3109        esac
       
  3110        _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
       
  3111        ;;
       
  3112  
       
  3113      sunos4*)
       
  3114        if test "x$host_vendor" = xsequent; then
       
  3115  	# Use $CC to link under sequent, because it throws in some extra .o
       
  3116  	# files that make .init and .fini sections work.
       
  3117 @@ -6149,17 +6382,17 @@ _LT_EOF
       
  3118  	_LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       
  3119  	_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  3120  	runpath_var=LD_RUN_PATH
       
  3121  	hardcode_runpath_var=yes
       
  3122  	_LT_AC_TAGVAR(ld_shlibs, $1)=yes
       
  3123        fi
       
  3124        ;;
       
  3125  
       
  3126 -    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
       
  3127 +    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
       
  3128        _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
       
  3129        _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
       
  3130        _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
       
  3131        runpath_var='LD_RUN_PATH'
       
  3132  
       
  3133        if test "$GCC" = yes; then
       
  3134  	_LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       
  3135  	_LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       
  3136 @@ -6224,17 +6457,17 @@ x|xyes)
       
  3137        # FIXME: we may have to deal with multi-command sequences.
       
  3138        ;;
       
  3139      '$CC '*)
       
  3140        # Test whether the compiler implicitly links with -lc since on some
       
  3141        # systems, -lgcc has to come before -lc. If gcc already passes -lc
       
  3142        # to ld, don't add -lc before -lgcc.
       
  3143        AC_MSG_CHECKING([whether -lc should be explicitly linked in])
       
  3144        $rm conftest*
       
  3145 -      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  3146 +      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  3147  
       
  3148        if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
       
  3149          soname=conftest
       
  3150          lib=conftest
       
  3151          libobjs=conftest.$ac_objext
       
  3152          deplibs=
       
  3153          wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
       
  3154  	pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
       
  3155 @@ -6327,16 +6560,40 @@ AC_DEFUN([LT_AC_PROG_GCJ],
       
  3156    test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
       
  3157    AC_SUBST(GCJFLAGS)
       
  3158  ])
       
  3159  
       
  3160  AC_DEFUN([LT_AC_PROG_RC],
       
  3161  [AC_CHECK_TOOL(RC, windres, no)
       
  3162  ])
       
  3163  
       
  3164 +
       
  3165 +# Cheap backport of AS_EXECUTABLE_P and required macros
       
  3166 +# from Autoconf 2.59; we should not use $as_executable_p directly.
       
  3167 +
       
  3168 +# _AS_TEST_PREPARE
       
  3169 +# ----------------
       
  3170 +m4_ifndef([_AS_TEST_PREPARE],
       
  3171 +[m4_defun([_AS_TEST_PREPARE],
       
  3172 +[if test -x / >/dev/null 2>&1; then
       
  3173 +  as_executable_p='test -x'
       
  3174 +else
       
  3175 +  as_executable_p='test -f'
       
  3176 +fi
       
  3177 +])])# _AS_TEST_PREPARE
       
  3178 +
       
  3179 +# AS_EXECUTABLE_P
       
  3180 +# ---------------
       
  3181 +# Check whether a file is executable.
       
  3182 +m4_ifndef([AS_EXECUTABLE_P],
       
  3183 +[m4_defun([AS_EXECUTABLE_P],
       
  3184 +[AS_REQUIRE([_AS_TEST_PREPARE])dnl
       
  3185 +$as_executable_p $1[]dnl
       
  3186 +])])# AS_EXECUTABLE_P
       
  3187 +
       
  3188  # NOTE: This macro has been submitted for inclusion into   #
       
  3189  #  GNU Autoconf as AC_PROG_SED.  When it is available in   #
       
  3190  #  a released version of Autoconf we should remove this    #
       
  3191  #  macro and use it instead.                               #
       
  3192  # LT_AC_PROG_SED
       
  3193  # --------------
       
  3194  # Check for a fully-functional sed program, that truncates
       
  3195  # as few characters as possible.  Prefer GNU sed if found.
       
  3196 @@ -6347,22 +6604,23 @@ AC_CACHE_VAL(lt_cv_path_SED,
       
  3197  # Then use that list of sed's as ones to test for truncation.
       
  3198  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
       
  3199  for as_dir in $PATH
       
  3200  do
       
  3201    IFS=$as_save_IFS
       
  3202    test -z "$as_dir" && as_dir=.
       
  3203    for lt_ac_prog in sed gsed; do
       
  3204      for ac_exec_ext in '' $ac_executable_extensions; do
       
  3205 -      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
       
  3206 +      if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then
       
  3207          lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
       
  3208        fi
       
  3209      done
       
  3210    done
       
  3211  done
       
  3212 +IFS=$as_save_IFS
       
  3213  lt_ac_max=0
       
  3214  lt_ac_count=0
       
  3215  # Add /usr/xpg4/bin/sed as it is typically found on Solaris
       
  3216  # along with /bin/sed that truncates output.
       
  3217  for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
       
  3218    test ! -f $lt_ac_sed && continue
       
  3219    cat /dev/null > conftest.in
       
  3220    lt_ac_count=0
       
  3221 @@ -6385,16 +6643,17 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xp
       
  3222      if test $lt_ac_count -gt $lt_ac_max; then
       
  3223        lt_ac_max=$lt_ac_count
       
  3224        lt_cv_path_SED=$lt_ac_sed
       
  3225      fi
       
  3226    done
       
  3227  done
       
  3228  ])
       
  3229  SED=$lt_cv_path_SED
       
  3230 +AC_SUBST([SED])
       
  3231  AC_MSG_RESULT([$SED])
       
  3232  ])
       
  3233  
       
  3234  # Copyright (C) 2002, 2003, 2005, 2006  Free Software Foundation, Inc.
       
  3235  #
       
  3236  # This file is free software; the Free Software Foundation
       
  3237  # gives unlimited permission to copy and/or distribute it,
       
  3238  # with or without modifications, as long as this notice is preserved.
       
  3239 diff --git a/toolkit/crashreporter/google-breakpad/configure b/toolkit/crashreporter/google-breakpad/configure
       
  3240 --- a/toolkit/crashreporter/google-breakpad/configure
       
  3241 +++ b/toolkit/crashreporter/google-breakpad/configure
       
  3242 @@ -854,22 +854,25 @@ am__fastdepCXX_FALSE
       
  3243  build
       
  3244  build_cpu
       
  3245  build_vendor
       
  3246  build_os
       
  3247  host
       
  3248  host_cpu
       
  3249  host_vendor
       
  3250  host_os
       
  3251 +SED
       
  3252  GREP
       
  3253  EGREP
       
  3254  LN_S
       
  3255  ECHO
       
  3256  AR
       
  3257  RANLIB
       
  3258 +DSYMUTIL
       
  3259 +NMEDIT
       
  3260  CXXCPP
       
  3261  F77
       
  3262  FFLAGS
       
  3263  ac_ct_F77
       
  3264  LIBTOOL
       
  3265  LIBTOOL_DEPS
       
  3266  SELFTEST_TRUE
       
  3267  SELFTEST_FALSE
       
  3268 @@ -4459,22 +4462,23 @@ else
       
  3269  # Then use that list of sed's as ones to test for truncation.
       
  3270  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
       
  3271  for as_dir in $PATH
       
  3272  do
       
  3273    IFS=$as_save_IFS
       
  3274    test -z "$as_dir" && as_dir=.
       
  3275    for lt_ac_prog in sed gsed; do
       
  3276      for ac_exec_ext in '' $ac_executable_extensions; do
       
  3277 -      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
       
  3278 +      if { test -f "$as_dir/$lt_ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$lt_ac_prog$ac_exec_ext"; }; then
       
  3279          lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
       
  3280        fi
       
  3281      done
       
  3282    done
       
  3283  done
       
  3284 +IFS=$as_save_IFS
       
  3285  lt_ac_max=0
       
  3286  lt_ac_count=0
       
  3287  # Add /usr/xpg4/bin/sed as it is typically found on Solaris
       
  3288  # along with /bin/sed that truncates output.
       
  3289  for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
       
  3290    test ! -f $lt_ac_sed && continue
       
  3291    cat /dev/null > conftest.in
       
  3292    lt_ac_count=0
       
  3293 @@ -4499,16 +4503,17 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xp
       
  3294        lt_cv_path_SED=$lt_ac_sed
       
  3295      fi
       
  3296    done
       
  3297  done
       
  3298  
       
  3299  fi
       
  3300  
       
  3301  SED=$lt_cv_path_SED
       
  3302 +
       
  3303  { echo "$as_me:$LINENO: result: $SED" >&5
       
  3304  echo "${ECHO_T}$SED" >&6; }
       
  3305  
       
  3306  { echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
       
  3307  echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
       
  3308  if test "${ac_cv_path_GREP+set}" = set; then
       
  3309    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3310  else
       
  3311 @@ -4860,18 +4865,18 @@ LN_S=$as_ln_s
       
  3312  if test "$LN_S" = "ln -s"; then
       
  3313    { echo "$as_me:$LINENO: result: yes" >&5
       
  3314  echo "${ECHO_T}yes" >&6; }
       
  3315  else
       
  3316    { echo "$as_me:$LINENO: result: no, using $LN_S" >&5
       
  3317  echo "${ECHO_T}no, using $LN_S" >&6; }
       
  3318  fi
       
  3319  
       
  3320 -{ echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
       
  3321 -echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6; }
       
  3322 +{ echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
       
  3323 +echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; }
       
  3324  if test "${lt_cv_deplibs_check_method+set}" = set; then
       
  3325    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3326  else
       
  3327    lt_cv_file_magic_cmd='$MAGIC_CMD'
       
  3328  lt_cv_file_magic_test_file=
       
  3329  lt_cv_deplibs_check_method='unknown'
       
  3330  # Need to set the preceding variable on all platforms that support
       
  3331  # interlibrary dependencies.
       
  3332 @@ -4880,17 +4885,17 @@ lt_cv_deplibs_check_method='unknown'
       
  3333  # 'pass_all' -- all dependencies passed with no checks.
       
  3334  # 'test_compile' -- check by making test program.
       
  3335  # 'file_magic [[regex]]' -- check by looking for files in library path
       
  3336  # which responds to the $file_magic_cmd with a given extended regex.
       
  3337  # If you have `file' or equivalent on your system and you're not sure
       
  3338  # whether `pass_all' will *always* work, you probably want this one.
       
  3339  
       
  3340  case $host_os in
       
  3341 -aix4* | aix5*)
       
  3342 +aix[4-9]*)
       
  3343    lt_cv_deplibs_check_method=pass_all
       
  3344    ;;
       
  3345  
       
  3346  beos*)
       
  3347    lt_cv_deplibs_check_method=pass_all
       
  3348    ;;
       
  3349  
       
  3350  bsdi[45]*)
       
  3351 @@ -4902,26 +4907,32 @@ bsdi[45]*)
       
  3352  cygwin*)
       
  3353    # func_win32_libid is a shell function defined in ltmain.sh
       
  3354    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
       
  3355    lt_cv_file_magic_cmd='func_win32_libid'
       
  3356    ;;
       
  3357  
       
  3358  mingw* | pw32*)
       
  3359    # Base MSYS/MinGW do not provide the 'file' command needed by
       
  3360 -  # func_win32_libid shell function, so use a weaker test based on 'objdump'.
       
  3361 -  lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
       
  3362 -  lt_cv_file_magic_cmd='$OBJDUMP -f'
       
  3363 +  # func_win32_libid shell function, so use a weaker test based on 'objdump',
       
  3364 +  # unless we find 'file', for example because we are cross-compiling.
       
  3365 +  if ( file / ) >/dev/null 2>&1; then
       
  3366 +    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
       
  3367 +    lt_cv_file_magic_cmd='func_win32_libid'
       
  3368 +  else
       
  3369 +    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
       
  3370 +    lt_cv_file_magic_cmd='$OBJDUMP -f'
       
  3371 +  fi
       
  3372    ;;
       
  3373  
       
  3374  darwin* | rhapsody*)
       
  3375    lt_cv_deplibs_check_method=pass_all
       
  3376    ;;
       
  3377  
       
  3378 -freebsd* | kfreebsd*-gnu | dragonfly*)
       
  3379 +freebsd* | dragonfly*)
       
  3380    if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
       
  3381      case $host_cpu in
       
  3382      i*86 )
       
  3383        # Not sure whether the presence of OpenBSD here was a mistake.
       
  3384        # Let's accept both of them until this is cleared up.
       
  3385        lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
       
  3386        lt_cv_file_magic_cmd=/usr/bin/file
       
  3387        lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
       
  3388 @@ -4949,33 +4960,33 @@ hpux10.20* | hpux11*)
       
  3389      ;;
       
  3390    *)
       
  3391      lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
       
  3392      lt_cv_file_magic_test_file=/usr/lib/libc.sl
       
  3393      ;;
       
  3394    esac
       
  3395    ;;
       
  3396  
       
  3397 -interix3*)
       
  3398 +interix[3-9]*)
       
  3399    # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
       
  3400    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
       
  3401    ;;
       
  3402  
       
  3403  irix5* | irix6* | nonstopux*)
       
  3404    case $LD in
       
  3405    *-32|*"-32 ") libmagic=32-bit;;
       
  3406    *-n32|*"-n32 ") libmagic=N32;;
       
  3407    *-64|*"-64 ") libmagic=64-bit;;
       
  3408    *) libmagic=never-match;;
       
  3409    esac
       
  3410    lt_cv_deplibs_check_method=pass_all
       
  3411    ;;
       
  3412  
       
  3413  # This must be Linux ELF.
       
  3414 -linux*)
       
  3415 +linux* | k*bsd*-gnu)
       
  3416    lt_cv_deplibs_check_method=pass_all
       
  3417    ;;
       
  3418  
       
  3419  netbsd*)
       
  3420    if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
       
  3421      lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
       
  3422    else
       
  3423      lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
       
  3424 @@ -4999,16 +5010,20 @@ openbsd*)
       
  3425      lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
       
  3426    fi
       
  3427    ;;
       
  3428  
       
  3429  osf3* | osf4* | osf5*)
       
  3430    lt_cv_deplibs_check_method=pass_all
       
  3431    ;;
       
  3432  
       
  3433 +rdos*)
       
  3434 +  lt_cv_deplibs_check_method=pass_all
       
  3435 +  ;;
       
  3436 +
       
  3437  solaris*)
       
  3438    lt_cv_deplibs_check_method=pass_all
       
  3439    ;;
       
  3440  
       
  3441  sysv4 | sysv4.3*)
       
  3442    case $host_vendor in
       
  3443    motorola)
       
  3444      lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
       
  3445 @@ -5086,17 +5101,17 @@ ia64-*-hpux*)
       
  3446        HPUX_IA64_MODE="64"
       
  3447        ;;
       
  3448      esac
       
  3449    fi
       
  3450    rm -rf conftest*
       
  3451    ;;
       
  3452  *-*-irix6*)
       
  3453    # Find out which ABI we are using.
       
  3454 -  echo '#line 5094 "configure"' > conftest.$ac_ext
       
  3455 +  echo '#line 5109 "configure"' > conftest.$ac_ext
       
  3456    if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
       
  3457    (eval $ac_compile) 2>&5
       
  3458    ac_status=$?
       
  3459    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  3460    (exit $ac_status); }; then
       
  3461     if test "$lt_cv_prog_gnu_ld" = yes; then
       
  3462      case `/usr/bin/file conftest.$ac_objext` in
       
  3463      *32-bit*)
       
  3464 @@ -5121,43 +5136,50 @@ ia64-*-hpux*)
       
  3465        LD="${LD-ld} -64"
       
  3466        ;;
       
  3467      esac
       
  3468     fi
       
  3469    fi
       
  3470    rm -rf conftest*
       
  3471    ;;
       
  3472  
       
  3473 -x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
       
  3474 +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
       
  3475 +s390*-*linux*|sparc*-*linux*)
       
  3476    # Find out which ABI we are using.
       
  3477    echo 'int i;' > conftest.$ac_ext
       
  3478    if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
       
  3479    (eval $ac_compile) 2>&5
       
  3480    ac_status=$?
       
  3481    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  3482    (exit $ac_status); }; then
       
  3483      case `/usr/bin/file conftest.o` in
       
  3484      *32-bit*)
       
  3485        case $host in
       
  3486 +        x86_64-*kfreebsd*-gnu)
       
  3487 +          LD="${LD-ld} -m elf_i386_fbsd"
       
  3488 +          ;;
       
  3489          x86_64-*linux*)
       
  3490            LD="${LD-ld} -m elf_i386"
       
  3491            ;;
       
  3492          ppc64-*linux*|powerpc64-*linux*)
       
  3493            LD="${LD-ld} -m elf32ppclinux"
       
  3494            ;;
       
  3495          s390x-*linux*)
       
  3496            LD="${LD-ld} -m elf_s390"
       
  3497            ;;
       
  3498          sparc64-*linux*)
       
  3499            LD="${LD-ld} -m elf32_sparc"
       
  3500            ;;
       
  3501        esac
       
  3502        ;;
       
  3503      *64-bit*)
       
  3504        case $host in
       
  3505 +        x86_64-*kfreebsd*-gnu)
       
  3506 +          LD="${LD-ld} -m elf_x86_64_fbsd"
       
  3507 +          ;;
       
  3508          x86_64-*linux*)
       
  3509            LD="${LD-ld} -m elf_x86_64"
       
  3510            ;;
       
  3511          ppc*-*linux*|powerpc*-*linux*)
       
  3512            LD="${LD-ld} -m elf64ppc"
       
  3513            ;;
       
  3514          s390*-*linux*)
       
  3515            LD="${LD-ld} -m elf64_s390"
       
  3516 @@ -5251,17 +5273,21 @@ sparc*-*solaris*)
       
  3517    (eval $ac_compile) 2>&5
       
  3518    ac_status=$?
       
  3519    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  3520    (exit $ac_status); }; then
       
  3521      case `/usr/bin/file conftest.o` in
       
  3522      *64-bit*)
       
  3523        case $lt_cv_prog_gnu_ld in
       
  3524        yes*) LD="${LD-ld} -m elf64_sparc" ;;
       
  3525 -      *)    LD="${LD-ld} -64" ;;
       
  3526 +      *)
       
  3527 +        if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
       
  3528 +	  LD="${LD-ld} -64"
       
  3529 +	fi
       
  3530 +	;;
       
  3531        esac
       
  3532        ;;
       
  3533      esac
       
  3534    fi
       
  3535    rm -rf conftest*
       
  3536    ;;
       
  3537  
       
  3538  
       
  3539 @@ -6151,17 +6177,16 @@ ac_ext=c
       
  3540  ac_cpp='$CPP $CPPFLAGS'
       
  3541  ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
       
  3542  ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
       
  3543  ac_compiler_gnu=$ac_cv_c_compiler_gnu
       
  3544  
       
  3545  
       
  3546  
       
  3547  # Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
       
  3548 -
       
  3549  # find the maximum length of command line arguments
       
  3550  { echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
       
  3551  echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; }
       
  3552  if test "${lt_cv_sys_max_cmd_len+set}" = set; then
       
  3553    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3554  else
       
  3555      i=0
       
  3556    teststring="ABCD"
       
  3557 @@ -6238,50 +6263,54 @@ else
       
  3558      kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
       
  3559      if test -n "$kargmax"; then
       
  3560        lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ 	]//'`
       
  3561      else
       
  3562        lt_cv_sys_max_cmd_len=32768
       
  3563      fi
       
  3564      ;;
       
  3565    *)
       
  3566 -    # If test is not a shell built-in, we'll probably end up computing a
       
  3567 -    # maximum length that is only half of the actual maximum length, but
       
  3568 -    # we can't tell.
       
  3569 -    SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       
  3570 -    while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
       
  3571 +    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
       
  3572 +    if test -n "$lt_cv_sys_max_cmd_len"; then
       
  3573 +      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       
  3574 +      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
       
  3575 +    else
       
  3576 +      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       
  3577 +      while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
       
  3578  	       = "XX$teststring") >/dev/null 2>&1 &&
       
  3579 -	    new_result=`expr "X$teststring" : ".*" 2>&1` &&
       
  3580 -	    lt_cv_sys_max_cmd_len=$new_result &&
       
  3581 -	    test $i != 17 # 1/2 MB should be enough
       
  3582 -    do
       
  3583 -      i=`expr $i + 1`
       
  3584 -      teststring=$teststring$teststring
       
  3585 -    done
       
  3586 -    teststring=
       
  3587 -    # Add a significant safety factor because C++ compilers can tack on massive
       
  3588 -    # amounts of additional arguments before passing them to the linker.
       
  3589 -    # It appears as though 1/2 is a usable value.
       
  3590 -    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
       
  3591 +	      new_result=`expr "X$teststring" : ".*" 2>&1` &&
       
  3592 +	      lt_cv_sys_max_cmd_len=$new_result &&
       
  3593 +	      test $i != 17 # 1/2 MB should be enough
       
  3594 +      do
       
  3595 +        i=`expr $i + 1`
       
  3596 +        teststring=$teststring$teststring
       
  3597 +      done
       
  3598 +      teststring=
       
  3599 +      # Add a significant safety factor because C++ compilers can tack on massive
       
  3600 +      # amounts of additional arguments before passing them to the linker.
       
  3601 +      # It appears as though 1/2 is a usable value.
       
  3602 +      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
       
  3603 +    fi
       
  3604      ;;
       
  3605    esac
       
  3606  
       
  3607  fi
       
  3608  
       
  3609  if test -n $lt_cv_sys_max_cmd_len ; then
       
  3610    { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
       
  3611  echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; }
       
  3612  else
       
  3613    { echo "$as_me:$LINENO: result: none" >&5
       
  3614  echo "${ECHO_T}none" >&6; }
       
  3615  fi
       
  3616  
       
  3617  
       
  3618  
       
  3619  
       
  3620 +
       
  3621  # Check for command to grab the raw symbol name followed by C symbol from nm.
       
  3622  { echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
       
  3623  echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; }
       
  3624  if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
       
  3625    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3626  else
       
  3627  
       
  3628  # These are sane defaults that work on at least a few old systems.
       
  3629 @@ -6309,17 +6338,17 @@ cygwin* | mingw* | pw32*)
       
  3630    ;;
       
  3631  hpux*) # Its linker distinguishes data from code symbols
       
  3632    if test "$host_cpu" = ia64; then
       
  3633      symcode='[ABCDEGRST]'
       
  3634    fi
       
  3635    lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
       
  3636    lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
       
  3637    ;;
       
  3638 -linux*)
       
  3639 +linux* | k*bsd*-gnu)
       
  3640    if test "$host_cpu" = ia64; then
       
  3641      symcode='[ABCDGIRSTW]'
       
  3642      lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
       
  3643      lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
       
  3644    fi
       
  3645    ;;
       
  3646  irix* | nonstopux*)
       
  3647    symcode='[BCDEGRST]'
       
  3648 @@ -6462,17 +6491,17 @@ EOF
       
  3649        fi
       
  3650      else
       
  3651        echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
       
  3652      fi
       
  3653    else
       
  3654      echo "$progname: failed program was:" >&5
       
  3655      cat conftest.$ac_ext >&5
       
  3656    fi
       
  3657 -  rm -f conftest* conftst*
       
  3658 +  rm -rf conftest* conftst*
       
  3659  
       
  3660    # Do not use the global_symbol_pipe unless it works.
       
  3661    if test "$pipe_works" = yes; then
       
  3662      break
       
  3663    else
       
  3664      lt_cv_sys_global_symbol_pipe=
       
  3665    fi
       
  3666  done
       
  3667 @@ -6860,17 +6889,17 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file
       
  3668  test -z "$NM" && NM=nm
       
  3669  test -z "$SED" && SED=sed
       
  3670  test -z "$OBJDUMP" && OBJDUMP=objdump
       
  3671  test -z "$RANLIB" && RANLIB=:
       
  3672  test -z "$STRIP" && STRIP=:
       
  3673  test -z "$ac_objext" && ac_objext=o
       
  3674  
       
  3675  # Determine commands to create old-style static archives.
       
  3676 -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
       
  3677 +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
       
  3678  old_postinstall_cmds='chmod 644 $oldlib'
       
  3679  old_postuninstall_cmds=
       
  3680  
       
  3681  if test -n "$RANLIB"; then
       
  3682    case $host_os in
       
  3683    openbsd*)
       
  3684      old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
       
  3685      ;;
       
  3686 @@ -7022,16 +7051,328 @@ fi
       
  3687      MAGIC_CMD=:
       
  3688    fi
       
  3689  fi
       
  3690  
       
  3691    fi
       
  3692    ;;
       
  3693  esac
       
  3694  
       
  3695 +
       
  3696 +  case $host_os in
       
  3697 +    rhapsody* | darwin*)
       
  3698 +    if test -n "$ac_tool_prefix"; then
       
  3699 +  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
       
  3700 +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
       
  3701 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5
       
  3702 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
       
  3703 +if test "${ac_cv_prog_DSYMUTIL+set}" = set; then
       
  3704 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3705 +else
       
  3706 +  if test -n "$DSYMUTIL"; then
       
  3707 +  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
       
  3708 +else
       
  3709 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
       
  3710 +for as_dir in $PATH
       
  3711 +do
       
  3712 +  IFS=$as_save_IFS
       
  3713 +  test -z "$as_dir" && as_dir=.
       
  3714 +  for ac_exec_ext in '' $ac_executable_extensions; do
       
  3715 +  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
       
  3716 +    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
       
  3717 +    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
       
  3718 +    break 2
       
  3719 +  fi
       
  3720 +done
       
  3721 +done
       
  3722 +IFS=$as_save_IFS
       
  3723 +
       
  3724 +fi
       
  3725 +fi
       
  3726 +DSYMUTIL=$ac_cv_prog_DSYMUTIL
       
  3727 +if test -n "$DSYMUTIL"; then
       
  3728 +  { echo "$as_me:$LINENO: result: $DSYMUTIL" >&5
       
  3729 +echo "${ECHO_T}$DSYMUTIL" >&6; }
       
  3730 +else
       
  3731 +  { echo "$as_me:$LINENO: result: no" >&5
       
  3732 +echo "${ECHO_T}no" >&6; }
       
  3733 +fi
       
  3734 +
       
  3735 +
       
  3736 +fi
       
  3737 +if test -z "$ac_cv_prog_DSYMUTIL"; then
       
  3738 +  ac_ct_DSYMUTIL=$DSYMUTIL
       
  3739 +  # Extract the first word of "dsymutil", so it can be a program name with args.
       
  3740 +set dummy dsymutil; ac_word=$2
       
  3741 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5
       
  3742 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
       
  3743 +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then
       
  3744 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3745 +else
       
  3746 +  if test -n "$ac_ct_DSYMUTIL"; then
       
  3747 +  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
       
  3748 +else
       
  3749 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
       
  3750 +for as_dir in $PATH
       
  3751 +do
       
  3752 +  IFS=$as_save_IFS
       
  3753 +  test -z "$as_dir" && as_dir=.
       
  3754 +  for ac_exec_ext in '' $ac_executable_extensions; do
       
  3755 +  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
       
  3756 +    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
       
  3757 +    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
       
  3758 +    break 2
       
  3759 +  fi
       
  3760 +done
       
  3761 +done
       
  3762 +IFS=$as_save_IFS
       
  3763 +
       
  3764 +fi
       
  3765 +fi
       
  3766 +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
       
  3767 +if test -n "$ac_ct_DSYMUTIL"; then
       
  3768 +  { echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5
       
  3769 +echo "${ECHO_T}$ac_ct_DSYMUTIL" >&6; }
       
  3770 +else
       
  3771 +  { echo "$as_me:$LINENO: result: no" >&5
       
  3772 +echo "${ECHO_T}no" >&6; }
       
  3773 +fi
       
  3774 +
       
  3775 +  if test "x$ac_ct_DSYMUTIL" = x; then
       
  3776 +    DSYMUTIL=":"
       
  3777 +  else
       
  3778 +    case $cross_compiling:$ac_tool_warned in
       
  3779 +yes:)
       
  3780 +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
       
  3781 +whose name does not start with the host triplet.  If you think this
       
  3782 +configuration is useful to you, please write to autoconf@gnu.org." >&5
       
  3783 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
       
  3784 +whose name does not start with the host triplet.  If you think this
       
  3785 +configuration is useful to you, please write to autoconf@gnu.org." >&2;}
       
  3786 +ac_tool_warned=yes ;;
       
  3787 +esac
       
  3788 +    DSYMUTIL=$ac_ct_DSYMUTIL
       
  3789 +  fi
       
  3790 +else
       
  3791 +  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
       
  3792 +fi
       
  3793 +
       
  3794 +    if test -n "$ac_tool_prefix"; then
       
  3795 +  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
       
  3796 +set dummy ${ac_tool_prefix}nmedit; ac_word=$2
       
  3797 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5
       
  3798 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
       
  3799 +if test "${ac_cv_prog_NMEDIT+set}" = set; then
       
  3800 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3801 +else
       
  3802 +  if test -n "$NMEDIT"; then
       
  3803 +  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
       
  3804 +else
       
  3805 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
       
  3806 +for as_dir in $PATH
       
  3807 +do
       
  3808 +  IFS=$as_save_IFS
       
  3809 +  test -z "$as_dir" && as_dir=.
       
  3810 +  for ac_exec_ext in '' $ac_executable_extensions; do
       
  3811 +  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
       
  3812 +    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
       
  3813 +    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
       
  3814 +    break 2
       
  3815 +  fi
       
  3816 +done
       
  3817 +done
       
  3818 +IFS=$as_save_IFS
       
  3819 +
       
  3820 +fi
       
  3821 +fi
       
  3822 +NMEDIT=$ac_cv_prog_NMEDIT
       
  3823 +if test -n "$NMEDIT"; then
       
  3824 +  { echo "$as_me:$LINENO: result: $NMEDIT" >&5
       
  3825 +echo "${ECHO_T}$NMEDIT" >&6; }
       
  3826 +else
       
  3827 +  { echo "$as_me:$LINENO: result: no" >&5
       
  3828 +echo "${ECHO_T}no" >&6; }
       
  3829 +fi
       
  3830 +
       
  3831 +
       
  3832 +fi
       
  3833 +if test -z "$ac_cv_prog_NMEDIT"; then
       
  3834 +  ac_ct_NMEDIT=$NMEDIT
       
  3835 +  # Extract the first word of "nmedit", so it can be a program name with args.
       
  3836 +set dummy nmedit; ac_word=$2
       
  3837 +{ echo "$as_me:$LINENO: checking for $ac_word" >&5
       
  3838 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
       
  3839 +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then
       
  3840 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3841 +else
       
  3842 +  if test -n "$ac_ct_NMEDIT"; then
       
  3843 +  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
       
  3844 +else
       
  3845 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
       
  3846 +for as_dir in $PATH
       
  3847 +do
       
  3848 +  IFS=$as_save_IFS
       
  3849 +  test -z "$as_dir" && as_dir=.
       
  3850 +  for ac_exec_ext in '' $ac_executable_extensions; do
       
  3851 +  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
       
  3852 +    ac_cv_prog_ac_ct_NMEDIT="nmedit"
       
  3853 +    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
       
  3854 +    break 2
       
  3855 +  fi
       
  3856 +done
       
  3857 +done
       
  3858 +IFS=$as_save_IFS
       
  3859 +
       
  3860 +fi
       
  3861 +fi
       
  3862 +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
       
  3863 +if test -n "$ac_ct_NMEDIT"; then
       
  3864 +  { echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5
       
  3865 +echo "${ECHO_T}$ac_ct_NMEDIT" >&6; }
       
  3866 +else
       
  3867 +  { echo "$as_me:$LINENO: result: no" >&5
       
  3868 +echo "${ECHO_T}no" >&6; }
       
  3869 +fi
       
  3870 +
       
  3871 +  if test "x$ac_ct_NMEDIT" = x; then
       
  3872 +    NMEDIT=":"
       
  3873 +  else
       
  3874 +    case $cross_compiling:$ac_tool_warned in
       
  3875 +yes:)
       
  3876 +{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
       
  3877 +whose name does not start with the host triplet.  If you think this
       
  3878 +configuration is useful to you, please write to autoconf@gnu.org." >&5
       
  3879 +echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
       
  3880 +whose name does not start with the host triplet.  If you think this
       
  3881 +configuration is useful to you, please write to autoconf@gnu.org." >&2;}
       
  3882 +ac_tool_warned=yes ;;
       
  3883 +esac
       
  3884 +    NMEDIT=$ac_ct_NMEDIT
       
  3885 +  fi
       
  3886 +else
       
  3887 +  NMEDIT="$ac_cv_prog_NMEDIT"
       
  3888 +fi
       
  3889 +
       
  3890 +
       
  3891 +    { echo "$as_me:$LINENO: checking for -single_module linker flag" >&5
       
  3892 +echo $ECHO_N "checking for -single_module linker flag... $ECHO_C" >&6; }
       
  3893 +if test "${lt_cv_apple_cc_single_mod+set}" = set; then
       
  3894 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3895 +else
       
  3896 +  lt_cv_apple_cc_single_mod=no
       
  3897 +      if test -z "${LT_MULTI_MODULE}"; then
       
  3898 +   # By default we will add the -single_module flag. You can override
       
  3899 +   # by either setting the environment variable LT_MULTI_MODULE
       
  3900 +   # non-empty at configure time, or by adding -multi_module to the
       
  3901 +   # link flags.
       
  3902 +   echo "int foo(void){return 1;}" > conftest.c
       
  3903 +   $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
       
  3904 +     -dynamiclib ${wl}-single_module conftest.c
       
  3905 +   if test -f libconftest.dylib; then
       
  3906 +     lt_cv_apple_cc_single_mod=yes
       
  3907 +     rm -rf libconftest.dylib*
       
  3908 +   fi
       
  3909 +   rm conftest.c
       
  3910 +      fi
       
  3911 +fi
       
  3912 +{ echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5
       
  3913 +echo "${ECHO_T}$lt_cv_apple_cc_single_mod" >&6; }
       
  3914 +    { echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5
       
  3915 +echo $ECHO_N "checking for -exported_symbols_list linker flag... $ECHO_C" >&6; }
       
  3916 +if test "${lt_cv_ld_exported_symbols_list+set}" = set; then
       
  3917 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  3918 +else
       
  3919 +  lt_cv_ld_exported_symbols_list=no
       
  3920 +      save_LDFLAGS=$LDFLAGS
       
  3921 +      echo "_main" > conftest.sym
       
  3922 +      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
       
  3923 +      cat >conftest.$ac_ext <<_ACEOF
       
  3924 +/* confdefs.h.  */
       
  3925 +_ACEOF
       
  3926 +cat confdefs.h >>conftest.$ac_ext
       
  3927 +cat >>conftest.$ac_ext <<_ACEOF
       
  3928 +/* end confdefs.h.  */
       
  3929 +
       
  3930 +int
       
  3931 +main ()
       
  3932 +{
       
  3933 +
       
  3934 +  ;
       
  3935 +  return 0;
       
  3936 +}
       
  3937 +_ACEOF
       
  3938 +rm -f conftest.$ac_objext conftest$ac_exeext
       
  3939 +if { (ac_try="$ac_link"
       
  3940 +case "(($ac_try" in
       
  3941 +  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
       
  3942 +  *) ac_try_echo=$ac_try;;
       
  3943 +esac
       
  3944 +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
       
  3945 +  (eval "$ac_link") 2>conftest.er1
       
  3946 +  ac_status=$?
       
  3947 +  grep -v '^ *+' conftest.er1 >conftest.err
       
  3948 +  rm -f conftest.er1
       
  3949 +  cat conftest.err >&5
       
  3950 +  echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  3951 +  (exit $ac_status); } && {
       
  3952 +	 test -z "$ac_c_werror_flag" ||
       
  3953 +	 test ! -s conftest.err
       
  3954 +       } && test -s conftest$ac_exeext &&
       
  3955 +       $as_test_x conftest$ac_exeext; then
       
  3956 +  lt_cv_ld_exported_symbols_list=yes
       
  3957 +else
       
  3958 +  echo "$as_me: failed program was:" >&5
       
  3959 +sed 's/^/| /' conftest.$ac_ext >&5
       
  3960 +
       
  3961 +	lt_cv_ld_exported_symbols_list=no
       
  3962 +fi
       
  3963 +
       
  3964 +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  3965 +      conftest$ac_exeext conftest.$ac_ext
       
  3966 +   LDFLAGS="$save_LDFLAGS"
       
  3967 +
       
  3968 +fi
       
  3969 +{ echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5
       
  3970 +echo "${ECHO_T}$lt_cv_ld_exported_symbols_list" >&6; }
       
  3971 +    case $host_os in
       
  3972 +    rhapsody* | darwin1.[0123])
       
  3973 +      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
       
  3974 +    darwin1.*)
       
  3975 +     _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
       
  3976 +    darwin*)
       
  3977 +      # if running on 10.5 or later, the deployment target defaults
       
  3978 +      # to the OS version, if on x86, and 10.4, the deployment
       
  3979 +      # target defaults to 10.4. Don't you love it?
       
  3980 +      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
       
  3981 +   10.0,*86*-darwin8*|10.0,*-darwin[91]*)
       
  3982 +     _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
       
  3983 +   10.[012]*)
       
  3984 +     _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
       
  3985 +   10.*)
       
  3986 +     _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
       
  3987 +      esac
       
  3988 +    ;;
       
  3989 +  esac
       
  3990 +    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
       
  3991 +      _lt_dar_single_mod='$single_module'
       
  3992 +    fi
       
  3993 +    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
       
  3994 +      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
       
  3995 +    else
       
  3996 +      _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}"
       
  3997 +    fi
       
  3998 +    if test "$DSYMUTIL" != ":"; then
       
  3999 +      _lt_dsymutil="~$DSYMUTIL \$lib || :"
       
  4000 +    else
       
  4001 +      _lt_dsymutil=
       
  4002 +    fi
       
  4003 +    ;;
       
  4004 +  esac
       
  4005 +
       
  4006 +
       
  4007  enable_dlopen=no
       
  4008  enable_win32_dll=no
       
  4009  
       
  4010  # Check whether --enable-libtool-lock was given.
       
  4011  if test "${enable_libtool_lock+set}" = set; then
       
  4012    enableval=$enable_libtool_lock;
       
  4013  fi
       
  4014  
       
  4015 @@ -7060,76 +7401,76 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
       
  4016  # Source file extension for C test sources.
       
  4017  ac_ext=c
       
  4018  
       
  4019  # Object file extension for compiled C test sources.
       
  4020  objext=o
       
  4021  objext=$objext
       
  4022  
       
  4023  # Code to be used in simple compile tests
       
  4024 -lt_simple_compile_test_code="int some_variable = 0;\n"
       
  4025 +lt_simple_compile_test_code="int some_variable = 0;"
       
  4026  
       
  4027  # Code to be used in simple link tests
       
  4028 -lt_simple_link_test_code='int main(){return(0);}\n'
       
  4029 +lt_simple_link_test_code='int main(){return(0);}'
       
  4030  
       
  4031  
       
  4032  # If no C compiler was specified, use CC.
       
  4033  LTCC=${LTCC-"$CC"}
       
  4034  
       
  4035  # If no C compiler flags were specified, use CFLAGS.
       
  4036  LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
       
  4037  
       
  4038  # Allow CC to be a program name with arguments.
       
  4039  compiler=$CC
       
  4040  
       
  4041  
       
  4042  # save warnings/boilerplate of simple test code
       
  4043  ac_outfile=conftest.$ac_objext
       
  4044 -printf "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  4045 +echo "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  4046  eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  4047  _lt_compiler_boilerplate=`cat conftest.err`
       
  4048  $rm conftest*
       
  4049  
       
  4050  ac_outfile=conftest.$ac_objext
       
  4051 -printf "$lt_simple_link_test_code" >conftest.$ac_ext
       
  4052 +echo "$lt_simple_link_test_code" >conftest.$ac_ext
       
  4053  eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  4054  _lt_linker_boilerplate=`cat conftest.err`
       
  4055 -$rm conftest*
       
  4056 +$rm -r conftest*
       
  4057  
       
  4058  
       
  4059  
       
  4060  lt_prog_compiler_no_builtin_flag=
       
  4061  
       
  4062  if test "$GCC" = yes; then
       
  4063    lt_prog_compiler_no_builtin_flag=' -fno-builtin'
       
  4064  
       
  4065  
       
  4066  { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
       
  4067  echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
       
  4068  if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
       
  4069    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  4070  else
       
  4071    lt_cv_prog_compiler_rtti_exceptions=no
       
  4072    ac_outfile=conftest.$ac_objext
       
  4073 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  4074 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  4075     lt_compiler_flag="-fno-rtti -fno-exceptions"
       
  4076     # Insert the option either (1) after the last *FLAGS variable, or
       
  4077     # (2) before a word containing "conftest.", or (3) at the end.
       
  4078     # Note that $ac_compile itself does not contain backslashes and begins
       
  4079     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  4080     # The option is referenced via a variable to avoid confusing sed.
       
  4081     lt_compile=`echo "$ac_compile" | $SED \
       
  4082     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  4083     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  4084     -e 's:$: $lt_compiler_flag:'`
       
  4085 -   (eval echo "\"\$as_me:7123: $lt_compile\"" >&5)
       
  4086 +   (eval echo "\"\$as_me:7464: $lt_compile\"" >&5)
       
  4087     (eval "$lt_compile" 2>conftest.err)
       
  4088     ac_status=$?
       
  4089     cat conftest.err >&5
       
  4090 -   echo "$as_me:7127: \$? = $ac_status" >&5
       
  4091 +   echo "$as_me:7468: \$? = $ac_status" >&5
       
  4092     if (exit $ac_status) && test -s "$ac_outfile"; then
       
  4093       # The compiler can only warn and ignore the option if not recognized
       
  4094       # So say no if there are warnings other than the usual output.
       
  4095       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
       
  4096       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  4097       if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       
  4098         lt_cv_prog_compiler_rtti_exceptions=yes
       
  4099       fi
       
  4100 @@ -7170,33 +7511,35 @@ echo $ECHO_N "checking for $compiler opt
       
  4101  
       
  4102      amigaos*)
       
  4103        # FIXME: we need at least 68020 code to build shared libraries, but
       
  4104        # adding the `-m68020' flag to GCC prevents building anything better,
       
  4105        # like `-m68040'.
       
  4106        lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
       
  4107        ;;
       
  4108  
       
  4109 -    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  4110 +    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  4111        # PIC is the default for these OSes.
       
  4112        ;;
       
  4113  
       
  4114 -    mingw* | pw32* | os2*)
       
  4115 +    mingw* | cygwin* | pw32* | os2*)
       
  4116        # This hack is so that the source file can tell whether it is being
       
  4117        # built for inclusion in a dll (and should export symbols for example).
       
  4118 +      # Although the cygwin gcc ignores -fPIC, still need this for old-style
       
  4119 +      # (--disable-auto-import) libraries
       
  4120        lt_prog_compiler_pic='-DDLL_EXPORT'
       
  4121        ;;
       
  4122  
       
  4123      darwin* | rhapsody*)
       
  4124        # PIC is the default on this platform
       
  4125        # Common symbols not allowed in MH_DYLIB files
       
  4126        lt_prog_compiler_pic='-fno-common'
       
  4127        ;;
       
  4128  
       
  4129 -    interix3*)
       
  4130 +    interix[3-9]*)
       
  4131        # Interix 3.x gcc -fpic/-fPIC options generate broken code.
       
  4132        # Instead, we relocate shared libraries at runtime.
       
  4133        ;;
       
  4134  
       
  4135      msdosdjgpp*)
       
  4136        # Just because we use GCC doesn't mean we suddenly get shared libraries
       
  4137        # on systems that don't support them.
       
  4138        lt_prog_compiler_can_build_shared=no
       
  4139 @@ -7244,17 +7587,17 @@ echo $ECHO_N "checking for $compiler opt
       
  4140         case $cc_basename in
       
  4141           xlc*)
       
  4142           lt_prog_compiler_pic='-qnocommon'
       
  4143           lt_prog_compiler_wl='-Wl,'
       
  4144           ;;
       
  4145         esac
       
  4146         ;;
       
  4147  
       
  4148 -    mingw* | pw32* | os2*)
       
  4149 +    mingw* | cygwin* | pw32* | os2*)
       
  4150        # This hack is so that the source file can tell whether it is being
       
  4151        # built for inclusion in a dll (and should export symbols for example).
       
  4152        lt_prog_compiler_pic='-DDLL_EXPORT'
       
  4153        ;;
       
  4154  
       
  4155      hpux9* | hpux10* | hpux11*)
       
  4156        lt_prog_compiler_wl='-Wl,'
       
  4157        # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
       
  4158 @@ -7277,17 +7620,17 @@ echo $ECHO_N "checking for $compiler opt
       
  4159        lt_prog_compiler_static='-non_shared'
       
  4160        ;;
       
  4161  
       
  4162      newsos6)
       
  4163        lt_prog_compiler_pic='-KPIC'
       
  4164        lt_prog_compiler_static='-Bstatic'
       
  4165        ;;
       
  4166  
       
  4167 -    linux*)
       
  4168 +    linux* | k*bsd*-gnu)
       
  4169        case $cc_basename in
       
  4170        icc* | ecc*)
       
  4171  	lt_prog_compiler_wl='-Wl,'
       
  4172  	lt_prog_compiler_pic='-KPIC'
       
  4173  	lt_prog_compiler_static='-static'
       
  4174          ;;
       
  4175        pgcc* | pgf77* | pgf90* | pgf95*)
       
  4176          # Portland Group compilers (*not* the Pentium gcc compiler,
       
  4177 @@ -7296,25 +7639,45 @@ echo $ECHO_N "checking for $compiler opt
       
  4178  	lt_prog_compiler_pic='-fpic'
       
  4179  	lt_prog_compiler_static='-Bstatic'
       
  4180          ;;
       
  4181        ccc*)
       
  4182          lt_prog_compiler_wl='-Wl,'
       
  4183          # All Alpha code is PIC.
       
  4184          lt_prog_compiler_static='-non_shared'
       
  4185          ;;
       
  4186 +      *)
       
  4187 +        case `$CC -V 2>&1 | sed 5q` in
       
  4188 +	*Sun\ C*)
       
  4189 +	  # Sun C 5.9
       
  4190 +	  lt_prog_compiler_pic='-KPIC'
       
  4191 +	  lt_prog_compiler_static='-Bstatic'
       
  4192 +	  lt_prog_compiler_wl='-Wl,'
       
  4193 +	  ;;
       
  4194 +	*Sun\ F*)
       
  4195 +	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
       
  4196 +	  lt_prog_compiler_pic='-KPIC'
       
  4197 +	  lt_prog_compiler_static='-Bstatic'
       
  4198 +	  lt_prog_compiler_wl=''
       
  4199 +	  ;;
       
  4200 +	esac
       
  4201 +	;;
       
  4202        esac
       
  4203        ;;
       
  4204  
       
  4205      osf3* | osf4* | osf5*)
       
  4206        lt_prog_compiler_wl='-Wl,'
       
  4207        # All OSF/1 code is PIC.
       
  4208        lt_prog_compiler_static='-non_shared'
       
  4209        ;;
       
  4210  
       
  4211 +    rdos*)
       
  4212 +      lt_prog_compiler_static='-non_shared'
       
  4213 +      ;;
       
  4214 +
       
  4215      solaris*)
       
  4216        lt_prog_compiler_pic='-KPIC'
       
  4217        lt_prog_compiler_static='-Bstatic'
       
  4218        case $cc_basename in
       
  4219        f77* | f90* | f95*)
       
  4220  	lt_prog_compiler_wl='-Qoption ld ';;
       
  4221        *)
       
  4222  	lt_prog_compiler_wl='-Wl,';;
       
  4223 @@ -7367,53 +7730,53 @@ echo "${ECHO_T}$lt_prog_compiler_pic" >&
       
  4224  
       
  4225  #
       
  4226  # Check to make sure the PIC flag actually works.
       
  4227  #
       
  4228  if test -n "$lt_prog_compiler_pic"; then
       
  4229  
       
  4230  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
       
  4231  echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; }
       
  4232 -if test "${lt_prog_compiler_pic_works+set}" = set; then
       
  4233 -  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  4234 -else
       
  4235 -  lt_prog_compiler_pic_works=no
       
  4236 +if test "${lt_cv_prog_compiler_pic_works+set}" = set; then
       
  4237 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  4238 +else
       
  4239 +  lt_cv_prog_compiler_pic_works=no
       
  4240    ac_outfile=conftest.$ac_objext
       
  4241 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  4242 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  4243     lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
       
  4244     # Insert the option either (1) after the last *FLAGS variable, or
       
  4245     # (2) before a word containing "conftest.", or (3) at the end.
       
  4246     # Note that $ac_compile itself does not contain backslashes and begins
       
  4247     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  4248     # The option is referenced via a variable to avoid confusing sed.
       
  4249     lt_compile=`echo "$ac_compile" | $SED \
       
  4250     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  4251     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  4252     -e 's:$: $lt_compiler_flag:'`
       
  4253 -   (eval echo "\"\$as_me:7391: $lt_compile\"" >&5)
       
  4254 +   (eval echo "\"\$as_me:7754: $lt_compile\"" >&5)
       
  4255     (eval "$lt_compile" 2>conftest.err)
       
  4256     ac_status=$?
       
  4257     cat conftest.err >&5
       
  4258 -   echo "$as_me:7395: \$? = $ac_status" >&5
       
  4259 +   echo "$as_me:7758: \$? = $ac_status" >&5
       
  4260     if (exit $ac_status) && test -s "$ac_outfile"; then
       
  4261       # The compiler can only warn and ignore the option if not recognized
       
  4262       # So say no if there are warnings other than the usual output.
       
  4263       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
       
  4264       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  4265       if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       
  4266 -       lt_prog_compiler_pic_works=yes
       
  4267 +       lt_cv_prog_compiler_pic_works=yes
       
  4268       fi
       
  4269     fi
       
  4270     $rm conftest*
       
  4271  
       
  4272  fi
       
  4273 -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
       
  4274 -echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6; }
       
  4275 -
       
  4276 -if test x"$lt_prog_compiler_pic_works" = xyes; then
       
  4277 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5
       
  4278 +echo "${ECHO_T}$lt_cv_prog_compiler_pic_works" >&6; }
       
  4279 +
       
  4280 +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
       
  4281      case $lt_prog_compiler_pic in
       
  4282       "" | " "*) ;;
       
  4283       *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
       
  4284       esac
       
  4285  else
       
  4286      lt_prog_compiler_pic=
       
  4287       lt_prog_compiler_can_build_shared=no
       
  4288  fi
       
  4289 @@ -7430,78 +7793,78 @@ case $host_os in
       
  4290  esac
       
  4291  
       
  4292  #
       
  4293  # Check to make sure the static flag actually works.
       
  4294  #
       
  4295  wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
       
  4296  { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
       
  4297  echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
       
  4298 -if test "${lt_prog_compiler_static_works+set}" = set; then
       
  4299 -  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  4300 -else
       
  4301 -  lt_prog_compiler_static_works=no
       
  4302 +if test "${lt_cv_prog_compiler_static_works+set}" = set; then
       
  4303 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  4304 +else
       
  4305 +  lt_cv_prog_compiler_static_works=no
       
  4306     save_LDFLAGS="$LDFLAGS"
       
  4307     LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
       
  4308 -   printf "$lt_simple_link_test_code" > conftest.$ac_ext
       
  4309 +   echo "$lt_simple_link_test_code" > conftest.$ac_ext
       
  4310     if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
       
  4311       # The linker can only warn and ignore the option if not recognized
       
  4312       # So say no if there are warnings
       
  4313       if test -s conftest.err; then
       
  4314         # Append any errors to the config.log.
       
  4315         cat conftest.err 1>&5
       
  4316         $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
       
  4317         $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  4318         if diff conftest.exp conftest.er2 >/dev/null; then
       
  4319 -         lt_prog_compiler_static_works=yes
       
  4320 +         lt_cv_prog_compiler_static_works=yes
       
  4321         fi
       
  4322       else
       
  4323 -       lt_prog_compiler_static_works=yes
       
  4324 +       lt_cv_prog_compiler_static_works=yes
       
  4325       fi
       
  4326     fi
       
  4327 -   $rm conftest*
       
  4328 +   $rm -r conftest*
       
  4329     LDFLAGS="$save_LDFLAGS"
       
  4330  
       
  4331  fi
       
  4332 -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
       
  4333 -echo "${ECHO_T}$lt_prog_compiler_static_works" >&6; }
       
  4334 -
       
  4335 -if test x"$lt_prog_compiler_static_works" = xyes; then
       
  4336 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5
       
  4337 +echo "${ECHO_T}$lt_cv_prog_compiler_static_works" >&6; }
       
  4338 +
       
  4339 +if test x"$lt_cv_prog_compiler_static_works" = xyes; then
       
  4340      :
       
  4341  else
       
  4342      lt_prog_compiler_static=
       
  4343  fi
       
  4344  
       
  4345  
       
  4346  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
       
  4347  echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
       
  4348  if test "${lt_cv_prog_compiler_c_o+set}" = set; then
       
  4349    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  4350  else
       
  4351    lt_cv_prog_compiler_c_o=no
       
  4352     $rm -r conftest 2>/dev/null
       
  4353     mkdir conftest
       
  4354     cd conftest
       
  4355     mkdir out
       
  4356 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  4357 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  4358  
       
  4359     lt_compiler_flag="-o out/conftest2.$ac_objext"
       
  4360     # Insert the option either (1) after the last *FLAGS variable, or
       
  4361     # (2) before a word containing "conftest.", or (3) at the end.
       
  4362     # Note that $ac_compile itself does not contain backslashes and begins
       
  4363     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  4364     lt_compile=`echo "$ac_compile" | $SED \
       
  4365     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  4366     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  4367     -e 's:$: $lt_compiler_flag:'`
       
  4368 -   (eval echo "\"\$as_me:7495: $lt_compile\"" >&5)
       
  4369 +   (eval echo "\"\$as_me:7858: $lt_compile\"" >&5)
       
  4370     (eval "$lt_compile" 2>out/conftest.err)
       
  4371     ac_status=$?
       
  4372     cat out/conftest.err >&5
       
  4373 -   echo "$as_me:7499: \$? = $ac_status" >&5
       
  4374 +   echo "$as_me:7862: \$? = $ac_status" >&5
       
  4375     if (exit $ac_status) && test -s out/conftest2.$ac_objext
       
  4376     then
       
  4377       # The compiler can only warn and ignore the option if not recognized
       
  4378       # So say no if there are warnings
       
  4379       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
       
  4380       $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
       
  4381       if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       
  4382         lt_cv_prog_compiler_c_o=yes
       
  4383 @@ -7571,22 +7934,23 @@ echo $ECHO_N "checking whether the $comp
       
  4384    export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
       
  4385    # include_expsyms should be a list of space-separated symbols to be *always*
       
  4386    # included in the symbol list
       
  4387    include_expsyms=
       
  4388    # exclude_expsyms can be an extended regexp of symbols to exclude
       
  4389    # it will be wrapped by ` (' and `)$', so one must not match beginning or
       
  4390    # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
       
  4391    # as well as any symbol that contains `d'.
       
  4392 -  exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
       
  4393 +  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
       
  4394    # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
       
  4395    # platforms (ab)use it in PIC code, but their linkers get confused if
       
  4396    # the symbol is explicitly referenced.  Since portable code cannot
       
  4397    # rely on this symbol name, it's probably fine to never include it in
       
  4398    # preloaded symbol tables.
       
  4399 +  # Exclude shared library initialization/finalization symbols.
       
  4400    extract_expsyms_cmds=
       
  4401    # Just being paranoid about ensuring that cc_basename is set.
       
  4402    for cc_temp in $compiler""; do
       
  4403    case $cc_temp in
       
  4404      compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
       
  4405      distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
       
  4406      \-*) ;;
       
  4407      *) break;;
       
  4408 @@ -7635,17 +7999,17 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -
       
  4409        *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
       
  4410        *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
       
  4411        *\ 2.11.*) ;; # other 2.11 versions
       
  4412        *) supports_anon_versioning=yes ;;
       
  4413      esac
       
  4414  
       
  4415      # See if GNU ld supports shared libraries.
       
  4416      case $host_os in
       
  4417 -    aix3* | aix4* | aix5*)
       
  4418 +    aix[3-9]*)
       
  4419        # On AIX/PPC, the GNU linker is very broken
       
  4420        if test "$host_cpu" != ia64; then
       
  4421  	ld_shlibs=no
       
  4422  	cat <<EOF 1>&2
       
  4423  
       
  4424  *** Warning: the GNU linker, at least up to release 2.9.1, is reported
       
  4425  *** to be unable to reliably create shared libraries on AIX.
       
  4426  *** Therefore, libtool is disabling shared libraries support.  If you
       
  4427 @@ -7683,17 +8047,17 @@ EOF
       
  4428  
       
  4429      cygwin* | mingw* | pw32*)
       
  4430        # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
       
  4431        # as there is no search path for DLLs.
       
  4432        hardcode_libdir_flag_spec='-L$libdir'
       
  4433        allow_undefined_flag=unsupported
       
  4434        always_export_symbols=no
       
  4435        enable_shared_with_static_runtimes=yes
       
  4436 -      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
       
  4437 +      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
       
  4438  
       
  4439        if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
       
  4440          archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  4441  	# If the export-symbols file already is a .def file (1st line
       
  4442  	# is EXPORTS), use it as is; otherwise, prepend...
       
  4443  	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
       
  4444  	  cp $export_symbols $output_objdir/$soname.def;
       
  4445  	else
       
  4446 @@ -7701,32 +8065,32 @@ EOF
       
  4447  	  cat $export_symbols >> $output_objdir/$soname.def;
       
  4448  	fi~
       
  4449  	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  4450        else
       
  4451  	ld_shlibs=no
       
  4452        fi
       
  4453        ;;
       
  4454  
       
  4455 -    interix3*)
       
  4456 +    interix[3-9]*)
       
  4457        hardcode_direct=no
       
  4458        hardcode_shlibpath_var=no
       
  4459        hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
       
  4460        export_dynamic_flag_spec='${wl}-E'
       
  4461        # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       
  4462        # Instead, shared libraries are loaded at an image base (0x10000000 by
       
  4463        # default) and relocated if they conflict, which is a slow very memory
       
  4464        # consuming and fragmenting process.  To avoid this, we pick a random,
       
  4465        # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       
  4466        # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
       
  4467        archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       
  4468        archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       
  4469        ;;
       
  4470  
       
  4471 -    linux*)
       
  4472 +    gnu* | linux* | k*bsd*-gnu)
       
  4473        if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
       
  4474  	tmp_addflag=
       
  4475  	case $cc_basename,$host_cpu in
       
  4476  	pgcc*)				# Portland Group C compiler
       
  4477  	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  4478  	  tmp_addflag=' $pic_flag'
       
  4479  	  ;;
       
  4480  	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
       
  4481 @@ -7734,23 +8098,32 @@ EOF
       
  4482  	  tmp_addflag=' $pic_flag -Mnomain' ;;
       
  4483  	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
       
  4484  	  tmp_addflag=' -i_dynamic' ;;
       
  4485  	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
       
  4486  	  tmp_addflag=' -i_dynamic -nofor_main' ;;
       
  4487  	ifc* | ifort*)			# Intel Fortran compiler
       
  4488  	  tmp_addflag=' -nofor_main' ;;
       
  4489  	esac
       
  4490 -	archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       
  4491 +	case `$CC -V 2>&1 | sed 5q` in
       
  4492 +	*Sun\ C*)			# Sun C 5.9
       
  4493 +	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  4494 +	  tmp_sharedflag='-G' ;;
       
  4495 +	*Sun\ F*)			# Sun Fortran 8.3
       
  4496 +	  tmp_sharedflag='-G' ;;
       
  4497 +	*)
       
  4498 +	  tmp_sharedflag='-shared' ;;
       
  4499 +	esac
       
  4500 +	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       
  4501  
       
  4502  	if test $supports_anon_versioning = yes; then
       
  4503  	  archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~
       
  4504    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
       
  4505    $echo "local: *; };" >> $output_objdir/$libname.ver~
       
  4506 -	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
       
  4507 +	  $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
       
  4508  	fi
       
  4509        else
       
  4510  	ld_shlibs=no
       
  4511        fi
       
  4512        ;;
       
  4513  
       
  4514      netbsd*)
       
  4515        if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  4516 @@ -7845,17 +8218,17 @@ _LT_EOF
       
  4517        hardcode_minus_L=yes
       
  4518        if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
       
  4519  	# Neither direct hardcoding nor static linking is supported with a
       
  4520  	# broken collect2.
       
  4521  	hardcode_direct=unsupported
       
  4522        fi
       
  4523        ;;
       
  4524  
       
  4525 -    aix4* | aix5*)
       
  4526 +    aix[4-9]*)
       
  4527        if test "$host_cpu" = ia64; then
       
  4528  	# On IA64, the linker does run time linking by default, so we don't
       
  4529  	# have to do anything special.
       
  4530  	aix_use_runtimelinking=no
       
  4531  	exp_sym_flag='-Bexport'
       
  4532  	no_entry_flag=""
       
  4533        else
       
  4534  	# If we're using GNU nm, then we don't want the "-C" option.
       
  4535 @@ -7865,17 +8238,17 @@ _LT_EOF
       
  4536  	else
       
  4537  	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
       
  4538  	fi
       
  4539  	aix_use_runtimelinking=no
       
  4540  
       
  4541  	# Test if we are trying to use run time linking or normal
       
  4542  	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
       
  4543  	# need to do runtime linking.
       
  4544 -	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
       
  4545 +	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
       
  4546  	  for ld_flag in $LDFLAGS; do
       
  4547    	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
       
  4548    	    aix_use_runtimelinking=yes
       
  4549    	    break
       
  4550    	  fi
       
  4551  	  done
       
  4552  	  ;;
       
  4553  	esac
       
  4554 @@ -7899,17 +8272,17 @@ _LT_EOF
       
  4555  	case $host_os in aix4.[012]|aix4.[012].*)
       
  4556  	# We only want to do this on AIX 4.2 and lower, the check
       
  4557  	# below for broken collect2 doesn't work under 4.3+
       
  4558  	  collect2name=`${CC} -print-prog-name=collect2`
       
  4559  	  if test -f "$collect2name" && \
       
  4560    	   strings "$collect2name" | grep resolve_lib_name >/dev/null
       
  4561  	  then
       
  4562    	  # We have reworked collect2
       
  4563 -  	  hardcode_direct=yes
       
  4564 +  	  :
       
  4565  	  else
       
  4566    	  # We have old collect2
       
  4567    	  hardcode_direct=unsupported
       
  4568    	  # It fails to find uninstalled libraries when the uninstalled
       
  4569    	  # path is not listed in the libpath.  Setting hardcode_minus_L
       
  4570    	  # to unsupported forces relinking
       
  4571    	  hardcode_minus_L=yes
       
  4572    	  hardcode_libdir_flag_spec='-L$libdir'
       
  4573 @@ -7973,21 +8346,28 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
       
  4574    cat conftest.err >&5
       
  4575    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  4576    (exit $ac_status); } && {
       
  4577  	 test -z "$ac_c_werror_flag" ||
       
  4578  	 test ! -s conftest.err
       
  4579         } && test -s conftest$ac_exeext &&
       
  4580         $as_test_x conftest$ac_exeext; then
       
  4581  
       
  4582 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  4583 -}'`
       
  4584 +lt_aix_libpath_sed='
       
  4585 +    /Import File Strings/,/^$/ {
       
  4586 +	/^0/ {
       
  4587 +	    s/^0  *\(.*\)$/\1/
       
  4588 +	    p
       
  4589 +	}
       
  4590 +    }'
       
  4591 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  4592  # Check for a 64-bit object if we didn't find anything.
       
  4593 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  4594 -}'`; fi
       
  4595 +if test -z "$aix_libpath"; then
       
  4596 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  4597 +fi
       
  4598  else
       
  4599    echo "$as_me: failed program was:" >&5
       
  4600  sed 's/^/| /' conftest.$ac_ext >&5
       
  4601  
       
  4602  
       
  4603  fi
       
  4604  
       
  4605  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  4606 @@ -8032,21 +8412,28 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
       
  4607    cat conftest.err >&5
       
  4608    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  4609    (exit $ac_status); } && {
       
  4610  	 test -z "$ac_c_werror_flag" ||
       
  4611  	 test ! -s conftest.err
       
  4612         } && test -s conftest$ac_exeext &&
       
  4613         $as_test_x conftest$ac_exeext; then
       
  4614  
       
  4615 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  4616 -}'`
       
  4617 +lt_aix_libpath_sed='
       
  4618 +    /Import File Strings/,/^$/ {
       
  4619 +	/^0/ {
       
  4620 +	    s/^0  *\(.*\)$/\1/
       
  4621 +	    p
       
  4622 +	}
       
  4623 +    }'
       
  4624 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  4625  # Check for a 64-bit object if we didn't find anything.
       
  4626 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  4627 -}'`; fi
       
  4628 +if test -z "$aix_libpath"; then
       
  4629 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  4630 +fi
       
  4631  else
       
  4632    echo "$as_me: failed program was:" >&5
       
  4633  sed 's/^/| /' conftest.$ac_ext >&5
       
  4634  
       
  4635  
       
  4636  fi
       
  4637  
       
  4638  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  4639 @@ -8090,17 +8477,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  4640        libext=lib
       
  4641        # Tell ltmain to make .dll files, not .so files.
       
  4642        shrext_cmds=".dll"
       
  4643        # FIXME: Setting linknames here is a bad hack.
       
  4644        archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
       
  4645        # The linker will automatically build a .lib file if we build a DLL.
       
  4646        old_archive_From_new_cmds='true'
       
  4647        # FIXME: Should let the user specify the lib program.
       
  4648 -      old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
       
  4649 +      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
       
  4650        fix_srcfile_path='`cygpath -w "$srcfile"`'
       
  4651        enable_shared_with_static_runtimes=yes
       
  4652        ;;
       
  4653  
       
  4654      darwin* | rhapsody*)
       
  4655        case $host_os in
       
  4656          rhapsody* | darwin1.[012])
       
  4657           allow_undefined_flag='${wl}-undefined ${wl}suppress'
       
  4658 @@ -8123,29 +8510,28 @@ if test -z "$aix_libpath"; then aix_libp
       
  4659        archive_cmds_need_lc=no
       
  4660        hardcode_direct=no
       
  4661        hardcode_automatic=yes
       
  4662        hardcode_shlibpath_var=unsupported
       
  4663        whole_archive_flag_spec=''
       
  4664        link_all_deplibs=yes
       
  4665      if test "$GCC" = yes ; then
       
  4666      	output_verbose_link_cmd='echo'
       
  4667 -        archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
       
  4668 -      module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  4669 -      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  4670 -      archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  4671 -      module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  4672 +        archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
       
  4673 +        module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
       
  4674 +        archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
       
  4675 +        module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
       
  4676      else
       
  4677        case $cc_basename in
       
  4678          xlc*)
       
  4679           output_verbose_link_cmd='echo'
       
  4680 -         archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
       
  4681 +         archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
       
  4682           module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  4683            # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  4684 -         archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  4685 +         archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  4686            module_expsym_cmds='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  4687            ;;
       
  4688         *)
       
  4689           ld_shlibs=no
       
  4690            ;;
       
  4691        esac
       
  4692      fi
       
  4693        ;;
       
  4694 @@ -8175,17 +8561,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  4695      freebsd2*)
       
  4696        archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  4697        hardcode_direct=yes
       
  4698        hardcode_minus_L=yes
       
  4699        hardcode_shlibpath_var=no
       
  4700        ;;
       
  4701  
       
  4702      # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
       
  4703 -    freebsd* | kfreebsd*-gnu | dragonfly*)
       
  4704 +    freebsd* | dragonfly*)
       
  4705        archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
       
  4706        hardcode_libdir_flag_spec='-R$libdir'
       
  4707        hardcode_direct=yes
       
  4708        hardcode_shlibpath_var=no
       
  4709        ;;
       
  4710  
       
  4711      hpux9*)
       
  4712        if test "$GCC" = yes; then
       
  4713 @@ -8297,34 +8683,38 @@ if test -z "$aix_libpath"; then aix_libp
       
  4714        archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       
  4715        hardcode_direct=yes
       
  4716        hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
       
  4717        hardcode_libdir_separator=:
       
  4718        hardcode_shlibpath_var=no
       
  4719        ;;
       
  4720  
       
  4721      openbsd*)
       
  4722 -      hardcode_direct=yes
       
  4723 -      hardcode_shlibpath_var=no
       
  4724 -      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  4725 -	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  4726 -	archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
       
  4727 -	hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
       
  4728 -	export_dynamic_flag_spec='${wl}-E'
       
  4729 -      else
       
  4730 -       case $host_os in
       
  4731 -	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
       
  4732 -	   archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  4733 -	   hardcode_libdir_flag_spec='-R$libdir'
       
  4734 -	   ;;
       
  4735 -	 *)
       
  4736 -	   archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  4737 -	   hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
       
  4738 -	   ;;
       
  4739 -       esac
       
  4740 +      if test -f /usr/libexec/ld.so; then
       
  4741 +	hardcode_direct=yes
       
  4742 +	hardcode_shlibpath_var=no
       
  4743 +	if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  4744 +	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  4745 +	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
       
  4746 +	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
       
  4747 +	  export_dynamic_flag_spec='${wl}-E'
       
  4748 +	else
       
  4749 +	  case $host_os in
       
  4750 +	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
       
  4751 +	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  4752 +	     hardcode_libdir_flag_spec='-R$libdir'
       
  4753 +	     ;;
       
  4754 +	   *)
       
  4755 +	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  4756 +	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
       
  4757 +	     ;;
       
  4758 +	  esac
       
  4759 +        fi
       
  4760 +      else
       
  4761 +	ld_shlibs=no
       
  4762        fi
       
  4763        ;;
       
  4764  
       
  4765      os2*)
       
  4766        hardcode_libdir_flag_spec='-L$libdir'
       
  4767        hardcode_minus_L=yes
       
  4768        allow_undefined_flag=unsupported
       
  4769        archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
       
  4770 @@ -8373,27 +8763,26 @@ if test -z "$aix_libpath"; then aix_libp
       
  4771  	archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
       
  4772    	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
       
  4773        fi
       
  4774        hardcode_libdir_flag_spec='-R$libdir'
       
  4775        hardcode_shlibpath_var=no
       
  4776        case $host_os in
       
  4777        solaris2.[0-5] | solaris2.[0-5].*) ;;
       
  4778        *)
       
  4779 - 	# The compiler driver will combine linker options so we
       
  4780 - 	# cannot just pass the convience library names through
       
  4781 - 	# without $wl, iff we do not link with $LD.
       
  4782 - 	# Luckily, gcc supports the same syntax we need for Sun Studio.
       
  4783 +	# The compiler driver will combine and reorder linker options,
       
  4784 +	# but understands `-z linker_flag'.  GCC discards it without `$wl',
       
  4785 +	# but is careful enough not to reorder.
       
  4786   	# Supported since Solaris 2.6 (maybe 2.5.1?)
       
  4787 - 	case $wlarc in
       
  4788 - 	'')
       
  4789 - 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
       
  4790 - 	*)
       
  4791 - 	  whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
       
  4792 - 	esac ;;
       
  4793 +	if test "$GCC" = yes; then
       
  4794 +	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
       
  4795 +	else
       
  4796 +	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
       
  4797 +	fi
       
  4798 +	;;
       
  4799        esac
       
  4800        link_all_deplibs=yes
       
  4801        ;;
       
  4802  
       
  4803      sunos4*)
       
  4804        if test "x$host_vendor" = xsequent; then
       
  4805  	# Use $CC to link under sequent, because it throws in some extra .o
       
  4806  	# files that make .init and .fini sections work.
       
  4807 @@ -8440,17 +8829,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  4808  	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       
  4809  	hardcode_shlibpath_var=no
       
  4810  	runpath_var=LD_RUN_PATH
       
  4811  	hardcode_runpath_var=yes
       
  4812  	ld_shlibs=yes
       
  4813        fi
       
  4814        ;;
       
  4815  
       
  4816 -    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
       
  4817 +    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
       
  4818        no_undefined_flag='${wl}-z,text'
       
  4819        archive_cmds_need_lc=no
       
  4820        hardcode_shlibpath_var=no
       
  4821        runpath_var='LD_RUN_PATH'
       
  4822  
       
  4823        if test "$GCC" = yes; then
       
  4824  	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       
  4825  	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       
  4826 @@ -8517,17 +8906,17 @@ x|xyes)
       
  4827        ;;
       
  4828      '$CC '*)
       
  4829        # Test whether the compiler implicitly links with -lc since on some
       
  4830        # systems, -lgcc has to come before -lc. If gcc already passes -lc
       
  4831        # to ld, don't add -lc before -lgcc.
       
  4832        { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
       
  4833  echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
       
  4834        $rm conftest*
       
  4835 -      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  4836 +      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  4837  
       
  4838        if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
       
  4839    (eval $ac_compile) 2>&5
       
  4840    ac_status=$?
       
  4841    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  4842    (exit $ac_status); } 2>conftest.err; then
       
  4843          soname=conftest
       
  4844          lib=conftest
       
  4845 @@ -8575,27 +8964,65 @@ postinstall_cmds=
       
  4846  postuninstall_cmds=
       
  4847  finish_cmds=
       
  4848  finish_eval=
       
  4849  shlibpath_var=
       
  4850  shlibpath_overrides_runpath=unknown
       
  4851  version_type=none
       
  4852  dynamic_linker="$host_os ld.so"
       
  4853  sys_lib_dlsearch_path_spec="/lib /usr/lib"
       
  4854 +
       
  4855  if test "$GCC" = yes; then
       
  4856 -  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
       
  4857 -  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
       
  4858 +  case $host_os in
       
  4859 +    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
       
  4860 +    *) lt_awk_arg="/^libraries:/" ;;
       
  4861 +  esac
       
  4862 +  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
       
  4863 +  if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then
       
  4864      # if the path contains ";" then we assume it to be the separator
       
  4865      # otherwise default to the standard path separator (i.e. ":") - it is
       
  4866      # assumed that no part of a normal pathname contains ";" but that should
       
  4867      # okay in the real world where ";" in dirpaths is itself problematic.
       
  4868 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       
  4869 -  else
       
  4870 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       
  4871 -  fi
       
  4872 +    lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'`
       
  4873 +  else
       
  4874 +    lt_search_path_spec=`echo "$lt_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       
  4875 +  fi
       
  4876 +  # Ok, now we have the path, separated by spaces, we can step through it
       
  4877 +  # and add multilib dir if necessary.
       
  4878 +  lt_tmp_lt_search_path_spec=
       
  4879 +  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
       
  4880 +  for lt_sys_path in $lt_search_path_spec; do
       
  4881 +    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
       
  4882 +      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
       
  4883 +    else
       
  4884 +      test -d "$lt_sys_path" && \
       
  4885 +	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
       
  4886 +    fi
       
  4887 +  done
       
  4888 +  lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk '
       
  4889 +BEGIN {RS=" "; FS="/|\n";} {
       
  4890 +  lt_foo="";
       
  4891 +  lt_count=0;
       
  4892 +  for (lt_i = NF; lt_i > 0; lt_i--) {
       
  4893 +    if ($lt_i != "" && $lt_i != ".") {
       
  4894 +      if ($lt_i == "..") {
       
  4895 +        lt_count++;
       
  4896 +      } else {
       
  4897 +        if (lt_count == 0) {
       
  4898 +          lt_foo="/" $lt_i lt_foo;
       
  4899 +        } else {
       
  4900 +          lt_count--;
       
  4901 +        }
       
  4902 +      }
       
  4903 +    }
       
  4904 +  }
       
  4905 +  if (lt_foo != "") { lt_freq[lt_foo]++; }
       
  4906 +  if (lt_freq[lt_foo] == 1) { print lt_foo; }
       
  4907 +}'`
       
  4908 +  sys_lib_search_path_spec=`echo $lt_search_path_spec`
       
  4909  else
       
  4910    sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
       
  4911  fi
       
  4912  need_lib_prefix=unknown
       
  4913  hardcode_into_libs=no
       
  4914  
       
  4915  # when you set need_version to no, make sure it does not cause -set_version
       
  4916  # flags to be left without arguments
       
  4917 @@ -8606,17 +9033,17 @@ aix3*)
       
  4918    version_type=linux
       
  4919    library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
       
  4920    shlibpath_var=LIBPATH
       
  4921  
       
  4922    # AIX 3 has no versioning support, so we append a major version to the name.
       
  4923    soname_spec='${libname}${release}${shared_ext}$major'
       
  4924    ;;
       
  4925  
       
  4926 -aix4* | aix5*)
       
  4927 +aix[4-9]*)
       
  4928    version_type=linux
       
  4929    need_lib_prefix=no
       
  4930    need_version=no
       
  4931    hardcode_into_libs=yes
       
  4932    if test "$host_cpu" = ia64; then
       
  4933      # AIX 5 supports IA64
       
  4934      library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
       
  4935      shlibpath_var=LD_LIBRARY_PATH
       
  4936 @@ -8745,50 +9172,34 @@ darwin* | rhapsody*)
       
  4937    version_type=darwin
       
  4938    need_lib_prefix=no
       
  4939    need_version=no
       
  4940    library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
       
  4941    soname_spec='${libname}${release}${major}$shared_ext'
       
  4942    shlibpath_overrides_runpath=yes
       
  4943    shlibpath_var=DYLD_LIBRARY_PATH
       
  4944    shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
       
  4945 -  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
       
  4946 -  if test "$GCC" = yes; then
       
  4947 -    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
       
  4948 -  else
       
  4949 -    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
       
  4950 -  fi
       
  4951 +
       
  4952 +  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
       
  4953    sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
       
  4954    ;;
       
  4955  
       
  4956  dgux*)
       
  4957    version_type=linux
       
  4958    need_lib_prefix=no
       
  4959    need_version=no
       
  4960    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
       
  4961    soname_spec='${libname}${release}${shared_ext}$major'
       
  4962    shlibpath_var=LD_LIBRARY_PATH
       
  4963    ;;
       
  4964  
       
  4965  freebsd1*)
       
  4966    dynamic_linker=no
       
  4967    ;;
       
  4968  
       
  4969 -kfreebsd*-gnu)
       
  4970 -  version_type=linux
       
  4971 -  need_lib_prefix=no
       
  4972 -  need_version=no
       
  4973 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  4974 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  4975 -  shlibpath_var=LD_LIBRARY_PATH
       
  4976 -  shlibpath_overrides_runpath=no
       
  4977 -  hardcode_into_libs=yes
       
  4978 -  dynamic_linker='GNU ld.so'
       
  4979 -  ;;
       
  4980 -
       
  4981  freebsd* | dragonfly*)
       
  4982    # DragonFly does not have aout.  When/if they implement a new
       
  4983    # versioning mechanism, adjust this.
       
  4984    if test -x /usr/bin/objformat; then
       
  4985      objformat=`/usr/bin/objformat`
       
  4986    else
       
  4987      case $host_os in
       
  4988      freebsd[123]*) objformat=aout ;;
       
  4989 @@ -8816,17 +9227,17 @@ freebsd* | dragonfly*)
       
  4990      shlibpath_overrides_runpath=yes
       
  4991      hardcode_into_libs=yes
       
  4992      ;;
       
  4993    freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
       
  4994    freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
       
  4995      shlibpath_overrides_runpath=no
       
  4996      hardcode_into_libs=yes
       
  4997      ;;
       
  4998 -  freebsd*) # from 4.6 on
       
  4999 +  *) # from 4.6 on, and DragonFly
       
  5000      shlibpath_overrides_runpath=yes
       
  5001      hardcode_into_libs=yes
       
  5002      ;;
       
  5003    esac
       
  5004    ;;
       
  5005  
       
  5006  gnu*)
       
  5007    version_type=linux
       
  5008 @@ -8879,17 +9290,17 @@ hpux9* | hpux10* | hpux11*)
       
  5009      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  5010      soname_spec='${libname}${release}${shared_ext}$major'
       
  5011      ;;
       
  5012    esac
       
  5013    # HP-UX runs *really* slowly unless shared libraries are mode 555.
       
  5014    postinstall_cmds='chmod 555 $lib'
       
  5015    ;;
       
  5016  
       
  5017 -interix3*)
       
  5018 +interix[3-9]*)
       
  5019    version_type=linux
       
  5020    need_lib_prefix=no
       
  5021    need_version=no
       
  5022    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  5023    soname_spec='${libname}${release}${shared_ext}$major'
       
  5024    dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
       
  5025    shlibpath_var=LD_LIBRARY_PATH
       
  5026    shlibpath_overrides_runpath=no
       
  5027 @@ -8934,57 +9345,45 @@ irix5* | irix6* | nonstopux*)
       
  5028    ;;
       
  5029  
       
  5030  # No shared lib support for Linux oldld, aout, or coff.
       
  5031  linux*oldld* | linux*aout* | linux*coff*)
       
  5032    dynamic_linker=no
       
  5033    ;;
       
  5034  
       
  5035  # This must be Linux ELF.
       
  5036 -linux*)
       
  5037 +linux* | k*bsd*-gnu)
       
  5038    version_type=linux
       
  5039    need_lib_prefix=no
       
  5040    need_version=no
       
  5041    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  5042    soname_spec='${libname}${release}${shared_ext}$major'
       
  5043    finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
       
  5044    shlibpath_var=LD_LIBRARY_PATH
       
  5045    shlibpath_overrides_runpath=no
       
  5046    # This implies no fast_install, which is unacceptable.
       
  5047    # Some rework will be needed to allow for fast_install
       
  5048    # before this can be enabled.
       
  5049    hardcode_into_libs=yes
       
  5050  
       
  5051    # Append ld.so.conf contents to the search path
       
  5052    if test -f /etc/ld.so.conf; then
       
  5053 -    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  5054 +    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  5055      sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
       
  5056    fi
       
  5057  
       
  5058    # We used to test for /lib/ld.so.1 and disable shared libraries on
       
  5059    # powerpc, because MkLinux only supported shared libraries with the
       
  5060    # GNU dynamic linker.  Since this was broken with cross compilers,
       
  5061    # most powerpc-linux boxes support dynamic linking these days and
       
  5062    # people can always --disable-shared, the test was removed, and we
       
  5063    # assume the GNU/Linux dynamic linker is in use.
       
  5064    dynamic_linker='GNU/Linux ld.so'
       
  5065    ;;
       
  5066  
       
  5067 -knetbsd*-gnu)
       
  5068 -  version_type=linux
       
  5069 -  need_lib_prefix=no
       
  5070 -  need_version=no
       
  5071 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  5072 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  5073 -  shlibpath_var=LD_LIBRARY_PATH
       
  5074 -  shlibpath_overrides_runpath=no
       
  5075 -  hardcode_into_libs=yes
       
  5076 -  dynamic_linker='GNU ld.so'
       
  5077 -  ;;
       
  5078 -
       
  5079  netbsd*)
       
  5080    version_type=sunos
       
  5081    need_lib_prefix=no
       
  5082    need_version=no
       
  5083    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  5084      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
       
  5085      finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
       
  5086      dynamic_linker='NetBSD (a.out) ld.so'
       
  5087 @@ -9056,16 +9455,20 @@ osf3* | osf4* | osf5*)
       
  5088    need_version=no
       
  5089    soname_spec='${libname}${release}${shared_ext}$major'
       
  5090    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  5091    shlibpath_var=LD_LIBRARY_PATH
       
  5092    sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
       
  5093    sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
       
  5094    ;;
       
  5095  
       
  5096 +rdos*)
       
  5097 +  dynamic_linker=no
       
  5098 +  ;;
       
  5099 +
       
  5100  solaris*)
       
  5101    version_type=linux
       
  5102    need_lib_prefix=no
       
  5103    need_version=no
       
  5104    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  5105    soname_spec='${libname}${release}${shared_ext}$major'
       
  5106    shlibpath_var=LD_LIBRARY_PATH
       
  5107    shlibpath_overrides_runpath=yes
       
  5108 @@ -9152,16 +9555,31 @@ uts4*)
       
  5109  *)
       
  5110    dynamic_linker=no
       
  5111    ;;
       
  5112  esac
       
  5113  { echo "$as_me:$LINENO: result: $dynamic_linker" >&5
       
  5114  echo "${ECHO_T}$dynamic_linker" >&6; }
       
  5115  test "$dynamic_linker" = no && can_build_shared=no
       
  5116  
       
  5117 +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
       
  5118 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  5119 +else
       
  5120 +  lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
       
  5121 +fi
       
  5122 +
       
  5123 +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
       
  5124 +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
       
  5125 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  5126 +else
       
  5127 +  lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
       
  5128 +fi
       
  5129 +
       
  5130 +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
       
  5131 +
       
  5132  variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
       
  5133  if test "$GCC" = yes; then
       
  5134    variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
       
  5135  fi
       
  5136  
       
  5137  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
       
  5138  echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
       
  5139  hardcode_action=
       
  5140 @@ -9209,16 +9627,17 @@ if test -n "$STRIP" && $STRIP -V 2>&1 | 
       
  5141    { echo "$as_me:$LINENO: result: yes" >&5
       
  5142  echo "${ECHO_T}yes" >&6; }
       
  5143  else
       
  5144  # FIXME - insert some real tests, host_os isn't really good enough
       
  5145    case $host_os in
       
  5146     darwin*)
       
  5147         if test -n "$STRIP" ; then
       
  5148           striplib="$STRIP -x"
       
  5149 +         old_striplib="$STRIP -S"
       
  5150           { echo "$as_me:$LINENO: result: yes" >&5
       
  5151  echo "${ECHO_T}yes" >&6; }
       
  5152         else
       
  5153    { echo "$as_me:$LINENO: result: no" >&5
       
  5154  echo "${ECHO_T}no" >&6; }
       
  5155  fi
       
  5156         ;;
       
  5157     *)
       
  5158 @@ -9470,17 +9889,17 @@ fi
       
  5159  
       
  5160  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  5161        conftest$ac_exeext conftest.$ac_ext
       
  5162  LIBS=$ac_check_lib_save_LIBS
       
  5163  fi
       
  5164  { echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
       
  5165  echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; }
       
  5166  if test $ac_cv_lib_dld_shl_load = yes; then
       
  5167 -  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
       
  5168 +  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
       
  5169  else
       
  5170    { echo "$as_me:$LINENO: checking for dlopen" >&5
       
  5171  echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; }
       
  5172  if test "${ac_cv_func_dlopen+set}" = set; then
       
  5173    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  5174  else
       
  5175    cat >conftest.$ac_ext <<_ACEOF
       
  5176  /* confdefs.h.  */
       
  5177 @@ -9746,17 +10165,17 @@ fi
       
  5178  
       
  5179  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  5180        conftest$ac_exeext conftest.$ac_ext
       
  5181  LIBS=$ac_check_lib_save_LIBS
       
  5182  fi
       
  5183  { echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
       
  5184  echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; }
       
  5185  if test $ac_cv_lib_dld_dld_link = yes; then
       
  5186 -  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
       
  5187 +  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
       
  5188  fi
       
  5189  
       
  5190  
       
  5191  fi
       
  5192  
       
  5193  
       
  5194  fi
       
  5195  
       
  5196 @@ -9795,17 +10214,17 @@ if test "${lt_cv_dlopen_self+set}" = set
       
  5197    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  5198  else
       
  5199    	  if test "$cross_compiling" = yes; then :
       
  5200    lt_cv_dlopen_self=cross
       
  5201  else
       
  5202    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
       
  5203    lt_status=$lt_dlunknown
       
  5204    cat > conftest.$ac_ext <<EOF
       
  5205 -#line 9803 "configure"
       
  5206 +#line 10222 "configure"
       
  5207  #include "confdefs.h"
       
  5208  
       
  5209  #if HAVE_DLFCN_H
       
  5210  #include <dlfcn.h>
       
  5211  #endif
       
  5212  
       
  5213  #include <stdio.h>
       
  5214  
       
  5215 @@ -9895,17 +10314,17 @@ if test "${lt_cv_dlopen_self_static+set}
       
  5216    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  5217  else
       
  5218    	  if test "$cross_compiling" = yes; then :
       
  5219    lt_cv_dlopen_self_static=cross
       
  5220  else
       
  5221    lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
       
  5222    lt_status=$lt_dlunknown
       
  5223    cat > conftest.$ac_ext <<EOF
       
  5224 -#line 9903 "configure"
       
  5225 +#line 10322 "configure"
       
  5226  #include "confdefs.h"
       
  5227  
       
  5228  #if HAVE_DLFCN_H
       
  5229  #include <dlfcn.h>
       
  5230  #endif
       
  5231  
       
  5232  #include <stdio.h>
       
  5233  
       
  5234 @@ -10022,17 +10441,17 @@ case $host_os in
       
  5235  aix3*)
       
  5236    test "$enable_shared" = yes && enable_static=no
       
  5237    if test -n "$RANLIB"; then
       
  5238      archive_cmds="$archive_cmds~\$RANLIB \$lib"
       
  5239      postinstall_cmds='$RANLIB $lib'
       
  5240    fi
       
  5241    ;;
       
  5242  
       
  5243 -aix4* | aix5*)
       
  5244 +aix[4-9]*)
       
  5245    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
       
  5246      test "$enable_shared" = yes && enable_static=no
       
  5247    fi
       
  5248      ;;
       
  5249  esac
       
  5250  { echo "$as_me:$LINENO: result: $enable_shared" >&5
       
  5251  echo "${ECHO_T}$enable_shared" >&6; }
       
  5252  
       
  5253 @@ -10078,31 +10497,33 @@ if test -f "$ltmain"; then
       
  5254      enable_shared_with_static_runtimes \
       
  5255      old_archive_cmds \
       
  5256      old_archive_from_new_cmds \
       
  5257      predep_objects \
       
  5258      postdep_objects \
       
  5259      predeps \
       
  5260      postdeps \
       
  5261      compiler_lib_search_path \
       
  5262 +    compiler_lib_search_dirs \
       
  5263      archive_cmds \
       
  5264      archive_expsym_cmds \
       
  5265      postinstall_cmds \
       
  5266      postuninstall_cmds \
       
  5267      old_archive_from_expsyms_cmds \
       
  5268      allow_undefined_flag \
       
  5269      no_undefined_flag \
       
  5270      export_symbols_cmds \
       
  5271      hardcode_libdir_flag_spec \
       
  5272      hardcode_libdir_flag_spec_ld \
       
  5273      hardcode_libdir_separator \
       
  5274      hardcode_automatic \
       
  5275      module_cmds \
       
  5276      module_expsym_cmds \
       
  5277      lt_cv_prog_compiler_c_o \
       
  5278 +    fix_srcfile_path \
       
  5279      exclude_expsyms \
       
  5280      include_expsyms; do
       
  5281  
       
  5282      case $var in
       
  5283      old_archive_cmds | \
       
  5284      old_archive_from_new_cmds | \
       
  5285      archive_cmds | \
       
  5286      archive_expsym_cmds | \
       
  5287 @@ -10137,17 +10558,17 @@ echo "$as_me: creating $ofile" >&6;}
       
  5288  
       
  5289    cat <<__EOF__ >> "$cfgfile"
       
  5290  #! $SHELL
       
  5291  
       
  5292  # `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
       
  5293  # Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
       
  5294  # NOTE: Changes made to this file will be lost: look at ltmain.sh.
       
  5295  #
       
  5296 -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
       
  5297 +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
       
  5298  # Free Software Foundation, Inc.
       
  5299  #
       
  5300  # This file is part of GNU Libtool:
       
  5301  # Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
       
  5302  #
       
  5303  # This program is free software; you can redistribute it and/or modify
       
  5304  # it under the terms of the GNU General Public License as published by
       
  5305  # the Free Software Foundation; either version 2 of the License, or
       
  5306 @@ -10373,16 +10794,20 @@ postdep_objects=$lt_postdep_objects
       
  5307  # Dependencies to place before the objects being linked to create a
       
  5308  # shared library.
       
  5309  predeps=$lt_predeps
       
  5310  
       
  5311  # Dependencies to place after the objects being linked to create a
       
  5312  # shared library.
       
  5313  postdeps=$lt_postdeps
       
  5314  
       
  5315 +# The directories searched by this compiler when creating a shared
       
  5316 +# library
       
  5317 +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
       
  5318 +
       
  5319  # The library search path used internally by the compiler when linking
       
  5320  # a shared library.
       
  5321  compiler_lib_search_path=$lt_compiler_lib_search_path
       
  5322  
       
  5323  # Method to check whether dependent libraries are shared objects.
       
  5324  deplibs_check_method=$lt_deplibs_check_method
       
  5325  
       
  5326  # Command to use when deplibs_check_method == file_magic.
       
  5327 @@ -10461,17 +10886,17 @@ link_all_deplibs=$link_all_deplibs
       
  5328  
       
  5329  # Compile-time system search path for libraries
       
  5330  sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
       
  5331  
       
  5332  # Run-time system search path for libraries
       
  5333  sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
       
  5334  
       
  5335  # Fix the shell variable \$srcfile for the compiler.
       
  5336 -fix_srcfile_path="$fix_srcfile_path"
       
  5337 +fix_srcfile_path=$lt_fix_srcfile_path
       
  5338  
       
  5339  # Set to yes if exported symbols are required.
       
  5340  always_export_symbols=$always_export_symbols
       
  5341  
       
  5342  # The commands to list exported symbols.
       
  5343  export_symbols_cmds=$lt_export_symbols_cmds
       
  5344  
       
  5345  # The commands to extract the exported symbol list from a shared archive.
       
  5346 @@ -10621,54 +11046,55 @@ whole_archive_flag_spec_CXX=
       
  5347  enable_shared_with_static_runtimes_CXX=no
       
  5348  
       
  5349  # Dependencies to place before and after the object being linked:
       
  5350  predep_objects_CXX=
       
  5351  postdep_objects_CXX=
       
  5352  predeps_CXX=
       
  5353  postdeps_CXX=
       
  5354  compiler_lib_search_path_CXX=
       
  5355 +compiler_lib_search_dirs_CXX=
       
  5356  
       
  5357  # Source file extension for C++ test sources.
       
  5358  ac_ext=cpp
       
  5359  
       
  5360  # Object file extension for compiled C++ test sources.
       
  5361  objext=o
       
  5362  objext_CXX=$objext
       
  5363  
       
  5364  # Code to be used in simple compile tests
       
  5365 -lt_simple_compile_test_code="int some_variable = 0;\n"
       
  5366 +lt_simple_compile_test_code="int some_variable = 0;"
       
  5367  
       
  5368  # Code to be used in simple link tests
       
  5369 -lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
       
  5370 +lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
       
  5371  
       
  5372  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
       
  5373  
       
  5374  # If no C compiler was specified, use CC.
       
  5375  LTCC=${LTCC-"$CC"}
       
  5376  
       
  5377  # If no C compiler flags were specified, use CFLAGS.
       
  5378  LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
       
  5379  
       
  5380  # Allow CC to be a program name with arguments.
       
  5381  compiler=$CC
       
  5382  
       
  5383  
       
  5384  # save warnings/boilerplate of simple test code
       
  5385  ac_outfile=conftest.$ac_objext
       
  5386 -printf "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  5387 +echo "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  5388  eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  5389  _lt_compiler_boilerplate=`cat conftest.err`
       
  5390  $rm conftest*
       
  5391  
       
  5392  ac_outfile=conftest.$ac_objext
       
  5393 -printf "$lt_simple_link_test_code" >conftest.$ac_ext
       
  5394 +echo "$lt_simple_link_test_code" >conftest.$ac_ext
       
  5395  eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  5396  _lt_linker_boilerplate=`cat conftest.err`
       
  5397 -$rm conftest*
       
  5398 +$rm -r conftest*
       
  5399  
       
  5400  
       
  5401  # Allow CC to be a program name with arguments.
       
  5402  lt_save_CC=$CC
       
  5403  lt_save_LD=$LD
       
  5404  lt_save_GCC=$GCC
       
  5405  GCC=$GXX
       
  5406  lt_save_with_gnu_ld=$with_gnu_ld
       
  5407 @@ -10865,30 +11291,30 @@ fi
       
  5408  { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
       
  5409  echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
       
  5410  ld_shlibs_CXX=yes
       
  5411  case $host_os in
       
  5412    aix3*)
       
  5413      # FIXME: insert proper C++ library support
       
  5414      ld_shlibs_CXX=no
       
  5415      ;;
       
  5416 -  aix4* | aix5*)
       
  5417 +  aix[4-9]*)
       
  5418      if test "$host_cpu" = ia64; then
       
  5419        # On IA64, the linker does run time linking by default, so we don't
       
  5420        # have to do anything special.
       
  5421        aix_use_runtimelinking=no
       
  5422        exp_sym_flag='-Bexport'
       
  5423        no_entry_flag=""
       
  5424      else
       
  5425        aix_use_runtimelinking=no
       
  5426  
       
  5427        # Test if we are trying to use run time linking or normal
       
  5428        # AIX style linking. If -brtl is somewhere in LDFLAGS, we
       
  5429        # need to do runtime linking.
       
  5430 -      case $host_os in aix4.[23]|aix4.[23].*|aix5*)
       
  5431 +      case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
       
  5432  	for ld_flag in $LDFLAGS; do
       
  5433  	  case $ld_flag in
       
  5434  	  *-brtl*)
       
  5435  	    aix_use_runtimelinking=yes
       
  5436  	    break
       
  5437  	    ;;
       
  5438  	  esac
       
  5439  	done
       
  5440 @@ -10914,17 +11340,17 @@ case $host_os in
       
  5441        case $host_os in aix4.[012]|aix4.[012].*)
       
  5442        # We only want to do this on AIX 4.2 and lower, the check
       
  5443        # below for broken collect2 doesn't work under 4.3+
       
  5444  	collect2name=`${CC} -print-prog-name=collect2`
       
  5445  	if test -f "$collect2name" && \
       
  5446  	   strings "$collect2name" | grep resolve_lib_name >/dev/null
       
  5447  	then
       
  5448  	  # We have reworked collect2
       
  5449 -	  hardcode_direct_CXX=yes
       
  5450 +	  :
       
  5451  	else
       
  5452  	  # We have old collect2
       
  5453  	  hardcode_direct_CXX=unsupported
       
  5454  	  # It fails to find uninstalled libraries when the uninstalled
       
  5455  	  # path is not listed in the libpath.  Setting hardcode_minus_L
       
  5456  	  # to unsupported forces relinking
       
  5457  	  hardcode_minus_L_CXX=yes
       
  5458  	  hardcode_libdir_flag_spec_CXX='-L$libdir'
       
  5459 @@ -10988,21 +11414,28 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
       
  5460    cat conftest.err >&5
       
  5461    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  5462    (exit $ac_status); } && {
       
  5463  	 test -z "$ac_cxx_werror_flag" ||
       
  5464  	 test ! -s conftest.err
       
  5465         } && test -s conftest$ac_exeext &&
       
  5466         $as_test_x conftest$ac_exeext; then
       
  5467  
       
  5468 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  5469 -}'`
       
  5470 +lt_aix_libpath_sed='
       
  5471 +    /Import File Strings/,/^$/ {
       
  5472 +	/^0/ {
       
  5473 +	    s/^0  *\(.*\)$/\1/
       
  5474 +	    p
       
  5475 +	}
       
  5476 +    }'
       
  5477 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  5478  # Check for a 64-bit object if we didn't find anything.
       
  5479 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  5480 -}'`; fi
       
  5481 +if test -z "$aix_libpath"; then
       
  5482 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  5483 +fi
       
  5484  else
       
  5485    echo "$as_me: failed program was:" >&5
       
  5486  sed 's/^/| /' conftest.$ac_ext >&5
       
  5487  
       
  5488  
       
  5489  fi
       
  5490  
       
  5491  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  5492 @@ -11048,21 +11481,28 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
       
  5493    cat conftest.err >&5
       
  5494    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  5495    (exit $ac_status); } && {
       
  5496  	 test -z "$ac_cxx_werror_flag" ||
       
  5497  	 test ! -s conftest.err
       
  5498         } && test -s conftest$ac_exeext &&
       
  5499         $as_test_x conftest$ac_exeext; then
       
  5500  
       
  5501 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  5502 -}'`
       
  5503 +lt_aix_libpath_sed='
       
  5504 +    /Import File Strings/,/^$/ {
       
  5505 +	/^0/ {
       
  5506 +	    s/^0  *\(.*\)$/\1/
       
  5507 +	    p
       
  5508 +	}
       
  5509 +    }'
       
  5510 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  5511  # Check for a 64-bit object if we didn't find anything.
       
  5512 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  5513 -}'`; fi
       
  5514 +if test -z "$aix_libpath"; then
       
  5515 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  5516 +fi
       
  5517  else
       
  5518    echo "$as_me: failed program was:" >&5
       
  5519  sed 's/^/| /' conftest.$ac_ext >&5
       
  5520  
       
  5521  
       
  5522  fi
       
  5523  
       
  5524  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  5525 @@ -11122,69 +11562,41 @@ if test -z "$aix_libpath"; then aix_libp
       
  5526  	cat $export_symbols >> $output_objdir/$soname.def;
       
  5527        fi~
       
  5528        $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  5529      else
       
  5530        ld_shlibs_CXX=no
       
  5531      fi
       
  5532    ;;
       
  5533        darwin* | rhapsody*)
       
  5534 -        case $host_os in
       
  5535 -        rhapsody* | darwin1.[012])
       
  5536 -         allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress'
       
  5537 -         ;;
       
  5538 -       *) # Darwin 1.3 on
       
  5539 -         if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
       
  5540 -           allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
       
  5541 -         else
       
  5542 -           case ${MACOSX_DEPLOYMENT_TARGET} in
       
  5543 -             10.[012])
       
  5544 -               allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
       
  5545 -               ;;
       
  5546 -             10.*)
       
  5547 -               allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup'
       
  5548 -               ;;
       
  5549 -           esac
       
  5550 -         fi
       
  5551 -         ;;
       
  5552 -        esac
       
  5553        archive_cmds_need_lc_CXX=no
       
  5554        hardcode_direct_CXX=no
       
  5555        hardcode_automatic_CXX=yes
       
  5556        hardcode_shlibpath_var_CXX=unsupported
       
  5557        whole_archive_flag_spec_CXX=''
       
  5558        link_all_deplibs_CXX=yes
       
  5559 -
       
  5560 -    if test "$GXX" = yes ; then
       
  5561 -      lt_int_apple_cc_single_mod=no
       
  5562 +      allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
       
  5563 +      if test "$GXX" = yes ; then
       
  5564        output_verbose_link_cmd='echo'
       
  5565 -      if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
       
  5566 -       lt_int_apple_cc_single_mod=yes
       
  5567 -      fi
       
  5568 -      if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
       
  5569 -       archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
       
  5570 -      else
       
  5571 -          archive_cmds_CXX='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
       
  5572 -        fi
       
  5573 -        module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  5574 -        # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  5575 -          if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
       
  5576 -            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  5577 -          else
       
  5578 -            archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  5579 -          fi
       
  5580 -            module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  5581 +      archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
       
  5582 +      module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
       
  5583 +      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
       
  5584 +      module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
       
  5585 +      if test "$lt_cv_apple_cc_single_mod" != "yes"; then
       
  5586 +        archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
       
  5587 +        archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
       
  5588 +      fi
       
  5589        else
       
  5590        case $cc_basename in
       
  5591          xlc*)
       
  5592           output_verbose_link_cmd='echo'
       
  5593 -          archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
       
  5594 +          archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
       
  5595            module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  5596            # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  5597 -          archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  5598 +          archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  5599            module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  5600            ;;
       
  5601         *)
       
  5602           ld_shlibs_CXX=no
       
  5603            ;;
       
  5604        esac
       
  5605        fi
       
  5606          ;;
       
  5607 @@ -11208,17 +11620,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  5608      ;;
       
  5609    freebsd[12]*)
       
  5610      # C++ shared libraries reported to be fairly broken before switch to ELF
       
  5611      ld_shlibs_CXX=no
       
  5612      ;;
       
  5613    freebsd-elf*)
       
  5614      archive_cmds_need_lc_CXX=no
       
  5615      ;;
       
  5616 -  freebsd* | kfreebsd*-gnu | dragonfly*)
       
  5617 +  freebsd* | dragonfly*)
       
  5618      # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
       
  5619      # conventions
       
  5620      ld_shlibs_CXX=yes
       
  5621      ;;
       
  5622    gnu*)
       
  5623      ;;
       
  5624    hpux9*)
       
  5625      hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
       
  5626 @@ -11257,19 +11669,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  5627      esac
       
  5628      ;;
       
  5629    hpux10*|hpux11*)
       
  5630      if test $with_gnu_ld = no; then
       
  5631        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
       
  5632        hardcode_libdir_separator_CXX=:
       
  5633  
       
  5634        case $host_cpu in
       
  5635 -      hppa*64*|ia64*)
       
  5636 -	hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
       
  5637 -        ;;
       
  5638 +      hppa*64*|ia64*) ;;
       
  5639        *)
       
  5640  	export_dynamic_flag_spec_CXX='${wl}-E'
       
  5641          ;;
       
  5642        esac
       
  5643      fi
       
  5644      case $host_cpu in
       
  5645      hppa*64*|ia64*)
       
  5646        hardcode_direct_CXX=no
       
  5647 @@ -11327,17 +11737,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  5648  	  fi
       
  5649  	else
       
  5650  	  # FIXME: insert proper C++ library support
       
  5651  	  ld_shlibs_CXX=no
       
  5652  	fi
       
  5653  	;;
       
  5654      esac
       
  5655      ;;
       
  5656 -  interix3*)
       
  5657 +  interix[3-9]*)
       
  5658      hardcode_direct_CXX=no
       
  5659      hardcode_shlibpath_var_CXX=no
       
  5660      hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
       
  5661      export_dynamic_flag_spec_CXX='${wl}-E'
       
  5662      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       
  5663      # Instead, shared libraries are loaded at an image base (0x10000000 by
       
  5664      # default) and relocated if they conflict, which is a slow very memory
       
  5665      # consuming and fragmenting process.  To avoid this, we pick a random,
       
  5666 @@ -11367,17 +11777,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  5667  	  fi
       
  5668  	fi
       
  5669  	link_all_deplibs_CXX=yes
       
  5670  	;;
       
  5671      esac
       
  5672      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
       
  5673      hardcode_libdir_separator_CXX=:
       
  5674      ;;
       
  5675 -  linux*)
       
  5676 +  linux* | k*bsd*-gnu)
       
  5677      case $cc_basename in
       
  5678        KCC*)
       
  5679  	# Kuck and Associates, Inc. (KAI) C++ Compiler
       
  5680  
       
  5681  	# KCC will only create a shared library if the output file
       
  5682  	# ends with ".so" (or ".sl" for HP-UX), so rename the library
       
  5683  	# to its proper name (with version) after linking.
       
  5684  	archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
       
  5685 @@ -11419,17 +11829,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  5686  	  archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       
  5687  	  ;;
       
  5688  	esac
       
  5689  	archive_cmds_need_lc_CXX=no
       
  5690  	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
       
  5691  	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
       
  5692  	whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
       
  5693  	;;
       
  5694 -      pgCC*)
       
  5695 +      pgCC* | pgcpp*)
       
  5696          # Portland Group C++ compiler
       
  5697  	archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
       
  5698    	archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
       
  5699  
       
  5700  	hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
       
  5701  	export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
       
  5702  	whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  5703          ;;
       
  5704 @@ -11447,16 +11857,39 @@ if test -z "$aix_libpath"; then aix_libp
       
  5705  	# linking a shared library.
       
  5706  	#
       
  5707  	# There doesn't appear to be a way to prevent this compiler from
       
  5708  	# explicitly linking system object files so we need to strip them
       
  5709  	# from the output so that they don't get included in the library
       
  5710  	# dependencies.
       
  5711  	output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
       
  5712  	;;
       
  5713 +      *)
       
  5714 +	case `$CC -V 2>&1 | sed 5q` in
       
  5715 +	*Sun\ C*)
       
  5716 +	  # Sun C++ 5.9
       
  5717 +	  no_undefined_flag_CXX=' -zdefs'
       
  5718 +	  archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
       
  5719 +	  archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
       
  5720 +	  hardcode_libdir_flag_spec_CXX='-R$libdir'
       
  5721 +	  whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  5722 +
       
  5723 +	  # Not sure whether something based on
       
  5724 +	  # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
       
  5725 +	  # would be better.
       
  5726 +	  output_verbose_link_cmd='echo'
       
  5727 +
       
  5728 +	  # Archives containing C++ object files must be created using
       
  5729 +	  # "CC -xar", where "CC" is the Sun C++ compiler.  This is
       
  5730 +	  # necessary to make sure instantiated templates are included
       
  5731 +	  # in the archive.
       
  5732 +	  old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
       
  5733 +	  ;;
       
  5734 +	esac
       
  5735 +	;;
       
  5736      esac
       
  5737      ;;
       
  5738    lynxos*)
       
  5739      # FIXME: insert proper C++ library support
       
  5740      ld_shlibs_CXX=no
       
  5741      ;;
       
  5742    m88k*)
       
  5743      # FIXME: insert proper C++ library support
       
  5744 @@ -11485,26 +11918,30 @@ if test -z "$aix_libpath"; then aix_libp
       
  5745      # Workaround some broken pre-1.5 toolchains
       
  5746      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
       
  5747      ;;
       
  5748    openbsd2*)
       
  5749      # C++ shared libraries are fairly broken
       
  5750      ld_shlibs_CXX=no
       
  5751      ;;
       
  5752    openbsd*)
       
  5753 -    hardcode_direct_CXX=yes
       
  5754 -    hardcode_shlibpath_var_CXX=no
       
  5755 -    archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
       
  5756 -    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
       
  5757 -    if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  5758 -      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
       
  5759 -      export_dynamic_flag_spec_CXX='${wl}-E'
       
  5760 -      whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
       
  5761 -    fi
       
  5762 -    output_verbose_link_cmd='echo'
       
  5763 +    if test -f /usr/libexec/ld.so; then
       
  5764 +      hardcode_direct_CXX=yes
       
  5765 +      hardcode_shlibpath_var_CXX=no
       
  5766 +      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
       
  5767 +      hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
       
  5768 +      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  5769 +	archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
       
  5770 +	export_dynamic_flag_spec_CXX='${wl}-E'
       
  5771 +	whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
       
  5772 +      fi
       
  5773 +      output_verbose_link_cmd='echo'
       
  5774 +    else
       
  5775 +      ld_shlibs_CXX=no
       
  5776 +    fi
       
  5777      ;;
       
  5778    osf3*)
       
  5779      case $cc_basename in
       
  5780        KCC*)
       
  5781  	# Kuck and Associates, Inc. (KAI) C++ Compiler
       
  5782  
       
  5783  	# KCC will only create a shared library if the output file
       
  5784  	# ends with ".so" (or ".sl" for HP-UX), so rename the library
       
  5785 @@ -11656,25 +12093,20 @@ if test -z "$aix_libpath"; then aix_libp
       
  5786  	archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
       
  5787  	$CC -G${allow_undefined_flag}  ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
       
  5788  
       
  5789  	hardcode_libdir_flag_spec_CXX='-R$libdir'
       
  5790  	hardcode_shlibpath_var_CXX=no
       
  5791  	case $host_os in
       
  5792  	  solaris2.[0-5] | solaris2.[0-5].*) ;;
       
  5793  	  *)
       
  5794 -	    # The C++ compiler is used as linker so we must use $wl
       
  5795 -	    # flag to pass the commands to the underlying system
       
  5796 -	    # linker. We must also pass each convience library through
       
  5797 -	    # to the system linker between allextract/defaultextract.
       
  5798 -	    # The C++ compiler will combine linker options so we
       
  5799 -	    # cannot just pass the convience library names through
       
  5800 -	    # without $wl.
       
  5801 +	    # The compiler driver will combine and reorder linker options,
       
  5802 +	    # but understands `-z linker_flag'.
       
  5803  	    # Supported since Solaris 2.6 (maybe 2.5.1?)
       
  5804 -	    whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
       
  5805 +	    whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
       
  5806  	    ;;
       
  5807  	esac
       
  5808  	link_all_deplibs_CXX=yes
       
  5809  
       
  5810  	output_verbose_link_cmd='echo'
       
  5811  
       
  5812  	# Archives containing C++ object files must be created using
       
  5813  	# "CC -xar", where "CC" is the Sun C++ compiler.  This is
       
  5814 @@ -11711,16 +12143,22 @@ if test -z "$aix_libpath"; then aix_libp
       
  5815  
       
  5816  	    # Commands to make compiler produce verbose output that lists
       
  5817  	    # what "hidden" libraries, object files and flags are used when
       
  5818  	    # linking a shared library.
       
  5819  	    output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
       
  5820  	  fi
       
  5821  
       
  5822  	  hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
       
  5823 +	  case $host_os in
       
  5824 +	  solaris2.[0-5] | solaris2.[0-5].*) ;;
       
  5825 +	  *)
       
  5826 +	    whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
       
  5827 +	    ;;
       
  5828 +	  esac
       
  5829  	fi
       
  5830  	;;
       
  5831      esac
       
  5832      ;;
       
  5833    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
       
  5834      no_undefined_flag_CXX='${wl}-z,text'
       
  5835      archive_cmds_need_lc_CXX=no
       
  5836      hardcode_shlibpath_var_CXX=no
       
  5837 @@ -11798,17 +12236,16 @@ if test -z "$aix_libpath"; then aix_libp
       
  5838  esac
       
  5839  { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
       
  5840  echo "${ECHO_T}$ld_shlibs_CXX" >&6; }
       
  5841  test "$ld_shlibs_CXX" = no && can_build_shared=no
       
  5842  
       
  5843  GCC_CXX="$GXX"
       
  5844  LD_CXX="$LD"
       
  5845  
       
  5846 -
       
  5847  cat > conftest.$ac_ext <<EOF
       
  5848  class Foo
       
  5849  {
       
  5850  public:
       
  5851    Foo (void) { a = 0; }
       
  5852  private:
       
  5853    int a;
       
  5854  };
       
  5855 @@ -11900,38 +12337,75 @@ if { (eval echo "$as_me:$LINENO: \"$ac_c
       
  5856    # Clean up.
       
  5857    rm -f a.out a.exe
       
  5858  else
       
  5859    echo "libtool.m4: error: problem compiling CXX test program"
       
  5860  fi
       
  5861  
       
  5862  $rm -f confest.$objext
       
  5863  
       
  5864 +compiler_lib_search_dirs_CXX=
       
  5865 +if test -n "$compiler_lib_search_path_CXX"; then
       
  5866 +  compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
       
  5867 +fi
       
  5868 +
       
  5869  # PORTME: override above test on systems where it is broken
       
  5870  case $host_os in
       
  5871 -interix3*)
       
  5872 +interix[3-9]*)
       
  5873    # Interix 3.5 installs completely hosed .la files for C++, so rather than
       
  5874    # hack all around it, let's just trust "g++" to DTRT.
       
  5875    predep_objects_CXX=
       
  5876    postdep_objects_CXX=
       
  5877    postdeps_CXX=
       
  5878    ;;
       
  5879  
       
  5880 +linux*)
       
  5881 +  case `$CC -V 2>&1 | sed 5q` in
       
  5882 +  *Sun\ C*)
       
  5883 +    # Sun C++ 5.9
       
  5884 +    #
       
  5885 +    # The more standards-conforming stlport4 library is
       
  5886 +    # incompatible with the Cstd library. Avoid specifying
       
  5887 +    # it if it's in CXXFLAGS. Ignore libCrun as
       
  5888 +    # -library=stlport4 depends on it.
       
  5889 +    case " $CXX $CXXFLAGS " in
       
  5890 +    *" -library=stlport4 "*)
       
  5891 +      solaris_use_stlport4=yes
       
  5892 +      ;;
       
  5893 +    esac
       
  5894 +    if test "$solaris_use_stlport4" != yes; then
       
  5895 +      postdeps_CXX='-library=Cstd -library=Crun'
       
  5896 +    fi
       
  5897 +    ;;
       
  5898 +  esac
       
  5899 +  ;;
       
  5900 +
       
  5901  solaris*)
       
  5902    case $cc_basename in
       
  5903    CC*)
       
  5904 +    # The more standards-conforming stlport4 library is
       
  5905 +    # incompatible with the Cstd library. Avoid specifying
       
  5906 +    # it if it's in CXXFLAGS. Ignore libCrun as
       
  5907 +    # -library=stlport4 depends on it.
       
  5908 +    case " $CXX $CXXFLAGS " in
       
  5909 +    *" -library=stlport4 "*)
       
  5910 +      solaris_use_stlport4=yes
       
  5911 +      ;;
       
  5912 +    esac
       
  5913 +
       
  5914      # Adding this requires a known-good setup of shared libraries for
       
  5915      # Sun compiler versions before 5.6, else PIC objects from an old
       
  5916      # archive will be linked into the output, leading to subtle bugs.
       
  5917 -    postdeps_CXX='-lCstd -lCrun'
       
  5918 -    ;;
       
  5919 -  esac
       
  5920 -  ;;
       
  5921 -esac
       
  5922 -
       
  5923 +    if test "$solaris_use_stlport4" != yes; then
       
  5924 +      postdeps_CXX='-library=Cstd -library=Crun'
       
  5925 +    fi
       
  5926 +    ;;
       
  5927 +  esac
       
  5928 +  ;;
       
  5929 +esac
       
  5930  
       
  5931  case " $postdeps_CXX " in
       
  5932  *" -lc "*) archive_cmds_need_lc_CXX=no ;;
       
  5933  esac
       
  5934  
       
  5935  lt_prog_compiler_wl_CXX=
       
  5936  lt_prog_compiler_pic_CXX=
       
  5937  lt_prog_compiler_static_CXX=
       
  5938 @@ -11953,34 +12427,36 @@ echo $ECHO_N "checking for $compiler opt
       
  5939        fi
       
  5940        ;;
       
  5941      amigaos*)
       
  5942        # FIXME: we need at least 68020 code to build shared libraries, but
       
  5943        # adding the `-m68020' flag to GCC prevents building anything better,
       
  5944        # like `-m68040'.
       
  5945        lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
       
  5946        ;;
       
  5947 -    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  5948 +    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  5949        # PIC is the default for these OSes.
       
  5950        ;;
       
  5951 -    mingw* | os2* | pw32*)
       
  5952 +    mingw* | cygwin* | os2* | pw32*)
       
  5953        # This hack is so that the source file can tell whether it is being
       
  5954        # built for inclusion in a dll (and should export symbols for example).
       
  5955 +      # Although the cygwin gcc ignores -fPIC, still need this for old-style
       
  5956 +      # (--disable-auto-import) libraries
       
  5957        lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
       
  5958        ;;
       
  5959      darwin* | rhapsody*)
       
  5960        # PIC is the default on this platform
       
  5961        # Common symbols not allowed in MH_DYLIB files
       
  5962        lt_prog_compiler_pic_CXX='-fno-common'
       
  5963        ;;
       
  5964      *djgpp*)
       
  5965        # DJGPP does not support shared libraries at all
       
  5966        lt_prog_compiler_pic_CXX=
       
  5967        ;;
       
  5968 -    interix3*)
       
  5969 +    interix[3-9]*)
       
  5970        # Interix 3.x gcc -fpic/-fPIC options generate broken code.
       
  5971        # Instead, we relocate shared libraries at runtime.
       
  5972        ;;
       
  5973      sysv4*MP*)
       
  5974        if test -d /usr/nec; then
       
  5975  	lt_prog_compiler_pic_CXX=-Kconform_pic
       
  5976        fi
       
  5977        ;;
       
  5978 @@ -11996,17 +12472,17 @@ echo $ECHO_N "checking for $compiler opt
       
  5979        esac
       
  5980        ;;
       
  5981      *)
       
  5982        lt_prog_compiler_pic_CXX='-fPIC'
       
  5983        ;;
       
  5984      esac
       
  5985    else
       
  5986      case $host_os in
       
  5987 -      aix4* | aix5*)
       
  5988 +      aix[4-9]*)
       
  5989  	# All AIX code is PIC.
       
  5990  	if test "$host_cpu" = ia64; then
       
  5991  	  # AIX 5 now supports IA64 processor
       
  5992  	  lt_prog_compiler_static_CXX='-Bstatic'
       
  5993  	else
       
  5994  	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
       
  5995  	fi
       
  5996  	;;
       
  5997 @@ -12036,17 +12512,17 @@ echo $ECHO_N "checking for $compiler opt
       
  5998  	  ghcx*)
       
  5999  	    # Green Hills C++ Compiler
       
  6000  	    lt_prog_compiler_pic_CXX='-pic'
       
  6001  	    ;;
       
  6002  	  *)
       
  6003  	    ;;
       
  6004  	esac
       
  6005  	;;
       
  6006 -      freebsd* | kfreebsd*-gnu | dragonfly*)
       
  6007 +      freebsd* | dragonfly*)
       
  6008  	# FreeBSD uses GNU C++
       
  6009  	;;
       
  6010        hpux9* | hpux10* | hpux11*)
       
  6011  	case $cc_basename in
       
  6012  	  CC*)
       
  6013  	    lt_prog_compiler_wl_CXX='-Wl,'
       
  6014  	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
       
  6015  	    if test "$host_cpu" != ia64; then
       
  6016 @@ -12079,43 +12555,51 @@ echo $ECHO_N "checking for $compiler opt
       
  6017  	    lt_prog_compiler_wl_CXX='-Wl,'
       
  6018  	    lt_prog_compiler_static_CXX='-non_shared'
       
  6019  	    # CC pic flag -KPIC is the default.
       
  6020  	    ;;
       
  6021  	  *)
       
  6022  	    ;;
       
  6023  	esac
       
  6024  	;;
       
  6025 -      linux*)
       
  6026 +      linux* | k*bsd*-gnu)
       
  6027  	case $cc_basename in
       
  6028  	  KCC*)
       
  6029  	    # KAI C++ Compiler
       
  6030  	    lt_prog_compiler_wl_CXX='--backend -Wl,'
       
  6031  	    lt_prog_compiler_pic_CXX='-fPIC'
       
  6032  	    ;;
       
  6033  	  icpc* | ecpc*)
       
  6034  	    # Intel C++
       
  6035  	    lt_prog_compiler_wl_CXX='-Wl,'
       
  6036  	    lt_prog_compiler_pic_CXX='-KPIC'
       
  6037  	    lt_prog_compiler_static_CXX='-static'
       
  6038  	    ;;
       
  6039 -	  pgCC*)
       
  6040 +	  pgCC* | pgcpp*)
       
  6041  	    # Portland Group C++ compiler.
       
  6042  	    lt_prog_compiler_wl_CXX='-Wl,'
       
  6043  	    lt_prog_compiler_pic_CXX='-fpic'
       
  6044  	    lt_prog_compiler_static_CXX='-Bstatic'
       
  6045  	    ;;
       
  6046  	  cxx*)
       
  6047  	    # Compaq C++
       
  6048  	    # Make sure the PIC flag is empty.  It appears that all Alpha
       
  6049  	    # Linux and Compaq Tru64 Unix objects are PIC.
       
  6050  	    lt_prog_compiler_pic_CXX=
       
  6051  	    lt_prog_compiler_static_CXX='-non_shared'
       
  6052  	    ;;
       
  6053  	  *)
       
  6054 +	    case `$CC -V 2>&1 | sed 5q` in
       
  6055 +	    *Sun\ C*)
       
  6056 +	      # Sun C++ 5.9
       
  6057 +	      lt_prog_compiler_pic_CXX='-KPIC'
       
  6058 +	      lt_prog_compiler_static_CXX='-Bstatic'
       
  6059 +	      lt_prog_compiler_wl_CXX='-Qoption ld '
       
  6060 +	      ;;
       
  6061 +	    esac
       
  6062  	    ;;
       
  6063  	esac
       
  6064  	;;
       
  6065        lynxos*)
       
  6066  	;;
       
  6067        m88k*)
       
  6068  	;;
       
  6069        mvs*)
       
  6070 @@ -12215,53 +12699,53 @@ echo "${ECHO_T}$lt_prog_compiler_pic_CXX
       
  6071  
       
  6072  #
       
  6073  # Check to make sure the PIC flag actually works.
       
  6074  #
       
  6075  if test -n "$lt_prog_compiler_pic_CXX"; then
       
  6076  
       
  6077  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
       
  6078  echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6; }
       
  6079 -if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
       
  6080 -  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6081 -else
       
  6082 -  lt_prog_compiler_pic_works_CXX=no
       
  6083 +if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then
       
  6084 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6085 +else
       
  6086 +  lt_cv_prog_compiler_pic_works_CXX=no
       
  6087    ac_outfile=conftest.$ac_objext
       
  6088 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6089 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6090     lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
       
  6091     # Insert the option either (1) after the last *FLAGS variable, or
       
  6092     # (2) before a word containing "conftest.", or (3) at the end.
       
  6093     # Note that $ac_compile itself does not contain backslashes and begins
       
  6094     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  6095     # The option is referenced via a variable to avoid confusing sed.
       
  6096     lt_compile=`echo "$ac_compile" | $SED \
       
  6097     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  6098     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  6099     -e 's:$: $lt_compiler_flag:'`
       
  6100 -   (eval echo "\"\$as_me:12239: $lt_compile\"" >&5)
       
  6101 +   (eval echo "\"\$as_me:12723: $lt_compile\"" >&5)
       
  6102     (eval "$lt_compile" 2>conftest.err)
       
  6103     ac_status=$?
       
  6104     cat conftest.err >&5
       
  6105 -   echo "$as_me:12243: \$? = $ac_status" >&5
       
  6106 +   echo "$as_me:12727: \$? = $ac_status" >&5
       
  6107     if (exit $ac_status) && test -s "$ac_outfile"; then
       
  6108       # The compiler can only warn and ignore the option if not recognized
       
  6109       # So say no if there are warnings other than the usual output.
       
  6110       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
       
  6111       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  6112       if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       
  6113 -       lt_prog_compiler_pic_works_CXX=yes
       
  6114 +       lt_cv_prog_compiler_pic_works_CXX=yes
       
  6115       fi
       
  6116     fi
       
  6117     $rm conftest*
       
  6118  
       
  6119  fi
       
  6120 -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
       
  6121 -echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6; }
       
  6122 -
       
  6123 -if test x"$lt_prog_compiler_pic_works_CXX" = xyes; then
       
  6124 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
       
  6125 +echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_CXX" >&6; }
       
  6126 +
       
  6127 +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
       
  6128      case $lt_prog_compiler_pic_CXX in
       
  6129       "" | " "*) ;;
       
  6130       *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
       
  6131       esac
       
  6132  else
       
  6133      lt_prog_compiler_pic_CXX=
       
  6134       lt_prog_compiler_can_build_shared_CXX=no
       
  6135  fi
       
  6136 @@ -12278,78 +12762,78 @@ case $host_os in
       
  6137  esac
       
  6138  
       
  6139  #
       
  6140  # Check to make sure the static flag actually works.
       
  6141  #
       
  6142  wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
       
  6143  { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
       
  6144  echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
       
  6145 -if test "${lt_prog_compiler_static_works_CXX+set}" = set; then
       
  6146 -  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6147 -else
       
  6148 -  lt_prog_compiler_static_works_CXX=no
       
  6149 +if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then
       
  6150 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6151 +else
       
  6152 +  lt_cv_prog_compiler_static_works_CXX=no
       
  6153     save_LDFLAGS="$LDFLAGS"
       
  6154     LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
       
  6155 -   printf "$lt_simple_link_test_code" > conftest.$ac_ext
       
  6156 +   echo "$lt_simple_link_test_code" > conftest.$ac_ext
       
  6157     if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
       
  6158       # The linker can only warn and ignore the option if not recognized
       
  6159       # So say no if there are warnings
       
  6160       if test -s conftest.err; then
       
  6161         # Append any errors to the config.log.
       
  6162         cat conftest.err 1>&5
       
  6163         $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
       
  6164         $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  6165         if diff conftest.exp conftest.er2 >/dev/null; then
       
  6166 -         lt_prog_compiler_static_works_CXX=yes
       
  6167 +         lt_cv_prog_compiler_static_works_CXX=yes
       
  6168         fi
       
  6169       else
       
  6170 -       lt_prog_compiler_static_works_CXX=yes
       
  6171 +       lt_cv_prog_compiler_static_works_CXX=yes
       
  6172       fi
       
  6173     fi
       
  6174 -   $rm conftest*
       
  6175 +   $rm -r conftest*
       
  6176     LDFLAGS="$save_LDFLAGS"
       
  6177  
       
  6178  fi
       
  6179 -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5
       
  6180 -echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6; }
       
  6181 -
       
  6182 -if test x"$lt_prog_compiler_static_works_CXX" = xyes; then
       
  6183 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5
       
  6184 +echo "${ECHO_T}$lt_cv_prog_compiler_static_works_CXX" >&6; }
       
  6185 +
       
  6186 +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
       
  6187      :
       
  6188  else
       
  6189      lt_prog_compiler_static_CXX=
       
  6190  fi
       
  6191  
       
  6192  
       
  6193  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
       
  6194  echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
       
  6195  if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
       
  6196    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6197  else
       
  6198    lt_cv_prog_compiler_c_o_CXX=no
       
  6199     $rm -r conftest 2>/dev/null
       
  6200     mkdir conftest
       
  6201     cd conftest
       
  6202     mkdir out
       
  6203 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6204 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6205  
       
  6206     lt_compiler_flag="-o out/conftest2.$ac_objext"
       
  6207     # Insert the option either (1) after the last *FLAGS variable, or
       
  6208     # (2) before a word containing "conftest.", or (3) at the end.
       
  6209     # Note that $ac_compile itself does not contain backslashes and begins
       
  6210     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  6211     lt_compile=`echo "$ac_compile" | $SED \
       
  6212     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  6213     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  6214     -e 's:$: $lt_compiler_flag:'`
       
  6215 -   (eval echo "\"\$as_me:12343: $lt_compile\"" >&5)
       
  6216 +   (eval echo "\"\$as_me:12827: $lt_compile\"" >&5)
       
  6217     (eval "$lt_compile" 2>out/conftest.err)
       
  6218     ac_status=$?
       
  6219     cat out/conftest.err >&5
       
  6220 -   echo "$as_me:12347: \$? = $ac_status" >&5
       
  6221 +   echo "$as_me:12831: \$? = $ac_status" >&5
       
  6222     if (exit $ac_status) && test -s out/conftest2.$ac_objext
       
  6223     then
       
  6224       # The compiler can only warn and ignore the option if not recognized
       
  6225       # So say no if there are warnings
       
  6226       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
       
  6227       $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
       
  6228       if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       
  6229         lt_cv_prog_compiler_c_o_CXX=yes
       
  6230 @@ -12392,35 +12876,36 @@ else
       
  6231    need_locks=no
       
  6232  fi
       
  6233  
       
  6234  { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
       
  6235  echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
       
  6236  
       
  6237    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
       
  6238    case $host_os in
       
  6239 -  aix4* | aix5*)
       
  6240 +  aix[4-9]*)
       
  6241      # If we're using GNU nm, then we don't want the "-C" option.
       
  6242      # -C means demangle to AIX nm, but means don't demangle with GNU nm
       
  6243      if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
       
  6244        export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
       
  6245      else
       
  6246        export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
       
  6247      fi
       
  6248      ;;
       
  6249    pw32*)
       
  6250      export_symbols_cmds_CXX="$ltdll_cmds"
       
  6251    ;;
       
  6252    cygwin* | mingw*)
       
  6253 -    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
       
  6254 +    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
       
  6255    ;;
       
  6256    *)
       
  6257      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
       
  6258    ;;
       
  6259    esac
       
  6260 +  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
       
  6261  
       
  6262  { echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
       
  6263  echo "${ECHO_T}$ld_shlibs_CXX" >&6; }
       
  6264  test "$ld_shlibs_CXX" = no && can_build_shared=no
       
  6265  
       
  6266  #
       
  6267  # Do we need to explicitly link libc?
       
  6268  #
       
  6269 @@ -12436,17 +12921,17 @@ x|xyes)
       
  6270        ;;
       
  6271      '$CC '*)
       
  6272        # Test whether the compiler implicitly links with -lc since on some
       
  6273        # systems, -lgcc has to come before -lc. If gcc already passes -lc
       
  6274        # to ld, don't add -lc before -lgcc.
       
  6275        { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
       
  6276  echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
       
  6277        $rm conftest*
       
  6278 -      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6279 +      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6280  
       
  6281        if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
       
  6282    (eval $ac_compile) 2>&5
       
  6283    ac_status=$?
       
  6284    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  6285    (exit $ac_status); } 2>conftest.err; then
       
  6286          soname=conftest
       
  6287          lib=conftest
       
  6288 @@ -12494,30 +12979,17 @@ postinstall_cmds=
       
  6289  postuninstall_cmds=
       
  6290  finish_cmds=
       
  6291  finish_eval=
       
  6292  shlibpath_var=
       
  6293  shlibpath_overrides_runpath=unknown
       
  6294  version_type=none
       
  6295  dynamic_linker="$host_os ld.so"
       
  6296  sys_lib_dlsearch_path_spec="/lib /usr/lib"
       
  6297 -if test "$GCC" = yes; then
       
  6298 -  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
       
  6299 -  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
       
  6300 -    # if the path contains ";" then we assume it to be the separator
       
  6301 -    # otherwise default to the standard path separator (i.e. ":") - it is
       
  6302 -    # assumed that no part of a normal pathname contains ";" but that should
       
  6303 -    # okay in the real world where ";" in dirpaths is itself problematic.
       
  6304 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       
  6305 -  else
       
  6306 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       
  6307 -  fi
       
  6308 -else
       
  6309 -  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
       
  6310 -fi
       
  6311 +
       
  6312  need_lib_prefix=unknown
       
  6313  hardcode_into_libs=no
       
  6314  
       
  6315  # when you set need_version to no, make sure it does not cause -set_version
       
  6316  # flags to be left without arguments
       
  6317  need_version=unknown
       
  6318  
       
  6319  case $host_os in
       
  6320 @@ -12525,17 +12997,17 @@ aix3*)
       
  6321    version_type=linux
       
  6322    library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
       
  6323    shlibpath_var=LIBPATH
       
  6324  
       
  6325    # AIX 3 has no versioning support, so we append a major version to the name.
       
  6326    soname_spec='${libname}${release}${shared_ext}$major'
       
  6327    ;;
       
  6328  
       
  6329 -aix4* | aix5*)
       
  6330 +aix[4-9]*)
       
  6331    version_type=linux
       
  6332    need_lib_prefix=no
       
  6333    need_version=no
       
  6334    hardcode_into_libs=yes
       
  6335    if test "$host_cpu" = ia64; then
       
  6336      # AIX 5 supports IA64
       
  6337      library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
       
  6338      shlibpath_var=LD_LIBRARY_PATH
       
  6339 @@ -12664,50 +13136,33 @@ darwin* | rhapsody*)
       
  6340    version_type=darwin
       
  6341    need_lib_prefix=no
       
  6342    need_version=no
       
  6343    library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
       
  6344    soname_spec='${libname}${release}${major}$shared_ext'
       
  6345    shlibpath_overrides_runpath=yes
       
  6346    shlibpath_var=DYLD_LIBRARY_PATH
       
  6347    shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
       
  6348 -  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
       
  6349 -  if test "$GCC" = yes; then
       
  6350 -    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
       
  6351 -  else
       
  6352 -    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
       
  6353 -  fi
       
  6354 +
       
  6355    sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
       
  6356    ;;
       
  6357  
       
  6358  dgux*)
       
  6359    version_type=linux
       
  6360    need_lib_prefix=no
       
  6361    need_version=no
       
  6362    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
       
  6363    soname_spec='${libname}${release}${shared_ext}$major'
       
  6364    shlibpath_var=LD_LIBRARY_PATH
       
  6365    ;;
       
  6366  
       
  6367  freebsd1*)
       
  6368    dynamic_linker=no
       
  6369    ;;
       
  6370  
       
  6371 -kfreebsd*-gnu)
       
  6372 -  version_type=linux
       
  6373 -  need_lib_prefix=no
       
  6374 -  need_version=no
       
  6375 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  6376 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  6377 -  shlibpath_var=LD_LIBRARY_PATH
       
  6378 -  shlibpath_overrides_runpath=no
       
  6379 -  hardcode_into_libs=yes
       
  6380 -  dynamic_linker='GNU ld.so'
       
  6381 -  ;;
       
  6382 -
       
  6383  freebsd* | dragonfly*)
       
  6384    # DragonFly does not have aout.  When/if they implement a new
       
  6385    # versioning mechanism, adjust this.
       
  6386    if test -x /usr/bin/objformat; then
       
  6387      objformat=`/usr/bin/objformat`
       
  6388    else
       
  6389      case $host_os in
       
  6390      freebsd[123]*) objformat=aout ;;
       
  6391 @@ -12735,17 +13190,17 @@ freebsd* | dragonfly*)
       
  6392      shlibpath_overrides_runpath=yes
       
  6393      hardcode_into_libs=yes
       
  6394      ;;
       
  6395    freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
       
  6396    freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
       
  6397      shlibpath_overrides_runpath=no
       
  6398      hardcode_into_libs=yes
       
  6399      ;;
       
  6400 -  freebsd*) # from 4.6 on
       
  6401 +  *) # from 4.6 on, and DragonFly
       
  6402      shlibpath_overrides_runpath=yes
       
  6403      hardcode_into_libs=yes
       
  6404      ;;
       
  6405    esac
       
  6406    ;;
       
  6407  
       
  6408  gnu*)
       
  6409    version_type=linux
       
  6410 @@ -12798,17 +13253,17 @@ hpux9* | hpux10* | hpux11*)
       
  6411      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  6412      soname_spec='${libname}${release}${shared_ext}$major'
       
  6413      ;;
       
  6414    esac
       
  6415    # HP-UX runs *really* slowly unless shared libraries are mode 555.
       
  6416    postinstall_cmds='chmod 555 $lib'
       
  6417    ;;
       
  6418  
       
  6419 -interix3*)
       
  6420 +interix[3-9]*)
       
  6421    version_type=linux
       
  6422    need_lib_prefix=no
       
  6423    need_version=no
       
  6424    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  6425    soname_spec='${libname}${release}${shared_ext}$major'
       
  6426    dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
       
  6427    shlibpath_var=LD_LIBRARY_PATH
       
  6428    shlibpath_overrides_runpath=no
       
  6429 @@ -12853,57 +13308,45 @@ irix5* | irix6* | nonstopux*)
       
  6430    ;;
       
  6431  
       
  6432  # No shared lib support for Linux oldld, aout, or coff.
       
  6433  linux*oldld* | linux*aout* | linux*coff*)
       
  6434    dynamic_linker=no
       
  6435    ;;
       
  6436  
       
  6437  # This must be Linux ELF.
       
  6438 -linux*)
       
  6439 +linux* | k*bsd*-gnu)
       
  6440    version_type=linux
       
  6441    need_lib_prefix=no
       
  6442    need_version=no
       
  6443    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  6444    soname_spec='${libname}${release}${shared_ext}$major'
       
  6445    finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
       
  6446    shlibpath_var=LD_LIBRARY_PATH
       
  6447    shlibpath_overrides_runpath=no
       
  6448    # This implies no fast_install, which is unacceptable.
       
  6449    # Some rework will be needed to allow for fast_install
       
  6450    # before this can be enabled.
       
  6451    hardcode_into_libs=yes
       
  6452  
       
  6453    # Append ld.so.conf contents to the search path
       
  6454    if test -f /etc/ld.so.conf; then
       
  6455 -    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  6456 +    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  6457      sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
       
  6458    fi
       
  6459  
       
  6460    # We used to test for /lib/ld.so.1 and disable shared libraries on
       
  6461    # powerpc, because MkLinux only supported shared libraries with the
       
  6462    # GNU dynamic linker.  Since this was broken with cross compilers,
       
  6463    # most powerpc-linux boxes support dynamic linking these days and
       
  6464    # people can always --disable-shared, the test was removed, and we
       
  6465    # assume the GNU/Linux dynamic linker is in use.
       
  6466    dynamic_linker='GNU/Linux ld.so'
       
  6467    ;;
       
  6468  
       
  6469 -knetbsd*-gnu)
       
  6470 -  version_type=linux
       
  6471 -  need_lib_prefix=no
       
  6472 -  need_version=no
       
  6473 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  6474 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  6475 -  shlibpath_var=LD_LIBRARY_PATH
       
  6476 -  shlibpath_overrides_runpath=no
       
  6477 -  hardcode_into_libs=yes
       
  6478 -  dynamic_linker='GNU ld.so'
       
  6479 -  ;;
       
  6480 -
       
  6481  netbsd*)
       
  6482    version_type=sunos
       
  6483    need_lib_prefix=no
       
  6484    need_version=no
       
  6485    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  6486      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
       
  6487      finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
       
  6488      dynamic_linker='NetBSD (a.out) ld.so'
       
  6489 @@ -12975,16 +13418,20 @@ osf3* | osf4* | osf5*)
       
  6490    need_version=no
       
  6491    soname_spec='${libname}${release}${shared_ext}$major'
       
  6492    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  6493    shlibpath_var=LD_LIBRARY_PATH
       
  6494    sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
       
  6495    sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
       
  6496    ;;
       
  6497  
       
  6498 +rdos*)
       
  6499 +  dynamic_linker=no
       
  6500 +  ;;
       
  6501 +
       
  6502  solaris*)
       
  6503    version_type=linux
       
  6504    need_lib_prefix=no
       
  6505    need_version=no
       
  6506    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  6507    soname_spec='${libname}${release}${shared_ext}$major'
       
  6508    shlibpath_var=LD_LIBRARY_PATH
       
  6509    shlibpath_overrides_runpath=yes
       
  6510 @@ -13071,16 +13518,31 @@ uts4*)
       
  6511  *)
       
  6512    dynamic_linker=no
       
  6513    ;;
       
  6514  esac
       
  6515  { echo "$as_me:$LINENO: result: $dynamic_linker" >&5
       
  6516  echo "${ECHO_T}$dynamic_linker" >&6; }
       
  6517  test "$dynamic_linker" = no && can_build_shared=no
       
  6518  
       
  6519 +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
       
  6520 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6521 +else
       
  6522 +  lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
       
  6523 +fi
       
  6524 +
       
  6525 +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
       
  6526 +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
       
  6527 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6528 +else
       
  6529 +  lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
       
  6530 +fi
       
  6531 +
       
  6532 +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
       
  6533 +
       
  6534  variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
       
  6535  if test "$GCC" = yes; then
       
  6536    variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
       
  6537  fi
       
  6538  
       
  6539  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
       
  6540  echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
       
  6541  hardcode_action_CXX=
       
  6542 @@ -13154,31 +13616,33 @@ if test -f "$ltmain"; then
       
  6543      enable_shared_with_static_runtimes_CXX \
       
  6544      old_archive_cmds_CXX \
       
  6545      old_archive_from_new_cmds_CXX \
       
  6546      predep_objects_CXX \
       
  6547      postdep_objects_CXX \
       
  6548      predeps_CXX \
       
  6549      postdeps_CXX \
       
  6550      compiler_lib_search_path_CXX \
       
  6551 +    compiler_lib_search_dirs_CXX \
       
  6552      archive_cmds_CXX \
       
  6553      archive_expsym_cmds_CXX \
       
  6554      postinstall_cmds_CXX \
       
  6555      postuninstall_cmds_CXX \
       
  6556      old_archive_from_expsyms_cmds_CXX \
       
  6557      allow_undefined_flag_CXX \
       
  6558      no_undefined_flag_CXX \
       
  6559      export_symbols_cmds_CXX \
       
  6560      hardcode_libdir_flag_spec_CXX \
       
  6561      hardcode_libdir_flag_spec_ld_CXX \
       
  6562      hardcode_libdir_separator_CXX \
       
  6563      hardcode_automatic_CXX \
       
  6564      module_cmds_CXX \
       
  6565      module_expsym_cmds_CXX \
       
  6566      lt_cv_prog_compiler_c_o_CXX \
       
  6567 +    fix_srcfile_path_CXX \
       
  6568      exclude_expsyms_CXX \
       
  6569      include_expsyms_CXX; do
       
  6570  
       
  6571      case $var in
       
  6572      old_archive_cmds_CXX | \
       
  6573      old_archive_from_new_cmds_CXX | \
       
  6574      archive_cmds_CXX | \
       
  6575      archive_expsym_cmds_CXX | \
       
  6576 @@ -13401,16 +13865,20 @@ postdep_objects=$lt_postdep_objects_CXX
       
  6577  # Dependencies to place before the objects being linked to create a
       
  6578  # shared library.
       
  6579  predeps=$lt_predeps_CXX
       
  6580  
       
  6581  # Dependencies to place after the objects being linked to create a
       
  6582  # shared library.
       
  6583  postdeps=$lt_postdeps_CXX
       
  6584  
       
  6585 +# The directories searched by this compiler when creating a shared
       
  6586 +# library
       
  6587 +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
       
  6588 +
       
  6589  # The library search path used internally by the compiler when linking
       
  6590  # a shared library.
       
  6591  compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
       
  6592  
       
  6593  # Method to check whether dependent libraries are shared objects.
       
  6594  deplibs_check_method=$lt_deplibs_check_method
       
  6595  
       
  6596  # Command to use when deplibs_check_method == file_magic.
       
  6597 @@ -13489,17 +13957,17 @@ link_all_deplibs=$link_all_deplibs_CXX
       
  6598  
       
  6599  # Compile-time system search path for libraries
       
  6600  sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
       
  6601  
       
  6602  # Run-time system search path for libraries
       
  6603  sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
       
  6604  
       
  6605  # Fix the shell variable \$srcfile for the compiler.
       
  6606 -fix_srcfile_path="$fix_srcfile_path_CXX"
       
  6607 +fix_srcfile_path=$lt_fix_srcfile_path
       
  6608  
       
  6609  # Set to yes if exported symbols are required.
       
  6610  always_export_symbols=$always_export_symbols_CXX
       
  6611  
       
  6612  # The commands to list exported symbols.
       
  6613  export_symbols_cmds=$lt_export_symbols_cmds_CXX
       
  6614  
       
  6615  # The commands to extract the exported symbol list from a shared archive.
       
  6616 @@ -13580,45 +14048,52 @@ enable_shared_with_static_runtimes_F77=n
       
  6617  # Source file extension for f77 test sources.
       
  6618  ac_ext=f
       
  6619  
       
  6620  # Object file extension for compiled f77 test sources.
       
  6621  objext=o
       
  6622  objext_F77=$objext
       
  6623  
       
  6624  # Code to be used in simple compile tests
       
  6625 -lt_simple_compile_test_code="      subroutine t\n      return\n      end\n"
       
  6626 +lt_simple_compile_test_code="\
       
  6627 +      subroutine t
       
  6628 +      return
       
  6629 +      end
       
  6630 +"
       
  6631  
       
  6632  # Code to be used in simple link tests
       
  6633 -lt_simple_link_test_code="      program t\n      end\n"
       
  6634 +lt_simple_link_test_code="\
       
  6635 +      program t
       
  6636 +      end
       
  6637 +"
       
  6638  
       
  6639  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
       
  6640  
       
  6641  # If no C compiler was specified, use CC.
       
  6642  LTCC=${LTCC-"$CC"}
       
  6643  
       
  6644  # If no C compiler flags were specified, use CFLAGS.
       
  6645  LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
       
  6646  
       
  6647  # Allow CC to be a program name with arguments.
       
  6648  compiler=$CC
       
  6649  
       
  6650  
       
  6651  # save warnings/boilerplate of simple test code
       
  6652  ac_outfile=conftest.$ac_objext
       
  6653 -printf "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  6654 +echo "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  6655  eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  6656  _lt_compiler_boilerplate=`cat conftest.err`
       
  6657  $rm conftest*
       
  6658  
       
  6659  ac_outfile=conftest.$ac_objext
       
  6660 -printf "$lt_simple_link_test_code" >conftest.$ac_ext
       
  6661 +echo "$lt_simple_link_test_code" >conftest.$ac_ext
       
  6662  eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  6663  _lt_linker_boilerplate=`cat conftest.err`
       
  6664 -$rm conftest*
       
  6665 +$rm -r conftest*
       
  6666  
       
  6667  
       
  6668  # Allow CC to be a program name with arguments.
       
  6669  lt_save_CC="$CC"
       
  6670  CC=${F77-"f77"}
       
  6671  compiler=$CC
       
  6672  compiler_F77=$CC
       
  6673  for cc_temp in $compiler""; do
       
  6674 @@ -13646,17 +14121,17 @@ test "$can_build_shared" = "no" && enabl
       
  6675  case $host_os in
       
  6676  aix3*)
       
  6677    test "$enable_shared" = yes && enable_static=no
       
  6678    if test -n "$RANLIB"; then
       
  6679      archive_cmds="$archive_cmds~\$RANLIB \$lib"
       
  6680      postinstall_cmds='$RANLIB $lib'
       
  6681    fi
       
  6682    ;;
       
  6683 -aix4* | aix5*)
       
  6684 +aix[4-9]*)
       
  6685    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
       
  6686      test "$enable_shared" = yes && enable_static=no
       
  6687    fi
       
  6688    ;;
       
  6689  esac
       
  6690  { echo "$as_me:$LINENO: result: $enable_shared" >&5
       
  6691  echo "${ECHO_T}$enable_shared" >&6; }
       
  6692  
       
  6693 @@ -13692,33 +14167,35 @@ echo $ECHO_N "checking for $compiler opt
       
  6694  
       
  6695      amigaos*)
       
  6696        # FIXME: we need at least 68020 code to build shared libraries, but
       
  6697        # adding the `-m68020' flag to GCC prevents building anything better,
       
  6698        # like `-m68040'.
       
  6699        lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4'
       
  6700        ;;
       
  6701  
       
  6702 -    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  6703 +    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  6704        # PIC is the default for these OSes.
       
  6705        ;;
       
  6706  
       
  6707 -    mingw* | pw32* | os2*)
       
  6708 +    mingw* | cygwin* | pw32* | os2*)
       
  6709        # This hack is so that the source file can tell whether it is being
       
  6710        # built for inclusion in a dll (and should export symbols for example).
       
  6711 +      # Although the cygwin gcc ignores -fPIC, still need this for old-style
       
  6712 +      # (--disable-auto-import) libraries
       
  6713        lt_prog_compiler_pic_F77='-DDLL_EXPORT'
       
  6714        ;;
       
  6715  
       
  6716      darwin* | rhapsody*)
       
  6717        # PIC is the default on this platform
       
  6718        # Common symbols not allowed in MH_DYLIB files
       
  6719        lt_prog_compiler_pic_F77='-fno-common'
       
  6720        ;;
       
  6721  
       
  6722 -    interix3*)
       
  6723 +    interix[3-9]*)
       
  6724        # Interix 3.x gcc -fpic/-fPIC options generate broken code.
       
  6725        # Instead, we relocate shared libraries at runtime.
       
  6726        ;;
       
  6727  
       
  6728      msdosdjgpp*)
       
  6729        # Just because we use GCC doesn't mean we suddenly get shared libraries
       
  6730        # on systems that don't support them.
       
  6731        lt_prog_compiler_can_build_shared_F77=no
       
  6732 @@ -13766,17 +14243,17 @@ echo $ECHO_N "checking for $compiler opt
       
  6733         case $cc_basename in
       
  6734           xlc*)
       
  6735           lt_prog_compiler_pic_F77='-qnocommon'
       
  6736           lt_prog_compiler_wl_F77='-Wl,'
       
  6737           ;;
       
  6738         esac
       
  6739         ;;
       
  6740  
       
  6741 -    mingw* | pw32* | os2*)
       
  6742 +    mingw* | cygwin* | pw32* | os2*)
       
  6743        # This hack is so that the source file can tell whether it is being
       
  6744        # built for inclusion in a dll (and should export symbols for example).
       
  6745        lt_prog_compiler_pic_F77='-DDLL_EXPORT'
       
  6746        ;;
       
  6747  
       
  6748      hpux9* | hpux10* | hpux11*)
       
  6749        lt_prog_compiler_wl_F77='-Wl,'
       
  6750        # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
       
  6751 @@ -13799,17 +14276,17 @@ echo $ECHO_N "checking for $compiler opt
       
  6752        lt_prog_compiler_static_F77='-non_shared'
       
  6753        ;;
       
  6754  
       
  6755      newsos6)
       
  6756        lt_prog_compiler_pic_F77='-KPIC'
       
  6757        lt_prog_compiler_static_F77='-Bstatic'
       
  6758        ;;
       
  6759  
       
  6760 -    linux*)
       
  6761 +    linux* | k*bsd*-gnu)
       
  6762        case $cc_basename in
       
  6763        icc* | ecc*)
       
  6764  	lt_prog_compiler_wl_F77='-Wl,'
       
  6765  	lt_prog_compiler_pic_F77='-KPIC'
       
  6766  	lt_prog_compiler_static_F77='-static'
       
  6767          ;;
       
  6768        pgcc* | pgf77* | pgf90* | pgf95*)
       
  6769          # Portland Group compilers (*not* the Pentium gcc compiler,
       
  6770 @@ -13818,25 +14295,45 @@ echo $ECHO_N "checking for $compiler opt
       
  6771  	lt_prog_compiler_pic_F77='-fpic'
       
  6772  	lt_prog_compiler_static_F77='-Bstatic'
       
  6773          ;;
       
  6774        ccc*)
       
  6775          lt_prog_compiler_wl_F77='-Wl,'
       
  6776          # All Alpha code is PIC.
       
  6777          lt_prog_compiler_static_F77='-non_shared'
       
  6778          ;;
       
  6779 +      *)
       
  6780 +        case `$CC -V 2>&1 | sed 5q` in
       
  6781 +	*Sun\ C*)
       
  6782 +	  # Sun C 5.9
       
  6783 +	  lt_prog_compiler_pic_F77='-KPIC'
       
  6784 +	  lt_prog_compiler_static_F77='-Bstatic'
       
  6785 +	  lt_prog_compiler_wl_F77='-Wl,'
       
  6786 +	  ;;
       
  6787 +	*Sun\ F*)
       
  6788 +	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
       
  6789 +	  lt_prog_compiler_pic_F77='-KPIC'
       
  6790 +	  lt_prog_compiler_static_F77='-Bstatic'
       
  6791 +	  lt_prog_compiler_wl_F77=''
       
  6792 +	  ;;
       
  6793 +	esac
       
  6794 +	;;
       
  6795        esac
       
  6796        ;;
       
  6797  
       
  6798      osf3* | osf4* | osf5*)
       
  6799        lt_prog_compiler_wl_F77='-Wl,'
       
  6800        # All OSF/1 code is PIC.
       
  6801        lt_prog_compiler_static_F77='-non_shared'
       
  6802        ;;
       
  6803  
       
  6804 +    rdos*)
       
  6805 +      lt_prog_compiler_static_F77='-non_shared'
       
  6806 +      ;;
       
  6807 +
       
  6808      solaris*)
       
  6809        lt_prog_compiler_pic_F77='-KPIC'
       
  6810        lt_prog_compiler_static_F77='-Bstatic'
       
  6811        case $cc_basename in
       
  6812        f77* | f90* | f95*)
       
  6813  	lt_prog_compiler_wl_F77='-Qoption ld ';;
       
  6814        *)
       
  6815  	lt_prog_compiler_wl_F77='-Wl,';;
       
  6816 @@ -13889,53 +14386,53 @@ echo "${ECHO_T}$lt_prog_compiler_pic_F77
       
  6817  
       
  6818  #
       
  6819  # Check to make sure the PIC flag actually works.
       
  6820  #
       
  6821  if test -n "$lt_prog_compiler_pic_F77"; then
       
  6822  
       
  6823  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
       
  6824  echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6; }
       
  6825 -if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
       
  6826 -  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6827 -else
       
  6828 -  lt_prog_compiler_pic_works_F77=no
       
  6829 +if test "${lt_cv_prog_compiler_pic_works_F77+set}" = set; then
       
  6830 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6831 +else
       
  6832 +  lt_cv_prog_compiler_pic_works_F77=no
       
  6833    ac_outfile=conftest.$ac_objext
       
  6834 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6835 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6836     lt_compiler_flag="$lt_prog_compiler_pic_F77"
       
  6837     # Insert the option either (1) after the last *FLAGS variable, or
       
  6838     # (2) before a word containing "conftest.", or (3) at the end.
       
  6839     # Note that $ac_compile itself does not contain backslashes and begins
       
  6840     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  6841     # The option is referenced via a variable to avoid confusing sed.
       
  6842     lt_compile=`echo "$ac_compile" | $SED \
       
  6843     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  6844     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  6845     -e 's:$: $lt_compiler_flag:'`
       
  6846 -   (eval echo "\"\$as_me:13913: $lt_compile\"" >&5)
       
  6847 +   (eval echo "\"\$as_me:14410: $lt_compile\"" >&5)
       
  6848     (eval "$lt_compile" 2>conftest.err)
       
  6849     ac_status=$?
       
  6850     cat conftest.err >&5
       
  6851 -   echo "$as_me:13917: \$? = $ac_status" >&5
       
  6852 +   echo "$as_me:14414: \$? = $ac_status" >&5
       
  6853     if (exit $ac_status) && test -s "$ac_outfile"; then
       
  6854       # The compiler can only warn and ignore the option if not recognized
       
  6855       # So say no if there are warnings other than the usual output.
       
  6856       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
       
  6857       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  6858       if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       
  6859 -       lt_prog_compiler_pic_works_F77=yes
       
  6860 +       lt_cv_prog_compiler_pic_works_F77=yes
       
  6861       fi
       
  6862     fi
       
  6863     $rm conftest*
       
  6864  
       
  6865  fi
       
  6866 -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
       
  6867 -echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6; }
       
  6868 -
       
  6869 -if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
       
  6870 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_F77" >&5
       
  6871 +echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_F77" >&6; }
       
  6872 +
       
  6873 +if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then
       
  6874      case $lt_prog_compiler_pic_F77 in
       
  6875       "" | " "*) ;;
       
  6876       *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
       
  6877       esac
       
  6878  else
       
  6879      lt_prog_compiler_pic_F77=
       
  6880       lt_prog_compiler_can_build_shared_F77=no
       
  6881  fi
       
  6882 @@ -13952,78 +14449,78 @@ case $host_os in
       
  6883  esac
       
  6884  
       
  6885  #
       
  6886  # Check to make sure the static flag actually works.
       
  6887  #
       
  6888  wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
       
  6889  { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
       
  6890  echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
       
  6891 -if test "${lt_prog_compiler_static_works_F77+set}" = set; then
       
  6892 -  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6893 -else
       
  6894 -  lt_prog_compiler_static_works_F77=no
       
  6895 +if test "${lt_cv_prog_compiler_static_works_F77+set}" = set; then
       
  6896 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6897 +else
       
  6898 +  lt_cv_prog_compiler_static_works_F77=no
       
  6899     save_LDFLAGS="$LDFLAGS"
       
  6900     LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
       
  6901 -   printf "$lt_simple_link_test_code" > conftest.$ac_ext
       
  6902 +   echo "$lt_simple_link_test_code" > conftest.$ac_ext
       
  6903     if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
       
  6904       # The linker can only warn and ignore the option if not recognized
       
  6905       # So say no if there are warnings
       
  6906       if test -s conftest.err; then
       
  6907         # Append any errors to the config.log.
       
  6908         cat conftest.err 1>&5
       
  6909         $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
       
  6910         $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  6911         if diff conftest.exp conftest.er2 >/dev/null; then
       
  6912 -         lt_prog_compiler_static_works_F77=yes
       
  6913 +         lt_cv_prog_compiler_static_works_F77=yes
       
  6914         fi
       
  6915       else
       
  6916 -       lt_prog_compiler_static_works_F77=yes
       
  6917 +       lt_cv_prog_compiler_static_works_F77=yes
       
  6918       fi
       
  6919     fi
       
  6920 -   $rm conftest*
       
  6921 +   $rm -r conftest*
       
  6922     LDFLAGS="$save_LDFLAGS"
       
  6923  
       
  6924  fi
       
  6925 -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5
       
  6926 -echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6; }
       
  6927 -
       
  6928 -if test x"$lt_prog_compiler_static_works_F77" = xyes; then
       
  6929 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_F77" >&5
       
  6930 +echo "${ECHO_T}$lt_cv_prog_compiler_static_works_F77" >&6; }
       
  6931 +
       
  6932 +if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then
       
  6933      :
       
  6934  else
       
  6935      lt_prog_compiler_static_F77=
       
  6936  fi
       
  6937  
       
  6938  
       
  6939  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
       
  6940  echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
       
  6941  if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
       
  6942    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  6943  else
       
  6944    lt_cv_prog_compiler_c_o_F77=no
       
  6945     $rm -r conftest 2>/dev/null
       
  6946     mkdir conftest
       
  6947     cd conftest
       
  6948     mkdir out
       
  6949 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6950 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  6951  
       
  6952     lt_compiler_flag="-o out/conftest2.$ac_objext"
       
  6953     # Insert the option either (1) after the last *FLAGS variable, or
       
  6954     # (2) before a word containing "conftest.", or (3) at the end.
       
  6955     # Note that $ac_compile itself does not contain backslashes and begins
       
  6956     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  6957     lt_compile=`echo "$ac_compile" | $SED \
       
  6958     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  6959     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  6960     -e 's:$: $lt_compiler_flag:'`
       
  6961 -   (eval echo "\"\$as_me:14017: $lt_compile\"" >&5)
       
  6962 +   (eval echo "\"\$as_me:14514: $lt_compile\"" >&5)
       
  6963     (eval "$lt_compile" 2>out/conftest.err)
       
  6964     ac_status=$?
       
  6965     cat out/conftest.err >&5
       
  6966 -   echo "$as_me:14021: \$? = $ac_status" >&5
       
  6967 +   echo "$as_me:14518: \$? = $ac_status" >&5
       
  6968     if (exit $ac_status) && test -s out/conftest2.$ac_objext
       
  6969     then
       
  6970       # The compiler can only warn and ignore the option if not recognized
       
  6971       # So say no if there are warnings
       
  6972       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
       
  6973       $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
       
  6974       if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       
  6975         lt_cv_prog_compiler_c_o_F77=yes
       
  6976 @@ -14093,22 +14590,23 @@ echo $ECHO_N "checking whether the $comp
       
  6977    export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
       
  6978    # include_expsyms should be a list of space-separated symbols to be *always*
       
  6979    # included in the symbol list
       
  6980    include_expsyms_F77=
       
  6981    # exclude_expsyms can be an extended regexp of symbols to exclude
       
  6982    # it will be wrapped by ` (' and `)$', so one must not match beginning or
       
  6983    # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
       
  6984    # as well as any symbol that contains `d'.
       
  6985 -  exclude_expsyms_F77="_GLOBAL_OFFSET_TABLE_"
       
  6986 +  exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
       
  6987    # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
       
  6988    # platforms (ab)use it in PIC code, but their linkers get confused if
       
  6989    # the symbol is explicitly referenced.  Since portable code cannot
       
  6990    # rely on this symbol name, it's probably fine to never include it in
       
  6991    # preloaded symbol tables.
       
  6992 +  # Exclude shared library initialization/finalization symbols.
       
  6993    extract_expsyms_cmds=
       
  6994    # Just being paranoid about ensuring that cc_basename is set.
       
  6995    for cc_temp in $compiler""; do
       
  6996    case $cc_temp in
       
  6997      compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
       
  6998      distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
       
  6999      \-*) ;;
       
  7000      *) break;;
       
  7001 @@ -14157,17 +14655,17 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -
       
  7002        *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
       
  7003        *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
       
  7004        *\ 2.11.*) ;; # other 2.11 versions
       
  7005        *) supports_anon_versioning=yes ;;
       
  7006      esac
       
  7007  
       
  7008      # See if GNU ld supports shared libraries.
       
  7009      case $host_os in
       
  7010 -    aix3* | aix4* | aix5*)
       
  7011 +    aix[3-9]*)
       
  7012        # On AIX/PPC, the GNU linker is very broken
       
  7013        if test "$host_cpu" != ia64; then
       
  7014  	ld_shlibs_F77=no
       
  7015  	cat <<EOF 1>&2
       
  7016  
       
  7017  *** Warning: the GNU linker, at least up to release 2.9.1, is reported
       
  7018  *** to be unable to reliably create shared libraries on AIX.
       
  7019  *** Therefore, libtool is disabling shared libraries support.  If you
       
  7020 @@ -14205,17 +14703,17 @@ EOF
       
  7021  
       
  7022      cygwin* | mingw* | pw32*)
       
  7023        # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
       
  7024        # as there is no search path for DLLs.
       
  7025        hardcode_libdir_flag_spec_F77='-L$libdir'
       
  7026        allow_undefined_flag_F77=unsupported
       
  7027        always_export_symbols_F77=no
       
  7028        enable_shared_with_static_runtimes_F77=yes
       
  7029 -      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
       
  7030 +      export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
       
  7031  
       
  7032        if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
       
  7033          archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  7034  	# If the export-symbols file already is a .def file (1st line
       
  7035  	# is EXPORTS), use it as is; otherwise, prepend...
       
  7036  	archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
       
  7037  	  cp $export_symbols $output_objdir/$soname.def;
       
  7038  	else
       
  7039 @@ -14223,32 +14721,32 @@ EOF
       
  7040  	  cat $export_symbols >> $output_objdir/$soname.def;
       
  7041  	fi~
       
  7042  	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  7043        else
       
  7044  	ld_shlibs_F77=no
       
  7045        fi
       
  7046        ;;
       
  7047  
       
  7048 -    interix3*)
       
  7049 +    interix[3-9]*)
       
  7050        hardcode_direct_F77=no
       
  7051        hardcode_shlibpath_var_F77=no
       
  7052        hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
       
  7053        export_dynamic_flag_spec_F77='${wl}-E'
       
  7054        # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       
  7055        # Instead, shared libraries are loaded at an image base (0x10000000 by
       
  7056        # default) and relocated if they conflict, which is a slow very memory
       
  7057        # consuming and fragmenting process.  To avoid this, we pick a random,
       
  7058        # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       
  7059        # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
       
  7060        archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       
  7061        archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       
  7062        ;;
       
  7063  
       
  7064 -    linux*)
       
  7065 +    gnu* | linux* | k*bsd*-gnu)
       
  7066        if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
       
  7067  	tmp_addflag=
       
  7068  	case $cc_basename,$host_cpu in
       
  7069  	pgcc*)				# Portland Group C compiler
       
  7070  	  whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  7071  	  tmp_addflag=' $pic_flag'
       
  7072  	  ;;
       
  7073  	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
       
  7074 @@ -14256,23 +14754,32 @@ EOF
       
  7075  	  tmp_addflag=' $pic_flag -Mnomain' ;;
       
  7076  	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
       
  7077  	  tmp_addflag=' -i_dynamic' ;;
       
  7078  	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
       
  7079  	  tmp_addflag=' -i_dynamic -nofor_main' ;;
       
  7080  	ifc* | ifort*)			# Intel Fortran compiler
       
  7081  	  tmp_addflag=' -nofor_main' ;;
       
  7082  	esac
       
  7083 -	archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       
  7084 +	case `$CC -V 2>&1 | sed 5q` in
       
  7085 +	*Sun\ C*)			# Sun C 5.9
       
  7086 +	  whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  7087 +	  tmp_sharedflag='-G' ;;
       
  7088 +	*Sun\ F*)			# Sun Fortran 8.3
       
  7089 +	  tmp_sharedflag='-G' ;;
       
  7090 +	*)
       
  7091 +	  tmp_sharedflag='-shared' ;;
       
  7092 +	esac
       
  7093 +	archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       
  7094  
       
  7095  	if test $supports_anon_versioning = yes; then
       
  7096  	  archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
       
  7097    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
       
  7098    $echo "local: *; };" >> $output_objdir/$libname.ver~
       
  7099 -	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
       
  7100 +	  $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
       
  7101  	fi
       
  7102        else
       
  7103  	ld_shlibs_F77=no
       
  7104        fi
       
  7105        ;;
       
  7106  
       
  7107      netbsd*)
       
  7108        if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  7109 @@ -14367,17 +14874,17 @@ _LT_EOF
       
  7110        hardcode_minus_L_F77=yes
       
  7111        if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
       
  7112  	# Neither direct hardcoding nor static linking is supported with a
       
  7113  	# broken collect2.
       
  7114  	hardcode_direct_F77=unsupported
       
  7115        fi
       
  7116        ;;
       
  7117  
       
  7118 -    aix4* | aix5*)
       
  7119 +    aix[4-9]*)
       
  7120        if test "$host_cpu" = ia64; then
       
  7121  	# On IA64, the linker does run time linking by default, so we don't
       
  7122  	# have to do anything special.
       
  7123  	aix_use_runtimelinking=no
       
  7124  	exp_sym_flag='-Bexport'
       
  7125  	no_entry_flag=""
       
  7126        else
       
  7127  	# If we're using GNU nm, then we don't want the "-C" option.
       
  7128 @@ -14387,17 +14894,17 @@ _LT_EOF
       
  7129  	else
       
  7130  	  export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
       
  7131  	fi
       
  7132  	aix_use_runtimelinking=no
       
  7133  
       
  7134  	# Test if we are trying to use run time linking or normal
       
  7135  	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
       
  7136  	# need to do runtime linking.
       
  7137 -	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
       
  7138 +	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
       
  7139  	  for ld_flag in $LDFLAGS; do
       
  7140    	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
       
  7141    	    aix_use_runtimelinking=yes
       
  7142    	    break
       
  7143    	  fi
       
  7144  	  done
       
  7145  	  ;;
       
  7146  	esac
       
  7147 @@ -14421,17 +14928,17 @@ _LT_EOF
       
  7148  	case $host_os in aix4.[012]|aix4.[012].*)
       
  7149  	# We only want to do this on AIX 4.2 and lower, the check
       
  7150  	# below for broken collect2 doesn't work under 4.3+
       
  7151  	  collect2name=`${CC} -print-prog-name=collect2`
       
  7152  	  if test -f "$collect2name" && \
       
  7153    	   strings "$collect2name" | grep resolve_lib_name >/dev/null
       
  7154  	  then
       
  7155    	  # We have reworked collect2
       
  7156 -  	  hardcode_direct_F77=yes
       
  7157 +  	  :
       
  7158  	  else
       
  7159    	  # We have old collect2
       
  7160    	  hardcode_direct_F77=unsupported
       
  7161    	  # It fails to find uninstalled libraries when the uninstalled
       
  7162    	  # path is not listed in the libpath.  Setting hardcode_minus_L
       
  7163    	  # to unsupported forces relinking
       
  7164    	  hardcode_minus_L_F77=yes
       
  7165    	  hardcode_libdir_flag_spec_F77='-L$libdir'
       
  7166 @@ -14485,21 +14992,28 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
       
  7167    cat conftest.err >&5
       
  7168    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  7169    (exit $ac_status); } && {
       
  7170  	 test -z "$ac_f77_werror_flag" ||
       
  7171  	 test ! -s conftest.err
       
  7172         } && test -s conftest$ac_exeext &&
       
  7173         $as_test_x conftest$ac_exeext; then
       
  7174  
       
  7175 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  7176 -}'`
       
  7177 +lt_aix_libpath_sed='
       
  7178 +    /Import File Strings/,/^$/ {
       
  7179 +	/^0/ {
       
  7180 +	    s/^0  *\(.*\)$/\1/
       
  7181 +	    p
       
  7182 +	}
       
  7183 +    }'
       
  7184 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  7185  # Check for a 64-bit object if we didn't find anything.
       
  7186 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  7187 -}'`; fi
       
  7188 +if test -z "$aix_libpath"; then
       
  7189 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  7190 +fi
       
  7191  else
       
  7192    echo "$as_me: failed program was:" >&5
       
  7193  sed 's/^/| /' conftest.$ac_ext >&5
       
  7194  
       
  7195  
       
  7196  fi
       
  7197  
       
  7198  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  7199 @@ -14534,21 +15048,28 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
       
  7200    cat conftest.err >&5
       
  7201    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  7202    (exit $ac_status); } && {
       
  7203  	 test -z "$ac_f77_werror_flag" ||
       
  7204  	 test ! -s conftest.err
       
  7205         } && test -s conftest$ac_exeext &&
       
  7206         $as_test_x conftest$ac_exeext; then
       
  7207  
       
  7208 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  7209 -}'`
       
  7210 +lt_aix_libpath_sed='
       
  7211 +    /Import File Strings/,/^$/ {
       
  7212 +	/^0/ {
       
  7213 +	    s/^0  *\(.*\)$/\1/
       
  7214 +	    p
       
  7215 +	}
       
  7216 +    }'
       
  7217 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  7218  # Check for a 64-bit object if we didn't find anything.
       
  7219 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  7220 -}'`; fi
       
  7221 +if test -z "$aix_libpath"; then
       
  7222 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  7223 +fi
       
  7224  else
       
  7225    echo "$as_me: failed program was:" >&5
       
  7226  sed 's/^/| /' conftest.$ac_ext >&5
       
  7227  
       
  7228  
       
  7229  fi
       
  7230  
       
  7231  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  7232 @@ -14592,17 +15113,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  7233        libext=lib
       
  7234        # Tell ltmain to make .dll files, not .so files.
       
  7235        shrext_cmds=".dll"
       
  7236        # FIXME: Setting linknames here is a bad hack.
       
  7237        archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
       
  7238        # The linker will automatically build a .lib file if we build a DLL.
       
  7239        old_archive_From_new_cmds_F77='true'
       
  7240        # FIXME: Should let the user specify the lib program.
       
  7241 -      old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
       
  7242 +      old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs'
       
  7243        fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
       
  7244        enable_shared_with_static_runtimes_F77=yes
       
  7245        ;;
       
  7246  
       
  7247      darwin* | rhapsody*)
       
  7248        case $host_os in
       
  7249          rhapsody* | darwin1.[012])
       
  7250           allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
       
  7251 @@ -14625,29 +15146,28 @@ if test -z "$aix_libpath"; then aix_libp
       
  7252        archive_cmds_need_lc_F77=no
       
  7253        hardcode_direct_F77=no
       
  7254        hardcode_automatic_F77=yes
       
  7255        hardcode_shlibpath_var_F77=unsupported
       
  7256        whole_archive_flag_spec_F77=''
       
  7257        link_all_deplibs_F77=yes
       
  7258      if test "$GCC" = yes ; then
       
  7259      	output_verbose_link_cmd='echo'
       
  7260 -        archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
       
  7261 -      module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  7262 -      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  7263 -      archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  7264 -      module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  7265 +        archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
       
  7266 +        module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
       
  7267 +        archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
       
  7268 +        module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
       
  7269      else
       
  7270        case $cc_basename in
       
  7271          xlc*)
       
  7272           output_verbose_link_cmd='echo'
       
  7273 -         archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
       
  7274 +         archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
       
  7275           module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  7276            # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  7277 -         archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  7278 +         archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  7279            module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  7280            ;;
       
  7281         *)
       
  7282           ld_shlibs_F77=no
       
  7283            ;;
       
  7284        esac
       
  7285      fi
       
  7286        ;;
       
  7287 @@ -14677,17 +15197,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  7288      freebsd2*)
       
  7289        archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  7290        hardcode_direct_F77=yes
       
  7291        hardcode_minus_L_F77=yes
       
  7292        hardcode_shlibpath_var_F77=no
       
  7293        ;;
       
  7294  
       
  7295      # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
       
  7296 -    freebsd* | kfreebsd*-gnu | dragonfly*)
       
  7297 +    freebsd* | dragonfly*)
       
  7298        archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
       
  7299        hardcode_libdir_flag_spec_F77='-R$libdir'
       
  7300        hardcode_direct_F77=yes
       
  7301        hardcode_shlibpath_var_F77=no
       
  7302        ;;
       
  7303  
       
  7304      hpux9*)
       
  7305        if test "$GCC" = yes; then
       
  7306 @@ -14799,34 +15319,38 @@ if test -z "$aix_libpath"; then aix_libp
       
  7307        archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       
  7308        hardcode_direct_F77=yes
       
  7309        hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
       
  7310        hardcode_libdir_separator_F77=:
       
  7311        hardcode_shlibpath_var_F77=no
       
  7312        ;;
       
  7313  
       
  7314      openbsd*)
       
  7315 -      hardcode_direct_F77=yes
       
  7316 -      hardcode_shlibpath_var_F77=no
       
  7317 -      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  7318 -	archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  7319 -	archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
       
  7320 -	hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
       
  7321 -	export_dynamic_flag_spec_F77='${wl}-E'
       
  7322 -      else
       
  7323 -       case $host_os in
       
  7324 -	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
       
  7325 -	   archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  7326 -	   hardcode_libdir_flag_spec_F77='-R$libdir'
       
  7327 -	   ;;
       
  7328 -	 *)
       
  7329 -	   archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  7330 -	   hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
       
  7331 -	   ;;
       
  7332 -       esac
       
  7333 +      if test -f /usr/libexec/ld.so; then
       
  7334 +	hardcode_direct_F77=yes
       
  7335 +	hardcode_shlibpath_var_F77=no
       
  7336 +	if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  7337 +	  archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  7338 +	  archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
       
  7339 +	  hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
       
  7340 +	  export_dynamic_flag_spec_F77='${wl}-E'
       
  7341 +	else
       
  7342 +	  case $host_os in
       
  7343 +	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
       
  7344 +	     archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  7345 +	     hardcode_libdir_flag_spec_F77='-R$libdir'
       
  7346 +	     ;;
       
  7347 +	   *)
       
  7348 +	     archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  7349 +	     hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
       
  7350 +	     ;;
       
  7351 +	  esac
       
  7352 +        fi
       
  7353 +      else
       
  7354 +	ld_shlibs_F77=no
       
  7355        fi
       
  7356        ;;
       
  7357  
       
  7358      os2*)
       
  7359        hardcode_libdir_flag_spec_F77='-L$libdir'
       
  7360        hardcode_minus_L_F77=yes
       
  7361        allow_undefined_flag_F77=unsupported
       
  7362        archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
       
  7363 @@ -14875,27 +15399,26 @@ if test -z "$aix_libpath"; then aix_libp
       
  7364  	archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
       
  7365    	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
       
  7366        fi
       
  7367        hardcode_libdir_flag_spec_F77='-R$libdir'
       
  7368        hardcode_shlibpath_var_F77=no
       
  7369        case $host_os in
       
  7370        solaris2.[0-5] | solaris2.[0-5].*) ;;
       
  7371        *)
       
  7372 - 	# The compiler driver will combine linker options so we
       
  7373 - 	# cannot just pass the convience library names through
       
  7374 - 	# without $wl, iff we do not link with $LD.
       
  7375 - 	# Luckily, gcc supports the same syntax we need for Sun Studio.
       
  7376 +	# The compiler driver will combine and reorder linker options,
       
  7377 +	# but understands `-z linker_flag'.  GCC discards it without `$wl',
       
  7378 +	# but is careful enough not to reorder.
       
  7379   	# Supported since Solaris 2.6 (maybe 2.5.1?)
       
  7380 - 	case $wlarc in
       
  7381 - 	'')
       
  7382 - 	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
       
  7383 - 	*)
       
  7384 - 	  whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
       
  7385 - 	esac ;;
       
  7386 +	if test "$GCC" = yes; then
       
  7387 +	  whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
       
  7388 +	else
       
  7389 +	  whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract'
       
  7390 +	fi
       
  7391 +	;;
       
  7392        esac
       
  7393        link_all_deplibs_F77=yes
       
  7394        ;;
       
  7395  
       
  7396      sunos4*)
       
  7397        if test "x$host_vendor" = xsequent; then
       
  7398  	# Use $CC to link under sequent, because it throws in some extra .o
       
  7399  	# files that make .init and .fini sections work.
       
  7400 @@ -14942,17 +15465,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  7401  	archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       
  7402  	hardcode_shlibpath_var_F77=no
       
  7403  	runpath_var=LD_RUN_PATH
       
  7404  	hardcode_runpath_var=yes
       
  7405  	ld_shlibs_F77=yes
       
  7406        fi
       
  7407        ;;
       
  7408  
       
  7409 -    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
       
  7410 +    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
       
  7411        no_undefined_flag_F77='${wl}-z,text'
       
  7412        archive_cmds_need_lc_F77=no
       
  7413        hardcode_shlibpath_var_F77=no
       
  7414        runpath_var='LD_RUN_PATH'
       
  7415  
       
  7416        if test "$GCC" = yes; then
       
  7417  	archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       
  7418  	archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       
  7419 @@ -15019,17 +15542,17 @@ x|xyes)
       
  7420        ;;
       
  7421      '$CC '*)
       
  7422        # Test whether the compiler implicitly links with -lc since on some
       
  7423        # systems, -lgcc has to come before -lc. If gcc already passes -lc
       
  7424        # to ld, don't add -lc before -lgcc.
       
  7425        { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
       
  7426  echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
       
  7427        $rm conftest*
       
  7428 -      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  7429 +      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  7430  
       
  7431        if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
       
  7432    (eval $ac_compile) 2>&5
       
  7433    ac_status=$?
       
  7434    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  7435    (exit $ac_status); } 2>conftest.err; then
       
  7436          soname=conftest
       
  7437          lib=conftest
       
  7438 @@ -15077,30 +15600,17 @@ postinstall_cmds=
       
  7439  postuninstall_cmds=
       
  7440  finish_cmds=
       
  7441  finish_eval=
       
  7442  shlibpath_var=
       
  7443  shlibpath_overrides_runpath=unknown
       
  7444  version_type=none
       
  7445  dynamic_linker="$host_os ld.so"
       
  7446  sys_lib_dlsearch_path_spec="/lib /usr/lib"
       
  7447 -if test "$GCC" = yes; then
       
  7448 -  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
       
  7449 -  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
       
  7450 -    # if the path contains ";" then we assume it to be the separator
       
  7451 -    # otherwise default to the standard path separator (i.e. ":") - it is
       
  7452 -    # assumed that no part of a normal pathname contains ";" but that should
       
  7453 -    # okay in the real world where ";" in dirpaths is itself problematic.
       
  7454 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       
  7455 -  else
       
  7456 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       
  7457 -  fi
       
  7458 -else
       
  7459 -  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
       
  7460 -fi
       
  7461 +
       
  7462  need_lib_prefix=unknown
       
  7463  hardcode_into_libs=no
       
  7464  
       
  7465  # when you set need_version to no, make sure it does not cause -set_version
       
  7466  # flags to be left without arguments
       
  7467  need_version=unknown
       
  7468  
       
  7469  case $host_os in
       
  7470 @@ -15108,17 +15618,17 @@ aix3*)
       
  7471    version_type=linux
       
  7472    library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
       
  7473    shlibpath_var=LIBPATH
       
  7474  
       
  7475    # AIX 3 has no versioning support, so we append a major version to the name.
       
  7476    soname_spec='${libname}${release}${shared_ext}$major'
       
  7477    ;;
       
  7478  
       
  7479 -aix4* | aix5*)
       
  7480 +aix[4-9]*)
       
  7481    version_type=linux
       
  7482    need_lib_prefix=no
       
  7483    need_version=no
       
  7484    hardcode_into_libs=yes
       
  7485    if test "$host_cpu" = ia64; then
       
  7486      # AIX 5 supports IA64
       
  7487      library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
       
  7488      shlibpath_var=LD_LIBRARY_PATH
       
  7489 @@ -15247,50 +15757,33 @@ darwin* | rhapsody*)
       
  7490    version_type=darwin
       
  7491    need_lib_prefix=no
       
  7492    need_version=no
       
  7493    library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
       
  7494    soname_spec='${libname}${release}${major}$shared_ext'
       
  7495    shlibpath_overrides_runpath=yes
       
  7496    shlibpath_var=DYLD_LIBRARY_PATH
       
  7497    shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
       
  7498 -  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
       
  7499 -  if test "$GCC" = yes; then
       
  7500 -    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
       
  7501 -  else
       
  7502 -    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
       
  7503 -  fi
       
  7504 +
       
  7505    sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
       
  7506    ;;
       
  7507  
       
  7508  dgux*)
       
  7509    version_type=linux
       
  7510    need_lib_prefix=no
       
  7511    need_version=no
       
  7512    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
       
  7513    soname_spec='${libname}${release}${shared_ext}$major'
       
  7514    shlibpath_var=LD_LIBRARY_PATH
       
  7515    ;;
       
  7516  
       
  7517  freebsd1*)
       
  7518    dynamic_linker=no
       
  7519    ;;
       
  7520  
       
  7521 -kfreebsd*-gnu)
       
  7522 -  version_type=linux
       
  7523 -  need_lib_prefix=no
       
  7524 -  need_version=no
       
  7525 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  7526 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  7527 -  shlibpath_var=LD_LIBRARY_PATH
       
  7528 -  shlibpath_overrides_runpath=no
       
  7529 -  hardcode_into_libs=yes
       
  7530 -  dynamic_linker='GNU ld.so'
       
  7531 -  ;;
       
  7532 -
       
  7533  freebsd* | dragonfly*)
       
  7534    # DragonFly does not have aout.  When/if they implement a new
       
  7535    # versioning mechanism, adjust this.
       
  7536    if test -x /usr/bin/objformat; then
       
  7537      objformat=`/usr/bin/objformat`
       
  7538    else
       
  7539      case $host_os in
       
  7540      freebsd[123]*) objformat=aout ;;
       
  7541 @@ -15318,17 +15811,17 @@ freebsd* | dragonfly*)
       
  7542      shlibpath_overrides_runpath=yes
       
  7543      hardcode_into_libs=yes
       
  7544      ;;
       
  7545    freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
       
  7546    freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
       
  7547      shlibpath_overrides_runpath=no
       
  7548      hardcode_into_libs=yes
       
  7549      ;;
       
  7550 -  freebsd*) # from 4.6 on
       
  7551 +  *) # from 4.6 on, and DragonFly
       
  7552      shlibpath_overrides_runpath=yes
       
  7553      hardcode_into_libs=yes
       
  7554      ;;
       
  7555    esac
       
  7556    ;;
       
  7557  
       
  7558  gnu*)
       
  7559    version_type=linux
       
  7560 @@ -15381,17 +15874,17 @@ hpux9* | hpux10* | hpux11*)
       
  7561      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  7562      soname_spec='${libname}${release}${shared_ext}$major'
       
  7563      ;;
       
  7564    esac
       
  7565    # HP-UX runs *really* slowly unless shared libraries are mode 555.
       
  7566    postinstall_cmds='chmod 555 $lib'
       
  7567    ;;
       
  7568  
       
  7569 -interix3*)
       
  7570 +interix[3-9]*)
       
  7571    version_type=linux
       
  7572    need_lib_prefix=no
       
  7573    need_version=no
       
  7574    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  7575    soname_spec='${libname}${release}${shared_ext}$major'
       
  7576    dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
       
  7577    shlibpath_var=LD_LIBRARY_PATH
       
  7578    shlibpath_overrides_runpath=no
       
  7579 @@ -15436,57 +15929,45 @@ irix5* | irix6* | nonstopux*)
       
  7580    ;;
       
  7581  
       
  7582  # No shared lib support for Linux oldld, aout, or coff.
       
  7583  linux*oldld* | linux*aout* | linux*coff*)
       
  7584    dynamic_linker=no
       
  7585    ;;
       
  7586  
       
  7587  # This must be Linux ELF.
       
  7588 -linux*)
       
  7589 +linux* | k*bsd*-gnu)
       
  7590    version_type=linux
       
  7591    need_lib_prefix=no
       
  7592    need_version=no
       
  7593    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  7594    soname_spec='${libname}${release}${shared_ext}$major'
       
  7595    finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
       
  7596    shlibpath_var=LD_LIBRARY_PATH
       
  7597    shlibpath_overrides_runpath=no
       
  7598    # This implies no fast_install, which is unacceptable.
       
  7599    # Some rework will be needed to allow for fast_install
       
  7600    # before this can be enabled.
       
  7601    hardcode_into_libs=yes
       
  7602  
       
  7603    # Append ld.so.conf contents to the search path
       
  7604    if test -f /etc/ld.so.conf; then
       
  7605 -    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  7606 +    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  7607      sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
       
  7608    fi
       
  7609  
       
  7610    # We used to test for /lib/ld.so.1 and disable shared libraries on
       
  7611    # powerpc, because MkLinux only supported shared libraries with the
       
  7612    # GNU dynamic linker.  Since this was broken with cross compilers,
       
  7613    # most powerpc-linux boxes support dynamic linking these days and
       
  7614    # people can always --disable-shared, the test was removed, and we
       
  7615    # assume the GNU/Linux dynamic linker is in use.
       
  7616    dynamic_linker='GNU/Linux ld.so'
       
  7617    ;;
       
  7618  
       
  7619 -knetbsd*-gnu)
       
  7620 -  version_type=linux
       
  7621 -  need_lib_prefix=no
       
  7622 -  need_version=no
       
  7623 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  7624 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  7625 -  shlibpath_var=LD_LIBRARY_PATH
       
  7626 -  shlibpath_overrides_runpath=no
       
  7627 -  hardcode_into_libs=yes
       
  7628 -  dynamic_linker='GNU ld.so'
       
  7629 -  ;;
       
  7630 -
       
  7631  netbsd*)
       
  7632    version_type=sunos
       
  7633    need_lib_prefix=no
       
  7634    need_version=no
       
  7635    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  7636      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
       
  7637      finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
       
  7638      dynamic_linker='NetBSD (a.out) ld.so'
       
  7639 @@ -15558,16 +16039,20 @@ osf3* | osf4* | osf5*)
       
  7640    need_version=no
       
  7641    soname_spec='${libname}${release}${shared_ext}$major'
       
  7642    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  7643    shlibpath_var=LD_LIBRARY_PATH
       
  7644    sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
       
  7645    sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
       
  7646    ;;
       
  7647  
       
  7648 +rdos*)
       
  7649 +  dynamic_linker=no
       
  7650 +  ;;
       
  7651 +
       
  7652  solaris*)
       
  7653    version_type=linux
       
  7654    need_lib_prefix=no
       
  7655    need_version=no
       
  7656    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  7657    soname_spec='${libname}${release}${shared_ext}$major'
       
  7658    shlibpath_var=LD_LIBRARY_PATH
       
  7659    shlibpath_overrides_runpath=yes
       
  7660 @@ -15654,16 +16139,31 @@ uts4*)
       
  7661  *)
       
  7662    dynamic_linker=no
       
  7663    ;;
       
  7664  esac
       
  7665  { echo "$as_me:$LINENO: result: $dynamic_linker" >&5
       
  7666  echo "${ECHO_T}$dynamic_linker" >&6; }
       
  7667  test "$dynamic_linker" = no && can_build_shared=no
       
  7668  
       
  7669 +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
       
  7670 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  7671 +else
       
  7672 +  lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
       
  7673 +fi
       
  7674 +
       
  7675 +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
       
  7676 +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
       
  7677 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  7678 +else
       
  7679 +  lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
       
  7680 +fi
       
  7681 +
       
  7682 +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
       
  7683 +
       
  7684  variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
       
  7685  if test "$GCC" = yes; then
       
  7686    variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
       
  7687  fi
       
  7688  
       
  7689  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
       
  7690  echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
       
  7691  hardcode_action_F77=
       
  7692 @@ -15737,31 +16237,33 @@ if test -f "$ltmain"; then
       
  7693      enable_shared_with_static_runtimes_F77 \
       
  7694      old_archive_cmds_F77 \
       
  7695      old_archive_from_new_cmds_F77 \
       
  7696      predep_objects_F77 \
       
  7697      postdep_objects_F77 \
       
  7698      predeps_F77 \
       
  7699      postdeps_F77 \
       
  7700      compiler_lib_search_path_F77 \
       
  7701 +    compiler_lib_search_dirs_F77 \
       
  7702      archive_cmds_F77 \
       
  7703      archive_expsym_cmds_F77 \
       
  7704      postinstall_cmds_F77 \
       
  7705      postuninstall_cmds_F77 \
       
  7706      old_archive_from_expsyms_cmds_F77 \
       
  7707      allow_undefined_flag_F77 \
       
  7708      no_undefined_flag_F77 \
       
  7709      export_symbols_cmds_F77 \
       
  7710      hardcode_libdir_flag_spec_F77 \
       
  7711      hardcode_libdir_flag_spec_ld_F77 \
       
  7712      hardcode_libdir_separator_F77 \
       
  7713      hardcode_automatic_F77 \
       
  7714      module_cmds_F77 \
       
  7715      module_expsym_cmds_F77 \
       
  7716      lt_cv_prog_compiler_c_o_F77 \
       
  7717 +    fix_srcfile_path_F77 \
       
  7718      exclude_expsyms_F77 \
       
  7719      include_expsyms_F77; do
       
  7720  
       
  7721      case $var in
       
  7722      old_archive_cmds_F77 | \
       
  7723      old_archive_from_new_cmds_F77 | \
       
  7724      archive_cmds_F77 | \
       
  7725      archive_expsym_cmds_F77 | \
       
  7726 @@ -15984,16 +16486,20 @@ postdep_objects=$lt_postdep_objects_F77
       
  7727  # Dependencies to place before the objects being linked to create a
       
  7728  # shared library.
       
  7729  predeps=$lt_predeps_F77
       
  7730  
       
  7731  # Dependencies to place after the objects being linked to create a
       
  7732  # shared library.
       
  7733  postdeps=$lt_postdeps_F77
       
  7734  
       
  7735 +# The directories searched by this compiler when creating a shared
       
  7736 +# library
       
  7737 +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77
       
  7738 +
       
  7739  # The library search path used internally by the compiler when linking
       
  7740  # a shared library.
       
  7741  compiler_lib_search_path=$lt_compiler_lib_search_path_F77
       
  7742  
       
  7743  # Method to check whether dependent libraries are shared objects.
       
  7744  deplibs_check_method=$lt_deplibs_check_method
       
  7745  
       
  7746  # Command to use when deplibs_check_method == file_magic.
       
  7747 @@ -16072,17 +16578,17 @@ link_all_deplibs=$link_all_deplibs_F77
       
  7748  
       
  7749  # Compile-time system search path for libraries
       
  7750  sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
       
  7751  
       
  7752  # Run-time system search path for libraries
       
  7753  sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
       
  7754  
       
  7755  # Fix the shell variable \$srcfile for the compiler.
       
  7756 -fix_srcfile_path="$fix_srcfile_path_F77"
       
  7757 +fix_srcfile_path=$lt_fix_srcfile_path
       
  7758  
       
  7759  # Set to yes if exported symbols are required.
       
  7760  always_export_symbols=$always_export_symbols_F77
       
  7761  
       
  7762  # The commands to list exported symbols.
       
  7763  export_symbols_cmds=$lt_export_symbols_cmds_F77
       
  7764  
       
  7765  # The commands to extract the exported symbol list from a shared archive.
       
  7766 @@ -16130,45 +16636,45 @@ CC="$lt_save_CC"
       
  7767  # Source file extension for Java test sources.
       
  7768  ac_ext=java
       
  7769  
       
  7770  # Object file extension for compiled Java test sources.
       
  7771  objext=o
       
  7772  objext_GCJ=$objext
       
  7773  
       
  7774  # Code to be used in simple compile tests
       
  7775 -lt_simple_compile_test_code="class foo {}\n"
       
  7776 +lt_simple_compile_test_code="class foo {}"
       
  7777  
       
  7778  # Code to be used in simple link tests
       
  7779 -lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
       
  7780 +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }'
       
  7781  
       
  7782  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
       
  7783  
       
  7784  # If no C compiler was specified, use CC.
       
  7785  LTCC=${LTCC-"$CC"}
       
  7786  
       
  7787  # If no C compiler flags were specified, use CFLAGS.
       
  7788  LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
       
  7789  
       
  7790  # Allow CC to be a program name with arguments.
       
  7791  compiler=$CC
       
  7792  
       
  7793  
       
  7794  # save warnings/boilerplate of simple test code
       
  7795  ac_outfile=conftest.$ac_objext
       
  7796 -printf "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  7797 +echo "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  7798  eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  7799  _lt_compiler_boilerplate=`cat conftest.err`
       
  7800  $rm conftest*
       
  7801  
       
  7802  ac_outfile=conftest.$ac_objext
       
  7803 -printf "$lt_simple_link_test_code" >conftest.$ac_ext
       
  7804 +echo "$lt_simple_link_test_code" >conftest.$ac_ext
       
  7805  eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  7806  _lt_linker_boilerplate=`cat conftest.err`
       
  7807 -$rm conftest*
       
  7808 +$rm -r conftest*
       
  7809  
       
  7810  
       
  7811  # Allow CC to be a program name with arguments.
       
  7812  lt_save_CC="$CC"
       
  7813  CC=${GCJ-"gcj"}
       
  7814  compiler=$CC
       
  7815  compiler_GCJ=$CC
       
  7816  for cc_temp in $compiler""; do
       
  7817 @@ -16196,32 +16702,32 @@ if test "$GCC" = yes; then
       
  7818  
       
  7819  { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
       
  7820  echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
       
  7821  if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
       
  7822    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  7823  else
       
  7824    lt_cv_prog_compiler_rtti_exceptions=no
       
  7825    ac_outfile=conftest.$ac_objext
       
  7826 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  7827 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  7828     lt_compiler_flag="-fno-rtti -fno-exceptions"
       
  7829     # Insert the option either (1) after the last *FLAGS variable, or
       
  7830     # (2) before a word containing "conftest.", or (3) at the end.
       
  7831     # Note that $ac_compile itself does not contain backslashes and begins
       
  7832     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  7833     # The option is referenced via a variable to avoid confusing sed.
       
  7834     lt_compile=`echo "$ac_compile" | $SED \
       
  7835     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  7836     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  7837     -e 's:$: $lt_compiler_flag:'`
       
  7838 -   (eval echo "\"\$as_me:16215: $lt_compile\"" >&5)
       
  7839 +   (eval echo "\"\$as_me:16721: $lt_compile\"" >&5)
       
  7840     (eval "$lt_compile" 2>conftest.err)
       
  7841     ac_status=$?
       
  7842     cat conftest.err >&5
       
  7843 -   echo "$as_me:16219: \$? = $ac_status" >&5
       
  7844 +   echo "$as_me:16725: \$? = $ac_status" >&5
       
  7845     if (exit $ac_status) && test -s "$ac_outfile"; then
       
  7846       # The compiler can only warn and ignore the option if not recognized
       
  7847       # So say no if there are warnings other than the usual output.
       
  7848       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
       
  7849       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  7850       if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       
  7851         lt_cv_prog_compiler_rtti_exceptions=yes
       
  7852       fi
       
  7853 @@ -16262,33 +16768,35 @@ echo $ECHO_N "checking for $compiler opt
       
  7854  
       
  7855      amigaos*)
       
  7856        # FIXME: we need at least 68020 code to build shared libraries, but
       
  7857        # adding the `-m68020' flag to GCC prevents building anything better,
       
  7858        # like `-m68040'.
       
  7859        lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4'
       
  7860        ;;
       
  7861  
       
  7862 -    beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  7863 +    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       
  7864        # PIC is the default for these OSes.
       
  7865        ;;
       
  7866  
       
  7867 -    mingw* | pw32* | os2*)
       
  7868 +    mingw* | cygwin* | pw32* | os2*)
       
  7869        # This hack is so that the source file can tell whether it is being
       
  7870        # built for inclusion in a dll (and should export symbols for example).
       
  7871 -      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
       
  7872 +      # Although the cygwin gcc ignores -fPIC, still need this for old-style
       
  7873 +      # (--disable-auto-import) libraries
       
  7874 +
       
  7875        ;;
       
  7876  
       
  7877      darwin* | rhapsody*)
       
  7878        # PIC is the default on this platform
       
  7879        # Common symbols not allowed in MH_DYLIB files
       
  7880        lt_prog_compiler_pic_GCJ='-fno-common'
       
  7881        ;;
       
  7882  
       
  7883 -    interix3*)
       
  7884 +    interix[3-9]*)
       
  7885        # Interix 3.x gcc -fpic/-fPIC options generate broken code.
       
  7886        # Instead, we relocate shared libraries at runtime.
       
  7887        ;;
       
  7888  
       
  7889      msdosdjgpp*)
       
  7890        # Just because we use GCC doesn't mean we suddenly get shared libraries
       
  7891        # on systems that don't support them.
       
  7892        lt_prog_compiler_can_build_shared_GCJ=no
       
  7893 @@ -16336,20 +16844,20 @@ echo $ECHO_N "checking for $compiler opt
       
  7894         case $cc_basename in
       
  7895           xlc*)
       
  7896           lt_prog_compiler_pic_GCJ='-qnocommon'
       
  7897           lt_prog_compiler_wl_GCJ='-Wl,'
       
  7898           ;;
       
  7899         esac
       
  7900         ;;
       
  7901  
       
  7902 -    mingw* | pw32* | os2*)
       
  7903 +    mingw* | cygwin* | pw32* | os2*)
       
  7904        # This hack is so that the source file can tell whether it is being
       
  7905        # built for inclusion in a dll (and should export symbols for example).
       
  7906 -      lt_prog_compiler_pic_GCJ='-DDLL_EXPORT'
       
  7907 +
       
  7908        ;;
       
  7909  
       
  7910      hpux9* | hpux10* | hpux11*)
       
  7911        lt_prog_compiler_wl_GCJ='-Wl,'
       
  7912        # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
       
  7913        # not for PA HP-UX.
       
  7914        case $host_cpu in
       
  7915        hppa*64*|ia64*)
       
  7916 @@ -16369,17 +16877,17 @@ echo $ECHO_N "checking for $compiler opt
       
  7917        lt_prog_compiler_static_GCJ='-non_shared'
       
  7918        ;;
       
  7919  
       
  7920      newsos6)
       
  7921        lt_prog_compiler_pic_GCJ='-KPIC'
       
  7922        lt_prog_compiler_static_GCJ='-Bstatic'
       
  7923        ;;
       
  7924  
       
  7925 -    linux*)
       
  7926 +    linux* | k*bsd*-gnu)
       
  7927        case $cc_basename in
       
  7928        icc* | ecc*)
       
  7929  	lt_prog_compiler_wl_GCJ='-Wl,'
       
  7930  	lt_prog_compiler_pic_GCJ='-KPIC'
       
  7931  	lt_prog_compiler_static_GCJ='-static'
       
  7932          ;;
       
  7933        pgcc* | pgf77* | pgf90* | pgf95*)
       
  7934          # Portland Group compilers (*not* the Pentium gcc compiler,
       
  7935 @@ -16388,25 +16896,45 @@ echo $ECHO_N "checking for $compiler opt
       
  7936  	lt_prog_compiler_pic_GCJ='-fpic'
       
  7937  	lt_prog_compiler_static_GCJ='-Bstatic'
       
  7938          ;;
       
  7939        ccc*)
       
  7940          lt_prog_compiler_wl_GCJ='-Wl,'
       
  7941          # All Alpha code is PIC.
       
  7942          lt_prog_compiler_static_GCJ='-non_shared'
       
  7943          ;;
       
  7944 +      *)
       
  7945 +        case `$CC -V 2>&1 | sed 5q` in
       
  7946 +	*Sun\ C*)
       
  7947 +	  # Sun C 5.9
       
  7948 +	  lt_prog_compiler_pic_GCJ='-KPIC'
       
  7949 +	  lt_prog_compiler_static_GCJ='-Bstatic'
       
  7950 +	  lt_prog_compiler_wl_GCJ='-Wl,'
       
  7951 +	  ;;
       
  7952 +	*Sun\ F*)
       
  7953 +	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
       
  7954 +	  lt_prog_compiler_pic_GCJ='-KPIC'
       
  7955 +	  lt_prog_compiler_static_GCJ='-Bstatic'
       
  7956 +	  lt_prog_compiler_wl_GCJ=''
       
  7957 +	  ;;
       
  7958 +	esac
       
  7959 +	;;
       
  7960        esac
       
  7961        ;;
       
  7962  
       
  7963      osf3* | osf4* | osf5*)
       
  7964        lt_prog_compiler_wl_GCJ='-Wl,'
       
  7965        # All OSF/1 code is PIC.
       
  7966        lt_prog_compiler_static_GCJ='-non_shared'
       
  7967        ;;
       
  7968  
       
  7969 +    rdos*)
       
  7970 +      lt_prog_compiler_static_GCJ='-non_shared'
       
  7971 +      ;;
       
  7972 +
       
  7973      solaris*)
       
  7974        lt_prog_compiler_pic_GCJ='-KPIC'
       
  7975        lt_prog_compiler_static_GCJ='-Bstatic'
       
  7976        case $cc_basename in
       
  7977        f77* | f90* | f95*)
       
  7978  	lt_prog_compiler_wl_GCJ='-Qoption ld ';;
       
  7979        *)
       
  7980  	lt_prog_compiler_wl_GCJ='-Wl,';;
       
  7981 @@ -16459,53 +16987,53 @@ echo "${ECHO_T}$lt_prog_compiler_pic_GCJ
       
  7982  
       
  7983  #
       
  7984  # Check to make sure the PIC flag actually works.
       
  7985  #
       
  7986  if test -n "$lt_prog_compiler_pic_GCJ"; then
       
  7987  
       
  7988  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
       
  7989  echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6; }
       
  7990 -if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
       
  7991 -  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  7992 -else
       
  7993 -  lt_prog_compiler_pic_works_GCJ=no
       
  7994 +if test "${lt_cv_prog_compiler_pic_works_GCJ+set}" = set; then
       
  7995 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  7996 +else
       
  7997 +  lt_cv_prog_compiler_pic_works_GCJ=no
       
  7998    ac_outfile=conftest.$ac_objext
       
  7999 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  8000 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  8001     lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
       
  8002     # Insert the option either (1) after the last *FLAGS variable, or
       
  8003     # (2) before a word containing "conftest.", or (3) at the end.
       
  8004     # Note that $ac_compile itself does not contain backslashes and begins
       
  8005     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  8006     # The option is referenced via a variable to avoid confusing sed.
       
  8007     lt_compile=`echo "$ac_compile" | $SED \
       
  8008     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  8009     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  8010     -e 's:$: $lt_compiler_flag:'`
       
  8011 -   (eval echo "\"\$as_me:16483: $lt_compile\"" >&5)
       
  8012 +   (eval echo "\"\$as_me:17011: $lt_compile\"" >&5)
       
  8013     (eval "$lt_compile" 2>conftest.err)
       
  8014     ac_status=$?
       
  8015     cat conftest.err >&5
       
  8016 -   echo "$as_me:16487: \$? = $ac_status" >&5
       
  8017 +   echo "$as_me:17015: \$? = $ac_status" >&5
       
  8018     if (exit $ac_status) && test -s "$ac_outfile"; then
       
  8019       # The compiler can only warn and ignore the option if not recognized
       
  8020       # So say no if there are warnings other than the usual output.
       
  8021       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
       
  8022       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  8023       if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       
  8024 -       lt_prog_compiler_pic_works_GCJ=yes
       
  8025 +       lt_cv_prog_compiler_pic_works_GCJ=yes
       
  8026       fi
       
  8027     fi
       
  8028     $rm conftest*
       
  8029  
       
  8030  fi
       
  8031 -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
       
  8032 -echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6; }
       
  8033 -
       
  8034 -if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
       
  8035 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_GCJ" >&5
       
  8036 +echo "${ECHO_T}$lt_cv_prog_compiler_pic_works_GCJ" >&6; }
       
  8037 +
       
  8038 +if test x"$lt_cv_prog_compiler_pic_works_GCJ" = xyes; then
       
  8039      case $lt_prog_compiler_pic_GCJ in
       
  8040       "" | " "*) ;;
       
  8041       *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
       
  8042       esac
       
  8043  else
       
  8044      lt_prog_compiler_pic_GCJ=
       
  8045       lt_prog_compiler_can_build_shared_GCJ=no
       
  8046  fi
       
  8047 @@ -16522,78 +17050,78 @@ case $host_os in
       
  8048  esac
       
  8049  
       
  8050  #
       
  8051  # Check to make sure the static flag actually works.
       
  8052  #
       
  8053  wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
       
  8054  { echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
       
  8055  echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
       
  8056 -if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then
       
  8057 -  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  8058 -else
       
  8059 -  lt_prog_compiler_static_works_GCJ=no
       
  8060 +if test "${lt_cv_prog_compiler_static_works_GCJ+set}" = set; then
       
  8061 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  8062 +else
       
  8063 +  lt_cv_prog_compiler_static_works_GCJ=no
       
  8064     save_LDFLAGS="$LDFLAGS"
       
  8065     LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
       
  8066 -   printf "$lt_simple_link_test_code" > conftest.$ac_ext
       
  8067 +   echo "$lt_simple_link_test_code" > conftest.$ac_ext
       
  8068     if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
       
  8069       # The linker can only warn and ignore the option if not recognized
       
  8070       # So say no if there are warnings
       
  8071       if test -s conftest.err; then
       
  8072         # Append any errors to the config.log.
       
  8073         cat conftest.err 1>&5
       
  8074         $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
       
  8075         $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       
  8076         if diff conftest.exp conftest.er2 >/dev/null; then
       
  8077 -         lt_prog_compiler_static_works_GCJ=yes
       
  8078 +         lt_cv_prog_compiler_static_works_GCJ=yes
       
  8079         fi
       
  8080       else
       
  8081 -       lt_prog_compiler_static_works_GCJ=yes
       
  8082 +       lt_cv_prog_compiler_static_works_GCJ=yes
       
  8083       fi
       
  8084     fi
       
  8085 -   $rm conftest*
       
  8086 +   $rm -r conftest*
       
  8087     LDFLAGS="$save_LDFLAGS"
       
  8088  
       
  8089  fi
       
  8090 -{ echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5
       
  8091 -echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6; }
       
  8092 -
       
  8093 -if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then
       
  8094 +{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_GCJ" >&5
       
  8095 +echo "${ECHO_T}$lt_cv_prog_compiler_static_works_GCJ" >&6; }
       
  8096 +
       
  8097 +if test x"$lt_cv_prog_compiler_static_works_GCJ" = xyes; then
       
  8098      :
       
  8099  else
       
  8100      lt_prog_compiler_static_GCJ=
       
  8101  fi
       
  8102  
       
  8103  
       
  8104  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
       
  8105  echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
       
  8106  if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
       
  8107    echo $ECHO_N "(cached) $ECHO_C" >&6
       
  8108  else
       
  8109    lt_cv_prog_compiler_c_o_GCJ=no
       
  8110     $rm -r conftest 2>/dev/null
       
  8111     mkdir conftest
       
  8112     cd conftest
       
  8113     mkdir out
       
  8114 -   printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  8115 +   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  8116  
       
  8117     lt_compiler_flag="-o out/conftest2.$ac_objext"
       
  8118     # Insert the option either (1) after the last *FLAGS variable, or
       
  8119     # (2) before a word containing "conftest.", or (3) at the end.
       
  8120     # Note that $ac_compile itself does not contain backslashes and begins
       
  8121     # with a dollar sign (not a hyphen), so the echo should work correctly.
       
  8122     lt_compile=`echo "$ac_compile" | $SED \
       
  8123     -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
       
  8124     -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
       
  8125     -e 's:$: $lt_compiler_flag:'`
       
  8126 -   (eval echo "\"\$as_me:16587: $lt_compile\"" >&5)
       
  8127 +   (eval echo "\"\$as_me:17115: $lt_compile\"" >&5)
       
  8128     (eval "$lt_compile" 2>out/conftest.err)
       
  8129     ac_status=$?
       
  8130     cat out/conftest.err >&5
       
  8131 -   echo "$as_me:16591: \$? = $ac_status" >&5
       
  8132 +   echo "$as_me:17119: \$? = $ac_status" >&5
       
  8133     if (exit $ac_status) && test -s out/conftest2.$ac_objext
       
  8134     then
       
  8135       # The compiler can only warn and ignore the option if not recognized
       
  8136       # So say no if there are warnings
       
  8137       $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
       
  8138       $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
       
  8139       if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       
  8140         lt_cv_prog_compiler_c_o_GCJ=yes
       
  8141 @@ -16663,22 +17191,23 @@ echo $ECHO_N "checking whether the $comp
       
  8142    export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
       
  8143    # include_expsyms should be a list of space-separated symbols to be *always*
       
  8144    # included in the symbol list
       
  8145    include_expsyms_GCJ=
       
  8146    # exclude_expsyms can be an extended regexp of symbols to exclude
       
  8147    # it will be wrapped by ` (' and `)$', so one must not match beginning or
       
  8148    # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
       
  8149    # as well as any symbol that contains `d'.
       
  8150 -  exclude_expsyms_GCJ="_GLOBAL_OFFSET_TABLE_"
       
  8151 +  exclude_expsyms_GCJ='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
       
  8152    # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
       
  8153    # platforms (ab)use it in PIC code, but their linkers get confused if
       
  8154    # the symbol is explicitly referenced.  Since portable code cannot
       
  8155    # rely on this symbol name, it's probably fine to never include it in
       
  8156    # preloaded symbol tables.
       
  8157 +  # Exclude shared library initialization/finalization symbols.
       
  8158    extract_expsyms_cmds=
       
  8159    # Just being paranoid about ensuring that cc_basename is set.
       
  8160    for cc_temp in $compiler""; do
       
  8161    case $cc_temp in
       
  8162      compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
       
  8163      distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
       
  8164      \-*) ;;
       
  8165      *) break;;
       
  8166 @@ -16727,17 +17256,17 @@ cc_basename=`$echo "X$cc_temp" | $Xsed -
       
  8167        *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
       
  8168        *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
       
  8169        *\ 2.11.*) ;; # other 2.11 versions
       
  8170        *) supports_anon_versioning=yes ;;
       
  8171      esac
       
  8172  
       
  8173      # See if GNU ld supports shared libraries.
       
  8174      case $host_os in
       
  8175 -    aix3* | aix4* | aix5*)
       
  8176 +    aix[3-9]*)
       
  8177        # On AIX/PPC, the GNU linker is very broken
       
  8178        if test "$host_cpu" != ia64; then
       
  8179  	ld_shlibs_GCJ=no
       
  8180  	cat <<EOF 1>&2
       
  8181  
       
  8182  *** Warning: the GNU linker, at least up to release 2.9.1, is reported
       
  8183  *** to be unable to reliably create shared libraries on AIX.
       
  8184  *** Therefore, libtool is disabling shared libraries support.  If you
       
  8185 @@ -16775,17 +17304,17 @@ EOF
       
  8186  
       
  8187      cygwin* | mingw* | pw32*)
       
  8188        # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
       
  8189        # as there is no search path for DLLs.
       
  8190        hardcode_libdir_flag_spec_GCJ='-L$libdir'
       
  8191        allow_undefined_flag_GCJ=unsupported
       
  8192        always_export_symbols_GCJ=no
       
  8193        enable_shared_with_static_runtimes_GCJ=yes
       
  8194 -      export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
       
  8195 +      export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
       
  8196  
       
  8197        if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
       
  8198          archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  8199  	# If the export-symbols file already is a .def file (1st line
       
  8200  	# is EXPORTS), use it as is; otherwise, prepend...
       
  8201  	archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
       
  8202  	  cp $export_symbols $output_objdir/$soname.def;
       
  8203  	else
       
  8204 @@ -16793,32 +17322,32 @@ EOF
       
  8205  	  cat $export_symbols >> $output_objdir/$soname.def;
       
  8206  	fi~
       
  8207  	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       
  8208        else
       
  8209  	ld_shlibs_GCJ=no
       
  8210        fi
       
  8211        ;;
       
  8212  
       
  8213 -    interix3*)
       
  8214 +    interix[3-9]*)
       
  8215        hardcode_direct_GCJ=no
       
  8216        hardcode_shlibpath_var_GCJ=no
       
  8217        hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
       
  8218        export_dynamic_flag_spec_GCJ='${wl}-E'
       
  8219        # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       
  8220        # Instead, shared libraries are loaded at an image base (0x10000000 by
       
  8221        # default) and relocated if they conflict, which is a slow very memory
       
  8222        # consuming and fragmenting process.  To avoid this, we pick a random,
       
  8223        # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       
  8224        # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
       
  8225        archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       
  8226        archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       
  8227        ;;
       
  8228  
       
  8229 -    linux*)
       
  8230 +    gnu* | linux* | k*bsd*-gnu)
       
  8231        if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
       
  8232  	tmp_addflag=
       
  8233  	case $cc_basename,$host_cpu in
       
  8234  	pgcc*)				# Portland Group C compiler
       
  8235  	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  8236  	  tmp_addflag=' $pic_flag'
       
  8237  	  ;;
       
  8238  	pgf77* | pgf90* | pgf95*)	# Portland Group f77 and f90 compilers
       
  8239 @@ -16826,23 +17355,32 @@ EOF
       
  8240  	  tmp_addflag=' $pic_flag -Mnomain' ;;
       
  8241  	ecc*,ia64* | icc*,ia64*)		# Intel C compiler on ia64
       
  8242  	  tmp_addflag=' -i_dynamic' ;;
       
  8243  	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
       
  8244  	  tmp_addflag=' -i_dynamic -nofor_main' ;;
       
  8245  	ifc* | ifort*)			# Intel Fortran compiler
       
  8246  	  tmp_addflag=' -nofor_main' ;;
       
  8247  	esac
       
  8248 -	archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       
  8249 +	case `$CC -V 2>&1 | sed 5q` in
       
  8250 +	*Sun\ C*)			# Sun C 5.9
       
  8251 +	  whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
       
  8252 +	  tmp_sharedflag='-G' ;;
       
  8253 +	*Sun\ F*)			# Sun Fortran 8.3
       
  8254 +	  tmp_sharedflag='-G' ;;
       
  8255 +	*)
       
  8256 +	  tmp_sharedflag='-shared' ;;
       
  8257 +	esac
       
  8258 +	archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       
  8259  
       
  8260  	if test $supports_anon_versioning = yes; then
       
  8261  	  archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
       
  8262    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
       
  8263    $echo "local: *; };" >> $output_objdir/$libname.ver~
       
  8264 -	  $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
       
  8265 +	  $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
       
  8266  	fi
       
  8267        else
       
  8268  	ld_shlibs_GCJ=no
       
  8269        fi
       
  8270        ;;
       
  8271  
       
  8272      netbsd*)
       
  8273        if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  8274 @@ -16937,17 +17475,17 @@ _LT_EOF
       
  8275        hardcode_minus_L_GCJ=yes
       
  8276        if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
       
  8277  	# Neither direct hardcoding nor static linking is supported with a
       
  8278  	# broken collect2.
       
  8279  	hardcode_direct_GCJ=unsupported
       
  8280        fi
       
  8281        ;;
       
  8282  
       
  8283 -    aix4* | aix5*)
       
  8284 +    aix[4-9]*)
       
  8285        if test "$host_cpu" = ia64; then
       
  8286  	# On IA64, the linker does run time linking by default, so we don't
       
  8287  	# have to do anything special.
       
  8288  	aix_use_runtimelinking=no
       
  8289  	exp_sym_flag='-Bexport'
       
  8290  	no_entry_flag=""
       
  8291        else
       
  8292  	# If we're using GNU nm, then we don't want the "-C" option.
       
  8293 @@ -16957,17 +17495,17 @@ _LT_EOF
       
  8294  	else
       
  8295  	  export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
       
  8296  	fi
       
  8297  	aix_use_runtimelinking=no
       
  8298  
       
  8299  	# Test if we are trying to use run time linking or normal
       
  8300  	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
       
  8301  	# need to do runtime linking.
       
  8302 -	case $host_os in aix4.[23]|aix4.[23].*|aix5*)
       
  8303 +	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
       
  8304  	  for ld_flag in $LDFLAGS; do
       
  8305    	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
       
  8306    	    aix_use_runtimelinking=yes
       
  8307    	    break
       
  8308    	  fi
       
  8309  	  done
       
  8310  	  ;;
       
  8311  	esac
       
  8312 @@ -16991,17 +17529,17 @@ _LT_EOF
       
  8313  	case $host_os in aix4.[012]|aix4.[012].*)
       
  8314  	# We only want to do this on AIX 4.2 and lower, the check
       
  8315  	# below for broken collect2 doesn't work under 4.3+
       
  8316  	  collect2name=`${CC} -print-prog-name=collect2`
       
  8317  	  if test -f "$collect2name" && \
       
  8318    	   strings "$collect2name" | grep resolve_lib_name >/dev/null
       
  8319  	  then
       
  8320    	  # We have reworked collect2
       
  8321 -  	  hardcode_direct_GCJ=yes
       
  8322 +  	  :
       
  8323  	  else
       
  8324    	  # We have old collect2
       
  8325    	  hardcode_direct_GCJ=unsupported
       
  8326    	  # It fails to find uninstalled libraries when the uninstalled
       
  8327    	  # path is not listed in the libpath.  Setting hardcode_minus_L
       
  8328    	  # to unsupported forces relinking
       
  8329    	  hardcode_minus_L_GCJ=yes
       
  8330    	  hardcode_libdir_flag_spec_GCJ='-L$libdir'
       
  8331 @@ -17065,21 +17603,28 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
       
  8332    cat conftest.err >&5
       
  8333    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  8334    (exit $ac_status); } && {
       
  8335  	 test -z "$ac_c_werror_flag" ||
       
  8336  	 test ! -s conftest.err
       
  8337         } && test -s conftest$ac_exeext &&
       
  8338         $as_test_x conftest$ac_exeext; then
       
  8339  
       
  8340 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  8341 -}'`
       
  8342 +lt_aix_libpath_sed='
       
  8343 +    /Import File Strings/,/^$/ {
       
  8344 +	/^0/ {
       
  8345 +	    s/^0  *\(.*\)$/\1/
       
  8346 +	    p
       
  8347 +	}
       
  8348 +    }'
       
  8349 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  8350  # Check for a 64-bit object if we didn't find anything.
       
  8351 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  8352 -}'`; fi
       
  8353 +if test -z "$aix_libpath"; then
       
  8354 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  8355 +fi
       
  8356  else
       
  8357    echo "$as_me: failed program was:" >&5
       
  8358  sed 's/^/| /' conftest.$ac_ext >&5
       
  8359  
       
  8360  
       
  8361  fi
       
  8362  
       
  8363  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  8364 @@ -17124,21 +17669,28 @@ eval "echo \"\$as_me:$LINENO: $ac_try_ec
       
  8365    cat conftest.err >&5
       
  8366    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  8367    (exit $ac_status); } && {
       
  8368  	 test -z "$ac_c_werror_flag" ||
       
  8369  	 test ! -s conftest.err
       
  8370         } && test -s conftest$ac_exeext &&
       
  8371         $as_test_x conftest$ac_exeext; then
       
  8372  
       
  8373 -aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  8374 -}'`
       
  8375 +lt_aix_libpath_sed='
       
  8376 +    /Import File Strings/,/^$/ {
       
  8377 +	/^0/ {
       
  8378 +	    s/^0  *\(.*\)$/\1/
       
  8379 +	    p
       
  8380 +	}
       
  8381 +    }'
       
  8382 +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  8383  # Check for a 64-bit object if we didn't find anything.
       
  8384 -if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0  *\(.*\)$/\1/; p; }
       
  8385 -}'`; fi
       
  8386 +if test -z "$aix_libpath"; then
       
  8387 +  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
       
  8388 +fi
       
  8389  else
       
  8390    echo "$as_me: failed program was:" >&5
       
  8391  sed 's/^/| /' conftest.$ac_ext >&5
       
  8392  
       
  8393  
       
  8394  fi
       
  8395  
       
  8396  rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       
  8397 @@ -17182,17 +17734,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  8398        libext=lib
       
  8399        # Tell ltmain to make .dll files, not .so files.
       
  8400        shrext_cmds=".dll"
       
  8401        # FIXME: Setting linknames here is a bad hack.
       
  8402        archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
       
  8403        # The linker will automatically build a .lib file if we build a DLL.
       
  8404        old_archive_From_new_cmds_GCJ='true'
       
  8405        # FIXME: Should let the user specify the lib program.
       
  8406 -      old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
       
  8407 +      old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs'
       
  8408        fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
       
  8409        enable_shared_with_static_runtimes_GCJ=yes
       
  8410        ;;
       
  8411  
       
  8412      darwin* | rhapsody*)
       
  8413        case $host_os in
       
  8414          rhapsody* | darwin1.[012])
       
  8415           allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
       
  8416 @@ -17215,29 +17767,28 @@ if test -z "$aix_libpath"; then aix_libp
       
  8417        archive_cmds_need_lc_GCJ=no
       
  8418        hardcode_direct_GCJ=no
       
  8419        hardcode_automatic_GCJ=yes
       
  8420        hardcode_shlibpath_var_GCJ=unsupported
       
  8421        whole_archive_flag_spec_GCJ=''
       
  8422        link_all_deplibs_GCJ=yes
       
  8423      if test "$GCC" = yes ; then
       
  8424      	output_verbose_link_cmd='echo'
       
  8425 -        archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
       
  8426 -      module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  8427 -      # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  8428 -      archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  8429 -      module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  8430 +        archive_cmds_GCJ="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
       
  8431 +        module_cmds_GCJ="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
       
  8432 +        archive_expsym_cmds_GCJ="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
       
  8433 +        module_expsym_cmds_GCJ="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
       
  8434      else
       
  8435        case $cc_basename in
       
  8436          xlc*)
       
  8437           output_verbose_link_cmd='echo'
       
  8438 -         archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
       
  8439 +         archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
       
  8440           module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
       
  8441            # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
       
  8442 -         archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  8443 +         archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  8444            module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[    ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag  -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
       
  8445            ;;
       
  8446         *)
       
  8447           ld_shlibs_GCJ=no
       
  8448            ;;
       
  8449        esac
       
  8450      fi
       
  8451        ;;
       
  8452 @@ -17267,17 +17818,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  8453      freebsd2*)
       
  8454        archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  8455        hardcode_direct_GCJ=yes
       
  8456        hardcode_minus_L_GCJ=yes
       
  8457        hardcode_shlibpath_var_GCJ=no
       
  8458        ;;
       
  8459  
       
  8460      # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
       
  8461 -    freebsd* | kfreebsd*-gnu | dragonfly*)
       
  8462 +    freebsd* | dragonfly*)
       
  8463        archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
       
  8464        hardcode_libdir_flag_spec_GCJ='-R$libdir'
       
  8465        hardcode_direct_GCJ=yes
       
  8466        hardcode_shlibpath_var_GCJ=no
       
  8467        ;;
       
  8468  
       
  8469      hpux9*)
       
  8470        if test "$GCC" = yes; then
       
  8471 @@ -17389,34 +17940,38 @@ if test -z "$aix_libpath"; then aix_libp
       
  8472        archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       
  8473        hardcode_direct_GCJ=yes
       
  8474        hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
       
  8475        hardcode_libdir_separator_GCJ=:
       
  8476        hardcode_shlibpath_var_GCJ=no
       
  8477        ;;
       
  8478  
       
  8479      openbsd*)
       
  8480 -      hardcode_direct_GCJ=yes
       
  8481 -      hardcode_shlibpath_var_GCJ=no
       
  8482 -      if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  8483 -	archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  8484 -	archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
       
  8485 -	hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
       
  8486 -	export_dynamic_flag_spec_GCJ='${wl}-E'
       
  8487 -      else
       
  8488 -       case $host_os in
       
  8489 -	 openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
       
  8490 -	   archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  8491 -	   hardcode_libdir_flag_spec_GCJ='-R$libdir'
       
  8492 -	   ;;
       
  8493 -	 *)
       
  8494 -	   archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  8495 -	   hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
       
  8496 -	   ;;
       
  8497 -       esac
       
  8498 +      if test -f /usr/libexec/ld.so; then
       
  8499 +	hardcode_direct_GCJ=yes
       
  8500 +	hardcode_shlibpath_var_GCJ=no
       
  8501 +	if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
       
  8502 +	  archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  8503 +	  archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
       
  8504 +	  hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
       
  8505 +	  export_dynamic_flag_spec_GCJ='${wl}-E'
       
  8506 +	else
       
  8507 +	  case $host_os in
       
  8508 +	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
       
  8509 +	     archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
       
  8510 +	     hardcode_libdir_flag_spec_GCJ='-R$libdir'
       
  8511 +	     ;;
       
  8512 +	   *)
       
  8513 +	     archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       
  8514 +	     hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
       
  8515 +	     ;;
       
  8516 +	  esac
       
  8517 +        fi
       
  8518 +      else
       
  8519 +	ld_shlibs_GCJ=no
       
  8520        fi
       
  8521        ;;
       
  8522  
       
  8523      os2*)
       
  8524        hardcode_libdir_flag_spec_GCJ='-L$libdir'
       
  8525        hardcode_minus_L_GCJ=yes
       
  8526        allow_undefined_flag_GCJ=unsupported
       
  8527        archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
       
  8528 @@ -17465,27 +18020,26 @@ if test -z "$aix_libpath"; then aix_libp
       
  8529  	archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
       
  8530    	$LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
       
  8531        fi
       
  8532        hardcode_libdir_flag_spec_GCJ='-R$libdir'
       
  8533        hardcode_shlibpath_var_GCJ=no
       
  8534        case $host_os in
       
  8535        solaris2.[0-5] | solaris2.[0-5].*) ;;
       
  8536        *)
       
  8537 - 	# The compiler driver will combine linker options so we
       
  8538 - 	# cannot just pass the convience library names through
       
  8539 - 	# without $wl, iff we do not link with $LD.
       
  8540 - 	# Luckily, gcc supports the same syntax we need for Sun Studio.
       
  8541 +	# The compiler driver will combine and reorder linker options,
       
  8542 +	# but understands `-z linker_flag'.  GCC discards it without `$wl',
       
  8543 +	# but is careful enough not to reorder.
       
  8544   	# Supported since Solaris 2.6 (maybe 2.5.1?)
       
  8545 - 	case $wlarc in
       
  8546 - 	'')
       
  8547 - 	  whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
       
  8548 - 	*)
       
  8549 - 	  whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
       
  8550 - 	esac ;;
       
  8551 +	if test "$GCC" = yes; then
       
  8552 +	  whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
       
  8553 +	else
       
  8554 +	  whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract'
       
  8555 +	fi
       
  8556 +	;;
       
  8557        esac
       
  8558        link_all_deplibs_GCJ=yes
       
  8559        ;;
       
  8560  
       
  8561      sunos4*)
       
  8562        if test "x$host_vendor" = xsequent; then
       
  8563  	# Use $CC to link under sequent, because it throws in some extra .o
       
  8564  	# files that make .init and .fini sections work.
       
  8565 @@ -17532,17 +18086,17 @@ if test -z "$aix_libpath"; then aix_libp
       
  8566  	archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       
  8567  	hardcode_shlibpath_var_GCJ=no
       
  8568  	runpath_var=LD_RUN_PATH
       
  8569  	hardcode_runpath_var=yes
       
  8570  	ld_shlibs_GCJ=yes
       
  8571        fi
       
  8572        ;;
       
  8573  
       
  8574 -    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
       
  8575 +    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
       
  8576        no_undefined_flag_GCJ='${wl}-z,text'
       
  8577        archive_cmds_need_lc_GCJ=no
       
  8578        hardcode_shlibpath_var_GCJ=no
       
  8579        runpath_var='LD_RUN_PATH'
       
  8580  
       
  8581        if test "$GCC" = yes; then
       
  8582  	archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       
  8583  	archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       
  8584 @@ -17609,17 +18163,17 @@ x|xyes)
       
  8585        ;;
       
  8586      '$CC '*)
       
  8587        # Test whether the compiler implicitly links with -lc since on some
       
  8588        # systems, -lgcc has to come before -lc. If gcc already passes -lc
       
  8589        # to ld, don't add -lc before -lgcc.
       
  8590        { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
       
  8591  echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
       
  8592        $rm conftest*
       
  8593 -      printf "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  8594 +      echo "$lt_simple_compile_test_code" > conftest.$ac_ext
       
  8595  
       
  8596        if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
       
  8597    (eval $ac_compile) 2>&5
       
  8598    ac_status=$?
       
  8599    echo "$as_me:$LINENO: \$? = $ac_status" >&5
       
  8600    (exit $ac_status); } 2>conftest.err; then
       
  8601          soname=conftest
       
  8602          lib=conftest
       
  8603 @@ -17667,30 +18221,17 @@ postinstall_cmds=
       
  8604  postuninstall_cmds=
       
  8605  finish_cmds=
       
  8606  finish_eval=
       
  8607  shlibpath_var=
       
  8608  shlibpath_overrides_runpath=unknown
       
  8609  version_type=none
       
  8610  dynamic_linker="$host_os ld.so"
       
  8611  sys_lib_dlsearch_path_spec="/lib /usr/lib"
       
  8612 -if test "$GCC" = yes; then
       
  8613 -  sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
       
  8614 -  if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
       
  8615 -    # if the path contains ";" then we assume it to be the separator
       
  8616 -    # otherwise default to the standard path separator (i.e. ":") - it is
       
  8617 -    # assumed that no part of a normal pathname contains ";" but that should
       
  8618 -    # okay in the real world where ";" in dirpaths is itself problematic.
       
  8619 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
       
  8620 -  else
       
  8621 -    sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED  -e "s/$PATH_SEPARATOR/ /g"`
       
  8622 -  fi
       
  8623 -else
       
  8624 -  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
       
  8625 -fi
       
  8626 +
       
  8627  need_lib_prefix=unknown
       
  8628  hardcode_into_libs=no
       
  8629  
       
  8630  # when you set need_version to no, make sure it does not cause -set_version
       
  8631  # flags to be left without arguments
       
  8632  need_version=unknown
       
  8633  
       
  8634  case $host_os in
       
  8635 @@ -17698,17 +18239,17 @@ aix3*)
       
  8636    version_type=linux
       
  8637    library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
       
  8638    shlibpath_var=LIBPATH
       
  8639  
       
  8640    # AIX 3 has no versioning support, so we append a major version to the name.
       
  8641    soname_spec='${libname}${release}${shared_ext}$major'
       
  8642    ;;
       
  8643  
       
  8644 -aix4* | aix5*)
       
  8645 +aix[4-9]*)
       
  8646    version_type=linux
       
  8647    need_lib_prefix=no
       
  8648    need_version=no
       
  8649    hardcode_into_libs=yes
       
  8650    if test "$host_cpu" = ia64; then
       
  8651      # AIX 5 supports IA64
       
  8652      library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
       
  8653      shlibpath_var=LD_LIBRARY_PATH
       
  8654 @@ -17837,50 +18378,33 @@ darwin* | rhapsody*)
       
  8655    version_type=darwin
       
  8656    need_lib_prefix=no
       
  8657    need_version=no
       
  8658    library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
       
  8659    soname_spec='${libname}${release}${major}$shared_ext'
       
  8660    shlibpath_overrides_runpath=yes
       
  8661    shlibpath_var=DYLD_LIBRARY_PATH
       
  8662    shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
       
  8663 -  # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
       
  8664 -  if test "$GCC" = yes; then
       
  8665 -    sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
       
  8666 -  else
       
  8667 -    sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
       
  8668 -  fi
       
  8669 +
       
  8670    sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
       
  8671    ;;
       
  8672  
       
  8673  dgux*)
       
  8674    version_type=linux
       
  8675    need_lib_prefix=no
       
  8676    need_version=no
       
  8677    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
       
  8678    soname_spec='${libname}${release}${shared_ext}$major'
       
  8679    shlibpath_var=LD_LIBRARY_PATH
       
  8680    ;;
       
  8681  
       
  8682  freebsd1*)
       
  8683    dynamic_linker=no
       
  8684    ;;
       
  8685  
       
  8686 -kfreebsd*-gnu)
       
  8687 -  version_type=linux
       
  8688 -  need_lib_prefix=no
       
  8689 -  need_version=no
       
  8690 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  8691 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  8692 -  shlibpath_var=LD_LIBRARY_PATH
       
  8693 -  shlibpath_overrides_runpath=no
       
  8694 -  hardcode_into_libs=yes
       
  8695 -  dynamic_linker='GNU ld.so'
       
  8696 -  ;;
       
  8697 -
       
  8698  freebsd* | dragonfly*)
       
  8699    # DragonFly does not have aout.  When/if they implement a new
       
  8700    # versioning mechanism, adjust this.
       
  8701    if test -x /usr/bin/objformat; then
       
  8702      objformat=`/usr/bin/objformat`
       
  8703    else
       
  8704      case $host_os in
       
  8705      freebsd[123]*) objformat=aout ;;
       
  8706 @@ -17908,17 +18432,17 @@ freebsd* | dragonfly*)
       
  8707      shlibpath_overrides_runpath=yes
       
  8708      hardcode_into_libs=yes
       
  8709      ;;
       
  8710    freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
       
  8711    freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
       
  8712      shlibpath_overrides_runpath=no
       
  8713      hardcode_into_libs=yes
       
  8714      ;;
       
  8715 -  freebsd*) # from 4.6 on
       
  8716 +  *) # from 4.6 on, and DragonFly
       
  8717      shlibpath_overrides_runpath=yes
       
  8718      hardcode_into_libs=yes
       
  8719      ;;
       
  8720    esac
       
  8721    ;;
       
  8722  
       
  8723  gnu*)
       
  8724    version_type=linux
       
  8725 @@ -17971,17 +18495,17 @@ hpux9* | hpux10* | hpux11*)
       
  8726      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  8727      soname_spec='${libname}${release}${shared_ext}$major'
       
  8728      ;;
       
  8729    esac
       
  8730    # HP-UX runs *really* slowly unless shared libraries are mode 555.
       
  8731    postinstall_cmds='chmod 555 $lib'
       
  8732    ;;
       
  8733  
       
  8734 -interix3*)
       
  8735 +interix[3-9]*)
       
  8736    version_type=linux
       
  8737    need_lib_prefix=no
       
  8738    need_version=no
       
  8739    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  8740    soname_spec='${libname}${release}${shared_ext}$major'
       
  8741    dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
       
  8742    shlibpath_var=LD_LIBRARY_PATH
       
  8743    shlibpath_overrides_runpath=no
       
  8744 @@ -18026,57 +18550,45 @@ irix5* | irix6* | nonstopux*)
       
  8745    ;;
       
  8746  
       
  8747  # No shared lib support for Linux oldld, aout, or coff.
       
  8748  linux*oldld* | linux*aout* | linux*coff*)
       
  8749    dynamic_linker=no
       
  8750    ;;
       
  8751  
       
  8752  # This must be Linux ELF.
       
  8753 -linux*)
       
  8754 +linux* | k*bsd*-gnu)
       
  8755    version_type=linux
       
  8756    need_lib_prefix=no
       
  8757    need_version=no
       
  8758    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  8759    soname_spec='${libname}${release}${shared_ext}$major'
       
  8760    finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
       
  8761    shlibpath_var=LD_LIBRARY_PATH
       
  8762    shlibpath_overrides_runpath=no
       
  8763    # This implies no fast_install, which is unacceptable.
       
  8764    # Some rework will be needed to allow for fast_install
       
  8765    # before this can be enabled.
       
  8766    hardcode_into_libs=yes
       
  8767  
       
  8768    # Append ld.so.conf contents to the search path
       
  8769    if test -f /etc/ld.so.conf; then
       
  8770 -    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  8771 +    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ 	]*hwcap[ 	]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
       
  8772      sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
       
  8773    fi
       
  8774  
       
  8775    # We used to test for /lib/ld.so.1 and disable shared libraries on
       
  8776    # powerpc, because MkLinux only supported shared libraries with the
       
  8777    # GNU dynamic linker.  Since this was broken with cross compilers,
       
  8778    # most powerpc-linux boxes support dynamic linking these days and
       
  8779    # people can always --disable-shared, the test was removed, and we
       
  8780    # assume the GNU/Linux dynamic linker is in use.
       
  8781    dynamic_linker='GNU/Linux ld.so'
       
  8782    ;;
       
  8783  
       
  8784 -knetbsd*-gnu)
       
  8785 -  version_type=linux
       
  8786 -  need_lib_prefix=no
       
  8787 -  need_version=no
       
  8788 -  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
       
  8789 -  soname_spec='${libname}${release}${shared_ext}$major'
       
  8790 -  shlibpath_var=LD_LIBRARY_PATH
       
  8791 -  shlibpath_overrides_runpath=no
       
  8792 -  hardcode_into_libs=yes
       
  8793 -  dynamic_linker='GNU ld.so'
       
  8794 -  ;;
       
  8795 -
       
  8796  netbsd*)
       
  8797    version_type=sunos
       
  8798    need_lib_prefix=no
       
  8799    need_version=no
       
  8800    if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
       
  8801      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
       
  8802      finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
       
  8803      dynamic_linker='NetBSD (a.out) ld.so'
       
  8804 @@ -18148,16 +18660,20 @@ osf3* | osf4* | osf5*)
       
  8805    need_version=no
       
  8806    soname_spec='${libname}${release}${shared_ext}$major'
       
  8807    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  8808    shlibpath_var=LD_LIBRARY_PATH
       
  8809    sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
       
  8810    sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
       
  8811    ;;
       
  8812  
       
  8813 +rdos*)
       
  8814 +  dynamic_linker=no
       
  8815 +  ;;
       
  8816 +
       
  8817  solaris*)
       
  8818    version_type=linux
       
  8819    need_lib_prefix=no
       
  8820    need_version=no
       
  8821    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
       
  8822    soname_spec='${libname}${release}${shared_ext}$major'
       
  8823    shlibpath_var=LD_LIBRARY_PATH
       
  8824    shlibpath_overrides_runpath=yes
       
  8825 @@ -18244,16 +18760,31 @@ uts4*)
       
  8826  *)
       
  8827    dynamic_linker=no
       
  8828    ;;
       
  8829  esac
       
  8830  { echo "$as_me:$LINENO: result: $dynamic_linker" >&5
       
  8831  echo "${ECHO_T}$dynamic_linker" >&6; }
       
  8832  test "$dynamic_linker" = no && can_build_shared=no
       
  8833  
       
  8834 +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
       
  8835 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  8836 +else
       
  8837 +  lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"
       
  8838 +fi
       
  8839 +
       
  8840 +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
       
  8841 +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
       
  8842 +  echo $ECHO_N "(cached) $ECHO_C" >&6
       
  8843 +else
       
  8844 +  lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"
       
  8845 +fi
       
  8846 +
       
  8847 +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
       
  8848 +
       
  8849  variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
       
  8850  if test "$GCC" = yes; then
       
  8851    variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
       
  8852  fi
       
  8853  
       
  8854  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
       
  8855  echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
       
  8856  hardcode_action_GCJ=
       
  8857 @@ -18327,31 +18858,33 @@ if test -f "$ltmain"; then
       
  8858      enable_shared_with_static_runtimes_GCJ \
       
  8859      old_archive_cmds_GCJ \
       
  8860      old_archive_from_new_cmds_GCJ \
       
  8861      predep_objects_GCJ \
       
  8862      postdep_objects_GCJ \
       
  8863      predeps_GCJ \
       
  8864      postdeps_GCJ \
       
  8865      compiler_lib_search_path_GCJ \
       
  8866 +    compiler_lib_search_dirs_GCJ \
       
  8867      archive_cmds_GCJ \
       
  8868      archive_expsym_cmds_GCJ \
       
  8869      postinstall_cmds_GCJ \
       
  8870      postuninstall_cmds_GCJ \
       
  8871      old_archive_from_expsyms_cmds_GCJ \
       
  8872      allow_undefined_flag_GCJ \
       
  8873      no_undefined_flag_GCJ \
       
  8874      export_symbols_cmds_GCJ \
       
  8875      hardcode_libdir_flag_spec_GCJ \
       
  8876      hardcode_libdir_flag_spec_ld_GCJ \
       
  8877      hardcode_libdir_separator_GCJ \
       
  8878      hardcode_automatic_GCJ \
       
  8879      module_cmds_GCJ \
       
  8880      module_expsym_cmds_GCJ \
       
  8881      lt_cv_prog_compiler_c_o_GCJ \
       
  8882 +    fix_srcfile_path_GCJ \
       
  8883      exclude_expsyms_GCJ \
       
  8884      include_expsyms_GCJ; do
       
  8885  
       
  8886      case $var in
       
  8887      old_archive_cmds_GCJ | \
       
  8888      old_archive_from_new_cmds_GCJ | \
       
  8889      archive_cmds_GCJ | \
       
  8890      archive_expsym_cmds_GCJ | \
       
  8891 @@ -18574,16 +19107,20 @@ postdep_objects=$lt_postdep_objects_GCJ
       
  8892  # Dependencies to place before the objects being linked to create a
       
  8893  # shared library.
       
  8894  predeps=$lt_predeps_GCJ
       
  8895  
       
  8896  # Dependencies to place after the objects being linked to create a
       
  8897  # shared library.
       
  8898  postdeps=$lt_postdeps_GCJ
       
  8899  
       
  8900 +# The directories searched by this compiler when creating a shared
       
  8901 +# library
       
  8902 +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_GCJ
       
  8903 +
       
  8904  # The library search path used internally by the compiler when linking
       
  8905  # a shared library.
       
  8906  compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
       
  8907  
       
  8908  # Method to check whether dependent libraries are shared objects.
       
  8909  deplibs_check_method=$lt_deplibs_check_method
       
  8910  
       
  8911  # Command to use when deplibs_check_method == file_magic.
       
  8912 @@ -18662,17 +19199,17 @@ link_all_deplibs=$link_all_deplibs_GCJ
       
  8913  
       
  8914  # Compile-time system search path for libraries
       
  8915  sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
       
  8916  
       
  8917  # Run-time system search path for libraries
       
  8918  sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
       
  8919  
       
  8920  # Fix the shell variable \$srcfile for the compiler.
       
  8921 -fix_srcfile_path="$fix_srcfile_path_GCJ"
       
  8922 +fix_srcfile_path=$lt_fix_srcfile_path
       
  8923  
       
  8924  # Set to yes if exported symbols are required.
       
  8925  always_export_symbols=$always_export_symbols_GCJ
       
  8926  
       
  8927  # The commands to list exported symbols.
       
  8928  export_symbols_cmds=$lt_export_symbols_cmds_GCJ
       
  8929  
       
  8930  # The commands to extract the exported symbol list from a shared archive.
       
  8931 @@ -18719,17 +19256,17 @@ CC="$lt_save_CC"
       
  8932  # Source file extension for RC test sources.
       
  8933  ac_ext=rc
       
  8934  
       
  8935  # Object file extension for compiled RC test sources.
       
  8936  objext=o
       
  8937  objext_RC=$objext
       
  8938  
       
  8939  # Code to be used in simple compile tests
       
  8940 -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
       
  8941 +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
       
  8942  
       
  8943  # Code to be used in simple link tests
       
  8944  lt_simple_link_test_code="$lt_simple_compile_test_code"
       
  8945  
       
  8946  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
       
  8947  
       
  8948  # If no C compiler was specified, use CC.
       
  8949  LTCC=${LTCC-"$CC"}
       
  8950 @@ -18738,26 +19275,26 @@ LTCC=${LTCC-"$CC"}
       
  8951  LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
       
  8952  
       
  8953  # Allow CC to be a program name with arguments.
       
  8954  compiler=$CC
       
  8955  
       
  8956  
       
  8957  # save warnings/boilerplate of simple test code
       
  8958  ac_outfile=conftest.$ac_objext
       
  8959 -printf "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  8960 +echo "$lt_simple_compile_test_code" >conftest.$ac_ext
       
  8961  eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  8962  _lt_compiler_boilerplate=`cat conftest.err`
       
  8963  $rm conftest*
       
  8964  
       
  8965  ac_outfile=conftest.$ac_objext
       
  8966 -printf "$lt_simple_link_test_code" >conftest.$ac_ext
       
  8967 +echo "$lt_simple_link_test_code" >conftest.$ac_ext
       
  8968  eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
       
  8969  _lt_linker_boilerplate=`cat conftest.err`
       
  8970 -$rm conftest*
       
  8971 +$rm -r conftest*
       
  8972  
       
  8973  
       
  8974  # Allow CC to be a program name with arguments.
       
  8975  lt_save_CC="$CC"
       
  8976  CC=${RC-"windres"}
       
  8977  compiler=$CC
       
  8978  compiler_RC=$CC
       
  8979  for cc_temp in $compiler""; do
       
  8980 @@ -18807,31 +19344,33 @@ if test -f "$ltmain"; then
       
  8981      enable_shared_with_static_runtimes_RC \
       
  8982      old_archive_cmds_RC \
       
  8983      old_archive_from_new_cmds_RC \
       
  8984      predep_objects_RC \
       
  8985      postdep_objects_RC \
       
  8986      predeps_RC \
       
  8987      postdeps_RC \
       
  8988      compiler_lib_search_path_RC \
       
  8989 +    compiler_lib_search_dirs_RC \
       
  8990      archive_cmds_RC \
       
  8991      archive_expsym_cmds_RC \
       
  8992      postinstall_cmds_RC \
       
  8993      postuninstall_cmds_RC \
       
  8994      old_archive_from_expsyms_cmds_RC \
       
  8995      allow_undefined_flag_RC \
       
  8996      no_undefined_flag_RC \
       
  8997      export_symbols_cmds_RC \
       
  8998      hardcode_libdir_flag_spec_RC \
       
  8999      hardcode_libdir_flag_spec_ld_RC \
       
  9000      hardcode_libdir_separator_RC \
       
  9001      hardcode_automatic_RC \
       
  9002      module_cmds_RC \
       
  9003      module_expsym_cmds_RC \
       
  9004      lt_cv_prog_compiler_c_o_RC \
       
  9005 +    fix_srcfile_path_RC \
       
  9006      exclude_expsyms_RC \
       
  9007      include_expsyms_RC; do
       
  9008  
       
  9009      case $var in
       
  9010      old_archive_cmds_RC | \
       
  9011      old_archive_from_new_cmds_RC | \
       
  9012      archive_cmds_RC | \
       
  9013      archive_expsym_cmds_RC | \
       
  9014 @@ -19054,16 +19593,20 @@ postdep_objects=$lt_postdep_objects_RC
       
  9015  # Dependencies to place before the objects being linked to create a
       
  9016  # shared library.
       
  9017  predeps=$lt_predeps_RC
       
  9018  
       
  9019  # Dependencies to place after the objects being linked to create a
       
  9020  # shared library.
       
  9021  postdeps=$lt_postdeps_RC
       
  9022  
       
  9023 +# The directories searched by this compiler when creating a shared
       
  9024 +# library
       
  9025 +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC
       
  9026 +
       
  9027  # The library search path used internally by the compiler when linking
       
  9028  # a shared library.
       
  9029  compiler_lib_search_path=$lt_compiler_lib_search_path_RC
       
  9030  
       
  9031  # Method to check whether dependent libraries are shared objects.
       
  9032  deplibs_check_method=$lt_deplibs_check_method
       
  9033  
       
  9034  # Command to use when deplibs_check_method == file_magic.
       
  9035 @@ -19142,17 +19685,17 @@ link_all_deplibs=$link_all_deplibs_RC
       
  9036  
       
  9037  # Compile-time system search path for libraries
       
  9038  sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
       
  9039  
       
  9040  # Run-time system search path for libraries
       
  9041  sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
       
  9042  
       
  9043  # Fix the shell variable \$srcfile for the compiler.
       
  9044 -fix_srcfile_path="$fix_srcfile_path_RC"
       
  9045 +fix_srcfile_path=$lt_fix_srcfile_path
       
  9046  
       
  9047  # Set to yes if exported symbols are required.
       
  9048  always_export_symbols=$always_export_symbols_RC
       
  9049  
       
  9050  # The commands to list exported symbols.
       
  9051  export_symbols_cmds=$lt_export_symbols_cmds_RC
       
  9052  
       
  9053  # The commands to extract the exported symbol list from a shared archive.
       
  9054 @@ -20194,23 +20737,23 @@ am__fastdepCXX_FALSE!$am__fastdepCXX_FAL
       
  9055  build!$build$ac_delim
       
  9056  build_cpu!$build_cpu$ac_delim
       
  9057  build_vendor!$build_vendor$ac_delim
       
  9058  build_os!$build_os$ac_delim
       
  9059  host!$host$ac_delim
       
  9060  host_cpu!$host_cpu$ac_delim
       
  9061  host_vendor!$host_vendor$ac_delim
       
  9062  host_os!$host_os$ac_delim
       
  9063 +SED!$SED$ac_delim
       
  9064  GREP!$GREP$ac_delim
       
  9065  EGREP!$EGREP$ac_delim
       
  9066  LN_S!$LN_S$ac_delim
       
  9067  ECHO!$ECHO$ac_delim
       
  9068  AR!$AR$ac_delim
       
  9069  RANLIB!$RANLIB$ac_delim
       
  9070 -CXXCPP!$CXXCPP$ac_delim
       
  9071  _ACEOF
       
  9072  
       
  9073    if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
       
  9074      break
       
  9075    elif $ac_last_try; then
       
  9076      { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
       
  9077  echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
       
  9078     { (exit 1); exit 1; }; }
       
  9079 @@ -20242,28 +20785,31 @@ rm -f conf$$subs.sed
       
  9080  cat >>$CONFIG_STATUS <<_ACEOF
       
  9081  CEOF$ac_eof
       
  9082  _ACEOF
       
  9083  
       
  9084  
       
  9085  ac_delim='%!_!# '
       
  9086  for ac_last_try in false false false false false :; do
       
  9087    cat >conf$$subs.sed <<_ACEOF
       
  9088 +DSYMUTIL!$DSYMUTIL$ac_delim
       
  9089 +NMEDIT!$NMEDIT$ac_delim
       
  9090 +CXXCPP!$CXXCPP$ac_delim
       
  9091  F77!$F77$ac_delim
       
  9092  FFLAGS!$FFLAGS$ac_delim
       
  9093  ac_ct_F77!$ac_ct_F77$ac_delim
       
  9094  LIBTOOL!$LIBTOOL$ac_delim
       
  9095  LIBTOOL_DEPS!$LIBTOOL_DEPS$ac_delim
       
  9096  SELFTEST_TRUE!$SELFTEST_TRUE$ac_delim
       
  9097  SELFTEST_FALSE!$SELFTEST_FALSE$ac_delim
       
  9098  LIBOBJS!$LIBOBJS$ac_delim
       
  9099  LTLIBOBJS!$LTLIBOBJS$ac_delim
       
  9100  _ACEOF
       
  9101  
       
  9102 -  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 9; then
       
  9103 +  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 12; then
       
  9104      break
       
  9105    elif $ac_last_try; then
       
  9106      { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
       
  9107  echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
       
  9108     { (exit 1); exit 1; }; }
       
  9109    else
       
  9110      ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
       
  9111    fi
       
  9112 diff --git a/toolkit/crashreporter/google-breakpad/src/breakpad_googletest_includes.h b/toolkit/crashreporter/google-breakpad/src/breakpad_googletest_includes.h
       
  9113 new file mode 100644
       
  9114 --- /dev/null
       
  9115 +++ b/toolkit/crashreporter/google-breakpad/src/breakpad_googletest_includes.h
       
  9116 @@ -0,0 +1,36 @@
       
  9117 +// Copyright (c) 2009, Google Inc.
       
  9118 +// All rights reserved.
       
  9119 +//
       
  9120 +// Redistribution and use in source and binary forms, with or without
       
  9121 +// modification, are permitted provided that the following conditions are
       
  9122 +// met:
       
  9123 +//
       
  9124 +//     * Redistributions of source code must retain the above copyright
       
  9125 +// notice, this list of conditions and the following disclaimer.
       
  9126 +//     * Redistributions in binary form must reproduce the above
       
  9127 +// copyright notice, this list of conditions and the following disclaimer
       
  9128 +// in the documentation and/or other materials provided with the
       
  9129 +// distribution.
       
  9130 +//     * Neither the name of Google Inc. nor the names of its
       
  9131 +// contributors may be used to endorse or promote products derived from
       
  9132 +// this software without specific prior written permission.
       
  9133 +//
       
  9134 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
  9135 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
  9136 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
  9137 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
  9138 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
  9139 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
  9140 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
  9141 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
  9142 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
  9143 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
  9144 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
  9145 +
       
  9146 +#ifndef BREAKPAD_GOOGLETEST_INCLUDES_H__
       
  9147 +#define BREAKPAD_GOOGLETEST_INCLUDES_H__
       
  9148 +
       
  9149 +#include "testing/gtest/include/gtest/gtest.h"
       
  9150 +#include "testing/include/gmock/gmock.h"
       
  9151 +
       
  9152 +#endif  // BREAKPAD_GOOGLETEST_INCLUDES_H__
       
  9153 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/data/linux-gate-amd.sym b/toolkit/crashreporter/google-breakpad/src/client/linux/data/linux-gate-amd.sym
       
  9154 new file mode 100644
       
  9155 --- /dev/null
       
  9156 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/data/linux-gate-amd.sym
       
  9157 @@ -0,0 +1,3 @@
       
  9158 +MODULE Linux x86 B8CFDE93002D54DA1900A40AA1BD67690 linux-gate.so
       
  9159 +PUBLIC 400 0 __kernel_vsyscall
       
  9160 +STACK WIN 4 400 100 1 1 0 0 0 0 0 1
       
  9161 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/data/linux-gate-intel.sym b/toolkit/crashreporter/google-breakpad/src/client/linux/data/linux-gate-intel.sym
       
  9162 new file mode 100644
       
  9163 --- /dev/null
       
  9164 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/data/linux-gate-intel.sym
       
  9165 @@ -0,0 +1,3 @@
       
  9166 +MODULE Linux x86 4FBDA58B5A1DF5A379E3CF19A235EA090 linux-gate.so
       
  9167 +PUBLIC 400 0 __kernel_vsyscall
       
  9168 +STACK WIN 4 400 200 3 3 0 0 0 0 0 1
       
  9169 \ No newline at end of file
       
  9170 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile.in b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile.in
       
  9171 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile.in
       
  9172 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile.in
       
  9173 @@ -44,17 +44,15 @@ include $(DEPTH)/config/autoconf.mk
       
  9174  MODULE		= handler
       
  9175  LIBRARY_NAME	= exception_handler_s
       
  9176  XPI_NAME 	= crashreporter
       
  9177  
       
  9178  LOCAL_INCLUDES 	= -I$(srcdir)/../../..
       
  9179  
       
  9180  CPPSRCS	= \
       
  9181    exception_handler.cc \
       
  9182 -  minidump_generator.cc \
       
  9183 -  linux_thread.cc \
       
  9184    $(NULL)
       
  9185  
       
  9186  # need static lib
       
  9187  FORCE_STATIC_LIB = 1
       
  9188  FORCE_USE_PIC = 1
       
  9189  
       
  9190  include $(topsrcdir)/config/rules.mk
       
  9191 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.cc
       
  9192 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.cc
       
  9193 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.cc
       
  9194 @@ -1,13 +1,11 @@
       
  9195 -// Copyright (c) 2006, Google Inc.
       
  9196 +// Copyright (c) 2009, Google Inc.
       
  9197  // All rights reserved.
       
  9198  //
       
  9199 -// Author: Li Liu
       
  9200 -//
       
  9201  // Redistribution and use in source and binary forms, with or without
       
  9202  // modification, are permitted provided that the following conditions are
       
  9203  // met:
       
  9204  //
       
  9205  //     * Redistributions of source code must retain the above copyright
       
  9206  // notice, this list of conditions and the following disclaimer.
       
  9207  //     * Redistributions in binary form must reproduce the above
       
  9208  // copyright notice, this list of conditions and the following disclaimer
       
  9209 @@ -24,244 +22,178 @@
       
  9210  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
  9211  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
  9212  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
  9213  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
  9214  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
  9215  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
  9216  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
  9217  
       
  9218 -#include <signal.h>
       
  9219 -#include <sys/stat.h>
       
  9220 -#include <sys/types.h>
       
  9221 -#include <unistd.h>
       
  9222 -#include <stdio.h>
       
  9223 +// The ExceptionHandler object installs signal handlers for a number of
       
  9224 +// signals. We rely on the signal handler running on the thread which crashed
       
  9225 +// in order to identify it. This is true of the synchronous signals (SEGV etc),
       
  9226 +// but not true of ABRT. Thus, if you send ABRT to yourself in a program which
       
  9227 +// uses ExceptionHandler, you need to use tgkill to direct it to the current
       
  9228 +// thread.
       
  9229 +//
       
  9230 +// The signal flow looks like this:
       
  9231 +//
       
  9232 +//   SignalHandler (uses a global stack of ExceptionHandler objects to find
       
  9233 +//        |         one to handle the signal. If the first rejects it, try
       
  9234 +//        |         the second etc...)
       
  9235 +//        V
       
  9236 +//   HandleSignal ----------------------------| (clones a new process which
       
  9237 +//        |                                   |  shares an address space with
       
  9238 +//   (wait for cloned                         |  the crashed process. This
       
  9239 +//     process)                               |  allows us to ptrace the crashed
       
  9240 +//        |                                   |  process)
       
  9241 +//        V                                   V
       
  9242 +//   (set signal handler to             ThreadEntry (static function to bounce
       
  9243 +//    SIG_DFL and rethrow,                    |      back into the object)
       
  9244 +//    killing the crashed                     |
       
  9245 +//    process)                                V
       
  9246 +//                                          DoDump  (writes minidump)
       
  9247 +//                                            |
       
  9248 +//                                            V
       
  9249 +//                                         sys_exit
       
  9250 +//
       
  9251  
       
  9252 -#include <cassert>
       
  9253 -#include <cstdlib>
       
  9254 -#include <ctime>
       
  9255 -#include <linux/limits.h>
       
  9256 +// This code is a little fragmented. Different functions of the ExceptionHandler
       
  9257 +// class run in a number of different contexts. Some of them run in a normal
       
  9258 +// context and are easy to code, others run in a compromised context and the
       
  9259 +// restrictions at the top of minidump_writer.cc apply: no libc and use the
       
  9260 +// alternative malloc. Each function should have comment above it detailing the
       
  9261 +// context which it runs in.
       
  9262  
       
  9263  #include "client/linux/handler/exception_handler.h"
       
  9264 +
       
  9265 +#include <errno.h>
       
  9266 +#include <fcntl.h>
       
  9267 +#include <linux/limits.h>
       
  9268 +#include <sched.h>
       
  9269 +#include <signal.h>
       
  9270 +#include <stdio.h>
       
  9271 +#include <sys/mman.h>
       
  9272 +#include <sys/signal.h>
       
  9273 +#include <sys/syscall.h>
       
  9274 +#include <sys/ucontext.h>
       
  9275 +#include <sys/user.h>
       
  9276 +#include <sys/wait.h>
       
  9277 +#include <ucontext.h>
       
  9278 +#include <unistd.h>
       
  9279 +
       
  9280 +#include "common/linux/linux_libc_support.h"
       
  9281 +#include "common/linux/linux_syscall_support.h"
       
  9282 +#include "common/linux/memory.h"
       
  9283 +#include "client/linux/minidump_writer/minidump_writer.h"
       
  9284  #include "common/linux/guid_creator.h"
       
  9285 -#include "google_breakpad/common/minidump_format.h"
       
  9286 +
       
  9287 +// A wrapper for the tgkill syscall: send a signal to a specific thread.
       
  9288 +static int tgkill(pid_t tgid, pid_t tid, int sig) {
       
  9289 +  syscall(__NR_tgkill, tgid, tid, sig);
       
  9290 +  return 0;
       
  9291 +}
       
  9292  
       
  9293  namespace google_breakpad {
       
  9294  
       
  9295 -// Signals that we are interested.
       
  9296 -int SigTable[] = {
       
  9297 -#if defined(SIGSEGV)
       
  9298 -  SIGSEGV,
       
  9299 -#endif
       
  9300 -#ifdef SIGABRT
       
  9301 -  SIGABRT,
       
  9302 -#endif
       
  9303 -#ifdef SIGFPE
       
  9304 -  SIGFPE,
       
  9305 -#endif
       
  9306 -#ifdef SIGILL
       
  9307 -  SIGILL,
       
  9308 -#endif
       
  9309 -#ifdef SIGBUS
       
  9310 -  SIGBUS,
       
  9311 -#endif
       
  9312 +// The list of signals which we consider to be crashes. The default action for
       
  9313 +// all these signals must be Core (see man 7 signal) because we rethrow the
       
  9314 +// signal after handling it and expect that it'll be fatal.
       
  9315 +static const int kExceptionSignals[] = {
       
  9316 +  SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS, -1
       
  9317  };
       
  9318  
       
  9319 -std::vector<ExceptionHandler*> *ExceptionHandler::handler_stack_ = NULL;
       
  9320 -int ExceptionHandler::handler_stack_index_ = 0;
       
  9321 +// We can stack multiple exception handlers. In that case, this is the global
       
  9322 +// which holds the stack.
       
  9323 +std::vector<ExceptionHandler*>* ExceptionHandler::handler_stack_ = NULL;
       
  9324 +unsigned ExceptionHandler::handler_stack_index_ = 0;
       
  9325  pthread_mutex_t ExceptionHandler::handler_stack_mutex_ =
       
  9326 -PTHREAD_MUTEX_INITIALIZER;
       
  9327 +    PTHREAD_MUTEX_INITIALIZER;
       
  9328  
       
  9329 -ExceptionHandler::ExceptionHandler(const string &dump_path,
       
  9330 +// Runs before crashing: normal context.
       
  9331 +ExceptionHandler::ExceptionHandler(const std::string &dump_path,
       
  9332                                     FilterCallback filter,
       
  9333                                     MinidumpCallback callback,
       
  9334                                     void *callback_context,
       
  9335                                     bool install_handler)
       
  9336      : filter_(filter),
       
  9337        callback_(callback),
       
  9338        callback_context_(callback_context),
       
  9339        dump_path_(),
       
  9340 -      installed_handler_(install_handler) {
       
  9341 +      handler_installed_(install_handler),
       
  9342 +      crash_handler_(NULL) {
       
  9343    set_dump_path(dump_path);
       
  9344  
       
  9345    if (install_handler) {
       
  9346 -    SetupHandler();
       
  9347 +    InstallHandlers();
       
  9348 +
       
  9349      pthread_mutex_lock(&handler_stack_mutex_);
       
  9350 -    if (handler_stack_ == NULL)
       
  9351 -      handler_stack_ = new std::vector<ExceptionHandler *>;
       
  9352 -    handler_stack_->push_back(this);
       
  9353 +      if (handler_stack_ == NULL)
       
  9354 +        handler_stack_ = new std::vector<ExceptionHandler *>;
       
  9355 +      handler_stack_->push_back(this);
       
  9356      pthread_mutex_unlock(&handler_stack_mutex_);
       
  9357    }
       
  9358  }
       
  9359  
       
  9360 +// Runs before crashing: normal context.
       
  9361  ExceptionHandler::~ExceptionHandler() {
       
  9362 -  TeardownAllHandler();
       
  9363 -  pthread_mutex_lock(&handler_stack_mutex_);
       
  9364 -  if (handler_stack_->back() == this) {
       
  9365 -    handler_stack_->pop_back();
       
  9366 -  } else {
       
  9367 -    fprintf(stderr, "warning: removing Breakpad handler out of order\n");
       
  9368 -    for (std::vector<ExceptionHandler *>::iterator iterator =
       
  9369 -         handler_stack_->begin();
       
  9370 -         iterator != handler_stack_->end();
       
  9371 -         ++iterator) {
       
  9372 -      if (*iterator == this) {
       
  9373 -        handler_stack_->erase(iterator);
       
  9374 -      }
       
  9375 -    }
       
  9376 +  UninstallHandlers();
       
  9377 +}
       
  9378 +
       
  9379 +// Runs before crashing: normal context.
       
  9380 +bool ExceptionHandler::InstallHandlers() {
       
  9381 +  // We run the signal handlers on an alternative stack because we might have
       
  9382 +  // crashed because of a stack overflow.
       
  9383 +
       
  9384 +  // We use this value rather than SIGSTKSZ because we would end up overrunning
       
  9385 +  // such a small stack.
       
  9386 +  static const unsigned kSigStackSize = 8192;
       
  9387 +
       
  9388 +  signal_stack = malloc(kSigStackSize);
       
  9389 +  stack_t stack;
       
  9390 +  memset(&stack, 0, sizeof(stack));
       
  9391 +  stack.ss_sp = signal_stack;
       
  9392 +  stack.ss_size = kSigStackSize;
       
  9393 +
       
  9394 +  if (sigaltstack(&stack, NULL) == -1)
       
  9395 +    return false;
       
  9396 +
       
  9397 +  struct sigaction sa;
       
  9398 +  memset(&sa, 0, sizeof(sa));
       
  9399 +  sigemptyset(&sa.sa_mask);
       
  9400 +
       
  9401 +  // mask all exception signals when we're handling one of them.
       
  9402 +  for (unsigned i = 0; kExceptionSignals[i] != -1; ++i)
       
  9403 +    sigaddset(&sa.sa_mask, kExceptionSignals[i]);
       
  9404 +
       
  9405 +  sa.sa_sigaction = SignalHandler;
       
  9406 +  sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
       
  9407 +
       
  9408 +  for (unsigned i = 0; kExceptionSignals[i] != -1; ++i) {
       
  9409 +    struct sigaction* old = new struct sigaction;
       
  9410 +    if (sigaction(kExceptionSignals[i], &sa, old) == -1)
       
  9411 +      return false;
       
  9412 +    old_handlers_.push_back(std::make_pair(kExceptionSignals[i], old));
       
  9413 +  }
       
  9414 +  return true;
       
  9415 +}
       
  9416 +
       
  9417 +// Runs before crashing: normal context.
       
  9418 +void ExceptionHandler::UninstallHandlers() {
       
  9419 +  for (unsigned i = 0; i < old_handlers_.size(); ++i) {
       
  9420 +    struct sigaction *action =
       
  9421 +        reinterpret_cast<struct sigaction*>(old_handlers_[i].second);
       
  9422 +    sigaction(old_handlers_[i].first, action, NULL);
       
  9423 +    delete action;
       
  9424    }
       
  9425  
       
  9426 -  if (handler_stack_->empty()) {
       
  9427 -    // When destroying the last ExceptionHandler that installed a handler,
       
  9428 -    // clean up the handler stack.
       
  9429 -    delete handler_stack_;
       
  9430 -    handler_stack_ = NULL;
       
  9431 -  }
       
  9432 -  pthread_mutex_unlock(&handler_stack_mutex_);
       
  9433 +  old_handlers_.clear();
       
  9434  }
       
  9435  
       
  9436 -bool ExceptionHandler::WriteMinidump() {
       
  9437 -  bool success = InternalWriteMinidump(0, 0, NULL);
       
  9438 -  UpdateNextID();
       
  9439 -  return success;
       
  9440 -}
       
  9441 -
       
  9442 -// static
       
  9443 -bool ExceptionHandler::WriteMinidump(const string &dump_path,
       
  9444 -                   MinidumpCallback callback,
       
  9445 -                   void *callback_context) {
       
  9446 -  ExceptionHandler handler(dump_path, NULL, callback,
       
  9447 -                           callback_context, false);
       
  9448 -  return handler.InternalWriteMinidump(0, 0, NULL);
       
  9449 -}
       
  9450 -
       
  9451 -void ExceptionHandler::SetupHandler() {
       
  9452 -  // Signal on a different stack to avoid using the stack
       
  9453 -  // of the crashing thread.
       
  9454 -  struct sigaltstack sig_stack;
       
  9455 -  sig_stack.ss_sp = malloc(MINSIGSTKSZ);
       
  9456 -  if (sig_stack.ss_sp == NULL)
       
  9457 -    return;
       
  9458 -  sig_stack.ss_size = MINSIGSTKSZ;
       
  9459 -  sig_stack.ss_flags = 0;
       
  9460 -
       
  9461 -  if (sigaltstack(&sig_stack, NULL) < 0)
       
  9462 -    return;
       
  9463 -  for (size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i)
       
  9464 -    SetupHandler(SigTable[i]);
       
  9465 -}
       
  9466 -
       
  9467 -void ExceptionHandler::SetupHandler(int signo) {
       
  9468 -  struct sigaction act, old_act;
       
  9469 -  act.sa_handler = HandleException;
       
  9470 -  act.sa_flags = SA_ONSTACK;
       
  9471 -  if (sigaction(signo, &act, &old_act) < 0)
       
  9472 -    return;
       
  9473 -  old_handlers_[signo] = old_act.sa_handler;
       
  9474 -}
       
  9475 -
       
  9476 -void ExceptionHandler::TeardownHandler(int signo) {
       
  9477 -  if (old_handlers_.find(signo) != old_handlers_.end()) {
       
  9478 -    struct sigaction act;
       
  9479 -    act.sa_handler = old_handlers_[signo];
       
  9480 -    act.sa_flags = 0;
       
  9481 -    sigaction(signo, &act, 0);
       
  9482 -  }
       
  9483 -}
       
  9484 -
       
  9485 -void ExceptionHandler::TeardownAllHandler() {
       
  9486 -  for (size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i) {
       
  9487 -    TeardownHandler(SigTable[i]);
       
  9488 -  }
       
  9489 -}
       
  9490 -
       
  9491 -// static
       
  9492 -void ExceptionHandler::HandleException(int signo) {
       
  9493 -  // In Linux, the context information about the signal is put on the stack of
       
  9494 -  // the signal handler frame as value parameter. For some reasons, the
       
  9495 -  // prototype of the handler doesn't declare this information as parameter, we
       
  9496 -  // will do it by hand. It is the second parameter above the signal number.
       
  9497 -  // However, if we are being called by another signal handler passing the
       
  9498 -  // signal up the chain, then we may not have this random extra parameter,
       
  9499 -  // so we may have to walk the stack to find it.  We do the actual work
       
  9500 -  // on another thread, where it's a little safer, but we want the ebp
       
  9501 -  // from this frame to find it.
       
  9502 -  uintptr_t current_ebp = 0;
       
  9503 -  asm volatile ("movl %%ebp, %0"
       
  9504 -                :"=m"(current_ebp));
       
  9505 -
       
  9506 -  pthread_mutex_lock(&handler_stack_mutex_);
       
  9507 -  ExceptionHandler *current_handler =
       
  9508 -    handler_stack_->at(handler_stack_->size() - ++handler_stack_index_);
       
  9509 -  pthread_mutex_unlock(&handler_stack_mutex_);
       
  9510 -
       
  9511 -  // Restore original handler.
       
  9512 -  current_handler->TeardownHandler(signo);
       
  9513 -
       
  9514 -  struct sigcontext *sig_ctx = NULL;
       
  9515 -  if (current_handler->InternalWriteMinidump(signo, current_ebp, &sig_ctx)) {
       
  9516 -    // Fully handled this exception, safe to exit.
       
  9517 -    exit(EXIT_FAILURE);
       
  9518 -  } else {
       
  9519 -    // Exception not fully handled, will call the next handler in stack to
       
  9520 -    // process it.
       
  9521 -    typedef void (*SignalHandler)(int signo, struct sigcontext);
       
  9522 -    SignalHandler old_handler =
       
  9523 -      reinterpret_cast<SignalHandler>(current_handler->old_handlers_[signo]);
       
  9524 -    if (old_handler != NULL && sig_ctx != NULL)
       
  9525 -      old_handler(signo, *sig_ctx);
       
  9526 -  }
       
  9527 -
       
  9528 -  pthread_mutex_lock(&handler_stack_mutex_);
       
  9529 -  current_handler->SetupHandler(signo);
       
  9530 -  --handler_stack_index_;
       
  9531 -  // All the handlers in stack have been invoked to handle the exception,
       
  9532 -  // normally the process should be terminated and should not reach here.
       
  9533 -  // In case we got here, ask the OS to handle it to avoid endless loop,
       
  9534 -  // normally the OS will generate a core and termiate the process. This
       
  9535 -  // may be desired to debug the program.
       
  9536 -  if (handler_stack_index_ == 0)
       
  9537 -    signal(signo, SIG_DFL);
       
  9538 -  pthread_mutex_unlock(&handler_stack_mutex_);
       
  9539 -}
       
  9540 -
       
  9541 -bool ExceptionHandler::InternalWriteMinidump(int signo,
       
  9542 -                                             uintptr_t sighandler_ebp,
       
  9543 -                                             struct sigcontext **sig_ctx) {
       
  9544 -  if (filter_ && !filter_(callback_context_))
       
  9545 -    return false;
       
  9546 -
       
  9547 -  bool success = false;
       
  9548 -  // Block all the signals we want to process when writting minidump.
       
  9549 -  // We don't want it to be interrupted.
       
  9550 -  sigset_t sig_blocked, sig_old;
       
  9551 -  bool blocked = true;
       
  9552 -  sigfillset(&sig_blocked);
       
  9553 -  for (size_t i = 0; i < sizeof(SigTable) / sizeof(SigTable[0]); ++i)
       
  9554 -    sigdelset(&sig_blocked, SigTable[i]);
       
  9555 -  if (sigprocmask(SIG_BLOCK, &sig_blocked, &sig_old) != 0) {
       
  9556 -    blocked = false;
       
  9557 -    fprintf(stderr, "google_breakpad::ExceptionHandler::HandleException: "
       
  9558 -                    "failed to block signals.\n");
       
  9559 -  }
       
  9560 -
       
  9561 -  success = minidump_generator_.WriteMinidumpToFile(
       
  9562 -                     next_minidump_path_c_, signo, sighandler_ebp, sig_ctx);
       
  9563 -
       
  9564 -  // Unblock the signals.
       
  9565 -  if (blocked) {
       
  9566 -    sigprocmask(SIG_SETMASK, &sig_old, &sig_old);
       
  9567 -  }
       
  9568 -
       
  9569 -  if (callback_)
       
  9570 -    success = callback_(dump_path_c_, next_minidump_id_c_,
       
  9571 -                          callback_context_, success);
       
  9572 -  return success;
       
  9573 -}
       
  9574 -
       
  9575 +// Runs before crashing: normal context.
       
  9576  void ExceptionHandler::UpdateNextID() {
       
  9577    GUID guid;
       
  9578    char guid_str[kGUIDStringLength + 1];
       
  9579    if (CreateGUID(&guid) && GUIDToString(&guid, guid_str, sizeof(guid_str))) {
       
  9580      next_minidump_id_ = guid_str;
       
  9581      next_minidump_id_c_ = next_minidump_id_.c_str();
       
  9582  
       
  9583      char minidump_path[PATH_MAX];
       
  9584 @@ -269,9 +201,155 @@ void ExceptionHandler::UpdateNextID() {
       
  9585               dump_path_c_,
       
  9586               guid_str);
       
  9587  
       
  9588      next_minidump_path_ = minidump_path;
       
  9589      next_minidump_path_c_ = next_minidump_path_.c_str();
       
  9590    }
       
  9591  }
       
  9592  
       
  9593 +// This function runs in a compromised context: see the top of the file.
       
  9594 +// Runs on the crashing thread.
       
  9595 +// static
       
  9596 +void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) {
       
  9597 +  // All the exception signals are blocked at this point.
       
  9598 +
       
  9599 +  pthread_mutex_lock(&handler_stack_mutex_);
       
  9600 +
       
  9601 +  if (!handler_stack_->size()) {
       
  9602 +    pthread_mutex_unlock(&handler_stack_mutex_);
       
  9603 +    return;
       
  9604 +  }
       
  9605 +
       
  9606 +  for (int i = handler_stack_->size() - 1; i >= 0; --i) {
       
  9607 +    if ((*handler_stack_)[i]->HandleSignal(sig, info, uc)) {
       
  9608 +      // successfully handled: We are in an invalid state since an exception
       
  9609 +      // signal has been delivered. We don't call the exit handlers because
       
  9610 +      // they could end up corrupting on-disk state.
       
  9611 +      break;
       
  9612 +    }
       
  9613 +  }
       
  9614 +
       
  9615 +  pthread_mutex_unlock(&handler_stack_mutex_);
       
  9616 +
       
  9617 +  // Terminate ourselves with the same signal so that our parent knows that we
       
  9618 +  // crashed. The default action for all the signals which we catch is Core, so
       
  9619 +  // this is the end of us.
       
  9620 +  signal(sig, SIG_DFL);
       
  9621 +  tgkill(getpid(), sys_gettid(), sig);
       
  9622 +
       
  9623 +  // not reached.
       
  9624 +}
       
  9625 +
       
  9626 +struct ThreadArgument {
       
  9627 +  pid_t pid;  // the crashing process
       
  9628 +  ExceptionHandler* handler;
       
  9629 +  const void* context;  // a CrashContext structure
       
  9630 +  size_t context_size;
       
  9631 +};
       
  9632 +
       
  9633 +// This is the entry function for the cloned process. We are in a compromised
       
  9634 +// context here: see the top of the file.
       
  9635 +// static
       
  9636 +int ExceptionHandler::ThreadEntry(void *arg) {
       
  9637 +  const ThreadArgument *thread_arg = reinterpret_cast<ThreadArgument*>(arg);
       
  9638 +  return thread_arg->handler->DoDump(thread_arg->pid, thread_arg->context,
       
  9639 +                                     thread_arg->context_size) == false;
       
  9640 +}
       
  9641 +
       
  9642 +// This function runs in a compromised context: see the top of the file.
       
  9643 +// Runs on the crashing thread.
       
  9644 +bool ExceptionHandler::HandleSignal(int sig, siginfo_t* info, void* uc) {
       
  9645 +  if (filter_ && !filter_(callback_context_))
       
  9646 +    return false;
       
  9647 +
       
  9648 +  // Allow ourselves to be dumped.
       
  9649 +  sys_prctl(PR_SET_DUMPABLE, 1);
       
  9650 +
       
  9651 +  CrashContext context;
       
  9652 +  memcpy(&context.siginfo, info, sizeof(siginfo_t));
       
  9653 +  memcpy(&context.context, uc, sizeof(struct ucontext));
       
  9654 +  memcpy(&context.float_state, ((struct ucontext *)uc)->uc_mcontext.fpregs,
       
  9655 +         sizeof(context.float_state));
       
  9656 +  context.tid = sys_gettid();
       
  9657 +
       
  9658 +  if (crash_handler_ && crash_handler_(&context, sizeof(context),
       
  9659 +                                       callback_context_))
       
  9660 +    return true;
       
  9661 +
       
  9662 +  return GenerateDump(&context);
       
  9663 +}
       
  9664 +
       
  9665 +// This function may run in a compromised context: see the top of the file.
       
  9666 +bool ExceptionHandler::GenerateDump(CrashContext *context) {
       
  9667 +  static const unsigned kChildStackSize = 8000;
       
  9668 +  PageAllocator allocator;
       
  9669 +  uint8_t* stack = (uint8_t*) allocator.Alloc(kChildStackSize);
       
  9670 +  if (!stack)
       
  9671 +    return false;
       
  9672 +  // clone() needs the top-most address. (scrub just to be safe)
       
  9673 +  stack += kChildStackSize;
       
  9674 +  my_memset(stack - 16, 0, 16);
       
  9675 +
       
  9676 +  ThreadArgument thread_arg;
       
  9677 +  thread_arg.handler = this;
       
  9678 +  thread_arg.pid = getpid();
       
  9679 +  thread_arg.context = context;
       
  9680 +  thread_arg.context_size = sizeof(*context);
       
  9681 +
       
  9682 +  const pid_t child = sys_clone(
       
  9683 +      ThreadEntry, stack, CLONE_FILES | CLONE_FS | CLONE_UNTRACED,
       
  9684 +      &thread_arg, NULL, NULL, NULL);
       
  9685 +  int r, status;
       
  9686 +  do {
       
  9687 +    r = sys_waitpid(child, &status, __WALL);
       
  9688 +  } while (r == -1 && errno == EINTR);
       
  9689 +
       
  9690 +  if (r == -1) {
       
  9691 +    static const char msg[] = "ExceptionHandler::GenerateDump waitpid failed:";
       
  9692 +    sys_write(2, msg, sizeof(msg) - 1);
       
  9693 +    sys_write(2, strerror(errno), strlen(strerror(errno)));
       
  9694 +    sys_write(2, "\n", 1);
       
  9695 +  }
       
  9696 +
       
  9697 +  bool success = r != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0;
       
  9698 +
       
  9699 +  if (callback_)
       
  9700 +    success = callback_(dump_path_c_, next_minidump_id_c_,
       
  9701 +                        callback_context_, success);
       
  9702 +
       
  9703 +  return success;
       
  9704 +}
       
  9705 +
       
  9706 +// This function runs in a compromised context: see the top of the file.
       
  9707 +// Runs on the cloned process.
       
  9708 +bool ExceptionHandler::DoDump(pid_t crashing_process, const void* context,
       
  9709 +                              size_t context_size) {
       
  9710 +  return google_breakpad::WriteMinidump(
       
  9711 +      next_minidump_path_c_, crashing_process, context, context_size);
       
  9712 +}
       
  9713 +
       
  9714 +// static
       
  9715 +bool ExceptionHandler::WriteMinidump(const std::string &dump_path,
       
  9716 +                                     MinidumpCallback callback,
       
  9717 +                                     void* callback_context) {
       
  9718 +  ExceptionHandler eh(dump_path, NULL, callback, callback_context, false);
       
  9719 +  return eh.WriteMinidump();
       
  9720 +}
       
  9721 +
       
  9722 +bool ExceptionHandler::WriteMinidump() {
       
  9723 +  // Allow ourselves to be dumped.
       
  9724 +  sys_prctl(PR_SET_DUMPABLE, 1);
       
  9725 +
       
  9726 +  CrashContext context;
       
  9727 +  int getcontext_result = getcontext(&context.context);
       
  9728 +  if (getcontext_result)
       
  9729 +    return false;
       
  9730 +  memcpy(&context.float_state, context.context.uc_mcontext.fpregs,
       
  9731 +         sizeof(context.float_state));
       
  9732 +  context.tid = sys_gettid();
       
  9733 +
       
  9734 +  bool success = GenerateDump(&context);
       
  9735 +  UpdateNextID();
       
  9736 +  return success;
       
  9737 +}
       
  9738 +
       
  9739  }  // namespace google_breakpad
       
  9740 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.h b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.h
       
  9741 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.h
       
  9742 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler.h
       
  9743 @@ -1,13 +1,11 @@
       
  9744 -// Copyright (c) 2006, Google Inc.
       
  9745 +// Copyright (c) 2009, Google Inc.
       
  9746  // All rights reserved.
       
  9747  //
       
  9748 -// Author: Li Liu
       
  9749 -//
       
  9750  // Redistribution and use in source and binary forms, with or without
       
  9751  // modification, are permitted provided that the following conditions are
       
  9752  // met:
       
  9753  //
       
  9754  //     * Redistributions of source code must retain the above copyright
       
  9755  // notice, this list of conditions and the following disclaimer.
       
  9756  //     * Redistributions in binary form must reproduce the above
       
  9757  // copyright notice, this list of conditions and the following disclaimer
       
  9758 @@ -24,35 +22,26 @@
       
  9759  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
  9760  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
  9761  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
  9762  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
  9763  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
  9764  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
  9765  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
  9766  
       
  9767 -#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H__
       
  9768 -#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H__
       
  9769 +#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
       
  9770 +#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
       
  9771  
       
  9772 -#include <pthread.h>
       
  9773 +#include <vector>
       
  9774 +#include <string>
       
  9775  
       
  9776 -#include <map>
       
  9777 -#include <string>
       
  9778 -#include <vector>
       
  9779 -
       
  9780 -#include "client/linux/handler/minidump_generator.h"
       
  9781 -
       
  9782 -// Context information when exception occured.
       
  9783 -struct sigcontex;
       
  9784 +#include <signal.h>
       
  9785  
       
  9786  namespace google_breakpad {
       
  9787  
       
  9788 -using std::string;
       
  9789 -
       
  9790 -//
       
  9791  // ExceptionHandler
       
  9792  //
       
  9793  // ExceptionHandler can write a minidump file when an exception occurs,
       
  9794  // or when WriteMinidump() is called explicitly by your program.
       
  9795  //
       
  9796  // To have the exception handler write minidumps when an uncaught exception
       
  9797  // (crash) occurs, you should create an instance early in the execution
       
  9798  // of your program, and keep it around for the entire time you want to
       
  9799 @@ -67,17 +56,16 @@ using std::string;
       
  9800  //
       
  9801  // In either case, a callback function is called when a minidump is written,
       
  9802  // which receives the unqiue id of the minidump.  The caller can use this
       
  9803  // id to collect and write additional application state, and to launch an
       
  9804  // external crash-reporting application.
       
  9805  //
       
  9806  // Caller should try to make the callbacks as crash-friendly as possible,
       
  9807  // it should avoid use heap memory allocation as much as possible.
       
  9808 -//
       
  9809  class ExceptionHandler {
       
  9810   public:
       
  9811    // A callback function to run before Breakpad performs any substantial
       
  9812    // processing of an exception.  A FilterCallback is called before writing
       
  9813    // a minidump.  context is the parameter supplied by the user as
       
  9814    // callback_context when the handler was created.
       
  9815    //
       
  9816    // If a FilterCallback returns true, Breakpad will continue processing,
       
  9817 @@ -102,116 +90,110 @@ class ExceptionHandler {
       
  9818    // should normally return the value of |succeeded|, or when they wish to
       
  9819    // not report an exception of handled, false.  Callbacks will rarely want to
       
  9820    // return true directly (unless |succeeded| is true).
       
  9821    typedef bool (*MinidumpCallback)(const char *dump_path,
       
  9822                                     const char *minidump_id,
       
  9823                                     void *context,
       
  9824                                     bool succeeded);
       
  9825  
       
  9826 +  // In certain cases, a user may wish to handle the generation of the minidump
       
  9827 +  // themselves. In this case, they can install a handler callback which is
       
  9828 +  // called when a crash has occured. If this function returns true, no other
       
  9829 +  // processing of occurs and the process will shortly be crashed. If this
       
  9830 +  // returns false, the normal processing continues.
       
  9831 +  typedef bool (*HandlerCallback)(const void* crash_context,
       
  9832 +                                  size_t crash_context_size,
       
  9833 +                                  void* context);
       
  9834 +
       
  9835    // Creates a new ExceptionHandler instance to handle writing minidumps.
       
  9836    // Before writing a minidump, the optional filter callback will be called.
       
  9837    // Its return value determines whether or not Breakpad should write a
       
  9838    // minidump.  Minidump files will be written to dump_path, and the optional
       
  9839    // callback is called after writing the dump file, as described above.
       
  9840    // If install_handler is true, then a minidump will be written whenever
       
  9841    // an unhandled exception occurs.  If it is false, minidumps will only
       
  9842    // be written when WriteMinidump is called.
       
  9843 -  ExceptionHandler(const string &dump_path,
       
  9844 +  ExceptionHandler(const std::string &dump_path,
       
  9845                     FilterCallback filter, MinidumpCallback callback,
       
  9846                     void *callback_context,
       
  9847                     bool install_handler);
       
  9848    ~ExceptionHandler();
       
  9849  
       
  9850    // Get and set the minidump path.
       
  9851 -  string dump_path() const { return dump_path_; }
       
  9852 -  void set_dump_path(const string &dump_path) {
       
  9853 +  std::string dump_path() const { return dump_path_; }
       
  9854 +  void set_dump_path(const std::string &dump_path) {
       
  9855      dump_path_ = dump_path;
       
  9856      dump_path_c_ = dump_path_.c_str();
       
  9857      UpdateNextID();
       
  9858    }
       
  9859  
       
  9860 +  void set_crash_handler(HandlerCallback callback) {
       
  9861 +    crash_handler_ = callback;
       
  9862 +  }
       
  9863 +
       
  9864    // Writes a minidump immediately.  This can be used to capture the
       
  9865    // execution state independently of a crash.  Returns true on success.
       
  9866    bool WriteMinidump();
       
  9867  
       
  9868    // Convenience form of WriteMinidump which does not require an
       
  9869    // ExceptionHandler instance.
       
  9870 -  static bool WriteMinidump(const string &dump_path,
       
  9871 +  static bool WriteMinidump(const std::string &dump_path,
       
  9872                              MinidumpCallback callback,
       
  9873                              void *callback_context);
       
  9874  
       
  9875 - private:
       
  9876 -  // Setup crash handler.
       
  9877 -  void SetupHandler();
       
  9878 -  // Setup signal handler for a signal.
       
  9879 -  void SetupHandler(int signo);
       
  9880 -  // Teardown the handler for a signal.
       
  9881 -  void TeardownHandler(int signo);
       
  9882 -  // Teardown all handlers.
       
  9883 -  void TeardownAllHandler();
       
  9884 -
       
  9885 -  // Signal handler.
       
  9886 -  static void HandleException(int signo);
       
  9887 -
       
  9888 -  // If called from a signal handler, sighandler_ebp is the ebp of
       
  9889 -  // that signal handler's frame, and sig_ctx is an out parameter
       
  9890 -  // that will be set to point at the sigcontext that was placed
       
  9891 -  // on the stack by the kernel.  You can pass zero and NULL
       
  9892 -  // for the second and third parameters if you are not calling
       
  9893 -  // this from a signal handler.
       
  9894 -  bool InternalWriteMinidump(int signo, uintptr_t sighandler_ebp,
       
  9895 -                             struct sigcontext **sig_ctx);
       
  9896 -
       
  9897 -  // Generates a new ID and stores it in next_minidump_id, and stores the
       
  9898 -  // path of the next minidump to be written in next_minidump_path_.
       
  9899 -  void UpdateNextID();
       
  9900 +  // This structure is passed to minidump_writer.h:WriteMinidump via an opaque
       
  9901 +  // blob. It shouldn't be needed in any user code.
       
  9902 +  struct CrashContext {
       
  9903 +    siginfo_t siginfo;
       
  9904 +    pid_t tid;  // the crashing thread.
       
  9905 +    struct ucontext context;
       
  9906 +    struct _libc_fpstate float_state;
       
  9907 +  };
       
  9908  
       
  9909   private:
       
  9910 -  FilterCallback filter_;
       
  9911 -  MinidumpCallback callback_;
       
  9912 -  void *callback_context_;
       
  9913 +  bool InstallHandlers();
       
  9914 +  void UninstallHandlers();
       
  9915 +  void PreresolveSymbols();
       
  9916 +  bool GenerateDump(CrashContext *context);
       
  9917  
       
  9918 -  // The directory in which a minidump will be written, set by the dump_path
       
  9919 -  // argument to the constructor, or set_dump_path.
       
  9920 -  string dump_path_;
       
  9921 +  void UpdateNextID();
       
  9922 +  static void SignalHandler(int sig, siginfo_t* info, void* uc);
       
  9923 +  bool HandleSignal(int sig, siginfo_t* info, void* uc);
       
  9924 +  static int ThreadEntry(void* arg);
       
  9925 +  bool DoDump(pid_t crashing_process, const void* context,
       
  9926 +              size_t context_size);
       
  9927  
       
  9928 -  // The basename of the next minidump to be written, without the extension
       
  9929 -  string next_minidump_id_;
       
  9930 +  const FilterCallback filter_;
       
  9931 +  const MinidumpCallback callback_;
       
  9932 +  void* const callback_context_;
       
  9933  
       
  9934 -  // The full pathname of the next minidump to be written, including the file
       
  9935 -  // extension
       
  9936 -  string next_minidump_path_;
       
  9937 +  std::string dump_path_;
       
  9938 +  std::string next_minidump_path_;
       
  9939 +  std::string next_minidump_id_;
       
  9940  
       
  9941    // Pointers to C-string representations of the above. These are set
       
  9942    // when the above are set so we can avoid calling c_str during
       
  9943    // an exception.
       
  9944 -  const char *dump_path_c_;
       
  9945 -  const char *next_minidump_id_c_;
       
  9946 -  const char *next_minidump_path_c_;
       
  9947 +  const char* dump_path_c_;
       
  9948 +  const char* next_minidump_path_c_;
       
  9949 +  const char* next_minidump_id_c_;
       
  9950  
       
  9951 -  // True if the ExceptionHandler installed an unhandled exception filter
       
  9952 -  // when created (with an install_handler parameter set to true).
       
  9953 -  bool installed_handler_;
       
  9954 -
       
  9955 -  // Keep the previous handlers for the signal.
       
  9956 -  typedef void (*sighandler_t)(int);
       
  9957 -  std::map<int, sighandler_t> old_handlers_;
       
  9958 +  const bool handler_installed_;
       
  9959 +  void* signal_stack;  // the handler stack.
       
  9960 +  HandlerCallback crash_handler_;
       
  9961  
       
  9962    // The global exception handler stack. This is need becuase there may exist
       
  9963    // multiple ExceptionHandler instances in a process. Each will have itself
       
  9964    // registered in this stack.
       
  9965 -  static std::vector<ExceptionHandler *> *handler_stack_;
       
  9966 +  static std::vector<ExceptionHandler*> *handler_stack_;
       
  9967    // The index of the handler that should handle the next exception.
       
  9968 -  static int handler_stack_index_;
       
  9969 +  static unsigned handler_stack_index_;
       
  9970    static pthread_mutex_t handler_stack_mutex_;
       
  9971  
       
  9972 -  // The minidump generator.
       
  9973 -  MinidumpGenerator minidump_generator_;
       
  9974 -
       
  9975 -  // disallow copy ctor and operator=
       
  9976 -  explicit ExceptionHandler(const ExceptionHandler &);
       
  9977 -  void operator=(const ExceptionHandler &);
       
  9978 +  // A vector of the old signal handlers. The void* is a pointer to a newly
       
  9979 +  // allocated sigaction structure to avoid pulling in too many includes.
       
  9980 +  std::vector<std::pair<int, void *> > old_handlers_;
       
  9981  };
       
  9982  
       
  9983  }  // namespace google_breakpad
       
  9984  
       
  9985 -#endif  // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H__
       
  9986 +#endif  // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
       
  9987 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler_test.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler_test.cc
       
  9988 deleted file mode 100644
       
  9989 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler_test.cc
       
  9990 +++ /dev/null
       
  9991 @@ -1,124 +0,0 @@
       
  9992 -// Copyright (c) 2006, Google Inc.
       
  9993 -// All rights reserved.
       
  9994 -//
       
  9995 -// Author: Li Liu
       
  9996 -//
       
  9997 -// Redistribution and use in source and binary forms, with or without
       
  9998 -// modification, are permitted provided that the following conditions are
       
  9999 -// met:
       
 10000 -//
       
 10001 -//     * Redistributions of source code must retain the above copyright
       
 10002 -// notice, this list of conditions and the following disclaimer.
       
 10003 -//     * Redistributions in binary form must reproduce the above
       
 10004 -// copyright notice, this list of conditions and the following disclaimer
       
 10005 -// in the documentation and/or other materials provided with the
       
 10006 -// distribution.
       
 10007 -//     * Neither the name of Google Inc. nor the names of its
       
 10008 -// contributors may be used to endorse or promote products derived from
       
 10009 -// this software without specific prior written permission.
       
 10010 -//
       
 10011 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 10012 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 10013 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 10014 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 10015 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 10016 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 10017 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 10018 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 10019 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 10020 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 10021 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 10022 -
       
 10023 -#include <pthread.h>
       
 10024 -#include <unistd.h>
       
 10025 -
       
 10026 -#include <cassert>
       
 10027 -#include <cstdio>
       
 10028 -#include <cstdlib>
       
 10029 -#include <cstring>
       
 10030 -
       
 10031 -#include "client/linux/handler/exception_handler.h"
       
 10032 -#include "client/linux/handler/linux_thread.h"
       
 10033 -
       
 10034 -using namespace google_breakpad;
       
 10035 -
       
 10036 -// Thread use this to see if it should stop working.
       
 10037 -static bool should_exit = false;
       
 10038 -
       
 10039 -static int foo2(int arg) {
       
 10040 -  // Stack variable, used for debugging stack dumps.
       
 10041 -  /*DDDebug*/printf("%s:%d\n", __FUNCTION__, __LINE__);
       
 10042 -  int c = 0xcccccccc;
       
 10043 -  fprintf(stderr, "Thread trying to crash: %x\n", getpid());
       
 10044 -  c = *reinterpret_cast<int *>(0x5);
       
 10045 -  return c;
       
 10046 -}
       
 10047 -
       
 10048 -static int foo(int arg) {
       
 10049 -  // Stack variable, used for debugging stack dumps.
       
 10050 -  int b = 0xbbbbbbbb;
       
 10051 -  b = foo2(b);
       
 10052 -  return b;
       
 10053 -}
       
 10054 -
       
 10055 -static void *thread_crash(void *) {
       
 10056 -  // Stack variable, used for debugging stack dumps.
       
 10057 -  int a = 0xaaaaaaaa;
       
 10058 -  sleep(1);
       
 10059 -  a = foo(a);
       
 10060 -  printf("%x\n", a);
       
 10061 -  return NULL;
       
 10062 -}
       
 10063 -
       
 10064 -static void *thread_main(void *) {
       
 10065 -  while (!should_exit)
       
 10066 -    sleep(1);
       
 10067 -  return NULL;
       
 10068 -}
       
 10069 -
       
 10070 -static void CreateCrashThread() {
       
 10071 -  pthread_t h;
       
 10072 -  pthread_create(&h, NULL, thread_crash, NULL);
       
 10073 -  pthread_detach(h);
       
 10074 -}
       
 10075 -
       
 10076 -// Create working threads.
       
 10077 -static void CreateThread(int num) {
       
 10078 -  pthread_t h;
       
 10079 -  for (int i = 0; i < num; ++i) {
       
 10080 -    pthread_create(&h, NULL, thread_main, NULL);
       
 10081 -    pthread_detach(h);
       
 10082 -  }
       
 10083 -}
       
 10084 -
       
 10085 -// Callback when minidump written.
       
 10086 -static bool MinidumpCallback(const char *dump_path,
       
 10087 -                             const char *minidump_id,
       
 10088 -                             void *context,
       
 10089 -                             bool succeeded) {
       
 10090 -  int index = reinterpret_cast<int>(context);
       
 10091 -  printf("%d %s: %s is dumped\n", index, __FUNCTION__, minidump_id);
       
 10092 -  if (index == 0) {
       
 10093 -    should_exit = true;
       
 10094 -    return true;
       
 10095 -  }
       
 10096 -  // Don't process it.
       
 10097 -  return false;
       
 10098 -}
       
 10099 -
       
 10100 -int main(int argc, char *argv[]) {
       
 10101 -  int handler_index = 0;
       
 10102 -  ExceptionHandler handler_ignore(".", NULL, MinidumpCallback,
       
 10103 -                           (void*)handler_index, true);
       
 10104 -  ++handler_index;
       
 10105 -  ExceptionHandler handler_process(".", NULL, MinidumpCallback,
       
 10106 -                           (void*)handler_index, true);
       
 10107 -  CreateCrashThread();
       
 10108 -  CreateThread(10);
       
 10109 -
       
 10110 -  while (true)
       
 10111 -    sleep(1);
       
 10112 -  should_exit = true;
       
 10113 -
       
 10114 -  return 0;
       
 10115 -}
       
 10116 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler_unittest.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler_unittest.cc
       
 10117 new file mode 100644
       
 10118 --- /dev/null
       
 10119 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler_unittest.cc
       
 10120 @@ -0,0 +1,256 @@
       
 10121 +// Copyright (c) 2009, Google Inc.
       
 10122 +// All rights reserved.
       
 10123 +//
       
 10124 +// Redistribution and use in source and binary forms, with or without
       
 10125 +// modification, are permitted provided that the following conditions are
       
 10126 +// met:
       
 10127 +//
       
 10128 +//     * Redistributions of source code must retain the above copyright
       
 10129 +// notice, this list of conditions and the following disclaimer.
       
 10130 +//     * Redistributions in binary form must reproduce the above
       
 10131 +// copyright notice, this list of conditions and the following disclaimer
       
 10132 +// in the documentation and/or other materials provided with the
       
 10133 +// distribution.
       
 10134 +//     * Neither the name of Google Inc. nor the names of its
       
 10135 +// contributors may be used to endorse or promote products derived from
       
 10136 +// this software without specific prior written permission.
       
 10137 +//
       
 10138 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 10139 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 10140 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 10141 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 10142 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 10143 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 10144 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 10145 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 10146 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 10147 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 10148 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 10149 +
       
 10150 +#include <string>
       
 10151 +
       
 10152 +#include <stdint.h>
       
 10153 +#include <unistd.h>
       
 10154 +#include <signal.h>
       
 10155 +#include <sys/poll.h>
       
 10156 +#include <sys/socket.h>
       
 10157 +#include <sys/uio.h>
       
 10158 +
       
 10159 +#include "client/linux/handler//exception_handler.h"
       
 10160 +#include "client/linux/minidump_writer/minidump_writer.h"
       
 10161 +#include "common/linux/linux_libc_support.h"
       
 10162 +#include "common/linux/linux_syscall_support.h"
       
 10163 +#include "breakpad_googletest_includes.h"
       
 10164 +
       
 10165 +// This provides a wrapper around system calls which may be
       
 10166 +// interrupted by a signal and return EINTR. See man 7 signal.
       
 10167 +#define HANDLE_EINTR(x) ({ \
       
 10168 +  typeof(x) __eintr_result__; \
       
 10169 +  do { \
       
 10170 +    __eintr_result__ = x; \
       
 10171 +  } while (__eintr_result__ == -1 && errno == EINTR); \
       
 10172 +  __eintr_result__;\
       
 10173 +})
       
 10174 +
       
 10175 +using namespace google_breakpad;
       
 10176 +
       
 10177 +static void sigchld_handler(int signo) { }
       
 10178 +
       
 10179 +class ExceptionHandlerTest : public ::testing::Test {
       
 10180 + protected:
       
 10181 +  void SetUp() {
       
 10182 +    // We need to be able to wait for children, so SIGCHLD cannot be SIG_IGN.
       
 10183 +    struct sigaction sa;
       
 10184 +    memset(&sa, 0, sizeof(sa));
       
 10185 +    sa.sa_handler = sigchld_handler;
       
 10186 +    ASSERT_NE(sigaction(SIGCHLD, &sa, &old_action), -1);
       
 10187 +  }
       
 10188 +
       
 10189 +  void TearDown() {
       
 10190 +    sigaction(SIGCHLD, &old_action, NULL);
       
 10191 +  }
       
 10192 +
       
 10193 +  struct sigaction old_action;
       
 10194 +};
       
 10195 +
       
 10196 +TEST(ExceptionHandlerTest, Simple) {
       
 10197 +  ExceptionHandler handler("/tmp", NULL, NULL, NULL, true);
       
 10198 +}
       
 10199 +
       
 10200 +static bool DoneCallback(const char* dump_path,
       
 10201 +                         const char* minidump_id,
       
 10202 +                         void* context,
       
 10203 +                         bool succeeded) {
       
 10204 +  if (!succeeded)
       
 10205 +    return succeeded;
       
 10206 +
       
 10207 +  int fd = (intptr_t) context;
       
 10208 +  uint32_t len = my_strlen(minidump_id);
       
 10209 +  HANDLE_EINTR(sys_write(fd, &len, sizeof(len)));
       
 10210 +  HANDLE_EINTR(sys_write(fd, minidump_id, len));
       
 10211 +  sys_close(fd);
       
 10212 +
       
 10213 +  return true;
       
 10214 +}
       
 10215 +
       
 10216 +TEST(ExceptionHandlerTest, ChildCrash) {
       
 10217 +  int fds[2];
       
 10218 +  ASSERT_NE(pipe(fds), -1);
       
 10219 +
       
 10220 +  const pid_t child = fork();
       
 10221 +  if (child == 0) {
       
 10222 +    close(fds[0]);
       
 10223 +    ExceptionHandler handler("/tmp", NULL, DoneCallback, (void*) fds[1],
       
 10224 +                             true);
       
 10225 +    *reinterpret_cast<int*>(NULL) = 0;
       
 10226 +  }
       
 10227 +  close(fds[1]);
       
 10228 +
       
 10229 +  int status;
       
 10230 +  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);
       
 10231 +  ASSERT_TRUE(WIFSIGNALED(status));
       
 10232 +  ASSERT_EQ(WTERMSIG(status), SIGSEGV);
       
 10233 +
       
 10234 +  struct pollfd pfd;
       
 10235 +  memset(&pfd, 0, sizeof(pfd));
       
 10236 +  pfd.fd = fds[0];
       
 10237 +  pfd.events = POLLIN | POLLERR;
       
 10238 +
       
 10239 +  const int r = HANDLE_EINTR(poll(&pfd, 1, 0));
       
 10240 +  ASSERT_EQ(r, 1);
       
 10241 +  ASSERT_TRUE(pfd.revents & POLLIN);
       
 10242 +
       
 10243 +  uint32_t len;
       
 10244 +  ASSERT_EQ(read(fds[0], &len, sizeof(len)), sizeof(len));
       
 10245 +  ASSERT_LT(len, 2048);
       
 10246 +  char* filename = reinterpret_cast<char*>(malloc(len + 1));
       
 10247 +  ASSERT_EQ(read(fds[0], filename, len), len);
       
 10248 +  filename[len] = 0;
       
 10249 +  close(fds[0]);
       
 10250 +
       
 10251 +  const std::string minidump_filename = std::string("/tmp/") + filename +
       
 10252 +                                        ".dmp";
       
 10253 +
       
 10254 +  struct stat st;
       
 10255 +  ASSERT_EQ(stat(minidump_filename.c_str(), &st), 0);
       
 10256 +  ASSERT_GT(st.st_size, 0u);
       
 10257 +  unlink(minidump_filename.c_str());
       
 10258 +}
       
 10259 +
       
 10260 +static const unsigned kControlMsgSize =
       
 10261 +    CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(struct ucred));
       
 10262 +
       
 10263 +static bool
       
 10264 +CrashHandler(const void* crash_context, size_t crash_context_size,
       
 10265 +             void* context) {
       
 10266 +  const int fd = (intptr_t) context;
       
 10267 +  int fds[2];
       
 10268 +  pipe(fds);
       
 10269 +
       
 10270 +  struct kernel_msghdr msg = {0};
       
 10271 +  struct kernel_iovec iov;
       
 10272 +  iov.iov_base = const_cast<void*>(crash_context);
       
 10273 +  iov.iov_len = crash_context_size;
       
 10274 +
       
 10275 +  msg.msg_iov = &iov;
       
 10276 +  msg.msg_iovlen = 1;
       
 10277 +  char cmsg[kControlMsgSize];
       
 10278 +  memset(cmsg, 0, kControlMsgSize);
       
 10279 +  msg.msg_control = cmsg;
       
 10280 +  msg.msg_controllen = sizeof(cmsg);
       
 10281 +
       
 10282 +  struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg);
       
 10283 +  hdr->cmsg_level = SOL_SOCKET;
       
 10284 +  hdr->cmsg_type = SCM_RIGHTS;
       
 10285 +  hdr->cmsg_len = CMSG_LEN(sizeof(int));
       
 10286 +  *((int*) CMSG_DATA(hdr)) = fds[1];
       
 10287 +  hdr = CMSG_NXTHDR((struct msghdr*) &msg, hdr);
       
 10288 +  hdr->cmsg_level = SOL_SOCKET;
       
 10289 +  hdr->cmsg_type = SCM_CREDENTIALS;
       
 10290 +  hdr->cmsg_len = CMSG_LEN(sizeof(struct ucred));
       
 10291 +  struct ucred *cred = reinterpret_cast<struct ucred*>(CMSG_DATA(hdr));
       
 10292 +  cred->uid = getuid();
       
 10293 +  cred->gid = getgid();
       
 10294 +  cred->pid = getpid();
       
 10295 +
       
 10296 +  HANDLE_EINTR(sys_sendmsg(fd, &msg, 0));
       
 10297 +  sys_close(fds[1]);
       
 10298 +
       
 10299 +  char b;
       
 10300 +  HANDLE_EINTR(sys_read(fds[0], &b, 1));
       
 10301 +
       
 10302 +  return true;
       
 10303 +}
       
 10304 +
       
 10305 +TEST(ExceptionHandlerTest, ExternalDumper) {
       
 10306 +  int fds[2];
       
 10307 +  ASSERT_NE(socketpair(AF_UNIX, SOCK_DGRAM, 0, fds), -1);
       
 10308 +  static const int on = 1;
       
 10309 +  setsockopt(fds[0], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
       
 10310 +  setsockopt(fds[1], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
       
 10311 +
       
 10312 +  const pid_t child = fork();
       
 10313 +  if (child == 0) {
       
 10314 +    close(fds[0]);
       
 10315 +    ExceptionHandler handler("/tmp", NULL, NULL, (void*) fds[1], true);
       
 10316 +    handler.set_crash_handler(CrashHandler);
       
 10317 +    *reinterpret_cast<int*>(NULL) = 0;
       
 10318 +  }
       
 10319 +
       
 10320 +  close(fds[1]);
       
 10321 +  struct msghdr msg = {0};
       
 10322 +  struct iovec iov;
       
 10323 +  static const unsigned kCrashContextSize =
       
 10324 +      sizeof(ExceptionHandler::CrashContext);
       
 10325 +  char context[kCrashContextSize];
       
 10326 +  char control[kControlMsgSize];
       
 10327 +  iov.iov_base = context;
       
 10328 +  iov.iov_len = kCrashContextSize;
       
 10329 +  msg.msg_iov = &iov;
       
 10330 +  msg.msg_iovlen = 1;
       
 10331 +  msg.msg_control = control;
       
 10332 +  msg.msg_controllen = kControlMsgSize;
       
 10333 +
       
 10334 +  const ssize_t n = HANDLE_EINTR(recvmsg(fds[0], &msg, 0));
       
 10335 +  ASSERT_EQ(n, kCrashContextSize);
       
 10336 +  ASSERT_EQ(msg.msg_controllen, kControlMsgSize);
       
 10337 +  ASSERT_EQ(msg.msg_flags, 0);
       
 10338 +
       
 10339 +  pid_t crashing_pid = -1;
       
 10340 +  int signal_fd = -1;
       
 10341 +  for (struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg); hdr;
       
 10342 +       hdr = CMSG_NXTHDR(&msg, hdr)) {
       
 10343 +    if (hdr->cmsg_level != SOL_SOCKET)
       
 10344 +      continue;
       
 10345 +    if (hdr->cmsg_type == SCM_RIGHTS) {
       
 10346 +      const unsigned len = hdr->cmsg_len -
       
 10347 +          (((uint8_t*)CMSG_DATA(hdr)) - (uint8_t*)hdr);
       
 10348 +      ASSERT_EQ(len, sizeof(int));
       
 10349 +      signal_fd = *((int *) CMSG_DATA(hdr));
       
 10350 +    } else if (hdr->cmsg_type == SCM_CREDENTIALS) {
       
 10351 +      const struct ucred *cred =
       
 10352 +          reinterpret_cast<struct ucred*>(CMSG_DATA(hdr));
       
 10353 +      crashing_pid = cred->pid;
       
 10354 +    }
       
 10355 +  }
       
 10356 +
       
 10357 +  ASSERT_NE(crashing_pid, -1);
       
 10358 +  ASSERT_NE(signal_fd, -1);
       
 10359 +
       
 10360 +  char templ[] = "/tmp/exception-handler-unittest-XXXXXX";
       
 10361 +  mktemp(templ);
       
 10362 +  ASSERT_TRUE(WriteMinidump(templ, crashing_pid, context,
       
 10363 +                            kCrashContextSize));
       
 10364 +  static const char b = 0;
       
 10365 +  HANDLE_EINTR(write(signal_fd, &b, 1));
       
 10366 +
       
 10367 +  int status;
       
 10368 +  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);
       
 10369 +  ASSERT_TRUE(WIFSIGNALED(status));
       
 10370 +  ASSERT_EQ(WTERMSIG(status), SIGSEGV);
       
 10371 +
       
 10372 +  struct stat st;
       
 10373 +  ASSERT_EQ(stat(templ, &st), 0);
       
 10374 +  ASSERT_GT(st.st_size, 0u);
       
 10375 +  unlink(templ);
       
 10376 +}
       
 10377 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread.cc
       
 10378 deleted file mode 100644
       
 10379 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread.cc
       
 10380 +++ /dev/null
       
 10381 @@ -1,411 +0,0 @@
       
 10382 -// Copyright (c) 2006, Google Inc.
       
 10383 -// All rights reserved.
       
 10384 -//
       
 10385 -// Author: Li Liu
       
 10386 -//
       
 10387 -// Redistribution and use in source and binary forms, with or without
       
 10388 -// modification, are permitted provided that the following conditions are
       
 10389 -// met:
       
 10390 -//
       
 10391 -//     * Redistributions of source code must retain the above copyright
       
 10392 -// notice, this list of conditions and the following disclaimer.
       
 10393 -//     * Redistributions in binary form must reproduce the above
       
 10394 -// copyright notice, this list of conditions and the following disclaimer
       
 10395 -// in the documentation and/or other materials provided with the
       
 10396 -// distribution.
       
 10397 -//     * Neither the name of Google Inc. nor the names of its
       
 10398 -// contributors may be used to endorse or promote products derived from
       
 10399 -// this software without specific prior written permission.
       
 10400 -//
       
 10401 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 10402 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 10403 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 10404 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 10405 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 10406 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 10407 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 10408 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 10409 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 10410 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 10411 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 10412 -//
       
 10413 -#include <errno.h>
       
 10414 -#include <dirent.h>
       
 10415 -#include <fcntl.h>
       
 10416 -#include <sys/ptrace.h>
       
 10417 -#include <sys/stat.h>
       
 10418 -#include <sys/types.h>
       
 10419 -#include <unistd.h>
       
 10420 -#include <sys/wait.h>
       
 10421 -#include <string.h>
       
 10422 -
       
 10423 -#include <algorithm>
       
 10424 -#include <cassert>
       
 10425 -#include <cstdio>
       
 10426 -#include <cstdlib>
       
 10427 -#include <functional>
       
 10428 -
       
 10429 -#include "client/linux/handler/linux_thread.h"
       
 10430 -
       
 10431 -using namespace google_breakpad;
       
 10432 -
       
 10433 -// This unamed namespace contains helper function.
       
 10434 -namespace {
       
 10435 -
       
 10436 -// Context information for the callbacks when validating address by listing
       
 10437 -// modules.
       
 10438 -struct AddressValidatingContext {
       
 10439 -  uintptr_t address;
       
 10440 -  bool is_mapped;
       
 10441 -
       
 10442 -  AddressValidatingContext() : address(0UL), is_mapped(false) {
       
 10443 -  }
       
 10444 -};
       
 10445 -
       
 10446 -// Convert from string to int.
       
 10447 -bool LocalAtoi(char *s, int *r) {
       
 10448 -  assert(s != NULL);
       
 10449 -  assert(r != NULL);
       
 10450 -  char *endptr = NULL;
       
 10451 -  int ret = strtol(s, &endptr, 10);
       
 10452 -  if (endptr == s)
       
 10453 -    return false;
       
 10454 -  *r = ret;
       
 10455 -  return true;
       
 10456 -}
       
 10457 -
       
 10458 -// Fill the proc path of a thread given its id.
       
 10459 -void FillProcPath(int pid, char *path, int path_size) {
       
 10460 -  char pid_str[32];
       
 10461 -  snprintf(pid_str, sizeof(pid_str), "%d", pid);
       
 10462 -  snprintf(path, path_size, "/proc/%s/", pid_str);
       
 10463 -}
       
 10464 -
       
 10465 -// Read thread info from /proc/$pid/status.
       
 10466 -bool ReadThreadInfo(int pid, ThreadInfo *info) {
       
 10467 -  assert(info != NULL);
       
 10468 -  char status_path[80];
       
 10469 -  // Max size we want to read from status file.
       
 10470 -  static const int kStatusMaxSize = 1024;
       
 10471 -  char status_content[kStatusMaxSize];
       
 10472 -
       
 10473 -  FillProcPath(pid, status_path, sizeof(status_path));
       
 10474 -  strcat(status_path, "status");
       
 10475 -  int fd = open(status_path, O_RDONLY, 0);
       
 10476 -  if (fd < 0)
       
 10477 -    return false;
       
 10478 -
       
 10479 -  int num_read = read(fd, status_content, kStatusMaxSize - 1);
       
 10480 -  if (num_read < 0) {
       
 10481 -    close(fd);
       
 10482 -    return false;
       
 10483 -  }
       
 10484 -  close(fd);
       
 10485 -  status_content[num_read] = '\0';
       
 10486 -
       
 10487 -  char *tgid_start = strstr(status_content, "Tgid:");
       
 10488 -  if (tgid_start)
       
 10489 -    sscanf(tgid_start, "Tgid:\t%d\n", &(info->tgid));
       
 10490 -  else
       
 10491 -    // tgid not supported by kernel??
       
 10492 -    info->tgid = 0;
       
 10493 -
       
 10494 -  tgid_start = strstr(status_content, "Pid:");
       
 10495 -  if (tgid_start) {
       
 10496 -    sscanf(tgid_start, "Pid:\t%d\n" "PPid:\t%d\n", &(info->pid),
       
 10497 -           &(info->ppid));
       
 10498 -    return true;
       
 10499 -  }
       
 10500 -  return false;
       
 10501 -}
       
 10502 -
       
 10503 -// Callback invoked for each mapped module.
       
 10504 -// It use the module's adderss range to validate the address.
       
 10505 -bool IsAddressInModuleCallback(const ModuleInfo &module_info,
       
 10506 -                               void *context) {
       
 10507 -  AddressValidatingContext *addr =
       
 10508 -    reinterpret_cast<AddressValidatingContext *>(context);
       
 10509 -  addr->is_mapped = ((addr->address >= module_info.start_addr) &&
       
 10510 -                     (addr->address <= module_info.start_addr +
       
 10511 -                      module_info.size));
       
 10512 -  return !addr->is_mapped;
       
 10513 -}
       
 10514 -
       
 10515 -#if defined(__i386__) && !defined(NO_FRAME_POINTER)
       
 10516 -void *GetNextFrame(void **last_ebp) {
       
 10517 -  void *sp = *last_ebp;
       
 10518 -  if ((unsigned long)sp == (unsigned long)last_ebp)
       
 10519 -    return NULL;
       
 10520 -  if ((unsigned long)sp & (sizeof(void *) - 1))
       
 10521 -    return NULL;
       
 10522 -  if ((unsigned long)sp - (unsigned long)last_ebp > 100000)
       
 10523 -    return NULL;
       
 10524 -  return sp;
       
 10525 -}
       
 10526 -#else
       
 10527 -void *GetNextFrame(void **last_ebp) {
       
 10528 -  return reinterpret_cast<void*>(last_ebp);
       
 10529 -}
       
 10530 -#endif
       
 10531 -
       
 10532 -// Suspend a thread by attaching to it.
       
 10533 -bool SuspendThread(int pid, void *context) {
       
 10534 -  // This may fail if the thread has just died or debugged.
       
 10535 -  errno = 0;
       
 10536 -  if (ptrace(PTRACE_ATTACH, pid, NULL, NULL) != 0 &&
       
 10537 -      errno != 0) {
       
 10538 -    return false;
       
 10539 -  }
       
 10540 -  while (waitpid(pid, NULL, __WALL) < 0) {
       
 10541 -    if (errno != EINTR) {
       
 10542 -      ptrace(PTRACE_DETACH, pid, NULL, NULL);
       
 10543 -      return false;
       
 10544 -    }
       
 10545 -  }
       
 10546 -  return true;
       
 10547 -}
       
 10548 -
       
 10549 -// Resume a thread by detaching from it.
       
 10550 -bool ResumeThread(int pid, void *context) {
       
 10551 -  return ptrace(PTRACE_DETACH, pid, NULL, NULL) >= 0;
       
 10552 -}
       
 10553 -
       
 10554 -// Callback to get the thread information.
       
 10555 -// Will be called for each thread found.
       
 10556 -bool ThreadInfoCallback(int pid, void *context) {
       
 10557 -  CallbackParam<ThreadCallback> *thread_callback =
       
 10558 -    reinterpret_cast<CallbackParam<ThreadCallback> *>(context);
       
 10559 -  ThreadInfo thread_info;
       
 10560 -  if (ReadThreadInfo(pid, &thread_info) && thread_callback) {
       
 10561 -    // Invoke callback from caller.
       
 10562 -    return (thread_callback->call_back)(thread_info, thread_callback->context);
       
 10563 -  }
       
 10564 -  return false;
       
 10565 -}
       
 10566 -
       
 10567 -}  // namespace
       
 10568 -
       
 10569 -namespace google_breakpad {
       
 10570 -
       
 10571 -LinuxThread::LinuxThread(int pid) : pid_(pid) , threads_suspened_(false) {
       
 10572 -}
       
 10573 -
       
 10574 -LinuxThread::~LinuxThread() {
       
 10575 -  if (threads_suspened_)
       
 10576 -    ResumeAllThreads();
       
 10577 -}
       
 10578 -
       
 10579 -int LinuxThread::SuspendAllThreads() {
       
 10580 -  CallbackParam<PidCallback> callback_param(SuspendThread, NULL);
       
 10581 -  int thread_count = 0;
       
 10582 -  if ((thread_count = IterateProcSelfTask(pid_, &callback_param)) > 0)
       
 10583 -    threads_suspened_ = true;
       
 10584 -  return thread_count;
       
 10585 -}
       
 10586 -
       
 10587 -void LinuxThread::ResumeAllThreads() const {
       
 10588 -  CallbackParam<PidCallback> callback_param(ResumeThread, NULL);
       
 10589 -  IterateProcSelfTask(pid_, &callback_param);
       
 10590 -}
       
 10591 -
       
 10592 -int LinuxThread::GetThreadCount() const {
       
 10593 -  return IterateProcSelfTask(pid_, NULL);
       
 10594 -}
       
 10595 -
       
 10596 -int LinuxThread::ListThreads(
       
 10597 -    CallbackParam<ThreadCallback> *thread_callback_param) const {
       
 10598 -  CallbackParam<PidCallback> callback_param(ThreadInfoCallback,
       
 10599 -                                            thread_callback_param);
       
 10600 -  return IterateProcSelfTask(pid_, &callback_param);
       
 10601 -}
       
 10602 -
       
 10603 -bool LinuxThread::GetRegisters(int pid, user_regs_struct *regs) const {
       
 10604 -  assert(regs);
       
 10605 -  return (regs != NULL &&
       
 10606 -          (ptrace(PTRACE_GETREGS, pid, NULL, regs) == 0) &&
       
 10607 -          errno == 0);
       
 10608 -}
       
 10609 -
       
 10610 -// Get the floating-point registers of a thread.
       
 10611 -// The caller must get the thread pid by ListThreads.
       
 10612 -bool LinuxThread::GetFPRegisters(int pid, user_fpregs_struct *regs) const {
       
 10613 -  assert(regs);
       
 10614 -  return (regs != NULL &&
       
 10615 -          (ptrace(PTRACE_GETREGS, pid, NULL, regs) ==0) &&
       
 10616 -          errno == 0);
       
 10617 -}
       
 10618 -
       
 10619 -bool LinuxThread::GetFPXRegisters(int pid, user_fpxregs_struct *regs) const {
       
 10620 -  assert(regs);
       
 10621 -  return (regs != NULL &&
       
 10622 -          (ptrace(PTRACE_GETFPREGS, pid, NULL, regs) != 0) &&
       
 10623 -          errno == 0);
       
 10624 -}
       
 10625 -
       
 10626 -bool LinuxThread::GetDebugRegisters(int pid, DebugRegs *regs) const {
       
 10627 -  assert(regs);
       
 10628 -
       
 10629 -#define GET_DR(name, num)\
       
 10630 -  name->dr##num = ptrace(PTRACE_PEEKUSER, pid,\
       
 10631 -                         offsetof(struct user, u_debugreg[num]), NULL)
       
 10632 -  GET_DR(regs, 0);
       
 10633 -  GET_DR(regs, 1);
       
 10634 -  GET_DR(regs, 2);
       
 10635 -  GET_DR(regs, 3);
       
 10636 -  GET_DR(regs, 4);
       
 10637 -  GET_DR(regs, 5);
       
 10638 -  GET_DR(regs, 6);
       
 10639 -  GET_DR(regs, 7);
       
 10640 -  return true;
       
 10641 -}
       
 10642 -
       
 10643 -int LinuxThread::GetThreadStackDump(uintptr_t current_ebp,
       
 10644 -                                    uintptr_t current_esp,
       
 10645 -                                    void *buf,
       
 10646 -                                    int buf_size) const {
       
 10647 -  assert(buf);
       
 10648 -  assert(buf_size > 0);
       
 10649 -
       
 10650 -  uintptr_t stack_bottom = GetThreadStackBottom(current_ebp);
       
 10651 -  int size = stack_bottom - current_esp;
       
 10652 -  size = buf_size > size ? size : buf_size;
       
 10653 -  if (size > 0)
       
 10654 -    memcpy(buf, reinterpret_cast<void*>(current_esp), size);
       
 10655 -  return size;
       
 10656 -}
       
 10657 -
       
 10658 -// Get the stack bottom of a thread by stack walking. It works
       
 10659 -// unless the stack has been corrupted or the frame pointer has been omited.
       
 10660 -// This is just a temporary solution before we get better ideas about how
       
 10661 -// this can be done.
       
 10662 -//
       
 10663 -// We will check each frame address by checking into module maps.
       
 10664 -// TODO(liuli): Improve it.
       
 10665 -uintptr_t LinuxThread::GetThreadStackBottom(uintptr_t current_ebp) const {
       
 10666 -  void **sp = reinterpret_cast<void **>(current_ebp);
       
 10667 -  void **previous_sp = sp;
       
 10668 -  while (sp && IsAddressMapped((uintptr_t)sp)) {
       
 10669 -    previous_sp = sp;
       
 10670 -    sp = reinterpret_cast<void **>(GetNextFrame(sp));
       
 10671 -  }
       
 10672 -  return (uintptr_t)previous_sp;
       
 10673 -}
       
 10674 -
       
 10675 -int LinuxThread::GetModuleCount() const {
       
 10676 -  return ListModules(NULL);
       
 10677 -}
       
 10678 -
       
 10679 -int LinuxThread::ListModules(
       
 10680 -    CallbackParam<ModuleCallback> *callback_param) const {
       
 10681 -  char line[512];
       
 10682 -  const char *maps_path = "/proc/self/maps";
       
 10683 -
       
 10684 -  int module_count = 0;
       
 10685 -  FILE *fp = fopen(maps_path, "r");
       
 10686 -  if (fp == NULL)
       
 10687 -    return -1;
       
 10688 -
       
 10689 -  uintptr_t start_addr;
       
 10690 -  uintptr_t end_addr;
       
 10691 -  while (fgets(line, sizeof(line), fp) != NULL) {
       
 10692 -    if (sscanf(line, "%x-%x", &start_addr, &end_addr) == 2) {
       
 10693 -      ModuleInfo module;
       
 10694 -      memset(&module, 0, sizeof(module));
       
 10695 -      module.start_addr = start_addr;
       
 10696 -      module.size = end_addr - start_addr;
       
 10697 -      char *name = NULL;
       
 10698 -      assert(module.size > 0);
       
 10699 -      // Only copy name if the name is a valid path name.
       
 10700 -      if ((name = strchr(line, '/')) != NULL) {
       
 10701 -        // Get rid of the last '\n' in line
       
 10702 -        char *last_return = strchr(line, '\n');
       
 10703 -        if (last_return != NULL)
       
 10704 -          *last_return = '\0';
       
 10705 -        // Keep a space for the ending 0.
       
 10706 -        strncpy(module.name, name, sizeof(module.name) - 1);
       
 10707 -        ++module_count;
       
 10708 -      }
       
 10709 -      if (callback_param &&
       
 10710 -          !(callback_param->call_back(module, callback_param->context)))
       
 10711 -        break;
       
 10712 -    }
       
 10713 -  }
       
 10714 -  fclose(fp);
       
 10715 -  return module_count;
       
 10716 -}
       
 10717 -
       
 10718 -// Parse /proc/$pid/tasks to list all the threads of the process identified by
       
 10719 -// pid.
       
 10720 -int LinuxThread::IterateProcSelfTask(int pid,
       
 10721 -                          CallbackParam<PidCallback> *callback_param) const {
       
 10722 -  char task_path[80];
       
 10723 -  FillProcPath(pid, task_path, sizeof(task_path));
       
 10724 -  strcat(task_path, "task");
       
 10725 -
       
 10726 -  DIR *dir = opendir(task_path);
       
 10727 -  if (dir == NULL)
       
 10728 -    return -1;
       
 10729 -
       
 10730 -  int pid_number = 0;
       
 10731 -  // Record the last pid we've found. This is used for duplicated thread
       
 10732 -  // removal. Duplicated thread information can be found in /proc/$pid/tasks.
       
 10733 -  int last_pid = -1;
       
 10734 -  struct dirent *entry = NULL;
       
 10735 -  while ((entry = readdir(dir)) != NULL) {
       
 10736 -    if (strcmp(entry->d_name, ".") &&
       
 10737 -        strcmp(entry->d_name, "..")) {
       
 10738 -      int tpid = 0;
       
 10739 -      if (LocalAtoi(entry->d_name, &tpid) &&
       
 10740 -          last_pid != tpid) {
       
 10741 -        last_pid = tpid;
       
 10742 -        ++pid_number;
       
 10743 -        // Invoke the callback.
       
 10744 -        if (callback_param &&
       
 10745 -            !(callback_param->call_back)(tpid, callback_param->context))
       
 10746 -          break;
       
 10747 -      }
       
 10748 -    }
       
 10749 -  }
       
 10750 -  closedir(dir);
       
 10751 -  return pid_number;
       
 10752 -}
       
 10753 -
       
 10754 -// Check if the address is a valid virtual address.
       
 10755 -// If the address is in any of the mapped modules, we take it as valid.
       
 10756 -// Otherwise it is invalid.
       
 10757 -bool LinuxThread::IsAddressMapped(uintptr_t address) const {
       
 10758 -  AddressValidatingContext addr;
       
 10759 -  addr.address = address;
       
 10760 -  CallbackParam<ModuleCallback> callback_param(IsAddressInModuleCallback,
       
 10761 -                                               &addr);
       
 10762 -  ListModules(&callback_param);
       
 10763 -  return addr.is_mapped;
       
 10764 -}
       
 10765 -
       
 10766 -bool LinuxThread::FindSigContext(uintptr_t sighandler_ebp,
       
 10767 -                                 struct sigcontext **sig_ctx) {
       
 10768 -  uintptr_t previous_ebp;
       
 10769 -  const int MAX_STACK_DEPTH = 10;
       
 10770 -  int depth_counter = 0;
       
 10771 -
       
 10772 -  do {
       
 10773 -    // We're looking for a |struct sigcontext| as the second parameter
       
 10774 -    // to a signal handler function call.  Luckily, the sigcontext
       
 10775 -    // has an ebp member which should match the ebp pointed to
       
 10776 -    // by the ebp of the signal handler frame.
       
 10777 -    previous_ebp = reinterpret_cast<uintptr_t>(GetNextFrame(
       
 10778 -                                  reinterpret_cast<void**>(sighandler_ebp)));
       
 10779 -    // The stack looks like this:
       
 10780 -    // | previous ebp | previous eip | first param | second param |,
       
 10781 -    // so we need to offset by 3 to get to the second parameter.
       
 10782 -    *sig_ctx = reinterpret_cast<struct sigcontext*>(sighandler_ebp +
       
 10783 -                                                    3 * sizeof(uintptr_t));
       
 10784 -    sighandler_ebp = previous_ebp;
       
 10785 -    depth_counter++;
       
 10786 -  } while(previous_ebp != (*sig_ctx)->ebp && sighandler_ebp != 0 &&
       
 10787 -          IsAddressMapped(sighandler_ebp) && depth_counter < MAX_STACK_DEPTH);
       
 10788 -
       
 10789 -  return previous_ebp == (*sig_ctx)->ebp && previous_ebp != 0;
       
 10790 -}
       
 10791 -
       
 10792 -}  // namespace google_breakpad
       
 10793 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread.h b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread.h
       
 10794 deleted file mode 100644
       
 10795 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread.h
       
 10796 +++ /dev/null
       
 10797 @@ -1,204 +0,0 @@
       
 10798 -// Copyright (c) 2006, Google Inc.
       
 10799 -// All rights reserved.
       
 10800 -//
       
 10801 -// Author: Li Liu
       
 10802 -//
       
 10803 -// Redistribution and use in source and binary forms, with or without
       
 10804 -// modification, are permitted provided that the following conditions are
       
 10805 -// met:
       
 10806 -//
       
 10807 -//     * Redistributions of source code must retain the above copyright
       
 10808 -// notice, this list of conditions and the following disclaimer.
       
 10809 -//     * Redistributions in binary form must reproduce the above
       
 10810 -// copyright notice, this list of conditions and the following disclaimer
       
 10811 -// in the documentation and/or other materials provided with the
       
 10812 -// distribution.
       
 10813 -//     * Neither the name of Google Inc. nor the names of its
       
 10814 -// contributors may be used to endorse or promote products derived from
       
 10815 -// this software without specific prior written permission.
       
 10816 -//
       
 10817 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 10818 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 10819 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 10820 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 10821 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 10822 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 10823 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 10824 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 10825 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 10826 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 10827 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 10828 -//
       
 10829 -#ifndef CLIENT_LINUX_HANDLER_LINUX_THREAD_H__
       
 10830 -#define CLIENT_LINUX_HANDLER_LINUX_THREAD_H__
       
 10831 -
       
 10832 -#include <stdint.h>
       
 10833 -#include <sys/user.h>
       
 10834 -
       
 10835 -namespace google_breakpad {
       
 10836 -
       
 10837 -// Max module path name length.
       
 10838 -#define kMaxModuleNameLength 256
       
 10839 -
       
 10840 -// Holding information about a thread in the process.
       
 10841 -struct ThreadInfo {
       
 10842 -  // Id of the thread group.
       
 10843 -  int tgid;
       
 10844 -  // Id of the thread.
       
 10845 -  int pid;
       
 10846 -  // Id of the parent process.
       
 10847 -  int ppid;
       
 10848 -};
       
 10849 -
       
 10850 -// Holding infomaton about a module in the process.
       
 10851 -struct ModuleInfo {
       
 10852 -  char name[kMaxModuleNameLength];
       
 10853 -  uintptr_t start_addr;
       
 10854 -  int size;
       
 10855 -};
       
 10856 -
       
 10857 -// Holding debug registers.
       
 10858 -struct DebugRegs {
       
 10859 -  int dr0;
       
 10860 -  int dr1;
       
 10861 -  int dr2;
       
 10862 -  int dr3;
       
 10863 -  int dr4;
       
 10864 -  int dr5;
       
 10865 -  int dr6;
       
 10866 -  int dr7;
       
 10867 -};
       
 10868 -
       
 10869 -// A callback to run when got a thread in the process.
       
 10870 -// Return true will go on to the next thread while return false will stop the
       
 10871 -// iteration.
       
 10872 -typedef bool (*ThreadCallback)(const ThreadInfo &thread_info, void *context);
       
 10873 -
       
 10874 -// A callback to run when a new module is found in the process.
       
 10875 -// Return true will go on to the next module while return false will stop the
       
 10876 -// iteration.
       
 10877 -typedef bool (*ModuleCallback)(const ModuleInfo &module_info, void *context);
       
 10878 -
       
 10879 -// Holding the callback information.
       
 10880 -template<class CallbackFunc>
       
 10881 -struct CallbackParam {
       
 10882 -  // Callback function address.
       
 10883 -  CallbackFunc call_back;
       
 10884 -  // Callback context;
       
 10885 -  void *context;
       
 10886 -
       
 10887 -  CallbackParam() : call_back(NULL), context(NULL) {
       
 10888 -  }
       
 10889 -
       
 10890 -  CallbackParam(CallbackFunc func, void *func_context) :
       
 10891 -    call_back(func), context(func_context) {
       
 10892 -  }
       
 10893 -};
       
 10894 -
       
 10895 -///////////////////////////////////////////////////////////////////////////////
       
 10896 -
       
 10897 -//
       
 10898 -// LinuxThread
       
 10899 -//
       
 10900 -// Provides handy support for operation on linux threads.
       
 10901 -// It uses ptrace to get thread registers. Since ptrace only works in a
       
 10902 -// different process other than the one being ptraced, user of this class
       
 10903 -// should create another process before using the class.
       
 10904 -//
       
 10905 -// The process should be created in the following way:
       
 10906 -//    int cloned_pid = clone(ProcessEntryFunction, stack_address,
       
 10907 -//                           CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_UNTRACED,
       
 10908 -//                           (void*)&arguments);
       
 10909 -//    waitpid(cloned_pid, NULL, __WALL);
       
 10910 -//
       
 10911 -// If CLONE_VM is not used, GetThreadStackBottom, GetThreadStackDump
       
 10912 -// will not work since it just use memcpy to get the stack dump.
       
 10913 -//
       
 10914 -class LinuxThread {
       
 10915 - public:
       
 10916 -  // Create a LinuxThread instance to list all the threads in a process.
       
 10917 -  explicit LinuxThread(int pid);
       
 10918 -  ~LinuxThread();
       
 10919 -
       
 10920 -  // Stop all the threads in the process.
       
 10921 -  // Return the number of stopped threads in the process.
       
 10922 -  // Return -1 means failed to stop threads.
       
 10923 -  int SuspendAllThreads();
       
 10924 -
       
 10925 -  // Resume all the suspended threads.
       
 10926 -  void ResumeAllThreads() const;
       
 10927 -
       
 10928 -  // Get the count of threads in the process.
       
 10929 -  // Return -1 means error.
       
 10930 -  int GetThreadCount() const;
       
 10931 -
       
 10932 -  // List the threads of process.
       
 10933 -  // Whenever there is a thread found, the callback will be invoked to process
       
 10934 -  // the information.
       
 10935 -  // Return number of threads listed.
       
 10936 -  int ListThreads(CallbackParam<ThreadCallback> *thread_callback_param) const;
       
 10937 -
       
 10938 -  // Get the general purpose registers of a thread.
       
 10939 -  // The caller must get the thread pid by ListThreads.
       
 10940 -  bool GetRegisters(int pid, user_regs_struct *regs) const;
       
 10941 -
       
 10942 -  // Get the floating-point registers of a thread.
       
 10943 -  // The caller must get the thread pid by ListThreads.
       
 10944 -  bool GetFPRegisters(int pid, user_fpregs_struct *regs) const;
       
 10945 -
       
 10946 -  // Get all the extended floating-point registers. May not work on all
       
 10947 -  // machines.
       
 10948 -  // The caller must get the thread pid by ListThreads.
       
 10949 -  bool GetFPXRegisters(int pid, user_fpxregs_struct *regs) const;
       
 10950 -
       
 10951 -  // Get the debug registers.
       
 10952 -  // The caller must get the thread pid by ListThreads.
       
 10953 -  bool GetDebugRegisters(int pid, DebugRegs *regs) const;
       
 10954 -
       
 10955 -  // Get the stack memory dump.
       
 10956 -  int GetThreadStackDump(uintptr_t current_ebp,
       
 10957 -                         uintptr_t current_esp,
       
 10958 -                         void *buf,
       
 10959 -                         int buf_size) const;
       
 10960 -
       
 10961 -  // Get the module count of the current process.
       
 10962 -  int GetModuleCount() const;
       
 10963 -
       
 10964 -  // Get the mapped modules in the address space.
       
 10965 -  // Whenever a module is found, the callback will be invoked to process the
       
 10966 -  // information.
       
 10967 -  // Return how may modules are found.
       
 10968 -  int ListModules(CallbackParam<ModuleCallback> *callback_param) const;
       
 10969 -
       
 10970 -  // Get the bottom of the stack from ebp.
       
 10971 -  uintptr_t GetThreadStackBottom(uintptr_t current_ebp) const;
       
 10972 -
       
 10973 -  // Finds a sigcontext on the stack given the ebp of our signal handler.
       
 10974 -  bool FindSigContext(uintptr_t sighandler_ebp, struct sigcontext **sig_ctx);
       
 10975 -
       
 10976 - private:
       
 10977 -  // This callback will run when a new thread has been found.
       
 10978 -  typedef bool (*PidCallback)(int pid, void *context);
       
 10979 -
       
 10980 -  // Read thread information from /proc/$pid/task.
       
 10981 -  // Whenever a thread has been found, and callback will be invoked with
       
 10982 -  // the pid of the thread.
       
 10983 -  // Return number of threads found.
       
 10984 -  // Return -1 means the directory doesn't exist.
       
 10985 -  int IterateProcSelfTask(int pid,
       
 10986 -                          CallbackParam<PidCallback> *callback_param) const;
       
 10987 -
       
 10988 -  // Check if the address is a valid virtual address.
       
 10989 -  bool IsAddressMapped(uintptr_t address) const;
       
 10990 -
       
 10991 - private:
       
 10992 -  // The pid of the process we are listing threads.
       
 10993 -  int pid_;
       
 10994 -
       
 10995 -  // Mark if we have suspended the threads.
       
 10996 -  bool threads_suspened_;
       
 10997 -};
       
 10998 -
       
 10999 -}  // namespace google_breakpad
       
 11000 -
       
 11001 -#endif  // CLIENT_LINUX_HANDLER_LINUX_THREAD_H__
       
 11002 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread_test.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread_test.cc
       
 11003 deleted file mode 100644
       
 11004 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/linux_thread_test.cc
       
 11005 +++ /dev/null
       
 11006 @@ -1,224 +0,0 @@
       
 11007 -// Copyright (c) 2006, Google Inc.
       
 11008 -// All rights reserved.
       
 11009 -//
       
 11010 -// Author: Li Liu
       
 11011 -//
       
 11012 -// Redistribution and use in source and binary forms, with or without
       
 11013 -// modification, are permitted provided that the following conditions are
       
 11014 -// met:
       
 11015 -//
       
 11016 -//     * Redistributions of source code must retain the above copyright
       
 11017 -// notice, this list of conditions and the following disclaimer.
       
 11018 -//     * Redistributions in binary form must reproduce the above
       
 11019 -// copyright notice, this list of conditions and the following disclaimer
       
 11020 -// in the documentation and/or other materials provided with the
       
 11021 -// distribution.
       
 11022 -//     * Neither the name of Google Inc. nor the names of its
       
 11023 -// contributors may be used to endorse or promote products derived from
       
 11024 -// this software without specific prior written permission.
       
 11025 -//
       
 11026 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 11027 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 11028 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 11029 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 11030 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 11031 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 11032 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 11033 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 11034 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 11035 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 11036 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 11037 -
       
 11038 -#include <pthread.h>
       
 11039 -#include <sys/types.h>
       
 11040 -#include <unistd.h>
       
 11041 -#include <sys/wait.h>
       
 11042 -
       
 11043 -#include <cstdio>
       
 11044 -#include <cstdlib>
       
 11045 -#include <cstring>
       
 11046 -
       
 11047 -#include "client/linux/handler/linux_thread.h"
       
 11048 -
       
 11049 -using namespace google_breakpad;
       
 11050 -
       
 11051 -// Thread use this to see if it should stop working.
       
 11052 -static bool should_exit = false;
       
 11053 -
       
 11054 -static void foo2(int *a) {
       
 11055 -  // Stack variable, used for debugging stack dumps.
       
 11056 -  int c = 0xcccccccc;
       
 11057 -  c = c;
       
 11058 -  while (!should_exit)
       
 11059 -    sleep(1);
       
 11060 -}
       
 11061 -
       
 11062 -static void foo() {
       
 11063 -  // Stack variable, used for debugging stack dumps.
       
 11064 -  int a = 0xaaaaaaaa;
       
 11065 -  foo2(&a);
       
 11066 -}
       
 11067 -
       
 11068 -static void *thread_main(void *) {
       
 11069 -  // Stack variable, used for debugging stack dumps.
       
 11070 -  int b = 0xbbbbbbbb;
       
 11071 -  b = b;
       
 11072 -  while (!should_exit) {
       
 11073 -    foo();
       
 11074 -  }
       
 11075 -  return NULL;
       
 11076 -}
       
 11077 -
       
 11078 -static void CreateThreads(int num) {
       
 11079 -  pthread_t handle;
       
 11080 -  for (int i = 0; i < num; i++) {
       
 11081 -    if (0 != pthread_create(&handle, NULL, thread_main, NULL))
       
 11082 -      fprintf(stderr, "Failed to create thread.\n");
       
 11083 -    else
       
 11084 -      pthread_detach(handle);
       
 11085 -  }
       
 11086 -}
       
 11087 -
       
 11088 -static bool ProcessOneModule(const struct ModuleInfo &module_info,
       
 11089 -                             void *context) {
       
 11090 -  printf("0x%x[%8d]         %s\n", module_info.start_addr, module_info.size,
       
 11091 -         module_info.name);
       
 11092 -  return true;
       
 11093 -}
       
 11094 -
       
 11095 -static bool ProcessOneThread(const struct ThreadInfo &thread_info,
       
 11096 -                             void *context) {
       
 11097 -  printf("\n\nPID: %d, TGID: %d, PPID: %d\n",
       
 11098 -         thread_info.pid,
       
 11099 -         thread_info.tgid,
       
 11100 -         thread_info.ppid);
       
 11101 -
       
 11102 -  struct user_regs_struct regs;
       
 11103 -  struct user_fpregs_struct fp_regs;
       
 11104 -  struct user_fpxregs_struct fpx_regs;
       
 11105 -  struct DebugRegs dbg_regs;
       
 11106 -
       
 11107 -  LinuxThread *threads = reinterpret_cast<LinuxThread *>(context);
       
 11108 -  memset(&regs, 0, sizeof(regs));
       
 11109 -  if (threads->GetRegisters(thread_info.pid, &regs)) {
       
 11110 -    printf("  gs                           = 0x%lx\n", regs.xgs);
       
 11111 -    printf("  fs                           = 0x%lx\n", regs.xfs);
       
 11112 -    printf("  es                           = 0x%lx\n", regs.xes);
       
 11113 -    printf("  ds                           = 0x%lx\n", regs.xds);
       
 11114 -    printf("  edi                          = 0x%lx\n", regs.edi);
       
 11115 -    printf("  esi                          = 0x%lx\n", regs.esi);
       
 11116 -    printf("  ebx                          = 0x%lx\n", regs.ebx);
       
 11117 -    printf("  edx                          = 0x%lx\n", regs.edx);
       
 11118 -    printf("  ecx                          = 0x%lx\n", regs.ecx);
       
 11119 -    printf("  eax                          = 0x%lx\n", regs.eax);
       
 11120 -    printf("  ebp                          = 0x%lx\n", regs.ebp);
       
 11121 -    printf("  eip                          = 0x%lx\n", regs.eip);
       
 11122 -    printf("  cs                           = 0x%lx\n", regs.xcs);
       
 11123 -    printf("  eflags                       = 0x%lx\n", regs.eflags);
       
 11124 -    printf("  esp                          = 0x%lx\n", regs.esp);
       
 11125 -    printf("  ss                           = 0x%lx\n", regs.xss);
       
 11126 -  } else {
       
 11127 -    fprintf(stderr, "ERROR: Failed to get general purpose registers\n");
       
 11128 -  }
       
 11129 -  memset(&fp_regs, 0, sizeof(fp_regs));
       
 11130 -  if (threads->GetFPRegisters(thread_info.pid, &fp_regs)) {
       
 11131 -    printf("\n Floating point registers:\n");
       
 11132 -    printf("  fctl                         = 0x%lx\n", fp_regs.cwd);
       
 11133 -    printf("  fstat                        = 0x%lx\n", fp_regs.swd);
       
 11134 -    printf("  ftag                         = 0x%lx\n", fp_regs.twd);
       
 11135 -    printf("  fioff                        = 0x%lx\n", fp_regs.fip);
       
 11136 -    printf("  fiseg                        = 0x%lx\n", fp_regs.fcs);
       
 11137 -    printf("  fooff                        = 0x%lx\n", fp_regs.foo);
       
 11138 -    printf("  foseg                        = 0x%lx\n", fp_regs.fos);
       
 11139 -    int st_space_size = sizeof(fp_regs.st_space) / sizeof(fp_regs.st_space[0]);
       
 11140 -    printf("  st_space[%2d]                 = 0x", st_space_size);
       
 11141 -    for (int i = 0; i < st_space_size; ++i)
       
 11142 -      printf("%02lx", fp_regs.st_space[i]);
       
 11143 -    printf("\n");
       
 11144 -  } else {
       
 11145 -    fprintf(stderr, "ERROR: Failed to get floating-point registers\n");
       
 11146 -  }
       
 11147 -  memset(&fpx_regs, 0, sizeof(fpx_regs));
       
 11148 -  if (threads->GetFPXRegisters(thread_info.pid, &fpx_regs)) {
       
 11149 -    printf("\n Extended floating point registers:\n");
       
 11150 -    printf("  fctl                         = 0x%x\n", fpx_regs.cwd);
       
 11151 -    printf("  fstat                        = 0x%x\n", fpx_regs.swd);
       
 11152 -    printf("  ftag                         = 0x%x\n", fpx_regs.twd);
       
 11153 -    printf("  fioff                        = 0x%lx\n", fpx_regs.fip);
       
 11154 -    printf("  fiseg                        = 0x%lx\n", fpx_regs.fcs);
       
 11155 -    printf("  fooff                        = 0x%lx\n", fpx_regs.foo);
       
 11156 -    printf("  foseg                        = 0x%lx\n", fpx_regs.fos);
       
 11157 -    printf("  fop                          = 0x%x\n", fpx_regs.fop);
       
 11158 -    printf("  mxcsr                        = 0x%lx\n", fpx_regs.mxcsr);
       
 11159 -    int space_size = sizeof(fpx_regs.st_space) / sizeof(fpx_regs.st_space[0]);
       
 11160 -    printf("  st_space[%2d]                 = 0x", space_size);
       
 11161 -    for (int i = 0; i < space_size; ++i)
       
 11162 -      printf("%02lx", fpx_regs.st_space[i]);
       
 11163 -    printf("\n");
       
 11164 -    space_size = sizeof(fpx_regs.xmm_space) / sizeof(fpx_regs.xmm_space[0]);
       
 11165 -    printf("  xmm_space[%2d]                = 0x", space_size);
       
 11166 -    for (int i = 0; i < space_size; ++i)
       
 11167 -      printf("%02lx", fpx_regs.xmm_space[i]);
       
 11168 -    printf("\n");
       
 11169 -  }
       
 11170 -  if (threads->GetDebugRegisters(thread_info.pid, &dbg_regs)) {
       
 11171 -    printf("\n Debug registers:\n");
       
 11172 -    printf("  dr0                          = 0x%x\n", dbg_regs.dr0);
       
 11173 -    printf("  dr1                          = 0x%x\n", dbg_regs.dr1);
       
 11174 -    printf("  dr2                          = 0x%x\n", dbg_regs.dr2);
       
 11175 -    printf("  dr3                          = 0x%x\n", dbg_regs.dr3);
       
 11176 -    printf("  dr4                          = 0x%x\n", dbg_regs.dr4);
       
 11177 -    printf("  dr5                          = 0x%x\n", dbg_regs.dr5);
       
 11178 -    printf("  dr6                          = 0x%x\n", dbg_regs.dr6);
       
 11179 -    printf("  dr7                          = 0x%x\n", dbg_regs.dr7);
       
 11180 -    printf("\n");
       
 11181 -  }
       
 11182 -  if (regs.esp != 0) {
       
 11183 -    // Print the stack content.
       
 11184 -    int size = 1024 * 2;
       
 11185 -    char *buf = new char[size];
       
 11186 -    size = threads->GetThreadStackDump(regs.ebp,
       
 11187 -                                       regs.esp,
       
 11188 -                                      (void*)buf, size);
       
 11189 -    printf(" Stack content:                 = 0x");
       
 11190 -    size /= sizeof(unsigned long);
       
 11191 -    unsigned long *p_buf = (unsigned long *)(buf);
       
 11192 -    for (int i = 0; i < size; i += 1)
       
 11193 -      printf("%.8lx ", p_buf[i]);
       
 11194 -    delete []buf;
       
 11195 -    printf("\n");
       
 11196 -  }
       
 11197 -  return true;
       
 11198 -}
       
 11199 -
       
 11200 -static int PrintAllThreads(void *argument) {
       
 11201 -  int pid = (int)argument;
       
 11202 -
       
 11203 -  LinuxThread threads(pid);
       
 11204 -  int total_thread = threads.SuspendAllThreads();
       
 11205 -  printf("There are %d threads in the process: %d\n", total_thread, pid);
       
 11206 -  int total_module = threads.GetModuleCount();
       
 11207 -  printf("There are %d modules in the process: %d\n", total_module, pid);
       
 11208 -  CallbackParam<ModuleCallback> module_callback(ProcessOneModule, &threads);
       
 11209 -  threads.ListModules(&module_callback);
       
 11210 -  CallbackParam<ThreadCallback> thread_callback(ProcessOneThread, &threads);
       
 11211 -  threads.ListThreads(&thread_callback);
       
 11212 -  return 0;
       
 11213 -}
       
 11214 -
       
 11215 -int main(int argc, char **argv) {
       
 11216 -  int pid = getpid();
       
 11217 -  printf("Main thread is %d\n", pid);
       
 11218 -  CreateThreads(1);
       
 11219 -  // Create stack for the process.
       
 11220 -  char *stack = new char[1024 * 100];
       
 11221 -  int cloned_pid = clone(PrintAllThreads, stack + 1024 * 100,
       
 11222 -                           CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_UNTRACED,
       
 11223 -                           (void*)getpid());
       
 11224 -  waitpid(cloned_pid, NULL, __WALL);
       
 11225 -  should_exit = true;
       
 11226 -  printf("Test finished.\n");
       
 11227 -
       
 11228 -  delete []stack;
       
 11229 -  return 0;
       
 11230 -}
       
 11231 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_generator.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_generator.cc
       
 11232 deleted file mode 100644
       
 11233 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_generator.cc
       
 11234 +++ /dev/null
       
 11235 @@ -1,816 +0,0 @@
       
 11236 -// Copyright (c) 2006, Google Inc.
       
 11237 -// All rights reserved.
       
 11238 -//
       
 11239 -// Author: Li Liu
       
 11240 -//
       
 11241 -// Redistribution and use in source and binary forms, with or without
       
 11242 -// modification, are permitted provided that the following conditions are
       
 11243 -// met:
       
 11244 -//
       
 11245 -//     * Redistributions of source code must retain the above copyright
       
 11246 -// notice, this list of conditions and the following disclaimer.
       
 11247 -//     * Redistributions in binary form must reproduce the above
       
 11248 -// copyright notice, this list of conditions and the following disclaimer
       
 11249 -// in the documentation and/or other materials provided with the
       
 11250 -// distribution.
       
 11251 -//     * Neither the name of Google Inc. nor the names of its
       
 11252 -// contributors may be used to endorse or promote products derived from
       
 11253 -// this software without specific prior written permission.
       
 11254 -//
       
 11255 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 11256 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 11257 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 11258 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 11259 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 11260 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 11261 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 11262 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 11263 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 11264 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 11265 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 11266 -
       
 11267 -#include <fcntl.h>
       
 11268 -#include <pthread.h>
       
 11269 -#include <signal.h>
       
 11270 -#include <sys/stat.h>
       
 11271 -#include <sys/types.h>
       
 11272 -#include <unistd.h>
       
 11273 -#include <sys/utsname.h>
       
 11274 -#include <sys/wait.h>
       
 11275 -
       
 11276 -#include <cstdlib>
       
 11277 -#include <ctime>
       
 11278 -#include <string.h>
       
 11279 -#include <stdio.h>
       
 11280 -
       
 11281 -#include "common/linux/file_id.h"
       
 11282 -#include "client/linux/handler/linux_thread.h"
       
 11283 -#include "client/minidump_file_writer.h"
       
 11284 -#include "client/minidump_file_writer-inl.h"
       
 11285 -#include "google_breakpad/common/minidump_format.h"
       
 11286 -#include "client/linux/handler/minidump_generator.h"
       
 11287 -
       
 11288 -#ifndef CLONE_UNTRACED
       
 11289 -#define CLONE_UNTRACED 0x00800000
       
 11290 -#endif
       
 11291 -
       
 11292 -// This unnamed namespace contains helper functions.
       
 11293 -namespace {
       
 11294 -
       
 11295 -using namespace google_breakpad;
       
 11296 -
       
 11297 -// Argument for the writer function.
       
 11298 -struct WriterArgument {
       
 11299 -  MinidumpFileWriter *minidump_writer;
       
 11300 -
       
 11301 -  // Context for the callback.
       
 11302 -  void *version_context;
       
 11303 -
       
 11304 -  // Pid of the thread who called WriteMinidumpToFile
       
 11305 -  int requester_pid;
       
 11306 -
       
 11307 -  // The stack bottom of the thread which caused the dump.
       
 11308 -  // Mainly used to find the thread id of the crashed thread since signal
       
 11309 -  // handler may not be called in the thread who caused it.
       
 11310 -  uintptr_t crashed_stack_bottom;
       
 11311 -
       
 11312 -  // Pid of the crashing thread.
       
 11313 -  int crashed_pid;
       
 11314 -
       
 11315 -  // Signal number when crash happed. Can be 0 if this is a requested dump.
       
 11316 -  int signo;
       
 11317 -
       
 11318 -  // The ebp of the signal handler frame.  Can be zero if this
       
 11319 -  // is a requested dump.
       
 11320 -  uintptr_t sighandler_ebp;
       
 11321 -
       
 11322 -  // Signal context when crash happed. Can be NULL if this is a requested dump.
       
 11323 -  // This is actually an out parameter, but it will be filled in at the start
       
 11324 -  // of the writer thread.
       
 11325 -  struct sigcontext *sig_ctx;
       
 11326 -
       
 11327 -  // Used to get information about the threads.
       
 11328 -  LinuxThread *thread_lister;
       
 11329 -};
       
 11330 -
       
 11331 -// Holding context information for the callback of finding the crashing thread.
       
 11332 -struct FindCrashThreadContext {
       
 11333 -  const LinuxThread *thread_lister;
       
 11334 -  uintptr_t crashing_stack_bottom;
       
 11335 -  int crashing_thread_pid;
       
 11336 -
       
 11337 -  FindCrashThreadContext() :
       
 11338 -    thread_lister(NULL),
       
 11339 -    crashing_stack_bottom(0UL),
       
 11340 -    crashing_thread_pid(-1) {
       
 11341 -  }
       
 11342 -};
       
 11343 -
       
 11344 -// Callback for list threads.
       
 11345 -// It will compare the stack bottom of the provided thread with the stack
       
 11346 -// bottom of the crashed thread, it they are eqaul, this is thread is the one
       
 11347 -// who crashed.
       
 11348 -bool IsThreadCrashedCallback(const ThreadInfo &thread_info, void *context) {
       
 11349 -  FindCrashThreadContext *crashing_context =
       
 11350 -    static_cast<FindCrashThreadContext *>(context);
       
 11351 -  const LinuxThread *thread_lister = crashing_context->thread_lister;
       
 11352 -  struct user_regs_struct regs;
       
 11353 -  if (thread_lister->GetRegisters(thread_info.pid, &regs)) {
       
 11354 -    uintptr_t last_ebp = regs.ebp;
       
 11355 -    uintptr_t stack_bottom = thread_lister->GetThreadStackBottom(last_ebp);
       
 11356 -    if (stack_bottom > last_ebp &&
       
 11357 -        stack_bottom == crashing_context->crashing_stack_bottom) {
       
 11358 -      // Got it. Stop iteration.
       
 11359 -      crashing_context->crashing_thread_pid = thread_info.pid;
       
 11360 -      return false;
       
 11361 -    }
       
 11362 -  }
       
 11363 -  return true;
       
 11364 -}
       
 11365 -
       
 11366 -// Find the crashing thread id.
       
 11367 -// This is done based on stack bottom comparing.
       
 11368 -int FindCrashingThread(uintptr_t crashing_stack_bottom,
       
 11369 -                       int requester_pid,
       
 11370 -                       const LinuxThread *thread_lister) {
       
 11371 -  FindCrashThreadContext context;
       
 11372 -  context.thread_lister = thread_lister;
       
 11373 -  context.crashing_stack_bottom = crashing_stack_bottom;
       
 11374 -  CallbackParam<ThreadCallback> callback_param(IsThreadCrashedCallback,
       
 11375 -                                               &context);
       
 11376 -  thread_lister->ListThreads(&callback_param);
       
 11377 -  return context.crashing_thread_pid;
       
 11378 -}
       
 11379 -
       
 11380 -// Write the thread stack info minidump.
       
 11381 -bool WriteThreadStack(uintptr_t last_ebp,
       
 11382 -                      uintptr_t last_esp,
       
 11383 -                      const LinuxThread *thread_lister,
       
 11384 -                      UntypedMDRVA *memory,
       
 11385 -                      MDMemoryDescriptor *loc) {
       
 11386 -  // Maximum stack size for a thread.
       
 11387 -  uintptr_t stack_bottom = thread_lister->GetThreadStackBottom(last_ebp);
       
 11388 -  if (stack_bottom > last_esp) {
       
 11389 -    int size = stack_bottom - last_esp;
       
 11390 -    if (size > 0) {
       
 11391 -      if (!memory->Allocate(size))
       
 11392 -        return false;
       
 11393 -      memory->Copy(reinterpret_cast<void*>(last_esp), size);
       
 11394 -      loc->start_of_memory_range = 0 | last_esp;
       
 11395 -      loc->memory = memory->location();
       
 11396 -    }
       
 11397 -    return true;
       
 11398 -  }
       
 11399 -  return false;
       
 11400 -}
       
 11401 -
       
 11402 -// Write CPU context based on signal context.
       
 11403 -bool WriteContext(MDRawContextX86 *context, const struct sigcontext *sig_ctx,
       
 11404 -                  const DebugRegs *debug_regs) {
       
 11405 -  assert(sig_ctx != NULL);
       
 11406 -  context->context_flags = MD_CONTEXT_X86_FULL;
       
 11407 -  context->gs = sig_ctx->gs;
       
 11408 -  context->fs = sig_ctx->fs;
       
 11409 -  context->es = sig_ctx->es;
       
 11410 -  context->ds = sig_ctx->ds;
       
 11411 -  context->cs = sig_ctx->cs;
       
 11412 -  context->ss = sig_ctx->ss;
       
 11413 -  context->edi = sig_ctx->edi;
       
 11414 -  context->esi = sig_ctx->esi;
       
 11415 -  context->ebp = sig_ctx->ebp;
       
 11416 -  context->esp = sig_ctx->esp;
       
 11417 -  context->ebx = sig_ctx->ebx;
       
 11418 -  context->edx = sig_ctx->edx;
       
 11419 -  context->ecx = sig_ctx->ecx;
       
 11420 -  context->eax = sig_ctx->eax;
       
 11421 -  context->eip = sig_ctx->eip;
       
 11422 -  context->eflags = sig_ctx->eflags;
       
 11423 -  if (sig_ctx->fpstate != NULL) {
       
 11424 -    context->context_flags = MD_CONTEXT_X86_FULL |
       
 11425 -      MD_CONTEXT_X86_FLOATING_POINT;
       
 11426 -    context->float_save.control_word = sig_ctx->fpstate->cw;
       
 11427 -    context->float_save.status_word = sig_ctx->fpstate->sw;
       
 11428 -    context->float_save.tag_word = sig_ctx->fpstate->tag;
       
 11429 -    context->float_save.error_offset = sig_ctx->fpstate->ipoff;
       
 11430 -    context->float_save.error_selector = sig_ctx->fpstate->cssel;
       
 11431 -    context->float_save.data_offset = sig_ctx->fpstate->dataoff;
       
 11432 -    context->float_save.data_selector = sig_ctx->fpstate->datasel;
       
 11433 -    memcpy(context->float_save.register_area, sig_ctx->fpstate->_st,
       
 11434 -           sizeof(context->float_save.register_area));
       
 11435 -  }
       
 11436 -
       
 11437 -  if (debug_regs != NULL) {
       
 11438 -    context->context_flags |= MD_CONTEXT_X86_DEBUG_REGISTERS;
       
 11439 -    context->dr0 = debug_regs->dr0;
       
 11440 -    context->dr1 = debug_regs->dr1;
       
 11441 -    context->dr2 = debug_regs->dr2;
       
 11442 -    context->dr3 = debug_regs->dr3;
       
 11443 -    context->dr6 = debug_regs->dr6;
       
 11444 -    context->dr7 = debug_regs->dr7;
       
 11445 -  }
       
 11446 -  return true;
       
 11447 -}
       
 11448 -
       
 11449 -// Write CPU context based on provided registers.
       
 11450 -bool WriteContext(MDRawContextX86 *context,
       
 11451 -                  const struct user_regs_struct *regs,
       
 11452 -                  const struct user_fpregs_struct *fp_regs,
       
 11453 -                  const DebugRegs *dbg_regs) {
       
 11454 -  if (!context || !regs)
       
 11455 -    return false;
       
 11456 -
       
 11457 -  context->context_flags = MD_CONTEXT_X86_FULL;
       
 11458 -
       
 11459 -  context->cs = regs->xcs;
       
 11460 -  context->ds = regs->xds;
       
 11461 -  context->es = regs->xes;
       
 11462 -  context->fs = regs->xfs;
       
 11463 -  context->gs = regs->xgs;
       
 11464 -  context->ss = regs->xss;
       
 11465 -  context->edi = regs->edi;
       
 11466 -  context->esi = regs->esi;
       
 11467 -  context->ebx = regs->ebx;
       
 11468 -  context->edx = regs->edx;
       
 11469 -  context->ecx = regs->ecx;
       
 11470 -  context->eax = regs->eax;
       
 11471 -  context->ebp = regs->ebp;
       
 11472 -  context->eip = regs->eip;
       
 11473 -  context->esp = regs->esp;
       
 11474 -  context->eflags = regs->eflags;
       
 11475 -
       
 11476 -  if (dbg_regs != NULL) {
       
 11477 -    context->context_flags |= MD_CONTEXT_X86_DEBUG_REGISTERS;
       
 11478 -    context->dr0 = dbg_regs->dr0;
       
 11479 -    context->dr1 = dbg_regs->dr1;
       
 11480 -    context->dr2 = dbg_regs->dr2;
       
 11481 -    context->dr3 = dbg_regs->dr3;
       
 11482 -    context->dr6 = dbg_regs->dr6;
       
 11483 -    context->dr7 = dbg_regs->dr7;
       
 11484 -  }
       
 11485 -
       
 11486 -  if (fp_regs != NULL) {
       
 11487 -    context->context_flags |= MD_CONTEXT_X86_FLOATING_POINT;
       
 11488 -    context->float_save.control_word = fp_regs->cwd;
       
 11489 -    context->float_save.status_word = fp_regs->swd;
       
 11490 -    context->float_save.tag_word = fp_regs->twd;
       
 11491 -    context->float_save.error_offset = fp_regs->fip;
       
 11492 -    context->float_save.error_selector = fp_regs->fcs;
       
 11493 -    context->float_save.data_offset = fp_regs->foo;
       
 11494 -    context->float_save.data_selector = fp_regs->fos;
       
 11495 -    context->float_save.data_selector = fp_regs->fos;
       
 11496 -
       
 11497 -    memcpy(context->float_save.register_area, fp_regs->st_space,
       
 11498 -           sizeof(context->float_save.register_area));
       
 11499 -  }
       
 11500 -  return true;
       
 11501 -}
       
 11502 -
       
 11503 -// Write information about a crashed thread.
       
 11504 -// When a thread crash, kernel will write something on the stack for processing
       
 11505 -// signal. This makes the current stack not reliable, and our stack walker
       
 11506 -// won't figure out the whole call stack for this. So we write the stack at the
       
 11507 -// time of the crash into the minidump file, not the current stack.
       
 11508 -bool WriteCrashedThreadStream(MinidumpFileWriter *minidump_writer,
       
 11509 -                       const WriterArgument *writer_args,
       
 11510 -                       const ThreadInfo &thread_info,
       
 11511 -                       MDRawThread *thread) {
       
 11512 -  assert(writer_args->sig_ctx != NULL);
       
 11513 -
       
 11514 -  thread->thread_id = thread_info.pid;
       
 11515 -
       
 11516 -  UntypedMDRVA memory(minidump_writer);
       
 11517 -  if (!WriteThreadStack(writer_args->sig_ctx->ebp,
       
 11518 -                        writer_args->sig_ctx->esp,
       
 11519 -                        writer_args->thread_lister,
       
 11520 -                        &memory,
       
 11521 -                        &thread->stack))
       
 11522 -    return false;
       
 11523 -
       
 11524 -  TypedMDRVA<MDRawContextX86> context(minidump_writer);
       
 11525 -  if (!context.Allocate())
       
 11526 -    return false;
       
 11527 -  thread->thread_context = context.location();
       
 11528 -  memset(context.get(), 0, sizeof(MDRawContextX86));
       
 11529 -  return WriteContext(context.get(), writer_args->sig_ctx, NULL);
       
 11530 -}
       
 11531 -
       
 11532 -// Write information about a thread.
       
 11533 -// This function only processes thread running normally at the crash.
       
 11534 -bool WriteThreadStream(MinidumpFileWriter *minidump_writer,
       
 11535 -                       const LinuxThread *thread_lister,
       
 11536 -                       const ThreadInfo &thread_info,
       
 11537 -                       MDRawThread *thread) {
       
 11538 -  thread->thread_id = thread_info.pid;
       
 11539 -
       
 11540 -  struct user_regs_struct regs;
       
 11541 -  memset(&regs, 0, sizeof(regs));
       
 11542 -  if (!thread_lister->GetRegisters(thread_info.pid, &regs)) {
       
 11543 -    perror(NULL);
       
 11544 -    return false;
       
 11545 -  }
       
 11546 -
       
 11547 -  UntypedMDRVA memory(minidump_writer);
       
 11548 -  if (!WriteThreadStack(regs.ebp,
       
 11549 -                   regs.esp,
       
 11550 -                   thread_lister,
       
 11551 -                   &memory,
       
 11552 -                   &thread->stack))
       
 11553 -    return false;
       
 11554 -
       
 11555 -  struct user_fpregs_struct fp_regs;
       
 11556 -  DebugRegs dbg_regs;
       
 11557 -  memset(&fp_regs, 0, sizeof(fp_regs));
       
 11558 -  // Get all the registers.
       
 11559 -  thread_lister->GetFPRegisters(thread_info.pid, &fp_regs);
       
 11560 -  thread_lister->GetDebugRegisters(thread_info.pid, &dbg_regs);
       
 11561 -
       
 11562 -  // Write context
       
 11563 -  TypedMDRVA<MDRawContextX86> context(minidump_writer);
       
 11564 -  if (!context.Allocate())
       
 11565 -    return false;
       
 11566 -  thread->thread_context = context.location();
       
 11567 -  memset(context.get(), 0, sizeof(MDRawContextX86));
       
 11568 -  return WriteContext(context.get(), &regs, &fp_regs, &dbg_regs);
       
 11569 -}
       
 11570 -
       
 11571 -bool WriteCPUInformation(MDRawSystemInfo *sys_info) {
       
 11572 -  const char *proc_cpu_path = "/proc/cpuinfo";
       
 11573 -  char line[128];
       
 11574 -  char vendor_id[13];
       
 11575 -  const char vendor_id_name[] = "vendor_id";
       
 11576 -  const size_t vendor_id_name_length = sizeof(vendor_id_name) - 1;
       
 11577 -
       
 11578 -  struct CpuInfoEntry {
       
 11579 -    const char *info_name;
       
 11580 -    int value;
       
 11581 -  } cpu_info_table[] = {
       
 11582 -    { "processor", -1 },
       
 11583 -    { "model", 0 },
       
 11584 -    { "stepping",  0 },
       
 11585 -    { "cpuid level", 0 },
       
 11586 -    { NULL, -1 },
       
 11587 -  };
       
 11588 -
       
 11589 -  memset(vendor_id, 0, sizeof(vendor_id));
       
 11590 -
       
 11591 -  FILE *fp = fopen(proc_cpu_path, "r");
       
 11592 -  if (fp != NULL) {
       
 11593 -    while (fgets(line, sizeof(line), fp)) {
       
 11594 -      CpuInfoEntry *entry = &cpu_info_table[0];
       
 11595 -      while (entry->info_name != NULL) {
       
 11596 -        if (!strncmp(line, entry->info_name, strlen(entry->info_name))) {
       
 11597 -          char *value = strchr(line, ':');
       
 11598 -          value++;
       
 11599 -          if (value != NULL)
       
 11600 -            sscanf(value, " %d", &(entry->value));
       
 11601 -        }
       
 11602 -        entry++;
       
 11603 -      }
       
 11604 -
       
 11605 -      // special case for vendor_id
       
 11606 -      if (!strncmp(line, vendor_id_name, vendor_id_name_length)) {
       
 11607 -        char *value = strchr(line, ':');
       
 11608 -        if (value == NULL)
       
 11609 -          continue;
       
 11610 -
       
 11611 -        value++;
       
 11612 -        while (*value && isspace(*value))
       
 11613 -          value++;
       
 11614 -        if (*value) {
       
 11615 -          size_t length = strlen(value);
       
 11616 -          // we don't want the trailing newline
       
 11617 -          if (value[length - 1] == '\n')
       
 11618 -            length--;
       
 11619 -          // ensure we have space for the value
       
 11620 -          if (length < sizeof(vendor_id))
       
 11621 -            strncpy(vendor_id, value, length);
       
 11622 -        }
       
 11623 -      }
       
 11624 -    }
       
 11625 -    fclose(fp);
       
 11626 -  }
       
 11627 -
       
 11628 -  // /proc/cpuinfo contains cpu id, change it into number by adding one.
       
 11629 -  cpu_info_table[0].value++;
       
 11630 -
       
 11631 -  sys_info->number_of_processors = cpu_info_table[0].value;
       
 11632 -  sys_info->processor_level      = cpu_info_table[3].value;
       
 11633 -  sys_info->processor_revision   = cpu_info_table[1].value << 8 |
       
 11634 -                                   cpu_info_table[2].value;
       
 11635 -
       
 11636 -  sys_info->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN;
       
 11637 -  struct utsname uts;
       
 11638 -  if (uname(&uts) == 0) {
       
 11639 -    // Match i*86 and x86* as X86 architecture.
       
 11640 -    if ((strstr(uts.machine, "x86") == uts.machine) ||
       
 11641 -        (strlen(uts.machine) == 4 &&
       
 11642 -         uts.machine[0] == 'i' &&
       
 11643 -         uts.machine[2] == '8' &&
       
 11644 -         uts.machine[3] == '6')) {
       
 11645 -      sys_info->processor_architecture = MD_CPU_ARCHITECTURE_X86;
       
 11646 -      if (vendor_id[0] != '\0')
       
 11647 -        memcpy(sys_info->cpu.x86_cpu_info.vendor_id, vendor_id,
       
 11648 -               sizeof(sys_info->cpu.x86_cpu_info.vendor_id));
       
 11649 -    }
       
 11650 -  }
       
 11651 -  return true;
       
 11652 -}
       
 11653 -
       
 11654 -bool WriteOSInformation(MinidumpFileWriter *minidump_writer,
       
 11655 -                        MDRawSystemInfo *sys_info) {
       
 11656 -  sys_info->platform_id = MD_OS_LINUX;
       
 11657 -
       
 11658 -  struct utsname uts;
       
 11659 -  if (uname(&uts) == 0) {
       
 11660 -    char os_version[512];
       
 11661 -    size_t space_left = sizeof(os_version);
       
 11662 -    memset(os_version, 0, space_left);
       
 11663 -    const char *os_info_table[] = {
       
 11664 -      uts.sysname,
       
 11665 -      uts.release,
       
 11666 -      uts.version,
       
 11667 -      uts.machine,
       
 11668 -      "GNU/Linux",
       
 11669 -      NULL
       
 11670 -    };
       
 11671 -    for (const char **cur_os_info = os_info_table;
       
 11672 -         *cur_os_info != NULL;
       
 11673 -         cur_os_info++) {
       
 11674 -      if (cur_os_info != os_info_table && space_left > 1) {
       
 11675 -        strcat(os_version, " ");
       
 11676 -        space_left--;
       
 11677 -      }
       
 11678 -      if (space_left > strlen(*cur_os_info)) {
       
 11679 -        strcat(os_version, *cur_os_info);
       
 11680 -        space_left -= strlen(*cur_os_info);
       
 11681 -      } else {
       
 11682 -        break;
       
 11683 -      }
       
 11684 -    }
       
 11685 -
       
 11686 -    MDLocationDescriptor location;
       
 11687 -    if (!minidump_writer->WriteString(os_version, 0, &location))
       
 11688 -      return false;
       
 11689 -    sys_info->csd_version_rva = location.rva;
       
 11690 -  }
       
 11691 -  return true;
       
 11692 -}
       
 11693 -
       
 11694 -// Callback context for get writting thread information.
       
 11695 -struct ThreadInfoCallbackCtx {
       
 11696 -  MinidumpFileWriter *minidump_writer;
       
 11697 -  const WriterArgument *writer_args;
       
 11698 -  TypedMDRVA<MDRawThreadList> *list;
       
 11699 -  int thread_index;
       
 11700 -};
       
 11701 -
       
 11702 -// Callback run for writing threads information in the process.
       
 11703 -bool ThreadInfomationCallback(const ThreadInfo &thread_info,
       
 11704 -                                 void *context) {
       
 11705 -  ThreadInfoCallbackCtx *callback_context =
       
 11706 -    static_cast<ThreadInfoCallbackCtx *>(context);
       
 11707 -  bool success = true;
       
 11708 -  MDRawThread thread;
       
 11709 -  memset(&thread, 0, sizeof(MDRawThread));
       
 11710 -  if (thread_info.pid != callback_context->writer_args->crashed_pid ||
       
 11711 -      callback_context->writer_args->sig_ctx == NULL) {
       
 11712 -    success = WriteThreadStream(callback_context->minidump_writer,
       
 11713 -                           callback_context->writer_args->thread_lister,
       
 11714 -                           thread_info, &thread);
       
 11715 -  } else {
       
 11716 -    success = WriteCrashedThreadStream(callback_context->minidump_writer,
       
 11717 -                                       callback_context->writer_args,
       
 11718 -                                       thread_info, &thread);
       
 11719 -  }
       
 11720 -  if (success) {
       
 11721 -    callback_context->list->CopyIndexAfterObject(
       
 11722 -        callback_context->thread_index++,
       
 11723 -        &thread, sizeof(MDRawThread));
       
 11724 -  }
       
 11725 -  return success;
       
 11726 -}
       
 11727 -
       
 11728 -// Stream writers
       
 11729 -bool WriteThreadListStream(MinidumpFileWriter *minidump_writer,
       
 11730 -                           const WriterArgument *writer_args,
       
 11731 -                           MDRawDirectory *dir) {
       
 11732 -  // Get the thread information.
       
 11733 -  const LinuxThread *thread_lister = writer_args->thread_lister;
       
 11734 -  int thread_count = thread_lister->GetThreadCount();
       
 11735 -  if (thread_count < 0)
       
 11736 -    return false;
       
 11737 -  TypedMDRVA<MDRawThreadList> list(minidump_writer);
       
 11738 -  if (!list.AllocateObjectAndArray(thread_count, sizeof(MDRawThread)))
       
 11739 -    return false;
       
 11740 -  dir->stream_type = MD_THREAD_LIST_STREAM;
       
 11741 -  dir->location = list.location();
       
 11742 -  list.get()->number_of_threads = thread_count;
       
 11743 -
       
 11744 -  ThreadInfoCallbackCtx context;
       
 11745 -  context.minidump_writer = minidump_writer;
       
 11746 -  context.writer_args = writer_args;
       
 11747 -  context.list = &list;
       
 11748 -  context.thread_index = 0;
       
 11749 -  CallbackParam<ThreadCallback> callback_param(ThreadInfomationCallback,
       
 11750 -                                               &context);
       
 11751 -  int written = thread_lister->ListThreads(&callback_param);
       
 11752 -  return written == thread_count;
       
 11753 -}
       
 11754 -
       
 11755 -bool WriteCVRecord(MinidumpFileWriter *minidump_writer,
       
 11756 -                   MDRawModule *module,
       
 11757 -                   const char *module_path) {
       
 11758 -  TypedMDRVA<MDCVInfoPDB70> cv(minidump_writer);
       
 11759 -
       
 11760 -  // Only return the last path component of the full module path
       
 11761 -  const char *module_name = strrchr(module_path, '/');
       
 11762 -  // Increment past the slash
       
 11763 -  if (module_name)
       
 11764 -    ++module_name;
       
 11765 -  else
       
 11766 -    module_name = "<Unknown>";
       
 11767 -
       
 11768 -  size_t module_name_length = strlen(module_name);
       
 11769 -  if (!cv.AllocateObjectAndArray(module_name_length + 1, sizeof(u_int8_t)))
       
 11770 -    return false;
       
 11771 -  if (!cv.CopyIndexAfterObject(0, const_cast<char *>(module_name),
       
 11772 -                               module_name_length))
       
 11773 -    return false;
       
 11774 -
       
 11775 -  module->cv_record = cv.location();
       
 11776 -  MDCVInfoPDB70 *cv_ptr = cv.get();
       
 11777 -  memset(cv_ptr, 0, sizeof(MDCVInfoPDB70));
       
 11778 -  cv_ptr->cv_signature = MD_CVINFOPDB70_SIGNATURE;
       
 11779 -  cv_ptr->age = 0;
       
 11780 -
       
 11781 -  // Get the module identifier
       
 11782 -  FileID file_id(module_path);
       
 11783 -  unsigned char identifier[16];
       
 11784 -
       
 11785 -  if (file_id.ElfFileIdentifier(identifier)) {
       
 11786 -    cv_ptr->signature.data1 = (uint32_t)identifier[0] << 24 |
       
 11787 -      (uint32_t)identifier[1] << 16 | (uint32_t)identifier[2] << 8 |
       
 11788 -      (uint32_t)identifier[3];
       
 11789 -    cv_ptr->signature.data2 = (uint32_t)identifier[4] << 8 | identifier[5];
       
 11790 -    cv_ptr->signature.data3 = (uint32_t)identifier[6] << 8 | identifier[7];
       
 11791 -    cv_ptr->signature.data4[0] = identifier[8];
       
 11792 -    cv_ptr->signature.data4[1] = identifier[9];
       
 11793 -    cv_ptr->signature.data4[2] = identifier[10];
       
 11794 -    cv_ptr->signature.data4[3] = identifier[11];
       
 11795 -    cv_ptr->signature.data4[4] = identifier[12];
       
 11796 -    cv_ptr->signature.data4[5] = identifier[13];
       
 11797 -    cv_ptr->signature.data4[6] = identifier[14];
       
 11798 -    cv_ptr->signature.data4[7] = identifier[15];
       
 11799 -  }
       
 11800 -  return true;
       
 11801 -}
       
 11802 -
       
 11803 -struct ModuleInfoCallbackCtx {
       
 11804 -  MinidumpFileWriter *minidump_writer;
       
 11805 -  const WriterArgument *writer_args;
       
 11806 -  TypedMDRVA<MDRawModuleList> *list;
       
 11807 -  int module_index;
       
 11808 -};
       
 11809 -
       
 11810 -bool ModuleInfoCallback(const ModuleInfo &module_info,
       
 11811 -                           void *context) {
       
 11812 -  ModuleInfoCallbackCtx *callback_context =
       
 11813 -    static_cast<ModuleInfoCallbackCtx *>(context);
       
 11814 -  // Skip those modules without name, or those that are not modules.
       
 11815 -  if (strlen(module_info.name) == 0 ||
       
 11816 -      !strchr(module_info.name, '/'))
       
 11817 -    return true;
       
 11818 -
       
 11819 -  MDRawModule module;
       
 11820 -  memset(&module, 0, sizeof(module));
       
 11821 -  MDLocationDescriptor loc;
       
 11822 -  if (!callback_context->minidump_writer->WriteString(module_info.name, 0,
       
 11823 -                                                      &loc))
       
 11824 -    return false;
       
 11825 -  module.base_of_image = (u_int64_t)module_info.start_addr;
       
 11826 -  module.size_of_image = module_info.size;
       
 11827 -  module.module_name_rva = loc.rva;
       
 11828 -
       
 11829 -  if (!WriteCVRecord(callback_context->minidump_writer, &module,
       
 11830 -                     module_info.name))
       
 11831 -    return false;
       
 11832 -  callback_context->list->CopyIndexAfterObject(
       
 11833 -      callback_context->module_index++, &module, MD_MODULE_SIZE);
       
 11834 -  return true;
       
 11835 -}
       
 11836 -
       
 11837 -bool WriteModuleListStream(MinidumpFileWriter *minidump_writer,
       
 11838 -                           const WriterArgument *writer_args,
       
 11839 -                           MDRawDirectory *dir) {
       
 11840 -  TypedMDRVA<MDRawModuleList> list(minidump_writer);
       
 11841 -  int module_count  = writer_args->thread_lister->GetModuleCount();
       
 11842 -  if (module_count <= 0 ||
       
 11843 -      !list.AllocateObjectAndArray(module_count, MD_MODULE_SIZE))
       
 11844 -    return false;
       
 11845 -  dir->stream_type = MD_MODULE_LIST_STREAM;
       
 11846 -  dir->location = list.location();
       
 11847 -  list.get()->number_of_modules = module_count;
       
 11848 -  ModuleInfoCallbackCtx context;
       
 11849 -  context.minidump_writer = minidump_writer;
       
 11850 -  context.writer_args = writer_args;
       
 11851 -  context.list = &list;
       
 11852 -  context.module_index = 0;
       
 11853 -  CallbackParam<ModuleCallback> callback(ModuleInfoCallback, &context);
       
 11854 -  return writer_args->thread_lister->ListModules(&callback) == module_count;
       
 11855 -}
       
 11856 -
       
 11857 -bool WriteSystemInfoStream(MinidumpFileWriter *minidump_writer,
       
 11858 -                           const WriterArgument *writer_args,
       
 11859 -                           MDRawDirectory *dir) {
       
 11860 -  TypedMDRVA<MDRawSystemInfo> sys_info(minidump_writer);
       
 11861 -  if (!sys_info.Allocate())
       
 11862 -    return false;
       
 11863 -  dir->stream_type = MD_SYSTEM_INFO_STREAM;
       
 11864 -  dir->location = sys_info.location();
       
 11865 -
       
 11866 -  return WriteCPUInformation(sys_info.get()) &&
       
 11867 -         WriteOSInformation(minidump_writer, sys_info.get());
       
 11868 -}
       
 11869 -
       
 11870 -bool WriteExceptionStream(MinidumpFileWriter *minidump_writer,
       
 11871 -                           const WriterArgument *writer_args,
       
 11872 -                           MDRawDirectory *dir) {
       
 11873 -  // This happenes when this is not a crash, but a requested dump.
       
 11874 -  if (writer_args->sig_ctx == NULL)
       
 11875 -    return false;
       
 11876 -
       
 11877 -  TypedMDRVA<MDRawExceptionStream> exception(minidump_writer);
       
 11878 -  if (!exception.Allocate())
       
 11879 -    return false;
       
 11880 -
       
 11881 -  dir->stream_type = MD_EXCEPTION_STREAM;
       
 11882 -  dir->location = exception.location();
       
 11883 -  exception.get()->thread_id = writer_args->crashed_pid;
       
 11884 -  exception.get()->exception_record.exception_code = writer_args->signo;
       
 11885 -  exception.get()->exception_record.exception_flags = 0;
       
 11886 -  if (writer_args->sig_ctx != NULL) {
       
 11887 -    exception.get()->exception_record.exception_address =
       
 11888 -      writer_args->sig_ctx->eip;
       
 11889 -  } else {
       
 11890 -    return true;
       
 11891 -  }
       
 11892 -
       
 11893 -  // Write context of the exception.
       
 11894 -  TypedMDRVA<MDRawContextX86> context(minidump_writer);
       
 11895 -  if (!context.Allocate())
       
 11896 -    return false;
       
 11897 -  exception.get()->thread_context = context.location();
       
 11898 -  memset(context.get(), 0, sizeof(MDRawContextX86));
       
 11899 -  return WriteContext(context.get(), writer_args->sig_ctx, NULL);
       
 11900 -}
       
 11901 -
       
 11902 -bool WriteMiscInfoStream(MinidumpFileWriter *minidump_writer,
       
 11903 -                           const WriterArgument *writer_args,
       
 11904 -                           MDRawDirectory *dir) {
       
 11905 -  TypedMDRVA<MDRawMiscInfo> info(minidump_writer);
       
 11906 -  if (!info.Allocate())
       
 11907 -    return false;
       
 11908 -
       
 11909 -  dir->stream_type = MD_MISC_INFO_STREAM;
       
 11910 -  dir->location = info.location();
       
 11911 -  info.get()->size_of_info = sizeof(MDRawMiscInfo);
       
 11912 -  info.get()->flags1 = MD_MISCINFO_FLAGS1_PROCESS_ID;
       
 11913 -  info.get()->process_id = writer_args->requester_pid;
       
 11914 -
       
 11915 -  return true;
       
 11916 -}
       
 11917 -
       
 11918 -bool WriteBreakpadInfoStream(MinidumpFileWriter *minidump_writer,
       
 11919 -                           const WriterArgument *writer_args,
       
 11920 -                           MDRawDirectory *dir) {
       
 11921 -  TypedMDRVA<MDRawBreakpadInfo> info(minidump_writer);
       
 11922 -  if (!info.Allocate())
       
 11923 -    return false;
       
 11924 -
       
 11925 -  dir->stream_type = MD_BREAKPAD_INFO_STREAM;
       
 11926 -  dir->location = info.location();
       
 11927 -
       
 11928 -  info.get()->validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |
       
 11929 -                        MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;
       
 11930 -  info.get()->dump_thread_id = getpid();
       
 11931 -  info.get()->requesting_thread_id = writer_args->requester_pid;
       
 11932 -  return true;
       
 11933 -}
       
 11934 -
       
 11935 -// Prototype of writer functions.
       
 11936 -typedef bool (*WriteStringFN)(MinidumpFileWriter *,
       
 11937 -                              const WriterArgument *,
       
 11938 -                              MDRawDirectory *);
       
 11939 -
       
 11940 -// Function table to writer a full minidump.
       
 11941 -WriteStringFN writers[] = {
       
 11942 -  WriteThreadListStream,
       
 11943 -  WriteModuleListStream,
       
 11944 -  WriteSystemInfoStream,
       
 11945 -  WriteExceptionStream,
       
 11946 -  WriteMiscInfoStream,
       
 11947 -  WriteBreakpadInfoStream,
       
 11948 -};
       
 11949 -
       
 11950 -// Will call each writer function in the writers table.
       
 11951 -// It runs in a different process from the crashing process, but sharing
       
 11952 -// the same address space. This enables it to use ptrace functions.
       
 11953 -int Write(void *argument) {
       
 11954 -  WriterArgument *writer_args =
       
 11955 -    static_cast<WriterArgument *>(argument);
       
 11956 -
       
 11957 -  if (!writer_args->thread_lister->SuspendAllThreads())
       
 11958 -    return -1;
       
 11959 -
       
 11960 -  if (writer_args->sighandler_ebp != 0 &&
       
 11961 -      writer_args->thread_lister->FindSigContext(writer_args->sighandler_ebp,
       
 11962 -                                                 &writer_args->sig_ctx)) {
       
 11963 -    writer_args->crashed_stack_bottom =
       
 11964 -      writer_args->thread_lister->GetThreadStackBottom(
       
 11965 -                                             writer_args->sig_ctx->ebp);
       
 11966 -    int crashed_pid =  FindCrashingThread(writer_args->crashed_stack_bottom,
       
 11967 -                                          writer_args->requester_pid,
       
 11968 -                                          writer_args->thread_lister);
       
 11969 -    if (crashed_pid > 0)
       
 11970 -      writer_args->crashed_pid = crashed_pid;
       
 11971 -  }
       
 11972 -
       
 11973 -
       
 11974 -  MinidumpFileWriter *minidump_writer = writer_args->minidump_writer;
       
 11975 -  TypedMDRVA<MDRawHeader> header(minidump_writer);
       
 11976 -  TypedMDRVA<MDRawDirectory> dir(minidump_writer);
       
 11977 -  if (!header.Allocate())
       
 11978 -    return 0;
       
 11979 -
       
 11980 -  int writer_count = sizeof(writers) / sizeof(writers[0]);
       
 11981 -  // Need directory space for all writers.
       
 11982 -  if (!dir.AllocateArray(writer_count))
       
 11983 -    return 0;
       
 11984 -  header.get()->signature = MD_HEADER_SIGNATURE;
       
 11985 -  header.get()->version = MD_HEADER_VERSION;
       
 11986 -  header.get()->time_date_stamp = time(NULL);
       
 11987 -  header.get()->stream_count = writer_count;
       
 11988 -  header.get()->stream_directory_rva = dir.position();
       
 11989 -
       
 11990 -  int dir_index = 0;
       
 11991 -  MDRawDirectory local_dir;
       
 11992 -  for (int i = 0; i < writer_count; ++i) {
       
 11993 -    if (writers[i](minidump_writer, writer_args, &local_dir))
       
 11994 -      dir.CopyIndex(dir_index++, &local_dir);
       
 11995 -  }
       
 11996 -
       
 11997 -  writer_args->thread_lister->ResumeAllThreads();
       
 11998 -  return 0;
       
 11999 -}
       
 12000 -
       
 12001 -}  // namespace
       
 12002 -
       
 12003 -namespace google_breakpad {
       
 12004 -
       
 12005 -MinidumpGenerator::MinidumpGenerator() {
       
 12006 -  AllocateStack();
       
 12007 -}
       
 12008 -
       
 12009 -MinidumpGenerator::~MinidumpGenerator() {
       
 12010 -}
       
 12011 -
       
 12012 -void MinidumpGenerator::AllocateStack() {
       
 12013 -  stack_.reset(new char[kStackSize]);
       
 12014 -}
       
 12015 -
       
 12016 -bool MinidumpGenerator::WriteMinidumpToFile(const char *file_pathname,
       
 12017 -                                   int signo,
       
 12018 -                                   uintptr_t sighandler_ebp,
       
 12019 -                                   struct sigcontext **sig_ctx) const {
       
 12020 -  assert(file_pathname != NULL);
       
 12021 -  assert(stack_ != NULL);
       
 12022 -
       
 12023 -  if (stack_ == NULL || file_pathname == NULL)
       
 12024 -    return false;
       
 12025 -
       
 12026 -  MinidumpFileWriter minidump_writer;
       
 12027 -  if (minidump_writer.Open(file_pathname)) {
       
 12028 -    WriterArgument argument;
       
 12029 -    memset(&argument, 0, sizeof(argument));
       
 12030 -    LinuxThread thread_lister(getpid());
       
 12031 -    argument.thread_lister = &thread_lister;
       
 12032 -    argument.minidump_writer = &minidump_writer;
       
 12033 -    argument.requester_pid = getpid();
       
 12034 -    argument.crashed_pid = getpid();
       
 12035 -    argument.signo = signo;
       
 12036 -    argument.sighandler_ebp = sighandler_ebp;
       
 12037 -    argument.sig_ctx = NULL;
       
 12038 -
       
 12039 -    int cloned_pid = clone(Write, stack_.get() + kStackSize,
       
 12040 -                           CLONE_VM | CLONE_FILES | CLONE_FS | CLONE_UNTRACED,
       
 12041 -                           (void*)&argument);
       
 12042 -    waitpid(cloned_pid, NULL, __WALL);
       
 12043 -    if (sig_ctx != NULL)
       
 12044 -        *sig_ctx = argument.sig_ctx;
       
 12045 -    return true;
       
 12046 -  }
       
 12047 -
       
 12048 -  return false;
       
 12049 -}
       
 12050 -
       
 12051 -}  // namespace google_breakpad
       
 12052 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_generator.h b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_generator.h
       
 12053 deleted file mode 100644
       
 12054 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_generator.h
       
 12055 +++ /dev/null
       
 12056 @@ -1,73 +0,0 @@
       
 12057 -// Copyright (c) 2006, Google Inc.
       
 12058 -// All rights reserved.
       
 12059 -//
       
 12060 -// Author: Li Liu
       
 12061 -//
       
 12062 -// Redistribution and use in source and binary forms, with or without
       
 12063 -// modification, are permitted provided that the following conditions are
       
 12064 -// met:
       
 12065 -//
       
 12066 -//     * Redistributions of source code must retain the above copyright
       
 12067 -// notice, this list of conditions and the following disclaimer.
       
 12068 -//     * Redistributions in binary form must reproduce the above
       
 12069 -// copyright notice, this list of conditions and the following disclaimer
       
 12070 -// in the documentation and/or other materials provided with the
       
 12071 -// distribution.
       
 12072 -//     * Neither the name of Google Inc. nor the names of its
       
 12073 -// contributors may be used to endorse or promote products derived from
       
 12074 -// this software without specific prior written permission.
       
 12075 -//
       
 12076 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 12077 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 12078 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 12079 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 12080 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 12081 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 12082 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 12083 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 12084 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 12085 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 12086 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 12087 -
       
 12088 -#ifndef CLIENT_LINUX_HANDLER_MINIDUMP_GENERATOR_H__
       
 12089 -#define CLIENT_LINUX_HANDLER_MINIDUMP_GENERATOR_H__
       
 12090 -
       
 12091 -#include <stdint.h>
       
 12092 -
       
 12093 -#include "google_breakpad/common/breakpad_types.h"
       
 12094 -#include "processor/scoped_ptr.h"
       
 12095 -
       
 12096 -struct sigcontext;
       
 12097 -
       
 12098 -namespace google_breakpad {
       
 12099 -
       
 12100 -//
       
 12101 -// MinidumpGenerator
       
 12102 -//
       
 12103 -// Write a minidump to file based on the signo and sig_ctx.
       
 12104 -// A minidump generator should be created before any exception happen.
       
 12105 -//
       
 12106 -class MinidumpGenerator {
       
 12107 -  public:
       
 12108 -   MinidumpGenerator();
       
 12109 -
       
 12110 -   ~MinidumpGenerator();
       
 12111 -
       
 12112 -   // Write minidump.
       
 12113 -   bool WriteMinidumpToFile(const char *file_pathname,
       
 12114 -                            int signo,
       
 12115 -                            uintptr_t sighandler_ebp,
       
 12116 -                            struct sigcontext **sig_ctx) const;
       
 12117 -  private:
       
 12118 -   // Allocate memory for stack.
       
 12119 -   void AllocateStack();
       
 12120 -
       
 12121 -  private:
       
 12122 -   // Stack size of the writer thread.
       
 12123 -   static const int kStackSize = 1024 * 1024;
       
 12124 -   scoped_array<char> stack_;
       
 12125 -};
       
 12126 -
       
 12127 -}  // namespace google_breakpad
       
 12128 -
       
 12129 -#endif   // CLIENT_LINUX_HANDLER_MINIDUMP_GENERATOR_H__
       
 12130 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_test.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_test.cc
       
 12131 deleted file mode 100644
       
 12132 --- a/toolkit/crashreporter/google-breakpad/src/client/linux/handler/minidump_test.cc
       
 12133 +++ /dev/null
       
 12134 @@ -1,86 +0,0 @@
       
 12135 -// Copyright (c) 2006, Google Inc.
       
 12136 -// All rights reserved.
       
 12137 -//
       
 12138 -// Author: Li Liu
       
 12139 -//
       
 12140 -// Redistribution and use in source and binary forms, with or without
       
 12141 -// modification, are permitted provided that the following conditions are
       
 12142 -// met:
       
 12143 -//
       
 12144 -//     * Redistributions of source code must retain the above copyright
       
 12145 -// notice, this list of conditions and the following disclaimer.
       
 12146 -//     * Redistributions in binary form must reproduce the above
       
 12147 -// copyright notice, this list of conditions and the following disclaimer
       
 12148 -// in the documentation and/or other materials provided with the
       
 12149 -// distribution.
       
 12150 -//     * Neither the name of Google Inc. nor the names of its
       
 12151 -// contributors may be used to endorse or promote products derived from
       
 12152 -// this software without specific prior written permission.
       
 12153 -//
       
 12154 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 12155 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 12156 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 12157 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 12158 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 12159 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 12160 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 12161 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 12162 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 12163 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 12164 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 12165 -
       
 12166 -#include <pthread.h>
       
 12167 -#include <unistd.h>
       
 12168 -
       
 12169 -#include <cassert>
       
 12170 -#include <cstdio>
       
 12171 -#include <cstdlib>
       
 12172 -#include <cstring>
       
 12173 -
       
 12174 -#include "client/linux/handler/minidump_generator.h"
       
 12175 -
       
 12176 -using namespace google_breakpad;
       
 12177 -
       
 12178 -// Thread use this to see if it should stop working.
       
 12179 -static bool should_exit = false;
       
 12180 -
       
 12181 -static void foo2(int arg) {
       
 12182 -  // Stack variable, used for debugging stack dumps.
       
 12183 -  int c = arg;
       
 12184 -  c = 0xcccccccc;
       
 12185 -  while (!should_exit)
       
 12186 -    sleep(1);
       
 12187 -}
       
 12188 -
       
 12189 -static void foo(int arg) {
       
 12190 -  // Stack variable, used for debugging stack dumps.
       
 12191 -  int b = arg;
       
 12192 -  b = 0xbbbbbbbb;
       
 12193 -  foo2(b);
       
 12194 -}
       
 12195 -
       
 12196 -static void *thread_main(void *) {
       
 12197 -  // Stack variable, used for debugging stack dumps.
       
 12198 -  int a = 0xaaaaaaaa;
       
 12199 -  foo(a);
       
 12200 -  return NULL;
       
 12201 -}
       
 12202 -
       
 12203 -static void CreateThread(int num) {
       
 12204 -  pthread_t h;
       
 12205 -  for (int i = 0; i < num; ++i) {
       
 12206 -    pthread_create(&h, NULL, thread_main, NULL);
       
 12207 -    pthread_detach(h);
       
 12208 -  }
       
 12209 -}
       
 12210 -
       
 12211 -int main(int argc, char *argv[]) {
       
 12212 -  CreateThread(10);
       
 12213 -  google_breakpad::MinidumpGenerator mg;
       
 12214 -  if (mg.WriteMinidumpToFile("minidump_test.out", -1, 0, NULL))
       
 12215 -    printf("Succeeded written minidump\n");
       
 12216 -  else
       
 12217 -    printf("Failed to write minidump\n");
       
 12218 -  should_exit = true;
       
 12219 -  return 0;
       
 12220 -}
       
 12221 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/Makefile.in b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/Makefile.in
       
 12222 new file mode 100644
       
 12223 --- /dev/null
       
 12224 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/Makefile.in
       
 12225 @@ -0,0 +1,60 @@
       
 12226 +# ***** BEGIN LICENSE BLOCK *****
       
 12227 +# Version: MPL 1.1/GPL 2.0/LGPL 2.1
       
 12228 +#
       
 12229 +# The contents of this file are subject to the Mozilla Public License Version
       
 12230 +# 1.1 (the "License"); you may not use this file except in compliance with
       
 12231 +# the License. You may obtain a copy of the License at
       
 12232 +# http://www.mozilla.org/MPL/
       
 12233 +#
       
 12234 +# Software distributed under the License is distributed on an "AS IS" basis,
       
 12235 +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
       
 12236 +# for the specific language governing rights and limitations under the
       
 12237 +# License.
       
 12238 +#
       
 12239 +# The Original Code is Mozilla Breakpad integration
       
 12240 +#
       
 12241 +# The Initial Developer of the Original Code is
       
 12242 +# The Mozilla Foundation.
       
 12243 +# Portions created by the Initial Developer are Copyright (C) 2009
       
 12244 +# the Initial Developer. All Rights Reserved.
       
 12245 +#
       
 12246 +# Contributor(s):
       
 12247 +#  Ted Mielczarek <ted.mielczarek@gmail.com>
       
 12248 +#
       
 12249 +# Alternatively, the contents of this file may be used under the terms of
       
 12250 +# either the GNU General Public License Version 2 or later (the "GPL"), or
       
 12251 +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
       
 12252 +# in which case the provisions of the GPL or the LGPL are applicable instead
       
 12253 +# of those above. If you wish to allow use of your version of this file only
       
 12254 +# under the terms of either the GPL or the LGPL, and not to allow others to
       
 12255 +# use your version of this file under the terms of the MPL, indicate your
       
 12256 +# decision by deleting the provisions above and replace them with the notice
       
 12257 +# and other provisions required by the GPL or the LGPL. If you do not delete
       
 12258 +# the provisions above, a recipient may use your version of this file under
       
 12259 +# the terms of any one of the MPL, the GPL or the LGPL.
       
 12260 +#
       
 12261 +# ***** END LICENSE BLOCK *****
       
 12262 +
       
 12263 +DEPTH		= ../../../../../../..
       
 12264 +topsrcdir	= @top_srcdir@
       
 12265 +srcdir		= @srcdir@
       
 12266 +VPATH		= @srcdir@
       
 12267 +
       
 12268 +include $(DEPTH)/config/autoconf.mk
       
 12269 +
       
 12270 +MODULE		= writer
       
 12271 +LIBRARY_NAME	= minidump_writer_s
       
 12272 +XPI_NAME 	= crashreporter
       
 12273 +
       
 12274 +LOCAL_INCLUDES 	= -I$(srcdir)/../../..
       
 12275 +
       
 12276 +CPPSRCS	= \
       
 12277 +  linux_dumper.cc \
       
 12278 +  minidump_writer.cc \
       
 12279 +  $(NULL)
       
 12280 +
       
 12281 +# need static lib
       
 12282 +FORCE_STATIC_LIB = 1
       
 12283 +FORCE_USE_PIC = 1
       
 12284 +
       
 12285 +include $(topsrcdir)/config/rules.mk
       
 12286 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/directory_reader.h b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/directory_reader.h
       
 12287 new file mode 100644
       
 12288 --- /dev/null
       
 12289 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/directory_reader.h
       
 12290 @@ -0,0 +1,105 @@
       
 12291 +// Copyright (c) 2009, Google Inc.
       
 12292 +// All rights reserved.
       
 12293 +//
       
 12294 +// Redistribution and use in source and binary forms, with or without
       
 12295 +// modification, are permitted provided that the following conditions are
       
 12296 +// met:
       
 12297 +//
       
 12298 +//     * Redistributions of source code must retain the above copyright
       
 12299 +// notice, this list of conditions and the following disclaimer.
       
 12300 +//     * Redistributions in binary form must reproduce the above
       
 12301 +// copyright notice, this list of conditions and the following disclaimer
       
 12302 +// in the documentation and/or other materials provided with the
       
 12303 +// distribution.
       
 12304 +//     * Neither the name of Google Inc. nor the names of its
       
 12305 +// contributors may be used to endorse or promote products derived from
       
 12306 +// this software without specific prior written permission.
       
 12307 +//
       
 12308 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 12309 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 12310 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 12311 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 12312 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 12313 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 12314 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 12315 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 12316 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 12317 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 12318 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 12319 +
       
 12320 +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
       
 12321 +#define CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
       
 12322 +
       
 12323 +#include <stdint.h>
       
 12324 +#include <unistd.h>
       
 12325 +#include <limits.h>
       
 12326 +#include <assert.h>
       
 12327 +#include <errno.h>
       
 12328 +#include <string.h>
       
 12329 +
       
 12330 +#include "common/linux/linux_syscall_support.h"
       
 12331 +
       
 12332 +namespace google_breakpad {
       
 12333 +
       
 12334 +// A class for enumerating a directory without using diropen/readdir or other
       
 12335 +// functions which may allocate memory.
       
 12336 +class DirectoryReader {
       
 12337 + public:
       
 12338 +  DirectoryReader(int fd)
       
 12339 +      : fd_(fd),
       
 12340 +        buf_used_(0) {
       
 12341 +  }
       
 12342 +
       
 12343 +  // Return the next entry from the directory
       
 12344 +  //   name: (output) the NUL terminated entry name
       
 12345 +  //
       
 12346 +  // Returns true iff successful (false on EOF).
       
 12347 +  //
       
 12348 +  // After calling this, one must call |PopEntry| otherwise you'll get the same
       
 12349 +  // entry over and over.
       
 12350 +  bool GetNextEntry(const char** name) {
       
 12351 +    struct kernel_dirent* const dent =
       
 12352 +      reinterpret_cast<kernel_dirent*>(buf_);
       
 12353 +
       
 12354 +    if (buf_used_ == 0) {
       
 12355 +      // need to read more entries.
       
 12356 +      const int n = sys_getdents(fd_, dent, sizeof(buf_));
       
 12357 +      if (n < 0) {
       
 12358 +        return false;
       
 12359 +      } else if (n == 0) {
       
 12360 +        hit_eof_ = true;
       
 12361 +      } else {
       
 12362 +        buf_used_ += n;
       
 12363 +      }
       
 12364 +    }
       
 12365 +
       
 12366 +    if (buf_used_ == 0 && hit_eof_)
       
 12367 +      return false;
       
 12368 +
       
 12369 +    assert(buf_used_ > 0);
       
 12370 +
       
 12371 +    *name = dent->d_name;
       
 12372 +    return true;
       
 12373 +  }
       
 12374 +
       
 12375 +  void PopEntry() {
       
 12376 +    if (!buf_used_)
       
 12377 +      return;
       
 12378 +
       
 12379 +    const struct kernel_dirent* const dent =
       
 12380 +      reinterpret_cast<kernel_dirent*>(buf_);
       
 12381 +
       
 12382 +    buf_used_ -= dent->d_reclen;
       
 12383 +    memmove(buf_, buf_ + dent->d_reclen, buf_used_);
       
 12384 +  }
       
 12385 +
       
 12386 + private:
       
 12387 +  const int fd_;
       
 12388 +  bool hit_eof_;
       
 12389 +  unsigned buf_used_;
       
 12390 +  uint8_t buf_[sizeof(struct kernel_dirent) + NAME_MAX + 1];
       
 12391 +};
       
 12392 +
       
 12393 +}  // namespace google_breakpad
       
 12394 +
       
 12395 +#endif  // CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_
       
 12396 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc
       
 12397 new file mode 100644
       
 12398 --- /dev/null
       
 12399 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/directory_reader_unittest.cc
       
 12400 @@ -0,0 +1,77 @@
       
 12401 +// Copyright (c) 2009, Google Inc.
       
 12402 +// All rights reserved.
       
 12403 +//
       
 12404 +// Redistribution and use in source and binary forms, with or without
       
 12405 +// modification, are permitted provided that the following conditions are
       
 12406 +// met:
       
 12407 +//
       
 12408 +//     * Redistributions of source code must retain the above copyright
       
 12409 +// notice, this list of conditions and the following disclaimer.
       
 12410 +//     * Redistributions in binary form must reproduce the above
       
 12411 +// copyright notice, this list of conditions and the following disclaimer
       
 12412 +// in the documentation and/or other materials provided with the
       
 12413 +// distribution.
       
 12414 +//     * Neither the name of Google Inc. nor the names of its
       
 12415 +// contributors may be used to endorse or promote products derived from
       
 12416 +// this software without specific prior written permission.
       
 12417 +//
       
 12418 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 12419 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 12420 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 12421 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 12422 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 12423 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 12424 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 12425 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 12426 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 12427 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 12428 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 12429 +
       
 12430 +#include <set>
       
 12431 +#include <string>
       
 12432 +
       
 12433 +#include <dirent.h>
       
 12434 +#include <fcntl.h>
       
 12435 +#include <sys/types.h>
       
 12436 +
       
 12437 +#include "client/linux/minidump_writer/directory_reader.h"
       
 12438 +#include "breakpad_googletest_includes.h"
       
 12439 +
       
 12440 +using namespace google_breakpad;
       
 12441 +
       
 12442 +namespace {
       
 12443 +typedef testing::Test DirectoryReaderTest;
       
 12444 +}
       
 12445 +
       
 12446 +TEST(DirectoryReaderTest, CompareResults) {
       
 12447 +  std::set<std::string> dent_set;
       
 12448 +
       
 12449 +  DIR *const dir = opendir("/proc/self");
       
 12450 +  ASSERT_TRUE(dir != NULL);
       
 12451 +
       
 12452 +  struct dirent* dent;
       
 12453 +  while ((dent = readdir(dir)))
       
 12454 +    dent_set.insert(dent->d_name);
       
 12455 +
       
 12456 +  closedir(dir);
       
 12457 +
       
 12458 +  const int fd = open("/proc/self", O_DIRECTORY | O_RDONLY);
       
 12459 +  ASSERT_GE(fd, 0);
       
 12460 +
       
 12461 +  DirectoryReader dir_reader(fd);
       
 12462 +  unsigned seen = 0;
       
 12463 +
       
 12464 +  const char* name;
       
 12465 +  while (dir_reader.GetNextEntry(&name)) {
       
 12466 +    ASSERT_TRUE(dent_set.find(name) != dent_set.end());
       
 12467 +    seen++;
       
 12468 +    dir_reader.PopEntry();
       
 12469 +  }
       
 12470 +
       
 12471 +  ASSERT_TRUE(dent_set.find("status") != dent_set.end());
       
 12472 +  ASSERT_TRUE(dent_set.find("stat") != dent_set.end());
       
 12473 +  ASSERT_TRUE(dent_set.find("cmdline") != dent_set.end());
       
 12474 +
       
 12475 +  ASSERT_EQ(dent_set.size(), seen);
       
 12476 +  close(fd);
       
 12477 +}
       
 12478 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/line_reader.h b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/line_reader.h
       
 12479 new file mode 100644
       
 12480 --- /dev/null
       
 12481 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/line_reader.h
       
 12482 @@ -0,0 +1,130 @@
       
 12483 +// Copyright (c) 2009, Google Inc.
       
 12484 +// All rights reserved.
       
 12485 +//
       
 12486 +// Redistribution and use in source and binary forms, with or without
       
 12487 +// modification, are permitted provided that the following conditions are
       
 12488 +// met:
       
 12489 +//
       
 12490 +//     * Redistributions of source code must retain the above copyright
       
 12491 +// notice, this list of conditions and the following disclaimer.
       
 12492 +//     * Redistributions in binary form must reproduce the above
       
 12493 +// copyright notice, this list of conditions and the following disclaimer
       
 12494 +// in the documentation and/or other materials provided with the
       
 12495 +// distribution.
       
 12496 +//     * Neither the name of Google Inc. nor the names of its
       
 12497 +// contributors may be used to endorse or promote products derived from
       
 12498 +// this software without specific prior written permission.
       
 12499 +//
       
 12500 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 12501 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 12502 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 12503 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 12504 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 12505 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 12506 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 12507 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 12508 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 12509 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 12510 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 12511 +
       
 12512 +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
       
 12513 +#define CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
       
 12514 +
       
 12515 +#include <stdint.h>
       
 12516 +#include <assert.h>
       
 12517 +#include <string.h>
       
 12518 +
       
 12519 +#include "common/linux/linux_syscall_support.h"
       
 12520 +
       
 12521 +namespace google_breakpad {
       
 12522 +
       
 12523 +// A class for reading a file, line by line, without using fopen/fgets or other
       
 12524 +// functions which may allocate memory.
       
 12525 +class LineReader {
       
 12526 + public:
       
 12527 +  LineReader(int fd)
       
 12528 +      : fd_(fd),
       
 12529 +        hit_eof_(false),
       
 12530 +        buf_used_(0) {
       
 12531 +  }
       
 12532 +
       
 12533 +  // The maximum length of a line.
       
 12534 +  static const size_t kMaxLineLen = 512;
       
 12535 +
       
 12536 +  // Return the next line from the file.
       
 12537 +  //   line: (output) a pointer to the start of the line. The line is NUL
       
 12538 +  //     terminated.
       
 12539 +  //   len: (output) the length of the line (not inc the NUL byte)
       
 12540 +  //
       
 12541 +  // Returns true iff successful (false on EOF).
       
 12542 +  //
       
 12543 +  // One must call |PopLine| after this function, otherwise you'll continue to
       
 12544 +  // get the same line over and over.
       
 12545 +  bool GetNextLine(const char **line, unsigned *len) {
       
 12546 +    for (;;) {
       
 12547 +      if (buf_used_ == 0 && hit_eof_)
       
 12548 +        return false;
       
 12549 +
       
 12550 +      for (unsigned i = 0; i < buf_used_; ++i) {
       
 12551 +        if (buf_[i] == '\n' || buf_[i] == 0) {
       
 12552 +          buf_[i] = 0;
       
 12553 +          *len = i;
       
 12554 +          *line = buf_;
       
 12555 +          return true;
       
 12556 +        }
       
 12557 +      }
       
 12558 +
       
 12559 +      if (buf_used_ == sizeof(buf_)) {
       
 12560 +        // we scanned the whole buffer and didn't find an end-of-line marker.
       
 12561 +        // This line is too long to process.
       
 12562 +        return false;
       
 12563 +      }
       
 12564 +
       
 12565 +      // We didn't find any end-of-line terminators in the buffer. However, if
       
 12566 +      // this is the last line in the file it might not have one:
       
 12567 +      if (hit_eof_) {
       
 12568 +        assert(buf_used_);
       
 12569 +        // There's room for the NUL because of the buf_used_ == sizeof(buf_)
       
 12570 +        // check above.
       
 12571 +        buf_[buf_used_] = 0;
       
 12572 +        *len = buf_used_;
       
 12573 +        buf_used_ += 1;  // since we appended the NUL.
       
 12574 +        *line = buf_;
       
 12575 +        return true;
       
 12576 +      }
       
 12577 +
       
 12578 +      // Otherwise, we should pull in more data from the file
       
 12579 +      const ssize_t n = sys_read(fd_, buf_ + buf_used_,
       
 12580 +                                 sizeof(buf_) - buf_used_);
       
 12581 +      if (n < 0) {
       
 12582 +        return false;
       
 12583 +      } else if (n == 0) {
       
 12584 +        hit_eof_ = true;
       
 12585 +      } else {
       
 12586 +        buf_used_ += n;
       
 12587 +      }
       
 12588 +
       
 12589 +      // At this point, we have either set the hit_eof_ flag, or we have more
       
 12590 +      // data to process...
       
 12591 +    }
       
 12592 +  }
       
 12593 +
       
 12594 +  void PopLine(unsigned len) {
       
 12595 +    // len doesn't include the NUL byte at the end.
       
 12596 +
       
 12597 +    assert(buf_used_ >= len + 1);
       
 12598 +    buf_used_ -= len + 1;
       
 12599 +    memmove(buf_, buf_ + len + 1, buf_used_);
       
 12600 +  }
       
 12601 +
       
 12602 + private:
       
 12603 +  const int fd_;
       
 12604 +
       
 12605 +  bool hit_eof_;
       
 12606 +  unsigned buf_used_;
       
 12607 +  char buf_[kMaxLineLen];
       
 12608 +};
       
 12609 +
       
 12610 +}  // namespace google_breakpad
       
 12611 +
       
 12612 +#endif  // CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_
       
 12613 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc
       
 12614 new file mode 100644
       
 12615 --- /dev/null
       
 12616 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/line_reader_unittest.cc
       
 12617 @@ -0,0 +1,184 @@
       
 12618 +// Copyright (c) 2009, Google Inc.
       
 12619 +// All rights reserved.
       
 12620 +//
       
 12621 +// Redistribution and use in source and binary forms, with or without
       
 12622 +// modification, are permitted provided that the following conditions are
       
 12623 +// met:
       
 12624 +//
       
 12625 +//     * Redistributions of source code must retain the above copyright
       
 12626 +// notice, this list of conditions and the following disclaimer.
       
 12627 +//     * Redistributions in binary form must reproduce the above
       
 12628 +// copyright notice, this list of conditions and the following disclaimer
       
 12629 +// in the documentation and/or other materials provided with the
       
 12630 +// distribution.
       
 12631 +//     * Neither the name of Google Inc. nor the names of its
       
 12632 +// contributors may be used to endorse or promote products derived from
       
 12633 +// this software without specific prior written permission.
       
 12634 +//
       
 12635 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 12636 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 12637 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 12638 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 12639 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 12640 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 12641 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 12642 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 12643 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 12644 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 12645 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 12646 +
       
 12647 +#include <stdlib.h>
       
 12648 +#include <unistd.h>
       
 12649 +#include <sys/types.h>
       
 12650 +
       
 12651 +#include "client/linux/minidump_writer/line_reader.h"
       
 12652 +#include "breakpad_googletest_includes.h"
       
 12653 +
       
 12654 +using namespace google_breakpad;
       
 12655 +
       
 12656 +static int TemporaryFile() {
       
 12657 +  static const char templ[] = "/tmp/line-reader-unittest-XXXXXX";
       
 12658 +  char templ_copy[sizeof(templ)];
       
 12659 +  memcpy(templ_copy, templ, sizeof(templ));
       
 12660 +  const int fd = mkstemp(templ_copy);
       
 12661 +  if (fd >= 0)
       
 12662 +    unlink(templ_copy);
       
 12663 +
       
 12664 +  return fd;
       
 12665 +}
       
 12666 +
       
 12667 +namespace {
       
 12668 +typedef testing::Test LineReaderTest;
       
 12669 +}
       
 12670 +
       
 12671 +TEST(LineReaderTest, EmptyFile) {
       
 12672 +  const int fd = TemporaryFile();
       
 12673 +  LineReader reader(fd);
       
 12674 +
       
 12675 +  const char *line;
       
 12676 +  unsigned len;
       
 12677 +  ASSERT_FALSE(reader.GetNextLine(&line, &len));
       
 12678 +
       
 12679 +  close(fd);
       
 12680 +}
       
 12681 +
       
 12682 +TEST(LineReaderTest, OneLineTerminated) {
       
 12683 +  const int fd = TemporaryFile();
       
 12684 +  write(fd, "a\n", 2);
       
 12685 +  lseek(fd, 0, SEEK_SET);
       
 12686 +  LineReader reader(fd);
       
 12687 +
       
 12688 +  const char *line;
       
 12689 +  unsigned len;
       
 12690 +  ASSERT_TRUE(reader.GetNextLine(&line, &len));
       
 12691 +  ASSERT_EQ(len, 1);
       
 12692 +  ASSERT_EQ(line[0], 'a');
       
 12693 +  ASSERT_EQ(line[1], 0);
       
 12694 +  reader.PopLine(len);
       
 12695 +
       
 12696 +  ASSERT_FALSE(reader.GetNextLine(&line, &len));
       
 12697 +
       
 12698 +  close(fd);
       
 12699 +}
       
 12700 +
       
 12701 +TEST(LineReaderTest, OneLine) {
       
 12702 +  const int fd = TemporaryFile();
       
 12703 +  write(fd, "a", 1);
       
 12704 +  lseek(fd, 0, SEEK_SET);
       
 12705 +  LineReader reader(fd);
       
 12706 +
       
 12707 +  const char *line;
       
 12708 +  unsigned len;
       
 12709 +  ASSERT_TRUE(reader.GetNextLine(&line, &len));
       
 12710 +  ASSERT_EQ(len, 1);
       
 12711 +  ASSERT_EQ(line[0], 'a');
       
 12712 +  ASSERT_EQ(line[1], 0);
       
 12713 +  reader.PopLine(len);
       
 12714 +
       
 12715 +  ASSERT_FALSE(reader.GetNextLine(&line, &len));
       
 12716 +
       
 12717 +  close(fd);
       
 12718 +}
       
 12719 +
       
 12720 +TEST(LineReaderTest, TwoLinesTerminated) {
       
 12721 +  const int fd = TemporaryFile();
       
 12722 +  write(fd, "a\nb\n", 4);
       
 12723 +  lseek(fd, 0, SEEK_SET);
       
 12724 +  LineReader reader(fd);
       
 12725 +
       
 12726 +  const char *line;
       
 12727 +  unsigned len;
       
 12728 +  ASSERT_TRUE(reader.GetNextLine(&line, &len));
       
 12729 +  ASSERT_EQ(len, 1);
       
 12730 +  ASSERT_EQ(line[0], 'a');
       
 12731 +  ASSERT_EQ(line[1], 0);
       
 12732 +  reader.PopLine(len);
       
 12733 +
       
 12734 +  ASSERT_TRUE(reader.GetNextLine(&line, &len));
       
 12735 +  ASSERT_EQ(len, 1);
       
 12736 +  ASSERT_EQ(line[0], 'b');
       
 12737 +  ASSERT_EQ(line[1], 0);
       
 12738 +  reader.PopLine(len);
       
 12739 +
       
 12740 +  ASSERT_FALSE(reader.GetNextLine(&line, &len));
       
 12741 +
       
 12742 +  close(fd);
       
 12743 +}
       
 12744 +
       
 12745 +TEST(LineReaderTest, TwoLines) {
       
 12746 +  const int fd = TemporaryFile();
       
 12747 +  write(fd, "a\nb", 3);
       
 12748 +  lseek(fd, 0, SEEK_SET);
       
 12749 +  LineReader reader(fd);
       
 12750 +
       
 12751 +  const char *line;
       
 12752 +  unsigned len;
       
 12753 +  ASSERT_TRUE(reader.GetNextLine(&line, &len));
       
 12754 +  ASSERT_EQ(len, 1);
       
 12755 +  ASSERT_EQ(line[0], 'a');
       
 12756 +  ASSERT_EQ(line[1], 0);
       
 12757 +  reader.PopLine(len);
       
 12758 +
       
 12759 +  ASSERT_TRUE(reader.GetNextLine(&line, &len));
       
 12760 +  ASSERT_EQ(len, 1);
       
 12761 +  ASSERT_EQ(line[0], 'b');
       
 12762 +  ASSERT_EQ(line[1], 0);
       
 12763 +  reader.PopLine(len);
       
 12764 +
       
 12765 +  ASSERT_FALSE(reader.GetNextLine(&line, &len));
       
 12766 +
       
 12767 +  close(fd);
       
 12768 +}
       
 12769 +
       
 12770 +TEST(LineReaderTest, MaxLength) {
       
 12771 +  const int fd = TemporaryFile();
       
 12772 +  char l[LineReader::kMaxLineLen - 1];
       
 12773 +  memset(l, 'a', sizeof(l));
       
 12774 +  write(fd, l, sizeof(l));
       
 12775 +  lseek(fd, 0, SEEK_SET);
       
 12776 +  LineReader reader(fd);
       
 12777 +
       
 12778 +  const char *line;
       
 12779 +  unsigned len;
       
 12780 +  ASSERT_TRUE(reader.GetNextLine(&line, &len));
       
 12781 +  ASSERT_EQ(len, sizeof(l));
       
 12782 +  ASSERT_TRUE(memcmp(l, line, sizeof(l)) == 0);
       
 12783 +  ASSERT_EQ(line[len], 0);
       
 12784 +
       
 12785 +  close(fd);
       
 12786 +}
       
 12787 +
       
 12788 +TEST(LineReaderTest, TooLong) {
       
 12789 +  const int fd = TemporaryFile();
       
 12790 +  char l[LineReader::kMaxLineLen];
       
 12791 +  memset(l, 'a', sizeof(l));
       
 12792 +  write(fd, l, sizeof(l));
       
 12793 +  lseek(fd, 0, SEEK_SET);
       
 12794 +  LineReader reader(fd);
       
 12795 +
       
 12796 +  const char *line;
       
 12797 +  unsigned len;
       
 12798 +  ASSERT_FALSE(reader.GetNextLine(&line, &len));
       
 12799 +
       
 12800 +  close(fd);
       
 12801 +}
       
 12802 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc
       
 12803 new file mode 100644
       
 12804 --- /dev/null
       
 12805 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc
       
 12806 @@ -0,0 +1,453 @@
       
 12807 +// Copyright (c) 2009, Google Inc.
       
 12808 +// All rights reserved.
       
 12809 +//
       
 12810 +// Redistribution and use in source and binary forms, with or without
       
 12811 +// modification, are permitted provided that the following conditions are
       
 12812 +// met:
       
 12813 +//
       
 12814 +//     * Redistributions of source code must retain the above copyright
       
 12815 +// notice, this list of conditions and the following disclaimer.
       
 12816 +//     * Redistributions in binary form must reproduce the above
       
 12817 +// copyright notice, this list of conditions and the following disclaimer
       
 12818 +// in the documentation and/or other materials provided with the
       
 12819 +// distribution.
       
 12820 +//     * Neither the name of Google Inc. nor the names of its
       
 12821 +// contributors may be used to endorse or promote products derived from
       
 12822 +// this software without specific prior written permission.
       
 12823 +//
       
 12824 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 12825 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 12826 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 12827 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 12828 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 12829 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 12830 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 12831 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 12832 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 12833 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 12834 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 12835 +
       
 12836 +// This code deals with the mechanics of getting information about a crashed
       
 12837 +// process. Since this code may run in a compromised address space, the same
       
 12838 +// rules apply as detailed at the top of minidump_writer.h: no libc calls and
       
 12839 +// use the alternative allocator.
       
 12840 +
       
 12841 +#include "client/linux/minidump_writer/linux_dumper.h"
       
 12842 +
       
 12843 +#include <assert.h>
       
 12844 +#include <limits.h>
       
 12845 +#include <stddef.h>
       
 12846 +#include <stdlib.h>
       
 12847 +#include <stdio.h>
       
 12848 +#include <string.h>
       
 12849 +
       
 12850 +#include <unistd.h>
       
 12851 +#include <elf.h>
       
 12852 +#include <errno.h>
       
 12853 +#include <fcntl.h>
       
 12854 +#include <link.h>
       
 12855 +
       
 12856 +#include <sys/types.h>
       
 12857 +#include <sys/ptrace.h>
       
 12858 +#include <sys/wait.h>
       
 12859 +
       
 12860 +#include <algorithm>
       
 12861 +
       
 12862 +#include "client/linux/minidump_writer/directory_reader.h"
       
 12863 +#include "client/linux/minidump_writer/line_reader.h"
       
 12864 +#include "common/linux/file_id.h"
       
 12865 +#include "common/linux/linux_libc_support.h"
       
 12866 +#include "common/linux/linux_syscall_support.h"
       
 12867 +
       
 12868 +// Suspend a thread by attaching to it.
       
 12869 +static bool SuspendThread(pid_t pid) {
       
 12870 +  // This may fail if the thread has just died or debugged.
       
 12871 +  errno = 0;
       
 12872 +  if (sys_ptrace(PTRACE_ATTACH, pid, NULL, NULL) != 0 &&
       
 12873 +      errno != 0) {
       
 12874 +    return false;
       
 12875 +  }
       
 12876 +  while (sys_waitpid(pid, NULL, __WALL) < 0) {
       
 12877 +    if (errno != EINTR) {
       
 12878 +      sys_ptrace(PTRACE_DETACH, pid, NULL, NULL);
       
 12879 +      return false;
       
 12880 +    }
       
 12881 +  }
       
 12882 +  return true;
       
 12883 +}
       
 12884 +
       
 12885 +// Resume a thread by detaching from it.
       
 12886 +static bool ResumeThread(pid_t pid) {
       
 12887 +  return sys_ptrace(PTRACE_DETACH, pid, NULL, NULL) >= 0;
       
 12888 +}
       
 12889 +
       
 12890 +namespace google_breakpad {
       
 12891 +
       
 12892 +LinuxDumper::LinuxDumper(int pid)
       
 12893 +    : pid_(pid),
       
 12894 +      threads_suspened_(false),
       
 12895 +      threads_(&allocator_, 8),
       
 12896 +      mappings_(&allocator_) {
       
 12897 +}
       
 12898 +
       
 12899 +bool LinuxDumper::Init() {
       
 12900 +  return EnumerateThreads(&threads_) &&
       
 12901 +         EnumerateMappings(&mappings_);
       
 12902 +}
       
 12903 +
       
 12904 +bool LinuxDumper::ThreadsSuspend() {
       
 12905 +  if (threads_suspened_)
       
 12906 +    return true;
       
 12907 +  bool good = true;
       
 12908 +  for (size_t i = 0; i < threads_.size(); ++i)
       
 12909 +    good &= SuspendThread(threads_[i]);
       
 12910 +  threads_suspened_ = true;
       
 12911 +  return good;
       
 12912 +}
       
 12913 +
       
 12914 +bool LinuxDumper::ThreadsResume() {
       
 12915 +  if (!threads_suspened_)
       
 12916 +    return false;
       
 12917 +  bool good = true;
       
 12918 +  for (size_t i = 0; i < threads_.size(); ++i)
       
 12919 +    good &= ResumeThread(threads_[i]);
       
 12920 +  threads_suspened_ = false;
       
 12921 +  return good;
       
 12922 +}
       
 12923 +
       
 12924 +void
       
 12925 +LinuxDumper::BuildProcPath(char* path, pid_t pid, const char* node) const {
       
 12926 +  assert(path);
       
 12927 +  if (!path) {
       
 12928 +    return;
       
 12929 +  }
       
 12930 +
       
 12931 +  path[0] = '\0';
       
 12932 +
       
 12933 +  const unsigned pid_len = my_int_len(pid);
       
 12934 +
       
 12935 +  assert(node);
       
 12936 +  if (!node) {
       
 12937 +    return;
       
 12938 +  }
       
 12939 +
       
 12940 +  size_t node_len = my_strlen(node);
       
 12941 +  assert(node_len < NAME_MAX);
       
 12942 +  if (node_len >= NAME_MAX) {
       
 12943 +    return;
       
 12944 +  }
       
 12945 +
       
 12946 +  assert(node_len > 0);
       
 12947 +  if (node_len == 0) {
       
 12948 +    return;
       
 12949 +  }
       
 12950 +
       
 12951 +  assert(pid > 0);
       
 12952 +  if (pid <= 0) {
       
 12953 +    return;
       
 12954 +  }
       
 12955 +
       
 12956 +  const size_t total_length = 6 + pid_len + 1 + node_len;
       
 12957 +
       
 12958 +  assert(total_length < NAME_MAX);
       
 12959 +  if (total_length >= NAME_MAX) {
       
 12960 +    return;
       
 12961 +  }
       
 12962 +
       
 12963 +  memcpy(path, "/proc/", 6);
       
 12964 +  my_itos(path + 6, pid, pid_len);
       
 12965 +  memcpy(path + 6 + pid_len, "/", 1);
       
 12966 +  memcpy(path + 6 + pid_len + 1, node, node_len);
       
 12967 +  memcpy(path + total_length, "\0", 1);
       
 12968 +}
       
 12969 +
       
 12970 +bool
       
 12971 +LinuxDumper::ElfFileIdentifierForMapping(unsigned int mapping_id,
       
 12972 +                                         uint8_t identifier[sizeof(MDGUID)])
       
 12973 +{
       
 12974 +  assert(mapping_id < mappings_.size());
       
 12975 +  const MappingInfo* mapping = mappings_[mapping_id];
       
 12976 +  int fd = sys_open(mapping->name, O_RDONLY, 0);
       
 12977 +  if (fd < 0)
       
 12978 +    return false;
       
 12979 +  struct kernel_stat st;
       
 12980 +  if (sys_fstat(fd, &st) != 0) {
       
 12981 +    sys_close(fd);
       
 12982 +    return false;
       
 12983 +  }
       
 12984 +#if defined(__x86_64)
       
 12985 +#define sys_mmap2 sys_mmap
       
 12986 +#endif
       
 12987 +  void* base = sys_mmap2(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
       
 12988 +  sys_close(fd);
       
 12989 +  if (base == MAP_FAILED)
       
 12990 +    return false;
       
 12991 +
       
 12992 +  bool success = FileID::ElfFileIdentifierFromMappedFile(base, identifier);
       
 12993 +  sys_munmap(base, st.st_size);
       
 12994 +  return success;
       
 12995 +}
       
 12996 +
       
 12997 +void*
       
 12998 +LinuxDumper::FindBeginningOfLinuxGateSharedLibrary(const pid_t pid) const {
       
 12999 +  char auxv_path[80];
       
 13000 +  BuildProcPath(auxv_path, pid, "auxv");
       
 13001 +
       
 13002 +  // If BuildProcPath errors out due to invalid input, we'll handle it when
       
 13003 +  // we try to sys_open the file.
       
 13004 +
       
 13005 +  // Find the AT_SYSINFO_EHDR entry for linux-gate.so
       
 13006 +  // See http://www.trilithium.com/johan/2005/08/linux-gate/ for more
       
 13007 +  // information.
       
 13008 +  int fd = sys_open(auxv_path, O_RDONLY, 0);
       
 13009 +  if (fd < 0) {
       
 13010 +    return NULL;
       
 13011 +  }
       
 13012 +
       
 13013 +  elf_aux_entry one_aux_entry;
       
 13014 +  while (sys_read(fd,
       
 13015 +                  &one_aux_entry,
       
 13016 +                  sizeof(elf_aux_entry)) == sizeof(elf_aux_entry) &&
       
 13017 +         one_aux_entry.a_type != AT_NULL) {
       
 13018 +    if (one_aux_entry.a_type == AT_SYSINFO_EHDR) {
       
 13019 +      close(fd);
       
 13020 +      return reinterpret_cast<void*>(one_aux_entry.a_un.a_val);
       
 13021 +    }
       
 13022 +  }
       
 13023 +  close(fd);
       
 13024 +  return NULL;
       
 13025 +}
       
 13026 +
       
 13027 +bool
       
 13028 +LinuxDumper::EnumerateMappings(wasteful_vector<MappingInfo*>* result) const {
       
 13029 +  char maps_path[80];
       
 13030 +  BuildProcPath(maps_path, pid_, "maps");
       
 13031 +
       
 13032 +  // linux_gate_loc is the beginning of the kernel's mapping of
       
 13033 +  // linux-gate.so in the process.  It doesn't actually show up in the
       
 13034 +  // maps list as a filename, so we use the aux vector to find it's
       
 13035 +  // load location and special case it's entry when creating the list
       
 13036 +  // of mappings.
       
 13037 +  const void* linux_gate_loc;
       
 13038 +  linux_gate_loc = FindBeginningOfLinuxGateSharedLibrary(pid_);
       
 13039 +
       
 13040 +  const int fd = sys_open(maps_path, O_RDONLY, 0);
       
 13041 +  if (fd < 0)
       
 13042 +    return false;
       
 13043 +  LineReader* const line_reader = new(allocator_) LineReader(fd);
       
 13044 +
       
 13045 +  const char* line;
       
 13046 +  unsigned line_len;
       
 13047 +  while (line_reader->GetNextLine(&line, &line_len)) {
       
 13048 +    uintptr_t start_addr, end_addr, offset;
       
 13049 +
       
 13050 +    const char* i1 = my_read_hex_ptr(&start_addr, line);
       
 13051 +    if (*i1 == '-') {
       
 13052 +      const char* i2 = my_read_hex_ptr(&end_addr, i1 + 1);
       
 13053 +      if (*i2 == ' ') {
       
 13054 +        const char* i3 = my_read_hex_ptr(&offset, i2 + 6 /* skip ' rwxp ' */);
       
 13055 +        if (*i3 == ' ') {
       
 13056 +          MappingInfo* const module = new(allocator_) MappingInfo;
       
 13057 +          memset(module, 0, sizeof(MappingInfo));
       
 13058 +          module->start_addr = start_addr;
       
 13059 +          module->size = end_addr - start_addr;
       
 13060 +          module->offset = offset;
       
 13061 +          const char* name = NULL;
       
 13062 +          // Only copy name if the name is a valid path name, or if
       
 13063 +          // we've found the VDSO image
       
 13064 +          if ((name = my_strchr(line, '/')) != NULL) {
       
 13065 +            const unsigned l = my_strlen(name);
       
 13066 +            if (l < sizeof(module->name))
       
 13067 +              memcpy(module->name, name, l);
       
 13068 +          } else if (linux_gate_loc &&
       
 13069 +                     reinterpret_cast<void*>(module->start_addr) ==
       
 13070 +                     linux_gate_loc) {
       
 13071 +            memcpy(module->name,
       
 13072 +                   kLinuxGateLibraryName,
       
 13073 +                   my_strlen(kLinuxGateLibraryName));
       
 13074 +            module->offset = 0;
       
 13075 +          }
       
 13076 +          result->push_back(module);
       
 13077 +        }
       
 13078 +      }
       
 13079 +    }
       
 13080 +    line_reader->PopLine(line_len);
       
 13081 +  }
       
 13082 +
       
 13083 +  sys_close(fd);
       
 13084 +
       
 13085 +  return result->size() > 0;
       
 13086 +}
       
 13087 +
       
 13088 +// Parse /proc/$pid/task to list all the threads of the process identified by
       
 13089 +// pid.
       
 13090 +bool LinuxDumper::EnumerateThreads(wasteful_vector<pid_t>* result) const {
       
 13091 +  char task_path[80];
       
 13092 +  BuildProcPath(task_path, pid_, "task");
       
 13093 +
       
 13094 +  const int fd = sys_open(task_path, O_RDONLY | O_DIRECTORY, 0);
       
 13095 +  if (fd < 0)
       
 13096 +    return false;
       
 13097 +  DirectoryReader* dir_reader = new(allocator_) DirectoryReader(fd);
       
 13098 +
       
 13099 +  // The directory may contain duplicate entries which we filter by assuming
       
 13100 +  // that they are consecutive.
       
 13101 +  int last_tid = -1;
       
 13102 +  const char* dent_name;
       
 13103 +  while (dir_reader->GetNextEntry(&dent_name)) {
       
 13104 +    if (my_strcmp(dent_name, ".") &&
       
 13105 +        my_strcmp(dent_name, "..")) {
       
 13106 +      int tid = 0;
       
 13107 +      if (my_strtoui(&tid, dent_name) &&
       
 13108 +          last_tid != tid) {
       
 13109 +        last_tid = tid;
       
 13110 +        result->push_back(tid);
       
 13111 +      }
       
 13112 +    }
       
 13113 +    dir_reader->PopEntry();
       
 13114 +  }
       
 13115 +
       
 13116 +  sys_close(fd);
       
 13117 +  return true;
       
 13118 +}
       
 13119 +
       
 13120 +// Read thread info from /proc/$pid/status.
       
 13121 +// Fill out the |tgid|, |ppid| and |pid| members of |info|. If unavailible,
       
 13122 +// these members are set to -1. Returns true iff all three members are
       
 13123 +// availible.
       
 13124 +bool LinuxDumper::ThreadInfoGet(pid_t tid, ThreadInfo* info) {
       
 13125 +  assert(info != NULL);
       
 13126 +  char status_path[80];
       
 13127 +  BuildProcPath(status_path, tid, "status");
       
 13128 +
       
 13129 +  const int fd = open(status_path, O_RDONLY);
       
 13130 +  if (fd < 0)
       
 13131 +    return false;
       
 13132 +
       
 13133 +  LineReader* const line_reader = new(allocator_) LineReader(fd);
       
 13134 +  const char* line;
       
 13135 +  unsigned line_len;
       
 13136 +
       
 13137 +  info->ppid = info->tgid = -1;
       
 13138 +
       
 13139 +  while (line_reader->GetNextLine(&line, &line_len)) {
       
 13140 +    if (my_strncmp("Tgid:\t", line, 6) == 0) {
       
 13141 +      my_strtoui(&info->tgid, line + 6);
       
 13142 +    } else if (my_strncmp("PPid:\t", line, 6) == 0) {
       
 13143 +      my_strtoui(&info->ppid, line + 6);
       
 13144 +    }
       
 13145 +
       
 13146 +    line_reader->PopLine(line_len);
       
 13147 +  }
       
 13148 +
       
 13149 +  if (info->ppid == -1 || info->tgid == -1)
       
 13150 +    return false;
       
 13151 +
       
 13152 +  if (sys_ptrace(PTRACE_GETREGS, tid, NULL, &info->regs) == -1 ||
       
 13153 +      sys_ptrace(PTRACE_GETFPREGS, tid, NULL, &info->fpregs) == -1) {
       
 13154 +    return false;
       
 13155 +  }
       
 13156 +
       
 13157 +#if defined(__i386)
       
 13158 +  if (sys_ptrace(PTRACE_GETFPXREGS, tid, NULL, &info->fpxregs) == -1)
       
 13159 +    return false;
       
 13160 +#endif
       
 13161 +
       
 13162 +#if defined(__i386) || defined(__x86_64)
       
 13163 +  for (unsigned i = 0; i < ThreadInfo::kNumDebugRegisters; ++i) {
       
 13164 +    if (sys_ptrace(
       
 13165 +        PTRACE_PEEKUSER, tid,
       
 13166 +        reinterpret_cast<void*> (offsetof(struct user,
       
 13167 +                                          u_debugreg[0]) + i *
       
 13168 +                                 sizeof(debugreg_t)),
       
 13169 +        &info->dregs[i]) == -1) {
       
 13170 +      return false;
       
 13171 +    }
       
 13172 +  }
       
 13173 +#endif
       
 13174 +
       
 13175 +  const uint8_t* stack_pointer;
       
 13176 +#if defined(__i386)
       
 13177 +  memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp));
       
 13178 +#elif defined(__x86_64)
       
 13179 +  memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp));
       
 13180 +#else
       
 13181 +#error "This code hasn't been ported to your platform yet."
       
 13182 +#endif
       
 13183 +
       
 13184 +  if (!GetStackInfo(&info->stack, &info->stack_len,
       
 13185 +                    (uintptr_t) stack_pointer))
       
 13186 +    return false;
       
 13187 +
       
 13188 +  return true;
       
 13189 +}
       
 13190 +
       
 13191 +// Get information about the stack, given the stack pointer. We don't try to
       
 13192 +// walk the stack since we might not have all the information needed to do
       
 13193 +// unwind. So we just grab, up to, 32k of stack.
       
 13194 +bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len,
       
 13195 +                               uintptr_t int_stack_pointer) {
       
 13196 +#if defined(__i386) || defined(__x86_64)
       
 13197 +  static const bool stack_grows_down = true;
       
 13198 +  static const uintptr_t page_size = 4096;
       
 13199 +#else
       
 13200 +#error "This code has not been ported to your platform yet."
       
 13201 +#endif
       
 13202 +  // Move the stack pointer to the bottom of the page that it's in.
       
 13203 +  uint8_t* const stack_pointer =
       
 13204 +      reinterpret_cast<uint8_t*>(int_stack_pointer & ~(page_size - 1));
       
 13205 +
       
 13206 +  // The number of bytes of stack which we try to capture.
       
 13207 +  static ptrdiff_t kStackToCapture = 32 * 1024;
       
 13208 +
       
 13209 +  const MappingInfo* mapping = FindMapping(stack_pointer);
       
 13210 +  if (!mapping)
       
 13211 +    return false;
       
 13212 +  if (stack_grows_down) {
       
 13213 +    const ptrdiff_t offset = stack_pointer - (uint8_t*) mapping->start_addr;
       
 13214 +    const ptrdiff_t distance_to_end =
       
 13215 +        static_cast<ptrdiff_t>(mapping->size) - offset;
       
 13216 +    *stack_len = distance_to_end > kStackToCapture ?
       
 13217 +                 kStackToCapture : distance_to_end;
       
 13218 +    *stack = stack_pointer;
       
 13219 +  } else {
       
 13220 +    const ptrdiff_t offset = stack_pointer - (uint8_t*) mapping->start_addr;
       
 13221 +    *stack_len = offset > kStackToCapture ? kStackToCapture : offset;
       
 13222 +    *stack = stack_pointer - *stack_len;
       
 13223 +  }
       
 13224 +
       
 13225 +  return true;
       
 13226 +}
       
 13227 +
       
 13228 +// static
       
 13229 +void LinuxDumper::CopyFromProcess(void* dest, pid_t child, const void* src,
       
 13230 +                                  size_t length) {
       
 13231 +  unsigned long tmp;
       
 13232 +  size_t done = 0;
       
 13233 +  static const size_t word_size = sizeof(tmp);
       
 13234 +  uint8_t* const local = (uint8_t*) dest;
       
 13235 +  uint8_t* const remote = (uint8_t*) src;
       
 13236 +
       
 13237 +  while (done < length) {
       
 13238 +    const size_t l = length - done > word_size ? word_size : length - done;
       
 13239 +    if (sys_ptrace(PTRACE_PEEKDATA, child, remote + done, &tmp) == -1)
       
 13240 +      tmp = 0;
       
 13241 +    memcpy(local + done, &tmp, l);
       
 13242 +    done += l;
       
 13243 +  }
       
 13244 +}
       
 13245 +
       
 13246 +// Find the mapping which the given memory address falls in.
       
 13247 +const MappingInfo* LinuxDumper::FindMapping(const void* address) const {
       
 13248 +  const uintptr_t addr = (uintptr_t) address;
       
 13249 +
       
 13250 +  for (size_t i = 0; i < mappings_.size(); ++i) {
       
 13251 +    const uintptr_t start = static_cast<uintptr_t>(mappings_[i]->start_addr);
       
 13252 +    if (addr >= start && addr - start < mappings_[i]->size)
       
 13253 +      return mappings_[i];
       
 13254 +  }
       
 13255 +
       
 13256 +  return NULL;
       
 13257 +}
       
 13258 +
       
 13259 +}  // namespace google_breakpad
       
 13260 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.h b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.h
       
 13261 new file mode 100644
       
 13262 --- /dev/null
       
 13263 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper.h
       
 13264 @@ -0,0 +1,151 @@
       
 13265 +// Copyright (c) 2009, Google Inc.
       
 13266 +// All rights reserved.
       
 13267 +//
       
 13268 +// Redistribution and use in source and binary forms, with or without
       
 13269 +// modification, are permitted provided that the following conditions are
       
 13270 +// met:
       
 13271 +//
       
 13272 +//     * Redistributions of source code must retain the above copyright
       
 13273 +// notice, this list of conditions and the following disclaimer.
       
 13274 +//     * Redistributions in binary form must reproduce the above
       
 13275 +// copyright notice, this list of conditions and the following disclaimer
       
 13276 +// in the documentation and/or other materials provided with the
       
 13277 +// distribution.
       
 13278 +//     * Neither the name of Google Inc. nor the names of its
       
 13279 +// contributors may be used to endorse or promote products derived from
       
 13280 +// this software without specific prior written permission.
       
 13281 +//
       
 13282 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 13283 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 13284 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 13285 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 13286 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 13287 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 13288 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 13289 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 13290 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 13291 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 13292 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 13293 +
       
 13294 +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_
       
 13295 +#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_
       
 13296 +
       
 13297 +#include <elf.h>
       
 13298 +#include <linux/limits.h>
       
 13299 +#include <stdint.h>
       
 13300 +#include <sys/types.h>
       
 13301 +#include <sys/user.h>
       
 13302 +
       
 13303 +#include "common/linux/memory.h"
       
 13304 +#include "google_breakpad/common/minidump_format.h"
       
 13305 +
       
 13306 +namespace google_breakpad {
       
 13307 +
       
 13308 +typedef typeof(((struct user*) 0)->u_debugreg[0]) debugreg_t;
       
 13309 +
       
 13310 +// Typedef for our parsing of the auxv variables in /proc/pid/auxv.
       
 13311 +#if defined(__i386)
       
 13312 +typedef Elf32_auxv_t elf_aux_entry;
       
 13313 +#elif defined(__x86_64__)
       
 13314 +typedef Elf64_auxv_t elf_aux_entry;
       
 13315 +#endif
       
 13316 +// When we find the VDSO mapping in the process's address space, this
       
 13317 +// is the name we use for it when writing it to the minidump.
       
 13318 +// This should always be less than NAME_MAX!
       
 13319 +const char kLinuxGateLibraryName[] = "linux-gate.so";
       
 13320 +
       
 13321 +// We produce one of these structures for each thread in the crashed process.
       
 13322 +struct ThreadInfo {
       
 13323 +  pid_t tgid;   // thread group id
       
 13324 +  pid_t ppid;   // parent process
       
 13325 +
       
 13326 +  // Even on platforms where the stack grows down, the following will point to
       
 13327 +  // the smallest address in the stack.
       
 13328 +  const void* stack;  // pointer to the stack area
       
 13329 +  size_t stack_len;  // length of the stack to copy
       
 13330 +
       
 13331 +  user_regs_struct regs;
       
 13332 +  user_fpregs_struct fpregs;
       
 13333 +#if defined(__i386)
       
 13334 +  user_fpxregs_struct fpxregs;
       
 13335 +#endif
       
 13336 +
       
 13337 +#if defined(__i386) || defined(__x86_64)
       
 13338 +
       
 13339 +  static const unsigned kNumDebugRegisters = 8;
       
 13340 +  debugreg_t dregs[8];
       
 13341 +#endif
       
 13342 +};
       
 13343 +
       
 13344 +// One of these is produced for each mapping in the process (i.e. line in
       
 13345 +// /proc/$x/maps).
       
 13346 +struct MappingInfo {
       
 13347 +  uintptr_t start_addr;
       
 13348 +  size_t size;
       
 13349 +  size_t offset;  // offset into the backed file.
       
 13350 +  char name[NAME_MAX];
       
 13351 +};
       
 13352 +
       
 13353 +class LinuxDumper {
       
 13354 + public:
       
 13355 +  explicit LinuxDumper(pid_t pid);
       
 13356 +
       
 13357 +  // Parse the data for |threads| and |mappings|.
       
 13358 +  bool Init();
       
 13359 +
       
 13360 +  // Suspend/resume all threads in the given process.
       
 13361 +  bool ThreadsSuspend();
       
 13362 +  bool ThreadsResume();
       
 13363 +
       
 13364 +  // Read information about the given thread. Returns true on success. One must
       
 13365 +  // have called |ThreadsSuspend| first.
       
 13366 +  bool ThreadInfoGet(pid_t tid, ThreadInfo* info);
       
 13367 +
       
 13368 +  // These are only valid after a call to |Init|.
       
 13369 +  const wasteful_vector<pid_t> &threads() { return threads_; }
       
 13370 +  const wasteful_vector<MappingInfo*> &mappings() { return mappings_; }
       
 13371 +  const MappingInfo* FindMapping(const void* address) const;
       
 13372 +
       
 13373 +  // Find a block of memory to take as the stack given the top of stack pointer.
       
 13374 +  //   stack: (output) the lowest address in the memory area
       
 13375 +  //   stack_len: (output) the length of the memory area
       
 13376 +  //   stack_top: the current top of the stack
       
 13377 +  bool GetStackInfo(const void** stack, size_t* stack_len, uintptr_t stack_top);
       
 13378 +
       
 13379 +  PageAllocator* allocator() { return &allocator_; }
       
 13380 +
       
 13381 +  // memcpy from a remote process.
       
 13382 +  static void CopyFromProcess(void* dest, pid_t child, const void* src,
       
 13383 +                              size_t length);
       
 13384 +
       
 13385 +  // Builds a proc path for a certain pid for a node.  path is a
       
 13386 +  // character array that is overwritten, and node is the final node
       
 13387 +  // without any slashes.
       
 13388 +  void BuildProcPath(char* path, pid_t pid, const char* node) const;
       
 13389 +
       
 13390 +  // Generate a File ID from the .text section of a mapped entry
       
 13391 +  bool ElfFileIdentifierForMapping(unsigned int mapping_id,
       
 13392 +                                   uint8_t identifier[sizeof(MDGUID)]);
       
 13393 +
       
 13394 +  // Utility method to find the location of where the kernel has
       
 13395 +  // mapped linux-gate.so in memory(shows up in /proc/pid/maps as
       
 13396 +  // [vdso], but we can't guarantee that it's the only virtual dynamic
       
 13397 +  // shared object.  Parsing the auxilary vector for AT_SYSINFO_EHDR
       
 13398 +  // is the safest way to go.)
       
 13399 +  void* FindBeginningOfLinuxGateSharedLibrary(const pid_t pid) const;
       
 13400 + private:
       
 13401 +  bool EnumerateMappings(wasteful_vector<MappingInfo*>* result) const;
       
 13402 +  bool EnumerateThreads(wasteful_vector<pid_t>* result) const;
       
 13403 +
       
 13404 +  const pid_t pid_;
       
 13405 +
       
 13406 +  mutable PageAllocator allocator_;
       
 13407 +
       
 13408 +  bool threads_suspened_;
       
 13409 +  wasteful_vector<pid_t> threads_;  // the ids of all the threads
       
 13410 +  wasteful_vector<MappingInfo*> mappings_;  // info from /proc/<pid>/maps
       
 13411 +};
       
 13412 +
       
 13413 +}  // namespace google_breakpad
       
 13414 +
       
 13415 +#endif  // CLIENT_LINUX_HANDLER_LINUX_DUMPER_H_
       
 13416 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper_unittest.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper_unittest.cc
       
 13417 new file mode 100644
       
 13418 --- /dev/null
       
 13419 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/linux_dumper_unittest.cc
       
 13420 @@ -0,0 +1,183 @@
       
 13421 +// Copyright (c) 2009, Google Inc.
       
 13422 +// All rights reserved.
       
 13423 +//
       
 13424 +// Redistribution and use in source and binary forms, with or without
       
 13425 +// modification, are permitted provided that the following conditions are
       
 13426 +// met:
       
 13427 +//
       
 13428 +//     * Redistributions of source code must retain the above copyright
       
 13429 +// notice, this list of conditions and the following disclaimer.
       
 13430 +//     * Redistributions in binary form must reproduce the above
       
 13431 +// copyright notice, this list of conditions and the following disclaimer
       
 13432 +// in the documentation and/or other materials provided with the
       
 13433 +// distribution.
       
 13434 +//     * Neither the name of Google Inc. nor the names of its
       
 13435 +// contributors may be used to endorse or promote products derived from
       
 13436 +// this software without specific prior written permission.
       
 13437 +//
       
 13438 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 13439 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 13440 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 13441 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 13442 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 13443 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 13444 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 13445 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 13446 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 13447 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 13448 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 13449 +
       
 13450 +#include <limits.h>
       
 13451 +#include <unistd.h>
       
 13452 +
       
 13453 +#include "client/linux/minidump_writer/linux_dumper.h"
       
 13454 +#include "common/linux/file_id.h"
       
 13455 +#include "breakpad_googletest_includes.h"
       
 13456 +
       
 13457 +using namespace google_breakpad;
       
 13458 +
       
 13459 +// This provides a wrapper around system calls which may be
       
 13460 +// interrupted by a signal and return EINTR. See man 7 signal.
       
 13461 +#define HANDLE_EINTR(x) ({ \
       
 13462 +  typeof(x) __eintr_result__; \
       
 13463 +  do { \
       
 13464 +    __eintr_result__ = x; \
       
 13465 +  } while (__eintr_result__ == -1 && errno == EINTR); \
       
 13466 +  __eintr_result__;\
       
 13467 +})
       
 13468 +
       
 13469 +namespace {
       
 13470 +typedef testing::Test LinuxDumperTest;
       
 13471 +}
       
 13472 +
       
 13473 +TEST(LinuxDumperTest, Setup) {
       
 13474 +  LinuxDumper dumper(getpid());
       
 13475 +}
       
 13476 +
       
 13477 +TEST(LinuxDumperTest, FindMappings) {
       
 13478 +  LinuxDumper dumper(getpid());
       
 13479 +  ASSERT_TRUE(dumper.Init());
       
 13480 +
       
 13481 +  ASSERT_TRUE(dumper.FindMapping(reinterpret_cast<void*>(getpid)));
       
 13482 +  ASSERT_TRUE(dumper.FindMapping(reinterpret_cast<void*>(printf)));
       
 13483 +  ASSERT_FALSE(dumper.FindMapping(NULL));
       
 13484 +}
       
 13485 +
       
 13486 +TEST(LinuxDumperTest, ThreadList) {
       
 13487 +  LinuxDumper dumper(getpid());
       
 13488 +  ASSERT_TRUE(dumper.Init());
       
 13489 +
       
 13490 +  ASSERT_GE(dumper.threads().size(), 1);
       
 13491 +  bool found = false;
       
 13492 +  for (size_t i = 0; i < dumper.threads().size(); ++i) {
       
 13493 +    if (dumper.threads()[i] == getpid()) {
       
 13494 +      found = true;
       
 13495 +      break;
       
 13496 +    }
       
 13497 +  }
       
 13498 +}
       
 13499 +
       
 13500 +TEST(LinuxDumperTest, BuildProcPath) {
       
 13501 +  const pid_t pid = getpid();
       
 13502 +  LinuxDumper dumper(pid);
       
 13503 +
       
 13504 +  char maps_path[256] = "dummymappath";
       
 13505 +  char maps_path_expected[256];
       
 13506 +  snprintf(maps_path_expected, sizeof(maps_path_expected),
       
 13507 +           "/proc/%d/maps", pid);
       
 13508 +  dumper.BuildProcPath(maps_path, pid, "maps");
       
 13509 +  ASSERT_STREQ(maps_path, maps_path_expected);
       
 13510 +
       
 13511 +  // In release mode, we expect BuildProcPath to handle the invalid
       
 13512 +  // parameters correctly and fill map_path with an empty
       
 13513 +  // NULL-terminated string.
       
 13514 +#ifdef NDEBUG
       
 13515 +  snprintf(maps_path, sizeof(maps_path), "dummymappath");
       
 13516 +  dumper.BuildProcPath(maps_path, 0, "maps");
       
 13517 +  EXPECT_STREQ(maps_path, "");
       
 13518 +
       
 13519 +  snprintf(maps_path, sizeof(maps_path), "dummymappath");
       
 13520 +  dumper.BuildProcPath(maps_path, getpid(), "");
       
 13521 +  EXPECT_STREQ(maps_path, "");
       
 13522 +
       
 13523 +  snprintf(maps_path, sizeof(maps_path), "dummymappath");
       
 13524 +  dumper.BuildProcPath(maps_path, getpid(), NULL);
       
 13525 +  EXPECT_STREQ(maps_path, "");
       
 13526 +#endif
       
 13527 +}
       
 13528 +
       
 13529 +TEST(LinuxDumperTest, MappingsIncludeLinuxGate) {
       
 13530 +  LinuxDumper dumper(getpid());
       
 13531 +  ASSERT_TRUE(dumper.Init());
       
 13532 +
       
 13533 +  void* linux_gate_loc = dumper.FindBeginningOfLinuxGateSharedLibrary(getpid());
       
 13534 +  if (linux_gate_loc) {
       
 13535 +    bool found_linux_gate = false;
       
 13536 +
       
 13537 +    const wasteful_vector<MappingInfo*> mappings = dumper.mappings();
       
 13538 +    const MappingInfo* mapping;
       
 13539 +    for (unsigned i = 0; i < mappings.size(); ++i) {
       
 13540 +      mapping = mappings[i];
       
 13541 +      if (!strcmp(mapping->name, kLinuxGateLibraryName)) {
       
 13542 +        found_linux_gate = true;
       
 13543 +        break;
       
 13544 +      }
       
 13545 +    }
       
 13546 +    EXPECT_TRUE(found_linux_gate);
       
 13547 +    EXPECT_EQ(linux_gate_loc, reinterpret_cast<void*>(mapping->start_addr));
       
 13548 +    EXPECT_EQ(0, memcmp(linux_gate_loc, ELFMAG, SELFMAG));
       
 13549 +  }
       
 13550 +}
       
 13551 +
       
 13552 +TEST(LinuxDumperTest, FileIDsMatch) {
       
 13553 +  // Calculate the File ID of our binary using both
       
 13554 +  // FileID::ElfFileIdentifier and LinuxDumper::ElfFileIdentifierForMapping
       
 13555 +  // and ensure that we get the same result from both.
       
 13556 +  char exe_name[PATH_MAX];
       
 13557 +  ssize_t len = readlink("/proc/self/exe", exe_name, PATH_MAX - 1);
       
 13558 +  ASSERT_NE(len, -1);
       
 13559 +  exe_name[len] = '\0';
       
 13560 +
       
 13561 +  int fds[2];
       
 13562 +  ASSERT_NE(-1, pipe(fds));
       
 13563 +
       
 13564 +  // fork a child so we can ptrace it
       
 13565 +  const pid_t child = fork();
       
 13566 +  if (child == 0) {
       
 13567 +    close(fds[1]);
       
 13568 +    // now wait forever for the parent
       
 13569 +    char b;
       
 13570 +    HANDLE_EINTR(read(fds[0], &b, sizeof(b)));
       
 13571 +    close(fds[0]);
       
 13572 +    syscall(__NR_exit);
       
 13573 +  }
       
 13574 +  close(fds[0]);
       
 13575 +
       
 13576 +  LinuxDumper dumper(child);
       
 13577 +  ASSERT_TRUE(dumper.Init());
       
 13578 +  const wasteful_vector<MappingInfo*> mappings = dumper.mappings();
       
 13579 +  bool found_exe = false;
       
 13580 +  unsigned i;
       
 13581 +  for (i = 0; i < mappings.size(); ++i) {
       
 13582 +    const MappingInfo* mapping = mappings[i];
       
 13583 +    if (!strcmp(mapping->name, exe_name)) {
       
 13584 +      found_exe = true;
       
 13585 +      break;
       
 13586 +    }
       
 13587 +  }
       
 13588 +  ASSERT_TRUE(found_exe);
       
 13589 +
       
 13590 +  uint8_t identifier1[sizeof(MDGUID)];
       
 13591 +  uint8_t identifier2[sizeof(MDGUID)];
       
 13592 +  EXPECT_TRUE(dumper.ElfFileIdentifierForMapping(i, identifier1));
       
 13593 +  FileID fileid(exe_name);
       
 13594 +  EXPECT_TRUE(fileid.ElfFileIdentifier(identifier2));
       
 13595 +  char identifier_string1[37];
       
 13596 +  char identifier_string2[37];
       
 13597 +  FileID::ConvertIdentifierToString(identifier1, identifier_string1,
       
 13598 +                                    37);
       
 13599 +  FileID::ConvertIdentifierToString(identifier2, identifier_string2,
       
 13600 +                                    37);
       
 13601 +  EXPECT_STREQ(identifier_string1, identifier_string2);
       
 13602 +  close(fds[1]);
       
 13603 +}
       
 13604 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc
       
 13605 new file mode 100644
       
 13606 --- /dev/null
       
 13607 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc
       
 13608 @@ -0,0 +1,857 @@
       
 13609 +// Copyright (c) 2009, Google Inc.
       
 13610 +// All rights reserved.
       
 13611 +//
       
 13612 +// Redistribution and use in source and binary forms, with or without
       
 13613 +// modification, are permitted provided that the following conditions are
       
 13614 +// met:
       
 13615 +//
       
 13616 +//     * Redistributions of source code must retain the above copyright
       
 13617 +// notice, this list of conditions and the following disclaimer.
       
 13618 +//     * Redistributions in binary form must reproduce the above
       
 13619 +// copyright notice, this list of conditions and the following disclaimer
       
 13620 +// in the documentation and/or other materials provided with the
       
 13621 +// distribution.
       
 13622 +//     * Neither the name of Google Inc. nor the names of its
       
 13623 +// contributors may be used to endorse or promote products derived from
       
 13624 +// this software without specific prior written permission.
       
 13625 +//
       
 13626 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 13627 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 13628 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 13629 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 13630 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 13631 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 13632 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 13633 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 13634 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 13635 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 13636 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 13637 +
       
 13638 +// This code writes out minidump files:
       
 13639 +//   http://msdn.microsoft.com/en-us/library/ms680378(VS.85,loband).aspx
       
 13640 +//
       
 13641 +// Minidumps are a Microsoft format which Breakpad uses for recording crash
       
 13642 +// dumps. This code has to run in a compromised environment (the address space
       
 13643 +// may have received SIGSEGV), thus the following rules apply:
       
 13644 +//   * You may not enter the dynamic linker. This means that we cannot call
       
 13645 +//     any symbols in a shared library (inc libc). Because of this we replace
       
 13646 +//     libc functions in linux_libc_support.h.
       
 13647 +//   * You may not call syscalls via the libc wrappers. This rule is a subset
       
 13648 +//     of the first rule but it bears repeating. We have direct wrappers
       
 13649 +//     around the system calls in linux_syscall_support.h.
       
 13650 +//   * You may not malloc. There's an alternative allocator in memory.h and
       
 13651 +//     a canonical instance in the LinuxDumper object. We use the placement
       
 13652 +//     new form to allocate objects and we don't delete them.
       
 13653 +
       
 13654 +#include "client/linux/minidump_writer/minidump_writer.h"
       
 13655 +#include "client/minidump_file_writer-inl.h"
       
 13656 +
       
 13657 +#include <errno.h>
       
 13658 +#include <fcntl.h>
       
 13659 +#include <stdio.h>
       
 13660 +#include <unistd.h>
       
 13661 +#include <sys/ucontext.h>
       
 13662 +#include <sys/user.h>
       
 13663 +#include <sys/utsname.h>
       
 13664 +
       
 13665 +#include "client/minidump_file_writer.h"
       
 13666 +#include "google_breakpad/common/minidump_format.h"
       
 13667 +#include "google_breakpad/common/minidump_cpu_amd64.h"
       
 13668 +#include "google_breakpad/common/minidump_cpu_x86.h"
       
 13669 +
       
 13670 +#include "client/linux/handler/exception_handler.h"
       
 13671 +#include "client/linux/minidump_writer/line_reader.h"
       
 13672 +#include "client/linux/minidump_writer//linux_dumper.h"
       
 13673 +#include "common/linux/linux_libc_support.h"
       
 13674 +#include "common/linux/linux_syscall_support.h"
       
 13675 +
       
 13676 +// These are additional minidump stream values which are specific to the linux
       
 13677 +// breakpad implementation.
       
 13678 +enum {
       
 13679 +  MD_LINUX_CPU_INFO              = 0x47670003,    /* /proc/cpuinfo    */
       
 13680 +  MD_LINUX_PROC_STATUS           = 0x47670004,    /* /proc/$x/status  */
       
 13681 +  MD_LINUX_LSB_RELEASE           = 0x47670005,    /* /etc/lsb-release */
       
 13682 +  MD_LINUX_CMD_LINE              = 0x47670006,    /* /proc/$x/cmdline */
       
 13683 +  MD_LINUX_ENVIRON               = 0x47670007,    /* /proc/$x/environ */
       
 13684 +  MD_LINUX_AUXV                  = 0x47670008     /* /proc/$x/auxv    */
       
 13685 +};
       
 13686 +
       
 13687 +// Minidump defines register structures which are different from the raw
       
 13688 +// structures which we get from the kernel. These are platform specific
       
 13689 +// functions to juggle the ucontext and user structures into minidump format.
       
 13690 +#if defined(__i386)
       
 13691 +typedef MDRawContextX86 RawContextCPU;
       
 13692 +
       
 13693 +// Write a uint16_t to memory
       
 13694 +//   out: memory location to write to
       
 13695 +//   v: value to write.
       
 13696 +static void U16(void* out, uint16_t v) {
       
 13697 +  memcpy(out, &v, sizeof(v));
       
 13698 +}
       
 13699 +
       
 13700 +// Write a uint32_t to memory
       
 13701 +//   out: memory location to write to
       
 13702 +//   v: value to write.
       
 13703 +static void U32(void* out, uint32_t v) {
       
 13704 +  memcpy(out, &v, sizeof(v));
       
 13705 +}
       
 13706 +
       
 13707 +// Juggle an x86 user_(fp|fpx|)regs_struct into minidump format
       
 13708 +//   out: the minidump structure
       
 13709 +//   info: the collection of register structures.
       
 13710 +static void CPUFillFromThreadInfo(MDRawContextX86 *out,
       
 13711 +                                  const google_breakpad::ThreadInfo &info) {
       
 13712 +  out->context_flags = MD_CONTEXT_X86_ALL;
       
 13713 +
       
 13714 +  out->dr0 = info.dregs[0];
       
 13715 +  out->dr1 = info.dregs[1];
       
 13716 +  out->dr2 = info.dregs[2];
       
 13717 +  out->dr3 = info.dregs[3];
       
 13718 +  // 4 and 5 deliberatly omitted because they aren't included in the minidump
       
 13719 +  // format.
       
 13720 +  out->dr6 = info.dregs[6];
       
 13721 +  out->dr7 = info.dregs[7];
       
 13722 +
       
 13723 +  out->gs = info.regs.xgs;
       
 13724 +  out->fs = info.regs.xfs;
       
 13725 +  out->es = info.regs.xes;
       
 13726 +  out->ds = info.regs.xds;
       
 13727 +
       
 13728 +  out->edi = info.regs.edi;
       
 13729 +  out->esi = info.regs.esi;
       
 13730 +  out->ebx = info.regs.ebx;
       
 13731 +  out->edx = info.regs.edx;
       
 13732 +  out->ecx = info.regs.ecx;
       
 13733 +  out->eax = info.regs.eax;
       
 13734 +
       
 13735 +  out->ebp = info.regs.ebp;
       
 13736 +  out->eip = info.regs.eip;
       
 13737 +  out->cs = info.regs.xcs;
       
 13738 +  out->eflags = info.regs.eflags;
       
 13739 +  out->esp = info.regs.esp;
       
 13740 +  out->ss = info.regs.xss;
       
 13741 +
       
 13742 +  out->float_save.control_word = info.fpregs.cwd;
       
 13743 +  out->float_save.status_word = info.fpregs.swd;
       
 13744 +  out->float_save.tag_word = info.fpregs.twd;
       
 13745 +  out->float_save.error_offset = info.fpregs.fip;
       
 13746 +  out->float_save.error_selector = info.fpregs.fcs;
       
 13747 +  out->float_save.data_offset = info.fpregs.foo;
       
 13748 +  out->float_save.data_selector = info.fpregs.fos;
       
 13749 +
       
 13750 +  // 8 registers * 10 bytes per register.
       
 13751 +  memcpy(out->float_save.register_area, info.fpregs.st_space, 10 * 8);
       
 13752 +
       
 13753 +  // This matches the Intel fpsave format.
       
 13754 +  U16(out->extended_registers + 0, info.fpregs.cwd);
       
 13755 +  U16(out->extended_registers + 2, info.fpregs.swd);
       
 13756 +  U16(out->extended_registers + 4, info.fpregs.twd);
       
 13757 +  U16(out->extended_registers + 6, info.fpxregs.fop);
       
 13758 +  U32(out->extended_registers + 8, info.fpxregs.fip);
       
 13759 +  U16(out->extended_registers + 12, info.fpxregs.fcs);
       
 13760 +  U32(out->extended_registers + 16, info.fpregs.foo);
       
 13761 +  U16(out->extended_registers + 20, info.fpregs.fos);
       
 13762 +  U32(out->extended_registers + 24, info.fpxregs.mxcsr);
       
 13763 +
       
 13764 +  memcpy(out->extended_registers + 32, &info.fpxregs.st_space, 128);
       
 13765 +  memcpy(out->extended_registers + 160, &info.fpxregs.xmm_space, 128);
       
 13766 +}
       
 13767 +
       
 13768 +// Juggle an x86 ucontext into minidump format
       
 13769 +//   out: the minidump structure
       
 13770 +//   info: the collection of register structures.
       
 13771 +static void CPUFillFromUContext(MDRawContextX86 *out, const ucontext *uc,
       
 13772 +                                const struct _libc_fpstate* fp) {
       
 13773 +  const greg_t* regs = uc->uc_mcontext.gregs;
       
 13774 +
       
 13775 +  out->context_flags = MD_CONTEXT_X86_FULL |
       
 13776 +                       MD_CONTEXT_X86_FLOATING_POINT;
       
 13777 +
       
 13778 +  out->gs = regs[REG_GS];
       
 13779 +  out->fs = regs[REG_FS];
       
 13780 +  out->es = regs[REG_ES];
       
 13781 +  out->ds = regs[REG_DS];
       
 13782 +
       
 13783 +  out->edi = regs[REG_EDI];
       
 13784 +  out->esi = regs[REG_ESI];
       
 13785 +  out->ebx = regs[REG_EBX];
       
 13786 +  out->edx = regs[REG_EDX];
       
 13787 +  out->ecx = regs[REG_ECX];
       
 13788 +  out->eax = regs[REG_EAX];
       
 13789 +
       
 13790 +  out->ebp = regs[REG_EBP];
       
 13791 +  out->eip = regs[REG_EIP];
       
 13792 +  out->cs = regs[REG_CS];
       
 13793 +  out->eflags = regs[REG_EFL];
       
 13794 +  out->esp = regs[REG_UESP];
       
 13795 +  out->ss = regs[REG_SS];
       
 13796 +
       
 13797 +  out->float_save.control_word = fp->cw;
       
 13798 +  out->float_save.status_word = fp->sw;
       
 13799 +  out->float_save.tag_word = fp->tag;
       
 13800 +  out->float_save.error_offset = fp->ipoff;
       
 13801 +  out->float_save.error_selector = fp->cssel;
       
 13802 +  out->float_save.data_offset = fp->dataoff;
       
 13803 +  out->float_save.data_selector = fp->datasel;
       
 13804 +
       
 13805 +  // 8 registers * 10 bytes per register.
       
 13806 +  memcpy(out->float_save.register_area, fp->_st, 10 * 8);
       
 13807 +}
       
 13808 +
       
 13809 +#elif defined(__x86_64)
       
 13810 +typedef MDRawContextAMD64 RawContextCPU;
       
 13811 +
       
 13812 +static void CPUFillFromThreadInfo(MDRawContextAMD64 *out,
       
 13813 +                                  const google_breakpad::ThreadInfo &info) {
       
 13814 +  out->context_flags = MD_CONTEXT_AMD64_FULL |
       
 13815 +                       MD_CONTEXT_AMD64_SEGMENTS;
       
 13816 +
       
 13817 +  out->cs = info.regs.cs;
       
 13818 +
       
 13819 +  out->ds = info.regs.ds;
       
 13820 +  out->es = info.regs.es;
       
 13821 +  out->fs = info.regs.fs;
       
 13822 +  out->gs = info.regs.gs;
       
 13823 +
       
 13824 +  out->ss = info.regs.ss;
       
 13825 +  out->eflags = info.regs.eflags;
       
 13826 +
       
 13827 +  out->dr0 = info.dregs[0];
       
 13828 +  out->dr1 = info.dregs[1];
       
 13829 +  out->dr2 = info.dregs[2];
       
 13830 +  out->dr3 = info.dregs[3];
       
 13831 +  // 4 and 5 deliberatly omitted because they aren't included in the minidump
       
 13832 +  // format.
       
 13833 +  out->dr6 = info.dregs[6];
       
 13834 +  out->dr7 = info.dregs[7];
       
 13835 +
       
 13836 +  out->rax = info.regs.rax;
       
 13837 +  out->rcx = info.regs.rcx;
       
 13838 +  out->rdx = info.regs.rdx;
       
 13839 +  out->rbx = info.regs.rbx;
       
 13840 +
       
 13841 +  out->rsp = info.regs.rsp;
       
 13842 +
       
 13843 +  out->rbp = info.regs.rbp;
       
 13844 +  out->rsi = info.regs.rsi;
       
 13845 +  out->rdi = info.regs.rdi;
       
 13846 +  out->r8 = info.regs.r8;
       
 13847 +  out->r9 = info.regs.r9;
       
 13848 +  out->r10 = info.regs.r10;
       
 13849 +  out->r11 = info.regs.r11;
       
 13850 +  out->r12 = info.regs.r12;
       
 13851 +  out->r13 = info.regs.r13;
       
 13852 +  out->r14 = info.regs.r14;
       
 13853 +  out->r15 = info.regs.r15;
       
 13854 +
       
 13855 +  out->rip = info.regs.rip;
       
 13856 +
       
 13857 +  out->flt_save.control_word = info.fpregs.cwd;
       
 13858 +  out->flt_save.status_word = info.fpregs.swd;
       
 13859 +  out->flt_save.tag_word = info.fpregs.ftw;
       
 13860 +  out->flt_save.error_opcode = info.fpregs.fop;
       
 13861 +  out->flt_save.error_offset = info.fpregs.rip;
       
 13862 +  out->flt_save.error_selector = 0; // We don't have this.
       
 13863 +  out->flt_save.data_offset = info.fpregs.rdp;
       
 13864 +  out->flt_save.data_selector = 0;  // We don't have this.
       
 13865 +  out->flt_save.mx_csr = info.fpregs.mxcsr;
       
 13866 +  out->flt_save.mx_csr_mask = info.fpregs.mxcr_mask;
       
 13867 +  memcpy(&out->flt_save.float_registers, &info.fpregs.st_space, 8 * 16);
       
 13868 +  memcpy(&out->flt_save.xmm_registers, &info.fpregs.xmm_space, 16 * 16);
       
 13869 +}
       
 13870 +
       
 13871 +static void CPUFillFromUContext(MDRawContextAMD64 *out, const ucontext *uc,
       
 13872 +                                const struct _libc_fpstate* fpregs) {
       
 13873 +  const greg_t* regs = uc->uc_mcontext.gregs;
       
 13874 +
       
 13875 +  out->context_flags = MD_CONTEXT_AMD64_FULL;
       
 13876 +
       
 13877 +  out->cs = regs[REG_CSGSFS] & 0xffff;
       
 13878 +
       
 13879 +  out->fs = (regs[REG_CSGSFS] >> 32) & 0xffff;
       
 13880 +  out->gs = (regs[REG_CSGSFS] >> 16) & 0xffff;
       
 13881 +
       
 13882 +  out->eflags = regs[REG_EFL];
       
 13883 +
       
 13884 +  out->rax = regs[REG_RAX];
       
 13885 +  out->rcx = regs[REG_RCX];
       
 13886 +  out->rdx = regs[REG_RDX];
       
 13887 +  out->rbx = regs[REG_RBX];
       
 13888 +
       
 13889 +  out->rsp = regs[REG_RSP];
       
 13890 +  out->rbp = regs[REG_RBP];
       
 13891 +  out->rsi = regs[REG_RSI];
       
 13892 +  out->rdi = regs[REG_RDI];
       
 13893 +  out->r8 = regs[REG_R8];
       
 13894 +  out->r9 = regs[REG_R9];
       
 13895 +  out->r10 = regs[REG_R10];
       
 13896 +  out->r11 = regs[REG_R11];
       
 13897 +  out->r12 = regs[REG_R12];
       
 13898 +  out->r13 = regs[REG_R13];
       
 13899 +  out->r14 = regs[REG_R14];
       
 13900 +  out->r15 = regs[REG_R15];
       
 13901 +
       
 13902 +  out->rip = regs[REG_RIP];
       
 13903 +
       
 13904 +  out->flt_save.control_word = fpregs->cwd;
       
 13905 +  out->flt_save.status_word = fpregs->swd;
       
 13906 +  out->flt_save.tag_word = fpregs->ftw;
       
 13907 +  out->flt_save.error_opcode = fpregs->fop;
       
 13908 +  out->flt_save.error_offset = fpregs->rip;
       
 13909 +  out->flt_save.data_offset = fpregs->rdp;
       
 13910 +  out->flt_save.error_selector = 0; // We don't have this.
       
 13911 +  out->flt_save.data_selector = 0;  // We don't have this.
       
 13912 +  out->flt_save.mx_csr = fpregs->mxcsr;
       
 13913 +  out->flt_save.mx_csr_mask = fpregs->mxcr_mask;
       
 13914 +  memcpy(&out->flt_save.float_registers, &fpregs->_st, 8 * 16);
       
 13915 +  memcpy(&out->flt_save.xmm_registers, &fpregs->_xmm, 16 * 16);
       
 13916 +}
       
 13917 +
       
 13918 +#else
       
 13919 +#error "This code has not been ported to your platform yet."
       
 13920 +#endif
       
 13921 +
       
 13922 +namespace google_breakpad {
       
 13923 +
       
 13924 +class MinidumpWriter {
       
 13925 + public:
       
 13926 +  MinidumpWriter(const char* filename,
       
 13927 +                 pid_t crashing_pid,
       
 13928 +                 const ExceptionHandler::CrashContext* context)
       
 13929 +      : filename_(filename),
       
 13930 +        siginfo_(&context->siginfo),
       
 13931 +        ucontext_(&context->context),
       
 13932 +        float_state_(&context->float_state),
       
 13933 +        crashing_tid_(context->tid),
       
 13934 +        dumper_(crashing_pid) {
       
 13935 +  }
       
 13936 +
       
 13937 +  bool Init() {
       
 13938 +    return dumper_.Init() && minidump_writer_.Open(filename_) &&
       
 13939 +           dumper_.ThreadsSuspend();
       
 13940 +  }
       
 13941 +
       
 13942 +  ~MinidumpWriter() {
       
 13943 +    minidump_writer_.Close();
       
 13944 +    dumper_.ThreadsResume();
       
 13945 +  }
       
 13946 +
       
 13947 +  bool Dump() {
       
 13948 +    // A minidump file contains a number of tagged streams. This is the number
       
 13949 +    // of stream which we write.
       
 13950 +    static const unsigned kNumWriters = 11;
       
 13951 +
       
 13952 +    TypedMDRVA<MDRawHeader> header(&minidump_writer_);
       
 13953 +    TypedMDRVA<MDRawDirectory> dir(&minidump_writer_);
       
 13954 +    if (!header.Allocate())
       
 13955 +      return false;
       
 13956 +    if (!dir.AllocateArray(kNumWriters))
       
 13957 +      return false;
       
 13958 +    memset(header.get(), 0, sizeof(MDRawHeader));
       
 13959 +
       
 13960 +    header.get()->signature = MD_HEADER_SIGNATURE;
       
 13961 +    header.get()->version = MD_HEADER_VERSION;
       
 13962 +    header.get()->time_date_stamp = time(NULL);
       
 13963 +    header.get()->stream_count = kNumWriters;
       
 13964 +    header.get()->stream_directory_rva = dir.position();
       
 13965 +
       
 13966 +    unsigned dir_index = 0;
       
 13967 +    MDRawDirectory dirent;
       
 13968 +
       
 13969 +    if (!WriteThreadListStream(&dirent))
       
 13970 +      return false;
       
 13971 +    dir.CopyIndex(dir_index++, &dirent);
       
 13972 +
       
 13973 +    if (!WriteMappings(&dirent))
       
 13974 +      return false;
       
 13975 +    dir.CopyIndex(dir_index++, &dirent);
       
 13976 +
       
 13977 +    if (!WriteExceptionStream(&dirent))
       
 13978 +      return false;
       
 13979 +    dir.CopyIndex(dir_index++, &dirent);
       
 13980 +
       
 13981 +    if (!WriteSystemInfoStream(&dirent))
       
 13982 +      return false;
       
 13983 +    dir.CopyIndex(dir_index++, &dirent);
       
 13984 +
       
 13985 +    dirent.stream_type = MD_LINUX_CPU_INFO;
       
 13986 +    if (!WriteFile(&dirent.location, "/proc/cpuinfo"))
       
 13987 +      NullifyDirectoryEntry(&dirent);
       
 13988 +    dir.CopyIndex(dir_index++, &dirent);
       
 13989 +
       
 13990 +    dirent.stream_type = MD_LINUX_PROC_STATUS;
       
 13991 +    if (!WriteProcFile(&dirent.location, crashing_tid_, "status"))
       
 13992 +      NullifyDirectoryEntry(&dirent);
       
 13993 +    dir.CopyIndex(dir_index++, &dirent);
       
 13994 +
       
 13995 +    dirent.stream_type = MD_LINUX_LSB_RELEASE;
       
 13996 +    if (!WriteFile(&dirent.location, "/etc/lsb-release"))
       
 13997 +      NullifyDirectoryEntry(&dirent);
       
 13998 +    dir.CopyIndex(dir_index++, &dirent);
       
 13999 +
       
 14000 +    dirent.stream_type = MD_LINUX_CMD_LINE;
       
 14001 +    if (!WriteProcFile(&dirent.location, crashing_tid_, "cmdline"))
       
 14002 +      NullifyDirectoryEntry(&dirent);
       
 14003 +    dir.CopyIndex(dir_index++, &dirent);
       
 14004 +
       
 14005 +    dirent.stream_type = MD_LINUX_ENVIRON;
       
 14006 +    if (!WriteProcFile(&dirent.location, crashing_tid_, "environ"))
       
 14007 +      NullifyDirectoryEntry(&dirent);
       
 14008 +    dir.CopyIndex(dir_index++, &dirent);
       
 14009 +
       
 14010 +    dirent.stream_type = MD_LINUX_AUXV;
       
 14011 +    if (!WriteProcFile(&dirent.location, crashing_tid_, "auxv"))
       
 14012 +      NullifyDirectoryEntry(&dirent);
       
 14013 +    dir.CopyIndex(dir_index++, &dirent);
       
 14014 +
       
 14015 +    dirent.stream_type = MD_LINUX_AUXV;
       
 14016 +    if (!WriteProcFile(&dirent.location, crashing_tid_, "maps"))
       
 14017 +      NullifyDirectoryEntry(&dirent);
       
 14018 +    dir.CopyIndex(dir_index++, &dirent);
       
 14019 +
       
 14020 +    // If you add more directory entries, don't forget to update kNumWriters,
       
 14021 +    // above.
       
 14022 +
       
 14023 +    dumper_.ThreadsResume();
       
 14024 +    return true;
       
 14025 +  }
       
 14026 +
       
 14027 +  // Write information about the threads.
       
 14028 +  bool WriteThreadListStream(MDRawDirectory* dirent) {
       
 14029 +    const unsigned num_threads = dumper_.threads().size();
       
 14030 +
       
 14031 +    TypedMDRVA<uint32_t> list(&minidump_writer_);
       
 14032 +    if (!list.AllocateObjectAndArray(num_threads, sizeof(MDRawThread)))
       
 14033 +      return false;
       
 14034 +
       
 14035 +    dirent->stream_type = MD_THREAD_LIST_STREAM;
       
 14036 +    dirent->location = list.location();
       
 14037 +
       
 14038 +    *list.get() = num_threads;
       
 14039 +
       
 14040 +    for (unsigned i = 0; i < num_threads; ++i) {
       
 14041 +      MDRawThread thread;
       
 14042 +      my_memset(&thread, 0, sizeof(thread));
       
 14043 +      thread.thread_id = dumper_.threads()[i];
       
 14044 +      // We have a different source of information for the crashing thread. If
       
 14045 +      // we used the actual state of the thread we would find it running in the
       
 14046 +      // signal handler with the alternative stack, which would be deeply
       
 14047 +      // unhelpful.
       
 14048 +      if ((pid_t)thread.thread_id == crashing_tid_) {
       
 14049 +        const void* stack;
       
 14050 +        size_t stack_len;
       
 14051 +        if (!dumper_.GetStackInfo(&stack, &stack_len, GetStackPointer()))
       
 14052 +          return false;
       
 14053 +        UntypedMDRVA memory(&minidump_writer_);
       
 14054 +        if (!memory.Allocate(stack_len))
       
 14055 +          return false;
       
 14056 +        uint8_t* stack_copy = (uint8_t*) dumper_.allocator()->Alloc(stack_len);
       
 14057 +        dumper_.CopyFromProcess(stack_copy, thread.thread_id, stack, stack_len);
       
 14058 +        memory.Copy(stack_copy, stack_len);
       
 14059 +        thread.stack.start_of_memory_range = (uintptr_t) (stack);
       
 14060 +        thread.stack.memory = memory.location();
       
 14061 +        TypedMDRVA<RawContextCPU> cpu(&minidump_writer_);
       
 14062 +        if (!cpu.Allocate())
       
 14063 +          return false;
       
 14064 +        my_memset(cpu.get(), 0, sizeof(RawContextCPU));
       
 14065 +        CPUFillFromUContext(cpu.get(), ucontext_, float_state_);
       
 14066 +        thread.thread_context = cpu.location();
       
 14067 +        crashing_thread_context_ = cpu.location();
       
 14068 +      } else {
       
 14069 +        ThreadInfo info;
       
 14070 +        if (!dumper_.ThreadInfoGet(dumper_.threads()[i], &info))
       
 14071 +          return false;
       
 14072 +        UntypedMDRVA memory(&minidump_writer_);
       
 14073 +        if (!memory.Allocate(info.stack_len))
       
 14074 +          return false;
       
 14075 +        uint8_t* stack_copy =
       
 14076 +            (uint8_t*) dumper_.allocator()->Alloc(info.stack_len);
       
 14077 +        dumper_.CopyFromProcess(stack_copy, thread.thread_id, info.stack,
       
 14078 +                                info.stack_len);
       
 14079 +        memory.Copy(stack_copy, info.stack_len);
       
 14080 +        thread.stack.start_of_memory_range = (uintptr_t)(info.stack);
       
 14081 +        thread.stack.memory = memory.location();
       
 14082 +        TypedMDRVA<RawContextCPU> cpu(&minidump_writer_);
       
 14083 +        if (!cpu.Allocate())
       
 14084 +          return false;
       
 14085 +        my_memset(cpu.get(), 0, sizeof(RawContextCPU));
       
 14086 +        CPUFillFromThreadInfo(cpu.get(), info);
       
 14087 +        thread.thread_context = cpu.location();
       
 14088 +      }
       
 14089 +
       
 14090 +      list.CopyIndexAfterObject(i, &thread, sizeof(thread));
       
 14091 +    }
       
 14092 +
       
 14093 +    return true;
       
 14094 +  }
       
 14095 +
       
 14096 +  static bool ShouldIncludeMapping(const MappingInfo& mapping) {
       
 14097 +    if (mapping.name[0] == 0 || // we only want modules with filenames.
       
 14098 +        mapping.offset || // we only want to include one mapping per shared lib.
       
 14099 +        mapping.size < 4096) {  // too small to get a signature for.
       
 14100 +      return false;
       
 14101 +    }
       
 14102 +
       
 14103 +    return true;
       
 14104 +  }
       
 14105 +
       
 14106 +  // Write information about the mappings in effect. Because we are using the
       
 14107 +  // minidump format, the information about the mappings is pretty limited.
       
 14108 +  // Because of this, we also include the full, unparsed, /proc/$x/maps file in
       
 14109 +  // another stream in the file.
       
 14110 +  bool WriteMappings(MDRawDirectory* dirent) {
       
 14111 +    const unsigned num_mappings = dumper_.mappings().size();
       
 14112 +    unsigned num_output_mappings = 0;
       
 14113 +
       
 14114 +    for (unsigned i = 0; i < dumper_.mappings().size(); ++i) {
       
 14115 +      const MappingInfo& mapping = *dumper_.mappings()[i];
       
 14116 +      if (ShouldIncludeMapping(mapping))
       
 14117 +        num_output_mappings++;
       
 14118 +    }
       
 14119 +
       
 14120 +    TypedMDRVA<uint32_t> list(&minidump_writer_);
       
 14121 +    if (!list.AllocateObjectAndArray(num_output_mappings, MD_MODULE_SIZE))
       
 14122 +      return false;
       
 14123 +
       
 14124 +    dirent->stream_type = MD_MODULE_LIST_STREAM;
       
 14125 +    dirent->location = list.location();
       
 14126 +    *list.get() = num_output_mappings;
       
 14127 +
       
 14128 +    for (unsigned i = 0, j = 0; i < num_mappings; ++i) {
       
 14129 +      const MappingInfo& mapping = *dumper_.mappings()[i];
       
 14130 +      if (!ShouldIncludeMapping(mapping))
       
 14131 +        continue;
       
 14132 +
       
 14133 +      MDRawModule mod;
       
 14134 +      my_memset(&mod, 0, MD_MODULE_SIZE);
       
 14135 +      mod.base_of_image = mapping.start_addr;
       
 14136 +      mod.size_of_image = mapping.size;
       
 14137 +      const size_t filepath_len = my_strlen(mapping.name);
       
 14138 +
       
 14139 +      // Figure out file name from path
       
 14140 +      const char* filename_ptr = mapping.name + filepath_len - 1;
       
 14141 +      while (filename_ptr >= mapping.name) {
       
 14142 +        if (*filename_ptr == '/')
       
 14143 +          break;
       
 14144 +        filename_ptr--;
       
 14145 +      }
       
 14146 +      filename_ptr++;
       
 14147 +      const size_t filename_len = mapping.name + filepath_len - filename_ptr;
       
 14148 +
       
 14149 +      uint8_t cv_buf[MDCVInfoPDB70_minsize + NAME_MAX];
       
 14150 +      uint8_t* cv_ptr = cv_buf;
       
 14151 +      UntypedMDRVA cv(&minidump_writer_);
       
 14152 +      if (!cv.Allocate(MDCVInfoPDB70_minsize + filename_len + 1))
       
 14153 +        return false;
       
 14154 +
       
 14155 +      const uint32_t cv_signature = MD_CVINFOPDB70_SIGNATURE;
       
 14156 +      memcpy(cv_ptr, &cv_signature, sizeof(cv_signature));
       
 14157 +      cv_ptr += sizeof(cv_signature);
       
 14158 +      uint8_t* signature = cv_ptr;
       
 14159 +      cv_ptr += sizeof(MDGUID);
       
 14160 +      dumper_.ElfFileIdentifierForMapping(i, signature);
       
 14161 +      my_memset(cv_ptr, 0, sizeof(uint32_t));  // Set age to 0 on Linux.
       
 14162 +      cv_ptr += sizeof(uint32_t);
       
 14163 +
       
 14164 +      // Write pdb_file_name
       
 14165 +      memcpy(cv_ptr, filename_ptr, filename_len + 1);
       
 14166 +      cv.Copy(cv_buf, MDCVInfoPDB70_minsize + filename_len + 1);
       
 14167 +
       
 14168 +      mod.cv_record = cv.location();
       
 14169 +
       
 14170 +      MDLocationDescriptor ld;
       
 14171 +      if (!minidump_writer_.WriteString(mapping.name, filepath_len, &ld))
       
 14172 +        return false;
       
 14173 +      mod.module_name_rva = ld.rva;
       
 14174 +
       
 14175 +      list.CopyIndexAfterObject(j++, &mod, MD_MODULE_SIZE);
       
 14176 +    }
       
 14177 +
       
 14178 +    return true;
       
 14179 +  }
       
 14180 +
       
 14181 +  bool WriteExceptionStream(MDRawDirectory* dirent) {
       
 14182 +    TypedMDRVA<MDRawExceptionStream> exc(&minidump_writer_);
       
 14183 +    if (!exc.Allocate())
       
 14184 +      return false;
       
 14185 +    my_memset(exc.get(), 0, sizeof(MDRawExceptionStream));
       
 14186 +
       
 14187 +    dirent->stream_type = MD_EXCEPTION_STREAM;
       
 14188 +    dirent->location = exc.location();
       
 14189 +
       
 14190 +    exc.get()->thread_id = crashing_tid_;
       
 14191 +    exc.get()->exception_record.exception_code = siginfo_->si_signo;
       
 14192 +    exc.get()->exception_record.exception_address =
       
 14193 +        (uintptr_t) siginfo_->si_addr;
       
 14194 +    exc.get()->thread_context = crashing_thread_context_;
       
 14195 +
       
 14196 +    return true;
       
 14197 +  }
       
 14198 +
       
 14199 +  bool WriteSystemInfoStream(MDRawDirectory* dirent) {
       
 14200 +    TypedMDRVA<MDRawSystemInfo> si(&minidump_writer_);
       
 14201 +    if (!si.Allocate())
       
 14202 +      return false;
       
 14203 +    my_memset(si.get(), 0, sizeof(MDRawSystemInfo));
       
 14204 +
       
 14205 +    dirent->stream_type = MD_SYSTEM_INFO_STREAM;
       
 14206 +    dirent->location = si.location();
       
 14207 +
       
 14208 +    WriteCPUInformation(si.get());
       
 14209 +    WriteOSInformation(si.get());
       
 14210 +
       
 14211 +    return true;
       
 14212 +  }
       
 14213 +
       
 14214 + private:
       
 14215 +#if defined(__i386)
       
 14216 +  uintptr_t GetStackPointer() {
       
 14217 +    return ucontext_->uc_mcontext.gregs[REG_ESP];
       
 14218 +  }
       
 14219 +#elif defined(__x86_64)
       
 14220 +  uintptr_t GetStackPointer() {
       
 14221 +    return ucontext_->uc_mcontext.gregs[REG_RSP];
       
 14222 +  }
       
 14223 +#else
       
 14224 +#error "This code has not been ported to your platform yet."
       
 14225 +#endif
       
 14226 +
       
 14227 +  void NullifyDirectoryEntry(MDRawDirectory* dirent) {
       
 14228 +    dirent->stream_type = 0;
       
 14229 +    dirent->location.data_size = 0;
       
 14230 +    dirent->location.rva = 0;
       
 14231 +  }
       
 14232 +
       
 14233 +  bool WriteCPUInformation(MDRawSystemInfo* sys_info) {
       
 14234 +    char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0};
       
 14235 +    static const char vendor_id_name[] = "vendor_id";
       
 14236 +    static const size_t vendor_id_name_length = sizeof(vendor_id_name) - 1;
       
 14237 +
       
 14238 +    struct CpuInfoEntry {
       
 14239 +      const char* info_name;
       
 14240 +      int value;
       
 14241 +      bool found;
       
 14242 +    } cpu_info_table[] = {
       
 14243 +      { "processor", -1, false },
       
 14244 +      { "model", 0, false },
       
 14245 +      { "stepping",  0, false },
       
 14246 +      { "cpu family", 0, false },
       
 14247 +    };
       
 14248 +
       
 14249 +    // processor_architecture should always be set, do this first
       
 14250 +    sys_info->processor_architecture =
       
 14251 +#if defined(__i386)
       
 14252 +        MD_CPU_ARCHITECTURE_X86;
       
 14253 +#elif defined(__x86_64)
       
 14254 +        MD_CPU_ARCHITECTURE_AMD64;
       
 14255 +#else
       
 14256 +#error "Unknown CPU arch"
       
 14257 +#endif
       
 14258 +
       
 14259 +    const int fd = sys_open("/proc/cpuinfo", O_RDONLY, 0);
       
 14260 +    if (fd < 0)
       
 14261 +      return false;
       
 14262 +
       
 14263 +    {
       
 14264 +      PageAllocator allocator;
       
 14265 +      LineReader* const line_reader = new(allocator) LineReader(fd);
       
 14266 +      const char* line;
       
 14267 +      unsigned line_len;
       
 14268 +      while (line_reader->GetNextLine(&line, &line_len)) {
       
 14269 +        for (size_t i = 0;
       
 14270 +             i < sizeof(cpu_info_table) / sizeof(cpu_info_table[0]);
       
 14271 +             i++) {
       
 14272 +          CpuInfoEntry* entry = &cpu_info_table[i];
       
 14273 +          if (entry->found)
       
 14274 +            continue;
       
 14275 +          if (!strncmp(line, entry->info_name, strlen(entry->info_name))) {
       
 14276 +            const char* value = strchr(line, ':');
       
 14277 +            if (!value)
       
 14278 +              continue;
       
 14279 +
       
 14280 +            // the above strncmp only matches the prefix, it might be the wrong
       
 14281 +            // line. i.e. we matched "model name" instead of "model".
       
 14282 +            // check and make sure there is only spaces between the prefix and
       
 14283 +            // the colon.
       
 14284 +            const char* space_ptr = line + strlen(entry->info_name);
       
 14285 +            for (; space_ptr < value; space_ptr++) {
       
 14286 +              if (!isspace(*space_ptr)) {
       
 14287 +                break;
       
 14288 +              }
       
 14289 +            }
       
 14290 +            if (space_ptr != value)
       
 14291 +              continue;
       
 14292 +
       
 14293 +            sscanf(++value, " %d", &(entry->value));
       
 14294 +            entry->found = true;
       
 14295 +          }
       
 14296 +        }
       
 14297 +
       
 14298 +        // special case for vendor_id
       
 14299 +        if (!strncmp(line, vendor_id_name, vendor_id_name_length)) {
       
 14300 +          const char* value = strchr(line, ':');
       
 14301 +          if (!value)
       
 14302 +            goto popline;
       
 14303 +
       
 14304 +          // skip ':" and all the spaces that follows
       
 14305 +          do {
       
 14306 +            value++;
       
 14307 +          } while (isspace(*value));
       
 14308 +
       
 14309 +          if (*value) {
       
 14310 +            size_t length = strlen(value);
       
 14311 +            if (length == 0)
       
 14312 +              goto popline;
       
 14313 +            // we don't want the trailing newline
       
 14314 +            if (value[length - 1] == '\n')
       
 14315 +              length--;
       
 14316 +            // ensure we have space for the value
       
 14317 +            if (length < sizeof(vendor_id))
       
 14318 +              strncpy(vendor_id, value, length);
       
 14319 +          }
       
 14320 +        }
       
 14321 +
       
 14322 +popline:
       
 14323 +        line_reader->PopLine(line_len);
       
 14324 +      }
       
 14325 +      sys_close(fd);
       
 14326 +    }
       
 14327 +
       
 14328 +    // make sure we got everything we wanted
       
 14329 +    for (size_t i = 0;
       
 14330 +         i < sizeof(cpu_info_table) / sizeof(cpu_info_table[0]);
       
 14331 +         i++) {
       
 14332 +      if (!cpu_info_table[i].found) {
       
 14333 +        return false;
       
 14334 +      }
       
 14335 +    }
       
 14336 +    // /proc/cpuinfo contains cpu id, change it into number by adding one.
       
 14337 +    cpu_info_table[0].value++;
       
 14338 +
       
 14339 +    sys_info->number_of_processors = cpu_info_table[0].value;
       
 14340 +    sys_info->processor_level      = cpu_info_table[3].value;
       
 14341 +    sys_info->processor_revision   = cpu_info_table[1].value << 8 |
       
 14342 +                                     cpu_info_table[2].value;
       
 14343 +
       
 14344 +    if (vendor_id[0] != '\0') {
       
 14345 +      memcpy(sys_info->cpu.x86_cpu_info.vendor_id, vendor_id,
       
 14346 +             sizeof(sys_info->cpu.x86_cpu_info.vendor_id));
       
 14347 +    }
       
 14348 +    return true;
       
 14349 +  }
       
 14350 +
       
 14351 +  bool WriteFile(MDLocationDescriptor* result, const char* filename) {
       
 14352 +    const int fd = sys_open(filename, O_RDONLY, 0);
       
 14353 +    if (fd < 0)
       
 14354 +      return false;
       
 14355 +
       
 14356 +    // We can't stat the files because several of the files that we want to
       
 14357 +    // read are kernel seqfiles, which always have a length of zero. So we have
       
 14358 +    // to read as much as we can into a buffer.
       
 14359 +    static const unsigned kMaxFileSize = 1024;
       
 14360 +    uint8_t* data = (uint8_t*) dumper_.allocator()->Alloc(kMaxFileSize);
       
 14361 +
       
 14362 +    size_t done = 0;
       
 14363 +    while (done < kMaxFileSize) {
       
 14364 +      ssize_t r;
       
 14365 +      do {
       
 14366 +        r = sys_read(fd, data + done, kMaxFileSize - done);
       
 14367 +      } while (r == -1 && errno == EINTR);
       
 14368 +
       
 14369 +      if (r < 1)
       
 14370 +        break;
       
 14371 +      done += r;
       
 14372 +    }
       
 14373 +    sys_close(fd);
       
 14374 +
       
 14375 +    if (!done)
       
 14376 +      return false;
       
 14377 +
       
 14378 +    UntypedMDRVA memory(&minidump_writer_);
       
 14379 +    if (!memory.Allocate(done))
       
 14380 +      return false;
       
 14381 +    memory.Copy(data, done);
       
 14382 +    *result = memory.location();
       
 14383 +    return true;
       
 14384 +  }
       
 14385 +
       
 14386 +  bool WriteOSInformation(MDRawSystemInfo* sys_info) {
       
 14387 +    sys_info->platform_id = MD_OS_LINUX;
       
 14388 +
       
 14389 +    struct utsname uts;
       
 14390 +    if (uname(&uts))
       
 14391 +      return false;
       
 14392 +
       
 14393 +    static const size_t buf_len = 512;
       
 14394 +    char buf[buf_len] = {0};
       
 14395 +    size_t space_left = buf_len - 1;
       
 14396 +    const char* info_table[] = {
       
 14397 +      uts.sysname,
       
 14398 +      uts.release,
       
 14399 +      uts.version,
       
 14400 +      uts.machine,
       
 14401 +      NULL
       
 14402 +    };
       
 14403 +    bool first_item = true;
       
 14404 +    for (const char** cur_info = info_table; *cur_info; cur_info++) {
       
 14405 +      static const char* separator = " ";
       
 14406 +      size_t separator_len = strlen(separator);
       
 14407 +      size_t info_len = strlen(*cur_info);
       
 14408 +      if (info_len == 0)
       
 14409 +        continue;
       
 14410 +
       
 14411 +      if (space_left < info_len + (first_item ? 0 : separator_len))
       
 14412 +        break;
       
 14413 +
       
 14414 +      if (!first_item) {
       
 14415 +        strcat(buf, separator);
       
 14416 +        space_left -= separator_len;
       
 14417 +      }
       
 14418 +
       
 14419 +      first_item = false;
       
 14420 +      strcat(buf, *cur_info);
       
 14421 +      space_left -= info_len;
       
 14422 +    }
       
 14423 +
       
 14424 +    MDLocationDescriptor location;
       
 14425 +    if (!minidump_writer_.WriteString(buf, 0, &location))
       
 14426 +      return false;
       
 14427 +    sys_info->csd_version_rva = location.rva;
       
 14428 +
       
 14429 +    return true;
       
 14430 +  }
       
 14431 +
       
 14432 +  bool WriteProcFile(MDLocationDescriptor* result, pid_t pid,
       
 14433 +                     const char* filename) {
       
 14434 +    char buf[80];
       
 14435 +    memcpy(buf, "/proc/", 6);
       
 14436 +    const unsigned pid_len = my_int_len(pid);
       
 14437 +    my_itos(buf + 6, pid, pid_len);
       
 14438 +    buf[6 + pid_len] = '/';
       
 14439 +    memcpy(buf + 6 + pid_len + 1, filename, my_strlen(filename) + 1);
       
 14440 +    return WriteFile(result, buf);
       
 14441 +  }
       
 14442 +
       
 14443 +  const char* const filename_;  // output filename
       
 14444 +  const siginfo_t* const siginfo_;  // from the signal handler (see sigaction)
       
 14445 +  const struct ucontext* const ucontext_;  // also from the signal handler
       
 14446 +  const struct _libc_fpstate* const float_state_;  // ditto
       
 14447 +  const pid_t crashing_tid_;  // the process which actually crashed
       
 14448 +  LinuxDumper dumper_;
       
 14449 +  MinidumpFileWriter minidump_writer_;
       
 14450 +  MDLocationDescriptor crashing_thread_context_;
       
 14451 +};
       
 14452 +
       
 14453 +bool WriteMinidump(const char* filename, pid_t crashing_process,
       
 14454 +                   const void* blob, size_t blob_size) {
       
 14455 +  if (blob_size != sizeof(ExceptionHandler::CrashContext))
       
 14456 +    return false;
       
 14457 +  const ExceptionHandler::CrashContext* context =
       
 14458 +      reinterpret_cast<const ExceptionHandler::CrashContext*>(blob);
       
 14459 +  MinidumpWriter writer(filename, crashing_process, context);
       
 14460 +  if (!writer.Init())
       
 14461 +    return false;
       
 14462 +  return writer.Dump();
       
 14463 +}
       
 14464 +
       
 14465 +}  // namespace google_breakpad
       
 14466 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.h b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.h
       
 14467 new file mode 100644
       
 14468 --- /dev/null
       
 14469 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.h
       
 14470 @@ -0,0 +1,53 @@
       
 14471 +// Copyright (c) 2009, Google Inc.
       
 14472 +// All rights reserved.
       
 14473 +//
       
 14474 +// Redistribution and use in source and binary forms, with or without
       
 14475 +// modification, are permitted provided that the following conditions are
       
 14476 +// met:
       
 14477 +//
       
 14478 +//     * Redistributions of source code must retain the above copyright
       
 14479 +// notice, this list of conditions and the following disclaimer.
       
 14480 +//     * Redistributions in binary form must reproduce the above
       
 14481 +// copyright notice, this list of conditions and the following disclaimer
       
 14482 +// in the documentation and/or other materials provided with the
       
 14483 +// distribution.
       
 14484 +//     * Neither the name of Google Inc. nor the names of its
       
 14485 +// contributors may be used to endorse or promote products derived from
       
 14486 +// this software without specific prior written permission.
       
 14487 +//
       
 14488 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 14489 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 14490 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 14491 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 14492 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 14493 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 14494 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 14495 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 14496 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 14497 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 14498 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 14499 +
       
 14500 +#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
       
 14501 +#define CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
       
 14502 +
       
 14503 +#include <stdint.h>
       
 14504 +#include <unistd.h>
       
 14505 +
       
 14506 +namespace google_breakpad {
       
 14507 +
       
 14508 +// Write a minidump to the filesystem. This function does not malloc nor use
       
 14509 +// libc functions which may. Thus, it can be used in contexts where the state
       
 14510 +// of the heap may be corrupt.
       
 14511 +//   filename: the filename to write to. This is opened O_EXCL and fails if
       
 14512 +//     open fails.
       
 14513 +//   crashing_process: the pid of the crashing process. This must be trusted.
       
 14514 +//   blob: a blob of data from the crashing process. See exception_handler.h
       
 14515 +//   blob_size: the length of |blob|, in bytes
       
 14516 +//
       
 14517 +// Returns true iff successful.
       
 14518 +bool WriteMinidump(const char* filename, pid_t crashing_process,
       
 14519 +                   const void* blob, size_t blob_size);
       
 14520 +
       
 14521 +}  // namespace google_breakpad
       
 14522 +
       
 14523 +#endif  // CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_
       
 14524 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
       
 14525 new file mode 100644
       
 14526 --- /dev/null
       
 14527 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer_unittest.cc
       
 14528 @@ -0,0 +1,79 @@
       
 14529 +// Copyright (c) 2009, Google Inc.
       
 14530 +// All rights reserved.
       
 14531 +//
       
 14532 +// Redistribution and use in source and binary forms, with or without
       
 14533 +// modification, are permitted provided that the following conditions are
       
 14534 +// met:
       
 14535 +//
       
 14536 +//     * Redistributions of source code must retain the above copyright
       
 14537 +// notice, this list of conditions and the following disclaimer.
       
 14538 +//     * Redistributions in binary form must reproduce the above
       
 14539 +// copyright notice, this list of conditions and the following disclaimer
       
 14540 +// in the documentation and/or other materials provided with the
       
 14541 +// distribution.
       
 14542 +//     * Neither the name of Google Inc. nor the names of its
       
 14543 +// contributors may be used to endorse or promote products derived from
       
 14544 +// this software without specific prior written permission.
       
 14545 +//
       
 14546 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 14547 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 14548 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 14549 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 14550 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 14551 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 14552 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 14553 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 14554 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 14555 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 14556 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 14557 +
       
 14558 +#include <unistd.h>
       
 14559 +#include <sys/syscall.h>
       
 14560 +
       
 14561 +#include "client/linux/handler/exception_handler.h"
       
 14562 +#include "client/linux/minidump_writer/minidump_writer.h"
       
 14563 +#include "breakpad_googletest_includes.h"
       
 14564 +
       
 14565 +using namespace google_breakpad;
       
 14566 +
       
 14567 +// This provides a wrapper around system calls which may be
       
 14568 +// interrupted by a signal and return EINTR. See man 7 signal.
       
 14569 +#define HANDLE_EINTR(x) ({ \
       
 14570 +  typeof(x) __eintr_result__; \
       
 14571 +  do { \
       
 14572 +    __eintr_result__ = x; \
       
 14573 +  } while (__eintr_result__ == -1 && errno == EINTR); \
       
 14574 +  __eintr_result__;\
       
 14575 +})
       
 14576 +
       
 14577 +namespace {
       
 14578 +typedef testing::Test MinidumpWriterTest;
       
 14579 +}
       
 14580 +
       
 14581 +TEST(MinidumpWriterTest, Setup) {
       
 14582 +  int fds[2];
       
 14583 +  ASSERT_NE(-1, pipe(fds));
       
 14584 +
       
 14585 +  const pid_t child = fork();
       
 14586 +  if (child == 0) {
       
 14587 +    close(fds[1]);
       
 14588 +    char b;
       
 14589 +    HANDLE_EINTR(read(fds[0], &b, sizeof(b)));
       
 14590 +    close(fds[0]);
       
 14591 +    syscall(__NR_exit);
       
 14592 +  }
       
 14593 +  close(fds[0]);
       
 14594 +
       
 14595 +  ExceptionHandler::CrashContext context;
       
 14596 +  memset(&context, 0, sizeof(context));
       
 14597 +
       
 14598 +  char templ[] = "/tmp/minidump-writer-unittest-XXXXXX";
       
 14599 +  mktemp(templ);
       
 14600 +  ASSERT_TRUE(WriteMinidump(templ, child, &context, sizeof(context)));
       
 14601 +  struct stat st;
       
 14602 +  ASSERT_EQ(stat(templ, &st), 0);
       
 14603 +  ASSERT_GT(st.st_size, 0u);
       
 14604 +  unlink(templ);
       
 14605 +
       
 14606 +  close(fds[1]);
       
 14607 +}
       
 14608 diff --git a/toolkit/crashreporter/google-breakpad/src/client/linux/sender/google_crash_report_sender.cc b/toolkit/crashreporter/google-breakpad/src/client/linux/sender/google_crash_report_sender.cc
       
 14609 new file mode 100644
       
 14610 --- /dev/null
       
 14611 +++ b/toolkit/crashreporter/google-breakpad/src/client/linux/sender/google_crash_report_sender.cc
       
 14612 @@ -0,0 +1,102 @@
       
 14613 +// Copyright (c) 2009, Google Inc.
       
 14614 +// All rights reserved.
       
 14615 +//
       
 14616 +// Redistribution and use in source and binary forms, with or without
       
 14617 +// modification, are permitted provided that the following conditions are
       
 14618 +// met:
       
 14619 +//
       
 14620 +//     * Redistributions of source code must retain the above copyright
       
 14621 +// notice, this list of conditions and the following disclaimer.
       
 14622 +//     * Redistributions in binary form must reproduce the above
       
 14623 +// copyright notice, this list of conditions and the following disclaimer
       
 14624 +// in the documentation and/or other materials provided with the
       
 14625 +// distribution.
       
 14626 +//     * Neither the name of Google Inc. nor the names of its
       
 14627 +// contributors may be used to endorse or promote products derived from
       
 14628 +// this software without specific prior written permission.
       
 14629 +//
       
 14630 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 14631 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 14632 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 14633 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 14634 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 14635 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 14636 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 14637 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 14638 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 14639 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 14640 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 14641 +
       
 14642 +#include "common/linux/google_crashdump_uploader.h"
       
 14643 +#include "third_party/linux/include/glog/logging.h"
       
 14644 +#include "third_party/linux/include/gflags/gflags.h"
       
 14645 +#include <string>
       
 14646 +
       
 14647 +DEFINE_string(crash_server, "http://clients2.google.com/cr",
       
 14648 +              "The crash server to upload minidumps to.");
       
 14649 +DEFINE_string(product_name, "",
       
 14650 +              "The product name that the minidump corresponds to.");
       
 14651 +DEFINE_string(product_version, "",
       
 14652 +              "The version of the product that produced the minidump.");
       
 14653 +DEFINE_string(client_id, "",
       
 14654 +              "The client GUID");
       
 14655 +DEFINE_string(minidump_path, "",
       
 14656 +              "The path of the minidump file.");
       
 14657 +DEFINE_string(ptime, "",
       
 14658 +              "The process uptime in milliseconds.");
       
 14659 +DEFINE_string(ctime, "",
       
 14660 +              "The cumulative process uptime in milliseconds.");
       
 14661 +DEFINE_string(email, "",
       
 14662 +              "The user's email address.");
       
 14663 +DEFINE_string(comments, "",
       
 14664 +              "Extra user comments");
       
 14665 +DEFINE_string(proxy_host, "",
       
 14666 +              "Proxy host");
       
 14667 +DEFINE_string(proxy_userpasswd, "",
       
 14668 +              "Proxy username/password in user:pass format.");
       
 14669 +
       
 14670 +
       
 14671 +bool CheckForRequiredFlagsOrDie() {
       
 14672 +  std::string error_text = "";
       
 14673 +  if (FLAGS_product_name.empty()) {
       
 14674 +    error_text.append("\nProduct name must be specified.");
       
 14675 +  }
       
 14676 +
       
 14677 +  if (FLAGS_product_version.empty()) {
       
 14678 +    error_text.append("\nProduct version must be specified.");
       
 14679 +  }
       
 14680 +
       
 14681 +  if (FLAGS_client_id.empty()) {
       
 14682 +    error_text.append("\nClient ID must be specified.");
       
 14683 +  }
       
 14684 +
       
 14685 +  if (FLAGS_minidump_path.empty()) {
       
 14686 +    error_text.append("\nMinidump pathname must be specified.");
       
 14687 +  }
       
 14688 +
       
 14689 +  if (!error_text.empty()) {
       
 14690 +    LOG(ERROR) << error_text;
       
 14691 +    return false;
       
 14692 +  }
       
 14693 +  return true;
       
 14694 +}
       
 14695 +
       
 14696 +int main(int argc, char *argv[]) {
       
 14697 +  google::InitGoogleLogging(argv[0]);
       
 14698 +  google::ParseCommandLineFlags(&argc, &argv, true);
       
 14699 +  if (!CheckForRequiredFlagsOrDie()) {
       
 14700 +    return 1;
       
 14701 +  }
       
 14702 +  google_breakpad::GoogleCrashdumpUploader g(FLAGS_product_name,
       
 14703 +                                             FLAGS_product_version,
       
 14704 +                                             FLAGS_client_id,
       
 14705 +                                             FLAGS_ptime,
       
 14706 +                                             FLAGS_ctime,
       
 14707 +                                             FLAGS_email,
       
 14708 +                                             FLAGS_comments,
       
 14709 +                                             FLAGS_minidump_path,
       
 14710 +                                             FLAGS_crash_server,
       
 14711 +                                             FLAGS_proxy_host,
       
 14712 +                                             FLAGS_proxy_userpasswd);
       
 14713 +  g.Upload();
       
 14714 +}
       
 14715 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj b/toolkit/crashreporter/google-breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj
       
 14716 new file mode 100644
       
 14717 --- /dev/null
       
 14718 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Breakpad.xcodeproj/project.pbxproj
       
 14719 @@ -0,0 +1,2080 @@
       
 14720 +// !$*UTF8*$!
       
 14721 +{
       
 14722 +	archiveVersion = 1;
       
 14723 +	classes = {
       
 14724 +	};
       
 14725 +	objectVersion = 42;
       
 14726 +	objects = {
       
 14727 +
       
 14728 +/* Begin PBXAggregateTarget section */
       
 14729 +		F94585840F782326009A47BF /* All */ = {
       
 14730 +			isa = PBXAggregateTarget;
       
 14731 +			buildConfigurationList = F94585930F78235C009A47BF /* Build configuration list for PBXAggregateTarget "All" */;
       
 14732 +			buildPhases = (
       
 14733 +			);
       
 14734 +			dependencies = (
       
 14735 +				F94585880F78232B009A47BF /* PBXTargetDependency */,
       
 14736 +				F945858A0F78232E009A47BF /* PBXTargetDependency */,
       
 14737 +				F945858C0F782330009A47BF /* PBXTargetDependency */,
       
 14738 +				F945858E0F782333009A47BF /* PBXTargetDependency */,
       
 14739 +				F94585900F782336009A47BF /* PBXTargetDependency */,
       
 14740 +				F93DE3A70F830D1D00608B94 /* PBXTargetDependency */,
       
 14741 +				F95BB8B3101F94D300AA053B /* PBXTargetDependency */,
       
 14742 +				F95BB8B5101F94D300AA053B /* PBXTargetDependency */,
       
 14743 +				F95BB8B7101F94D300AA053B /* PBXTargetDependency */,
       
 14744 +			);
       
 14745 +			name = All;
       
 14746 +			productName = All;
       
 14747 +		};
       
 14748 +/* End PBXAggregateTarget section */
       
 14749 +
       
 14750 +/* Begin PBXBuildFile section */
       
 14751 +		3329D4ED0FA16D820007BBC5 /* Breakpad.nib in Resources */ = {isa = PBXBuildFile; fileRef = 3329D4EC0FA16D820007BBC5 /* Breakpad.nib */; };
       
 14752 +		33880C800F9E097100817F82 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 33880C7E0F9E097100817F82 /* InfoPlist.strings */; };
       
 14753 +		4084699D0F5D9CF900FDCA37 /* crash_report_sender.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */; };
       
 14754 +		8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */; };
       
 14755 +		F91AF5D00FD60393009D8BE2 /* BreakpadFramework_Test.mm in Sources */ = {isa = PBXBuildFile; fileRef = F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */; };
       
 14756 +		F91AF6210FD60784009D8BE2 /* Breakpad.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; };
       
 14757 +		F9286B3A0F7EB25800A4DCC8 /* InspectorMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */; };
       
 14758 +		F92C53B80ECCE7B3009BE4BA /* Inspector.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53B70ECCE7B3009BE4BA /* Inspector.mm */; };
       
 14759 +		F92C554C0ECCF534009BE4BA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0867D69BFE84028FC02AAC07 /* Foundation.framework */; };
       
 14760 +		F92C55D00ECD0064009BE4BA /* Breakpad.h in Headers */ = {isa = PBXBuildFile; fileRef = F92C55CE0ECD0064009BE4BA /* Breakpad.h */; settings = {ATTRIBUTES = (Public, ); }; };
       
 14761 +		F92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C55CF0ECD0064009BE4BA /* Breakpad.mm */; };
       
 14762 +		F92C56330ECD0DF1009BE4BA /* OnDemandServer.h in Headers */ = {isa = PBXBuildFile; fileRef = F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */; };
       
 14763 +		F92C56340ECD0DF1009BE4BA /* OnDemandServer.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */; };
       
 14764 +		F92C563F0ECD10CA009BE4BA /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };
       
 14765 +		F92C56400ECD10CA009BE4BA /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };
       
 14766 +		F92C56410ECD10CA009BE4BA /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };
       
 14767 +		F92C56420ECD10CA009BE4BA /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };
       
 14768 +		F92C56430ECD10CA009BE4BA /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };
       
 14769 +		F92C56440ECD10CA009BE4BA /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };
       
 14770 +		F92C56450ECD10CA009BE4BA /* MachIPC.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53790ECCE635009BE4BA /* MachIPC.mm */; };
       
 14771 +		F92C56460ECD10CA009BE4BA /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };
       
 14772 +		F92C56470ECD10CA009BE4BA /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };
       
 14773 +		F92C56480ECD10CA009BE4BA /* SimpleStringDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */; };
       
 14774 +		F92C56490ECD10CA009BE4BA /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };
       
 14775 +		F92C564A0ECD10CA009BE4BA /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };
       
 14776 +		F92C564C0ECD10DD009BE4BA /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; };
       
 14777 +		F92C56570ECD113E009BE4BA /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C554A0ECCF530009BE4BA /* Carbon.framework */; };
       
 14778 +		F92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; };
       
 14779 +		F92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */; };
       
 14780 +		F92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };
       
 14781 +		F92C56650ECD1185009BE4BA /* breakpadUtilities.dylib in Resources */ = {isa = PBXBuildFile; fileRef = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */; };
       
 14782 +		F92C568A0ECD15F9009BE4BA /* Inspector in Resources */ = {isa = PBXBuildFile; fileRef = F92C53540ECCE349009BE4BA /* Inspector */; };
       
 14783 +		F92C56A90ECE04C5009BE4BA /* crash_report_sender.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */; };
       
 14784 +		F93803CD0F8083B7004D428B /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };
       
 14785 +		F93803CE0F8083B7004D428B /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };
       
 14786 +		F93803CF0F8083B7004D428B /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };
       
 14787 +		F93803D00F8083B7004D428B /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };
       
 14788 +		F93803D10F8083B7004D428B /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };
       
 14789 +		F93803D20F8083B7004D428B /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };
       
 14790 +		F93803D30F8083B7004D428B /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };
       
 14791 +		F93803D40F8083B7004D428B /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };
       
 14792 +		F93803D50F8083B7004D428B /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };
       
 14793 +		F93803D60F8083B7004D428B /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };
       
 14794 +		F93803D70F8083B7004D428B /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };
       
 14795 +		F93803DA0F8083D8004D428B /* minidump_generator_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F93803D90F8083D8004D428B /* minidump_generator_test.cc */; };
       
 14796 +		F93DE2D80F82A70E00608B94 /* minidump_file_writer_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = F93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */; };
       
 14797 +		F93DE2D90F82A73500608B94 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };
       
 14798 +		F93DE2DA0F82A73500608B94 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };
       
 14799 +		F93DE2DB0F82A73500608B94 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };
       
 14800 +		F93DE3350F82C66B00608B94 /* dynamic_images.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */; };
       
 14801 +		F93DE3360F82C66B00608B94 /* exception_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */; };
       
 14802 +		F93DE3370F82C66B00608B94 /* minidump_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */; };
       
 14803 +		F93DE3380F82C66B00608B94 /* minidump_file_writer.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */; };
       
 14804 +		F93DE3390F82C66B00608B94 /* convert_UTF.c in Sources */ = {isa = PBXBuildFile; fileRef = F92C53870ECCE6C0009BE4BA /* convert_UTF.c */; };
       
 14805 +		F93DE33A0F82C66B00608B94 /* string_conversion.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53850ECCE6AD009BE4BA /* string_conversion.cc */; };
       
 14806 +		F93DE33B0F82C66B00608B94 /* file_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53740ECCE635009BE4BA /* file_id.cc */; };
       
 14807 +		F93DE33C0F82C66B00608B94 /* macho_id.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537A0ECCE635009BE4BA /* macho_id.cc */; };
       
 14808 +		F93DE33D0F82C66B00608B94 /* macho_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537C0ECCE635009BE4BA /* macho_utilities.cc */; };
       
 14809 +		F93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C537E0ECCE635009BE4BA /* macho_walker.cc */; };
       
 14810 +		F93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = F92C53820ECCE635009BE4BA /* string_utilities.cc */; };
       
 14811 +		F93DE3410F82C68300608B94 /* exception_handler_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = F93DE3400F82C68300608B94 /* exception_handler_test.cc */; };
       
 14812 +		F945849E0F280E3C009A47BF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = F945849C0F280E3C009A47BF /* Localizable.strings */; };
       
 14813 +		F9B630A0100FF96B00D0F4AC /* goArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = F9B6309F100FF96B00D0F4AC /* goArrow.png */; };
       
 14814 +		F9C44DB20EF07288003AEBAA /* Controller.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DAC0EF07288003AEBAA /* Controller.m */; };
       
 14815 +		F9C44DB30EF07288003AEBAA /* crashduringload in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DAD0EF07288003AEBAA /* crashduringload */; };
       
 14816 +		F9C44DB40EF07288003AEBAA /* crashInMain in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DAE0EF07288003AEBAA /* crashInMain */; };
       
 14817 +		F9C44DB60EF07288003AEBAA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DB00EF07288003AEBAA /* main.m */; };
       
 14818 +		F9C44DB70EF07288003AEBAA /* TestClass.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9C44DB10EF07288003AEBAA /* TestClass.mm */; };
       
 14819 +		F9C44DBC0EF072A0003AEBAA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */; };
       
 14820 +		F9C44DBD0EF072A0003AEBAA /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = F9C44DBA0EF072A0003AEBAA /* MainMenu.nib */; };
       
 14821 +		F9C44E000EF077CD003AEBAA /* Breakpad.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; };
       
 14822 +		F9C44E3C0EF08B12003AEBAA /* Breakpad.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */; };
       
 14823 +		F9C44E980EF09F56003AEBAA /* crash_report_sender.app in Resources */ = {isa = PBXBuildFile; fileRef = F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */; };
       
 14824 +		F9C44EA20EF09F93003AEBAA /* HTTPMultipartUpload.m in Sources */ = {isa = PBXBuildFile; fileRef = F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */; };
       
 14825 +		F9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */; };
       
 14826 +		F9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */; };
       
 14827 +		F9C77DE20F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = F9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */; };
       
 14828 +		F9C77DE40F7DD82F0045F7DB /* SimpleStringDictionary.mm in Sources */ = {isa = PBXBuildFile; fileRef = F92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */; };
       
 14829 +		F9C77E130F7DDF810045F7DB /* GTMSenTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */; };
       
 14830 +/* End PBXBuildFile section */
       
 14831 +
       
 14832 +/* Begin PBXContainerItemProxy section */
       
 14833 +		F91AF6370FD60A74009D8BE2 /* PBXContainerItemProxy */ = {
       
 14834 +			isa = PBXContainerItemProxy;
       
 14835 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14836 +			proxyType = 1;
       
 14837 +			remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
       
 14838 +			remoteInfo = Breakpad;
       
 14839 +		};
       
 14840 +		F92C564D0ECD10E5009BE4BA /* PBXContainerItemProxy */ = {
       
 14841 +			isa = PBXContainerItemProxy;
       
 14842 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14843 +			proxyType = 1;
       
 14844 +			remoteGlobalIDString = F92C563B0ECD10B3009BE4BA;
       
 14845 +			remoteInfo = breakpadUtilities;
       
 14846 +		};
       
 14847 +		F92C56850ECD15EF009BE4BA /* PBXContainerItemProxy */ = {
       
 14848 +			isa = PBXContainerItemProxy;
       
 14849 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14850 +			proxyType = 1;
       
 14851 +			remoteGlobalIDString = F92C563B0ECD10B3009BE4BA;
       
 14852 +			remoteInfo = breakpadUtilities;
       
 14853 +		};
       
 14854 +		F92C56870ECD15F1009BE4BA /* PBXContainerItemProxy */ = {
       
 14855 +			isa = PBXContainerItemProxy;
       
 14856 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14857 +			proxyType = 1;
       
 14858 +			remoteGlobalIDString = F92C53530ECCE349009BE4BA;
       
 14859 +			remoteInfo = Inspector;
       
 14860 +		};
       
 14861 +		F93DE2FB0F82C3C600608B94 /* PBXContainerItemProxy */ = {
       
 14862 +			isa = PBXContainerItemProxy;
       
 14863 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14864 +			proxyType = 1;
       
 14865 +			remoteGlobalIDString = F93803BD0F80820F004D428B;
       
 14866 +			remoteInfo = generator_test;
       
 14867 +		};
       
 14868 +		F93DE36F0F82CC1300608B94 /* PBXContainerItemProxy */ = {
       
 14869 +			isa = PBXContainerItemProxy;
       
 14870 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14871 +			proxyType = 1;
       
 14872 +			remoteGlobalIDString = F93DE32B0F82C55600608B94;
       
 14873 +			remoteInfo = handler_test;
       
 14874 +		};
       
 14875 +		F93DE3A60F830D1D00608B94 /* PBXContainerItemProxy */ = {
       
 14876 +			isa = PBXContainerItemProxy;
       
 14877 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14878 +			proxyType = 1;
       
 14879 +			remoteGlobalIDString = F9C77DD90F7DD5CF0045F7DB;
       
 14880 +			remoteInfo = UnitTests;
       
 14881 +		};
       
 14882 +		F94585870F78232B009A47BF /* PBXContainerItemProxy */ = {
       
 14883 +			isa = PBXContainerItemProxy;
       
 14884 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14885 +			proxyType = 1;
       
 14886 +			remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
       
 14887 +			remoteInfo = Breakpad;
       
 14888 +		};
       
 14889 +		F94585890F78232E009A47BF /* PBXContainerItemProxy */ = {
       
 14890 +			isa = PBXContainerItemProxy;
       
 14891 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14892 +			proxyType = 1;
       
 14893 +			remoteGlobalIDString = F92C53530ECCE349009BE4BA;
       
 14894 +			remoteInfo = Inspector;
       
 14895 +		};
       
 14896 +		F945858B0F782330009A47BF /* PBXContainerItemProxy */ = {
       
 14897 +			isa = PBXContainerItemProxy;
       
 14898 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14899 +			proxyType = 1;
       
 14900 +			remoteGlobalIDString = F92C563B0ECD10B3009BE4BA;
       
 14901 +			remoteInfo = breakpadUtilities;
       
 14902 +		};
       
 14903 +		F945858D0F782333009A47BF /* PBXContainerItemProxy */ = {
       
 14904 +			isa = PBXContainerItemProxy;
       
 14905 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14906 +			proxyType = 1;
       
 14907 +			remoteGlobalIDString = F92C569F0ECE04A7009BE4BA;
       
 14908 +			remoteInfo = crash_report_sender;
       
 14909 +		};
       
 14910 +		F945858F0F782336009A47BF /* PBXContainerItemProxy */ = {
       
 14911 +			isa = PBXContainerItemProxy;
       
 14912 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14913 +			proxyType = 1;
       
 14914 +			remoteGlobalIDString = F9C44DA40EF060A8003AEBAA;
       
 14915 +			remoteInfo = BreakpadTest;
       
 14916 +		};
       
 14917 +		F95BB884101F949F00AA053B /* PBXContainerItemProxy */ = {
       
 14918 +			isa = PBXContainerItemProxy;
       
 14919 +			containerPortal = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */;
       
 14920 +			proxyType = 2;
       
 14921 +			remoteGlobalIDString = 8DD76FA10486AA7600D96B5E /* crash_report */;
       
 14922 +			remoteInfo = crash_report;
       
 14923 +		};
       
 14924 +		F95BB891101F94AC00AA053B /* PBXContainerItemProxy */ = {
       
 14925 +			isa = PBXContainerItemProxy;
       
 14926 +			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
       
 14927 +			proxyType = 2;
       
 14928 +			remoteGlobalIDString = 8DD76FA10486AA7600D96B5E /* dump_syms */;
       
 14929 +			remoteInfo = dump_syms;
       
 14930 +		};
       
 14931 +		F95BB89E101F94C000AA053B /* PBXContainerItemProxy */ = {
       
 14932 +			isa = PBXContainerItemProxy;
       
 14933 +			containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;
       
 14934 +			proxyType = 2;
       
 14935 +			remoteGlobalIDString = 8DD76FA10486AA7600D96B5E /* symupload */;
       
 14936 +			remoteInfo = symupload;
       
 14937 +		};
       
 14938 +		F95BB8A0101F94C000AA053B /* PBXContainerItemProxy */ = {
       
 14939 +			isa = PBXContainerItemProxy;
       
 14940 +			containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;
       
 14941 +			proxyType = 2;
       
 14942 +			remoteGlobalIDString = 9BD835FB0B0544950055103E /* minidump_upload */;
       
 14943 +			remoteInfo = minidump_upload;
       
 14944 +		};
       
 14945 +		F95BB8B2101F94D300AA053B /* PBXContainerItemProxy */ = {
       
 14946 +			isa = PBXContainerItemProxy;
       
 14947 +			containerPortal = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
       
 14948 +			proxyType = 1;
       
 14949 +			remoteGlobalIDString = 8DD76F960486AA7600D96B5E /* dump_syms */;
       
 14950 +			remoteInfo = dump_syms;
       
 14951 +		};
       
 14952 +		F95BB8B4101F94D300AA053B /* PBXContainerItemProxy */ = {
       
 14953 +			isa = PBXContainerItemProxy;
       
 14954 +			containerPortal = F95BB894101F94C000AA053B /* symupload.xcodeproj */;
       
 14955 +			proxyType = 1;
       
 14956 +			remoteGlobalIDString = 8DD76F960486AA7600D96B5E /* symupload */;
       
 14957 +			remoteInfo = symupload;
       
 14958 +		};
       
 14959 +		F95BB8B6101F94D300AA053B /* PBXContainerItemProxy */ = {
       
 14960 +			isa = PBXContainerItemProxy;
       
 14961 +			containerPortal = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */;
       
 14962 +			proxyType = 1;
       
 14963 +			remoteGlobalIDString = 8DD76F960486AA7600D96B5E /* crash_report */;
       
 14964 +			remoteInfo = crash_report;
       
 14965 +		};
       
 14966 +		F9C44E190EF0790F003AEBAA /* PBXContainerItemProxy */ = {
       
 14967 +			isa = PBXContainerItemProxy;
       
 14968 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14969 +			proxyType = 1;
       
 14970 +			remoteGlobalIDString = 8DC2EF4F0486A6940098B216;
       
 14971 +			remoteInfo = Breakpad;
       
 14972 +		};
       
 14973 +		F9C44E960EF09F4B003AEBAA /* PBXContainerItemProxy */ = {
       
 14974 +			isa = PBXContainerItemProxy;
       
 14975 +			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
       
 14976 +			proxyType = 1;
       
 14977 +			remoteGlobalIDString = F92C569F0ECE04A7009BE4BA;
       
 14978 +			remoteInfo = crash_report_sender;
       
 14979 +		};
       
 14980 +/* End PBXContainerItemProxy section */
       
 14981 +
       
 14982 +/* Begin PBXCopyFilesBuildPhase section */
       
 14983 +		F9C44E410EF08B17003AEBAA /* Copy Frameworks */ = {
       
 14984 +			isa = PBXCopyFilesBuildPhase;
       
 14985 +			buildActionMask = 2147483647;
       
 14986 +			dstPath = "";
       
 14987 +			dstSubfolderSpec = 10;
       
 14988 +			files = (
       
 14989 +				F9C44E3C0EF08B12003AEBAA /* Breakpad.framework in Copy Frameworks */,
       
 14990 +			);
       
 14991 +			name = "Copy Frameworks";
       
 14992 +			runOnlyForDeploymentPostprocessing = 0;
       
 14993 +		};
       
 14994 +/* End PBXCopyFilesBuildPhase section */
       
 14995 +
       
 14996 +/* Begin PBXFileReference section */
       
 14997 +		0867D69BFE84028FC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
       
 14998 +		0867D6A5FE840307C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
       
 14999 +		1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
       
 15000 +		32DBCF5E0370ADEE00C91783 /* Breakpad_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Breakpad_Prefix.pch; path = Framework/Breakpad_Prefix.pch; sourceTree = "<group>"; };
       
 15001 +		3329D4EC0FA16D820007BBC5 /* Breakpad.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Breakpad.nib; path = sender/Breakpad.nib; sourceTree = "<group>"; };
       
 15002 +		33880C7F0F9E097100817F82 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
       
 15003 +		4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = crash_report_sender.icns; path = sender/crash_report_sender.icns; sourceTree = "<group>"; };
       
 15004 +		8DC2EF5B0486A6940098B216 /* Breakpad.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Breakpad.framework; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15005 +		F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = BreakpadFramework_Test.mm; path = tests/BreakpadFramework_Test.mm; sourceTree = "<group>"; };
       
 15006 +		F9286B380F7EB25800A4DCC8 /* Inspector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Inspector.h; path = crash_generation/Inspector.h; sourceTree = "<group>"; };
       
 15007 +		F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = InspectorMain.mm; path = crash_generation/InspectorMain.mm; sourceTree = "<group>"; };
       
 15008 +		F92C53540ECCE349009BE4BA /* Inspector */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Inspector; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15009 +		F92C53670ECCE3FD009BE4BA /* breakpad_exc_server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = breakpad_exc_server.c; path = handler/breakpad_exc_server.c; sourceTree = SOURCE_ROOT; };
       
 15010 +		F92C53680ECCE3FD009BE4BA /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breakpad_exc_server.h; path = handler/breakpad_exc_server.h; sourceTree = SOURCE_ROOT; };
       
 15011 +		F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = breakpad_nlist_64.cc; path = handler/breakpad_nlist_64.cc; sourceTree = SOURCE_ROOT; };
       
 15012 +		F92C536A0ECCE3FD009BE4BA /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = breakpad_nlist_64.h; path = handler/breakpad_nlist_64.h; sourceTree = SOURCE_ROOT; };
       
 15013 +		F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dynamic_images.cc; path = handler/dynamic_images.cc; sourceTree = SOURCE_ROOT; };
       
 15014 +		F92C536C0ECCE3FD009BE4BA /* dynamic_images.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dynamic_images.h; path = handler/dynamic_images.h; sourceTree = SOURCE_ROOT; };
       
 15015 +		F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler.cc; path = handler/exception_handler.cc; sourceTree = SOURCE_ROOT; };
       
 15016 +		F92C536E0ECCE3FD009BE4BA /* exception_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = exception_handler.h; path = handler/exception_handler.h; sourceTree = SOURCE_ROOT; };
       
 15017 +		F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator.cc; path = handler/minidump_generator.cc; sourceTree = SOURCE_ROOT; };
       
 15018 +		F92C53700ECCE3FD009BE4BA /* minidump_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = minidump_generator.h; path = handler/minidump_generator.h; sourceTree = SOURCE_ROOT; };
       
 15019 +		F92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = protected_memory_allocator.cc; path = handler/protected_memory_allocator.cc; sourceTree = SOURCE_ROOT; };
       
 15020 +		F92C53730ECCE3FD009BE4BA /* protected_memory_allocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = protected_memory_allocator.h; path = handler/protected_memory_allocator.h; sourceTree = SOURCE_ROOT; };
       
 15021 +		F92C53740ECCE635009BE4BA /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; };
       
 15022 +		F92C53750ECCE635009BE4BA /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; };
       
 15023 +		F92C53760ECCE635009BE4BA /* HTTPMultipartUpload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HTTPMultipartUpload.h; path = ../../common/mac/HTTPMultipartUpload.h; sourceTree = SOURCE_ROOT; };
       
 15024 +		F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HTTPMultipartUpload.m; path = ../../common/mac/HTTPMultipartUpload.m; sourceTree = SOURCE_ROOT; };
       
 15025 +		F92C53780ECCE635009BE4BA /* MachIPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MachIPC.h; path = ../../common/mac/MachIPC.h; sourceTree = SOURCE_ROOT; };
       
 15026 +		F92C53790ECCE635009BE4BA /* MachIPC.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MachIPC.mm; path = ../../common/mac/MachIPC.mm; sourceTree = SOURCE_ROOT; };
       
 15027 +		F92C537A0ECCE635009BE4BA /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; };
       
 15028 +		F92C537B0ECCE635009BE4BA /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; };
       
 15029 +		F92C537C0ECCE635009BE4BA /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../common/mac/macho_utilities.cc; sourceTree = SOURCE_ROOT; };
       
 15030 +		F92C537D0ECCE635009BE4BA /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; };
       
 15031 +		F92C537E0ECCE635009BE4BA /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };
       
 15032 +		F92C537F0ECCE635009BE4BA /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };
       
 15033 +		F92C53800ECCE635009BE4BA /* SimpleStringDictionary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleStringDictionary.h; path = ../../common/mac/SimpleStringDictionary.h; sourceTree = SOURCE_ROOT; };
       
 15034 +		F92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SimpleStringDictionary.mm; path = ../../common/mac/SimpleStringDictionary.mm; sourceTree = SOURCE_ROOT; };
       
 15035 +		F92C53820ECCE635009BE4BA /* string_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = string_utilities.cc; path = ../../common/mac/string_utilities.cc; sourceTree = SOURCE_ROOT; };
       
 15036 +		F92C53830ECCE635009BE4BA /* string_utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = string_utilities.h; path = ../../common/mac/string_utilities.h; sourceTree = SOURCE_ROOT; };
       
 15037 +		F92C53850ECCE6AD009BE4BA /* string_conversion.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = string_conversion.cc; path = ../../common/string_conversion.cc; sourceTree = SOURCE_ROOT; };
       
 15038 +		F92C53860ECCE6AD009BE4BA /* string_conversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = string_conversion.h; path = ../../common/string_conversion.h; sourceTree = SOURCE_ROOT; };
       
 15039 +		F92C53870ECCE6C0009BE4BA /* convert_UTF.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = convert_UTF.c; path = ../../common/convert_UTF.c; sourceTree = SOURCE_ROOT; };
       
 15040 +		F92C53880ECCE6C0009BE4BA /* convert_UTF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert_UTF.h; path = ../../common/convert_UTF.h; sourceTree = SOURCE_ROOT; };
       
 15041 +		F92C538E0ECCE70A009BE4BA /* minidump_file_writer-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "minidump_file_writer-inl.h"; path = "../minidump_file_writer-inl.h"; sourceTree = SOURCE_ROOT; };
       
 15042 +		F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer.cc; path = ../minidump_file_writer.cc; sourceTree = SOURCE_ROOT; };
       
 15043 +		F92C53900ECCE70A009BE4BA /* minidump_file_writer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = minidump_file_writer.h; path = ../minidump_file_writer.h; sourceTree = SOURCE_ROOT; };
       
 15044 +		F92C53B70ECCE7B3009BE4BA /* Inspector.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Inspector.mm; path = crash_generation/Inspector.mm; sourceTree = SOURCE_ROOT; };
       
 15045 +		F92C554A0ECCF530009BE4BA /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
       
 15046 +		F92C55CE0ECD0064009BE4BA /* Breakpad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Breakpad.h; path = Framework/Breakpad.h; sourceTree = "<group>"; };
       
 15047 +		F92C55CF0ECD0064009BE4BA /* Breakpad.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = Breakpad.mm; path = Framework/Breakpad.mm; sourceTree = "<group>"; };
       
 15048 +		F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OnDemandServer.h; path = Framework/OnDemandServer.h; sourceTree = "<group>"; };
       
 15049 +		F92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = OnDemandServer.mm; path = Framework/OnDemandServer.mm; sourceTree = "<group>"; };
       
 15050 +		F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = breakpadUtilities.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15051 +		F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = crash_report_sender.app; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15052 +		F92C56A20ECE04A7009BE4BA /* crash_report_sender-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "crash_report_sender-Info.plist"; path = "sender/crash_report_sender-Info.plist"; sourceTree = "<group>"; };
       
 15053 +		F92C56A70ECE04C5009BE4BA /* crash_report_sender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = crash_report_sender.h; path = sender/crash_report_sender.h; sourceTree = "<group>"; };
       
 15054 +		F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = crash_report_sender.m; path = sender/crash_report_sender.m; sourceTree = "<group>"; };
       
 15055 +		F93803BE0F80820F004D428B /* generator_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = generator_test; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15056 +		F93803D90F8083D8004D428B /* minidump_generator_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_generator_test.cc; path = handler/minidump_generator_test.cc; sourceTree = "<group>"; };
       
 15057 +		F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = minidump_file_writer_unittest; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15058 +		F93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minidump_file_writer_unittest.cc; path = ../minidump_file_writer_unittest.cc; sourceTree = SOURCE_ROOT; };
       
 15059 +		F93DE32C0F82C55600608B94 /* handler_test */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = handler_test; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15060 +		F93DE3400F82C68300608B94 /* exception_handler_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = exception_handler_test.cc; path = handler/exception_handler_test.cc; sourceTree = "<group>"; };
       
 15061 +		F945849D0F280E3C009A47BF /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = sender/English.lproj/Localizable.strings; sourceTree = "<group>"; };
       
 15062 +		F945859D0F78241E009A47BF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Framework/Info.plist; sourceTree = "<group>"; };
       
 15063 +		F95BB87C101F949F00AA053B /* crash_report.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = crash_report.xcodeproj; path = ../../tools/mac/crash_report/crash_report.xcodeproj; sourceTree = SOURCE_ROOT; };
       
 15064 +		F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = dump_syms.xcodeproj; path = ../../tools/mac/dump_syms/dump_syms.xcodeproj; sourceTree = SOURCE_ROOT; };
       
 15065 +		F95BB894101F94C000AA053B /* symupload.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = symupload.xcodeproj; path = ../../tools/mac/symupload/symupload.xcodeproj; sourceTree = SOURCE_ROOT; };
       
 15066 +		F9B6309F100FF96B00D0F4AC /* goArrow.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = goArrow.png; path = sender/goArrow.png; sourceTree = "<group>"; };
       
 15067 +		F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BreakpadTest.app; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15068 +		F9C44DAC0EF07288003AEBAA /* Controller.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Controller.m; path = testapp/Controller.m; sourceTree = "<group>"; };
       
 15069 +		F9C44DAD0EF07288003AEBAA /* crashduringload */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = crashduringload; path = testapp/crashduringload; sourceTree = "<group>"; };
       
 15070 +		F9C44DAE0EF07288003AEBAA /* crashInMain */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = crashInMain; path = testapp/crashInMain; sourceTree = "<group>"; };
       
 15071 +		F9C44DAF0EF07288003AEBAA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = testapp/Info.plist; sourceTree = "<group>"; };
       
 15072 +		F9C44DB00EF07288003AEBAA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = testapp/main.m; sourceTree = "<group>"; };
       
 15073 +		F9C44DB10EF07288003AEBAA /* TestClass.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = TestClass.mm; path = testapp/TestClass.mm; sourceTree = "<group>"; };
       
 15074 +		F9C44DB90EF072A0003AEBAA /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = testapp/English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
       
 15075 +		F9C44DBB0EF072A0003AEBAA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = testapp/English.lproj/MainMenu.nib; sourceTree = "<group>"; };
       
 15076 +		F9C44DBF0EF0778F003AEBAA /* Controller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Controller.h; path = testapp/Controller.h; sourceTree = "<group>"; };
       
 15077 +		F9C44DC00EF0778F003AEBAA /* TestClass.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestClass.h; path = testapp/TestClass.h; sourceTree = "<group>"; };
       
 15078 +		F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = "<absolute>"; };
       
 15079 +		F9C44EE70EF0A3C1003AEBAA /* GTMLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMLogger.h; path = ../../common/mac/GTMLogger.h; sourceTree = SOURCE_ROOT; };
       
 15080 +		F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMLogger.m; path = ../../common/mac/GTMLogger.m; sourceTree = SOURCE_ROOT; };
       
 15081 +		F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; };
       
 15082 +		F9C77DDB0F7DD5CF0045F7DB /* UnitTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "UnitTests-Info.plist"; sourceTree = "<group>"; };
       
 15083 +		F9C77DE00F7DD7E30045F7DB /* SimpleStringDictionaryTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SimpleStringDictionaryTest.h; path = tests/SimpleStringDictionaryTest.h; sourceTree = "<group>"; };
       
 15084 +		F9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SimpleStringDictionaryTest.mm; path = tests/SimpleStringDictionaryTest.mm; sourceTree = "<group>"; };
       
 15085 +		F9C77E110F7DDF810045F7DB /* GTMSenTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GTMSenTestCase.h; path = ../../common/mac/testing/GTMSenTestCase.h; sourceTree = SOURCE_ROOT; };
       
 15086 +		F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GTMSenTestCase.m; path = ../../common/mac/testing/GTMSenTestCase.m; sourceTree = SOURCE_ROOT; };
       
 15087 +/* End PBXFileReference section */
       
 15088 +
       
 15089 +/* Begin PBXFrameworksBuildPhase section */
       
 15090 +		8DC2EF560486A6940098B216 /* Frameworks */ = {
       
 15091 +			isa = PBXFrameworksBuildPhase;
       
 15092 +			buildActionMask = 2147483647;
       
 15093 +			files = (
       
 15094 +				F92C565C0ECD1158009BE4BA /* breakpadUtilities.dylib in Frameworks */,
       
 15095 +				8DC2EF570486A6940098B216 /* Cocoa.framework in Frameworks */,
       
 15096 +			);
       
 15097 +			runOnlyForDeploymentPostprocessing = 0;
       
 15098 +		};
       
 15099 +		F92C53520ECCE349009BE4BA /* Frameworks */ = {
       
 15100 +			isa = PBXFrameworksBuildPhase;
       
 15101 +			buildActionMask = 2147483647;
       
 15102 +			files = (
       
 15103 +				F92C564C0ECD10DD009BE4BA /* breakpadUtilities.dylib in Frameworks */,
       
 15104 +				F92C554C0ECCF534009BE4BA /* Foundation.framework in Frameworks */,
       
 15105 +			);
       
 15106 +			runOnlyForDeploymentPostprocessing = 0;
       
 15107 +		};
       
 15108 +		F92C563A0ECD10B3009BE4BA /* Frameworks */ = {
       
 15109 +			isa = PBXFrameworksBuildPhase;
       
 15110 +			buildActionMask = 2147483647;
       
 15111 +			files = (
       
 15112 +				F92C56570ECD113E009BE4BA /* Carbon.framework in Frameworks */,
       
 15113 +			);
       
 15114 +			runOnlyForDeploymentPostprocessing = 0;
       
 15115 +		};
       
 15116 +		F92C569E0ECE04A7009BE4BA /* Frameworks */ = {
       
 15117 +			isa = PBXFrameworksBuildPhase;
       
 15118 +			buildActionMask = 2147483647;
       
 15119 +			files = (
       
 15120 +				F9C44EE50EF0A006003AEBAA /* SystemConfiguration.framework in Frameworks */,
       
 15121 +			);
       
 15122 +			runOnlyForDeploymentPostprocessing = 0;
       
 15123 +		};
       
 15124 +		F93803BC0F80820F004D428B /* Frameworks */ = {
       
 15125 +			isa = PBXFrameworksBuildPhase;
       
 15126 +			buildActionMask = 2147483647;
       
 15127 +			files = (
       
 15128 +			);
       
 15129 +			runOnlyForDeploymentPostprocessing = 0;
       
 15130 +		};
       
 15131 +		F93DE2CF0F82A67300608B94 /* Frameworks */ = {
       
 15132 +			isa = PBXFrameworksBuildPhase;
       
 15133 +			buildActionMask = 2147483647;
       
 15134 +			files = (
       
 15135 +			);
       
 15136 +			runOnlyForDeploymentPostprocessing = 0;
       
 15137 +		};
       
 15138 +		F93DE32A0F82C55600608B94 /* Frameworks */ = {
       
 15139 +			isa = PBXFrameworksBuildPhase;
       
 15140 +			buildActionMask = 2147483647;
       
 15141 +			files = (
       
 15142 +			);
       
 15143 +			runOnlyForDeploymentPostprocessing = 0;
       
 15144 +		};
       
 15145 +		F9C44DA30EF060A8003AEBAA /* Frameworks */ = {
       
 15146 +			isa = PBXFrameworksBuildPhase;
       
 15147 +			buildActionMask = 2147483647;
       
 15148 +			files = (
       
 15149 +				F9C44E000EF077CD003AEBAA /* Breakpad.framework in Frameworks */,
       
 15150 +			);
       
 15151 +			runOnlyForDeploymentPostprocessing = 0;
       
 15152 +		};
       
 15153 +		F9C77DD70F7DD5CF0045F7DB /* Frameworks */ = {
       
 15154 +			isa = PBXFrameworksBuildPhase;
       
 15155 +			buildActionMask = 2147483647;
       
 15156 +			files = (
       
 15157 +				F91AF6210FD60784009D8BE2 /* Breakpad.framework in Frameworks */,
       
 15158 +			);
       
 15159 +			runOnlyForDeploymentPostprocessing = 0;
       
 15160 +		};
       
 15161 +/* End PBXFrameworksBuildPhase section */
       
 15162 +
       
 15163 +/* Begin PBXGroup section */
       
 15164 +		034768DFFF38A50411DB9C8B /* Products */ = {
       
 15165 +			isa = PBXGroup;
       
 15166 +			children = (
       
 15167 +				8DC2EF5B0486A6940098B216 /* Breakpad.framework */,
       
 15168 +				F92C53540ECCE349009BE4BA /* Inspector */,
       
 15169 +				F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */,
       
 15170 +				F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */,
       
 15171 +				F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */,
       
 15172 +				F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */,
       
 15173 +				F93803BE0F80820F004D428B /* generator_test */,
       
 15174 +				F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */,
       
 15175 +				F93DE32C0F82C55600608B94 /* handler_test */,
       
 15176 +			);
       
 15177 +			name = Products;
       
 15178 +			sourceTree = "<group>";
       
 15179 +		};
       
 15180 +		0867D691FE84028FC02AAC07 /* Breakpad */ = {
       
 15181 +			isa = PBXGroup;
       
 15182 +			children = (
       
 15183 +				F95BB8A3101F94C300AA053B /* Tools */,
       
 15184 +				32DBCF5E0370ADEE00C91783 /* Breakpad_Prefix.pch */,
       
 15185 +				F92C538D0ECCE6F2009BE4BA /* client */,
       
 15186 +				F92C53600ECCE3D6009BE4BA /* common */,
       
 15187 +				0867D69AFE84028FC02AAC07 /* Frameworks */,
       
 15188 +				034768DFFF38A50411DB9C8B /* Products */,
       
 15189 +				F9C77DDB0F7DD5CF0045F7DB /* UnitTests-Info.plist */,
       
 15190 +			);
       
 15191 +			name = Breakpad;
       
 15192 +			sourceTree = "<group>";
       
 15193 +		};
       
 15194 +		0867D69AFE84028FC02AAC07 /* Frameworks */ = {
       
 15195 +			isa = PBXGroup;
       
 15196 +			children = (
       
 15197 +				F9C44EE40EF0A006003AEBAA /* SystemConfiguration.framework */,
       
 15198 +				F92C554A0ECCF530009BE4BA /* Carbon.framework */,
       
 15199 +				1058C7B1FEA5585E11CA2CBB /* Cocoa.framework */,
       
 15200 +				0867D6A5FE840307C02AAC07 /* AppKit.framework */,
       
 15201 +				0867D69BFE84028FC02AAC07 /* Foundation.framework */,
       
 15202 +			);
       
 15203 +			name = Frameworks;
       
 15204 +			sourceTree = "<group>";
       
 15205 +		};
       
 15206 +		F92C53590ECCE3BB009BE4BA /* handler */ = {
       
 15207 +			isa = PBXGroup;
       
 15208 +			children = (
       
 15209 +				F93DE3400F82C68300608B94 /* exception_handler_test.cc */,
       
 15210 +				F93803D90F8083D8004D428B /* minidump_generator_test.cc */,
       
 15211 +				F92C53670ECCE3FD009BE4BA /* breakpad_exc_server.c */,
       
 15212 +				F92C53680ECCE3FD009BE4BA /* breakpad_exc_server.h */,
       
 15213 +				F92C53690ECCE3FD009BE4BA /* breakpad_nlist_64.cc */,
       
 15214 +				F92C536A0ECCE3FD009BE4BA /* breakpad_nlist_64.h */,
       
 15215 +				F92C536B0ECCE3FD009BE4BA /* dynamic_images.cc */,
       
 15216 +				F92C536C0ECCE3FD009BE4BA /* dynamic_images.h */,
       
 15217 +				F92C536D0ECCE3FD009BE4BA /* exception_handler.cc */,
       
 15218 +				F92C536E0ECCE3FD009BE4BA /* exception_handler.h */,
       
 15219 +				F92C536F0ECCE3FD009BE4BA /* minidump_generator.cc */,
       
 15220 +				F92C53700ECCE3FD009BE4BA /* minidump_generator.h */,
       
 15221 +				F92C53720ECCE3FD009BE4BA /* protected_memory_allocator.cc */,
       
 15222 +				F92C53730ECCE3FD009BE4BA /* protected_memory_allocator.h */,
       
 15223 +			);
       
 15224 +			name = handler;
       
 15225 +			sourceTree = "<group>";
       
 15226 +		};
       
 15227 +		F92C53600ECCE3D6009BE4BA /* common */ = {
       
 15228 +			isa = PBXGroup;
       
 15229 +			children = (
       
 15230 +				F92C53870ECCE6C0009BE4BA /* convert_UTF.c */,
       
 15231 +				F92C53880ECCE6C0009BE4BA /* convert_UTF.h */,
       
 15232 +				F92C53850ECCE6AD009BE4BA /* string_conversion.cc */,
       
 15233 +				F92C53860ECCE6AD009BE4BA /* string_conversion.h */,
       
 15234 +				F92C53840ECCE68D009BE4BA /* mac */,
       
 15235 +			);
       
 15236 +			name = common;
       
 15237 +			sourceTree = "<group>";
       
 15238 +		};
       
 15239 +		F92C53840ECCE68D009BE4BA /* mac */ = {
       
 15240 +			isa = PBXGroup;
       
 15241 +			children = (
       
 15242 +				F9C77E0F0F7DDF650045F7DB /* testing */,
       
 15243 +				F9C44EE70EF0A3C1003AEBAA /* GTMLogger.h */,
       
 15244 +				F9C44EE80EF0A3C1003AEBAA /* GTMLogger.m */,
       
 15245 +				F92C53740ECCE635009BE4BA /* file_id.cc */,
       
 15246 +				F92C53750ECCE635009BE4BA /* file_id.h */,
       
 15247 +				F92C53760ECCE635009BE4BA /* HTTPMultipartUpload.h */,
       
 15248 +				F92C53770ECCE635009BE4BA /* HTTPMultipartUpload.m */,
       
 15249 +				F92C53780ECCE635009BE4BA /* MachIPC.h */,
       
 15250 +				F92C53790ECCE635009BE4BA /* MachIPC.mm */,
       
 15251 +				F92C537A0ECCE635009BE4BA /* macho_id.cc */,
       
 15252 +				F92C537B0ECCE635009BE4BA /* macho_id.h */,
       
 15253 +				F92C537C0ECCE635009BE4BA /* macho_utilities.cc */,
       
 15254 +				F92C537D0ECCE635009BE4BA /* macho_utilities.h */,
       
 15255 +				F92C537E0ECCE635009BE4BA /* macho_walker.cc */,
       
 15256 +				F92C537F0ECCE635009BE4BA /* macho_walker.h */,
       
 15257 +				F92C53800ECCE635009BE4BA /* SimpleStringDictionary.h */,
       
 15258 +				F92C53810ECCE635009BE4BA /* SimpleStringDictionary.mm */,
       
 15259 +				F92C53820ECCE635009BE4BA /* string_utilities.cc */,
       
 15260 +				F92C53830ECCE635009BE4BA /* string_utilities.h */,
       
 15261 +			);
       
 15262 +			name = mac;
       
 15263 +			sourceTree = "<group>";
       
 15264 +		};
       
 15265 +		F92C538D0ECCE6F2009BE4BA /* client */ = {
       
 15266 +			isa = PBXGroup;
       
 15267 +			children = (
       
 15268 +				F92C53990ECCE78E009BE4BA /* mac */,
       
 15269 +				F92C538E0ECCE70A009BE4BA /* minidump_file_writer-inl.h */,
       
 15270 +				F92C538F0ECCE70A009BE4BA /* minidump_file_writer.cc */,
       
 15271 +				F92C53900ECCE70A009BE4BA /* minidump_file_writer.h */,
       
 15272 +				F93DE2D70F82A70E00608B94 /* minidump_file_writer_unittest.cc */,
       
 15273 +			);
       
 15274 +			name = client;
       
 15275 +			sourceTree = "<group>";
       
 15276 +		};
       
 15277 +		F92C53990ECCE78E009BE4BA /* mac */ = {
       
 15278 +			isa = PBXGroup;
       
 15279 +			children = (
       
 15280 +				F9C77DDF0F7DD7CF0045F7DB /* tests */,
       
 15281 +				F9C44DAB0EF0726F003AEBAA /* testapp */,
       
 15282 +				F92C56A60ECE04B6009BE4BA /* sender */,
       
 15283 +				F92C55CD0ECD0053009BE4BA /* Framework */,
       
 15284 +				F92C53B50ECCE799009BE4BA /* crash_generation */,
       
 15285 +				F92C53590ECCE3BB009BE4BA /* handler */,
       
 15286 +			);
       
 15287 +			name = mac;
       
 15288 +			sourceTree = "<group>";
       
 15289 +		};
       
 15290 +		F92C53B50ECCE799009BE4BA /* crash_generation */ = {
       
 15291 +			isa = PBXGroup;
       
 15292 +			children = (
       
 15293 +				F9286B380F7EB25800A4DCC8 /* Inspector.h */,
       
 15294 +				F9286B390F7EB25800A4DCC8 /* InspectorMain.mm */,
       
 15295 +				F92C53B70ECCE7B3009BE4BA /* Inspector.mm */,
       
 15296 +			);
       
 15297 +			name = crash_generation;
       
 15298 +			sourceTree = "<group>";
       
 15299 +		};
       
 15300 +		F92C55CD0ECD0053009BE4BA /* Framework */ = {
       
 15301 +			isa = PBXGroup;
       
 15302 +			children = (
       
 15303 +				F945859D0F78241E009A47BF /* Info.plist */,
       
 15304 +				F92C56310ECD0DF1009BE4BA /* OnDemandServer.h */,
       
 15305 +				F92C56320ECD0DF1009BE4BA /* OnDemandServer.mm */,
       
 15306 +				F92C55CE0ECD0064009BE4BA /* Breakpad.h */,
       
 15307 +				F92C55CF0ECD0064009BE4BA /* Breakpad.mm */,
       
 15308 +			);
       
 15309 +			name = Framework;
       
 15310 +			sourceTree = "<group>";
       
 15311 +		};
       
 15312 +		F92C56A60ECE04B6009BE4BA /* sender */ = {
       
 15313 +			isa = PBXGroup;
       
 15314 +			children = (
       
 15315 +				F9B6309F100FF96B00D0F4AC /* goArrow.png */,
       
 15316 +				F92C56A70ECE04C5009BE4BA /* crash_report_sender.h */,
       
 15317 +				F92C56A80ECE04C5009BE4BA /* crash_report_sender.m */,
       
 15318 +				F945849C0F280E3C009A47BF /* Localizable.strings */,
       
 15319 +				33880C7E0F9E097100817F82 /* InfoPlist.strings */,
       
 15320 +				3329D4EC0FA16D820007BBC5 /* Breakpad.nib */,
       
 15321 +				4084699C0F5D9CF900FDCA37 /* crash_report_sender.icns */,
       
 15322 +				F92C56A20ECE04A7009BE4BA /* crash_report_sender-Info.plist */,
       
 15323 +			);
       
 15324 +			name = sender;
       
 15325 +			sourceTree = "<group>";
       
 15326 +		};
       
 15327 +		F95BB87D101F949F00AA053B /* Products */ = {
       
 15328 +			isa = PBXGroup;
       
 15329 +			children = (
       
 15330 +				F95BB885101F949F00AA053B /* crash_report */,
       
 15331 +			);
       
 15332 +			name = Products;
       
 15333 +			sourceTree = "<group>";
       
 15334 +		};
       
 15335 +		F95BB88A101F94AC00AA053B /* Products */ = {
       
 15336 +			isa = PBXGroup;
       
 15337 +			children = (
       
 15338 +				F95BB892101F94AC00AA053B /* dump_syms */,
       
 15339 +			);
       
 15340 +			name = Products;
       
 15341 +			sourceTree = "<group>";
       
 15342 +		};
       
 15343 +		F95BB895101F94C000AA053B /* Products */ = {
       
 15344 +			isa = PBXGroup;
       
 15345 +			children = (
       
 15346 +				F95BB89F101F94C000AA053B /* symupload */,
       
 15347 +				F95BB8A1101F94C000AA053B /* minidump_upload */,
       
 15348 +			);
       
 15349 +			name = Products;
       
 15350 +			sourceTree = "<group>";
       
 15351 +		};
       
 15352 +		F95BB8A3101F94C300AA053B /* Tools */ = {
       
 15353 +			isa = PBXGroup;
       
 15354 +			children = (
       
 15355 +				F95BB894101F94C000AA053B /* symupload.xcodeproj */,
       
 15356 +				F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */,
       
 15357 +				F95BB87C101F949F00AA053B /* crash_report.xcodeproj */,
       
 15358 +			);
       
 15359 +			name = Tools;
       
 15360 +			sourceTree = "<group>";
       
 15361 +		};
       
 15362 +		F9C44DAB0EF0726F003AEBAA /* testapp */ = {
       
 15363 +			isa = PBXGroup;
       
 15364 +			children = (
       
 15365 +				F9C44DBF0EF0778F003AEBAA /* Controller.h */,
       
 15366 +				F9C44DC00EF0778F003AEBAA /* TestClass.h */,
       
 15367 +				F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */,
       
 15368 +				F9C44DBA0EF072A0003AEBAA /* MainMenu.nib */,
       
 15369 +				F9C44DAC0EF07288003AEBAA /* Controller.m */,
       
 15370 +				F9C44DAD0EF07288003AEBAA /* crashduringload */,
       
 15371 +				F9C44DAE0EF07288003AEBAA /* crashInMain */,
       
 15372 +				F9C44DAF0EF07288003AEBAA /* Info.plist */,
       
 15373 +				F9C44DB00EF07288003AEBAA /* main.m */,
       
 15374 +				F9C44DB10EF07288003AEBAA /* TestClass.mm */,
       
 15375 +			);
       
 15376 +			name = testapp;
       
 15377 +			sourceTree = "<group>";
       
 15378 +		};
       
 15379 +		F9C77DDF0F7DD7CF0045F7DB /* tests */ = {
       
 15380 +			isa = PBXGroup;
       
 15381 +			children = (
       
 15382 +				F9C77DE00F7DD7E30045F7DB /* SimpleStringDictionaryTest.h */,
       
 15383 +				F9C77DE10F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm */,
       
 15384 +				F91AF5CF0FD60393009D8BE2 /* BreakpadFramework_Test.mm */,
       
 15385 +			);
       
 15386 +			name = tests;
       
 15387 +			sourceTree = "<group>";
       
 15388 +		};
       
 15389 +		F9C77E0F0F7DDF650045F7DB /* testing */ = {
       
 15390 +			isa = PBXGroup;
       
 15391 +			children = (
       
 15392 +				F9C77E110F7DDF810045F7DB /* GTMSenTestCase.h */,
       
 15393 +				F9C77E120F7DDF810045F7DB /* GTMSenTestCase.m */,
       
 15394 +			);
       
 15395 +			name = testing;
       
 15396 +			sourceTree = "<group>";
       
 15397 +		};
       
 15398 +/* End PBXGroup section */
       
 15399 +
       
 15400 +/* Begin PBXHeadersBuildPhase section */
       
 15401 +		8DC2EF500486A6940098B216 /* Headers */ = {
       
 15402 +			isa = PBXHeadersBuildPhase;
       
 15403 +			buildActionMask = 2147483647;
       
 15404 +			files = (
       
 15405 +				F92C55D00ECD0064009BE4BA /* Breakpad.h in Headers */,
       
 15406 +				F92C56330ECD0DF1009BE4BA /* OnDemandServer.h in Headers */,
       
 15407 +			);
       
 15408 +			runOnlyForDeploymentPostprocessing = 0;
       
 15409 +		};
       
 15410 +		F92C56380ECD10B3009BE4BA /* Headers */ = {
       
 15411 +			isa = PBXHeadersBuildPhase;
       
 15412 +			buildActionMask = 2147483647;
       
 15413 +			files = (
       
 15414 +			);
       
 15415 +			runOnlyForDeploymentPostprocessing = 0;
       
 15416 +		};
       
 15417 +/* End PBXHeadersBuildPhase section */
       
 15418 +
       
 15419 +/* Begin PBXNativeTarget section */
       
 15420 +		8DC2EF4F0486A6940098B216 /* Breakpad */ = {
       
 15421 +			isa = PBXNativeTarget;
       
 15422 +			buildConfigurationList = 1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Breakpad" */;
       
 15423 +			buildPhases = (
       
 15424 +				F97A0E850ED4EC15008784D3 /* Change install name of breakpadUtilities */,
       
 15425 +				8DC2EF500486A6940098B216 /* Headers */,
       
 15426 +				8DC2EF520486A6940098B216 /* Resources */,
       
 15427 +				8DC2EF540486A6940098B216 /* Sources */,
       
 15428 +				8DC2EF560486A6940098B216 /* Frameworks */,
       
 15429 +			);
       
 15430 +			buildRules = (
       
 15431 +			);
       
 15432 +			dependencies = (
       
 15433 +				F92C56860ECD15EF009BE4BA /* PBXTargetDependency */,
       
 15434 +				F92C56880ECD15F1009BE4BA /* PBXTargetDependency */,
       
 15435 +				F9C44E970EF09F4B003AEBAA /* PBXTargetDependency */,
       
 15436 +			);
       
 15437 +			name = Breakpad;
       
 15438 +			productInstallPath = "$(HOME)/Library/Frameworks";
       
 15439 +			productName = Breakpad;
       
 15440 +			productReference = 8DC2EF5B0486A6940098B216 /* Breakpad.framework */;
       
 15441 +			productType = "com.apple.product-type.framework";
       
 15442 +		};
       
 15443 +		F92C53530ECCE349009BE4BA /* Inspector */ = {
       
 15444 +			isa = PBXNativeTarget;
       
 15445 +			buildConfigurationList = F92C53580ECCE36D009BE4BA /* Build configuration list for PBXNativeTarget "Inspector" */;
       
 15446 +			buildPhases = (
       
 15447 +				F94584840F27FB40009A47BF /* Change install name of breakpadUtilities */,
       
 15448 +				F92C53510ECCE349009BE4BA /* Sources */,
       
 15449 +				F92C53520ECCE349009BE4BA /* Frameworks */,
       
 15450 +			);
       
 15451 +			buildRules = (
       
 15452 +			);
       
 15453 +			dependencies = (
       
 15454 +				F92C564E0ECD10E5009BE4BA /* PBXTargetDependency */,
       
 15455 +			);
       
 15456 +			name = Inspector;
       
 15457 +			productName = Inspector;
       
 15458 +			productReference = F92C53540ECCE349009BE4BA /* Inspector */;
       
 15459 +			productType = "com.apple.product-type.tool";
       
 15460 +		};
       
 15461 +		F92C563B0ECD10B3009BE4BA /* breakpadUtilities */ = {
       
 15462 +			isa = PBXNativeTarget;
       
 15463 +			buildConfigurationList = F92C56670ECD11A3009BE4BA /* Build configuration list for PBXNativeTarget "breakpadUtilities" */;
       
 15464 +			buildPhases = (
       
 15465 +				F92C56380ECD10B3009BE4BA /* Headers */,
       
 15466 +				F92C56390ECD10B3009BE4BA /* Sources */,
       
 15467 +				F92C563A0ECD10B3009BE4BA /* Frameworks */,
       
 15468 +			);
       
 15469 +			buildRules = (
       
 15470 +			);
       
 15471 +			dependencies = (
       
 15472 +			);
       
 15473 +			name = breakpadUtilities;
       
 15474 +			productName = breakpadUtilities;
       
 15475 +			productReference = F92C563C0ECD10B3009BE4BA /* breakpadUtilities.dylib */;
       
 15476 +			productType = "com.apple.product-type.library.dynamic";
       
 15477 +		};
       
 15478 +		F92C569F0ECE04A7009BE4BA /* crash_report_sender */ = {
       
 15479 +			isa = PBXNativeTarget;
       
 15480 +			buildConfigurationList = F92C56A50ECE04A8009BE4BA /* Build configuration list for PBXNativeTarget "crash_report_sender" */;
       
 15481 +			buildPhases = (
       
 15482 +				F92C569C0ECE04A7009BE4BA /* Resources */,
       
 15483 +				F92C569D0ECE04A7009BE4BA /* Sources */,
       
 15484 +				F92C569E0ECE04A7009BE4BA /* Frameworks */,
       
 15485 +			);
       
 15486 +			buildRules = (
       
 15487 +			);
       
 15488 +			dependencies = (
       
 15489 +			);
       
 15490 +			name = crash_report_sender;
       
 15491 +			productName = crash_report_sender;
       
 15492 +			productReference = F92C56A00ECE04A7009BE4BA /* crash_report_sender.app */;
       
 15493 +			productType = "com.apple.product-type.application";
       
 15494 +		};
       
 15495 +		F93803BD0F80820F004D428B /* generator_test */ = {
       
 15496 +			isa = PBXNativeTarget;
       
 15497 +			buildConfigurationList = F93803C40F80822E004D428B /* Build configuration list for PBXNativeTarget "generator_test" */;
       
 15498 +			buildPhases = (
       
 15499 +				F93803BB0F80820F004D428B /* Sources */,
       
 15500 +				F93803BC0F80820F004D428B /* Frameworks */,
       
 15501 +			);
       
 15502 +			buildRules = (
       
 15503 +			);
       
 15504 +			dependencies = (
       
 15505 +			);
       
 15506 +			name = generator_test;
       
 15507 +			productName = generator_test;
       
 15508 +			productReference = F93803BE0F80820F004D428B /* generator_test */;
       
 15509 +			productType = "com.apple.product-type.tool";
       
 15510 +		};
       
 15511 +		F93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */ = {
       
 15512 +			isa = PBXNativeTarget;
       
 15513 +			buildConfigurationList = F93DE2D60F82A67700608B94 /* Build configuration list for PBXNativeTarget "minidump_file_writer_unittest" */;
       
 15514 +			buildPhases = (
       
 15515 +				F93DE2CE0F82A67300608B94 /* Sources */,
       
 15516 +				F93DE2CF0F82A67300608B94 /* Frameworks */,
       
 15517 +			);
       
 15518 +			buildRules = (
       
 15519 +			);
       
 15520 +			dependencies = (
       
 15521 +			);
       
 15522 +			name = minidump_file_writer_unittest;
       
 15523 +			productName = minidump_file_writer_unittest;
       
 15524 +			productReference = F93DE2D10F82A67300608B94 /* minidump_file_writer_unittest */;
       
 15525 +			productType = "com.apple.product-type.tool";
       
 15526 +		};
       
 15527 +		F93DE32B0F82C55600608B94 /* handler_test */ = {
       
 15528 +			isa = PBXNativeTarget;
       
 15529 +			buildConfigurationList = F93DE3320F82C5D800608B94 /* Build configuration list for PBXNativeTarget "handler_test" */;
       
 15530 +			buildPhases = (
       
 15531 +				F93DE3290F82C55600608B94 /* Sources */,
       
 15532 +				F93DE32A0F82C55600608B94 /* Frameworks */,
       
 15533 +			);
       
 15534 +			buildRules = (
       
 15535 +			);
       
 15536 +			dependencies = (
       
 15537 +			);
       
 15538 +			name = handler_test;
       
 15539 +			productName = handler_test;
       
 15540 +			productReference = F93DE32C0F82C55600608B94 /* handler_test */;
       
 15541 +			productType = "com.apple.product-type.tool";
       
 15542 +		};
       
 15543 +		F9C44DA40EF060A8003AEBAA /* BreakpadTest */ = {
       
 15544 +			isa = PBXNativeTarget;
       
 15545 +			buildConfigurationList = F9C44DAA0EF060A9003AEBAA /* Build configuration list for PBXNativeTarget "BreakpadTest" */;
       
 15546 +			buildPhases = (
       
 15547 +				F9C44DA10EF060A8003AEBAA /* Resources */,
       
 15548 +				F9C44DA20EF060A8003AEBAA /* Sources */,
       
 15549 +				F9C44DA30EF060A8003AEBAA /* Frameworks */,
       
 15550 +				F9C44E410EF08B17003AEBAA /* Copy Frameworks */,
       
 15551 +			);
       
 15552 +			buildRules = (
       
 15553 +			);
       
 15554 +			dependencies = (
       
 15555 +				F9C44E1A0EF0790F003AEBAA /* PBXTargetDependency */,
       
 15556 +			);
       
 15557 +			name = BreakpadTest;
       
 15558 +			productName = BreakpadTest;
       
 15559 +			productReference = F9C44DA50EF060A8003AEBAA /* BreakpadTest.app */;
       
 15560 +			productType = "com.apple.product-type.application";
       
 15561 +		};
       
 15562 +		F9C77DD90F7DD5CF0045F7DB /* UnitTests */ = {
       
 15563 +			isa = PBXNativeTarget;
       
 15564 +			buildConfigurationList = F9C77DDE0F7DD5D00045F7DB /* Build configuration list for PBXNativeTarget "UnitTests" */;
       
 15565 +			buildPhases = (
       
 15566 +				F9C77DD50F7DD5CF0045F7DB /* Resources */,
       
 15567 +				F9C77DD60F7DD5CF0045F7DB /* Sources */,
       
 15568 +				F9C77DD70F7DD5CF0045F7DB /* Frameworks */,
       
 15569 +				F9C77DD80F7DD5CF0045F7DB /* ShellScript */,
       
 15570 +			);
       
 15571 +			buildRules = (
       
 15572 +			);
       
 15573 +			dependencies = (
       
 15574 +				F93DE2FC0F82C3C600608B94 /* PBXTargetDependency */,
       
 15575 +				F93DE3700F82CC1300608B94 /* PBXTargetDependency */,
       
 15576 +				F91AF6380FD60A74009D8BE2 /* PBXTargetDependency */,
       
 15577 +			);
       
 15578 +			name = UnitTests;
       
 15579 +			productName = UnitTests;
       
 15580 +			productReference = F9C77DDA0F7DD5CF0045F7DB /* UnitTests.octest */;
       
 15581 +			productType = "com.apple.product-type.bundle";
       
 15582 +		};
       
 15583 +/* End PBXNativeTarget section */
       
 15584 +
       
 15585 +/* Begin PBXProject section */
       
 15586 +		0867D690FE84028FC02AAC07 /* Project object */ = {
       
 15587 +			isa = PBXProject;
       
 15588 +			buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Breakpad" */;
       
 15589 +			compatibilityVersion = "Xcode 2.4";
       
 15590 +			hasScannedForEncodings = 1;
       
 15591 +			mainGroup = 0867D691FE84028FC02AAC07 /* Breakpad */;
       
 15592 +			productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
       
 15593 +			projectDirPath = "";
       
 15594 +			projectReferences = (
       
 15595 +				{
       
 15596 +					ProductGroup = F95BB87D101F949F00AA053B /* Products */;
       
 15597 +					ProjectRef = F95BB87C101F949F00AA053B /* crash_report.xcodeproj */;
       
 15598 +				},
       
 15599 +				{
       
 15600 +					ProductGroup = F95BB88A101F94AC00AA053B /* Products */;
       
 15601 +					ProjectRef = F95BB889101F94AC00AA053B /* dump_syms.xcodeproj */;
       
 15602 +				},
       
 15603 +				{
       
 15604 +					ProductGroup = F95BB895101F94C000AA053B /* Products */;
       
 15605 +					ProjectRef = F95BB894101F94C000AA053B /* symupload.xcodeproj */;
       
 15606 +				},
       
 15607 +			);
       
 15608 +			projectRoot = "";
       
 15609 +			targets = (
       
 15610 +				8DC2EF4F0486A6940098B216 /* Breakpad */,
       
 15611 +				F92C53530ECCE349009BE4BA /* Inspector */,
       
 15612 +				F92C563B0ECD10B3009BE4BA /* breakpadUtilities */,
       
 15613 +				F92C569F0ECE04A7009BE4BA /* crash_report_sender */,
       
 15614 +				F9C44DA40EF060A8003AEBAA /* BreakpadTest */,
       
 15615 +				F94585840F782326009A47BF /* All */,
       
 15616 +				F9C77DD90F7DD5CF0045F7DB /* UnitTests */,
       
 15617 +				F93803BD0F80820F004D428B /* generator_test */,
       
 15618 +				F93DE2D00F82A67300608B94 /* minidump_file_writer_unittest */,
       
 15619 +				F93DE32B0F82C55600608B94 /* handler_test */,
       
 15620 +			);
       
 15621 +		};
       
 15622 +/* End PBXProject section */
       
 15623 +
       
 15624 +/* Begin PBXReferenceProxy section */
       
 15625 +		F95BB885101F949F00AA053B /* crash_report */ = {
       
 15626 +			isa = PBXReferenceProxy;
       
 15627 +			fileType = "compiled.mach-o.executable";
       
 15628 +			path = crash_report;
       
 15629 +			remoteRef = F95BB884101F949F00AA053B /* PBXContainerItemProxy */;
       
 15630 +			sourceTree = BUILT_PRODUCTS_DIR;
       
 15631 +		};
       
 15632 +		F95BB892101F94AC00AA053B /* dump_syms */ = {
       
 15633 +			isa = PBXReferenceProxy;
       
 15634 +			fileType = "compiled.mach-o.executable";
       
 15635 +			path = dump_syms;
       
 15636 +			remoteRef = F95BB891101F94AC00AA053B /* PBXContainerItemProxy */;
       
 15637 +			sourceTree = BUILT_PRODUCTS_DIR;
       
 15638 +		};
       
 15639 +		F95BB89F101F94C000AA053B /* symupload */ = {
       
 15640 +			isa = PBXReferenceProxy;
       
 15641 +			fileType = "compiled.mach-o.executable";
       
 15642 +			path = symupload;
       
 15643 +			remoteRef = F95BB89E101F94C000AA053B /* PBXContainerItemProxy */;
       
 15644 +			sourceTree = BUILT_PRODUCTS_DIR;
       
 15645 +		};
       
 15646 +		F95BB8A1101F94C000AA053B /* minidump_upload */ = {
       
 15647 +			isa = PBXReferenceProxy;
       
 15648 +			fileType = "compiled.mach-o.executable";
       
 15649 +			path = minidump_upload;
       
 15650 +			remoteRef = F95BB8A0101F94C000AA053B /* PBXContainerItemProxy */;
       
 15651 +			sourceTree = BUILT_PRODUCTS_DIR;
       
 15652 +		};
       
 15653 +/* End PBXReferenceProxy section */
       
 15654 +
       
 15655 +/* Begin PBXResourcesBuildPhase section */
       
 15656 +		8DC2EF520486A6940098B216 /* Resources */ = {
       
 15657 +			isa = PBXResourcesBuildPhase;
       
 15658 +			buildActionMask = 2147483647;
       
 15659 +			files = (
       
 15660 +				F9C44E980EF09F56003AEBAA /* crash_report_sender.app in Resources */,
       
 15661 +				F92C568A0ECD15F9009BE4BA /* Inspector in Resources */,
       
 15662 +				F92C56650ECD1185009BE4BA /* breakpadUtilities.dylib in Resources */,
       
 15663 +			);
       
 15664 +			runOnlyForDeploymentPostprocessing = 0;
       
 15665 +		};
       
 15666 +		F92C569C0ECE04A7009BE4BA /* Resources */ = {
       
 15667 +			isa = PBXResourcesBuildPhase;
       
 15668 +			buildActionMask = 2147483647;
       
 15669 +			files = (
       
 15670 +				F945849E0F280E3C009A47BF /* Localizable.strings in Resources */,
       
 15671 +				4084699D0F5D9CF900FDCA37 /* crash_report_sender.icns in Resources */,
       
 15672 +				33880C800F9E097100817F82 /* InfoPlist.strings in Resources */,
       
 15673 +				3329D4ED0FA16D820007BBC5 /* Breakpad.nib in Resources */,
       
 15674 +				F9B630A0100FF96B00D0F4AC /* goArrow.png in Resources */,
       
 15675 +			);
       
 15676 +			runOnlyForDeploymentPostprocessing = 0;
       
 15677 +		};
       
 15678 +		F9C44DA10EF060A8003AEBAA /* Resources */ = {
       
 15679 +			isa = PBXResourcesBuildPhase;
       
 15680 +			buildActionMask = 2147483647;
       
 15681 +			files = (
       
 15682 +				F9C44DB30EF07288003AEBAA /* crashduringload in Resources */,
       
 15683 +				F9C44DB40EF07288003AEBAA /* crashInMain in Resources */,
       
 15684 +				F9C44DBC0EF072A0003AEBAA /* InfoPlist.strings in Resources */,
       
 15685 +				F9C44DBD0EF072A0003AEBAA /* MainMenu.nib in Resources */,
       
 15686 +			);
       
 15687 +			runOnlyForDeploymentPostprocessing = 0;
       
 15688 +		};
       
 15689 +		F9C77DD50F7DD5CF0045F7DB /* Resources */ = {
       
 15690 +			isa = PBXResourcesBuildPhase;
       
 15691 +			buildActionMask = 2147483647;
       
 15692 +			files = (
       
 15693 +			);
       
 15694 +			runOnlyForDeploymentPostprocessing = 0;
       
 15695 +		};
       
 15696 +/* End PBXResourcesBuildPhase section */
       
 15697 +
       
 15698 +/* Begin PBXShellScriptBuildPhase section */
       
 15699 +		F94584840F27FB40009A47BF /* Change install name of breakpadUtilities */ = {
       
 15700 +			isa = PBXShellScriptBuildPhase;
       
 15701 +			buildActionMask = 2147483647;
       
 15702 +			files = (
       
 15703 +			);
       
 15704 +			inputPaths = (
       
 15705 +			);
       
 15706 +			name = "Change install name of breakpadUtilities";
       
 15707 +			outputPaths = (
       
 15708 +			);
       
 15709 +			runOnlyForDeploymentPostprocessing = 0;
       
 15710 +			shellPath = /bin/sh;
       
 15711 +			shellScript = "install_name_tool -id \"@executable_path/../Resources/breakpadUtilities.dylib\" \"${BUILT_PRODUCTS_DIR}/breakpadUtilities.dylib\"\n";
       
 15712 +		};
       
 15713 +		F97A0E850ED4EC15008784D3 /* Change install name of breakpadUtilities */ = {
       
 15714 +			isa = PBXShellScriptBuildPhase;
       
 15715 +			buildActionMask = 2147483647;
       
 15716 +			files = (
       
 15717 +			);
       
 15718 +			inputPaths = (
       
 15719 +			);
       
 15720 +			name = "Change install name of breakpadUtilities";
       
 15721 +			outputPaths = (
       
 15722 +			);
       
 15723 +			runOnlyForDeploymentPostprocessing = 0;
       
 15724 +			shellPath = /bin/sh;
       
 15725 +			shellScript = "#!/bin/bash\ninstall_name_tool -id \"@executable_path/../Frameworks/Breakpad.framework/Resources/breakpadUtilities.dylib\" \"${BUILT_PRODUCTS_DIR}/breakpadUtilities.dylib\"\n";
       
 15726 +		};
       
 15727 +		F9C77DD80F7DD5CF0045F7DB /* ShellScript */ = {
       
 15728 +			isa = PBXShellScriptBuildPhase;
       
 15729 +			buildActionMask = 2147483647;
       
 15730 +			files = (
       
 15731 +			);
       
 15732 +			inputPaths = (
       
 15733 +			);
       
 15734 +			outputPaths = (
       
 15735 +			);
       
 15736 +			runOnlyForDeploymentPostprocessing = 0;
       
 15737 +			shellPath = /bin/sh;
       
 15738 +			shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n\necho running minidump generator tests...\n\"${BUILT_PRODUCTS_DIR}/generator_test\"\necho Running exception handler tests...\n\"${BUILT_PRODUCTS_DIR}/handler_test\"\n";
       
 15739 +		};
       
 15740 +/* End PBXShellScriptBuildPhase section */
       
 15741 +
       
 15742 +/* Begin PBXSourcesBuildPhase section */
       
 15743 +		8DC2EF540486A6940098B216 /* Sources */ = {
       
 15744 +			isa = PBXSourcesBuildPhase;
       
 15745 +			buildActionMask = 2147483647;
       
 15746 +			files = (
       
 15747 +				F92C565F0ECD116B009BE4BA /* protected_memory_allocator.cc in Sources */,
       
 15748 +				F92C56630ECD1179009BE4BA /* exception_handler.cc in Sources */,
       
 15749 +				F92C55D10ECD0064009BE4BA /* Breakpad.mm in Sources */,
       
 15750 +				F92C56340ECD0DF1009BE4BA /* OnDemandServer.mm in Sources */,
       
 15751 +			);
       
 15752 +			runOnlyForDeploymentPostprocessing = 0;
       
 15753 +		};
       
 15754 +		F92C53510ECCE349009BE4BA /* Sources */ = {
       
 15755 +			isa = PBXSourcesBuildPhase;
       
 15756 +			buildActionMask = 2147483647;
       
 15757 +			files = (
       
 15758 +				F92C53B80ECCE7B3009BE4BA /* Inspector.mm in Sources */,
       
 15759 +				F9286B3A0F7EB25800A4DCC8 /* InspectorMain.mm in Sources */,
       
 15760 +			);
       
 15761 +			runOnlyForDeploymentPostprocessing = 0;
       
 15762 +		};
       
 15763 +		F92C56390ECD10B3009BE4BA /* Sources */ = {
       
 15764 +			isa = PBXSourcesBuildPhase;
       
 15765 +			buildActionMask = 2147483647;
       
 15766 +			files = (
       
 15767 +				F92C563F0ECD10CA009BE4BA /* convert_UTF.c in Sources */,
       
 15768 +				F92C56400ECD10CA009BE4BA /* dynamic_images.cc in Sources */,
       
 15769 +				F92C56410ECD10CA009BE4BA /* file_id.cc in Sources */,
       
 15770 +				F92C56420ECD10CA009BE4BA /* macho_id.cc in Sources */,
       
 15771 +				F92C56430ECD10CA009BE4BA /* macho_utilities.cc in Sources */,
       
 15772 +				F92C56440ECD10CA009BE4BA /* macho_walker.cc in Sources */,
       
 15773 +				F92C56450ECD10CA009BE4BA /* MachIPC.mm in Sources */,
       
 15774 +				F92C56460ECD10CA009BE4BA /* minidump_file_writer.cc in Sources */,
       
 15775 +				F92C56470ECD10CA009BE4BA /* minidump_generator.cc in Sources */,
       
 15776 +				F92C56480ECD10CA009BE4BA /* SimpleStringDictionary.mm in Sources */,
       
 15777 +				F92C56490ECD10CA009BE4BA /* string_utilities.cc in Sources */,
       
 15778 +				F92C564A0ECD10CA009BE4BA /* string_conversion.cc in Sources */,
       
 15779 +			);
       
 15780 +			runOnlyForDeploymentPostprocessing = 0;
       
 15781 +		};
       
 15782 +		F92C569D0ECE04A7009BE4BA /* Sources */ = {
       
 15783 +			isa = PBXSourcesBuildPhase;
       
 15784 +			buildActionMask = 2147483647;
       
 15785 +			files = (
       
 15786 +				F9C44EA20EF09F93003AEBAA /* HTTPMultipartUpload.m in Sources */,
       
 15787 +				F92C56A90ECE04C5009BE4BA /* crash_report_sender.m in Sources */,
       
 15788 +				F9C44EE90EF0A3C1003AEBAA /* GTMLogger.m in Sources */,
       
 15789 +			);
       
 15790 +			runOnlyForDeploymentPostprocessing = 0;
       
 15791 +		};
       
 15792 +		F93803BB0F80820F004D428B /* Sources */ = {
       
 15793 +			isa = PBXSourcesBuildPhase;
       
 15794 +			buildActionMask = 2147483647;
       
 15795 +			files = (
       
 15796 +				F93803CD0F8083B7004D428B /* dynamic_images.cc in Sources */,
       
 15797 +				F93803CE0F8083B7004D428B /* exception_handler.cc in Sources */,
       
 15798 +				F93803CF0F8083B7004D428B /* minidump_generator.cc in Sources */,
       
 15799 +				F93803D00F8083B7004D428B /* minidump_file_writer.cc in Sources */,
       
 15800 +				F93803D10F8083B7004D428B /* convert_UTF.c in Sources */,
       
 15801 +				F93803D20F8083B7004D428B /* string_conversion.cc in Sources */,
       
 15802 +				F93803D30F8083B7004D428B /* file_id.cc in Sources */,
       
 15803 +				F93803D40F8083B7004D428B /* macho_id.cc in Sources */,
       
 15804 +				F93803D50F8083B7004D428B /* macho_utilities.cc in Sources */,
       
 15805 +				F93803D60F8083B7004D428B /* macho_walker.cc in Sources */,
       
 15806 +				F93803D70F8083B7004D428B /* string_utilities.cc in Sources */,
       
 15807 +				F93803DA0F8083D8004D428B /* minidump_generator_test.cc in Sources */,
       
 15808 +			);
       
 15809 +			runOnlyForDeploymentPostprocessing = 0;
       
 15810 +		};
       
 15811 +		F93DE2CE0F82A67300608B94 /* Sources */ = {
       
 15812 +			isa = PBXSourcesBuildPhase;
       
 15813 +			buildActionMask = 2147483647;
       
 15814 +			files = (
       
 15815 +				F93DE2D90F82A73500608B94 /* minidump_file_writer.cc in Sources */,
       
 15816 +				F93DE2DA0F82A73500608B94 /* convert_UTF.c in Sources */,
       
 15817 +				F93DE2DB0F82A73500608B94 /* string_conversion.cc in Sources */,
       
 15818 +				F93DE2D80F82A70E00608B94 /* minidump_file_writer_unittest.cc in Sources */,
       
 15819 +			);
       
 15820 +			runOnlyForDeploymentPostprocessing = 0;
       
 15821 +		};
       
 15822 +		F93DE3290F82C55600608B94 /* Sources */ = {
       
 15823 +			isa = PBXSourcesBuildPhase;
       
 15824 +			buildActionMask = 2147483647;
       
 15825 +			files = (
       
 15826 +				F93DE3350F82C66B00608B94 /* dynamic_images.cc in Sources */,
       
 15827 +				F93DE3360F82C66B00608B94 /* exception_handler.cc in Sources */,
       
 15828 +				F93DE3370F82C66B00608B94 /* minidump_generator.cc in Sources */,
       
 15829 +				F93DE3380F82C66B00608B94 /* minidump_file_writer.cc in Sources */,
       
 15830 +				F93DE3390F82C66B00608B94 /* convert_UTF.c in Sources */,
       
 15831 +				F93DE33A0F82C66B00608B94 /* string_conversion.cc in Sources */,
       
 15832 +				F93DE33B0F82C66B00608B94 /* file_id.cc in Sources */,
       
 15833 +				F93DE33C0F82C66B00608B94 /* macho_id.cc in Sources */,
       
 15834 +				F93DE33D0F82C66B00608B94 /* macho_utilities.cc in Sources */,
       
 15835 +				F93DE33E0F82C66B00608B94 /* macho_walker.cc in Sources */,
       
 15836 +				F93DE33F0F82C66B00608B94 /* string_utilities.cc in Sources */,
       
 15837 +				F93DE3410F82C68300608B94 /* exception_handler_test.cc in Sources */,
       
 15838 +			);
       
 15839 +			runOnlyForDeploymentPostprocessing = 0;
       
 15840 +		};
       
 15841 +		F9C44DA20EF060A8003AEBAA /* Sources */ = {
       
 15842 +			isa = PBXSourcesBuildPhase;
       
 15843 +			buildActionMask = 2147483647;
       
 15844 +			files = (
       
 15845 +				F9C44DB20EF07288003AEBAA /* Controller.m in Sources */,
       
 15846 +				F9C44DB60EF07288003AEBAA /* main.m in Sources */,
       
 15847 +				F9C44DB70EF07288003AEBAA /* TestClass.mm in Sources */,
       
 15848 +			);
       
 15849 +			runOnlyForDeploymentPostprocessing = 0;
       
 15850 +		};
       
 15851 +		F9C77DD60F7DD5CF0045F7DB /* Sources */ = {
       
 15852 +			isa = PBXSourcesBuildPhase;
       
 15853 +			buildActionMask = 2147483647;
       
 15854 +			files = (
       
 15855 +				F9C77DE40F7DD82F0045F7DB /* SimpleStringDictionary.mm in Sources */,
       
 15856 +				F9C77DE20F7DD7E30045F7DB /* SimpleStringDictionaryTest.mm in Sources */,
       
 15857 +				F9C77E130F7DDF810045F7DB /* GTMSenTestCase.m in Sources */,
       
 15858 +				F91AF5D00FD60393009D8BE2 /* BreakpadFramework_Test.mm in Sources */,
       
 15859 +			);
       
 15860 +			runOnlyForDeploymentPostprocessing = 0;
       
 15861 +		};
       
 15862 +/* End PBXSourcesBuildPhase section */
       
 15863 +
       
 15864 +/* Begin PBXTargetDependency section */
       
 15865 +		F91AF6380FD60A74009D8BE2 /* PBXTargetDependency */ = {
       
 15866 +			isa = PBXTargetDependency;
       
 15867 +			target = 8DC2EF4F0486A6940098B216 /* Breakpad */;
       
 15868 +			targetProxy = F91AF6370FD60A74009D8BE2 /* PBXContainerItemProxy */;
       
 15869 +		};
       
 15870 +		F92C564E0ECD10E5009BE4BA /* PBXTargetDependency */ = {
       
 15871 +			isa = PBXTargetDependency;
       
 15872 +			target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */;
       
 15873 +			targetProxy = F92C564D0ECD10E5009BE4BA /* PBXContainerItemProxy */;
       
 15874 +		};
       
 15875 +		F92C56860ECD15EF009BE4BA /* PBXTargetDependency */ = {
       
 15876 +			isa = PBXTargetDependency;
       
 15877 +			target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */;
       
 15878 +			targetProxy = F92C56850ECD15EF009BE4BA /* PBXContainerItemProxy */;
       
 15879 +		};
       
 15880 +		F92C56880ECD15F1009BE4BA /* PBXTargetDependency */ = {
       
 15881 +			isa = PBXTargetDependency;
       
 15882 +			target = F92C53530ECCE349009BE4BA /* Inspector */;
       
 15883 +			targetProxy = F92C56870ECD15F1009BE4BA /* PBXContainerItemProxy */;
       
 15884 +		};
       
 15885 +		F93DE2FC0F82C3C600608B94 /* PBXTargetDependency */ = {
       
 15886 +			isa = PBXTargetDependency;
       
 15887 +			target = F93803BD0F80820F004D428B /* generator_test */;
       
 15888 +			targetProxy = F93DE2FB0F82C3C600608B94 /* PBXContainerItemProxy */;
       
 15889 +		};
       
 15890 +		F93DE3700F82CC1300608B94 /* PBXTargetDependency */ = {
       
 15891 +			isa = PBXTargetDependency;
       
 15892 +			target = F93DE32B0F82C55600608B94 /* handler_test */;
       
 15893 +			targetProxy = F93DE36F0F82CC1300608B94 /* PBXContainerItemProxy */;
       
 15894 +		};
       
 15895 +		F93DE3A70F830D1D00608B94 /* PBXTargetDependency */ = {
       
 15896 +			isa = PBXTargetDependency;
       
 15897 +			target = F9C77DD90F7DD5CF0045F7DB /* UnitTests */;
       
 15898 +			targetProxy = F93DE3A60F830D1D00608B94 /* PBXContainerItemProxy */;
       
 15899 +		};
       
 15900 +		F94585880F78232B009A47BF /* PBXTargetDependency */ = {
       
 15901 +			isa = PBXTargetDependency;
       
 15902 +			target = 8DC2EF4F0486A6940098B216 /* Breakpad */;
       
 15903 +			targetProxy = F94585870F78232B009A47BF /* PBXContainerItemProxy */;
       
 15904 +		};
       
 15905 +		F945858A0F78232E009A47BF /* PBXTargetDependency */ = {
       
 15906 +			isa = PBXTargetDependency;
       
 15907 +			target = F92C53530ECCE349009BE4BA /* Inspector */;
       
 15908 +			targetProxy = F94585890F78232E009A47BF /* PBXContainerItemProxy */;
       
 15909 +		};
       
 15910 +		F945858C0F782330009A47BF /* PBXTargetDependency */ = {
       
 15911 +			isa = PBXTargetDependency;
       
 15912 +			target = F92C563B0ECD10B3009BE4BA /* breakpadUtilities */;
       
 15913 +			targetProxy = F945858B0F782330009A47BF /* PBXContainerItemProxy */;
       
 15914 +		};
       
 15915 +		F945858E0F782333009A47BF /* PBXTargetDependency */ = {
       
 15916 +			isa = PBXTargetDependency;
       
 15917 +			target = F92C569F0ECE04A7009BE4BA /* crash_report_sender */;
       
 15918 +			targetProxy = F945858D0F782333009A47BF /* PBXContainerItemProxy */;
       
 15919 +		};
       
 15920 +		F94585900F782336009A47BF /* PBXTargetDependency */ = {
       
 15921 +			isa = PBXTargetDependency;
       
 15922 +			target = F9C44DA40EF060A8003AEBAA /* BreakpadTest */;
       
 15923 +			targetProxy = F945858F0F782336009A47BF /* PBXContainerItemProxy */;
       
 15924 +		};
       
 15925 +		F95BB8B3101F94D300AA053B /* PBXTargetDependency */ = {
       
 15926 +			isa = PBXTargetDependency;
       
 15927 +			name = dump_syms;
       
 15928 +			targetProxy = F95BB8B2101F94D300AA053B /* PBXContainerItemProxy */;
       
 15929 +		};
       
 15930 +		F95BB8B5101F94D300AA053B /* PBXTargetDependency */ = {
       
 15931 +			isa = PBXTargetDependency;
       
 15932 +			name = symupload;
       
 15933 +			targetProxy = F95BB8B4101F94D300AA053B /* PBXContainerItemProxy */;
       
 15934 +		};
       
 15935 +		F95BB8B7101F94D300AA053B /* PBXTargetDependency */ = {
       
 15936 +			isa = PBXTargetDependency;
       
 15937 +			name = crash_report;
       
 15938 +			targetProxy = F95BB8B6101F94D300AA053B /* PBXContainerItemProxy */;
       
 15939 +		};
       
 15940 +		F9C44E1A0EF0790F003AEBAA /* PBXTargetDependency */ = {
       
 15941 +			isa = PBXTargetDependency;
       
 15942 +			target = 8DC2EF4F0486A6940098B216 /* Breakpad */;
       
 15943 +			targetProxy = F9C44E190EF0790F003AEBAA /* PBXContainerItemProxy */;
       
 15944 +		};
       
 15945 +		F9C44E970EF09F4B003AEBAA /* PBXTargetDependency */ = {
       
 15946 +			isa = PBXTargetDependency;
       
 15947 +			target = F92C569F0ECE04A7009BE4BA /* crash_report_sender */;
       
 15948 +			targetProxy = F9C44E960EF09F4B003AEBAA /* PBXContainerItemProxy */;
       
 15949 +		};
       
 15950 +/* End PBXTargetDependency section */
       
 15951 +
       
 15952 +/* Begin PBXVariantGroup section */
       
 15953 +		33880C7E0F9E097100817F82 /* InfoPlist.strings */ = {
       
 15954 +			isa = PBXVariantGroup;
       
 15955 +			children = (
       
 15956 +				33880C7F0F9E097100817F82 /* English */,
       
 15957 +			);
       
 15958 +			name = InfoPlist.strings;
       
 15959 +			sourceTree = "<group>";
       
 15960 +		};
       
 15961 +		F945849C0F280E3C009A47BF /* Localizable.strings */ = {
       
 15962 +			isa = PBXVariantGroup;
       
 15963 +			children = (
       
 15964 +				F945849D0F280E3C009A47BF /* English */,
       
 15965 +			);
       
 15966 +			name = Localizable.strings;
       
 15967 +			sourceTree = "<group>";
       
 15968 +		};
       
 15969 +		F9C44DB80EF072A0003AEBAA /* InfoPlist.strings */ = {
       
 15970 +			isa = PBXVariantGroup;
       
 15971 +			children = (
       
 15972 +				F9C44DB90EF072A0003AEBAA /* English */,
       
 15973 +			);
       
 15974 +			name = InfoPlist.strings;
       
 15975 +			sourceTree = "<group>";
       
 15976 +		};
       
 15977 +		F9C44DBA0EF072A0003AEBAA /* MainMenu.nib */ = {
       
 15978 +			isa = PBXVariantGroup;
       
 15979 +			children = (
       
 15980 +				F9C44DBB0EF072A0003AEBAA /* English */,
       
 15981 +			);
       
 15982 +			name = MainMenu.nib;
       
 15983 +			sourceTree = "<group>";
       
 15984 +		};
       
 15985 +/* End PBXVariantGroup section */
       
 15986 +
       
 15987 +/* Begin XCBuildConfiguration section */
       
 15988 +		1DEB91AE08733DA50010E9CD /* Debug */ = {
       
 15989 +			isa = XCBuildConfiguration;
       
 15990 +			buildSettings = {
       
 15991 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 15992 +				COPY_PHASE_STRIP = NO;
       
 15993 +				DYLIB_COMPATIBILITY_VERSION = 1;
       
 15994 +				DYLIB_CURRENT_VERSION = 1;
       
 15995 +				FRAMEWORK_VERSION = A;
       
 15996 +				GCC_DYNAMIC_NO_PIC = NO;
       
 15997 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 15998 +				GCC_MODEL_TUNING = G5;
       
 15999 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16000 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16001 +				GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;
       
 16002 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16003 +				INFOPLIST_FILE = Framework/Info.plist;
       
 16004 +				INSTALL_PATH = "@executable_path/../Frameworks";
       
 16005 +				PRODUCT_NAME = Breakpad;
       
 16006 +				WRAPPER_EXTENSION = framework;
       
 16007 +			};
       
 16008 +			name = Debug;
       
 16009 +		};
       
 16010 +		1DEB91AF08733DA50010E9CD /* Release */ = {
       
 16011 +			isa = XCBuildConfiguration;
       
 16012 +			buildSettings = {
       
 16013 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16014 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16015 +				DYLIB_COMPATIBILITY_VERSION = 1;
       
 16016 +				DYLIB_CURRENT_VERSION = 1;
       
 16017 +				FRAMEWORK_VERSION = A;
       
 16018 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16019 +				GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;
       
 16020 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16021 +				INFOPLIST_FILE = Framework/Info.plist;
       
 16022 +				INSTALL_PATH = "@executable_path/../Frameworks";
       
 16023 +				PRODUCT_NAME = Breakpad;
       
 16024 +				WRAPPER_EXTENSION = framework;
       
 16025 +			};
       
 16026 +			name = Release;
       
 16027 +		};
       
 16028 +		1DEB91B208733DA50010E9CD /* Debug */ = {
       
 16029 +			isa = XCBuildConfiguration;
       
 16030 +			buildSettings = {
       
 16031 +				ARCHS = "$(ONLY_ACTIVE_ARCH_PRE_XCODE_3_1)";
       
 16032 +				GCC_C_LANGUAGE_STANDARD = c99;
       
 16033 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16034 +				GCC_WARN_ABOUT_RETURN_TYPE = YES;
       
 16035 +				GCC_WARN_UNUSED_VARIABLE = YES;
       
 16036 +				ONLY_ACTIVE_ARCH_PRE_XCODE_3_1 = "$(NATIVE_ARCH)";
       
 16037 +				PREBINDING = NO;
       
 16038 +				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
       
 16039 +			};
       
 16040 +			name = Debug;
       
 16041 +		};
       
 16042 +		1DEB91B308733DA50010E9CD /* Release */ = {
       
 16043 +			isa = XCBuildConfiguration;
       
 16044 +			buildSettings = {
       
 16045 +				ARCHS = "$(ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1)";
       
 16046 +				ARCHS_STANDARD_32_BIT_PRE_XCODE_3_1 = "ppc i386";
       
 16047 +				GCC_C_LANGUAGE_STANDARD = c99;
       
 16048 +				GCC_WARN_ABOUT_RETURN_TYPE = YES;
       
 16049 +				GCC_WARN_UNUSED_VARIABLE = YES;
       
 16050 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16051 +				PREBINDING = NO;
       
 16052 +				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
       
 16053 +			};
       
 16054 +			name = Release;
       
 16055 +		};
       
 16056 +		F92C53560ECCE34A009BE4BA /* Debug */ = {
       
 16057 +			isa = XCBuildConfiguration;
       
 16058 +			buildSettings = {
       
 16059 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16060 +				COPY_PHASE_STRIP = NO;
       
 16061 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16062 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16063 +				GCC_MODEL_TUNING = G5;
       
 16064 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16065 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16066 +				INSTALL_PATH = /usr/local/bin;
       
 16067 +				OTHER_LDFLAGS = (
       
 16068 +					"-lcrypto",
       
 16069 +					"$(inherited)",
       
 16070 +				);
       
 16071 +				PREBINDING = NO;
       
 16072 +				PRODUCT_NAME = Inspector;
       
 16073 +			};
       
 16074 +			name = Debug;
       
 16075 +		};
       
 16076 +		F92C53570ECCE34A009BE4BA /* Release */ = {
       
 16077 +			isa = XCBuildConfiguration;
       
 16078 +			buildSettings = {
       
 16079 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16080 +				COPY_PHASE_STRIP = YES;
       
 16081 +				DEAD_CODE_STRIPPING = YES;
       
 16082 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16083 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16084 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16085 +				INSTALL_PATH = /usr/local/bin;
       
 16086 +				LD_GENERATE_MAP_FILE = YES;
       
 16087 +				OTHER_LDFLAGS = (
       
 16088 +					"$(inherited)",
       
 16089 +					"-lcrypto",
       
 16090 +				);
       
 16091 +				PREBINDING = NO;
       
 16092 +				PRODUCT_NAME = Inspector;
       
 16093 +				ZERO_LINK = NO;
       
 16094 +			};
       
 16095 +			name = Release;
       
 16096 +		};
       
 16097 +		F92C563D0ECD10B3009BE4BA /* Debug */ = {
       
 16098 +			isa = XCBuildConfiguration;
       
 16099 +			buildSettings = {
       
 16100 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16101 +				COPY_PHASE_STRIP = NO;
       
 16102 +				DYLIB_COMPATIBILITY_VERSION = 1;
       
 16103 +				DYLIB_CURRENT_VERSION = 1;
       
 16104 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16105 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16106 +				GCC_MODEL_TUNING = G5;
       
 16107 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16108 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16109 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16110 +				INSTALL_PATH = /usr/local/lib;
       
 16111 +				LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)";
       
 16112 +				OTHER_LDFLAGS = (
       
 16113 +					"$(inherited)",
       
 16114 +					"-headerpad_max_install_names",
       
 16115 +					"-lcrypto",
       
 16116 +				);
       
 16117 +				PREBINDING = NO;
       
 16118 +				PRODUCT_NAME = breakpadUtilities;
       
 16119 +			};
       
 16120 +			name = Debug;
       
 16121 +		};
       
 16122 +		F92C563E0ECD10B3009BE4BA /* Release */ = {
       
 16123 +			isa = XCBuildConfiguration;
       
 16124 +			buildSettings = {
       
 16125 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16126 +				COPY_PHASE_STRIP = YES;
       
 16127 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16128 +				DYLIB_COMPATIBILITY_VERSION = 1;
       
 16129 +				DYLIB_CURRENT_VERSION = 1;
       
 16130 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16131 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16132 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16133 +				INSTALL_PATH = /usr/local/lib;
       
 16134 +				LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)";
       
 16135 +				OTHER_LDFLAGS = (
       
 16136 +					"$(inherited)",
       
 16137 +					"-headerpad_max_install_names",
       
 16138 +					"-lcrypto",
       
 16139 +				);
       
 16140 +				PREBINDING = NO;
       
 16141 +				PRODUCT_NAME = breakpadUtilities;
       
 16142 +				ZERO_LINK = NO;
       
 16143 +			};
       
 16144 +			name = Release;
       
 16145 +		};
       
 16146 +		F92C56A30ECE04A8009BE4BA /* Debug */ = {
       
 16147 +			isa = XCBuildConfiguration;
       
 16148 +			buildSettings = {
       
 16149 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16150 +				COPY_PHASE_STRIP = NO;
       
 16151 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16152 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16153 +				GCC_MODEL_TUNING = G5;
       
 16154 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16155 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16156 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16157 +				INFOPLIST_FILE = "sender/crash_report_sender-Info.plist";
       
 16158 +				INSTALL_PATH = "$(HOME)/Applications";
       
 16159 +				OTHER_LDFLAGS = (
       
 16160 +					"-framework",
       
 16161 +					Foundation,
       
 16162 +					"-framework",
       
 16163 +					AppKit,
       
 16164 +				);
       
 16165 +				PREBINDING = NO;
       
 16166 +				PRODUCT_NAME = crash_report_sender;
       
 16167 +			};
       
 16168 +			name = Debug;
       
 16169 +		};
       
 16170 +		F92C56A40ECE04A8009BE4BA /* Release */ = {
       
 16171 +			isa = XCBuildConfiguration;
       
 16172 +			buildSettings = {
       
 16173 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16174 +				COPY_PHASE_STRIP = YES;
       
 16175 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16176 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16177 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16178 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16179 +				INFOPLIST_FILE = "sender/crash_report_sender-Info.plist";
       
 16180 +				INSTALL_PATH = "$(HOME)/Applications";
       
 16181 +				OTHER_LDFLAGS = (
       
 16182 +					"-framework",
       
 16183 +					Foundation,
       
 16184 +					"-framework",
       
 16185 +					AppKit,
       
 16186 +				);
       
 16187 +				PREBINDING = NO;
       
 16188 +				PRODUCT_NAME = crash_report_sender;
       
 16189 +				ZERO_LINK = NO;
       
 16190 +			};
       
 16191 +			name = Release;
       
 16192 +		};
       
 16193 +		F93803C00F808210004D428B /* Debug */ = {
       
 16194 +			isa = XCBuildConfiguration;
       
 16195 +			buildSettings = {
       
 16196 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16197 +				COPY_PHASE_STRIP = NO;
       
 16198 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16199 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16200 +				GCC_MODEL_TUNING = G5;
       
 16201 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16202 +				INSTALL_PATH = /usr/local/bin;
       
 16203 +				OTHER_LDFLAGS = (
       
 16204 +					"-lcrypto",
       
 16205 +					"-framework",
       
 16206 +					Foundation,
       
 16207 +				);
       
 16208 +				PREBINDING = NO;
       
 16209 +				PRODUCT_NAME = generator_test;
       
 16210 +				USER_HEADER_SEARCH_PATHS = ../../;
       
 16211 +			};
       
 16212 +			name = Debug;
       
 16213 +		};
       
 16214 +		F93803C10F808210004D428B /* Release */ = {
       
 16215 +			isa = XCBuildConfiguration;
       
 16216 +			buildSettings = {
       
 16217 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16218 +				COPY_PHASE_STRIP = YES;
       
 16219 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16220 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16221 +				GCC_MODEL_TUNING = G5;
       
 16222 +				INSTALL_PATH = /usr/local/bin;
       
 16223 +				OTHER_LDFLAGS = (
       
 16224 +					"-lcrypto",
       
 16225 +					"-framework",
       
 16226 +					Foundation,
       
 16227 +				);
       
 16228 +				PREBINDING = NO;
       
 16229 +				PRODUCT_NAME = generator_test;
       
 16230 +				ZERO_LINK = NO;
       
 16231 +			};
       
 16232 +			name = Release;
       
 16233 +		};
       
 16234 +		F93DE2D30F82A67400608B94 /* Debug */ = {
       
 16235 +			isa = XCBuildConfiguration;
       
 16236 +			buildSettings = {
       
 16237 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16238 +				COPY_PHASE_STRIP = NO;
       
 16239 +				GCC_CHAR_IS_UNSIGNED_CHAR = YES;
       
 16240 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16241 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16242 +				GCC_MODEL_TUNING = G5;
       
 16243 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16244 +				INSTALL_PATH = /usr/local/bin;
       
 16245 +				OTHER_LDFLAGS = (
       
 16246 +					"-framework",
       
 16247 +					Foundation,
       
 16248 +					"-framework",
       
 16249 +					AppKit,
       
 16250 +				);
       
 16251 +				PREBINDING = NO;
       
 16252 +				PRODUCT_NAME = minidump_file_writer_unittest;
       
 16253 +				USER_HEADER_SEARCH_PATHS = ../../;
       
 16254 +			};
       
 16255 +			name = Debug;
       
 16256 +		};
       
 16257 +		F93DE2D40F82A67400608B94 /* Release */ = {
       
 16258 +			isa = XCBuildConfiguration;
       
 16259 +			buildSettings = {
       
 16260 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16261 +				COPY_PHASE_STRIP = YES;
       
 16262 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16263 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16264 +				GCC_MODEL_TUNING = G5;
       
 16265 +				INSTALL_PATH = /usr/local/bin;
       
 16266 +				OTHER_LDFLAGS = (
       
 16267 +					"-framework",
       
 16268 +					Foundation,
       
 16269 +					"-framework",
       
 16270 +					AppKit,
       
 16271 +				);
       
 16272 +				PREBINDING = NO;
       
 16273 +				PRODUCT_NAME = minidump_file_writer_unittest;
       
 16274 +				ZERO_LINK = NO;
       
 16275 +			};
       
 16276 +			name = Release;
       
 16277 +		};
       
 16278 +		F93DE32E0F82C55700608B94 /* Debug */ = {
       
 16279 +			isa = XCBuildConfiguration;
       
 16280 +			buildSettings = {
       
 16281 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16282 +				COPY_PHASE_STRIP = NO;
       
 16283 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16284 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16285 +				GCC_MODEL_TUNING = G5;
       
 16286 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16287 +				INSTALL_PATH = /usr/local/bin;
       
 16288 +				OTHER_LDFLAGS = (
       
 16289 +					"-lcrypto",
       
 16290 +					"-framework",
       
 16291 +					Foundation,
       
 16292 +				);
       
 16293 +				PREBINDING = NO;
       
 16294 +				PRODUCT_NAME = handler_test;
       
 16295 +				USER_HEADER_SEARCH_PATHS = ../../;
       
 16296 +			};
       
 16297 +			name = Debug;
       
 16298 +		};
       
 16299 +		F93DE32F0F82C55700608B94 /* Release */ = {
       
 16300 +			isa = XCBuildConfiguration;
       
 16301 +			buildSettings = {
       
 16302 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16303 +				COPY_PHASE_STRIP = YES;
       
 16304 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16305 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16306 +				GCC_MODEL_TUNING = G5;
       
 16307 +				INSTALL_PATH = /usr/local/bin;
       
 16308 +				OTHER_LDFLAGS = (
       
 16309 +					"-lcrypto",
       
 16310 +					"-framework",
       
 16311 +					Foundation,
       
 16312 +				);
       
 16313 +				PREBINDING = NO;
       
 16314 +				PRODUCT_NAME = handler_test;
       
 16315 +				ZERO_LINK = NO;
       
 16316 +			};
       
 16317 +			name = Release;
       
 16318 +		};
       
 16319 +		F93DE3B90F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16320 +			isa = XCBuildConfiguration;
       
 16321 +			buildSettings = {
       
 16322 +				ARCHS = "$(ONLY_ACTIVE_ARCH_PRE_XCODE_3_1)";
       
 16323 +				GCC_C_LANGUAGE_STANDARD = c99;
       
 16324 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16325 +				GCC_WARN_ABOUT_RETURN_TYPE = YES;
       
 16326 +				GCC_WARN_UNUSED_VARIABLE = YES;
       
 16327 +				ONLY_ACTIVE_ARCH_PRE_XCODE_3_1 = "$(NATIVE_ARCH)";
       
 16328 +				PREBINDING = NO;
       
 16329 +				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
       
 16330 +			};
       
 16331 +			name = "Debug With Code Coverage";
       
 16332 +		};
       
 16333 +		F93DE3BA0F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16334 +			isa = XCBuildConfiguration;
       
 16335 +			buildSettings = {
       
 16336 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16337 +				COPY_PHASE_STRIP = NO;
       
 16338 +				DYLIB_COMPATIBILITY_VERSION = 1;
       
 16339 +				DYLIB_CURRENT_VERSION = 1;
       
 16340 +				FRAMEWORK_VERSION = A;
       
 16341 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16342 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16343 +				GCC_MODEL_TUNING = G5;
       
 16344 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16345 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16346 +				GCC_PREFIX_HEADER = Framework/Breakpad_Prefix.pch;
       
 16347 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16348 +				INFOPLIST_FILE = Framework/Info.plist;
       
 16349 +				INSTALL_PATH = "@executable_path/../Frameworks";
       
 16350 +				PRODUCT_NAME = Breakpad;
       
 16351 +				WRAPPER_EXTENSION = framework;
       
 16352 +			};
       
 16353 +			name = "Debug With Code Coverage";
       
 16354 +		};
       
 16355 +		F93DE3BB0F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16356 +			isa = XCBuildConfiguration;
       
 16357 +			buildSettings = {
       
 16358 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16359 +				COPY_PHASE_STRIP = NO;
       
 16360 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16361 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16362 +				GCC_MODEL_TUNING = G5;
       
 16363 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16364 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16365 +				INSTALL_PATH = /usr/local/bin;
       
 16366 +				OTHER_LDFLAGS = (
       
 16367 +					"-lcrypto",
       
 16368 +					"$(inherited)",
       
 16369 +				);
       
 16370 +				PREBINDING = NO;
       
 16371 +				PRODUCT_NAME = Inspector;
       
 16372 +			};
       
 16373 +			name = "Debug With Code Coverage";
       
 16374 +		};
       
 16375 +		F93DE3BC0F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16376 +			isa = XCBuildConfiguration;
       
 16377 +			buildSettings = {
       
 16378 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16379 +				COPY_PHASE_STRIP = NO;
       
 16380 +				DYLIB_COMPATIBILITY_VERSION = 1;
       
 16381 +				DYLIB_CURRENT_VERSION = 1;
       
 16382 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16383 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16384 +				GCC_MODEL_TUNING = G5;
       
 16385 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16386 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16387 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16388 +				INSTALL_PATH = /usr/local/lib;
       
 16389 +				LD_DYLIB_INSTALL_NAME = "@executable_path/../Resources/$(EXECUTABLE_PATH)";
       
 16390 +				OTHER_LDFLAGS = (
       
 16391 +					"$(inherited)",
       
 16392 +					"-headerpad_max_install_names",
       
 16393 +					"-lcrypto",
       
 16394 +				);
       
 16395 +				PREBINDING = NO;
       
 16396 +				PRODUCT_NAME = breakpadUtilities;
       
 16397 +			};
       
 16398 +			name = "Debug With Code Coverage";
       
 16399 +		};
       
 16400 +		F93DE3BD0F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16401 +			isa = XCBuildConfiguration;
       
 16402 +			buildSettings = {
       
 16403 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16404 +				COPY_PHASE_STRIP = NO;
       
 16405 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16406 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16407 +				GCC_MODEL_TUNING = G5;
       
 16408 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16409 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16410 +				HEADER_SEARCH_PATHS = "../..//**";
       
 16411 +				INFOPLIST_FILE = "sender/crash_report_sender-Info.plist";
       
 16412 +				INSTALL_PATH = "$(HOME)/Applications";
       
 16413 +				OTHER_LDFLAGS = (
       
 16414 +					"-framework",
       
 16415 +					Foundation,
       
 16416 +					"-framework",
       
 16417 +					AppKit,
       
 16418 +				);
       
 16419 +				PREBINDING = NO;
       
 16420 +				PRODUCT_NAME = crash_report_sender;
       
 16421 +			};
       
 16422 +			name = "Debug With Code Coverage";
       
 16423 +		};
       
 16424 +		F93DE3BE0F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16425 +			isa = XCBuildConfiguration;
       
 16426 +			buildSettings = {
       
 16427 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16428 +				COPY_PHASE_STRIP = NO;
       
 16429 +				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)";
       
 16430 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16431 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16432 +				GCC_MODEL_TUNING = G5;
       
 16433 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16434 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16435 +				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
       
 16436 +				INFOPLIST_FILE = testapp/Info.plist;
       
 16437 +				INSTALL_PATH = "$(HOME)/Applications";
       
 16438 +				OTHER_LDFLAGS = (
       
 16439 +					"-framework",
       
 16440 +					Foundation,
       
 16441 +					"-framework",
       
 16442 +					AppKit,
       
 16443 +				);
       
 16444 +				PREBINDING = NO;
       
 16445 +				PRODUCT_NAME = BreakpadTest;
       
 16446 +			};
       
 16447 +			name = "Debug With Code Coverage";
       
 16448 +		};
       
 16449 +		F93DE3BF0F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16450 +			isa = XCBuildConfiguration;
       
 16451 +			buildSettings = {
       
 16452 +				COPY_PHASE_STRIP = NO;
       
 16453 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16454 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16455 +				PRODUCT_NAME = All;
       
 16456 +			};
       
 16457 +			name = "Debug With Code Coverage";
       
 16458 +		};
       
 16459 +		F93DE3C00F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16460 +			isa = XCBuildConfiguration;
       
 16461 +			buildSettings = {
       
 16462 +				COPY_PHASE_STRIP = NO;
       
 16463 +				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
       
 16464 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16465 +				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
       
 16466 +				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
       
 16467 +				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
       
 16468 +				GCC_MODEL_TUNING = G5;
       
 16469 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16470 +				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h";
       
 16471 +				INFOPLIST_FILE = "UnitTests-Info.plist";
       
 16472 +				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
       
 16473 +				LIBRARY_SEARCH_PATHS = ./gcov;
       
 16474 +				OTHER_LDFLAGS = (
       
 16475 +					"-lgcov",
       
 16476 +					"-framework",
       
 16477 +					Cocoa,
       
 16478 +					"-framework",
       
 16479 +					SenTestingKit,
       
 16480 +				);
       
 16481 +				PREBINDING = NO;
       
 16482 +				PRODUCT_NAME = UnitTests;
       
 16483 +				USER_HEADER_SEARCH_PATHS = "../../ ../../common/mac/**";
       
 16484 +				WRAPPER_EXTENSION = octest;
       
 16485 +			};
       
 16486 +			name = "Debug With Code Coverage";
       
 16487 +		};
       
 16488 +		F93DE3C10F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16489 +			isa = XCBuildConfiguration;
       
 16490 +			buildSettings = {
       
 16491 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16492 +				COPY_PHASE_STRIP = NO;
       
 16493 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16494 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16495 +				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
       
 16496 +				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
       
 16497 +				GCC_MODEL_TUNING = G5;
       
 16498 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16499 +				INSTALL_PATH = /usr/local/bin;
       
 16500 +				LIBRARY_SEARCH_PATHS = ./gcov;
       
 16501 +				OTHER_LDFLAGS = (
       
 16502 +					"-lgcov",
       
 16503 +					"-lcrypto",
       
 16504 +					"-framework",
       
 16505 +					Foundation,
       
 16506 +				);
       
 16507 +				PREBINDING = NO;
       
 16508 +				PRODUCT_NAME = generator_test;
       
 16509 +				USER_HEADER_SEARCH_PATHS = ../../;
       
 16510 +			};
       
 16511 +			name = "Debug With Code Coverage";
       
 16512 +		};
       
 16513 +		F93DE3C20F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16514 +			isa = XCBuildConfiguration;
       
 16515 +			buildSettings = {
       
 16516 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16517 +				COPY_PHASE_STRIP = NO;
       
 16518 +				GCC_CHAR_IS_UNSIGNED_CHAR = YES;
       
 16519 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16520 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16521 +				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
       
 16522 +				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
       
 16523 +				GCC_MODEL_TUNING = G5;
       
 16524 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16525 +				INSTALL_PATH = /usr/local/bin;
       
 16526 +				LIBRARY_SEARCH_PATHS = ./gcov;
       
 16527 +				OTHER_LDFLAGS = (
       
 16528 +					"-lgcov",
       
 16529 +					"-framework",
       
 16530 +					Foundation,
       
 16531 +					"-framework",
       
 16532 +					AppKit,
       
 16533 +				);
       
 16534 +				PREBINDING = NO;
       
 16535 +				PRODUCT_NAME = minidump_file_writer_unittest;
       
 16536 +				USER_HEADER_SEARCH_PATHS = ../../;
       
 16537 +			};
       
 16538 +			name = "Debug With Code Coverage";
       
 16539 +		};
       
 16540 +		F93DE3C30F830E7000608B94 /* Debug With Code Coverage */ = {
       
 16541 +			isa = XCBuildConfiguration;
       
 16542 +			buildSettings = {
       
 16543 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16544 +				COPY_PHASE_STRIP = NO;
       
 16545 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16546 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16547 +				GCC_GENERATE_TEST_COVERAGE_FILES = YES;
       
 16548 +				GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES;
       
 16549 +				GCC_MODEL_TUNING = G5;
       
 16550 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16551 +				INSTALL_PATH = /usr/local/bin;
       
 16552 +				LIBRARY_SEARCH_PATHS = ./gcov;
       
 16553 +				OTHER_LDFLAGS = (
       
 16554 +					"-lcrypto",
       
 16555 +					"-lgcov",
       
 16556 +					"-framework",
       
 16557 +					Foundation,
       
 16558 +				);
       
 16559 +				PREBINDING = NO;
       
 16560 +				PRODUCT_NAME = handler_test;
       
 16561 +				USER_HEADER_SEARCH_PATHS = ../../;
       
 16562 +			};
       
 16563 +			name = "Debug With Code Coverage";
       
 16564 +		};
       
 16565 +		F94585850F782326009A47BF /* Debug */ = {
       
 16566 +			isa = XCBuildConfiguration;
       
 16567 +			buildSettings = {
       
 16568 +				COPY_PHASE_STRIP = NO;
       
 16569 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16570 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16571 +				PRODUCT_NAME = All;
       
 16572 +			};
       
 16573 +			name = Debug;
       
 16574 +		};
       
 16575 +		F94585860F782326009A47BF /* Release */ = {
       
 16576 +			isa = XCBuildConfiguration;
       
 16577 +			buildSettings = {
       
 16578 +				COPY_PHASE_STRIP = YES;
       
 16579 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16580 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16581 +				PRODUCT_NAME = All;
       
 16582 +				ZERO_LINK = NO;
       
 16583 +			};
       
 16584 +			name = Release;
       
 16585 +		};
       
 16586 +		F9C44DA80EF060A8003AEBAA /* Debug */ = {
       
 16587 +			isa = XCBuildConfiguration;
       
 16588 +			buildSettings = {
       
 16589 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16590 +				COPY_PHASE_STRIP = NO;
       
 16591 +				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)";
       
 16592 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16593 +				GCC_ENABLE_FIX_AND_CONTINUE = YES;
       
 16594 +				GCC_MODEL_TUNING = G5;
       
 16595 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16596 +				GCC_PRECOMPILE_PREFIX_HEADER = YES;
       
 16597 +				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
       
 16598 +				INFOPLIST_FILE = testapp/Info.plist;
       
 16599 +				INSTALL_PATH = "$(HOME)/Applications";
       
 16600 +				OTHER_LDFLAGS = (
       
 16601 +					"-framework",
       
 16602 +					Foundation,
       
 16603 +					"-framework",
       
 16604 +					AppKit,
       
 16605 +				);
       
 16606 +				PREBINDING = NO;
       
 16607 +				PRODUCT_NAME = BreakpadTest;
       
 16608 +			};
       
 16609 +			name = Debug;
       
 16610 +		};
       
 16611 +		F9C44DA90EF060A8003AEBAA /* Release */ = {
       
 16612 +			isa = XCBuildConfiguration;
       
 16613 +			buildSettings = {
       
 16614 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16615 +				COPY_PHASE_STRIP = YES;
       
 16616 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16617 +				FRAMEWORK_SEARCH_PATHS = "$(SRCROOT)/build/$(CONFIGURATION)";
       
 16618 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16619 +				INFOPLIST_FILE = testapp/Info.plist;
       
 16620 +				INSTALL_PATH = "$(HOME)/Applications";
       
 16621 +				OTHER_LDFLAGS = (
       
 16622 +					"-framework",
       
 16623 +					Foundation,
       
 16624 +					"-framework",
       
 16625 +					AppKit,
       
 16626 +				);
       
 16627 +				PREBINDING = NO;
       
 16628 +				PRODUCT_NAME = BreakpadTest;
       
 16629 +				ZERO_LINK = NO;
       
 16630 +			};
       
 16631 +			name = Release;
       
 16632 +		};
       
 16633 +		F9C77DDC0F7DD5D00045F7DB /* Debug */ = {
       
 16634 +			isa = XCBuildConfiguration;
       
 16635 +			buildSettings = {
       
 16636 +				COPY_PHASE_STRIP = NO;
       
 16637 +				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
       
 16638 +				GCC_DYNAMIC_NO_PIC = NO;
       
 16639 +				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
       
 16640 +				GCC_MODEL_TUNING = G5;
       
 16641 +				GCC_OPTIMIZATION_LEVEL = 0;
       
 16642 +				GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Cocoa.framework/Headers/Cocoa.h";
       
 16643 +				INFOPLIST_FILE = "UnitTests-Info.plist";
       
 16644 +				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
       
 16645 +				OTHER_LDFLAGS = (
       
 16646 +					"-framework",
       
 16647 +					Cocoa,
       
 16648 +					"-framework",
       
 16649 +					SenTestingKit,
       
 16650 +				);
       
 16651 +				PREBINDING = NO;
       
 16652 +				PRODUCT_NAME = UnitTests;
       
 16653 +				USER_HEADER_SEARCH_PATHS = "../../ ../../common/mac/**";
       
 16654 +				WRAPPER_EXTENSION = octest;
       
 16655 +			};
       
 16656 +			name = Debug;
       
 16657 +		};
       
 16658 +		F9C77DDD0F7DD5D00045F7DB /* Release */ = {
       
 16659 +			isa = XCBuildConfiguration;
       
 16660 +			buildSettings = {
       
 16661 +				ALWAYS_SEARCH_USER_PATHS = NO;
       
 16662 +				COPY_PHASE_STRIP = YES;
       
 16663 +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
       
 16664 +				FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks";
       
 16665 +				GCC_ENABLE_FIX_AND_CONTINUE = NO;
       
 16666 +				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
       
 16667 +				GCC_MODEL_TUNING = G5;
       
 16668 +				INFOPLIST_FILE = "UnitTests-Info.plist";
       
 16669 +				INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles";
       
 16670 +				OTHER_LDFLAGS = (
       
 16671 +					"-framework",
       
 16672 +					Cocoa,
       
 16673 +					"-framework",
       
 16674 +					SenTestingKit,
       
 16675 +				);
       
 16676 +				PREBINDING = NO;
       
 16677 +				PRODUCT_NAME = UnitTests;
       
 16678 +				WRAPPER_EXTENSION = octest;
       
 16679 +				ZERO_LINK = NO;
       
 16680 +			};
       
 16681 +			name = Release;
       
 16682 +		};
       
 16683 +/* End XCBuildConfiguration section */
       
 16684 +
       
 16685 +/* Begin XCConfigurationList section */
       
 16686 +		1DEB91AD08733DA50010E9CD /* Build configuration list for PBXNativeTarget "Breakpad" */ = {
       
 16687 +			isa = XCConfigurationList;
       
 16688 +			buildConfigurations = (
       
 16689 +				1DEB91AE08733DA50010E9CD /* Debug */,
       
 16690 +				F93DE3BA0F830E7000608B94 /* Debug With Code Coverage */,
       
 16691 +				1DEB91AF08733DA50010E9CD /* Release */,
       
 16692 +			);
       
 16693 +			defaultConfigurationIsVisible = 0;
       
 16694 +			defaultConfigurationName = Release;
       
 16695 +		};
       
 16696 +		1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "Breakpad" */ = {
       
 16697 +			isa = XCConfigurationList;
       
 16698 +			buildConfigurations = (
       
 16699 +				1DEB91B208733DA50010E9CD /* Debug */,
       
 16700 +				F93DE3B90F830E7000608B94 /* Debug With Code Coverage */,
       
 16701 +				1DEB91B308733DA50010E9CD /* Release */,
       
 16702 +			);
       
 16703 +			defaultConfigurationIsVisible = 0;
       
 16704 +			defaultConfigurationName = Release;
       
 16705 +		};
       
 16706 +		F92C53580ECCE36D009BE4BA /* Build configuration list for PBXNativeTarget "Inspector" */ = {
       
 16707 +			isa = XCConfigurationList;
       
 16708 +			buildConfigurations = (
       
 16709 +				F92C53560ECCE34A009BE4BA /* Debug */,
       
 16710 +				F93DE3BB0F830E7000608B94 /* Debug With Code Coverage */,
       
 16711 +				F92C53570ECCE34A009BE4BA /* Release */,
       
 16712 +			);
       
 16713 +			defaultConfigurationIsVisible = 0;
       
 16714 +			defaultConfigurationName = Release;
       
 16715 +		};
       
 16716 +		F92C56670ECD11A3009BE4BA /* Build configuration list for PBXNativeTarget "breakpadUtilities" */ = {
       
 16717 +			isa = XCConfigurationList;
       
 16718 +			buildConfigurations = (
       
 16719 +				F92C563D0ECD10B3009BE4BA /* Debug */,
       
 16720 +				F93DE3BC0F830E7000608B94 /* Debug With Code Coverage */,
       
 16721 +				F92C563E0ECD10B3009BE4BA /* Release */,
       
 16722 +			);
       
 16723 +			defaultConfigurationIsVisible = 0;
       
 16724 +			defaultConfigurationName = Release;
       
 16725 +		};
       
 16726 +		F92C56A50ECE04A8009BE4BA /* Build configuration list for PBXNativeTarget "crash_report_sender" */ = {
       
 16727 +			isa = XCConfigurationList;
       
 16728 +			buildConfigurations = (
       
 16729 +				F92C56A30ECE04A8009BE4BA /* Debug */,
       
 16730 +				F93DE3BD0F830E7000608B94 /* Debug With Code Coverage */,
       
 16731 +				F92C56A40ECE04A8009BE4BA /* Release */,
       
 16732 +			);
       
 16733 +			defaultConfigurationIsVisible = 0;
       
 16734 +			defaultConfigurationName = Release;
       
 16735 +		};
       
 16736 +		F93803C40F80822E004D428B /* Build configuration list for PBXNativeTarget "generator_test" */ = {
       
 16737 +			isa = XCConfigurationList;
       
 16738 +			buildConfigurations = (
       
 16739 +				F93803C00F808210004D428B /* Debug */,
       
 16740 +				F93DE3C10F830E7000608B94 /* Debug With Code Coverage */,
       
 16741 +				F93803C10F808210004D428B /* Release */,
       
 16742 +			);
       
 16743 +			defaultConfigurationIsVisible = 0;
       
 16744 +			defaultConfigurationName = Release;
       
 16745 +		};
       
 16746 +		F93DE2D60F82A67700608B94 /* Build configuration list for PBXNativeTarget "minidump_file_writer_unittest" */ = {
       
 16747 +			isa = XCConfigurationList;
       
 16748 +			buildConfigurations = (
       
 16749 +				F93DE2D30F82A67400608B94 /* Debug */,
       
 16750 +				F93DE3C20F830E7000608B94 /* Debug With Code Coverage */,
       
 16751 +				F93DE2D40F82A67400608B94 /* Release */,
       
 16752 +			);
       
 16753 +			defaultConfigurationIsVisible = 0;
       
 16754 +			defaultConfigurationName = Release;
       
 16755 +		};
       
 16756 +		F93DE3320F82C5D800608B94 /* Build configuration list for PBXNativeTarget "handler_test" */ = {
       
 16757 +			isa = XCConfigurationList;
       
 16758 +			buildConfigurations = (
       
 16759 +				F93DE32E0F82C55700608B94 /* Debug */,
       
 16760 +				F93DE3C30F830E7000608B94 /* Debug With Code Coverage */,
       
 16761 +				F93DE32F0F82C55700608B94 /* Release */,
       
 16762 +			);
       
 16763 +			defaultConfigurationIsVisible = 0;
       
 16764 +			defaultConfigurationName = Release;
       
 16765 +		};
       
 16766 +		F94585930F78235C009A47BF /* Build configuration list for PBXAggregateTarget "All" */ = {
       
 16767 +			isa = XCConfigurationList;
       
 16768 +			buildConfigurations = (
       
 16769 +				F94585850F782326009A47BF /* Debug */,
       
 16770 +				F93DE3BF0F830E7000608B94 /* Debug With Code Coverage */,
       
 16771 +				F94585860F782326009A47BF /* Release */,
       
 16772 +			);
       
 16773 +			defaultConfigurationIsVisible = 0;
       
 16774 +			defaultConfigurationName = Release;
       
 16775 +		};
       
 16776 +		F9C44DAA0EF060A9003AEBAA /* Build configuration list for PBXNativeTarget "BreakpadTest" */ = {
       
 16777 +			isa = XCConfigurationList;
       
 16778 +			buildConfigurations = (
       
 16779 +				F9C44DA80EF060A8003AEBAA /* Debug */,
       
 16780 +				F93DE3BE0F830E7000608B94 /* Debug With Code Coverage */,
       
 16781 +				F9C44DA90EF060A8003AEBAA /* Release */,
       
 16782 +			);
       
 16783 +			defaultConfigurationIsVisible = 0;
       
 16784 +			defaultConfigurationName = Release;
       
 16785 +		};
       
 16786 +		F9C77DDE0F7DD5D00045F7DB /* Build configuration list for PBXNativeTarget "UnitTests" */ = {
       
 16787 +			isa = XCConfigurationList;
       
 16788 +			buildConfigurations = (
       
 16789 +				F9C77DDC0F7DD5D00045F7DB /* Debug */,
       
 16790 +				F93DE3C00F830E7000608B94 /* Debug With Code Coverage */,
       
 16791 +				F9C77DDD0F7DD5D00045F7DB /* Release */,
       
 16792 +			);
       
 16793 +			defaultConfigurationIsVisible = 0;
       
 16794 +			defaultConfigurationName = Release;
       
 16795 +		};
       
 16796 +/* End XCConfigurationList section */
       
 16797 +	};
       
 16798 +	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
       
 16799 +}
       
 16800 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.h b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.h
       
 16801 new file mode 100644
       
 16802 --- /dev/null
       
 16803 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.h
       
 16804 @@ -0,0 +1,310 @@
       
 16805 +// Copyright (c) 2006, Google Inc.
       
 16806 +// All rights reserved.
       
 16807 +//
       
 16808 +// Redistribution and use in source and binary forms, with or without
       
 16809 +// modification, are permitted provided that the following conditions are
       
 16810 +// met:
       
 16811 +//
       
 16812 +//     * Redistributions of source code must retain the above copyright
       
 16813 +// notice, this list of conditions and the following disclaimer.
       
 16814 +//     * Redistributions in binary form must reproduce the above
       
 16815 +// copyright notice, this list of conditions and the following disclaimer
       
 16816 +// in the documentation and/or other materials provided with the
       
 16817 +// distribution.
       
 16818 +//     * Neither the name of Google Inc. nor the names of its
       
 16819 +// contributors may be used to endorse or promote products derived from
       
 16820 +// this software without specific prior written permission.
       
 16821 +//
       
 16822 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 16823 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 16824 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 16825 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 16826 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 16827 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 16828 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 16829 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 16830 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 16831 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 16832 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 16833 +//
       
 16834 +// Framework to provide a simple C API to crash reporting for
       
 16835 +// applications.  By default, if any machine-level exception (e.g.,
       
 16836 +// EXC_BAD_ACCESS) occurs, it will be handled by the BreakpadRef
       
 16837 +// object as follows:
       
 16838 +//
       
 16839 +// 1. Create a minidump file (see Breakpad for details)
       
 16840 +// 2. Prompt the user (using CFUserNotification)
       
 16841 +// 3. Invoke a command line reporting tool to send the minidump to a
       
 16842 +//    server
       
 16843 +//
       
 16844 +// By specifying parameters to the BreakpadCreate function, you can
       
 16845 +// modify the default behavior to suit your needs and wants and
       
 16846 +// desires.
       
 16847 +
       
 16848 +typedef void *BreakpadRef;
       
 16849 +
       
 16850 +#ifdef __cplusplus
       
 16851 +extern "C" {
       
 16852 +#endif
       
 16853 +
       
 16854 +#include <CoreFoundation/CoreFoundation.h>
       
 16855 +#include <Foundation/Foundation.h>
       
 16856 +
       
 16857 +  // Keys for configuration file
       
 16858 +#define kReporterMinidumpDirectoryKey "MinidumpDir"
       
 16859 +#define kReporterMinidumpIDKey        "MinidumpID"
       
 16860 +
       
 16861 +// The default subdirectory of the Library to put crash dumps in
       
 16862 +// The subdirectory is
       
 16863 +//  ~/Library/<kDefaultLibrarySubdirectory>/<GoogleBreakpadProduct>
       
 16864 +#define kDefaultLibrarySubdirectory   "Breakpad"
       
 16865 +
       
 16866 +// Specify some special keys to be used in the configuration file that is
       
 16867 +// generated by Breakpad and consumed by the crash_sender.
       
 16868 +#define BREAKPAD_PRODUCT               "BreakpadProduct"
       
 16869 +#define BREAKPAD_PRODUCT_DISPLAY       "BreakpadProductDisplay"
       
 16870 +#define BREAKPAD_VERSION               "BreakpadVersion"
       
 16871 +#define BREAKPAD_VENDOR                "BreakpadVendor"
       
 16872 +#define BREAKPAD_URL                   "BreakpadURL"
       
 16873 +#define BREAKPAD_REPORT_INTERVAL       "BreakpadReportInterval"
       
 16874 +#define BREAKPAD_SKIP_CONFIRM          "BreakpadSkipConfirm"
       
 16875 +#define BREAKPAD_CONFIRM_TIMEOUT       "BreakpadConfirmTimeout"
       
 16876 +#define BREAKPAD_SEND_AND_EXIT         "BreakpadSendAndExit"
       
 16877 +#define BREAKPAD_DUMP_DIRECTORY        "BreakpadMinidumpLocation"
       
 16878 +#define BREAKPAD_INSPECTOR_LOCATION    "BreakpadInspectorLocation"
       
 16879 +#define BREAKPAD_REPORTER_EXE_LOCATION \
       
 16880 +  "BreakpadReporterExeLocation"
       
 16881 +#define BREAKPAD_LOGFILES              "BreakpadLogFiles"
       
 16882 +#define BREAKPAD_LOGFILE_UPLOAD_SIZE   "BreakpadLogFileTailSize"
       
 16883 +#define BREAKPAD_REQUEST_COMMENTS      "BreakpadRequestComments"
       
 16884 +#define BREAKPAD_COMMENTS              "BreakpadComments"
       
 16885 +#define BREAKPAD_REQUEST_EMAIL         "BreakpadRequestEmail"
       
 16886 +#define BREAKPAD_EMAIL                 "BreakpadEmail"
       
 16887 +#define BREAKPAD_SERVER_TYPE           "BreakpadServerType"
       
 16888 +#define BREAKPAD_SERVER_PARAMETER_DICT "BreakpadServerParameters"
       
 16889 +
       
 16890 +// The keys below are NOT user supplied, and are used internally.
       
 16891 +#define BREAKPAD_PROCESS_START_TIME       "BreakpadProcStartTime"
       
 16892 +#define BREAKPAD_PROCESS_UP_TIME          "BreakpadProcessUpTime"
       
 16893 +#define BREAKPAD_PROCESS_CRASH_TIME       "BreakpadProcessCrashTime"
       
 16894 +#define BREAKPAD_LOGFILE_KEY_PREFIX       "BreakpadAppLogFile"
       
 16895 +#define BREAKPAD_SERVER_PARAMETER_PREFIX  "BreakpadServerParameterPrefix_"
       
 16896 +#define BREAKPAD_ON_DEMAND                "BreakpadOnDemand"
       
 16897 +
       
 16898 +// Optional user-defined function to dec to decide if we should handle
       
 16899 +// this crash or forward it along.
       
 16900 +// Return true if you want Breakpad to handle it.
       
 16901 +// Return false if you want Breakpad to skip it
       
 16902 +// The exception handler always returns false, as if SEND_AND_EXIT were false
       
 16903 +// (which means the next exception handler will take the exception)
       
 16904 +typedef bool (*BreakpadFilterCallback)(int exception_type,
       
 16905 +                                       int exception_code,
       
 16906 +                                       mach_port_t crashing_thread,
       
 16907 +                                       void *context);
       
 16908 +
       
 16909 +// Create a new BreakpadRef object and install it as an exception
       
 16910 +// handler.  The |parameters| will typically be the contents of your
       
 16911 +// bundle's Info.plist.
       
 16912 +//
       
 16913 +// You can also specify these additional keys for customizable behavior:
       
 16914 +// Key:                           Value:
       
 16915 +// BREAKPAD_PRODUCT               Product name (e.g., "MyAwesomeProduct")
       
 16916 +//                                This one is used as the key to identify
       
 16917 +//                                the product when uploading
       
 16918 +//                                REQUIRED
       
 16919 +//
       
 16920 +// BREAKPAD_PRODUCT_DISPLAY       This is the display name, e.g. a pretty
       
 16921 +//                                name for the product when the crash_sender
       
 16922 +//                                pops up UI for the user.  Falls back to
       
 16923 +//                                BREAKPAD_PRODUCT if not specified.
       
 16924 +//
       
 16925 +// BREAKPAD_VERSION               Product version (e.g., 1.2.3), used
       
 16926 +//                                as metadata for crash report
       
 16927 +//                                REQUIRED
       
 16928 +//
       
 16929 +// BREAKPAD_VENDOR                Vendor name, used in UI (e.g. "A report has
       
 16930 +//                                been created that you can send to <vendor>")
       
 16931 +//
       
 16932 +// BREAKPAD_URL                   URL destination for reporting
       
 16933 +//                                REQUIRED
       
 16934 +//
       
 16935 +// BREAKPAD_REPORT_INTERVAL       # of seconds between sending
       
 16936 +//                                reports.  If an additional report is
       
 16937 +//                                generated within this time, it will
       
 16938 +//                                be ignored.  Default: 3600sec.
       
 16939 +//                                Specify 0 to send all reports.
       
 16940 +//
       
 16941 +// BREAKPAD_SKIP_CONFIRM          If true, the reporter will send the report
       
 16942 +//                                without any user intervention.
       
 16943 +//                                Defaults to NO
       
 16944 +//
       
 16945 +// BREAKPAD_CONFIRM_TIMEOUT       Number of seconds before the upload
       
 16946 +//                                confirmation dialog will be automatically
       
 16947 +//                                dismissed (cancelling the upload).
       
 16948 +//                                Default: 300 seconds (min of 60).
       
 16949 +//                                Specify 0 to prevent timeout.
       
 16950 +//
       
 16951 +// BREAKPAD_SEND_AND_EXIT         If true, the handler will exit after sending.
       
 16952 +//                                This will prevent any other handler (e.g.,
       
 16953 +//                                CrashReporter) from getting the crash.
       
 16954 +//                                Defaults TO YES
       
 16955 +//
       
 16956 +// BREAKPAD_DUMP_DIRECTORY        The directory to store crash-dumps
       
 16957 +//                                in. By default, we use
       
 16958 +//                                ~/Library/Breakpad/<BREAKPAD_PRODUCT>
       
 16959 +//                                The path you specify here is tilde-expanded.
       
 16960 +//
       
 16961 +// BREAKPAD_INSPECTOR_LOCATION    The full path to the Inspector executable.
       
 16962 +//                                Defaults to <Framework resources>/Inspector
       
 16963 +//
       
 16964 +// BREAKPAD_REPORTER_EXE_LOCATION The full path to the Reporter/sender
       
 16965 +//                                executable.
       
 16966 +//                                Default:
       
 16967 +//                                <Framework Resources>/crash_report_sender.app
       
 16968 +//
       
 16969 +// BREAKPAD_LOGFILES              Indicates an array of log file paths that
       
 16970 +//                                should be uploaded at crash time.
       
 16971 +//
       
 16972 +// BREAKPAD_REQUEST_COMMENTS      If true, the message dialog will have a
       
 16973 +//                                text box for the user to enter comments.
       
 16974 +//                                Default: NO
       
 16975 +//
       
 16976 +// BREAKPAD_REQUEST_EMAIL         If true and BREAKPAD_REQUEST_COMMENTS is also
       
 16977 +//                                true, the message dialog will have a text
       
 16978 +//                                box for the user to enter their email address.
       
 16979 +//                                Default: NO
       
 16980 +//
       
 16981 +// BREAKPAD_SERVER_TYPE           A parameter that tells Breakpad how to
       
 16982 +//                                rewrite the upload parameters for a specific
       
 16983 +//                                server type.  The currently valid values are
       
 16984 +//                                'socorro' or 'google'.  If you want to add
       
 16985 +//                                other types, see the function in
       
 16986 +//                                crash_report_sender.m that maps parameters to
       
 16987 +//                                URL parameters.  Defaults to 'google'.
       
 16988 +//
       
 16989 +// BREAKPAD_SERVER_PARAMETER_DICT A plist dictionary of static
       
 16990 +//                                parameters that are uploaded to the
       
 16991 +//                                server.  The parameters are sent as
       
 16992 +//                                is to the crash server.  Their
       
 16993 +//                                content isn't added to the minidump
       
 16994 +//                                but pass as URL parameters when
       
 16995 +//                                uploading theminidump to the crash
       
 16996 +//                                server.
       
 16997 +//=============================================================================
       
 16998 +// The BREAKPAD_PRODUCT, BREAKPAD_VERSION and BREAKPAD_URL are
       
 16999 +// required to have non-NULL values.  By default, the BREAKPAD_PRODUCT
       
 17000 +// will be the CFBundleName and the BREAKPAD_VERSION will be the
       
 17001 +// CFBundleVersion when these keys are present in the bundle's
       
 17002 +// Info.plist, which is usually passed in to BreakpadCreate() as an
       
 17003 +// NSDictionary (you could also pass in another dictionary that had
       
 17004 +// the same keys configured).  If the BREAKPAD_PRODUCT or
       
 17005 +// BREAKPAD_VERSION are ultimately undefined, BreakpadCreate() will
       
 17006 +// fail.  You have been warned.
       
 17007 +//
       
 17008 +// If you are running in a debugger, Breakpad will not install, unless the
       
 17009 +// BREAKPAD_IGNORE_DEBUGGER envionment variable is set and/or non-zero.
       
 17010 +//
       
 17011 +// The BREAKPAD_SKIP_CONFIRM and BREAKPAD_SEND_AND_EXIT default
       
 17012 +// values are NO and YES.  However, they can be controlled by setting their
       
 17013 +// values in a user or global plist.
       
 17014 +//
       
 17015 +// It's easiest to use Breakpad via the Framework, but if you're compiling the
       
 17016 +// code in directly, BREAKPAD_INSPECTOR_LOCATION and
       
 17017 +// BREAKPAD_REPORTER_EXE_LOCATION allow you to specify custom paths
       
 17018 +// to the helper executables.
       
 17019 +//
       
 17020 +//=============================================================================
       
 17021 +// The following are NOT user-supplied but are documented here for
       
 17022 +// completeness.  They are calculated by Breakpad during initialization &
       
 17023 +// crash-dump generation, or entered in by the user.
       
 17024 +//
       
 17025 +// BREAKPAD_PROCESS_START_TIME       The time the process started.
       
 17026 +//
       
 17027 +// BREAKPAD_PROCESS_CRASH_TIME       The time the process crashed.
       
 17028 +//
       
 17029 +// BREAKPAD_PROCESS_UP_TIME          The total time the process has been
       
 17030 +//                                   running.  This parameter is not set
       
 17031 +//                                   until the crash-dump-generation phase.
       
 17032 +//
       
 17033 +// BREAKPAD_LOGFILE_KEY_PREFIX       Used to find out which parameters in the
       
 17034 +//                                   parameter dictionary correspond to log
       
 17035 +//                                   file paths.
       
 17036 +//
       
 17037 +// BREAKPAD_SERVER_PARAMETER_PREFIX  This prefix is used by Breakpad
       
 17038 +//                                   internally, because Breakpad uses
       
 17039 +//                                   the same dictionary internally to
       
 17040 +//                                   track both its internal
       
 17041 +//                                   configuration parameters and
       
 17042 +//                                   parameters meant to be uploaded
       
 17043 +//                                   to the server.  This string is
       
 17044 +//                                   used internally by Breakpad to
       
 17045 +//                                   prefix user-supplied parameter
       
 17046 +//                                   names so those can be sent to the
       
 17047 +//                                   server without leaking Breakpad's
       
 17048 +//                                   internal values.
       
 17049 +//
       
 17050 +// BREAKPAD_ON_DEMAND                Used internally to indicate to the
       
 17051 +//                                   Reporter that we're sending on-demand,
       
 17052 +//                                   not as result of a crash.
       
 17053 +//
       
 17054 +// BREAKPAD_COMMENTS                 The text the user provided as comments.
       
 17055 +//                                   Only used in crash_report_sender.
       
 17056 +
       
 17057 +// Returns a new BreakpadRef object on success, NULL otherwise.
       
 17058 +BreakpadRef BreakpadCreate(NSDictionary *parameters);
       
 17059 +
       
 17060 +// Uninstall and release the data associated with |ref|.
       
 17061 +void BreakpadRelease(BreakpadRef ref);
       
 17062 +
       
 17063 +// Clients may set an optional callback which gets called when a crash
       
 17064 +// occurs.  The callback function should return |true| if we should
       
 17065 +// handle the crash, generate a crash report, etc. or |false| if we
       
 17066 +// should ignore it and forward the crash (normally to CrashReporter).
       
 17067 +// Context is a pointer to arbitrary data to make the callback with.
       
 17068 +void BreakpadSetFilterCallback(BreakpadRef ref,
       
 17069 +                               BreakpadFilterCallback callback,
       
 17070 +                               void *context);
       
 17071 +
       
 17072 +// User defined key and value string storage.  Generally this is used
       
 17073 +// to configure Breakpad's internal operation, such as whether the
       
 17074 +// crash_sender should prompt the user, or the filesystem location for
       
 17075 +// the minidump file.  See Breakpad.h for some parameters that can be
       
 17076 +// set.  Anything longer than 255 bytes will be truncated. Note that
       
 17077 +// the string is converted to UTF8 before truncation, so any multibyte
       
 17078 +// character that straddles the 255(256 - 1 for terminator) byte limit
       
 17079 +// will be mangled.
       
 17080 +//
       
 17081 +// A maximum number of 64 key/value pairs are supported.  An assert()
       
 17082 +// will fire if more than this number are set.  Unfortunately, right
       
 17083 +// now, the same dictionary is used for both Breakpad's parameters AND
       
 17084 +// the Upload parameters.
       
 17085 +//
       
 17086 +// TODO (nealsid): Investigate how necessary this is if we don't
       
 17087 +// automatically upload parameters to the server anymore.
       
 17088 +// TODO (nealsid): separate server parameter dictionary from the
       
 17089 +// dictionary used to configure Breakpad, and document limits for each
       
 17090 +// independently.
       
 17091 +void BreakpadSetKeyValue(BreakpadRef ref, NSString *key, NSString *value);
       
 17092 +NSString *BreakpadKeyValue(BreakpadRef ref, NSString *key);
       
 17093 +void BreakpadRemoveKeyValue(BreakpadRef ref, NSString *key);
       
 17094 +
       
 17095 +// You can use this method to specify parameters that will be uploaded
       
 17096 +// to the crash server.  They will be automatically encoded as
       
 17097 +// necessary.  Note that as mentioned above there are limits on both
       
 17098 +// the number of keys and their length.
       
 17099 +void BreakpadAddUploadParameter(BreakpadRef ref, NSString *key,
       
 17100 +                                NSString *value);
       
 17101 +
       
 17102 +// This method will remove a previously-added parameter from the
       
 17103 +// upload parameter set.
       
 17104 +void BreakpadRemoveUploadParameter(BreakpadRef ref, NSString *key);
       
 17105 +
       
 17106 +// Add a log file for Breakpad to read and send upon crash dump
       
 17107 +void BreakpadAddLogFile(BreakpadRef ref, NSString *logPathname);
       
 17108 +
       
 17109 +// Generate a minidump and send
       
 17110 +void BreakpadGenerateAndSendReport(BreakpadRef ref);
       
 17111 +
       
 17112 +#ifdef __cplusplus
       
 17113 +}
       
 17114 +#endif
       
 17115 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.mm b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.mm
       
 17116 new file mode 100644
       
 17117 --- /dev/null
       
 17118 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad.mm
       
 17119 @@ -0,0 +1,993 @@
       
 17120 +// Copyright (c) 2006, Google Inc.
       
 17121 +// All rights reserved.
       
 17122 +//
       
 17123 +// Redistribution and use in source and binary forms, with or without
       
 17124 +// modification, are permitted provided that the following conditions are
       
 17125 +// met:
       
 17126 +//
       
 17127 +//     * Redistributions of source code must retain the above copyright
       
 17128 +// notice, this list of conditions and the following disclaimer.
       
 17129 +//     * Redistributions in binary form must reproduce the above
       
 17130 +// copyright notice, this list of conditions and the following disclaimer
       
 17131 +// in the documentation and/or other materials provided with the
       
 17132 +// distribution.
       
 17133 +//     * Neither the name of Google Inc. nor the names of its
       
 17134 +// contributors may be used to endorse or promote products derived from
       
 17135 +// this software without specific prior written permission.
       
 17136 +//
       
 17137 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 17138 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 17139 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 17140 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 17141 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 17142 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 17143 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 17144 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 17145 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 17146 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 17147 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 17148 +//
       
 17149 +
       
 17150 +#define VERBOSE 0
       
 17151 +
       
 17152 +#if VERBOSE
       
 17153 +  static bool gDebugLog = true;
       
 17154 +#else
       
 17155 +  static bool gDebugLog = false;
       
 17156 +#endif
       
 17157 +
       
 17158 +#define DEBUGLOG if (gDebugLog) fprintf
       
 17159 +#define IGNORE_DEBUGGER "BREAKPAD_IGNORE_DEBUGGER"
       
 17160 +
       
 17161 +#import "common/mac/MachIPC.h"
       
 17162 +#import "common/mac/SimpleStringDictionary.h"
       
 17163 +
       
 17164 +#import "client/mac/crash_generation/Inspector.h"
       
 17165 +#import "client/mac/handler/exception_handler.h"
       
 17166 +#import "client/mac/Framework/Breakpad.h"
       
 17167 +#import "client/mac/Framework/OnDemandServer.h"
       
 17168 +#import "client/mac/handler/protected_memory_allocator.h"
       
 17169 +
       
 17170 +#import <sys/stat.h>
       
 17171 +#import <sys/sysctl.h>
       
 17172 +
       
 17173 +#import <Foundation/Foundation.h>
       
 17174 +
       
 17175 +
       
 17176 +using google_breakpad::KeyValueEntry;
       
 17177 +using google_breakpad::SimpleStringDictionary;
       
 17178 +using google_breakpad::SimpleStringDictionaryIterator;
       
 17179 +
       
 17180 +//=============================================================================
       
 17181 +// We want any memory allocations which are used by breakpad during the
       
 17182 +// exception handling process (after a crash has happened) to be read-only
       
 17183 +// to prevent them from being smashed before a crash occurs.  Unfortunately
       
 17184 +// we cannot protect against smashes to our exception handling thread's
       
 17185 +// stack.
       
 17186 +//
       
 17187 +// NOTE: Any memory allocations which are not used during the exception
       
 17188 +// handling process may be allocated in the normal ways.
       
 17189 +//
       
 17190 +// The ProtectedMemoryAllocator class provides an Allocate() method which
       
 17191 +// we'll using in conjunction with placement operator new() to control
       
 17192 +// allocation of C++ objects.  Note that we don't use operator delete()
       
 17193 +// but instead call the objects destructor directly:  object->~ClassName();
       
 17194 +//
       
 17195 +ProtectedMemoryAllocator *gMasterAllocator = NULL;
       
 17196 +ProtectedMemoryAllocator *gKeyValueAllocator = NULL;
       
 17197 +ProtectedMemoryAllocator *gBreakpadAllocator = NULL;
       
 17198 +
       
 17199 +// Mutex for thread-safe access to the key/value dictionary used by breakpad.
       
 17200 +// It's a global instead of an instance variable of Breakpad
       
 17201 +// since it can't live in a protected memory area.
       
 17202 +pthread_mutex_t gDictionaryMutex;
       
 17203 +
       
 17204 +//=============================================================================
       
 17205 +// Stack-based object for thread-safe access to a memory-protected region.
       
 17206 +// It's assumed that normally the memory block (allocated by the allocator)
       
 17207 +// is protected (read-only).  Creating a stack-based instance of
       
 17208 +// ProtectedMemoryLocker will unprotect this block after taking the lock.
       
 17209 +// Its destructor will first re-protect the memory then release the lock.
       
 17210 +class ProtectedMemoryLocker {
       
 17211 +public:
       
 17212 +  // allocator may be NULL, in which case no Protect() or Unprotect() calls
       
 17213 +  // will be made, but a lock will still be taken
       
 17214 +  ProtectedMemoryLocker(pthread_mutex_t *mutex,
       
 17215 +                        ProtectedMemoryAllocator *allocator)
       
 17216 +  : mutex_(mutex), allocator_(allocator) {
       
 17217 +    // Lock the mutex
       
 17218 +    assert(pthread_mutex_lock(mutex_) == 0);
       
 17219 +
       
 17220 +    // Unprotect the memory
       
 17221 +    if (allocator_ ) {
       
 17222 +      allocator_->Unprotect();
       
 17223 +    }
       
 17224 +  }
       
 17225 +
       
 17226 +  ~ProtectedMemoryLocker() {
       
 17227 +    // First protect the memory
       
 17228 +    if (allocator_) {
       
 17229 +      allocator_->Protect();
       
 17230 +    }
       
 17231 +
       
 17232 +    // Then unlock the mutex
       
 17233 +    assert(pthread_mutex_unlock(mutex_) == 0);
       
 17234 +  };
       
 17235 +
       
 17236 +private:
       
 17237 +  //  Keep anybody from ever creating one of these things not on the stack.
       
 17238 +  ProtectedMemoryLocker() { }
       
 17239 +  ProtectedMemoryLocker(const ProtectedMemoryLocker&);
       
 17240 +  ProtectedMemoryLocker & operator=(ProtectedMemoryLocker&);
       
 17241 +
       
 17242 +  pthread_mutex_t           *mutex_;
       
 17243 +  ProtectedMemoryAllocator  *allocator_;
       
 17244 +};
       
 17245 +
       
 17246 +//=============================================================================
       
 17247 +class Breakpad {
       
 17248 + public:
       
 17249 +  // factory method
       
 17250 +  static Breakpad *Create(NSDictionary *parameters) {
       
 17251 +    // Allocate from our special allocation pool
       
 17252 +    Breakpad *breakpad =
       
 17253 +      new (gBreakpadAllocator->Allocate(sizeof(Breakpad)))
       
 17254 +        Breakpad();
       
 17255 +
       
 17256 +    if (!breakpad)
       
 17257 +      return NULL;
       
 17258 +
       
 17259 +    if (!breakpad->Initialize(parameters)) {
       
 17260 +      // Don't use operator delete() here since we allocated from special pool
       
 17261 +      breakpad->~Breakpad();
       
 17262 +      return NULL;
       
 17263 +    }
       
 17264 +
       
 17265 +    return breakpad;
       
 17266 +  }
       
 17267 +
       
 17268 +  ~Breakpad();
       
 17269 +
       
 17270 +  void SetKeyValue(NSString *key, NSString *value);
       
 17271 +  NSString *KeyValue(NSString *key);
       
 17272 +  void RemoveKeyValue(NSString *key);
       
 17273 +
       
 17274 +  void GenerateAndSendReport();
       
 17275 +
       
 17276 +  void SetFilterCallback(BreakpadFilterCallback callback, void *context) {
       
 17277 +    filter_callback_ = callback;
       
 17278 +    filter_callback_context_ = context;
       
 17279 +  }
       
 17280 +
       
 17281 + private:
       
 17282 +  Breakpad()
       
 17283 +    : handler_(NULL),
       
 17284 +      config_params_(NULL),
       
 17285 +      send_and_exit_(true),
       
 17286 +      filter_callback_(NULL), 
       
 17287 +      filter_callback_context_(NULL) {
       
 17288 +    inspector_path_[0] = 0;
       
 17289 +  }
       
 17290 +
       
 17291 +  bool Initialize(NSDictionary *parameters);
       
 17292 +
       
 17293 +  bool ExtractParameters(NSDictionary *parameters);
       
 17294 +
       
 17295 +  // Dispatches to HandleException()
       
 17296 +  static bool ExceptionHandlerDirectCallback(void *context,
       
 17297 +                                             int exception_type,
       
 17298 +                                             int exception_code,
       
 17299 +                                             int exception_subcode,
       
 17300 +                                             mach_port_t crashing_thread);
       
 17301 +
       
 17302 +  bool HandleException(int exception_type,
       
 17303 +                       int exception_code,
       
 17304 +                       int exception_subcode,
       
 17305 +                       mach_port_t crashing_thread);
       
 17306 +
       
 17307 +  // Since ExceptionHandler (w/o namespace) is defined as typedef in OSX's
       
 17308 +  // MachineExceptions.h, we have to explicitly name the handler.
       
 17309 +  google_breakpad::ExceptionHandler *handler_; // The actual handler (STRONG)
       
 17310 +
       
 17311 +  char                    inspector_path_[PATH_MAX];  // Path to inspector tool
       
 17312 +
       
 17313 +  SimpleStringDictionary  *config_params_; // Create parameters (STRONG)
       
 17314 +
       
 17315 +  OnDemandServer          inspector_;
       
 17316 +
       
 17317 +  bool                    send_and_exit_;  // Exit after sending, if true
       
 17318 +
       
 17319 +  BreakpadFilterCallback  filter_callback_;
       
 17320 +  void                    *filter_callback_context_;
       
 17321 +};
       
 17322 +
       
 17323 +#pragma mark -
       
 17324 +#pragma mark Helper functions
       
 17325 +
       
 17326 +//=============================================================================
       
 17327 +// Helper functions
       
 17328 +
       
 17329 +//=============================================================================
       
 17330 +static BOOL IsDebuggerActive() {
       
 17331 +  BOOL result = NO;
       
 17332 +  NSUserDefaults *stdDefaults = [NSUserDefaults standardUserDefaults];
       
 17333 +
       
 17334 +  // We check both defaults and the environment variable here
       
 17335 +
       
 17336 +  BOOL ignoreDebugger = [stdDefaults boolForKey:@IGNORE_DEBUGGER];
       
 17337 +
       
 17338 +  if (!ignoreDebugger) {
       
 17339 +    char *ignoreDebuggerStr = getenv(IGNORE_DEBUGGER);
       
 17340 +    ignoreDebugger = (ignoreDebuggerStr ? strtol(ignoreDebuggerStr, NULL, 10) : 0) != 0;
       
 17341 +  }
       
 17342 +
       
 17343 +  if (!ignoreDebugger) {
       
 17344 +    pid_t pid = getpid();
       
 17345 +    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
       
 17346 +    int mibSize = sizeof(mib) / sizeof(int);
       
 17347 +    size_t actualSize;
       
 17348 +
       
 17349 +    if (sysctl(mib, mibSize, NULL, &actualSize, NULL, 0) == 0) {
       
 17350 +      struct kinfo_proc *info = (struct kinfo_proc *)malloc(actualSize);
       
 17351 +
       
 17352 +      if (info) {
       
 17353 +        // This comes from looking at the Darwin xnu Kernel
       
 17354 +        if (sysctl(mib, mibSize, info, &actualSize, NULL, 0) == 0)
       
 17355 +          result = (info->kp_proc.p_flag & P_TRACED) ? YES : NO;
       
 17356 +
       
 17357 +        free(info);
       
 17358 +      }
       
 17359 +    }
       
 17360 +  }
       
 17361 +
       
 17362 +  return result;
       
 17363 +}
       
 17364 +
       
 17365 +//=============================================================================
       
 17366 +bool Breakpad::ExceptionHandlerDirectCallback(void *context,
       
 17367 +                                                    int exception_type,
       
 17368 +                                                    int exception_code,
       
 17369 +                                                    int exception_subcode,
       
 17370 +                                                    mach_port_t crashing_thread) {
       
 17371 +  Breakpad *breakpad = (Breakpad *)context;
       
 17372 +
       
 17373 +  // If our context is damaged or something, just return false to indicate that
       
 17374 +  // the handler should continue without us.
       
 17375 +  if (!breakpad)
       
 17376 +    return false;
       
 17377 +
       
 17378 +  return breakpad->HandleException( exception_type,
       
 17379 +                                    exception_code,
       
 17380 +                                    exception_subcode,
       
 17381 +                                    crashing_thread);
       
 17382 +}
       
 17383 +
       
 17384 +//=============================================================================
       
 17385 +#pragma mark -
       
 17386 +
       
 17387 +#include <mach-o/dyld.h>
       
 17388 +
       
 17389 +//=============================================================================
       
 17390 +// Returns the pathname to the Resources directory for this version of
       
 17391 +// Breakpad which we are now running.
       
 17392 +//
       
 17393 +// Don't make the function static, since _dyld_lookup_and_bind_fully needs a
       
 17394 +// simple non-static C name
       
 17395 +//
       
 17396 +extern "C" {
       
 17397 +NSString * GetResourcePath();
       
 17398 +NSString * GetResourcePath() {
       
 17399 +  NSString *resourcePath = nil;
       
 17400 +
       
 17401 +  // If there are multiple breakpads installed then calling bundleWithIdentifier
       
 17402 +  // will not work properly, so only use that as a backup plan.
       
 17403 +  // We want to find the bundle containing the code where this function lives
       
 17404 +  // and work from there
       
 17405 +  //
       
 17406 +
       
 17407 +  // Get the pathname to the code which contains this function
       
 17408 +  void *address = nil;
       
 17409 +  NSModule module = nil;
       
 17410 +  _dyld_lookup_and_bind_fully("_GetResourcePath",
       
 17411 +                              &address,
       
 17412 +                              &module);
       
 17413 +
       
 17414 +  if (module && address) {
       
 17415 +    const char* moduleName = NSNameOfModule(module);
       
 17416 +    if (moduleName) {
       
 17417 +      // The "Resources" directory should be in the same directory as the
       
 17418 +      // executable code, since that's how the Breakpad framework is built.
       
 17419 +      resourcePath = [NSString stringWithUTF8String:moduleName];
       
 17420 +      resourcePath = [resourcePath stringByDeletingLastPathComponent];
       
 17421 +      resourcePath = [resourcePath stringByAppendingPathComponent:@"Resources/"];
       
 17422 +     } else {
       
 17423 +      DEBUGLOG(stderr, "Missing moduleName\n");
       
 17424 +    }
       
 17425 +  } else {
       
 17426 +    DEBUGLOG(stderr, "Could not find GetResourcePath\n");
       
 17427 +    // fallback plan
       
 17428 +    NSBundle *bundle =
       
 17429 +      [NSBundle bundleWithIdentifier:@"com.Google.BreakpadFramework"];
       
 17430 +    resourcePath = [bundle resourcePath];
       
 17431 +  }
       
 17432 +
       
 17433 +  return resourcePath;
       
 17434 +}
       
 17435 +}  // extern "C"
       
 17436 +
       
 17437 +//=============================================================================
       
 17438 +bool Breakpad::Initialize(NSDictionary *parameters) {
       
 17439 +  // Initialize
       
 17440 +  config_params_ = NULL;
       
 17441 +  handler_ = NULL;
       
 17442 +
       
 17443 +  // Check for debugger
       
 17444 +  if (IsDebuggerActive()) {
       
 17445 +    DEBUGLOG(stderr, "Debugger is active:  Not installing handler\n");
       
 17446 +    return true;
       
 17447 +  }
       
 17448 +
       
 17449 +  // Gather any user specified parameters
       
 17450 +  if (!ExtractParameters(parameters)) {
       
 17451 +    return false;
       
 17452 +  }
       
 17453 +
       
 17454 +  // Get path to Inspector executable.
       
 17455 +  NSString *inspectorPathString = KeyValue(@BREAKPAD_INSPECTOR_LOCATION);
       
 17456 +
       
 17457 +  // Standardize path (resolve symlinkes, etc.)  and escape spaces
       
 17458 +  inspectorPathString = [inspectorPathString stringByStandardizingPath];
       
 17459 +  inspectorPathString = [[inspectorPathString componentsSeparatedByString:@" "]
       
 17460 +                                              componentsJoinedByString:@"\\ "];
       
 17461 +
       
 17462 +  // Create an on-demand server object representing the Inspector.
       
 17463 +  // In case of a crash, we simply need to call the LaunchOnDemand()
       
 17464 +  // method on it, then send a mach message to its service port.
       
 17465 +  // It will then launch and perform a process inspection of our crashed state.
       
 17466 +  // See the HandleException() method for the details.
       
 17467 +#define RECEIVE_PORT_NAME "com.Breakpad.Inspector"
       
 17468 +
       
 17469 +  name_t portName;
       
 17470 +  snprintf(portName, sizeof(name_t),  "%s%d", RECEIVE_PORT_NAME, getpid());
       
 17471 +
       
 17472 +  // Save the location of the Inspector
       
 17473 +  strlcpy(inspector_path_, [inspectorPathString fileSystemRepresentation],
       
 17474 +          sizeof(inspector_path_));
       
 17475 +
       
 17476 +  // Append a single command-line argument to the Inspector path
       
 17477 +  // representing the bootstrap name of the launch-on-demand receive port.
       
 17478 +  // When the Inspector is launched, it can use this to lookup the port
       
 17479 +  // by calling bootstrap_check_in().
       
 17480 +  strlcat(inspector_path_, " ", sizeof(inspector_path_));
       
 17481 +  strlcat(inspector_path_, portName, sizeof(inspector_path_));
       
 17482 +
       
 17483 +  kern_return_t kr = inspector_.Initialize(inspector_path_,
       
 17484 +                                           portName,
       
 17485 +                                           true);        // shutdown on exit
       
 17486 +
       
 17487 +  if (kr != KERN_SUCCESS) {
       
 17488 +    return false;
       
 17489 +  }
       
 17490 +
       
 17491 +  // Create the handler (allocating it in our special protected pool)
       
 17492 +  handler_ =
       
 17493 +    new (gBreakpadAllocator->Allocate(sizeof(google_breakpad::ExceptionHandler)))
       
 17494 +      google_breakpad::ExceptionHandler(
       
 17495 +        Breakpad::ExceptionHandlerDirectCallback, this, true);
       
 17496 +  return true;
       
 17497 +}
       
 17498 +
       
 17499 +//=============================================================================
       
 17500 +Breakpad::~Breakpad() {
       
 17501 +  // Note that we don't use operator delete() on these pointers,
       
 17502 +  // since they were allocated by ProtectedMemoryAllocator objects.
       
 17503 +  //
       
 17504 +  if (config_params_) {
       
 17505 +    config_params_->~SimpleStringDictionary();
       
 17506 +  }
       
 17507 +
       
 17508 +  if (handler_)
       
 17509 +    handler_->~ExceptionHandler();
       
 17510 +}
       
 17511 +
       
 17512 +//=============================================================================
       
 17513 +bool Breakpad::ExtractParameters(NSDictionary *parameters) {
       
 17514 +  NSUserDefaults *stdDefaults = [NSUserDefaults standardUserDefaults];
       
 17515 +  NSString *skipConfirm = [stdDefaults stringForKey:@BREAKPAD_SKIP_CONFIRM];
       
 17516 +  NSString *sendAndExit = [stdDefaults stringForKey:@BREAKPAD_SEND_AND_EXIT];
       
 17517 +
       
 17518 +  NSString *serverType = [parameters objectForKey:@BREAKPAD_SERVER_TYPE];
       
 17519 +  NSString *display = [parameters objectForKey:@BREAKPAD_PRODUCT_DISPLAY];
       
 17520 +  NSString *product = [parameters objectForKey:@BREAKPAD_PRODUCT];
       
 17521 +  NSString *version = [parameters objectForKey:@BREAKPAD_VERSION];
       
 17522 +  NSString *urlStr = [parameters objectForKey:@BREAKPAD_URL];
       
 17523 +  NSString *interval = [parameters objectForKey:@BREAKPAD_REPORT_INTERVAL];
       
 17524 +  NSString *inspectorPathString =
       
 17525 +                [parameters objectForKey:@BREAKPAD_INSPECTOR_LOCATION];
       
 17526 +  NSString *reporterPathString =
       
 17527 +                [parameters objectForKey:@BREAKPAD_REPORTER_EXE_LOCATION];
       
 17528 +  NSString *timeout = [parameters objectForKey:@BREAKPAD_CONFIRM_TIMEOUT];
       
 17529 +  NSArray  *logFilePaths = [parameters objectForKey:@BREAKPAD_LOGFILES];
       
 17530 +  NSString *logFileTailSize = [parameters objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE];
       
 17531 +  NSString *requestUserText =
       
 17532 +                [parameters objectForKey:@BREAKPAD_REQUEST_COMMENTS];
       
 17533 +  NSString *requestEmail = [parameters objectForKey:@BREAKPAD_REQUEST_EMAIL];
       
 17534 +  NSString *vendor =
       
 17535 +    [parameters objectForKey:@BREAKPAD_VENDOR];
       
 17536 +  NSString *dumpSubdirectory =
       
 17537 +    [parameters objectForKey:@BREAKPAD_DUMP_DIRECTORY];
       
 17538 +
       
 17539 +  NSDictionary *serverParameters = 
       
 17540 +    [parameters objectForKey:@BREAKPAD_SERVER_PARAMETER_DICT];
       
 17541 +
       
 17542 +  // These may have been set above as user prefs, which take priority.
       
 17543 +  if (!skipConfirm) {
       
 17544 +    skipConfirm = [parameters objectForKey:@BREAKPAD_SKIP_CONFIRM];
       
 17545 +  }
       
 17546 +  if (!sendAndExit) {
       
 17547 +    sendAndExit = [parameters objectForKey:@BREAKPAD_SEND_AND_EXIT];
       
 17548 +  }
       
 17549 +
       
 17550 +  if (!product)
       
 17551 +    product = [parameters objectForKey:@"CFBundleName"];
       
 17552 +
       
 17553 +  if (!display)
       
 17554 +    display = product;
       
 17555 +
       
 17556 +  if (!version)
       
 17557 +    version = [parameters objectForKey:@"CFBundleVersion"];
       
 17558 +
       
 17559 +  if (!interval)
       
 17560 +    interval = @"3600";
       
 17561 +
       
 17562 +  if (!timeout)
       
 17563 +    timeout = @"300";
       
 17564 +
       
 17565 +  if (!logFileTailSize)
       
 17566 +    logFileTailSize = @"200000";
       
 17567 +
       
 17568 +  if (!vendor) {
       
 17569 +    vendor = @"Vendor not specified";
       
 17570 +  }
       
 17571 +
       
 17572 +  // Normalize the values.
       
 17573 +  if (skipConfirm) {
       
 17574 +    skipConfirm = [skipConfirm uppercaseString];
       
 17575 +
       
 17576 +    if ([skipConfirm isEqualToString:@"YES"] ||
       
 17577 +        [skipConfirm isEqualToString:@"TRUE"] ||
       
 17578 +        [skipConfirm isEqualToString:@"1"])
       
 17579 +      skipConfirm = @"YES";
       
 17580 +    else
       
 17581 +      skipConfirm = @"NO";
       
 17582 +  } else {
       
 17583 +    skipConfirm = @"NO";
       
 17584 +  }
       
 17585 +
       
 17586 +  send_and_exit_ = true;
       
 17587 +  if (sendAndExit) {
       
 17588 +    sendAndExit = [sendAndExit uppercaseString];
       
 17589 +
       
 17590 +    if ([sendAndExit isEqualToString:@"NO"] ||
       
 17591 +        [sendAndExit isEqualToString:@"FALSE"] ||
       
 17592 +        [sendAndExit isEqualToString:@"0"])
       
 17593 +      send_and_exit_ = false;
       
 17594 +  }
       
 17595 +
       
 17596 +  if (requestUserText) {
       
 17597 +    requestUserText = [requestUserText uppercaseString];
       
 17598 +
       
 17599 +    if ([requestUserText isEqualToString:@"YES"] ||
       
 17600 +        [requestUserText isEqualToString:@"TRUE"] ||
       
 17601 +        [requestUserText isEqualToString:@"1"])
       
 17602 +      requestUserText = @"YES";
       
 17603 +    else
       
 17604 +      requestUserText = @"NO";
       
 17605 +  } else {
       
 17606 +    requestUserText = @"NO";
       
 17607 +  }
       
 17608 +
       
 17609 +  // Find the helper applications if not specified in user config.
       
 17610 +  NSString *resourcePath = nil;
       
 17611 +  if (!inspectorPathString || !reporterPathString) {
       
 17612 +    resourcePath = GetResourcePath();
       
 17613 +    if (!resourcePath) {
       
 17614 +      DEBUGLOG(stderr, "Could not get resource path\n");
       
 17615 +      return false;
       
 17616 +    }
       
 17617 +  }
       
 17618 +
       
 17619 +  // Find Inspector.
       
 17620 +  if (!inspectorPathString) {
       
 17621 +    inspectorPathString =
       
 17622 +        [resourcePath stringByAppendingPathComponent:@"Inspector"];
       
 17623 +  }
       
 17624 +
       
 17625 +  // Verify that there is an Inspector tool.
       
 17626 +  if (![[NSFileManager defaultManager] fileExistsAtPath:inspectorPathString]) {
       
 17627 +    DEBUGLOG(stderr, "Cannot find Inspector tool\n");
       
 17628 +    return false;
       
 17629 +  }
       
 17630 +
       
 17631 +  // Find Reporter.
       
 17632 +  if (!reporterPathString) {
       
 17633 +    reporterPathString =
       
 17634 +      [resourcePath stringByAppendingPathComponent:@"crash_report_sender.app"];
       
 17635 +    reporterPathString = [[NSBundle bundleWithPath:reporterPathString] executablePath];
       
 17636 +  }
       
 17637 +
       
 17638 +  // Verify that there is a Reporter application.
       
 17639 +  if (![[NSFileManager defaultManager]
       
 17640 +             fileExistsAtPath:reporterPathString]) {
       
 17641 +    DEBUGLOG(stderr, "Cannot find Reporter tool\n");
       
 17642 +    return false;
       
 17643 +  }
       
 17644 +
       
 17645 +  if (!dumpSubdirectory) {
       
 17646 +    dumpSubdirectory = @"";
       
 17647 +  }
       
 17648 +
       
 17649 +  // The product, version, and URL are required values.
       
 17650 +  if (![product length]) {
       
 17651 +    DEBUGLOG(stderr, "Missing required product key.\n");
       
 17652 +    return false;
       
 17653 +  }
       
 17654 +
       
 17655 +  if (![version length]) {
       
 17656 +    DEBUGLOG(stderr, "Missing required version key.\n");
       
 17657 +    return false;
       
 17658 +  }
       
 17659 +
       
 17660 +  if (![urlStr length]) {
       
 17661 +    DEBUGLOG(stderr, "Missing required URL key.\n");
       
 17662 +    return false;
       
 17663 +  }
       
 17664 +
       
 17665 +  config_params_ =
       
 17666 +      new (gKeyValueAllocator->Allocate(sizeof(SimpleStringDictionary)) )
       
 17667 +        SimpleStringDictionary();
       
 17668 +
       
 17669 +  SimpleStringDictionary &dictionary = *config_params_;
       
 17670 +
       
 17671 +  dictionary.SetKeyValue(BREAKPAD_SERVER_TYPE,     [serverType UTF8String]);
       
 17672 +  dictionary.SetKeyValue(BREAKPAD_PRODUCT_DISPLAY, [display UTF8String]);
       
 17673 +  dictionary.SetKeyValue(BREAKPAD_PRODUCT,         [product UTF8String]);
       
 17674 +  dictionary.SetKeyValue(BREAKPAD_VERSION,         [version UTF8String]);
       
 17675 +  dictionary.SetKeyValue(BREAKPAD_URL,             [urlStr UTF8String]);
       
 17676 +  dictionary.SetKeyValue(BREAKPAD_REPORT_INTERVAL, [interval UTF8String]);
       
 17677 +  dictionary.SetKeyValue(BREAKPAD_SKIP_CONFIRM,    [skipConfirm UTF8String]);
       
 17678 +  dictionary.SetKeyValue(BREAKPAD_CONFIRM_TIMEOUT, [timeout UTF8String]);
       
 17679 +  dictionary.SetKeyValue(BREAKPAD_INSPECTOR_LOCATION,
       
 17680 +                           [inspectorPathString fileSystemRepresentation]);
       
 17681 +  dictionary.SetKeyValue(BREAKPAD_REPORTER_EXE_LOCATION,
       
 17682 +                           [reporterPathString fileSystemRepresentation]);
       
 17683 +  dictionary.SetKeyValue(BREAKPAD_LOGFILE_UPLOAD_SIZE,
       
 17684 +                         [logFileTailSize UTF8String]);
       
 17685 +  dictionary.SetKeyValue(BREAKPAD_REQUEST_COMMENTS,
       
 17686 +                         [requestUserText UTF8String]);
       
 17687 +  dictionary.SetKeyValue(BREAKPAD_REQUEST_EMAIL, [requestEmail UTF8String]);
       
 17688 +  dictionary.SetKeyValue(BREAKPAD_VENDOR, [vendor UTF8String]);
       
 17689 +  dictionary.SetKeyValue(BREAKPAD_DUMP_DIRECTORY,
       
 17690 +                         [dumpSubdirectory UTF8String]);
       
 17691 +  
       
 17692 +  struct timeval tv;
       
 17693 +  gettimeofday(&tv, NULL);
       
 17694 +  char timeStartedString[32];
       
 17695 +  sprintf(timeStartedString, "%d", tv.tv_sec);
       
 17696 +  dictionary.SetKeyValue(BREAKPAD_PROCESS_START_TIME,
       
 17697 +                         timeStartedString);
       
 17698 +
       
 17699 +  if (logFilePaths) {
       
 17700 +    char logFileKey[255];
       
 17701 +    for(unsigned int i = 0; i < [logFilePaths count]; i++) {
       
 17702 +      sprintf(logFileKey,"%s%d", BREAKPAD_LOGFILE_KEY_PREFIX, i);
       
 17703 +      dictionary.SetKeyValue(logFileKey,
       
 17704 +                             [[logFilePaths objectAtIndex:i]
       
 17705 +                               fileSystemRepresentation]);
       
 17706 +    }
       
 17707 +  }
       
 17708 +
       
 17709 +  if (serverParameters) {
       
 17710 +    // For each key-value pair, call BreakpadAddUploadParameter()
       
 17711 +    NSEnumerator *keyEnumerator = [serverParameters keyEnumerator];
       
 17712 +    NSString *aParameter;
       
 17713 +    while (aParameter = [keyEnumerator nextObject]) {
       
 17714 +      BreakpadAddUploadParameter(this, aParameter,
       
 17715 +				 [serverParameters objectForKey:aParameter]);
       
 17716 +    }
       
 17717 +  }
       
 17718 +  return true;
       
 17719 +}
       
 17720 +
       
 17721 +//=============================================================================
       
 17722 +void        Breakpad::SetKeyValue(NSString *key, NSString *value) {
       
 17723 +  // We allow nil values. This is the same as removing the keyvalue.
       
 17724 +  if (!config_params_ || !key)
       
 17725 +    return;
       
 17726 +
       
 17727 +  config_params_->SetKeyValue([key UTF8String], [value UTF8String]);
       
 17728 +}
       
 17729 +
       
 17730 +//=============================================================================
       
 17731 +NSString *  Breakpad::KeyValue(NSString *key) {
       
 17732 +  if (!config_params_ || !key)
       
 17733 +    return nil;
       
 17734 +
       
 17735 +  const char *value = config_params_->GetValueForKey([key UTF8String]);
       
 17736 +  return value ? [NSString stringWithUTF8String:value] : nil;
       
 17737 +}
       
 17738 +
       
 17739 +//=============================================================================
       
 17740 +void        Breakpad::RemoveKeyValue(NSString *key) {
       
 17741 +  if (!config_params_ || !key)
       
 17742 +    return;
       
 17743 +
       
 17744 +  config_params_->RemoveKey([key UTF8String]);
       
 17745 +}
       
 17746 +
       
 17747 +//=============================================================================
       
 17748 +void        Breakpad::GenerateAndSendReport() {
       
 17749 +  config_params_->SetKeyValue(BREAKPAD_ON_DEMAND, "YES");
       
 17750 +  HandleException(0, 0, 0, mach_thread_self()); 
       
 17751 +  config_params_->SetKeyValue(BREAKPAD_ON_DEMAND, "NO");
       
 17752 +}
       
 17753 +
       
 17754 +//=============================================================================
       
 17755 +bool Breakpad::HandleException(int           exception_type,
       
 17756 +                               int           exception_code,
       
 17757 +                               int           exception_subcode,
       
 17758 +                               mach_port_t   crashing_thread) {
       
 17759 +  DEBUGLOG(stderr, "Breakpad: an exception occurred\n");
       
 17760 +
       
 17761 +  if (filter_callback_) {
       
 17762 +    bool should_handle = filter_callback_(exception_type,
       
 17763 +                                          exception_code,
       
 17764 +                                          crashing_thread,
       
 17765 +                                          filter_callback_context_);
       
 17766 +    if (!should_handle) return false;
       
 17767 +  }
       
 17768 +
       
 17769 +  // We need to reset the memory protections to be read/write,
       
 17770 +  // since LaunchOnDemand() requires changing state.
       
 17771 +  gBreakpadAllocator->Unprotect();
       
 17772 +  // Configure the server to launch when we message the service port.
       
 17773 +  // The reason we do this here, rather than at startup, is that we
       
 17774 +  // can leak a bootstrap service entry if this method is called and
       
 17775 +  // there never ends up being a crash.
       
 17776 +  inspector_.LaunchOnDemand();
       
 17777 +  gBreakpadAllocator->Protect();
       
 17778 +
       
 17779 +  // The Inspector should send a message to this port to verify it
       
 17780 +  // received our information and has finished the inspection.
       
 17781 +  ReceivePort acknowledge_port;
       
 17782 +
       
 17783 +  // Send initial information to the Inspector.
       
 17784 +  MachSendMessage message(kMsgType_InspectorInitialInfo);
       
 17785 +  message.AddDescriptor(mach_task_self());          // our task
       
 17786 +  message.AddDescriptor(crashing_thread);           // crashing thread
       
 17787 +  message.AddDescriptor(mach_thread_self());        // exception-handling thread
       
 17788 +  message.AddDescriptor(acknowledge_port.GetPort());// message receive port
       
 17789 +
       
 17790 +  InspectorInfo info;
       
 17791 +  info.exception_type = exception_type;
       
 17792 +  info.exception_code = exception_code;
       
 17793 +  info.exception_subcode = exception_subcode;
       
 17794 +  info.parameter_count = config_params_->GetCount();
       
 17795 +  message.SetData(&info, sizeof(info));
       
 17796 +
       
 17797 +  MachPortSender sender(inspector_.GetServicePort());
       
 17798 +
       
 17799 +  kern_return_t result = sender.SendMessage(message, 2000);
       
 17800 +
       
 17801 +  if (result == KERN_SUCCESS) {
       
 17802 +    // Now, send a series of key-value pairs to the Inspector.
       
 17803 +    const KeyValueEntry *entry = NULL;
       
 17804 +    SimpleStringDictionaryIterator iter(*config_params_);
       
 17805 +
       
 17806 +    while ( (entry = iter.Next()) ) {
       
 17807 +      KeyValueMessageData keyvalue_data(*entry);
       
 17808 +
       
 17809 +      MachSendMessage keyvalue_message(kMsgType_InspectorKeyValuePair);
       
 17810 +      keyvalue_message.SetData(&keyvalue_data, sizeof(keyvalue_data));
       
 17811 +
       
 17812 +      result = sender.SendMessage(keyvalue_message, 2000);
       
 17813 +
       
 17814 +      if (result != KERN_SUCCESS) {
       
 17815 +        break;
       
 17816 +      }
       
 17817 +    }
       
 17818 +
       
 17819 +    if (result == KERN_SUCCESS) {
       
 17820 +      // Wait for acknowledgement that the inspection has finished.
       
 17821 +      MachReceiveMessage acknowledge_messsage;
       
 17822 +      result = acknowledge_port.WaitForMessage(&acknowledge_messsage, 5000);
       
 17823 +    }
       
 17824 +  }
       
 17825 +
       
 17826 +#if VERBOSE
       
 17827 +  PRINT_MACH_RESULT(result, "Breakpad: SendMessage ");
       
 17828 +  printf("Breakpad: Inspector service port = %#x\n",
       
 17829 +    inspector_.GetServicePort());
       
 17830 +#endif
       
 17831 +
       
 17832 +  // If we don't want any forwarding, return true here to indicate that we've
       
 17833 +  // processed things as much as we want.
       
 17834 +  if (send_and_exit_)
       
 17835 +    return true;
       
 17836 +
       
 17837 +  return false;
       
 17838 +}
       
 17839 +
       
 17840 +//=============================================================================
       
 17841 +//=============================================================================
       
 17842 +
       
 17843 +#pragma mark -
       
 17844 +#pragma mark Public API
       
 17845 +
       
 17846 +//=============================================================================
       
 17847 +BreakpadRef BreakpadCreate(NSDictionary *parameters) {
       
 17848 +  try {
       
 17849 +    // This is confusing.  Our two main allocators for breakpad memory are:
       
 17850 +    //    - gKeyValueAllocator for the key/value memory
       
 17851 +    //    - gBreakpadAllocator for the Breakpad, ExceptionHandler, and other
       
 17852 +    //      breakpad allocations which are accessed at exception handling time.
       
 17853 +    //
       
 17854 +    // But in order to avoid these two allocators themselves from being smashed,
       
 17855 +    // we'll protect them as well by allocating them with gMasterAllocator.
       
 17856 +    //
       
 17857 +    // gMasterAllocator itself will NOT be protected, but this doesn't matter,
       
 17858 +    // since once it does its allocations and locks the memory, smashes to itself
       
 17859 +    // don't affect anything we care about.
       
 17860 +    gMasterAllocator =
       
 17861 +      new ProtectedMemoryAllocator(sizeof(ProtectedMemoryAllocator) * 2);
       
 17862 +
       
 17863 +    gKeyValueAllocator =
       
 17864 +      new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator)))
       
 17865 +        ProtectedMemoryAllocator(sizeof(SimpleStringDictionary));
       
 17866 +
       
 17867 +    // Create a mutex for use in accessing the SimpleStringDictionary
       
 17868 +    int mutexResult = pthread_mutex_init(&gDictionaryMutex, NULL);
       
 17869 +    if (mutexResult == 0) {
       
 17870 +
       
 17871 +      // With the current compiler, gBreakpadAllocator is allocating 1444 bytes.
       
 17872 +      // Let's round up to the nearest page size.
       
 17873 +      //
       
 17874 +      int breakpad_pool_size = 4096;
       
 17875 +
       
 17876 +      /*
       
 17877 +       sizeof(Breakpad)
       
 17878 +       + sizeof(google_breakpad::ExceptionHandler)
       
 17879 +       + sizeof( STUFF ALLOCATED INSIDE ExceptionHandler )
       
 17880 +       */
       
 17881 +
       
 17882 +      gBreakpadAllocator =
       
 17883 +        new (gMasterAllocator->Allocate(sizeof(ProtectedMemoryAllocator)))
       
 17884 +          ProtectedMemoryAllocator(breakpad_pool_size);
       
 17885 +
       
 17886 +      // Stack-based autorelease pool for Breakpad::Create() obj-c code.
       
 17887 +      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
       
 17888 +      Breakpad *breakpad = Breakpad::Create(parameters);
       
 17889 +
       
 17890 +      if (breakpad) {
       
 17891 +        // Make read-only to protect against memory smashers
       
 17892 +        gMasterAllocator->Protect();
       
 17893 +        gKeyValueAllocator->Protect();
       
 17894 +        gBreakpadAllocator->Protect();
       
 17895 +        // Can uncomment this line to figure out how much space was actually
       
 17896 +        // allocated using this allocator
       
 17897 +        //     printf("gBreakpadAllocator allocated size = %d\n",
       
 17898 +        //         gBreakpadAllocator->GetAllocatedSize() );
       
 17899 +        [pool release];
       
 17900 +        return (BreakpadRef)breakpad;
       
 17901 +      }
       
 17902 +
       
 17903 +      [pool release];
       
 17904 +    }
       
 17905 +  } catch(...) {    // don't let exceptions leave this C API
       
 17906 +    fprintf(stderr, "BreakpadCreate() : error\n");
       
 17907 +  }
       
 17908 +
       
 17909 +  if (gKeyValueAllocator) {
       
 17910 +    gKeyValueAllocator->~ProtectedMemoryAllocator();
       
 17911 +    gKeyValueAllocator = NULL;
       
 17912 +  }
       
 17913 +
       
 17914 +  if (gBreakpadAllocator) {
       
 17915 +    gBreakpadAllocator->~ProtectedMemoryAllocator();
       
 17916 +    gBreakpadAllocator = NULL;
       
 17917 +  }
       
 17918 +
       
 17919 +  delete gMasterAllocator;
       
 17920 +  gMasterAllocator = NULL;
       
 17921 +
       
 17922 +  return NULL;
       
 17923 +}
       
 17924 +
       
 17925 +//=============================================================================
       
 17926 +void BreakpadRelease(BreakpadRef ref) {
       
 17927 +  try {
       
 17928 +    Breakpad *breakpad = (Breakpad *)ref;
       
 17929 +
       
 17930 +    if (gMasterAllocator) {
       
 17931 +      gMasterAllocator->Unprotect();
       
 17932 +      gKeyValueAllocator->Unprotect();
       
 17933 +      gBreakpadAllocator->Unprotect();
       
 17934 +
       
 17935 +      breakpad->~Breakpad();
       
 17936 +
       
 17937 +      // Unfortunately, it's not possible to deallocate this stuff
       
 17938 +      // because the exception handling thread is still finishing up
       
 17939 +      // asynchronously at this point...  OK, it could be done with
       
 17940 +      // locks, etc.  But since BreakpadRelease() should usually only
       
 17941 +      // be called right before the process exits, it's not worth
       
 17942 +      // deallocating this stuff.
       
 17943 +#if 0
       
 17944 +      gKeyValueAllocator->~ProtectedMemoryAllocator();
       
 17945 +      gBreakpadAllocator->~ProtectedMemoryAllocator();
       
 17946 +      delete gMasterAllocator;
       
 17947 +
       
 17948 +      gMasterAllocator = NULL;
       
 17949 +      gKeyValueAllocator = NULL;
       
 17950 +      gBreakpadAllocator = NULL;
       
 17951 +#endif
       
 17952 +
       
 17953 +      pthread_mutex_destroy(&gDictionaryMutex);
       
 17954 +    }
       
 17955 +  } catch(...) {    // don't let exceptions leave this C API
       
 17956 +    fprintf(stderr, "BreakpadRelease() : error\n");
       
 17957 +  }
       
 17958 +}
       
 17959 +
       
 17960 +//=============================================================================
       
 17961 +void BreakpadSetKeyValue(BreakpadRef ref, NSString *key, NSString *value) {
       
 17962 +  try {
       
 17963 +    // Not called at exception time
       
 17964 +    Breakpad *breakpad = (Breakpad *)ref;
       
 17965 +
       
 17966 +    if (breakpad && key && gKeyValueAllocator) {
       
 17967 +      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);
       
 17968 +
       
 17969 +      breakpad->SetKeyValue(key, value);
       
 17970 +    }
       
 17971 +  } catch(...) {    // don't let exceptions leave this C API
       
 17972 +    fprintf(stderr, "BreakpadSetKeyValue() : error\n");
       
 17973 +  }
       
 17974 +}
       
 17975 +
       
 17976 +void BreakpadAddUploadParameter(BreakpadRef ref,
       
 17977 +                                NSString *key,
       
 17978 +                                NSString *value) {
       
 17979 +  // The only difference, internally, between an upload parameter and
       
 17980 +  // a key value one that is set with BreakpadSetKeyValue is that we
       
 17981 +  // prepend the keyname with a special prefix.  This informs the
       
 17982 +  // crash sender that the parameter should be sent along with the
       
 17983 +  // POST of the crash dump upload.
       
 17984 +  try {
       
 17985 +    Breakpad *breakpad = (Breakpad *)ref;
       
 17986 +
       
 17987 +    if (breakpad && key && gKeyValueAllocator) {
       
 17988 +      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);
       
 17989 +
       
 17990 +      NSString *prefixedKey = [@BREAKPAD_SERVER_PARAMETER_PREFIX
       
 17991 +				stringByAppendingString:key];
       
 17992 +      breakpad->SetKeyValue(prefixedKey, value);
       
 17993 +    }
       
 17994 +  } catch(...) {    // don't let exceptions leave this C API
       
 17995 +    fprintf(stderr, "BreakpadSetKeyValue() : error\n");
       
 17996 +  }
       
 17997 +}
       
 17998 +
       
 17999 +void BreakpadRemoveUploadParameter(BreakpadRef ref,
       
 18000 +                                   NSString *key) {
       
 18001 +  try {
       
 18002 +    // Not called at exception time
       
 18003 +    Breakpad *breakpad = (Breakpad *)ref;
       
 18004 +
       
 18005 +    if (breakpad && key && gKeyValueAllocator) {
       
 18006 +      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);
       
 18007 +
       
 18008 +      NSString *prefixedKey = [NSString stringWithFormat:@"%@%@",
       
 18009 +                                        @BREAKPAD_SERVER_PARAMETER_PREFIX, key];
       
 18010 +      breakpad->RemoveKeyValue(prefixedKey);
       
 18011 +    }
       
 18012 +  } catch(...) {    // don't let exceptions leave this C API
       
 18013 +    fprintf(stderr, "BreakpadRemoveKeyValue() : error\n");
       
 18014 +  }
       
 18015 +}
       
 18016 +//=============================================================================
       
 18017 +NSString *BreakpadKeyValue(BreakpadRef ref, NSString *key) {
       
 18018 +  NSString *value = nil;
       
 18019 +
       
 18020 +  try {
       
 18021 +    // Not called at exception time
       
 18022 +    Breakpad *breakpad = (Breakpad *)ref;
       
 18023 +
       
 18024 +    if (!breakpad || !key || !gKeyValueAllocator)
       
 18025 +      return nil;
       
 18026 +
       
 18027 +    ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);
       
 18028 +
       
 18029 +    value = breakpad->KeyValue(key);
       
 18030 +  } catch(...) {    // don't let exceptions leave this C API
       
 18031 +    fprintf(stderr, "BreakpadKeyValue() : error\n");
       
 18032 +  }
       
 18033 +
       
 18034 +  return value;
       
 18035 +}
       
 18036 +
       
 18037 +//=============================================================================
       
 18038 +void BreakpadRemoveKeyValue(BreakpadRef ref, NSString *key) {
       
 18039 +  try {
       
 18040 +    // Not called at exception time
       
 18041 +    Breakpad *breakpad = (Breakpad *)ref;
       
 18042 +
       
 18043 +    if (breakpad && key && gKeyValueAllocator) {
       
 18044 +      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);
       
 18045 +
       
 18046 +      breakpad->RemoveKeyValue(key);
       
 18047 +    }
       
 18048 +  } catch(...) {    // don't let exceptions leave this C API
       
 18049 +    fprintf(stderr, "BreakpadRemoveKeyValue() : error\n");
       
 18050 +  }
       
 18051 +}
       
 18052 +
       
 18053 +//=============================================================================
       
 18054 +void BreakpadGenerateAndSendReport(BreakpadRef ref) {
       
 18055 +  try {
       
 18056 +    Breakpad *breakpad = (Breakpad *)ref;
       
 18057 +
       
 18058 +    if (breakpad && gKeyValueAllocator) {
       
 18059 +      ProtectedMemoryLocker locker(&gDictionaryMutex, gKeyValueAllocator);
       
 18060 +
       
 18061 +      gBreakpadAllocator->Unprotect();
       
 18062 +      breakpad->GenerateAndSendReport();
       
 18063 +      gBreakpadAllocator->Protect();
       
 18064 +    }
       
 18065 +  } catch(...) {    // don't let exceptions leave this C API
       
 18066 +    fprintf(stderr, "BreakpadGenerateAndSendReport() : error\n");
       
 18067 +  }
       
 18068 +}
       
 18069 +
       
 18070 +//=============================================================================
       
 18071 +void BreakpadSetFilterCallback(BreakpadRef ref,
       
 18072 +                               BreakpadFilterCallback callback,
       
 18073 +                               void *context) {
       
 18074 +
       
 18075 +  try {
       
 18076 +    Breakpad *breakpad = (Breakpad *)ref;
       
 18077 +
       
 18078 +    if (breakpad && gBreakpadAllocator) {
       
 18079 +      // share the dictionary mutex here (we really don't need a mutex)
       
 18080 +      ProtectedMemoryLocker locker(&gDictionaryMutex, gBreakpadAllocator);
       
 18081 +
       
 18082 +      breakpad->SetFilterCallback(callback, context);
       
 18083 +    }
       
 18084 +  } catch(...) {    // don't let exceptions leave this C API
       
 18085 +    fprintf(stderr, "BreakpadSetFilterCallback() : error\n");
       
 18086 +  }
       
 18087 +}
       
 18088 +
       
 18089 +//============================================================================
       
 18090 +void BreakpadAddLogFile(BreakpadRef ref, NSString *logPathname) {
       
 18091 +  int logFileCounter = 0;
       
 18092 +
       
 18093 +  NSString *logFileKey = [NSString stringWithFormat:@"%@%d",
       
 18094 +                                   @BREAKPAD_LOGFILE_KEY_PREFIX,
       
 18095 +                                   logFileCounter];
       
 18096 +
       
 18097 +  NSString *existingLogFilename = nil;
       
 18098 +  existingLogFilename = BreakpadKeyValue(ref, logFileKey);
       
 18099 +  // Find the first log file key that we can use by testing for existence
       
 18100 +  while (existingLogFilename) {
       
 18101 +    if ([existingLogFilename isEqualToString:logPathname]) {
       
 18102 +      return;
       
 18103 +    }
       
 18104 +    logFileCounter++;
       
 18105 +    logFileKey = [NSString stringWithFormat:@"%@%d",
       
 18106 +                           @BREAKPAD_LOGFILE_KEY_PREFIX,
       
 18107 +                           logFileCounter];
       
 18108 +    existingLogFilename = BreakpadKeyValue(ref, logFileKey);
       
 18109 +  }
       
 18110 +
       
 18111 +  BreakpadSetKeyValue(ref, logFileKey, logPathname);
       
 18112 +}
       
 18113 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad_Prefix.pch b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad_Prefix.pch
       
 18114 new file mode 100644
       
 18115 --- /dev/null
       
 18116 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Breakpad_Prefix.pch
       
 18117 @@ -0,0 +1,8 @@
       
 18118 +//
       
 18119 +// Prefix header for all source files of the 'Breakpad' target in the
       
 18120 +// 'Breakpad' project.
       
 18121 +//
       
 18122 +
       
 18123 +#ifdef __OBJC__
       
 18124 +    #import <Cocoa/Cocoa.h>
       
 18125 +#endif
       
 18126 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Info.plist b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Info.plist
       
 18127 new file mode 100644
       
 18128 --- /dev/null
       
 18129 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/Info.plist
       
 18130 @@ -0,0 +1,26 @@
       
 18131 +<?xml version="1.0" encoding="UTF-8"?>
       
 18132 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 18133 +<plist version="1.0">
       
 18134 +<dict>
       
 18135 +	<key>CFBundleDevelopmentRegion</key>
       
 18136 +	<string>English</string>
       
 18137 +	<key>CFBundleExecutable</key>
       
 18138 +	<string>${EXECUTABLE_NAME}</string>
       
 18139 +	<key>CFBundleName</key>
       
 18140 +	<string>${PRODUCT_NAME}</string>
       
 18141 +	<key>CFBundleIconFile</key>
       
 18142 +	<string></string>
       
 18143 +	<key>CFBundleIdentifier</key>
       
 18144 +	<string>com.googlecode.google-breakpad</string>
       
 18145 +	<key>CFBundleInfoDictionaryVersion</key>
       
 18146 +	<string>6.0</string>
       
 18147 +	<key>CFBundlePackageType</key>
       
 18148 +	<string>FMWK</string>
       
 18149 +	<key>CFBundleSignature</key>
       
 18150 +	<string>????</string>
       
 18151 +	<key>CFBundleVersion</key>
       
 18152 +	<string>1.0</string>
       
 18153 +	<key>NSPrincipalClass</key>
       
 18154 +	<string></string>
       
 18155 +</dict>
       
 18156 +</plist>
       
 18157 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.h b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.h
       
 18158 new file mode 100644
       
 18159 --- /dev/null
       
 18160 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.h
       
 18161 @@ -0,0 +1,146 @@
       
 18162 +// Copyright (c) 2007, Google Inc.
       
 18163 +// All rights reserved.
       
 18164 +//
       
 18165 +// Redistribution and use in source and binary forms, with or without
       
 18166 +// modification, are permitted provided that the following conditions are
       
 18167 +// met:
       
 18168 +//
       
 18169 +//     * Redistributions of source code must retain the above copyright
       
 18170 +// notice, this list of conditions and the following disclaimer.
       
 18171 +//     * Redistributions in binary form must reproduce the above
       
 18172 +// copyright notice, this list of conditions and the following disclaimer
       
 18173 +// in the documentation and/or other materials provided with the
       
 18174 +// distribution.
       
 18175 +//     * Neither the name of Google Inc. nor the names of its
       
 18176 +// contributors may be used to endorse or promote products derived from
       
 18177 +// this software without specific prior written permission.
       
 18178 +//
       
 18179 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 18180 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 18181 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 18182 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 18183 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 18184 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 18185 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 18186 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 18187 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 18188 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 18189 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 18190 +
       
 18191 +#import <iostream>
       
 18192 +#import <mach/mach.h>
       
 18193 +#import <servers/bootstrap.h>
       
 18194 +#import <stdio.h>
       
 18195 +#import <stdlib.h>
       
 18196 +#import <sys/stat.h>
       
 18197 +#import <unistd.h>
       
 18198 +
       
 18199 +//==============================================================================
       
 18200 +// class OnDemandServer :
       
 18201 +//    A basic on-demand server launcher supporting a single named service port
       
 18202 +//
       
 18203 +// Example Usage :
       
 18204 +//
       
 18205 +//  kern_return_t result;
       
 18206 +//  OnDemandServer *server = OnDemandServer::Create("/tmp/myserver",
       
 18207 +//                                                  "com.MyCompany.MyServiceName",
       
 18208 +//                                                  true,
       
 18209 +//                                                  &result);
       
 18210 +//
       
 18211 +//  if (server) {
       
 18212 +//    server->LaunchOnDemand();
       
 18213 +//    mach_port_t service_port = GetServicePort();
       
 18214 +//
       
 18215 +//    // Send a mach message to service_port and "myserver" will be launched
       
 18216 +//  }
       
 18217 +//
       
 18218 +//
       
 18219 +//                  ---- Now in the server code ----
       
 18220 +//
       
 18221 +//  // "myserver" should get the service port and read the message which
       
 18222 +//  // launched it:
       
 18223 +//  mach_port_t service_rcv_port_;
       
 18224 +//  kern_return_t kr = bootstrap_check_in(bootstrap_port,
       
 18225 +//                                      "com.MyCompany.MyServiceName",
       
 18226 +//                                      &service_rcv_port_);
       
 18227 +//  // mach_msg() read service_rcv_port_ ....
       
 18228 +//
       
 18229 +//  ....
       
 18230 +//
       
 18231 +//  // Later "myserver" may want to unregister the service if it doesn't
       
 18232 +//  // want its bootstrap service to stick around after it exits.
       
 18233 +//
       
 18234 +//  // DO NOT use mach_port_deallocate() here -- it will fail and the
       
 18235 +//  // following bootstrap_register() will also fail leaving our service
       
 18236 +//  // name hanging around forever (until reboot)
       
 18237 +//  kern_return_t kr = mach_port_destroy(mach_task_self(), service_rcv_port_);
       
 18238 +//
       
 18239 +//  kr = bootstrap_register(bootstrap_port,
       
 18240 +//                          "com.MyCompany.MyServiceName",
       
 18241 +//                          MACH_PORT_NULL);
       
 18242 +
       
 18243 +class OnDemandServer {
       
 18244 + public:
       
 18245 +  // must call Initialize() to be useful
       
 18246 +  OnDemandServer()
       
 18247 +    : server_port_(MACH_PORT_NULL),
       
 18248 +      service_port_(MACH_PORT_NULL),
       
 18249 +      unregister_on_cleanup_(true) {
       
 18250 +  }
       
 18251 +
       
 18252 +  // Creates the bootstrap server and service
       
 18253 +  kern_return_t Initialize(const char *server_command,
       
 18254 +                           const char *service_name,
       
 18255 +                           bool unregister_on_cleanup);
       
 18256 +
       
 18257 +  // Returns an OnDemandServer object if successful, or NULL if there's
       
 18258 +  // an error.  The error result will be returned in out_result.
       
 18259 +  //
       
 18260 +  //    server_command : the full path name including optional command-line
       
 18261 +  //      arguments to the executable representing the server
       
 18262 +  //
       
 18263 +  //    service_name : represents service name
       
 18264 +  //      something like "com.company.ServiceName"
       
 18265 +  //
       
 18266 +  //    unregister_on_cleanup : if true, unregisters the service name
       
 18267 +  //      when the OnDemandServer is deleted -- unregistering will
       
 18268 +  //      ONLY be possible if LaunchOnDemand() has NOT been called.
       
 18269 +  //      If false, then the service will continue to be registered
       
 18270 +  //      even after the current process quits.
       
 18271 +  //
       
 18272 +  //    out_result : if non-NULL, returns the result
       
 18273 +  //      this value will be KERN_SUCCESS if Create() returns non-NULL
       
 18274 +  //
       
 18275 +  static OnDemandServer *Create(const char *server_command,
       
 18276 +                                const char *service_name,
       
 18277 +                                bool unregister_on_cleanup,
       
 18278 +                                kern_return_t *out_result);
       
 18279 +
       
 18280 +  // Cleans up and if LaunchOnDemand() has not yet been called then
       
 18281 +  // the bootstrap service will be unregistered.
       
 18282 +  ~OnDemandServer();
       
 18283 +
       
 18284 +  // This must be called if we intend to commit to launching the server
       
 18285 +  // by sending a mach message to our service port.  Do not call it otherwise
       
 18286 +  // or it will be difficult (impossible?) to unregister the service name.
       
 18287 +  void LaunchOnDemand();
       
 18288 +
       
 18289 +  // This is the port we need to send a mach message to after calling
       
 18290 +  // LaunchOnDemand().  Sending a message causing an immediate launch
       
 18291 +  // of the server
       
 18292 +  mach_port_t GetServicePort() { return service_port_; };
       
 18293 +
       
 18294 + private:
       
 18295 +  // Disallow copy constructor
       
 18296 +  OnDemandServer(const OnDemandServer&);
       
 18297 +
       
 18298 +  // Cleans up and if LaunchOnDemand() has not yet been called then
       
 18299 +  // the bootstrap service will be unregistered.
       
 18300 +  void Unregister();
       
 18301 +
       
 18302 +  name_t      service_name_;
       
 18303 +
       
 18304 +  mach_port_t server_port_;
       
 18305 +  mach_port_t service_port_;
       
 18306 +  bool        unregister_on_cleanup_;
       
 18307 +};
       
 18308 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.mm b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.mm
       
 18309 new file mode 100644
       
 18310 --- /dev/null
       
 18311 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/Framework/OnDemandServer.mm
       
 18312 @@ -0,0 +1,145 @@
       
 18313 +// Copyright (c) 2007, Google Inc.
       
 18314 +// All rights reserved.
       
 18315 +//
       
 18316 +// Redistribution and use in source and binary forms, with or without
       
 18317 +// modification, are permitted provided that the following conditions are
       
 18318 +// met:
       
 18319 +//
       
 18320 +//     * Redistributions of source code must retain the above copyright
       
 18321 +// notice, this list of conditions and the following disclaimer.
       
 18322 +//     * Redistributions in binary form must reproduce the above
       
 18323 +// copyright notice, this list of conditions and the following disclaimer
       
 18324 +// in the documentation and/or other materials provided with the
       
 18325 +// distribution.
       
 18326 +//     * Neither the name of Google Inc. nor the names of its
       
 18327 +// contributors may be used to endorse or promote products derived from
       
 18328 +// this software without specific prior written permission.
       
 18329 +//
       
 18330 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 18331 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 18332 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 18333 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 18334 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 18335 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 18336 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 18337 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 18338 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 18339 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 18340 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 18341 +
       
 18342 +#import "OnDemandServer.h"
       
 18343 +
       
 18344 +#if DEBUG
       
 18345 +  #define PRINT_MACH_RESULT(result_, message_) \
       
 18346 +    printf(message_"%s (%d)\n", mach_error_string(result_), result_ );
       
 18347 +#else
       
 18348 +  #define PRINT_MACH_RESULT(result_, message_)
       
 18349 +#endif
       
 18350 +
       
 18351 +//==============================================================================
       
 18352 +OnDemandServer *OnDemandServer::Create(const char *server_command,
       
 18353 +                                       const char *service_name,
       
 18354 +                                       bool unregister_on_cleanup,
       
 18355 +                                       kern_return_t *out_result) {
       
 18356 +  OnDemandServer *server = new OnDemandServer();
       
 18357 +
       
 18358 +  if (!server) return NULL;
       
 18359 +
       
 18360 +  kern_return_t result = server->Initialize(server_command,
       
 18361 +                                            service_name,
       
 18362 +                                            unregister_on_cleanup);
       
 18363 +
       
 18364 +  if (out_result) {
       
 18365 +    *out_result = result;
       
 18366 +  }
       
 18367 +
       
 18368 +  if (result == KERN_SUCCESS) {
       
 18369 +    return server;
       
 18370 +  }
       
 18371 +
       
 18372 +  delete server;
       
 18373 +  return NULL;
       
 18374 +};
       
 18375 +
       
 18376 +//==============================================================================
       
 18377 +kern_return_t OnDemandServer::Initialize(const char *server_command,
       
 18378 +                                         const char *service_name,
       
 18379 +                                         bool unregister_on_cleanup) {
       
 18380 +  unregister_on_cleanup_ = unregister_on_cleanup;
       
 18381 +
       
 18382 +  kern_return_t kr =
       
 18383 +    bootstrap_create_server(bootstrap_port,
       
 18384 +                            const_cast<char*>(server_command),
       
 18385 +                            geteuid(),       // server uid
       
 18386 +                            true,
       
 18387 +                            &server_port_);
       
 18388 +
       
 18389 +  if (kr != KERN_SUCCESS) {
       
 18390 +    PRINT_MACH_RESULT(kr, "bootstrap_create_server() : ");
       
 18391 +    return kr;
       
 18392 +  }
       
 18393 +
       
 18394 +  strlcpy(service_name_, service_name, sizeof(service_name_));
       
 18395 +
       
 18396 +  // Create a service called service_name, and return send rights to
       
 18397 +  // that port in service_port_.
       
 18398 +  kr = bootstrap_create_service(server_port_,
       
 18399 +                                const_cast<char*>(service_name),
       
 18400 +                                &service_port_);
       
 18401 +
       
 18402 +  if (kr != KERN_SUCCESS) {
       
 18403 +    PRINT_MACH_RESULT(kr, "bootstrap_create_service() : ");
       
 18404 +
       
 18405 +    // perhaps the service has already been created - try to look it up
       
 18406 +    kr = bootstrap_look_up(bootstrap_port, (char*)service_name, &service_port_);
       
 18407 +
       
 18408 +    if (kr != KERN_SUCCESS) {
       
 18409 +      PRINT_MACH_RESULT(kr, "bootstrap_look_up() : ");
       
 18410 +      Unregister();  // clean up server port
       
 18411 +      return kr;
       
 18412 +    }
       
 18413 +  }
       
 18414 +
       
 18415 +  return KERN_SUCCESS;
       
 18416 +}
       
 18417 +
       
 18418 +//==============================================================================
       
 18419 +OnDemandServer::~OnDemandServer() {
       
 18420 +  if (unregister_on_cleanup_) {
       
 18421 +    Unregister();
       
 18422 +  }
       
 18423 +}
       
 18424 +
       
 18425 +//==============================================================================
       
 18426 +void OnDemandServer::LaunchOnDemand() {
       
 18427 +  // We need to do this, since the launched server is another process
       
 18428 +  // and holding on to this port delays launching until the current process
       
 18429 +  // exits!
       
 18430 +  mach_port_deallocate(mach_task_self(), server_port_);
       
 18431 +  server_port_ = NULL;
       
 18432 +
       
 18433 +  // Now, the service is still registered and all we need to do is send
       
 18434 +  // a mach message to the service port in order to launch the server.
       
 18435 +}
       
 18436 +
       
 18437 +//==============================================================================
       
 18438 +void OnDemandServer::Unregister() {
       
 18439 +  if (service_port_ != MACH_PORT_NULL) {
       
 18440 +    mach_port_deallocate(mach_task_self(), service_port_);
       
 18441 +    service_port_ = MACH_PORT_NULL;
       
 18442 +  }
       
 18443 +
       
 18444 +  if (server_port_ != MACH_PORT_NULL) {
       
 18445 +    // unregister the service
       
 18446 +    kern_return_t kr = bootstrap_register(server_port_,
       
 18447 +                                          service_name_,
       
 18448 +                                          MACH_PORT_NULL);
       
 18449 +
       
 18450 +    if (kr != KERN_SUCCESS) {
       
 18451 +      PRINT_MACH_RESULT(kr, "Breakpad UNREGISTER : bootstrap_register() : ");
       
 18452 +    }
       
 18453 +
       
 18454 +    mach_port_deallocate(mach_task_self(), server_port_);
       
 18455 +    server_port_ = MACH_PORT_NULL;
       
 18456 +  }
       
 18457 +}
       
 18458 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/UnitTests-Info.plist b/toolkit/crashreporter/google-breakpad/src/client/mac/UnitTests-Info.plist
       
 18459 new file mode 100644
       
 18460 --- /dev/null
       
 18461 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/UnitTests-Info.plist
       
 18462 @@ -0,0 +1,20 @@
       
 18463 +<?xml version="1.0" encoding="UTF-8"?>
       
 18464 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 18465 +<plist version="1.0">
       
 18466 +<dict>
       
 18467 +	<key>CFBundleDevelopmentRegion</key>
       
 18468 +	<string>English</string>
       
 18469 +	<key>CFBundleExecutable</key>
       
 18470 +	<string>${EXECUTABLE_NAME}</string>
       
 18471 +	<key>CFBundleIdentifier</key>
       
 18472 +	<string>com.yourcompany.${PRODUCT_NAME:identifier}</string>
       
 18473 +	<key>CFBundleInfoDictionaryVersion</key>
       
 18474 +	<string>6.0</string>
       
 18475 +	<key>CFBundlePackageType</key>
       
 18476 +	<string>BNDL</string>
       
 18477 +	<key>CFBundleSignature</key>
       
 18478 +	<string>????</string>
       
 18479 +	<key>CFBundleVersion</key>
       
 18480 +	<string>1.0</string>
       
 18481 +</dict>
       
 18482 +</plist>
       
 18483 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.h b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.h
       
 18484 new file mode 100644
       
 18485 --- /dev/null
       
 18486 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.h
       
 18487 @@ -0,0 +1,193 @@
       
 18488 +// Copyright (c) 2007, Google Inc.
       
 18489 +// All rights reserved.
       
 18490 +//
       
 18491 +// Redistribution and use in source and binary forms, with or without
       
 18492 +// modification, are permitted provided that the following conditions are
       
 18493 +// met:
       
 18494 +//
       
 18495 +//     * Redistributions of source code must retain the above copyright
       
 18496 +// notice, this list of conditions and the following disclaimer.
       
 18497 +//     * Redistributions in binary form must reproduce the above
       
 18498 +// copyright notice, this list of conditions and the following disclaimer
       
 18499 +// in the documentation and/or other materials provided with the
       
 18500 +// distribution.
       
 18501 +//     * Neither the name of Google Inc. nor the names of its
       
 18502 +// contributors may be used to endorse or promote products derived from
       
 18503 +// this software without specific prior written permission.
       
 18504 +//
       
 18505 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 18506 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 18507 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 18508 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 18509 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 18510 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 18511 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 18512 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 18513 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 18514 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 18515 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 18516 +//
       
 18517 +// Interface file between the Breakpad.framework and
       
 18518 +// the Inspector process.
       
 18519 +
       
 18520 +#import "common/mac/SimpleStringDictionary.h"
       
 18521 +
       
 18522 +#import <Foundation/Foundation.h>
       
 18523 +#import "client/mac/handler/minidump_generator.h"
       
 18524 +
       
 18525 +#define VERBOSE 0
       
 18526 +
       
 18527 +extern bool gDebugLog;
       
 18528 +
       
 18529 +#define DEBUGLOG if (gDebugLog) fprintf
       
 18530 +
       
 18531 +// Types of mach messsages (message IDs)
       
 18532 +enum {
       
 18533 +  kMsgType_InspectorInitialInfo = 0,    // data is InspectorInfo
       
 18534 +  kMsgType_InspectorKeyValuePair = 1,   // data is KeyValueMessageData
       
 18535 +  kMsgType_InspectorAcknowledgement = 2 // no data sent
       
 18536 +};
       
 18537 +
       
 18538 +// Initial information sent from the crashed process by
       
 18539 +// Breakpad.framework to the Inspector process
       
 18540 +// The mach message with this struct as data will also include
       
 18541 +// several descriptors for sending mach port rights to the crashed
       
 18542 +// task, etc.
       
 18543 +struct InspectorInfo {
       
 18544 +  int           exception_type;
       
 18545 +  int           exception_code;
       
 18546 +  int           exception_subcode;
       
 18547 +  unsigned int  parameter_count;  // key-value pairs
       
 18548 +};
       
 18549 +
       
 18550 +// Key/value message data to be sent to the Inspector
       
 18551 +struct KeyValueMessageData {
       
 18552 + public:
       
 18553 +  KeyValueMessageData() {}
       
 18554 +  KeyValueMessageData(const google_breakpad::KeyValueEntry &inEntry) {
       
 18555 +    strlcpy(key, inEntry.GetKey(), sizeof(key) );
       
 18556 +    strlcpy(value, inEntry.GetValue(), sizeof(value) );
       
 18557 +  }
       
 18558 +
       
 18559 +  char key[google_breakpad::KeyValueEntry::MAX_STRING_STORAGE_SIZE];
       
 18560 +  char value[google_breakpad::KeyValueEntry::MAX_STRING_STORAGE_SIZE];
       
 18561 +};
       
 18562 +
       
 18563 +using std::string;
       
 18564 +using google_breakpad::MinidumpGenerator;
       
 18565 +
       
 18566 +namespace google_breakpad {
       
 18567 +
       
 18568 +static BOOL EnsureDirectoryPathExists(NSString *dirPath);
       
 18569 +
       
 18570 +//=============================================================================
       
 18571 +class ConfigFile {
       
 18572 + public:
       
 18573 +  ConfigFile() {
       
 18574 +    config_file_ = -1;
       
 18575 +    config_file_path_[0] = 0;
       
 18576 +    has_created_file_ = false;
       
 18577 +  };
       
 18578 +
       
 18579 +  ~ConfigFile() {
       
 18580 +  };
       
 18581 +
       
 18582 +  void WriteFile(const SimpleStringDictionary *configurationParameters,
       
 18583 +                 const char *dump_dir,
       
 18584 +                 const char *minidump_id);
       
 18585 +
       
 18586 +  const char *GetFilePath() { return config_file_path_; }
       
 18587 +
       
 18588 +  void Unlink() {
       
 18589 +    if (config_file_ != -1)
       
 18590 +      unlink(config_file_path_);
       
 18591 +
       
 18592 +    config_file_ = -1;
       
 18593 +  }
       
 18594 +
       
 18595 + private:
       
 18596 +  BOOL WriteData(const void *data, size_t length);
       
 18597 +
       
 18598 +  BOOL AppendConfigData(const char *key,
       
 18599 +                        const void *data,
       
 18600 +                        size_t length);
       
 18601 +
       
 18602 +  BOOL AppendConfigString(const char *key,
       
 18603 +                          const char *value);
       
 18604 +
       
 18605 +  int   config_file_;                    // descriptor for config file
       
 18606 +  char  config_file_path_[PATH_MAX];     // Path to configuration file
       
 18607 +  bool  has_created_file_;
       
 18608 +};
       
 18609 +
       
 18610 +//=============================================================================
       
 18611 +class MinidumpLocation {
       
 18612 + public:
       
 18613 +  MinidumpLocation(const NSString *minidumpDir) {
       
 18614 +    // Ensure that the path exists.  Fallback to /tmp if unable to locate path.
       
 18615 +    assert(minidumpDir);
       
 18616 +    if (!EnsureDirectoryPathExists(minidumpDir)) {
       
 18617 +      DEBUGLOG(stderr, "Unable to create: %s\n", [minidumpDir UTF8String]);
       
 18618 +      minidumpDir = @"/tmp";
       
 18619 +    }
       
 18620 +
       
 18621 +    strlcpy(minidump_dir_path_, [minidumpDir fileSystemRepresentation],
       
 18622 +            sizeof(minidump_dir_path_));
       
 18623 +
       
 18624 +    // now generate a unique ID
       
 18625 +    string dump_path(minidump_dir_path_);
       
 18626 +    string next_minidump_id;
       
 18627 +
       
 18628 +    string next_minidump_path_ =
       
 18629 +      (MinidumpGenerator::UniqueNameInDirectory(dump_path, &next_minidump_id));
       
 18630 +
       
 18631 +    strlcpy(minidump_id_, next_minidump_id.c_str(), sizeof(minidump_id_));
       
 18632 +  };
       
 18633 +
       
 18634 +  const char *GetPath() { return minidump_dir_path_; }
       
 18635 +  const char *GetID() { return minidump_id_; }
       
 18636 +
       
 18637 + private:
       
 18638 +  char minidump_dir_path_[PATH_MAX];             // Path to minidump directory
       
 18639 +  char minidump_id_[128];
       
 18640 +};
       
 18641 +
       
 18642 +//=============================================================================
       
 18643 +class Inspector {
       
 18644 + public:
       
 18645 +  Inspector() {};
       
 18646 +
       
 18647 +  // given a bootstrap service name, receives mach messages
       
 18648 +  // from a crashed process, then inspects it, creates a minidump file
       
 18649 +  // and asks the user if he wants to upload it to a server.
       
 18650 +  void            Inspect(const char *receive_port_name);
       
 18651 +
       
 18652 + private:
       
 18653 +  kern_return_t   ServiceCheckIn(const char *receive_port_name);
       
 18654 +  kern_return_t   ServiceCheckOut(const char *receive_port_name);
       
 18655 +
       
 18656 +  kern_return_t   ReadMessages();
       
 18657 +
       
 18658 +  bool            InspectTask();
       
 18659 +  kern_return_t   SendAcknowledgement();
       
 18660 +  void            LaunchReporter(const char *inConfigFilePath);
       
 18661 +
       
 18662 +  void            SetCrashTimeParameters();
       
 18663 +
       
 18664 +  mach_port_t     service_rcv_port_;
       
 18665 +
       
 18666 +  int             exception_type_;
       
 18667 +  int             exception_code_;
       
 18668 +  int             exception_subcode_;
       
 18669 +  mach_port_t     remote_task_;
       
 18670 +  mach_port_t     crashing_thread_;
       
 18671 +  mach_port_t     handler_thread_;
       
 18672 +  mach_port_t     ack_port_;
       
 18673 +
       
 18674 +  SimpleStringDictionary config_params_;
       
 18675 +
       
 18676 +  ConfigFile      config_file_;
       
 18677 +};
       
 18678 +
       
 18679 +
       
 18680 +} // namespace google_breakpad
       
 18681 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.mm b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.mm
       
 18682 new file mode 100644
       
 18683 --- /dev/null
       
 18684 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/Inspector.mm
       
 18685 @@ -0,0 +1,553 @@
       
 18686 +// Copyright (c) 2007, Google Inc.
       
 18687 +// All rights reserved.
       
 18688 +//
       
 18689 +// Redistribution and use in source and binary forms, with or without
       
 18690 +// modification, are permitted provided that the following conditions are
       
 18691 +// met:
       
 18692 +//
       
 18693 +//     * Redistributions of source code must retain the above copyright
       
 18694 +// notice, this list of conditions and the following disclaimer.
       
 18695 +//     * Redistributions in binary form must reproduce the above
       
 18696 +// copyright notice, this list of conditions and the following disclaimer
       
 18697 +// in the documentation and/or other materials provided with the
       
 18698 +// distribution.
       
 18699 +//     * Neither the name of Google Inc. nor the names of its
       
 18700 +// contributors may be used to endorse or promote products derived from
       
 18701 +// this software without specific prior written permission.
       
 18702 +//
       
 18703 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 18704 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 18705 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 18706 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 18707 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 18708 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 18709 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 18710 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 18711 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 18712 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 18713 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 18714 +//
       
 18715 +// Utility that can inspect another process and write a crash dump
       
 18716 +
       
 18717 +#include <cstdio>
       
 18718 +#include <iostream>
       
 18719 +#include <stdio.h>
       
 18720 +#include <string.h>
       
 18721 +#include <string>
       
 18722 +#include <sys/time.h>
       
 18723 +
       
 18724 +#import "client/mac/crash_generation/Inspector.h"
       
 18725 +
       
 18726 +#import "client/mac/Framework/Breakpad.h"
       
 18727 +#import "client/mac/handler/minidump_generator.h"
       
 18728 +
       
 18729 +#import "common/mac/SimpleStringDictionary.h"
       
 18730 +#import "common/mac/MachIPC.h"
       
 18731 +
       
 18732 +#import <Foundation/Foundation.h>
       
 18733 +
       
 18734 +#if VERBOSE
       
 18735 +  bool gDebugLog = true;
       
 18736 +#else
       
 18737 +  bool gDebugLog = false;
       
 18738 +#endif
       
 18739 +
       
 18740 +namespace google_breakpad {
       
 18741 +
       
 18742 +//=============================================================================
       
 18743 +static BOOL EnsureDirectoryPathExists(NSString *dirPath) {
       
 18744 +  NSFileManager *mgr = [NSFileManager defaultManager];
       
 18745 +
       
 18746 +  // If we got a relative path, prepend the current directory
       
 18747 +  if (![dirPath isAbsolutePath])
       
 18748 +    dirPath = [[mgr currentDirectoryPath] stringByAppendingPathComponent:dirPath];
       
 18749 +
       
 18750 +  NSString *path = dirPath;
       
 18751 +
       
 18752 +  // Ensure that no file exists within the path which would block creation
       
 18753 +  while (1) {
       
 18754 +    BOOL isDir;
       
 18755 +    if ([mgr fileExistsAtPath:path isDirectory:&isDir]) {
       
 18756 +      if (isDir)
       
 18757 +        break;
       
 18758 +
       
 18759 +      return NO;
       
 18760 +    }
       
 18761 +
       
 18762 +    path = [path stringByDeletingLastPathComponent];
       
 18763 +  }
       
 18764 +
       
 18765 +  // Path now contains the first valid directory (or is empty)
       
 18766 +  if (![path length])
       
 18767 +    return NO;
       
 18768 +
       
 18769 +  NSString *common =
       
 18770 +    [dirPath commonPrefixWithString:path options:NSLiteralSearch];
       
 18771 +
       
 18772 +  // If everything is good
       
 18773 +  if ([common isEqualToString:dirPath])
       
 18774 +    return YES;
       
 18775 +
       
 18776 +  // Break up the difference into components
       
 18777 +  NSString *diff = [dirPath substringFromIndex:[common length] + 1];
       
 18778 +  NSArray *components = [diff pathComponents];
       
 18779 +  unsigned count = [components count];
       
 18780 +
       
 18781 +  // Rebuild the path one component at a time
       
 18782 +  NSDictionary *attrs =
       
 18783 +    [NSDictionary dictionaryWithObject:[NSNumber numberWithUnsignedLong:0750]
       
 18784 +                                forKey:NSFilePosixPermissions];
       
 18785 +  path = common;
       
 18786 +  for (unsigned i = 0; i < count; ++i) {
       
 18787 +    path = [path stringByAppendingPathComponent:[components objectAtIndex:i]];
       
 18788 +
       
 18789 +    if (![mgr createDirectoryAtPath:path attributes:attrs])
       
 18790 +      return NO;
       
 18791 +  }
       
 18792 +
       
 18793 +  return YES;
       
 18794 +}
       
 18795 +
       
 18796 +//=============================================================================
       
 18797 +BOOL ConfigFile::WriteData(const void *data, size_t length) {
       
 18798 +  size_t result = write(config_file_, data, length);
       
 18799 +
       
 18800 +  return result == length;
       
 18801 +}
       
 18802 +
       
 18803 +//=============================================================================
       
 18804 +BOOL ConfigFile::AppendConfigData(const char *key,
       
 18805 +                                  const void *data, size_t length) {
       
 18806 +  assert(config_file_ != -1);
       
 18807 +
       
 18808 +  if (!key) {
       
 18809 +    DEBUGLOG(stderr, "Breakpad: Missing Key\n");
       
 18810 +    return NO;
       
 18811 +  }
       
 18812 +
       
 18813 +  if (!data) {
       
 18814 +    DEBUGLOG(stderr, "Breakpad: Missing data for key: %s\n", key ? key :
       
 18815 +            "<Unknown Key>");
       
 18816 +    return NO;
       
 18817 +  }
       
 18818 +
       
 18819 +  // Write the key, \n, length of data (ascii integer), \n, data
       
 18820 +  char buffer[16];
       
 18821 +  char nl = '\n';
       
 18822 +  BOOL result = WriteData(key, strlen(key));
       
 18823 +
       
 18824 +  snprintf(buffer, sizeof(buffer) - 1, "\n%lu\n", length);
       
 18825 +  result &= WriteData(buffer, strlen(buffer));
       
 18826 +  result &= WriteData(data, length);
       
 18827 +  result &= WriteData(&nl, 1);
       
 18828 +  return result;
       
 18829 +}
       
 18830 +
       
 18831 +//=============================================================================
       
 18832 +BOOL ConfigFile::AppendConfigString(const char *key,
       
 18833 +                                    const char *value) {
       
 18834 +  return AppendConfigData(key, value, strlen(value));
       
 18835 +}
       
 18836 +
       
 18837 +//=============================================================================
       
 18838 +void ConfigFile::WriteFile(const SimpleStringDictionary *configurationParameters,
       
 18839 +                           const char *dump_dir,
       
 18840 +                           const char *minidump_id) {
       
 18841 +
       
 18842 +  assert(config_file_ == -1);
       
 18843 +
       
 18844 +  // Open and write out configuration file preamble
       
 18845 +  strlcpy(config_file_path_, "/tmp/Config-XXXXXX",
       
 18846 +          sizeof(config_file_path_));
       
 18847 +  config_file_ = mkstemp(config_file_path_);
       
 18848 +
       
 18849 +  if (config_file_ == -1) {
       
 18850 +    DEBUGLOG(stderr,
       
 18851 +             "mkstemp(config_file_path_) == -1 (%s)\n",
       
 18852 +             strerror(errno));
       
 18853 +    return;
       
 18854 +  }
       
 18855 +  else {
       
 18856 +    DEBUGLOG(stderr, "Writing config file to (%s)\n", config_file_path_);
       
 18857 +  }
       
 18858 +
       
 18859 +  has_created_file_ = true;
       
 18860 +
       
 18861 +  // Add the minidump dir
       
 18862 +  AppendConfigString(kReporterMinidumpDirectoryKey, dump_dir);
       
 18863 +  AppendConfigString(kReporterMinidumpIDKey, minidump_id);
       
 18864 +
       
 18865 +  // Write out the configuration parameters
       
 18866 +  BOOL result = YES;
       
 18867 +  const SimpleStringDictionary &dictionary = *configurationParameters;
       
 18868 +
       
 18869 +  const KeyValueEntry *entry = NULL;
       
 18870 +  SimpleStringDictionaryIterator iter(dictionary);
       
 18871 +
       
 18872 +  while ((entry = iter.Next())) {
       
 18873 +    DEBUGLOG(stderr,
       
 18874 +             "config: (%s) -> (%s)\n",
       
 18875 +             entry->GetKey(),
       
 18876 +             entry->GetValue());
       
 18877 +    result = AppendConfigString(entry->GetKey(), entry->GetValue());
       
 18878 +
       
 18879 +    if (!result)
       
 18880 +      break;
       
 18881 +  }
       
 18882 +
       
 18883 +  close(config_file_);
       
 18884 +  config_file_ = -1;
       
 18885 +}
       
 18886 +
       
 18887 +//=============================================================================
       
 18888 +void Inspector::Inspect(const char *receive_port_name) {
       
 18889 +  kern_return_t result = ServiceCheckIn(receive_port_name);
       
 18890 +
       
 18891 +  if (result == KERN_SUCCESS) {
       
 18892 +    result = ReadMessages();
       
 18893 +
       
 18894 +    if (result == KERN_SUCCESS) {
       
 18895 +      // Inspect the task and write a minidump file.
       
 18896 +      bool wrote_minidump = InspectTask();
       
 18897 +
       
 18898 +      // Send acknowledgement to the crashed process that the inspection
       
 18899 +      // has finished.  It will then be able to cleanly exit.
       
 18900 +      // The return value is ignored because failure isn't fatal. If the process
       
 18901 +      // didn't get the message there's nothing we can do, and we still want to
       
 18902 +      // send the report.
       
 18903 +      SendAcknowledgement();
       
 18904 +
       
 18905 +      if (wrote_minidump) {
       
 18906 +        // Ask the user if he wants to upload the crash report to a server,
       
 18907 +        // and do so if he agrees.
       
 18908 +        LaunchReporter(config_file_.GetFilePath());
       
 18909 +      } else {
       
 18910 +        fprintf(stderr, "Inspection of crashed process failed\n");
       
 18911 +      }
       
 18912 +
       
 18913 +      // Now that we're done reading messages, cleanup the service, but only
       
 18914 +      // if there was an actual exception
       
 18915 +      // Otherwise, it means the dump was generated on demand and the process
       
 18916 +      // lives on, and we might be needed again in the future.
       
 18917 +      if (exception_code_) {
       
 18918 +        ServiceCheckOut(receive_port_name);
       
 18919 +      }
       
 18920 +    } else {
       
 18921 +        PRINT_MACH_RESULT(result, "Inspector: WaitForMessage()");
       
 18922 +    }
       
 18923 +  }
       
 18924 +}
       
 18925 +
       
 18926 +//=============================================================================
       
 18927 +kern_return_t Inspector::ServiceCheckIn(const char *receive_port_name) {
       
 18928 +  // We need to get the mach port representing this service, so we can
       
 18929 +  // get information from the crashed process.
       
 18930 +  kern_return_t kr = bootstrap_check_in(bootstrap_port,
       
 18931 +                                        (char*)receive_port_name,
       
 18932 +                                        &service_rcv_port_);
       
 18933 +
       
 18934 +  if (kr != KERN_SUCCESS) {
       
 18935 +#if VERBOSE
       
 18936 +    PRINT_MACH_RESULT(kr, "Inspector: bootstrap_check_in()");
       
 18937 +#endif
       
 18938 +  }
       
 18939 +
       
 18940 +  return kr;
       
 18941 +}
       
 18942 +
       
 18943 +//=============================================================================
       
 18944 +kern_return_t Inspector::ServiceCheckOut(const char *receive_port_name) {
       
 18945 +  // We're done receiving mach messages from the crashed process,
       
 18946 +  // so clean up a bit.
       
 18947 +  kern_return_t kr;
       
 18948 +
       
 18949 +  // DO NOT use mach_port_deallocate() here -- it will fail and the
       
 18950 +  // following bootstrap_register() will also fail leaving our service
       
 18951 +  // name hanging around forever (until reboot)
       
 18952 +  kr = mach_port_destroy(mach_task_self(), service_rcv_port_);
       
 18953 +
       
 18954 +  if (kr != KERN_SUCCESS) {
       
 18955 +    PRINT_MACH_RESULT(kr,
       
 18956 +      "Inspector: UNREGISTERING: service_rcv_port mach_port_deallocate()");
       
 18957 +    return kr;
       
 18958 +  }
       
 18959 +
       
 18960 +  // Unregister the service associated with the receive port.
       
 18961 +  kr = bootstrap_register(bootstrap_port,
       
 18962 +                          (char*)receive_port_name,
       
 18963 +                          MACH_PORT_NULL);
       
 18964 +
       
 18965 +  if (kr != KERN_SUCCESS) {
       
 18966 +    PRINT_MACH_RESULT(kr, "Inspector: UNREGISTERING: bootstrap_register()");
       
 18967 +  }
       
 18968 +
       
 18969 +  return kr;
       
 18970 +}
       
 18971 +
       
 18972 +//=============================================================================
       
 18973 +kern_return_t Inspector::ReadMessages() {
       
 18974 +  // Wait for an initial message from the crashed process containing basic
       
 18975 +  // information about the crash.
       
 18976 +  ReceivePort receive_port(service_rcv_port_);
       
 18977 +
       
 18978 +  MachReceiveMessage message;
       
 18979 +  kern_return_t result = receive_port.WaitForMessage(&message, 1000);
       
 18980 +
       
 18981 +  if (result == KERN_SUCCESS) {
       
 18982 +    InspectorInfo &info = (InspectorInfo &)*message.GetData();
       
 18983 +    exception_type_ = info.exception_type;
       
 18984 +    exception_code_ = info.exception_code;
       
 18985 +    exception_subcode_ = info.exception_subcode;
       
 18986 +
       
 18987 +#if VERBOSE
       
 18988 +    printf("message ID = %d\n", message.GetMessageID());
       
 18989 +#endif
       
 18990 +
       
 18991 +    remote_task_ = message.GetTranslatedPort(0);
       
 18992 +    crashing_thread_ = message.GetTranslatedPort(1);
       
 18993 +    handler_thread_ = message.GetTranslatedPort(2);
       
 18994 +    ack_port_ = message.GetTranslatedPort(3);
       
 18995 +
       
 18996 +#if VERBOSE
       
 18997 +    printf("exception_type = %d\n", exception_type_);
       
 18998 +    printf("exception_code = %d\n", exception_code_);
       
 18999 +    printf("exception_subcode = %d\n", exception_subcode_);
       
 19000 +    printf("remote_task = %d\n", remote_task_);
       
 19001 +    printf("crashing_thread = %d\n", crashing_thread_);
       
 19002 +    printf("handler_thread = %d\n", handler_thread_);
       
 19003 +    printf("ack_port_ = %d\n", ack_port_);
       
 19004 +    printf("parameter count = %d\n", info.parameter_count);
       
 19005 +#endif
       
 19006 +
       
 19007 +    // In certain situations where multiple crash requests come
       
 19008 +    // through quickly, we can end up with the mach IPC messages not
       
 19009 +    // coming through correctly.  Since we don't know what parameters
       
 19010 +    // we've missed, we can't do much besides abort the crash dump
       
 19011 +    // situation in this case.
       
 19012 +    unsigned int parameters_read = 0;
       
 19013 +    // The initial message contains the number of key value pairs that
       
 19014 +    // we are expected to read.
       
 19015 +    // Read each key/value pair, one mach message per key/value pair.
       
 19016 +    for (unsigned int i = 0; i < info.parameter_count; ++i) {
       
 19017 +      MachReceiveMessage message;
       
 19018 +      result = receive_port.WaitForMessage(&message, 1000);
       
 19019 +
       
 19020 +      if(result == KERN_SUCCESS) {
       
 19021 +        KeyValueMessageData &key_value_data =
       
 19022 +          (KeyValueMessageData&)*message.GetData();
       
 19023 +        // If we get a blank key, make sure we don't increment the
       
 19024 +        // parameter count; in some cases (notably on-demand generation
       
 19025 +        // many times in a short period of time) caused the Mach IPC
       
 19026 +        // messages to not come through correctly.
       
 19027 +        if (strlen(key_value_data.key) == 0) {
       
 19028 +          continue;
       
 19029 +        }
       
 19030 +        parameters_read++;
       
 19031 +
       
 19032 +        config_params_.SetKeyValue(key_value_data.key, key_value_data.value);
       
 19033 +      } else {
       
 19034 +        PRINT_MACH_RESULT(result, "Inspector: key/value message");
       
 19035 +        break;
       
 19036 +      }
       
 19037 +    }
       
 19038 +    if (parameters_read != info.parameter_count) {
       
 19039 +      DEBUGLOG(stderr, "Only read %d parameters instead of %d, aborting crash "
       
 19040 +               "dump generation.", parameters_read, info.parameter_count);
       
 19041 +      return KERN_FAILURE;
       
 19042 +    }
       
 19043 +  }
       
 19044 +
       
 19045 +  return result;
       
 19046 +}
       
 19047 +
       
 19048 +//=============================================================================
       
 19049 +// Sets keys in the parameters dictionary that are specific to process uptime.
       
 19050 +// The two we set are process up time, and process crash time.
       
 19051 +void Inspector::SetCrashTimeParameters() {
       
 19052 +  // Set process uptime parameter
       
 19053 +  struct timeval tv;
       
 19054 +  gettimeofday(&tv, NULL);
       
 19055 +
       
 19056 +  char processUptimeString[32], processCrashtimeString[32];
       
 19057 +  const char *processStartTimeString =
       
 19058 +    config_params_.GetValueForKey(BREAKPAD_PROCESS_START_TIME);
       
 19059 +
       
 19060 +  // Set up time if we've received the start time.
       
 19061 +  if (processStartTimeString) {
       
 19062 +    time_t processStartTime = strtol(processStartTimeString, NULL, 10);
       
 19063 +    time_t processUptime = tv.tv_sec - processStartTime;
       
 19064 +    sprintf(processUptimeString, "%d", processUptime);
       
 19065 +    config_params_.SetKeyValue(BREAKPAD_PROCESS_UP_TIME, processUptimeString);
       
 19066 +  }
       
 19067 +
       
 19068 +  sprintf(processCrashtimeString, "%d", tv.tv_sec);
       
 19069 +  config_params_.SetKeyValue(BREAKPAD_PROCESS_CRASH_TIME,
       
 19070 +                             processCrashtimeString);
       
 19071 +}
       
 19072 +
       
 19073 +bool Inspector::InspectTask() {
       
 19074 +  // keep the task quiet while we're looking at it
       
 19075 +  task_suspend(remote_task_);
       
 19076 +  DEBUGLOG(stderr, "Suspended Remote task\n");
       
 19077 +
       
 19078 +  NSString *minidumpDir;
       
 19079 +
       
 19080 +  const char *minidumpDirectory =
       
 19081 +    config_params_.GetValueForKey(BREAKPAD_DUMP_DIRECTORY);
       
 19082 +
       
 19083 +  SetCrashTimeParameters();
       
 19084 +  // If the client app has not specified a minidump directory,
       
 19085 +  // use a default of Library/<kDefaultLibrarySubdirectory>/<Product Name>
       
 19086 +  if (!minidumpDirectory || 0 == strlen(minidumpDirectory)) {
       
 19087 +    NSArray *libraryDirectories =
       
 19088 +      NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
       
 19089 +                                          NSUserDomainMask,
       
 19090 +                                          YES);
       
 19091 +
       
 19092 +    NSString *applicationSupportDirectory =
       
 19093 +        [libraryDirectories objectAtIndex:0];
       
 19094 +    NSString *library_subdirectory = [NSString 
       
 19095 +        stringWithUTF8String:kDefaultLibrarySubdirectory];
       
 19096 +    NSString *breakpad_product = [NSString 
       
 19097 +        stringWithUTF8String:config_params_.GetValueForKey(BREAKPAD_PRODUCT)];
       
 19098 +        
       
 19099 +    NSArray *path_components = [NSArray
       
 19100 +        arrayWithObjects:applicationSupportDirectory,
       
 19101 +                         library_subdirectory,
       
 19102 +                         breakpad_product,
       
 19103 +                         nil];
       
 19104 +
       
 19105 +    minidumpDir = [NSString pathWithComponents:path_components];
       
 19106 +  } else {
       
 19107 +    minidumpDir = [[NSString stringWithUTF8String:minidumpDirectory]
       
 19108 +                    stringByExpandingTildeInPath];
       
 19109 +  }
       
 19110 +  DEBUGLOG(stderr, 
       
 19111 +           "Writing minidump to directory (%s)\n",
       
 19112 +           [minidumpDir UTF8String]);
       
 19113 +
       
 19114 +  MinidumpLocation minidumpLocation(minidumpDir);
       
 19115 +
       
 19116 +  // Obscure bug alert:
       
 19117 +  // Don't use [NSString stringWithFormat] to build up the path here since it
       
 19118 +  // assumes system encoding and in RTL locales will prepend an LTR override
       
 19119 +  // character for paths beginning with '/' which fileSystemRepresentation does
       
 19120 +  // not remove. Filed as rdar://6889706 .
       
 19121 +  NSString *path_ns = [NSString
       
 19122 +      stringWithUTF8String:minidumpLocation.GetPath()];
       
 19123 +  NSString *pathid_ns = [NSString
       
 19124 +      stringWithUTF8String:minidumpLocation.GetID()];
       
 19125 +  NSString *minidumpPath = [path_ns stringByAppendingPathComponent:pathid_ns];
       
 19126 +  minidumpPath = [minidumpPath 
       
 19127 +      stringByAppendingPathExtension:@"dmp"];
       
 19128 +  
       
 19129 +  DEBUGLOG(stderr, 
       
 19130 +           "minidump path (%s)\n",
       
 19131 +           [minidumpPath UTF8String]);
       
 19132 +
       
 19133 +
       
 19134 +  config_file_.WriteFile( &config_params_,
       
 19135 +                          minidumpLocation.GetPath(),
       
 19136 +                          minidumpLocation.GetID());
       
 19137 +
       
 19138 +
       
 19139 +  MinidumpGenerator generator(remote_task_, handler_thread_);
       
 19140 +
       
 19141 +  if (exception_type_ && exception_code_) {
       
 19142 +    generator.SetExceptionInformation(exception_type_,
       
 19143 +                                      exception_code_,
       
 19144 +                                      exception_subcode_,
       
 19145 +                                      crashing_thread_);
       
 19146 +  }
       
 19147 +
       
 19148 +
       
 19149 +  bool result = generator.Write([minidumpPath fileSystemRepresentation]);
       
 19150 +
       
 19151 +  if (result) {
       
 19152 +    DEBUGLOG(stderr, "Wrote minidump - OK\n");
       
 19153 +  } else {
       
 19154 +    DEBUGLOG(stderr, "Error writing minidump - errno=%s\n",  strerror(errno));
       
 19155 +  }
       
 19156 +
       
 19157 +  // let the task continue
       
 19158 +  task_resume(remote_task_);
       
 19159 +  DEBUGLOG(stderr, "Resumed remote task\n");
       
 19160 +
       
 19161 +  return result;
       
 19162 +}
       
 19163 +
       
 19164 +//=============================================================================
       
 19165 +// The crashed task needs to be told that the inspection has finished.
       
 19166 +// It will wait on a mach port (with timeout) until we send acknowledgement.
       
 19167 +kern_return_t Inspector::SendAcknowledgement() {
       
 19168 +  if (ack_port_ != MACH_PORT_DEAD) {
       
 19169 +    MachPortSender sender(ack_port_);
       
 19170 +    MachSendMessage ack_message(kMsgType_InspectorAcknowledgement);
       
 19171 +
       
 19172 +    DEBUGLOG(stderr, "Inspector: trying to send acknowledgement to port %d\n",
       
 19173 +      ack_port_);
       
 19174 +
       
 19175 +    kern_return_t result = sender.SendMessage(ack_message, 2000);
       
 19176 +
       
 19177 +#if VERBOSE
       
 19178 +    PRINT_MACH_RESULT(result, "Inspector: sent acknowledgement");
       
 19179 +#endif
       
 19180 +
       
 19181 +    return result;
       
 19182 +  }
       
 19183 +
       
 19184 +  DEBUGLOG(stderr, "Inspector: port translation failure!\n");
       
 19185 +  return KERN_INVALID_NAME;
       
 19186 +}
       
 19187 +
       
 19188 +//=============================================================================
       
 19189 +void Inspector::LaunchReporter(const char *inConfigFilePath) {
       
 19190 +  // Extract the path to the reporter executable.
       
 19191 +  const char *reporterExecutablePath =
       
 19192 +          config_params_.GetValueForKey(BREAKPAD_REPORTER_EXE_LOCATION);
       
 19193 +  DEBUGLOG(stderr, "reporter path = %s\n", reporterExecutablePath);
       
 19194 +
       
 19195 +  // Setup and launch the crash dump sender.
       
 19196 +  const char *argv[3];
       
 19197 +  argv[0] = reporterExecutablePath;
       
 19198 +  argv[1] = inConfigFilePath;
       
 19199 +  argv[2] = NULL;
       
 19200 +
       
 19201 +  // Launch the reporter
       
 19202 +  pid_t pid = fork();
       
 19203 +
       
 19204 +  // If we're in the child, load in our new executable and run.
       
 19205 +  // The parent will not wait for the child to complete.
       
 19206 +  if (pid == 0) {
       
 19207 +    execv(argv[0], (char * const *)argv);
       
 19208 +    config_file_.Unlink();  // launch failed - get rid of config file
       
 19209 +    DEBUGLOG(stderr, "Inspector: unable to launch reporter app\n");
       
 19210 +    _exit(1);
       
 19211 +  }
       
 19212 +
       
 19213 +  // Wait until the Reporter child process exits.
       
 19214 +  //
       
 19215 +
       
 19216 +  // We'll use a timeout of one minute.
       
 19217 +  int timeoutCount = 60;   // 60 seconds
       
 19218 +
       
 19219 +  while (timeoutCount-- > 0) {
       
 19220 +    int status;
       
 19221 +    pid_t result = waitpid(pid, &status, WNOHANG);
       
 19222 +
       
 19223 +    if (result == 0) {
       
 19224 +      // The child has not yet finished.
       
 19225 +      sleep(1);
       
 19226 +    } else if (result == -1) {
       
 19227 +      DEBUGLOG(stderr, "Inspector: waitpid error (%d) waiting for reporter app\n",
       
 19228 +        errno);
       
 19229 +      break;
       
 19230 +    } else {
       
 19231 +      // child has finished
       
 19232 +      break;
       
 19233 +    }
       
 19234 +  }
       
 19235 +}
       
 19236 +
       
 19237 +} // namespace google_breakpad
       
 19238 +
       
 19239 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/InspectorMain.mm b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/InspectorMain.mm
       
 19240 new file mode 100644
       
 19241 --- /dev/null
       
 19242 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/crash_generation/InspectorMain.mm
       
 19243 @@ -0,0 +1,65 @@
       
 19244 +// Copyright (c) 2007, Google Inc.
       
 19245 +// All rights reserved.
       
 19246 +//
       
 19247 +// Redistribution and use in source and binary forms, with or without
       
 19248 +// modification, are permitted provided that the following conditions are
       
 19249 +// met:
       
 19250 +//
       
 19251 +//     * Redistributions of source code must retain the above copyright
       
 19252 +// notice, this list of conditions and the following disclaimer.
       
 19253 +//     * Redistributions in binary form must reproduce the above
       
 19254 +// copyright notice, this list of conditions and the following disclaimer
       
 19255 +// in the documentation and/or other materials provided with the
       
 19256 +// distribution.
       
 19257 +//     * Neither the name of Google Inc. nor the names of its
       
 19258 +// contributors may be used to endorse or promote products derived from
       
 19259 +// this software without specific prior written permission.
       
 19260 +//
       
 19261 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 19262 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 19263 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 19264 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 19265 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 19266 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 19267 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 19268 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 19269 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 19270 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 19271 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 19272 +//
       
 19273 +// Main driver for Inspector
       
 19274 +
       
 19275 +#import "client/mac/crash_generation/Inspector.h"
       
 19276 +#import <Cocoa/Cocoa.h>
       
 19277 +
       
 19278 +namespace google_breakpad {
       
 19279 +
       
 19280 +//=============================================================================
       
 19281 +extern "C" {
       
 19282 +
       
 19283 +int main(int argc, char *const argv[]) {
       
 19284 +#if DEBUG
       
 19285 +  // Since we're launched on-demand, this is necessary to see debugging
       
 19286 +  // output in the console window.
       
 19287 +  freopen("/dev/console", "w", stdout);
       
 19288 +  freopen("/dev/console", "w", stderr);
       
 19289 +#endif
       
 19290 +
       
 19291 +  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
       
 19292 +
       
 19293 +  if (argc != 2) {
       
 19294 +    exit(0);
       
 19295 +  }
       
 19296 +  // Our first command-line argument contains the name of the service
       
 19297 +  // that we're providing.
       
 19298 +  google_breakpad::Inspector inspector;
       
 19299 +  inspector.Inspect(argv[1]);
       
 19300 +
       
 19301 +  [pool release];
       
 19302 +
       
 19303 +  return 0;
       
 19304 +}
       
 19305 +
       
 19306 +} // extern "C"
       
 19307 +
       
 19308 +} // namespace google_breakpad
       
 19309 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/gcov/libgcov.a b/toolkit/crashreporter/google-breakpad/src/client/mac/gcov/libgcov.a
       
 19310 new file mode 100644
       
 19311 index 0000000000000000000000000000000000000000..f45a58d71d01b554fbf4db03f4805f2123797e18
       
 19312 GIT binary patch
       
 19313 literal 35048
       
 19314 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
       
 19536 Rh#w8PpBwbI-G=d_{{+ece?9;J
       
 19537 
       
 19538 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.cc b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.cc
       
 19539 --- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.cc
       
 19540 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler.cc
       
 19541 @@ -87,22 +87,25 @@ exception_mask_t s_exception_mask = EXC_
       
 19542  EXC_MASK_BAD_INSTRUCTION | EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT;
       
 19543  
       
 19544  extern "C"
       
 19545  {
       
 19546    // Forward declarations for functions that need "C" style compilation
       
 19547    boolean_t exc_server(mach_msg_header_t *request,
       
 19548                         mach_msg_header_t *reply);
       
 19549  
       
 19550 +  // This symbol must be visible to dlsym() - see
       
 19551 +  // http://code.google.com/p/google-breakpad/issues/detail?id=345 for details.
       
 19552    kern_return_t catch_exception_raise(mach_port_t target_port,
       
 19553                                        mach_port_t failed_thread,
       
 19554                                        mach_port_t task,
       
 19555                                        exception_type_t exception,
       
 19556                                        exception_data_t code,
       
 19557 -                                      mach_msg_type_number_t code_count);
       
 19558 +                                      mach_msg_type_number_t code_count)
       
 19559 +      __attribute__((visibility("default")));
       
 19560  
       
 19561    kern_return_t ForwardException(mach_port_t task,
       
 19562                                   mach_port_t failed_thread,
       
 19563                                   exception_type_t exception,
       
 19564                                   exception_data_t code,
       
 19565                                   mach_msg_type_number_t code_count);
       
 19566  
       
 19567    kern_return_t exception_raise(mach_port_t target_port,
       
 19568 @@ -317,18 +320,18 @@ bool ExceptionHandler::WriteMinidumpWith
       
 19569      if (!dump_path_.empty()) {
       
 19570        MinidumpGenerator md;
       
 19571        if (exception_type && exception_code) {
       
 19572          // If this is a real exception, give the filter (if any) a chance to
       
 19573          // decided if this should be sent
       
 19574          if (filter_ && !filter_(callback_context_))
       
 19575            return false;
       
 19576  
       
 19577 -        md.SetExceptionInformation(exception_type, exception_code, exception_subcode,
       
 19578 -                                   thread_name);
       
 19579 +        md.SetExceptionInformation(exception_type, exception_code,
       
 19580 +                                   exception_subcode, thread_name);
       
 19581        }
       
 19582  
       
 19583        result = md.Write(next_minidump_path_c_);
       
 19584      }
       
 19585  
       
 19586      // Call user specified callback (if any)
       
 19587      if (callback_) {
       
 19588        // If the user callback returned true and we're handling an exception
       
 19589 @@ -430,16 +433,19 @@ kern_return_t ForwardException(mach_port
       
 19590  }
       
 19591  
       
 19592  // Callback from exc_server()
       
 19593  kern_return_t catch_exception_raise(mach_port_t port, mach_port_t failed_thread,
       
 19594                                      mach_port_t task,
       
 19595                                      exception_type_t exception,
       
 19596                                      exception_data_t code,
       
 19597                                      mach_msg_type_number_t code_count) {
       
 19598 +  if (task != mach_task_self()) {
       
 19599 +    return KERN_FAILURE;
       
 19600 +  }
       
 19601    return ForwardException(task, failed_thread, exception, code, code_count);
       
 19602  }
       
 19603  
       
 19604  // static
       
 19605  void *ExceptionHandler::WaitForMessage(void *exception_handler_class) {
       
 19606    ExceptionHandler *self =
       
 19607      reinterpret_cast<ExceptionHandler *>(exception_handler_class);
       
 19608    ExceptionMessage receive;
       
 19609 @@ -488,17 +494,16 @@ void *ExceptionHandler::WaitForMessage(v
       
 19610            gBreakpadAllocator->Protect();
       
 19611  #endif
       
 19612  
       
 19613          self->ResumeThreads();
       
 19614  
       
 19615          if (self->use_minidump_write_mutex_)
       
 19616            pthread_mutex_unlock(&self->minidump_write_mutex_);
       
 19617        } else {
       
 19618 -
       
 19619          // When forking a child process with the exception handler installed,
       
 19620          // if the child crashes, it will send the exception back to the parent
       
 19621          // process.  The check for task == self_task() ensures that only
       
 19622          // exceptions that occur in the parent process are caught and
       
 19623          // processed.  If the exception was not caused by this task, we
       
 19624          // still need to call into the exception server and have it return
       
 19625          // KERN_FAILURE (see breakpad_exception_raise) in order for the kernel
       
 19626          // to move onto the host exception handler for the child task
       
 19627 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler_test.cc b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler_test.cc
       
 19628 --- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler_test.cc
       
 19629 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/exception_handler_test.cc
       
 19630 @@ -23,25 +23,17 @@
       
 19631  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 19632  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 19633  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 19634  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 19635  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 19636  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 19637  
       
 19638  /*
       
 19639 -g++ -framework CoreFoundation -I../../.. \
       
 19640 -	../../minidump_file_writer.cc \
       
 19641 -	../../../common/convert_UTF.c \
       
 19642 -	../../../common/string_conversion.cc \
       
 19643 -	../../../common/mac/string_utilities.cc \
       
 19644 -	exception_handler.cc \
       
 19645 -	minidump_generator.cc \
       
 19646 -	exception_handler_test.cc \
       
 19647 -	-o exception_handler_test
       
 19648 +g++ -framework CoreFoundation -I../../.. ../../minidump_file_writer.cc ../../../common/convert_UTF.c ../../../common/string_conversion.cc ../../../common/mac/string_utilities.cc exception_handler.cc minidump_generator.cc exception_handler_test.cc -o exception_handler_test -mmacosx-version-min=10.4 ../../../common/mac/file_id.cc  dynamic_images.cc ../../../common/mac/macho_id.cc  ../../../common/mac/macho_walker.cc  -lcrypto ../../../common/mac/macho_utilities.cc 
       
 19649  */
       
 19650  
       
 19651  #include <pthread.h>
       
 19652  #include <pwd.h>
       
 19653  #include <unistd.h>
       
 19654  
       
 19655  #include <CoreFoundation/CoreFoundation.h>
       
 19656  
       
 19657 @@ -50,16 +42,17 @@ g++ -framework CoreFoundation -I../../..
       
 19658  
       
 19659  using std::string;
       
 19660  using google_breakpad::ExceptionHandler;
       
 19661  
       
 19662  static void *SleepyFunction(void *) {
       
 19663    while (1) {
       
 19664      sleep(10000);
       
 19665    }
       
 19666 +  return NULL;
       
 19667  }
       
 19668  
       
 19669  static void Crasher() {
       
 19670    int *a = (int*)0x42;
       
 19671  
       
 19672  	fprintf(stdout, "Going to crash...\n");
       
 19673    fprintf(stdout, "A = %d", *a);
       
 19674  }
       
 19675 @@ -72,36 +65,35 @@ bool MDCallback(const char *dump_dir, co
       
 19676                  void *context, bool success) {
       
 19677    string path(dump_dir);
       
 19678    string dest(dump_dir);
       
 19679    path.append(file_name);
       
 19680    path.append(".dmp");
       
 19681  
       
 19682    fprintf(stdout, "Minidump: %s\n", path.c_str());
       
 19683    // Indicate that we've handled the callback
       
 19684 -  return true;
       
 19685 +  exit(0);
       
 19686  }
       
 19687  
       
 19688  int main(int argc, char * const argv[]) {
       
 19689    char buffer[PATH_MAX];
       
 19690 -  struct passwd *user = getpwuid(getuid());
       
 19691  
       
 19692    // Home dir
       
 19693 -  snprintf(buffer, sizeof(buffer), "/Users/%s/Desktop/", user->pw_name);
       
 19694 +  snprintf(buffer, sizeof(buffer), "/tmp/");
       
 19695  
       
 19696    string path(buffer);
       
 19697    ExceptionHandler eh(path, NULL, MDCallback, NULL, true);
       
 19698    pthread_t t;
       
 19699  
       
 19700    if (pthread_create(&t, NULL, SleepyFunction, NULL) == 0) {
       
 19701      pthread_detach(t);
       
 19702    } else {
       
 19703      perror("pthread_create");
       
 19704    }
       
 19705  
       
 19706 -  // Dump a test
       
 19707 -  eh.WriteMinidump();
       
 19708 +//   // Dump a test
       
 19709 +//   eh.WriteMinidump();
       
 19710  
       
 19711  	// Test the handler
       
 19712    SoonToCrash();
       
 19713  
       
 19714    return 0;
       
 19715  }
       
 19716 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.cc b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.cc
       
 19717 --- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.cc
       
 19718 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.cc
       
 19719 @@ -169,17 +169,17 @@ bool MinidumpGenerator::Write(const char
       
 19720      &MinidumpGenerator::WriteModuleListStream,
       
 19721      &MinidumpGenerator::WriteMiscInfoStream,
       
 19722      &MinidumpGenerator::WriteBreakpadInfoStream,
       
 19723      // Exception stream needs to be the last entry in this array as it may
       
 19724      // be omitted in the case where the minidump is written without an
       
 19725      // exception.
       
 19726      &MinidumpGenerator::WriteExceptionStream,
       
 19727    };
       
 19728 -  bool result = true;
       
 19729 +  bool result = false;
       
 19730  
       
 19731    // If opening was successful, create the header, directory, and call each
       
 19732    // writer.  The destructor for the TypedMDRVAs will cause the data to be
       
 19733    // flushed.  The destructor for the MinidumpFileWriter will close the file.
       
 19734    if (writer_.Open(path)) {
       
 19735      TypedMDRVA<MDRawHeader> header(&writer_);
       
 19736      TypedMDRVA<MDRawDirectory> dir(&writer_);
       
 19737  
       
 19738 @@ -200,16 +200,17 @@ bool MinidumpGenerator::Write(const char
       
 19739      MDRawHeader *header_ptr = header.get();
       
 19740      header_ptr->signature = MD_HEADER_SIGNATURE;
       
 19741      header_ptr->version = MD_HEADER_VERSION;
       
 19742      time(reinterpret_cast<time_t *>(&(header_ptr->time_date_stamp)));
       
 19743      header_ptr->stream_count = writer_count;
       
 19744      header_ptr->stream_directory_rva = dir.position();
       
 19745  
       
 19746      MDRawDirectory local_dir;
       
 19747 +    result = true;
       
 19748      for (int i = 0; (result) && (i < writer_count); ++i) {
       
 19749        result = (this->*writers[i])(&local_dir);
       
 19750  
       
 19751        if (result)
       
 19752          dir.CopyIndex(i, &local_dir);
       
 19753      }
       
 19754    }
       
 19755    return result;
       
 19756 @@ -317,56 +318,43 @@ bool MinidumpGenerator::WriteStackFromSt
       
 19757    return result;
       
 19758  }
       
 19759  
       
 19760  #if TARGET_CPU_PPC || TARGET_CPU_PPC64
       
 19761  bool MinidumpGenerator::WriteStack(breakpad_thread_state_data_t state,
       
 19762                                     MDMemoryDescriptor *stack_location) {
       
 19763    breakpad_thread_state_t *machine_state =
       
 19764      reinterpret_cast<breakpad_thread_state_t *>(state);
       
 19765 -#if TARGET_CPU_PPC
       
 19766 -  mach_vm_address_t start_addr = machine_state->r1;
       
 19767 -#else
       
 19768 -  mach_vm_address_t start_addr = machine_state->__r1;
       
 19769 -#endif
       
 19770 +  mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, r1);
       
 19771    return WriteStackFromStartAddress(start_addr, stack_location);
       
 19772  }
       
 19773  
       
 19774  u_int64_t
       
 19775  MinidumpGenerator::CurrentPCForStack(breakpad_thread_state_data_t state) {
       
 19776    breakpad_thread_state_t *machine_state =
       
 19777      reinterpret_cast<breakpad_thread_state_t *>(state);
       
 19778  
       
 19779 -#if TARGET_CPU_PPC
       
 19780 -  return machine_state->srr0;
       
 19781 -#else
       
 19782 -  return machine_state->__srr0;
       
 19783 -#endif
       
 19784 +  return REGISTER_FROM_THREADSTATE(machine_state, srr0);
       
 19785  }
       
 19786  
       
 19787  bool MinidumpGenerator::WriteContext(breakpad_thread_state_data_t state,
       
 19788                                       MDLocationDescriptor *register_location) {
       
 19789    TypedMDRVA<MinidumpContext> context(&writer_);
       
 19790    breakpad_thread_state_t *machine_state =
       
 19791      reinterpret_cast<breakpad_thread_state_t *>(state);
       
 19792  
       
 19793    if (!context.Allocate())
       
 19794      return false;
       
 19795  
       
 19796    *register_location = context.location();
       
 19797    MinidumpContext *context_ptr = context.get();
       
 19798    context_ptr->context_flags = MD_CONTEXT_PPC_BASE;
       
 19799  
       
 19800 -#if TARGET_CPU_PPC64
       
 19801 -#define AddReg(a) context_ptr->a = machine_state->__ ## a
       
 19802 -#define AddGPR(a) context_ptr->gpr[a] = machine_state->__r ## a
       
 19803 -#else
       
 19804 -#define AddReg(a) context_ptr->a = machine_state->a
       
 19805 -#define AddGPR(a) context_ptr->gpr[a] = machine_state->r ## a
       
 19806 -#endif
       
 19807 +#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)
       
 19808 +#define AddGPR(a) context_ptr->gpr[a] = REGISTER_FROM_THREADSTATE(machine_state, r ## a)
       
 19809   
       
 19810    AddReg(srr0);
       
 19811    AddReg(cr);
       
 19812    AddReg(xer);
       
 19813    AddReg(ctr);
       
 19814    AddReg(lr);
       
 19815    AddReg(vrsave);
       
 19816  
       
 19817 @@ -415,51 +403,50 @@ bool MinidumpGenerator::WriteContext(bre
       
 19818  #elif TARGET_CPU_X86 || TARGET_CPU_X86_64
       
 19819  
       
 19820  bool MinidumpGenerator::WriteStack(breakpad_thread_state_data_t state,
       
 19821                                     MDMemoryDescriptor *stack_location) {
       
 19822    breakpad_thread_state_t *machine_state =
       
 19823      reinterpret_cast<breakpad_thread_state_t *>(state);
       
 19824  
       
 19825  #if TARGET_CPU_X86_64
       
 19826 -  mach_vm_address_t start_addr = machine_state->__rsp;
       
 19827 +  mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, rsp);
       
 19828  #else
       
 19829 -  mach_vm_address_t start_addr = machine_state->esp;
       
 19830 +  mach_vm_address_t start_addr = REGISTER_FROM_THREADSTATE(machine_state, esp);
       
 19831  #endif
       
 19832    return WriteStackFromStartAddress(start_addr, stack_location);
       
 19833  }
       
 19834  
       
 19835  u_int64_t
       
 19836  MinidumpGenerator::CurrentPCForStack(breakpad_thread_state_data_t state) {
       
 19837    breakpad_thread_state_t *machine_state =
       
 19838      reinterpret_cast<breakpad_thread_state_t *>(state);
       
 19839  
       
 19840  #if TARGET_CPU_X86_64
       
 19841 -  return machine_state->__rip;
       
 19842 +  return REGISTER_FROM_THREADSTATE(machine_state, rip);
       
 19843  #else
       
 19844 -  return machine_state->eip;
       
 19845 +  return REGISTER_FROM_THREADSTATE(machine_state, eip);
       
 19846  #endif
       
 19847  }
       
 19848  
       
 19849  bool MinidumpGenerator::WriteContext(breakpad_thread_state_data_t state,
       
 19850                                       MDLocationDescriptor *register_location) {
       
 19851    TypedMDRVA<MinidumpContext> context(&writer_);
       
 19852    breakpad_thread_state_t *machine_state =
       
 19853      reinterpret_cast<breakpad_thread_state_t *>(state);
       
 19854  
       
 19855    if (!context.Allocate())
       
 19856      return false;
       
 19857  
       
 19858    *register_location = context.location();
       
 19859    MinidumpContext *context_ptr = context.get();
       
 19860  
       
 19861 +#define AddReg(a) context_ptr->a = REGISTER_FROM_THREADSTATE(machine_state, a)
       
 19862  #if TARGET_CPU_X86
       
 19863    context_ptr->context_flags = MD_CONTEXT_X86;
       
 19864 -
       
 19865 -#define AddReg(a) context_ptr->a = machine_state->a
       
 19866    AddReg(eax);
       
 19867    AddReg(ebx);
       
 19868    AddReg(ecx);
       
 19869    AddReg(edx);
       
 19870    AddReg(esi);
       
 19871    AddReg(edi);
       
 19872    AddReg(ebp);
       
 19873    AddReg(esp);
       
 19874 @@ -469,18 +456,16 @@ bool MinidumpGenerator::WriteContext(bre
       
 19875    AddReg(ss);
       
 19876    AddReg(es);
       
 19877    AddReg(fs);
       
 19878    AddReg(gs);
       
 19879    AddReg(eflags);
       
 19880  
       
 19881    AddReg(eip);
       
 19882  #else
       
 19883 -
       
 19884 -#define AddReg(a) context_ptr->a = machine_state->__ ## a
       
 19885    context_ptr->context_flags = MD_CONTEXT_AMD64;
       
 19886    AddReg(rax);
       
 19887    AddReg(rbx);
       
 19888    AddReg(rcx);
       
 19889    AddReg(rdx);
       
 19890    AddReg(rdi);
       
 19891    AddReg(rsi);
       
 19892    AddReg(rbp);
       
 19893 @@ -498,16 +483,17 @@ bool MinidumpGenerator::WriteContext(bre
       
 19894    // not used in the flags register.  Since the minidump format
       
 19895    // specifies 32 bits for the flags register, we can truncate safely
       
 19896    // with no loss.
       
 19897    context_ptr->eflags = machine_state->__rflags;
       
 19898    AddReg(cs);
       
 19899    AddReg(fs);
       
 19900    AddReg(gs);
       
 19901  #endif
       
 19902 +#undef AddReg(a)
       
 19903  
       
 19904    return true;
       
 19905  }
       
 19906  #endif
       
 19907  
       
 19908  bool MinidumpGenerator::WriteThreadStream(mach_port_t thread_id,
       
 19909                                            MDRawThread *thread) {
       
 19910    breakpad_thread_state_data_t state;
       
 19911 @@ -646,23 +632,38 @@ bool MinidumpGenerator::WriteSystemInfoS
       
 19912        int unused, unused2;
       
 19913        // get vendor id
       
 19914        cpuid(0, unused, info_ptr->cpu.x86_cpu_info.vendor_id[0],
       
 19915              info_ptr->cpu.x86_cpu_info.vendor_id[2],
       
 19916              info_ptr->cpu.x86_cpu_info.vendor_id[1]);
       
 19917        // get version and feature info
       
 19918        cpuid(1, info_ptr->cpu.x86_cpu_info.version_information, unused, unused2,
       
 19919              info_ptr->cpu.x86_cpu_info.feature_information);
       
 19920 +
       
 19921        // family
       
 19922        info_ptr->processor_level =
       
 19923          (info_ptr->cpu.x86_cpu_info.version_information & 0xF00) >> 8;
       
 19924        // 0xMMSS (Model, Stepping)
       
 19925        info_ptr->processor_revision =
       
 19926          (info_ptr->cpu.x86_cpu_info.version_information & 0xF) |
       
 19927          ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0) << 4);
       
 19928 +
       
 19929 +      // decode extended model info
       
 19930 +      if (info_ptr->processor_level == 0xF ||
       
 19931 +          info_ptr->processor_level == 0x6) {
       
 19932 +        info_ptr->processor_revision |=
       
 19933 +          ((info_ptr->cpu.x86_cpu_info.version_information & 0xF0000) >> 4);
       
 19934 +      }
       
 19935 +
       
 19936 +      // decode extended family info
       
 19937 +      if (info_ptr->processor_level == 0xF) {
       
 19938 +        info_ptr->processor_level +=
       
 19939 +          ((info_ptr->cpu.x86_cpu_info.version_information & 0xFF00000) >> 20);
       
 19940 +      }
       
 19941 +
       
 19942  #endif // __i386__
       
 19943        break;
       
 19944      default:
       
 19945        info_ptr->processor_architecture = MD_CPU_ARCHITECTURE_UNKNOWN;
       
 19946        break;
       
 19947    }
       
 19948  
       
 19949    info_ptr->number_of_processors = number_of_processors;
       
 19950 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.h b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.h
       
 19951 --- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.h
       
 19952 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator.h
       
 19953 @@ -61,16 +61,28 @@ typedef MDRawContextX86 MinidumpContext;
       
 19954  #elif TARGET_CPU_PPC64
       
 19955  typedef ppc_thread_state64_t breakpad_thread_state_t;
       
 19956  typedef MDRawContextPPC64 MinidumpContext;
       
 19957  #elif TARGET_CPU_PPC
       
 19958  typedef ppc_thread_state_t breakpad_thread_state_t;
       
 19959  typedef MDRawContextPPC MinidumpContext;
       
 19960  #endif
       
 19961  
       
 19962 +// Use the REGISTER_FROM_THREADSTATE to access a register name from the
       
 19963 +// breakpad_thread_state_t structure.
       
 19964 +#if __DARWIN_UNIX03 || TARGET_CPU_X86_64 || TARGET_CPU_PPC64
       
 19965 +// In The 10.5 SDK Headers Apple prepended __ to the variable names in the
       
 19966 +// i386_thread_state_t structure.  There's no good way to tell what version of
       
 19967 +// the SDK we're compiling against so we just toggle on the same preprocessor
       
 19968 +// symbol Apple's headers use.
       
 19969 +#define REGISTER_FROM_THREADSTATE(a, b) ((a)->__ ## b)
       
 19970 +#else
       
 19971 +#define REGISTER_FROM_THREADSTATE(a, b) (a->b)
       
 19972 +#endif
       
 19973 +
       
 19974  // Creates a minidump file of the current process.  If there is exception data,
       
 19975  // use SetExceptionInformation() to add this to the minidump.  The minidump
       
 19976  // file is generated by the Write() function.
       
 19977  // Usage:
       
 19978  // MinidumpGenerator minidump();
       
 19979  // minidump.Write("/tmp/minidump");
       
 19980  //
       
 19981  class MinidumpGenerator {
       
 19982 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator_test.cc b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator_test.cc
       
 19983 --- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator_test.cc
       
 19984 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_generator_test.cc
       
 19985 @@ -40,24 +40,23 @@
       
 19986  using std::string;
       
 19987  using google_breakpad::MinidumpGenerator;
       
 19988  
       
 19989  static bool doneWritingReport = false;
       
 19990  
       
 19991  static void *Reporter(void *) {
       
 19992    char buffer[PATH_MAX];
       
 19993    MinidumpGenerator md;
       
 19994 -  struct passwd *user = getpwuid(getuid());
       
 19995  
       
 19996    // Write it to the desktop
       
 19997    snprintf(buffer,
       
 19998             sizeof(buffer),
       
 19999 -           "/Users/%s/Desktop/test.dmp",
       
 20000 -           user->pw_name);
       
 20001 -  
       
 20002 +           "/tmp/test.dmp");
       
 20003 +
       
 20004 +
       
 20005    fprintf(stdout, "Writing %s\n", buffer);
       
 20006    unlink(buffer);
       
 20007    md.Write(buffer);
       
 20008    doneWritingReport = true;
       
 20009  
       
 20010    return NULL;
       
 20011  }
       
 20012  
       
 20013 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
       
 20014 --- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
       
 20015 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/minidump_test.xcodeproj/project.pbxproj
       
 20016 @@ -128,19 +128,19 @@
       
 20017  		F917C4F80E03265A00F86017 /* breakpad_exc_server.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_exc_server.h; sourceTree = "<group>"; };
       
 20018  		F93A88750E8B4C700026AF89 /* octestcases.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = octestcases.octest; sourceTree = BUILT_PRODUCTS_DIR; };
       
 20019  		F93A88760E8B4C700026AF89 /* obj-cTestCases-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "obj-cTestCases-Info.plist"; sourceTree = "<group>"; };
       
 20020  		F9721F300E8B07E800D7E813 /* dwarftests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dwarftests.h; sourceTree = "<group>"; };
       
 20021  		F9721F310E8B07E800D7E813 /* dwarftests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dwarftests.mm; sourceTree = "<group>"; };
       
 20022  		F9721F380E8B0CFC00D7E813 /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = SOURCE_ROOT; };
       
 20023  		F9721F390E8B0D0D00D7E813 /* dump_syms.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = dump_syms.mm; path = ../../../common/mac/dump_syms.mm; sourceTree = SOURCE_ROOT; };
       
 20024  		F9721F6B0E8B0D7000D7E813 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
       
 20025 -		F9721F760E8B0DC700D7E813 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/mac/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
       
 20026 -		F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/mac/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
       
 20027 -		F9721F780E8B0DC700D7E813 /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/mac/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
       
 20028 +		F9721F760E8B0DC700D7E813 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
       
 20029 +		F9721F770E8B0DC700D7E813 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
       
 20030 +		F9721F780E8B0DC700D7E813 /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
       
 20031  		F9721FA10E8B0E2300D7E813 /* SenTestingKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SenTestingKit.framework; path = /System/Library/Frameworks/SenTestingKit.framework; sourceTree = "<absolute>"; };
       
 20032  		F9721FA80E8B0E4800D7E813 /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../../../common/md5.c; sourceTree = SOURCE_ROOT; };
       
 20033  		F982089A0DB3280D0017AECA /* breakpad_nlist_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_test.h; sourceTree = "<group>"; };
       
 20034  		F982089B0DB3280D0017AECA /* breakpad_nlist_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_test.cc; sourceTree = "<group>"; };
       
 20035  		F98208A10DB32CAE0017AECA /* breakpad_nlist_64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = breakpad_nlist_64.cc; sourceTree = "<group>"; };
       
 20036  		F98208A20DB32CAE0017AECA /* breakpad_nlist_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = breakpad_nlist_64.h; sourceTree = "<group>"; };
       
 20037  		F9AE19B50DB040E300C98454 /* minidump_tests32-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "minidump_tests32-Info.plist"; sourceTree = "<group>"; };
       
 20038  		F9AE19C30DB04A9500C98454 /* minidump_tests64.cptest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = minidump_tests64.cptest; sourceTree = BUILT_PRODUCTS_DIR; };
       
 20039 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym
       
 20040 --- a/toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym
       
 20041 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym
       
 20042 @@ -75,49 +75,49 @@ FILE 73 /Developer/SDKs/MacOSX10.4u.sdk/
       
 20043  FILE 74 ../../../common/mac/dwarf/dwarf2reader.h
       
 20044  FILE 75 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_stack.h
       
 20045  FILE 76 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/deque.tcc
       
 20046  FILE 77 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/list.tcc
       
 20047  FILE 78 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/vector.tcc
       
 20048  FILE 79 /Developer/SDKs/MacOSX10.4u.sdk/usr/include/c++/4.0.0/bits/stl_uninitialized.h
       
 20049  FILE 80 /var/tmp/gcc/gcc-5484~1/src/gcc/libgcc2.c
       
 20050  FUNC 162a 28 0 _OSSwapInt16
       
 20051 -162a 10 44 1
       
 20052 -163a 16 46 1
       
 20053 -1650 2 47 1
       
 20054 +162a 10 44 55
       
 20055 +163a 16 46 55
       
 20056 +1650 2 47 55
       
 20057  FUNC 1652 1c 0 _OSSwapInt32
       
 20058 -1652 f 53 1
       
 20059 -1661 8 55 1
       
 20060 -1669 3 56 1
       
 20061 -166c 2 57 1
       
 20062 +1652 f 53 55
       
 20063 +1661 8 55 55
       
 20064 +1669 3 56 55
       
 20065 +166c 2 57 55
       
 20066  FUNC 166e 2b 0 _OSSwapInt64
       
 20067 -166e 12 64 1
       
 20068 -1680 11 69 1
       
 20069 -1691 6 70 1
       
 20070 -1697 2 71 1
       
 20071 -1699 1 71 1
       
 20072 +166e 12 64 55
       
 20073 +1680 11 69 55
       
 20074 +1691 6 70 55
       
 20075 +1697 2 71 55
       
 20076 +1699 1 71 55
       
 20077  FUNC 169a 1e 0 NXSwapShort
       
 20078 -169a 10 43 2
       
 20079 -16aa c 45 2
       
 20080 -16b6 2 46 2
       
 20081 +169a 10 43 56
       
 20082 +16aa c 45 56
       
 20083 +16b6 2 46 56
       
 20084  FUNC 16b8 19 0 NXSwapInt
       
 20085 -16b8 f 52 2
       
 20086 -16c7 8 54 2
       
 20087 -16cf 2 55 2
       
 20088 -16d1 1 55 2
       
 20089 +16b8 f 52 56
       
 20090 +16c7 8 54 56
       
 20091 +16cf 2 55 56
       
 20092 +16d1 1 55 56
       
 20093  FUNC 16d2 19 0 NXSwapLong
       
 20094 -16d2 f 61 2
       
 20095 -16e1 8 63 2
       
 20096 -16e9 2 64 2
       
 20097 -16eb 1 64 2
       
 20098 +16d2 f 61 56
       
 20099 +16e1 8 63 56
       
 20100 +16e9 2 64 56
       
 20101 +16eb 1 64 56
       
 20102  FUNC 16ec 1f 0 NXSwapLongLong
       
 20103 -16ec 12 70 2
       
 20104 -16fe b 72 2
       
 20105 -1709 2 73 2
       
 20106 -170b 1 73 2
       
 20107 +16ec 12 70 56
       
 20108 +16fe b 72 56
       
 20109 +1709 2 73 56
       
 20110 +170b 1 73 56
       
 20111  FUNC 170c 181 0 -[DumpSymbols convertCPlusPlusSymbols:]
       
 20112  170c 14 128 3
       
 20113  1720 54 130 3
       
 20114  1774 f 132 3
       
 20115  1783 7 133 3
       
 20116  178a 1a 136 3
       
 20117  17a4 5 138 3
       
 20118  17a9 1a 139 3
       
 20119 @@ -144,2237 +144,2201 @@ 19d0 1e 171 3
       
 20120  19ee 11 162 3
       
 20121  19ff 7 181 3
       
 20122  1a06 6 182 3
       
 20123  1a0c 5 184 3
       
 20124  1a11 15 185 3
       
 20125  1a26 6 18 4
       
 20126  1a2c 6 19 4
       
 20127  1a32 6 20 4
       
 20128 -1a38 6 185 4
       
 20129 -1a3e 28 186 4
       
 20130 -1a66 21 187 4
       
 20131 -1a87 1a 188 4
       
 20132 -1aa1 a 190 4
       
 20133 -1aab c 194 4
       
 20134 -1ab7 43 198 4
       
 20135 -1afa 21 199 4
       
 20136 -1b1b 20 202 4
       
 20137 -1b3b 2e 203 4
       
 20138 -1b69 1e 194 4
       
 20139 -1b87 c 184 4
       
 20140 -1b93 17 207 4
       
 20141 -1baa 7 208 4
       
 20142 -1bb1 1 208 4
       
 20143 +1a38 6 185 3
       
 20144 +1a3e 28 186 3
       
 20145 +1a66 21 187 3
       
 20146 +1a87 1a 188 3
       
 20147 +1aa1 a 190 3
       
 20148 +1aab c 194 3
       
 20149 +1ab7 43 198 3
       
 20150 +1afa 21 199 3
       
 20151 +1b1b 20 202 3
       
 20152 +1b3b 2e 203 3
       
 20153 +1b69 1e 194 3
       
 20154 +1b87 c 184 3
       
 20155 +1b93 17 207 3
       
 20156 +1baa 7 208 3
       
 20157 +1bb1 1 208 3
       
 20158  FUNC 1bb2 4a2 0 -[DumpSymbols addFunction:line:address:section:]
       
 20159 -1bb2 21 211 4
       
 20160 -1bd3 2f 212 4
       
 20161 -1c02 e 214 4
       
 20162 -1c10 4 219 4
       
 20163 -1c14 2a 221 4
       
 20164 -1c3e 22 223 4
       
 20165 -1c60 6 224 4
       
 20166 -1c66 2a 225 4
       
 20167 -1c90 4 226 4
       
 20168 -1c94 2e 230 4
       
 20169 -1cc2 2e 233 4
       
 20170 -1cf0 2e 236 4
       
 20171 -1d1e a 239 4
       
 20172 -1d28 2b 253 4
       
 20173 -1d53 e 254 4
       
 20174 -1d61 3c 255 4
       
 20175 +1bb2 21 211 3
       
 20176 +1bd3 2f 212 3
       
 20177 +1c02 e 214 3
       
 20178 +1c10 4 219 3
       
 20179 +1c14 2a 221 3
       
 20180 +1c3e 22 223 3
       
 20181 +1c60 6 224 3
       
 20182 +1c66 2a 225 3
       
 20183 +1c90 4 226 3
       
 20184 +1c94 2e 230 3
       
 20185 +1cc2 2e 233 3
       
 20186 +1cf0 2e 236 3
       
 20187 +1d1e a 239 3
       
 20188 +1d28 2b 253 3
       
 20189 +1d53 e 254 3
       
 20190 +1d61 3c 255 3
       
 20191  1d9d 22 32 4
       
 20192 -1dbf 3 256 4
       
 20193 -1dc2 6 259 4
       
 20194 -1dc8 a 260 4
       
 20195 -1dd2 3c 261 4
       
 20196 -1e0e 25 262 4
       
 20197 -1e33 2a 263 4
       
 20198 -1e5d 22 265 4
       
 20199 -1e7f 26 270 4
       
 20200 -1ea5 6 272 4
       
 20201 -1eab 37 273 4
       
 20202 -1ee2 2a 274 4
       
 20203 -1f0c 17 275 4
       
 20204 -1f23 43 278 4
       
 20205 -1f66 2e 279 4
       
 20206 -1f94 23 282 4
       
 20207 -1fb7 43 285 4
       
 20208 -1ffa 52 287 4
       
 20209 -204c 8 289 4
       
 20210 +1dbf 3 256 3
       
 20211 +1dc2 6 259 3
       
 20212 +1dc8 a 260 3
       
 20213 +1dd2 3c 261 3
       
 20214 +1e0e 25 262 3
       
 20215 +1e33 2a 263 3
       
 20216 +1e5d 22 265 3
       
 20217 +1e7f 26 270 3
       
 20218 +1ea5 6 272 3
       
 20219 +1eab 37 273 3
       
 20220 +1ee2 2a 274 3
       
 20221 +1f0c 17 275 3
       
 20222 +1f23 43 278 3
       
 20223 +1f66 2e 279 3
       
 20224 +1f94 23 282 3
       
 20225 +1fb7 43 285 3
       
 20226 +1ffa 52 287 3
       
 20227 +204c 8 289 3
       
 20228  FUNC 2054 5a4 0 -[DumpSymbols processSymbolItem:stringTable:]
       
 20229 -2054 18 292 4
       
 20230 -206c 8 293 4
       
 20231 -2074 4 294 4
       
 20232 -2078 16 297 4
       
 20233 -208e c 298 4
       
 20234 -209a f 300 4
       
 20235 -20a9 b 301 4
       
 20236 -20b4 16 303 4
       
 20237 -20ca 4d 309 4
       
 20238 -2117 38 311 4
       
 20239 -214f 30 315 4
       
 20240 -217f 60 317 4
       
 20241 -21df d 322 4
       
 20242 -21ec 2b 325 4
       
 20243 -2217 3a 327 4
       
 20244 -2251 f 332 4
       
 20245 -2260 2d 333 4
       
 20246 -228d 1a 334 4
       
 20247 -22a7 32 335 4
       
 20248 -22d9 20 342 4
       
 20249 -22f9 c 343 4
       
 20250 -2305 24 348 4
       
 20251 -2329 a 349 4
       
 20252 -2333 3c 350 4
       
 20253 -236f 2a 352 4
       
 20254 -2399 1c 353 4
       
 20255 -23b5 9 354 4
       
 20256 -23be f 356 4
       
 20257 -23cd 2d 357 4
       
 20258 -23fa 2f 358 4
       
 20259 -2429 20 360 4
       
 20260 -2449 c 361 4
       
 20261 -2455 7 363 4
       
 20262 -245c 21 365 4
       
 20263 -247d 4a 368 4
       
 20264 -24c7 9 370 4
       
 20265 -24d0 1a 371 4
       
 20266 -24ea 4b 372 4
       
 20267 -2535 4 373 4
       
 20268 -2539 5 371 4
       
 20269 -253e 29 374 4
       
 20270 -2567 2d 376 4
       
 20271 -2594 4b 378 4
       
 20272 -25df 4 379 4
       
 20273 -25e3 a 382 4
       
 20274 -25ed b 383 4
       
 20275 +2054 18 292 3
       
 20276 +206c 8 293 3
       
 20277 +2074 4 294 3
       
 20278 +2078 16 297 3
       
 20279 +208e c 298 3
       
 20280 +209a f 300 3
       
 20281 +20a9 b 301 3
       
 20282 +20b4 16 303 3
       
 20283 +20ca 4d 309 3
       
 20284 +2117 38 311 3
       
 20285 +214f 30 315 3
       
 20286 +217f 60 317 3
       
 20287 +21df d 322 3
       
 20288 +21ec 2b 325 3
       
 20289 +2217 3a 327 3
       
 20290 +2251 f 332 3
       
 20291 +2260 2d 333 3
       
 20292 +228d 1a 334 3
       
 20293 +22a7 32 335 3
       
 20294 +22d9 20 342 3
       
 20295 +22f9 c 343 3
       
 20296 +2305 24 348 3
       
 20297 +2329 a 349 3
       
 20298 +2333 3c 350 3
       
 20299 +236f 2a 352 3
       
 20300 +2399 1c 353 3
       
 20301 +23b5 9 354 3
       
 20302 +23be f 356 3
       
 20303 +23cd 2d 357 3
       
 20304 +23fa 2f 358 3
       
 20305 +2429 20 360 3
       
 20306 +2449 c 361 3
       
 20307 +2455 7 363 3
       
 20308 +245c 21 365 3
       
 20309 +247d 4a 368 3
       
 20310 +24c7 9 370 3
       
 20311 +24d0 1a 371 3
       
 20312 +24ea 4b 372 3
       
 20313 +2535 4 373 3
       
 20314 +2539 5 371 3
       
 20315 +253e 29 374 3
       
 20316 +2567 2d 376 3
       
 20317 +2594 4b 378 3
       
 20318 +25df 4 379 3
       
 20319 +25e3 a 382 3
       
 20320 +25ed b 383 3
       
 20321  FUNC 25f8 c9 0 -[DumpSymbols loadSymbolInfo:offset:]
       
 20322 -25f8 13 391 4
       
 20323 -260b 2b 392 4
       
 20324 -2636 2a 393 4
       
 20325 -2660 2d 395 4
       
 20326 -268d 2e 398 4
       
 20327 -26bb 6 399 4
       
 20328 -26c1 1 399 4
       
 20329 +25f8 13 391 3
       
 20330 +260b 2b 392 3
       
 20331 +2636 2a 393 3
       
 20332 +2660 2d 395 3
       
 20333 +268d 2e 398 3
       
 20334 +26bb 6 399 3
       
 20335 +26c1 1 399 3
       
 20336  FUNC 26c2 2be 0 -[DumpSymbols loadSTABSSymbolInfo:offset:]
       
 20337 -26c2 16 537 4
       
 20338 -26d8 9 538 4
       
 20339 -26e1 10 539 4
       
 20340 -26f1 2e 540 4
       
 20341 -271f 9 542 4
       
 20342 -2728 22 543 4
       
 20343 -274a 4 544 4
       
 20344 -274e a 546 4
       
 20345 -2758 3c 547 4
       
 20346 -2794 c 549 4
       
 20347 -27a0 e 550 4
       
 20348 -27ae 6 551 4
       
 20349 -27b4 25 552 4
       
 20350 -27d9 25 553 4
       
 20351 -27fe 25 554 4
       
 20352 -2823 c 555 4
       
 20353 -282f c 556 4
       
 20354 -283b c 559 4
       
 20355 -2847 23 562 4
       
 20356 -286a a 563 4
       
 20357 -2874 a 564 4
       
 20358 -287e 2e 565 4
       
 20359 -28ac 39 566 4
       
 20360 -28e5 2e 570 4
       
 20361 -2913 4 571 4
       
 20362 -2917 17 559 4
       
 20363 -292e 25 575 4
       
 20364 -2953 9 576 4
       
 20365 -295c 17 549 4
       
 20366 -2973 4 579 4
       
 20367 -2977 9 580 4
       
 20368 +26c2 16 537 3
       
 20369 +26d8 9 538 3
       
 20370 +26e1 10 539 3
       
 20371 +26f1 2e 540 3
       
 20372 +271f 9 542 3
       
 20373 +2728 22 543 3
       
 20374 +274a 4 544 3
       
 20375 +274e a 546 3
       
 20376 +2758 3c 547 3
       
 20377 +2794 c 549 3
       
 20378 +27a0 e 550 3
       
 20379 +27ae 6 551 3
       
 20380 +27b4 25 552 3
       
 20381 +27d9 25 553 3
       
 20382 +27fe 25 554 3
       
 20383 +2823 c 555 3
       
 20384 +282f c 556 3
       
 20385 +283b c 559 3
       
 20386 +2847 23 562 3
       
 20387 +286a a 563 3
       
 20388 +2874 a 564 3
       
 20389 +287e 2e 565 3
       
 20390 +28ac 39 566 3
       
 20391 +28e5 2e 570 3
       
 20392 +2913 4 571 3
       
 20393 +2917 17 559 3
       
 20394 +292e 25 575 3
       
 20395 +2953 9 576 3
       
 20396 +295c 17 549 3
       
 20397 +2973 4 579 3
       
 20398 +2977 9 580 3
       
 20399  FUNC 2980 28a 0 -[DumpSymbols loadSymbolInfo64:offset:]
       
 20400 -2980 16 583 4
       
 20401 -2996 9 585 4
       
 20402 -299f 10 586 4
       
 20403 -29af 2e 587 4
       
 20404 -29dd 9 589 4
       
 20405 -29e6 22 590 4
       
 20406 -2a08 4 591 4
       
 20407 -2a0c c 593 4
       
 20408 -2a18 e 594 4
       
 20409 -2a26 6 595 4
       
 20410 -2a2c 25 596 4
       
 20411 -2a51 25 597 4
       
 20412 -2a76 25 598 4
       
 20413 -2a9b 9 599 4
       
 20414 -2aa4 c 600 4
       
 20415 -2ab0 c 603 4
       
 20416 -2abc 17 604 4
       
 20417 -2ad3 23 609 4
       
 20418 -2af6 a 610 4
       
 20419 -2b00 a 611 4
       
 20420 -2b0a 2e 612 4
       
 20421 -2b38 37 613 4
       
 20422 -2b6f 2e 615 4
       
 20423 -2b9d 4 616 4
       
 20424 -2ba1 17 603 4
       
 20425 -2bb8 25 620 4
       
 20426 -2bdd 9 621 4
       
 20427 -2be6 17 593 4
       
 20428 -2bfd 4 624 4
       
 20429 -2c01 9 625 4
       
 20430 +2980 16 583 3
       
 20431 +2996 9 585 3
       
 20432 +299f 10 586 3
       
 20433 +29af 2e 587 3
       
 20434 +29dd 9 589 3
       
 20435 +29e6 22 590 3
       
 20436 +2a08 4 591 3
       
 20437 +2a0c c 593 3
       
 20438 +2a18 e 594 3
       
 20439 +2a26 6 595 3
       
 20440 +2a2c 25 596 3
       
 20441 +2a51 25 597 3
       
 20442 +2a76 25 598 3
       
 20443 +2a9b 9 599 3
       
 20444 +2aa4 c 600 3
       
 20445 +2ab0 c 603 3
       
 20446 +2abc 17 604 3
       
 20447 +2ad3 23 609 3
       
 20448 +2af6 a 610 3
       
 20449 +2b00 a 611 3
       
 20450 +2b0a 2e 612 3
       
 20451 +2b38 37 613 3
       
 20452 +2b6f 2e 615 3
       
 20453 +2b9d 4 616 3
       
 20454 +2ba1 17 603 3
       
 20455 +2bb8 25 620 3
       
 20456 +2bdd 9 621 3
       
 20457 +2be6 17 593 3
       
 20458 +2bfd 4 624 3
       
 20459 +2c01 9 625 3
       
 20460  FUNC 2c0a 199 0 -[DumpSymbols loadSymbolInfoForArchitecture]
       
 20461 -2c0a 13 628 4
       
 20462 -2c1d 41 630 4
       
 20463 -2c5e 2b 631 4
       
 20464 -2c89 1a 632 4
       
 20465 -2ca3 40 634 4
       
 20466 -2ce3 40 635 4
       
 20467 -2d23 5f 637 4
       
 20468 -2d82 17 639 4
       
 20469 -2d99 4 640 4
       
 20470 -2d9d 6 641 4
       
 20471 -2da3 1 641 4
       
 20472 +2c0a 13 628 3
       
 20473 +2c1d 41 630 3
       
 20474 +2c5e 2b 631 3
       
 20475 +2c89 1a 632 3
       
 20476 +2ca3 40 634 3
       
 20477 +2ce3 40 635 3
       
 20478 +2d23 5f 637 3
       
 20479 +2d82 17 639 3
       
 20480 +2d99 4 640 3
       
 20481 +2d9d 6 641 3
       
 20482 +2da3 1 641 3
       
 20483  FUNC 2da4 3e5 0 -[DumpSymbols loadHeader:offset:]
       
 20484 -2da4 18 728 4
       
 20485 -2dbc 9 729 4
       
 20486 -2dc5 10 730 4
       
 20487 -2dd5 2e 731 4
       
 20488 -2e03 9 733 4
       
 20489 -2e0c 2b 734 4
       
 20490 -2e37 1e 736 4
       
 20491 -2e55 c 738 4
       
 20492 -2e61 e 739 4
       
 20493 -2e6f 6 740 4
       
 20494 -2e75 50 742 4
       
 20495 -2ec5 2e 743 4
       
 20496 -2ef3 2e 744 4
       
 20497 -2f21 2e 745 4
       
 20498 -2f4f 20 746 4
       
 20499 -2f6f 1b7 755 4
       
 20500 -3126 9 757 4
       
 20501 -312f 25 761 4
       
 20502 -3154 9 762 4
       
 20503 -315d 17 738 4
       
 20504 -3174 a 765 4
       
 20505 -317e b 766 4
       
 20506 -3189 1 766 4
       
 20507 +2da4 18 728 3
       
 20508 +2dbc 9 729 3
       
 20509 +2dc5 10 730 3
       
 20510 +2dd5 2e 731 3
       
 20511 +2e03 9 733 3
       
 20512 +2e0c 2b 734 3
       
 20513 +2e37 1e 736 3
       
 20514 +2e55 c 738 3
       
 20515 +2e61 e 739 3
       
 20516 +2e6f 6 740 3
       
 20517 +2e75 50 742 3
       
 20518 +2ec5 2e 743 3
       
 20519 +2ef3 2e 744 3
       
 20520 +2f21 2e 745 3
       
 20521 +2f4f 20 746 3
       
 20522 +2f6f 1b7 755 3
       
 20523 +3126 9 757 3
       
 20524 +312f 25 761 3
       
 20525 +3154 9 762 3
       
 20526 +315d 17 738 3
       
 20527 +3174 a 765 3
       
 20528 +317e b 766 3
       
 20529 +3189 1 766 3
       
 20530  FUNC 318a 41d 0 -[DumpSymbols loadHeader64:offset:]
       
 20531 -318a 18 769 4
       
 20532 -31a2 9 771 4
       
 20533 -31ab 10 772 4
       
 20534 -31bb 2e 773 4
       
 20535 -31e9 9 775 4
       
 20536 -31f2 c 777 4
       
 20537 -31fe 2b 778 4
       
 20538 -3229 e 779 4
       
 20539 -3237 6 780 4
       
 20540 -323d 50 781 4
       
 20541 -328d 49 782 4
       
 20542 -32d6 49 783 4
       
 20543 -331f 2e 784 4
       
 20544 -334d 9 785 4
       
 20545 -3356 29 786 4
       
 20546 -337f 1c5 794 4
       
 20547 -3544 9 795 4
       
 20548 -354d 25 799 4
       
 20549 -3572 9 800 4
       
 20550 -357b 17 777 4
       
 20551 -3592 a 803 4
       
 20552 -359c b 804 4
       
 20553 -35a7 1 804 4
       
 20554 +318a 18 769 3
       
 20555 +31a2 9 771 3
       
 20556 +31ab 10 772 3
       
 20557 +31bb 2e 773 3
       
 20558 +31e9 9 775 3
       
 20559 +31f2 c 777 3
       
 20560 +31fe 2b 778 3
       
 20561 +3229 e 779 3
       
 20562 +3237 6 780 3
       
 20563 +323d 50 781 3
       
 20564 +328d 49 782 3
       
 20565 +32d6 49 783 3
       
 20566 +331f 2e 784 3
       
 20567 +334d 9 785 3
       
 20568 +3356 29 786 3
       
 20569 +337f 1c5 794 3
       
 20570 +3544 9 795 3
       
 20571 +354d 25 799 3
       
 20572 +3572 9 800 3
       
 20573 +357b 17 777 3
       
 20574 +3592 a 803 3
       
 20575 +359c b 804 3
       
 20576 +35a7 1 804 3
       
 20577  FUNC 35a8 52a 0 -[DumpSymbols loadModuleInfo]
       
 20578 -35a8 14 807 4
       
 20579 -35bc e 808 4
       
 20580 -35ca 41 810 4
       
 20581 -360b 1a 811 4
       
 20582 -3625 6 812 4
       
 20583 -362b 6 814 4
       
 20584 -3631 17 815 4
       
 20585 -3648 c 816 4
       
 20586 -3654 29 820 4
       
 20587 -367d 29 821 4
       
 20588 -36a6 29 822 4
       
 20589 -36cf 35 824 4
       
 20590 -3704 12 826 4
       
 20591 -3716 17 827 4
       
 20592 -372d c 828 4
       
 20593 -3739 3c 832 4
       
 20594 -3775 a 834 4
       
 20595 -377f 9 836 4
       
 20596 -3788 25 837 4
       
 20597 -37ad c 839 4
       
 20598 -37b9 54 840 4
       
 20599 -380d 57 841 4
       
 20600 -3864 57 842 4
       
 20601 -38bb 57 843 4
       
 20602 -3912 57 844 4
       
 20603 -3969 1c 846 4
       
 20604 -3985 4b 847 4
       
 20605 -39d0 49 849 4
       
 20606 -3a19 13 839 4
       
 20607 -3a2c 6 851 4
       
 20608 -3a32 3c 852 4
       
 20609 -3a6e 3a 854 4
       
 20610 -3aa8 17 857 4
       
 20611 -3abf c 858 4
       
 20612 -3acb 7 859 4
       
 20613 +35a8 14 807 3
       
 20614 +35bc e 808 3
       
 20615 +35ca 41 810 3
       
 20616 +360b 1a 811 3
       
 20617 +3625 6 812 3
       
 20618 +362b 6 814 3
       
 20619 +3631 17 815 3
       
 20620 +3648 c 816 3
       
 20621 +3654 29 820 3
       
 20622 +367d 29 821 3
       
 20623 +36a6 29 822 3
       
 20624 +36cf 35 824 3
       
 20625 +3704 12 826 3
       
 20626 +3716 17 827 3
       
 20627 +372d c 828 3
       
 20628 +3739 3c 832 3
       
 20629 +3775 a 834 3
       
 20630 +377f 9 836 3
       
 20631 +3788 25 837 3
       
 20632 +37ad c 839 3
       
 20633 +37b9 54 840 3
       
 20634 +380d 57 841 3
       
 20635 +3864 57 842 3
       
 20636 +38bb 57 843 3
       
 20637 +3912 57 844 3
       
 20638 +3969 1c 846 3
       
 20639 +3985 4b 847 3
       
 20640 +39d0 49 849 3
       
 20641 +3a19 13 839 3
       
 20642 +3a2c 6 851 3
       
 20643 +3a32 3c 852 3
       
 20644 +3a6e 3a 854 3
       
 20645 +3aa8 17 857 3
       
 20646 +3abf c 858 3
       
 20647 +3acb 7 859 3
       
 20648  FUNC 3ad2 b6 0 WriteFormat
       
 20649 -3ad2 10 862 4
       
 20650 -3ae2 6 867 4
       
 20651 -3ae8 24 868 4
       
 20652 -3b0c 27 869 4
       
 20653 -3b33 40 870 4
       
 20654 -3b73 c 873 4
       
 20655 -3b7f 9 874 4
       
 20656 +3ad2 10 862 3
       
 20657 +3ae2 6 867 3
       
 20658 +3ae8 24 868 3
       
 20659 +3b0c 27 869 3
       
 20660 +3b33 40 870 3
       
 20661 +3b73 c 873 3
       
 20662 +3b7f 9 874 3
       
 20663  FUNC 3b88 35 0 -[DumpSymbols availableArchitectures]
       
 20664 -3b88 13 1140 4
       
 20665 -3b9b 1c 1141 4
       
 20666 -3bb7 6 1142 4
       
 20667 -3bbd 1 1142 4
       
 20668 +3b88 13 1140 3
       
 20669 +3b9b 1c 1141 3
       
 20670 +3bb7 6 1142 3
       
 20671 +3bbd 1 1142 3
       
 20672  FUNC 3bbe 1b4 0 -[DumpSymbols setArchitecture:]
       
 20673 -3bbe 13 1158 4
       
 20674 -3bd1 1a 1159 4
       
 20675 -3beb 4 1160 4
       
 20676 -3bef 2a 1162 4
       
 20677 -3c19 9 1163 4
       
 20678 -3c22 2a 1165 4
       
 20679 -3c4c 9 1166 4
       
 20680 -3c55 9 1167 4
       
 20681 -3c5e 2a 1169 4
       
 20682 -3c88 6 1170 4
       
 20683 -3c8e 2a 1172 4
       
 20684 -3cb8 6 1173 4
       
 20685 -3cbe 2a 1175 4
       
 20686 -3ce8 4 1176 4
       
 20687 -3cec 6 1179 4
       
 20688 -3cf2 2c 1180 4
       
 20689 -3d1e 9 1181 4
       
 20690 -3d27 1c 1183 4
       
 20691 -3d43 1f 1184 4
       
 20692 -3d62 a 1187 4
       
 20693 -3d6c 6 1188 4
       
 20694 +3bbe 13 1158 3
       
 20695 +3bd1 1a 1159 3
       
 20696 +3beb 4 1160 3
       
 20697 +3bef 2a 1162 3
       
 20698 +3c19 9 1163 3
       
 20699 +3c22 2a 1165 3
       
 20700 +3c4c 9 1166 3
       
 20701 +3c55 9 1167 3
       
 20702 +3c5e 2a 1169 3
       
 20703 +3c88 6 1170 3
       
 20704 +3c8e 2a 1172 3
       
 20705 +3cb8 6 1173 3
       
 20706 +3cbe 2a 1175 3
       
 20707 +3ce8 4 1176 3
       
 20708 +3cec 6 1179 3
       
 20709 +3cf2 2c 1180 3
       
 20710 +3d1e 9 1181 3
       
 20711 +3d27 1c 1183 3
       
 20712 +3d43 1f 1184 3
       
 20713 +3d62 a 1187 3
       
 20714 +3d6c 6 1188 3
       
 20715  FUNC 3d72 14 0 -[DumpSymbols architecture]
       
 20716 -3d72 c 1191 4
       
 20717 -3d7e 6 1192 4
       
 20718 -3d84 2 1193 4
       
 20719 +3d72 c 1191 3
       
 20720 +3d7e 6 1192 3
       
 20721 +3d84 2 1193 3
       
 20722  FUNC 3d86 e7 0 -[DumpSymbols writeSymbolFile:]
       
 20723 -3d86 13 1196 4
       
 20724 -3d99 1a 1197 4
       
 20725 -3db3 48 1200 4
       
 20726 -3dfb 9 1201 4
       
 20727 -3e04 1e 1203 4
       
 20728 -3e22 6 1205 4
       
 20729 -3e28 9 1206 4
       
 20730 -3e31 21 1208 4
       
 20731 -3e52 b 1210 4
       
 20732 -3e5d a 1212 4
       
 20733 -3e67 6 1213 4
       
 20734 -3e6d 1 1213 4
       
 20735 +3d86 13 1196 3
       
 20736 +3d99 1a 1197 3
       
 20737 +3db3 48 1200 3
       
 20738 +3dfb 9 1201 3
       
 20739 +3e04 1e 1203 3
       
 20740 +3e22 6 1205 3
       
 20741 +3e28 9 1206 3
       
 20742 +3e31 21 1208 3
       
 20743 +3e52 b 1210 3
       
 20744 +3e5d a 1212 3
       
 20745 +3e67 6 1213 3
       
 20746 +3e6d 1 1213 3
       
 20747  FUNC 3e6e 65 0 -[MachSection initWithMachSection:andNumber:]
       
 20748 -3e6e 13 1219 4
       
 20749 -3e81 37 1220 4
       
 20750 -3eb8 9 1221 4
       
 20751 -3ec1 9 1222 4
       
 20752 -3eca 3 1225 4
       
 20753 -3ecd 6 1226 4
       
 20754 -3ed3 1 1226 4
       
 20755 +3e6e 13 1219 3
       
 20756 +3e81 37 1220 3
       
 20757 +3eb8 9 1221 3
       
 20758 +3ec1 9 1222 3
       
 20759 +3eca 3 1225 3
       
 20760 +3ecd 6 1226 3
       
 20761 +3ed3 1 1226 3
       
 20762  FUNC 3ed4 14 0 -[MachSection sectionPointer]
       
 20763 -3ed4 c 1228 4
       
 20764 -3ee0 6 1229 4
       
 20765 -3ee6 2 1230 4
       
 20766 +3ed4 c 1228 3
       
 20767 +3ee0 6 1229 3
       
 20768 +3ee6 2 1230 3
       
 20769  FUNC 3ee8 14 0 -[MachSection sectionNumber]
       
 20770 -3ee8 c 1232 4
       
 20771 -3ef4 6 1233 4
       
 20772 -3efa 2 1234 4
       
 20773 +3ee8 c 1232 3
       
 20774 +3ef4 6 1233 3
       
 20775 +3efa 2 1234 3
       
 20776  FUNC 3efc 17c 0 -[DumpSymbols processDWARFSourceFileInfo:]
       
 20777 -3efc 14 459 4
       
 20778 -3f10 a 460 4
       
 20779 -3f1a 3c 461 4
       
 20780 -3f56 20 463 4
       
 20781 -3f76 5 464 4
       
 20782 -3f7b 3a 465 4
       
 20783 -3fb5 1d 466 4
       
 20784 -3fd2 3a 467 4
       
 20785 -400c 2a 468 4
       
 20786 -4036 3b 464 4
       
 20787 -4071 7 471 4
       
 20788 -FUNC 4078 1d7 0 DumpFunctionMap
       
 20789 -4078 15 82 4
       
 20790 -408d 13 83 4
       
 20791 -40a0 1e 85 4
       
 20792 -40be 42 89 4
       
 20793 -4100 20 90 4
       
 20794 -4120 2b 91 4
       
 20795 -414b 1a 92 4
       
 20796 -4165 23 93 4
       
 20797 -4188 46 96 4
       
 20798 -41ce 46 99 4
       
 20799 -4214 33 83 4
       
 20800 -4247 8 102 4
       
 20801 -424f 1 102 4
       
 20802 +3efc 14 459 3
       
 20803 +3f10 a 460 3
       
 20804 +3f1a 3c 461 3
       
 20805 +3f56 20 463 3
       
 20806 +3f76 5 464 3
       
 20807 +3f7b 3a 465 3
       
 20808 +3fb5 1d 466 3
       
 20809 +3fd2 3a 467 3
       
 20810 +400c 2a 468 3
       
 20811 +4036 3b 464 3
       
 20812 +4071 7 471 3
       
 20813 +FUNC 4078 1d7 0 DumpFunctionMap(std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >)
       
 20814 +4078 15 82 3
       
 20815 +408d 13 83 3
       
 20816 +40a0 1e 85 3
       
 20817 +40be 42 89 3
       
 20818 +4100 20 90 3
       
 20819 +4120 2b 91 3
       
 20820 +414b 1a 92 3
       
 20821 +4165 23 93 3
       
 20822 +4188 46 96 3
       
 20823 +41ce 46 99 3
       
 20824 +4214 33 83 3
       
 20825 +4247 8 102 3
       
 20826 +424f 1 102 3
       
 20827  FUNC 4250 3ef 0 -[DumpSymbols processDWARFFunctionInfo:]
       
 20828 -4250 15 473 4
       
 20829 -4265 25 474 4
       
 20830 -428a 1e 476 4
       
 20831 -42a8 a 480 4
       
 20832 -42b2 3c 481 4
       
 20833 -42ee 3d 483 4
       
 20834 -432b 23 485 4
       
 20835 -434e 26 487 4
       
 20836 -4374 6 489 4
       
 20837 -437a 37 490 4
       
 20838 -43b1 2a 491 4
       
 20839 -43db 17 492 4
       
 20840 -43f2 30 496 4
       
 20841 -4422 3d 497 4
       
 20842 -445f 2e 498 4
       
 20843 -448d 30 502 4
       
 20844 -44bd 64 504 4
       
 20845 -4521 34 507 4
       
 20846 -4555 9d 509 4
       
 20847 -45f2 45 474 4
       
 20848 -4637 8 513 4
       
 20849 -463f 1 513 4
       
 20850 +4250 15 473 3
       
 20851 +4265 25 474 3
       
 20852 +428a 1e 476 3
       
 20853 +42a8 a 480 3
       
 20854 +42b2 3c 481 3
       
 20855 +42ee 3d 483 3
       
 20856 +432b 23 485 3
       
 20857 +434e 26 487 3
       
 20858 +4374 6 489 3
       
 20859 +437a 37 490 3
       
 20860 +43b1 2a 491 3
       
 20861 +43db 17 492 3
       
 20862 +43f2 30 496 3
       
 20863 +4422 3d 497 3
       
 20864 +445f 2e 498 3
       
 20865 +448d 30 502 3
       
 20866 +44bd 64 504 3
       
 20867 +4521 34 507 3
       
 20868 +4555 9d 509 3
       
 20869 +45f2 45 474 3
       
 20870 +4637 8 513 3
       
 20871 +463f 1 513 3
       
 20872  FUNC 4640 1f5 0 -[DumpSymbols processDWARFLineNumberInfo:]
       
 20873 -4640 15 515 4
       
 20874 -4655 25 516 4
       
 20875 -467a 39 520 4
       
 20876 -46b3 26 521 4
       
 20877 -46d9 6 523 4
       
 20878 -46df 37 524 4
       
 20879 -4716 2a 525 4
       
 20880 -4740 17 526 4
       
 20881 -4757 30 529 4
       
 20882 -4787 61 531 4
       
 20883 -47e8 45 516 4
       
 20884 -482d 8 534 4
       
 20885 -4835 1 534 4
       
 20886 +4640 15 515 3
       
 20887 +4655 25 516 3
       
 20888 +467a 39 520 3
       
 20889 +46b3 26 521 3
       
 20890 +46d9 6 523 3
       
 20891 +46df 37 524 3
       
 20892 +4716 2a 525 3
       
 20893 +4740 17 526 3
       
 20894 +4757 30 529 3
       
 20895 +4787 61 531 3
       
 20896 +47e8 45 516 3
       
 20897 +482d 8 534 3
       
 20898 +4835 1 534 3
       
 20899  FUNC 4836 10f 0 -[DumpSymbols dealloc]
       
 20900 -4836 13 1145 4
       
 20901 -4849 1c 1146 4
       
 20902 -4865 1c 1147 4
       
 20903 -4881 1c 1148 4
       
 20904 -489d 1c 1149 4
       
 20905 -48b9 1c 1150 4
       
 20906 -48d5 1c 1151 4
       
 20907 -48f1 25 1152 4
       
 20908 -4916 29 1154 4
       
 20909 -493f 6 1155 4
       
 20910 -4945 1 1155 4
       
 20911 +4836 13 1145 3
       
 20912 +4849 1c 1146 3
       
 20913 +4865 1c 1147 3
       
 20914 +4881 1c 1148 3
       
 20915 +489d 1c 1149 3
       
 20916 +48b9 1c 1150 3
       
 20917 +48d5 1c 1151 3
       
 20918 +48f1 25 1152 3
       
 20919 +4916 29 1154 3
       
 20920 +493f 6 1155 3
       
 20921 +4945 1 1155 3
       
 20922  FUNC 4946 512 0 -[DumpSymbols loadDWARFSymbolInfo:offset:]
       
 20923 -4946 17 402 4
       
 20924 -495d 9 405 4
       
 20925 -4966 10 406 4
       
 20926 -4976 2b 408 4
       
 20927 -49a1 38 409 4
       
 20928 -49d9 3a 410 4
       
 20929 -4a13 2e 411 4
       
 20930 -4a41 31 416 4
       
 20931 -4a72 e 418 4
       
 20932 -4a80 24 420 4
       
 20933 -4aa4 5 422 4
       
 20934 -4aa9 b 424 4
       
 20935 -4ab4 b 425 4
       
 20936 -4abf e 426 4
       
 20937 -4acd 2b 427 4
       
 20938 -4af8 2b 428 4
       
 20939 -4b23 2c 431 4
       
 20940 -4b4f 52 439 4
       
 20941 -4ba1 34 444 4
       
 20942 -4bd5 1a 446 4
       
 20943 -4bef 21 451 4
       
 20944 -4c10 1e 452 4
       
 20945 -4c2e 21 453 4
       
 20946 -4c4f 40 422 4
       
 20947 -4c8f 6 453 4
       
 20948 -4c95 170 422 4
       
 20949 -4e05 43 456 4
       
 20950 -4e48 10 457 4
       
 20951 +4946 17 402 3
       
 20952 +495d 9 405 3
       
 20953 +4966 10 406 3
       
 20954 +4976 2b 408 3
       
 20955 +49a1 38 409 3
       
 20956 +49d9 3a 410 3
       
 20957 +4a13 2e 411 3
       
 20958 +4a41 31 416 3
       
 20959 +4a72 e 418 3
       
 20960 +4a80 24 420 3
       
 20961 +4aa4 5 422 3
       
 20962 +4aa9 b 424 3
       
 20963 +4ab4 b 425 3
       
 20964 +4abf e 426 3
       
 20965 +4acd 2b 427 3
       
 20966 +4af8 2b 428 3
       
 20967 +4b23 2c 431 3
       
 20968 +4b4f 52 439 3
       
 20969 +4ba1 34 444 3
       
 20970 +4bd5 1a 446 3
       
 20971 +4bef 21 451 3
       
 20972 +4c10 1e 452 3
       
 20973 +4c2e 21 453 3
       
 20974 +4c4f 40 422 3
       
 20975 +4c8f 6 453 3
       
 20976 +4c95 170 422 3
       
 20977 +4e05 43 456 3
       
 20978 +4e48 10 457 3
       
 20979  FUNC 4e58 4fd 0 -[DumpSymbols generateSectionDictionary:]
       
 20980 -4e58 18 663 4
       
 20981 -4e70 10 665 4
       
 20982 -4e80 2e 666 4
       
 20983 -4eae 9 668 4
       
 20984 -4eb7 2b 669 4
       
 20985 -4ee2 7 670 4
       
 20986 -4ee9 2e 672 4
       
 20987 -4f17 d 676 4
       
 20988 -4f24 32 678 4
       
 20989 -4f56 29 680 4
       
 20990 -4f7f a 684 4
       
 20991 -4f89 3c 685 4
       
 20992 -4fc5 31 688 4
       
 20993 -4ff6 5d 689 4
       
 20994 -5053 26 692 4
       
 20995 -5079 21 694 4
       
 20996 -509a c 698 4
       
 20997 -50a6 e 699 4
       
 20998 -50b4 6 700 4
       
 20999 -50ba 9 701 4
       
 21000 -50c3 2e 702 4
       
 21001 -50f1 c 704 4
       
 21002 -50fd 3c 706 4
       
 21003 -5139 66 709 4
       
 21004 -519f 1c 712 4
       
 21005 -51bb fb 714 4
       
 21006 -52b6 6 717 4
       
 21007 -52bc 5 718 4
       
 21008 -52c1 19 704 4
       
 21009 -52da 25 714 4
       
 21010 -52ff 2e 722 4
       
 21011 -532d 9 723 4
       
 21012 -5336 17 698 4
       
 21013 -534d 8 725 4
       
 21014 -5355 1 725 4
       
 21015 +4e58 18 663 3
       
 21016 +4e70 10 665 3
       
 21017 +4e80 2e 666 3
       
 21018 +4eae 9 668 3
       
 21019 +4eb7 2b 669 3
       
 21020 +4ee2 7 670 3
       
 21021 +4ee9 2e 672 3
       
 21022 +4f17 d 676 3
       
 21023 +4f24 32 678 3
       
 21024 +4f56 29 680 3
       
 21025 +4f7f a 684 3
       
 21026 +4f89 3c 685 3
       
 21027 +4fc5 31 688 3
       
 21028 +4ff6 5d 689 3
       
 21029 +5053 26 692 3
       
 21030 +5079 21 694 3
       
 21031 +509a c 698 3
       
 21032 +50a6 e 699 3
       
 21033 +50b4 6 700 3
       
 21034 +50ba 9 701 3
       
 21035 +50c3 2e 702 3
       
 21036 +50f1 c 704 3
       
 21037 +50fd 3c 706 3
       
 21038 +5139 66 709 3
       
 21039 +519f 1c 712 3
       
 21040 +51bb fb 714 3
       
 21041 +52b6 6 717 3
       
 21042 +52bc 5 718 3
       
 21043 +52c1 19 704 3
       
 21044 +52da 25 714 3
       
 21045 +52ff 2e 722 3
       
 21046 +532d 9 723 3
       
 21047 +5336 17 698 3
       
 21048 +534d 8 725 3
       
 21049 +5355 1 725 3
       
 21050  FUNC 5356 24a 0 -[DumpSymbols getSectionMapForArchitecture:]
       
 21051 -5356 14 643 4
       
 21052 -536a 43 645 4
       
 21053 -53ad 1a 648 4
       
 21054 -53c7 1c 645 4
       
 21055 -53e3 18 648 4
       
 21056 -53fb 40 650 4
       
 21057 -543b 20 651 4
       
 21058 -545b 17 652 4
       
 21059 -5472 16 651 4
       
 21060 -5488 cb 652 4
       
 21061 -5553 11 654 4
       
 21062 -5564 32 657 4
       
 21063 -5596 a 658 4
       
 21064 +5356 14 643 3
       
 21065 +536a 43 645 3
       
 21066 +53ad 1a 648 3
       
 21067 +53c7 1c 645 3
       
 21068 +53e3 18 648 3
       
 21069 +53fb 40 650 3
       
 21070 +543b 20 651 3
       
 21071 +545b 17 652 3
       
 21072 +5472 16 651 3
       
 21073 +5488 cb 652 3
       
 21074 +5553 11 654 3
       
 21075 +5564 32 657 3
       
 21076 +5596 a 658 3
       
 21077  FUNC 55a0 3fe 0 -[DumpSymbols initWithContentsOfFile:]
       
 21078 -55a0 14 1056 4
       
 21079 -55b4 3b 1057 4
       
 21080 -55ef 44 1059 4
       
 21081 -5633 17 1060 4
       
 21082 -564a c 1061 4
       
 21083 -5656 1f 1064 4
       
 21084 -5675 2b 1067 4
       
 21085 -56a0 a 1069 4
       
 21086 -56aa 35 1083 4
       
 21087 -56df 2 1087 4
       
 21088 -56e1 1a 1088 4
       
 21089 -56fb 3d 1087 4
       
 21090 -5738 33 1092 4
       
 21091 -576b 6 1094 4
       
 21092 -5771 e 1095 4
       
 21093 -577f 17 1096 4
       
 21094 -5796 c 1097 4
       
 21095 -57a2 1c 1101 4
       
 21096 -57be 1f 1103 4
       
 21097 -57dd 18 1104 4
       
 21098 -57f5 23 1107 4
       
 21099 -5818 25 1109 4
       
 21100 -583d 1c 1107 4
       
 21101 -5859 17 1110 4
       
 21102 -5870 c 1111 4
       
 21103 -587c 2a 1115 4
       
 21104 -58a6 8 1116 4
       
 21105 -58ae a 1118 4
       
 21106 -58b8 9 1119 4
       
 21107 -58c1 d 1122 4
       
 21108 -58ce 29 1124 4
       
 21109 -58f7 20 1126 4
       
 21110 -5917 20 1128 4
       
 21111 -5937 57 1132 4
       
 21112 -598e 9 1136 4
       
 21113 -5997 7 1137 4
       
 21114 +55a0 14 1056 3
       
 21115 +55b4 3b 1057 3
       
 21116 +55ef 44 1059 3
       
 21117 +5633 17 1060 3
       
 21118 +564a c 1061 3
       
 21119 +5656 1f 1064 3
       
 21120 +5675 2b 1067 3
       
 21121 +56a0 a 1069 3
       
 21122 +56aa 35 1083 3
       
 21123 +56df 2 1087 3
       
 21124 +56e1 1a 1088 3
       
 21125 +56fb 3d 1087 3
       
 21126 +5738 33 1092 3
       
 21127 +576b 6 1094 3
       
 21128 +5771 e 1095 3
       
 21129 +577f 17 1096 3
       
 21130 +5796 c 1097 3
       
 21131 +57a2 1c 1101 3
       
 21132 +57be 1f 1103 3
       
 21133 +57dd 18 1104 3
       
 21134 +57f5 23 1107 3
       
 21135 +5818 25 1109 3
       
 21136 +583d 1c 1107 3
       
 21137 +5859 17 1110 3
       
 21138 +5870 c 1111 3
       
 21139 +587c 2a 1115 3
       
 21140 +58a6 8 1116 3
       
 21141 +58ae a 1118 3
       
 21142 +58b8 9 1119 3
       
 21143 +58c1 d 1122 3
       
 21144 +58ce 29 1124 3
       
 21145 +58f7 20 1126 3
       
 21146 +5917 20 1128 3
       
 21147 +5937 57 1132 3
       
 21148 +598e 9 1136 3
       
 21149 +5997 7 1137 3
       
 21150  FUNC 599e d74 0 -[DumpSymbols outputSymbolFile:]
       
 21151 -599e 18 877 4
       
 21152 -59b6 2e 879 4
       
 21153 -59e4 30 880 4
       
 21154 -5a14 5d 882 4
       
 21155 -5a71 30 883 4
       
 21156 -5aa1 5d 885 4
       
 21157 -5afe 2e 888 4
       
 21158 -5b2c 38 891 4
       
 21159 -5b64 46 892 4
       
 21160 -5baa 26 893 4
       
 21161 -5bd0 20 895 4
       
 21162 -5bf0 20 904 4
       
 21163 -5c10 30 898 4
       
 21164 -5c40 f 899 4
       
 21165 -5c4f 1e 904 4
       
 21166 -5c6d 17 907 4
       
 21167 -5c84 17 908 4
       
 21168 -5c9b 44 911 4
       
 21169 -5cdf 44 914 4
       
 21170 -5d23 a 917 4
       
 21171 -5d2d 36 921 4
       
 21172 -5d63 30 923 4
       
 21173 +599e 18 877 3
       
 21174 +59b6 2e 879 3
       
 21175 +59e4 30 880 3
       
 21176 +5a14 5d 882 3
       
 21177 +5a71 30 883 3
       
 21178 +5aa1 5d 885 3
       
 21179 +5afe 2e 888 3
       
 21180 +5b2c 38 891 3
       
 21181 +5b64 46 892 3
       
 21182 +5baa 26 893 3
       
 21183 +5bd0 20 895 3
       
 21184 +5bf0 20 904 3
       
 21185 +5c10 30 898 3
       
 21186 +5c40 f 899 3
       
 21187 +5c4f 1e 904 3
       
 21188 +5c6d 17 907 3
       
 21189 +5c84 17 908 3
       
 21190 +5c9b 44 911 3
       
 21191 +5cdf 44 914 3
       
 21192 +5d23 a 917 3
       
 21193 +5d2d 36 921 3
       
 21194 +5d63 30 923 3
       
 21195  5d93 9 18 4
       
 21196  5d9c 9 19 4
       
 21197  5da5 c 20 4
       
 21198 -5db1 56 923 4
       
 21199 -5e07 74 925 4
       
 21200 -5e7b f 927 4
       
 21201 -5e8a 44 932 4
       
 21202 -5ece 20 933 4
       
 21203 -5eee c 934 4
       
 21204 -5efa 4e 935 4
       
 21205 -5f48 41 936 4
       
 21206 -5f89 f 937 4
       
 21207 -5f98 14 934 4
       
 21208 -5fac 7 941 4
       
 21209 -5fb3 14 942 4
       
 21210 -5fc7 14 943 4
       
 21211 -5fdb 1d 946 4
       
 21212 -5ff8 c 948 4
       
 21213 -6004 24 949 4
       
 21214 -6028 29 950 4
       
 21215 -6051 9 953 4
       
 21216 -605a 28 954 4
       
 21217 -6082 2e 955 4
       
 21218 -60b0 1e 957 4
       
 21219 -60ce 7 959 4
       
 21220 -60d5 26 962 4
       
 21221 -60fb 2a 963 4
       
 21222 -6125 2a 964 4
       
 21223 -614f 6 966 4
       
 21224 -6155 2a 967 4
       
 21225 -617f e 971 4
       
 21226 -618d 43 972 4
       
 21227 -61d0 4c 974 4
       
 21228 -621c 8 975 4
       
 21229 -6224 2e 979 4
       
 21230 -6252 2e 982 4
       
 21231 -6280 2e 985 4
       
 21232 -62ae 2e 988 4
       
 21233 -62dc 2e 991 4
       
 21234 -630a 2e 994 4
       
 21235 -6338 2e 997 4
       
 21236 -6366 2e 1000 4
       
 21237 -6394 54 1004 4
       
 21238 -63e8 c 1005 4
       
 21239 -63f4 e 1007 4
       
 21240 -6402 27 1008 4
       
 21241 -6429 8 1009 4
       
 21242 -6431 34 1010 4
       
 21243 -6465 24 1012 4
       
 21244 -6489 2 1013 4
       
 21245 -648b 2a 1017 4
       
 21246 -64b5 a 1019 4
       
 21247 -64bf 14 1020 4
       
 21248 -64d3 1d 1021 4
       
 21249 -64f0 a 1025 4
       
 21250 -64fa 32 1026 4
       
 21251 -652c 33 1028 4
       
 21252 -655f c 1029 4
       
 21253 -656b 55 1034 4
       
 21254 -65c0 f 1036 4
       
 21255 -65cf 16 1040 4
       
 21256 -65e5 61 1041 4
       
 21257 -6646 f 1043 4
       
 21258 -6655 47 1046 4
       
 21259 -669c c 1048 4
       
 21260 -66a8 11 948 4
       
 21261 -66b9 4e 1052 4
       
 21262 -6707 b 1053 4
       
 21263 -FUNC 6712 11 0 operator new
       
 21264 +5db1 56 923 3
       
 21265 +5e07 74 925 3
       
 21266 +5e7b f 927 3
       
 21267 +5e8a 44 932 3
       
 21268 +5ece 20 933 3
       
 21269 +5eee c 934 3
       
 21270 +5efa 4e 935 3
       
 21271 +5f48 41 936 3
       
 21272 +5f89 f 937 3
       
 21273 +5f98 14 934 3
       
 21274 +5fac 7 941 3
       
 21275 +5fb3 14 942 3
       
 21276 +5fc7 14 943 3
       
 21277 +5fdb 1d 946 3
       
 21278 +5ff8 c 948 3
       
 21279 +6004 24 949 3
       
 21280 +6028 29 950 3
       
 21281 +6051 9 953 3
       
 21282 +605a 28 954 3
       
 21283 +6082 2e 955 3
       
 21284 +60b0 1e 957 3
       
 21285 +60ce 7 959 3
       
 21286 +60d5 26 962 3
       
 21287 +60fb 2a 963 3
       
 21288 +6125 2a 964 3
       
 21289 +614f 6 966 3
       
 21290 +6155 2a 967 3
       
 21291 +617f e 971 3
       
 21292 +618d 43 972 3
       
 21293 +61d0 4c 974 3
       
 21294 +621c 8 975 3
       
 21295 +6224 2e 979 3
       
 21296 +6252 2e 982 3
       
 21297 +6280 2e 985 3
       
 21298 +62ae 2e 988 3
       
 21299 +62dc 2e 991 3
       
 21300 +630a 2e 994 3
       
 21301 +6338 2e 997 3
       
 21302 +6366 2e 1000 3
       
 21303 +6394 54 1004 3
       
 21304 +63e8 c 1005 3
       
 21305 +63f4 e 1007 3
       
 21306 +6402 27 1008 3
       
 21307 +6429 8 1009 3
       
 21308 +6431 34 1010 3
       
 21309 +6465 24 1012 3
       
 21310 +6489 2 1013 3
       
 21311 +648b 2a 1017 3
       
 21312 +64b5 a 1019 3
       
 21313 +64bf 14 1020 3
       
 21314 +64d3 1d 1021 3
       
 21315 +64f0 a 1025 3
       
 21316 +64fa 32 1026 3
       
 21317 +652c 33 1028 3
       
 21318 +655f c 1029 3
       
 21319 +656b 55 1034 3
       
 21320 +65c0 f 1036 3
       
 21321 +65cf 16 1040 3
       
 21322 +65e5 61 1041 3
       
 21323 +6646 f 1043 3
       
 21324 +6655 47 1046 3
       
 21325 +669c c 1048 3
       
 21326 +66a8 11 948 3
       
 21327 +66b9 4e 1052 3
       
 21328 +6707 b 1053 3
       
 21329 +FUNC 6712 11 0 operator new(unsigned long, void*)
       
 21330  6712 c 94 5
       
 21331  671e 5 94 5
       
 21332  6723 1 94 5
       
 21333 -FUNC 6724 e 0 operator delete
       
 21334 +FUNC 6724 e 0 operator delete(void*, void*)
       
 21335  6724 c 98 5
       
 21336  6730 2 98 5
       
 21337 -6732 c 74 6
       
 21338  673e 7 76 6
       
 21339  6745 2 77 6
       
 21340  6747 1a 78 6
       
 21341  6761 d 77 6
       
 21342  676e 3 79 6
       
 21343  6771 2 80 6
       
 21344  6773 1 80 6
       
 21345 -6774 c 94 6
       
 21346  6780 d 95 6
       
 21347  678d 1 95 6
       
 21348 -678e 13 127 7
       
 21349 -67a1 2a 127 7
       
 21350 -67cb 1 127 7
       
 21351 -67cc 13 127 7
       
 21352 -67df 2a 127 7
       
 21353 -6809 1 127 7
       
 21354 -680a 13 127 7
       
 21355 -681d 2a 127 7
       
 21356 -6847 1 127 7
       
 21357 +678e 13 127 74
       
 21358 +67a1 2a 127 74
       
 21359 +67cb 1 127 74
       
 21360 +67cc 13 127 74
       
 21361 +67df 2a 127 74
       
 21362 +6809 1 127 74
       
 21363 +680a 13 127 74
       
 21364 +681d 2a 127 74
       
 21365 +6847 1 127 74
       
 21366 +FUNC 6848 e 0 dwarf2reader::LineInfoHandler::DefineDir(std::string const&, unsigned int)
       
 21367  6848 c 131 7
       
 21368 -6854 2 131 7
       
 21369 +6854 2 131 74
       
 21370 +FUNC 6856 26 0 dwarf2reader::LineInfoHandler::DefineFile(std::string const&, int, unsigned int, unsigned long long, unsigned long long)
       
 21371  6856 24 142 7
       
 21372 -687a 2 142 7
       
 21373 +687a 2 142 74
       
 21374 +FUNC 687c 1a 0 dwarf2reader::LineInfoHandler::AddLine(unsigned long long, unsigned int, unsigned int, unsigned int)
       
 21375  687c 18 150 7
       
 21376 -6894 2 150 7
       
 21377 -6896 12 299 7
       
 21378 -68a8 12 299 7
       
 21379 -68ba 13 301 7
       
 21380 -68cd 2a 301 7
       
 21381 -68f7 1 301 7
       
 21382 -68f8 13 301 7
       
 21383 -690b 2a 301 7
       
 21384 -6935 1 301 7
       
 21385 -6936 13 301 7
       
 21386 -6949 2a 301 7
       
 21387 -6973 1 301 7
       
 21388 +6894 2 150 74
       
 21389 +6896 12 299 74
       
 21390 +68a8 12 299 74
       
 21391 +68ba 13 301 74
       
 21392 +68cd 2a 301 74
       
 21393 +68f7 1 301 74
       
 21394 +68f8 13 301 74
       
 21395 +690b 2a 301 74
       
 21396 +6935 1 301 74
       
 21397 +6936 13 301 74
       
 21398 +6949 2a 301 74
       
 21399 +6973 1 301 74
       
 21400 +FUNC 6974 44 0 dwarf2reader::Dwarf2Handler::StartCompilationUnit(unsigned long long, unsigned char, unsigned char, unsigned long long, unsigned char)
       
 21401  6974 39 308 7
       
 21402 -69ad b 308 7
       
 21403 +69ad b 308 74
       
 21404 +FUNC 69b8 1f 0 dwarf2reader::Dwarf2Handler::StartDIE(unsigned long long, dwarf2reader::DwarfTag, std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > > const&)
       
 21405  69b8 18 314 7
       
 21406 -69d0 7 314 7
       
 21407 -69d7 1 314 7
       
 21408 +69d0 7 314 74
       
 21409 +69d7 1 314 74
       
 21410 +FUNC 69d8 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeUnsigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, unsigned long long)
       
 21411  69d8 24 323 7
       
 21412 -69fc 2 323 7
       
 21413 +69fc 2 323 74
       
 21414 +FUNC 69fe 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeSigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, long long)
       
 21415  69fe 24 332 7
       
 21416 -6a22 2 332 7
       
 21417 +6a22 2 332 74
       
 21418 +FUNC 6a24 26 0 dwarf2reader::Dwarf2Handler::ProcessAttributeBuffer(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, char const*, unsigned long long)
       
 21419  6a24 24 345 7
       
 21420 -6a48 2 345 7
       
 21421 +6a48 2 345 74
       
 21422 +FUNC 6a4a 1a 0 dwarf2reader::Dwarf2Handler::ProcessAttributeString(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, std::string const&)
       
 21423  6a4a 18 354 7
       
 21424 -6a62 2 354 7
       
 21425 +6a62 2 354 74
       
 21426 +FUNC 6a64 1a 0 dwarf2reader::Dwarf2Handler::EndDIE(unsigned long long)
       
 21427  6a64 18 360 7
       
 21428 -6a7c 2 360 7
       
 21429 +6a7c 2 360 74
       
 21430  6a7e c 44 8
       
 21431  6a8a 2 44 8
       
 21432 -6a8c 13 55 9
       
 21433 -6a9f 35 55 9
       
 21434 -6ad4 13 91 9
       
 21435 -6ae7 73 96 9
       
 21436 -6b5a 13 98 9
       
 21437 -6b6d 35 98 9
       
 21438 -6ba2 c 74 9
       
 21439 -6bae 1a 75 9
       
 21440 -6bc8 2 76 9
       
 21441 +6a8c 13 55 32
       
 21442 +6a9f 35 55 32
       
 21443 +6ad4 13 91 32
       
 21444 +6ae7 73 96 32
       
 21445 +6b5a 13 98 32
       
 21446 +6b6d 35 98 32
       
 21447 +6bae 1a 75 3
       
 21448 +6bc8 2 76 3
       
 21449 +FUNC 6bca 20 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator!=(std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > const&) const
       
 21450  6bca c 287 10
       
 21451 -6bd6 14 288 10
       
 21452 +6bd6 14 288 40
       
 21453 +FUNC 6bea 16 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator->() const
       
 21454  6bea c 249 10
       
 21455 -6bf6 a 250 10
       
 21456 -6c00 c 613 11
       
 21457 -6c0c 7 614 11
       
 21458 -6c13 1 614 11
       
 21459 -6c14 c 241 11
       
 21460 -6c20 c 242 11
       
 21461 +6bf6 a 250 40
       
 21462 +6c0c 7 614 72
       
 21463 +6c13 1 614 72
       
 21464 +6c14 c 241 40
       
 21465 +6c20 c 242 40
       
 21466 +FUNC 6c2c 16 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator*() const
       
 21467  6c2c c 245 11
       
 21468 -6c38 a 246 11
       
 21469 -6c42 c 241 11
       
 21470 -6c4e c 242 11
       
 21471 +6c38 a 246 40
       
 21472 +6c42 c 241 40
       
 21473 +6c4e c 242 40
       
 21474 +FUNC 6c5a 20 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator!=(std::_Rb_tree_const_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > const&) const
       
 21475  6c5a c 287 11
       
 21476 -6c66 14 288 11
       
 21477 +6c66 14 288 40
       
 21478 +FUNC 6c7a 16 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator->() const
       
 21479  6c7a c 249 11
       
 21480 -6c86 a 250 11
       
 21481 -6c90 c 185 12
       
 21482 -6c9c 18 186 12
       
 21483 -6cb4 c 203 12
       
 21484 -6cc0 14 204 12
       
 21485 -6cd4 c 69 13
       
 21486 -6ce0 d 69 13
       
 21487 -6ced 1 69 13
       
 21488 -6cee c 89 13
       
 21489 -6cfa 20 90 13
       
 21490 -6d1a c 69 13
       
 21491 -6d26 d 69 13
       
 21492 -6d33 1 69 13
       
 21493 -6d34 c 69 13
       
 21494 -6d40 d 69 13
       
 21495 -6d4d 1 69 13
       
 21496 +6c86 a 250 40
       
 21497 +6c90 c 185 34
       
 21498 +6c9c 18 186 34
       
 21499 +6cc0 14 204 34
       
 21500 +6cd4 c 69 70
       
 21501 +6ce0 d 69 70
       
 21502 +6ced 1 69 70
       
 21503 +6cee c 89 70
       
 21504 +6cfa 20 90 70
       
 21505 +6d1a c 69 70
       
 21506 +6d26 d 69 70
       
 21507 +6d33 1 69 70
       
 21508 +6d34 c 69 70
       
 21509 +6d40 d 69 70
       
 21510 +6d4d 1 69 70
       
 21511 +FUNC 6d4e 25 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator++()
       
 21512  6d4e c 253 13
       
 21513 -6d5a 14 255 13
       
 21514 -6d6e 5 256 13
       
 21515 -6d73 1 256 13
       
 21516 +6d5a 14 255 40
       
 21517 +6d6e 5 256 40
       
 21518 +6d73 1 256 40
       
 21519 +FUNC 6d74 25 0 std::_Rb_tree_const_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator++()
       
 21520  6d74 c 253 13
       
 21521 -6d80 14 255 13
       
 21522 -6d94 5 256 13
       
 21523 -6d99 1 256 13
       
 21524 +6d80 14 255 40
       
 21525 +6d94 5 256 40
       
 21526 +6d99 1 256 40
       
 21527 +FUNC 6d9a 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_begin()
       
 21528  6d9a c 461 13
       
 21529 -6da6 8 462 13
       
 21530 +6da6 8 462 40
       
 21531 +FUNC 6dae 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_begin()
       
 21532  6dae c 461 13
       
 21533 -6dba 8 462 13
       
 21534 -6dc2 c 65 14
       
 21535 -6dce 2 65 14
       
 21536 -6dd0 c 72 14
       
 21537 -6ddc 2 72 14
       
 21538 -6dde c 97 15
       
 21539 -6dea d 97 15
       
 21540 -6df7 1 97 15
       
 21541 -6df8 c 105 15
       
 21542 -6e04 d 105 15
       
 21543 -6e11 1 105 15
       
 21544 -6e12 c 105 15
       
 21545 -6e1e d 105 15
       
 21546 -6e2b 1 105 15
       
 21547 -6e2c c 67 15
       
 21548 -6e38 2 67 15
       
 21549 -6e3a c 99 15
       
 21550 -6e46 14 100 15
       
 21551 -6e5a c 99 15
       
 21552 -6e66 14 100 15
       
 21553 +6dba 8 462 40
       
 21554 +6dc2 c 65 68
       
 21555 +6dce 2 65 68
       
 21556 +6dd0 c 72 68
       
 21557 +6ddc 2 72 68
       
 21558 +6dde c 97 69
       
 21559 +6dea d 97 69
       
 21560 +6df7 1 97 69
       
 21561 +6df8 c 105 69
       
 21562 +6e04 d 105 69
       
 21563 +6e11 1 105 69
       
 21564 +6e12 c 105 69
       
 21565 +6e1e d 105 69
       
 21566 +6e2b 1 105 69
       
 21567 +6e2c c 67 68
       
 21568 +6e38 2 67 68
       
 21569 +6e3a c 99 69
       
 21570 +6e46 14 100 69
       
 21571 +6e5a c 99 69
       
 21572 +6e66 14 100 69
       
 21573 +FUNC 6e7a 2b 0 std::_Vector_base<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::get_allocator() const
       
 21574  6e7a 10 93 16
       
 21575 -6e8a 1b 94 16
       
 21576 -6ea5 1 94 16
       
 21577 -6ea6 c 65 16
       
 21578 -6eb2 2 65 16
       
 21579 -6eb4 c 72 16
       
 21580 -6ec0 2 72 16
       
 21581 -6ec2 c 97 16
       
 21582 -6ece d 97 16
       
 21583 -6edb 1 97 16
       
 21584 -6edc c 105 16
       
 21585 -6ee8 d 105 16
       
 21586 -6ef5 1 105 16
       
 21587 -6ef6 c 105 16
       
 21588 -6f02 d 105 16
       
 21589 -6f0f 1 105 16
       
 21590 -6f10 c 67 16
       
 21591 -6f1c 2 67 16
       
 21592 -6f1e c 99 16
       
 21593 -6f2a 14 100 16
       
 21594 -6f3e c 99 16
       
 21595 -6f4a 14 100 16
       
 21596 +6e8a 1b 94 71
       
 21597 +6ea5 1 94 71
       
 21598 +6ea6 c 65 68
       
 21599 +6eb2 2 65 68
       
 21600 +6eb4 c 72 68
       
 21601 +6ec0 2 72 68
       
 21602 +6ec2 c 97 69
       
 21603 +6ece d 97 69
       
 21604 +6edb 1 97 69
       
 21605 +6edc c 105 69
       
 21606 +6ee8 d 105 69
       
 21607 +6ef5 1 105 69
       
 21608 +6ef6 c 105 69
       
 21609 +6f02 d 105 69
       
 21610 +6f0f 1 105 69
       
 21611 +6f10 c 67 68
       
 21612 +6f1c 2 67 68
       
 21613 +6f1e c 99 69
       
 21614 +6f2a 14 100 69
       
 21615 +6f3e c 99 69
       
 21616 +6f4a 14 100 69
       
 21617 +FUNC 6f5e 2b 0 std::_Vector_base<std::string, std::allocator<std::string> >::get_allocator() const
       
 21618  6f5e 10 93 16
       
 21619 -6f6e 1b 94 16
       
 21620 -6f89 1 94 16
       
 21621 -6f8a c 603 16
       
 21622 -6f96 c 603 16
       
 21623 +6f6e 1b 94 71
       
 21624 +6f89 1 94 71
       
 21625 +6f8a c 603 72
       
 21626 +6f96 c 603 72
       
 21627 +FUNC 6fa2 23 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::begin()
       
 21628  6fa2 c 333 16
       
 21629 -6fae 17 334 16
       
 21630 -6fc5 1 334 16
       
 21631 +6fae 17 334 71
       
 21632 +6fc5 1 334 71
       
 21633 +FUNC 6fc6 26 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::end()
       
 21634  6fc6 c 351 16
       
 21635 -6fd2 1a 352 16
       
 21636 -6fec c 665 16
       
 21637 -6ff8 5 666 16
       
 21638 -6ffd 1 666 16
       
 21639 -6ffe c 608 16
       
 21640 -700a 14 609 16
       
 21641 -701e c 665 16
       
 21642 -702a 5 666 16
       
 21643 -702f 1 666 16
       
 21644 +6fd2 1a 352 71
       
 21645 +6ff8 5 666 72
       
 21646 +6ffd 1 666 72
       
 21647 +6ffe c 608 72
       
 21648 +700a 14 609 72
       
 21649 +702a 5 666 72
       
 21650 +702f 1 666 72
       
 21651 +FUNC 7030 35 0 bool __gnu_cxx::operator!=<dwarf2reader::SourceFileInfo const*, dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo const*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > const&, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > const&)
       
 21652  7030 d 693 16
       
 21653 -703d 28 694 16
       
 21654 -7065 1 694 16
       
 21655 -7066 c 603 16
       
 21656 -7072 c 603 16
       
 21657 -707e c 628 16
       
 21658 -708a 27 629 16
       
 21659 -70b1 1 629 16
       
 21660 -70b2 c 84 16
       
 21661 -70be 1f 85 16
       
 21662 -70dd 1 85 16
       
 21663 +703d 28 694 72
       
 21664 +7065 1 694 72
       
 21665 +7066 c 603 72
       
 21666 +7072 c 603 72
       
 21667 +708a 27 629 72
       
 21668 +70b1 1 629 72
       
 21669 +70b2 c 84 70
       
 21670 +70be 1f 85 70
       
 21671 +70dd 1 85 70
       
 21672 +FUNC 70de 32 0 std::pair<std::string, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> std::make_pair<std::string, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*>(std::string, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*)
       
 21673  70de 10 144 16
       
 21674 -70ee 22 145 16
       
 21675 -7110 c 189 16
       
 21676 -711c a 190 16
       
 21677 -7126 c 193 16
       
 21678 -7132 d 194 16
       
 21679 -713f 1 194 16
       
 21680 -7140 c 84 16
       
 21681 -714c 17 85 16
       
 21682 -7163 1 85 16
       
 21683 +70ee 22 145 70
       
 21684 +711c a 190 34
       
 21685 +7132 d 194 34
       
 21686 +713f 1 194 34
       
 21687 +7140 c 84 70
       
 21688 +714c 17 85 70
       
 21689 +7163 1 85 70
       
 21690 +FUNC 7164 2d 0 std::pair<char const*, unsigned long> std::make_pair<char const*, unsigned long>(char const*, unsigned long)
       
 21691  7164 c 144 16
       
 21692 -7170 21 145 16
       
 21693 -7191 1 145 16
       
 21694 -7192 c 84 16
       
 21695 -719e 1d 85 16
       
 21696 -71bb 1 85 16
       
 21697 +7170 21 145 70
       
 21698 +7191 1 145 70
       
 21699 +7192 c 84 70
       
 21700 +719e 1d 85 70
       
 21701 +71bb 1 85 70
       
 21702 +FUNC 71bc 30 0 std::pair<char*, std::pair<char const*, unsigned long> > std::make_pair<char*, std::pair<char const*, unsigned long> >(char*, std::pair<char const*, unsigned long>)
       
 21703  71bc 10 144 16
       
 21704 -71cc 20 145 16
       
 21705 -71ec c 89 16
       
 21706 -71f8 20 90 16
       
 21707 -7218 d 89 16
       
 21708 -7225 70 90 16
       
 21709 -7295 1 90 16
       
 21710 +71cc 20 145 70
       
 21711 +71ec c 89 70
       
 21712 +71f8 20 90 70
       
 21713 +7218 d 89 70
       
 21714 +7225 70 90 70
       
 21715 +7295 1 90 70
       
 21716 +FUNC 7296 12 0 std::iterator_traits<unsigned long const*>::iterator_category std::__iterator_category<unsigned long const*>(unsigned long const* const&)
       
 21717  7296 c 164 17
       
 21718  72a2 6 165 17
       
 21719 +FUNC 72a8 1d 0 std::iterator_traits<unsigned long const*>::difference_type std::__distance<unsigned long const*>(unsigned long const*, unsigned long const*, std::random_access_iterator_tag)
       
 21720  72a8 c 92 18
       
 21721  72b4 11 97 18
       
 21722  72c5 1 97 18
       
 21723 +FUNC 72c6 33 0 std::iterator_traits<unsigned long const*>::difference_type std::distance<unsigned long const*>(unsigned long const*, unsigned long const*)
       
 21724  72c6 c 114 18
       
 21725  72d2 27 118 18
       
 21726  72f9 1 118 18
       
 21727 +FUNC 72fa 20 0 void std::__advance<unsigned long const*, int>(unsigned long const*&, int, std::random_access_iterator_tag)
       
 21728  72fa c 150 18
       
 21729  7306 14 155 18
       
 21730 +FUNC 731a 33 0 void std::advance<unsigned long const*, int>(unsigned long const*&, int)
       
 21731  731a c 172 18
       
 21732  7326 27 175 18
       
 21733  734d 1 175 18
       
 21734 +FUNC 734e 7a 0 unsigned long const* std::lower_bound<unsigned long const*, unsigned long>(unsigned long const*, unsigned long const*, unsigned long const&)
       
 21735  734e c 2625 19
       
 21736  735a 15 2642 19
       
 21737  736f 2 2646 19
       
 21738  7371 8 2648 19
       
 21739  7379 6 2649 19
       
 21740  737f 12 2650 19
       
 21741  7391 e 2651 19
       
 21742  739f 6 2653 19
       
 21743  73a5 4 2654 19
       
 21744  73a9 e 2655 19
       
 21745  73b7 6 2658 19
       
 21746  73bd 6 2646 19
       
 21747  73c3 5 2660 19
       
 21748 -73c8 13 225 19
       
 21749 -73db b 227 19
       
 21750 -73e6 e 228 19
       
 21751 -73f4 1c 229 19
       
 21752 -7410 20 230 19
       
 21753 -7430 6 231 19
       
 21754 -7436 c 72 19
       
 21755 -7442 2 72 19
       
 21756 -7444 c 105 19
       
 21757 -7450 d 105 19
       
 21758 -745d 1 105 19
       
 21759 -745e c 105 19
       
 21760 -746a d 105 19
       
 21761 -7477 1 105 19
       
 21762 -7478 c 80 19
       
 21763 -7484 d 80 19
       
 21764 -7491 1 80 19
       
 21765 -7492 c 67 19
       
 21766 -749e 2 67 19
       
 21767 -74a0 c 99 19
       
 21768 -74ac 14 100 19
       
 21769 +73db b 227 34
       
 21770 +73e6 e 228 34
       
 21771 +73f4 1c 229 34
       
 21772 +7410 20 230 34
       
 21773 +7430 6 231 34
       
 21774 +7436 c 72 68
       
 21775 +7442 2 72 68
       
 21776 +7444 c 105 69
       
 21777 +7450 d 105 69
       
 21778 +745d 1 105 69
       
 21779 +745e c 105 69
       
 21780 +746a d 105 69
       
 21781 +7477 1 105 69
       
 21782 +7478 c 80 71
       
 21783 +7484 d 80 71
       
 21784 +7491 1 80 71
       
 21785 +7492 c 67 68
       
 21786 +749e 2 67 68
       
 21787 +74a0 c 99 69
       
 21788 +74ac 14 100 69
       
 21789 +FUNC 74c0 2b 0 std::_Vector_base<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::get_allocator() const
       
 21790  74c0 10 93 19
       
 21791 -74d0 1b 94 19
       
 21792 -74eb 1 94 19
       
 21793 -74ec c 238 19
       
 21794 -74f8 a 239 19
       
 21795 +74d0 1b 94 71
       
 21796 +74eb 1 94 71
       
 21797 +74ec c 238 40
       
 21798 +74f8 a 239 40
       
 21799 +FUNC 7502 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::begin() const
       
 21800  7502 c 585 19
       
 21801 -750e 1a 588 19
       
 21802 +750e 1a 588 40
       
 21803 +FUNC 7528 19 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::begin() const
       
 21804  7528 c 243 20
       
 21805 -7534 d 244 20
       
 21806 -7541 1 244 20
       
 21807 +7534 d 244 45
       
 21808 +7541 1 244 45
       
 21809 +FUNC 7542 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::end() const
       
 21810  7542 c 596 20
       
 21811 -754e 1a 597 20
       
 21812 +754e 1a 597 40
       
 21813 +FUNC 7568 19 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::end() const
       
 21814  7568 c 260 20
       
 21815 -7574 d 261 20
       
 21816 -7581 1 261 20
       
 21817 -7582 c 65 20
       
 21818 -758e 2 65 20
       
 21819 -7590 c 72 20
       
 21820 -759c 2 72 20
       
 21821 -759e c 97 20
       
 21822 -75aa d 97 20
       
 21823 -75b7 1 97 20
       
 21824 -75b8 c 105 20
       
 21825 -75c4 d 105 20
       
 21826 -75d1 1 105 20
       
 21827 -75d2 c 72 20
       
 21828 -75de 2 72 20
       
 21829 -75e0 c 105 20
       
 21830 -75ec d 105 20
       
 21831 -75f9 1 105 20
       
 21832 -75fa c 397 20
       
 21833 -7606 d 397 20
       
 21834 -7613 1 397 20
       
 21835 -7614 c 105 20
       
 21836 -7620 d 105 20
       
 21837 -762d 1 105 20
       
 21838 +7574 d 261 45
       
 21839 +7581 1 261 45
       
 21840 +7582 c 65 68
       
 21841 +758e 2 65 68
       
 21842 +7590 c 72 68
       
 21843 +759c 2 72 68
       
 21844 +759e c 97 69
       
 21845 +75aa d 97 69
       
 21846 +75b7 1 97 69
       
 21847 +75b8 c 105 69
       
 21848 +75c4 d 105 69
       
 21849 +75d1 1 105 69
       
 21850 +75d2 c 72 68
       
 21851 +75de 2 72 68
       
 21852 +75e0 c 105 69
       
 21853 +75ec d 105 69
       
 21854 +75f9 1 105 69
       
 21855 +75fa c 397 40
       
 21856 +7606 d 397 40
       
 21857 +7613 1 397 40
       
 21858 +7614 c 105 69
       
 21859 +7620 d 105 69
       
 21860 +762d 1 105 69
       
 21861 +FUNC 762e 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_right(std::_Rb_tree_node_base*)
       
 21862  762e c 496 20
       
 21863 -763a 8 497 20
       
 21864 +763a 8 497 40
       
 21865 +FUNC 7642 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_left(std::_Rb_tree_node_base*)
       
 21866  7642 c 488 20
       
 21867 -764e 8 489 20
       
 21868 -7656 c 65 20
       
 21869 -7662 2 65 20
       
 21870 -7664 c 72 20
       
 21871 -7670 2 72 20
       
 21872 -7672 c 97 20
       
 21873 -767e d 97 20
       
 21874 -768b 1 97 20
       
 21875 -768c c 105 20
       
 21876 -7698 d 105 20
       
 21877 -76a5 1 105 20
       
 21878 -76a6 c 72 20
       
 21879 -76b2 2 72 20
       
 21880 -76b4 c 105 20
       
 21881 -76c0 d 105 20
       
 21882 -76cd 1 105 20
       
 21883 -76ce c 397 20
       
 21884 -76da d 397 20
       
 21885 -76e7 1 397 20
       
 21886 -76e8 c 105 20
       
 21887 -76f4 d 105 20
       
 21888 -7701 1 105 20
       
 21889 +764e 8 489 40
       
 21890 +7656 c 65 68
       
 21891 +7662 2 65 68
       
 21892 +7664 c 72 68
       
 21893 +7670 2 72 68
       
 21894 +7672 c 97 69
       
 21895 +767e d 97 69
       
 21896 +768b 1 97 69
       
 21897 +768c c 105 69
       
 21898 +7698 d 105 69
       
 21899 +76a5 1 105 69
       
 21900 +76a6 c 72 68
       
 21901 +76b2 2 72 68
       
 21902 +76b4 c 105 69
       
 21903 +76c0 d 105 69
       
 21904 +76cd 1 105 69
       
 21905 +76ce c 397 40
       
 21906 +76da d 397 40
       
 21907 +76e7 1 397 40
       
 21908 +76e8 c 105 69
       
 21909 +76f4 d 105 69
       
 21910 +7701 1 105 69
       
 21911 +FUNC 7702 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_right(std::_Rb_tree_node_base*)
       
 21912  7702 c 496 20
       
 21913 -770e 8 497 20
       
 21914 +770e 8 497 40
       
 21915 +FUNC 7716 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_left(std::_Rb_tree_node_base*)
       
 21916  7716 c 488 20
       
 21917 -7722 8 489 20
       
 21918 -772a c 84 20
       
 21919 -7736 2f 85 20
       
 21920 -7765 2 86 20
       
 21921 -7767 1 86 20
       
 21922 -7768 c 80 20
       
 21923 -7774 d 80 20
       
 21924 -7781 1 80 20
       
 21925 -7782 c 96 20
       
 21926 -778e 12 97 20
       
 21927 -77a0 2 98 20
       
 21928 -77a2 c 84 20
       
 21929 -77ae 2f 85 20
       
 21930 -77dd 2 86 20
       
 21931 -77df 1 86 20
       
 21932 -77e0 c 80 20
       
 21933 -77ec d 80 20
       
 21934 -77f9 1 80 20
       
 21935 -77fa c 96 20
       
 21936 -7806 12 97 20
       
 21937 -7818 2 98 20
       
 21938 -781a c 107 20
       
 21939 -7826 d 107 20
       
 21940 -7833 1 107 20
       
 21941 +7722 8 489 40
       
 21942 +772a c 84 71
       
 21943 +7736 2f 85 71
       
 21944 +7765 2 86 71
       
 21945 +7767 1 86 71
       
 21946 +7768 c 80 71
       
 21947 +7774 d 80 71
       
 21948 +7781 1 80 71
       
 21949 +7782 c 96 71
       
 21950 +778e 12 97 71
       
 21951 +77a0 2 98 71
       
 21952 +77a2 c 84 71
       
 21953 +77ae 2f 85 71
       
 21954 +77dd 2 86 71
       
 21955 +77df 1 86 71
       
 21956 +77e0 c 80 71
       
 21957 +77ec d 80 71
       
 21958 +77f9 1 80 71
       
 21959 +77fa c 96 71
       
 21960 +7806 12 97 71
       
 21961 +7818 2 98 71
       
 21962 +7826 d 107 68
       
 21963 +7833 1 107 68
       
 21964 +FUNC 7834 2e 0 void std::_Destroy<std::string*, std::allocator<std::string> >(std::string*, std::string*, std::allocator<std::string>)
       
 21965  7834 c 171 21
       
 21966 -7840 2 173 21
       
 21967 -7842 12 174 21
       
 21968 -7854 c 173 21
       
 21969 -7860 2 174 21
       
 21970 -7862 c 167 21
       
 21971 -786e a 168 21
       
 21972 +7840 2 173 73
       
 21973 +7842 12 174 73
       
 21974 +7854 c 173 73
       
 21975 +7860 2 174 73
       
 21976 +7862 c 167 40
       
 21977 +786e a 168 40
       
 21978 +FUNC 7878 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::begin()
       
 21979  7878 c 581 21
       
 21980 -7884 1a 582 21
       
 21981 +7884 1a 582 40
       
 21982 +FUNC 789e 19 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::begin()
       
 21983  789e c 234 21
       
 21984 -78aa d 235 21
       
 21985 -78b7 1 235 21
       
 21986 +78aa d 235 45
       
 21987 +78b7 1 235 45
       
 21988 +FUNC 78b8 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::end()
       
 21989  78b8 c 592 21
       
 21990 -78c4 1a 593 21
       
 21991 +78c4 1a 593 40
       
 21992 +FUNC 78de 19 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::end()
       
 21993  78de c 251 21
       
 21994 -78ea d 252 21
       
 21995 -78f7 1 252 21
       
 21996 -78f8 c 167 21
       
 21997 -7904 a 168 21
       
 21998 +78ea d 252 45
       
 21999 +78f7 1 252 45
       
 22000 +78f8 c 167 40
       
 22001 +7904 a 168 40
       
 22002 +FUNC 790e 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::begin()
       
 22003  790e c 581 21
       
 22004 -791a 1a 582 21
       
 22005 +791a 1a 582 40
       
 22006 +FUNC 7934 19 0 std::map<unsigned long long, std::pair<std::string, unsigned int>, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::begin()
       
 22007  7934 c 234 21
       
 22008 -7940 d 235 21
       
 22009 -794d 1 235 21
       
 22010 +7940 d 235 45
       
 22011 +794d 1 235 45
       
 22012 +FUNC 794e 26 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::end()
       
 22013  794e c 592 21
       
 22014 -795a 1a 593 21
       
 22015 +795a 1a 593 40
       
 22016 +FUNC 7974 19 0 std::map<unsigned long long, std::pair<std::string, unsigned int>, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::end()
       
 22017  7974 c 251 21
       
 22018 -7980 d 252 21
       
 22019 -798d 1 252 21
       
 22020 +7980 d 252 45
       
 22021 +798d 1 252 45
       
 22022 +FUNC 798e 11 0 std::_Select1st<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >::operator()(std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*>&) const
       
 22023  798e c 546 22
       
 22024 -799a 5 547 22
       
 22025 -799f 1 547 22
       
 22026 -79a0 c 128 22
       
 22027 -79ac 13 129 22
       
 22028 -79bf 1 129 22
       
 22029 -79c0 c 395 22
       
 22030 -79cc 22 396 22
       
 22031 -79ee c 198 23
       
 22032 -79fa d 199 23
       
 22033 -7a07 1 199 23
       
 22034 -7a08 c 65 23
       
 22035 -7a14 2 65 23
       
 22036 -7a16 c 72 23
       
 22037 -7a22 2 72 23
       
 22038 -7a24 c 97 23
       
 22039 -7a30 d 97 23
       
 22040 -7a3d 1 97 23
       
 22041 -7a3e c 105 23
       
 22042 -7a4a d 105 23
       
 22043 -7a57 1 105 23
       
 22044 -7a58 c 65 23
       
 22045 -7a64 2 65 23
       
 22046 -7a66 c 72 23
       
 22047 -7a72 2 72 23
       
 22048 -7a74 c 105 23
       
 22049 -7a80 d 105 23
       
 22050 -7a8d 1 105 23
       
 22051 -7a8e c 97 23
       
 22052 -7a9a d 97 23
       
 22053 -7aa7 1 97 23
       
 22054 -7aa8 c 72 23
       
 22055 -7ab4 2 72 23
       
 22056 -7ab6 c 105 23
       
 22057 -7ac2 d 105 23
       
 22058 -7acf 1 105 23
       
 22059 -7ad0 c 93 23
       
 22060 -7adc d 94 23
       
 22061 -7ae9 1 94 23
       
 22062 +799a 5 547 41
       
 22063 +799f 1 547 41
       
 22064 +79a0 c 128 34
       
 22065 +79ac 13 129 34
       
 22066 +79bf 1 129 34
       
 22067 +79cc 22 396 34
       
 22068 +79fa d 199 42
       
 22069 +7a07 1 199 42
       
 22070 +7a08 c 65 68
       
 22071 +7a14 2 65 68
       
 22072 +7a16 c 72 68
       
 22073 +7a22 2 72 68
       
 22074 +7a24 c 97 69
       
 22075 +7a30 d 97 69
       
 22076 +7a3d 1 97 69
       
 22077 +7a3e c 105 69
       
 22078 +7a4a d 105 69
       
 22079 +7a57 1 105 69
       
 22080 +7a58 c 65 68
       
 22081 +7a64 2 65 68
       
 22082 +7a66 c 72 68
       
 22083 +7a72 2 72 68
       
 22084 +7a74 c 105 69
       
 22085 +7a80 d 105 69
       
 22086 +7a8d 1 105 69
       
 22087 +7a8e c 97 69
       
 22088 +7a9a d 97 69
       
 22089 +7aa7 1 97 69
       
 22090 +7aa8 c 72 68
       
 22091 +7ab4 2 72 68
       
 22092 +7ab6 c 105 69
       
 22093 +7ac2 d 105 69
       
 22094 +7acf 1 105 69
       
 22095 +7adc d 94 68
       
 22096 +7ae9 1 94 68
       
 22097 +FUNC 7aea 2f 0 std::_Vector_base<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_deallocate(dwarf2reader::CompilationUnit::Abbrev*, unsigned long)
       
 22098  7aea c 120 23
       
 22099 -7af6 6 122 23
       
 22100 -7afc 1d 123 23
       
 22101 -7b19 1 123 23
       
 22102 -7b1a c 108 23
       
 22103 -7b26 43 109 23
       
 22104 -7b69 1 109 23
       
 22105 -7b6a c 65 23
       
 22106 -7b76 2 65 23
       
 22107 -7b78 c 103 23
       
 22108 -7b84 d 103 23
       
 22109 -7b91 1 103 23
       
 22110 -7b92 c 65 23
       
 22111 -7b9e 2 65 23
       
 22112 -7ba0 c 103 23
       
 22113 -7bac d 103 23
       
 22114 -7bb9 1 103 23
       
 22115 -7bba c 93 23
       
 22116 -7bc6 d 94 23
       
 22117 -7bd3 1 94 23
       
 22118 +7af6 6 122 71
       
 22119 +7afc 1d 123 71
       
 22120 +7b19 1 123 71
       
 22121 +7b1a c 108 71
       
 22122 +7b26 43 109 71
       
 22123 +7b69 1 109 71
       
 22124 +7b6a c 65 68
       
 22125 +7b76 2 65 68
       
 22126 +7b78 c 103 69
       
 22127 +7b84 d 103 69
       
 22128 +7b91 1 103 69
       
 22129 +7b92 c 65 68
       
 22130 +7b9e 2 65 68
       
 22131 +7ba0 c 103 69
       
 22132 +7bac d 103 69
       
 22133 +7bb9 1 103 69
       
 22134 +7bc6 d 94 68
       
 22135 +7bd3 1 94 68
       
 22136 +FUNC 7bd4 2f 0 std::_Vector_base<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::_M_deallocate(dwarf2reader::SourceFileInfo*, unsigned long)
       
 22137  7bd4 c 120 23
       
 22138 -7be0 6 122 23
       
 22139 -7be6 1d 123 23
       
 22140 -7c03 1 123 23
       
 22141 -7c04 c 108 23
       
 22142 -7c10 43 109 23
       
 22143 -7c53 1 109 23
       
 22144 -7c54 c 188 23
       
 22145 -7c60 12 189 23
       
 22146 -7c72 2 190 23
       
 22147 -7c74 c 35 23
       
 22148 -7c80 d 35 23
       
 22149 -7c8d 1 35 23
       
 22150 -7c8e c 107 23
       
 22151 -7c9a d 107 23
       
 22152 -7ca7 1 107 23
       
 22153 +7be0 6 122 71
       
 22154 +7be6 1d 123 71
       
 22155 +7c03 1 123 71
       
 22156 +7c04 c 108 71
       
 22157 +7c10 43 109 71
       
 22158 +7c53 1 109 71
       
 22159 +7c54 c 188 71
       
 22160 +7c60 12 189 71
       
 22161 +7c72 2 190 71
       
 22162 +7c74 c 35 32
       
 22163 +7c80 d 35 32
       
 22164 +7c8d 1 35 32
       
 22165 +7c9a d 107 68
       
 22166 +7ca7 1 107 68
       
 22167 +FUNC 7ca8 2e 0 void std::_Destroy<dwarf2reader::SourceFileInfo*, std::allocator<dwarf2reader::SourceFileInfo> >(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, std::allocator<dwarf2reader::SourceFileInfo>)
       
 22168  7ca8 c 171 23
       
 22169 -7cb4 2 173 23
       
 22170 -7cb6 12 174 23
       
 22171 -7cc8 c 173 23
       
 22172 -7cd4 2 174 23
       
 22173 -7cd6 d 272 23
       
 22174 -7ce3 8c 273 23
       
 22175 -7d6f 1 273 23
       
 22176 -7d70 c 93 23
       
 22177 -7d7c d 94 23
       
 22178 -7d89 1 94 23
       
 22179 +7cb4 2 173 73
       
 22180 +7cb6 12 174 73
       
 22181 +7cc8 c 173 73
       
 22182 +7cd4 2 174 73
       
 22183 +7cd6 d 272 71
       
 22184 +7ce3 8c 273 71
       
 22185 +7d6f 1 273 71
       
 22186 +7d7c d 94 68
       
 22187 +7d89 1 94 68
       
 22188 +FUNC 7d8a 2f 0 std::_Vector_base<std::string, std::allocator<std::string> >::_M_deallocate(std::string*, unsigned long)
       
 22189  7d8a c 120 23
       
 22190 -7d96 6 122 23
       
 22191 -7d9c 1d 123 23
       
 22192 -7db9 1 123 23
       
 22193 -7dba c 108 23
       
 22194 -7dc6 3d 109 23
       
 22195 -7e03 1 109 23
       
 22196 -7e04 c 188 23
       
 22197 -7e10 12 189 23
       
 22198 -7e22 2 190 23
       
 22199 -7e24 d 272 23
       
 22200 -7e31 8c 273 23
       
 22201 -7ebd 1 273 23
       
 22202 -7ebe c 595 23
       
 22203 -7eca 2b 596 23
       
 22204 -7ef5 1 596 23
       
 22205 -7ef6 c 613 23
       
 22206 -7f02 7 614 23
       
 22207 -7f09 1 614 23
       
 22208 -7f0a c 65 23
       
 22209 -7f16 2 65 23
       
 22210 -7f18 c 72 23
       
 22211 -7f24 2 72 23
       
 22212 -7f26 c 103 23
       
 22213 -7f32 d 103 23
       
 22214 -7f3f 1 103 23
       
 22215 -7f40 c 105 23
       
 22216 -7f4c d 105 23
       
 22217 -7f59 1 105 23
       
 22218 -7f5a c 65 23
       
 22219 -7f66 2 65 23
       
 22220 -7f68 c 72 23
       
 22221 -7f74 2 72 23
       
 22222 -7f76 c 103 23
       
 22223 -7f82 d 103 23
       
 22224 -7f8f 1 103 23
       
 22225 -7f90 c 105 23
       
 22226 -7f9c d 105 23
       
 22227 -7fa9 1 105 23
       
 22228 -7faa c 105 23
       
 22229 -7fb6 d 105 23
       
 22230 -7fc3 1 105 23
       
 22231 -7fc4 c 574 23
       
 22232 -7fd0 d 575 23
       
 22233 -7fdd 1 575 23
       
 22234 -7fde c 574 23
       
 22235 -7fea d 575 23
       
 22236 -7ff7 1 575 23
       
 22237 +7d96 6 122 71
       
 22238 +7d9c 1d 123 71
       
 22239 +7db9 1 123 71
       
 22240 +7dba c 108 71
       
 22241 +7dc6 3d 109 71
       
 22242 +7e03 1 109 71
       
 22243 +7e04 c 188 71
       
 22244 +7e10 12 189 71
       
 22245 +7e22 2 190 71
       
 22246 +7e24 d 272 71
       
 22247 +7e31 8c 273 71
       
 22248 +7ebd 1 273 71
       
 22249 +7eca 2b 596 34
       
 22250 +7ef5 1 596 34
       
 22251 +7f02 7 614 72
       
 22252 +7f09 1 614 72
       
 22253 +7f0a c 65 68
       
 22254 +7f16 2 65 68
       
 22255 +7f18 c 72 68
       
 22256 +7f24 2 72 68
       
 22257 +7f26 c 103 69
       
 22258 +7f32 d 103 69
       
 22259 +7f3f 1 103 69
       
 22260 +7f40 c 105 69
       
 22261 +7f4c d 105 69
       
 22262 +7f59 1 105 69
       
 22263 +7f5a c 65 68
       
 22264 +7f66 2 65 68
       
 22265 +7f68 c 72 68
       
 22266 +7f74 2 72 68
       
 22267 +7f76 c 103 69
       
 22268 +7f82 d 103 69
       
 22269 +7f8f 1 103 69
       
 22270 +7f90 c 105 69
       
 22271 +7f9c d 105 69
       
 22272 +7fa9 1 105 69
       
 22273 +7faa c 105 69
       
 22274 +7fb6 d 105 69
       
 22275 +7fc3 1 105 69
       
 22276 +7fd0 d 575 34
       
 22277 +7fdd 1 575 34
       
 22278 +7fea d 575 34
       
 22279 +7ff7 1 575 34
       
 22280 +FUNC 7ff8 11 0 std::_Select1st<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >::operator()(std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> const&) const
       
 22281  7ff8 c 550 23
       
 22282 -8004 5 551 23
       
 22283 -8009 1 551 23
       
 22284 -800a c 599 23
       
 22285 -8016 2f 600 23
       
 22286 -8045 1 600 23
       
 22287 -8046 c 84 23
       
 22288 -8052 1e 85 23
       
 22289 +8004 5 551 41
       
 22290 +8009 1 551 41
       
 22291 +8016 2f 600 34
       
 22292 +8045 1 600 34
       
 22293 +8046 c 84 70
       
 22294 +8052 1e 85 70
       
 22295 +FUNC 8070 11 0 std::_Select1st<std::pair<std::string const, std::pair<char const*, unsigned long long> > >::operator()(std::pair<std::string const, std::pair<char const*, unsigned long long> >&) const
       
 22296  8070 c 546 23
       
 22297 -807c 5 547 23
       
 22298 -8081 1 547 23
       
 22299 +807c 5 547 41
       
 22300 +8081 1 547 41
       
 22301 +FUNC 8082 11 0 std::_Select1st<std::pair<std::string const, std::pair<char const*, unsigned long long> > >::operator()(std::pair<std::string const, std::pair<char const*, unsigned long long> > const&) const
       
 22302  8082 c 550 23
       
 22303 -808e 5 551 23
       
 22304 -8093 1 551 23
       
 22305 -8094 c 128 23
       
 22306 -80a0 13 129 23
       
 22307 -80b3 1 129 23
       
 22308 -80b4 c 84 23
       
 22309 -80c0 1e 85 23
       
 22310 -80de c 65 23
       
 22311 -80ea 2 65 23
       
 22312 -80ec c 103 23
       
 22313 -80f8 d 103 23
       
 22314 -8105 1 103 23
       
 22315 -8106 c 65 23
       
 22316 -8112 2 65 23
       
 22317 -8114 c 72 23
       
 22318 -8120 2 72 23
       
 22319 -8122 c 105 23
       
 22320 -812e d 105 23
       
 22321 -813b 1 105 23
       
 22322 -813c c 103 23
       
 22323 -8148 d 103 23
       
 22324 -8155 1 103 23
       
 22325 -8156 c 105 23
       
 22326 -8162 d 105 23
       
 22327 -816f 1 105 23
       
 22328 -8170 c 80 23
       
 22329 -817c d 80 23
       
 22330 -8189 1 80 23
       
 22331 -818a c 67 23
       
 22332 -8196 2 67 23
       
 22333 -8198 c 99 23
       
 22334 -81a4 14 100 23
       
 22335 +808e 5 551 41
       
 22336 +8093 1 551 41
       
 22337 +8094 c 128 34
       
 22338 +80a0 13 129 34
       
 22339 +80b3 1 129 34
       
 22340 +80b4 c 84 70
       
 22341 +80c0 1e 85 70
       
 22342 +80de c 65 68
       
 22343 +80ea 2 65 68
       
 22344 +80ec c 103 69
       
 22345 +80f8 d 103 69
       
 22346 +8105 1 103 69
       
 22347 +8106 c 65 68
       
 22348 +8112 2 65 68
       
 22349 +8114 c 72 68
       
 22350 +8120 2 72 68
       
 22351 +8122 c 105 69
       
 22352 +812e d 105 69
       
 22353 +813b 1 105 69
       
 22354 +813c c 103 69
       
 22355 +8148 d 103 69
       
 22356 +8155 1 103 69
       
 22357 +8156 c 105 69
       
 22358 +8162 d 105 69
       
 22359 +816f 1 105 69
       
 22360 +8170 c 80 71
       
 22361 +817c d 80 71
       
 22362 +8189 1 80 71
       
 22363 +818a c 67 68
       
 22364 +8196 2 67 68
       
 22365 +8198 c 99 69
       
 22366 +81a4 14 100 69
       
 22367 +FUNC 81b8 2b 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::get_allocator() const
       
 22368  81b8 10 93 23
       
 22369 -81c8 1b 94 23
       
 22370 -81e3 1 94 23
       
 22371 -81e4 c 99 23
       
 22372 -81f0 14 100 23
       
 22373 -8204 c 107 23
       
 22374 -8210 2 107 23
       
 22375 +81c8 1b 94 71
       
 22376 +81e3 1 94 71
       
 22377 +81e4 c 99 69
       
 22378 +81f0 14 100 69
       
 22379 +8210 2 107 68
       
 22380 +FUNC 8212 2e 0 void std::_Destroy<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>)
       
 22381  8212 c 171 23
       
 22382 -821e 2 173 23
       
 22383 -8220 12 174 23
       
 22384 -8232 c 173 23
       
 22385 -823e 2 174 23
       
 22386 -8240 c 107 23
       
 22387 -824c d 107 23
       
 22388 -8259 1 107 23
       
 22389 -825a c 67 23
       
 22390 -8266 2 67 23
       
 22391 -8268 c 99 23
       
 22392 -8274 14 100 23
       
 22393 -8288 c 403 23
       
 22394 -8294 1c 404 23
       
 22395 -82b0 a 406 23
       
 22396 -82ba a 407 23
       
 22397 -82c4 c 408 23
       
 22398 -82d0 e 409 23
       
 22399 -82de c 553 23
       
 22400 -82ea 36 554 23
       
 22401 -8320 2 555 23
       
 22402 -8322 c 103 23
       
 22403 -832e d 103 23
       
 22404 -833b 1 103 23
       
 22405 +821e 2 173 73
       
 22406 +8220 12 174 73
       
 22407 +8232 c 173 73
       
 22408 +823e 2 174 73
       
 22409 +824c d 107 68
       
 22410 +8259 1 107 68
       
 22411 +825a c 67 68
       
 22412 +8266 2 67 68
       
 22413 +8268 c 99 69
       
 22414 +8274 14 100 69
       
 22415 +8288 c 403 40
       
 22416 +8294 1c 404 40
       
 22417 +82b0 a 406 40
       
 22418 +82ba a 407 40
       
 22419 +82c4 c 408 40
       
 22420 +82d0 e 409 40
       
 22421 +82de c 553 40
       
 22422 +82ea 36 554 40
       
 22423 +8320 2 555 40
       
 22424 +8322 c 103 69
       
 22425 +832e d 103 69
       
 22426 +833b 1 103 69
       
 22427 +FUNC 833c 2b 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::get_allocator() const
       
 22428  833c 10 350 23
       
 22429 -834c 1b 351 23
       
 22430 -8367 1 351 23
       
 22431 -8368 c 69 23
       
 22432 -8374 2 69 23
       
 22433 -8376 c 107 23
       
 22434 -8382 d 107 23
       
 22435 -838f 1 107 23
       
 22436 -8390 c 93 23
       
 22437 -839c d 94 23
       
 22438 -83a9 1 94 23
       
 22439 +834c 1b 351 40
       
 22440 +8367 1 351 40
       
 22441 +8368 c 69 70
       
 22442 +8374 2 69 70
       
 22443 +8382 d 107 68
       
 22444 +838f 1 107 68
       
 22445 +839c d 94 68
       
 22446 +83a9 1 94 68
       
 22447 +FUNC 83aa 2a 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_put_node(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >*)
       
 22448  83aa c 359 23
       
 22449 -83b6 1e 360 23
       
 22450 +83b6 1e 360 40
       
 22451 +FUNC 83d4 59 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::destroy_node(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >*)
       
 22452  83d4 d 387 23
       
 22453 -83e1 35 389 23
       
 22454 -8416 17 390 23
       
 22455 -842d 1 390 23
       
 22456 +83e1 35 389 40
       
 22457 +8416 17 390 40
       
 22458 +842d 1 390 40
       
 22459 +FUNC 842e 56 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_erase(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >*)
       
 22460  842e c 1051 23
       
 22461 -843a 2 1054 23
       
 22462 -843c 1a 1056 23
       
 22463 -8456 e 1057 23
       
 22464 -8464 12 1058 23
       
 22465 -8476 6 1059 23
       
 22466 -847c 6 1054 23
       
 22467 -8482 2 1059 23
       
 22468 -8484 d 569 23
       
 22469 -8491 58 570 23
       
 22470 -84e9 1 570 23
       
 22471 -84ea c 147 23
       
 22472 -84f6 31 148 23
       
 22473 -8527 1 148 23
       
 22474 -8528 c 92 23
       
 22475 -8534 d 92 23
       
 22476 -8541 1 92 23
       
 22477 -8542 c 67 23
       
 22478 -854e 2 67 23
       
 22479 -8550 c 99 23
       
 22480 -855c 14 100 23
       
 22481 -8570 c 403 23
       
 22482 -857c 1c 404 23
       
 22483 -8598 a 406 23
       
 22484 -85a2 a 407 23
       
 22485 -85ac c 408 23
       
 22486 -85b8 e 409 23
       
 22487 -85c6 c 553 23
       
 22488 -85d2 36 554 23
       
 22489 -8608 2 555 23
       
 22490 -860a c 103 23
       
 22491 -8616 d 103 23
       
 22492 -8623 1 103 23
       
 22493 +843a 2 1054 40
       
 22494 +843c 1a 1056 40
       
 22495 +8456 e 1057 40
       
 22496 +8464 12 1058 40
       
 22497 +8476 6 1059 40
       
 22498 +847c 6 1054 40
       
 22499 +8482 2 1059 40
       
 22500 +8484 d 569 40
       
 22501 +8491 58 570 40
       
 22502 +84e9 1 570 40
       
 22503 +84ea c 147 45
       
 22504 +84f6 31 148 45
       
 22505 +8527 1 148 45
       
 22506 +8528 c 92 45
       
 22507 +8534 d 92 45
       
 22508 +8541 1 92 45
       
 22509 +8542 c 67 68
       
 22510 +854e 2 67 68
       
 22511 +8550 c 99 69
       
 22512 +855c 14 100 69
       
 22513 +8570 c 403 40
       
 22514 +857c 1c 404 40
       
 22515 +8598 a 406 40
       
 22516 +85a2 a 407 40
       
 22517 +85ac c 408 40
       
 22518 +85b8 e 409 40
       
 22519 +85c6 c 553 40
       
 22520 +85d2 36 554 40
       
 22521 +8608 2 555 40
       
 22522 +860a c 103 69
       
 22523 +8616 d 103 69
       
 22524 +8623 1 103 69
       
 22525 +FUNC 8624 2b 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::get_allocator() const
       
 22526  8624 10 350 23
       
 22527 -8634 1b 351 23
       
 22528 -864f 1 351 23
       
 22529 -8650 c 69 23
       
 22530 -865c d 69 23
       
 22531 -8669 1 69 23
       
 22532 -866a c 69 23
       
 22533 -8676 30 69 23
       
 22534 -86a6 c 107 23
       
 22535 -86b2 d 107 23
       
 22536 -86bf 1 107 23
       
 22537 -86c0 c 93 23
       
 22538 -86cc d 94 23
       
 22539 -86d9 1 94 23
       
 22540 +8634 1b 351 40
       
 22541 +864f 1 351 40
       
 22542 +8650 c 69 70
       
 22543 +865c d 69 70
       
 22544 +8669 1 69 70
       
 22545 +866a c 69 70
       
 22546 +8676 30 69 70
       
 22547 +86b2 d 107 68
       
 22548 +86bf 1 107 68
       
 22549 +86cc d 94 68
       
 22550 +86d9 1 94 68
       
 22551 +FUNC 86da 2a 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_put_node(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >*)
       
 22552  86da c 359 23
       
 22553 -86e6 1e 360 23
       
 22554 +86e6 1e 360 40
       
 22555 +FUNC 8704 59 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::destroy_node(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >*)
       
 22556  8704 d 387 23
       
 22557 -8711 35 389 23
       
 22558 -8746 17 390 23
       
 22559 -875d 1 390 23
       
 22560 +8711 35 389 40
       
 22561 +8746 17 390 40
       
 22562 +875d 1 390 40
       
 22563 +FUNC 875e 56 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_erase(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >*)
       
 22564  875e c 1051 23
       
 22565 -876a 2 1054 23
       
 22566 -876c 1a 1056 23
       
 22567 -8786 e 1057 23
       
 22568 -8794 12 1058 23
       
 22569 -87a6 6 1059 23
       
 22570 -87ac 6 1054 23
       
 22571 -87b2 2 1059 23
       
 22572 -87b4 d 569 23
       
 22573 -87c1 58 570 23
       
 22574 -8819 1 570 23
       
 22575 -881a c 147 23
       
 22576 -8826 31 148 23
       
 22577 -8857 1 148 23
       
 22578 -8858 c 92 23
       
 22579 -8864 d 92 23
       
 22580 -8871 1 92 23
       
 22581 -8872 c 603 23
       
 22582 -887e c 603 23
       
 22583 +876a 2 1054 40
       
 22584 +876c 1a 1056 40
       
 22585 +8786 e 1057 40
       
 22586 +8794 12 1058 40
       
 22587 +87a6 6 1059 40
       
 22588 +87ac 6 1054 40
       
 22589 +87b2 2 1059 40
       
 22590 +87b4 d 569 40
       
 22591 +87c1 58 570 40
       
 22592 +8819 1 570 40
       
 22593 +881a c 147 45
       
 22594 +8826 31 148 45
       
 22595 +8857 1 148 45
       
 22596 +8858 c 92 45
       
 22597 +8864 d 92 45
       
 22598 +8871 1 92 45
       
 22599 +8872 c 603 72
       
 22600 +887e c 603 72
       
 22601 +FUNC 888a 23 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::begin()
       
 22602  888a c 333 23
       
 22603 -8896 17 334 23
       
 22604 -88ad 1 334 23
       
 22605 -88ae c 653 23
       
 22606 -88ba 2a 654 23
       
 22607 +8896 17 334 71
       
 22608 +88ad 1 334 71
       
 22609 +88ba 2a 654 72
       
 22610 +FUNC 88e4 42 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::operator[](unsigned long)
       
 22611  88e4 c 494 23
       
 22612 -88f0 36 495 23
       
 22613 +88f0 36 495 71
       
 22614 +FUNC 8926 26 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::end()
       
 22615  8926 c 351 23
       
 22616 -8932 1a 352 23
       
 22617 +8932 1a 352 71
       
 22618 +FUNC 894c 28 0 bool std::operator==<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
       
 22619  894c c 2115 24
       
 22620 -8958 1c 2116 24
       
 22621 +8958 1c 2116 37
       
 22622 +FUNC 8974 23 0 std::equal_to<std::string>::operator()(std::string const&, std::string const&) const
       
 22623  8974 c 199 24
       
 22624 -8980 17 200 24
       
 22625 -8997 1 200 24
       
 22626 -8998 c 80 24
       
 22627 -89a4 d 80 24
       
 22628 -89b1 1 80 24
       
 22629 -89b2 c 67 24
       
 22630 -89be 2 67 24
       
 22631 -89c0 c 99 24
       
 22632 -89cc 14 100 24
       
 22633 +8980 17 200 41
       
 22634 +8997 1 200 41
       
 22635 +8998 c 80 71
       
 22636 +89a4 d 80 71
       
 22637 +89b1 1 80 71
       
 22638 +89b2 c 67 68
       
 22639 +89be 2 67 68
       
 22640 +89c0 c 99 69
       
 22641 +89cc 14 100 69
       
 22642 +FUNC 89e0 2b 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::get_allocator() const
       
 22643  89e0 10 93 24
       
 22644 -89f0 1b 94 24
       
 22645 -8a0b 1 94 24
       
 22646 -8a0c c 99 24
       
 22647 -8a18 14 100 24
       
 22648 -8a2c c 84 24
       
 22649 -8a38 2f 85 24
       
 22650 -8a67 2 86 24
       
 22651 -8a69 1 86 24
       
 22652 -8a6a c 96 24
       
 22653 -8a76 12 97 24
       
 22654 -8a88 2 98 24
       
 22655 -8a8a c 107 24
       
 22656 -8a96 2 107 24
       
 22657 +89f0 1b 94 71
       
 22658 +8a0b 1 94 71
       
 22659 +8a0c c 99 69
       
 22660 +8a18 14 100 69
       
 22661 +8a2c c 84 71
       
 22662 +8a38 2f 85 71
       
 22663 +8a67 2 86 71
       
 22664 +8a69 1 86 71
       
 22665 +8a6a c 96 71
       
 22666 +8a76 12 97 71
       
 22667 +8a88 2 98 71
       
 22668 +8a96 2 107 68
       
 22669 +FUNC 8a98 2e 0 void std::_Destroy<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>)
       
 22670  8a98 c 171 24
       
 22671 -8aa4 2 173 24
       
 22672 -8aa6 12 174 24
       
 22673 -8ab8 c 173 24
       
 22674 -8ac4 2 174 24
       
 22675 +8aa4 2 173 73
       
 22676 +8aa6 12 174 73
       
 22677 +8ab8 c 173 73
       
 22678 +8ac4 2 174 73
       
 22679 +FUNC 8ac6 13 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::max_size() const
       
 22680  8ac6 c 407 24
       
 22681 -8ad2 7 408 24
       
 22682 -8ad9 1 408 24
       
 22683 -8ada c 603 24
       
 22684 -8ae6 c 603 24
       
 22685 +8ad2 7 408 71
       
 22686 +8ad9 1 408 71
       
 22687 +8ada c 603 72
       
 22688 +8ae6 c 603 72
       
 22689 +FUNC 8af2 26 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::end()
       
 22690  8af2 c 351 24
       
 22691 -8afe 1a 352 24
       
 22692 +8afe 1a 352 71
       
 22693 +FUNC 8b18 23 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::begin()
       
 22694  8b18 c 333 24
       
 22695 -8b24 17 334 24
       
 22696 -8b3b 1 334 24
       
 22697 -8b3c c 653 24
       
 22698 -8b48 2a 654 24
       
 22699 -8b72 c 613 24
       
 22700 -8b7e 7 614 24
       
 22701 -8b85 1 614 24
       
 22702 +8b24 17 334 71
       
 22703 +8b3b 1 334 71
       
 22704 +8b48 2a 654 72
       
 22705 +8b7e 7 614 72
       
 22706 +8b85 1 614 72
       
 22707 +FUNC 8b86 42 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::operator[](unsigned long)
       
 22708  8b86 c 494 24
       
 22709 -8b92 36 495 24
       
 22710 -8bc8 c 107 24
       
 22711 -8bd4 d 107 24
       
 22712 -8be1 1 107 24
       
 22713 +8b92 36 495 71
       
 22714 +8bd4 d 107 68
       
 22715 +8be1 1 107 68
       
 22716 +FUNC 8be2 28 0 void std::swap<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**&, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**&)
       
 22717  8be2 c 92 25
       
 22718 -8bee 8 97 25
       
 22719 -8bf6 a 98 25
       
 22720 -8c00 a 99 25
       
 22721 +8bee 8 97 61
       
 22722 +8bf6 a 98 61
       
 22723 +8c00 a 99 61
       
 22724 +FUNC 8c0a 50 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::swap(std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >&)
       
 22725  8c0a c 733 25
       
 22726 -8c16 12 735 25
       
 22727 -8c28 18 736 25
       
 22728 -8c40 1a 737 25
       
 22729 -8c5a c 595 25
       
 22730 -8c66 2b 596 25
       
 22731 -8c91 1 596 25
       
 22732 -8c92 c 599 25
       
 22733 -8c9e 2f 600 25
       
 22734 -8ccd 1 600 25
       
 22735 +8c16 12 735 71
       
 22736 +8c28 18 736 71
       
 22737 +8c40 1a 737 71
       
 22738 +8c66 2b 596 34
       
 22739 +8c91 1 596 34
       
 22740 +8c9e 2f 600 34
       
 22741 +8ccd 1 600 34
       
 22742 +FUNC 8cce 28 0 void std::swap<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**&, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**&)
       
 22743  8cce c 92 25
       
 22744 -8cda 8 97 25
       
 22745 -8ce2 a 98 25
       
 22746 -8cec a 99 25
       
 22747 +8cda 8 97 61
       
 22748 +8ce2 a 98 61
       
 22749 +8cec a 99 61
       
 22750 +FUNC 8cf6 50 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::swap(std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >&)
       
 22751  8cf6 c 733 25
       
 22752 -8d02 12 735 25
       
 22753 -8d14 18 736 25
       
 22754 -8d2c 1a 737 25
       
 22755 -8d46 c 84 25
       
 22756 -8d52 2f 85 25
       
 22757 -8d81 2 86 25
       
 22758 -8d83 1 86 25
       
 22759 -8d84 c 96 25
       
 22760 -8d90 12 97 25
       
 22761 -8da2 2 98 25
       
 22762 +8d02 12 735 71
       
 22763 +8d14 18 736 71
       
 22764 +8d2c 1a 737 71
       
 22765 +8d46 c 84 71
       
 22766 +8d52 2f 85 71
       
 22767 +8d81 2 86 71
       
 22768 +8d83 1 86 71
       
 22769 +8d84 c 96 71
       
 22770 +8d90 12 97 71
       
 22771 +8da2 2 98 71
       
 22772 +FUNC 8da4 13 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::max_size() const
       
 22773  8da4 c 407 25
       
 22774 -8db0 7 408 25
       
 22775 -8db7 1 408 25
       
 22776 -8db8 c 93 25
       
 22777 -8dc4 d 94 25
       
 22778 -8dd1 1 94 25
       
 22779 +8db0 7 408 71
       
 22780 +8db7 1 408 71
       
 22781 +8dc4 d 94 68
       
 22782 +8dd1 1 94 68
       
 22783 +FUNC 8dd2 2f 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::_M_deallocate(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long)
       
 22784  8dd2 c 120 25
       
 22785 -8dde 6 122 25
       
 22786 -8de4 1d 123 25
       
 22787 -8e01 1 123 25
       
 22788 -8e02 c 108 25
       
 22789 -8e0e 3d 109 25
       
 22790 -8e4b 1 109 25
       
 22791 -8e4c c 272 25
       
 22792 -8e58 4b 273 25
       
 22793 -8ea3 1 273 25
       
 22794 -8ea4 c 188 25
       
 22795 -8eb0 12 189 25
       
 22796 -8ec2 2 190 25
       
 22797 -8ec4 c 603 25
       
 22798 -8ed0 c 603 25
       
 22799 +8dde 6 122 71
       
 22800 +8de4 1d 123 71
       
 22801 +8e01 1 123 71
       
 22802 +8e02 c 108 71
       
 22803 +8e0e 3d 109 71
       
 22804 +8e4b 1 109 71
       
 22805 +8e4c c 272 71
       
 22806 +8e58 4b 273 71
       
 22807 +8ea3 1 273 71
       
 22808 +8ea4 c 188 71
       
 22809 +8eb0 12 189 71
       
 22810 +8ec2 2 190 71
       
 22811 +8ec4 c 603 72
       
 22812 +8ed0 c 603 72
       
 22813 +FUNC 8edc 2b 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::begin() const
       
 22814  8edc c 342 25
       
 22815 -8ee8 1f 343 25
       
 22816 -8f07 1 343 25
       
 22817 +8ee8 1f 343 71
       
 22818 +8f07 1 343 71
       
 22819 +FUNC 8f08 2c 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::end() const
       
 22820  8f08 c 360 25
       
 22821 -8f14 20 361 25
       
 22822 -8f34 c 665 25
       
 22823 -8f40 5 666 25
       
 22824 -8f45 1 666 25
       
 22825 -8f46 d 758 25
       
 22826 -8f53 2b 759 25
       
 22827 +8f14 20 361 71
       
 22828 +8f40 5 666 72
       
 22829 +8f45 1 666 72
       
 22830 +8f53 2b 759 72
       
 22831 +FUNC 8f7e 3c 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::size() const
       
 22832  8f7e c 402 25
       
 22833 -8f8a 30 403 25
       
 22834 -8fba c 587 25
       
 22835 -8fc6 26 588 25
       
 22836 -8fec c 509 25
       
 22837 -8ff8 15 511 25
       
 22838 -900d 79 513 25
       
 22839 -9086 21 517 25
       
 22840 -90a7 1 517 25
       
 22841 -90a8 c 224 25
       
 22842 -90b4 14 225 25
       
 22843 -90c8 c 591 25
       
 22844 -90d4 26 592 25
       
 22845 +8f8a 30 403 71
       
 22846 +8fc6 26 588 34
       
 22847 +8ff8 15 511 34
       
 22848 +900d 79 513 34
       
 22849 +9086 21 517 34
       
 22850 +90a7 1 517 34
       
 22851 +90b4 14 225 42
       
 22852 +90d4 26 592 34
       
 22853 +FUNC 90fa 49 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::capacity() const
       
 22854  90fa c 449 25
       
 22855 -9106 3d 451 25
       
 22856 -9143 1 451 25
       
 22857 -9144 c 103 25
       
 22858 -9150 d 103 25
       
 22859 -915d 1 103 25
       
 22860 -915e 10 285 25
       
 22861 -916e 1b 286 25
       
 22862 -9189 1 286 25
       
 22863 -918a c 93 25
       
 22864 -9196 d 94 25
       
 22865 -91a3 1 94 25
       
 22866 -91a4 c 300 25
       
 22867 -91b0 1e 301 25
       
 22868 -91ce d 620 25
       
 22869 -91db 56 622 25
       
 22870 -9231 17 623 25
       
 22871 -9248 c 1078 25
       
 22872 -9254 9 1080 25
       
 22873 -925d 1a 1082 25
       
 22874 -9277 2 1083 25
       
 22875 -9279 8 1085 25
       
 22876 -9281 12 1086 25
       
 22877 -9293 6 1087 25
       
 22878 -9299 6 1083 25
       
 22879 -929f 1b 1089 25
       
 22880 -92ba 1d 1080 25
       
 22881 -92d7 c 1091 25
       
 22882 -92e3 1 1091 25
       
 22883 -92e4 d 360 25
       
 22884 -92f1 77 361 25
       
 22885 -9368 c 93 25
       
 22886 -9374 d 93 25
       
 22887 -9381 1 93 25
       
 22888 -9382 c 72 25
       
 22889 -938e 2 72 25
       
 22890 -9390 c 105 25
       
 22891 -939c d 105 25
       
 22892 -93a9 1 105 25
       
 22893 -93aa c 301 26
       
 22894 -93b6 d 301 26
       
 22895 -93c3 1 301 26
       
 22896 -93c4 c 93 26
       
 22897 -93d0 d 94 26
       
 22898 -93dd 1 94 26
       
 22899 +9106 3d 451 71
       
 22900 +9143 1 451 71
       
 22901 +9144 c 103 69
       
 22902 +9150 d 103 69
       
 22903 +915d 1 103 69
       
 22904 +916e 1b 286 34
       
 22905 +9189 1 286 34
       
 22906 +9196 d 94 68
       
 22907 +91a3 1 94 68
       
 22908 +91b0 1e 301 34
       
 22909 +91db 56 622 34
       
 22910 +9231 17 623 34
       
 22911 +9254 9 1080 34
       
 22912 +925d 1a 1082 34
       
 22913 +9277 2 1083 34
       
 22914 +9279 8 1085 34
       
 22915 +9281 12 1086 34
       
 22916 +9293 6 1087 34
       
 22917 +9299 6 1083 34
       
 22918 +929f 1b 1089 34
       
 22919 +92ba 1d 1080 34
       
 22920 +92d7 c 1091 34
       
 22921 +92e3 1 1091 34
       
 22922 +92e4 d 360 34
       
 22923 +92f1 77 361 34
       
 22924 +9368 c 93 42
       
 22925 +9374 d 93 42
       
 22926 +9381 1 93 42
       
 22927 +9382 c 72 68
       
 22928 +938e 2 72 68
       
 22929 +9390 c 105 69
       
 22930 +939c d 105 69
       
 22931 +93a9 1 105 69
       
 22932 +93aa c 301 66
       
 22933 +93b6 d 301 66
       
 22934 +93c3 1 301 66
       
 22935 +93d0 d 94 68
       
 22936 +93dd 1 94 68
       
 22937 +FUNC 93de 2f 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::_M_deallocate(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long)
       
 22938  93de c 120 26
       
 22939 -93ea 6 122 26
       
 22940 -93f0 1d 123 26
       
 22941 -940d 1 123 26
       
 22942 -940e c 108 26
       
 22943 -941a 3d 109 26
       
 22944 -9457 1 109 26
       
 22945 -9458 c 188 26
       
 22946 -9464 12 189 26
       
 22947 -9476 2 190 26
       
 22948 -9478 c 272 26
       
 22949 -9484 4b 273 26
       
 22950 -94cf 1 273 26
       
 22951 -94d0 c 603 26
       
 22952 -94dc c 603 26
       
 22953 +93ea 6 122 71
       
 22954 +93f0 1d 123 71
       
 22955 +940d 1 123 71
       
 22956 +940e c 108 71
       
 22957 +941a 3d 109 71
       
 22958 +9457 1 109 71
       
 22959 +9458 c 188 71
       
 22960 +9464 12 189 71
       
 22961 +9476 2 190 71
       
 22962 +9478 c 272 71
       
 22963 +9484 4b 273 71
       
 22964 +94cf 1 273 71
       
 22965 +94d0 c 603 72
       
 22966 +94dc c 603 72
       
 22967 +FUNC 94e8 2b 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::begin() const
       
 22968  94e8 c 342 26
       
 22969 -94f4 1f 343 26
       
 22970 -9513 1 343 26
       
 22971 +94f4 1f 343 71
       
 22972 +9513 1 343 71
       
 22973 +FUNC 9514 2c 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::end() const
       
 22974  9514 c 360 26
       
 22975 -9520 20 361 26
       
 22976 -9540 c 661 26
       
 22977 -954c 2d 662 26
       
 22978 -9579 1 662 26
       
 22979 +9520 20 361 71
       
 22980 +954c 2d 662 72
       
 22981 +9579 1 662 72
       
 22982 +FUNC 957a 2d 0 unsigned long const& std::max<unsigned long>(unsigned long const&, unsigned long const&)
       
 22983  957a c 206 26
       
 22984 -9586 e 211 26
       
 22985 -9594 8 212 26
       
 22986 -959c b 213 26
       
 22987 -95a7 1 213 26
       
 22988 -95a8 c 649 26
       
 22989 -95b4 19 650 26
       
 22990 -95cd 1 650 26
       
 22991 -95ce c 665 26
       
 22992 -95da 5 666 26
       
 22993 -95df 1 666 26
       
 22994 -95e0 d 758 26
       
 22995 -95ed 2b 759 26
       
 22996 -9618 c 665 26
       
 22997 -9624 5 666 26
       
 22998 -9629 1 666 26
       
 22999 -962a d 758 26
       
 23000 -9637 2b 759 26
       
 23001 +9586 e 211 61
       
 23002 +9594 8 212 61
       
 23003 +959c b 213 61
       
 23004 +95a7 1 213 61
       
 23005 +95b4 19 650 72
       
 23006 +95cd 1 650 72
       
 23007 +95da 5 666 72
       
 23008 +95df 1 666 72
       
 23009 +95ed 2b 759 72
       
 23010 +9624 5 666 72
       
 23011 +9629 1 666 72
       
 23012 +9637 2b 759 72
       
 23013 +FUNC 9662 49 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::capacity() const
       
 23014  9662 c 449 26
       
 23015 -966e 3d 451 26
       
 23016 -96ab 1 451 26
       
 23017 +966e 3d 451 71
       
 23018 +96ab 1 451 71
       
 23019 +FUNC 96ac 3c 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::size() const
       
 23020  96ac c 402 26
       
 23021 -96b8 30 403 26
       
 23022 -96e8 c 587 26
       
 23023 -96f4 26 588 26
       
 23024 -971a c 591 26
       
 23025 -9726 26 592 26
       
 23026 -974c c 103 26
       
 23027 -9758 d 103 26
       
 23028 -9765 1 103 26
       
 23029 -9766 10 285 26
       
 23030 -9776 1b 286 26
       
 23031 -9791 1 286 26
       
 23032 -9792 c 93 26
       
 23033 -979e d 94 26
       
 23034 -97ab 1 94 26
       
 23035 -97ac c 300 26
       
 23036 -97b8 1e 301 26
       
 23037 -97d6 d 620 26
       
 23038 -97e3 56 622 26
       
 23039 -9839 17 623 26
       
 23040 -9850 c 1078 26
       
 23041 -985c 9 1080 26
       
 23042 -9865 1a 1082 26
       
 23043 -987f 2 1083 26
       
 23044 -9881 8 1085 26
       
 23045 -9889 12 1086 26
       
 23046 -989b 6 1087 26
       
 23047 -98a1 6 1083 26
       
 23048 -98a7 1b 1089 26
       
 23049 -98c2 1d 1080 26
       
 23050 -98df c 1091 26
       
 23051 -98eb 1 1091 26
       
 23052 -98ec d 360 26
       
 23053 -98f9 77 361 26
       
 23054 -9970 c 69 26
       
 23055 -997c 20 69 26
       
 23056 -999c d 103 26
       
 23057 -99a9 5c 104 26
       
 23058 -9a05 1 104 26
       
 23059 -9a06 c 69 26
       
 23060 -9a12 2c 69 26
       
 23061 -9a3e d 103 26
       
 23062 -9a4b 5c 104 26
       
 23063 -9aa7 1 104 26
       
 23064 -9aa8 c 661 26
       
 23065 -9ab4 2d 662 26
       
 23066 -9ae1 1 662 26
       
 23067 -9ae2 c 649 26
       
 23068 -9aee 19 650 26
       
 23069 -9b07 1 650 26
       
 23070 -9b08 c 665 26
       
 23071 -9b14 5 666 26
       
 23072 -9b19 1 666 26
       
 23073 -9b1a d 758 26
       
 23074 -9b27 2b 759 26
       
 23075 -9b52 c 72 26
       
 23076 -9b5e 2 72 26
       
 23077 -9b60 c 105 26
       
 23078 -9b6c d 105 26
       
 23079 -9b79 1 105 26
       
 23080 -9b7a c 69 26
       
 23081 -9b86 2 69 26
       
 23082 -9b88 c 107 26
       
 23083 -9b94 d 107 26
       
 23084 -9ba1 1 107 26
       
 23085 -9ba2 c 93 26
       
 23086 -9bae d 94 26
       
 23087 -9bbb 1 94 26
       
 23088 +96b8 30 403 71
       
 23089 +96f4 26 588 34
       
 23090 +9726 26 592 34
       
 23091 +974c c 103 69
       
 23092 +9758 d 103 69
       
 23093 +9765 1 103 69
       
 23094 +9776 1b 286 34
       
 23095 +9791 1 286 34
       
 23096 +979e d 94 68
       
 23097 +97ab 1 94 68
       
 23098 +97b8 1e 301 34
       
 23099 +97e3 56 622 34
       
 23100 +9839 17 623 34
       
 23101 +985c 9 1080 34
       
 23102 +9865 1a 1082 34
       
 23103 +987f 2 1083 34
       
 23104 +9881 8 1085 34
       
 23105 +9889 12 1086 34
       
 23106 +989b 6 1087 34
       
 23107 +98a1 6 1083 34
       
 23108 +98a7 1b 1089 34
       
 23109 +98c2 1d 1080 34
       
 23110 +98df c 1091 34
       
 23111 +98eb 1 1091 34
       
 23112 +98ec d 360 34
       
 23113 +98f9 77 361 34
       
 23114 +9970 c 69 70
       
 23115 +997c 20 69 70
       
 23116 +99a9 5c 104 68
       
 23117 +9a05 1 104 68
       
 23118 +9a06 c 69 70
       
 23119 +9a12 2c 69 70
       
 23120 +9a4b 5c 104 68
       
 23121 +9aa7 1 104 68
       
 23122 +9ab4 2d 662 72
       
 23123 +9ae1 1 662 72
       
 23124 +9aee 19 650 72
       
 23125 +9b07 1 650 72
       
 23126 +9b14 5 666 72
       
 23127 +9b19 1 666 72
       
 23128 +9b27 2b 759 72
       
 23129 +9b52 c 72 68
       
 23130 +9b5e 2 72 68
       
 23131 +9b60 c 105 69
       
 23132 +9b6c d 105 69
       
 23133 +9b79 1 105 69
       
 23134 +9b7a c 69 70
       
 23135 +9b86 2 69 70
       
 23136 +9b94 d 107 68
       
 23137 +9ba1 1 107 68
       
 23138 +9bae d 94 68
       
 23139 +9bbb 1 94 68
       
 23140 +FUNC 9bbc 2a 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_put_node(std::_List_node<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >*)
       
 23141  9bbc c 315 26
       
 23142 -9bc8 1e 316 26
       
 23143 +9bc8 1e 316 66
       
 23144 +FUNC 9be6 35 0 bool __gnu_cxx::operator!=<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > > const&, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > > const&)
       
 23145  9be6 d 699 26
       
 23146 -9bf3 28 700 26
       
 23147 -9c1b 1 700 26
       
 23148 -9c1c c 621 26
       
 23149 -9c28 d 623 26
       
 23150 -9c35 5 624 26
       
 23151 -FUNC 9c3a 4b 0 fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
       
 23152 -9c3a c 539 26
       
 23153 -9c46 8 541 26
       
 23154 -9c4e 2 542 26
       
 23155 -9c50 12 543 26
       
 23156 -9c62 21 542 26
       
 23157 -9c83 2 543 26
       
 23158 -9c85 1 543 26
       
 23159 +9bf3 28 700 72
       
 23160 +9c1b 1 700 72
       
 23161 +9c28 d 623 72
       
 23162 +9c35 5 624 72
       
 23163 +FUNC 9c3a 4b 0 void std::__fill<true>::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)
       
 23164 +9c3a c 539 61
       
 23165 +9c46 8 541 61
       
 23166 +9c4e 2 542 61
       
 23167 +9c50 12 543 61
       
 23168 +9c62 21 542 61
       
 23169 +9c83 2 543 61
       
 23170 +9c85 1 543 61
       
 23171 +FUNC 9c86 2b 0 void std::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)
       
 23172  9c86 c 560 26
       
 23173 -9c92 4 567 26
       
 23174 -9c96 1b 568 26
       
 23175 -9cb1 1 568 26
       
 23176 +9c92 4 567 61
       
 23177 +9c96 1b 568 61
       
 23178 +9cb1 1 568 61
       
 23179 +FUNC 9cb2 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>)
       
 23180  9cb2 c 171 26
       
 23181 -9cbe 2 173 26
       
 23182 -9cc0 1a 174 26
       
 23183 -9cda 21 173 26
       
 23184 -9cfb 2 174 26
       
 23185 -9cfd 1 174 26
       
 23186 -9cfe c 97 26
       
 23187 -9d0a 7 98 26
       
 23188 -9d11 1 98 26
       
 23189 -9d12 c 83 26
       
 23190 -9d1e 1d 85 26
       
 23191 -9d3b 5 86 26
       
 23192 -9d40 16 88 26
       
 23193 -9d56 c 296 26
       
 23194 -9d62 1d 297 26
       
 23195 -9d7f 1 297 26
       
 23196 -9d80 d 603 26
       
 23197 -9d8d e 605 26
       
 23198 -9d9b 9 606 26
       
 23199 -9da4 3c 609 26
       
 23200 -9de0 b 610 26
       
 23201 -9deb 11 609 26
       
 23202 -9dfc b 612 26
       
 23203 -9e07 12 614 26
       
 23204 -9e19 b 615 26
       
 23205 -9e24 13 612 26
       
 23206 -9e37 8 615 26
       
 23207 -9e3f 1 615 26
       
 23208 -9e40 d 749 26
       
 23209 -9e4d 15 751 26
       
 23210 -9e62 1a 752 26
       
 23211 -9e7c b 754 26
       
 23212 -9e87 49 755 26
       
 23213 -9ed0 3b 756 26
       
 23214 -9f0b 12 754 26
       
 23215 -9f1d 15 758 26
       
 23216 -9f32 8 759 26
       
 23217 -9f3a 1c 760 26
       
 23218 -9f56 f 761 26
       
 23219 -9f65 41 762 26
       
 23220 -9fa6 c 97 26
       
 23221 -9fb2 7 98 26
       
 23222 -9fb9 1 98 26
       
 23223 -9fba c 83 26
       
 23224 -9fc6 1d 85 26
       
 23225 -9fe3 5 86 26
       
 23226 -9fe8 17 88 26
       
 23227 -9fff 1 88 26
       
 23228 -a000 c 296 26
       
 23229 -a00c 1d 297 26
       
 23230 -a029 1 297 26
       
 23231 -a02a d 603 26
       
 23232 -a037 e 605 26
       
 23233 -a045 9 606 26
       
 23234 -a04e 3c 609 26
       
 23235 -a08a b 610 26
       
 23236 -a095 11 609 26
       
 23237 -a0a6 b 612 26
       
 23238 -a0b1 12 614 26
       
 23239 -a0c3 b 615 26
       
 23240 -a0ce 13 612 26
       
 23241 -a0e1 8 615 26
       
 23242 -a0e9 1 615 26
       
 23243 -a0ea d 749 26
       
 23244 -a0f7 15 751 26
       
 23245 -a10c 1a 752 26
       
 23246 -a126 b 754 26
       
 23247 -a131 49 755 26
       
 23248 -a17a 3b 756 26
       
 23249 -a1b5 12 754 26
       
 23250 -a1c7 15 758 26
       
 23251 -a1dc 8 759 26
       
 23252 -a1e4 1c 760 26
       
 23253 -a200 f 761 26
       
 23254 -a20f 41 762 26
       
 23255 +9cbe 2 173 73
       
 23256 +9cc0 1a 174 73
       
 23257 +9cda 21 173 73
       
 23258 +9cfb 2 174 73
       
 23259 +9cfd 1 174 73
       
 23260 +9d0a 7 98 68
       
 23261 +9d11 1 98 68
       
 23262 +9d1e 1d 85 68
       
 23263 +9d3b 5 86 68
       
 23264 +9d40 16 88 68
       
 23265 +9d62 1d 297 34
       
 23266 +9d7f 1 297 34
       
 23267 +9d8d e 605 34
       
 23268 +9d9b 9 606 34
       
 23269 +9da4 3c 609 34
       
 23270 +9de0 b 610 34
       
 23271 +9deb 11 609 34
       
 23272 +9dfc b 612 34
       
 23273 +9e07 12 614 34
       
 23274 +9e19 b 615 34
       
 23275 +9e24 13 612 34
       
 23276 +9e37 8 615 34
       
 23277 +9e3f 1 615 34
       
 23278 +9e4d 15 751 34
       
 23279 +9e62 1a 752 34
       
 23280 +9e7c b 754 34
       
 23281 +9e87 49 755 34
       
 23282 +9ed0 3b 756 34
       
 23283 +9f0b 12 754 34
       
 23284 +9f1d 15 758 34
       
 23285 +9f32 8 759 34
       
 23286 +9f3a 1c 760 34
       
 23287 +9f56 f 761 34
       
 23288 +9f65 41 762 34
       
 23289 +9fb2 7 98 68
       
 23290 +9fb9 1 98 68
       
 23291 +9fc6 1d 85 68
       
 23292 +9fe3 5 86 68
       
 23293 +9fe8 17 88 68
       
 23294 +9fff 1 88 68
       
 23295 +a00c 1d 297 34
       
 23296 +a029 1 297 34
       
 23297 +a037 e 605 34
       
 23298 +a045 9 606 34
       
 23299 +a04e 3c 609 34
       
 23300 +a08a b 610 34
       
 23301 +a095 11 609 34
       
 23302 +a0a6 b 612 34
       
 23303 +a0b1 12 614 34
       
 23304 +a0c3 b 615 34
       
 23305 +a0ce 13 612 34
       
 23306 +a0e1 8 615 34
       
 23307 +a0e9 1 615 34
       
 23308 +a0f7 15 751 34
       
 23309 +a10c 1a 752 34
       
 23310 +a126 b 754 34
       
 23311 +a131 49 755 34
       
 23312 +a17a 3b 756 34
       
 23313 +a1b5 12 754 34
       
 23314 +a1c7 15 758 34
       
 23315 +a1dc 8 759 34
       
 23316 +a1e4 1c 760 34
       
 23317 +a200 f 761 34
       
 23318 +a20f 41 762 34
       
 23319 +FUNC a250 35 0 bool __gnu_cxx::operator!=<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > > const&, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > > const&)
       
 23320  a250 d 699 26
       
 23321 -a25d 28 700 26
       
 23322 -a285 1 700 26
       
 23323 -a286 c 621 26
       
 23324 -a292 d 623 26
       
 23325 -a29f 5 624 26
       
 23326 -FUNC a2a4 4b 0 fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
       
 23327 -a2a4 c 539 26
       
 23328 -a2b0 8 541 26
       
 23329 -a2b8 2 542 26
       
 23330 -a2ba 12 543 26
       
 23331 -a2cc 21 542 26
       
 23332 -a2ed 2 543 26
       
 23333 -a2ef 1 543 26
       
 23334 +a25d 28 700 72
       
 23335 +a285 1 700 72
       
 23336 +a292 d 623 72
       
 23337 +a29f 5 624 72
       
 23338 +FUNC a2a4 4b 0 void std::__fill<true>::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)
       
 23339 +a2a4 c 539 61
       
 23340 +a2b0 8 541 61
       
 23341 +a2b8 2 542 61
       
 23342 +a2ba 12 543 61
       
 23343 +a2cc 21 542 61
       
 23344 +a2ed 2 543 61
       
 23345 +a2ef 1 543 61
       
 23346 +FUNC a2f0 2b 0 void std::fill<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)
       
 23347  a2f0 c 560 26
       
 23348 -a2fc 4 567 26
       
 23349 -a300 1b 568 26
       
 23350 -a31b 1 568 26
       
 23351 +a2fc 4 567 61
       
 23352 +a300 1b 568 61
       
 23353 +a31b 1 568 61
       
 23354 +FUNC a31c 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>)
       
 23355  a31c c 171 26
       
 23356 -a328 2 173 26
       
 23357 -a32a 1a 174 26
       
 23358 -a344 21 173 26
       
 23359 -a365 2 174 26
       
 23360 -a367 1 174 26
       
 23361 -a368 c 65 26
       
 23362 -a374 2 65 26
       
 23363 -a376 c 103 26
       
 23364 -a382 d 103 26
       
 23365 -a38f 1 103 26
       
 23366 +a328 2 173 73
       
 23367 +a32a 1a 174 73
       
 23368 +a344 21 173 73
       
 23369 +a365 2 174 73
       
 23370 +a367 1 174 73
       
 23371 +a368 c 65 68
       
 23372 +a374 2 65 68
       
 23373 +a376 c 103 69
       
 23374 +a382 d 103 69
       
 23375 +a38f 1 103 69
       
 23376 +FUNC a390 2b 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::get_allocator() const
       
 23377  a390 10 322 26
       
 23378 -a3a0 1b 324 26
       
 23379 -a3bb 1 324 26
       
 23380 +a3a0 1b 324 66
       
 23381 +a3bb 1 324 66
       
 23382 +FUNC a3bc 7b 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_clear()
       
 23383  a3bc d 69 27
       
 23384 -a3c9 8 72 27
       
 23385 -a3d1 2 73 27
       
 23386 -a3d3 6 75 27
       
 23387 -a3d9 8 76 27
       
 23388 -a3e1 35 77 27
       
 23389 -a416 12 78 27
       
 23390 -a428 a 73 27
       
 23391 -a432 5 78 27
       
 23392 -a437 1 78 27
       
 23393 -a438 c 331 27
       
 23394 -a444 18 332 27
       
 23395 -a45c c 392 27
       
 23396 -a468 d 392 27
       
 23397 -a475 1 392 27
       
 23398 -a476 c 211 27
       
 23399 -a482 10 211 27
       
 23400 -a492 c 107 27
       
 23401 -a49e d 107 27
       
 23402 -a4ab 1 107 27
       
 23403 +a3c9 8 72 77
       
 23404 +a3d1 2 73 77
       
 23405 +a3d3 6 75 77
       
 23406 +a3d9 8 76 77
       
 23407 +a3e1 35 77 77
       
 23408 +a416 12 78 77
       
 23409 +a428 a 73 77
       
 23410 +a432 5 78 77
       
 23411 +a437 1 78 77
       
 23412 +a438 c 331 66
       
 23413 +a444 18 332 66
       
 23414 +a45c c 392 66
       
 23415 +a468 d 392 66
       
 23416 +a475 1 392 66
       
 23417 +a476 c 211 74
       
 23418 +a482 10 211 74
       
 23419 +a49e d 107 68
       
 23420 +a4ab 1 107 68
       
 23421 +FUNC a4ac 2e 0 void std::_Destroy<dwarf2reader::CompilationUnit::Abbrev*, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)
       
 23422  a4ac c 171 27
       
 23423 -a4b8 2 173 27
       
 23424 -a4ba 12 174 27
       
 23425 -a4cc c 173 27
       
 23426 -a4d8 2 174 27
       
 23427 -a4da c 272 27
       
 23428 -a4e6 4b 273 27
       
 23429 -a531 1 273 27
       
 23430 -a532 13 196 27
       
 23431 -a545 10 196 27
       
 23432 -a555 2f 197 27
       
 23433 -a584 1a 198 27
       
 23434 -a59e 13 196 27
       
 23435 -a5b1 10 196 27
       
 23436 -a5c1 2f 197 27
       
 23437 -a5f0 1a 198 27
       
 23438 -a60a c 97 27
       
 23439 -a616 7 98 27
       
 23440 -a61d 1 98 27
       
 23441 -a61e c 83 27
       
 23442 -a62a 1d 85 27
       
 23443 -a647 5 86 27
       
 23444 -a64c 10 88 27
       
 23445 +a4b8 2 173 73
       
 23446 +a4ba 12 174 73
       
 23447 +a4cc c 173 73
       
 23448 +a4d8 2 174 73
       
 23449 +a4da c 272 71
       
 23450 +a4e6 4b 273 71
       
 23451 +a531 1 273 71
       
 23452 +a532 13 196 74
       
 23453 +a545 10 196 74
       
 23454 +a555 2f 197 74
       
 23455 +a584 1a 198 74
       
 23456 +a59e 13 196 74
       
 23457 +a5b1 10 196 74
       
 23458 +a5c1 2f 197 74
       
 23459 +a5f0 1a 198 74
       
 23460 +a616 7 98 68
       
 23461 +a61d 1 98 68
       
 23462 +a62a 1d 85 68
       
 23463 +a647 5 86 68
       
 23464 +a64c 10 88 68
       
 23465 +FUNC a65c 2a 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::_M_allocate(unsigned long)
       
 23466  a65c c 116 27
       
 23467 -a668 1e 117 27
       
 23468 -a686 d 100 27
       
 23469 -a693 12 101 27
       
 23470 -a6a5 19 103 27
       
 23471 -a6be b 104 27
       
 23472 -a6c9 3a 105 27
       
 23473 -a703 1 105 27
       
 23474 -a704 c 97 27
       
 23475 -a710 7 98 27
       
 23476 -a717 1 98 27
       
 23477 -a718 c 83 27
       
 23478 -a724 1d 85 27
       
 23479 -a741 5 86 27
       
 23480 -a746 10 88 27
       
 23481 +a668 1e 117 71
       
 23482 +a686 d 100 71
       
 23483 +a693 12 101 71
       
 23484 +a6a5 19 103 71
       
 23485 +a6be b 104 71
       
 23486 +a6c9 3a 105 71
       
 23487 +a703 1 105 71
       
 23488 +a710 7 98 68
       
 23489 +a717 1 98 68
       
 23490 +a724 1d 85 68
       
 23491 +a741 5 86 68
       
 23492 +a746 10 88 68
       
 23493 +FUNC a756 2a 0 std::_Vector_base<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::_M_allocate(unsigned long)
       
 23494  a756 c 116 27
       
 23495 -a762 1e 117 27
       
 23496 -a780 d 100 27
       
 23497 -a78d 12 101 27
       
 23498 -a79f 19 103 27
       
 23499 -a7b8 b 104 27
       
 23500 -a7c3 3a 105 27
       
 23501 -a7fd 1 105 27
       
 23502 -FUNC a7fe 60 0 copy_b<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
       
 23503 -a7fe d 422 27
       
 23504 -a80b 12 424 27
       
 23505 -a81d 2e 425 27
       
 23506 -a84b 13 426 27
       
 23507 -a85e c 432 27
       
 23508 -a86a 4 440 27
       
 23509 -a86e 1b 443 27
       
 23510 -a889 1 443 27
       
 23511 -FUNC a88a 64 0 copy_b_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > > >
       
 23512 -a88a e 480 27
       
 23513 -a898 56 482 27
       
 23514 -a8ee c 504 27
       
 23515 -a8fa 4 514 27
       
 23516 -a8fe 4 515 27
       
 23517 -a902 1b 517 27
       
 23518 -a91d 1 517 27
       
 23519 -FUNC a91e 32 0 fill_n<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, long unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
       
 23520 -a91e c 614 27
       
 23521 -a92a 8 616 27
       
 23522 -a932 2 617 27
       
 23523 -a934 8 618 27
       
 23524 -a93c f 617 27
       
 23525 -a94b 5 619 27
       
 23526 -a950 c 636 27
       
 23527 -a95c 4 641 27
       
 23528 -a960 1b 642 27
       
 23529 -a97b 1 642 27
       
 23530 +a762 1e 117 71
       
 23531 +a780 d 100 71
       
 23532 +a78d 12 101 71
       
 23533 +a79f 19 103 71
       
 23534 +a7b8 b 104 71
       
 23535 +a7c3 3a 105 71
       
 23536 +a7fd 1 105 71
       
 23537 +a80b 12 424 61
       
 23538 +a81d 2e 425 61
       
 23539 +a84b 13 426 61
       
 23540 +a86a 4 440 61
       
 23541 +a86e 1b 443 61
       
 23542 +a889 1 443 61
       
 23543 +a898 56 482 61
       
 23544 +a8fa 4 514 61
       
 23545 +a8fe 4 515 61
       
 23546 +a902 1b 517 61
       
 23547 +a91d 1 517 61
       
 23548 +a92a 8 616 61
       
 23549 +a932 2 617 61
       
 23550 +a934 8 618 61
       
 23551 +a93c f 617 61
       
 23552 +a94b 5 619 61
       
 23553 +a95c 4 641 61
       
 23554 +a960 1b 642 61
       
 23555 +a97b 1 642 61
       
 23556 +FUNC a97c 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&, __true_type)
       
 23557  a97c c 182 28
       
 23558 -a988 1b 183 28
       
 23559 -a9a3 1 183 28
       
 23560 +a988 1b 183 79
       
 23561 +a9a3 1 183 79
       
 23562 +FUNC a9a4 2f 0 void std::uninitialized_fill_n<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)
       
 23563  a9a4 c 214 28
       
 23564 -a9b0 23 218 28
       
 23565 -a9d3 1 218 28
       
 23566 +a9b0 23 218 79
       
 23567 +a9d3 1 218 79
       
 23568 +FUNC a9d4 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>)
       
 23569  a9d4 c 308 28
       
 23570 -a9e0 1b 310 28
       
 23571 -a9fb 1 310 28
       
 23572 -a9fc c 200 28
       
 23573 -aa08 19 201 28
       
 23574 -aa21 42 203 28
       
 23575 -aa63 15 205 28
       
 23576 -aa78 d 990 28
       
 23577 -aa85 11 992 28
       
 23578 -aa96 c 993 28
       
 23579 -aaa2 15 995 28
       
 23580 -aab7 c 996 28
       
 23581 -aac3 4a 998 28
       
 23582 -ab0d f 1001 28
       
 23583 -ab1c 1c 998 28
       
 23584 -ab38 1a 1003 28
       
 23585 -ab52 5 1004 28
       
 23586 -ab57 1f 1007 28
       
 23587 -ab76 1c 1008 28
       
 23588 -ab92 19 1009 28
       
 23589 -abab 19 1010 28
       
 23590 -abc4 1a 1011 28
       
 23591 -abde a 1004 28
       
 23592 -abe8 11 1001 28
       
 23593 -abf9 15 1014 28
       
 23594 -ac0e 13 1028 28
       
 23595 -ac21 b 1016 28
       
 23596 -ac2c 9 1018 28
       
 23597 -ac35 19 1023 28
       
 23598 -ac4e 23 1024 28
       
 23599 -ac71 19 1025 28
       
 23600 -ac8a 1d 1021 28
       
 23601 -aca7 1a 1018 28
       
 23602 -acc1 b 1028 28
       
 23603 -accc b 1016 28
       
 23604 -acd7 1e 1028 28
       
 23605 -acf5 1 1028 28
       
 23606 -acf6 10 436 28
       
 23607 -ad06 16 438 28
       
 23608 -ad1c 37 439 28
       
 23609 -ad53 1 439 28
       
 23610 -ad54 10 211 28
       
 23611 -ad64 37 212 28
       
 23612 -ad9b 1 212 28
       
 23613 -FUNC ad9c 32 0 fill_n<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, long unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
       
 23614 -ad9c c 614 28
       
 23615 -ada8 8 616 28
       
 23616 -adb0 2 617 28
       
 23617 -adb2 8 618 28
       
 23618 -adba f 617 28
       
 23619 -adc9 5 619 28
       
 23620 -adce c 636 28
       
 23621 -adda 4 641 28
       
 23622 -adde 1b 642 28
       
 23623 -adf9 1 642 28
       
 23624 +a9e0 1b 310 79
       
 23625 +a9fb 1 310 79
       
 23626 +a9fc c 200 71
       
 23627 +aa08 19 201 71
       
 23628 +aa21 42 203 71
       
 23629 +aa63 15 205 71
       
 23630 +aa85 11 992 34
       
 23631 +aa96 c 993 34
       
 23632 +aaa2 15 995 34
       
 23633 +aab7 c 996 34
       
 23634 +aac3 4a 998 34
       
 23635 +ab0d f 1001 34
       
 23636 +ab1c 1c 998 34
       
 23637 +ab38 1a 1003 34
       
 23638 +ab52 5 1004 34
       
 23639 +ab57 1f 1007 34
       
 23640 +ab76 1c 1008 34
       
 23641 +ab92 19 1009 34
       
 23642 +abab 19 1010 34
       
 23643 +abc4 1a 1011 34
       
 23644 +abde a 1004 34
       
 23645 +abe8 11 1001 34
       
 23646 +abf9 15 1014 34
       
 23647 +ac0e 13 1028 34
       
 23648 +ac21 b 1016 34
       
 23649 +ac2c 9 1018 34
       
 23650 +ac35 19 1023 34
       
 23651 +ac4e 23 1024 34
       
 23652 +ac71 19 1025 34
       
 23653 +ac8a 1d 1021 34
       
 23654 +aca7 1a 1018 34
       
 23655 +acc1 b 1028 34
       
 23656 +accc b 1016 34
       
 23657 +acd7 1e 1028 34
       
 23658 +acf5 1 1028 34
       
 23659 +ad06 16 438 34
       
 23660 +ad1c 37 439 34
       
 23661 +ad53 1 439 34
       
 23662 +ad64 37 212 42
       
 23663 +ad9b 1 212 42
       
 23664 +ada8 8 616 61
       
 23665 +adb0 2 617 61
       
 23666 +adb2 8 618 61
       
 23667 +adba f 617 61
       
 23668 +adc9 5 619 61
       
 23669 +adda 4 641 61
       
 23670 +adde 1b 642 61
       
 23671 +adf9 1 642 61
       
 23672 +FUNC adfa 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&, __true_type)
       
 23673  adfa c 182 28
       
 23674 -ae06 1b 183 28
       
 23675 -ae21 1 183 28
       
 23676 +ae06 1b 183 79
       
 23677 +ae21 1 183 79
       
 23678 +FUNC ae22 2f 0 void std::uninitialized_fill_n<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)
       
 23679  ae22 c 214 28
       
 23680 -ae2e 23 218 28
       
 23681 -ae51 1 218 28
       
 23682 +ae2e 23 218 79
       
 23683 +ae51 1 218 79
       
 23684 +FUNC ae52 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>)
       
 23685  ae52 c 308 28
       
 23686 -ae5e 1b 310 28
       
 23687 -ae79 1 310 28
       
 23688 -ae7a c 200 28
       
 23689 -ae86 19 201 28
       
 23690 -ae9f 42 203 28
       
 23691 -aee1 15 205 28
       
 23692 -aef6 d 990 28
       
 23693 -af03 11 992 28
       
 23694 -af14 c 993 28
       
 23695 -af20 15 995 28
       
 23696 -af35 c 996 28
       
 23697 -af41 4a 998 28
       
 23698 -af8b f 1001 28
       
 23699 -af9a 1c 998 28
       
 23700 -afb6 1a 1003 28
       
 23701 -afd0 5 1004 28
       
 23702 -afd5 1f 1007 28
       
 23703 -aff4 1c 1008 28
       
 23704 -b010 19 1009 28
       
 23705 -b029 19 1010 28
       
 23706 -b042 1a 1011 28
       
 23707 -b05c a 1004 28
       
 23708 -b066 11 1001 28
       
 23709 -b077 15 1014 28
       
 23710 -b08c 13 1028 28
       
 23711 -b09f b 1016 28
       
 23712 -b0aa 9 1018 28
       
 23713 -b0b3 19 1023 28
       
 23714 -b0cc 23 1024 28
       
 23715 -b0ef 19 1025 28
       
 23716 -b108 1d 1021 28
       
 23717 -b125 1a 1018 28
       
 23718 -b13f b 1028 28
       
 23719 -b14a b 1016 28
       
 23720 -b155 1e 1028 28
       
 23721 -b173 1 1028 28
       
 23722 -b174 10 436 28
       
 23723 -b184 16 438 28
       
 23724 -b19a 37 439 28
       
 23725 -b1d1 1 439 28
       
 23726 -b1d2 10 211 28
       
 23727 -b1e2 37 212 28
       
 23728 -b219 1 212 28
       
 23729 -FUNC b21a 60 0 copy_b<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
       
 23730 -b21a d 422 28
       
 23731 -b227 12 424 28
       
 23732 -b239 2e 425 28
       
 23733 -b267 13 426 28
       
 23734 -b27a c 432 28
       
 23735 -b286 4 440 28
       
 23736 -b28a 1b 443 28
       
 23737 -b2a5 1 443 28
       
 23738 -FUNC b2a6 64 0 copy_b_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > > >
       
 23739 -b2a6 e 480 28
       
 23740 -b2b4 56 482 28
       
 23741 -b30a c 504 28
       
 23742 -b316 4 514 28
       
 23743 -b31a 4 515 28
       
 23744 -b31e 1b 517 28
       
 23745 -b339 1 517 28
       
 23746 -FUNC b33a 43 0 fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, long unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
       
 23747 -b33a c 614 28
       
 23748 -b346 8 616 28
       
 23749 -b34e 2 617 28
       
 23750 -b350 12 618 28
       
 23751 -b362 16 617 28
       
 23752 -b378 5 619 28
       
 23753 -b37d 1 619 28
       
 23754 -b37e c 636 28
       
 23755 -b38a 4 641 28
       
 23756 -b38e 1b 642 28
       
 23757 -b3a9 1 642 28
       
 23758 +ae5e 1b 310 79
       
 23759 +ae79 1 310 79
       
 23760 +ae7a c 200 71
       
 23761 +ae86 19 201 71
       
 23762 +ae9f 42 203 71
       
 23763 +aee1 15 205 71
       
 23764 +af03 11 992 34
       
 23765 +af14 c 993 34
       
 23766 +af20 15 995 34
       
 23767 +af35 c 996 34
       
 23768 +af41 4a 998 34
       
 23769 +af8b f 1001 34
       
 23770 +af9a 1c 998 34
       
 23771 +afb6 1a 1003 34
       
 23772 +afd0 5 1004 34
       
 23773 +afd5 1f 1007 34
       
 23774 +aff4 1c 1008 34
       
 23775 +b010 19 1009 34
       
 23776 +b029 19 1010 34
       
 23777 +b042 1a 1011 34
       
 23778 +b05c a 1004 34
       
 23779 +b066 11 1001 34
       
 23780 +b077 15 1014 34
       
 23781 +b08c 13 1028 34
       
 23782 +b09f b 1016 34
       
 23783 +b0aa 9 1018 34
       
 23784 +b0b3 19 1023 34
       
 23785 +b0cc 23 1024 34
       
 23786 +b0ef 19 1025 34
       
 23787 +b108 1d 1021 34
       
 23788 +b125 1a 1018 34
       
 23789 +b13f b 1028 34
       
 23790 +b14a b 1016 34
       
 23791 +b155 1e 1028 34
       
 23792 +b173 1 1028 34
       
 23793 +b184 16 438 34
       
 23794 +b19a 37 439 34
       
 23795 +b1d1 1 439 34
       
 23796 +b1e2 37 212 42
       
 23797 +b219 1 212 42
       
 23798 +b227 12 424 61
       
 23799 +b239 2e 425 61
       
 23800 +b267 13 426 61
       
 23801 +b286 4 440 61
       
 23802 +b28a 1b 443 61
       
 23803 +b2a5 1 443 61
       
 23804 +b2b4 56 482 61
       
 23805 +b316 4 514 61
       
 23806 +b31a 4 515 61
       
 23807 +b31e 1b 517 61
       
 23808 +b339 1 517 61
       
 23809 +b346 8 616 61
       
 23810 +b34e 2 617 61
       
 23811 +b350 12 618 61
       
 23812 +b362 16 617 61
       
 23813 +b378 5 619 61
       
 23814 +b37d 1 619 61
       
 23815 +b38a 4 641 61
       
 23816 +b38e 1b 642 61
       
 23817 +b3a9 1 642 61
       
 23818 +FUNC b3aa 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&, __true_type)
       
 23819  b3aa c 182 28
       
 23820 -b3b6 1b 183 28
       
 23821 -b3d1 1 183 28
       
 23822 +b3b6 1b 183 79
       
 23823 +b3d1 1 183 79
       
 23824 +FUNC b3d2 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)
       
 23825  b3d2 c 214 28
       
 23826 -b3de 23 218 28
       
 23827 -b401 1 218 28
       
 23828 +b3de 23 218 79
       
 23829 +b401 1 218 79
       
 23830 +FUNC b402 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*>)
       
 23831  b402 c 308 28
       
 23832 -b40e 1b 310 28
       
 23833 -b429 1 310 28
       
 23834 -FUNC b42a 43 0 fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, long unsigned int, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
       
 23835 -b42a c 614 28
       
 23836 -b436 8 616 28
       
 23837 -b43e 2 617 28
       
 23838 -b440 12 618 28
       
 23839 -b452 16 617 28
       
 23840 -b468 5 619 28
       
 23841 -b46d 1 619 28
       
 23842 -b46e c 636 28
       
 23843 -b47a 4 641 28
       
 23844 -b47e 1b 642 28
       
 23845 -b499 1 642 28
       
 23846 +b40e 1b 310 79
       
 23847 +b429 1 310 79
       
 23848 +b436 8 616 61
       
 23849 +b43e 2 617 61
       
 23850 +b440 12 618 61
       
 23851 +b452 16 617 61
       
 23852 +b468 5 619 61
       
 23853 +b46d 1 619 61
       
 23854 +b47a 4 641 61
       
 23855 +b47e 1b 642 61
       
 23856 +b499 1 642 61
       
 23857 +FUNC b49a 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&, __true_type)
       
 23858  b49a c 182 28
       
 23859 -b4a6 1b 183 28
       
 23860 -b4c1 1 183 28
       
 23861 +b4a6 1b 183 79
       
 23862 +b4c1 1 183 79
       
 23863 +FUNC b4c2 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)
       
 23864  b4c2 c 214 28
       
 23865 -b4ce 23 218 28
       
 23866 -b4f1 1 218 28
       
 23867 +b4ce 23 218 79
       
 23868 +b4f1 1 218 79
       
 23869 +FUNC b4f2 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*>)
       
 23870  b4f2 c 308 28
       
 23871 -b4fe 1b 310 28
       
 23872 -b519 1 310 28
       
 23873 -FUNC b51a 3f 0 copy<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*>
       
 23874 -b51a c 298 28
       
 23875 -b526 22 300 28
       
 23876 -b548 11 301 28
       
 23877 -b559 1 301 28
       
 23878 -b55a c 307 28
       
 23879 -b566 4 315 28
       
 23880 -b56a 1b 317 28
       
 23881 -b585 1 317 28
       
 23882 -FUNC b586 27 0 copy_n<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**>
       
 23883 -b586 c 325 28
       
 23884 -b592 1b 326 28
       
 23885 -b5ad 1 326 28
       
 23886 -b5ae c 376 28
       
 23887 -b5ba 4 384 28
       
 23888 -b5be 4 385 28
       
 23889 -b5c2 1b 387 28
       
 23890 -b5dd 1 387 28
       
 23891 -b5de c 73 28
       
 23892 -b5ea 1b 74 28
       
 23893 -b605 1 74 28
       
 23894 -b606 c 108 28
       
 23895 -b612 23 113 28
       
 23896 -b635 1 113 28
       
 23897 -b636 c 252 28
       
 23898 -b642 1b 254 28
       
 23899 -b65d 1 254 28
       
 23900 -FUNC b65e 66 0 _M_allocate_and_copy<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**>
       
 23901 -b65e c 761 28
       
 23902 -b66a 15 763 28
       
 23903 -b67f 40 766 28
       
 23904 -b6bf 3 768 28
       
 23905 -b6c2 2 773 28
       
 23906 +b4fe 1b 310 79
       
 23907 +b519 1 310 79
       
 23908 +b526 22 300 61
       
 23909 +b548 11 301 61
       
 23910 +b559 1 301 61
       
 23911 +b566 4 315 61
       
 23912 +b56a 1b 317 61
       
 23913 +b585 1 317 61
       
 23914 +b592 1b 326 61
       
 23915 +b5ad 1 326 61
       
 23916 +b5ba 4 384 61
       
 23917 +b5be 4 385 61
       
 23918 +b5c2 1b 387 61
       
 23919 +b5dd 1 387 61
       
 23920 +b5ea 1b 74 79
       
 23921 +b605 1 74 79
       
 23922 +b612 23 113 79
       
 23923 +b635 1 113 79
       
 23924 +b642 1b 254 79
       
 23925 +b65d 1 254 79
       
 23926 +b66a 15 763 71
       
 23927 +b67f 40 766 71
       
 23928 +b6bf 3 768 71
       
 23929 +b6c2 2 773 71
       
 23930 +FUNC b6c4 124 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::reserve(unsigned long)
       
 23931  b6c4 13 69 29
       
 23932 -b6d7 15 71 29
       
 23933 -b6ec e 72 29
       
 23934 -b6fa 19 73 29
       
 23935 -b713 e 75 29
       
 23936 -b721 28 78 29
       
 23937 -b749 3e 79 29
       
 23938 -b787 30 81 29
       
 23939 -b7b7 8 84 29
       
 23940 -b7bf 11 85 29
       
 23941 -b7d0 18 86 29
       
 23942 -FUNC b7e8 40 0 copy_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, __gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**>
       
 23943 -b7e8 d 334 29
       
 23944 -b7f5 33 335 29
       
 23945 -b828 c 376 29
       
 23946 -b834 4 384 29
       
 23947 -b838 4 385 29
       
 23948 -b83c 1b 387 29
       
 23949 -b857 1 387 29
       
 23950 -b858 c 73 29
       
 23951 -b864 1b 74 29
       
 23952 -b87f 1 74 29
       
 23953 -b880 c 108 29
       
 23954 -b88c 23 113 29
       
 23955 -b8af 1 113 29
       
 23956 -b8b0 c 252 29
       
 23957 -b8bc 1b 254 29
       
 23958 -b8d7 1 254 29
       
 23959 -FUNC b8d8 64 0 copy_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, std::pair<const char*, uint64> > >*> > > >
       
 23960 -b8d8 e 352 29
       
 23961 -b8e6 56 354 29
       
 23962 -b93c c 376 29
       
 23963 -b948 4 384 29
       
 23964 -b94c 4 385 29
       
 23965 -b950 1b 387 29
       
 23966 -b96b 1 387 29
       
 23967 -b96c c 73 29
       
 23968 -b978 1b 74 29
       
 23969 -b993 1 74 29
       
 23970 -b994 c 108 29
       
 23971 -b9a0 23 113 29
       
 23972 -b9c3 1 113 29
       
 23973 -b9c4 c 252 29
       
 23974 -b9d0 1b 254 29
       
 23975 -b9eb 1 254 29
       
 23976 +b6d7 15 71 78
       
 23977 +b6ec e 72 78
       
 23978 +b6fa 19 73 78
       
 23979 +b713 e 75 78
       
 23980 +b721 28 78 78
       
 23981 +b749 3e 79 78
       
 23982 +b787 30 81 78
       
 23983 +b7b7 8 84 78
       
 23984 +b7bf 11 85 78
       
 23985 +b7d0 18 86 78
       
 23986 +b7f5 33 335 61
       
 23987 +b834 4 384 61
       
 23988 +b838 4 385 61
       
 23989 +b83c 1b 387 61
       
 23990 +b857 1 387 61
       
 23991 +b864 1b 74 79
       
 23992 +b87f 1 74 79
       
 23993 +b88c 23 113 79
       
 23994 +b8af 1 113 79
       
 23995 +b8bc 1b 254 79
       
 23996 +b8d7 1 254 79
       
 23997 +b8e6 56 354 61
       
 23998 +b948 4 384 61
       
 23999 +b94c 4 385 61
       
 24000 +b950 1b 387 61
       
 24001 +b96b 1 387 61
       
 24002 +b978 1b 74 79
       
 24003 +b993 1 74 79
       
 24004 +b9a0 23 113 79
       
 24005 +b9c3 1 113 79
       
 24006 +b9d0 1b 254 79
       
 24007 +b9eb 1 254 79
       
 24008 +FUNC b9ec 46e 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)
       
 24009  b9ec 14 311 29
       
 24010 -ba00 b 313 29
       
 24011 -ba0b 24 315 29
       
 24012 -ba2f 8 318 29
       
 24013 -ba37 23 319 29
       
 24014 -ba5a 15 320 29
       
 24015 -ba6f c 321 29
       
 24016 -ba7b 51 323 29
       
 24017 -bacc 14 327 29
       
 24018 -bae0 30 328 29
       
 24019 -bb10 35 330 29
       
 24020 -bb45 48 334 29
       
 24021 -bb8d 17 338 29
       
 24022 -bba4 43 339 29
       
 24023 -bbe7 14 342 29
       
 24024 -bbfb 1e 343 29
       
 24025 -bc19 e 348 29
       
 24026 -bc27 1e 349 29
       
 24027 -bc45 e 350 29
       
 24028 -bc53 1d 353 29
       
 24029 -bc70 8 354 29
       
 24030 -bc78 e 355 29
       
 24031 -bc86 27 357 29
       
 24032 -bcad 6 358 29
       
 24033 -bcb3 4d 361 29
       
 24034 -bd00 40 365 29
       
 24035 -bd40 18 367 29
       
 24036 -bd58 4d 368 29
       
 24037 -bda5 3e 379 29
       
 24038 -bde3 30 381 29
       
 24039 -be13 12 384 29
       
 24040 -be25 13 385 29
       
 24041 -be38 22 386 29
       
 24042 +ba00 b 313 78
       
 24043 +ba0b 24 315 78
       
 24044 +ba2f 8 318 78
       
 24045 +ba37 23 319 78
       
 24046 +ba5a 15 320 78
       
 24047 +ba6f c 321 78
       
 24048 +ba7b 51 323 78
       
 24049 +bacc 14 327 78
       
 24050 +bae0 30 328 78
       
 24051 +bb10 35 330 78
       
 24052 +bb45 48 334 78
       
 24053 +bb8d 17 338 78
       
 24054 +bba4 43 339 78
       
 24055 +bbe7 14 342 78
       
 24056 +bbfb 1e 343 78
       
 24057 +bc19 e 348 78
       
 24058 +bc27 1e 349 78
       
 24059 +bc45 e 350 78
       
 24060 +bc53 1d 353 78
       
 24061 +bc70 8 354 78
       
 24062 +bc78 e 355 78
       
 24063 +bc86 27 357 78
       
 24064 +bcad 6 358 78
       
 24065 +bcb3 4d 361 78
       
 24066 +bd00 40 365 78
       
 24067 +bd40 18 367 78
       
 24068 +bd58 4d 368 78
       
 24069 +bda5 3e 379 78
       
 24070 +bde3 30 381 78
       
 24071 +be13 12 384 78
       
 24072 +be25 13 385 78
       
 24073 +be38 22 386 78
       
 24074 +FUNC be5a 2e 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >* const&)
       
 24075  be5a c 657 29
       
 24076 -be66 22 658 29
       
 24077 -be88 c 578 29
       
 24078 -be94 15 580 29
       
 24079 -bea9 15 581 29
       
 24080 -bebe 37 582 29
       
 24081 -bef5 c 583 29
       
 24082 -bf01 1 583 29
       
 24083 -bf02 d 335 29
       
 24084 -bf0f 4e 337 29
       
 24085 -bf5d 4d 338 29
       
 24086 -bfaa d 134 29
       
 24087 -bfb7 65 135 29
       
 24088 -FUNC c01c 3f 0 copy<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*>
       
 24089 -c01c c 298 29
       
 24090 -c028 22 300 29
       
 24091 -c04a 11 301 29
       
 24092 -c05b 1 301 29
       
 24093 -c05c c 307 29
       
 24094 -c068 4 315 29
       
 24095 -c06c 1b 317 29
       
 24096 -c087 1 317 29
       
 24097 -FUNC c088 27 0 copy_n<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**>
       
 24098 -c088 c 325 29
       
 24099 -c094 1b 326 29
       
 24100 -c0af 1 326 29
       
 24101 -c0b0 c 376 29
       
 24102 -c0bc 4 384 29
       
 24103 -c0c0 4 385 29
       
 24104 -c0c4 1b 387 29
       
 24105 -c0df 1 387 29
       
 24106 -c0e0 c 73 29
       
 24107 -c0ec 1b 74 29
       
 24108 -c107 1 74 29
       
 24109 -c108 c 108 29
       
 24110 -c114 23 113 29
       
 24111 -c137 1 113 29
       
 24112 -c138 c 252 29
       
 24113 -c144 1b 254 29
       
 24114 -c15f 1 254 29
       
 24115 -FUNC c160 66 0 _M_allocate_and_copy<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**>
       
 24116 -c160 c 761 29
       
 24117 -c16c 15 763 29
       
 24118 -c181 40 766 29
       
 24119 -c1c1 3 768 29
       
 24120 -c1c4 2 773 29
       
 24121 +be66 22 658 71
       
 24122 +be94 15 580 34
       
 24123 +bea9 15 581 34
       
 24124 +bebe 37 582 34
       
 24125 +bef5 c 583 34
       
 24126 +bf01 1 583 34
       
 24127 +bf02 d 335 34
       
 24128 +bf0f 4e 337 34
       
 24129 +bf5d 4d 338 34
       
 24130 +bfaa d 134 42
       
 24131 +bfb7 65 135 42
       
 24132 +c028 22 300 61
       
 24133 +c04a 11 301 61
       
 24134 +c05b 1 301 61
       
 24135 +c068 4 315 61
       
 24136 +c06c 1b 317 61
       
 24137 +c087 1 317 61
       
 24138 +c094 1b 326 61
       
 24139 +c0af 1 326 61
       
 24140 +c0bc 4 384 61
       
 24141 +c0c0 4 385 61
       
 24142 +c0c4 1b 387 61
       
 24143 +c0df 1 387 61
       
 24144 +c0ec 1b 74 79
       
 24145 +c107 1 74 79
       
 24146 +c114 23 113 79
       
 24147 +c137 1 113 79
       
 24148 +c144 1b 254 79
       
 24149 +c15f 1 254 79
       
 24150 +c16c 15 763 71
       
 24151 +c181 40 766 71
       
 24152 +c1c1 3 768 71
       
 24153 +c1c4 2 773 71
       
 24154 +FUNC c1c6 124 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::reserve(unsigned long)
       
 24155  c1c6 13 69 29
       
 24156 -c1d9 15 71 29
       
 24157 -c1ee e 72 29
       
 24158 -c1fc 19 73 29
       
 24159 -c215 e 75 29
       
 24160 -c223 28 78 29
       
 24161 -c24b 3e 79 29
       
 24162 -c289 30 81 29
       
 24163 -c2b9 8 84 29
       
 24164 -c2c1 11 85 29
       
 24165 -c2d2 18 86 29
       
 24166 -FUNC c2ea 40 0 copy_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, __gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**>
       
 24167 -c2ea d 334 29
       
 24168 -c2f7 33 335 29
       
 24169 -c32a c 376 29
       
 24170 -c336 4 384 29
       
 24171 -c33a 4 385 29
       
 24172 -c33e 1b 387 29
       
 24173 -c359 1 387 29
       
 24174 -c35a c 73 29
       
 24175 -c366 1b 74 29
       
 24176 -c381 1 74 29
       
 24177 -c382 c 108 29
       
 24178 -c38e 23 113 29
       
 24179 -c3b1 1 113 29
       
 24180 -c3b2 c 252 29
       
 24181 -c3be 1b 254 29
       
 24182 -c3d9 1 254 29
       
 24183 -FUNC c3da 64 0 copy_n<__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > >, __gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<const std::string, dwarf2reader::SectionMap*> >*> > > >
       
 24184 -c3da e 352 29
       
 24185 -c3e8 56 354 29
       
 24186 -c43e c 376 29
       
 24187 -c44a 4 384 29
       
 24188 -c44e 4 385 29
       
 24189 -c452 1b 387 29
       
 24190 -c46d 1 387 29
       
 24191 -c46e c 73 29
       
 24192 -c47a 1b 74 29
       
 24193 -c495 1 74 29
       
 24194 -c496 c 108 29
       
 24195 -c4a2 23 113 29
       
 24196 -c4c5 1 113 29
       
 24197 -c4c6 c 252 29
       
 24198 -c4d2 1b 254 29
       
 24199 -c4ed 1 254 29
       
 24200 +c1d9 15 71 78
       
 24201 +c1ee e 72 78
       
 24202 +c1fc 19 73 78
       
 24203 +c215 e 75 78
       
 24204 +c223 28 78 78
       
 24205 +c24b 3e 79 78
       
 24206 +c289 30 81 78
       
 24207 +c2b9 8 84 78
       
 24208 +c2c1 11 85 78
       
 24209 +c2d2 18 86 78
       
 24210 +c2f7 33 335 61
       
 24211 +c336 4 384 61
       
 24212 +c33a 4 385 61
       
 24213 +c33e 1b 387 61
       
 24214 +c359 1 387 61
       
 24215 +c366 1b 74 79
       
 24216 +c381 1 74 79
       
 24217 +c38e 23 113 79
       
 24218 +c3b1 1 113 79
       
 24219 +c3be 1b 254 79
       
 24220 +c3d9 1 254 79
       
 24221 +c3e8 56 354 61
       
 24222 +c44a 4 384 61
       
 24223 +c44e 4 385 61
       
 24224 +c452 1b 387 61
       
 24225 +c46d 1 387 61
       
 24226 +c47a 1b 74 79
       
 24227 +c495 1 74 79
       
 24228 +c4a2 23 113 79
       
 24229 +c4c5 1 113 79
       
 24230 +c4d2 1b 254 79
       
 24231 +c4ed 1 254 79
       
 24232 +FUNC c4ee 46e 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::_M_fill_insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)
       
 24233  c4ee 14 311 29
       
 24234 -c502 b 313 29
       
 24235 -c50d 24 315 29
       
 24236 -c531 8 318 29
       
 24237 -c539 23 319 29
       
 24238 -c55c 15 320 29
       
 24239 -c571 c 321 29
       
 24240 -c57d 51 323 29
       
 24241 -c5ce 14 327 29
       
 24242 -c5e2 30 328 29
       
 24243 -c612 35 330 29
       
 24244 -c647 48 334 29
       
 24245 -c68f 17 338 29
       
 24246 -c6a6 43 339 29
       
 24247 -c6e9 14 342 29
       
 24248 -c6fd 1e 343 29
       
 24249 -c71b e 348 29
       
 24250 -c729 1e 349 29
       
 24251 -c747 e 350 29
       
 24252 -c755 1d 353 29
       
 24253 -c772 8 354 29
       
 24254 -c77a e 355 29
       
 24255 -c788 27 357 29
       
 24256 -c7af 6 358 29
       
 24257 -c7b5 4d 361 29
       
 24258 -c802 40 365 29
       
 24259 -c842 18 367 29
       
 24260 -c85a 4d 368 29
       
 24261 -c8a7 3e 379 29
       
 24262 -c8e5 30 381 29
       
 24263 -c915 12 384 29
       
 24264 -c927 13 385 29
       
 24265 -c93a 22 386 29
       
 24266 +c502 b 313 78
       
 24267 +c50d 24 315 78
       
 24268 +c531 8 318 78
       
 24269 +c539 23 319 78
       
 24270 +c55c 15 320 78
       
 24271 +c571 c 321 78
       
 24272 +c57d 51 323 78
       
 24273 +c5ce 14 327 78
       
 24274 +c5e2 30 328 78
       
 24275 +c612 35 330 78
       
 24276 +c647 48 334 78
       
 24277 +c68f 17 338 78
       
 24278 +c6a6 43 339 78
       
 24279 +c6e9 14 342 78
       
 24280 +c6fd 1e 343 78
       
 24281 +c71b e 348 78
       
 24282 +c729 1e 349 78
       
 24283 +c747 e 350 78
       
 24284 +c755 1d 353 78
       
 24285 +c772 8 354 78
       
 24286 +c77a e 355 78
       
 24287 +c788 27 357 78
       
 24288 +c7af 6 358 78
       
 24289 +c7b5 4d 361 78
       
 24290 +c802 40 365 78
       
 24291 +c842 18 367 78
       
 24292 +c85a 4d 368 78
       
 24293 +c8a7 3e 379 78
       
 24294 +c8e5 30 381 78
       
 24295 +c915 12 384 78
       
 24296 +c927 13 385 78
       
 24297 +c93a 22 386 78
       
 24298 +FUNC c95c 2e 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> >::insert(__gnu_cxx::__normal_iterator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >**, std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >*> > >, unsigned long, __gnu_cxx::_Hashtable_node<std::pair<std::string const, __gnu_cxx::hash_map<std::string, std::pair<char const*, unsigned long long>, __gnu_cxx::hash<std::string>, std::equal_to<std::string>, std::allocator<std::pair<char const*, unsigned long long> > >*> >* const&)
       
 24299  c95c c 657 29
       
 24300 -c968 22 658 29
       
 24301 -c98a c 578 29
       
 24302 -c996 15 580 29
       
 24303 -c9ab 15 581 29
       
 24304 -c9c0 37 582 29
       
 24305 -c9f7 c 583 29
       
 24306 -ca03 1 583 29
       
 24307 -ca04 d 335 29
       
 24308 -ca11 4e 337 29
       
 24309 -ca5f 4d 338 29
       
 24310 -caac d 134 29
       
 24311 -cab9 65 135 29
       
 24312 -cb1e 39 135 30
       
 24313 +c968 22 658 71
       
 24314 +c996 15 580 34
       
 24315 +c9ab 15 581 34
       
 24316 +c9c0 37 582 34
       
 24317 +c9f7 c 583 34
       
 24318 +ca03 1 583 34
       
 24319 +ca04 d 335 34
       
 24320 +ca11 4e 337 34
       
 24321 +ca5f 4d 338 34
       
 24322 +caac d 134 42
       
 24323 +cab9 65 135 42
       
 24324 +FUNC cb1e 44 0 dwarf2reader::CUFunctionInfoHandler::StartCompilationUnit(unsigned long long, unsigned char, unsigned char, unsigned long long, unsigned char)
       
 24325 +cb1e 39 135 42
       
 24326  cb57 5 102 30
       
 24327  cb5c 6 103 30
       
 24328 +FUNC cb62 41 0 dwarf2reader::CUFunctionInfoHandler::ProcessAttributeString(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, std::string const&)
       
 24329  cb62 18 136 30
       
 24330  cb7a 10 137 30
       
 24331  cb8a 17 138 30
       
 24332  cba1 2 139 30
       
 24333  cba3 1 139 30
       
 24334 +FUNC cba4 2a5 0 dwarf2reader::CUFunctionInfoHandler::ProcessAttributeUnsigned(unsigned long long, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm, unsigned long long)
       
 24335  cba4 2d 144 30
       
 24336  cbd1 a 145 30
       
 24337  cbdb 58 146 30
       
 24338  cc33 35 147 30
       
 24339  cc68 32 146 30
       
 24340  cc9a 2a 147 30
       
 24341  ccc4 82 152 30
       
 24342  cd46 18 153 30
       
 24343 @@ -2386,47 +2350,52 @@ cddf 12 157 30
       
 24344  cdf1 2 158 30
       
 24345  cdf3 12 160 30
       
 24346  ce05 2 161 30
       
 24347  ce07 c 163 30
       
 24348  ce13 2 164 30
       
 24349  ce15 2c 166 30
       
 24350  ce41 8 172 30
       
 24351  ce49 1 172 30
       
 24352 +FUNC ce4a 19c 0 dwarf2reader::CULineInfoHandler::AddLine(unsigned long long, unsigned int, unsigned int, unsigned int)
       
 24353  ce4a 20 84 30
       
 24354  ce6a 1c 85 30
       
 24355  ce86 9c 87 30
       
 24356  cf22 4f 89 30
       
 24357  cf71 19 87 30
       
 24358  cf8a 25 90 30
       
 24359  cfaf 30 93 30
       
 24360  cfdf 7 95 30
       
 24361 +FUNC cfe6 9f 0 dwarf2reader::CUFunctionInfoHandler::EndDIE(unsigned long long)
       
 24362  cfe6 19 174 30
       
 24363  cfff 1c 175 30
       
 24364  d01b 65 177 30
       
 24365  d080 5 178 30
       
 24366  d085 1 178 30
       
 24367 +FUNC d086 164 0 dwarf2reader::CUFunctionInfoHandler::StartDIE(unsigned long long, dwarf2reader::DwarfTag, std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > > const&)
       
 24368  d086 20 111 30
       
 24369  d0a6 1c 112 30
       
 24370  d0c2 c 126 30
       
 24371  d0ce 23 115 30
       
 24372  d0f1 26 116 30
       
 24373  d117 1a 117 30
       
 24374  d131 d 118 30
       
 24375  d13e 1b 119 30
       
 24376  d159 5f 120 30
       
 24377  d1b8 c 124 30
       
 24378  d1c4 1c 115 30
       
 24379  d1e0 3 126 30
       
 24380  d1e3 7 129 30
       
 24381 +FUNC d1ea 73 0 dwarf2reader::CULineInfoHandler::DefineDir(std::string const&, unsigned int)
       
 24382  d1ea 13 52 30
       
 24383  d1fd 45 54 30
       
 24384  d242 15 55 30
       
 24385  d257 6 56 30
       
 24386  d25d 1 56 30
       
 24387 +FUNC d25e 23b 0 dwarf2reader::CULineInfoHandler::DefineFile(std::string const&, int, unsigned int, unsigned long long, unsigned long long)
       
 24388  d25e 2c 60 30
       
 24389  d28a 45 62 30
       
 24390  d2cf 2f 65 30
       
 24391  d2fe 24 66 30
       
 24392  d322 b 68 30
       
 24393  d32d e 69 30
       
 24394  d33b 19 71 30
       
 24395  d354 17 72 30
       
 24396 @@ -2452,548 +2421,576 @@ d6ba 41 43 30
       
 24397  d6fb 41 44 30
       
 24398  d73c 67 45 30
       
 24399  d7a3 10 46 30
       
 24400  d7b3 13 45 30
       
 24401  d7c6 15 47 30
       
 24402  d7db e 48 30
       
 24403  d7e9 3d 49 30
       
 24404  d826 20 50 30
       
 24405 -d846 12 125 31
       
 24406 -d858 12 125 31
       
 24407 +d846 12 125 74
       
 24408 +d858 12 125 74
       
 24409  d86a 13 55 32
       
 24410  d87d 35 55 32
       
 24411  d8b2 13 98 32
       
 24412  d8c5 35 98 32
       
 24413  d8fa c 35 32
       
 24414  d906 d 35 32
       
 24415  d913 1 35 32
       
 24416  d914 d 22 32
       
 24417  d921 40 22 32
       
 24418  d961 1 22 32
       
 24419 -d962 c 89 33
       
 24420 -d96e 1e 90 33
       
 24421 -d98c c 207 34
       
 24422 +d962 c 89 70
       
 24423 +d96e 1e 90 70
       
 24424  d998 14 208 34
       
 24425 -d9ac c 190 35
       
 24426 -d9b8 a 190 35
       
 24427 -d9c2 c 259 35
       
 24428 -d9ce 21 259 35
       
 24429 -d9ef 1 259 35
       
 24430 +d9ac c 190 67
       
 24431 +d9b8 a 190 67
       
 24432 +d9c2 c 259 67
       
 24433 +d9ce 21 259 67
       
 24434 +d9ef 1 259 67
       
 24435 +FUNC d9f0 13 0 std::auto_ptr<dwarf2reader::LineInfo>::operator->() const
       
 24436  d9f0 c 283 35
       
 24437 -d9fc 7 286 35
       
 24438 -da03 1 286 35
       
 24439 -da04 d 103 36
       
 24440 -da11 5c 104 36
       
 24441 -da6d 1 104 36
       
 24442 +d9fc 7 286 67
       
 24443 +da03 1 286 67
       
 24444 +da11 5c 104 68
       
 24445 +da6d 1 104 68
       
 24446 +FUNC da6e 28 0 bool std::operator==<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)
       
 24447  da6e c 2139 37
       
 24448  da7a 1c 2140 37
       
 24449 +FUNC da96 5d 0 std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)
       
 24450  da96 d 2081 37
       
 24451  daa3 12 2083 37
       
 24452  dab5 1a 2084 37
       
 24453  dacf 24 2085 37
       
 24454  daf3 1 2085 37
       
 24455 +FUNC daf4 5d 0 std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
       
 24456  daf4 d 2044 37
       
 24457  db01 12 2046 37
       
 24458  db13 1a 2047 37
       
 24459  db2d 24 2048 37
       
 24460  db51 1 2048 37
       
 24461 -db52 c 84 37
       
 24462 -db5e 17 85 37
       
 24463 -db75 1 85 37
       
 24464 +db52 c 84 70
       
 24465 +db5e 17 85 70
       
 24466 +db75 1 85 70
       
 24467 +FUNC db76 2d 0 std::pair<char const*, unsigned int> std::make_pair<char const*, unsigned int>(char const*, unsigned int)
       
 24468  db76 c 144 37
       
 24469 -db82 21 145 37
       
 24470 -dba3 1 145 37
       
 24471 -dba4 c 84 37
       
 24472 -dbb0 23 85 37
       
 24473 -dbd3 1 85 37
       
 24474 +db82 21 145 70
       
 24475 +dba3 1 145 70
       
 24476 +dba4 c 84 70
       
 24477 +dbb0 23 85 70
       
 24478 +dbd3 1 85 70
       
 24479 +FUNC dbd4 3c 0 std::pair<unsigned long long, std::pair<char const*, unsigned int> > std::make_pair<unsigned long long, std::pair<char const*, unsigned int> >(unsigned long long, std::pair<char const*, unsigned int>)
       
 24480  dbd4 1c 144 37
       
 24481 -dbf0 20 145 37
       
 24482 -dc10 d 89 37
       
 24483 -dc1d 64 90 37
       
 24484 -dc81 1 90 37
       
 24485 -dc82 c 89 37
       
 24486 -dc8e 2a 90 37
       
 24487 -dcb8 c 84 37
       
 24488 -dcc4 1d 85 37
       
 24489 -dce1 1 85 37
       
 24490 +dbf0 20 145 70
       
 24491 +dc10 d 89 70
       
 24492 +dc1d 64 90 70
       
 24493 +dc81 1 90 70
       
 24494 +dc82 c 89 70
       
 24495 +dc8e 2a 90 70
       
 24496 +dcb8 c 84 70
       
 24497 +dcc4 1d 85 70
       
 24498 +dce1 1 85 70
       
 24499 +FUNC dce2 3c 0 std::pair<unsigned long long, dwarf2reader::FunctionInfo*> std::make_pair<unsigned long long, dwarf2reader::FunctionInfo*>(unsigned long long, dwarf2reader::FunctionInfo*)
       
 24500  dce2 1c 144 37
       
 24501 -dcfe 20 145 37
       
 24502 -dd1e c 189 37
       
 24503 -dd2a a 190 37
       
 24504 -dd34 c 193 37
       
 24505 -dd40 d 194 37
       
 24506 -dd4d 1 194 37
       
 24507 -dd4e c 603 38
       
 24508 -dd5a c 603 38
       
 24509 +dcfe 20 145 70
       
 24510 +dd2a a 190 34
       
 24511 +dd40 d 194 34
       
 24512 +dd4d 1 194 34
       
 24513 +dd4e c 603 72
       
 24514 +dd5a c 603 72
       
 24515 +FUNC dd66 2b 0 std::vector<std::string, std::allocator<std::string> >::begin() const
       
 24516  dd66 c 342 39
       
 24517 -dd72 1f 343 39
       
 24518 -dd91 1 343 39
       
 24519 +dd72 1f 343 71
       
 24520 +dd91 1 343 71
       
 24521 +FUNC dd92 2c 0 std::vector<std::string, std::allocator<std::string> >::end() const
       
 24522  dd92 c 360 39
       
 24523 -dd9e 20 361 39
       
 24524 -ddbe c 665 39
       
 24525 -ddca 5 666 39
       
 24526 -ddcf 1 666 39
       
 24527 -ddd0 d 758 39
       
 24528 -dddd 2b 759 39
       
 24529 +dd9e 20 361 71
       
 24530 +ddca 5 666 72
       
 24531 +ddcf 1 666 72
       
 24532 +dddd 2b 759 72
       
 24533 +FUNC de08 3c 0 std::vector<std::string, std::allocator<std::string> >::size() const
       
 24534  de08 c 402 39
       
 24535 -de14 30 403 39
       
 24536 +de14 30 403 71
       
 24537 +FUNC de44 2b 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::begin() const
       
 24538  de44 c 342 39
       
 24539 -de50 1f 343 39
       
 24540 -de6f 1 343 39
       
 24541 +de50 1f 343 71
       
 24542 +de6f 1 343 71
       
 24543 +FUNC de70 2c 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::end() const
       
 24544  de70 c 360 39
       
 24545 -de7c 20 361 39
       
 24546 -de9c d 758 39
       
 24547 -dea9 31 759 39
       
 24548 +de7c 20 361 71
       
 24549 +dea9 31 759 72
       
 24550 +FUNC deda 3c 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::size() const
       
 24551  deda c 402 39
       
 24552 -dee6 30 403 39
       
 24553 -df16 c 603 39
       
 24554 -df22 c 603 39
       
 24555 +dee6 30 403 71
       
 24556 +df16 c 603 72
       
 24557 +df22 c 603 72
       
 24558 +FUNC df2e 26 0 std::vector<std::string, std::allocator<std::string> >::end()
       
 24559  df2e c 351 39
       
 24560 -df3a 1a 352 39
       
 24561 -df54 c 613 39
       
 24562 -df60 7 614 39
       
 24563 -df67 1 614 39
       
 24564 +df3a 1a 352 71
       
 24565 +df60 7 614 72
       
 24566 +df67 1 614 72
       
 24567 +FUNC df68 13 0 std::vector<std::string, std::allocator<std::string> >::max_size() const
       
 24568  df68 c 407 39
       
 24569 -df74 7 408 39
       
 24570 -df7b 1 408 39
       
 24571 -df7c c 665 39
       
 24572 -df88 5 666 39
       
 24573 -df8d 1 666 39
       
 24574 -df8e c 621 39
       
 24575 -df9a d 623 39
       
 24576 -dfa7 5 624 39
       
 24577 +df74 7 408 71
       
 24578 +df7b 1 408 71
       
 24579 +df88 5 666 72
       
 24580 +df8d 1 666 72
       
 24581 +df9a d 623 72
       
 24582 +dfa7 5 624 72
       
 24583 +FUNC dfac 23 0 std::vector<std::string, std::allocator<std::string> >::begin()
       
 24584  dfac c 333 39
       
 24585 -dfb8 17 334 39
       
 24586 -dfcf 1 334 39
       
 24587 -dfd0 c 35 39
       
 24588 -dfdc 26 35 39
       
 24589 -e002 d 103 39
       
 24590 -e00f 5c 104 39
       
 24591 -e06b 1 104 39
       
 24592 -e06c c 613 39
       
 24593 -e078 7 614 39
       
 24594 -e07f 1 614 39
       
 24595 -FUNC e080 35 0 operator=
       
 24596 -e080 c 0 39
       
 24597 -e08c 29 35 39
       
 24598 -e0b5 1 35 39
       
 24599 +dfb8 17 334 71
       
 24600 +dfcf 1 334 71
       
 24601 +dfd0 c 35 32
       
 24602 +dfdc 26 35 32
       
 24603 +e00f 5c 104 68
       
 24604 +e06b 1 104 68
       
 24605 +e078 7 614 72
       
 24606 +e07f 1 614 72
       
 24607 +FUNC e080 35 0 dwarf2reader::SourceFileInfo::operator=(dwarf2reader::SourceFileInfo const&)
       
 24608 +e080 c 35 39
       
 24609 +e08c 29 35 32
       
 24610 +e0b5 1 35 32
       
 24611 +FUNC e0b6 13 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::max_size() const
       
 24612  e0b6 c 407 39
       
 24613 -e0c2 7 408 39
       
 24614 -e0c9 1 408 39
       
 24615 -e0ca c 621 39
       
 24616 -e0d6 d 623 39
       
 24617 -e0e3 5 624 39
       
 24618 +e0c2 7 408 71
       
 24619 +e0c9 1 408 71
       
 24620 +e0d6 d 623 72
       
 24621 +e0e3 5 624 72
       
 24622 +FUNC e0e8 3c 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::_M_range_check(unsigned long) const
       
 24623  e0e8 13 515 39
       
 24624 -e0fb 15 517 39
       
 24625 -e110 14 518 39
       
 24626 +e0fb 15 517 71
       
 24627 +e110 14 518 71
       
 24628 +FUNC e124 3c 0 std::vector<std::string, std::allocator<std::string> >::_M_range_check(unsigned long) const
       
 24629  e124 13 515 39
       
 24630 -e137 15 517 39
       
 24631 -e14c 14 518 39
       
 24632 -e160 c 653 39
       
 24633 -e16c 2a 654 39
       
 24634 +e137 15 517 71
       
 24635 +e14c 14 518 71
       
 24636 +e16c 2a 654 72
       
 24637 +FUNC e196 42 0 std::vector<std::string, std::allocator<std::string> >::operator[](unsigned long)
       
 24638  e196 c 494 39
       
 24639 -e1a2 36 495 39
       
 24640 +e1a2 36 495 71
       
 24641 +FUNC e1d8 32 0 std::vector<std::string, std::allocator<std::string> >::at(unsigned long)
       
 24642  e1d8 c 534 39
       
 24643 -e1e4 12 536 39
       
 24644 -e1f6 14 537 39
       
 24645 -e20a c 653 39
       
 24646 -e216 32 654 39
       
 24647 +e1e4 12 536 71
       
 24648 +e1f6 14 537 71
       
 24649 +e216 32 654 72
       
 24650 +FUNC e248 42 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::operator[](unsigned long)
       
 24651  e248 c 494 39
       
 24652 -e254 36 495 39
       
 24653 +e254 36 495 71
       
 24654 +FUNC e28a 32 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::at(unsigned long)
       
 24655  e28a c 534 39
       
 24656 -e296 12 536 39
       
 24657 -e2a8 14 537 39
       
 24658 +e296 12 536 71
       
 24659 +e2a8 14 537 71
       
 24660 +FUNC e2bc 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_end()
       
 24661  e2bc c 472 40
       
 24662  e2c8 8 473 40
       
 24663 +FUNC e2d0 11 0 std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator()(std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&) const
       
 24664  e2d0 c 550 41
       
 24665  e2dc 5 551 41
       
 24666  e2e1 1 551 41
       
 24667 +FUNC e2e2 53 0 std::less<unsigned long long>::operator()(unsigned long long const&, unsigned long long const&) const
       
 24668  e2e2 c 226 41
       
 24669  e2ee 47 227 41
       
 24670  e335 1 227 41
       
 24671 +FUNC e336 20 0 std::_Rb_tree_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator==(std::_Rb_tree_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > const&) const
       
 24672  e336 c 209 41
       
 24673 -e342 14 210 41
       
 24674 -e356 c 84 41
       
 24675 -e362 18 85 41
       
 24676 +e342 14 210 40
       
 24677 +e356 c 84 70
       
 24678 +e362 18 85 70
       
 24679 +FUNC e37a 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_end()
       
 24680  e37a c 472 41
       
 24681 -e386 8 473 41
       
 24682 +e386 8 473 40
       
 24683 +FUNC e38e 11 0 std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator()(std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&) const
       
 24684  e38e c 550 41
       
 24685  e39a 5 551 41
       
 24686  e39f 1 551 41
       
 24687 +FUNC e3a0 20 0 std::_Rb_tree_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator==(std::_Rb_tree_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > const&) const
       
 24688  e3a0 c 209 41
       
 24689 -e3ac 14 210 41
       
 24690 -e3c0 c 84 41
       
 24691 -e3cc 18 85 41
       
 24692 -e3e4 c 180 41
       
 24693 -e3f0 13 181 41
       
 24694 -e403 1 181 41
       
 24695 -e404 c 408 41
       
 24696 -e410 22 409 41
       
 24697 -e432 c 206 42
       
 24698 +e3ac 14 210 40
       
 24699 +e3c0 c 84 70
       
 24700 +e3cc 18 85 70
       
 24701 +e3e4 c 180 34
       
 24702 +e3f0 13 181 34
       
 24703 +e403 1 181 34
       
 24704 +e410 22 409 34
       
 24705  e43e d 207 42
       
 24706  e44b 1 207 42
       
 24707 +FUNC e44c 35 0 bool __gnu_cxx::operator!=<std::string*, std::vector<std::string, std::allocator<std::string> > >(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > const&, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > const&)
       
 24708  e44c d 699 42
       
 24709 -e459 28 700 42
       
 24710 -e481 1 700 42
       
 24711 +e459 28 700 72
       
 24712 +e481 1 700 72
       
 24713 +FUNC e482 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::allocator<std::string> >(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::allocator<std::string>)
       
 24714  e482 c 171 43
       
 24715 -e48e 2 173 43
       
 24716 -e490 1a 174 43
       
 24717 -e4aa 21 173 43
       
 24718 -e4cb 2 174 43
       
 24719 -e4cd 1 174 43
       
 24720 +e48e 2 173 73
       
 24721 +e490 1a 174 73
       
 24722 +e4aa 21 173 73
       
 24723 +e4cb 2 174 73
       
 24724 +e4cd 1 174 73
       
 24725 +FUNC e4ce 35 0 bool __gnu_cxx::operator!=<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > const&, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > const&)
       
 24726  e4ce d 699 43
       
 24727 -e4db 28 700 43
       
 24728 -e503 1 700 43
       
 24729 +e4db 28 700 72
       
 24730 +e503 1 700 72
       
 24731 +FUNC e504 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, std::allocator<dwarf2reader::SourceFileInfo> >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, std::allocator<dwarf2reader::SourceFileInfo>)
       
 24732  e504 c 171 43
       
 24733 -e510 2 173 43
       
 24734 -e512 1a 174 43
       
 24735 -e52c 21 173 43
       
 24736 -e54d 2 174 43
       
 24737 -e54f 1 174 43
       
 24738 +e510 2 173 73
       
 24739 +e512 1a 174 73
       
 24740 +e52c 21 173 73
       
 24741 +e54d 2 174 73
       
 24742 +e54f 1 174 73
       
 24743 +FUNC e550 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_value(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > const*)
       
 24744  e550 c 480 43
       
 24745 -e55c 8 481 43
       
 24746 +e55c 8 481 40
       
 24747 +FUNC e564 28 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_key(std::_Rb_tree_node<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > const*)
       
 24748  e564 c 484 43
       
 24749 -e570 1c 485 43
       
 24750 +e570 1c 485 40
       
 24751 +FUNC e58c 25 0 std::_Rb_tree_iterator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >::operator--()
       
 24752  e58c c 194 43
       
 24753 -e598 14 196 43
       
 24754 -e5ac 5 197 43
       
 24755 -e5b1 1 197 43
       
 24756 +e598 14 196 40
       
 24757 +e5ac 5 197 40
       
 24758 +e5b1 1 197 40
       
 24759 +FUNC e5b2 25 0 std::_Rb_tree_iterator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >::operator--()
       
 24760  e5b2 c 194 43
       
 24761 -e5be 14 196 43
       
 24762 -e5d2 5 197 43
       
 24763 -e5d7 1 197 43
       
 24764 +e5be 14 196 40
       
 24765 +e5d2 5 197 40
       
 24766 +e5d7 1 197 40
       
 24767 +FUNC e5d8 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_value(std::_Rb_tree_node_base const*)
       
 24768  e5d8 c 504 43
       
 24769 -e5e4 8 505 43
       
 24770 +e5e4 8 505 40
       
 24771 +FUNC e5ec 28 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_S_key(std::_Rb_tree_node_base const*)
       
 24772  e5ec c 508 43
       
 24773 -e5f8 1c 509 43
       
 24774 +e5f8 1c 509 40
       
 24775 +FUNC e614 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_value(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > const*)
       
 24776  e614 c 480 43
       
 24777 -e620 8 481 43
       
 24778 +e620 8 481 40
       
 24779 +FUNC e628 28 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_key(std::_Rb_tree_node<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > const*)
       
 24780  e628 c 484 43
       
 24781 -e634 1c 485 43
       
 24782 +e634 1c 485 40
       
 24783 +FUNC e650 14 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_value(std::_Rb_tree_node_base const*)
       
 24784  e650 c 504 43
       
 24785 -e65c 8 505 43
       
 24786 +e65c 8 505 40
       
 24787 +FUNC e664 28 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_S_key(std::_Rb_tree_node_base const*)
       
 24788  e664 c 508 43
       
 24789 -e670 1c 509 43
       
 24790 -e68c c 613 43
       
 24791 -e698 7 614 43
       
 24792 -e69f 1 614 43
       
 24793 -e6a0 c 97 43
       
 24794 -e6ac 7 98 43
       
 24795 -e6b3 1 98 43
       
 24796 -e6b4 c 83 43
       
 24797 -e6c0 1d 85 43
       
 24798 -e6dd 5 86 43
       
 24799 -e6e2 10 88 43
       
 24800 +e670 1c 509 40
       
 24801 +e698 7 614 72
       
 24802 +e69f 1 614 72
       
 24803 +e6ac 7 98 68
       
 24804 +e6b3 1 98 68
       
 24805 +e6c0 1d 85 68
       
 24806 +e6dd 5 86 68
       
 24807 +e6e2 10 88 68
       
 24808 +FUNC e6f2 2a 0 std::_Vector_base<std::string, std::allocator<std::string> >::_M_allocate(unsigned long)
       
 24809  e6f2 c 116 43
       
 24810 -e6fe 1e 117 43
       
 24811 -e71c c 97 43
       
 24812 -e728 7 98 43
       
 24813 -e72f 1 98 43
       
 24814 -e730 c 83 43
       
 24815 -e73c 1d 85 43
       
 24816 -e759 5 86 43
       
 24817 -e75e 16 88 43
       
 24818 +e6fe 1e 117 71
       
 24819 +e728 7 98 68
       
 24820 +e72f 1 98 68
       
 24821 +e73c 1d 85 68
       
 24822 +e759 5 86 68
       
 24823 +e75e 16 88 68
       
 24824 +FUNC e774 2a 0 std::_Vector_base<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::_M_allocate(unsigned long)
       
 24825  e774 c 116 43
       
 24826 -e780 1e 117 43
       
 24827 -e79e c 103 43
       
 24828 -e7aa 3a 104 43
       
 24829 -e7e4 c 653 43
       
 24830 -e7f0 2a 654 43
       
 24831 +e780 1e 117 71
       
 24832 +e7aa 3a 104 68
       
 24833 +e7f0 2a 654 72
       
 24834 +FUNC e81a 42 0 std::vector<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*, std::allocator<__gnu_cxx::_Hashtable_node<std::pair<std::string const, std::pair<char const*, unsigned long long> > >*> >::operator[](unsigned long) const
       
 24835  e81a c 509 43
       
 24836 -e826 36 510 43
       
 24837 -FUNC e85c 4e 0 copy_b<std::string*, std::string*>
       
 24838 -e85c c 408 44
       
 24839 -e868 14 411 44
       
 24840 -e87c 1e 412 44
       
 24841 -e89a b 411 44
       
 24842 -e8a5 5 413 44
       
 24843 +e826 36 510 71
       
 24844 +FUNC e85c 4e 0 std::string* std::__copy_backward<false, std::random_access_iterator_tag>::copy_b<std::string*, std::string*>(std::string*, std::string*, std::string*)
       
 24845 +e85c c 408 61
       
 24846 +e868 14 411 61
       
 24847 +e87c 1e 412 61
       
 24848 +e89a b 411 61
       
 24849 +e8a5 5 413 61
       
 24850 +FUNC e8aa 2b 0 std::string* std::__copy_backward_aux<std::string*, std::string*>(std::string*, std::string*, std::string*)
       
 24851  e8aa c 432 44
       
 24852 -e8b6 4 440 44
       
 24853 -e8ba 1b 443 44
       
 24854 -e8d5 1 443 44
       
 24855 -FUNC e8d6 64 0 copy_b_n<__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > >
       
 24856 -e8d6 e 480 44
       
 24857 -e8e4 56 482 44
       
 24858 -e93a c 504 44
       
 24859 -e946 4 514 44
       
 24860 -e94a 4 515 44
       
 24861 -e94e 1b 517 44
       
 24862 -e969 1 517 44
       
 24863 +e8b6 4 440 61
       
 24864 +e8ba 1b 443 61
       
 24865 +e8d5 1 443 61
       
 24866 +e8e4 56 482 61
       
 24867 +e946 4 514 61
       
 24868 +e94a 4 515 61
       
 24869 +e94e 1b 517 61
       
 24870 +e969 1 517 61
       
 24871 +FUNC e96a 69 0 void std::_Construct<std::string, std::string>(std::string*, std::string const&)
       
 24872  e96a d 77 44
       
 24873 -e977 5c 81 44
       
 24874 -e9d3 1 81 44
       
 24875 -FUNC e9d4 54 0 copy_b<dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*>
       
 24876 -e9d4 c 408 44
       
 24877 -e9e0 1a 411 44
       
 24878 -e9fa 1e 412 44
       
 24879 -ea18 b 411 44
       
 24880 -ea23 5 413 44
       
 24881 +e977 5c 81 73
       
 24882 +e9d3 1 81 73
       
 24883 +FUNC e9d4 54 0 dwarf2reader::SourceFileInfo* std::__copy_backward<false, std::random_access_iterator_tag>::copy_b<dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*>(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*)
       
 24884 +e9d4 c 408 61
       
 24885 +e9e0 1a 411 61
       
 24886 +e9fa 1e 412 61
       
 24887 +ea18 b 411 61
       
 24888 +ea23 5 413 61
       
 24889 +FUNC ea28 2b 0 dwarf2reader::SourceFileInfo* std::__copy_backward_aux<dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*>(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo*)
       
 24890  ea28 c 432 44
       
 24891 -ea34 4 440 44
       
 24892 -ea38 1b 443 44
       
 24893 -ea53 1 443 44
       
 24894 -FUNC ea54 64 0 copy_b_n<__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > >
       
 24895 -ea54 e 480 44
       
 24896 -ea62 56 482 44
       
 24897 -eab8 c 504 44
       
 24898 -eac4 4 514 44
       
 24899 -eac8 4 515 44
       
 24900 -eacc 1b 517 44
       
 24901 -eae7 1 517 44
       
 24902 +ea34 4 440 61
       
 24903 +ea38 1b 443 61
       
 24904 +ea53 1 443 61
       
 24905 +ea62 56 482 61
       
 24906 +eac4 4 514 61
       
 24907 +eac8 4 515 61
       
 24908 +eacc 1b 517 61
       
 24909 +eae7 1 517 61
       
 24910 +FUNC eae8 69 0 void std::_Construct<dwarf2reader::SourceFileInfo, dwarf2reader::SourceFileInfo>(dwarf2reader::SourceFileInfo*, dwarf2reader::SourceFileInfo const&)
       
 24911  eae8 d 77 44
       
 24912 -eaf5 5c 81 44
       
 24913 -eb51 1 81 44
       
 24914 -eb52 c 69 44
       
 24915 -eb5e 20 69 44
       
 24916 -eb7e c 69 44
       
 24917 -eb8a 2a 69 44
       
 24918 -ebb4 d 103 44
       
 24919 -ebc1 5c 104 44
       
 24920 -ec1d 1 104 44
       
 24921 -ec1e c 521 44
       
 24922 -ec2a 15 523 44
       
 24923 -ec3f 79 525 44
       
 24924 -ecb8 21 529 44
       
 24925 -ecd9 1 529 44
       
 24926 -ecda c 228 44
       
 24927 -ece6 14 229 44
       
 24928 -ecfa c 97 44
       
 24929 -ed06 7 98 44
       
 24930 -ed0d 1 98 44
       
 24931 -ed0e c 83 44
       
 24932 -ed1a 1d 85 44
       
 24933 -ed37 5 86 44
       
 24934 -ed3c 10 88 44
       
 24935 +eaf5 5c 81 73
       
 24936 +eb51 1 81 73
       
 24937 +eb52 c 69 70
       
 24938 +eb5e 20 69 70
       
 24939 +eb7e c 69 70
       
 24940 +eb8a 2a 69 70
       
 24941 +ebc1 5c 104 68
       
 24942 +ec1d 1 104 68
       
 24943 +ec2a 15 523 34
       
 24944 +ec3f 79 525 34
       
 24945 +ecb8 21 529 34
       
 24946 +ecd9 1 529 34
       
 24947 +ece6 14 229 42
       
 24948 +ed06 7 98 68
       
 24949 +ed0d 1 98 68
       
 24950 +ed1a 1d 85 68
       
 24951 +ed37 5 86 68
       
 24952 +ed3c 10 88 68
       
 24953 +FUNC ed4c 29 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_get_node()
       
 24954  ed4c c 355 44
       
 24955 -ed58 1d 356 44
       
 24956 -ed75 1 356 44
       
 24957 +ed58 1d 356 40
       
 24958 +ed75 1 356 40
       
 24959 +FUNC ed76 b6 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_create_node(std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&)
       
 24960  ed76 d 363 44
       
 24961 -ed83 e 365 44
       
 24962 -ed91 3c 367 44
       
 24963 -edcd b 373 44
       
 24964 -edd8 11 367 44
       
 24965 -ede9 b 368 44
       
 24966 -edf4 12 370 44
       
 24967 -ee06 b 371 44
       
 24968 -ee11 13 368 44
       
 24969 -ee24 8 373 44
       
 24970 +ed83 e 365 40
       
 24971 +ed91 3c 367 40
       
 24972 +edcd b 373 40
       
 24973 +edd8 11 367 40
       
 24974 +ede9 b 368 40
       
 24975 +edf4 12 370 40
       
 24976 +ee06 b 371 40
       
 24977 +ee11 13 368 40
       
 24978 +ee24 8 373 40
       
 24979 +FUNC ee2c cd 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&)
       
 24980  ee2c d 787 44
       
 24981 -ee39 15 789 44
       
 24982 -ee4e 5d 792 44
       
 24983 -eeab 24 796 44
       
 24984 -eecf f 798 44
       
 24985 -eede 1b 799 44
       
 24986 -eef9 1 799 44
       
 24987 +ee39 15 789 40
       
 24988 +ee4e 5d 792 40
       
 24989 +eeab 24 796 40
       
 24990 +eecf f 798 40
       
 24991 +eede 1b 799 40
       
 24992 +eef9 1 799 40
       
 24993 +FUNC eefa 1ef 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, std::pair<std::string, unsigned int> >, std::_Select1st<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::insert_unique(std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&)
       
 24994  eefa d 869 44
       
 24995 -ef07 e 871 44
       
 24996 -ef15 e 872 44
       
 24997 -ef23 4 873 44
       
 24998 -ef27 2 874 44
       
 24999 -ef29 6 876 44
       
 25000 -ef2f 35 877 44
       
 25001 -ef64 2a 878 44
       
 25002 -ef8e 6 874 44
       
 25003 -ef94 12 880 44
       
 25004 -efa6 a 881 44
       
 25005 -efb0 24 882 44
       
 25006 -efd4 51 883 44
       
 25007 -f025 b 885 44
       
 25008 -f030 36 886 44
       
 25009 -f066 4e 887 44
       
 25010 -f0b4 35 888 44
       
 25011 -f0e9 1 888 44
       
 25012 +ef07 e 871 40
       
 25013 +ef15 e 872 40
       
 25014 +ef23 4 873 40
       
 25015 +ef27 2 874 40
       
 25016 +ef29 6 876 40
       
 25017 +ef2f 35 877 40
       
 25018 +ef64 2a 878 40
       
 25019 +ef8e 6 874 40
       
 25020 +ef94 12 880 40
       
 25021 +efa6 a 881 40
       
 25022 +efb0 24 882 40
       
 25023 +efd4 51 883 40
       
 25024 +f025 b 885 40
       
 25025 +f030 36 886 40
       
 25026 +f066 4e 887 40
       
 25027 +f0b4 35 888 40
       
 25028 +f0e9 1 888 40
       
 25029 +FUNC f0ea 20 0 std::map<unsigned long long, std::pair<std::string, unsigned int>, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, std::pair<std::string, unsigned int> > > >::insert(std::pair<unsigned long long const, std::pair<std::string, unsigned int> > const&)
       
 25030  f0ea c 359 45
       
 25031  f0f6 14 360 45
       
 25032 -f10a c 97 45
       
 25033 -f116 7 98 45
       
 25034 -f11d 1 98 45
       
 25035 -f11e c 83 45
       
 25036 -f12a 1d 85 45
       
 25037 -f147 5 86 45
       
 25038 -f14c 1d 88 45
       
 25039 -f169 1 88 45
       
 25040 +f116 7 98 68
       
 25041 +f11d 1 98 68
       
 25042 +f12a 1d 85 68
       
 25043 +f147 5 86 68
       
 25044 +f14c 1d 88 68
       
 25045 +f169 1 88 68
       
 25046 +FUNC f16a 29 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_get_node()
       
 25047  f16a c 355 45
       
 25048 -f176 1d 356 45
       
 25049 -f193 1 356 45
       
 25050 +f176 1d 356 40
       
 25051 +f193 1 356 40
       
 25052 +FUNC f194 5f 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_create_node(std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&)
       
 25053  f194 d 363 45
       
 25054 -f1a1 e 365 45
       
 25055 -f1af 3c 367 45
       
 25056 -f1eb 8 373 45
       
 25057 -f1f3 1 373 45
       
 25058 +f1a1 e 365 40
       
 25059 +f1af 3c 367 40
       
 25060 +f1eb 8 373 40
       
 25061 +f1f3 1 373 40
       
 25062 +FUNC f1f4 cd 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::_M_insert(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&)
       
 25063  f1f4 d 787 45
       
 25064 -f201 15 789 45
       
 25065 -f216 5d 792 45
       
 25066 -f273 24 796 45
       
 25067 -f297 f 798 45
       
 25068 -f2a6 1b 799 45
       
 25069 -f2c1 1 799 45
       
 25070 +f201 15 789 40
       
 25071 +f216 5d 792 40
       
 25072 +f273 24 796 40
       
 25073 +f297 f 798 40
       
 25074 +f2a6 1b 799 40
       
 25075 +f2c1 1 799 40
       
 25076 +FUNC f2c2 1ef 0 std::_Rb_tree<unsigned long long, std::pair<unsigned long long const, dwarf2reader::FunctionInfo*>, std::_Select1st<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> >, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::insert_unique(std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&)
       
 25077  f2c2 d 869 45
       
 25078 -f2cf e 871 45
       
 25079 -f2dd e 872 45
       
 25080 -f2eb 4 873 45
       
 25081 -f2ef 2 874 45
       
 25082 -f2f1 6 876 45
       
 25083 -f2f7 35 877 45
       
 25084 -f32c 2a 878 45
       
 25085 -f356 6 874 45
       
 25086 -f35c 12 880 45
       
 25087 -f36e a 881 45
       
 25088 -f378 24 882 45
       
 25089 -f39c 51 883 45
       
 25090 -f3ed b 885 45
       
 25091 -f3f8 36 886 45
       
 25092 -f42e 4e 887 45
       
 25093 -f47c 35 888 45
       
 25094 -f4b1 1 888 45
       
 25095 +f2cf e 871 40
       
 25096 +f2dd e 872 40
       
 25097 +f2eb 4 873 40
       
 25098 +f2ef 2 874 40
       
 25099 +f2f1 6 876 40
       
 25100 +f2f7 35 877 40
       
 25101 +f32c 2a 878 40
       
 25102 +f356 6 874 40
       
 25103 +f35c 12 880 40
       
 25104 +f36e a 881 40
       
 25105 +f378 24 882 40
       
 25106 +f39c 51 883 40
       
 25107 +f3ed b 885 40
       
 25108 +f3f8 36 886 40
       
 25109 +f42e 4e 887 40
       
 25110 +f47c 35 888 40
       
 25111 +f4b1 1 888 40
       
 25112 +FUNC f4b2 20 0 std::map<unsigned long long, dwarf2reader::FunctionInfo*, std::less<unsigned long long>, std::allocator<std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> > >::insert(std::pair<unsigned long long const, dwarf2reader::FunctionInfo*> const&)
       
 25113  f4b2 c 359 45
       
 25114  f4be 14 360 45
       
 25115 +FUNC f4d2 19 0 void std::_Destroy<std::string>(std::string*)
       
 25116  f4d2 c 106 45
       
 25117 -f4de d 107 45
       
 25118 -f4eb 1 107 45
       
 25119 +f4de d 107 73
       
 25120 +f4eb 1 107 73
       
 25121 +FUNC f4ec 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > >(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __false_type)
       
 25122  f4ec c 119 45
       
 25123 -f4f8 2 121 45
       
 25124 -f4fa 13 122 45
       
 25125 -f50d 21 121 45
       
 25126 -f52e 2 122 45
       
 25127 +f4f8 2 121 73
       
 25128 +f4fa 13 122 73
       
 25129 +f50d 21 121 73
       
 25130 +f52e 2 122 73
       
 25131 +FUNC f530 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > > >(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, __gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >)
       
 25132  f530 c 148 45
       
 25133 -f53c 1c 155 45
       
 25134 -f558 d 80 46
       
 25135 -f565 6 82 46
       
 25136 -f56b 2 85 46
       
 25137 -f56d 24 86 46
       
 25138 -f591 2c 85 46
       
 25139 -f5bd b 87 46
       
 25140 -f5c8 b 89 46
       
 25141 -f5d3 12 91 46
       
 25142 -f5e5 b 92 46
       
 25143 -f5f0 13 89 46
       
 25144 -f603 9 92 46
       
 25145 -f60c c 108 46
       
 25146 -f618 23 113 46
       
 25147 -f63b 1 113 46
       
 25148 -f63c c 252 46
       
 25149 -f648 1b 254 46
       
 25150 -f663 1 254 46
       
 25151 +f53c 1c 155 73
       
 25152 +f565 6 82 79
       
 25153 +f56b 2 85 79
       
 25154 +f56d 24 86 79
       
 25155 +f591 2c 85 79
       
 25156 +f5bd b 87 79
       
 25157 +f5c8 b 89 79
       
 25158 +f5d3 12 91 79
       
 25159 +f5e5 b 92 79
       
 25160 +f5f0 13 89 79
       
 25161 +f603 9 92 79
       
 25162 +f618 23 113 79
       
 25163 +f63b 1 113 79
       
 25164 +f648 1b 254 79
       
 25165 +f663 1 254 79
       
 25166 +FUNC f664 430 0 std::vector<std::string, std::allocator<std::string> >::_M_insert_aux(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::string const&)
       
 25167  f664 14 249 47
       
 25168 -f678 14 251 47
       
 25169 -f68c 22 253 47
       
 25170 -f6ae f 255 47
       
 25171 -f6bd 12 256 47
       
 25172 -f6cf 55 257 47
       
 25173 -f724 4b 260 47
       
 25174 -f76f e 264 47
       
 25175 -f77d 15 265 47
       
 25176 -f792 e 266 47
       
 25177 -f7a0 1d 271 47
       
 25178 -f7bd 8 272 47
       
 25179 -f7c5 e 273 47
       
 25180 -f7d3 27 275 47
       
 25181 -f7fa 6 276 47
       
 25182 -f800 55 279 47
       
 25183 -f855 25 284 47
       
 25184 -f87a b 285 47
       
 25185 -f885 4f 286 47
       
 25186 -f8d4 3 284 47
       
 25187 -f8d7 13 279 47
       
 25188 -f8ea e 286 47
       
 25189 -f8f8 4d 298 47
       
 25190 -f945 30 299 47
       
 25191 -f975 12 302 47
       
 25192 -f987 13 303 47
       
 25193 -f99a 23 304 47
       
 25194 -f9bd 3 298 47
       
 25195 -f9c0 13 286 47
       
 25196 -f9d3 b 292 47
       
 25197 -f9de 39 294 47
       
 25198 -fa17 23 295 47
       
 25199 -fa3a 8 296 47
       
 25200 -fa42 16 294 47
       
 25201 -fa58 3 296 47
       
 25202 -fa5b 19 292 47
       
 25203 -fa74 19 298 47
       
 25204 -fa8d 7 304 47
       
 25205 +f678 14 251 78
       
 25206 +f68c 22 253 78
       
 25207 +f6ae f 255 78
       
 25208 +f6bd 12 256 78
       
 25209 +f6cf 55 257 78
       
 25210 +f724 4b 260 78
       
 25211 +f76f e 264 78
       
 25212 +f77d 15 265 78
       
 25213 +f792 e 266 78
       
 25214 +f7a0 1d 271 78
       
 25215 +f7bd 8 272 78
       
 25216 +f7c5 e 273 78
       
 25217 +f7d3 27 275 78
       
 25218 +f7fa 6 276 78
       
 25219 +f800 55 279 78
       
 25220 +f855 25 284 78
       
 25221 +f87a b 285 78
       
 25222 +f885 4f 286 78
       
 25223 +f8d4 3 284 78
       
 25224 +f8d7 13 279 78
       
 25225 +f8ea e 286 78
       
 25226 +f8f8 4d 298 78
       
 25227 +f945 30 299 78
       
 25228 +f975 12 302 78
       
 25229 +f987 13 303 78
       
 25230 +f99a 23 304 78
       
 25231 +f9bd 3 298 78
       
 25232 +f9c0 13 286 78
       
 25233 +f9d3 b 292 78
       
 25234 +f9de 39 294 78
       
 25235 +fa17 23 295 78
       
 25236 +fa3a 8 296 78
       
 25237 +fa42 16 294 78
       
 25238 +fa58 3 296 78
       
 25239 +fa5b 19 292 78
       
 25240 +fa74 19 298 78
       
 25241 +fa8d 7 304 78
       
 25242 +FUNC fa94 70 0 std::vector<std::string, std::allocator<std::string> >::push_back(std::string const&)
       
 25243  fa94 c 602 47
       
 25244 -faa0 10 604 47
       
 25245 -fab0 1e 606 47
       
 25246 -face 11 607 47
       
 25247 -fadf 25 610 47
       
 25248 +faa0 10 604 71
       
 25249 +fab0 1e 606 71
       
 25250 +face 11 607 71
       
 25251 +fadf 25 610 71
       
 25252 +FUNC fb04 19 0 void std::_Destroy<dwarf2reader::SourceFileInfo>(dwarf2reader::SourceFileInfo*)
       
 25253  fb04 c 106 47
       
 25254 -fb10 d 107 47
       
 25255 -fb1d 1 107 47
       
 25256 +fb10 d 107 73
       
 25257 +fb1d 1 107 73
       
 25258 +FUNC fb1e 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __false_type)
       
 25259  fb1e c 119 47
       
 25260 -fb2a 2 121 47
       
 25261 -fb2c 13 122 47
       
 25262 -fb3f 21 121 47
       
 25263 -fb60 2 122 47
       
 25264 +fb2a 2 121 73
       
 25265 +fb2c 13 122 73
       
 25266 +fb3f 21 121 73
       
 25267 +fb60 2 122 73
       
 25268 +FUNC fb62 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > > >(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, __gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >)
       
 25269  fb62 c 148 47
       
 25270 -fb6e 1c 155 47
       
 25271 -fb8a d 80 47
       
 25272 -fb97 6 82 47
       
 25273 -fb9d 2 85 47
       
 25274 -fb9f 24 86 47
       
 25275 -fbc3 2c 85 47
       
 25276 -fbef b 87 47
       
 25277 -fbfa b 89 47
       
 25278 -fc05 12 91 47
       
 25279 -fc17 b 92 47
       
 25280 -fc22 13 89 47
       
 25281 -fc35 9 92 47
       
 25282 -fc3e c 108 47
       
 25283 -fc4a 23 113 47
       
 25284 -fc6d 1 113 47
       
 25285 -fc6e c 252 47
       
 25286 -fc7a 1b 254 47
       
 25287 -fc95 1 254 47
       
 25288 +fb6e 1c 155 73
       
 25289 +fb97 6 82 79
       
 25290 +fb9d 2 85 79
       
 25291 +fb9f 24 86 79
       
 25292 +fbc3 2c 85 79
       
 25293 +fbef b 87 79
       
 25294 +fbfa b 89 79
       
 25295 +fc05 12 91 79
       
 25296 +fc17 b 92 79
       
 25297 +fc22 13 89 79
       
 25298 +fc35 9 92 79
       
 25299 +fc4a 23 113 79
       
 25300 +fc6d 1 113 79
       
 25301 +fc7a 1b 254 79
       
 25302 +fc95 1 254 79
       
 25303 +FUNC fc96 43d 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::_M_insert_aux(__gnu_cxx::__normal_iterator<dwarf2reader::SourceFileInfo*, std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> > >, dwarf2reader::SourceFileInfo const&)
       
 25304  fc96 14 249 47
       
 25305 -fcaa 14 251 47
       
 25306 -fcbe 22 253 47
       
 25307 -fce0 f 255 47
       
 25308 -fcef 12 256 47
       
 25309 -fd01 55 257 47
       
 25310 -fd56 4b 260 47
       
 25311 -fda1 e 264 47
       
 25312 -fdaf 15 265 47
       
 25313 -fdc4 e 266 47
       
 25314 -fdd2 1d 271 47
       
 25315 -fdef 8 272 47
       
 25316 -fdf7 e 273 47
       
 25317 -fe05 27 275 47
       
 25318 -fe2c 6 276 47
       
 25319 -fe32 55 279 47
       
 25320 -fe87 25 284 47
       
 25321 -feac b 285 47
       
 25322 -feb7 4f 286 47
       
 25323 -ff06 3 284 47
       
 25324 -ff09 13 279 47
       
 25325 -ff1c e 286 47
       
 25326 -ff2a 4d 298 47
       
 25327 -ff77 36 299 47
       
 25328 -ffad 12 302 47
       
 25329 -ffbf 13 303 47
       
 25330 -ffd2 2a 304 47
       
 25331 -fffc 3 298 47
       
 25332 -ffff 13 286 47
       
 25333 -10012 b 292 47
       
 25334 -1001d 39 294 47
       
 25335 -10056 23 295 47
       
 25336 -10079 8 296 47
       
 25337 -10081 16 294 47
       
 25338 -10097 3 296 47
       
 25339 -1009a 19 292 47
       
 25340 -100b3 19 298 47
       
 25341 -100cc 7 304 47
       
 25342 -100d3 1 304 47
       
 25343 +fcaa 14 251 78
       
 25344 +fcbe 22 253 78
       
 25345 +fce0 f 255 78
       
 25346 +fcef 12 256 78
       
 25347 +fd01 55 257 78
       
 25348 +fd56 4b 260 78
       
 25349 +fda1 e 264 78
       
 25350 +fdaf 15 265 78
       
 25351 +fdc4 e 266 78
       
 25352 +fdd2 1d 271 78
       
 25353 +fdef 8 272 78
       
 25354 +fdf7 e 273 78
       
 25355 +fe05 27 275 78
       
 25356 +fe2c 6 276 78
       
 25357 +fe32 55 279 78
       
 25358 +fe87 25 284 78
       
 25359 +feac b 285 78
       
 25360 +feb7 4f 286 78
       
 25361 +ff06 3 284 78
       
 25362 +ff09 13 279 78
       
 25363 +ff1c e 286 78
       
 25364 +ff2a 4d 298 78
       
 25365 +ff77 36 299 78
       
 25366 +ffad 12 302 78
       
 25367 +ffbf 13 303 78
       
 25368 +ffd2 2a 304 78
       
 25369 +fffc 3 298 78
       
 25370 +ffff 13 286 78
       
 25371 +10012 b 292 78
       
 25372 +1001d 39 294 78
       
 25373 +10056 23 295 78
       
 25374 +10079 8 296 78
       
 25375 +10081 16 294 78
       
 25376 +10097 3 296 78
       
 25377 +1009a 19 292 78
       
 25378 +100b3 19 298 78
       
 25379 +100cc 7 304 78
       
 25380 +100d3 1 304 78
       
 25381 +FUNC 100d4 70 0 std::vector<dwarf2reader::SourceFileInfo, std::allocator<dwarf2reader::SourceFileInfo> >::push_back(dwarf2reader::SourceFileInfo const&)
       
 25382  100d4 c 602 47
       
 25383 -100e0 10 604 47
       
 25384 -100f0 1e 606 47
       
 25385 -1010e 11 607 47
       
 25386 -1011f 25 610 47
       
 25387 +100e0 10 604 71
       
 25388 +100f0 1e 606 71
       
 25389 +1010e 11 607 71
       
 25390 +1011f 25 610 71
       
 25391  FUNC 10144 16c 0 Start
       
 25392 -10144 17 610 48
       
 25393 +10144 17 610 71
       
 25394  1015b 40 49 48
       
 25395  1019b 6 51 48
       
 25396  101a1 3f 53 48
       
 25397  101e0 7 54 48
       
 25398  101e7 5 55 48
       
 25399  101ec 2a 58 48
       
 25400  10216 61 61 48
       
 25401  10277 7 62 48
       
 25402 @@ -3049,56 +3046,59 @@ 107fd c 141 48
       
 25403  10809 6 142 48
       
 25404  1080f 1 142 48
       
 25405  10810 c 47 49
       
 25406  1081c 1a 48 49
       
 25407  10836 2 49 49
       
 25408  10838 c 47 49
       
 25409  10844 1a 48 49
       
 25410  1085e 2 49 49
       
 25411 +FUNC 10860 cb 0 google_breakpad::FileID::FileIdentifier(unsigned char*)
       
 25412  10860 f 51 49
       
 25413  1086f 16 52 49
       
 25414  10885 6 53 49
       
 25415  1088b f 54 49
       
 25416  1089a b 57 49
       
 25417  108a5 7 62 49
       
 25418  108ac 2 63 49
       
 25419  108ae 1c 64 49
       
 25420  108ca 32 63 49
       
 25421  108fc b 67 49
       
 25422  10907 12 68 49
       
 25423  10919 10 70 49
       
 25424  10929 2 71 49
       
 25425  1092b 1 71 49
       
 25426 +FUNC 1092c f2 0 google_breakpad::FileID::MachoIdentifier(int, unsigned char*)
       
 25427  1092c 10 73 49
       
 25428  1093c 15 74 49
       
 25429  10951 20 76 49
       
 25430  10971 f 77 49
       
 25431  10980 20 79 49
       
 25432  109a0 c 80 49
       
 25433  109ac 69 82 49
       
 25434  10a15 9 83 49
       
 25435 +FUNC 10a1e fb 0 google_breakpad::FileID::ConvertIdentifierToString(unsigned char const*, char*, int)
       
 25436  10a1e c 87 49
       
 25437  10a2a 7 88 49
       
 25438  10a31 c 89 49
       
 25439  10a3d 15 90 49
       
 25440  10a52 12 91 49
       
 25441  10a64 18 93 49
       
 25442  10a7c e 94 49
       
 25443  10a8a 2b 96 49
       
 25444  10ab5 2b 97 49
       
 25445  10ae0 17 89 49
       
 25446  10af7 20 101 49
       
 25447  10b17 2 102 49
       
 25448  10b19 1 102 49
       
 25449  FUNC 10b1a 13 0 NXHostByteOrder
       
 25450 -10b1a c 144 50
       
 25451 -10b26 5 147 50
       
 25452 -10b2b 2 153 50
       
 25453 -10b2d 1 153 50
       
 25454 +10b1a c 144 56
       
 25455 +10b26 5 147 56
       
 25456 +10b2b 2 153 56
       
 25457 +10b2d 1 153 56
       
 25458  10b2e c 56 51
       
 25459  10b3a 1a 57 51
       
 25460  10b54 1e 58 51
       
 25461  10b72 2 59 51
       
 25462  10b74 c 56 51
       
 25463  10b80 1a 57 51
       
 25464  10b9a 1e 58 51
       
 25465  10bb8 2 59 51
       
 25466 @@ -3107,16 +3107,17 @@ 10bc6 e 62 51
       
 25467  10bd4 11 63 51
       
 25468  10be5 2 64 51
       
 25469  10be7 1 64 51
       
 25470  10be8 c 61 51
       
 25471  10bf4 e 62 51
       
 25472  10c02 11 63 51
       
 25473  10c13 2 64 51
       
 25474  10c15 1 64 51
       
 25475 +FUNC 10c16 477 0 MacFileUtilities::MachoID::UpdateCRC(unsigned char*, unsigned long)
       
 25476  10c16 c 74 51
       
 25477  10c22 11 82 51
       
 25478  10c33 14 83 51
       
 25479  10c47 5 86 51
       
 25480  10c4c 9 87 51
       
 25481  10c55 7 88 51
       
 25482  10c5c 18b 90 51
       
 25483  10de7 6 91 51
       
 25484 @@ -3132,48 +3133,53 @@ 10ffa c 99 51
       
 25485  11006 13 105 51
       
 25486  11019 8 106 51
       
 25487  11021 10 104 51
       
 25488  11031 23 108 51
       
 25489  11054 23 109 51
       
 25490  11077 14 110 51
       
 25491  1108b 2 112 51
       
 25492  1108d 1 112 51
       
 25493 +FUNC 1108e 2c 0 MacFileUtilities::MachoID::UpdateMD5(unsigned char*, unsigned long)
       
 25494  1108e c 114 51
       
 25495  1109a 1e 115 51
       
 25496  110b8 2 116 51
       
 25497 +FUNC 110ba 2c 0 MacFileUtilities::MachoID::UpdateSHA1(unsigned char*, unsigned long)
       
 25498  110ba c 118 51
       
 25499  110c6 1e 119 51
       
 25500  110e4 2 120 51
       
 25501 +FUNC 110e6 121 0 MacFileUtilities::MachoID::Update(MacFileUtilities::MachoWalker*, unsigned long, unsigned long)
       
 25502  110e6 f 122 51
       
 25503  110f5 1b 123 51
       
 25504  11110 e 129 51
       
 25505  1111e 5 130 51
       
 25506  11123 9 131 51
       
 25507  1112c 7 132 51
       
 25508  11133 a 133 51
       
 25509  1113d 6 135 51
       
 25510  11143 7 136 51
       
 25511  1114a 35 139 51
       
 25512  1117f 6c 142 51
       
 25513  111eb 10 143 51
       
 25514  111fb a 130 51
       
 25515  11205 2 145 51
       
 25516  11207 1 145 51
       
 25517 +FUNC 11208 cf 0 MacFileUtilities::MachoID::UUIDCommand(int, unsigned char*)
       
 25518  11208 14 147 51
       
 25519  1121c 25 149 51
       
 25520  11241 7 151 51
       
 25521  11248 19 152 51
       
 25522  11261 9 153 51
       
 25523  1126a 8 157 51
       
 25524  11272 1f 158 51
       
 25525  11291 9 159 51
       
 25526  1129a 36 162 51
       
 25527  112d0 7 163 51
       
 25528  112d7 1 163 51
       
 25529 +FUNC 112d8 224 0 MacFileUtilities::MachoID::IDCommand(int, unsigned char*)
       
 25530  112d8 15 165 51
       
 25531  112ed 25 167 51
       
 25532  11312 7 169 51
       
 25533  11319 19 170 51
       
 25534  11332 c 171 51
       
 25535  1133e c 175 51
       
 25536  1134a 6 180 51
       
 25537  11350 7 181 51
       
 25538 @@ -3192,45 +3198,49 @@ 1143f 10 195 51
       
 25539  1144f d 196 51
       
 25540  1145c 17 197 51
       
 25541  11473 17 198 51
       
 25542  1148a 17 199 51
       
 25543  114a1 14 200 51
       
 25544  114b5 9 202 51
       
 25545  114be 36 205 51
       
 25546  114f4 8 206 51
       
 25547 +FUNC 114fc d1 0 MacFileUtilities::MachoID::Adler32(int)
       
 25548  114fc 14 208 51
       
 25549  11510 25 209 51
       
 25550  11535 27 210 51
       
 25551  1155c d 211 51
       
 25552  11569 19 213 51
       
 25553  11582 9 214 51
       
 25554  1158b 3b 216 51
       
 25555  115c6 7 217 51
       
 25556  115cd 1 217 51
       
 25557 +FUNC 115ce f8 0 MacFileUtilities::MachoID::MD5(int, unsigned char*)
       
 25558  115ce 14 219 51
       
 25559  115e2 25 220 51
       
 25560  11607 27 221 51
       
 25561  1162e 19 223 51
       
 25562  11647 19 224 51
       
 25563  11660 9 225 51
       
 25564  11669 17 227 51
       
 25565  11680 9 228 51
       
 25566  11689 36 231 51
       
 25567  116bf 7 232 51
       
 25568 +FUNC 116c6 f8 0 MacFileUtilities::MachoID::SHA1(int, unsigned char*)
       
 25569  116c6 14 234 51
       
 25570  116da 25 235 51
       
 25571  116ff 27 236 51
       
 25572  11726 19 238 51
       
 25573  1173f 19 239 51
       
 25574  11758 9 240 51
       
 25575  11761 17 242 51
       
 25576  11778 9 243 51
       
 25577  11781 36 246 51
       
 25578  117b7 7 247 51
       
 25579 +FUNC 117be 378 0 MacFileUtilities::MachoID::WalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*)
       
 25580  117be 2b 251 51
       
 25581  117e9 6 252 51
       
 25582  117ef e 254 51
       
 25583  117fd 38 257 51
       
 25584  11835 f 258 51
       
 25585  11844 9 260 51
       
 25586  1184d 17 261 51
       
 25587  11864 20 266 51
       
 25588 @@ -3259,53 +3269,55 @@ 11a75 f 308 51
       
 25589  11a84 9 310 51
       
 25590  11a8d 1f 311 51
       
 25591  11aac 1a 315 51
       
 25592  11ac6 39 316 51
       
 25593  11aff d 318 51
       
 25594  11b0c 11 306 51
       
 25595  11b1d 10 323 51
       
 25596  11b2d 9 324 51
       
 25597 +FUNC 11b36 95 0 MacFileUtilities::MachoID::UUIDWalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*)
       
 25598  11b36 1e 328 51
       
 25599  11b54 a 329 51
       
 25600  11b5e 6 331 51
       
 25601  11b64 2f 333 51
       
 25602  11b93 9 335 51
       
 25603  11b9c 6 337 51
       
 25604  11ba2 14 338 51
       
 25605  11bb6 9 340 51
       
 25606  11bbf a 344 51
       
 25607  11bc9 2 345 51
       
 25608  11bcb 1 345 51
       
 25609 +FUNC 11bcc 95 0 MacFileUtilities::MachoID::IDWalkerCB(MacFileUtilities::MachoWalker*, load_command*, long long, bool, void*)
       
 25610  11bcc 1e 349 51
       
 25611  11bea a 350 51
       
 25612  11bf4 6 351 51
       
 25613  11bfa 2f 353 51
       
 25614  11c29 9 354 51
       
 25615  11c32 6 356 51
       
 25616  11c38 14 357 51
       
 25617  11c4c 9 359 51
       
 25618  11c55 a 363 51
       
 25619  11c5f 2 364 51
       
 25620  11c61 1 364 51
       
 25621  FUNC 11c62 1c 0 _OSSwapInt32
       
 25622 -11c62 f 53 52
       
 25623 -11c71 8 55 52
       
 25624 -11c79 3 56 52
       
 25625 -11c7c 2 57 52
       
 25626 +11c62 f 53 55
       
 25627 +11c71 8 55 55
       
 25628 +11c79 3 56 55
       
 25629 +11c7c 2 57 55
       
 25630  FUNC 11c7e 19 0 NXSwapInt
       
 25631 -11c7e f 52 53
       
 25632 -11c8d 8 54 53
       
 25633 -11c95 2 55 53
       
 25634 -11c97 1 55 53
       
 25635 +11c7e f 52 56
       
 25636 +11c8d 8 54 56
       
 25637 +11c95 2 55 56
       
 25638 +11c97 1 55 56
       
 25639  FUNC 11c98 13 0 NXHostByteOrder
       
 25640 -11c98 c 144 53
       
 25641 -11ca4 5 147 53
       
 25642 -11ca9 2 153 53
       
 25643 -11cab 1 153 53
       
 25644 +11c98 c 144 56
       
 25645 +11ca4 5 147 56
       
 25646 +11ca9 2 153 56
       
 25647 +11cab 1 153 56
       
 25648  11cac c 52 54
       
 25649  11cb8 12 54 54
       
 25650  11cca 1a 55 54
       
 25651  11ce4 2 56 54
       
 25652  11ce6 c 52 54
       
 25653  11cf2 12 54 54
       
 25654  11d04 1a 55 54
       
 25655  11d1e 2 56 54
       
 25656 @@ -3314,36 +3326,40 @@ 11d2c a 59 54
       
 25657  11d36 d 60 54
       
 25658  11d43 2 61 54
       
 25659  11d45 1 61 54
       
 25660  11d46 c 58 54
       
 25661  11d52 a 59 54
       
 25662  11d5c d 60 54
       
 25663  11d69 2 61 54
       
 25664  11d6b 1 61 54
       
 25665 +FUNC 11d6c 37 0 MacFileUtilities::MachoWalker::ValidateCPUType(int)
       
 25666  11d6c c 63 54
       
 25667  11d78 6 66 54
       
 25668  11d7e 8 67 54
       
 25669  11d86 6 68 54
       
 25670  11d8c b 69 54
       
 25671  11d97 7 74 54
       
 25672  11d9e 3 80 54
       
 25673  11da1 2 81 54
       
 25674  11da3 1 81 54
       
 25675 +FUNC 11da4 50 0 MacFileUtilities::MachoWalker::ReadBytes(void*, unsigned long, long long)
       
 25676  11da4 18 96 54
       
 25677  11dbc 36 97 54
       
 25678  11df2 2 98 54
       
 25679 +FUNC 11df4 73 0 MacFileUtilities::MachoWalker::CurrentHeader(mach_header_64*, long long*)
       
 25680  11df4 c 100 54
       
 25681  11e00 a 101 54
       
 25682  11e0a 37 102 54
       
 25683  11e41 11 103 54
       
 25684  11e52 9 104 54
       
 25685  11e5b a 107 54
       
 25686  11e65 2 108 54
       
 25687  11e67 1 108 54
       
 25688 +FUNC 11e68 2a6 0 MacFileUtilities::MachoWalker::FindHeader(int, long long&)
       
 25689  11e68 c 110 54
       
 25690  11e74 15 111 54
       
 25691  11e89 31 114 54
       
 25692  11eba c 115 54
       
 25693  11ec6 10 117 54
       
 25694  11ed6 4 120 54
       
 25695  11eda 14 121 54
       
 25696  11eee 4 122 54
       
 25697 @@ -3371,44 +3387,47 @@ 1208f f 162 54
       
 25698  1209e 1c 163 54
       
 25699  120ba 8 165 54
       
 25700  120c2 10 166 54
       
 25701  120d2 9 167 54
       
 25702  120db 16 170 54
       
 25703  120f1 11 158 54
       
 25704  12102 a 174 54
       
 25705  1210c 2 175 54
       
 25706 +FUNC 1210e 109 0 MacFileUtilities::MachoWalker::WalkHeaderCore(long long, unsigned int, bool)
       
 25707  1210e 1e 224 54
       
 25708  1212c c 225 54
       
 25709  12138 2f 227 54
       
 25710  12167 c 228 54
       
 25711  12173 6 230 54
       
 25712  12179 14 231 54
       
 25713  1218d 5b 234 54
       
 25714  121e8 12 237 54
       
 25715  121fa 11 225 54
       
 25716  1220b a 240 54
       
 25717  12215 2 241 54
       
 25718  12217 1 241 54
       
 25719 +FUNC 12218 10e 0 MacFileUtilities::MachoWalker::WalkHeader64AtOffset(long long)
       
 25720  12218 18 203 54
       
 25721  12230 2f 205 54
       
 25722  1225f c 206 54
       
 25723  1226b e 208 54
       
 25724  12279 6 209 54
       
 25725  1227f 14 210 54
       
 25726  12293 9 212 54
       
 25727  1229c a 213 54
       
 25728  122a6 f 214 54
       
 25729  122b5 15 215 54
       
 25730  122ca 2b 216 54
       
 25731  122f5 a 217 54
       
 25732  122ff a 218 54
       
 25733  12309 11 219 54
       
 25734  1231a a 220 54
       
 25735  12324 2 221 54
       
 25736 +FUNC 12326 143 0 MacFileUtilities::MachoWalker::WalkHeaderAtOffset(long long)
       
 25737  12326 18 177 54
       
 25738  1233e 2f 179 54
       
 25739  1236d c 180 54
       
 25740  12379 e 182 54
       
 25741  12387 6 183 54
       
 25742  1238d 14 184 54
       
 25743  123a1 2e 189 54
       
 25744  123cf 7 190 54
       
 25745 @@ -3418,16 +3437,17 @@ 123e9 f 194 54
       
 25746  123f8 15 195 54
       
 25747  1240d 2b 196 54
       
 25748  12438 a 197 54
       
 25749  12442 a 198 54
       
 25750  1244c 11 199 54
       
 25751  1245d a 200 54
       
 25752  12467 2 201 54
       
 25753  12469 1 201 54
       
 25754 +FUNC 1246a 99 0 MacFileUtilities::MachoWalker::WalkHeader(int)
       
 25755  1246a c 83 54
       
 25756  12476 15 84 54
       
 25757  1248b 1d 86 54
       
 25758  124a8 d 87 54
       
 25759  124b5 21 88 54
       
 25760  124d6 21 90 54
       
 25761  124f7 a 93 54
       
 25762  12501 2 94 54
       
 25763 @@ -3448,46 +3468,46 @@ 1254c f 61 56
       
 25764  1255b 8 63 56
       
 25765  12563 2 64 56
       
 25766  12565 1 64 56
       
 25767  FUNC 12566 1f 0 NXSwapLongLong
       
 25768  12566 12 70 56
       
 25769  12578 b 72 56
       
 25770  12583 2 73 56
       
 25771  12585 1 73 56
       
 25772 -FUNC 12586 32 0 breakpad_swap_uuid_command
       
 25773 +FUNC 12586 32 0 breakpad_swap_uuid_command(breakpad_uuid_command*, NXByteOrder)
       
 25774  12586 c 37 57
       
 25775  12592 11 39 57
       
 25776  125a3 13 40 57
       
 25777  125b6 2 41 57
       
 25778 -FUNC 125b8 da 0 breakpad_swap_segment_command_64
       
 25779 +FUNC 125b8 da 0 breakpad_swap_segment_command_64(segment_command_64*, NXByteOrder)
       
 25780  125b8 c 44 57
       
 25781  125c4 11 46 57
       
 25782  125d5 13 47 57
       
 25783  125e8 17 49 57
       
 25784  125ff 17 50 57
       
 25785  12616 17 51 57
       
 25786  1262d 17 52 57
       
 25787  12644 13 54 57
       
 25788  12657 13 55 57
       
 25789  1266a 13 56 57
       
 25790  1267d 13 57 57
       
 25791  12690 2 58 57
       
 25792 -FUNC 12692 a4 0 breakpad_swap_mach_header_64
       
 25793 +FUNC 12692 a4 0 breakpad_swap_mach_header_64(mach_header_64*, NXByteOrder)
       
 25794  12692 c 61 57
       
 25795  1269e 11 63 57
       
 25796  126af 13 64 57
       
 25797  126c2 13 65 57
       
 25798  126d5 13 66 57
       
 25799  126e8 13 67 57
       
 25800  126fb 13 68 57
       
 25801  1270e 13 69 57
       
 25802  12721 13 70 57
       
 25803  12734 2 71 57
       
 25804 -FUNC 12736 1d1 0 breakpad_swap_section_64
       
 25805 +FUNC 12736 1d1 0 breakpad_swap_section_64(section_64*, unsigned int, NXByteOrder)
       
 25806  12736 d 75 57
       
 25807  12743 c 77 57
       
 25808  1274f 33 78 57
       
 25809  12782 33 79 57
       
 25810  127b5 2d 81 57
       
 25811  127e2 2d 82 57
       
 25812  1280f 2d 83 57
       
 25813  1283c 2d 84 57
       
 25814 @@ -3509,70 +3529,76 @@ 129d0 13 14 58
       
 25815  129e3 2a 14 58
       
 25816  12a0d 1 14 58
       
 25817  12a0e 13 14 58
       
 25818  12a21 2a 14 58
       
 25819  12a4b 1 14 58
       
 25820  12a4c 13 14 58
       
 25821  12a5f 2a 14 58
       
 25822  12a89 1 14 58
       
 25823 +FUNC 12a8a bb 0 dwarf2reader::ByteReader::SetOffsetSize(unsigned char)
       
 25824  12a8a 19 16 58
       
 25825  12aa3 a 17 58
       
 25826  12aad 48 18 58
       
 25827  12af5 6 19 58
       
 25828  12afb 23 20 58
       
 25829  12b1e 21 22 58
       
 25830  12b3f 6 24 58
       
 25831  12b45 1 24 58
       
 25832 +FUNC 12b46 bb 0 dwarf2reader::ByteReader::SetAddressSize(unsigned char)
       
 25833  12b46 19 26 58
       
 25834  12b5f a 27 58
       
 25835  12b69 48 28 58
       
 25836  12bb1 6 29 58
       
 25837  12bb7 23 30 58
       
 25838  12bda 21 32 58
       
 25839  12bfb 6 34 58
       
 25840  12c01 1 34 58
       
 25841 +FUNC 12c02 a2 0 dwarf2reader::ByteReader::ReadFourBytes(char const*) const
       
 25842  12c02 c 24 59
       
 25843 -12c0e c 25 59
       
 25844 -12c1a d 26 59
       
 25845 -12c27 f 27 59
       
 25846 -12c36 f 28 59
       
 25847 -12c45 b 29 59
       
 25848 -12c50 27 30 59
       
 25849 -12c77 2b 32 59
       
 25850 -12ca2 2 34 59
       
 25851 +12c0e c 25 64
       
 25852 +12c1a d 26 64
       
 25853 +12c27 f 27 64
       
 25854 +12c36 f 28 64
       
 25855 +12c45 b 29 64
       
 25856 +12c50 27 30 64
       
 25857 +12c77 2b 32 64
       
 25858 +12ca2 2 34 64
       
 25859 +FUNC 12ca4 40e 0 dwarf2reader::ByteReader::ReadEightBytes(char const*) const
       
 25860  12ca4 11 36 59
       
 25861 -12cb5 1a 37 59
       
 25862 -12ccf 1b 38 59
       
 25863 -12cea 1d 39 59
       
 25864 -12d07 1d 40 59
       
 25865 -12d24 1d 41 59
       
 25866 -12d41 1d 42 59
       
 25867 -12d5e 1d 43 59
       
 25868 -12d7b 1d 44 59
       
 25869 -12d98 f 45 59
       
 25870 -12da7 18f 47 59
       
 25871 -12f36 172 50 59
       
 25872 -130a8 a 52 59
       
 25873 -130b2 2 52 59
       
 25874 +12cb5 1a 37 64
       
 25875 +12ccf 1b 38 64
       
 25876 +12cea 1d 39 64
       
 25877 +12d07 1d 40 64
       
 25878 +12d24 1d 41 64
       
 25879 +12d41 1d 42 64
       
 25880 +12d5e 1d 43 64
       
 25881 +12d7b 1d 44 64
       
 25882 +12d98 f 45 64
       
 25883 +12da7 18f 47 64
       
 25884 +12f36 172 50 64
       
 25885 +130a8 a 52 64
       
 25886 +130b2 2 52 64
       
 25887 +FUNC 130b4 a6 0 ReadInitialLength
       
 25888  130b4 15 29 60
       
 25889  130c9 18 30 60
       
 25890  130e1 6 31 60
       
 25891  130e7 d 35 60
       
 25892  130f4 13 36 60
       
 25893  13107 9 37 60
       
 25894  13110 1a 38 60
       
 25895  1312a 13 40 60
       
 25896  1313d 9 41 60
       
 25897  13146 12 43 60
       
 25898  13158 2 44 60
       
 25899  1315a 1f 47 60
       
 25900  13179 65 50 60
       
 25901  131de 1f 47 60
       
 25902  131fd 65 50 60
       
 25903 +FUNC 13262 393 0 dwarf2reader::CompilationUnit::SkipAttribute(char const*, dwarf2reader::DwarfForm)
       
 25904  13262 14 133 60
       
 25905  13276 82 136 60
       
 25906  132f8 1f 139 60
       
 25907  13317 a 140 60
       
 25908  13321 21 141 60
       
 25909  13342 c 147 60
       
 25910  1334e e 151 60
       
 25911  1335c e 155 60
       
 25912 @@ -3594,16 +3620,17 @@ 1350f 23 195 60
       
 25913  13532 22 198 60
       
 25914  13554 15 199 60
       
 25915  13569 1b 203 60
       
 25916  13584 30 206 60
       
 25917  135b4 30 208 60
       
 25918  135e4 a 209 60
       
 25919  135ee 7 210 60
       
 25920  135f5 1 210 60
       
 25921 +FUNC 135f6 29b 0 dwarf2reader::CompilationUnit::ReadHeader()
       
 25922  135f6 14 217 60
       
 25923  1360a 9 218 60
       
 25924  13613 4e 221 60
       
 25925  13661 17 223 60
       
 25926  13678 a 224 60
       
 25927  13682 f 225 60
       
 25928  13691 4e 227 60
       
 25929  136df 1e 228 60
       
 25930 @@ -3614,16 +3641,17 @@ 1377f 18 233 60
       
 25931  13797 4c 235 60
       
 25932  137e3 1d 236 60
       
 25933  13800 1c 237 60
       
 25934  1381c 5 238 60
       
 25935  13821 9 240 60
       
 25936  1382a 60 245 60
       
 25937  1388a 7 247 60
       
 25938  13891 1 247 60
       
 25939 +FUNC 13892 a57 0 dwarf2reader::CompilationUnit::ProcessAttribute(unsigned long long, char const*, dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm)
       
 25940  13892 24 299 60
       
 25941  138b6 8a 302 60
       
 25942  13940 1f 307 60
       
 25943  1395f a 308 60
       
 25944  13969 36 309 60
       
 25945  1399f 5b 316 60
       
 25946  139fa c 317 60
       
 25947  13a06 5b 322 60
       
 25948 @@ -3678,30 +3706,33 @@ 14309 3a 491 60
       
 25949  14343 a 492 60
       
 25950  1434d 6 493 60
       
 25951  14353 1 493 60
       
 25952  14354 1f 489 60
       
 25953  14373 3a 491 60
       
 25954  143ad a 492 60
       
 25955  143b7 6 493 60
       
 25956  143bd 1 493 60
       
 25957 +FUNC 143be b5 0 dwarf2reader::CompilationUnit::ProcessDIE(unsigned long long, char const*, dwarf2reader::CompilationUnit::Abbrev const&)
       
 25958  143be 19 426 60
       
 25959  143d7 13 427 60
       
 25960  143ea 46 430 60
       
 25961  14430 3a 427 60
       
 25962  1446a 3 432 60
       
 25963  1446d 6 433 60
       
 25964  14473 1 433 60
       
 25965 +FUNC 14474 85 0 dwarf2reader::CompilationUnit::SkipDIE(char const*, dwarf2reader::CompilationUnit::Abbrev const&)
       
 25966  14474 c 122 60
       
 25967  14480 13 123 60
       
 25968  14493 27 126 60
       
 25969  144ba 3a 123 60
       
 25970  144f4 3 128 60
       
 25971  144f7 2 129 60
       
 25972  144f9 1 129 60
       
 25973 +FUNC 144fa be4 0 dwarf2reader::LineInfo::ProcessOneOpcode(dwarf2reader::ByteReader*, dwarf2reader::LineInfoHandler*, dwarf2reader::LineInfoHeader const&, char const*, dwarf2reader::LineStateMachine*, unsigned long*, unsigned long, bool*)
       
 25974  144fa 18 593 60
       
 25975  14512 a 594 60
       
 25976  1451c 18 596 60
       
 25977  14534 8 597 60
       
 25978  1453c 5 598 60
       
 25979  14541 19 602 60
       
 25980  1455a f 603 60
       
 25981  14569 50 605 60
       
 25982 @@ -3778,16 +3809,17 @@ 15040 a 758 60
       
 25983  1504a 9 759 60
       
 25984  15053 1c 761 60
       
 25985  1506f d 762 60
       
 25986  1507c e 763 60
       
 25987  1508a 2e 759 60
       
 25988  150b8 b 769 60
       
 25989  150c3 10 770 60
       
 25990  150d3 b 771 60
       
 25991 +FUNC 150de 14b 0 dwarf2reader::LineInfo::ReadLines()
       
 25992  150de e 773 60
       
 25993  150ec 9 778 60
       
 25994  150f5 17 782 60
       
 25995  1510c 8 783 60
       
 25996  15114 6 785 60
       
 25997  1511a 9 787 60
       
 25998  15123 5 788 60
       
 25999  15128 19 789 60
       
 26000 @@ -3796,16 +3828,17 @@ 15146 4a 793 60
       
 26001  15190 6 794 60
       
 26002  15196 4a 796 60
       
 26003  151e0 a 797 60
       
 26004  151ea f 790 60
       
 26005  151f9 15 788 60
       
 26006  1520e 14 801 60
       
 26007  15222 7 802 60
       
 26008  15229 1 802 60
       
 26009 +FUNC 1522a 4fd 0 dwarf2reader::CompilationUnit::ReadAbbrevs()
       
 26010  1522a 18 60 60
       
 26011  15242 e 61 60
       
 26012  15250 58 65 60
       
 26013  152a8 38 66 60
       
 26014  152e0 44 65 60
       
 26015  15324 2a 66 60
       
 26016  1534e 45 68 60
       
 26017  15393 16 69 60
       
 26018 @@ -3838,16 +3871,17 @@ 15637 c 107 60
       
 26019  15643 6 111 60
       
 26020  15649 6 112 60
       
 26021  1564f 32 113 60
       
 26022  15681 47 115 60
       
 26023  156c8 30 116 60
       
 26024  156f8 24 79 60
       
 26025  1571c b 118 60
       
 26026  15727 1 118 60
       
 26027 +FUNC 15728 5dc 0 dwarf2reader::LineInfo::ReadHeader()
       
 26028  15728 18 503 60
       
 26029  15740 9 504 60
       
 26030  15749 17 508 60
       
 26031  15760 a 510 60
       
 26032  1576a f 511 60
       
 26033  15779 60 512 60
       
 26034  157d9 44 516 60
       
 26035  1581d 1e 518 60
       
 26036 @@ -3895,22 +3929,24 @@ 15bc5 22 573 60
       
 26037  15be7 a 574 60
       
 26038  15bf1 ba 576 60
       
 26039  15cab 5 577 60
       
 26040  15cb0 16 563 60
       
 26041  15cc6 25 576 60
       
 26042  15ceb 5 580 60
       
 26043  15cf0 9 582 60
       
 26044  15cf9 b 583 60
       
 26045 +FUNC 15d04 3d 0 dwarf2reader::LineInfo::Start()
       
 26046  15d04 c 495 60
       
 26047  15d10 b 496 60
       
 26048  15d1b b 497 60
       
 26049  15d26 19 498 60
       
 26050  15d3f 2 499 60
       
 26051  15d41 1 499 60
       
 26052 +FUNC 15d42 304 0 dwarf2reader::CompilationUnit::ProcessDIEs()
       
 26053  15d42 11 435 60
       
 26054  15d53 9 436 60
       
 26055  15d5c 9 441 60
       
 26056  15d65 17 445 60
       
 26057  15d7c 8 446 60
       
 26058  15d84 6 448 60
       
 26059  15d8a 6c 453 60
       
 26060  15df6 8 455 60
       
 26061 @@ -3930,16 +3966,17 @@ 15f22 42 474 60
       
 26062  15f64 1e 475 60
       
 26063  15f82 2a 477 60
       
 26064  15fac b 480 60
       
 26065  15fb7 1e 481 60
       
 26066  15fd5 26 483 60
       
 26067  15ffb 1d 455 60
       
 26068  16018 24 485 60
       
 26069  1603c a 486 60
       
 26070 +FUNC 16046 35f 0 dwarf2reader::CompilationUnit::Start()
       
 26071  16046 18 249 60
       
 26072  1605e 58 251 60
       
 26073  160b6 35 252 60
       
 26074  160eb 32 251 60
       
 26075  1611d 2a 252 60
       
 26076  16147 20 255 60
       
 26077  16167 37 256 60
       
 26078  1619e b 259 60
       
 26079 @@ -3954,1208 +3991,1310 @@ 16296 58 282 60
       
 26080  162ee 2f 283 60
       
 26081  1631d 32 282 60
       
 26082  1634f 14 284 60
       
 26083  16363 1a 285 60
       
 26084  1637d b 289 60
       
 26085  16388 12 291 60
       
 26086  1639a b 292 60
       
 26087  163a5 1 292 60
       
 26088 +FUNC 163a6 3a 0 std::fill(unsigned char*, unsigned char*, unsigned char const&)
       
 26089  163a6 c 573 61
       
 26090  163b2 9 576 61
       
 26091  163bb 23 577 61
       
 26092  163de 2 578 61
       
 26093 +FUNC 163e0 33 0 std::__deque_buf_size(unsigned long)
       
 26094  163e0 c 83 62
       
 26095  163ec 27 84 62
       
 26096  16413 1 84 62
       
 26097 +FUNC 16414 18 0 dwarf2reader::ByteReader::OffsetSize() const
       
 26098  16414 c 38 63
       
 26099  16420 c 38 63
       
 26100 +FUNC 1642c 18 0 dwarf2reader::ByteReader::AddressSize() const
       
 26101  1642c c 41 63
       
 26102  16438 c 41 63
       
 26103 +FUNC 16444 17 0 dwarf2reader::ByteReader::ReadOneByte(char const*) const
       
 26104  16444 c 10 64
       
 26105  16450 9 11 64
       
 26106  16459 2 12 64
       
 26107  1645b 1 12 64
       
 26108 +FUNC 1645c 63 0 dwarf2reader::ByteReader::ReadTwoBytes(char const*) const
       
 26109  1645c c 14 64
       
 26110  16468 d 15 64
       
 26111  16475 e 16 64
       
 26112  16483 b 17 64
       
 26113  1648e 17 18 64
       
 26114  164a5 18 20 64
       
 26115  164bd 2 22 64
       
 26116  164bf 1 22 64
       
 26117 +FUNC 164c0 98 0 dwarf2reader::ByteReader::ReadUnsignedLEB128(char const*, unsigned long*) const
       
 26118  164c0 e 59 64
       
 26119  164ce e 60 64
       
 26120  164dc 7 61 64
       
 26121  164e3 7 62 64
       
 26122  164ea e 66 64
       
 26123  164f8 5 67 64
       
 26124  164fd 38 69 64
       
 26125  16535 6 71 64
       
 26126  1653b 8 65 64
       
 26127  16543 8 75 64
       
 26128  1654b 6 77 64
       
 26129  16551 7 78 64
       
 26130 +FUNC 16558 ee 0 dwarf2reader::ByteReader::ReadSignedLEB128(char const*, unsigned long*) const
       
 26131  16558 e 84 64
       
 26132  16566 e 85 64
       
 26133  16574 7 86 64
       
 26134  1657b 7 87 64
       
 26135  16582 e 91 64
       
 26136  16590 5 92 64
       
 26137  16595 44 93 64
       
 26138  165d9 6 94 64
       
 26139  165df 8 90 64
       
 26140  165e7 14 97 64
       
 26141  165fb 36 98 64
       
 26142  16631 8 99 64
       
 26143  16639 6 100 64
       
 26144  1663f 7 101 64
       
 26145 +FUNC 16646 a2 0 dwarf2reader::ByteReader::ReadOffset(char const*) const
       
 26146  16646 13 103 64
       
 26147  16659 3f 104 64
       
 26148  16698 4a 105 64
       
 26149  166e2 6 106 64
       
 26150 +FUNC 166e8 a2 0 dwarf2reader::ByteReader::ReadAddress(char const*) const
       
 26151  166e8 13 108 64
       
 26152  166fb 3f 109 64
       
 26153  1673a 4a 110 64
       
 26154  16784 6 111 64
       
 26155 +FUNC 1678a 61 0 dwarf2reader::LineStateMachine::Reset(bool)
       
 26156  1678a 12 12 65
       
 26157  1679c 9 13 65
       
 26158  167a5 11 14 65
       
 26159  167b6 11 15 65
       
 26160  167c7 a 16 65
       
 26161  167d1 a 17 65
       
 26162  167db 7 18 65
       
 26163  167e2 7 19 65
       
 26164  167e9 2 20 65
       
 26165  167eb 1 20 65
       
 26166 +FUNC 167ec 20 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator!=(std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > const&) const
       
 26167  167ec c 253 66
       
 26168  167f8 14 254 66
       
 26169 +FUNC 1680c 25 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator++(int)
       
 26170  1680c c 226 66
       
 26171  16818 8 228 66
       
 26172  16820 c 229 66
       
 26173  1682c 5 230 66
       
 26174  16831 1 230 66
       
 26175 +FUNC 16832 16 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator->() const
       
 26176  16832 c 215 66
       
 26177  1683e a 216 66
       
 26178  16848 c 190 67
       
 26179  16854 a 190 67
       
 26180 +FUNC 1685e 13 0 std::auto_ptr<std::stack<unsigned long long, std::deque<unsigned long long, std::allocator<unsigned long long> > > >::operator->() const
       
 26181  1685e c 283 67
       
 26182  1686a 7 286 67
       
 26183  16871 1 286 67
       
 26184  16872 c 65 68
       
 26185  1687e 2 65 68
       
 26186  16880 c 97 69
       
 26187  1688c d 97 69
       
 26188  16899 1 97 69
       
 26189  1689a c 99 69
       
 26190  168a6 14 100 69
       
 26191  168ba c 97 69
       
 26192  168c6 d 97 69
       
 26193  168d3 1 97 69
       
 26194  168d4 c 84 70
       
 26195  168e0 17 85 70
       
 26196  168f7 1 85 70
       
 26197 +FUNC 168f8 2d 0 std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> std::make_pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>(dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm)
       
 26198  168f8 c 144 70
       
 26199  16904 21 145 70
       
 26200  16925 1 145 70
       
 26201 -16926 c 202 70
       
 26202 -16932 a 203 70
       
 26203 +16926 c 202 66
       
 26204 +16932 a 203 66
       
 26205 +FUNC 1693c 25 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::begin() const
       
 26206  1693c c 588 70
       
 26207 -16948 19 589 70
       
 26208 -16961 1 589 70
       
 26209 +16948 19 589 66
       
 26210 +16961 1 589 66
       
 26211 +FUNC 16962 23 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::end() const
       
 26212  16962 c 605 70
       
 26213 -1696e 17 606 70
       
 26214 -16985 1 606 70
       
 26215 -16986 c 65 70
       
 26216 -16992 2 65 70
       
 26217 -16994 c 72 70
       
 26218 -169a0 2 72 70
       
 26219 -169a2 c 97 70
       
 26220 -169ae d 97 70
       
 26221 -169bb 1 97 70
       
 26222 -169bc c 105 70
       
 26223 -169c8 d 105 70
       
 26224 -169d5 1 105 70
       
 26225 -169d6 c 105 70
       
 26226 -169e2 d 105 70
       
 26227 -169ef 1 105 70
       
 26228 -169f0 c 67 70
       
 26229 -169fc 2 67 70
       
 26230 -169fe c 99 70
       
 26231 -16a0a 14 100 70
       
 26232 -16a1e c 99 70
       
 26233 -16a2a 14 100 70
       
 26234 -16a3e c 129 70
       
 26235 -16a4a 30 131 70
       
 26236 -16a7a c 65 70
       
 26237 -16a86 2 65 70
       
 26238 -16a88 c 72 70
       
 26239 -16a94 2 72 70
       
 26240 -16a96 c 97 70
       
 26241 -16aa2 d 97 70
       
 26242 -16aaf 1 97 70
       
 26243 -16ab0 c 105 70
       
 26244 -16abc d 105 70
       
 26245 -16ac9 1 105 70
       
 26246 -16aca c 105 70
       
 26247 -16ad6 d 105 70
       
 26248 -16ae3 1 105 70
       
 26249 -16ae4 c 67 70
       
 26250 -16af0 2 67 70
       
 26251 -16af2 c 99 70
       
 26252 -16afe 14 100 70
       
 26253 -16b12 c 99 70
       
 26254 -16b1e 14 100 70
       
 26255 +1696e 17 606 66
       
 26256 +16985 1 606 66
       
 26257 +16986 c 65 68
       
 26258 +16992 2 65 68
       
 26259 +16994 c 72 68
       
 26260 +169a0 2 72 68
       
 26261 +169a2 c 97 69
       
 26262 +169ae d 97 69
       
 26263 +169bb 1 97 69
       
 26264 +169bc c 105 69
       
 26265 +169c8 d 105 69
       
 26266 +169d5 1 105 69
       
 26267 +169d6 c 105 69
       
 26268 +169e2 d 105 69
       
 26269 +169ef 1 105 69
       
 26270 +169f0 c 67 68
       
 26271 +169fc 2 67 68
       
 26272 +169fe c 99 69
       
 26273 +16a0a 14 100 69
       
 26274 +16a1e c 99 69
       
 26275 +16a2a 14 100 69
       
 26276 +16a3e c 129 62
       
 26277 +16a4a 30 131 62
       
 26278 +16a7a c 65 68
       
 26279 +16a86 2 65 68
       
 26280 +16a88 c 72 68
       
 26281 +16a94 2 72 68
       
 26282 +16a96 c 97 69
       
 26283 +16aa2 d 97 69
       
 26284 +16aaf 1 97 69
       
 26285 +16ab0 c 105 69
       
 26286 +16abc d 105 69
       
 26287 +16ac9 1 105 69
       
 26288 +16aca c 105 69
       
 26289 +16ad6 d 105 69
       
 26290 +16ae3 1 105 69
       
 26291 +16ae4 c 67 68
       
 26292 +16af0 2 67 68
       
 26293 +16af2 c 99 69
       
 26294 +16afe 14 100 69
       
 26295 +16b12 c 99 69
       
 26296 +16b1e 14 100 69
       
 26297 +FUNC 16b32 2b 0 std::_Vector_base<unsigned char, std::allocator<unsigned char> >::get_allocator() const
       
 26298  16b32 10 93 71
       
 26299  16b42 1b 94 71
       
 26300  16b5d 1 94 71
       
 26301 -16b5e c 613 72
       
 26302  16b6a 7 614 72
       
 26303  16b71 1 614 72
       
 26304 -16b72 c 80 72
       
 26305 -16b7e d 80 72
       
 26306 -16b8b 1 80 72
       
 26307 -16b8c c 107 72
       
 26308 -16b98 2 107 72
       
 26309 +16b72 c 80 71
       
 26310 +16b7e d 80 71
       
 26311 +16b8b 1 80 71
       
 26312 +16b98 2 107 68
       
 26313 +FUNC 16b9a 2d 0 void std::_Destroy<unsigned char*, std::allocator<unsigned char> >(unsigned char*, unsigned char*, std::allocator<unsigned char>)
       
 26314  16b9a c 171 73
       
 26315  16ba6 2 173 73
       
 26316  16ba8 12 174 73
       
 26317  16bba b 173 73
       
 26318  16bc5 2 174 73
       
 26319  16bc7 1 174 73
       
 26320 -16bc8 c 84 73
       
 26321 -16bd4 2f 85 73
       
 26322 -16c03 2 86 73
       
 26323 -16c05 1 86 73
       
 26324 -16c06 c 96 73
       
 26325 -16c12 12 97 73
       
 26326 -16c24 2 98 73
       
 26327 +16bc8 c 84 71
       
 26328 +16bd4 2f 85 71
       
 26329 +16c03 2 86 71
       
 26330 +16c05 1 86 71
       
 26331 +16c06 c 96 71
       
 26332 +16c12 12 97 71
       
 26333 +16c24 2 98 71
       
 26334 +FUNC 16c26 1f 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_init()
       
 26335  16c26 c 338 73
       
 26336 -16c32 8 340 73
       
 26337 -16c3a b 341 73
       
 26338 -16c45 1 341 73
       
 26339 -16c46 c 105 73
       
 26340 -16c52 d 105 73
       
 26341 -16c5f 1 105 73
       
 26342 -16c60 c 125 73
       
 26343 -16c6c a 126 73
       
 26344 +16c32 8 340 66
       
 26345 +16c3a b 341 66
       
 26346 +16c45 1 341 66
       
 26347 +16c46 c 105 69
       
 26348 +16c52 d 105 69
       
 26349 +16c5f 1 105 69
       
 26350 +16c60 c 125 66
       
 26351 +16c6c a 126 66
       
 26352 +FUNC 16c76 25 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::begin()
       
 26353  16c76 c 579 73
       
 26354 -16c82 19 580 73
       
 26355 -16c9b 1 580 73
       
 26356 +16c82 19 580 66
       
 26357 +16c9b 1 580 66
       
 26358 +FUNC 16c9c 23 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::end()
       
 26359  16c9c c 597 73
       
 26360 -16ca8 17 597 73
       
 26361 -16cbf 1 597 73
       
 26362 -16cc0 c 603 73
       
 26363 -16ccc c 603 73
       
 26364 +16ca8 17 597 66
       
 26365 +16cbf 1 597 66
       
 26366 +16cc0 c 603 72
       
 26367 +16ccc c 603 72
       
 26368 +FUNC 16cd8 2b 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::begin() const
       
 26369  16cd8 c 342 73
       
 26370 -16ce4 1f 343 73
       
 26371 -16d03 1 343 73
       
 26372 +16ce4 1f 343 71
       
 26373 +16d03 1 343 71
       
 26374 +FUNC 16d04 2c 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::end() const
       
 26375  16d04 c 360 73
       
 26376 -16d10 20 361 73
       
 26377 -16d30 c 665 73
       
 26378 -16d3c 5 666 73
       
 26379 -16d41 1 666 73
       
 26380 -16d42 d 758 73
       
 26381 -16d4f 31 759 73
       
 26382 +16d10 20 361 71
       
 26383 +16d3c 5 666 72
       
 26384 +16d41 1 666 72
       
 26385 +16d4f 31 759 72
       
 26386 +FUNC 16d80 3c 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::size() const
       
 26387  16d80 c 402 73
       
 26388 -16d8c 30 403 73
       
 26389 -16dbc c 603 73
       
 26390 -16dc8 c 603 73
       
 26391 +16d8c 30 403 71
       
 26392 +16dbc c 603 72
       
 26393 +16dc8 c 603 72
       
 26394 +FUNC 16dd4 23 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::begin()
       
 26395  16dd4 c 333 73
       
 26396 -16de0 17 334 73
       
 26397 -16df7 1 334 73
       
 26398 -16df8 c 653 73
       
 26399 -16e04 33 654 73
       
 26400 -16e37 1 654 73
       
 26401 +16de0 17 334 71
       
 26402 +16df7 1 334 71
       
 26403 +16e04 33 654 72
       
 26404 +16e37 1 654 72
       
 26405 +FUNC 16e38 26 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::end()
       
 26406  16e38 c 351 73
       
 26407 -16e44 1a 352 73
       
 26408 -16e5e c 613 73
       
 26409 -16e6a 7 614 73
       
 26410 -16e71 1 614 73
       
 26411 +16e44 1a 352 71
       
 26412 +16e6a 7 614 72
       
 26413 +16e71 1 614 72
       
 26414 +FUNC 16e72 42 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::operator[](unsigned long)
       
 26415  16e72 c 494 73
       
 26416 -16e7e 36 495 73
       
 26417 +16e7e 36 495 71
       
 26418 +FUNC 16eb4 13 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::max_size() const
       
 26419  16eb4 c 407 73
       
 26420 -16ec0 7 408 73
       
 26421 -16ec7 1 408 73
       
 26422 -16ec8 c 665 73
       
 26423 -16ed4 5 666 73
       
 26424 -16ed9 1 666 73
       
 26425 -16eda c 621 73
       
 26426 -16ee6 d 623 73
       
 26427 -16ef3 5 624 73
       
 26428 -16ef8 c 382 73
       
 26429 -16f04 d 382 73
       
 26430 -16f11 1 382 73
       
 26431 +16ec0 7 408 71
       
 26432 +16ec7 1 408 71
       
 26433 +16ed4 5 666 72
       
 26434 +16ed9 1 666 72
       
 26435 +16ee6 d 623 72
       
 26436 +16ef3 5 624 72
       
 26437 +16ef8 c 382 62
       
 26438 +16f04 d 382 62
       
 26439 +16f11 1 382 62
       
 26440 +FUNC 16f12 2b 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::get_allocator() const
       
 26441  16f12 10 360 73
       
 26442 -16f22 1b 361 73
       
 26443 -16f3d 1 361 73
       
 26444 +16f22 1b 361 62
       
 26445 +16f3d 1 361 62
       
 26446 +FUNC 16f3e 2d 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::get_allocator() const
       
 26447  16f3e 10 764 73
       
 26448 -16f4e 1d 765 73
       
 26449 -16f6b 1 765 73
       
 26450 +16f4e 1d 765 62
       
 26451 +16f6b 1 765 62
       
 26452 +FUNC 16f6c 13 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::operator*() const
       
 26453  16f6c c 134 73
       
 26454 -16f78 7 135 73
       
 26455 -16f7f 1 135 73
       
 26456 -16f80 c 107 73
       
 26457 -16f8c 2 107 73
       
 26458 -16f8e c 129 73
       
 26459 -16f9a 30 131 73
       
 26460 +16f78 7 135 62
       
 26461 +16f7f 1 135 62
       
 26462 +16f8c 2 107 68
       
 26463 +16f8e c 129 62
       
 26464 +16f9a 30 131 62
       
 26465 +FUNC 16fca 2c 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::end() const
       
 26466  16fca 10 799 73
       
 26467 -16fda 1c 800 73
       
 26468 +16fda 1c 800 62
       
 26469 +FUNC 16ff6 2c 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::begin() const
       
 26470  16ff6 10 781 73
       
 26471 -17006 1c 782 73
       
 26472 +17006 1c 782 62
       
 26473 +FUNC 17022 2e 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::end()
       
 26474  17022 10 790 73
       
 26475 -17032 1e 791 73
       
 26476 +17032 1e 791 62
       
 26477 +FUNC 17050 3c 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_range_check(unsigned long) const
       
 26478  17050 13 515 73
       
 26479 -17063 15 517 73
       
 26480 -17078 14 518 73
       
 26481 +17063 15 517 71
       
 26482 +17078 14 518 71
       
 26483 +FUNC 1708c 32 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::at(unsigned long)
       
 26484  1708c c 534 73
       
 26485 -17098 12 536 73
       
 26486 -170aa 14 537 73
       
 26487 -170be c 103 73
       
 26488 -170ca 2e 104 73
       
 26489 -170f8 c 84 73
       
 26490 -17104 2f 85 73
       
 26491 -17133 2 86 73
       
 26492 -17135 1 86 73
       
 26493 -17136 c 96 73
       
 26494 -17142 12 97 73
       
 26495 -17154 2 98 73
       
 26496 -17156 c 603 73
       
 26497 -17162 c 603 73
       
 26498 +17098 12 536 71
       
 26499 +170aa 14 537 71
       
 26500 +170ca 2e 104 68
       
 26501 +170f8 c 84 71
       
 26502 +17104 2f 85 71
       
 26503 +17133 2 86 71
       
 26504 +17135 1 86 71
       
 26505 +17136 c 96 71
       
 26506 +17142 12 97 71
       
 26507 +17154 2 98 71
       
 26508 +17156 c 603 72
       
 26509 +17162 c 603 72
       
 26510 +FUNC 1716e 23 0 std::vector<unsigned char, std::allocator<unsigned char> >::begin()
       
 26511  1716e c 333 73
       
 26512 -1717a 17 334 73
       
 26513 -17191 1 334 73
       
 26514 -17192 c 653 73
       
 26515 -1719e 27 654 73
       
 26516 -171c5 1 654 73
       
 26517 +1717a 17 334 71
       
 26518 +17191 1 334 71
       
 26519 +1719e 27 654 72
       
 26520 +171c5 1 654 72
       
 26521 +FUNC 171c6 42 0 std::vector<unsigned char, std::allocator<unsigned char> >::operator[](unsigned long)
       
 26522  171c6 c 494 73
       
 26523 -171d2 36 495 73
       
 26524 +171d2 36 495 71
       
 26525 +FUNC 17208 26 0 std::vector<unsigned char, std::allocator<unsigned char> >::end()
       
 26526  17208 c 351 73
       
 26527 -17214 1a 352 73
       
 26528 -1722e c 93 73
       
 26529 -1723a d 94 73
       
 26530 -17247 1 94 73
       
 26531 +17214 1a 352 71
       
 26532 +1723a d 94 68
       
 26533 +17247 1 94 68
       
 26534 +FUNC 17248 2f 0 std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_deallocate(unsigned char*, unsigned long)
       
 26535  17248 c 120 73
       
 26536 -17254 6 122 73
       
 26537 -1725a 1d 123 73
       
 26538 -17277 1 123 73
       
 26539 -17278 c 108 73
       
 26540 -17284 3a 109 73
       
 26541 -172be c 188 73
       
 26542 -172ca 12 189 73
       
 26543 -172dc 2 190 73
       
 26544 -172de c 272 73
       
 26545 -172ea 4b 273 73
       
 26546 -17335 1 273 73
       
 26547 +17254 6 122 71
       
 26548 +1725a 1d 123 71
       
 26549 +17277 1 123 71
       
 26550 +17278 c 108 71
       
 26551 +17284 3a 109 71
       
 26552 +172be c 188 71
       
 26553 +172ca 12 189 71
       
 26554 +172dc 2 190 71
       
 26555 +172de c 272 71
       
 26556 +172ea 4b 273 71
       
 26557 +17335 1 273 71
       
 26558  17336 13 62 74
       
 26559  17349 10 62 74
       
 26560  17359 a 63 74
       
 26561  17363 25 64 74
       
 26562  17388 1a 66 74
       
 26563  173a2 13 62 74
       
 26564  173b5 10 62 74
       
 26565  173c5 a 63 74
       
 26566  173cf 25 64 74
       
 26567  173f4 1a 66 74
       
 26568 -1740e c 188 74
       
 26569 -1741a 12 189 74
       
 26570 -1742c 2 190 74
       
 26571 -1742e d 758 74
       
 26572 -1743b 31 759 74
       
 26573 -1746c c 65 74
       
 26574 -17478 2 65 74
       
 26575 -1747a c 103 74
       
 26576 -17486 d 103 74
       
 26577 -17493 1 103 74
       
 26578 +1740e c 188 71
       
 26579 +1741a 12 189 71
       
 26580 +1742c 2 190 71
       
 26581 +1743b 31 759 72
       
 26582 +1746c c 65 68
       
 26583 +17478 2 65 68
       
 26584 +1747a c 103 69
       
 26585 +17486 d 103 69
       
 26586 +17493 1 103 69
       
 26587 +FUNC 17494 2d 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::get_allocator() const
       
 26588  17494 10 570 74
       
 26589 -174a4 1d 571 74
       
 26590 -174c1 1 571 74
       
 26591 -174c2 c 103 74
       
 26592 -174ce 2e 104 74
       
 26593 +174a4 1d 571 66
       
 26594 +174c1 1 571 66
       
 26595 +174ce 2e 104 68
       
 26596 +FUNC 174fc 20 0 std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator!=(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > const&) const
       
 26597  174fc c 172 74
       
 26598 -17508 14 173 74
       
 26599 +17508 14 173 66
       
 26600 +FUNC 1751c 1d 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator++()
       
 26601  1751c c 219 74
       
 26602 -17528 c 221 74
       
 26603 -17534 5 222 74
       
 26604 -17539 1 222 74
       
 26605 +17528 c 221 66
       
 26606 +17534 5 222 66
       
 26607 +17539 1 222 66
       
 26608 +FUNC 1753a 1d 0 std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator++()
       
 26609  1753a c 138 74
       
 26610 -17546 c 140 74
       
 26611 -17552 5 141 74
       
 26612 -17557 1 141 74
       
 26613 +17546 c 140 66
       
 26614 +17552 5 141 66
       
 26615 +17557 1 141 66
       
 26616 +FUNC 17558 16 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator*() const
       
 26617  17558 c 211 74
       
 26618 -17564 a 212 74
       
 26619 +17564 a 212 66
       
 26620 +FUNC 1756e 16 0 std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator*() const
       
 26621  1756e c 130 74
       
 26622 -1757a a 131 74
       
 26623 +1757a a 131 66
       
 26624 +FUNC 17584 20 0 std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >::operator==(std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > const&) const
       
 26625  17584 c 249 74
       
 26626 -17590 14 250 74
       
 26627 +17590 14 250 66
       
 26628 +FUNC 175a4 35 0 bool __gnu_cxx::operator!=<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > const&, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > const&)
       
 26629  175a4 d 699 74
       
 26630 -175b1 28 700 74
       
 26631 -175d9 1 700 74
       
 26632 +175b1 28 700 72
       
 26633 +175d9 1 700 72
       
 26634 +FUNC 175da 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)
       
 26635  175da c 171 74
       
 26636 -175e6 2 173 74
       
 26637 -175e8 1a 174 74
       
 26638 -17602 21 173 74
       
 26639 -17623 2 174 74
       
 26640 -17625 1 174 74
       
 26641 -17626 c 127 74
       
 26642 -17632 29 127 74
       
 26643 -1765b 1 127 74
       
 26644 -1765c c 388 74
       
 26645 -17668 41 389 74
       
 26646 -176a9 2 390 74
       
 26647 -176ab 1 390 74
       
 26648 -176ac c 93 74
       
 26649 -176b8 d 94 74
       
 26650 -176c5 1 94 74
       
 26651 +175e6 2 173 73
       
 26652 +175e8 1a 174 73
       
 26653 +17602 21 173 73
       
 26654 +17623 2 174 73
       
 26655 +17625 1 174 73
       
 26656 +17626 c 127 62
       
 26657 +17632 29 127 62
       
 26658 +1765b 1 127 62
       
 26659 +1765c c 388 62
       
 26660 +17668 41 389 62
       
 26661 +176a9 2 390 62
       
 26662 +176ab 1 390 62
       
 26663 +176b8 d 94 68
       
 26664 +176c5 1 94 68
       
 26665 +FUNC 176c6 20 0 bool std::operator==<unsigned long long, unsigned long long&, unsigned long long*>(std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&)
       
 26666  176c6 c 243 74
       
 26667 -176d2 14 244 74
       
 26668 +176d2 14 244 62
       
 26669 +FUNC 176e6 26 0 bool std::operator!=<unsigned long long, unsigned long long&, unsigned long long*>(std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&)
       
 26670  176e6 c 256 74
       
 26671 -176f2 1a 257 74
       
 26672 +176f2 1a 257 62
       
 26673 +FUNC 1770c 1a 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::_S_buffer_size()
       
 26674  1770c c 106 74
       
 26675 -17718 e 107 74
       
 26676 +17718 e 107 62
       
 26677 +FUNC 17726 3e 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::_M_set_node(unsigned long long**)
       
 26678  17726 d 229 74
       
 26679 -17733 9 231 74
       
 26680 -1773c b 232 74
       
 26681 -17747 1d 233 74
       
 26682 +17733 9 231 62
       
 26683 +1773c b 232 62
       
 26684 +17747 1d 233 62
       
 26685 +FUNC 17764 50 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::operator++()
       
 26686  17764 c 142 74
       
 26687 -17770 d 144 74
       
 26688 -1777d f 145 74
       
 26689 -1778c 18 147 74
       
 26690 -177a4 b 148 74
       
 26691 -177af 5 150 74
       
 26692 +17770 d 144 62
       
 26693 +1777d f 145 62
       
 26694 +1778c 18 147 62
       
 26695 +177a4 b 148 62
       
 26696 +177af 5 150 62
       
 26697 +FUNC 177b4 4b 0 void std::_Destroy<std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, std::allocator<unsigned long long> >(std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, std::allocator<unsigned long long>)
       
 26698  177b4 c 171 74
       
 26699 -177c0 2 173 74
       
 26700 -177c2 1a 174 74
       
 26701 -177dc 21 173 74
       
 26702 -177fd 2 174 74
       
 26703 -177ff 1 174 74
       
 26704 +177c0 2 173 73
       
 26705 +177c2 1a 174 73
       
 26706 +177dc 21 173 73
       
 26707 +177fd 2 174 73
       
 26708 +177ff 1 174 73
       
 26709 +FUNC 17800 50 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::operator--()
       
 26710  17800 c 162 74
       
 26711 -1780c f 164 74
       
 26712 -1781b 18 166 74
       
 26713 -17833 b 167 74
       
 26714 -1783e d 169 74
       
 26715 -1784b 5 170 74
       
 26716 +1780c f 164 62
       
 26717 +1781b 18 166 62
       
 26718 +17833 b 167 62
       
 26719 +1783e d 169 62
       
 26720 +1784b 5 170 62
       
 26721 +FUNC 17850 39 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::back()
       
 26722  17850 c 988 74
       
 26723 -1785c 15 990 74
       
 26724 -17871 b 991 74
       
 26725 -1787c d 992 74
       
 26726 -17889 1 992 74
       
 26727 +1785c 15 990 62
       
 26728 +17871 b 991 62
       
 26729 +1787c d 992 62
       
 26730 +17889 1 992 62
       
 26731 +FUNC 1788a 19 0 std::stack<unsigned long long, std::deque<unsigned long long, std::allocator<unsigned long long> > >::top()
       
 26732  1788a c 163 75
       
 26733  17896 d 166 75
       
 26734  178a3 1 166 75
       
 26735 +FUNC 178a4 66 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>::difference_type std::operator-<unsigned long long, unsigned long long&, unsigned long long*, unsigned long long&, unsigned long long*>(std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> const&)
       
 26736  178a4 d 328 75
       
 26737 -178b1 59 333 75
       
 26738 +178b1 59 333 62
       
 26739 +FUNC 1790a 26 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::size() const
       
 26740  1790a c 840 75
       
 26741 -17916 1a 841 75
       
 26742 -17930 c 661 75
       
 26743 -1793c 36 662 75
       
 26744 -17972 c 649 75
       
 26745 -1797e 23 650 75
       
 26746 -179a1 1 650 75
       
 26747 -179a2 c 67 75
       
 26748 -179ae 2 67 75
       
 26749 -179b0 c 99 75
       
 26750 -179bc 14 100 75
       
 26751 -179d0 c 303 75
       
 26752 -179dc 12 304 75
       
 26753 -179ee 2 305 75
       
 26754 -179f0 c 326 75
       
 26755 -179fc 2f 327 75
       
 26756 -17a2b d 328 75
       
 26757 -17a38 c 457 75
       
 26758 -17a44 14 458 75
       
 26759 -17a58 c 211 75
       
 26760 -17a64 2d 211 75
       
 26761 -17a91 1 211 75
       
 26762 -17a92 c 97 75
       
 26763 -17a9e 7 98 75
       
 26764 -17aa5 1 98 75
       
 26765 -17aa6 c 83 75
       
 26766 -17ab2 1d 85 75
       
 26767 -17acf 5 86 75
       
 26768 -17ad4 17 88 75
       
 26769 -17aeb 1 88 75
       
 26770 +17916 1a 841 62
       
 26771 +1793c 36 662 72
       
 26772 +1797e 23 650 72
       
 26773 +179a1 1 650 72
       
 26774 +179a2 c 67 68
       
 26775 +179ae 2 67 68
       
 26776 +179b0 c 99 69
       
 26777 +179bc 14 100 69
       
 26778 +179d0 c 303 66
       
 26779 +179dc 12 304 66
       
 26780 +179ee 2 305 66
       
 26781 +179f0 c 326 66
       
 26782 +179fc 2f 327 66
       
 26783 +17a2b d 328 66
       
 26784 +17a38 c 457 66
       
 26785 +17a44 14 458 66
       
 26786 +17a58 c 211 74
       
 26787 +17a64 2d 211 74
       
 26788 +17a91 1 211 74
       
 26789 +17a9e 7 98 68
       
 26790 +17aa5 1 98 68
       
 26791 +17ab2 1d 85 68
       
 26792 +17acf 5 86 68
       
 26793 +17ad4 17 88 68
       
 26794 +17aeb 1 88 68
       
 26795 +FUNC 17aec 2a 0 std::_Vector_base<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_allocate(unsigned long)
       
 26796  17aec c 116 75
       
 26797 -17af8 1e 117 75
       
 26798 -17b16 c 93 75
       
 26799 -17b22 d 94 75
       
 26800 -17b2f 1 94 75
       
 26801 +17af8 1e 117 71
       
 26802 +17b22 d 94 68
       
 26803 +17b2f 1 94 68
       
 26804 +FUNC 17b30 34 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_deallocate_node(unsigned long long*)
       
 26805  17b30 c 402 75
       
 26806 -17b3c 28 403 75
       
 26807 +17b3c 28 403 62
       
 26808 +FUNC 17b64 38 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_destroy_nodes(unsigned long long**, unsigned long long**)
       
 26809  17b64 c 504 75
       
 26810 -17b70 8 506 75
       
 26811 -17b78 14 507 75
       
 26812 -17b8c e 506 75
       
 26813 -17b9a 2 507 75
       
 26814 +17b70 8 506 62
       
 26815 +17b78 14 507 62
       
 26816 +17b8c e 506 62
       
 26817 +17b9a 2 507 62
       
 26818 +FUNC 17b9c 62 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::_M_pop_back_aux()
       
 26819  17b9c c 391 76
       
 26820  17ba8 15 393 76
       
 26821  17bbd 1b 394 76
       
 26822  17bd8 f 395 76
       
 26823  17be7 17 396 76
       
 26824 +FUNC 17bfe 4f 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::pop_back()
       
 26825  17bfe c 1081 76
       
 26826 -17c0a 10 1083 76
       
 26827 -17c1a f 1086 76
       
 26828 -17c29 17 1087 76
       
 26829 -17c40 d 1090 76
       
 26830 -17c4d 1 1090 76
       
 26831 +17c0a 10 1083 62
       
 26832 +17c1a f 1086 62
       
 26833 +17c29 17 1087 62
       
 26834 +17c40 d 1090 62
       
 26835 +17c4d 1 1090 62
       
 26836 +FUNC 17c4e 19 0 std::stack<unsigned long long, std::deque<unsigned long long, std::allocator<unsigned long long> > >::pop()
       
 26837  17c4e c 205 76
       
 26838 -17c5a d 208 76
       
 26839 -17c67 1 208 76
       
 26840 -17c68 c 72 76
       
 26841 -17c74 2 72 76
       
 26842 -17c76 c 105 76
       
 26843 -17c82 d 105 76
       
 26844 -17c8f 1 105 76
       
 26845 -17c90 c 603 76
       
 26846 -17c9c c 603 76
       
 26847 +17c5a d 208 75
       
 26848 +17c67 1 208 75
       
 26849 +17c68 c 72 68
       
 26850 +17c74 2 72 68
       
 26851 +17c76 c 105 69
       
 26852 +17c82 d 105 69
       
 26853 +17c8f 1 105 69
       
 26854 +17c90 c 603 72
       
 26855 +17c9c c 603 72
       
 26856 +FUNC 17ca8 2b 0 std::vector<unsigned char, std::allocator<unsigned char> >::begin() const
       
 26857  17ca8 c 342 76
       
 26858 -17cb4 1f 343 76
       
 26859 -17cd3 1 343 76
       
 26860 +17cb4 1f 343 71
       
 26861 +17cd3 1 343 71
       
 26862 +FUNC 17cd4 2c 0 std::vector<unsigned char, std::allocator<unsigned char> >::end() const
       
 26863  17cd4 c 360 76
       
 26864 -17ce0 20 361 76
       
 26865 -17d00 c 665 76
       
 26866 -17d0c 5 666 76
       
 26867 -17d11 1 666 76
       
 26868 -17d12 d 758 76
       
 26869 -17d1f 28 759 76
       
 26870 -17d47 1 759 76
       
 26871 +17ce0 20 361 71
       
 26872 +17d0c 5 666 72
       
 26873 +17d11 1 666 72
       
 26874 +17d1f 28 759 72
       
 26875 +17d47 1 759 72
       
 26876 +FUNC 17d48 3c 0 std::vector<unsigned char, std::allocator<unsigned char> >::size() const
       
 26877  17d48 c 402 76
       
 26878 -17d54 30 403 76
       
 26879 -17d84 c 621 76
       
 26880 -17d90 d 623 76
       
 26881 -17d9d 5 624 76
       
 26882 -17da2 c 665 76
       
 26883 -17dae 5 666 76
       
 26884 -17db3 1 666 76
       
 26885 +17d54 30 403 71
       
 26886 +17d90 d 623 72
       
 26887 +17d9d 5 624 72
       
 26888 +17dae 5 666 72
       
 26889 +17db3 1 666 72
       
 26890 +FUNC 17db4 35 0 bool __gnu_cxx::operator!=<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > const&, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > const&)
       
 26891  17db4 d 699 76
       
 26892 -17dc1 28 700 76
       
 26893 -17de9 1 700 76
       
 26894 +17dc1 28 700 72
       
 26895 +17de9 1 700 72
       
 26896 +FUNC 17dea 4b 0 void std::_Destroy<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::allocator<unsigned char> >(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, std::allocator<unsigned char>)
       
 26897  17dea c 171 76
       
 26898 -17df6 2 173 76
       
 26899 -17df8 1a 174 76
       
 26900 -17e12 21 173 76
       
 26901 -17e33 2 174 76
       
 26902 -17e35 1 174 76
       
 26903 -17e36 d 758 76
       
 26904 -17e43 28 759 76
       
 26905 -17e6b 1 759 76
       
 26906 -17e6c c 661 76
       
 26907 -17e78 2a 662 76
       
 26908 +17df6 2 173 73
       
 26909 +17df8 1a 174 73
       
 26910 +17e12 21 173 73
       
 26911 +17e33 2 174 73
       
 26912 +17e35 1 174 73
       
 26913 +17e43 28 759 72
       
 26914 +17e6b 1 759 72
       
 26915 +17e78 2a 662 72
       
 26916 +FUNC 17ea2 13 0 std::vector<unsigned char, std::allocator<unsigned char> >::max_size() const
       
 26917  17ea2 c 407 76
       
 26918 -17eae 7 408 76
       
 26919 -17eb5 1 408 76
       
 26920 -17eb6 c 649 76
       
 26921 -17ec2 16 650 76
       
 26922 -17ed8 c 97 76
       
 26923 -17ee4 7 98 76
       
 26924 -17eeb 1 98 76
       
 26925 -17eec c 83 76
       
 26926 -17ef8 1d 85 76
       
 26927 -17f15 5 86 76
       
 26928 -17f1a 10 88 76
       
 26929 +17eae 7 408 71
       
 26930 +17eb5 1 408 71
       
 26931 +17ec2 16 650 72
       
 26932 +17ee4 7 98 68
       
 26933 +17eeb 1 98 68
       
 26934 +17ef8 1d 85 68
       
 26935 +17f15 5 86 68
       
 26936 +17f1a 10 88 68
       
 26937 +FUNC 17f2a 29 0 std::_List_base<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_get_node()
       
 26938  17f2a c 311 76
       
 26939 -17f36 1d 312 76
       
 26940 -17f53 1 312 76
       
 26941 +17f36 1d 312 66
       
 26942 +17f53 1 312 66
       
 26943 +FUNC 17f54 5f 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_create_node(std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> const&)
       
 26944  17f54 d 435 76
       
 26945 -17f61 e 437 76
       
 26946 -17f6f 3c 440 76
       
 26947 -17fab 8 447 76
       
 26948 -17fb3 1 447 76
       
 26949 +17f61 e 437 66
       
 26950 +17f6f 3c 440 66
       
 26951 +17fab 8 447 66
       
 26952 +17fb3 1 447 66
       
 26953 +FUNC 17fb4 35 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_insert(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> const&)
       
 26954  17fb4 c 1149 76
       
 26955 -17fc0 15 1151 76
       
 26956 -17fd5 14 1152 76
       
 26957 -17fe9 1 1152 76
       
 26958 -FUNC 17fea 52 0 _M_insert_dispatch<std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >
       
 26959 -17fea c 1126 76
       
 26960 -17ff6 2 1128 76
       
 26961 -17ff8 21 1129 76
       
 26962 -18019 21 1128 76
       
 26963 -1803a 2 1129 76
       
 26964 -FUNC 1803c 36 0 insert<std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >
       
 26965 -1803c c 838 76
       
 26966 -18048 2a 842 76
       
 26967 -18072 e 491 76
       
 26968 -18080 32 492 76
       
 26969 -180b2 64 493 76
       
 26970 -18116 c 211 76
       
 26971 -18122 3d 211 76
       
 26972 -1815f 1 211 76
       
 26973 -18160 d 103 76
       
 26974 -1816d 5c 104 76
       
 26975 -181c9 1 104 76
       
 26976 +17fc0 15 1151 66
       
 26977 +17fd5 14 1152 66
       
 26978 +17fe9 1 1152 66
       
 26979 +FUNC 17fea 52 0 void std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_insert_dispatch<std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, __false_type)
       
 26980 +17fea c 1126 66
       
 26981 +17ff6 2 1128 66
       
 26982 +17ff8 21 1129 66
       
 26983 +18019 21 1128 66
       
 26984 +1803a 2 1129 66
       
 26985 +FUNC 1803c 36 0 void std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::insert<std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_const_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >)
       
 26986 +1803c c 838 66
       
 26987 +18048 2a 842 66
       
 26988 +18072 e 491 66
       
 26989 +18080 32 492 66
       
 26990 +180b2 64 493 66
       
 26991 +18116 c 211 74
       
 26992 +18122 3d 211 74
       
 26993 +1815f 1 211 74
       
 26994 +1816d 5c 104 68
       
 26995 +181c9 1 104 68
       
 26996 +FUNC 181ca 31 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::push_back(std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> const&)
       
 26997  181ca c 772 76
       
 26998 -181d6 25 773 76
       
 26999 -181fb 1 773 76
       
 27000 +181d6 25 773 66
       
 27001 +181fb 1 773 66
       
 27002 +FUNC 181fc 69 0 void std::_Construct<dwarf2reader::CompilationUnit::Abbrev, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27003  181fc d 77 76
       
 27004 -18209 5c 81 76
       
 27005 -18265 1 81 76
       
 27006 -18266 c 97 76
       
 27007 -18272 7 98 76
       
 27008 -18279 1 98 76
       
 27009 -1827a c 83 76
       
 27010 -18286 1d 85 76
       
 27011 -182a3 5 86 76
       
 27012 -182a8 10 88 76
       
 27013 -182b8 c 65 76
       
 27014 -182c4 2 65 76
       
 27015 -182c6 c 103 76
       
 27016 -182d2 d 103 76
       
 27017 -182df 1 103 76
       
 27018 +18209 5c 81 73
       
 27019 +18265 1 81 73
       
 27020 +18272 7 98 68
       
 27021 +18279 1 98 68
       
 27022 +18286 1d 85 68
       
 27023 +182a3 5 86 68
       
 27024 +182a8 10 88 68
       
 27025 +182b8 c 65 68
       
 27026 +182c4 2 65 68
       
 27027 +182c6 c 103 69
       
 27028 +182d2 d 103 69
       
 27029 +182df 1 103 69
       
 27030 +FUNC 182e0 4d 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_get_map_allocator() const
       
 27031  182e0 11 394 76
       
 27032 -182f1 3c 395 76
       
 27033 -1832d 1 395 76
       
 27034 +182f1 3c 395 62
       
 27035 +1832d 1 395 62
       
 27036 +FUNC 1832e 75 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_allocate_map(unsigned long)
       
 27037  1832e d 406 76
       
 27038 -1833b 68 407 76
       
 27039 -183a3 1 407 76
       
 27040 +1833b 68 407 62
       
 27041 +183a3 1 407 62
       
 27042 +FUNC 183a4 47 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_deallocate_map(unsigned long long**, unsigned long)
       
 27043  183a4 c 410 76
       
 27044 -183b0 3b 411 76
       
 27045 -183eb 1 411 76
       
 27046 -183ec c 424 76
       
 27047 -183f8 9 426 76
       
 27048 -18401 22 428 76
       
 27049 -18423 2b 430 76
       
 27050 -1844e c 714 76
       
 27051 -1845a 70 715 76
       
 27052 -184ca c 111 76
       
 27053 -184d6 d 111 76
       
 27054 -184e3 1 111 76
       
 27055 -184e4 c 259 76
       
 27056 -184f0 26 259 76
       
 27057 -18516 c 97 76
       
 27058 -18522 7 98 76
       
 27059 -18529 1 98 76
       
 27060 -1852a c 83 76
       
 27061 -18536 1d 85 76
       
 27062 -18553 5 86 76
       
 27063 -18558 10 88 76
       
 27064 +183b0 3b 411 62
       
 27065 +183eb 1 411 62
       
 27066 +183ec c 424 62
       
 27067 +183f8 9 426 62
       
 27068 +18401 22 428 62
       
 27069 +18423 2b 430 62
       
 27070 +1844e c 714 62
       
 27071 +1845a 70 715 62
       
 27072 +184ca c 111 75
       
 27073 +184d6 d 111 75
       
 27074 +184e3 1 111 75
       
 27075 +184e4 c 259 67
       
 27076 +184f0 26 259 67
       
 27077 +18522 7 98 68
       
 27078 +18529 1 98 68
       
 27079 +18536 1d 85 68
       
 27080 +18553 5 86 68
       
 27081 +18558 10 88 68
       
 27082 +FUNC 18568 33 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_allocate_node()
       
 27083  18568 c 398 76
       
 27084 -18574 27 399 76
       
 27085 -1859b 1 399 76
       
 27086 +18574 27 399 62
       
 27087 +1859b 1 399 62
       
 27088 +FUNC 1859c 82 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_create_nodes(unsigned long long**, unsigned long long**)
       
 27089  1859c d 486 76
       
 27090 -185a9 8 491 76
       
 27091 -185b1 12 492 76
       
 27092 -185c3 13 491 76
       
 27093 -185d6 b 494 76
       
 27094 -185e1 19 496 76
       
 27095 -185fa b 497 76
       
 27096 -18605 13 494 76
       
 27097 -18618 6 497 76
       
 27098 +185a9 8 491 62
       
 27099 +185b1 12 492 62
       
 27100 +185c3 13 491 62
       
 27101 +185d6 b 494 62
       
 27102 +185e1 19 496 62
       
 27103 +185fa b 497 62
       
 27104 +18605 13 494 62
       
 27105 +18618 6 497 62
       
 27106 +FUNC 1861e 17b 0 std::_Deque_base<unsigned long long, std::allocator<unsigned long long> >::_M_initialize_map(unsigned long)
       
 27107  1861e d 447 76
       
 27108 -1862b 1e 450 76
       
 27109 -18649 2a 452 76
       
 27110 -18673 1c 454 76
       
 27111 -1868f 19 462 76
       
 27112 -186a8 c 463 76
       
 27113 -186b4 1e 466 76
       
 27114 -186d2 b 467 76
       
 27115 -186dd 1e 469 76
       
 27116 -186fb 9 470 76
       
 27117 -18704 a 471 76
       
 27118 -1870e b 472 76
       
 27119 -18719 13 467 76
       
 27120 -1872c 15 475 76
       
 27121 -18741 18 476 76
       
 27122 -18759 c 477 76
       
 27123 -18765 34 478 76
       
 27124 -18799 1 478 76
       
 27125 -1879a d 366 76
       
 27126 -187a7 12 367 76
       
 27127 -187b9 39 368 76
       
 27128 -187f2 c 645 76
       
 27129 -187fe 1c 646 76
       
 27130 -FUNC 1881a 4d 0 fill<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char>
       
 27131 -1881a c 539 76
       
 27132 -18826 9 541 76
       
 27133 -1882f 2 542 76
       
 27134 -18831 13 543 76
       
 27135 -18844 21 542 76
       
 27136 -18865 2 543 76
       
 27137 -18867 1 543 76
       
 27138 +1862b 1e 450 62
       
 27139 +18649 2a 452 62
       
 27140 +18673 1c 454 62
       
 27141 +1868f 19 462 62
       
 27142 +186a8 c 463 62
       
 27143 +186b4 1e 466 62
       
 27144 +186d2 b 467 62
       
 27145 +186dd 1e 469 62
       
 27146 +186fb 9 470 62
       
 27147 +18704 a 471 62
       
 27148 +1870e b 472 62
       
 27149 +18719 13 467 62
       
 27150 +1872c 15 475 62
       
 27151 +18741 18 476 62
       
 27152 +18759 c 477 62
       
 27153 +18765 34 478 62
       
 27154 +18799 1 478 62
       
 27155 +1879a d 366 62
       
 27156 +187a7 12 367 62
       
 27157 +187b9 39 368 62
       
 27158 +187f2 c 645 62
       
 27159 +187fe 1c 646 62
       
 27160 +FUNC 1881a 4d 0 void std::__fill<true>::fill<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char const&)
       
 27161 +1881a c 539 61
       
 27162 +18826 9 541 61
       
 27163 +1882f 2 542 61
       
 27164 +18831 13 543 61
       
 27165 +18844 21 542 61
       
 27166 +18865 2 543 61
       
 27167 +18867 1 543 61
       
 27168 +FUNC 18868 2b 0 void std::fill<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char const&)
       
 27169  18868 c 560 76
       
 27170 -18874 4 567 76
       
 27171 -18878 1b 568 76
       
 27172 -18893 1 568 76
       
 27173 +18874 4 567 61
       
 27174 +18878 1b 568 61
       
 27175 +18893 1 568 61
       
 27176 +FUNC 18894 6a 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::_M_erase(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >)
       
 27177  18894 d 1157 76
       
 27178 -188a1 b 1159 76
       
 27179 -188ac 6 1160 76
       
 27180 -188b2 35 1161 76
       
 27181 -188e7 17 1162 76
       
 27182 +188a1 b 1159 66
       
 27183 +188ac 6 1160 66
       
 27184 +188b2 35 1161 66
       
 27185 +188e7 17 1162 66
       
 27186 +FUNC 188fe 37 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::erase(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >)
       
 27187  188fe c 95 77
       
 27188  1890a 14 97 77
       
 27189  1891e 12 98 77
       
 27190  18930 5 99 77
       
 27191  18935 1 99 77
       
 27192 +FUNC 18936 3e 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::erase(std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >, std::_List_iterator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> >)
       
 27193  18936 c 883 77
       
 27194 -18942 2 885 77
       
 27195 -18944 15 886 77
       
 27196 -18959 16 885 77
       
 27197 -1896f 5 887 77
       
 27198 +18942 2 885 66
       
 27199 +18944 15 886 66
       
 27200 +18959 16 885 66
       
 27201 +1896f 5 887 66
       
 27202 +FUNC 18974 129 0 std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > >::operator=(std::list<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm>, std::allocator<std::pair<dwarf2reader::DwarfAttribute, dwarf2reader::DwarfForm> > > const&)
       
 27203  18974 e 120 77
       
 27204  18982 c 122 77
       
 27205  1898e e 124 77
       
 27206  1899c e 125 77
       
 27207  189aa e 126 77
       
 27208  189b8 e 127 77
       
 27209  189c6 2 128 77
       
 27210  189c8 20 130 77
       
 27211  189e8 5a 128 77
       
 27212  18a42 16 131 77
       
 27213  18a58 1b 132 77
       
 27214  18a73 20 134 77
       
 27215  18a93 a 136 77
       
 27216  18a9d 1 136 77
       
 27217 -FUNC 18a9e 4c 0 operator=
       
 27218 -18a9e c 0 77
       
 27219 -18aaa 40 211 77
       
 27220 -FUNC 18aea 52 0 copy<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>
       
 27221 -18aea c 280 77
       
 27222 -18af6 1a 283 77
       
 27223 -18b10 12 285 77
       
 27224 -18b22 4 286 77
       
 27225 -18b26 6 287 77
       
 27226 -18b2c b 283 77
       
 27227 -18b37 5 289 77
       
 27228 +FUNC 18a9e 4c 0 dwarf2reader::CompilationUnit::Abbrev::operator=(dwarf2reader::CompilationUnit::Abbrev const&)
       
 27229 +18a9e c 211 77
       
 27230 +18aaa 40 211 74
       
 27231 +FUNC 18aea 52 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy<false, std::random_access_iterator_tag>::copy<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)
       
 27232 +18aea c 280 61
       
 27233 +18af6 1a 283 61
       
 27234 +18b10 12 285 61
       
 27235 +18b22 4 286 61
       
 27236 +18b26 6 287 61
       
 27237 +18b2c b 283 61
       
 27238 +18b37 5 289 61
       
 27239 +FUNC 18b3c 2b 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_aux<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)
       
 27240  18b3c c 307 77
       
 27241 -18b48 4 315 77
       
 27242 -18b4c 1b 317 77
       
 27243 -18b67 1 317 77
       
 27244 -FUNC 18b68 64 0 copy_n<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > >
       
 27245 -18b68 e 352 77
       
 27246 -18b76 56 354 77
       
 27247 -18bcc c 376 77
       
 27248 -18bd8 4 384 77
       
 27249 -18bdc 4 385 77
       
 27250 -18be0 1b 387 77
       
 27251 -18bfb 1 387 77
       
 27252 +18b48 4 315 61
       
 27253 +18b4c 1b 317 61
       
 27254 +18b67 1 317 61
       
 27255 +18b76 56 354 61
       
 27256 +18bd8 4 384 61
       
 27257 +18bdc 4 385 61
       
 27258 +18be0 1b 387 61
       
 27259 +18bfb 1 387 61
       
 27260 +FUNC 18bfc ac 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::erase(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >)
       
 27261  18bfc d 122 78
       
 27262  18c09 26 124 78
       
 27263  18c2f 43 125 78
       
 27264  18c72 2e 126 78
       
 27265  18ca0 8 127 78
       
 27266 -FUNC 18ca8 54 0 copy_b<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>
       
 27267 -18ca8 c 408 78
       
 27268 -18cb4 1a 411 78
       
 27269 -18cce 1e 412 78
       
 27270 -18cec b 411 78
       
 27271 -18cf7 5 413 78
       
 27272 +FUNC 18ca8 54 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_backward<false, std::random_access_iterator_tag>::copy_b<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)
       
 27273 +18ca8 c 408 61
       
 27274 +18cb4 1a 411 61
       
 27275 +18cce 1e 412 61
       
 27276 +18cec b 411 61
       
 27277 +18cf7 5 413 61
       
 27278 +FUNC 18cfc 2b 0 dwarf2reader::CompilationUnit::Abbrev* std::__copy_backward_aux<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)
       
 27279  18cfc c 432 78
       
 27280 -18d08 4 440 78
       
 27281 -18d0c 1b 443 78
       
 27282 -18d27 1 443 78
       
 27283 -FUNC 18d28 64 0 copy_b_n<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > >
       
 27284 -18d28 e 480 78
       
 27285 -18d36 56 482 78
       
 27286 -18d8c c 504 78
       
 27287 -18d98 4 514 78
       
 27288 -18d9c 4 515 78
       
 27289 -18da0 1b 517 78
       
 27290 -18dbb 1 517 78
       
 27291 -FUNC 18dbc 4d 0 fill<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev>
       
 27292 -18dbc c 526 78
       
 27293 -18dc8 2 528 78
       
 27294 -18dca 1c 529 78
       
 27295 -18de6 21 528 78
       
 27296 -18e07 2 529 78
       
 27297 -18e09 1 529 78
       
 27298 +18d08 4 440 61
       
 27299 +18d0c 1b 443 61
       
 27300 +18d27 1 443 61
       
 27301 +18d36 56 482 61
       
 27302 +18d98 4 514 61
       
 27303 +18d9c 4 515 61
       
 27304 +18da0 1b 517 61
       
 27305 +18dbb 1 517 61
       
 27306 +FUNC 18dbc 4d 0 void std::__fill<false>::fill<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27307 +18dbc c 526 61
       
 27308 +18dc8 2 528 61
       
 27309 +18dca 1c 529 61
       
 27310 +18de6 21 528 61
       
 27311 +18e07 2 529 61
       
 27312 +18e09 1 529 61
       
 27313 +FUNC 18e0a 2b 0 void std::fill<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27314  18e0a c 560 78
       
 27315 -18e16 4 567 78
       
 27316 -18e1a 1b 568 78
       
 27317 -18e35 1 568 78
       
 27318 -FUNC 18e36 3f 0 copy<unsigned char>
       
 27319 -18e36 c 298 78
       
 27320 -18e42 22 300 78
       
 27321 -18e64 11 301 78
       
 27322 -18e75 1 301 78
       
 27323 +18e16 4 567 61
       
 27324 +18e1a 1b 568 61
       
 27325 +18e35 1 568 61
       
 27326 +FUNC 18e36 3f 0 unsigned char* std::__copy<true, std::random_access_iterator_tag>::copy<unsigned char>(unsigned char const*, unsigned char const*, unsigned char*)
       
 27327 +18e36 c 298 61
       
 27328 +18e42 22 300 61
       
 27329 +18e64 11 301 61
       
 27330 +18e75 1 301 61
       
 27331 +FUNC 18e76 2b 0 unsigned char* std::__copy_aux<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)
       
 27332  18e76 c 307 78
       
 27333 -18e82 4 315 78
       
 27334 -18e86 1b 317 78
       
 27335 -18ea1 1 317 78
       
 27336 -FUNC 18ea2 64 0 copy_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > >
       
 27337 -18ea2 e 352 78
       
 27338 -18eb0 56 354 78
       
 27339 -18f06 c 376 78
       
 27340 -18f12 4 384 78
       
 27341 -18f16 4 385 78
       
 27342 -18f1a 1b 387 78
       
 27343 -18f35 1 387 78
       
 27344 +18e82 4 315 61
       
 27345 +18e86 1b 317 61
       
 27346 +18ea1 1 317 61
       
 27347 +18eb0 56 354 61
       
 27348 +18f12 4 384 61
       
 27349 +18f16 4 385 61
       
 27350 +18f1a 1b 387 61
       
 27351 +18f35 1 387 61
       
 27352 +FUNC 18f36 a0 0 std::vector<unsigned char, std::allocator<unsigned char> >::erase(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >)
       
 27353  18f36 d 122 78
       
 27354  18f43 26 124 78
       
 27355  18f69 43 125 78
       
 27356  18fac 22 126 78
       
 27357  18fce 8 127 78
       
 27358 -18fd6 c 97 78
       
 27359 -18fe2 7 98 78
       
 27360 -18fe9 1 98 78
       
 27361 -18fea c 83 78
       
 27362 -18ff6 1d 85 78
       
 27363 -19013 5 86 78
       
 27364 -19018 d 88 78
       
 27365 -19025 1 88 78
       
 27366 +18fe2 7 98 68
       
 27367 +18fe9 1 98 68
       
 27368 +18ff6 1d 85 68
       
 27369 +19013 5 86 68
       
 27370 +19018 d 88 68
       
 27371 +19025 1 88 68
       
 27372 +FUNC 19026 2a 0 std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_allocate(unsigned long)
       
 27373  19026 c 116 78
       
 27374 -19032 1e 117 78
       
 27375 -19050 c 73 79
       
 27376 +19032 1e 117 71
       
 27377  1905c 1b 74 79
       
 27378  19077 1 74 79
       
 27379 -19078 c 108 79
       
 27380  19084 23 113 79
       
 27381  190a7 1 113 79
       
 27382 -190a8 c 252 79
       
 27383  190b4 1b 254 79
       
 27384  190cf 1 254 79
       
 27385 +FUNC 190d0 19 0 void std::_Destroy<dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*)
       
 27386  190d0 c 106 79
       
 27387 -190dc d 107 79
       
 27388 -190e9 1 107 79
       
 27389 +190dc d 107 73
       
 27390 +190e9 1 107 73
       
 27391 +FUNC 190ea 44 0 void std::__destroy_aux<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > >(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __false_type)
       
 27392  190ea c 119 79
       
 27393 -190f6 2 121 79
       
 27394 -190f8 13 122 79
       
 27395 -1910b 21 121 79
       
 27396 -1912c 2 122 79
       
 27397 +190f6 2 121 73
       
 27398 +190f8 13 122 73
       
 27399 +1910b 21 121 73
       
 27400 +1912c 2 122 73
       
 27401 +FUNC 1912e 28 0 void std::_Destroy<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > > >(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >)
       
 27402  1912e c 148 79
       
 27403 -1913a 1c 155 79
       
 27404 +1913a 1c 155 73
       
 27405 +FUNC 19156 8d 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, __false_type)
       
 27406  19156 d 188 79
       
 27407  19163 6 190 79
       
 27408  19169 2 193 79
       
 27409  1916b 1c 194 79
       
 27410  19187 1b 193 79
       
 27411  191a2 b 196 79
       
 27412  191ad 12 198 79
       
 27413  191bf b 199 79
       
 27414  191ca 13 196 79
       
 27415  191dd 6 199 79
       
 27416  191e3 1 199 79
       
 27417 +FUNC 191e4 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27418  191e4 c 214 79
       
 27419  191f0 23 218 79
       
 27420  19213 1 218 79
       
 27421 +FUNC 19214 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)
       
 27422  19214 c 308 79
       
 27423  19220 1b 310 79
       
 27424  1923b 1 310 79
       
 27425 -1923c d 80 79
       
 27426  19249 6 82 79
       
 27427  1924f 2 85 79
       
 27428  19251 24 86 79
       
 27429  19275 2c 85 79
       
 27430  192a1 b 87 79
       
 27431  192ac b 89 79
       
 27432  192b7 12 91 79
       
 27433  192c9 b 92 79
       
 27434  192d4 13 89 79
       
 27435  192e7 9 92 79
       
 27436 -192f0 c 108 79
       
 27437  192fc 23 113 79
       
 27438  1931f 1 113 79
       
 27439 -19320 c 252 79
       
 27440  1932c 1b 254 79
       
 27441  19347 1 254 79
       
 27442 +FUNC 19348 409 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_insert_aux(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27443  19348 14 249 79
       
 27444 -1935c 14 251 79
       
 27445 -19370 22 253 79
       
 27446 -19392 f 255 79
       
 27447 -193a1 12 256 79
       
 27448 -193b3 55 257 79
       
 27449 -19408 4b 260 79
       
 27450 -19453 e 264 79
       
 27451 -19461 15 265 79
       
 27452 -19476 e 266 79
       
 27453 -19484 1d 271 79
       
 27454 -194a1 8 272 79
       
 27455 -194a9 e 273 79
       
 27456 -194b7 27 275 79
       
 27457 -194de 6 276 79
       
 27458 -194e4 55 279 79
       
 27459 -19539 25 284 79
       
 27460 -1955e b 285 79
       
 27461 -19569 4f 286 79
       
 27462 -195b8 3 284 79
       
 27463 -195bb 13 279 79
       
 27464 -195ce e 286 79
       
 27465 -195dc 4d 298 79
       
 27466 -19629 36 299 79
       
 27467 -1965f 12 302 79
       
 27468 -19671 13 303 79
       
 27469 -19684 2e 304 79
       
 27470 -196b2 13 286 79
       
 27471 -196c5 b 292 79
       
 27472 -196d0 39 294 79
       
 27473 -19709 23 295 79
       
 27474 -1972c b 296 79
       
 27475 -19737 13 292 79
       
 27476 -1974a 7 304 79
       
 27477 -19751 1 304 79
       
 27478 +1935c 14 251 78
       
 27479 +19370 22 253 78
       
 27480 +19392 f 255 78
       
 27481 +193a1 12 256 78
       
 27482 +193b3 55 257 78
       
 27483 +19408 4b 260 78
       
 27484 +19453 e 264 78
       
 27485 +19461 15 265 78
       
 27486 +19476 e 266 78
       
 27487 +19484 1d 271 78
       
 27488 +194a1 8 272 78
       
 27489 +194a9 e 273 78
       
 27490 +194b7 27 275 78
       
 27491 +194de 6 276 78
       
 27492 +194e4 55 279 78
       
 27493 +19539 25 284 78
       
 27494 +1955e b 285 78
       
 27495 +19569 4f 286 78
       
 27496 +195b8 3 284 78
       
 27497 +195bb 13 279 78
       
 27498 +195ce e 286 78
       
 27499 +195dc 4d 298 78
       
 27500 +19629 36 299 78
       
 27501 +1965f 12 302 78
       
 27502 +19671 13 303 78
       
 27503 +19684 2e 304 78
       
 27504 +196b2 13 286 78
       
 27505 +196c5 b 292 78
       
 27506 +196d0 39 294 78
       
 27507 +19709 23 295 78
       
 27508 +1972c b 296 78
       
 27509 +19737 13 292 78
       
 27510 +1974a 7 304 78
       
 27511 +19751 1 304 78
       
 27512 +FUNC 19752 70 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::push_back(dwarf2reader::CompilationUnit::Abbrev const&)
       
 27513  19752 c 602 79
       
 27514 -1975e 10 604 79
       
 27515 -1976e 1e 606 79
       
 27516 -1978c 11 607 79
       
 27517 -1979d 25 610 79
       
 27518 -FUNC 197c2 50 0 copy_b<unsigned char>
       
 27519 -197c2 d 422 79
       
 27520 -197cf f 424 79
       
 27521 -197de 24 425 79
       
 27522 -19802 10 426 79
       
 27523 +1975e 10 604 71
       
 27524 +1976e 1e 606 71
       
 27525 +1978c 11 607 71
       
 27526 +1979d 25 610 71
       
 27527 +FUNC 197c2 50 0 unsigned char* std::__copy_backward<true, std::random_access_iterator_tag>::copy_b<unsigned char>(unsigned char const*, unsigned char const*, unsigned char*)
       
 27528 +197c2 d 422 61
       
 27529 +197cf f 424 61
       
 27530 +197de 24 425 61
       
 27531 +19802 10 426 61
       
 27532 +FUNC 19812 2b 0 unsigned char* std::__copy_backward_aux<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)
       
 27533  19812 c 432 79
       
 27534 -1981e 4 440 79
       
 27535 -19822 1b 443 79
       
 27536 -1983d 1 443 79
       
 27537 -FUNC 1983e 64 0 copy_b_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > > >
       
 27538 -1983e e 480 79
       
 27539 -1984c 56 482 79
       
 27540 -198a2 c 504 79
       
 27541 -198ae 4 514 79
       
 27542 -198b2 4 515 79
       
 27543 -198b6 1b 517 79
       
 27544 -198d1 1 517 79
       
 27545 +1981e 4 440 61
       
 27546 +19822 1b 443 61
       
 27547 +1983d 1 443 61
       
 27548 +1984c 56 482 61
       
 27549 +198ae 4 514 61
       
 27550 +198b2 4 515 61
       
 27551 +198b6 1b 517 61
       
 27552 +198d1 1 517 61
       
 27553 +FUNC 198d2 32 0 unsigned char* std::fill_n<unsigned long>(unsigned char*, unsigned long, unsigned char const&)
       
 27554  198d2 c 647 79
       
 27555 -198de 1e 649 79
       
 27556 -198fc 8 650 79
       
 27557 +198de 1e 649 61
       
 27558 +198fc 8 650 61
       
 27559 +FUNC 19904 27 0 void std::__uninitialized_fill_n_aux<unsigned char*, unsigned long, unsigned char>(unsigned char*, unsigned long, unsigned char const&, __true_type)
       
 27560  19904 c 182 79
       
 27561  19910 1b 183 79
       
 27562  1992b 1 183 79
       
 27563 +FUNC 1992c 2f 0 void std::uninitialized_fill_n<unsigned char*, unsigned long, unsigned char>(unsigned char*, unsigned long, unsigned char const&)
       
 27564  1992c c 214 79
       
 27565  19938 23 218 79
       
 27566  1995b 1 218 79
       
 27567 +FUNC 1995c 27 0 void std::__uninitialized_fill_n_a<unsigned char*, unsigned long, unsigned char, unsigned char>(unsigned char*, unsigned long, unsigned char const&, std::allocator<unsigned char>)
       
 27568  1995c c 308 79
       
 27569  19968 1b 310 79
       
 27570  19983 1 310 79
       
 27571 +FUNC 19984 27 0 void std::__destroy_aux<dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, __false_type)
       
 27572  19984 c 119 79
       
 27573 -19990 2 121 79
       
 27574 -19992 b 122 79
       
 27575 -1999d c 121 79
       
 27576 -199a9 2 122 79
       
 27577 -199ab 1 122 79
       
 27578 +19990 2 121 73
       
 27579 +19992 b 122 73
       
 27580 +1999d c 121 73
       
 27581 +199a9 2 122 73
       
 27582 +199ab 1 122 73
       
 27583 +FUNC 199ac 28 0 void std::_Destroy<dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)
       
 27584  199ac c 148 79
       
 27585 -199b8 1c 155 79
       
 27586 +199b8 1c 155 73
       
 27587 +FUNC 199d4 88 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_aux<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, __false_type)
       
 27588  199d4 d 80 79
       
 27589  199e1 6 82 79
       
 27590  199e7 2 85 79
       
 27591  199e9 12 86 79
       
 27592  199fb 12 85 79
       
 27593  19a0d b 87 79
       
 27594  19a18 b 89 79
       
 27595  19a23 12 91 79
       
 27596  19a35 b 92 79
       
 27597  19a40 13 89 79
       
 27598  19a53 9 92 79
       
 27599 +FUNC 19a5c 2f 0 dwarf2reader::CompilationUnit::Abbrev* std::uninitialized_copy<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*)
       
 27600  19a5c c 108 79
       
 27601  19a68 23 113 79
       
 27602  19a8b 1 113 79
       
 27603 +FUNC 19a8c 27 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_a<dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev*, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)
       
 27604  19a8c c 252 79
       
 27605  19a98 1b 254 79
       
 27606  19ab3 1 254 79
       
 27607 +FUNC 19ab4 7e 0 void std::__uninitialized_fill_n_aux<dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, __false_type)
       
 27608  19ab4 d 188 79
       
 27609  19ac1 6 190 79
       
 27610  19ac7 2 193 79
       
 27611  19ac9 12 194 79
       
 27612  19adb 16 193 79
       
 27613  19af1 b 196 79
       
 27614  19afc 12 198 79
       
 27615  19b0e b 199 79
       
 27616  19b19 13 196 79
       
 27617  19b2c 6 199 79
       
 27618 +FUNC 19b32 2f 0 void std::uninitialized_fill_n<dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27619  19b32 c 214 79
       
 27620  19b3e 23 218 79
       
 27621  19b61 1 218 79
       
 27622 +FUNC 19b62 27 0 void std::__uninitialized_fill_n_a<dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev, dwarf2reader::CompilationUnit::Abbrev>(dwarf2reader::CompilationUnit::Abbrev*, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)
       
 27623  19b62 c 308 79
       
 27624  19b6e 1b 310 79
       
 27625  19b89 1 310 79
       
 27626 +FUNC 19b8a a5 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_aux<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*, __false_type)
       
 27627  19b8a d 80 79
       
 27628  19b97 6 82 79
       
 27629  19b9d 2 85 79
       
 27630  19b9f 1a 86 79
       
 27631  19bb9 27 85 79
       
 27632  19be0 b 87 79
       
 27633  19beb b 89 79
       
 27634  19bf6 12 91 79
       
 27635  19c08 b 92 79
       
 27636  19c13 13 89 79
       
 27637  19c26 9 92 79
       
 27638  19c2f 1 92 79
       
 27639 +FUNC 19c30 2f 0 dwarf2reader::CompilationUnit::Abbrev* std::uninitialized_copy<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*)
       
 27640  19c30 c 108 79
       
 27641  19c3c 23 113 79
       
 27642  19c5f 1 113 79
       
 27643 +FUNC 19c60 27 0 dwarf2reader::CompilationUnit::Abbrev* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*, dwarf2reader::CompilationUnit::Abbrev>(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, __gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, dwarf2reader::CompilationUnit::Abbrev*, std::allocator<dwarf2reader::CompilationUnit::Abbrev>)
       
 27644  19c60 c 252 79
       
 27645  19c6c 1b 254 79
       
 27646  19c87 1 254 79
       
 27647 +FUNC 19c88 5f8 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::_M_fill_insert(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27648  19c88 15 311 79
       
 27649 -19c9d b 313 79
       
 27650 -19ca8 2a 315 79
       
 27651 -19cd2 12 318 79
       
 27652 -19ce4 23 319 79
       
 27653 -19d07 15 320 79
       
 27654 -19d1c c 321 79
       
 27655 -19d28 5a 323 79
       
 27656 -19d82 1c 327 79
       
 27657 -19d9e 35 328 79
       
 27658 -19dd3 16 323 79
       
 27659 -19de9 30 330 79
       
 27660 -19e19 10 343 79
       
 27661 -19e29 48 334 79
       
 27662 -19e71 21 338 79
       
 27663 -19e92 3d 339 79
       
 27664 -19ecf 13 334 79
       
 27665 -19ee2 b 339 79
       
 27666 -19eed 1c 342 79
       
 27667 -19f09 1e 343 79
       
 27668 -19f27 13 339 79
       
 27669 -19f3a 24 343 79
       
 27670 -19f5e e 348 79
       
 27671 -19f6c 1e 349 79
       
 27672 -19f8a e 350 79
       
 27673 -19f98 1d 353 79
       
 27674 -19fb5 8 354 79
       
 27675 -19fbd e 355 79
       
 27676 -19fcb 27 357 79
       
 27677 -19ff2 6 358 79
       
 27678 -19ff8 4d 361 79
       
 27679 -1a045 40 365 79
       
 27680 -1a085 18 367 79
       
 27681 -1a09d 44 368 79
       
 27682 -1a0e1 3 365 79
       
 27683 -1a0e4 19 361 79
       
 27684 -1a0fd 13 365 79
       
 27685 -1a110 e 368 79
       
 27686 -1a11e 3e 379 79
       
 27687 -1a15c 36 381 79
       
 27688 -1a192 12 384 79
       
 27689 -1a1a4 13 385 79
       
 27690 -1a1b7 2e 386 79
       
 27691 -1a1e5 e 368 79
       
 27692 -1a1f3 b 372 79
       
 27693 -1a1fe 39 374 79
       
 27694 -1a237 23 376 79
       
 27695 -1a25a b 377 79
       
 27696 -1a265 13 372 79
       
 27697 -1a278 8 386 79
       
 27698 +19c9d b 313 78
       
 27699 +19ca8 2a 315 78
       
 27700 +19cd2 12 318 78
       
 27701 +19ce4 23 319 78
       
 27702 +19d07 15 320 78
       
 27703 +19d1c c 321 78
       
 27704 +19d28 5a 323 78
       
 27705 +19d82 1c 327 78
       
 27706 +19d9e 35 328 78
       
 27707 +19dd3 16 323 78
       
 27708 +19de9 30 330 78
       
 27709 +19e19 10 343 78
       
 27710 +19e29 48 334 78
       
 27711 +19e71 21 338 78
       
 27712 +19e92 3d 339 78
       
 27713 +19ecf 13 334 78
       
 27714 +19ee2 b 339 78
       
 27715 +19eed 1c 342 78
       
 27716 +19f09 1e 343 78
       
 27717 +19f27 13 339 78
       
 27718 +19f3a 24 343 78
       
 27719 +19f5e e 348 78
       
 27720 +19f6c 1e 349 78
       
 27721 +19f8a e 350 78
       
 27722 +19f98 1d 353 78
       
 27723 +19fb5 8 354 78
       
 27724 +19fbd e 355 78
       
 27725 +19fcb 27 357 78
       
 27726 +19ff2 6 358 78
       
 27727 +19ff8 4d 361 78
       
 27728 +1a045 40 365 78
       
 27729 +1a085 18 367 78
       
 27730 +1a09d 44 368 78
       
 27731 +1a0e1 3 365 78
       
 27732 +1a0e4 19 361 78
       
 27733 +1a0fd 13 365 78
       
 27734 +1a110 e 368 78
       
 27735 +1a11e 3e 379 78
       
 27736 +1a15c 36 381 78
       
 27737 +1a192 12 384 78
       
 27738 +1a1a4 13 385 78
       
 27739 +1a1b7 2e 386 78
       
 27740 +1a1e5 e 368 78
       
 27741 +1a1f3 b 372 78
       
 27742 +1a1fe 39 374 78
       
 27743 +1a237 23 376 78
       
 27744 +1a25a b 377 78
       
 27745 +1a265 13 372 78
       
 27746 +1a278 8 386 78
       
 27747 +FUNC 1a280 2e 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::insert(__gnu_cxx::__normal_iterator<dwarf2reader::CompilationUnit::Abbrev*, std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> > >, unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27748  1a280 c 657 79
       
 27749 -1a28c 22 658 79
       
 27750 +1a28c 22 658 71
       
 27751 +FUNC 1a2ae ab 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::resize(unsigned long, dwarf2reader::CompilationUnit::Abbrev const&)
       
 27752  1a2ae d 422 79
       
 27753 -1a2bb 15 424 79
       
 27754 -1a2d0 48 425 79
       
 27755 -1a318 41 427 79
       
 27756 -1a359 1 427 79
       
 27757 +1a2bb 15 424 71
       
 27758 +1a2d0 48 425 71
       
 27759 +1a318 41 427 71
       
 27760 +1a359 1 427 71
       
 27761 +FUNC 1a35a 63 0 std::vector<dwarf2reader::CompilationUnit::Abbrev, std::allocator<dwarf2reader::CompilationUnit::Abbrev> >::resize(unsigned long)
       
 27762  1a35a d 441 79
       
 27763 -1a367 56 442 79
       
 27764 -1a3bd 1 442 79
       
 27765 +1a367 56 442 71
       
 27766 +1a3bd 1 442 71
       
 27767 +FUNC 1a3be 13 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::operator*() const
       
 27768  1a3be c 134 79
       
 27769 -1a3ca 7 135 79
       
 27770 -1a3d1 1 135 79
       
 27771 -FUNC 1a3d2 3f 0 copy<uint64*>
       
 27772 -1a3d2 c 298 79
       
 27773 -1a3de 22 300 79
       
 27774 -1a400 11 301 79
       
 27775 -1a411 1 301 79
       
 27776 +1a3ca 7 135 62
       
 27777 +1a3d1 1 135 62
       
 27778 +FUNC 1a3d2 3f 0 unsigned long long** std::__copy<true, std::random_access_iterator_tag>::copy<unsigned long long*>(unsigned long long* const*, unsigned long long* const*, unsigned long long**)
       
 27779 +1a3d2 c 298 61
       
 27780 +1a3de 22 300 61
       
 27781 +1a400 11 301 61
       
 27782 +1a411 1 301 61
       
 27783 +FUNC 1a412 2b 0 unsigned long long** std::__copy_aux<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)
       
 27784  1a412 c 307 79
       
 27785 -1a41e 4 315 79
       
 27786 -1a422 1b 317 79
       
 27787 -1a43d 1 317 79
       
 27788 -FUNC 1a43e 27 0 copy_n<uint64**, uint64**>
       
 27789 -1a43e c 325 79
       
 27790 -1a44a 1b 326 79
       
 27791 -1a465 1 326 79
       
 27792 +1a41e 4 315 61
       
 27793 +1a422 1b 317 61
       
 27794 +1a43d 1 317 61
       
 27795 +FUNC 1a43e 27 0 unsigned long long** std::__copy_normal<false, false>::copy_n<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)
       
 27796 +1a43e c 325 61
       
 27797 +1a44a 1b 326 61
       
 27798 +1a465 1 326 61
       
 27799 +FUNC 1a466 2f 0 unsigned long long** std::copy<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)
       
 27800  1a466 c 376 79
       
 27801 -1a472 4 384 79
       
 27802 -1a476 4 385 79
       
 27803 -1a47a 1b 387 79
       
 27804 -1a495 1 387 79
       
 27805 -FUNC 1a496 60 0 copy_b<uint64*>
       
 27806 -1a496 d 422 79
       
 27807 -1a4a3 12 424 79
       
 27808 -1a4b5 2e 425 79
       
 27809 -1a4e3 13 426 79
       
 27810 +1a472 4 384 61
       
 27811 +1a476 4 385 61
       
 27812 +1a47a 1b 387 61
       
 27813 +1a495 1 387 61
       
 27814 +FUNC 1a496 60 0 unsigned long long** std::__copy_backward<true, std::random_access_iterator_tag>::copy_b<unsigned long long*>(unsigned long long* const*, unsigned long long* const*, unsigned long long**)
       
 27815 +1a496 d 422 61
       
 27816 +1a4a3 12 424 61
       
 27817 +1a4b5 2e 425 61
       
 27818 +1a4e3 13 426 61
       
 27819 +FUNC 1a4f6 2b 0 unsigned long long** std::__copy_backward_aux<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)
       
 27820  1a4f6 c 432 79
       
 27821 -1a502 4 440 79
       
 27822 -1a506 1b 443 79
       
 27823 -1a521 1 443 79
       
 27824 -FUNC 1a522 27 0 copy_b_n<uint64**, uint64**>
       
 27825 -1a522 c 451 79
       
 27826 -1a52e 1b 452 79
       
 27827 -1a549 1 452 79
       
 27828 +1a502 4 440 61
       
 27829 +1a506 1b 443 61
       
 27830 +1a521 1 443 61
       
 27831 +FUNC 1a522 27 0 unsigned long long** std::__copy_backward_normal<false, false>::copy_b_n<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)
       
 27832 +1a522 c 451 61
       
 27833 +1a52e 1b 452 61
       
 27834 +1a549 1 452 61
       
 27835 +FUNC 1a54a 2f 0 unsigned long long** std::copy_backward<unsigned long long**, unsigned long long**>(unsigned long long**, unsigned long long**, unsigned long long**)
       
 27836  1a54a c 504 79
       
 27837 -1a556 4 514 79
       
 27838 -1a55a 4 515 79
       
 27839 -1a55e 1b 517 79
       
 27840 -1a579 1 517 79
       
 27841 +1a556 4 514 61
       
 27842 +1a55a 4 515 61
       
 27843 +1a55e 1b 517 61
       
 27844 +1a579 1 517 61
       
 27845 +FUNC 1a57a 1df 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::_M_reallocate_map(unsigned long, bool)
       
 27846  1a57a 13 723 79
       
 27847 -1a58d 1b 726 79
       
 27848 -1a5a8 9 727 79
       
 27849 -1a5b1 13 730 79
       
 27850 -1a5c4 39 732 79
       
 27851 -1a5fd b 735 79
       
 27852 -1a608 27 736 79
       
 27853 -1a62f 2f 740 79
       
 27854 -1a65e 26 748 79
       
 27855 -1a684 15 750 79
       
 27856 -1a699 36 751 79
       
 27857 -1a6cf 22 753 79
       
 27858 -1a6f1 1e 756 79
       
 27859 -1a70f 8 758 79
       
 27860 -1a717 9 759 79
       
 27861 -1a720 15 762 79
       
 27862 -1a735 24 763 79
       
 27863 -1a759 1 763 79
       
 27864 +1a58d 1b 726 76
       
 27865 +1a5a8 9 727 76
       
 27866 +1a5b1 13 730 76
       
 27867 +1a5c4 39 732 76
       
 27868 +1a5fd b 735 76
       
 27869 +1a608 27 736 76
       
 27870 +1a62f 2f 740 76
       
 27871 +1a65e 26 748 76
       
 27872 +1a684 15 750 76
       
 27873 +1a699 36 751 76
       
 27874 +1a6cf 22 753 76
       
 27875 +1a6f1 1e 756 76
       
 27876 +1a70f 8 758 76
       
 27877 +1a717 9 759 76
       
 27878 +1a720 15 762 76
       
 27879 +1a735 24 763 76
       
 27880 +1a759 1 763 76
       
 27881 +FUNC 1a75a 59 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::_M_reserve_map_at_back(unsigned long)
       
 27882  1a75a e 1443 79
       
 27883 -1a768 2a 1445 79
       
 27884 -1a792 21 1447 79
       
 27885 -1a7b3 1 1447 79
       
 27886 +1a768 2a 1445 62
       
 27887 +1a792 21 1447 62
       
 27888 +1a7b3 1 1447 62
       
 27889 +FUNC 1a7b4 8c 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::_M_push_back_aux(unsigned long long const&)
       
 27890  1a7b4 c 345 79
       
 27891 -1a7c0 e 347 79
       
 27892 -1a7ce 13 348 79
       
 27893 -1a7e1 18 349 79
       
 27894 -1a7f9 1e 352 79
       
 27895 -1a817 1b 353 79
       
 27896 -1a832 c 355 79
       
 27897 -1a83e 2 360 79
       
 27898 +1a7c0 e 347 76
       
 27899 +1a7ce 13 348 76
       
 27900 +1a7e1 18 349 76
       
 27901 +1a7f9 1e 352 76
       
 27902 +1a817 1b 353 76
       
 27903 +1a832 c 355 76
       
 27904 +1a83e 2 360 76
       
 27905 +FUNC 1a840 62 0 std::deque<unsigned long long, std::allocator<unsigned long long> >::push_back(unsigned long long const&)
       
 27906  1a840 c 1039 79
       
 27907 -1a84c 13 1041 79
       
 27908 -1a85f 1e 1044 79
       
 27909 -1a87d 11 1045 79
       
 27910 -1a88e 14 1048 79
       
 27911 +1a84c 13 1041 62
       
 27912 +1a85f 1e 1044 62
       
 27913 +1a87d 11 1045 62
       
 27914 +1a88e 14 1048 62
       
 27915 +FUNC 1a8a2 20 0 std::stack<unsigned long long, std::deque<unsigned long long, std::allocator<unsigned long long> > >::push(unsigned long long const&)
       
 27916  1a8a2 c 190 79
       
 27917 -1a8ae 14 191 79
       
 27918 -FUNC 1a8c2 27 0 copy_n<unsigned char*, unsigned char*>
       
 27919 -1a8c2 c 325 79
       
 27920 -1a8ce 1b 326 79
       
 27921 -1a8e9 1 326 79
       
 27922 +1a8ae 14 191 75
       
 27923 +FUNC 1a8c2 27 0 unsigned char* std::__copy_normal<false, false>::copy_n<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)
       
 27924 +1a8c2 c 325 61
       
 27925 +1a8ce 1b 326 61
       
 27926 +1a8e9 1 326 61
       
 27927 +FUNC 1a8ea 2f 0 unsigned char* std::copy<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)
       
 27928  1a8ea c 376 79
       
 27929 -1a8f6 4 384 79
       
 27930 -1a8fa 4 385 79
       
 27931 -1a8fe 1b 387 79
       
 27932 -1a919 1 387 79
       
 27933 +1a8f6 4 384 61
       
 27934 +1a8fa 4 385 61
       
 27935 +1a8fe 1b 387 61
       
 27936 +1a919 1 387 61
       
 27937 +FUNC 1a91a 27 0 unsigned char* std::__uninitialized_copy_aux<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*, __true_type)
       
 27938  1a91a c 73 79
       
 27939  1a926 1b 74 79
       
 27940  1a941 1 74 79
       
 27941 +FUNC 1a942 2f 0 unsigned char* std::uninitialized_copy<unsigned char*, unsigned char*>(unsigned char*, unsigned char*, unsigned char*)
       
 27942  1a942 c 108 79
       
 27943  1a94e 23 113 79
       
 27944  1a971 1 113 79
       
 27945 +FUNC 1a972 27 0 unsigned char* std::__uninitialized_copy_a<unsigned char*, unsigned char*, unsigned char>(unsigned char*, unsigned char*, unsigned char*, std::allocator<unsigned char>)
       
 27946  1a972 c 252 79
       
 27947  1a97e 1b 254 79
       
 27948  1a999 1 254 79
       
 27949 -FUNC 1a99a 40 0 copy_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>
       
 27950 -1a99a d 334 79
       
 27951 -1a9a7 33 335 79
       
 27952 +FUNC 1a99a 40 0 unsigned char* std::__copy_normal<true, false>::copy_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*)
       
 27953 +1a99a d 334 61
       
 27954 +1a9a7 33 335 61
       
 27955 +FUNC 1a9da 2f 0 unsigned char* std::copy<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*)
       
 27956  1a9da c 376 79
       
 27957 -1a9e6 4 384 79
       
 27958 -1a9ea 4 385 79
       
 27959 -1a9ee 1b 387 79
       
 27960 -1aa09 1 387 79
       
 27961 +1a9e6 4 384 61
       
 27962 +1a9ea 4 385 61
       
 27963 +1a9ee 1b 387 61
       
 27964 +1aa09 1 387 61
       
 27965 +FUNC 1aa0a 27 0 unsigned char* std::__uninitialized_copy_aux<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*, __true_type)
       
 27966  1aa0a c 73 79
       
 27967  1aa16 1b 74 79
       
 27968  1aa31 1 74 79
       
 27969 +FUNC 1aa32 2f 0 unsigned char* std::uninitialized_copy<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*)
       
 27970  1aa32 c 108 79
       
 27971  1aa3e 23 113 79
       
 27972  1aa61 1 113 79
       
 27973 +FUNC 1aa62 27 0 unsigned char* std::__uninitialized_copy_a<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned char*, std::allocator<unsigned char>)
       
 27974  1aa62 c 252 79
       
 27975  1aa6e 1b 254 79
       
 27976  1aa89 1 254 79
       
 27977 -FUNC 1aa8a 45 0 fill_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, long unsigned int, unsigned char>
       
 27978 -1aa8a c 614 79
       
 27979 -1aa96 9 616 79
       
 27980 -1aa9f 2 617 79
       
 27981 -1aaa1 13 618 79
       
 27982 -1aab4 16 617 79
       
 27983 -1aaca 5 619 79
       
 27984 -1aacf 1 619 79
       
 27985 -1aad0 c 636 79
       
 27986 -1aadc 4 641 79
       
 27987 -1aae0 1b 642 79
       
 27988 -1aafb 1 642 79
       
 27989 +1aa96 9 616 61
       
 27990 +1aa9f 2 617 61
       
 27991 +1aaa1 13 618 61
       
 27992 +1aab4 16 617 61
       
 27993 +1aaca 5 619 61
       
 27994 +1aacf 1 619 61
       
 27995 +1aadc 4 641 61
       
 27996 +1aae0 1b 642 61
       
 27997 +1aafb 1 642 61
       
 27998 +FUNC 1aafc 27 0 void std::__uninitialized_fill_n_aux<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&, __true_type)
       
 27999  1aafc c 182 79
       
 28000  1ab08 1b 183 79
       
 28001  1ab23 1 183 79
       
 28002 +FUNC 1ab24 2f 0 void std::uninitialized_fill_n<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&)
       
 28003  1ab24 c 214 79
       
 28004  1ab30 23 218 79
       
 28005  1ab53 1 218 79
       
 28006 +FUNC 1ab54 27 0 void std::__uninitialized_fill_n_a<__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char, unsigned char>(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&, std::allocator<unsigned char>)
       
 28007  1ab54 c 308 79
       
 28008  1ab60 1b 310 79
       
 28009  1ab7b 1 310 79
       
 28010 +FUNC 1ab7c 45a 0 std::vector<unsigned char, std::allocator<unsigned char> >::_M_fill_insert(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&)
       
 28011  1ab7c 14 311 79
       
 28012 -1ab90 b 313 79
       
 28013 -1ab9b 21 315 79
       
 28014 -1abbc 9 318 79
       
 28015 -1abc5 23 319 79
       
 28016 -1abe8 15 320 79
       
 28017 -1abfd c 321 79
       
 28018 -1ac09 4e 323 79
       
 28019 -1ac57 11 327 79
       
 28020 -1ac68 30 328 79
       
 28021 -1ac98 35 330 79
       
 28022 -1accd 48 334 79
       
 28023 -1ad15 14 338 79
       
 28024 -1ad29 43 339 79
       
 28025 -1ad6c 11 342 79
       
 28026 -1ad7d 1e 343 79
       
 28027 -1ad9b e 348 79
       
 28028 -1ada9 1e 349 79
       
 28029 -1adc7 e 350 79
       
 28030 -1add5 1d 353 79
       
 28031 -1adf2 8 354 79
       
 28032 -1adfa e 355 79
       
 28033 -1ae08 27 357 79
       
 28034 -1ae2f 6 358 79
       
 28035 -1ae35 4d 361 79
       
 28036 -1ae82 40 365 79
       
 28037 -1aec2 18 367 79
       
 28038 -1aeda 4d 368 79
       
 28039 -1af27 3e 379 79
       
 28040 -1af65 2d 381 79
       
 28041 -1af92 12 384 79
       
 28042 -1afa4 13 385 79
       
 28043 -1afb7 1f 386 79
       
 28044 +1ab90 b 313 78
       
 28045 +1ab9b 21 315 78
       
 28046 +1abbc 9 318 78
       
 28047 +1abc5 23 319 78
       
 28048 +1abe8 15 320 78
       
 28049 +1abfd c 321 78
       
 28050 +1ac09 4e 323 78
       
 28051 +1ac57 11 327 78
       
 28052 +1ac68 30 328 78
       
 28053 +1ac98 35 330 78
       
 28054 +1accd 48 334 78
       
 28055 +1ad15 14 338 78
       
 28056 +1ad29 43 339 78
       
 28057 +1ad6c 11 342 78
       
 28058 +1ad7d 1e 343 78
       
 28059 +1ad9b e 348 78
       
 28060 +1ada9 1e 349 78
       
 28061 +1adc7 e 350 78
       
 28062 +1add5 1d 353 78
       
 28063 +1adf2 8 354 78
       
 28064 +1adfa e 355 78
       
 28065 +1ae08 27 357 78
       
 28066 +1ae2f 6 358 78
       
 28067 +1ae35 4d 361 78
       
 28068 +1ae82 40 365 78
       
 28069 +1aec2 18 367 78
       
 28070 +1aeda 4d 368 78
       
 28071 +1af27 3e 379 78
       
 28072 +1af65 2d 381 78
       
 28073 +1af92 12 384 78
       
 28074 +1afa4 13 385 78
       
 28075 +1afb7 1f 386 78
       
 28076 +FUNC 1afd6 2e 0 std::vector<unsigned char, std::allocator<unsigned char> >::insert(__gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >, unsigned long, unsigned char const&)
       
 28077  1afd6 c 657 79
       
 28078 -1afe2 22 658 79
       
 28079 +1afe2 22 658 71
       
 28080 +FUNC 1b004 ab 0 std::vector<unsigned char, std::allocator<unsigned char> >::resize(unsigned long, unsigned char const&)
       
 28081  1b004 d 422 79
       
 28082 -1b011 15 424 79
       
 28083 -1b026 48 425 79
       
 28084 -1b06e 41 427 79
       
 28085 -1b0af 1 427 79
       
 28086 +1b011 15 424 71
       
 28087 +1b026 48 425 71
       
 28088 +1b06e 41 427 71
       
 28089 +1b0af 1 427 71
       
 28090 +FUNC 1b0b0 2b 0 std::vector<unsigned char, std::allocator<unsigned char> >::resize(unsigned long)
       
 28091  1b0b0 c 441 79
       
 28092 -1b0bc 1f 442 79
       
 28093 -1b0db 1 442 79
       
 28094 +1b0bc 1f 442 71
       
 28095 +1b0db 1 442 71
       
 28096 +FUNC 1b0dc 1a 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::_S_buffer_size()
       
 28097  1b0dc c 106 79
       
 28098 -1b0e8 e 107 79
       
 28099 +1b0e8 e 107 62
       
 28100 +FUNC 1b0f6 66 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::difference_type std::operator-<unsigned long long, unsigned long long const&, unsigned long long const*, unsigned long long const&, unsigned long long const*>(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*> const&, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*> const&)
       
 28101  1b0f6 d 328 79
       
 28102 -1b103 59 333 79
       
 28103 +1b103 59 333 62
       
 28104 +FUNC 1b15c 3e 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::_M_set_node(unsigned long long**)
       
 28105  1b15c d 229 79
       
 28106 -1b169 9 231 79
       
 28107 -1b172 b 232 79
       
 28108 -1b17d 1d 233 79
       
 28109 +1b169 9 231 62
       
 28110 +1b172 b 232 62
       
 28111 +1b17d 1d 233 62
       
 28112 +FUNC 1b19a 50 0 std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>::operator++()
       
 28113  1b19a c 142 79
       
 28114 -1b1a6 d 144 79
       
 28115 -1b1b3 f 145 79
       
 28116 -1b1c2 18 147 79
       
 28117 -1b1da b 148 79
       
 28118 -1b1e5 5 150 79
       
 28119 -FUNC 1b1ea 84 0 copy<std::_Deque_iterator<uint64, const uint64&, const uint64*>, std::_Deque_iterator<uint64, uint64&, uint64*> >
       
 28120 -1b1ea e 280 79
       
 28121 -1b1f8 17 283 79
       
 28122 -1b20f 20 285 79
       
 28123 -1b22f b 286 79
       
 28124 -1b23a b 287 79
       
 28125 -1b245 b 283 79
       
 28126 -1b250 1e 289 79
       
 28127 +1b1a6 d 144 62
       
 28128 +1b1b3 f 145 62
       
 28129 +1b1c2 18 147 62
       
 28130 +1b1da b 148 62
       
 28131 +1b1e5 5 150 62
       
 28132 +FUNC 1b1ea 84 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__copy<false, std::random_access_iterator_tag>::copy<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)
       
 28133 +1b1ea e 280 61
       
 28134 +1b1f8 17 283 61
       
 28135 +1b20f 20 285 61
       
 28136 +1b22f b 286 61
       
 28137 +1b23a b 287 61
       
 28138 +1b245 b 283 61
       
 28139 +1b250 1e 289 61
       
 28140 +FUNC 1b26e 7e 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__copy_aux<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)
       
 28141  1b26e 11 307 79
       
 28142 -1b27f 4 315 79
       
 28143 -1b283 69 317 79
       
 28144 -FUNC 1b2ec 7a 0 copy_n<std::_Deque_iterator<uint64, const uint64&, const uint64*>, std::_Deque_iterator<uint64, uint64&, uint64*> >
       
 28145 -1b2ec 11 325 79
       
 28146 -1b2fd 69 326 79
       
 28147 +1b27f 4 315 61
       
 28148 +1b283 69 317 61
       
 28149 +FUNC 1b2ec 7a 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__copy_normal<false, false>::copy_n<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)
       
 28150 +1b2ec 11 325 61
       
 28151 +1b2fd 69 326 61
       
 28152 +FUNC 1b366 82 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::copy<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)
       
 28153  1b366 11 376 79
       
 28154 -1b377 4 384 79
       
 28155 -1b37b 4 385 79
       
 28156 -1b37f 69 387 79
       
 28157 +1b377 4 384 61
       
 28158 +1b37b 4 385 61
       
 28159 +1b37f 69 387 61
       
 28160 +FUNC 1b3e8 7a 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__uninitialized_copy_aux<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, __true_type)
       
 28161  1b3e8 11 73 79
       
 28162  1b3f9 69 74 79
       
 28163 +FUNC 1b462 82 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::uninitialized_copy<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> >(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>)
       
 28164  1b462 11 108 79
       
 28165  1b473 71 113 79
       
 28166 +FUNC 1b4e4 7a 0 std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*> std::__uninitialized_copy_a<std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, unsigned long long>(std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long const&, unsigned long long const*>, std::_Deque_iterator<unsigned long long, unsigned long long&, unsigned long long*>, std::allocator<unsigned long long>)
       
 28167  1b4e4 11 252 79
       
 28168  1b4f5 69 254 79
       
 28169 -1b55e 10 679 79
       
 28170 -1b56e 64 680 79
       
 28171 -1b5d2 e8 681 79
       
 28172 -1b6ba c 143 79
       
 28173 -1b6c6 14 144 79
       
 28174 -1b6da 6 144 79
       
 28175 +1b55e 10 679 62
       
 28176 +1b56e 64 680 62
       
 28177 +1b5d2 e8 681 62
       
 28178 +1b6ba c 143 75
       
 28179 +1b6c6 14 144 75
       
 28180 +1b6da 6 144 75
       
 28181  FUNC 1b6e0 4d 0 __eprintf
       
 28182  1b6e0 6 1826 80
       
 28183  1b6e6 3 1832 80
       
 28184  1b6e9 c 1826 80
       
 28185  1b6f5 29 1832 80
       
 28186  1b71e a 1837 80
       
 28187  1b728 5 1838 80
       
 28188  1b72d e8d3 1838 80
       
 28189 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.nib/classes.nib b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.nib/classes.nib
       
 28190 new file mode 100644
       
 28191 --- /dev/null
       
 28192 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.nib/classes.nib
       
 28193 @@ -0,0 +1,69 @@
       
 28194 +<?xml version="1.0" encoding="UTF-8"?>
       
 28195 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 28196 +<plist version="1.0">
       
 28197 +<dict>
       
 28198 +	<key>IBClasses</key>
       
 28199 +	<array>
       
 28200 +		<dict>
       
 28201 +			<key>CLASS</key>
       
 28202 +			<string>LengthLimitingTextField</string>
       
 28203 +			<key>LANGUAGE</key>
       
 28204 +			<string>ObjC</string>
       
 28205 +			<key>SUPERCLASS</key>
       
 28206 +			<string>NSTextField</string>
       
 28207 +		</dict>
       
 28208 +		<dict>
       
 28209 +			<key>ACTIONS</key>
       
 28210 +			<dict>
       
 28211 +				<key>cancel</key>
       
 28212 +				<string>id</string>
       
 28213 +				<key>sendReport</key>
       
 28214 +				<string>id</string>
       
 28215 +				<key>showPrivacyPolicy</key>
       
 28216 +				<string>id</string>
       
 28217 +			</dict>
       
 28218 +			<key>CLASS</key>
       
 28219 +			<string>Reporter</string>
       
 28220 +			<key>LANGUAGE</key>
       
 28221 +			<string>ObjC</string>
       
 28222 +			<key>OUTLETS</key>
       
 28223 +			<dict>
       
 28224 +				<key>alertWindow_</key>
       
 28225 +				<string>NSWindow</string>
       
 28226 +				<key>cancelButton_</key>
       
 28227 +				<string>NSButton</string>
       
 28228 +				<key>commentMessage_</key>
       
 28229 +				<string>NSTextField</string>
       
 28230 +				<key>commentsEntryField_</key>
       
 28231 +				<string>LengthLimitingTextField</string>
       
 28232 +				<key>countdownLabel_</key>
       
 28233 +				<string>NSTextField</string>
       
 28234 +				<key>dialogTitle_</key>
       
 28235 +				<string>NSTextField</string>
       
 28236 +				<key>emailEntryField_</key>
       
 28237 +				<string>LengthLimitingTextField</string>
       
 28238 +				<key>emailLabel_</key>
       
 28239 +				<string>NSTextField</string>
       
 28240 +				<key>emailMessage_</key>
       
 28241 +				<string>NSTextField</string>
       
 28242 +				<key>emailSectionBox_</key>
       
 28243 +				<string>NSBox</string>
       
 28244 +				<key>headerBox_</key>
       
 28245 +				<string>NSBox</string>
       
 28246 +				<key>preEmailBox_</key>
       
 28247 +				<string>NSBox</string>
       
 28248 +				<key>privacyLinkArrow_</key>
       
 28249 +				<string>NSView</string>
       
 28250 +				<key>privacyLinkLabel_</key>
       
 28251 +				<string>NSTextField</string>
       
 28252 +				<key>sendButton_</key>
       
 28253 +				<string>NSButton</string>
       
 28254 +			</dict>
       
 28255 +			<key>SUPERCLASS</key>
       
 28256 +			<string>NSObject</string>
       
 28257 +		</dict>
       
 28258 +	</array>
       
 28259 +	<key>IBVersion</key>
       
 28260 +	<string>1</string>
       
 28261 +</dict>
       
 28262 +</plist>
       
 28263 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.nib/info.nib b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.nib/info.nib
       
 28264 new file mode 100644
       
 28265 --- /dev/null
       
 28266 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.nib/info.nib
       
 28267 @@ -0,0 +1,20 @@
       
 28268 +<?xml version="1.0" encoding="UTF-8"?>
       
 28269 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 28270 +<plist version="1.0">
       
 28271 +<dict>
       
 28272 +	<key>IBFramework Version</key>
       
 28273 +	<string>676</string>
       
 28274 +	<key>IBLastKnownRelativeProjectPath</key>
       
 28275 +	<string>../Breakpad.xcodeproj</string>
       
 28276 +	<key>IBOldestOS</key>
       
 28277 +	<integer>5</integer>
       
 28278 +	<key>IBOpenObjects</key>
       
 28279 +	<array>
       
 28280 +		<integer>132</integer>
       
 28281 +	</array>
       
 28282 +	<key>IBSystem Version</key>
       
 28283 +	<string>9J61</string>
       
 28284 +	<key>targetFramework</key>
       
 28285 +	<string>IBCocoaFramework</string>
       
 28286 +</dict>
       
 28287 +</plist>
       
 28288 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.nib/keyedobjects.nib b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/Breakpad.nib/keyedobjects.nib
       
 28289 new file mode 100644
       
 28290 index 0000000000000000000000000000000000000000..e370206c166426f1ec3ff2a9578fe891ac3a5190
       
 28291 GIT binary patch
       
 28292 literal 14674
       
 28293 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
       
 28457 
       
 28458 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/English.lproj/InfoPlist.strings b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/English.lproj/InfoPlist.strings
       
 28459 new file mode 100644
       
 28460 index 0000000000000000000000000000000000000000..65d161818a12f785bc58a885664ac859f1e755ff
       
 28461 GIT binary patch
       
 28462 literal 156
       
 28463 zc%1wHPl>^q!HvO*p_CzyA%!7_A(g?8A(0^$NGmZYFxUbyNJSA)te7DK$O{6>6fooi
       
 28464 fMM{9IBA~1_0~Z6PDJ~3|Kph1@b|OP1S!MzN$P60z
       
 28465 
       
 28466 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/English.lproj/Localizable.strings b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/English.lproj/Localizable.strings
       
 28467 new file mode 100644
       
 28468 index 0000000000000000000000000000000000000000..70626567c95f166a7ac0bf7d3b89d695264e4b1b
       
 28469 GIT binary patch
       
 28470 literal 2270
       
 28471 zc%0=`%Wl&^6uoP{Vib{07mi>FLZTETBwDBl{eY?M#F6|WV>jgIfiq{u_L$hIRCR|e
       
 28472 zJM*}YbI!dp`SW`v7oub>jqGJ7rEJAuzL5%ZC3l#m9DT(~1B(sbSTx5K>=nKnd^O$}
       
 28473 zmKq)z#uu`Z7qSS}KEgvw4*RWqMpP{cV=rL+4(~#Kz$#^|8c%+bX({jV%@|L~Pie8!
       
 28474 zVANtam0$2l;nCom!22i>V!l0t;sz_*iTnn>hH(m_DG^VRf9BPgMrb^`2SzFBq2wO3
       
 28475 zl=wB2+5{LQtX<;WV^&k~Cg3;t#kA1gOA&{r?GaurEi^3+J)BL|E9S-)dyYH`XcOAG
       
 28476 zdLDg5i@8Ro3Yl|q@AR_@S~geDUQ3H2CWn&j_MV|*W9NJ7GE{ON$Nx~xSMqYEqJ^)W
       
 28477 zL%WpMv<xd~buRF@%9|6tZdrBBtYPfd-v~RLu(?jL{A?fDE-+-c!-~64lpK17nb$hy
       
 28478 ziA}sN?zTyT=)-v(DsS^>#LOp<JLa~pyPQtTJ-ev$Q|!}(xeQqyxbAjx_R*nd>@<$q
       
 28479 z3k~+;QH^%KmYrS)-zBN%RrH*!CXGj6Mim*5UE}wjiVv(l^}BC+4QeX;Ks3imuiKG@
       
 28480 z!o2dGeGD>po%KEF)eqp+kaZcvTlYN}+79=s<_WeKrv0x1i|`D0ai_h$$(I?<A)h;7
       
 28481 zx(>WDMyjFL3eSO0gl?#KKiE!<{3%%d6SWSaMvPPRc)PRX?x=)4Qu-cT^ZZw2Vt9gD
       
 28482 zc5YaaCDk({OLt4S`j)<D!+)#Cv#q^Xi(Gni^Pc8Am+f4>8``$Ksm`-2MwU-w7iN2m
       
 28483 JU6^k^+h4Dxg<Svu
       
 28484 
       
 28485 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/ReporterIcon.graffle b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/ReporterIcon.graffle
       
 28486 new file mode 100644
       
 28487 --- /dev/null
       
 28488 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/ReporterIcon.graffle
       
 28489 @@ -0,0 +1,2489 @@
       
 28490 +<?xml version="1.0" encoding="UTF-8"?>
       
 28491 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 28492 +<plist version="1.0">
       
 28493 +<dict>
       
 28494 +	<key>ActiveLayerIndex</key>
       
 28495 +	<integer>0</integer>
       
 28496 +	<key>ApplicationVersion</key>
       
 28497 +	<array>
       
 28498 +		<string>com.omnigroup.OmniGrafflePro</string>
       
 28499 +		<string>137.6.0.106738</string>
       
 28500 +	</array>
       
 28501 +	<key>AutoAdjust</key>
       
 28502 +	<false/>
       
 28503 +	<key>BackgroundGraphic</key>
       
 28504 +	<dict>
       
 28505 +		<key>Bounds</key>
       
 28506 +		<string>{{0, 0}, {512, 512}}</string>
       
 28507 +		<key>Class</key>
       
 28508 +		<string>SolidGraphic</string>
       
 28509 +		<key>FontInfo</key>
       
 28510 +		<dict>
       
 28511 +			<key>Font</key>
       
 28512 +			<string>CalisMTBol</string>
       
 28513 +			<key>Size</key>
       
 28514 +			<real>112</real>
       
 28515 +		</dict>
       
 28516 +		<key>ID</key>
       
 28517 +		<integer>2</integer>
       
 28518 +		<key>Style</key>
       
 28519 +		<dict>
       
 28520 +			<key>fill</key>
       
 28521 +			<dict>
       
 28522 +				<key>Color</key>
       
 28523 +				<dict>
       
 28524 +					<key>a</key>
       
 28525 +					<string>0</string>
       
 28526 +					<key>b</key>
       
 28527 +					<string>0</string>
       
 28528 +					<key>g</key>
       
 28529 +					<string>0.852018</string>
       
 28530 +					<key>r</key>
       
 28531 +					<string>0.998962</string>
       
 28532 +				</dict>
       
 28533 +			</dict>
       
 28534 +			<key>shadow</key>
       
 28535 +			<dict>
       
 28536 +				<key>Draws</key>
       
 28537 +				<string>NO</string>
       
 28538 +			</dict>
       
 28539 +			<key>stroke</key>
       
 28540 +			<dict>
       
 28541 +				<key>Draws</key>
       
 28542 +				<string>NO</string>
       
 28543 +			</dict>
       
 28544 +		</dict>
       
 28545 +	</dict>
       
 28546 +	<key>CanvasOrigin</key>
       
 28547 +	<string>{0, 0}</string>
       
 28548 +	<key>CanvasSize</key>
       
 28549 +	<string>{512, 512}</string>
       
 28550 +	<key>ColumnAlign</key>
       
 28551 +	<integer>1</integer>
       
 28552 +	<key>ColumnSpacing</key>
       
 28553 +	<real>36</real>
       
 28554 +	<key>CreationDate</key>
       
 28555 +	<string>2008-11-14 16:58:15 -0700</string>
       
 28556 +	<key>Creator</key>
       
 28557 +	<string>John P. Developer</string>
       
 28558 +	<key>DisplayScale</key>
       
 28559 +	<string>1 pt = 1 px</string>
       
 28560 +	<key>FileType</key>
       
 28561 +	<string>flat</string>
       
 28562 +	<key>GraphDocumentVersion</key>
       
 28563 +	<integer>6</integer>
       
 28564 +	<key>GraphicsList</key>
       
 28565 +	<array>
       
 28566 +		<dict>
       
 28567 +			<key>Bounds</key>
       
 28568 +			<string>{{33.9443, 35.3885}, {444.111, 437.112}}</string>
       
 28569 +			<key>Class</key>
       
 28570 +			<string>ShapedGraphic</string>
       
 28571 +			<key>FontInfo</key>
       
 28572 +			<dict>
       
 28573 +				<key>Font</key>
       
 28574 +				<string>CalisMTBol</string>
       
 28575 +				<key>Size</key>
       
 28576 +				<real>112</real>
       
 28577 +			</dict>
       
 28578 +			<key>ID</key>
       
 28579 +			<integer>31</integer>
       
 28580 +			<key>Rotation</key>
       
 28581 +			<real>270</real>
       
 28582 +			<key>Shape</key>
       
 28583 +			<string>Bezier</string>
       
 28584 +			<key>ShapeData</key>
       
 28585 +			<dict>
       
 28586 +				<key>UnitPoints</key>
       
 28587 +				<array>
       
 28588 +					<string>{-0.5, -0.439247}</string>
       
 28589 +					<string>{-0.5, -0.485429}</string>
       
 28590 +					<string>{-0.446294, -0.512626}</string>
       
 28591 +					<string>{-0.409932, -0.494153}</string>
       
 28592 +					<string>{-0.373569, -0.47568}</string>
       
 28593 +					<string>{0.436363, -0.0733799}</string>
       
 28594 +					<string>{0.472729, -0.0549059}</string>
       
 28595 +					<string>{0.50909, -0.0364333}</string>
       
 28596 +					<string>{0.509091, 0.0364345}</string>
       
 28597 +					<string>{0.472729, 0.0549059}</string>
       
 28598 +					<string>{0.436368, 0.0733802}</string>
       
 28599 +					<string>{-0.373569, 0.475681}</string>
       
 28600 +					<string>{-0.409932, 0.494153}</string>
       
 28601 +					<string>{-0.446294, 0.512626}</string>
       
 28602 +					<string>{-0.500001, 0.485429}</string>
       
 28603 +					<string>{-0.5, 0.439247}</string>
       
 28604 +					<string>{-0.49998, 0.393072}</string>
       
 28605 +					<string>{-0.500002, -0.393066}</string>
       
 28606 +				</array>
       
 28607 +			</dict>
       
 28608 +			<key>Style</key>
       
 28609 +			<dict>
       
 28610 +				<key>fill</key>
       
 28611 +				<dict>
       
 28612 +					<key>Color</key>
       
 28613 +					<dict>
       
 28614 +						<key>b</key>
       
 28615 +						<string>0</string>
       
 28616 +						<key>g</key>
       
 28617 +						<string>0.770962</string>
       
 28618 +						<key>r</key>
       
 28619 +						<string>0.997971</string>
       
 28620 +					</dict>
       
 28621 +					<key>Draws</key>
       
 28622 +					<string>NO</string>
       
 28623 +					<key>FillType</key>
       
 28624 +					<integer>3</integer>
       
 28625 +					<key>GradientCenter</key>
       
 28626 +					<string>{-0.609524, 0}</string>
       
 28627 +					<key>GradientColor</key>
       
 28628 +					<dict>
       
 28629 +						<key>b</key>
       
 28630 +						<string>0</string>
       
 28631 +						<key>g</key>
       
 28632 +						<string>0.911574</string>
       
 28633 +						<key>r</key>
       
 28634 +						<string>0.998779</string>
       
 28635 +					</dict>
       
 28636 +					<key>MiddleFraction</key>
       
 28637 +					<real>0.6111111044883728</real>
       
 28638 +				</dict>
       
 28639 +				<key>shadow</key>
       
 28640 +				<dict>
       
 28641 +					<key>Color</key>
       
 28642 +					<dict>
       
 28643 +						<key>a</key>
       
 28644 +						<string>0.43</string>
       
 28645 +						<key>b</key>
       
 28646 +						<string>0</string>
       
 28647 +						<key>g</key>
       
 28648 +						<string>0</string>
       
 28649 +						<key>r</key>
       
 28650 +						<string>0</string>
       
 28651 +					</dict>
       
 28652 +					<key>Draws</key>
       
 28653 +					<string>NO</string>
       
 28654 +					<key>Fuzziness</key>
       
 28655 +					<real>7.2213706970214844</real>
       
 28656 +					<key>ShadowVector</key>
       
 28657 +					<string>{0, 6}</string>
       
 28658 +				</dict>
       
 28659 +				<key>stroke</key>
       
 28660 +				<dict>
       
 28661 +					<key>Color</key>
       
 28662 +					<dict>
       
 28663 +						<key>b</key>
       
 28664 +						<string>0</string>
       
 28665 +						<key>g</key>
       
 28666 +						<string>0.766903</string>
       
 28667 +						<key>r</key>
       
 28668 +						<string>0.997925</string>
       
 28669 +					</dict>
       
 28670 +					<key>Width</key>
       
 28671 +					<real>7</real>
       
 28672 +				</dict>
       
 28673 +			</dict>
       
 28674 +			<key>Text</key>
       
 28675 +			<dict>
       
 28676 +				<key>Pad</key>
       
 28677 +				<integer>0</integer>
       
 28678 +				<key>VerticalPad</key>
       
 28679 +				<integer>0</integer>
       
 28680 +			</dict>
       
 28681 +			<key>TextPlacement</key>
       
 28682 +			<integer>0</integer>
       
 28683 +			<key>TextRelativeArea</key>
       
 28684 +			<string>{{0.06, 0.17}, {0.88, 0.5}}</string>
       
 28685 +			<key>TextRotation</key>
       
 28686 +			<real>90</real>
       
 28687 +			<key>Wrap</key>
       
 28688 +			<string>NO</string>
       
 28689 +		</dict>
       
 28690 +		<dict>
       
 28691 +			<key>Bounds</key>
       
 28692 +			<string>{{3.89085, 67.8908}, {404.218, 332}}</string>
       
 28693 +			<key>Class</key>
       
 28694 +			<string>ShapedGraphic</string>
       
 28695 +			<key>FontInfo</key>
       
 28696 +			<dict>
       
 28697 +				<key>Font</key>
       
 28698 +				<string>CalisMTBol</string>
       
 28699 +				<key>Size</key>
       
 28700 +				<real>112</real>
       
 28701 +			</dict>
       
 28702 +			<key>ID</key>
       
 28703 +			<integer>30</integer>
       
 28704 +			<key>Rotation</key>
       
 28705 +			<real>270</real>
       
 28706 +			<key>Shape</key>
       
 28707 +			<string>Bezier</string>
       
 28708 +			<key>ShapeData</key>
       
 28709 +			<dict>
       
 28710 +				<key>UnitPoints</key>
       
 28711 +				<array>
       
 28712 +					<string>{-0.5, -0.5}</string>
       
 28713 +					<string>{-0.459695, -0.475464}</string>
       
 28714 +					<string>{0.429465, 0.0537758}</string>
       
 28715 +					<string>{0.469773, 0.0783133}</string>
       
 28716 +					<string>{0.510074, 0.102849}</string>
       
 28717 +					<string>{0.510077, 0.198357}</string>
       
 28718 +					<string>{0.469773, 0.222892}</string>
       
 28719 +					<string>{0.429473, 0.247428}</string>
       
 28720 +					<string>{-0.00521517, 0.499998}</string>
       
 28721 +					<string>{-0.00521785, 0.5}</string>
       
 28722 +					<string>{-0.00521713, -0.113381}</string>
       
 28723 +					<string>{-0.44962, -0.458615}</string>
       
 28724 +				</array>
       
 28725 +			</dict>
       
 28726 +			<key>Style</key>
       
 28727 +			<dict>
       
 28728 +				<key>fill</key>
       
 28729 +				<dict>
       
 28730 +					<key>Color</key>
       
 28731 +					<dict>
       
 28732 +						<key>a</key>
       
 28733 +						<string>0</string>
       
 28734 +						<key>b</key>
       
 28735 +						<string>1</string>
       
 28736 +						<key>g</key>
       
 28737 +						<string>1</string>
       
 28738 +						<key>r</key>
       
 28739 +						<string>1</string>
       
 28740 +					</dict>
       
 28741 +					<key>FillType</key>
       
 28742 +					<integer>2</integer>
       
 28743 +					<key>GradientAngle</key>
       
 28744 +					<real>180</real>
       
 28745 +					<key>GradientCenter</key>
       
 28746 +					<string>{-0.609524, 0}</string>
       
 28747 +					<key>GradientColor</key>
       
 28748 +					<dict>
       
 28749 +						<key>a</key>
       
 28750 +						<string>0.5</string>
       
 28751 +						<key>w</key>
       
 28752 +						<string>1</string>
       
 28753 +					</dict>
       
 28754 +					<key>MiddleFraction</key>
       
 28755 +					<real>0.6111111044883728</real>
       
 28756 +				</dict>
       
 28757 +				<key>shadow</key>
       
 28758 +				<dict>
       
 28759 +					<key>Color</key>
       
 28760 +					<dict>
       
 28761 +						<key>a</key>
       
 28762 +						<string>0.51</string>
       
 28763 +						<key>b</key>
       
 28764 +						<string>0</string>
       
 28765 +						<key>g</key>
       
 28766 +						<string>0</string>
       
 28767 +						<key>r</key>
       
 28768 +						<string>0</string>
       
 28769 +					</dict>
       
 28770 +					<key>Draws</key>
       
 28771 +					<string>NO</string>
       
 28772 +					<key>Fuzziness</key>
       
 28773 +					<real>3.3371961116790771</real>
       
 28774 +					<key>ShadowVector</key>
       
 28775 +					<string>{0, 2}</string>
       
 28776 +				</dict>
       
 28777 +				<key>stroke</key>
       
 28778 +				<dict>
       
 28779 +					<key>Color</key>
       
 28780 +					<dict>
       
 28781 +						<key>b</key>
       
 28782 +						<string>0</string>
       
 28783 +						<key>g</key>
       
 28784 +						<string>0.766903</string>
       
 28785 +						<key>r</key>
       
 28786 +						<string>0.997925</string>
       
 28787 +					</dict>
       
 28788 +					<key>Draws</key>
       
 28789 +					<string>NO</string>
       
 28790 +					<key>Width</key>
       
 28791 +					<real>2</real>
       
 28792 +				</dict>
       
 28793 +			</dict>
       
 28794 +			<key>Text</key>
       
 28795 +			<dict>
       
 28796 +				<key>Pad</key>
       
 28797 +				<integer>0</integer>
       
 28798 +				<key>VerticalPad</key>
       
 28799 +				<integer>0</integer>
       
 28800 +			</dict>
       
 28801 +			<key>TextPlacement</key>
       
 28802 +			<integer>0</integer>
       
 28803 +			<key>TextRelativeArea</key>
       
 28804 +			<string>{{0.06, 0.17}, {0.88, 0.5}}</string>
       
 28805 +			<key>TextRotation</key>
       
 28806 +			<real>90</real>
       
 28807 +			<key>Wrap</key>
       
 28808 +			<string>NO</string>
       
 28809 +		</dict>
       
 28810 +		<dict>
       
 28811 +			<key>Bounds</key>
       
 28812 +			<string>{{33.9443, 35.3886}, {444.112, 437.111}}</string>
       
 28813 +			<key>Class</key>
       
 28814 +			<string>ShapedGraphic</string>
       
 28815 +			<key>FontInfo</key>
       
 28816 +			<dict>
       
 28817 +				<key>Font</key>
       
 28818 +				<string>CalisMTBol</string>
       
 28819 +				<key>Size</key>
       
 28820 +				<real>112</real>
       
 28821 +			</dict>
       
 28822 +			<key>ID</key>
       
 28823 +			<integer>29</integer>
       
 28824 +			<key>Rotation</key>
       
 28825 +			<real>270</real>
       
 28826 +			<key>Shape</key>
       
 28827 +			<string>Bezier</string>
       
 28828 +			<key>ShapeData</key>
       
 28829 +			<dict>
       
 28830 +				<key>UnitPoints</key>
       
 28831 +				<array>
       
 28832 +					<string>{-0.5, -0.439247}</string>
       
 28833 +					<string>{-0.500001, -0.485429}</string>
       
 28834 +					<string>{-0.446295, -0.512626}</string>
       
 28835 +					<string>{-0.409932, -0.494153}</string>
       
 28836 +					<string>{-0.373568, -0.475681}</string>
       
 28837 +					<string>{0.436363, -0.0733802}</string>
       
 28838 +					<string>{0.472729, -0.0549062}</string>
       
 28839 +					<string>{0.509089, -0.0364334}</string>
       
 28840 +					<string>{0.509092, 0.0364341}</string>
       
 28841 +					<string>{0.472729, 0.0549056}</string>
       
 28842 +					<string>{0.436369, 0.0733803}</string>
       
 28843 +					<string>{-0.373568, 0.475681}</string>
       
 28844 +					<string>{-0.409932, 0.494153}</string>
       
 28845 +					<string>{-0.446294, 0.512626}</string>
       
 28846 +					<string>{-0.500001, 0.485428}</string>
       
 28847 +					<string>{-0.5, 0.439248}</string>
       
 28848 +					<string>{-0.499978, 0.39307}</string>
       
 28849 +					<string>{-0.500003, -0.393066}</string>
       
 28850 +				</array>
       
 28851 +			</dict>
       
 28852 +			<key>Style</key>
       
 28853 +			<dict>
       
 28854 +				<key>fill</key>
       
 28855 +				<dict>
       
 28856 +					<key>Color</key>
       
 28857 +					<dict>
       
 28858 +						<key>a</key>
       
 28859 +						<string>0.2</string>
       
 28860 +						<key>b</key>
       
 28861 +						<string>1</string>
       
 28862 +						<key>g</key>
       
 28863 +						<string>1</string>
       
 28864 +						<key>r</key>
       
 28865 +						<string>1</string>
       
 28866 +					</dict>
       
 28867 +					<key>FillType</key>
       
 28868 +					<integer>2</integer>
       
 28869 +					<key>GradientAngle</key>
       
 28870 +					<real>90</real>
       
 28871 +					<key>GradientCenter</key>
       
 28872 +					<string>{-0.609524, 0}</string>
       
 28873 +					<key>GradientColor</key>
       
 28874 +					<dict>
       
 28875 +						<key>a</key>
       
 28876 +						<string>0</string>
       
 28877 +						<key>w</key>
       
 28878 +						<string>1</string>
       
 28879 +					</dict>
       
 28880 +					<key>MiddleFraction</key>
       
 28881 +					<real>0.6111111044883728</real>
       
 28882 +				</dict>
       
 28883 +				<key>shadow</key>
       
 28884 +				<dict>
       
 28885 +					<key>Color</key>
       
 28886 +					<dict>
       
 28887 +						<key>a</key>
       
 28888 +						<string>0.51</string>
       
 28889 +						<key>b</key>
       
 28890 +						<string>0</string>
       
 28891 +						<key>g</key>
       
 28892 +						<string>0</string>
       
 28893 +						<key>r</key>
       
 28894 +						<string>0</string>
       
 28895 +					</dict>
       
 28896 +					<key>Draws</key>
       
 28897 +					<string>NO</string>
       
 28898 +					<key>Fuzziness</key>
       
 28899 +					<real>3.3371961116790771</real>
       
 28900 +					<key>ShadowVector</key>
       
 28901 +					<string>{0, 2}</string>
       
 28902 +				</dict>
       
 28903 +				<key>stroke</key>
       
 28904 +				<dict>
       
 28905 +					<key>Color</key>
       
 28906 +					<dict>
       
 28907 +						<key>b</key>
       
 28908 +						<string>0</string>
       
 28909 +						<key>g</key>
       
 28910 +						<string>0.766903</string>
       
 28911 +						<key>r</key>
       
 28912 +						<string>0.997925</string>
       
 28913 +					</dict>
       
 28914 +					<key>Draws</key>
       
 28915 +					<string>NO</string>
       
 28916 +					<key>Width</key>
       
 28917 +					<real>2</real>
       
 28918 +				</dict>
       
 28919 +			</dict>
       
 28920 +			<key>Text</key>
       
 28921 +			<dict>
       
 28922 +				<key>Pad</key>
       
 28923 +				<integer>0</integer>
       
 28924 +				<key>VerticalPad</key>
       
 28925 +				<integer>0</integer>
       
 28926 +			</dict>
       
 28927 +			<key>TextPlacement</key>
       
 28928 +			<integer>0</integer>
       
 28929 +			<key>TextRelativeArea</key>
       
 28930 +			<string>{{0.06, 0.17}, {0.88, 0.5}}</string>
       
 28931 +			<key>TextRotation</key>
       
 28932 +			<real>90</real>
       
 28933 +			<key>Wrap</key>
       
 28934 +			<string>NO</string>
       
 28935 +		</dict>
       
 28936 +		<dict>
       
 28937 +			<key>Bounds</key>
       
 28938 +			<string>{{176, 102.384}, {158.841, 537.616}}</string>
       
 28939 +			<key>Class</key>
       
 28940 +			<string>ShapedGraphic</string>
       
 28941 +			<key>FontInfo</key>
       
 28942 +			<dict>
       
 28943 +				<key>Font</key>
       
 28944 +				<string>CalisMTBol</string>
       
 28945 +				<key>Size</key>
       
 28946 +				<real>425</real>
       
 28947 +			</dict>
       
 28948 +			<key>ID</key>
       
 28949 +			<integer>26</integer>
       
 28950 +			<key>Shape</key>
       
 28951 +			<string>Rectangle</string>
       
 28952 +			<key>Style</key>
       
 28953 +			<dict>
       
 28954 +				<key>fill</key>
       
 28955 +				<dict>
       
 28956 +					<key>Draws</key>
       
 28957 +					<string>NO</string>
       
 28958 +				</dict>
       
 28959 +				<key>shadow</key>
       
 28960 +				<dict>
       
 28961 +					<key>Draws</key>
       
 28962 +					<string>NO</string>
       
 28963 +				</dict>
       
 28964 +				<key>stroke</key>
       
 28965 +				<dict>
       
 28966 +					<key>Draws</key>
       
 28967 +					<string>NO</string>
       
 28968 +				</dict>
       
 28969 +			</dict>
       
 28970 +			<key>Text</key>
       
 28971 +			<dict>
       
 28972 +				<key>Pad</key>
       
 28973 +				<integer>0</integer>
       
 28974 +				<key>Text</key>
       
 28975 +				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
       
 28976 +{\fonttbl\f0\fnil\fcharset0 CalistoMT;}
       
 28977 +{\colortbl;\red255\green255\blue255;}
       
 28978 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
       
 28979 +
       
 28980 +\f0\b\fs850 \cf1 !}</string>
       
 28981 +				<key>VerticalPad</key>
       
 28982 +				<integer>0</integer>
       
 28983 +			</dict>
       
 28984 +			<key>Wrap</key>
       
 28985 +			<string>NO</string>
       
 28986 +		</dict>
       
 28987 +		<dict>
       
 28988 +			<key>Bounds</key>
       
 28989 +			<string>{{176, 104}, {158.841, 537.616}}</string>
       
 28990 +			<key>Class</key>
       
 28991 +			<string>ShapedGraphic</string>
       
 28992 +			<key>FontInfo</key>
       
 28993 +			<dict>
       
 28994 +				<key>Color</key>
       
 28995 +				<dict>
       
 28996 +					<key>b</key>
       
 28997 +					<string>0</string>
       
 28998 +					<key>g</key>
       
 28999 +					<string>0.749523</string>
       
 29000 +					<key>r</key>
       
 29001 +					<string>0.997726</string>
       
 29002 +				</dict>
       
 29003 +				<key>Font</key>
       
 29004 +				<string>CalisMTBol</string>
       
 29005 +				<key>Size</key>
       
 29006 +				<real>425</real>
       
 29007 +			</dict>
       
 29008 +			<key>ID</key>
       
 29009 +			<integer>27</integer>
       
 29010 +			<key>Shape</key>
       
 29011 +			<string>Rectangle</string>
       
 29012 +			<key>Style</key>
       
 29013 +			<dict>
       
 29014 +				<key>fill</key>
       
 29015 +				<dict>
       
 29016 +					<key>Draws</key>
       
 29017 +					<string>NO</string>
       
 29018 +				</dict>
       
 29019 +				<key>shadow</key>
       
 29020 +				<dict>
       
 29021 +					<key>Draws</key>
       
 29022 +					<string>NO</string>
       
 29023 +				</dict>
       
 29024 +				<key>stroke</key>
       
 29025 +				<dict>
       
 29026 +					<key>Draws</key>
       
 29027 +					<string>NO</string>
       
 29028 +				</dict>
       
 29029 +			</dict>
       
 29030 +			<key>Text</key>
       
 29031 +			<dict>
       
 29032 +				<key>Pad</key>
       
 29033 +				<integer>0</integer>
       
 29034 +				<key>RTFD</key>
       
 29035 +				<data>
       
 29036 +				BAtzdHJlYW10eXBlZIHoA4QBQISEhBJOU0F0dHJpYnV0
       
 29037 +				ZWRTdHJpbmcAhIQITlNPYmplY3QAhZKEhIQITlNTdHJp
       
 29038 +				bmcBlIQBKwEhhoQCaUkBAZKEhIQMTlNEaWN0aW9uYXJ5
       
 29039 +				AJSEAWkEkoSWlhBOU1BhcmFncmFwaFN0eWxlhpKEhIQQ
       
 29040 +				TlNQYXJhZ3JhcGhTdHlsZQCUhARDQ0BTAgCEhIQHTlNB
       
 29041 +				cnJheQCUmQyShISECU5TVGV4dFRhYgCUhAJDZgAchpKE
       
 29042 +				n54AOIaShJ+eAFSGkoSfngBwhpKEn54AgYwAhpKEn54A
       
 29043 +				gagAhpKEn54AgcQAhpKEn54AgeAAhpKEn54AgfwAhpKE
       
 29044 +				n54AgRgBhpKEn54AgTQBhpKEn54AgVABhoYAhpKElpYG
       
 29045 +				TlNGb250hpKEhIQGTlNGb250HpSZIIQFWzMyY10GAAAA
       
 29046 +				FgAAAP/+QwBhAGwAaQBzAE0AVABCAG8AbAAAAIQBZoGp
       
 29047 +				AYQBYwCiAaIAogCGkoSWlg1OU1N0cm9rZVdpZHRohpKE
       
 29048 +				hIQITlNOdW1iZXIAhIQHTlNWYWx1ZQCUhAEqhIQBZKYD
       
 29049 +				hpKElpYHTlNDb2xvcoaShISEB05TQ29sb3IAlKIChARm
       
 29050 +				ZmZmAYN4dz8/AAGGhoY=
       
 29051 +				</data>
       
 29052 +				<key>Text</key>
       
 29053 +				<string>{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf350
       
 29054 +{\fonttbl\f0\fnil\fcharset0 CalistoMT;}
       
 29055 +{\colortbl;\red255\green255\blue255;\red254\green191\blue0;}
       
 29056 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
       
 29057 +
       
 29058 +\f0\b\fs850 \cf2 \outl\strokewidth60 \strokec2 !}</string>
       
 29059 +				<key>VerticalPad</key>
       
 29060 +				<integer>0</integer>
       
 29061 +			</dict>
       
 29062 +			<key>Wrap</key>
       
 29063 +			<string>NO</string>
       
 29064 +		</dict>
       
 29065 +		<dict>
       
 29066 +			<key>Bounds</key>
       
 29067 +			<string>{{33.9441, 35.3884}, {444.112, 437.111}}</string>
       
 29068 +			<key>Class</key>
       
 29069 +			<string>ShapedGraphic</string>
       
 29070 +			<key>FontInfo</key>
       
 29071 +			<dict>
       
 29072 +				<key>Font</key>
       
 29073 +				<string>CalisMTBol</string>
       
 29074 +				<key>Size</key>
       
 29075 +				<real>112</real>
       
 29076 +			</dict>
       
 29077 +			<key>ID</key>
       
 29078 +			<integer>16</integer>
       
 29079 +			<key>Rotation</key>
       
 29080 +			<real>270</real>
       
 29081 +			<key>Shape</key>
       
 29082 +			<string>Bezier</string>
       
 29083 +			<key>ShapeData</key>
       
 29084 +			<dict>
       
 29085 +				<key>UnitPoints</key>
       
 29086 +				<array>
       
 29087 +					<string>{-0.5, -0.439247}</string>
       
 29088 +					<string>{-0.5, -0.485429}</string>
       
 29089 +					<string>{-0.446295, -0.512626}</string>
       
 29090 +					<string>{-0.409933, -0.494153}</string>
       
 29091 +					<string>{-0.373569, -0.47568}</string>
       
 29092 +					<string>{0.436363, -0.073379}</string>
       
 29093 +					<string>{0.472729, -0.0549049}</string>
       
 29094 +					<string>{0.50909, -0.0364324}</string>
       
 29095 +					<string>{0.509091, 0.0364344}</string>
       
 29096 +					<string>{0.472729, 0.0549058}</string>
       
 29097 +					<string>{0.436368, 0.0733801}</string>
       
 29098 +					<string>{-0.373569, 0.47568}</string>
       
 29099 +					<string>{-0.409933, 0.494153}</string>
       
 29100 +					<string>{-0.446295, 0.512626}</string>
       
 29101 +					<string>{-0.500001, 0.485429}</string>
       
 29102 +					<string>{-0.5, 0.439247}</string>
       
 29103 +					<string>{-0.49998, 0.393072}</string>
       
 29104 +					<string>{-0.500002, -0.393066}</string>
       
 29105 +				</array>
       
 29106 +			</dict>
       
 29107 +			<key>Style</key>
       
 29108 +			<dict>
       
 29109 +				<key>fill</key>
       
 29110 +				<dict>
       
 29111 +					<key>Color</key>
       
 29112 +					<dict>
       
 29113 +						<key>b</key>
       
 29114 +						<string>0</string>
       
 29115 +						<key>g</key>
       
 29116 +						<string>0.770962</string>
       
 29117 +						<key>r</key>
       
 29118 +						<string>0.997971</string>
       
 29119 +					</dict>
       
 29120 +					<key>FillType</key>
       
 29121 +					<integer>3</integer>
       
 29122 +					<key>GradientCenter</key>
       
 29123 +					<string>{-0.609524, 0}</string>
       
 29124 +					<key>GradientColor</key>
       
 29125 +					<dict>
       
 29126 +						<key>b</key>
       
 29127 +						<string>0</string>
       
 29128 +						<key>g</key>
       
 29129 +						<string>0.911574</string>
       
 29130 +						<key>r</key>
       
 29131 +						<string>0.998779</string>
       
 29132 +					</dict>
       
 29133 +					<key>MiddleFraction</key>
       
 29134 +					<real>0.6111111044883728</real>
       
 29135 +				</dict>
       
 29136 +				<key>shadow</key>
       
 29137 +				<dict>
       
 29138 +					<key>Color</key>
       
 29139 +					<dict>
       
 29140 +						<key>a</key>
       
 29141 +						<string>0.9</string>
       
 29142 +						<key>b</key>
       
 29143 +						<string>0</string>
       
 29144 +						<key>g</key>
       
 29145 +						<string>0</string>
       
 29146 +						<key>r</key>
       
 29147 +						<string>0</string>
       
 29148 +					</dict>
       
 29149 +					<key>Fuzziness</key>
       
 29150 +					<real>8.0632610321044922</real>
       
 29151 +					<key>ShadowVector</key>
       
 29152 +					<string>{0, 9}</string>
       
 29153 +				</dict>
       
 29154 +				<key>stroke</key>
       
 29155 +				<dict>
       
 29156 +					<key>Color</key>
       
 29157 +					<dict>
       
 29158 +						<key>b</key>
       
 29159 +						<string>0</string>
       
 29160 +						<key>g</key>
       
 29161 +						<string>0.766903</string>
       
 29162 +						<key>r</key>
       
 29163 +						<string>0.997925</string>
       
 29164 +					</dict>
       
 29165 +					<key>Draws</key>
       
 29166 +					<string>NO</string>
       
 29167 +					<key>Width</key>
       
 29168 +					<real>2</real>
       
 29169 +				</dict>
       
 29170 +			</dict>
       
 29171 +			<key>Text</key>
       
 29172 +			<dict>
       
 29173 +				<key>Pad</key>
       
 29174 +				<integer>0</integer>
       
 29175 +				<key>VerticalPad</key>
       
 29176 +				<integer>0</integer>
       
 29177 +			</dict>
       
 29178 +			<key>TextPlacement</key>
       
 29179 +			<integer>0</integer>
       
 29180 +			<key>TextRelativeArea</key>
       
 29181 +			<string>{{0.06, 0.17}, {0.88, 0.5}}</string>
       
 29182 +			<key>TextRotation</key>
       
 29183 +			<real>90</real>
       
 29184 +			<key>Wrap</key>
       
 29185 +			<string>NO</string>
       
 29186 +		</dict>
       
 29187 +	</array>
       
 29188 +	<key>GridInfo</key>
       
 29189 +	<dict>
       
 29190 +		<key>GridSpacing</key>
       
 29191 +		<real>4</real>
       
 29192 +		<key>ShowsGrid</key>
       
 29193 +		<string>YES</string>
       
 29194 +		<key>SnapsToGrid</key>
       
 29195 +		<string>YES</string>
       
 29196 +	</dict>
       
 29197 +	<key>GuidesLocked</key>
       
 29198 +	<string>NO</string>
       
 29199 +	<key>GuidesVisible</key>
       
 29200 +	<string>YES</string>
       
 29201 +	<key>HPages</key>
       
 29202 +	<integer>1</integer>
       
 29203 +	<key>ImageCounter</key>
       
 29204 +	<integer>2</integer>
       
 29205 +	<key>KeepToScale</key>
       
 29206 +	<false/>
       
 29207 +	<key>Layers</key>
       
 29208 +	<array>
       
 29209 +		<dict>
       
 29210 +			<key>Lock</key>
       
 29211 +			<string>NO</string>
       
 29212 +			<key>Name</key>
       
 29213 +			<string>Layer 1</string>
       
 29214 +			<key>Print</key>
       
 29215 +			<string>YES</string>
       
 29216 +			<key>View</key>
       
 29217 +			<string>YES</string>
       
 29218 +		</dict>
       
 29219 +	</array>
       
 29220 +	<key>LayoutInfo</key>
       
 29221 +	<dict>
       
 29222 +		<key>Animate</key>
       
 29223 +		<string>NO</string>
       
 29224 +		<key>circoMinDist</key>
       
 29225 +		<real>18</real>
       
 29226 +		<key>circoSeparation</key>
       
 29227 +		<real>0.0</real>
       
 29228 +		<key>layoutEngine</key>
       
 29229 +		<string>dot</string>
       
 29230 +		<key>neatoSeparation</key>
       
 29231 +		<real>0.0</real>
       
 29232 +		<key>twopiSeparation</key>
       
 29233 +		<real>0.0</real>
       
 29234 +	</dict>
       
 29235 +	<key>LinksVisible</key>
       
 29236 +	<string>NO</string>
       
 29237 +	<key>MagnetsVisible</key>
       
 29238 +	<string>NO</string>
       
 29239 +	<key>MasterSheets</key>
       
 29240 +	<array/>
       
 29241 +	<key>ModificationDate</key>
       
 29242 +	<string>2008-11-17 11:41:28 -0700</string>
       
 29243 +	<key>Modifier</key>
       
 29244 +	<string>Preston Jackson</string>
       
 29245 +	<key>NotesVisible</key>
       
 29246 +	<string>NO</string>
       
 29247 +	<key>Orientation</key>
       
 29248 +	<integer>2</integer>
       
 29249 +	<key>OriginVisible</key>
       
 29250 +	<string>NO</string>
       
 29251 +	<key>PageBreaks</key>
       
 29252 +	<string>YES</string>
       
 29253 +	<key>PrintInfo</key>
       
 29254 +	<dict>
       
 29255 +		<key>NSBottomMargin</key>
       
 29256 +		<array>
       
 29257 +			<string>float</string>
       
 29258 +			<string>41</string>
       
 29259 +		</array>
       
 29260 +		<key>NSLeftMargin</key>
       
 29261 +		<array>
       
 29262 +			<string>float</string>
       
 29263 +			<string>18</string>
       
 29264 +		</array>
       
 29265 +		<key>NSPaperSize</key>
       
 29266 +		<array>
       
 29267 +			<string>size</string>
       
 29268 +			<string>{612, 792}</string>
       
 29269 +		</array>
       
 29270 +		<key>NSRightMargin</key>
       
 29271 +		<array>
       
 29272 +			<string>float</string>
       
 29273 +			<string>18</string>
       
 29274 +		</array>
       
 29275 +		<key>NSTopMargin</key>
       
 29276 +		<array>
       
 29277 +			<string>float</string>
       
 29278 +			<string>18</string>
       
 29279 +		</array>
       
 29280 +	</dict>
       
 29281 +	<key>PrintOnePage</key>
       
 29282 +	<false/>
       
 29283 +	<key>QuickLookPreview</key>
       
 29284 +	<data>
       
 29285 +	JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvYmoKPDwgL0xlbmd0aCA1IDAgUiAvRmls
       
 29286 +	dGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAGVlktvJEUQhO/9K5IbHFyuR9brioEV
       
 29287 +	nFh5JM5o5MWsPIA9IP4+X2b12gPrBbHWSt3lzkdFREb6Ud7Ko0R+asr+/+lOfpBfJIYW
       
 29288 +	/Z/8LNc35yTHsyROh/ZYxyTgfJTrN/zip7NcxVD3r1+e9oQbCd/J9fd3T8e7337/48cH
       
 29289 +	eSLjm3O2wEfR2ry8tiJ5hDJSVEk9pF7jkONJrr89JfnqV/p8uz1KK1YpJynNHlKVk2gJ
       
 29290 +	JZWqdqZz9iklBc21ZmkxlJoin0/vsEonTo6b9lC79iQzh6azSc7FYjINZWIkk4MCKtrG
       
 29291 +	ejhyRpZeRYcSNIbk7oXmtk5m4mRaD/NvYcOK1bKnpnkuu4qt6jqEVujLmtuOvFgdrXv7
       
 29292 +	mcjWQxut71ds5LcbAIADIcTkDgpt4TKmyigWoXNzVAYtfYzdUe5fOT25ACxMtZAQiPeX
       
 29293 +	xEVTSCkNeaBLDbXWDhwfnxH1QHJX0sfiulDDhhpMgMnUJZAGDLkCea3T6b+9T3K+N/pf
       
 29294 +	F6qL8+ZW0hYDjM4ESlFubyTlAFd/kvfwRKilj3IFRdTQHJsk6EwzW5UvDwBY1xf2cNVL
       
 29295 +	SDWiyTa2AyL8JgXr8fBOPv/sCzm8l68PNERtwm0wGIb4yTrK2LiYt3+rI5+uY1df7JW8
       
 29296 +	CD9tS/XNGUdxFSUs1e+yiQPuXPUMyVI9lL2qeh2bq16Rjet+qRdVLcWrceySz8+S30+A
       
 29297 +	zyTPTNiYWMQSe10Z64vY+/OoudZNus9dudwRqE+rVVty97v63bZd7iZHL7PkjnfYe5xw
       
 29298 +	vvTOAJtW5+gMv3vFB8RetF6yzYQ5x3/L08wKeQZ3t1pin5Fp1GpD0ORKy7AnlLN/kbPS
       
 29299 +	2ofZwIlqwA1G35aT5d3JyGncLARwMKZb0Tt2gIAHLOBGpTJExgtaxZ/MjxbK+B8mYdQ0
       
 29300 +	5QuYoSumBgvBBXEsP0n9khlidnI8xrK6LZqBzVm2bFzEhIjMiIwcPyGGeQqjdjrwT7h+
       
 29301 +	LYHiADxbwGHg6+Uux+3+4u1/I6yj5DSiaKw0CBBXpRSDluldCFM4zgHvPa9zujJygMR3
       
 29302 +	RXlB+JWt1t0PvmNg35PwHxsOE4mw1Weu0cykNci2JJjJhX+sVUm1pt4BgIOOr6HBGsLd
       
 29303 +	eYUt0uRFYFIEgAl4n6yrBqw6QuzKxtA0wdf4g/OZ2QWMAd4DfUgXOqHaYjtc4/Gjshmh
       
 29304 +	y/PP/YQ62VDzj4dlZttYGh2ZHAwCzaCeVcoaJty3VGm2b4bnZwuhC2LommlOA9lxF2ub
       
 29305 +	WDS6QrjdWjcjNZJ3Uzh/OyA6IjK7cIVwj0t8fPwuD05ya6b+F7C1v1cKZW5kc3RyZWFt
       
 29306 +	CmVuZG9iago1IDAgb2JqCjk4MwplbmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFnZSAv
       
 29307 +	UGFyZW50IDMgMCBSIC9SZXNvdXJjZXMgNiAwIFIgL0NvbnRlbnRzIDQgMCBSIC9NZWRp
       
 29308 +	YUJveCBbMCAwIDUxMiA1MTJdCj4+CmVuZG9iago2IDAgb2JqCjw8IC9Qcm9jU2V0IFsg
       
 29309 +	L1BERiAvVGV4dCAvSW1hZ2VCIC9JbWFnZUMgL0ltYWdlSSBdIC9Db2xvclNwYWNlIDw8
       
 29310 +	IC9DczIgMTIgMCBSCi9DczEgNyAwIFIgPj4gL0V4dEdTdGF0ZSA8PCAvR3MxIDE3IDAg
       
 29311 +	UiAvR3MyIDE4IDAgUiA+PiAvRm9udCA8PCAvRjEuMCAxMSAwIFIKPj4gL1hPYmplY3Qg
       
 29312 +	PDwgL0ltMiAxMyAwIFIgL0ltMSA4IDAgUiAvSW0zIDE1IDAgUiA+PiAvU2hhZGluZyA8
       
 29313 +	PCAvU2gxIDEwIDAgUgo+PiA+PgplbmRvYmoKMTAgMCBvYmoKPDwgL0NvbG9yU3BhY2Ug
       
 29314 +	NyAwIFIgL1NoYWRpbmdUeXBlIDMgL0Nvb3JkcyBbIC0yNzEuMzA2MyAwIDAgLTI3MS4z
       
 29315 +	MDYzIDAgNTQwLjI2NApdIC9Eb21haW4gWyAwIDEgXSAvRXh0ZW5kIFsgZmFsc2UgZmFs
       
 29316 +	c2UgXSAvRnVuY3Rpb24gMTkgMCBSID4+CmVuZG9iagoxMyAwIG9iago8PCAvTGVuZ3Ro
       
 29317 +	IDE0IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2UgL1dpZHRoIDI1NiAv
       
 29318 +	SGVpZ2h0IDI1NiAvQ29sb3JTcGFjZQo3IDAgUiAvU01hc2sgMjAgMCBSIC9CaXRzUGVy
       
 29319 +	Q29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngB7dABAQAA
       
 29320 +	CAKg/p+2Bx4QJpBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
       
 29321 +	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
       
 29322 +	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
       
 29323 +	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
       
 29324 +	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
       
 29325 +	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
       
 29326 +	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
       
 29327 +	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
       
 29328 +	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
       
 29329 +	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
       
 29330 +	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
       
 29331 +	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
       
 29332 +	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
       
 29333 +	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBg
       
 29334 +	wIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYM
       
 29335 +	GDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIAB
       
 29336 +	AwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDBgwIABAwYMGDDQBg4DBgwYMGDA
       
 29337 +	wNjAA65NNU0KZW5kc3RyZWFtCmVuZG9iagoxNCAwIG9iago4ODMKZW5kb2JqCjggMCBv
       
 29338 +	YmoKPDwgL0xlbmd0aCA5IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1hZ2Ug
       
 29339 +	L1dpZHRoIDkxMiAvSGVpZ2h0IDkyNiAvQ29sb3JTcGFjZQoyMiAwIFIgL1NNYXNrIDIz
       
 29340 +	IDAgUiAvQml0c1BlckNvbXBvbmVudCA4IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0
       
 29341 +	cmVhbQp4Ae3QgQAAAADDoPlTH+SFUGHAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29342 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29343 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29344 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29345 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29346 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29347 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29348 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29349 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29350 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29351 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29352 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29353 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29354 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29355 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29356 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29357 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29358 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29359 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29360 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29361 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29362 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29363 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29364 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29365 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29366 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29367 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29368 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29369 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29370 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29371 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29372 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29373 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29374 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29375 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29376 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29377 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29378 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29379 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29380 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29381 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29382 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29383 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29384 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29385 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29386 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29387 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29388 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29389 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29390 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29391 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29392 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29393 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29394 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29395 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29396 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29397 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29398 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29399 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29400 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29401 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29402 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29403 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29404 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29405 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29406 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29407 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29408 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29409 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29410 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29411 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29412 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29413 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29414 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29415 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29416 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29417 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29418 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29419 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29420 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29421 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29422 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29423 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29424 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29425 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29426 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29427 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29428 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29429 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29430 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29431 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29432 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29433 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29434 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29435 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29436 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29437 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29438 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29439 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29440 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29441 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29442 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29443 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29444 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29445 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29446 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29447 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29448 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29449 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29450 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29451 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29452 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29453 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29454 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29455 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29456 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29457 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29458 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29459 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29460 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29461 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29462 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29463 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29464 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29465 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29466 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29467 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29468 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29469 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29470 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29471 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29472 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29473 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29474 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29475 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29476 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29477 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29478 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29479 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29480 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29481 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29482 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29483 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29484 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29485 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29486 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29487 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29488 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29489 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29490 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29491 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29492 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29493 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29494 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29495 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29496 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29497 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29498 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29499 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29500 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29501 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29502 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29503 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29504 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29505 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29506 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29507 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29508 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29509 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29510 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29511 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29512 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29513 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29514 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29515 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29516 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29517 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29518 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29519 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29520 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29521 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29522 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29523 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29524 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29525 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29526 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29527 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29528 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29529 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29530 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29531 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29532 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29533 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29534 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29535 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29536 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29537 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29538 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29539 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29540 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29541 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29542 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29543 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29544 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29545 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29546 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29547 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29548 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29549 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29550 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29551 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29552 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29553 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29554 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29555 +	gAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwY
       
 29556 +	MGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAED
       
 29557 +	BgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDAgAEDBgwYMGDA
       
 29558 +	wMvAAKraAAEKZW5kc3RyZWFtCmVuZG9iago5IDAgb2JqCjExMDcwCmVuZG9iagoxNSAw
       
 29559 +	IG9iago8PCAvTGVuZ3RoIDE2IDAgUiAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvSW1h
       
 29560 +	Z2UgL1dpZHRoIDI1NiAvSGVpZ2h0IDI1NiAvQ29sb3JTcGFjZQo3IDAgUiAvU01hc2sg
       
 29561 +	MjUgMCBSIC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4K
       
 29562 +	c3RyZWFtCngB7dKBDQAgDMMw/n+6SHBGvA+aeXMKFAucd8XlNiuw8U9BuQD/5e/bzj8D
       
 29563 +	5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+
       
 29564 +	vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889A
       
 29565 +	uQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/
       
 29566 +	bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQ
       
 29567 +	LsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv
       
 29568 +	284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyU
       
 29569 +	C/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7
       
 29570 +	tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPl
       
 29571 +	AvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+
       
 29572 +	7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5
       
 29573 +	AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79v
       
 29574 +	O/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1Au
       
 29575 +	wH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/b
       
 29576 +	zj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL
       
 29577 +	8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2
       
 29578 +	889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC
       
 29579 +	/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287/wyUC/Bf/r7t
       
 29580 +	/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7Af/n7tvPPQLkA
       
 29581 +	/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vOPwPlAvyXv287
       
 29582 +	/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvwX/6+7fwzUC7A
       
 29583 +	f/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu38M1AuwH/5+7bzz0C5AP/l79vO
       
 29584 +	PwPlAvyXv287/wyUC/Bf/r7t/DNQLsB/+fu2889AuQD/5e/bzj8D5QL8l79vO/8MlAvw
       
 29585 +	X/6+7fwzUC7Af/n7tvPPQLkA/+Xv284/A+UC/Je/bzv/DJQL8F/+vu3f/wUgwjJ6CmVu
       
 29586 +	ZHN0cmVhbQplbmRvYmoKMTYgMCBvYmoKMTIxNAplbmRvYmoKMjMgMCBvYmoKPDwgL0xl
       
 29587 +	bmd0aCAyNCAwIFIgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCA5
       
 29588 +	MTIgL0hlaWdodCA5MjYgL0NvbG9yU3BhY2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21w
       
 29589 +	b25lbnQgOCAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeAHsnYlfTV37/288
       
 29590 +	j4xJUVJRGtCEoggliZCxyFQUlUiGNCgJIXOFyFTKlCljmUMlUaZK4XY/N31fv//jd621
       
 29591 +	9z57n6nxDPvU1ev1PHfts89a61zn+njvz7XW3uuvv/AHI4ARwAhgBDACGAGMQOeIQDfy
       
 29592 +	0132hx7tHB8QPwVGQCciwOiwR48e//nPf/4r9QMH/gPHQaRwjk58FhwkRkCHI0ClSIT4
       
 29593 +	3//27Kmn10vuR0+vZ8///peoEjWpw98zDl0HIkAuT0GLIEWqxN59+vTt269ff8lPv379
       
 29594 +	+vbt07s3iJSoEkSJmtSBrxWHqIsRoGKkWuzVqzcRYn/9AQMMDAwGDhxoyPwMHAh/GgzQ
       
 29595 +	1+/fD1QJmtQDTTKc1MUPjGPGCIg1AqwYe8IFKmiRSNFgoKHRoEGDjY1NTIbAjyn5PxMT
       
 29596 +	Y+PBg4wMQZcD9PszmmQkiWZSrN8sjkv3IgBqJI6xJxEjaNHAAKRobDLE1HSombmFxbBh
       
 29597 +	w+nPsGHDLMzNzYaampqAKkGUA/SBk+TSFShJLlx174PjiDECoosAMY0gRj0qRuCi0WDj
       
 29598 +	IaZDzS2GWVpZjbC2sbG1tWN+bG1trEdYWVkOH2ZuBqIETRoYEEyCJOl1KypSdN8tDkjX
       
 29599 +	IsCqsVevPn37DwAwDjYBLYIUR9jYjRxlb+/g6OjkDD9j4H9OTo4O9vajR9nZgiyHW5iZ
       
 29600 +	DjEmmNTvB2aSgSQqUte+fhyvqCLAqJGiUZ+QcYipmYWllbXtyNH2js5jxrm4uI6f4Obu
       
 29601 +	7j5xIvyfm9uE8a4u48Y6OznYj7KzGWE1zHyoKUjSYED/vqhIUX2vOBhdjAD1jWAbwTXq
       
 29602 +	GxgOMiFiHGEzcrSD0xgX1wnuEz0mT5nq6TVtmrf39One3t7TvLw8p0yePMndbbzLWGdH
       
 29603 +	+1G21lbDzU2HDDYayCmS+EhdjASOGSOg9QiQKg4p4vTpBxeqgEbz4VY2I+0dQYtuEydP
       
 29604 +	8Zw23cd3pt/sOXPn+jM/c+fM9pvlO8PH22vqZA/3CS5jnQCT1pbDzACSAw0oI0llBy9a
       
 29605 +	tf7N4gB0LwIUjlDFoWwcPGSohaW13WgQ44SJk6dOmz5j1uy5/vMXLgoIDFyydGkQ+Vm6
       
 29606 +	ZElgwOJFC+b5z/Hz9fH2nDzJzXUcSNKGQBIUSRlJa62ISN1LBxyxdiNA4QjGsS9cqYIa
       
 29607 +	hxE0Oo8bP3Gyp/eMWXP8FywOXLpsxargkNWhYWFr165bt27t2rDQNauDg1cuDwoMWDjf
       
 29608 +	f7avz7QpHm4uYxxH244gijQyGNCvDxR2EJHa/Waxdx2MAJEjgWP/AQMHmQy1sLIZ5TDG
       
 29609 +	xc3Dc7qvH2hxybKVwWvCwiPWb4jeFBOzecuWrVu3btmyOSYmemNUZPja0JBVy5cGLpo3
       
 29610 +	Z6aP1+SJ4wGSdiOGw1WroYE+FHYAkegidTAlcMhaiwC5ViV1HICjkbGpuaU1qNF14uRp
       
 29611 +	Pn7+CwODVoaEhkdu2LR5a2x8QmJS8s6UXbt2pe7alZKyM2lHQnzcti0xG9eHr10dvHzJ
       
 29612 +	YpDk9KkeE1yc7G2thg0dAhetBJHURWrtw2HHGAHdigDI8T//Jc4R4DjEbPiIkfagxine
       
 29613 +	vnPmBwStXL02YkPM1u3xO3bu2r133/709IOHDh0mP4cOpqcf2Je2JzUlKSFu2+bo9eGh
       
 29614 +	wcsDF/r7+Xh6TBjnNNrGyoJctFJEkmtW3YoJjhYjoKUIsNaxT38DQ2NTCytbe2cXUOPM
       
 29615 +	uQsDV4SsjdgYExuflLI77UD64aPHMzNPnDyVnX0afrKzT508kZWZcezIwfR9e1KTE+O2
       
 29616 +	booKX7MqaPG82T5eHhPGOoy0Hm4GiNTvR65ZUZBa+naxWx2LACtHcq1qYjbcepTjOLfJ
       
 29617 +	RI1LVq4J3wBiTE7de+DQ0Yysk9k5OecuXMzNu3QpH34uXcrLvXjh/NmcM6dOZB47nL5v
       
 29618 +	d8qOuC3RkWHBywLmASMnuY6Bi1Zz08GG5JoVBaljWYHD1VIEmEoOWEe4VjUHOI4Z7+E1
       
 29619 +	g6gxNCJ6S3xSalr64eNZp86cvZB7Kf/y1WvXC2/cuHETfuA/NwqvX71SkJ938VzO6ROZ
       
 29620 +	Rw/u370zITZm/TqiyFnTp7i5OI4cMYyUdfqjILX07WK3OhaBbt2gsNqrN1jHwXCtOtJh
       
 29621 +	nNsUH7/5gSvXRERvjd+5+wCIMTvnQl7+lWuFN27dKbp3/wH8PCQ/8N/79+4W3b554/rV
       
 29622 +	gksXz505mXk0PS11x/aYqLXBQYvm+np5uDqPthk+1MSICFIPL1l1LDVwuFqIAJRyeuox
       
 29623 +	chw2YpSTyyQvX//Fy0LCN25NSNmbfjQTxHjp8jWQ4r0HDx6VPH7y9NmzZ8+ZH/jt6ZOS
       
 29624 +	4ocP7hfdvnH9Sn7uuTMnjh/al5q0PWZ92KrA+X7TJ7uNtbe1NBtCBYmXrFr4erFL3YoA
       
 29625 +	raz27jtgoLHpMOvRY8ZP9vabv2TV2qjN8Tv3ph87ceZ8XsG1G7fvghSfPHv+ovTV6zdl
       
 29626 +	ZeXsT1nZm9evSl++ePb0cTFo8lbhlfyLOacyD+9P3RG7KXz1ssVzZ3i6uzjYWZmzgsQq
       
 29627 +	q24lB45W0xEg8456vcA7GpsOt7EfA9eqcxYtWx2xaXvSblBjzoX8qzdu33tQ/OTZi9LX
       
 29628 +	b8rL31a+q6p6//4D8/P+fdW7yrcV5WVvXr18/rTk4f2im9cLcs9mZx7atythS9TaVYHz
       
 29629 +	ZnpNcnEUChJnPTT9FWN/uhMBiRwHEzmOdZs6wz9gRVjUloTU/UeyzlzIv3ajiIjx5euy
       
 29630 +	8rfvqj5UV9d8/Pjp8+fPX+AH/vPp08ea6uoP799VVpS/KX3+rOThvduFl/POnjp+cE/y
       
 29631 +	9k3hwUsX+Hl7uDqOpISEaQ9YqYOC1J30wJFqOAK0ltNH32AwXKzaj3X39PUPDF4XHZu8
       
 29632 +	52BG9vn8azfvPighYqyoBC2CEL98ra2rl/qpq6v9+uUzqPL9u7dEkk8e3QdF5uacOLp/
       
 29633 +	V/zmyDXLFs6ePpkI0swEpj16Y01Hw18wdqdLESDmEZasGgzi5DhvSXB4THzK/iMncvKu
       
 29634 +	3Lj74PGz0jflle+raz59+QpK/NbQ0Pj9+w/Jz/fvjY0N3+rrQZSfP1Z/qHpb/vrF0+L7
       
 29635 +	t6/nXzidkb57x9ao0OWL5hBB2lkONTYc0LeX3n96ICB1KUVwrBqMADGPvfsZGA2xGDF6
       
 29636 +	jJun77ylIRExCanpx7MvFBTeATW+KntbRcRYW18PSvzx8+fff/+S/vn7758/vhNR1hFJ
       
 29637 +	vq8kinx07+bVvJysw2nJsRvDViyeM93DxcF2+NDBA/VhGhKvWDX4BWNXuhQBMtXRq+8A
       
 29638 +	QxMzq5HOE6b6zlsSErk5cffBzJzcqzfvFT8rLXv7vvojiPFbA2iRKPGf//3vf/8KfuDP
       
 29639 +	f/6B43//BE0SSdZ8eAeKfPLgTmH+uZNH9+3cvnHtikWzvSe52NsMMx1k0B+vWHUpQXCs
       
 29640 +	mowAKebA1erAwUMt7RzHT57hD3LckrjnUFbOpet3Hjx58QbY+AkuU0GMoMV//gEl/v79
       
 29641 +	h/w00R/66+/fv//993+gSSLJb/W1oMjK8lfPiu/duHwh+9j+lO0bw5Yv8ps2cezoERZD
       
 29642 +	jAb0Q0Bq8ivGvnQoAlDMIVerYB5tHFwm+0ApJ2Jz4p7DJ87l37j76Nmr8ndEjd8af/wk
       
 29643 +	XAQtskL8P+EPEeafP6BJKskf3xuIIt+/ffPi8YNbV3NPHz9ABLlswSxPN+dRVmbG9IoV
       
 29644 +	V5brUJLgUDUVAcnVqvmI0eMmes8JWBUeQ+VYcONeyfM3bz/UfCFq/JsTIyhPqET+d4Ek
       
 29645 +	AZIN9V8/Vb8rL3368Pa13DPH9++M3bAmaN6MKeMdbYebDmauWLGko6kvGfvRmQh0I8Wc
       
 29646 +	/gaDh4J5dPOctXDFuk3xuw+dOFdw4/7jl2UAx9r6BkaNQEalYmRlSSlJIAmK/Fb3peZ9
       
 29647 +	xetnj+5cA0LuT962PiTQ38fDxd6aXLH2xStWnUkRHKjmIsDg0cCIXK26Tp4xLyh0Y1zq
       
 29648 +	wayzIMcnpeVVBI7ffxI2UjXyNCS//T/mR+ogoSS9bP37RyMg8sNbRpDZR9N2bA5fFTB7
       
 29649 +	mvsYesXavw9MQiIgNfdFY086EQHAY68++gNNyNXqpOlzA0PWx6akZ+bks3L8SuGoSI2s
       
 29650 +	GOUlKVEkILL2c3XlGyDk1YunjuxJiFm3fIEvc8U6yABLOjqRHzhIjUaA4pEUcyztnCZ4
       
 29651 +	zlq0KnxL0r7jZy4V3nv8svz9x6/1jSwcpV2jlBjpH0JIMletcNH6vaGOCvLh7SvnTxxM
       
 29652 +	jdu4ZilcsY6zH2FuYgiTkAhIjX7X2Jn4I8Dg0XCIhbU91FbnBYVtit9zJDv3+t2SF+VV
       
 29653 +	rBzlLlXl1SgrSeai9dffP4gg4ZL1wc2Cs5kHdm6NDF4828vNeaQllHQQkOJPDxyhZiPA
       
 29654 +	4pEUc8a4T5sTGBIVu+vgifNX7jx6XlZV87WeWEeQoxQclaiRHOYhSRBJ6jpEkB8qXj25
       
 29655 +	f+PSmWNpiTFrl8+fMZmWdBCQmv2qsTcdiACHR1LMmeK7cEX45qT9GTn5Nx88e1NZ/YVc
       
 29656 +	rBLrKJRjM2qUU+RvIshvdZ/el78sKbp28eSh1LgNqwPnek+Eks5QBKQO5AcOUaMR4PE4
       
 29657 +	auzE6f5L1myM330kO6/w3pNXb6s/K5BjC2qURSQI8m8o6nysKnv+8Ba5Yk3eEr5y4cwp
       
 29658 +	rg42w4YgIDX6XWNn4o+ABI+2juOnQjEnYuvO9Cy4Wi1+Uf7+U13DD9mL1ZblKFQkMZH/
       
 29659 +	g6JO/ZfqytdP4Yr19NE98dGhS/2nTxqLgBR/duAINRwBDo9mVjDX4eO/NGxTwt5jZ/Jv
       
 29660 +	wNXqu5qv32Tl2Co1ygvyZ2P95w/kivXqhRPpKdsiVi2aNXW8IwJSw182dif6CFA8DjAa
       
 29661 +	MszWEeY6FgdHQjHn5MVrdx+XVhDz+Pev/wm9Y2vlKCjrACH/JRaSXLFCjTU/53hawqaw
       
 29662 +	IH+fSeNGo4MUfX7gADUaASEePXz8g8JiEvdl5BTcevgcpjrqGkgtR1DKab0cBYgka3XA
       
 29663 +	QsIV69tXj+9ev3jy4K5YmPPw85zgaIsOUqPfNnYm9ggw7pHgEZYC+C0OXh+beuhU7nUo
       
 29664 +	5lRWw1TH3zDTIamstkmN0oL836+fDaTGSko6ORn7EmMIID0AkGZYYhV7iuD4NBcBaTzO
       
 29665 +	C1obs2NfxtnLtx/RYg6Z6oCrVXZGsa1ylFyzMles3799ra589eReYe6pQ6mx6xGQmvuW
       
 29666 +	sSddiYA0HgOC128HPOYV3n/6upIt5kiuVtsuR16QpMb6s5EA8sWj25fPZuzbEbM2aB4C
       
 29667 +	UlfSBMepmQjI4HEZwWMmg8cPMPX49y+yEKDdeOQvWdmSztcaMuehAJB4m4dmvm/sRdwR
       
 29668 +	EMw9gnukeDwsxGOHrlYpUBkxk5LOr79hzgMBKe6EwNFpMwLK8AhLATg8csWc9lytkvew
       
 29669 +	cKWrAn58EwByu5SDREBqMw+wb3FEAPCo10ffkJl7ZPAo5R55PLZXjpwgm5rInEdj/acP
       
 29670 +	5S+KJQ4S5yDFkQc4ClFEQBEeSXGVw6NgrqP9emQJKQ9IpsQKj9Khc5AISFGkBA5CixGQ
       
 29671 +	xiPMPcoUV1WBRyEgqYMEQHIlVlyko8UvH7sWWwQ4PA6lK1f5uUd5PHaAjhILqRiQszy5
       
 29672 +	VawISLHlB45HsxEQ4HE8vzSHn3tUDR45QRIHSQBJHCQAUrJIZ9I4vM1Ds9879ibKCEjj
       
 29673 +	kaxcZZbmcHiEuUe2uNoxPEquWMmiAGGJla5i5W/zQECKMk1wUBqKgASPNuS+R27lqhrw
       
 29674 +	yAqSAhLuu2IAya9ixfsgNfSFYzdijgCPx1Fj4b5H9sYOunL1wydmaY6K8MgD8l8OkE/u
       
 29675 +	Xc89eYgHpAV5UAACUsz5gmNTbwRk8Qj3PcKNHWrBIwdIskiHAJIs0oHbPI6nJW4Kg2c/
       
 29676 +	8oDs0V29nxlbxwiINQJkf7l+ZIcAIR4LmBs7yENzVOYeifvkVs3RG5PhNo/XFJDkPkj6
       
 29677 +	oAAHGwSkWPMEx6WRCHB4tGDdI8HjSXLfI3tjB7kNmVFRR6s59P20KTrlIQ9IwZN0EJAa
       
 29678 +	+fKxE9FFoHsPHo/TyVNzEtOOw2MB6H2PDB5ZPapEjgoBSR4UsE0CSPKwcr3/dsfdPESX
       
 29679 +	Kjgg9UegW3dm5aqFjQN9qFzkNnhqDoPHauYhVirFI+8gufsgnzMOMmGT5FFzdDcPBKT6
       
 29680 +	v3vsQXwRYPA4iLpHwGOoEI91wscCqAaP8g4SHhRAn6RDHjU3cyo8i9UCANlb7z8ISPEl
       
 29681 +	C45I3RGAyQ5yY4eJFB4vsk/Noc94VDEeFQCSPEmHPGqOAHIieRbrIAPYDxIBqe7vHtsX
       
 29682 +	XwTk8JjAuMfn5BHI6sCjUkDSZ7GSh5VbIyDFlyc4Io1EgOCxN4NH16kz4ZHkxD2qF48K
       
 29683 +	AQnPYt2bQB9WDrt5WJoiIDXy7WMnYosAwWNfA+oeYccOcI8MHuGZq2rDoxQguUfNXb/I
       
 29684 +	PqycBeTA/uggxZYrOB61R0CCR2vY0IriMUX9eFQCyGMEkEv8Ybsr2A8SAan27x47EF8E
       
 29685 +	WDyaWo4cQ/EYnbD3eE4+eSS5GvEoB8i3r57Aw8oBkFsjmO2uwEEiIMWXLTgiNUeA4rH/
       
 29686 +	QBMLHo/pJy5ev0v2l/v67TvsZ6Xy4iozayJcpMM+rDw/59je+Og1S8h+kBJA4poANWcA
       
 29687 +	Ni+mCAjx6O2/JBTweEwDeJQGZP1XupvHNbLdFQtIewSkmNIEx6KZCEjjceHKiK0pgEfY
       
 29688 +	0IrgsV6NeJRykLCbB9mgFba7kgPkf3sgIDWTCtiLCCLQjSmuUvfoPXfJmuh4gseb6naP
       
 29689 +	5JJVcJsHt90VAeTOrbBhsu8UV3trc3SQIsgQHIIGI8Dj0R6KqwtXhhM8XmDw+EW9eJTo
       
 29690 +	kezm0VBH9oMUAtKdc5AISA3mA3al3QjAjVZk7lEej2VVsDu5cEMrVS1dFbQjC8jSx3d5
       
 29691 +	QE52QUBqNzewd41HgMOjuTXg0ZfgcafG8MhfsEoB8szRPfEbSYmVAeSAvr0QkBrPC+xQ
       
 29692 +	OxGgeBxA8ehO3ONGcI9nwD0+K2O3Q5ZsaCXAmup+VQjIrPSdW8JXLPRFQGonJ7BXrUVA
       
 29693 +	gEeXySwes4h7LH1brW73SFTN6ZEH5IOb+RSQqwPneLs7kzlIBKTW0gM71nAE5PG45yjg
       
 29694 +	8YGG8MgLEnbXoSXW0sdFVy8wgFxAADkCS6waTgnsTnsRkMbjghXhW3amaxKPvB4FgLwh
       
 29695 +	AeQ0d2c7S1MjBKT2MgR71mQEeDw6u0+bE7h6Y7yG8cgLUgjI81npyeAgWUAawyrWnvig
       
 29696 +	AE3mBfallQgAHnv27j/Q2HyEPbhHDo9Xi1j3+LfaVq4KCkJSDrKWzEE+kAbkcASkVpID
       
 29697 +	O9V4BBg8Gpla2gnxeENz7lFY0mEBWVFaUnSVA+QM6iCNDRCQGs8N7FDjEZDHY3J61nmC
       
 29698 +	xwpSXNUIHvkLVuogOUCePro7fgOUWKe5OdshIDWeGdihNiLA4XG4nbMbcY8bqHtk8Fir
       
 29699 +	7qU5/CUrd8UqBcjMA8mbwUEiILWRGNinNiLA4NGAcY8ziHtk8FiiUTwqBuSl00ekAdkH
       
 29700 +	F+loI0ewT81FQB6Pu4+eztc4HnlBygNy+XwKSDN0kJpLC+xJOxGQxuP8FeGbkw9kgnvU
       
 29701 +	NB55PXIO8g2UWAkg4zaEBM72cnOiDhIBqZ00wV41FAGCxz4DjEwl7jFu95HTlwCPb6o+
       
 29702 +	atA9SkqsTU1/KCA/V1e8LCm6cp44yHU8IPv1wjlIDWUGdqOFCFA89jMwNiNzjzPmL5fg
       
 29703 +	8WVF9We2uMrsaMVXXtT1G1fRAUD+aKj9+A4BqYWEwC61GgEej05uXrMDQzZI8PhO03hk
       
 29704 +	r1ilAHnnyrnMA0kcIK3AQSIgtZov2LlaI0DwCPuvSvC4bnPSgcxzV+6UaAGPUg6SB2T2
       
 29705 +	kdS4KMZB2pI5SHSQas0IbFybEZDFY5QUHn/8+p9673uUvfKlV6wSQH6oeFnMADIGHKQP
       
 29706 +	LNJBQGozWbBvdUdAgkcrcI8+85drF4+ygKyhDjIv+zABZMBsrwlOtsMQkOrOCWxfexGQ
       
 29707 +	4NGWcY9RcalHsmlx9V1NbYPG8ShxkL+ZEisHyP1JMeuWzfPxGDfaymwwOkjt5Qv2rNYI
       
 29708 +	yOExJmk/cY/FLys+aLq4yly6Ckus32p5QG6PCmYBOcRIHx2kWrMCG9dWBDg8DrN1muA1
       
 29709 +	OyAkanvq4ew8MveoJTxKAbKx/vOHcsZBAiDXIiC1lSbYr2YiwOJxsJnV6HEePvOWrZPg
       
 29710 +	sRzw2Ag3dvxu0tTcI1fZkQfk/RvEQRJA+nkSBznEEAGpmfzAXjQbAYpHfaMhBI+efgHB
       
 29711 +	UniE7ck1XFwVXLE2NREHyQHy8rnM/TsQkJpNDuxN0xGQxePamB2se9QeHqVLrMRBvn7K
       
 29712 +	AnI9BaQjA0g9fBarptMF+1NzBBg8GgIeHSke1zPu8f7T1+AetYVHeQf5ovj25bMISDUn
       
 29713 +	Azav7QgoxOPZy1Bc1SYeZQD5lQKyMO8UOMj1wYvBQSIgtZ042L9aIgB41OujL43HU3k3
       
 29714 +	tI1HJYDM2AcOMoiZgxyKc5BqyQhsVIsRkMFjELjHfZlnL98ufqFdPMoBshIcZGHuqUOp
       
 29715 +	sRSQ4x1taIkVHaQWkwe7VnkEpPG4OBjc46FTeYWAx8qar9pzj6TIyq5ilZRYqYMkgAwL
       
 29716 +	8veZBIt0EJAqTwdsULsR4PA4FOYeJ/n4UzxmiAKPzQNy1lQEpHYzB3tXRwQkeLRxHO85
       
 29717 +	C/AYC3jMFQUeBYD8xcxBvngEJdaMfYkMIMeOQkCqIyWwTe1FQBaPYeAeCR4fse7xlxaW
       
 29718 +	5nBLdJQCcldsZPBiBKT2sgZ7VlcEhHicCniMFBMehYD82Vj/6X05ALIgJyNNFpA9uqsr
       
 29719 +	PtguRkCDEeDxOGoscY9hMYn7MnIKKB4/wcpV7eJRASCf3CvMPXmQB6QFWcWKJVYNpgx2
       
 29720 +	pcYIcHi0APfI4HGXeNwjX2L98/vfXxwgbxXkHE9L3BS21H/6JImDRECqMUmwaY1FoHsP
       
 29721 +	8tScwUOtWDxuSkxj8fge8PhT23jkAfnvP79+fPtaXfn6yb3rBJDbIlctAgfpYMMCsns3
       
 29722 +	jcUMO8IIqCkCMnhcFRm76+DJ3Ov3nrBzj5rYYI6v3ij8jZmDZABZRx0kC8hQDpCDyIMC
       
 29723 +	EJBqShFsVoMREOJxuv/SMMDj8ZyCW1Bc5fD4R9P3PcqKkrsPkgPkKwDkRSlAmhjq99bD
       
 29724 +	/Vk1mDbYlXoi0K07s3LVwsYB3OOiVZHbAI8XKR6rydIcEeCRK7H+IZsHNBJAPn9EAZmw
       
 29725 +	iQByInGQgwz6IiDVkyHYqiYjwOBxEHWPgMfQTQkMHp8DHuvAPUruQ5aFlib/VgLIlG0R
       
 29726 +	qxbNnOoKDhIBqcmkwb7UFQGY7NDrrW9oAnh0JXiM4PD4qlI8eFQAyIe38qHEygJyzCgr
       
 29727 +	UwSkulIE29VgBAge+xpQPE4ULR7lSqxvWQfJAHKKq4O1hcnA/uggNZg42JU6IkDx2J/B
       
 29728 +	45SZBI8pjHsUFx6VAPLY3oTo0CX+3hPHjLREQKojP7BNzUaAxaOp5agxFI/RCXuP5+Tf
       
 29729 +	eigq90icqsBBfoc5SADk3esXT6SnbI1YuXAmAlKzWYO9qSkCDB4HmlhYO7iyeEw/QYqr
       
 29730 +	r96KyT1KBNkkKLESB0kAuWbJXCEgcU2AmnIFm1V/BCR4HDlmorf/klDA4zFR4lEakPVf
       
 29731 +	AJCP7167wAPSHh2k+tMFe1BvBKTxuHBlxNYUwOO1uxSP9d/FMffIzatwi3SYOciqsucP
       
 29732 +	bxJAxksDEh/9qN6UwdbVGIFuTHHV1JLgce6SNdHxBI83xeceJRes/0c2MP/1XQDInVvD
       
 29733 +	Vy70neJqb22OJVY15go2rfYIcHg0t7YH97hwZTjB44Vrdx+De/wiNjxKKjpkkU5D3ceq
       
 29734 +	smcsIDcSB+nOlVgRkGrPG+xAPRGAleRk7pHg0V0Kj2VVn+oaRLI0h7tclXeQpYyDZAAJ
       
 29735 +	+7MiINWTJtiqZiIgxONkX4LHnSLGI69HHpAPbuafObonXgDIAX17ISA1kz7Yi4ojQPE4
       
 29736 +	gMfjRtY9Piur+iiFx//jGaXV34RzkMRBUkBmpe/cEr5igS8CUsXpgc1pNgICPLpweMwi
       
 29737 +	7rFUjO5RWNGRB+TqwDnT3J3JIh0EpGazCHtTVQR4PDqDewxcszF+z9Ez+TcfiBaP/BUr
       
 29738 +	3cCcArLo6gUBIEeYG8Mq1p54H6SqcgTb0VgEJHgcYQ94XLAifMvOdMBjEYtH2H+VvQ1Z
       
 29739 +	LFerQEjuglUAyBuMg2QAaWdpaoSA1FgKYUcqjIAEj3bO7tPmBK7WATzygmQBWVH6uOjq
       
 29740 +	+az0ZM5BIiBVmCHYlAYjAHjs2bv/QGNzKTxeFTUeeT1SQNaSOcgHDCA3EEC6OdsNR0Bq
       
 29741 +	MImwK5VFgMGjkelwKTzeoO6xVjj3KKLLVcEVqwSQJTwgZ0CJFQBpgA5SZVmCDWkoAgwe
       
 29742 +	DRg8ziDuMTk96zzBYwVZmiNK9yhXYuUAefro7ngEpIYyB7tRRwQEeHQj7nFD/G4orooe
       
 29743 +	j/wVqxQgMw8kbw5fPh8BqY5UwTbVHwE5PG5OPpAJeCwROR55PXIO8g04yEunj+yO2xDC
       
 29744 +	O8g+uEhH/TmEPaguAgrweOT0JR3AIyvIJnKbx9/kNo+KlyVFV84LAWlmbNAP5yBVlyvY
       
 29745 +	ktojwOHRjBRXZ8xfHq4zeJQD5DshIGd7uTnREisCUu05hB2oLgIEj30G0OKqm9fswJAN
       
 29746 +	cbsZPL6p+iji4iop6MgA8jMB5J0r5zIPJG1exzpIAsheuEhHdemCLak3AgSPsIOOsTQe
       
 29747 +	rxSVvKyo/swWV7W9RQCjPUX/L1ik86Oh9iMPyKiQQAJIWzIHiYBUbwph6yqMAI9HJxk8
       
 29748 +	vgM8/uAfSS6uuUdOnMyDO1gHKQNIH5iDtEJAqjBZsCl1R0CCRyvGPa7bnHQg89yVO7qB
       
 29749 +	RykHCYCsYQCZfSQ1jgJyAgJS3QmE7as0AhI82jJ4jIpLPZJNiqtvdAKPsg7yQ8XLYuIg
       
 29750 +	9yfFgIP08SCAHIwOUqUpg42pLwJSePSZv3xdDIPHYp1wj+SiVdpBMoDMyz6cuj0qJGC2
       
 29751 +	FwBymKmRPjpI9aUQtqzCCAjwOMFrdkAI4PFwdh7FY40OuEeJIJuafsMcZGP95w/lPCCX
       
 29752 +	zfPxGDcaAanCfMGm1BoBFo+DzaxGj/PwmbcM8LifuEfA4wemuPq7SbzFVaamIwTkN9ZB
       
 29753 +	MoAMDvDzJIAcYoiAVGsaYeMqigDFo77RkGG2TgSPwVHbBXiE/Vcl+z2Ks7gqEKQ8IHfE
       
 29754 +	rEVAqihPsBmNREAWj2sleCwHPDbCjR3ix6O0gySAfP30/g0KyPUUkI4MIPXwUXMaySns
       
 29755 +	pP0RYPBoSPHo6RcQvJ7B4/1nr9/V1OoKHiUlVqGDvHw2cz8Csv2Zge/UQgTk8bgD3ONl
       
 29756 +	cI+6hEcZQH6lgCzMOwUlVgSkFrIKu2xvBACPen30CR4dJwjx+FS38CgPyBfFty+fzdgH
       
 29757 +	gAxiSqxDcQ6yvUmC79NUBBTgcV/m2cu3i1/oFh7lAFkJDrIw99Sh1Nj1wYv9PMc72tAS
       
 29758 +	KzpITWUW9tOeCEjjcTFxj4dO5RXeJ3j8qjvuUdEcpASQYUH+PpNgDhIB2Z4MwfdoMAIc
       
 29759 +	Hocyc49Ba2N27MvQSTw2D8hZUxGQGkwr7KqdEZDg0cZxvKcf4DEW8JhL8Fipa3gUOMhf
       
 29760 +	zCKdF4+og0yMoYAcOwoB2c4swbdpKAJCPE7y8Q8K02E8KgXkrtjI4MUISA2lFHbTgQgI
       
 29761 +	8Th11uLgSF3GowwgP70vB0AW5GSkyQKyR/cOhAzfihFQVwR4PI4ay+AxcV9GzuXbj6C4
       
 29762 +	+gmW5vzSiaU5zII5SUUHNjCHR839+Pa1pvL1k3uFuScP8oC0IKtYscSqrnzCdjsWAQ6P
       
 29763 +	FuAeGTzu0l33KBEk6PHfXz8b6zlAHk9L3BS21H/6JImDREB2LG/w3eqJQPce5Kk5g4da
       
 29764 +	SfCYlpFTQPD4HvD4U9fwyDvIf/8hgKwmgLxOALktctUicJAONiwgu3dTT0CxVYxA+yOg
       
 29765 +	AI8HT+Zev/dEF4urzFUr8yQdBpB1AMjnj24V5BBAhnKAHEQeFICAbH/W4DvVFQEhHqf7
       
 29766 +	Lw3blJh2PKfglgCP7IaPvEMT+2/cfZAcIF8BIC9KAdLEUL+3Hu7Pqq6cwnbbHYFu3enK
       
 29767 +	VRMLGwdwj4tWRW7bdfDkRYrHarI0R4z7r7b47wEHyP+BgxQAMoECciJxkIMM+iIg2500
       
 29768 +	+Ea1RYDB4yDqHgGPoZsSGDw+B/dYB+5Rch9yiyIQ0QlKAJmyLWLVoplTXcFBmhj2R0Cq
       
 29769 +	Lamw4fZGACY79HrrGxI8uhI8RnB4fFWpu3jk5iDJlAcLyIe38sFBsoAcM8rKFAHZ3pTB
       
 29770 +	96kxAgSPfQ0oHid2GjzKlVjfsg6SAeQUVwdrC5OBCEg15hU23a4IUDz2H2hiYe3gOmUm
       
 29771 +	wWMK4x51G49KAHlsb0J06BJ/74ljRloiINuVMPgmtUaAxaOp5cgxFI/RCXuP5+TfeqjT
       
 29772 +	7pEYWYGD/A5zkADIu9cvnkhP2RqxcuFMBKRakwobb28EFOAx/QQprr56q8vuUSJIumhO
       
 29773 +	4CCP7Y2PXrNkrhCQuCagvcmD71N5BIR49PZfEgp4PNYp8CgNSNif9e2rx3evXeABaW9t
       
 29774 +	jg5S5fmEDXYoAjwe7cE9LlwZsTUF8HjtLsVj/XfdnHvkpl0Ec5ANdZ+qyp4/vJmfIwdI
       
 29775 +	fPRjhzII36zKCMBSOVJcpe7Re+6SNdHxBI83dd89Si5Y4TYPWKRDNjDnALlza/jKhb5T
       
 29776 +	XBGQqswkbEsFEeDwaG4NePRduDKc4PHCtbuPwT1+0XU8Sio6ZA6yoe5jVdkzFpAbiYN0
       
 29777 +	pyXWAX17ISBVkEnYhCoiIMCjuxQey6o+1TXo6NIc7nJV3kGWEgeZlc4AEvZnRQepiiTC
       
 29778 +	NlQVASEeJ1M87uxEeOT1yAPywc38M0f3xDOAdCZzkAhIVWUTttPRCFA8DqDukeJxY/ye
       
 29779 +	Y2fAPT4rq/oohUcx76DD41D+N+EcJHGQHCC3hK9Y4IuA7Gj+4PtVGgEBHl0AjyvCt+xM
       
 29780 +	zyLusbQzuEdhRUcekKsD50xzR0CqNJ+wsY5FgMejs7v3nMA1gMejgMcHnQaP/BUr7M9K
       
 29781 +	S6ylj4uuEgfJAXKEuTGsYu2J90F2LJPw3SqIAOCxZ+/+A43NR9gDHhdweCxi8QgbzLG3
       
 29782 +	Ievq1SoQkrtgpYCsJSXWBzcYB8kA0m64qRE6SBUkEzbR4QgweDQytbRzdp82J3B1J8Qj
       
 29783 +	L0gWkBUEkOez0pMJIGeAg0RAdjiPsAGVREAxHq92KjzyepQD5AYCSDdnBKRKkgkb6XAE
       
 29784 +	ODwOt3N24/F4g7rHWuHcow5frgquWCWALAFAZkoB0gAdZIezCRvoYAQYPBow7nEGcY/J
       
 29785 +	6VnnrxaVlFaQpTmdwj3KlVg5B3n6yO54BGQHMwjfrsoIyOJxQ/zuo6fzOx0e+StWaUAe
       
 29786 +	SN4cvnw+dZBmxghIVWYWttWOCMjhcXPygcxOiEdej5yDfAMl1ksAyLgNIYFzvFgH2QdX
       
 29787 +	sbYjifAtKosAwWOfAUamnHvcELf7yOlLnRCPrCCbyG0edA6y4mVJ0ZXzmdKA7IdzkCpL
       
 29788 +	LWyo7RGgeOxnYGxG5h5nzF8ezuHxZedyjwoc5DshIGd7uTnREisCsu1JhO9QWQR4PDq5
       
 29789 +	ec0ODJHg8c27j52ouErkKAPIz9UAyDtXzmUeSNq8jnGQVuAgYfMAXKSjsvTChtoWAYJH
       
 29790 +	2EFHgsd1BI/nrhSVAB4/s8XVJrq2hclo3f5/wSKdHw21HzlApsZFhQQSQNqSRToIyLal
       
 29791 +	EJ6twgjI4jGKc48Ujz/4R5Lr9twj988IFSTnIAkgixlAxgAgfWCRDgJShbmFTbU5AhI8
       
 29792 +	WoF79Jm/fN3mJILHO50Tj1IlVgBkDQPI7MMEkAGzvSYgINucQfgGVUZAgkdbpwnEPUbF
       
 29793 +	pR7JJsXVN+9qahs6HR4lDvI3LbF+/sACcn9SzLpl83w8xo22MhuMDlKVGYZttSECLB4H
       
 29794 +	mwEePQgeY5L2EzwWv6z40PncI7loFTrIbywg8wCQ26OCGUAOG2Kkjw6yDTmEp6ouAhSP
       
 29795 +	+kamwygeA0Kitqcezs7rxHiUAmRj/ecP5YyDBECuRUCqLrGwpfZEgMfj6HEePvOWSeOx
       
 29796 +	EVau/m7qPMVVpqYjD8j7Nygg1wcH+HmCgxw2xBAB2Z5swvd0NAIMHg2HEDx6+gUES+ER
       
 29797 +	9l+V7PfYOYqrAkE2NREHyQHy8rnM/TsQkB1NJ3x/xyIgi8e1MTtY91gO7rFz4lHeQb5+
       
 29798 +	KgVIRwaQevgs1o4lF767zREAPOr10Sd4dKR4XM+4x/tPX0NxtbPiUd5Bvii+ffls5j4E
       
 29799 +	ZJsTCN+gyggoxOPZy1Bc7cx4lAHk15p3AMjCvFOHUrevD14MDhIBqcokw7ZaHQFFeDyV
       
 29800 +	V9jZ8agEkBkEkEH+dA5yKM5BtjqL8EQVRYDD41ArWlwNAve4L/Ps5dvFLzo3HuUAWUkA
       
 29801 +	mQuAjKWAHO9oQ0us6CBVlGjYTKsiIMDjeE+/xcHrY1MPncoleKys+dp53aNkUYCgxPri
       
 29802 +	EThIAsgwAOQkWKSDgGxVCuFJqouAEI+TfPyDwgCPGV0Cj80AMjJ48aypCEjVZRm21NoI
       
 29803 +	SPBo4zh+6qwuhUeBg/wFc5CfPpQDIAtyMvYlMoAcOwoB2do0wvNUEwEej6PGMnhMpHh8
       
 29804 +	xLrHX51waQ6zHkBywQr7s8KTdH58+1rDOchdsRwgLcgiHXSQqsk1bKXlCMjiMTJ2V1dx
       
 29805 +	jxJBEgf56ycA8j0LyLTETdRBSgDZo3vLkcQzMAIdj0D3HuSxAIOHWknwmJaRU3Ab8Pj+
       
 29806 +	EyzN6dx4FDjIf1hAPrl3PffkQQRkxzMLW2hHBDg8WrDuEfB48GRu4b0uUFxlrlqZBwX8
       
 29807 +	oYCso4C8VZBznAByqf/0SQSQg8h9kAjIdiQXvqXNERDicbr/0rBNiWnHeTz+7Ox45AH5
       
 29808 +	LwVkdeVrAORFAOS2yFWLoMTqYGNhQh1k925tji2+ASPQxgh0686sXLWwcYDi6qJVDB6v
       
 29809 +	33vyurKazD12hg3m+OqNwt84QP4PHCQB5PNHFJAJm0IRkG3MJjy9oxFg8DiIukfAYyiD
       
 29810 +	x1vUPdY1EjyyGz4qTOVOcZC7D5ID5CsOkBGrFs2c6soAsrcePvqxo7mG728xAjDZoddb
       
 29811 +	39BEgsdt4B4vAh5fdRk8cnOQZMpDASAnMg6yLzrIFpMJT+hwBAge+xpQPE6keEwg7vHW
       
 29812 +	o+dQXCV4lNyH3ClIqORDKAFkyjYCyCmuDtYWJrCBOQKyw9mGDbQQAQEeXafOXLQqYltK
       
 29813 +	18OjAkA+vJWfc3xvQjRxkBPHjLQ0HWSAgGwhl/DljkeAxaOp1agxPB7zbz3sUniUK7G+
       
 29814 +	pQ7yRDoAciUCsuNZhi20MgIUj/0HmlhYO7hOkcLj265SXGUuYeVKrASQxwggl8z1RkC2
       
 29815 +	Mp3wtA5GgMOj5cgxE739l4RGJ+w9ltP18CgFyO/1X6vfvnp899pFAOTWiJULwUHao4Ps
       
 29816 +	YKbh21sRAWk8LlwZsTUl/cTF63efvCJ4/N4V5h65Co88IG8SQMZHrxECEp9s1YqswlPa
       
 29817 +	G4FuTHHVlOJx7pI10fFdFI8ygPzCAPLCifSdW8NXLvQlgDTHEmt70wzf17oI8Hi0B/fI
       
 29818 +	4vHCtbuPAY9f6rsUHqVKrA11n6rKnj8UANKdK7EiIFuXWnhWOyIAK8nJ3KMMHm8+fF5W
       
 29819 +	1XXmHqUuWOE+SFik871eFpCTEZDtyC98S5siwOHR3Brw6LtwZfjWneknuioehbvr/Gyo
       
 29820 +	+1hV9gwAeebYnviNxEEygBzQtxcCsk05hie3PgIUjwMoHt29wT1upO7x5sNnZVUf6xq6
       
 29821 +	yNIcDo/yDrIUSqwXstJ3bglfsdAX9mdFB9n61MIz2x4BAR5dJrN4zCJ4LO2C7hFkyS2a
       
 29822 +	I6tYGUA+AEAeBUCuDpzj7e5MFukgINueZ/iO1kVAHo97jp7Jv/lADo+daQcdHofyv3GC
       
 29823 +	pPuzgoMsfVzEAXIBAeQIc2NYxdoTb/NoXX7hWW2KgDQeF6wI37IzvSvjsQVATnN3trM0
       
 29824 +	NUJAtinJ8ORWR4DHo7P7tDmBqzfGd3E88oIUAPLqecZBIiBbnVh4YnsiAHjs2bv/QGPz
       
 29825 +	EfbgHjk8Xi1i3SPsv8rehtxVrlZlHWQtKbE+uCFxkNPcnO2GIyDbk2v4npYjwODRyNTS
       
 29826 +	TohH2J5ctrjahfQoKemwgKwoLSkigEyGEuuCGYyDNEAH2XJy4RltjYA8HpPTs84TPFaQ
       
 29827 +	pTldEo/8BSstsXKAPH10d/wGKLEiINuaZHh+qyPA4XG4nbMbcY8bqHtk8FgrnHvsSnjk
       
 29828 +	BSkFyMwDyZvDV8xHQLY6u/DENkaAwaMB4x5nEPeYnJ4JeCzp0njk9SgE5KXTR3bHCQHZ
       
 29829 +	BxfptDHd8PQWIiCPx91HTud3eTzyguQA+ZI4SArI5QwgzYwN+uEcZAvphS+3LQIcHs1I
       
 29830 +	cXXG/OXhm5MPIB7JCgFuTQALyHdvoMTKADIkcLaXmxMtsSIg25ZueHYLESB47DPAyJS4
       
 29831 +	R685gSEb4gCPlwCPb6o+dmH3KBFkE7nN4+/v9Z+rK16W3LlyjgBynQCQvXCRTgsZhi+3
       
 29832 +	IQIUj/0MjKXxeKWo5CVfXG2ipCAZ2rV+BID80VD7kQdkFAKyDSmGp7YhAjwendy8Zgvx
       
 29833 +	+K6r45G9YpUHZBIBpA/MQVoRB4mAbEO64anNR4DgETaYMzazYtzjus1JBzLPXblD8PiZ
       
 29834 +	nXvsqniUcpAAyBoGkNlHUuMoICc42ZJFOuggm08xfLUNEZDg0ZbBY1RcKuseCR5/8I8k
       
 29835 +	71pzj9x1Ob1ilQDyQ8XLYuIg9yfFEEB6EEAORkC2Id3w1OYjIIVHn/nL18UweCxGPFJJ
       
 29836 +	SjtIBpB52YdTt0eFBMz2AkAOMzXSR0A2n2T4aqsjIMDjBK/ZASGAx8PZtLj6rgbxCJJk
       
 29837 +	AfkbSqyN9Z8/lPOAXDbPx2PcaARkq3MNT2wxAiweB5tZjR7n4TNvGeBxP3GPgMcPjHv8
       
 29838 +	3dR13SMhpBCQ31gHyQAyOMDPkwByCOzPiot0Wkw1PKEVEaB41DcaMszWieAxOGo74DGP
       
 29839 +	zD0CHmH/VcmGVl3TPUoE2dQkC8gdMWsRkK3IMDylDRGQxeNaCR7LAY+NcGNHV8ejPCBf
       
 29840 +	P71/gwJyPQWkIwNIPXzUXBvyDk9VHAEGj4YUj55+AcHrGTzef/Ya8UjYSH8UOMjLZzP3
       
 29841 +	IyAV5xQebXcE5PG4A9zjZXCPiEdOjTKA/FrzDgBZmHcKSqwIyHZnHr5RUQQAj3p99Ake
       
 29842 +	HScI8fgU8cjLUb7E+qL49uWzGfsAkEFMiXUozkEqSi881rYIcHgcyhZX18bs2Jd59vLt
       
 29843 +	4heIRzk9wuYBcJvHj29fayoJIHNPHUqNXR+82M9zvKMNLbGig2xb9uHZshGQxuNi4h4P
       
 29844 +	ncorvE/w+BWLq7wkZR2kBJBhQf4+k2AOEgEpm1v4d5sjII1H/yCCxwzEIy9DyW9Sc5Ay
       
 29845 +	gJw1FQHZ5tTDNyiIgASPNo7jPf0Aj7GAx1yCx0rEo0SL9BcJIH8xi3RePKIOMjGGAnLs
       
 29846 +	KASkgvzCQ22KAI/HUeMm+fgHhbF4fITuUVqM8JcSQO6KjQxejIBsU9rhyUoiIMTj1FmL
       
 29847 +	gyMRj3I6lByQAuSn9+UAyIKcjDRZQPboriTYeBgj0EIEmPseBw+1GjWWwWPivoycgtsE
       
 29848 +	j59gac4vXJojUaMCQD65V5h78iAPSAuyihVLrC3kHL6sNAIcHi3APTJ43IXuUaBAmV8Z
       
 29849 +	QP75/e+vn431HCCPpyVuClvqP32SxEEiIJUmHL7QbAS69yCPBWDwOB3c46bENBaP7wGP
       
 29850 +	PxGP0oLkHCRsYA5zkNWVr5/cu04AuS1y1SJwkA42LCC7d2s26vgiRkBhBLp1Z5bmCPB4
       
 29851 +	8GTu9XtP2OLqP7+73g460gqU+UsIyDoA5PNHtwpyCCBDOUAOIg8KQEAqTDc82EIEGDwO
       
 29852 +	ou5xuv9SgsfjOQW3wD2+/1RH8cjqUSYtu+yfsoB8BYC8SAAZQQDpCoA0MdTvrYf7s7aQ
       
 29853 +	ePiyogjAZAdZuWpiYeMA7nHRqshtuw6evEjxWE2W5nTFDeZa+KeGAyRsYN4oAGQCBeRE
       
 29854 +	4iAHGfRFQCrKNjzWUgRk8Bi6KYHB43MWj5L7kFtI0i70shJAphBAzpzCALI/ArKlzMPX
       
 29855 +	FUSA4LE3g0fXqTMXrYrg8PiqEvGo7N8YOUA+vJWfc3wvC8gxoyxNEZAKcg0PtRwBgse+
       
 29856 +	BsQ9jpkI7pHD40PEozIxwnEZQL5lHGS6BJDWFiYDEZAtJx+eIRsBisf+A00srB1cp1A8
       
 29857 +	pjDuEfHYjB7ZR82R265YB0kAeWxvQnToEn/viWNGIiBlEw3/blUEWDyaWo4cM9Eb8Bid
       
 29858 +	sPd4Tv4txGNzapQC5HeYgwRA3r1+8UR6ytaIlQvBQdojIFuVfXiSTARk8LgyYmtK+glS
       
 29859 +	XH31Ft1jc5JU6CCP7Y2PXrNkrhCQuCZAJuPwz+Yi0I1xjwwe5y4heDyGeGxOiOxrAgf5
       
 29860 +	vf4LAPLx3WsXCCDDWUCao4NsLvHwNUUR4PFoD+5xIYvHa3cfEzzWf8e5R+XKFACyoe5T
       
 29861 +	VdnzhzeJg2QA6c45SHz0o6K0w2NKIgAryUlxlcPjmuh4gsebD5+XMUtzcO5RqSCVAHIn
       
 29862 +	AaTvZHCQCEglSYeHlUWAw6O5NeDRd+HK8K07009cYPD4BfGoVIvkBU6PdAPzuo9VZc9Y
       
 29863 +	QG4kDpIB5IC+uHmAstzD4/IREODR3XvuEgken5VVfapr+MlvEdBsZnbRFzlBwm0e1EGW
       
 29864 +	EgeZlc4C0gUBKZ9veKTZCAjw6DJZiMfSt9WIx5b+meH0yAPywc38M0f3xG9cEzjH292Z
       
 29865 +	zEEiIJtNQHxRKgIUjwOoe6R43Bi/5+gZcI+Ax49SeOy6O+g0J0pOkLD9HAvIIgrILeEr
       
 29866 +	FvjCBuYjqIPsibd5SCUd/qEsAjJ4XBG+ZWd6FnGPiMfmZCh5jdOjPCBXB86Z5u5sZwkb
       
 29867 +	mKODVJZ+eFwmAjwend295wSuZvH4APEokVzzv3CCFADyKnGQPCCNYRUrAlIm7/BPhREA
       
 29868 +	PPbs3X+gsfkIe3CPC1g8Xi1i8QgbzOFjAVqnRwrIWlJifXCDcZAEkG7OdsMRkApTDw8q
       
 29869 +	iACDRyNTSztn92kSPML+q+gem5ch/6oMICtKHxddPZ+VnkwAOYM6SGMDBKSC3MNDchGQ
       
 29870 +	x2NyetZ5gscKUlxFPPKyU/obp0cpQJ4+ujt+AwJSLuHwQLMR4PA43M7ZTRaPtcK5Ryyu
       
 29871 +	KtWjZFEA6yArSksAkJkHkjcjIJtNPnxRNgIMHg0Y9ziDuEcGjyWIR+Xyk3tFESAvnT6y
       
 29872 +	O04IyD64SEc2+/Bv2QjI4nFD/O6jp/MZ94h4lBOesgOcIOUBuXw+dZBmxgb9sMQqm334
       
 29873 +	t0wEpPE4f3n45uQDmeAeEY/KlKf4OKdHzkG+gRIrA8iQwNlebk60xIqAlMk+/FM2AgSP
       
 29874 +	fQYYmbLuMWRD3O4jpy8BHt9UfUQ8KtaewqNUkE1NfyggP1dXvCwpukId5DoBIHvhHKRs
       
 29875 +	AuLfwghQPPYzMDYjc48zODxeKSp5icVVhbJTelAAyB8NtR/fISCFeYa/ty4CPB6d3Lxm
       
 29876 +	Bwrw+A7xqFR7Cl+QB+SdK+cyDyRtZgFpRRwkArJ1edlFzyJ4hB10JHhcR9zjuSt3CB4/
       
 29877 +	s3OPTTTRFKYgHhREQCEgs4+kxkUxDtKWLNJBB9lFlda6jy3Boy2DxyiJeyR4/MHf94hz
       
 29878 +	jwLlKflVDpDFBJD7k2IAkD4eLvZWZoMRkK3Lyy56lgSPVuAefeYvXxeThHhUoraWD0sD
       
 29879 +	soY6yLzsw6nbo0ICZntNcLIdZmqkj4DsolprzccW4HECcY9RcalHsmlx9V0N4rFlBcqc
       
 29880 +	wQLyN5RYG+s/fyh/KQHksnk+HuNGIyBbk5Rd9xwWj4PNrEa7ePjMWwZ43E/cY/HLig/o
       
 29881 +	HmXE1oo/hYD8VisEZHCAnycBJNnAHBfpdF3FNf/JKR71jUyH2ToBHgOCo7anHs7OI3OP
       
 29882 +	gEfYYE7yUDl0j61QI5yiBJA7YtYiIJtPRXz1r78EeBwnjcdywGMj3NjxuwmLq61TInOW
       
 29883 +	LCBfP71/gzrI9RSQjgwg9fBZrCg/BRFg8Gg4hODR0w/x2BblKTlXASAvn83cj4BUkH54
       
 29884 +	SDoCsnhcG7ODdY+IRyVya/GwFCC/1rwDQBbmnYISKwJSOvnwL7kIAB7J9uSAR0eKx/WM
       
 29885 +	e7z/9DW6xxaFp+wEWUC+KL4NgNwHgAxiSqxDcQ5SLhPxAERAIR7PXr5T/ALxqExtLR+X
       
 29886 +	AWQlAWTuqUOpseuDF/t5jne0oSVWdJAoQdkISONxcTDB46m8QorHr1hcbVl6is9QCMgM
       
 29887 +	AGRYkL/PJJiDREDKZiL+DRHg8DjUajQprgaBe9yXcfbybcSjYp219mhzgJw1FQGJ4lMc
       
 29888 +	AQkebRzHe/oBHmNTD53KJXisrEE8tlZ9Cs6TAPIXs0jnxSNwkBn7EhlAjh2FgFSckF37
       
 29889 +	qBCPk3z8g8IQjwq01Z5DSgC5KzYyeDECsmurTvmnF+Jx6qzFwZGIx/aIT9F7pAD56X05
       
 29890 +	ALIgJyNNFpA9uiv/dvCVLhYBHo+jxjJ4TKTu8RFbXP2FS3MUSa1Vx+QBea8w9+RBHpAW
       
 29891 +	ZBUrlli7mOSa/bgcHi3APTJ43IXusVVqa8VJPCB/NtZzgDyelrgpbKn/9EkSB4mAbDZF
       
 29892 +	u9SL3XuQxwIMHmolwWNaRk7BbcDj+0/1jT8Rj62QndJTOEDC/qw/vn2trnz95N51Asht
       
 29893 +	kasWgYN0sGEB2b1bl8o5/LBKI6AAjwdP5hbee4LFVaUqa8MLDCD//P7318/GOgrIWwU5
       
 29894 +	BJChHCAHkQcFICCVJmgXe0GIx+n+S8M2JaYdzym4JcAju6NVG5IQT5VEQBaQrwCQFwkg
       
 29895 +	IzhAmhjq99bD/Vm7mOyUfdxu3enKVRMLGwdwj4tWRW7bdfDkxesEj9Vk7hE3mJNIq32/
       
 29896 +	cID8HwvI548oIBMoICcSBznIoC8CUll+drXjDB4HUfcIeAzdlMDg8Tm4xzrqHhGP7RMi
       
 29897 +	+y4lgEwhgJw51RUcpIlhfwRkV9Odks8Lkx16vfUNCR5dp85ctCqCw+MrxGOHZMi/WQ6Q
       
 29898 +	D2/l5xzfywJyzChLUwSkkuzseocJHvsaUDxOVIRHyWM6+PzC39oWARlAvmUcZDoDyCmu
       
 29899 +	DtYWJrCBOTrIric++U9M8dh/oImFtYPrFIrHFMY9Ih7bJrrmzlYIyGN7E6JDl/h7Txwz
       
 29900 +	EgEpn5hd9AiLR1PLkWMoHqMT9h7Pyb/1kHOPiMfmhNbK1wSA/A5zkADIu9cvnkhP2Rqx
       
 29901 +	cuFMBGQXlZ6ijy2Dx5UR21LST5Di6qu3WFxtpdpacZoSQMZHr1kyVwhIXBOgKEm70DEh
       
 29902 +	Hr3nLgkFPB5DPLZCYW07RQjI+i8AyMd3r10ggAyngLS3NkcH2YVUp/Sj8ni0B/e4cGXE
       
 29903 +	VoLHa3cfEzzWf8e5x7bJTvnZ0oCsKnv+8GZ+zrG9DCDdOQeJj35Umqld4wVYKkeKq9Q9
       
 29904 +	Ah7XRMcTPN5E96hcWe17RQkgdxJA+k52RUB2Db218Ck5PJpbAx59F64M37oz/cQFBo9f
       
 29905 +	EI/tk57idwkA2VD3sarsGQvIjcRBMoAc0Bc3D2ghYTv5ywI8ukvhsazqU13DT36LAMU5
       
 29906 +	hkdbHwFZQJYSB5mVzgLSBQHZyaXWmo8nxONkxGPrxdWOMzk9/oZVrAwgH9zMP3N0T/zG
       
 29907 +	NYEASGcyB4mAbE3Wdt5zKB4HUPdI8bgxfs+xM+Aen5VVfZTCI+6g0w4FyryFEyRsP/ed
       
 29908 +	lFhLHxdRQG4JX7HAd7KL/QgssXZepbXqkwnw6AJ4XBG+ZWd6FnGPpW+r0T3KyKnDf3J6
       
 29909 +	lAfk6sA509yd7RCQrcraznsSj0dnd+85gasBj0cBjw8Qjx0Wn6IGOEEKAHmVOEgekMaw
       
 29910 +	irUn3gfZeRXX7CcDPPbs3X+gsfkI2J7cdwGHxyIWj7DBHHufFV6tKpJXm49xeqSArCUl
       
 29911 +	1gc3GAfJAnK4qRE6yGZTtlO/yODRyNTSztl9GuKxzfpq8xs4QbKArAAHefV8VnoyAeQM
       
 29912 +	6iCNDRCQnVpzzXw4eTwmp2edv4p4bLPOWvsGTo8ygNwdv4EA0s3ZDgHZTL529pc4PA63
       
 29913 +	c3bj8Qjbk0NxtVY494iXq60VXEvncYKUALIEAJmZnrwZAdnZ1dbi52PwaMC4xxnEPTJ4
       
 29914 +	LCmtIMVVdI8tiasdr3N6FALy0ukj0oDsg4t0WkzeTniCLB43xO8+ejof8dgOmbX+LZwg
       
 29915 +	pQF5AAC5fD51kGbGBv2wxNoJ5dbSR5LG4/wV4ZuTD2SCe0Q8tl5dbT+T0yMHyDdQYiWA
       
 29916 +	jNsQEjjbi3WQCMiWkrcTvk7w2GeAkSnnHjfE7T5y+hLg8Q26x7brrNXvoIJsavpDAfm5
       
 29917 +	uuJlSdGV85kAyHUCQPbCOchOqLhmPxLFYz8DYzMy9zhj/nIJHl+ie2y1uNpxogCQPxpq
       
 29918 +	P76TAaQTLbEiIJvN3c74Io9HJzev2YEhPB7fYXG1HTpr9VvkAXnnyrnMA0kcIK2Ig0RA
       
 29919 +	dkbNNfOZCB5hBx0JHtcR93juyp0SwONntrjaRFOn1YmGJ7YqAgoBmX0kNS6KOkgnWzIH
       
 29920 +	iYBsJnc740uyeIySuEeCxx/8fY8499gqlbXhJDlAFhNA7k+KAQfpA4t0rMwGIyA7o+aa
       
 29921 +	+UwSPFqBe/SZv3zd5iTEYxs01ZFTpQFZQx1kXvbh1O1RIQGzvSY42Q4zNdJHQDaTvZ3v
       
 29922 +	JQkebZ0mEPcYFZd6JJsWV9/VIB47orZWvJcF5G8osTbWf/5Q8VICyGXzfDzGjUZAdj7B
       
 29923 +	Nf+JWDwONrMa7eJB8BiTtJ+4x+KXFR/QPbZCUh06RQjIb7VCQAYH+HkSQJINzHGRTvM5
       
 29924 +	3JlepXjUNzIdRvEYEBK1PfVwdh6ZewQ8wgZzkkeSo3vskPKUvFkGkOUSQK5FQHYmmbX2
       
 29925 +	swjwOM7DZ94yHo/lgMdGWLn6uwmLq0rEpILDsoB8/fT+Deog11NAOjKA1MNnsbY2oXX8
       
 29926 +	PAaPhkMIHj39AoIRjyoQWVuaUADIy2cz9++IQUDquLTaM3xZPK6N2cG6R8RjW1TV/nMV
       
 29927 +	ALIw7xSUWBGQ7UloHX8P4FGvjz7BoyPF43rGPd5/+hrdY/s11qZ3ygLyRfFtAOQ+AGQQ
       
 29928 +	U2IdinOQOq6yVg9fIR7PXr5T/ALx2CZRdeBkKUB+rakEB1mYe+pQauz64MV+nuPRQbY6
       
 29929 +	m3X/REV4PJVXSPH4FYurHVBZG96qEJAZFJD+PpNgDhIBqftKa9Un4PA41Go0Ka4GgXvc
       
 29930 +	l3H28m3EYxvk1OFTmwPkrKnjHW3oHCSWWFuV0jp9kgSPNo7jPf0WB6+PTT10KpfgsbIG
       
 29931 +	8dhhobW2AQkgf9FFOuUvHoGDzNiXGBMWBIAcOwoBqdMqa/XghXic5OMfFIZ4bK2EVHqe
       
 29932 +	EkDuio0MXoyAbHU66/yJQjxOnYV4VKnI2tKYFCA/vSeALMiRB2SP7jqfcvgBlEeAx+Oo
       
 29933 +	sQweE6l7fMQWV3/h0py2iKoD58oD8l5h7slDPCAtyCpWdJDKc7kzvMLh0QLcI8FjZOwu
       
 29934 +	dI8dUFUH3soD8mdjPQfI42mJm8KW+k/nHSQCsjPoTtln6N6DPBZg8FArCR7TMnIKbgMe
       
 29935 +	33+qb/yJeOyAwNr4Vg6Q//7z68e3r9WVr5/cu5578uCubZGrFoGDdLBhAdm9m7IvE4/r
       
 29936 +	egQU4PHgydzCe0+wuNpGNangdAaQf37/++tnYx0A8vmjWwU5BJChHCAHkQcFICB1XXXK
       
 29937 +	xy/E43T/pWGbEtOO5xTcEuCR3dFKBemGTbQQAVlAvgJAXpQCpImhfm893H5OeT7r+Cvd
       
 29938 +	utOVqyYWNg7gHhetity26+DJi9cJHqvJ3CNuMNeChFT7MgdI2MBcCMgECsiJZA5ykEFf
       
 29939 +	BKSOi66Z4TN4HETdI+AxdFMCg8fn4B7rqHtEPKpWcs22pgSQKdsiVi2aOdUVHKSJYX8E
       
 29940 +	ZDMJrdsvwWSHXm99Q4JHV4LHCA6PrxCPzQpHXS/KAfLhrXxwkCwgx4yyMkVA6rbkmh09
       
 29941 +	wWNfA4rHiYrwKHlMh7ryD9uVjoAMIN+yDpIB5BRXB2sLE9jAHB1ks1mtsy9SPPYfaGJh
       
 29942 +	7eA6ZSbBYwrjHhGP0jLR3F8KAXlsb0J06BJ/74ljRloiIHVWbi0OnMWjqeXIMRSP0Ql7
       
 29943 +	j+fk33rIuUfEo+aEyPYkAOR3mIMEQN69fvFEesrWiJULZyIgW0xpXT5BAR7TT5Di6qu3
       
 29944 +	WFzVuBKFgmz6Q7afY0qsxEEe2xsfvWbJXCEgcU2ALktP4diFePSeuyQU8HgM8agtIQr1
       
 29945 +	+H9k+7lf3+u/ACAf3712gQAynALS3tocHaTCbNb5gzwe7cE9LlwZsTUF8Hjt7mOCx/rv
       
 29946 +	OPeoHWUKHGRD3aeqsucPb/KAdOccJD76Uef1J/sBYKkcKa5S9wh4XBMdT/B4E92jdnTI
       
 29947 +	9Sp0kAJA7iSA9J3iioCUzeNO8jeHR3NrwKPvwpXhBI8XGDx+QTxy8tD8f6UA+bGq7BkL
       
 29948 +	yI3EQTKAHNAXNw/oJDKUfAwBHt2l8FhW9amu4Se/RYDmM7Jr9ygLyFLiILPSGUDC9nPo
       
 29949 +	ICU53Il+EeJxMsXjTsSjKP4h4PRISqwNdQSQD27mnzm6J37jmkAApDOZg0RAdiIp0o9C
       
 29950 +	8TiAukeKx43xe46dAff4rKzqoxQecQcdTauUEyRXYuUAuSV8xQJfAOQILLF2NjX+JcCj
       
 29951 +	C+BxRfiWnelZxD2Wvq1G96hpBUr3x+lRHpCrA+dMc3e2s4QNzNFBdipN8nh0dveeE7gG
       
 29952 +	8HgU8PgA8SitDa38xQkS9melc5Clj4uuEgfJA9IYVrH2xPsgO40kAY89e/cfaGw+ArYn
       
 29953 +	913A4bGIxSNsMMfeZ4VXq1pQJKdHCsha6iBvMA6SBeRwBGSnkSL9IAwejUwt7Zzdp80J
       
 29954 +	XI141ILslHfJCZIFZAUB5Pms9GQCyBnUQSIgO5Mg5fGYnJ51/iriUblENPoKp0cZQO6O
       
 29955 +	30AA6eZsh4DsTHL8i8PjcDtnNx6PsD05FFdrhXOPeLmqUR1KOuMEKQFkCQAyMz15Mw9I
       
 29956 +	A3SQnUWTDB4NGPc4g7hHBo8lpRWkuIruUaILbf3C6VEIyEunj0gDsg8u0ukcipTF44b4
       
 29957 +	3UdP5yMetaU+Bf1ygpQG5AEA5PL51EGaGRv0wxJrp9CjNB7nLw/fnHwgE9wj4lGBMLR0
       
 29958 +	iNMjB8g3zx7cIICM2xASONvLzYk6SARk59Aj3NjRZ4CRKeseQzbE7T5y+hLg8Q26Ry3J
       
 29959 +	T75bKsgmch8kzEF+rq54WVJ05XwmAHKdAJC9cA5S9xVJ8djPwNiMzD3O4PB4pajkJbpH
       
 29960 +	eV1o64gMIN8hIHVfeYo/AXGPDB6d3LxmBwrw+A6Lq9qSn3y/8oC8c+Vc5oEkDpBWxEEi
       
 29961 +	IBXnuA4dJXiEHXQkeFxH3OO5K3cIHj+zxdUmmgzyOYJHNBcBASB/NNR+ZACZfSQ1Lopx
       
 29962 +	kLZkDhIdpA4pT/FQZfEYJXGPBI8/+Psece5Rc+JT1JMcIIsJIPcnxYCD9PFwsbcyG4yA
       
 29963 +	VJzjOnRUgkcrcI8+85ev25yEeFQkB60fkwZkDQVkXvbh1O1RIQGzvSY42Q4zNdJHQOqQ
       
 29964 +	9hQNVYJHW6cJxD1GxaUeyabF1Xc1iEeti1A4ABaQv6HE2lj/+UPFSwkgl83z8Rg3GgGp
       
 29965 +	KMF16xiLx8FmVqNdPAgeY5L2E/dY/LLiA7pHoRq0/7sQkN9qhYAMDvDzJIAkG5jjIh3d
       
 29966 +	UqD0aCke9Y1Mh1E8BoREbU89nJ1H5h4Bj7DBnOSR5OgeRSLIpiYOkOUSQK5FQEqnta7+
       
 29967 +	JcDjOA+fect4PJYDHhth5ervJiyual+JzAhkAfn66f0b1EGup4B0ZACph89i1VU50hs7
       
 29968 +	+ugbDiF49PQLCEY8ikV7Csch4yAJIC+fzdy/IwYBqbMSFA5cFo9rY3aw7hHxqFAQWj6o
       
 29969 +	AJCFeaegxIqAFKa1zv4O7lGPwaMjxeN6xj3ef/oa3aOWpae4e1lAvii+DYDcB4AMYkqs
       
 29970 +	Q3EOUmfVSB4qR5bmkOIqdY8Uj2cv3yl+gXhUrAdtH5UC5NeaSnCQhbmnDhFALvbzHI8O
       
 29971 +	UnfFCCOXxuPiYILHU3mFFI9fsbiqbfEp6l8hIDMoIP19JsEcJAJSZyXJ4XEog8cgwOO+
       
 29972 +	jLOXbyMeFSlBHMeUATIWADlr6nhHGzoHiSVWXRSlBI82juM9/QCPsamHTuUSPFbWIB7F
       
 29973 +	oT+5UUgA+Ysu0il/8QgcZMa+xJiwIADk2FEISF2UIhmzEI+TfPyDwhCPctkvvgNKALkr
       
 29974 +	NhIBqatKZMYtxOPUWYhH8WlP4YikAPnpPQFkQU5Gmiwge3TX7ezscqPn8ThqLIPHROoe
       
 29975 +	H7HF1V+4NEehHrR9UB6Q96DEepAHpAVZxYoOUtcEzeHRAtwjwWNk7C50j9oWW2v65wH5
       
 29976 +	s7GeA+TxtMRNYUv9p/MOEgGpW4rs3oPOPQ61kuAxLSOn4Dbg8f2n+safiMfWaEMb53CA
       
 29977 +	hO3nfnz7Wl35+sm967knD+7aFrlqEZRYHWxYQHbvplsJ2bVHqwCPB0/mFt57gsVVbYis
       
 29978 +	LX0ygPzz+99fPxvrKCBvFeQQQIZygBxEHhSAgNQlhQvxON1/adimxLTjOQW3BHhkd7Rq
       
 29979 +	S6bguZqIgCwgXwEgLxJARnCANDHU762H28/pkB67dacrV00sbBzAPS5aFbltF+DxOsFj
       
 29980 +	NZl7xA3mNKGsdvbBARI2MKeAfP6IAjKBAnIimYMcZNAXAalDcvyLweMg6h4Bj6GbEhg8
       
 29981 +	Pgf3WEfdI+KxnWpR/9uUADKFAHLmVFdwkCaG/RGQOqRHmOzQ661vSPDoSvAYQfB4EfD4
       
 29982 +	CvGofj11uAc5QD68lQ8OkgXkmFFWpghIHVLjXxSPfQ0oHicqwqPkMR0dTh1sQA0RkAHk
       
 29983 +	W9ZBMoCc4upgbWECG5ijg9QVTVI89h9oYmHt4DplJsFjCuJRDbpRW5MKAXlsb0J06BJ/
       
 29984 +	74ljRloiIHVFi2ScxD0CHk0tR46heIxO2Hs8J//WQ849Ih7VpiTVNCwA5HeYgwRA3r1+
       
 29985 +	8UR6ytaIlQtnIiB1SYswVgV4TD9B3eNbLK6qRjDqbkUJIOOj1yyZKwQkrgnQAW0K8eg9
       
 29986 +	d0ko4PEY4lHdElJp+0JA1n8BQD6+e+0CD0h7a3N0kDqgRDpEHo/24B4XrozYmgJ4vHb3
       
 29987 +	8SvAY/13nHtUqXLU1Jg0IKvKnj+8mZ9zbC8DSHfOQeKjH3VAlLBUTuIeAY9rouMJHm+i
       
 29988 +	e1STdNTSrBJA7twavnKh72RXBKQOCJEZIodHc2vAo+/CleEEjxcYPH5BPKpFPWpoVADI
       
 29989 +	hrqPVWXPWEBuJA6SAeSAvrh5gPhlKcCjuxQey6o+1TX85LcIUEMSYZMqi4AsIEuJg8xK
       
 29990 +	ZwHpgoAUvxLpCIV4nEzxuBPxqDKVaK4hTo+/YRUrA8gHN/PPHN0Tv3FNIADSmcxBIiDF
       
 29991 +	L0qKxwF07pHicWP8nmNnwD0+K6v6KIVH3EFHc+JqT0+cIGH7ue+kxFr6uIgCckv4igW+
       
 29992 +	k13sR2CJVfxqlMw9gnt0ATyuCN+yMz2LuMfSt9XoHtujC229h9OjPCBXB86Z5u5sZwkb
       
 29993 +	mKODFLkmeTw6u3vPCVwDeDwKeHyAeNSWrtrdLydIASCvEgfJA9IYVrH2xPsgRSxJcI89
       
 29994 +	e/cfaGw+guBxAYfHIhaPsMEce58VXq22WyeaeiOnRwrIWlJifXCDcZAsIIcjIEUsRTo0
       
 29995 +	Bo9GppZ2zu7T5gSuRjxqSj1q6IcTJAvICnCQV89npScTQM6gDhIBKW5ByuMxOT3r/FXE
       
 29996 +	oxrUov4mOT3KAHJ3/AYCSDdnOwSkuOVI91/tO8DIdLidsxuPR9ieHIqrtcK5R7xcVb+c
       
 29997 +	Ot4DJ0gJIEsAkJnpyZt5QBqggxSvJhk8GjDucQZxjwweS0orSHEV3WPHJaLRFjg9CgF5
       
 29998 +	6fQRaUD2wUU6YlUk5x45PG6I3330dD7iUaMiUmVnnCClAXkAALl8PnWQZsYG/bDEKlI9
       
 29999 +	SuNx/vLwzckHMsE9Ih5VqRFNtsXpkQPkGyixEkDGbQgJnO3l5kQdJAJSrHqEGzv68O4x
       
 30000 +	ZEPc7iOnLwEe36B71KSKVNgXFWRT0x8KyM/VFS9Liq6czwRArhMAshfOQYpRkRSP/QyM
       
 30001 +	zcjc4wwOj1eKSl6ie1ShRDTalAwg3yEgxag8xWMi7pHBo5Ob1+xAAR7fYXFVoypSYWfy
       
 30002 +	gLxz5VzmgSQOkFbEQSIgFStCq0cJHnsJ8LiOuMdzV+4QPH5mi6tN9OtVYbpgU2qOgACQ
       
 30003 +	PxpqPzKAzD6SGhfFOEhbMgeJDlKrylPcuSweoyTukeDxB3/fI849qllDKm1eDpDFBJD7
       
 30004 +	k2LAQfrAIh0rs8EISMWK0OpRCR6twD36zF++bnMS4lGlytBOY9KArKGAzMs+nLo9KiRg
       
 30005 +	ttcEJ9thpkb6CEitak9R5xI82jpNIO4xKi71SDYtrr6rQTxqR0sq6ZUF5G8osTbWf/5Q
       
 30006 +	8VICyGXzfDzGjUZAKpKDto+xeBxsZjXaxYPgMSZpP3GPxS8rPqB7VIkwtNSIEJDfaoWA
       
 30007 +	DA7w8ySAJBuY4yIdbStQun+KR30j02EUjwEhUdtTD2fnkblHwCNsMCd5JDm6Ry3pqt3d
       
 30008 +	ygCynAXkjpi1CEhpEYjnLwEex3n4zFvG47Ec8NgIK1d/N2Fxtd2S0OobZQH5+un9G9RB
       
 30009 +	rqeAdGQAqYfPYhWPHOmNHX30DYcQPHr6BQQjHrUqIdV2rgCQl89m7kdAikiA0kORxePa
       
 30010 +	mB2se0Q8qlYb2mhNASAL805BiRUBKS0D0fwF7lGPwaMjxeN6xj3ef/oa3aM2FKTiPmUB
       
 30011 +	+aL4NgByHwAyiCmxDsU5SNFoEQaiEI9nL98pfoF4VLE0tNKcFCC/1lSCgwRAHiKAXOzn
       
 30012 +	OR4dpJjESPSoAI+n8gopHr9icVUrGlJppwoBmUEB6e8zCeYgEZAikiSHx6FWo0lxNQjc
       
 30013 +	476Ms5dvIx5VKgotNqYIkLkAyFgA5Kyp4x1t6BwklljFIUoJHm0cx3v6LQ5eH5t66FQu
       
 30014 +	wWNlDeJRizJSXdcSQP6ii3TKXzwCB5mxLzEmLAgAOXYUAlIcUiSjEOJxko9/UBjiUXVC
       
 30015 +	EElLSgEZiYAUjxKZkQjxOHUW4lEkElLtMKQA+ek9AWRBjjwge3QXW3Z2ufHweBw1lsFj
       
 30016 +	InWPj9ji6i9cmqNaaWilNXlA3isEB7krlgOkBVnFig5S+/Ln8GgB7pHgMTJ2F7pHrWhG
       
 30017 +	rZ3ygPzZWM8B8nha4qawpf7TeQeJgNS2Irv3II8FGDzUSoLHtIycgtuAx/ef6ht/Ih7V
       
 30018 +	KhONNc4B8t9/fv349rW68vWTe9dzTx7ctS1y1SIosTrYsIDs3k3bCdm1+1eAx4Mncwvv
       
 30019 +	PcHiqsa0opGOGED++f3vr5+NdRSQtwpyCCBDOUAOIg8KQEBq998DIR6n+y8N25SYdjyn
       
 30020 +	4JYAj+yOVhpJGuxEbRGQBeQrAORFAsgIDpAmhvq99XD7Oa3qsVt3unLVxMLGAdzjolWR
       
 30021 +	23YdPHnxOsFjNZl7xA3m1CYQTTfMARI2MKeAfP6IAjKBAnIimYMcZNAXAalVOf7F4HEQ
       
 30022 +	dY+Ax9BNCQwen4N7rKPuEfGoaeGoqT8lgEwhgJw51RUcpIlhfwSkVvUIkx16vfUNCR5d
       
 30023 +	p85ctCqCw+MrxKOaZKG9ZuUA+fBWPjhIFpBjRlmZIiC1qsa/KB77GlA8TlSER8ljOrSX
       
 30024 +	RdizqiIgA8i3rINkADnF1cHawgQ2MEcHqT1NUjz2H2hiYe3gOoXiMYVxj4hHVYlATO0o
       
 30025 +	BOSxvQnRoUv8vSeOGWmJgNSeFknPxD0CHk0tR46heIxO2Hs8J//WQ849Ih7FJKcOj0UA
       
 30026 +	yO8wBwmAvHv94on0lK0RKxfOREBqV4vQuwweV0ZsS0k/QYqrr95icbXD2S/CBpQAMj56
       
 30027 +	zZK5QkDimgCtaFOIR++5S0IBj8cQjyLUkaqGJARk/RcA5OO71y7wgLS3NkcHqRUl0k55
       
 30028 +	PNqDe1y4MmIrweO1u48JHuu/49yjqmQgnnakAVlV9vzhzfycY3sZQLpzDhIf/agVUcJS
       
 30029 +	OYl7BDyuiY4neLyJ7lE8+lH1SJQAcufW8JULfSe7IiC1IkSmUw6P5taAR9+FK8O37kw/
       
 30030 +	cYHB4xfEo6qlII72BIBsqPtYVfaMBeRG4iAZQA7oi5sHaEOWAjy6S+GxrOpTXcNPfosA
       
 30031 +	cWQSjkIVEZAFZClxkFnpLCBdEJDaUCLtU4jHyYhHVSS7DrTB6fE3rGJlAPngZv6Zo3vi
       
 30032 +	N64JBEA6kzlIBKQ2REnxOIDOPVI8bozfc+wMuMdnZVUfpfCIO+jogM5aPUROkLD93HdS
       
 30033 +	Yi19XEQBuSV8xQJf2J91BJZYtaFGydwjuEcXwOOK8C0707OIeyx9W43usdXprXMncnqU
       
 30034 +	B+TqwDnT3J3tLGEDc3SQGtckj0dnd+85gasBj0cBjw8QjzonsbYNmBOkAJBXiYPkAWkM
       
 30035 +	q1h74n2QGpUkuMeevfsPNDYfQfC4gMNjEYtH2GCOvc8Kr1bblu6iP5vTIwVkLSmxPrjB
       
 30036 +	OEgWkMMRkBqVIu2MwaORqaWds/s0xKPoVaTCAXKCZAFZAQ7y6vms9GQCyBnUQRobICA1
       
 30037 +	K0mFeDx/FfGowrwXa1OcHmUAuTt+AwGkm7MdAlKzYoTeODwOt3N24/EI25NDcbVWOPeI
       
 30038 +	l6tilVX7x8UJUgLIEgBkZnryZgSkxoXIdMjg0YBxjzOIe0xOzwI8lpRWkOIqusf2J7sO
       
 30039 +	vJPToxCQl04fkQZkH1ykozlxyuJxQ/zuo6fzEY86ICZVDJETpDQgDwAgl8+nDtLM2KAf
       
 30040 +	llg1pkdpPM5fEb45+UAm4lEVqa4TbXB65AD5BkqsBJBxG0ICZ3u5OVEHiYDUnB7hxo4+
       
 30041 +	A4xMOfe4IW73kdOXAI9v0D3qhKA6OkgqyKamPxSQn6srXpYUXTmfCYBcJwBkL5yD1Iwi
       
 30042 +	KR77GRibkbnHGfOXS/D4Et1jRzNdN94vAOSPhtqP7xCQmlGe4l6Ie2Tw6OTmNTswhMfj
       
 30043 +	Oyyu6oagOjpKeUDeuXIu80ASB0gr4iARkIr1o+KjBI+wg44Ej+uIezx35U4J4PEzW1xt
       
 30044 +	ol9YR791fL9YI6AQkNlHUuOiGAdpS+Yg0UGqWHmKm5PFY5TEPRI8/uDve8S5R7HKqePj
       
 30045 +	kgNkMQHk/qQYcJA+Hi72VmaDEZCK9aPioxI8WoF79Jm/fN3mJMRjxxNcx1qQBmQNdZB5
       
 30046 +	2YdTt0eFBMz2muBkO8zUSB8BqWLtKWpOgkdbpwnEPUbFpR7JpsXVdzWIRx2TVfuHywLy
       
 30047 +	N5RYG+s/f6h4KQHksnk+HuNGIyAViUf1x1g8DjazGu3iQfAYk7SfuMfilxUf0D22P791
       
 30048 +	7Z1CQH6rFQIyOMDPkwCSbGCOi3RUr0DpFike9Y1Mh1E8BoREbU89nJ1H5h4Bj7DBnOSR
       
 30049 +	5OgedU1ibRuvDCDLJYBci4CUlow6/xLgcZyHz7xlPB7LAY+NsHL1dxMWV9uW2bp5tiwg
       
 30050 +	Xz+9f4M6yPUUkI4MIPXwWazqlCO9saOPvuEQgkdPv4BgxKNuqkkFo1YAyMtnM/fviEFA
       
 30051 +	qlWCwsZl8bg2ZgfrHhGPKkhxnWpCASAL805BiRUBKZSMWn8H96jH4NGR4nE94x7vP32N
       
 30052 +	7lGnxKSKwcoC8kXxbQDkPgBkEFNiHYpzkGpVI3moHFmaQ4qr1D1SPJ69fKf4BeJRFRmu
       
 30053 +	W21IAfJrTSU4yMLcU4dSY9cHL/bzHI8OUr1ihNYV4fFUXiHF41csruqWnDo+WoWAzKCA
       
 30054 +	9PeZBHOQCEi1SpLD41AGj0GAx30ZZy/fRjx2PLd1sYXmADlr6nhHGzoHiSVWdYlSgkcb
       
 30055 +	x/GefouD18emHjqVS/BYWYN41EVFdXDMEkD+oot0yl88AgeZsS8xJiwIADl2FAJSXVIk
       
 30056 +	7QrxOMnHPygM8djBfNb1tysB5K7YyODFCEh1apHqkSuuAh6nzkI86rqaVDB+KUB+ek8A
       
 30057 +	WZCTkSYLyB7d1Z2bXbB9Ho+jxjJ4TKTu8RFbXP2FS3NUkOG61YQ8IO8V5p48yAPSgqxi
       
 30058 +	RQepjn8uOPdoweIxMnYXukfdko/qR8sD8mdjPQfI42mJm8KW+k/nHSQCUvWK7N6Dzj0O
       
 30059 +	tZLgMS0jp+A24PH9p/rGn4hH1We7+FvkAPnvP79+fPtaXfn6yb3rBJDbIlctAgfpYMMC
       
 30060 +	sns31Sdk125RAR4PnswtvPcEi6vil436RsgA8s/vf3/9bKwDQD5/dKsghwAylAPkIPKg
       
 30061 +	AASkqv/1EOJxuv/SsE2JacdzCm4J8MjuaKW+7x5bFl8EZAH5CgB5UQqQJob6vfVw+zkV
       
 30062 +	67Fbd7py1cTCxgGKq4tWRW7bdfDkxesEj9Vk7hE3mBOfVjQyIg6QsIG5EJAJFJATyRzk
       
 30063 +	IIO+CEgVy/EvBo+DqHsEPIZuSmDw+BzcYx11j4hHjeS/2DpRAsiUbRGrFs2c6goO0sSw
       
 30064 +	PwJSxXqEyQ693vqGBI+uBI8RHB5fIR7FphANj0cOkA9v5YODZAE5ZpSVKQJSxWr8i+Kx
       
 30065 +	rwHF40RFeJQ8pkPDyYDdaT0CMoB8yzpIBpBTXB2sLUxgA3N0kKrUJMVj/4EmFtYOrlNm
       
 30066 +	EjymMO4R8ah1PWh9AAoBeWxvQnToEn/viWNGWiIgValF0hZxj4BHU8uRYygeoxP2Hs/J
       
 30067 +	v/WQc4+IR62rQnsDEADyO8xBAiDvXr94Ij1la8TKhTMRkKrWIrSnAI/pJ0hx9dVbLK5q
       
 30068 +	Twhi6VkJIOOj1yyZKwQkrglQkTaFePT2XxIKeDyGeBSLHLQ+DiEg678AIB/fvXaBADKc
       
 30069 +	AtLe2hwdpIqUSJvh8WgP7nHhyoitKQSPdxk8fse5R60rQssDEACyoe5TVdnzhzfzc47t
       
 30070 +	ZQDpzjlIfPSjikQJS+Uk7tF77pI10fGIRy0rQFzdKwHkTgJI3ymuCEgVCZFphsOjuTXg
       
 30071 +	0XfhynCCxwvX7j4G9/ilHvEoLm1oZTRSgPxYVfaMBeRG4iAZQA7oi5sHqEaWAjy683i8
       
 30072 +	+fB5WdWnuoaf/BYBWkkF7FQEEZAFZClxkFnpDCAnuyAgVaNE2ooQj5MpHnciHkWgATEN
       
 30073 +	gdPjb1jF2lBHAPngZv6Zo3viN64JBEA6kzlIBKRqREnxOIDOPVI8bozfc+xM/s2Hz8qq
       
 30074 +	PkrhEXfQEZNENDsWTpBwH+R3UmLlALklfMUCXwDkCCyxqkaNkrlHcI8ugMcV4Vt2pmcR
       
 30075 +	91iK7lGzOS/m3jg9ygNydeCcae7OdpawgTk6SBVoksejs7v3nMA1gMejgMcHiEcx60Pj
       
 30076 +	Y+MECfuzsoAsukocJA9IY1jF2hPvg+ygJME99uzdf6Cx+QiCxwUcHotYPMIGc+x9Vni1
       
 30077 +	qnENiKlDTo8UkLXUQd5gHCQLyOEIyA5Kkb6dwaORqaWds/u0OYGrEY9iUoGIxsIJkgVk
       
 30078 +	Renjoqvns9KTCSBnUAeJgOy4IOXxmAzu8SriUURKEMdQOD3KAHJ3/AYCSDdnOwRkx+VI
       
 30079 +	91/tO8DIdLidsxuPR9ieHIqrtcK5R7xcFYcstDcKTpASQJYAIDPTkzfzgDRAB9kxTTJ4
       
 30080 +	NGDc4wziHgGP568WlZRWkKU56B61l/6i65nToxCQl04fkQZkH1yk0xFFcu6Rw+OG+N1H
       
 30081 +	T+cjHkUnBjEMiBOkNCAPACCXz6cO0szYoB+WWDugR2k8zl8Rvjn5QCbiUQzJL8IxcHrk
       
 30082 +	APnm2YMbBJBxG0ICZ3u5OVEHiYDsiB7hxo4+Ave4IW73kdOXAI9v0D2KUBDaHhIVZFPT
       
 30083 +	HwrIz9UVL0uKrpzPBECuEwCyF85BtleRFI/9DIzNyNzjjPnLJXh8ie5R27kvxv5lAPkO
       
 30084 +	Adle5Sl+H3GPDB6d3LxmB4bweHyHxVUxCkLbY5IH5J0r5zIPJHGAtCIOEgGpWG0tHiV4
       
 30085 +	7CXA4zriHs9duVMCePzMFleb6Feg7TzA/sURAQEgfzTUfmQAmX0kNS6KcZC2ZA4SHWSL
       
 30086 +	ylN8giweoyTukeDxB3/fI849ikMO2h+FHCCLCSD3J8WAg/TxcLG3MhuMgFSsthaPSvBo
       
 30087 +	Be7RZ/7ydZuTEI/aT3lRj0AakDUUkHnZh1O3R4UEzPaa4GQ7zNRIHwHZovYUnSDBo63T
       
 30088 +	BOIeo+JSj2TT4uq7GsSjqGWhvcGxgPwNJdbG+s8fKl5KALlsno/HuNEISEVSa80xFo+D
       
 30089 +	zaxGu3gQPMYk7SfusfhlxQd0j9rLeHH3LATkt1ohIIMD/DwJIMkG5rhIpzUKlD6H4lHf
       
 30090 +	yHQYxWNASNT21MPZeWTuEfAIG8xJHkmO7lHcEtHs6GQAWS4B5FoEpLTA2vaXAI/jPHzm
       
 30091 +	LePxWA54bISVq7+bsLiq2VzXhd5kAfn66f0b1EGup4B0ZACph89ibZsc6Y0dffQNhxA8
       
 30092 +	evoFBCMedUENIhijAkBePpu5f0cMArKNEhSeLovHtTE7WPeIeBRB0ot4CAoAWZh3Ckqs
       
 30093 +	CEihwNr4O7hHPQaPjhSP6xn3eP/pa3SPIhaDGIYmC8gXxbcBkPsAkEFMiXUozkG2UY3k
       
 30094 +	oXJkaQ4prlL3SPF49vKd4heIRzHkvJjHIAXIrzWV4CALc08dIoBc7Oc5Hh1kW8UI50vj
       
 30095 +	cXEwweOpvEKKx69YXBWzHLQ/NoWAzKCA9PeZBHOQCMg2SpLD41AGj0GAx30ZZy/fRjxq
       
 30096 +	P9vFPwJlgIwFQM6aOt7Rhs5BYom19aKU4NHGcbynH+AxNvXQqVyCx8oaxKP4FaHlEUoA
       
 30097 +	+Ysu0il/8QgcZMa+xJiwIADk2FEIyNZLkZwpxOMkH/+gMMSjljNct7pXAshdsZEIyLYp
       
 30098 +	kTlbiMepsxCPuqUGEYxWCpCf3hNAFuRkpMkCskf39mRnl3sPj8dRYxk8JlL3+Igtrv7C
       
 30099 +	pTkiyHkxD0EekPegxHqQB6QFWcWKDrJ1/7RweLQA90jwGBm7C92jmNNffGPjAfmzsZ4D
       
 30100 +	5PG0xE1hS/2n8w4SAdkaRXbvQeceh1pJ8JiWkVNwG/D4/lN940/Eo/jyX2wj4gAJ28/9
       
 30101 +	+Pa1uvL1k3vXc08e3LUtctUiKLE62LCA7N6tNQnZtc9RgMeDJ3ML7z3B4qrY0l6842EA
       
 30102 +	+ef3v79+NtZRQN4qyCGADOUAOYg8KAAB2fK/NUI8TvdfGrYpMe14TsEtAR7ZHa3Emw04
       
 30103 +	Mm1HQBaQrwCQ/7+9c3+oaev6+ME5HLdEKqko5VYpROVSoVCEKNcuRBclhVRUlFshVC7J
       
 30104 +	raTcKUohSipKN1QKx3OO4/1H3jHnWmvvtXflnEN7t9daY/3wPJ7zPNaec6wxns/8jjnm
       
 30105 +	HFcIIIM5QOqP0Bo4ANvP/WM89ulLK1f1jc0tQT2u9A3Ztf/omSs3CR4byN4jNpjrbV8X
       
 30106 +	xO9zgIQG5hSQzx5RQMZSQDqQPciR2oMRkP8Yjr8weBxJ1SPgMWB7LIPHZ6AeW6l6RDwK
       
 30107 +	IiJ6d5DdAHIfAeQiR1tQkPojhiIg/zEeYbNjwECtEQSPto6LVvoGc3h8gXjsXQ8X2K93
       
 30108 +	AmTx3VxQkCwgbSaZGiAg/zEaf6F4HKxN8ejQFR5l13QIzD1wuGq2gBIgX7EKkgHkXFtL
       
 30109 +	M2N9aGCOCvL7MUnxOHS4vrGZpe1cisd9jHpEPKrZnwX/c10C8uTB2PCA1R7zHWwmmiAg
       
 30110 +	vx+L5L8l6hHwaGAy0YbiMTz24Kms3LvFnHpEPAo+TtQ1AR4gP8IeJACy8OaV0yn7dgb7
       
 30111 +	eC5CQP5zLML/ogs8ppwmydUXrzC5qi5HFsvvdAPImPBNq5fyAYk1Ad3GJh+P8z1WBwAe
       
 30112 +	TyIexRIgap4HH5Bt7wCQjwtvXJYD0sLMCBVkt5FI/ws5Hi1APXr6BO/cB3i8UUjx2PYR
       
 30113 +	9x7V7NEC/zlFQNZVPSu+k5t18qASIPHqx26DEkrlZOpx/tLVm8JjCB7voHoUeGD00vC7
       
 30114 +	AWTCziAfz4VzbRGQ3QYi819weDQyAzwu9PQJIni8fKPwMajHd4jHXvJqAf8sD5DtrU11
       
 30115 +	VWUsILcRBWlPU6zDBmPzgO7CkodHewU8VtU1t7Z/lrcIELCL4NDVaAFlQFYQBZmRwgBy
       
 30116 +	znQEZHeRSP85H49zKB4TEI9q9F7x/RQXj1+hipUBZNGd3PMnDsRs2+QNgLQme5AIyO6C
       
 30117 +	kuJxGN17pHjcFnPg5HlQj2VVdU0KeMQOOuILHdXMiAtIOAf5kaRYKx4XUEDuCNqwYiEA
       
 30118 +	chymWLuLRtneI6jH6YDHDUE7ElIyiHqsQPWoGm8V/1u5eOwMyI3eS+bZW08wgQbmqCC7
       
 30119 +	jEk5Hq3t5y/x3gh4PAF4LEI8ij9uVDZDLiChPysHyOtEQcoBqQdVrP3xHGSnkAT12H/g
       
 30120 +	0OF6RuMIHldweCxg8QgN5thzVrhaVZn3iu/FXDxSQLaQFGvRbUZBsoAci4DsFIr0HzB4
       
 30121 +	1DEwmWBtPw/xKL7Q6J0ZcQHJArIGFOT1Sxkp8QSQrlRBIiC7Csgu8XjpOuKxd9xYNL/K
       
 30122 +	xaMSIJNiwggg7awnICC7Ckfaf3XwMB2DsROs7eR4hPbkkFxt4e894nJVNLGilolwASkD
       
 30123 +	ZCkAMj0lPlIOSG1UkMoxyeBRm1GPrkQ9xqdkAB5LK2pIaQ6qR7X4rhh/hItHPiCvZqYq
       
 30124 +	AnIQFukoRiSnHjk8hsUkncjMRTyKMULUPCcuIBUBmQyAXL+cKkhDPQSkYjTSDjoDh3J4
       
 30125 +	XL4hKDI+OR3xqGbPFefPcfHIAfIlpFgJIKPD/L3dne2mUAWJgFSISILHQTz1GBadlJp5
       
 30126 +	FfEozghR86xoQH779jcF5NuGmvLSgvxL6QDIQDkg4W5k3IOUhSRVj0O09QzJ3qPr8vUy
       
 30127 +	PJajelSz84rw55QAWYuAlAVeN3+Q43GKnbO7t78Mjy9rMbkqwghR85Q6A/J+/sX05DgO
       
 30128 +	kKagIBGQ8tgkePydh8dAoh4v5t8vBTy+ZZOr36hR1fwh8edEYQEeID+1tzQxgDyXmhgd
       
 30129 +	yijI8WQPEhWkLCCV8RjKqUeKx0/yc4+49yiK+FD7JDoBsoQA8khcBChIFyjSMTXURUDK
       
 30130 +	w5HDoymoR5fl6wMj4xCPavdZMf+gIiAbKSBzzh0ngPRyd545ZfwYBKQsHGlpDk2ujp8y
       
 30131 +	k6jH0OjE1HMkufqytrGlHfEo5khR09xYQH6FFGtH29v6mnIZINctc5k9bTICkheODB51
       
 30132 +	DQGPswkeI+KOEPVYUl5Tj+pRTQ4r8p/hA/JDixyQu0P9vNycCCBH6WihgqRBSdWjlo7B
       
 30133 +	GIpHL//Q3YnHz+UgHkUeIuqdnhIgq2WA3IKAlKOR/IlNrgIeJ0+b7bJsnRyP1YDHDqhc
       
 30134 +	/foNk6vq9V7x/ZoyICvLHt4mCnL3VhkgR2gNGoB3sTLqUWvEKIJHJzcvPwU8Qv9VWccO
       
 30135 +	TK6KL0zUN6MuAJl3If3I3ggEpAIflfG4JWIvqx4Rj+rzVvH/UidAPn14K+esDJBWoCAR
       
 30136 +	kGS52o+2Jwc8WlE8bmXU48OnlZBcRTyKP1DUNUNlQD4vuQeAPAyAXMukWEfjHmRn9Ujx
       
 30137 +	eCEPkquIR3V5qjR+RwGQ7xtrKykgjxEFucrNaQYCki5bu8Lj2ZxbFI/vEY/SCBX1zLJL
       
 30138 +	QKZRQHq4zII9SASkLLk6mkmurgU8Hk67kHev5DniUT1eKp1fUQLkawLI7LPHEqMAkIsB
       
 30139 +	kOaoIOXq0dxqhpPbKr+tUYnHzmYTPL5uRDxKJ1bUMtNOgHwECjLt8J6IzWsBkFMnISC5
       
 30140 +	5CrB4ywXj7WbEY9q8Uxp/ki3gAwBQDoiIHnJVcCj42LEozTjRG2zlgHyC1SxNtdXP390
       
 30141 +	71pWZ0D266uwIyed/yDH46SpDB73UPX4iFWPX7A0R22+KoUf6gzIB0RB7o/iAGks7T1I
       
 30142 +	WXKVxWNI1H5Uj1IIjN6aoxyQnwGQbxhAnjq0Z/vmNR4L5ApSqoDs249cC6A72lSGx0Np
       
 30143 +	WdfuAR7fNLd1fEY89pbfivV3OUBC+7lPH943vK588uBm9pmjAEhfoiAtzVlA9u0jnUWq
       
 30144 +	fKYcHo3leDx6JvvWgyeYXBVrQPT2vBhA/v31ry+fO1opIO9eyyKADOAAOZJcFCBNQPLx
       
 30145 +	uMBjzebtew6dUsQj29Gqt78i/r5YLKAMyBcAyCsAyF0hvisZQOqP0Bo4QJJXP/bpSytX
       
 30146 +	9Y3NLSG5utI3ZNd+wONNgscGsveIDebEEgUaNA8OkNDAnALy2SMKyFg+IAdLE5AMHkdS
       
 30147 +	9Qh4DGDwePfRM1CPrVQ9Ih41yJPFMZRuALlvV7DvykWOtqAgpQpI2OwYMFBrBMGjLcFj
       
 30148 +	MMHjFcDjC8SjOHxfI2fRCZDFPEA62EwyNRipLUlAEjwO1qZ4dKB4jCXqUY5H2Tlkjfys
       
 30149 +	OCiBWkAJkK9YBckAcq6tpZmxPjQwl56CpHgcCng0s7Sdu4jgcR/iUaA+LqhhdwHI3KyT
       
 30150 +	B2PDA1Z7zHewmWgiTUCyeDQwmWjD4vHgqazcu8WcekQ8CsrLhTNYHiA/wh4kALLw5pXT
       
 30151 +	Kft2Bvt4LpIsIBk8DufjMeU0VY+vMLkqHOcW4ki7BeSm1Uv5gJRUTQAfj/M9VgeExx48
       
 30152 +	iXgUonsLbsx8QLa9A0A+LrxxWQ5ICykqSDkeLUA9evoE79xH8Fj45AXB40fcexSclwto
       
 30153 +	wIqArKt6VnyHKMiYcAVASurqxz5McpWqx/lLV28Kj0E8CsijhT3UbgCZsDPIx3PhXFsL
       
 30154 +	MyOppVg5PBqZAR4XevoEETxevlH4GPD4rg3xKGx/1/jR8wDZ3tpUV1XGAnIbAaQ9TbEO
       
 30155 +	G/y7hAAJleRk75Hg0V6OxzvFz6rqmlvbP8vvQNb4T4sDFKAFlAFZwShIBpDQfk5qgOTj
       
 30156 +	cQ7FYwLiUYB+LdQhc/H4FapYGUAW3ck9f+JAjEQBSfE4TI7HbTEHILl6p7isqq5JAY/Y
       
 30157 +	IkCoLq/Z4+YCEs5BfiQpVgrIjJSEHUEbViyUHCB5eJwOeNwQtDMhJYOoxwpUj5rtx2IZ
       
 30158 +	HRePnQG50XvJPHtrUqQjHQUpx6O1/fwl3psAjyfO594pQjyKxd81fh5cQEJ/VhaQBdcv
       
 30159 +	8wA5zkgPqlj7S+IcJOCx/8Chw/WMxkF78oUrNgTtoHgsYPEIDebYc1a4WtV4vxbqALl4
       
 30160 +	pIBsISnWotuMgmQAOcEEGphLJMXK4FHHwGSCtf28Jd4bEY9C9WoBj5sLSBaQNRWPC65f
       
 30161 +	ykiJ5xSkdADZNR6vIx4F7N3CGzoXj50AGUYAaWc9YaxUAMnhcewEazs5HqE9OSRXW/h7
       
 30162 +	j7hcFZ6bC2fEXEDKAFkKgExnAOkKKVYApLYUFCSDR21GPboS9RifknGJ4LGGlOagehSO
       
 30163 +	Swt6pFw8KgAyMzUphg/IQeIv0lHGY1hM0onMXMSjoJ1biIPnAlIRkMnxkUHrl1NAGkoB
       
 30164 +	kJ3wGBmfnA54LEU8CtGpBTxmLh45QL6EFOtVAGR0mL/3EmdWQYoekASPg4bpGHDqEfCY
       
 30165 +	mnkV8Shgxxbq0GlAfvv2NwfI8tKC/EvpioAcIvI9SIrHIdp6hmTv0XX5+iDEo1DdWfDj
       
 30166 +	VgJkLR+Q7s52U2iKVeSAlONxip2zu7d/WDSLx5eYXBW8gwttAgqAfNtQU156P/9ienJc
       
 30167 +	ZCCjIE1BQULzABEX6RA8QgcdGR4DCR4v5heUltc0vGWTq9+omYT2bXG8wrMAD5Cf2lua
       
 30168 +	OEAmRof6exNAjid7kKIGZPd4rIW9x0/yc4+49yg89xbeiDsBsoQBZAQA0gX2IMUOSBke
       
 30169 +	TUE9uixfHxgZR/B4H/EoPF8Ww4gVAdnIAPLccQJIL3fnmVPGjxE3IGV4HD9lJlGPodGJ
       
 30170 +	qedIcvUl4lEM/i24ObCA/EpTrG/ra8opII/ERQSuW+Yye9pkU0NdEStIFo+6hoDH2QSP
       
 30171 +	EXFHCB5LymvqUT0KzplFMGA+ID+0MIDMAUDuDvVjATlKR0u0CpLiUUvHYAzFo5d/6O7E
       
 30172 +	4+dyKB4bUT2KwL2FNwUeIDva3tZXywC5RfyAlONx8rTZLsvWKeKxAypXv37D5KrwfFrI
       
 30173 +	I+4MyIe3KSC3+nm5OREFOWqEWAHJ4HHEKIJHJzcvPwU8Qv9VWccOTK4K2cWFNfYuAJl3
       
 30174 +	Mf3I3gjRA1IZj1si9rLqsRrUI+JRWH4sltEqA7LyqQIgrRhADhDhXayAxwGDtAgerSge
       
 30175 +	tzLq8eHTytrGFsSjWBxcaPNQBuTzknt5F/iAHC3OFGuXeLyQB8lVxKPQfFhM41UA5PvG
       
 30176 +	WgDkrZyzkGLd6rcKFKRoAdkVHs/m3EI8ism5hTiXLgGZdhgU5FoPugcpSkByeBxtSpOr
       
 30177 +	a0E9Hk6/kHev5DniUYheLJ4xKwHyNQFk9tljiVEAyMVOM6zMaYpVbAqSh8cZTm6r/LZG
       
 30178 +	JR47m03w+LrxPapH8bi38GbSCZCPQEESQG4GQM6aNslUhIDk43GWi8fazYDHNMSj8JxX
       
 30179 +	hCPuFpAhAEhHcQJShkdzqxmOixGPInRr4U5JBsgvf3S0NddXPwdAZqUd3sMAcqockL+I
       
 30180 +	5ZHjcdJUBo97KB4fserxC5bmCNedBT/ybgC5P4oDpDEp0hGTglTGY0jUflSPgvdj0UxA
       
 30181 +	DsjPAMg3BJDXstIO7dkOCnLBLBkg+/UVCx/7QnvyIdq6o01leDyUlnXtHuDxTTOU5iAe
       
 30182 +	RePagpyIDJD/+/Lpw/vG15VPHtzMPnO0EyD79hFHQHJ4NGbVI+Dx6JnsWw8wuSpI9xXf
       
 30183 +	oBlA/v31ry+fO1opIO9eyzpFALmGBeRIcg5SLIDk43GBx5rN2/ccOiXH42fEo/g8XFgz
       
 30184 +	4gAJ/VkBkA0UkFcAkLtCfFdCitXS3FifKEiR3GzVpy9TuWpsbgnJ1ZW+IbsIHm8+eFL5
       
 30185 +	uoHsPWKDOWF5rwhHywESGphTQD57RAEZuz1AhIBk8DiSqkfAYwCDx7tUPbZ2EDyyDR9F
       
 30186 +	+KFxSoKwgDIgX4CCBEDu2xXsu3KRoy0DyIHiACRsdgwYqDVCXwGPVwCPLxCPgnBWKQyy
       
 30187 +	EyCLeYB0sJlkajBSe7A4FCTB42BtikcHisdYoh7vPnoGyVWCR9k5ZCl8d5yjZlrgu4Cc
       
 30188 +	a2tpZqwPDczFAEiKx6EUj7aOi1b6Bu/ad/QM4lEz3VK6o+oCkLlZJw/GhoOCnO9gM9FE
       
 30189 +	LIBk8WhgOslGjsfcu8WIR+k6vwbOXAmQr6iCPJ2yb2ewz8pFIgIkg8fh+sZmlrZzFfD4
       
 30190 +	CpOrGuiXkh1S94BcvZQPSIHXBHB4NJlo4zDfY3VAeOzBk1mIR8m6vcZOnAfIj23vG169
       
 30191 +	eFx44woDSE8ApIU4FKQiHj19gnfuSzl95WbhkxcEjx9x71Fj/VNyA1MEZF31s+I7REHG
       
 30192 +	hG/iA1LgN1v1YZKrBhSPS1dvCo9BPErO04UxYQVAvmMAefl0SsLOIB/PhQSQRsJPsXJ4
       
 30193 +	NDKzAPXI4vHyjcLHgMd3bYhHYXiqREbJA2R7a1NdVRkfkPZcilXQgIRKcrL3qITHO8XP
       
 30194 +	qupw71Eibi6YaSoDsgIUpAyQ0H5O+IBUwONCT5+gnQkppxGPgvFQaQ2Ui8evUMUqA+T5
       
 30195 +	EwdithEFyQBy2ODfBQxIisdhFI/280E9bqPq8U5xWVVdU2s7luZIy981frZcQMIxj49t
       
 30196 +	oCApIDNSEnYEbfBcKAJA8vA4fQ6LxwyCxwpUjxrvnBIcIBePckAW3cmlgNzovWSevTUp
       
 30197 +	0hEyIOV4tAY8egMeD5w4n3unqBMesYOOBL1fA6fMBSTtz0oBWXD9MgPIFQSQ44z0oIq1
       
 30198 +	v0DPQcrwOA7aky9csSFoR0IK4lED3RCHxFqAi0ceIG/zATnBBBqYC1ZByvA4wdp+3hLv
       
 30199 +	jYhHdHwNtwAXkHxAXspIiQcFKXhAAh77Dxw6XM9IAY/XC1j1CP1X2WPIuFrVcC+VzvC4
       
 30200 +	eKSAbCF7kEU8QNpZTxgrXEAyeNQxGKuAR2hPDsnVFn5yFeNROg6v6TPlApIFZE1FacF1
       
 30201 +	DpCujILUFqaCVMCjK1GP8SkZlwgea0hpDuJR011TkuPj4lEBkJknkmLCSIpVyIDk4dGO
       
 30202 +	qMewmCRIriIeJenmwpk0F5AKgExPjo8MWr9cyIBk8KjNqEcWj+mAx1LEo3CcU4Ij5eKR
       
 30203 +	A+RLUJBXM1OTosP85YAcJLwinS7wmJqJeJSghwtsylxAcoAsLy3Iv8QHpKGe9hDB7UFy
       
 30204 +	eDQkyVXX5euDIuOTEY8Cc01JDpeLRxaQtXxAujvbTaEpVsEBkuBx0DCaXLVzdvf2D4tO
       
 30205 +	Ss28CurxJSZXJenmwpk0Dchv3/6mgHzbUFNeej//YnpyXGQgqyAJIH8XVpEOxeMQbT1F
       
 30206 +	POYXlJbXNLxlk6vf6MSF851wpNKwAA+Qn9pbmuSADPX3JoAcT/YgBQZIOR6nKOGxFvce
       
 30207 +	peHWwp1ld4CMAEC6wB6kqeAASfAIDeb0DE0Z9RgYGZecfjH/PuJRuF4qnZErArKRAeS5
       
 30208 +	1MRoCsiZAgSkDI/jGTyGRiey6pHg8ZP8SnIszZGOmwtnpoqArK8pLyEK8kgcBeRsAkhd
       
 30209 +	QSlIBTy6LF8fGMHgsQTVo3CcUsIj7QqQOeeOJ+4O9fdydwZAjjHQ0RKQguThcaazu5c/
       
 30210 +	4PH4OZpcrW1EPErY0YUydRaQXyHF2tH2tr5aDsh1y1xmT5ssLECyeNQ1NJ08bbbLsnWA
       
 30211 +	xyNEPQIe65nk6tdvmFwVim9KcZx8QH5oYRQkA0g/LzcnAshR0J9VKEU6FI9aOqPGjJ9C
       
 30212 +	8OgXuhvwmEP2HgGP0H9V1tAK1aMUnV0Ic+4GkHsjtggPkMp43CLDYzXgsQMOdiAeheCT
       
 30213 +	Uh6jMiArnz68TQG5lQLSigHkAEFcNcfgcQTFo5Obl99WBo8PyyoRj1L2cUHNXRmQz0vu
       
 30214 +	511IPyJAQHbG415Qj3mgHhGPgnJJSQ9WAZDvG2sBkLdyzkKKVXCABDwOGKRF8Gg1k4/H
       
 30215 +	p4hHSXu4wCbfGZD38i6kHQZArmVSrKOFsQfZBR4Pp1/Iu1fyHPEoMJeU9HCVAPmaADL7
       
 30216 +	7LHEqK1+q9ycZliZ0xSr5itIRTyuIurx2NmcWw8JHt9jclXSPi6oyXcLyM1rPVxmwR6k
       
 30217 +	IADJ4XE03Xv0WLslYu/hNMSjoDwRB0ss8D1ALnYUCiBleDS3muHkBniMAjxmEzy+Rjyi
       
 30218 +	owvJAjJAfmGKdJ4/ogpyTwQF5NRJQgAkH4+zXDzWbmbx+AjVo5BcEccKFugGkPujQvxW
       
 30219 +	CQWQfDw6Ll7lF4J4RN8WqgXkgPzc0db8phoAeS0r7ZAyIPv1/UVjH+bco+5o00lTGTzu
       
 30220 +	OZyWde0ewWMzlOZ8wdIcoTqnBMfdCZBPHtzKPnNUDkhjUsWqySlWDo/GoB4ZPO5H9ShB
       
 30221 +	TxbJlBlA/v31ry88QJ46tGf75jUeC2bJFKTmArJvP3ItgByP2/ccYvH4BvD4GfEoEkeV
       
 30222 +	yDQ4QEJ/1k8f3je8rnzy4CYB5K4Q35WgIC3NWUD27aOZC9Y+fZnSHBaPviFR+4+eyb75
       
 30223 +	4AmbXMUOOhJxZLFMkw/IVlCQzx7dvZZFABnAAXIkuShAUwHJx+MCjzWbAY+nsq7dBfXI
       
 30224 +	4ZHtaCWW74XzELcFlAH5AgB5hQAymADSFgCpP0Jr4AAN7c8Kmx2kclXf2NwS1ONK35Bd
       
 30225 +	gMcrFI8NpDQH8Shu7xXh7DhA/gkKkgfIWApIB6IgR2oP1lRAMngcSZOrgMeA7bEMHp8B
       
 30226 +	HltBPcrOIYvww+GURGmBbgC5jwBy0VwGkEM1FJAEjwMZPNo6LlrpG8zh8cVrxKMovVUC
       
 30227 +	k+oEyOK7uVmnDrKAtJlkYqCxgCR4HKxN8eiAeJSAr0phikqAfMUoyBQZIM2M9YdrJiAp
       
 30228 +	HocO1zc2s7SdS/G4j1GPiEcpOK5Y59glIE8ejA0PWO0x38FmosYCksWjgclEG4rH8NiD
       
 30229 +	p7Jy7xajehSrq0piXjxAfoQ9SABk4c0rp1P27Qz28SQKUlMB2QUeU06T5OqLV6geJeG5
       
 30230 +	Ip1kN4CMCd+0eikfkBpWE8DH4/ylqwMAjycRjyL1USlNiw/ItncAyMeFNy7LAWlhZqSJ
       
 30231 +	ClKORwtQj54+wTv3AR5vFD4meGz7iHuPUnJhcc2VB8j21ua6qmfFd3KzTh5kAGnPKUgN
       
 30232 +	u/oRKslJcpWqR8DjpvAYgsc7qB7F5ZtSnE03gEzYGeTjuXCOrUYCksOjkRngcaGnTxDB
       
 30233 +	42UGj+8Qj1J0Y9HMmYtH2sC8tamuqowF5DaiIBlADhusWc0DeHi0V8BjVV1zazuW5ojG
       
 30234 +	OaU4ES4g4ZjHR6IgK4iCzEhhATldAwHJx+MciscExKMUXVeUc+biUQ7Ioju5508ciNm2
       
 30235 +	yRsAaU32IDULkBSPw6h6pHjcFnPg5HlQj2VVdU0KeMQOOqL0WJFPigtIaD/HArKAAnJH
       
 30236 +	0IYVC6GB+TgNS7Hy8Dgd8LghaEdCSgZRjxWvGlA9itxZJTA9Lh47A3Kj95J59tYTNAyQ
       
 30237 +	cjxa289f4r0R8HgC8FiEeJSAs0philxA8gB5nShIOSD1oIq1v4acgwQ89h84dLie0TgL
       
 30238 +	wOMKDo8FLB6hwRx7DBlXq1JwXhHOkYtHCsgWkmItus0oSBaQYw10NEdBMnjUMTCZYG0/
       
 30239 +	D/EoQn+U/JS4gGQBWVPxuOD6pYyUeAJIV6ogNQeQXeLx0nXEo+S9WDwG4OJRCZBJMWEE
       
 30240 +	kHbWEzQIkBwex06wtpPjEdqTQ3K1hb/3iMtV8Tio1GbCBaQMkKUAyPSU+Eg5ILU1Q0Ey
       
 30241 +	eNRm1KMrUY/xKRmAx9KKGpJcRfUoNdcV5Xy5eFQAZGaqBgJSGY9hMUknMnMRj6J0S+lO
       
 30242 +	igtIRUAmAyDXL6cK0lBPIwDZCY+R8cnpiEfpOq5IZ87FIwfIl5BivQqAjA7z93Z3ZhXk
       
 30243 +	oN6vYiV4HDRMx4BTj4DH1MyriEeRuqV0p0UD8tu3vykg3zbUlJcW5F9KVwTkkF7fg6R4
       
 30244 +	HKKtZ0j2Hl2Xrw/i8FiO6lG6vivGmSsBslYJkFNoirXXASnH4xQ7Z3dv/7BoFo8vazG5
       
 30245 +	Kka3lO6cOgPyfv7F9OS4yEBGQZqCgoTmAb1apEPwCB10ZHgMJHi8mF9QCnh8yyZXv9GJ
       
 30246 +	SPc74szFYQEeID+1tzQxgDyXmhgdShXklPFkD7KXAfl9PH6SX0mOe4/icEopz6ITIEsY
       
 30247 +	QEYAIF2gSKf3ASnDoymoR5fl6wMj4wge7yMepey3Yp27IiAbWUAeJ4D0cneeqQGAlOFx
       
 30248 +	PKMeQ6MTU8+R5OrL2saWdsSjWD1TovNiAfmVSbHW15RTQB6Jiwhct8xl9rTJpoa6vaog
       
 30249 +	O+ExIu4IwWNJeU09qkeJOq2Ip80H5IcWBpA5544n7g71YwA5ZpSOVi8qSIpHLR2DMeOn
       
 30250 +	zHR29/IP3Z14/FwO4lHELintqfEA2dH2tr5aBsgtmgBIFo+6hqaTp812WbYuUAGPHVC5
       
 30251 +	+vUbJlel7cHimr0yICvLHt7mAOnmBApyzKgRvQdIBo8jRhE8Orl5+SngEfqvyvo9YnJV
       
 30252 +	XG4p3dl0Aci8i+lH9kZoACCV8bglYi+rHqtBPSIepeu14p15J0A+ZQG51c8LAGnFAHJA
       
 30253 +	r1xWDngk7ckBj1YUj1sZ9fjwaSUkVxGP4nVKKc9MGZDPS+7lXUg/rAGA7BKPF/IguYp4
       
 30254 +	lLLHinvuCoB831hb+fThrZyzxxJ3b/Vb1buA7AqPZ3NuIR7F7ZBSn12XgEwjgFzL7EGO
       
 30255 +	7p09SA6Po5nk6lpQj4fTL+TdK3mOeJS6z4p5/kqAfE0AmQ2AjKKAnGFlTlOs6leQinhc
       
 30256 +	5Qfq8RiDx9eN71E9itklpT23bgG5ea2Hyywo0ukVQPLxOMvFg+IxDfEobVeVxOy/B8jF
       
 30257 +	jr0FSBkeza1mOC0GPEYBHrOJekQ8SsItpTtJGSC//NHR1lxf/fwRpFjTDu+JoICcOqk3
       
 30258 +	ACnH46RpBI+bI/YcJnh8xKrHL1iaI12HFfnMuwHk/qgQv1UUkMakSEe9CpKPR0fAYwji
       
 30259 +	UeReiNOTWUAOyM8AyDcEkNey0g4pA7Jf31/U9jDXAuiONp00VYbHrGsUj81QmoN4lH08
       
 30260 +	/IPoLNAJkE8e3Mw+c7QXAcnh0RjUI4PH/ageRed3OKFuLMAA8u+vf33hAHn3WtapQ3u2
       
 30261 +	b17jsWCWTEGqD5B9+5Fbcxg8LgD1uH3PoTQGj28Aj58Rj918SPzHorAAB0hoYP7pw/uG
       
 30262 +	15UsIHeF+K4EBWlpzirIvn3Us2Dt05epXGXx6BsStf/omeybD55Uvm4ge4/YYE4UboeT
       
 30263 +	6M4CHCD/BEC2goJ89ogCMnZ7AAfIkeSiAHUBksHjSKoeF3isIXg8lXXtLiRX3zS3Ujyy
       
 30264 +	DR+7mw/+c7SAkC2gDMgXAMgroCB3BRNA2gIg9UdoDRygpqsfYbODHOzQNza3BPW40jdk
       
 30265 +	F+DxCuJRyB6GY/9PFvguIB2IghypPVhdgFTCY8D2WAaPz1g8ys4h/6cp4v8YLSAYC3QD
       
 30266 +	yH0EkIvmMoAcqiZAEjwOZPBo67hopW/wrn0MHl+gehSMQ+FAf84CnQBZfDc369TB2HCi
       
 30267 +	IB1sJpkYqA2QBI+DtUcawN6jA6hHDo/FiMef+8T4twVkASVAvqIK8nSKDJBmxvrD1QNI
       
 30268 +	isehw/WNzSxt5yIeBeRDONQetECXgDxJALnaY76DzUS1AZLDo8lEG4f5gMfw2IOnsnLv
       
 30269 +	Ih578GPjqzTeAjxAfoQ9SABk4c0rAMidwT6eREGqC5BKePQB9ZhymiRXX7zCvUeN9yIc
       
 30270 +	YI9ZoBtAxoRvWr2UD0gV1wQo4HHpaoLHk4jHHvvK+CKhWIAPyLZ3AMjHhTcuywFpYWak
       
 30271 +	DgUpx6MFqEdPn+CdBI83Ch8TPLZ9xNIcobgTjvNnLcADZHtrc13Vs+I7uVknDzKAtOcU
       
 30272 +	pIqvfoRKcppcpepx6epN4TEEj3dQPf7s18W/LzQLdAPIhJ1BPp4L59qqBZAcHo3MAI8L
       
 30273 +	PX2CCB4vM3h8h3gUmkvheH/CAlw8foUq1vbWprqqMhaQ24iCZAA5bPDvKgUkD4/28/l4
       
 30274 +	rKprbm3/LG8R8BPzxL+KFhCEBbiAhGMeH4mCrCAKMiOFAST0Z1W9guTjcQ7FYwLiURC+
       
 30275 +	g4PseQtw8SgHZNGd3PMnDsRs2+QNgLQme5CqBSTF47CRBqAeKR63xRw4eR7UY1lVXZMC
       
 30276 +	HrGDTs9/fnyjplmAC0g5IAsoIHcEbVixEAA5TsUpVh4epwMeNwTtSEjJIOqx4lUDqkdN
       
 30277 +	8xYcj6otwMVjZ0Bu9F4yz956gooBKcejtf38Jd6bAI8nAI9FiEdVf3l8v0ZagAtI2sCc
       
 30278 +	KsiC60RBygGpB1Ws/VV0DlKGx3EWgMcVHB4LWDxC/1X2GDKuVjXSe3BQPW0BLh4pIFtI
       
 30279 +	irXoNqMgZYDUUZ2CZPCoY2Aywdp+3hLvjYjHnv6++D6BWYALSBaQNRWPC65fykiJJ4B0
       
 30280 +	pQpSdYAEPPYfOHS4npECHq8jHgXmQzjcnrMAF49KgEyKCSOAtLOeMNZAZYDk8DhWAY+3
       
 30281 +	qXps4e894nK15z44vkmzLcAFpAyQpQDIdAVAaqtGQTJ41Gbw6ErUY3xKxiWCxxqSXEX1
       
 30282 +	qNmOg6NTiQW4eFQAZGaqGgDJw6MdUY9hMUknMnMRjyr5zPhSoViAC0hFQCbHRwatX04V
       
 30283 +	pKGeSgDZCY+R8cnpgMdSxKNQXAfHqQILcPHIAfIlpFivAiCjw/y93Z1ZBTmo56tYu8Bj
       
 30284 +	auZVxKMKPjG+UkgWoAH57dvfFJBvG2rKSwvyL6UrAnJIj+9Bcng0JMlV1+Xrgzg8lqN6
       
 30285 +	FJL34Fh72gJKgKxVAuQUmmLtcUASPA4apmMwdsIUO2d3b/+w6CQGjy/rmjC52tPfGN8n
       
 30286 +	IAt0BuT9/IvpyXGRgYyCNAUFCc0DerRIh+AROujocXgMpHjMLygFPL5lk6vf6MAEZEgc
       
 30287 +	KlqgByzAA+Sn9pYmOSBDqYKcMp7sQfYwILvHYy3g8ZP83CPuPfbAF8ZXCMoC3wOkCxTp
       
 30288 +	9DwgZXg0ZdRjYGRccvrF/PuIR0E5Dg5WJRZQBGQjA8hzqYnRFJAzVQBIGR7HM+oxNDox
       
 30289 +	9RxJrr6sbUQ8quQj40uFYwFFQNbXlJcQBXkkLgIUpMtsAkjdHlWQCnh0Wb4+MILBYwmq
       
 30290 +	R+E4DY5UZRbgA/JDCwPInHPHE3eH+nu5OwMgxxjoaPWgguThcaazu5c/4PH4uRzEo8o+
       
 30291 +	ML5YWBZgAfkV9iA72t7WV8sBuW6Zy+xpk3sWkCwedQ1NJ0+f7bJsHeDxCFGPgMd6Jrn6
       
 30292 +	9RsmV4XlQTjanrRA94D083JzIoAcNaLnAEnxqKUzasz4KQSPfqG7eXiE9uSyfo+YXO3J
       
 30293 +	j4zvEo4FugHk3ogtPQ9IHh6nETxukeGxGvDYAQc7EI/C8RwcqSosoAzIyqcPb1MFuZUC
       
 30294 +	0ooB5IAeuYuVweMIikcnNxkeH9LkKuJRFZ8X3yk0CygD8nnJ/bwL6UdUAMjOeNwL6jEP
       
 30295 +	1CPiUWheg+NVlQW6AOStnLOQYu1xQAIeBwzSIni0mknwuJVRjw+fVsLeI+JRVR8Y3yss
       
 30296 +	C3QG5L28C2mHAZBrmRTr6J7Zg+wSjxfy7pU8RzwKy2NwtKq0gAIg3ze+BgV5K/vsscSo
       
 30297 +	rX6r3Jxm9JiC7AqPZ3NuUTy+Rzyq8hPju4Vkge8A0sNlFuxB9gggOTyONp1Mkqtrt0Ts
       
 30298 +	PZyGeBSSo+BY1WKB7wFyMQDSnO5B/myKlYfHGU5uq/y2RiUeO5tN8Pi6EfGolg+NPyIM
       
 30299 +	C8gA+YUp0nn+iCrIPRGb1xJATuoJQPLxOMvFY+1mxKMwnANHqXYLdAPI/VEhfqsWO/YM
       
 30300 +	IGV4NLea4bgY8aj2j4w/KBwLKACyub4aAHktK+0wC8ipckD+8qOPHI+TpjJ43EPV4yM2
       
 30301 +	ufoFS3OE4y44UhVboBMgnzwgKVY5II1JFevPKEhlPIZE7Uf1qOKviq8XrAXkgPzc0db8
       
 30302 +	hgHkqUN7tm9eAwpSBsh+fX+Uj8ytObqjTXl4zLp2D/D4prmt4zPiUbCugwNXgQU4QEJ/
       
 30303 +	1k8f3je8rnzy4Gb2maMASF9GQbKA7NvnxwKSw6Mxqx4JHs9k33rwBJOrKvia+ErBW4AB
       
 30304 +	5N9f//rCAfLutSwCyIA1Hgt+HpB9+5FL5Rg8LvBYs3n7nkOnEI+C9xqcgKos0BUgrwAg
       
 30305 +	d4X4roQUq6W5sT5RkD949WOfvkzlqrG5JUmu+gIej57Jvknw2ED2HrH/qqq+K75XoBbg
       
 30306 +	APknALIVFOSzRxSQsXJAjiQ36fyYgmTwOJKqR8BjAIPHu1Q9tlL1yPZDFqjxcNhogR62
       
 30307 +	gDIgX4CCpIAM9l25yNGWAeTAHwMkbHaQgx36DB5X+obsAjxeQTz28CfE14nJAp0AWcwD
       
 30308 +	pANJsY7UHvxjgOyEx1iiHu8+egbJVYJH2TUdYrInzgUt8DMW6AaQ+3YRQM61tTQjCvKH
       
 30309 +	AEnwOJDBo63jopW+wRweX6B6/Jkvhn9X1BboApC5WacOxoaTFKuDzSQTgx8EJMHjYG2q
       
 30310 +	Hh2oemTwWIx4FLU/4eR+zgI8QH6EPchXVEGeTuEDcvjQHwCkDI9mlrZzKR73MeoR8fhz
       
 30311 +	Hwz/trgt0CUgTxJArvaY72Az8QcByeLRwGSiDcVjeOzBU1m5dxGP4vYmnN3PWoAPyDYK
       
 30312 +	yMIbVwCQO4N9PFkF+QOApHgcOlzfmMGjT/CufSmnSXL1xSvYe/yIe48/+9nw74vVAp0B
       
 30313 +	eSc36+TBmPBNq5fyAfmfiub4eJzvsToA8HgS8ShWF8J59aAFFAD5DhTk48Ibl+WAtIAU
       
 30314 +	638GpCIePX2CdxI83iikeGxDPPbg58NXic0CPEC2tzbXVT0r7gqQ/+lu5D5McpWqx/lL
       
 30315 +	V28KjyF4vIPqUWy+g/PpeQt0A8iEnUE+ngvn2lqYGf1XQMrxaAHJVRaPl28UPgb1+A7x
       
 30316 +	2POfEN8oIgtw8fgVqljbW5vqqspYQG4jCtKepliHDf79PwASDlqRvcfOeKyqa25tx9Ic
       
 30317 +	ETkPTqXnLcAFJJyD/NgGCrKCKMiMFAaQ0MD8vwKSw6ORGeBxoadP0M6ElNOIx57/cPhG
       
 30318 +	UVqAi0c5IIvu5J4/cSDmBwFJ8TiM4tGeqMdtMQdOngf1WFZV16SAR2wwJ0p/wkn9pAW4
       
 30319 +	gFQG5I6gDZ4L/zMgeXicPofFYwbBYwWqx5/8UPjXJWEBLh67AKT30nn21qRI598ryC7w
       
 30320 +	eALwWIR4lIQz4SR/3gJcQEIDc1ZBFlwnChIAuYIActx/SLEq4XFD0I6EFMTjz38jfIN0
       
 30321 +	LMDFIw+QtxkFudF7CQBygomBzr8FpByP1vbzlnoT9Yh4lI4r4Ux7wgJcQLKArKl4XHD9
       
 30322 +	kgIg9aBIp/+/uElHhsdxFqAeV7B4vF7AqkdoT87e0oHJnJ74cPgOUVqAi0cKyBayB1n0
       
 30323 +	g4Bk8KhjYDIB8LjEeyODx9uoHkXpNzgpFVmAC0gZIEspIOOJgnSlClJP+98AEvDYf+DQ
       
 30324 +	4XpGMjzGp2RcInisIaU5iEcVfT98rbgswMWjAiAzYQ8yjChIO+sJY/+dgvweHlv4pTm4
       
 30325 +	XBWXA+FsetYCXED+HCAZPGozeHQl6pHBYynisWc/F75N5Bbg4pEPyKuZJ5L+GyA5PI6d
       
 30326 +	YG1H1GMYJFczcxn1iHgUuQvh9HrSAjQgv337WwGQ6cnxkUHrl1MFafjPCrIrPKaDekQ8
       
 30327 +	9uSXwndJwQJKgKx9CSnWq5mpSdFh/nIFOej7xzwIHgcN0zGQ4zHpROZVxKMU/Afn2MMW
       
 30328 +	UADk24aacpJiJYAM/LeApHgcoq1nSJKrrsvXB0XGJyvj8Rv9mR4eOr4OLSA6C/AA+am9
       
 30329 +	pUkBkO7OdlNoivW7gJTjcYqds7u3f1h0UirF48vaJlSPonMYnJBqLdAZkPfzL6Ynx3GA
       
 30330 +	NAUFCd11ui3SIXiEBnN6hqYMHgMj4wCP+QWl5TUNb9m9R8Sjar8hvl08FugGkInRof7e
       
 30331 +	BJDjx8Ae5HcASfGopWMwZjyDx9DoRB4eP8k7duDeo3icBmeiOgt0DcgjcRGB65a7zJ42
       
 30332 +	2dRQlwFk1/2S2fbkhqaTp812Wb4uMCLuSPrF/PuIR9V9MXyzmC2gCMhGRkGeO564O9TP
       
 30333 +	y81pptX4MaNIf9ZubtLh+q+OGW8108nNyy90d+LxcyS5StUj4lHMnoNzU4kFFAFZX1Ne
       
 30334 +	QhTkkb0RW9Yto4AcTQHZdX9Wcskj2558tsuydVsi9lI8lpTX1KN6VMnnwpeK3AJ8QH5o
       
 30335 +	IYB8eDuHAHKr3yo3xxlW5gSQ3XTXgWwO12COtCf32wp4PJtz+yHgsbGlHfEoctfB6anC
       
 30336 +	Aiwgv0KRTkfb2/rq8pJ7eRfSDu+N2LzWY8Esrj9rlwtWWirHXvK4wGPt5og9h9Mu5N0r
       
 30337 +	eV6NeFTFp8J3SsACyoCsfPrwVvbZY/ujQmT9WZnmAZ0zOtxBK3LJIzSYg/bkx85m33r4
       
 30338 +	tBLw+AHxKAHnwSn2vAWUAfn80b1rWacO7dkesIa9G7mbLQ+yXB0Emx1QKgfXdECLALY9
       
 30339 +	OcVjB5x7/PoN9x57/nvhG8VtAQVAvm98Xfnkwc0rZ46S9nPMzVZMTUC/Tt2uyHIVsjlM
       
 30340 +	LQActKIddEiDOaY9+Z9f8ZoOcXsOzk4lFlAAZPOb6mfFd2n7uW0boSZgJtQE0C2PX/sq
       
 30341 +	L1iZ5eooY3Oy2QGlcswtVrSDThviUSWfCl8qAQsoApJtP5eRAlXlsOXRfUYHNh/hZAfT
       
 30342 +	sgOyOVsiSKkcc4vVe1SPEvAbnKKKLMAHJGk/xxy7olsei+faWpoZwU1zv/dXXrAyy1Xm
       
 30343 +	ZMdCT9+QKKgFyGFvser4/AXVo4q+Fr5W7BbgAxK668CxK1ITcBgyOqvJXeXklAfU6Cgv
       
 30344 +	WKEYYODQEaOgdHUmnOwg2Ry62QGV5KTBHKpHsXsNzk9lFpABEtrPwbEruuVBMjpBG5gi
       
 30345 +	VqjRge5zfRUzOiS7CgeRTSZNneXisS4Q7iQ/fQWyOZWvoRYA8aiyb4UvFr8FZIAk7eeg
       
 30346 +	JoDJ6MBNc36rFjvSBSsUlSuXBIB8HAzZVXrLo6cv1OakwrU5xWXVb5rxkkfxuwzOUJUW
       
 30347 +	YAD5N9xs9enDe9IOktwTAEWsZMFKjiWTmjklAUlqV4cO14fs6gwnd++NdLnKnOx4R7M5
       
 30348 +	uPeoyg+G7xa1BThAkqI56JdMLtLJgRqdnUHrmQwrNLtSFpBEPmqNoMUA8z3WbImMp8tV
       
 30349 +	WpvT/hlbBIjaXXByqraAHJB0wfr8EWxBnjgQvdVv5SJyVTmcgiQCkr8D2YfIx5EGzMnH
       
 30350 +	DcG72JNWVWS5Ks/mqHrc+H60gBgtIAPkl8/sgpVmWMOhJMAJDnkY6w8HAakQj31/lcnH
       
 30351 +	RSv9QqEhcta1e3DSqoEuV7E0R4xegnNSmwU4QNIFK8mw3rxyGkoCtpAaVtjxGDUCWnko
       
 30352 +	7EBCOgcuzqHy0Q3k454jUAxQ+PgFza7KlqtqGz7+EFpAVBZgAQkZHViwvqkmJQFwCnIX
       
 30353 +	KyChGSQcglSOx6HDye6jHdSSb44g8hGOdsDFAK1QK4eV5KJyDpyM+i3AAvIvyLC+a6h+
       
 30354 +	XgKHPE6CgPT1hJvKJ5uOpgkd3gYkm84xmWjjsMBjXdDO/cfoRR3Vb+BiAJCPeLBD/V8Q
       
 30355 +	f1FMFuDi8X+f25kdj/yLaYdiyQ7kXFs2ocOv0IF4JGetTCeRi6w2BO9OhI7Idx/BUat3
       
 30356 +	bZ++cA1YxWQfnAtaQK0WYALyKwhIUqLz5MGNyxnJe7dv9HajCR1yD6tiPJL06mjTydAS
       
 30357 +	GaoBYg6eysqj98q9/0B2O+jL1Dp8/DG0gKgswMYjCEioKYdrdG5ln0mJh4oA6AUJZ66U
       
 30358 +	E6yw3cFW58DVAH5hsYfgnscCLp3zFeNRVK6Bk+kNC5CA/PY3P6FzbN+OLWs9SIIVzkAO
       
 30359 +	Vdjw6EO2O/QM4aoOx8Ve/ttIevVGIRSvknQOKx97Yw74m2gBsViAiUdI6DAlrHdyM0mC
       
 30360 +	dZ3HAgebiWMNYMPjt37yggCIR9juMDK3pNVy2+OSSTE5VOdgPIrFHXAevWwBumD9+y+o
       
 30361 +	CCAJVqjQOX8iMYq/4dFfOR5J9So9bAXbHWfgJquyl3W0OoepBujl6eDPowWEbQESkNCc
       
 30362 +	lVTowL3IZMMjaXcwPXI1yZRsQPLjkZQDQDX5eCs75yWrAyISSDwWlVXx4lHYtsDRowV6
       
 30363 +	2wJ0wfqVxuOripL7eVmnDkSH+KxwnQN9PAxGag3iF+hw8QjlAEugHCDhKFyEDPHIbD9S
       
 30364 +	Pvb2bPD30QICtwAE5DeIR7oBWXo/78Kpg7x4HNZdPJLyHIV4pNuPAjcFDh8t0OsWYOLx
       
 30365 +	D148xmwlfGQLdLrhI8Zjr384HIAoLfBj8YjrVVE6A06q1y3wnfUqKWBV4CPsdyjlc+jd
       
 30366 +	cvL8aq/PBgeAFhC2Bdh4pCcgO+dzFA5c0f3H7+53CNsUOHq0QG9bAMLx/779y/0O5XoA
       
 30367 +	clsHd9wK63N6+0vi74vBAiQe2XqAGubGju/WA0C9nJGZ5QxHNy9/OI6ccfkGXPaI9Tli
       
 30368 +	cAScgyZYgOIR4vFT27v66ufFUC+X+r16ObaeHFrNrYJ68sPpF6FXAL0egBxHJu/ShDnh
       
 30369 +	GNACQrUAE49w5aPsgoBj+3cEMvXk5MIOxXryfsx5KwvZeasLcN6q4lXDe3q7HHkXBqRQ
       
 30370 +	PQHHrQkW4OLxYxvTwwPOWyVEbKY3sHZx3grOI5Pr5bjzyEknsq7BeWTmOiv2PLImTArH
       
 30371 +	gBYQpgUo0r59/ZPcwAoXWkETyIzkuO2b4IK5meSCOaXzyL+Q61ehW8BE6BawbF0QXPeY
       
 30372 +	mXsHes2RTuVf/mSvlxOmIXDUaAENsACNx7/hfoD2lsbXL+gN5Ydjt/mTjgEW0OIKLmDl
       
 30373 +	3w/wCxSwkm460Bt5/lK4Djnh6Jls+QYk3p+jAR8UhyBkCzB4pOlVeryDlJMfjAn181wI
       
 30374 +	FyKbQkcduKCcd58ViUdSEMAeuNq+N5lNsEI3HUjoICCF7As49t63ABuPNJ1DOurcyT2f
       
 30375 +	mhglP24FDQMU73ukFwQYjbOwnbsYEqwx0G0O2neQhM4H6G6F8dj7XxRHIGAL0HCE0x3k
       
 30376 +	ug4mnZNz9ug+kl5lrwdQbqjD9AugF1q5rvAJ2Z3Ev2COu/ARU6wCdgkcei9agFuuMvKR
       
 30377 +	vV4uLiLAe4nzTHqdleJ2xy+/9Ok3gEno2JD2j0E79x1jTkDWNdMLkRGQvfgx8aeFbgEW
       
 30378 +	j6QagN4OQE4/ph2KCaPpHNKxnDSAVOjfQS5E5i4oJzcExBEBWfiEaRggW7AiIIXuGTj+
       
 30379 +	XrAAF45cuwAiH6E6Zze9HYCeftQerNSwvA9J6NCKObhhjghIuIGVbagDNyJju/Je+Ir4
       
 30380 +	k2KxABePTP9HtmF5SsKOQOZ2OaZ9h0J69ZdfaIMrciPytDkgIIOjuIZzcIUOdPDgMjoI
       
 30381 +	SLH4CM5DbRbgwlHWH7n0PtNuDqoBnGdajR8zavjQ3/mnH8m9j5DQIQJyLNmB9Fi7hV2w
       
 30382 +	0hJWyLBCRofp4YEBqbbPiD8kDgsw4Qh3IQMeaXcruttxIknejpXKR4XtDpLQkTcshyMe
       
 30383 +	22IOQgdI2sKDlOjIAYkBKQ4vwVmoywI8PH4mxTmQXSXdHxN2BK3rtl05xCMISNIywBRK
       
 30384 +	ysmCddf+Y2fhDlbScq6lHbYguZoArCtX13fE3xGFBXh4hM1HOGsFd6/mZUFzq/BNsNtB
       
 30385 +	mnfQbqxK8pEIyAGkxRWzYF2zOWLvEejhQXvqvGMBiStWUTgITkKdFpCFI6hHwGNT7Uto
       
 30386 +	xpoDzVijQnxpsdw4ZrdDablKF6yw46FvbGZJM6yh0YmpmVdpDWtTKwBSnmLFFas6vyf+
       
 30387 +	lqAtwIUjUY8Ej3A1Oc3mJMdFQC8dUpxjYjBy2GDYfeRXr9KETj+6YCUZ1tkuy9YHRsan
       
 30388 +	ZFy6XlBaAYeuFAGJASloF8HBq88CbDhCMofisbWpror0Ks9MTYoO8/diej+OGgHNyhUO
       
 30389 +	d9C+On3ognWEAfQsJ008Nm6LOQA1cwwgiYIkgGRXrBiQ6vui+EtCtgCHx7+/0uQq4LGi
       
 30390 +	tOD6pYyU+B1B65e7zIZWAYa6UJyjvNtBIrIvZFihJMBwHM3obAjakcAHJOxBylM6GJBC
       
 30391 +	dhIcu7oswIUjrFbhZAenHq+eP3EgZttGms2ZMNZAB852dF6uEgEJC1a4JMAEtiDnLfXe
       
 30392 +	RABJFeTL2saWD59gzwMDUl0fEn9HBBaQLVaZ1WoHafxYXnI/n8HjBtIpwAKyOcOHDuzf
       
 30393 +	eblKdjygJAAyOkZm9BYdHwJIkmIteV5dD1XlsGKFKh1uxYqEFIHD4BRUaQF+ONLV6vuG
       
 30394 +	15VPH1L1SPE4z96ay+Z0yq4yGZ3+sAUJgJxoA7cEEAWZlHou59bDJy9ekZTOHwoSEgNS
       
 30395 +	ld8S3y14CyiGI12tvql+9uhe3oX05PjIoA0ryM0AZkb6gEfI5ihnV2k8Mhkd2PIggFyx
       
 30396 +	ISgy7kgaFOkUQyPIppYPHxkJiYQUvKvgBFRvAS4cSWoVxONnWK1CMudx4c0rZ48lRoeB
       
 30397 +	emTxCDfndJXNkWd0CCBBQS7x9g/dnXj0zGXY8yivftPc2s5KSFlAIiJV/1nxF4Rpgc7h
       
 30398 +	+A5Wq7DXkZt16tDeiMD1y4l6JHjU6jqbwyxYf4ManRGMgnRdvm5LROxBktKhK9a3bbDp
       
 30399 +	QXM6GJDC9BEctdoswIXjN4aOUEf+vrGuClar+RczUvbtCvHzcne2s54AtQBks6OrbA67
       
 30400 +	YCVbHiTFOsXOyW2Vb/DO+OT0C9fuFJVVvgYJCTkdDEi1fVP8IaFagIvG/5OF44eWpjfV
       
 30401 +	5aUFN7LPHk+KCQ9Y4+EymyRXGTx2mc1hAfn7IC1IsY6bPG3WAo/Vm8KiE4+evpR/79Gz
       
 30402 +	qtrGrgIS16xCdRoct6os0FU4NtfXVDyB3Or5k4f2Rgb5eC5ynGE1fizgEdRj19kcGSAH
       
 30403 +	a+tAkY7VjLkLV6yHFeuB1HPZNwpg06Ou8T1HSN6+B573UNVnxfcK0gKyaOTRsbW5/tWL
       
 30404 +	p0V3crPSkxN2bfXzXjLfYeokU0Oy9zjgt27xSGsCYA9SW2+06SQb+3nuq3yDdsQdPnX+
       
 30405 +	6q1CyOlwAfknKQyQi0hEpCD9BgetCgsoRCOpkvvyx8cPrc0NryCXczfvYsbRxOhtAWuW
       
 30406 +	uUAyx3zMKB2oJP8OHmlNAOxBDhsxiux5zHbx8PbfuishOS0r9/aDxyQg37W1f4J9SBqQ
       
 30407 +	GJGq+KD4TgFbQB6NFI5f//zfl88fP7QAHSvLiu/lXz5zPCl2+5b1sFqdOQWSObra/4BH
       
 30408 +	Akgo0iEpnbHjrWznui5bG7Bt9/6U9Au5tx+SgISkTjsUBvzvz6+KiMRVq4C9CIfeIxbg
       
 30409 +	BSOJRrrtSPYd2XC8f/3KudSDIB59V7nPc5g62dRIf4TWINh77LIWgKhH8vTpC1WskNLR
       
 30410 +	MzSdaG3ntNhz/ZbwmMSjGTQgn1fXNrxt+QBpVopIhUUrjKZHZoUvQQsI0QKK0Ui3OWCt
       
 30411 +	+qm97X3Tm5oXZcUkHE8eitsR4ue9lORWzcYY6MBex4Bfv6MemYD8lVmxQo51qgNISJ/A
       
 30412 +	iJjEYyQgH5Q+f/m6vvk9XbP+jyxalSMSQ1KIroRj/kkL8GPx/4CNEI1UOX7u+ND6tqGu
       
 30413 +	uuJp0b3r2ZknD8fv2rpxtYfrHFur8bLV6nfxyACSWbGOMQcJuWCJl29QRGwSDcjCkrLK
       
 30414 +	mjeN71o/dICK5CKSpyPZgf3k9PCvowWEYgHFUGSCkaxU//cFlCPAsbnhdVX5k6K7+Vcy
       
 30415 +	Tx5JiArdtHb5QseZ1hNJbpWsVrvf66DLVbpi/RVWrEO1dUebgIScAzkdPxKQR9Ozcm8W
       
 30416 +	FD+tgDVr83smImlIUkrC/ycojwz/M1pAUhaAGADVSNAI0fgHicaWt41val4+K314J+/y
       
 30417 +	uZOHE6LCAtatWOxkbzN5nBHNrf7japWuWPuRFSsjIafM4AIyEQIy58a9osfPX9bUQUS2
       
 30418 +	fej4+PmPLyQk//oK2R180AIStwCEwV9//UnQ+McnEo3vmupfV1eUPSq8fe3SmROH40k4
       
 30419 +	ero5O0wj4hEK5cjW4z+sVhkF2e+3Ab8PGQZ1rKaTrGfOdaWEjElMScu8knf7waOyiqpX
       
 30420 +	bwgj29o7PpGQ/PK///0Jz1/4oAUkawESAf+DUAQyQjB+ADY21ddWVz57XHTvZu6F08cP
       
 30421 +	xe8KC1jv6TZvFuw8jiVbHf9qtSoLSNj00BllPI4XkPuPnDx7MfcmILLsRTVEZNNbCMkP
       
 30422 +	7R0fP33+/AcJS3zQAhK2wB9/QCh++tjR3gZobG6sr615Wf4U4JiffT796IG9O0MJHSEc
       
 30423 +	LcePHa07XItUAvxDbpUEI3ngpoD+REKONDAeN9mGEtI3MHx3wqHjGVnZ+bcLi588e1H1
       
 30424 +	qraehGRLaxsEZXtHx0fyfMIHLSA5C1DX7+joaP/woa2t9T0EY8Ob19Uvy8tKHgIcL507
       
 30425 +	lZIYGxmyce0KJhxNRuuNgMKcf7daZQKSSEheQLos9fLZHLZrb1JK2rmLuTfuFBY/Lqt4
       
 30426 +	Wf2qrr6hsentu/cQla0Ql/igBSRrgdbWlpb37942NzVAMNZUvXj+tKTo/q287KyM1MP7
       
 30427 +	YiKC/NesWEzpaGII4fhvxSMNR1oVAAGppa3LEHKOy5KV6zdtjYzZfzg14/zl3Jt3CotK
       
 30428 +	y55DSNa8rn1T39DQ2NjU1AzPW3zQApKzAPH85qamxgYIxbraV9VVleVlTx49vH87P+fC
       
 30429 +	2VMpSXFR2wL9vJctcnaAxaqJoT4Tjv+81cEEI/lXUqYzAJKsEJBjQEPOmDPfbcUav6Dw
       
 30430 +	qLiklJOns67k3rhd8PDR46fPyl+8rKquefX6dW1tXV3dG3zQAlK0APh+be3rVzXVEIsV
       
 30431 +	z8uelBQV3r2Vl3PxXPoxgGPk1oANXh6uTvbTLGg4Qmr13+w8ysORF5BEQ06cYjtr3qJl
       
 30432 +	3j6bQyNjEg4ePXUm63Ju/q27BQ+LSx4/LXtWXvHiReXLly+ryFOND1pAQhagTl/18mVl
       
 30433 +	5YuK8ufPyp6UPip6cO/2jWvZF86lpx5J3LsrPMh/recSl7l2Uy3MTUZTOtJcTld3WPFj
       
 30434 +	UOHPMkJCQJpOsJru4Oi6dOU6/6BtO2P3Hzp68nTmxezc67fu3Ct8WFT8qPTxkydPn5bh
       
 30435 +	gxaQqgWePn3yuLTkUVHRg/t3b9/Iu3o562z68eSkuOiIrQE+3ssWz58zw2ay2ViSyqF0
       
 30436 +	/Dc7j0oB+SuzZB05ysh0vMXUmXMWLF7mvWFT8PZde/YfTElNP5sFIZl3/ebtO3fvFxQ+
       
 30437 +	ePDwYRE+aAFJWuDhw4cPCgvu37t7+9aN/Nycy1mZGaeOHUmMi44MDfRbu3Kpq5PD9CmT
       
 30438 +	xo0x+OFwpLseEJCQZdXRNxxrNtnadpaT6xLP1b6bQ7bviklIOnL0RPqZzKxLV3Jyr+Xl
       
 30439 +	X79x8+atW7fxQQtI0AK3bt26eePG9fxruVezL1/IOptx6njKwf17oyPDgvzXe3kAHGdO
       
 30440 +	s5xgamygO/wH6UhQySxZISBH6EFWZ6LlNLs58xd5rFzjGxAcviN6774DR1JST6WfPpuZ
       
 30441 +	lXXx0uXLV7Kzs3PwQQtIzgLg+FeuXL508ULW+XNnMtJOHEs+lBgfsysiNNB/vfdydxdH
       
 30442 +	h+nWk81NDEeN1NYaTFI5/3mxyqxcSUDCtseQYcN1DYxMzSdbT3eYu2AxRKTPpqDQiJ3R
       
 30443 +	exISDx5OOXr8xKm09PSM02fOnDmLD1pAchYAxz99OiM9Pe1k6rGU5ENJ++NioiK3BW/2
       
 30444 +	WwfR6Oo8e+ZUy4njxozW14Fw/H3AD4cjJSQUBgwcoqU9Un80INLCxnaWI0Skp/d6v4Cg
       
 30445 +	0O2RUTF74vYlJh08dPhIcgo8R5nnGD6aaAH26+C/8S3wMx+KfQ/x/OTkI4cOHkjcn7A3
       
 30446 +	ZvfOiG0hWzb6rFm1DKJxjt30KQBHIwPdEaRmdcBvP0pHdsn6a3/YiKRrViMTs0mWU2fM
       
 30447 +	cpy/cMmyVavX+20KDA4Nj9ixa3d0TOyevXHx8fEJ8OzDBy0gGQsQj0+Ij4+L27snJmZ3
       
 30448 +	1M6I7WEhQZv9fdZ6e3osdiHRaG0xwRTgOJKRjr9BGcB/2uhglqrcv8KSlaRZyZoVEGls
       
 30449 +	aj7Jaqqtwxxnl8VLl6/0XrvBzz9gS1BwSGjYtvDt2yO4JxIfTbQA93nw33kW+JkPJX/N
       
 30450 +	9vDwsNCtIUGBmzf5+axb7bXCw33hfMfZNBrHjTWkcOSk40+EIyxZGRE5kCBSd9ToMRCR
       
 30451 +	ljbT7WY7znNZ5O6xfKWX95p1G3z8/Pw3bty0KQCezfigBaRkAeL0mzZt9Pfz8/VZv3a1
       
 30452 +	96oVy5a6uS5wmuMwY9oUiwnjYKmqp6M9bMjPrlVZRPaRIVJLW0d3lCFE5ESLKdNs7WbP
       
 30453 +	dV7gsshticey5StWrvLy8oZnNT5oAclZgHi+t9eqlZ4rlnksdV/s6jLPcY7DzOk2lpNp
       
 30454 +	NJKl6lACR1ir/ovzx9zStNt/pwHZ/3eyaNXW0Rs12tjEbMJkS+tp02c6zJ7j6DzfxcV1
       
 30455 +	4aLFbm7u7kvgWYoPWkBCFiA+v8Td3c1t8aKFri4L5jnNnTPLbsZ0GyuLieamY40MIBrp
       
 30456 +	LgeTyPmptSoXoRwiYdEKEak7ysBorCmEpIWVzbTpM+zsZ82eM2euo6OTk7Oz8zx80AIS
       
 30457 +	swC4vbOTk+PcOXNmz3Kwm2k7faq1pcXE8eNMjA0N9Eg0kqVqf7iboyfgyMRkn75MXodG
       
 30458 +	5IiRegajjceajhs/cbKF5RRriMrp021nzJg5c6YdPmgByVkAHH/GDFvb6dOnTbWZYmUx
       
 30459 +	edIEM1OTMYYGo3R1ZNFIdjl6BI4sJGlEwtbHwEGwGzlcR1ffYLTRGIhJs/ETJk6abGFh
       
 30460 +	YWlpZWU1BR+0gOQsAI5vZWkJMTB50sTx5uMgFoGMo/RGjtCmuhHY2NPRCEEJi1aGkb8P
       
 30461 +	GjwUQhIoCTFpCEFpYmoKcWlmZm5uPh4ftIDkLACOb25mNm6cqanJ2DHGRqMNRunr6kAw
       
 30462 +	wkJ1IFmpqiAaCSXZiKSQJCEJmBypq6c/ygDC0tDIyMgYnjH4oAUkZgHi98ZGRoaGo0cb
       
 30463 +	QCjqQSwOBzIOgZQqKcdRUTSSiKS7kb/++huEJFByyFCtYRCUI3QgLHX19PT0uWcUPmgB
       
 30464 +	aViAc3lwf13dkSMhEodr01gEMrJo7FndSMOQ9y8MJJmQBDEJQQlRCWFJn+H4oAWkaAHG
       
 30465 +	/YcN09ICLA5mYpGsU3s4icOLQ94faUhCGR1gEjj5+8CBgwYNGjx48BD5MxQfTbSA/APh
       
 30466 +	n2QW+JkPJXvJEIhCiMNBA4GKvw8Y0B9iEZapqiUjLyJh3UqyO/36wdr1t/79IS5JYOKD
       
 30467 +	FpCyBSAKIBZ+I6FIY7Entzf4wdfdn2lQsmH5Kzy/4YMWkKgFiP+TOCSRCFjs0a3G7uKv
       
 30468 +	m39Ofh0eGAc+aAHpWoAJA3VDsZugxH+MFkALoAXQAmgBtABaAC2AFkALoAXQAmgBtABa
       
 30469 +	AC2AFkALoAXQAmgBtABaoFct8P/b5umcCmVuZHN0cmVhbQplbmRvYmoKMjQgMCBvYmoK
       
 30470 +	NDQ4NjUKZW5kb2JqCjIwIDAgb2JqCjw8IC9MZW5ndGggMjEgMCBSIC9UeXBlIC9YT2Jq
       
 30471 +	ZWN0IC9TdWJ0eXBlIC9JbWFnZSAvV2lkdGggMjU2IC9IZWlnaHQgMjU2IC9Db2xvclNw
       
 30472 +	YWNlCi9EZXZpY2VHcmF5IC9CaXRzUGVyQ29tcG9uZW50IDggL0ZpbHRlciAvRmxhdGVE
       
 30473 +	ZWNvZGUgPj4Kc3RyZWFtCngB7dCFQQIAAABBsTswEAxsBQWD/XdzkL8b4Vartj8MGDBg
       
 30474 +	IDnwiwEDBgwkB34wYMCAgeTANwYMGDCQHFhiwIABA8mBBQYMGDCQHPjCgAEDBpIDnxgw
       
 30475 +	YMCAgeDAHAMGDBhIDswwYMCAgeTABwYMGDCQHHjHgAEDBpIDbxgwYMBAcuAVAwYMGEgO
       
 30476 +	vGDAgAEDBoIDzxgwYMBAcuAJAwYMGEgOPGLAgAEDyYEHDBgwYCA5MMWAAQMGkgP3GDBg
       
 30477 +	wEBy4A4DBgwYSA7cYsCAAQMGggM3GDBgwEByYIIBAwYMJAfGGDBgIDpwjQED2YERBgxk
       
 30478 +	B64wYCA7cIkBA9mBCwyEB84xYCA7MMSAgezAGQYMZAdOMWAgO3CCAQPZgWMMGMgOHGHA
       
 30479 +	QHbgEAMGsgMHGDCQHdjHQHhgDwMGsgO7GDCQHdjBgIHswDYGDGQHtjBgIDuwiQED2YEN
       
 30480 +	DBjIDqxjwEB2YIABA9mBNQyEB/4BLgXylgplbmRzdHJlYW0KZW5kb2JqCjIxIDAgb2Jq
       
 30481 +	CjM2NgplbmRvYmoKMjUgMCBvYmoKPDwgL0xlbmd0aCAyNiAwIFIgL1R5cGUgL1hPYmpl
       
 30482 +	Y3QgL1N1YnR5cGUgL0ltYWdlIC9XaWR0aCAyNTYgL0hlaWdodCAyNTYgL0NvbG9yU3Bh
       
 30483 +	Y2UKL0RldmljZUdyYXkgL0JpdHNQZXJDb21wb25lbnQgOCAvRmlsdGVyIC9GbGF0ZURl
       
 30484 +	Y29kZSA+PgpzdHJlYW0KeAHt3Qs/k2EYB+A5j2HOZpjz+TxzNkQSSSJJJJEkkkgStq/e
       
 30485 +	B+n6CPtte9/nuQ//K51KPT483N//vbv7c3v7++bm1/X11dXPy8sfFxffz8/Pzr6dnn49
       
 30486 +	OflyfPz56Ojw8NPBwcf9/Q97e7u773d23m1vv93aerO5ubHxen391dray9XVFysry8vP
       
 30487 +	l5aeLS4+XViYn38yNzc7OzOTTCanp6empiYnJyYmxsfHxsZGR0dGEonE8HA8Hh8aGhwc
       
 30488 +	HBjo7+/v6+vt7e3p6e7u6urq7Ozo6Ghvb2tra21taWlpbm5qampsbGiIxWL19XV1dbW1
       
 30489 +	0Wi0piYSiVRXV1VVVVZWVJSXl5eVlZaWlpSEw+Hi4qKiosLCUChUUJCfHwwG8/Jyc3Nz
       
 30490 +	crKzs7OyMjMzMzICgbTP7/v3+/f/9/zz/Pf+8/53/nH+c/51/nf/cf9z/3X/V/9Q/1H/
       
 30491 +	Uv9T/1T/Vf9W/9f/0P/R/9L/0//U/9X/1v83/2D+w/yL+R/zT+a/zL+Z/zP/aP7T/Kv5
       
 30492 +	X/PP5r/Nv5v/t/9g/8P+i/0f+0/2v+y/2f+z/2j/0/6r/V/7z/a/7b/b/5d/IP9B/oX8
       
 30493 +	D/kn8l/k38j/kX8k/0n+lfwv+Wfy3+Tfyf+Tfyj/Uf6l/E/5p/Jf5d/K/5V/LP9Z/rX8
       
 30494 +	b/nn8t/l38v/5x/wH/gX/A/+Cf+Ff8P/4R/xn/hX/C/+Gf+Nf8f/4x/yH/mX/E/+Kf+V
       
 30495 +	f8v/5R/zn/nX/G/+Of89IxBIp1L8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8
       
 30496 +	d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/
       
 30497 +	zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf
       
 30498 +	+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47
       
 30499 +	/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/nv/Pf+e/8d/47/53/zn/n
       
 30500 +	vwfSqdTjw3/sv/8DK6twSQplbmRzdHJlYW0KZW5kb2JqCjI2IDAgb2JqCjgxNwplbmRv
       
 30501 +	YmoKMTcgMCBvYmoKPDwgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMCA+PgplbmRvYmoKMTgg
       
 30502 +	MCBvYmoKPDwgL1R5cGUgL0V4dEdTdGF0ZSAvY2EgMSA+PgplbmRvYmoKMjcgMCBvYmoK
       
 30503 +	PDwgL0xlbmd0aCAyOCAwIFIgL04gMSAvQWx0ZXJuYXRlIC9EZXZpY2VHcmF5IC9GaWx0
       
 30504 +	ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4AYVST0gUURz+zTYShIhBhXiIdwoJlSms
       
 30505 +	rKDadnVZlW1bldKiGGffuqOzM9Ob2TXFkwRdojx1D6JjdOzQoZuXosCsS9cgqSAIPHXo
       
 30506 +	+83s6iiEb3k73/v9/X7fe0RtnabvOylBVHNDlSulp25OTYuDHylFHdROWKYV+OlicYyx
       
 30507 +	67mSv7vX1mfS2LLex7V2+/Y9tZVlYCHqLba3EPohkWYAH5mfKGWAs8Adlq/YPgE8WA6s
       
 30508 +	GvAjogMPmrkw09GcdKWyLZFT5qIoKq9iO0mu+/m5xr6LtYmD/lyPZtaOvbPqqtFM1LT3
       
 30509 +	RKG8D65EGc9fVPZsNRSnDeOcSEMaKfKu1d8rTMcRkSsQSgZSNWS5n2pOnXXgdRi7XbqT
       
 30510 +	4/j2EKU+yWCoibXpspkdhX0AdirL7BDwBejxsmIP54F7Yf9bUcOTwCdhP2SHedatH/YX
       
 30511 +	rlPge4Q9NeDOFK7F8dqKH14tAUP3VCNojHNNxNPXOXOkiO8x1BmY90Y5pgsxd5aqEzeA
       
 30512 +	O2EfWapmCrFd+67qJe57AnfT4zvRmzkLXKAcSXKxFdkU0DwJWBR9i7BJDjw+zh5V4Heo
       
 30513 +	mMAcuYnczSj3HtURG2ejUoFWeo1Xxk/jufHF+GVsGM+Afqx213t8/+njFXXXtj48+Y16
       
 30514 +	3DmuvZ0bVWFWcWUL3f/HMoSP2Sc5psHToVlYa9h25A+azEywDCjEfwU+l/qSE1Xc1e7t
       
 30515 +	uEUSzFA+LGwluktUbinU6j2DSqwcK9gAdnCSxCxaHLhTa7o5eHfYInpt+U1XsuuG/vr2
       
 30516 +	evva8h5tyqgpKBPNs0RmlLFbo+TdeNv9ZpERnzg6vue9ilrJ/klFED+FOVoq8hRV9FZQ
       
 30517 +	1sRvZw5+G7Z+XD+l5/VB/TwJPa2f0a/ooxG+DHRJz8JzUR+jSfCwaSHiEqCKgzPUTlRj
       
 30518 +	jQPiKfHytFtkkf0PQBn9ZgplbmRzdHJlYW0KZW5kb2JqCjI4IDAgb2JqCjcwNAplbmRv
       
 30519 +	YmoKMTIgMCBvYmoKWyAvSUNDQmFzZWQgMjcgMCBSIF0KZW5kb2JqCjI5IDAgb2JqCjw8
       
 30520 +	IC9MZW5ndGggMzAgMCBSIC9OIDMgL0FsdGVybmF0ZSAvRGV2aWNlUkdCIC9GaWx0ZXIg
       
 30521 +	L0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4Aa2TzWsTQRjGn02QCtZQi0jx4oJSPERdkhbb
       
 30522 +	W9t8SOwSlySlfhw02d1soslm3d1ErR561H+gFEQQPOjBmxc9tSeR4ieC9OBdUU9a6qGU
       
 30523 +	9Z0Zd4Ng8eK7zMxvH555Z+adXSC+UXWcVgxA2/bd0qkZ+ey58/LAOiQcQgJJyFXdc6Y1
       
 30524 +	TSXLDrH5gdwU74+xXF9iz7c+fdtz58Li7bXDSw9bO0wK5YRLCwJSkoT9luApxjXBFcbX
       
 30525 +	fMcnT4Ox3qgaxLeIk26llCF+RJywBD9lXBP8gnFPt9jcdWLFNpo2ENtNPGGYnk48RWwZ
       
 30526 +	nt4mpjwS2u0O5Y+znEd1x6W58bfER1hdaKS4mgAmv5J+r69dPAE8WQMOaH1tdBkYvgQ8
       
 30527 +	m+xrP97wWkkjNa+eTvF00uBBYNdqEHwPgAHyb78Ogq3lINheojU2gJWi3nV73EsblF4B
       
 30528 +	/3oXZxbZgXd0Bgp+R39nURfuUoAHq0BlEVBpvEvj6E9g301AA+lUpnQ6bKKGJAN7szlV
       
 30529 +	lVNjynhem+fKf+zarS7dFY9h6gftWvEMjSPUPju+RpsS7PXKuZDrzXwhZKOanQ15oZEp
       
 30530 +	hlx386WQL1dPswPynKY9Vw7ZafFv//daM5Hf9HKRZ6FRYWfmHrdbmgv5Smc28htmNtqb
       
 30531 +	3Sqy/4n7m34h2j+yyEGlR0YKY1AwjjyVfV58kzQDQ4+B+0PKyXR55eNLJvwRvnmd33Wm
       
 30532 +	49xwm1bDl6fpjzSTcsHWjyfllKJM4BeDarM/CmVuZHN0cmVhbQplbmRvYmoKMzAgMCBv
       
 30533 +	YmoKNTY1CmVuZG9iagoyMiAwIG9iagpbIC9JQ0NCYXNlZCAyOSAwIFIgXQplbmRvYmoK
       
 30534 +	MzEgMCBvYmoKPDwgL0xlbmd0aCAzMiAwIFIgL04gMyAvQWx0ZXJuYXRlIC9EZXZpY2VS
       
 30535 +	R0IgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBhZRNSBRhGMf/s40EsQbR
       
 30536 +	lwjF0MEkVCYLUgLT9StTtmXVTAlinX13nRxnp5ndLUUihOiYdYwuVkSHiE7hoUOnOkQE
       
 30537 +	mXWJoKNFEAVeIrb/O5O7Y1S+MDO/eZ7/+3y9wwBVj1KOY0U0YMrOu8nemHZ6dEzb/BpV
       
 30538 +	qEYUXCnDczoSiQGfqZXP9Wv1LRRpWWqUsdb7NnyrdpkQUDQqd2QDPix5PODjki/knTw1
       
 30539 +	ZyQbE6k02SE3uEPJTvIt8tZsiMdDnBaeAVS1U5MzHJdxIjvILUUjK2M+IOt22rTJ76U9
       
 30540 +	7RlT1LDfyDc5C9q48v1A2x5g04uKbcwDHtwDdtdVbPU1wM4RYPFQxfY96c9H2fXKyxxq
       
 30541 +	9sMp0Rhr+lAqfa8DNt8Afl4vlX7cLpV+3mEO1vHUMgpu0deyMOUlENQb7Gb85Br9i4Oe
       
 30542 +	fFULsMA5jmwB+q8ANz8C+x8C2x8DiWpgqBWRy2w3uPLiIucCdOacadfMTuS1Zl0/onXw
       
 30543 +	aIXWZxtNDVrKsjTf5Wmu8IRbFOkmTFkFztlf23iPCnt4kE/2F7kkvO7frMylU12cJZrY
       
 30544 +	1qe06OomN5DvZ8yePnI9r/cZt2c4YOWAme8bCjhyyrbiPBepidTY4/GTZMZXVCcfk/OQ
       
 30545 +	POcVB2VM334udSJBrqU9OZnrl5pd3Ns+MzHEM5KsWDMTnfHf/MYtJGXefdTcdSz/m2dt
       
 30546 +	kWcYhQUBEzbvNjQk0YsYGuHARQ4ZekwqTFqlX9BqwsPkX5UWEuVdFhW9WOGeFX/PeRS4
       
 30547 +	W8Y/hVgccw3lCJr+Tv+iL+sL+l3983xtob7imXPPmsara18ZV2aW1ci4QY0yvqwpiG+w
       
 30548 +	2g56LWRpneIV9OSV9Y3h6jL2fG3Zo8kc4mp8NdSlCGVqxDjjya5l90WyxTfh51vL9q/p
       
 30549 +	Uft89klNJdeyunhmKfp8NlwNa/+zq2DSsqvw5I2QLjxroe5VD6p9aovaCk09prarbWoX
       
 30550 +	346qA+Udw5yViQus22X1KfZgY5reyklXZovg38Ivhv+lXmEL1zQ0+Q9NuLmMaQnfEdw2
       
 30551 +	cIeU/8NfswMN3gplbmRzdHJlYW0KZW5kb2JqCjMyIDAgb2JqCjc5MgplbmRvYmoKNyAw
       
 30552 +	IG9iagpbIC9JQ0NCYXNlZCAzMSAwIFIgXQplbmRvYmoKMTkgMCBvYmoKPDwgL0xlbmd0
       
 30553 +	aCAzMyAwIFIgL0Z1bmN0aW9uVHlwZSAwIC9CaXRzUGVyU2FtcGxlIDggL1NpemUgWyAx
       
 30554 +	MzY1IF0gL0RvbWFpbgpbIDAgMSBdIC9SYW5nZSBbIDAgMSAwIDEgMCAxIF0gL0ZpbHRl
       
 30555 +	ciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCngBzcLXcQJAEAXByT8vjLDCO4HwIoobfRPA
       
 30556 +	K7arW4f22V1akT1anX3ae/t85hfWOcAih1jnCIscY50TLHKKdX5jkTMsco51LrDIJda5
       
 30557 +	wiLXWOcGQ7cYusPEPYYeMPEHQ4+YeMLQXww9Y+IFQ6+YeMPQO4Y+MPGJoX+Y+MLAf+tF
       
 30558 +	vN4KZW5kc3RyZWFtCmVuZG9iagozMyAwIG9iagoxMzAKZW5kb2JqCjMgMCBvYmoKPDwg
       
 30559 +	L1R5cGUgL1BhZ2VzIC9NZWRpYUJveCBbMCAwIDUxMiA1MTJdIC9Db3VudCAxIC9LaWRz
       
 30560 +	IFsgMiAwIFIgXSA+PgplbmRvYmoKMzQgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1Bh
       
 30561 +	Z2VzIDMgMCBSIC9WZXJzaW9uIC8xLjQgPj4KZW5kb2JqCjM1IDAgb2JqCjw8IC9MZW5n
       
 30562 +	dGggMzYgMCBSIC9MZW5ndGgxIDUwMzIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3Ry
       
 30563 +	ZWFtCngB7TiNfxNVtufcOzOZNkDT0pbQAJl0aJWm2QIKlEJpaJKWNkILVDepsCb9kADF
       
 30564 +	Flo+n9Iqq2L4sK7a1d+u6K6rFaw6bZENRZevxdUVfn6ivLfig4X14z0R9Af7VoHOO5Nq
       
 30565 +	BZd9f8Gbk3vn3nPOveeej3vu3AACwBBoAw7u2mXhJpBhGmEOU7HWrmpR3tm342NqnwaQ
       
 30566 +	V9zetGhZ6hcziZ4QABDKFzWsvT0yatrbAEN/RzyvR+rDdWeXqscBhjVQf3KEEMPGCEQf
       
 30567 +	ZtDHRpa1rJH3Yxf1X6e+3NBYG4Y6SKc+8YC0LLymiT0q3k39Y9RX7ggvqx+59bl11P8H
       
 30568 +	9dWmxuYWvQpuB0gaRf3sphX1TWeOuN6jvpfWEyYcEhjPEJCoADgMjNgLILbBGCojeA9k
       
 30569 +	6hf0v1L5zCj9s4j2NCT31wDwEmpvi4+/qhJP0OyeAZT+L56rBlyzMzAQDE2Ncu2nHMxQ
       
 30570 +	AltABAsI8Az1zsJxuA8klGEyJEM+vIAfgQcq4R4shJ8TTwaUwQuwGz7ARfolEPSgfgCW
       
 30571 +	QidOIv0zoAAWwF44T3x/gp9CGNZAK96j30XWSYQxkAk3kDVXwDo4SRwJkAY2yMQsNo0f
       
 30572 +	gxE0sgHaYAPsFir0Z/XjNCaBoAKeheegH6sxou/STxEmH6aCD+bDHcT7AIqYJo7R/6Kf
       
 30573 +	18/DRFrnQlhE8yyHx2AXmnA4OvEPrIh3wDjSsxGaIAod8Ev4M2bjm7xS3w4uggkwh+a7
       
 30574 +	FWpozi3QB2/ANyixGraGvcB28RX8ogDCUfFtyae/ph+hyBXBSmMKaMRtFE+Lad4H4R34
       
 30575 +	EP4KX8HXmIaZOAEn4wwsw6WsQTJLP9X30BgzjAaFbJADebTSAigmmEe2uBMehS54BV4l
       
 30576 +	OABfokJwHcE4vBWfwR48xZKYwg6zd9g3PJ/7+aOCVVgo3Ck+Jp6UcnSPvosslQJ2UGEK
       
 30577 +	zVhOFrsVamlVzWT9X0InwYuwE2LwHvwFTsHfaH0j0Iqj0IOlWI7nGGePs8/5ZL5OkPpH
       
 30578 +	6xP19fGoTqLVziAoJ7gJZsNcuJk8GoB68vY6+De4C9bDPRQRD0I7gSFnQEof7IPXKeLe
       
 30579 +	JXv8B/n5FPwXnKOI+BYukz+SSLIDc/AGzMfp6CXwYQVBBFfj/bgZ2/Fh7CKNN7KH2Vc8
       
 30580 +	kafycl7P7+ab+JN8Lz/IjwjZwiyhR+gVC8RScROBJh4TP5G45JEekj4zbTe9IlvlIrlM
       
 30581 +	Xiz/+tLOfug/2n9On6HP0bfoW/V2/b/j3pPIYjL5YwhFeCpFrRNupIgqp+iZD1UQ/M5+
       
 30582 +	yyhSmwlWwipYC/fC/bCZYAs8RBH0G3geeuBl2A9/hNdIUwOO0c75mOA07aF/kK4ymnEo
       
 30583 +	aWwhGIVjcCzFnBNzMQ8nYSG6yf5zMIj1uAI34TZ8GV/Ft/AjBuRtG1NZAZvO6sgKz7Od
       
 30584 +	bC/55zryUD6/iS8iazwpJAluEcQO8TOpU3oV3sPptN+ufh6Br/RUYQucod2zGt7neXod
       
 30585 +	r8Xl0CLehk74lnbGbtJF5ZSLcRycE75AJ1vN0nAjS2OT2GnxFXykP4qJ5MuPIIdW5hM6
       
 30586 +	4N+hkM+gvbqW+4WF7PdCNu6kCK3BL9lC9ivmE9ewaijGF9GF5XwcHDFlSZ+wevycZ5pC
       
 30587 +	cBFXkRaV8Du2AzYyF/4Pm9a/T3KJE2G78BHzwHY4xjJMEkvjF9m77Am4gz1Ee+IRirpv
       
 30588 +	4Be03qG4gnKOCwvwXYqmg/g+5d8XxDb9vHgnK2TT8R32N4ogEJ4QwgNc/yJx/j86bgF4
       
 30589 +	iS0zzaKsO0I8IB4w2uwQa+Qu7mImOEJ1IzOxD4Ri+AXXTDoWiptQkd6U3sQlUCciZEOF
       
 30590 +	8DPswK/xIPQKU+A8fg0opEAFZkvT8AlxGlSII+ExlgkP0Sn3Br7I18DnOJrGLGGHTLMw
       
 30591 +	X7gICzEffisUC5/wDvYImlkOnsT78O8EDZRdnbgW1ksvwWq+EfJ42PQ+OtjP2R5oYaWU
       
 30592 +	ZeewbKzkb8Eh2CMVsJvpnQ37+TYWoCyXJx+GM9ggbBA24AdQxuZBG2sVEJLwuHAJGqQW
       
 30593 +	uFP8EO7C1XEpfYYc2vO/IVmT8E902m2gHJNNZ8sewn4IRZBLuXsN5e0dlAOClCmQzsYz
       
 30594 +	KFFmMHLeKbYTGfweZsHD3Mct0sNwN/sWMyjD1BE2C5bBVlQpSxRS1jyIH9M5GqBT73pe
       
 30595 +	A3NN24HhcNqhIG6lk0eFE/AqlsNP4EPMoMyoAjKB34htcAmrWEd/jVACiXw53yAuxRLa
       
 30596 +	Ty8C6qnwZz0i0PeGe1L+lBsmjM/7iSvXmTPu+uuys8aqmQ7FPmb0KFvGSOuI9LTU4SnJ
       
 30597 +	lqRhQ4eYExNkkyQKnCHk+tSSkKJlhzQhW501y2X01TAhwlcgQppCqJKreTTFGBcm0lWc
       
 30598 +	buK8/Uec7gFO9yAnWpTpMN2Vq/hURTviVZUYVs8NUHuLVw0q2pl4e3a8LWTHO0Op43DQ
       
 30599 +	CMVnjXgVDUOKTyvVhCwtsSrg0MqCqyJRX8jrysVuc6JH9dQnunKhO9FMTTO1tBK1qRtL
       
 30600 +	ZmC8wUp8Bd0M5KGkrlauen1amUpDaUae5QvXaZVzAz6vzeEIunI19NSqNRqoxVqSM84C
       
 30601 +	nrgYTfJoprgYZbFGmsEmpTt3X3RzzAI1IeeQOrUuvCCg8TDN4dOSnVqp6tVK1522unJj
       
 30602 +	+GxVQEvwxBCqAruhXG/rLmvzeoOGtBRP4P4r2W086rMuVozR0ej9ivbU3MAVk9kcxpTB
       
 30603 +	IE3qyvXPCzho1apvs2KoMS8Q14AmRWseLdzAGWoOKFyv+gxMaImiJajFaiS6JER+y4hq
       
 30604 +	MG+toyej3L1bPwHlPiVaFVAdWpFNDYa9o7pTITpvbW+ZWym7muLK7bYkD1i6e1jSd40h
       
 30605 +	Q69s1JMXBmjxVpzdaNGqvzc1GitSyzQ3hVutQisJqBrLyjeq+nyI1uaTR+gJIll0Mdkv
       
 30606 +	FLUUkHaamGVRlegFoJhQz3xxNSb8HUbKslwAg2hEzmD0aRj+vq05nVpOjhEpJg+5llY2
       
 30607 +	I96f5MpdpfnVJoui+clkUBmgQcGCPDK5w2F4eVPMDTXU0drmBgb6CtTYesCd5wxqLGRQ
       
 30608 +	9n1PSbvZoLR9TxkcHlIpsnfGbxJpmpw9+EuypA/3RQo0TP8/yPUD9BLax9FoiaqUREPR
       
 30609 +	cExvq1EVixrt9vujTT7afwMrj+l9m2xayeagZglFkMynDfcEuI0ZsUctZuNBF31GUGKg
       
 30610 +	nERAX0smutQkO5KzqKLTFS4pfN8ltwgXQRH2ERcw6NKPMyvdY0wwHCrciRIKAJQeuRDD
       
 30611 +	ZW6b/PwwM98q3CfhSrO0MjmttLTc/HxyWeqCVVbnHMv52Zfn+Oq9n8y2nCY4fwaKLn9Z
       
 30612 +	hMkpU4HK1AnjcQTjKqNPn4mUwCQ1M3vSjZPx0wlTb1non3ggtTwSKS+LLBK3Zfe/cfkW
       
 30613 +	thyvL7z4noGKlJVHaG2GGgzgsulXoduSpl8Am2ysGA6VNvQMvmn1pOk24k2I8xsEGiex
       
 30614 +	y81wWt7f/1j/4/ITgxSDajxMIhTbT9/tQPfJOqoHZC0geQvITIzuU6kwnRgLhR6yokFF
       
 30615 +	+ko33jQ5fXeCd25xZdktTk+4YXHz7KriRrrC0lqNR7/JuHNe4zHoZNwYf7Rn+Uh7jF/s
       
 30616 +	pdeUGJrdGWNW22+hspCK0jq+1d3KX37Qa59iWWfpQw6MHd7VNNZ+6ORwewz7e0+OtOfN
       
 30617 +	TMAHoIgKg5PsIF3F7Oyge/5rqr2pta2VtZofND9pfsm81/yWme5hlgT2dsKJhHMJPInb
       
 30618 +	OftPfpbrnOcpaM+8LfOsoitCkpKnFCkVSqPSqrykmJIy7ZkVmbxtOVpmOlgTKFTGU3FT
       
 30619 +	aafyFBVpEGtgeJxWSS02iCd9qW9hTe5EtmNdpr1tHW7siumHe63p8bf7emv6U5+a7E99
       
 30620 +	+owpfUnnnqyBquPp8faOpxPGpz/dmZMwUMVwQs/jZnsfToDH8Ua3xXwFLSVZdsdY/ss3
       
 30621 +	2xJsCe1/wOcoktvx1/Fachea2i+a2ttM7UtN7YtM7SFT+89M7QHTWDlTVuQx8ig5gy4c
       
 30622 +	6XKqnCJb5GHyEDlRlmVJFmQmg5wa00+4JxiuT6V/HRDSJYvxkowdAkK8bSElKZTIsxQb
       
 30623 +	DGVG9xD0a/tqwV+jaH+fr8YwcW61JqrFqKX4wV9VbEVtOPcz//xiLd/pj8kwT5vi9GsJ
       
 30624 +	lbcGuhG3BgmrsY3x4yWGIw3UvTbjZNlNXy7z7t1iM976vVuCQUhfVWQtSpmRPLXEe40q
       
 30625 +	9AMy5HX+82P9AYX+yrV7wY5nyWh2VOJ1aq/J/qTJ4PHPJ2J7nNgeJ7YjEdsHiNbRWod/
       
 30626 +	fkDbMTqoTTQa+uhgb3XfhqM+OqRCqq+eSkjbtCpi1dpqFKV7Q59BoLMiO1RTGzHe4Xqt
       
 30627 +	T633ahtUr9JdHR/3I/JRg1ytervhqK8q0H3UXe/tqXZX+9SwN9jb2dLYdZWsBwZlNbZc
       
 30628 +	Q1aLMVmjIaszPu5HsroMcqchq8uQ1WXI6nR3xmWhb/H8YrJVoFuG4qBnwcC7l5kTyT0h
       
 30629 +	myNYHPfTNId1va2PXcACMNMpMoQ+PoZSMVzomumaSSQP88RJw4zvku9I1vXTHLY+LGAX
       
 30630 +	4iQLoZMpaPAHLxmtZmdzc/PKFqpaVkLLSoJm4miOU5zQMsBMwfi/LcjbTgplbmRzdHJl
       
 30631 +	YW0KZW5kb2JqCjM2IDAgb2JqCjM0NTYKZW5kb2JqCjM3IDAgb2JqCjw8IC9UeXBlIC9G
       
 30632 +	b250RGVzY3JpcHRvciAvQXNjZW50IDc1MSAvQ2FwSGVpZ2h0IDY5NSAvRGVzY2VudCAt
       
 30633 +	MzE5IC9GbGFncyAzMgovRm9udEJCb3ggWy0xNzYgLTIyNyAxMDc2IDkxM10gL0ZvbnRO
       
 30634 +	YW1lIC9EUUJQSVYrQ2FsaXNNVEJvbCAvSXRhbGljQW5nbGUgMAovU3RlbVYgMCAvTGVh
       
 30635 +	ZGluZyAxMTEgL01heFdpZHRoIDEwOTQgL1hIZWlnaHQgNDcxIC9Gb250RmlsZTIgMzUg
       
 30636 +	MCBSID4+CmVuZG9iagozOCAwIG9iagpbIDM0NCBdCmVuZG9iagoxMSAwIG9iago8PCAv
       
 30637 +	VHlwZSAvRm9udCAvU3VidHlwZSAvVHJ1ZVR5cGUgL0Jhc2VGb250IC9EUUJQSVYrQ2Fs
       
 30638 +	aXNNVEJvbCAvRm9udERlc2NyaXB0b3IKMzcgMCBSIC9XaWR0aHMgMzggMCBSIC9GaXJz
       
 30639 +	dENoYXIgMzMgL0xhc3RDaGFyIDMzIC9FbmNvZGluZyAvTWFjUm9tYW5FbmNvZGluZwo+
       
 30640 +	PgplbmRvYmoKMSAwIG9iago8PCAvVGl0bGUgKFVudGl0bGVkKSAvQXV0aG9yIChQcmVz
       
 30641 +	dG9uIEphY2tzb24pIC9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwpCi9Q
       
 30642 +	cm9kdWNlciAoTWFjIE9TIFggMTAuNS41IFF1YXJ0eiBQREZDb250ZXh0KSAvQ3JlYXRp
       
 30643 +	b25EYXRlIChEOjIwMDgxMTE3MTg0NzE0WjAwJzAwJykKL01vZERhdGUgKEQ6MjAwODEx
       
 30644 +	MTcxODQ3MTRaMDAnMDAnKSA+PgplbmRvYmoKeHJlZgowIDM5CjAwMDAwMDAwMDAgNjU1
       
 30645 +	MzUgZiAKMDAwMDA2OTExNCAwMDAwMCBuIAowMDAwMDAxMDk4IDAwMDAwIG4gCjAwMDAw
       
 30646 +	NjQ5NjMgMDAwMDAgbiAKMDAwMDAwMDAyMiAwMDAwMCBuIAowMDAwMDAxMDc5IDAwMDAw
       
 30647 +	IG4gCjAwMDAwMDEyMDIgMDAwMDAgbiAKMDAwMDA2NDYxNCAwMDAwMCBuIAowMDAwMDAy
       
 30648 +	Njk4IDAwMDAwIG4gCjAwMDAwMTM5NDkgMDAwMDAgbiAKMDAwMDAwMTQ1NSAwMDAwMCBu
       
 30649 +	IAowMDAwMDY4OTM5IDAwMDAwIG4gCjAwMDAwNjI5MzcgMDAwMDAgbiAKMDAwMDAwMTYx
       
 30650 +	MyAwMDAwMCBuIAowMDAwMDAyNjc4IDAwMDAwIG4gCjAwMDAwMTM5NzAgMDAwMDAgbiAK
       
 30651 +	MDAwMDAxNTM2NiAwMDAwMCBuIAowMDAwMDYyMDE5IDAwMDAwIG4gCjAwMDAwNjIwNjQg
       
 30652 +	MDAwMDAgbiAKMDAwMDA2NDY1MCAwMDAwMCBuIAowMDAwMDYwNDQ4IDAwMDAwIG4gCjAw
       
 30653 +	MDAwNjA5ODggMDAwMDAgbiAKMDAwMDA2MzY2MiAwMDAwMCBuIAowMDAwMDE1Mzg3IDAw
       
 30654 +	MDAwIG4gCjAwMDAwNjA0MjYgMDAwMDAgbiAKMDAwMDA2MTAwOCAwMDAwMCBuIAowMDAw
       
 30655 +	MDYxOTk5IDAwMDAwIG4gCjAwMDAwNjIxMDkgMDAwMDAgbiAKMDAwMDA2MjkxNyAwMDAw
       
 30656 +	MCBuIAowMDAwMDYyOTc0IDAwMDAwIG4gCjAwMDAwNjM2NDIgMDAwMDAgbiAKMDAwMDA2
       
 30657 +	MzY5OSAwMDAwMCBuIAowMDAwMDY0NTk0IDAwMDAwIG4gCjAwMDAwNjQ5NDMgMDAwMDAg
       
 30658 +	biAKMDAwMDA2NTA0NiAwMDAwMCBuIAowMDAwMDY1MTEwIDAwMDAwIG4gCjAwMDAwNjg2
       
 30659 +	NTYgMDAwMDAgbiAKMDAwMDA2ODY3NyAwMDAwMCBuIAowMDAwMDY4OTE1IDAwMDAwIG4g
       
 30660 +	CnRyYWlsZXIKPDwgL1NpemUgMzkgL1Jvb3QgMzQgMCBSIC9JbmZvIDEgMCBSIC9JRCBb
       
 30661 +	IDw0OWU2MjQzZGUwYzBiMTQ0NmRmMDQzNjRjNzc1ZGNlZj4KPDQ5ZTYyNDNkZTBjMGIx
       
 30662 +	NDQ2ZGYwNDM2NGM3NzVkY2VmPiBdID4+CnN0YXJ0eHJlZgo2OTMzNgolJUVPRgoxIDAg
       
 30663 +	b2JqCjw8L0F1dGhvciAoUHJlc3RvbiBKYWNrc29uKS9DcmVhdGlvbkRhdGUgKEQ6MjAw
       
 30664 +	ODExMTQyMzU4MDBaKS9DcmVhdG9yIChPbW5pR3JhZmZsZSBQcm9mZXNzaW9uYWwgNS4x
       
 30665 +	IHJjIDEpL01vZERhdGUgKEQ6MjAwODExMTcxODQxMDBaKS9Qcm9kdWNlciAoTWFjIE9T
       
 30666 +	IFggMTAuNS41IFF1YXJ0eiBQREZDb250ZXh0KS9UaXRsZSAoUmVwb3J0ZXJJY29uLmdy
       
 30667 +	YWZmbGUpPj4KZW5kb2JqCnhyZWYKMSAxCjAwMDAwNzAyNzQgMDAwMDAgbiAKdHJhaWxl
       
 30668 +	cgo8PC9JRCBbPDQ5ZTYyNDNkZTBjMGIxNDQ2ZGYwNDM2NGM3NzVkY2VmPiA8NDllNjI0
       
 30669 +	M2RlMGMwYjE0NDZkZjA0MzY0Yzc3NWRjZWY+XSAvSW5mbyAxIDAgUiAvUHJldiA2OTMz
       
 30670 +	NiAvUm9vdCAzNCAwIFIgL1NpemUgMzk+PgpzdGFydHhyZWYKNzA0OTgKJSVFT0YK
       
 30671 +	</data>
       
 30672 +	<key>QuickLookThumbnail</key>
       
 30673 +	<data>
       
 30674 +	TU0AKgAALDSAACBQOCQWDQeEQmFQuGQ2HQ+IRGJROKQoViABCsQhoAiEKA8AhR2PF/ux
       
 30675 +	vuZ/t9quB/NWKy+YTGZTOaTWbTecTmdTucAYCAADHwwUEzlADGcLA8ABaISd/N9PLV9p
       
 30676 +	5FKZ9op9PwAPqeV2vV+wWGxWOyWWCiAMAEQMRMgtihsJAANAABAKBAoEgB/gYDAAAgO7
       
 30677 +	P9+v2/Pp9gB/PV7P4BP9/gJpt1+tMnHh8E5wOh/uCzZ3PZ/QaHRaOCT6gN5XA1vhsIv8
       
 30678 +	NP8HA6BBII366wYAv+BbqB7x/P6BO94QJ4vMAMxsP1mDs0vcd1mt6TpdPqdXrdNIHEEp
       
 30679 +	I3lIBm0AbGBBQKwfgQjHboA+uB8DHQJ+ul2PwCPZ6gQ9Jl8npDqR9kO68AwFAcCQKh4G
       
 30680 +	LyBx2FsBp1r4AIDACDoQIEwC9Pe9iDt496/AC3qDH8wh8G2cR8sUf56BAKp6hAeh7gAe
       
 30681 +	kDRlGcaRqsxGDaBBJjmKwCDYAAIgmvQIAgv0jSO9MOt3DEMve3T1IOfZ2HcfgCnmeICD
       
 30682 +	uS58juqqrxtMEwzFMaIAUA4AAYdpcAadgEQjM4OhCgTbt2hbeQ/KEPTrPaCRCAB8m6cR
       
 30683 +	9OKfx4BCKp7BCex8gAe0yUfSFIxkQw0gQRo8i0Ag5H+B64gCCIKIE3ML1FI9R1IgzeSa
       
 30684 +	872Mc4E9ABKUqAKeksDkSZ8jkR5VH2R9JV/YFgs7NwAAVNQGnaBUIgQAAOBFCqfz4gkn
       
 30685 +	r1I1YWpKD0NwgZ+K0fRvnCfZ2ngfx2BEK57BEfCuHxYV3XfeCZj+MYDkOQAwAKPAAAhI
       
 30686 +	R/gi8sPT0f73IG9dryXUsLvVVdq1FgVq1gfR0nafYDHseACjaR58jaShXH2Sl45FkeSI
       
 30687 +	M0wEHcXIHHaBYDn+BR/g6Eq/AGAeCt288j4bhuGSVVGeYPVFW27WJvm+fZ1Hcfx0hHdA
       
 30688 +	RugrmS6lqdJDwLwDkAQ4ygKP4AAfIQAAkDE8YhDeISNalYT5D20oLbGdW2fJ0nSfQDnu
       
 30689 +	eIDDQRZ8DQTJZH4TOqcFwcZgLmwDzVlYGgSf4F2aEyBAIAsPz3DiC1hnODyTtW1WnVKB
       
 30690 +	rsgWiH2cBvH4cp1H8cgTCyewTH2wjD8J2faNIOQsgOPRGjUApCn+BshJCudSbTnudSfD
       
 30691 +	Gyc5gWCYd5GHc09+JHVup8bwMZDnwMZPFsfhPdr8HwrFCwC8SdoH8YBtmhRyK+z5O+2M
       
 30692 +	RuFp/hymd214/6/e+CtH4cI3X/DoH8OEE4Wh7AnH6cAwj4oGQNJoGoKYBg5iVDgAYRgA
       
 30693 +	HgECAmBxPCqlTtuaE8ZJbCyCNsYGz6EMHXnIfHwOcdA+QED6HkAcLwhB8BeFGLkfgo4H
       
 30694 +	Q9h8Q8ASHgCDsFwA8dgEQFD9KUBwFRenJPzIUbpV5DU7m9VVFZhL9FssOfsk8fZXB/Dj
       
 30695 +	G8P0bg5B/DcBUFwewKh/RSh/G+OBAgyBNAMGwTYdgDCTTQv0CgHW0J2Q1Fx+61FRJOZv
       
 30696 +	Id4jZyGJ3iqAAfA5RywwH4PMA4WA/j4CwKkXw/BUxxk8+JPQAx1C2AeOoCgDR+lxA2Cs
       
 30697 +	gQBX3QgQ4/GFDOWEIdka/dz0UZEPPj+3A3kXwAD9HIN0fw1xwD9GsC4L49wXNmk/M9qg
       
 30698 +	XAkAFDIKMPYBxNgAAXHwD8KJYwlZxFl+kWXLOeliteQktm1zgaE/pao9xyDiHwAkfo9A
       
 30699 +	EBTD2PcKYrhhD9FdNCgDJABDoFqA8dIFwHD9VCBsFjkUzv5Z252dMsn7SyQyb8hU6JCu
       
 30700 +	VkQnVtshx/j6UYP8csxBpGSGkDEMQ9wY0BpcsIKwQwCheFSIAA4oVilxH+BRZ6GZzLWi
       
 30701 +	6zeNznXMNueS9GEjZFStBlxR9hI9hxjhHwAof09gnB3HuE4WYxh+izpfV9MYAhyiyAgO
       
 30702 +	YDQER+AXAABmhpQC8wpL0qyir+Jbl+mctKQNEYsPHYLIyQCsV2j+HNMQZpyRmg2DMPcG
       
 30703 +	1YLGIzCeD0AgVxYCGAQKinJAgKgkkC/Wdzb6JV6kXFGRtTmfSGShaNgsHyBD2HEN+qY/
       
 30704 +	x6gICQHMe4SBcjKH6LmxtuzrACHCLACA4wPATH4a8DILS/AGAVXmEEunPrai3R6Dz9rm
       
 30705 +	xUupZtgo+kXj/HONwf4xxqD9GODsNRzreXnNEEgG4BAoC3EYAgV4AAEm1H+BYE8UGFTe
       
 30706 +	ivUapLP6O17VHOeLE7rQRanVLijcWTgD1HENwe7jh7gJCGG8e4QxfDOH6L69GGyxgBG8
       
 30707 +	K0CA4AQgWH4B4AAGLkAAAOAyv8Vb9zfv3f65kuSE1+kdAtdaFTAgML65y67lG1G8Hyo4
       
 30708 +	AA6RuAAGCM8fowQgBuHuEDDmUSeBBBkAMJIvhIgJFsAABCRQAAXBTfxDrAqJ3Wc+5tVr
       
 30709 +	ya+tuH4YQAI+CtSOdlLQg60WvLMLpc+vipa/D0HCNse4DABYRB8GsewPhhjSH8MPKWjS
       
 30710 +	ZgBGyKoCA3ATAZH4s8DALiBYrrxOSutd8g56nYqhDg+XZZwdEzlO7oQHA5labUAA7KvE
       
 30711 +	FdDBih4BXQ6huciYgQ6sji7GWPwXYRg5D4CNo7ZBEwdgtAGEEYglgEi+H+AgpQAQL3Ic
       
 30712 +	3qNs0W7SIfim0FnJ0B/6mMLqpkzwwJhKg0E3TdaiCpqIEOEQxAh/IvIKBSt8QWEPFlqh
       
 30713 +	keg3xsD2AYAOqYOQzj2ByMgaw/hkbJ4dRkaopwIjYBUBwfbkAL6avkUq6uNVU11Paed2
       
 30714 +	BetyABH1nRPYAnHJACEQICIRyBANBhIIiA7xgkCG8HZOZuwJF5YDj+D8tx8HGABr4AAt
       
 30715 +	hjj8FsEsOw+Al8P6gQMGoKABg7GUJsBIxMVcc0zqKkCTIunn3EPkrQAeR3VADQ8B4OuX
       
 30716 +	BEIEA4HCFaHk1HWLEgQ4t5lA1Znh+GoMbEH3+NXgQBB9AKBoGQewNBmjZH8M3qOyAAjQ
       
 30717 +	FGBEaYLwQD7lYBbFN8682d5CQIedI8234uT28G5AgIBBIEA8HaFa3lhHEI4gQ6xVF3J+
       
 30718 +	P8BLk2Db9xpyAgQ9zh6xG8AAWAwh+CwCiHsfAUfH5RBeCQAQNBnifAUMrtIDkPAYpaw2
       
 30719 +	pzbU9OYN4O7IgArlnh1cvsH3pkK54NGNpH4AB5+Ogw+401EHPRTo9UDeiMBweCAWAGHy
       
 30720 +	ASBgDCHuBgpOH8Gk+at2ACGWFAAiGeBoBGH2BeAAAq2wASeC48qM5oN4Hg3sBKe+vkQo
       
 30721 +	QMGkCSIEH2Hi5czw30p+5+f2IUPOHwHeIEJMAAFWF+H4FWCsD8HwCtAUq+BSIwBcGqFE
       
 30722 +	AUGg7SAa+yBoIeeQYWYeWqVeHoUYAAA2EC9Q9aQEH1BmAAGo3YT2AkzwSazWwKWqzQqK
       
 30723 +	WoHqG8GmHsAUAGH0AQBYC8HsBYGuHCH+GvB+meACGME2AgGUByBQH5CWAo40AUVCwI46
       
 30724 +	r+HsaiAgC+IEAwC0QGHmGeIEG2DcQqN2AeTPBc28/0VOrqbU5QHsHaIEHaG+AAFMF2H2
       
 30725 +	FMC2EEHyC3DyjgBKA4ACBUGyFMAWGoQgAYQ8Ay9OT2o0z47BA2wO7IIEAMB+IEA+X0QE
       
 30726 +	HUFgIEHIEbGOdCAY7m88rw34o42+YSHoG6GeHsASAGH2AOBSjUBSG2HIH+G3FigcGCEu
       
 30727 +	AgGMB8BYH41dEILu3cwQxpE+unGIowVixMAABMEqQGHGEhBovivkWiAQcmues6VU7+qK
       
 30728 +	cuIGHqHWIEHdFOFAFsH2FADCEOHyDDHYfABCAyACBOG6FSAXDwAMAWPWAw/OzSv6nGue
       
 30729 +	SatGjaL86IAABcFkQGG2DiIEHoGcL0AW90AMZsz4bKl2rk36eYYSliPeHoHAGcHsAQAE
       
 30730 +	H4AMBMgMBMG+HOJTJCcGF2EkAgGCCIBiH4/SAmxSAWAy4+lg/1DKSYc606HiHqIEBQss
       
 30731 +	KAbAOoGoCnBPFI/mcjKM4826s8Z05QIQHqHQOCHCAAE2FkH2E2DMEWHyDNK8ZKA6AsAC
       
 30732 +	BGHAFYAYG2AEAKASNyAy9a93ESxmrm/yTy9A3sA+ES5jAoNIH5LoAAGmCYbcAgWYp8Ig
       
 30733 +	hOl8kQMIljBYQ5JtKgGaHsQiPoBICwHsBIHGHUH+HHMqXgFoEaAgF0CWBsH4CKH+AkuQ
       
 30734 +	ACAYeHA0kXH4xcnIIGHsXbAqDWPG6eNIHqGwIEG0DUL1KMACAdDCx+xkeOVZLiME5oly
       
 30735 +	N8HoHKMeHiHGACEqFcH0EqDYEeH0/fOiUkAyAmACA+HIFeAYG9M+ASLsA1GSz2IAAACA
       
 30736 +	AA/4NAoJBIPCYS/4IAYHBodA4HCoLDoE+n3BAWTIIGzNDJFI5JJZNJ5E7V3BHGiIIBAF
       
 30737 +	BAYB4S/oTEYLAoxFpHGIhF4nOYtO5/PIuAHq4GU9wIAH6AhCVnsIXO7X+55RWa1W65Xa
       
 30738 +	9X7BYbFY7JJFciQetCiOn6SwAEhbBAaHaNJp3DZLO7vN7xPH2/IIAxjBBCgLLh5E5k9B
       
 30739 +	HUp4IB6aAASBZrYL1KL3dYVPoi83C/wC8XIAUgqn0kDik30ccRrddr9hsdlYgsEACG3O
       
 30740 +	sgY4gEBARMQ0QYfMYdQbzIoXFZzQeVDOLOYpBH7gAA+wrBBOmdnYnAg4I8GHBMnBchAu
       
 30741 +	bJH/NqJy4PEPPBPVfPRzou/QA9nAyHuAX8/n+EIqqmdR4H+dTtwPBEEwVBYAFQQgHlcK
       
 30742 +	4fn6KIAAiuIAAaD75uczjMsyk71vg+R/vsAB5uoFhXuHBiTmyNCCHubyZJoACYIezbjM
       
 30743 +	wvrkR5HaSJsfx5G+fwBHmcwBEUUp9EUO5MH0O8WylKcqSqAAJgcAALnSWYHHKAYCgMAY
       
 30744 +	AA0ISHzG9cQPons2JGirkqEkp5nsggSk4x4MSshZpiehR8oKBoEIEmLLM3HyHoi9LzR4
       
 30745 +	5SDxEhTAPwZB8H8flKhAKp6hAdp5AAdsrVBUNRLGUI/AcVAvCKfwrwsFlABFRcOIan04
       
 30746 +	qyjCFoQzUOome0/gADo/rkGUrHydaCGwLscIIBwFR44r2qLWqjADW9HxNXM3varSHH6e
       
 30747 +	Btn8AZ6nQARClCfRCj4Th9D5Ud23dd6CAgBkrnWWoHHSAgCALMYNCKwMx2krdqLq56H0
       
 30748 +	c+WEJtOLlHufSCAoMmHiVKx5mgghvD0l6KgXQSR4UkVGrxNOFx7XWSrynabHub5iHwfZ
       
 30749 +	9n+fQPioeoPngegAHheGd55BZNDyBxQjKJR/C9CwVrkEllYCrdn0RNc1TVQ1cgAfLqAZ
       
 30750 +	icyDFKx2FqghykqggDUIBMa6Yvbnujk017PH9HoOfp3GofoBnudwBj+Tp8j+QRQH2QWe
       
 30751 +	8DwTEAaBIAAgdpcAedYCgIAYCH+DQjUGyNtq/XDj6W57mMq6rqAJYYABBjMqnKTaCHaW
       
 30752 +	GxMi8aj5BWfNWrzWEzogzAIG6h/9yjcRoK6k4owfs6Huc51HyfB8n+ewPinmp5nvE/B+
       
 30753 +	l6atEmOgGk0Ngnn+MvD6QAAHBMu2EKH8jl/NtiGPfRWlvUfqbACfgLoIExJSsb/AROZS
       
 30754 +	CgQygApiR6jooY/noLUV8P8fB0k6EFgSQR3gAGPtvKArEoRBn4HNIGPseY9R+AFH0PoA
       
 30755 +	gehMj5D0IcUg+xDvUhVCtjj4B3C4AgOwAwBQAgFH+BsJJ5jKNUUeh12ZfVGsjfhDx1x7
       
 30756 +	y+k7HqiYFRjoKILGyGogg+RyEcAMQQATCh/DxOkPMhQ9SFMOh4rci0F1sk5iGTeMrVCG
       
 30757 +	H9aWyQgp9h8DpHkPkeg9R/jzUwpoesCYvQrj8zwRobgGCTDkFUAAbAAAPBUvGRcRVDpu
       
 30758 +	jErJzLJ31NTkoQQej0AAJ2bEBJBRCxor+Oqp8AADIHu8Oax+NLA1lPskuUYzkln0yPOS
       
 30759 +	TYfcc4Oj7HyAQOolR8h1EYKgfYjI/zFVEAmKoCx3i5AgO4A5lIqgcLcAAAUO4xQCZDG4
       
 30760 +	5C0D0E+kirFXDBSdMIj2QQD53gAALBSgofA5iCDOBsSMCS8yhrabRGhEUrkQHKWuTibD
       
 30761 +	sCJEInuoiLEUR1DyH0PAeY/h3oAKmw0AEmpjUTQWIUNIDBGh6C0AAOQ/wHTrACBFV0rW
       
 30762 +	PldakyVtL61tRoIVSVDg93eAXDSQQCIQEFDwGMQQawVjAkVWY08gtLo1ENPijhtE3FnI
       
 30763 +	/VzK59Eb04y3ZcAYfg+gChvEiPkN4khWD7ftRSrxspnmSmWBEd0yB/qCA2R4AAA2zI5q
       
 30764 +	GrapUk2mnQqXUIfR1AHhQIIBaniCR0CmYuHZsTAIWvtkeSVRrCnMVARKwsopyZ8wRJPK
       
 30765 +	whg/T7D6HYPQfY6x3j+HUCMK49gRj5I2r6r9pyyB+DGAsQwgQwABDy+AFFNAXohlm2wn
       
 30766 +	Ftk2xEcufCWI/2XkCAQDkggHA2oKHAIYgg5hLGPh2AomlASIIguoiGVSPGFLRdhUue0k
       
 30767 +	nOyVaqO9hoBx/D7AMGoRo+A1CXFgPwS9qL4FeX2AAA47xdARHeAu8jhgNhNMCoJtM3ag
       
 30768 +	NMlYh+ult2SXSpVUZqY+h0wOk8AAFcTEEDYJCAAdwtiCAKiqACGcbaiNPwVdV11Aq6Uu
       
 30769 +	h6UKbNQcRLQMuTyNg+7Mj7HMOwf45gShYHsCUfZ9oH3xyASMO4XAFB/EQGcARhgGgnII
       
 30770 +	BIGd37wQVVotOw8r5tWKJItFW7Ch+IGOrg+CEYB7gLIIDMZKChohHIIPUapcmOgDYAtG
       
 30771 +	xVJzmofyxG3EjJbH5zsni8kg+B3j2H0Ah3QBgyCIHwGQTotR+CdyDo+tZMQC32AkO8mY
       
 30772 +	/AFgBA4n0f4A3DXaiOdCk59IBSXglqVN51MuwOHQQqB5yj1Dxi8AEGo2DA1tNgMmdZTo
       
 30773 +	uPgcNNRgD5yJ4FpZixkeCsoomxSfPAN27Hn2KIwOyGPh2wcHEOgf44QThaHsCd95TtIW
       
 30774 +	oDgFcBQdxHhsAES4Br4krg1J7qOb7lrcNMrgAAfg7oHDji+iSoRDB5M4AAC4Xh4gRmwH
       
 30775 +	1vgAAzbauuAes2JsQK3HnMzsSWRD87wUz9LO6RIqhRGghREdzyHDD8AOF8Qg+AviiFyP
       
 30776 +	wUW4aJgCIGAQdwuQJjuAeAkfYDQAAbQqjbhzJ5/Ym3rONN2zrtxrgWPocB8GcYjbXOIA
       
 30777 +	I9YFgjMWhYH5sB5jPIINQJzBllz0YOojjNSnZMgUSfbj0QbHdlsR2zEh/t7DuHoP0bo5
       
 30778 +	R/jcBUFwewKu4b95c4EMwUAEBuEyHMAgkZSglYeDqw+BuvQVqaTyb/Ht7EEH1vre2YGA
       
 30779 +	lEqPqhGMmgNLBAABgLhsB1orAANwNzGiCgK0/Bi7ERc6ocLuiDjqiSgyx8ks/Yca2E2M
       
 30780 +	uyQMew7R7D4AUAEfoCAsiAHwFkVAvR+Co7+4MioAx2i5AoO0CICh8gP52FMggBZ6LSOT
       
 30781 +	Eaxa294EE1W1UcJCTqbSyn8C7xInkZNDDOa2Jrxx+IAAOSYjDxgBsrp7iBhDtxkR8zsa
       
 30782 +	3ZqD+JqiyQzTZo6QmxboeofwbAcIfwa4FoLwe4FreL6ZdoMIJYBANITwPAAi5oBhpQf4
       
 30783 +	CgHyoaCRtbKsBQhqMAfAbaN5nS6bKjULoripXSD48QIZ+i5o14bgOYggdYVS5wggBDDr
       
 30784 +	87FUDx87LTPL3yH7KxD6e6C7eaWBQwezkL4wAT5IKgPge4KgVoYIfoVsD5d4AQdYW4Cg
       
 30785 +	dYCgBgfKTwDYKT8L7yuY47UozAjAfiUgfIbrVz+beiAMFzLL9SB7xQAAFoWQ2AaiQxE4
       
 30786 +	ZA8TDpxsQ53qbUBJ4C6yxxRhR7PkKrfr+L8qlqN7aAeIe4fwaQbsVIGIMQe4wcNRUILA
       
 30787 +	IgA4MAU4P4AoT6dJpQAACw4TZDd4rhqROBEwfMGx3RYziSRz3SpkSzj5NkUY+BEwe5jo
       
 30788 +	GgZw2AZqeIAAfQrCdJGrOCbSer3qbccaHjvyI8UR8q7Q4ruDUCMyNTtQnjFbj4eodofD
       
 30789 +	MYAYfwBIJwO4e4JwWYYwfoWcWJKYAQdAWoCodIC4Bwe4ChMgKgx4CK3ZbLUpp0eC7BnR
       
 30790 +	qobQ+CBplC70YCHzoUeL8wjAeSPoGrNqtbn4sAfyMAZMXgoQBzX6t8kMkbAScbBRkKC0
       
 30791 +	mh18dEYKNTsalKgC7qCBIIeUVAZobAf0bIMwe8bUghBIKQH4AwLIVoQgAywABZWEXpyb
       
 30792 +	Fi3q3QhgfQcTyzpcGSbcQbycm8eJ8ZE6BYFoXDDbdgsJlYggaEFokSn8PJOBgjPEHccx
       
 30793 +	NyNJgLArxwgUUMQbEJRYeodge7MYAkfQJIOge4JIXAZIfsuEqA2QAQcoWYCwcwDICAew
       
 30794 +	C426voAwCcKMnsZ7oZ3SBga4gQfodiH7jbfkcryCR8ebqDFSMptIeqTQEh05CxMwsQeA
       
 30795 +	YIgga70qagiIBjT81D3joRRjFTZ0tI+C7JqZaLtRtKxbaK68S8LR9j+DizaAeQfAf4Y4
       
 30796 +	agfwY4HYNQe4HczA14JYHIAwKYWgRQAwVgAABQEAggC6HKcEwiyhRKM4hSTQe4aQ+CBb
       
 30797 +	eUjxWricizykKal5XwDYPoggDBowsQdAUYggb50hxzDbXAuzF825Dkiiobi7jzEkaKCr
       
 30798 +	jpNJRTLUKi8AegdQe4ewBgAwf4BQIgOAe4IgXoZofoXs9osgAIcQWACwcgDoCYewDRMi
       
 30799 +	voA468sy3hkofk2CiIawi4jdFrEE6pZzibo7Ubo1LUn8H4t4L6cwPYsYcAQoggc4TBsS
       
 30800 +	HZ/sHTjibypTWE2wmqorjAm9E7Ok7c71L4o7ANOgpxEwehhwYIZ4foYIIANwe6m1IAr4
       
 30801 +	IYGYAoJQXgSAA4Wof4BJDYAIDLrq3SHqb4fIb7y0QNTxEhWkdMHptsPMmtLQjC4M+8II
       
 30802 +	AAE0IYsIbKmbDAWkJcShytUxg1OUsBtik870wNPL2TeL2ySBacK5WTKYeYdQfAewBtGo
       
 30803 +	BQHwNYewHwYYaQfw8NRwrIAIbwVoC4cAEICweoD1JcJZ+boskD2oggfDWw6qKddk3Dob
       
 30804 +	d6AUJzKcnJQxka3QfhEwATdgFoWIsYaStQeoaMJbACGghDyj3aVpD0vjojozFEBFZLEr
       
 30805 +	Kkw0nrjYy78rF5SzNZhwXgZgfgXgIoOIfCUVbokgHYFoAgIQYgSwBFH4BNc4AADLnsQj
       
 30806 +	2UUiiNArezLz872dnKMMBVB1i8Hlo0GDGBhQfLhwGgZgsYZQFw6Qd7DbX4AdhrWETNYp
       
 30807 +	hbF5NUc5NrPcGMLZk1osTUeQgYeYdIfAeoBoA4f4BYHIM4ewHIZAawf0SVlQh4bIVQC4
       
 30808 +	bgEwDIepWADUSABIDaR0m7yp5TrT5DfFjtXtpKbs2jo4zaIboL2FiLK1yiNSDYggG1eA
       
 30809 +	AZjorIfjgAZaRooQBbhxQkcNzVhsA5HUCEBrjquU09YVO8HNxycET8mxkVj7qJhwWwY4
       
 30810 +	fgWwJYOwfCadRwGwFIAgHYZITQBAYgAABADgj6vskLEwiYfyBoe1p6CDgDzb9Ir0vdBU
       
 30811 +	n9zMtBEL+IebgAF9H4yTgorQeteAaUrooQBjMjojZbEs6VslsUZ9/FVVnNPrxr2kZi7J
       
 30812 +	qVZwfNtltwBYGgMgewGgZobMpczAAIaoVADAbAFQDYeh8QDKvoBQul/17LNbM6CFA7tj
       
 30813 +	jViETDKl8F61yZ2MKrilpIeyBYEwUBeMu4rIdwXQggbJiIf5QgAIBTn9VBXV8TzlZUGM
       
 30814 +	nbtKgCfF/ji9VVEa3LKJRTaL9xEweojYWIYYfgWIKAPQfCvUNQF4EgAQGgZ4T4BQZQAI
       
 30815 +	BADRagDYLckS7CBIf4erM4/l70tWF1rks8i8Hd3GFsv1EK7lytiwnce4ggDoQk/QLIrY
       
 30816 +	c7RwAAcAQIl5QgBF0JzdhmF9h0/svtpMZrecBljj3UrzPRN86iSye73LAb31tOBAmdGw
       
 30817 +	GAMIe4GEVUVLlwAIaAUgDAagF4D4eiRYDMSABYEMHqBCTFvGOlzGF0kGQFKF8uItZdQG
       
 30818 +	TOZxgIfJXwCU44DJ7orQcoSAxj6QAESq+jDtoUBdo82seU5o91ndBFYNLOUbjTA5zVjM
       
 30819 +	wS7dfwggewwAVYX4fgVYKwPwfF6q+IFQEAAQF4agUYBQZ4AIA4DIgYDlMl3JPyTAYqLs
       
 30820 +	vlT9E58l/S6mIjYUnmc8tiV6cKoAjSKJP9fmZwA9Xd/lZY4+QmdEBVr8Kzx8K8LMAlpE
       
 30821 +	wYlFr6ygh1tIfQeoBdGoBIFoL4ewFoawcAf9Kq04AIZgUIDAZ4GYEQegF4f4DMiAAIBc
       
 30822 +	RSNZXweuiiCDXtBOsNP1dsr+sSWjPx9b4NMGPloJt9PSxlEE5+AauKpM1CNk5lrZk+ji
       
 30823 +	oV8Rttebx6x+uLyw6ge4+wUwXYfYUwLYQQfOOCigEoDgAIFQbIU4Bgah/4CwgYDwMYno
       
 30824 +	wAf4el6A/iLSerEFBktePW08cmTEnBbTFdYVL2s+uVswheu46c6eQIitDjSI+WGKNzAs
       
 30825 +	7Y52tVsYk1ErUKMhkVFgorWGU1/eu25hg9yV2gvFZwfYeoBSGwBAFLvQFIbYcgf8GyP4
       
 30826 +	Y4ToDAZgHAEwegGYf4DGq4Bi2Z3oegY46TL0mswMwh87Bmc+KW2VVmZNMGJUmmjW4ExG
       
 30827 +	2xqqA92dyAjBfNNqNoistetEn2QY82tNo+I+tjUdEu0zzuOM6rOkxAhYfgjAe4wAUIW4
       
 30828 +	fYUIMAQwfIMCFQEWNoFAbgVIBgax/4CggYDoM6oAewZaByKbyTBG1GPUJy29L21+Tmsl
       
 30829 +	1dw9pAfxEwfCBohYhYA1dQBSRoBZ74ATX7Nme4ald0stVQA5ju3V/+PPDk6uUvCi2+nc
       
 30830 +	TdsFPzKWTOGNoPNoo4eYdm6oBIpoA4EzbgEwb4c4f9URwQYITIDAYwHwFQei4gDD8BDK
       
 30831 +	kYe5iyBEQNy9P+eJDu4+PmZiAO1sKtYabfSuj98Bascuu+Q51wBYGAggEYRTDerQsAfd
       
 30832 +	qgAAb70Qdr1D84A5GucOALUliWvXClinBjeMc7ANssUWULsUvpOFOU2T9RhWwoAATYWQ
       
 30833 +	fYTYMwRYfLC5eAD2zIEgcAVoBkjYAoCYiAD4NbyxGaiLrVD8w8vzUyld8ikxt1FybNFH
       
 30834 +	IJhXUYf4yIDb1bnZGAgTYI2IdoW5i5KI6rhAhgBLN91XIpXWnCw1VedvAFjOKJ9WE+ur
       
 30835 +	FaykxG4IAAegdgfgew8oAoEi0IEgcQdQf8sZdoXYSgDAYIIgF4ekFoC7noBVJRE48Ih2
       
 30836 +	mt8ethH2FmPXS4zG4Qu+4EBMaPJ73R479Q6gEpsJK8/hKge79oAAaSUR4RpfgqK1YmnJ
       
 30837 +	WVQNBLj2mNFzBHYetdsztuU9o4fXJgmwSwVwfYSwNYR4fPcRUADXb4EAcYWABobyaoB/
       
 30838 +	G2znjAXw+CVHndBk6G/pNvI9xG2VoHnN82kAoWu9GQggCa/yTb/hd1C5i7/IhgAqHY8r
       
 30839 +	K+UGJ0sHhXOA9G5nMWusmtemmcTIy4egdfjYAomIAYEQqQEQcwqydxKYWwR4C4XYJIGg
       
 30840 +	eoIkXtToAJT5EpTsKV1ejHTnCXwe+8oGdKx6SayL+SH/iCNIfRXwAMPAFwXL8MiRnoaq
       
 30841 +	jYAAeIYRpYBV0MecHviqCcHK3GsmttfKulY/YypHSXYvBDrw9M2htHso0B5IgABSKrfS
       
 30842 +	ROCSfRwAELhkNh0PiERhoXCIBDjmWIOcICAoNAQACo2hb7c8PAMMf7/iQAlMLk8Llsrl
       
 30843 +	UymENmcRmM3l8smYBl8xm0MAM3oMOoFEoUwmb4e0LDJphYdOcrqlVq1XhbwYsLaxXlEL
       
 30844 +	BIIhYCnc7mc6m9npAAoc0hj+l1mr8spNvmsutcxnd0nkmtUunFzvU7uGAllwejsfj2Ac
       
 30845 +	nAIhKr2ELpd7/dNYzEOV6LCy1KA4exKAARG8sAdNn0Nn9ph9ou8quGOiFnmsqvdGmW0u
       
 30846 +	dsoz/2Op1tK3eEusRfz9hb3e8LEqVhYTJGZ6XTiL7eELZYsuYHA0LAgE1uFiXil9m8XF
       
 30847 +	oHB39U3102243mz4XBtlIwes1+1tk/lD5fh/AEfQAAERhTn0Rg6ksfQ6uoqoKAeAAMnS
       
 30848 +	WYIHIAQCAQj4IhCwz4Pooq7w83a+LlEcTN7D6cMK4D0vlFLhoW47kuWAAYF+hYEA9Bsd
       
 30849 +	x4ZocIWfJxoWAwCu88D4r5D61tUwqdRHJcVpQnqfvOuazLWtq+yQo8Otc16exA2bkHqd
       
 30850 +	p/OWuB/BAKp6hAdh4gAdkeIcVRDAqV4qh6e4oAABoQRwBz5xc3jdS3JclylLqiqJMEQr
       
 30851 +	5Q0wpMlEVyour2odFiZn8wp8uQAAbGsuM5VEzJrC8rJeoWAsjgM7stJtRkYog4irS5JE
       
 30852 +	SUQ/K8Rc8z2K+nS9vwvVcNuux/HzTUAwGQ5Rn0Q49E0fQ9TkCIGpAdZaggc4B22AYAAm
       
 30853 +	Ezi1wiT7TBR8UKuvNDsFYdiUdSEX1zQr5nupoABkZMhgpUd9qsaAhoWexsVTVoC26w1h
       
 30854 +	N3dVY0ut9YQ8/D40tYFBRBcj1w63CUvfLElp3TqWntMp7n65B+A+Kh6g+d55gAd7qFIQ
       
 30855 +	ILFULYhHsKoAAYDSwAqwSVSc2csXFRVZUJV+DpavcrxjKdG4q9Dw17S7VuSeqFhMTyFg
       
 30856 +	iH9+a4hx+nwhZlBOmB+IWA4DoXbcur+u+lP2u1aY5E9eSSAFJp437y0zuWmvpLMW761e
       
 30857 +	L6+44Bn2AABkET59EEP5PH0P7MAeBYAAkdhbAgdQCW6AZ/gmFK2AEj9XaKwMk7dRdE19
       
 30858 +	pFMYx0q5vJoEYKNKstqFoufr4fR8qcN6Fg2NWu+EAB5mghZpiZXQAASBUTqBEss6M+qs
       
 30859 +	bZW75JTvL54nJUQ+jhXvOE+9I7gmy4Hudp/nwfMBHxNU2Hjqs3qoTo+AmUYxCOfIuAAB
       
 30860 +	YMoWAsCyjXqnsYU3VQLpkwrmgSa13K73pEOdqh5qZd1NFjA+QsFosSxpFeGqIbweyFjo
       
 30861 +	FCkZIcHCcMQXMix2rbjVLDYUpY+DdDgKObulp6Lpm/wKPQlEr4/B7j/H6ARsoAw+ibHy
       
 30862 +	H0Qgoh9iEIiA0BIAAIDsFuA4dQBgCABSK58lgAVurtMOuhdT2DeIldOz1UK8YDH0YhGV
       
 30863 +	L5dYctRjY9InY+EaAYDQQsDxU4OnUHgMQrgWCHgIie9NqRMHYohYgeWCLCYapJkaW9Tp
       
 30864 +	wG/u3RcwgvpsD9m3Z8oN1ZcWmKuh47QAA+B3D/HyPZsCbGUJ+IgH0MACBCCCDGASED/X
       
 30865 +	/wBaO6s96HyhwFXS2s3MEo0upbrA2Q0Z3AQQUrDWZLPx/tlAA+shYKhWELAaDCPZVR+M
       
 30866 +	sAANFf80RzJDbQ4h0cLIyF5ke+Q4o/mHENlCYOY7TZNwzfK+OGz33qw6dOAFKrGm3gAM
       
 30867 +	XM8AhyACBqEaPh4JDwBjeFYA8b4IQLj9A6AACgKyXJHhafOZLsi3TEhPPZwEloHonb6o
       
 30868 +	eRb2lxLtkOpZSw/lqgABEIlrIQJskMHuN8hY3HfPEGcqmDgA4OPbYfMt10657HkjWlZc
       
 30869 +	UKVJRnUcrAvShHtpZnZUUlcoZhoxHkpoYQ0R+jCIgA4fIvwGjsAMAgA6RQJAoJ5LuSsB
       
 30870 +	VETzds3WQ6UjYq2edVBRTHWoPjYkiWZrT1zxsmekBsBIJAAAA+Hw7zlEGkxHQJ8hY4RD
       
 30871 +	oxRoAVVoBITVNkIZhiSIFZ0frxPF6JJ65T6bbUs9ytob0odW9lvsyl5MRIYNoao/RxAW
       
 30872 +	IrS9AZDAMj+GEAwcYAQDALJOBFcDC1Dl/mM0KBjFJKwOudGqBClGMRme68qqtrHyQTsI
       
 30873 +	p0fjhy2KAT4DMhYCqLP8vSAOQY9RqkLvcQsejxpRjeJc6MAsHABMGnhF+0ZD3apev63Z
       
 30874 +	dEjT8UqPFO27ryrA2pV22yYhZSlV3koREZozB+DeBgCQAUF1UkMA+PEXQDRpgOAWhhb1
       
 30875 +	6Y0sRwTGCYOAFKzuXDa5VzpqPLEhhYCT9T1BXek/DCjOQCYKdgqABkmQ25nlYMAN0boo
       
 30876 +	BEmutCzGc8YY3WozjVLtWLUV/bg61hdc3rOnWCw6qWMl5K/IWOQbw/R3F0sOABVoAAQj
       
 30877 +	FEwAwXIOqLQXAk6BxGccbVwgPW8t1sWh4MxtaC7Fo1anjsE7kolK5E4LnvUSf6SZnaRk
       
 30878 +	RMDSuAczX/qwsO1V/56q2tRpbB6gW9aJwroxvxL8itVAALEYY/BcEMowB4KQPgBh8FaI
       
 30879 +	UBIYQAAIAmSwBoHNRaLP0bKS5dNlYNv7jnQKl2fSPerF5QMzq6pN1Xd5WaXoETDx/BHH
       
 30880 +	5PVCUiyuTeutUG2JZy9ivb+DJmQontautx+t6xpbcW2MRPrvHFn5Da1o5Bwj9HuBwCQA
       
 30881 +	gEhTD2PcMRxQLlkAAEQbgqQFiYBABkAICgAgOBAScA6EI1aAyxYPQq8D4Uez/YJiNSVX
       
 30882 +	Rkr2rJhNz5/q1cBCrlTQcAbxqdugla7dFt8ulzrTOm3upQ5uoKvXMcHQ2OMX6UY9TfAH
       
 30883 +	H6P8AI1hwD+HGC4L49wZEQAYQwGQLAQgCDKM0ToCgtX534AwDZQwDgS5nswqtG9A77RZ
       
 30884 +	y+5rzoHaO1RzLHi8MvbP6FYTdONJLc25JMjA+iMv6hnpOrTVQ9REoU6uO65u6V6ftXPS
       
 30885 +	AZdK72mKFv8ho9x6KaAGPwlWRx+g2DKPcMA1Bvj+FeRBgwAANkMCGEIGQAwvivEMAgHm
       
 30886 +	JouD/AGAfqgBgHEnAHnHa3I0RXZ2j5bd27249HdVdLbHio4cux70qz3fOl95+m9xHdJ+
       
 30887 +	TfU/HqYiWUldmtH7OweQ8iUgP40AId38h8hUD4PgR4vxnh+hLCGByiqHmjmCGAgAQAMA
       
 30888 +	Agjg/AwADAbAtgjACAJEiPHqawLwMQMwNQNwOQOwPF9h9B9jfBShdB+BwhBBQB9BQBwB
       
 30889 +	0B/hYCGBtqbCsLyKYCGLzCFgXlqM5AUgPgBALAQgMgBAGFVPJnhO6QPwkQkwlQlwmQNB
       
 30890 +	+GShvhzh/B2urB/Brh4B6AABliGKeiFr7CFpuEGwCgAALsQLfCGQaITHRwmw2Q2w3Q3w
       
 30891 +	4Q2DxLxAAB5CGJwrJiGB1CGF6muPapBgAQxpxrevLw4xDRDxERExFO5nyHeGAQZCFvKx
       
 30892 +	FxJxKRKxLRLxMRMxNRNxOROxPRPxQRQxRRRxSRSxTRTxURUxVRVxWRWxXRXxYRYxZRZx
       
 30893 +	aRaxbRbxcRcxdRdxeRexfRfxgRgxhRhxiRixjRjxkRkxlRlxmRmxnRnxoRoxpRpxqRqx
       
 30894 +	rRrxsRsxtRtxuRuxvRvxwRwxxRxxyRyxzRzx0R0x1R1x2R2x3R3x4R4x5R5x6R6x7R7x
       
 30895 +	8R8x9R9x+R+x/R/yASAyBSByCSCyDSDyESEyFSFyGSGyHSHyISIyJSJx4iAgAA8BAAAD
       
 30896 +	AAAAAQBxAAABAQADAAAAAQCZAAABAgADAAAABAAALO4BAwADAAAAAQAFAAABBgADAAAA
       
 30897 +	AQACAAABEQAEAAAAAQAAAAgBEgADAAAAAQABAAABFQADAAAAAQAEAAABFgADAAAAAQEh
       
 30898 +	AAABFwAEAAAAAQAALCwBHAADAAAAAQABAAABPQADAAAAAQACAAABUgADAAAAAQABAAAB
       
 30899 +	UwADAAAABAAALPaHcwAHAAAD9AAALP4AAAAAAAgACAAIAAgAAQABAAEAAQAAA/RhcHBs
       
 30900 +	AgAAAG1udHJSR0IgWFlaIAfYAAEAHwAOACwAIGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAA
       
 30901 +	AAAAAAAAAAAAAAD21gABAAAAANMtYXBwbOoCxvvn7AuJW4CIyiOWp2wAAAAAAAAAAAAA
       
 30902 +	AAAAAAAAAAAAAAAAAAAAAAAAAAAADnJYWVoAAAEsAAAAFGdYWVoAAAFAAAAAFGJYWVoA
       
 30903 +	AAFUAAAAFHd0cHQAAAFoAAAAFGNoYWQAAAF8AAAALHJUUkMAAAGoAAAADmdUUkMAAAG4
       
 30904 +	AAAADmJUUkMAAAHIAAAADnZjZ3QAAAHYAAAAMG5kaW4AAAIIAAAAOGRlc2MAAAJAAAAA
       
 30905 +	Z2RzY20AAAKoAAABAG1tb2QAAAOoAAAAKGNwcnQAAAPQAAAAJFhZWiAAAAAAAABxDgAA
       
 30906 +	OesAAAOdWFlaIAAAAAAAAF8vAACzygAAFlBYWVogAAAAAAAAJpgAABJgAAC5OVhZWiAA
       
 30907 +	AAAAAADzzwABAAAAARhic2YzMgAAAAAAAQwaAAAFwP//8v8AAAdgAAD9zv//+5j///2W
       
 30908 +	AAAD9AAAv05jdXJ2AAAAAAAAAAEBzQAAY3VydgAAAAAAAAABAc0AAGN1cnYAAAAAAAAA
       
 30909 +	AQHNAAB2Y2d0AAAAAAAAAAEAANF0AAAAAAABAAAAANF0AAAAAAABAAAAANF0AAAAAAAB
       
 30910 +	AABuZGluAAAAAAAAADAAAKPAAABUgAAATMAAAJuAAAAm9wAAEXsAAFAAAABUAAACMzMA
       
 30911 +	AjMzAAIzM2Rlc2MAAAAAAAAADURFTEwgMjQwNUZQVwAAAAAAAAAAAAAAAAAAAAAAAAAA
       
 30912 +	AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
       
 30913 +	AAAAAAAAAAAAbWx1YwAAAAAAAAASAAAADG5iTk8AAAAYAAAA6HB0UFQAAAAYAAAA6HN2
       
 30914 +	U0UAAAAYAAAA6GZpRkkAAAAYAAAA6GRhREsAAAAYAAAA6HpoQ04AAAAYAAAA6GZyRlIA
       
 30915 +	AAAYAAAA6GphSlAAAAAYAAAA6GVuVVMAAAAYAAAA6HBsUEwAAAAYAAAA6HB0QlIAAAAY
       
 30916 +	AAAA6GVzRVMAAAAYAAAA6HpoVFcAAAAYAAAA6HJ1UlUAAAAYAAAA6GtvS1IAAAAYAAAA
       
 30917 +	6GRlREUAAAAYAAAA6G5sTkwAAAAYAAAA6Gl0SVQAAAAYAAAA6ABEAEUATABMACAAMgA0
       
 30918 +	ADAANQBGAFAAV21tb2QAAAAAAAAQrAAAoBAwNzNTv9zMAAAAAAAAAAAAAAAAAAAAAAB0
       
 30919 +	ZXh0AAAAAENvcHlyaWdodCBBcHBsZSwgSW5jLiwgMjAwOAA=
       
 30920 +	</data>
       
 30921 +	<key>ReadOnly</key>
       
 30922 +	<string>NO</string>
       
 30923 +	<key>RowAlign</key>
       
 30924 +	<integer>1</integer>
       
 30925 +	<key>RowSpacing</key>
       
 30926 +	<real>36</real>
       
 30927 +	<key>SheetTitle</key>
       
 30928 +	<string>Canvas 1</string>
       
 30929 +	<key>SmartAlignmentGuidesActive</key>
       
 30930 +	<string>NO</string>
       
 30931 +	<key>SmartDistanceGuidesActive</key>
       
 30932 +	<string>NO</string>
       
 30933 +	<key>UniqueID</key>
       
 30934 +	<integer>1</integer>
       
 30935 +	<key>UseEntirePage</key>
       
 30936 +	<false/>
       
 30937 +	<key>VPages</key>
       
 30938 +	<integer>1</integer>
       
 30939 +	<key>WindowInfo</key>
       
 30940 +	<dict>
       
 30941 +		<key>CurrentSheet</key>
       
 30942 +		<integer>0</integer>
       
 30943 +		<key>ExpandedCanvases</key>
       
 30944 +		<array>
       
 30945 +			<dict>
       
 30946 +				<key>name</key>
       
 30947 +				<string>Canvas 1</string>
       
 30948 +			</dict>
       
 30949 +		</array>
       
 30950 +		<key>Frame</key>
       
 30951 +		<string>{{2002, 20}, {1215, 1180}}</string>
       
 30952 +		<key>ListView</key>
       
 30953 +		<true/>
       
 30954 +		<key>OutlineWidth</key>
       
 30955 +		<integer>142</integer>
       
 30956 +		<key>RightSidebar</key>
       
 30957 +		<false/>
       
 30958 +		<key>Sidebar</key>
       
 30959 +		<true/>
       
 30960 +		<key>SidebarWidth</key>
       
 30961 +		<integer>157</integer>
       
 30962 +		<key>VisibleRegion</key>
       
 30963 +		<string>{{-4.5, 0.5}, {522, 535.5}}</string>
       
 30964 +		<key>Zoom</key>
       
 30965 +		<real>2</real>
       
 30966 +		<key>ZoomValues</key>
       
 30967 +		<array>
       
 30968 +			<array>
       
 30969 +				<string>Canvas 1</string>
       
 30970 +				<real>2</real>
       
 30971 +				<real>4</real>
       
 30972 +			</array>
       
 30973 +		</array>
       
 30974 +	</dict>
       
 30975 +	<key>saveQuickLookFiles</key>
       
 30976 +	<string>YES</string>
       
 30977 +</dict>
       
 30978 +</plist>
       
 30979 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender-Info.plist b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender-Info.plist
       
 30980 new file mode 100644
       
 30981 --- /dev/null
       
 30982 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender-Info.plist
       
 30983 @@ -0,0 +1,32 @@
       
 30984 +<?xml version="1.0" encoding="UTF-8"?>
       
 30985 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 30986 +<plist version="1.0">
       
 30987 +<dict>
       
 30988 +	<key>CFBundleDevelopmentRegion</key>
       
 30989 +	<string>English</string>
       
 30990 +	<key>CFBundleDisplayName</key>
       
 30991 +	<string>${EXECUTABLE_NAME}</string>
       
 30992 +	<key>CFBundleExecutable</key>
       
 30993 +	<string>${EXECUTABLE_NAME}</string>
       
 30994 +	<key>CFBundleIconFile</key>
       
 30995 +	<string>crash_report_sender</string>
       
 30996 +	<key>CFBundleIdentifier</key>
       
 30997 +	<string>com.Breakpad.${PRODUCT_NAME:identifier}</string>
       
 30998 +	<key>CFBundleInfoDictionaryVersion</key>
       
 30999 +	<string>6.0</string>
       
 31000 +	<key>CFBundleName</key>
       
 31001 +	<string>${EXECUTABLE_NAME}</string>
       
 31002 +	<key>CFBundlePackageType</key>
       
 31003 +	<string>APPL</string>
       
 31004 +	<key>CFBundleSignature</key>
       
 31005 +	<string>????</string>
       
 31006 +	<key>CFBundleVersion</key>
       
 31007 +	<string>1.0</string>
       
 31008 +	<key>LSHasLocalizedDisplayName</key>
       
 31009 +	<true/>
       
 31010 +	<key>NSMainNibFile</key>
       
 31011 +	<string>MainMenu</string>
       
 31012 +	<key>NSPrincipalClass</key>
       
 31013 +	<string>NSApplication</string>
       
 31014 +</dict>
       
 31015 +</plist>
       
 31016 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.h b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.h
       
 31017 new file mode 100644
       
 31018 --- /dev/null
       
 31019 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.h
       
 31020 @@ -0,0 +1,139 @@
       
 31021 +// Copyright (c) 2006, Google Inc.
       
 31022 +// All rights reserved.
       
 31023 +//
       
 31024 +// Redistribution and use in source and binary forms, with or without
       
 31025 +// modification, are permitted provided that the following conditions are
       
 31026 +// met:
       
 31027 +//
       
 31028 +//     * Redistributions of source code must retain the above copyright
       
 31029 +// notice, this list of conditions and the following disclaimer.
       
 31030 +//     * Redistributions in binary form must reproduce the above
       
 31031 +// copyright notice, this list of conditions and the following disclaimer
       
 31032 +// in the documentation and/or other materials provided with the
       
 31033 +// distribution.
       
 31034 +//     * Neither the name of Google Inc. nor the names of its
       
 31035 +// contributors may be used to endorse or promote products derived from
       
 31036 +// this software without specific prior written permission.
       
 31037 +//
       
 31038 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 31039 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 31040 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 31041 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 31042 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 31043 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 31044 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 31045 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 31046 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 31047 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 31048 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 31049 +//
       
 31050 +// This component uses the HTTPMultipartUpload of the breakpad project to send
       
 31051 +// the minidump and associated data to the crash reporting servers.
       
 31052 +// It will perform throttling based on the parameters passed to it and will
       
 31053 +// prompt the user to send the minidump.
       
 31054 +
       
 31055 +#include <Foundation/Foundation.h>
       
 31056 +
       
 31057 +#include "client/mac/Framework/Breakpad.h"
       
 31058 +
       
 31059 +#define kClientIdPreferenceKey @"clientid"
       
 31060 +
       
 31061 +extern NSString *const kGoogleServerType;
       
 31062 +extern NSString *const kSocorroServerType;
       
 31063 +extern NSString *const kDefaultServerType;
       
 31064 +
       
 31065 +// We're sublcassing NSTextField in order to override a particular
       
 31066 +// method (see the implementation) that lets us reject changes if they
       
 31067 +// are longer than a particular length.  Bindings would normally solve
       
 31068 +// this problem, but when we implemented a validation method, and
       
 31069 +// returned NO for strings that were too long, the UI was not updated
       
 31070 +// right away, which was a poor user experience.  The UI would be
       
 31071 +// updated as soon as the text field lost first responder status,
       
 31072 +// which isn't soon enough.  It is a known bug that the UI KVO didn't
       
 31073 +// work in the middle of a validation.
       
 31074 +@interface LengthLimitingTextField : NSTextField {
       
 31075 +  @private
       
 31076 +   unsigned int maximumLength_;
       
 31077 +}
       
 31078 +
       
 31079 +- (void) setMaximumLength:(unsigned int)maxLength;
       
 31080 +@end
       
 31081 +
       
 31082 +@interface Reporter : NSObject {
       
 31083 + @public
       
 31084 +  IBOutlet NSWindow *alertWindow_;        // The alert window
       
 31085 +
       
 31086 +  // Grouping boxes used for resizing.
       
 31087 +  IBOutlet NSBox *headerBox_;
       
 31088 +  IBOutlet NSBox *preEmailBox_;
       
 31089 +  IBOutlet NSBox *emailSectionBox_;
       
 31090 +  // Localized elements (or things that need to be moved during localization).
       
 31091 +  IBOutlet NSTextField                *dialogTitle_;
       
 31092 +  IBOutlet NSTextField                *commentMessage_;
       
 31093 +  IBOutlet NSTextField                *emailMessage_;
       
 31094 +  IBOutlet NSTextField                *emailLabel_;
       
 31095 +  IBOutlet NSTextField                *privacyLinkLabel_;
       
 31096 +  IBOutlet NSButton                   *sendButton_;
       
 31097 +  IBOutlet NSButton                   *cancelButton_;
       
 31098 +  IBOutlet LengthLimitingTextField    *emailEntryField_;
       
 31099 +  IBOutlet LengthLimitingTextField    *commentsEntryField_;
       
 31100 +  IBOutlet NSTextField                *countdownLabel_;
       
 31101 +  IBOutlet NSView                     *privacyLinkArrow_;
       
 31102 +
       
 31103 +  // Text field bindings, for user input.
       
 31104 +  NSString *commentsValue_;                // Comments from the user
       
 31105 +  NSString *emailValue_;                   // Email from the user
       
 31106 +  NSString *countdownMessage_;             // Message indicating time
       
 31107 +                                           // left for input.
       
 31108 + @private
       
 31109 +  int configFile_;                         // File descriptor for config file
       
 31110 +  NSMutableDictionary *parameters_;        // Key value pairs of data (STRONG)
       
 31111 +  NSData *minidumpContents_;               // The data in the minidump (STRONG)
       
 31112 +  NSData *logFileData_;                    // An NSdata for the tar,
       
 31113 +                                           // bz2'd log file.
       
 31114 +  NSTimeInterval remainingDialogTime_;     // Keeps track of how long
       
 31115 +                                           // we have until we cancel
       
 31116 +                                           // the dialog
       
 31117 +  NSTimer *messageTimer_;                  // Timer we use to update
       
 31118 +                                           // the dialog
       
 31119 +  NSMutableDictionary *serverDictionary_;  // The dictionary mapping a
       
 31120 +                                           // server type name to a
       
 31121 +                                           // dictionary of server
       
 31122 +                                           // parameter names.
       
 31123 +  NSMutableDictionary *socorroDictionary_; // The dictionary for
       
 31124 +                                           // Socorro.
       
 31125 +  NSMutableDictionary *googleDictionary_;  // The dictionary for
       
 31126 +                                           // Google.
       
 31127 +  NSMutableDictionary *extraServerVars_;   // A dictionary containing
       
 31128 +                                           // extra key/value pairs
       
 31129 +                                           // that are uploaded to the
       
 31130 +                                           // crash server with the
       
 31131 +                                           // minidump.
       
 31132 +}
       
 31133 +
       
 31134 +// Stops the modal panel with an NSAlertDefaultReturn value. This is the action
       
 31135 +// invoked by the "Send Report" button.
       
 31136 +- (IBAction)sendReport:(id)sender;
       
 31137 +// Stops the modal panel with an NSAlertAlternateReturn value. This is the
       
 31138 +// action invoked by the "Cancel" button.
       
 31139 +- (IBAction)cancel:(id)sender;
       
 31140 +// Opens the Privacy Policy url in the default web browser.
       
 31141 +- (IBAction)showPrivacyPolicy:(id)sender;
       
 31142 +
       
 31143 +// Delegate methods for the NSTextField for comments. We want to capture the
       
 31144 +// Return key and use it to send the message when no text has been entered.
       
 31145 +// Otherwise, we want Return to add a carriage return to the comments field.
       
 31146 +- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView
       
 31147 +                          doCommandBySelector:(SEL)commandSelector;
       
 31148 +
       
 31149 +// Accessors to make bindings work
       
 31150 +- (NSString *)commentsValue;
       
 31151 +- (void)setCommentsValue:(NSString *)value;
       
 31152 +
       
 31153 +- (NSString *)emailValue;
       
 31154 +- (void)setEmailValue:(NSString *)value;
       
 31155 +
       
 31156 +- (NSString *)countdownMessage;
       
 31157 +- (void)setCountdownMessage:(NSString *)value;
       
 31158 +
       
 31159 +@end
       
 31160 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.icns b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.icns
       
 31161 new file mode 100644
       
 31162 index 0000000000000000000000000000000000000000..e8c21242bf84a70a1efb7e005f47684a882eabe1
       
 31163 GIT binary patch
       
 31164 literal 170816
       
 31165 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%0DDTo_%~+;-HTf5
       
 33347 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
       
 34039 KPUH><=>Gs^Xsb#9
       
 34040 
       
 34041 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.m b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.m
       
 34042 new file mode 100644
       
 34043 --- /dev/null
       
 34044 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/crash_report_sender.m
       
 34045 @@ -0,0 +1,1215 @@
       
 34046 +// Copyright (c) 2006, Google Inc.
       
 34047 +// All rights reserved.
       
 34048 +//
       
 34049 +// Redistribution and use in source and binary forms, with or without
       
 34050 +// modification, are permitted provided that the following conditions are
       
 34051 +// met:
       
 34052 +//
       
 34053 +//     * Redistributions of source code must retain the above copyright
       
 34054 +// notice, this list of conditions and the following disclaimer.
       
 34055 +//     * Redistributions in binary form must reproduce the above
       
 34056 +// copyright notice, this list of conditions and the following disclaimer
       
 34057 +// in the documentation and/or other materials provided with the
       
 34058 +// distribution.
       
 34059 +//     * Neither the name of Google Inc. nor the names of its
       
 34060 +// contributors may be used to endorse or promote products derived from
       
 34061 +// this software without specific prior written permission.
       
 34062 +//
       
 34063 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 34064 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 34065 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 34066 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 34067 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 34068 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 34069 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 34070 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 34071 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 34072 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 34073 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 34074 +
       
 34075 +#import <pwd.h>
       
 34076 +#import <sys/stat.h>
       
 34077 +#import <unistd.h>
       
 34078 +
       
 34079 +#import <Cocoa/Cocoa.h>
       
 34080 +#import <SystemConfiguration/SystemConfiguration.h>
       
 34081 +
       
 34082 +#import "common/mac/HTTPMultipartUpload.h"
       
 34083 +
       
 34084 +#import "crash_report_sender.h"
       
 34085 +#import "common/mac/GTMLogger.h"
       
 34086 +
       
 34087 +
       
 34088 +#define kLastSubmission @"LastSubmission"
       
 34089 +const int kMinidumpFileLengthLimit = 800000;
       
 34090 +const int kUserCommentsMaxLength = 1500;
       
 34091 +const int kEmailMaxLength = 64;
       
 34092 +
       
 34093 +#define kApplePrefsSyncExcludeAllKey \
       
 34094 +  @"com.apple.PreferenceSync.ExcludeAllSyncKeys"
       
 34095 +
       
 34096 +NSString *const kGoogleServerType = @"google";
       
 34097 +NSString *const kSocorroServerType = @"socorro";
       
 34098 +NSString *const kDefaultServerType = @"google";
       
 34099 +
       
 34100 +#pragma mark -
       
 34101 +
       
 34102 +@interface NSView (ResizabilityExtentions)
       
 34103 +// Shifts the view vertically by the given amount.
       
 34104 +- (void)breakpad_shiftVertically:(float)offset;
       
 34105 +
       
 34106 +// Shifts the view horizontally by the given amount.
       
 34107 +- (void)breakpad_shiftHorizontally:(float)offset;
       
 34108 +@end
       
 34109 +
       
 34110 +@implementation NSView (ResizabilityExtentions)
       
 34111 +- (void)breakpad_shiftVertically:(float)offset {
       
 34112 +  NSPoint origin = [self frame].origin;
       
 34113 +  origin.y += offset;
       
 34114 +  [self setFrameOrigin:origin];
       
 34115 +}
       
 34116 +
       
 34117 +- (void)breakpad_shiftHorizontally:(float)offset {
       
 34118 +  NSPoint origin = [self frame].origin;
       
 34119 +  origin.x += offset;
       
 34120 +  [self setFrameOrigin:origin];
       
 34121 +}
       
 34122 +@end
       
 34123 +
       
 34124 +@interface NSWindow (ResizabilityExtentions)
       
 34125 +// Adjusts the window height by heightDelta relative to its current height,
       
 34126 +// keeping all the content at the same size.
       
 34127 +- (void)breakpad_adjustHeight:(float)heightDelta;
       
 34128 +@end
       
 34129 +
       
 34130 +@implementation NSWindow (ResizabilityExtentions)
       
 34131 +- (void)breakpad_adjustHeight:(float)heightDelta {
       
 34132 +  [[self contentView] setAutoresizesSubviews:NO];
       
 34133 +
       
 34134 +  NSRect windowFrame = [self frame];
       
 34135 +  windowFrame.size.height += heightDelta;
       
 34136 +  [self setFrame:windowFrame display:YES];
       
 34137 +  // For some reason the content view is resizing, but not adjusting its origin,
       
 34138 +  // so correct it manually.
       
 34139 +  [[self contentView] setFrameOrigin:NSMakePoint(0, 0)];
       
 34140 +
       
 34141 +  [[self contentView] setAutoresizesSubviews:YES];
       
 34142 +}
       
 34143 +@end
       
 34144 +
       
 34145 +@interface NSTextField (ResizabilityExtentions)
       
 34146 +// Grows or shrinks the height of the field to the minimum required to show the
       
 34147 +// current text, preserving the existing width and origin.
       
 34148 +// Returns the change in height.
       
 34149 +- (float)breakpad_adjustHeightToFit;
       
 34150 +
       
 34151 +// Grows or shrinks the width of the field to the minimum required to show the
       
 34152 +// current text, preserving the existing height and origin.
       
 34153 +// Returns the change in width.
       
 34154 +- (float)breakpad_adjustWidthToFit;
       
 34155 +@end
       
 34156 +
       
 34157 +@implementation NSTextField (ResizabilityExtentions)
       
 34158 +- (float)breakpad_adjustHeightToFit {
       
 34159 +  NSRect oldFrame = [self frame];
       
 34160 +  // Starting with the 10.5 SDK, height won't grow, so make it huge to start.
       
 34161 +  NSRect presizeFrame = oldFrame;
       
 34162 +  presizeFrame.size.height = MAXFLOAT;
       
 34163 +  // sizeToFit will blow out the width rather than making the field taller, so
       
 34164 +  // we do it manually.
       
 34165 +  NSSize newSize = [[self cell] cellSizeForBounds:presizeFrame];
       
 34166 +  NSRect newFrame = NSMakeRect(oldFrame.origin.x, oldFrame.origin.y,
       
 34167 +                               NSWidth(oldFrame), newSize.height);
       
 34168 +  [self setFrame:newFrame];
       
 34169 +
       
 34170 +  return newSize.height - NSHeight(oldFrame);
       
 34171 +}
       
 34172 +
       
 34173 +- (float)breakpad_adjustWidthToFit {
       
 34174 +  NSRect oldFrame = [self frame];
       
 34175 +  [self sizeToFit];
       
 34176 +  return NSWidth([self frame]) - NSWidth(oldFrame);
       
 34177 +}
       
 34178 +@end
       
 34179 +
       
 34180 +@interface NSButton (ResizabilityExtentions)
       
 34181 +// Resizes to fit the label using IB-style size-to-fit metrics and enforcing a
       
 34182 +// minimum width of 70, while preserving the right edge location.
       
 34183 +// Returns the change in width.
       
 34184 +- (float)breakpad_smartSizeToFit;
       
 34185 +@end
       
 34186 +
       
 34187 +@implementation NSButton (ResizabilityExtentions)
       
 34188 +- (float)breakpad_smartSizeToFit {
       
 34189 +  NSRect oldFrame = [self frame];
       
 34190 +  [self sizeToFit];
       
 34191 +  NSRect newFrame = [self frame];
       
 34192 +  // sizeToFit gives much worse results that IB's Size to Fit option. This is
       
 34193 +  // the amount of padding IB adds over a sizeToFit, empirically determined.
       
 34194 +  const float kExtraPaddingAmount = 12;
       
 34195 +  const float kMinButtonWidth = 70; // The default button size in IB.
       
 34196 +  newFrame.size.width = NSWidth(newFrame) + kExtraPaddingAmount;
       
 34197 +  if (NSWidth(newFrame) < kMinButtonWidth)
       
 34198 +    newFrame.size.width = kMinButtonWidth;
       
 34199 +  // Preserve the right edge location.
       
 34200 +  newFrame.origin.x = NSMaxX(oldFrame) - NSWidth(newFrame);
       
 34201 +  [self setFrame:newFrame];
       
 34202 +  return NSWidth(newFrame) - NSWidth(oldFrame);
       
 34203 +}
       
 34204 +@end
       
 34205 +
       
 34206 +#pragma mark -
       
 34207 +
       
 34208 +
       
 34209 +@interface Reporter(PrivateMethods)
       
 34210 ++ (uid_t)consoleUID;
       
 34211 +
       
 34212 +- (id)initWithConfigurationFD:(int)fd;
       
 34213 +
       
 34214 +- (NSString *)readString;
       
 34215 +- (NSData *)readData:(ssize_t)length;
       
 34216 +
       
 34217 +- (BOOL)readConfigurationData;
       
 34218 +- (BOOL)readMinidumpData;
       
 34219 +- (BOOL)readLogFileData;
       
 34220 +
       
 34221 +// Returns YES if it has been long enough since the last report that we should
       
 34222 +// submit a report for this crash.
       
 34223 +- (BOOL)reportIntervalElapsed;
       
 34224 +
       
 34225 +// Returns YES if we should send the report without asking the user first.
       
 34226 +- (BOOL)shouldSubmitSilently;
       
 34227 +
       
 34228 +// Returns YES if the minidump was generated on demand.
       
 34229 +- (BOOL)isOnDemand;
       
 34230 +
       
 34231 +// Returns YES if we should ask the user to provide comments.
       
 34232 +- (BOOL)shouldRequestComments;
       
 34233 +
       
 34234 +// Returns YES if we should ask the user to provide an email address.
       
 34235 +- (BOOL)shouldRequestEmail;
       
 34236 +
       
 34237 +// Shows UI to the user to ask for permission to send and any extra information
       
 34238 +// we've been instructed to request. Returns YES if the user allows the report
       
 34239 +// to be sent.
       
 34240 +- (BOOL)askUserPermissionToSend;
       
 34241 +
       
 34242 +// Returns the short description of the crash, suitable for use as a dialog
       
 34243 +// title (e.g., "The application Foo has quit unexpectedly").
       
 34244 +- (NSString*)shortDialogMessage;
       
 34245 +
       
 34246 +// Return explanatory text about the crash and the reporter, suitable for the
       
 34247 +// body text of a dialog.
       
 34248 +- (NSString*)explanatoryDialogText;
       
 34249 +
       
 34250 +// Returns the amount of time the UI should be shown before timing out.
       
 34251 +- (NSTimeInterval)messageTimeout;
       
 34252 +
       
 34253 +// Preps the comment-prompting alert window for display:
       
 34254 +// * localizes all the elements
       
 34255 +// * resizes and adjusts layout as necessary for localization
       
 34256 +// * removes the email section if includeEmail is NO
       
 34257 +- (void)configureAlertWindowIncludingEmail:(BOOL)includeEmail;
       
 34258 +
       
 34259 +// Rmevoes the email section of the dialog, adjusting the rest of the window
       
 34260 +// as necessary.
       
 34261 +- (void)removeEmailPrompt;
       
 34262 +
       
 34263 +// Run an alert window with the given timeout. Returns
       
 34264 +// NSRunStoppedResponse if the timeout is exceeded. A timeout of 0
       
 34265 +// queues the message immediately in the modal run loop.
       
 34266 +- (int)runModalWindow:(NSWindow*)window withTimeout:(NSTimeInterval)timeout;
       
 34267 +
       
 34268 +// Returns a unique client id (user-specific), creating a persistent
       
 34269 +// one in the user defaults, if necessary.
       
 34270 +- (NSString*)clientID;
       
 34271 +
       
 34272 +// Returns a dictionary that can be used to map Breakpad parameter names to
       
 34273 +// URL parameter names.
       
 34274 +- (NSMutableDictionary *)dictionaryForServerType:(NSString *)serverType;
       
 34275 +
       
 34276 +// Helper method to set HTTP parameters based on server type.  This is
       
 34277 +// called right before the upload - crashParameters will contain, on exit,
       
 34278 +// URL parameters that should be sent with the minidump.
       
 34279 +- (BOOL)populateServerDictionary:(NSMutableDictionary *)crashParameters;
       
 34280 +
       
 34281 +// Initialization helper to create dictionaries mapping Breakpad
       
 34282 +// parameters to URL parameters
       
 34283 +- (void)createServerParameterDictionaries;
       
 34284 +
       
 34285 +// Accessor method for the URL parameter dictionary
       
 34286 +- (NSMutableDictionary *)urlParameterDictionary;
       
 34287 +
       
 34288 +// This method adds a key/value pair to the dictionary that
       
 34289 +// will be uploaded to the crash server.
       
 34290 +- (void)addServerParameter:(id)value forKey:(NSString *)key;
       
 34291 +
       
 34292 +// This method is used to periodically update the UI with how many
       
 34293 +// seconds are left in the dialog display.
       
 34294 +- (void)updateSecondsLeftInDialogDisplay:(NSTimer*)theTimer;
       
 34295 +
       
 34296 +// When we receive this notification, it means that the user has
       
 34297 +// begun editing the email address or comments field, and we disable
       
 34298 +// the timers so that the user has as long as they want to type
       
 34299 +// in their comments/email.
       
 34300 +- (void)controlTextDidBeginEditing:(NSNotification *)aNotification;
       
 34301 +
       
 34302 +@end
       
 34303 +
       
 34304 +@implementation Reporter
       
 34305 +//=============================================================================
       
 34306 ++ (uid_t)consoleUID {
       
 34307 +  SCDynamicStoreRef store =
       
 34308 +    SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("Reporter"), NULL, NULL);
       
 34309 +  uid_t uid = -2;  // Default to "nobody"
       
 34310 +  if (store) {
       
 34311 +    CFStringRef user = SCDynamicStoreCopyConsoleUser(store, &uid, NULL);
       
 34312 +
       
 34313 +    if (user)
       
 34314 +      CFRelease(user);
       
 34315 +    else
       
 34316 +      uid = -2;
       
 34317 +
       
 34318 +    CFRelease(store);
       
 34319 +  }
       
 34320 +
       
 34321 +  return uid;
       
 34322 +}
       
 34323 +
       
 34324 +//=============================================================================
       
 34325 +- (id)initWithConfigurationFD:(int)fd {
       
 34326 +  if ((self = [super init])) {
       
 34327 +    configFile_ = fd;
       
 34328 +    remainingDialogTime_ = 0;
       
 34329 +  }
       
 34330 +
       
 34331 +  // Because the reporter is embedded in the framework (and many copies
       
 34332 +  // of the framework may exist) its not completely certain that the OS
       
 34333 +  // will obey the com.apple.PreferenceSync.ExcludeAllSyncKeys in our
       
 34334 +  // Info.plist. To make sure, also set the key directly if needed.
       
 34335 +  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
       
 34336 +  if (![ud boolForKey:kApplePrefsSyncExcludeAllKey]) {
       
 34337 +    [ud setBool:YES forKey:kApplePrefsSyncExcludeAllKey];
       
 34338 +  }
       
 34339 +
       
 34340 +  [self createServerParameterDictionaries];
       
 34341 +
       
 34342 +  return self;
       
 34343 +}
       
 34344 +
       
 34345 +//=============================================================================
       
 34346 +- (NSString *)readString {
       
 34347 +  NSMutableString *str = [NSMutableString stringWithCapacity:32];
       
 34348 +  char ch[2] = { 0 };
       
 34349 +
       
 34350 +  while (read(configFile_, &ch[0], 1) == 1) {
       
 34351 +    if (ch[0] == '\n') {
       
 34352 +      // Break if this is the first newline after reading some other string
       
 34353 +      // data.
       
 34354 +      if ([str length])
       
 34355 +        break;
       
 34356 +    } else {
       
 34357 +      [str appendString:[NSString stringWithUTF8String:ch]];
       
 34358 +    }
       
 34359 +  }
       
 34360 +
       
 34361 +  return str;
       
 34362 +}
       
 34363 +
       
 34364 +//=============================================================================
       
 34365 +- (NSData *)readData:(ssize_t)length {
       
 34366 +  NSMutableData *data = [NSMutableData dataWithLength:length];
       
 34367 +  char *bytes = (char *)[data bytes];
       
 34368 +
       
 34369 +  if (read(configFile_, bytes, length) != length)
       
 34370 +    return nil;
       
 34371 +
       
 34372 +  return data;
       
 34373 +}
       
 34374 +
       
 34375 +//=============================================================================
       
 34376 +- (BOOL)readConfigurationData {
       
 34377 +  parameters_ = [[NSMutableDictionary alloc] init];
       
 34378 +
       
 34379 +  while (1) {
       
 34380 +    NSString *key = [self readString];
       
 34381 +
       
 34382 +    if (![key length])
       
 34383 +      break;
       
 34384 +
       
 34385 +    // Read the data.  Try to convert to a UTF-8 string, or just save
       
 34386 +    // the data
       
 34387 +    NSString *lenStr = [self readString];
       
 34388 +    ssize_t len = [lenStr intValue];
       
 34389 +    NSData *data = [self readData:len];
       
 34390 +    id value = [[NSString alloc] initWithData:data
       
 34391 +                                     encoding:NSUTF8StringEncoding];
       
 34392 +
       
 34393 +    // If the keyname is prefixed by BREAKPAD_SERVER_PARAMETER_PREFIX
       
 34394 +    // that indicates that it should be uploaded to the server along
       
 34395 +    // with the minidump, so we treat it specially.
       
 34396 +    if ([key hasPrefix:@BREAKPAD_SERVER_PARAMETER_PREFIX]) {
       
 34397 +      NSString *urlParameterKey =
       
 34398 +        [key substringFromIndex:[@BREAKPAD_SERVER_PARAMETER_PREFIX length]];
       
 34399 +      if ([urlParameterKey length]) {
       
 34400 +        if (value) {
       
 34401 +          [self addServerParameter:value
       
 34402 +                            forKey:urlParameterKey];
       
 34403 +        } else {
       
 34404 +          [self addServerParameter:data
       
 34405 +                            forKey:urlParameterKey];
       
 34406 +        }
       
 34407 +      }
       
 34408 +    } else {
       
 34409 +      [parameters_ setObject:(value ? value : data) forKey:key];
       
 34410 +    }
       
 34411 +    [value release];
       
 34412 +  }
       
 34413 +
       
 34414 +  // generate a unique client ID based on this host's MAC address
       
 34415 +  // then add a key/value pair for it
       
 34416 +  NSString *clientID = [self clientID];
       
 34417 +  [parameters_ setObject:clientID forKey:@"guid"];
       
 34418 +
       
 34419 +  close(configFile_);
       
 34420 +  configFile_ = -1;
       
 34421 +
       
 34422 +  return YES;
       
 34423 +}
       
 34424 +
       
 34425 +// Per user per machine
       
 34426 +- (NSString *)clientID {
       
 34427 +  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
       
 34428 +  NSString *crashClientID = [ud stringForKey:kClientIdPreferenceKey];
       
 34429 +  if (crashClientID) {
       
 34430 +    return crashClientID;
       
 34431 +  }
       
 34432 +
       
 34433 +  // Otherwise, if we have no client id, generate one!
       
 34434 +  srandom([[NSDate date] timeIntervalSince1970]);
       
 34435 +  long clientId1 = random();
       
 34436 +  long clientId2 = random();
       
 34437 +  long clientId3 = random();
       
 34438 +  crashClientID = [NSString stringWithFormat:@"%x%x%x",
       
 34439 +                            clientId1, clientId2, clientId3];
       
 34440 +
       
 34441 +  [ud setObject:crashClientID forKey:kClientIdPreferenceKey];
       
 34442 +  [ud synchronize];
       
 34443 +  return crashClientID;
       
 34444 +}
       
 34445 +
       
 34446 +//=============================================================================
       
 34447 +- (BOOL)readLogFileData {
       
 34448 +  unsigned int logFileCounter = 0;
       
 34449 +
       
 34450 +  NSString *logPath;
       
 34451 +  int logFileTailSize = [[parameters_ objectForKey:@BREAKPAD_LOGFILE_UPLOAD_SIZE]
       
 34452 +                          intValue];
       
 34453 +
       
 34454 +  NSMutableArray *logFilenames; // An array of NSString, one per log file
       
 34455 +  logFilenames = [[NSMutableArray alloc] init];
       
 34456 +
       
 34457 +  char tmpDirTemplate[80] = "/tmp/CrashUpload-XXXXX";
       
 34458 +  char *tmpDir = mkdtemp(tmpDirTemplate);
       
 34459 +
       
 34460 +  // Construct key names for the keys we expect to contain log file paths
       
 34461 +  for(logFileCounter = 0;; logFileCounter++) {
       
 34462 +    NSString *logFileKey = [NSString stringWithFormat:@"%@%d",
       
 34463 +                                     @BREAKPAD_LOGFILE_KEY_PREFIX,
       
 34464 +                                     logFileCounter];
       
 34465 +
       
 34466 +    logPath = [parameters_ objectForKey:logFileKey];
       
 34467 +
       
 34468 +    // They should all be consecutive, so if we don't find one, assume
       
 34469 +    // we're done
       
 34470 +
       
 34471 +    if (!logPath) {
       
 34472 +      break;
       
 34473 +    }
       
 34474 +
       
 34475 +    NSData *entireLogFile = [[NSData alloc] initWithContentsOfFile:logPath];
       
 34476 +
       
 34477 +    if (entireLogFile == nil) {
       
 34478 +      continue;
       
 34479 +    }
       
 34480 +
       
 34481 +    NSRange fileRange;
       
 34482 +
       
 34483 +    // Truncate the log file, only if necessary
       
 34484 +
       
 34485 +    if ([entireLogFile length] <= logFileTailSize) {
       
 34486 +      fileRange = NSMakeRange(0, [entireLogFile length]);
       
 34487 +    } else {
       
 34488 +      fileRange = NSMakeRange([entireLogFile length] - logFileTailSize,
       
 34489 +                              logFileTailSize);
       
 34490 +    }
       
 34491 +
       
 34492 +    char tmpFilenameTemplate[100];
       
 34493 +
       
 34494 +    // Generate a template based on the log filename
       
 34495 +    sprintf(tmpFilenameTemplate,"%s/%s-XXXX", tmpDir,
       
 34496 +            [[logPath lastPathComponent] fileSystemRepresentation]);
       
 34497 +
       
 34498 +    char *tmpFile = mktemp(tmpFilenameTemplate);
       
 34499 +
       
 34500 +    NSData *logSubdata = [entireLogFile subdataWithRange:fileRange];
       
 34501 +    NSString *tmpFileString = [NSString stringWithUTF8String:tmpFile];
       
 34502 +    [logSubdata writeToFile:tmpFileString atomically:NO];
       
 34503 +
       
 34504 +    [logFilenames addObject:[tmpFileString lastPathComponent]];
       
 34505 +    [entireLogFile release];
       
 34506 +  }
       
 34507 +
       
 34508 +  if ([logFilenames count] == 0) {
       
 34509 +    [logFilenames release];
       
 34510 +    logFileData_ =  nil;
       
 34511 +    return NO;
       
 34512 +  }
       
 34513 +
       
 34514 +  // now, bzip all files into one
       
 34515 +  NSTask *tarTask = [[NSTask alloc] init];
       
 34516 +
       
 34517 +  [tarTask setCurrentDirectoryPath:[NSString stringWithUTF8String:tmpDir]];
       
 34518 +  [tarTask setLaunchPath:@"/usr/bin/tar"];
       
 34519 +
       
 34520 +  NSMutableArray *bzipArgs = [NSMutableArray arrayWithObjects:@"-cjvf",
       
 34521 +                                             @"log.tar.bz2",nil];
       
 34522 +  [bzipArgs addObjectsFromArray:logFilenames];
       
 34523 +
       
 34524 +  [logFilenames release];
       
 34525 +
       
 34526 +  [tarTask setArguments:bzipArgs];
       
 34527 +  [tarTask launch];
       
 34528 +  [tarTask waitUntilExit];
       
 34529 +  [tarTask release];
       
 34530 +
       
 34531 +  NSString *logTarFile = [NSString stringWithFormat:@"%s/log.tar.bz2",tmpDir];
       
 34532 +  logFileData_ = [[NSData alloc] initWithContentsOfFile:logTarFile];
       
 34533 +  if (logFileData_ == nil) {
       
 34534 +    GTMLoggerDebug(@"Cannot find temp tar log file: %@", logTarFile);
       
 34535 +    return NO;
       
 34536 +  }
       
 34537 +  return YES;
       
 34538 +
       
 34539 +}
       
 34540 +
       
 34541 +//=============================================================================
       
 34542 +- (BOOL)readMinidumpData {
       
 34543 +  NSString *minidumpDir = [parameters_ objectForKey:@kReporterMinidumpDirectoryKey];
       
 34544 +  NSString *minidumpID = [parameters_ objectForKey:@kReporterMinidumpIDKey];
       
 34545 +
       
 34546 +  if (![minidumpID length])
       
 34547 +    return NO;
       
 34548 +
       
 34549 +  NSString *path = [minidumpDir stringByAppendingPathComponent:minidumpID];
       
 34550 +  path = [path stringByAppendingPathExtension:@"dmp"];
       
 34551 +
       
 34552 +  // check the size of the minidump and limit it to a reasonable size
       
 34553 +  // before attempting to load into memory and upload
       
 34554 +  const char *fileName = [path fileSystemRepresentation];
       
 34555 +  struct stat fileStatus;
       
 34556 +
       
 34557 +  BOOL success = YES;
       
 34558 +
       
 34559 +  if (!stat(fileName, &fileStatus)) {
       
 34560 +    if (fileStatus.st_size > kMinidumpFileLengthLimit) {
       
 34561 +      fprintf(stderr, "Breakpad Reporter: minidump file too large " \
       
 34562 +              "to upload : %d\n", (int)fileStatus.st_size);
       
 34563 +      success = NO;
       
 34564 +    }
       
 34565 +  } else {
       
 34566 +      fprintf(stderr, "Breakpad Reporter: unable to determine minidump " \
       
 34567 +              "file length\n");
       
 34568 +      success = NO;
       
 34569 +  }
       
 34570 +
       
 34571 +  if (success) {
       
 34572 +    minidumpContents_ = [[NSData alloc] initWithContentsOfFile:path];
       
 34573 +    success = ([minidumpContents_ length] ? YES : NO);
       
 34574 +  }
       
 34575 +
       
 34576 +  if (!success) {
       
 34577 +    // something wrong with the minidump file -- delete it
       
 34578 +    unlink(fileName);
       
 34579 +  }
       
 34580 +
       
 34581 +  return success;
       
 34582 +}
       
 34583 +
       
 34584 +//=============================================================================
       
 34585 +- (BOOL)askUserPermissionToSend {
       
 34586 +  // Initialize Cocoa, needed to display the alert
       
 34587 +  NSApplicationLoad();
       
 34588 +
       
 34589 +  // Get the timeout value for the notification.
       
 34590 +  NSTimeInterval timeout = [self messageTimeout];
       
 34591 +
       
 34592 +  int buttonPressed = NSAlertAlternateReturn;
       
 34593 +  // Determine whether we should create a text box for user feedback.
       
 34594 +  if ([self shouldRequestComments]) {
       
 34595 +    BOOL didLoadNib = [NSBundle loadNibNamed:@"Breakpad" owner:self];
       
 34596 +    if (!didLoadNib) {
       
 34597 +      return NO;
       
 34598 +    }
       
 34599 +
       
 34600 +    [self configureAlertWindowIncludingEmail:[self shouldRequestEmail]];
       
 34601 +
       
 34602 +    buttonPressed = [self runModalWindow:alertWindow_ withTimeout:timeout];
       
 34603 +
       
 34604 +    // Extract info from the user into the parameters_ dictionary
       
 34605 +    if ([self commentsValue]) {
       
 34606 +      [parameters_ setObject:[self commentsValue] forKey:@BREAKPAD_COMMENTS];
       
 34607 +    }
       
 34608 +    if ([self emailValue]) {
       
 34609 +      [parameters_ setObject:[self emailValue] forKey:@BREAKPAD_EMAIL];
       
 34610 +    }
       
 34611 +  } else {
       
 34612 +    // Create an alert panel to tell the user something happened
       
 34613 +    NSPanel* alert = NSGetAlertPanel([self shortDialogMessage],
       
 34614 +                                     [self explanatoryDialogText],
       
 34615 +                                     NSLocalizedString(@"sendReportButton", @""),
       
 34616 +                                     NSLocalizedString(@"cancelButton", @""),
       
 34617 +                                     nil);
       
 34618 +
       
 34619 +    // Pop the alert with an automatic timeout, and wait for the response
       
 34620 +    buttonPressed = [self runModalWindow:alert withTimeout:timeout];
       
 34621 +
       
 34622 +    // Release the panel memory
       
 34623 +    NSReleaseAlertPanel(alert);
       
 34624 +  }
       
 34625 +  return buttonPressed == NSAlertDefaultReturn;
       
 34626 +}
       
 34627 +
       
 34628 +- (void)configureAlertWindowIncludingEmail:(BOOL)includeEmail {
       
 34629 +  // Swap in localized values, making size adjustments to impacted elements as
       
 34630 +  // we go. Remember that the origin is in the bottom left, so elements above
       
 34631 +  // "fall" as text areas are shrunk from their overly-large IB sizes.
       
 34632 +
       
 34633 +  // Localize the header. No resizing needed, as it has plenty of room.
       
 34634 +  [dialogTitle_ setStringValue:[self shortDialogMessage]];
       
 34635 +
       
 34636 +  // Localize the explanatory text field.
       
 34637 +  [commentMessage_ setStringValue:[NSString stringWithFormat:@"%@\n\n%@",
       
 34638 +                                   [self explanatoryDialogText],
       
 34639 +                                   NSLocalizedString(@"commentsMsg", @"")]];
       
 34640 +  float commentHeightDelta = [commentMessage_ breakpad_adjustHeightToFit];
       
 34641 +  [headerBox_ breakpad_shiftVertically:commentHeightDelta];
       
 34642 +  [alertWindow_ breakpad_adjustHeight:commentHeightDelta];
       
 34643 +
       
 34644 +  // Either localize the email explanation field or remove the whole email
       
 34645 +  // section depending on whether or not we are asking for email.
       
 34646 +  if (includeEmail) {
       
 34647 +    [emailMessage_ setStringValue:NSLocalizedString(@"emailMsg", @"")];
       
 34648 +    float emailHeightDelta = [emailMessage_ breakpad_adjustHeightToFit];
       
 34649 +    [preEmailBox_ breakpad_shiftVertically:emailHeightDelta];
       
 34650 +    [alertWindow_ breakpad_adjustHeight:emailHeightDelta];
       
 34651 +  } else {
       
 34652 +    [self removeEmailPrompt];  // Handles necessary resizing.
       
 34653 +  }
       
 34654 +
       
 34655 +  // Localize the email label, and shift the associated text field.
       
 34656 +  [emailLabel_ setStringValue:NSLocalizedString(@"emailLabel", @"")];
       
 34657 +  float emailLabelWidthDelta = [emailLabel_ breakpad_adjustWidthToFit];
       
 34658 +  [emailEntryField_ breakpad_shiftHorizontally:emailLabelWidthDelta];
       
 34659 +
       
 34660 +  // Localize the privacy policy label, and keep it right-aligned to the arrow.
       
 34661 +  [privacyLinkLabel_ setStringValue:NSLocalizedString(@"privacyLabel", @"")];
       
 34662 +  float privacyLabelWidthDelta = [privacyLinkLabel_ breakpad_adjustWidthToFit];
       
 34663 +  [privacyLinkLabel_ breakpad_shiftHorizontally:(-privacyLabelWidthDelta)];
       
 34664 +
       
 34665 +  // Localize the buttons, and keep the cancel button at the right distance.
       
 34666 +  [sendButton_ setTitle:NSLocalizedString(@"sendReportButton", @"")];
       
 34667 +  float sendButtonWidthDelta = [sendButton_ breakpad_smartSizeToFit];
       
 34668 +  [cancelButton_ breakpad_shiftHorizontally:(-sendButtonWidthDelta)];
       
 34669 +  [cancelButton_ setTitle:NSLocalizedString(@"cancelButton", @"")];
       
 34670 +  [cancelButton_ breakpad_smartSizeToFit];
       
 34671 +}
       
 34672 +
       
 34673 +- (void)removeEmailPrompt {
       
 34674 +  [emailSectionBox_ setHidden:YES];
       
 34675 +  float emailSectionHeight = NSHeight([emailSectionBox_ frame]);
       
 34676 +  [preEmailBox_ breakpad_shiftVertically:(-emailSectionHeight)];
       
 34677 +  [alertWindow_ breakpad_adjustHeight:(-emailSectionHeight)];
       
 34678 +}
       
 34679 +
       
 34680 +- (int)runModalWindow:(NSWindow*)window withTimeout:(NSTimeInterval)timeout {
       
 34681 +  // Queue a |stopModal| message to be performed in |timeout| seconds.
       
 34682 +  if (timeout > 0.001) {
       
 34683 +    remainingDialogTime_ = timeout;
       
 34684 +    SEL updateSelector = @selector(updateSecondsLeftInDialogDisplay:);
       
 34685 +    messageTimer_ = [NSTimer scheduledTimerWithTimeInterval:1.0
       
 34686 +                                                     target:self
       
 34687 +                                                   selector:updateSelector
       
 34688 +                                                   userInfo:nil
       
 34689 +                                                    repeats:YES];
       
 34690 +  }
       
 34691 +
       
 34692 +  // Run the window modally and wait for either a |stopModal| message or a
       
 34693 +  // button click.
       
 34694 +  [NSApp activateIgnoringOtherApps:YES];
       
 34695 +  int returnMethod = [NSApp runModalForWindow:window];
       
 34696 +
       
 34697 +  return returnMethod;
       
 34698 +}
       
 34699 +
       
 34700 +- (IBAction)sendReport:(id)sender {
       
 34701 +  // Force the text fields to end editing so text for the currently focused
       
 34702 +  // field will be commited.
       
 34703 +  [alertWindow_ makeFirstResponder:alertWindow_];
       
 34704 +
       
 34705 +  [alertWindow_ orderOut:self];
       
 34706 +  // Use NSAlertDefaultReturn so that the return value of |runModalWithWindow|
       
 34707 +  // matches the AppKit function NSRunAlertPanel()
       
 34708 +  [NSApp stopModalWithCode:NSAlertDefaultReturn];
       
 34709 +}
       
 34710 +
       
 34711 +// UI Button Actions
       
 34712 +//=============================================================================
       
 34713 +- (IBAction)cancel:(id)sender {
       
 34714 +  [alertWindow_ orderOut:self];
       
 34715 +  // Use NSAlertDefaultReturn so that the return value of |runModalWithWindow|
       
 34716 +  // matches the AppKit function NSRunAlertPanel()
       
 34717 +  [NSApp stopModalWithCode:NSAlertAlternateReturn];
       
 34718 +}
       
 34719 +
       
 34720 +- (IBAction)showPrivacyPolicy:(id)sender {
       
 34721 +  // Get the localized privacy policy URL and open it in the default browser.
       
 34722 +  NSURL* privacyPolicyURL =
       
 34723 +      [NSURL URLWithString:NSLocalizedString(@"privacyPolicyURL", @"")];
       
 34724 +  [[NSWorkspace sharedWorkspace] openURL:privacyPolicyURL];
       
 34725 +}
       
 34726 +
       
 34727 +// Text Field Delegate Methods
       
 34728 +//=============================================================================
       
 34729 +- (BOOL)    control:(NSControl*)control
       
 34730 +           textView:(NSTextView*)textView
       
 34731 +doCommandBySelector:(SEL)commandSelector {
       
 34732 +  BOOL result = NO;
       
 34733 +  // If the user has entered text on the comment field, don't end
       
 34734 +  // editing on "return".
       
 34735 +  if (control == commentsEntryField_ &&
       
 34736 +      commandSelector == @selector(insertNewline:)
       
 34737 +      && [[textView string] length] > 0) {
       
 34738 +    [textView insertNewlineIgnoringFieldEditor:self];
       
 34739 +    result = YES;
       
 34740 +  }
       
 34741 +  return result;
       
 34742 +}
       
 34743 +
       
 34744 +- (void)controlTextDidBeginEditing:(NSNotification *)aNotification {
       
 34745 +  [messageTimer_ invalidate];
       
 34746 +  [self setCountdownMessage:@""];
       
 34747 +}
       
 34748 +
       
 34749 +- (void)updateSecondsLeftInDialogDisplay:(NSTimer*)theTimer {
       
 34750 +  remainingDialogTime_ -= 1;
       
 34751 +
       
 34752 +  NSString *countdownMessage;
       
 34753 +  NSString *formatString;
       
 34754 +
       
 34755 +  int displayedTimeLeft; // This can be either minutes or seconds.
       
 34756 +  
       
 34757 +  if (remainingDialogTime_ > 59) {
       
 34758 +    // calculate minutes remaining for UI purposes
       
 34759 +    displayedTimeLeft = (remainingDialogTime_ / 60);
       
 34760 +    
       
 34761 +    if (displayedTimeLeft == 1) {
       
 34762 +      formatString = NSLocalizedString(@"countdownMsgMinuteSingular", @"");
       
 34763 +    } else {
       
 34764 +      formatString = NSLocalizedString(@"countdownMsgMinutesPlural", @"");
       
 34765 +    }
       
 34766 +  } else {
       
 34767 +    displayedTimeLeft = remainingDialogTime_;
       
 34768 +    if (remainingDialogTime_ == 1) {
       
 34769 +      formatString = NSLocalizedString(@"countdownMsgSecondSingular", @"");
       
 34770 +    } else {
       
 34771 +      formatString = NSLocalizedString(@"countdownMsgSecondsPlural", @"");
       
 34772 +    }
       
 34773 +  }
       
 34774 +  countdownMessage = [NSString stringWithFormat:formatString,
       
 34775 +                               displayedTimeLeft];
       
 34776 +  if (remainingDialogTime_ <= 30) {
       
 34777 +    [countdownLabel_ setTextColor:[NSColor redColor]];
       
 34778 +  }
       
 34779 +  [self setCountdownMessage:countdownMessage];
       
 34780 +  if (remainingDialogTime_ <= 0) {
       
 34781 +    [messageTimer_ invalidate];
       
 34782 +    [NSApp stopModal];
       
 34783 +  }
       
 34784 +}
       
 34785 +
       
 34786 +
       
 34787 +
       
 34788 +#pragma mark Accessors
       
 34789 +#pragma mark -
       
 34790 +//=============================================================================
       
 34791 +
       
 34792 +- (NSString *)commentsValue {
       
 34793 +  return [[commentsValue_ retain] autorelease];
       
 34794 +}
       
 34795 +
       
 34796 +- (void)setCommentsValue:(NSString *)value {
       
 34797 +  if (commentsValue_ != value) {
       
 34798 +    [commentsValue_ release];
       
 34799 +    commentsValue_ = [value copy];
       
 34800 +  }
       
 34801 +}
       
 34802 +
       
 34803 +- (NSString *)emailValue {
       
 34804 +  return [[emailValue_ retain] autorelease];
       
 34805 +}
       
 34806 +
       
 34807 +- (void)setEmailValue:(NSString *)value {
       
 34808 +  if (emailValue_ != value) {
       
 34809 +    [emailValue_ release];
       
 34810 +    emailValue_ = [value copy];
       
 34811 +  }
       
 34812 +}
       
 34813 +
       
 34814 +- (NSString *)countdownMessage {
       
 34815 +  return [[countdownMessage_ retain] autorelease];
       
 34816 +}
       
 34817 +
       
 34818 +- (void)setCountdownMessage:(NSString *)value {
       
 34819 +  if (countdownMessage_ != value) {
       
 34820 +    [countdownMessage_ release];
       
 34821 +    countdownMessage_ = [value copy];
       
 34822 +  }
       
 34823 +}
       
 34824 +
       
 34825 +#pragma mark -
       
 34826 +//=============================================================================
       
 34827 +- (BOOL)reportIntervalElapsed {
       
 34828 +  float interval = [[parameters_ objectForKey:@BREAKPAD_REPORT_INTERVAL]
       
 34829 +    floatValue];
       
 34830 +  NSString *program = [parameters_ objectForKey:@BREAKPAD_PRODUCT];
       
 34831 +  NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
       
 34832 +  NSMutableDictionary *programDict =
       
 34833 +    [NSMutableDictionary dictionaryWithDictionary:[ud dictionaryForKey:program]];
       
 34834 +  NSNumber *lastTimeNum = [programDict objectForKey:kLastSubmission];
       
 34835 +  NSTimeInterval lastTime = lastTimeNum ? [lastTimeNum floatValue] : 0;
       
 34836 +  NSTimeInterval now = CFAbsoluteTimeGetCurrent();
       
 34837 +  NSTimeInterval spanSeconds = (now - lastTime);
       
 34838 +
       
 34839 +  [programDict setObject:[NSNumber numberWithFloat:now] forKey:kLastSubmission];
       
 34840 +  [ud setObject:programDict forKey:program];
       
 34841 +  [ud synchronize];
       
 34842 +
       
 34843 +  // If we've specified an interval and we're within that time, don't ask the
       
 34844 +  // user if we should report
       
 34845 +  GTMLoggerDebug(@"Reporter Interval: %f", interval);
       
 34846 +  if (interval > spanSeconds) {
       
 34847 +    GTMLoggerDebug(@"Within throttling interval, not sending report");
       
 34848 +    return NO;
       
 34849 +  }
       
 34850 +  return YES;
       
 34851 +}
       
 34852 +
       
 34853 +- (BOOL)isOnDemand {
       
 34854 +  return [[parameters_ objectForKey:@BREAKPAD_ON_DEMAND]
       
 34855 +	   isEqualToString:@"YES"];
       
 34856 +}
       
 34857 +
       
 34858 +- (BOOL)shouldSubmitSilently {
       
 34859 +  return [[parameters_ objectForKey:@BREAKPAD_SKIP_CONFIRM]
       
 34860 +            isEqualToString:@"YES"];
       
 34861 +}
       
 34862 +
       
 34863 +- (BOOL)shouldRequestComments {
       
 34864 +  return [[parameters_ objectForKey:@BREAKPAD_REQUEST_COMMENTS]
       
 34865 +            isEqualToString:@"YES"];
       
 34866 +}
       
 34867 +
       
 34868 +- (BOOL)shouldRequestEmail {
       
 34869 +  return [[parameters_ objectForKey:@BREAKPAD_REQUEST_EMAIL]
       
 34870 +            isEqualToString:@"YES"];
       
 34871 +}
       
 34872 +
       
 34873 +- (NSString*)shortDialogMessage {
       
 34874 +  NSString *displayName = [parameters_ objectForKey:@BREAKPAD_PRODUCT_DISPLAY];
       
 34875 +  if (![displayName length])
       
 34876 +    displayName = [parameters_ objectForKey:@BREAKPAD_PRODUCT];
       
 34877 +
       
 34878 +  if ([self isOnDemand]) {
       
 34879 +    return [NSString
       
 34880 +             stringWithFormat:NSLocalizedString(@"noCrashDialogHeader", @""),
       
 34881 +             displayName];
       
 34882 +  } else {
       
 34883 +    return [NSString 
       
 34884 +             stringWithFormat:NSLocalizedString(@"crashDialogHeader", @""),
       
 34885 +             displayName];
       
 34886 +  }
       
 34887 +}
       
 34888 +
       
 34889 +- (NSString*)explanatoryDialogText {
       
 34890 +  NSString *displayName = [parameters_ objectForKey:@BREAKPAD_PRODUCT_DISPLAY];
       
 34891 +  if (![displayName length])
       
 34892 +    displayName = [parameters_ objectForKey:@BREAKPAD_PRODUCT];
       
 34893 +
       
 34894 +  NSString *vendor = [parameters_ objectForKey:@BREAKPAD_VENDOR];
       
 34895 +  if (![vendor length])
       
 34896 +    vendor = @"unknown vendor";
       
 34897 +
       
 34898 +  if ([self isOnDemand]) {
       
 34899 +    return [NSString
       
 34900 +             stringWithFormat:NSLocalizedString(@"noCrashDialogMsg", @""),
       
 34901 +             vendor, displayName];
       
 34902 +  } else {
       
 34903 +    return [NSString
       
 34904 +             stringWithFormat:NSLocalizedString(@"crashDialogMsg", @""),
       
 34905 +             vendor];
       
 34906 +  }
       
 34907 +}
       
 34908 +
       
 34909 +- (NSTimeInterval)messageTimeout {
       
 34910 +  // Get the timeout value for the notification.
       
 34911 +  NSTimeInterval timeout = [[parameters_ objectForKey:@BREAKPAD_CONFIRM_TIMEOUT]
       
 34912 +                              floatValue];
       
 34913 +  // Require a timeout of at least a minute (except 0, which means no timeout).
       
 34914 +  if (timeout > 0.001 && timeout < 60.0) {
       
 34915 +    timeout = 60.0;
       
 34916 +  }
       
 34917 +  return timeout;
       
 34918 +}
       
 34919 +
       
 34920 +- (void)createServerParameterDictionaries {
       
 34921 +  serverDictionary_ = [[NSMutableDictionary alloc] init];
       
 34922 +  socorroDictionary_ = [[NSMutableDictionary alloc] init];
       
 34923 +  googleDictionary_ = [[NSMutableDictionary alloc] init];
       
 34924 +  extraServerVars_ = [[NSMutableDictionary alloc] init];
       
 34925 +
       
 34926 +  [serverDictionary_ setObject:socorroDictionary_ forKey:kSocorroServerType];
       
 34927 +  [serverDictionary_ setObject:googleDictionary_ forKey:kGoogleServerType];
       
 34928 +
       
 34929 +  [googleDictionary_ setObject:@"ptime" forKey:@BREAKPAD_PROCESS_UP_TIME];
       
 34930 +  [googleDictionary_ setObject:@"email" forKey:@BREAKPAD_EMAIL];
       
 34931 +  [googleDictionary_ setObject:@"comments" forKey:@BREAKPAD_COMMENTS];
       
 34932 +  [googleDictionary_ setObject:@"prod" forKey:@BREAKPAD_PRODUCT];
       
 34933 +  [googleDictionary_ setObject:@"ver" forKey:@BREAKPAD_VERSION];
       
 34934 +
       
 34935 +  [socorroDictionary_ setObject:@"Comments" forKey:@BREAKPAD_COMMENTS];
       
 34936 +  [socorroDictionary_ setObject:@"CrashTime"
       
 34937 +                         forKey:@BREAKPAD_PROCESS_CRASH_TIME];
       
 34938 +  [socorroDictionary_ setObject:@"StartupTime"
       
 34939 +                         forKey:@BREAKPAD_PROCESS_START_TIME];
       
 34940 +  [socorroDictionary_ setObject:@"Version"
       
 34941 +                         forKey:@BREAKPAD_VERSION];
       
 34942 +  [socorroDictionary_ setObject:@"ProductName"
       
 34943 +                         forKey:@BREAKPAD_PRODUCT];
       
 34944 +  [socorroDictionary_ setObject:@"ProductName"
       
 34945 +                         forKey:@BREAKPAD_PRODUCT];
       
 34946 +}
       
 34947 +
       
 34948 +- (NSMutableDictionary *)dictionaryForServerType:(NSString *)serverType {
       
 34949 +  if (serverType == nil || [serverType length] == 0) {
       
 34950 +    return [serverDictionary_ objectForKey:kDefaultServerType];
       
 34951 +  }
       
 34952 +  return [serverDictionary_ objectForKey:serverType];
       
 34953 +}
       
 34954 +
       
 34955 +- (NSMutableDictionary *)urlParameterDictionary {
       
 34956 +  NSString *serverType = [parameters_ objectForKey:@BREAKPAD_SERVER_TYPE];
       
 34957 +  return [self dictionaryForServerType:serverType];
       
 34958 +
       
 34959 +}
       
 34960 +
       
 34961 +- (BOOL)populateServerDictionary:(NSMutableDictionary *)crashParameters {
       
 34962 +  NSDictionary *urlParameterNames = [self urlParameterDictionary];
       
 34963 +
       
 34964 +  id key;
       
 34965 +  NSEnumerator *enumerator = [parameters_ keyEnumerator];
       
 34966 +
       
 34967 +  while ((key = [enumerator nextObject])) {
       
 34968 +    // The key from parameters_ corresponds to a key in
       
 34969 +    // urlParameterNames.  The value in parameters_ gets stored in
       
 34970 +    // crashParameters with a key that is the value in
       
 34971 +    // urlParameterNames.
       
 34972 +
       
 34973 +    // For instance, if parameters_ has [PRODUCT_NAME => "FOOBAR"] and
       
 34974 +    // urlParameterNames has [PRODUCT_NAME => "pname"] the final HTTP
       
 34975 +    // URL parameter becomes [pname => "FOOBAR"].
       
 34976 +    NSString *breakpadParameterName = (NSString *)key;
       
 34977 +    NSString *urlParameter = [urlParameterNames
       
 34978 +                                   objectForKey:breakpadParameterName];
       
 34979 +    if (urlParameter) {
       
 34980 +      [crashParameters setObject:[parameters_ objectForKey:key]
       
 34981 +                          forKey:urlParameter];
       
 34982 +    }
       
 34983 +  }
       
 34984 +
       
 34985 +  // Now, add the parameters that were added by the application.
       
 34986 +  enumerator = [extraServerVars_ keyEnumerator];
       
 34987 +
       
 34988 +  while ((key = [enumerator nextObject])) {
       
 34989 +    NSString *urlParameterName = (NSString *)key;
       
 34990 +    NSString *urlParameterValue =
       
 34991 +      [extraServerVars_ objectForKey:urlParameterName];
       
 34992 +    [crashParameters setObject:urlParameterValue
       
 34993 +                        forKey:urlParameterName];
       
 34994 +  }
       
 34995 +  return YES;
       
 34996 +}
       
 34997 +
       
 34998 +- (void)addServerParameter:(id)value forKey:(NSString *)key {
       
 34999 +  [extraServerVars_ setObject:value forKey:key];
       
 35000 +}
       
 35001 +
       
 35002 +//=============================================================================
       
 35003 +- (void)report {
       
 35004 +  NSURL *url = [NSURL URLWithString:[parameters_ objectForKey:@BREAKPAD_URL]];
       
 35005 +  HTTPMultipartUpload *upload = [[HTTPMultipartUpload alloc] initWithURL:url];
       
 35006 +  NSMutableDictionary *uploadParameters = [NSMutableDictionary dictionary];
       
 35007 +
       
 35008 +  if (![self populateServerDictionary:uploadParameters]) {
       
 35009 +    return;
       
 35010 +  }
       
 35011 +
       
 35012 +  [upload setParameters:uploadParameters];
       
 35013 +
       
 35014 +  // Add minidump file
       
 35015 +  if (minidumpContents_) {
       
 35016 +    [upload addFileContents:minidumpContents_ name:@"upload_file_minidump"];
       
 35017 +
       
 35018 +    // Send it
       
 35019 +    NSError *error = nil;
       
 35020 +    NSData *data = [upload send:&error];
       
 35021 +    NSString *result = [[NSString alloc] initWithData:data
       
 35022 +                                         encoding:NSUTF8StringEncoding];
       
 35023 +    const char *reportID = "ERR";
       
 35024 +
       
 35025 +    if (error) {
       
 35026 +      fprintf(stderr, "Breakpad Reporter: Send Error: %s\n",
       
 35027 +              [[error description] UTF8String]);
       
 35028 +    } else {
       
 35029 +      NSCharacterSet *trimSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
       
 35030 +      reportID = [[result stringByTrimmingCharactersInSet:trimSet] UTF8String];
       
 35031 +    }
       
 35032 +
       
 35033 +    // rename the minidump file according to the id returned from the server
       
 35034 +    NSString *minidumpDir = [parameters_ objectForKey:@kReporterMinidumpDirectoryKey];
       
 35035 +    NSString *minidumpID = [parameters_ objectForKey:@kReporterMinidumpIDKey];
       
 35036 +
       
 35037 +    NSString *srcString = [NSString stringWithFormat:@"%@/%@.dmp",
       
 35038 +                                    minidumpDir, minidumpID];
       
 35039 +    NSString *destString = [NSString stringWithFormat:@"%@/%s.dmp",
       
 35040 +                                     minidumpDir, reportID];
       
 35041 +
       
 35042 +    const char *src = [srcString fileSystemRepresentation];
       
 35043 +    const char *dest = [destString fileSystemRepresentation];
       
 35044 +
       
 35045 +    if (rename(src, dest) == 0) {
       
 35046 +      GTMLoggerInfo(@"Breakpad Reporter: Renamed %s to %s after successful " \
       
 35047 +                    "upload",src, dest);
       
 35048 +    }
       
 35049 +    else {
       
 35050 +      // can't rename - don't worry - it's not important for users
       
 35051 +      GTMLoggerDebug(@"Breakpad Reporter: successful upload report ID = %s\n",
       
 35052 +                     reportID );
       
 35053 +    }
       
 35054 +    [result release];
       
 35055 +  }
       
 35056 +
       
 35057 +  if (logFileData_) {
       
 35058 +    HTTPMultipartUpload *logUpload = [[HTTPMultipartUpload alloc] initWithURL:url];
       
 35059 +
       
 35060 +    [uploadParameters setObject:@"log" forKey:@"type"];
       
 35061 +    [logUpload setParameters:uploadParameters];
       
 35062 +    [logUpload addFileContents:logFileData_ name:@"log"];
       
 35063 +
       
 35064 +    NSError *error = nil;
       
 35065 +    NSData *data = [logUpload send:&error];
       
 35066 +    NSString *result = [[NSString alloc] initWithData:data
       
 35067 +                                         encoding:NSUTF8StringEncoding];
       
 35068 +    [result release];
       
 35069 +    [logUpload release];
       
 35070 +  }
       
 35071 +
       
 35072 +  [upload release];
       
 35073 +}
       
 35074 +
       
 35075 +//=============================================================================
       
 35076 +- (void)dealloc {
       
 35077 +  [parameters_ release];
       
 35078 +  [minidumpContents_ release];
       
 35079 +  [logFileData_ release];
       
 35080 +  [googleDictionary_ release];
       
 35081 +  [socorroDictionary_ release];
       
 35082 +  [serverDictionary_ release];
       
 35083 +  [extraServerVars_ release];
       
 35084 +  [super dealloc];
       
 35085 +}
       
 35086 +
       
 35087 +- (void)awakeFromNib {
       
 35088 +  [emailEntryField_ setMaximumLength:kEmailMaxLength];
       
 35089 +  [commentsEntryField_ setMaximumLength:kUserCommentsMaxLength];
       
 35090 +}
       
 35091 +
       
 35092 +@end
       
 35093 +
       
 35094 +//=============================================================================
       
 35095 +@implementation LengthLimitingTextField
       
 35096 +
       
 35097 +- (void) setMaximumLength:(unsigned int)maxLength {
       
 35098 +  maximumLength_ = maxLength;
       
 35099 +}
       
 35100 +
       
 35101 +// This is the method we're overriding in NSTextField, which lets us
       
 35102 +// limit the user's input if it makes the string too long.
       
 35103 +- (BOOL)       textView:(NSTextView *)textView
       
 35104 +shouldChangeTextInRange:(NSRange)affectedCharRange
       
 35105 +      replacementString:(NSString *)replacementString {
       
 35106 +
       
 35107 +  // Sometimes the range comes in invalid, so reject if we can't
       
 35108 +  // figure out if the replacement text is too long.
       
 35109 +  if (affectedCharRange.location == NSNotFound) {
       
 35110 +    return NO;
       
 35111 +  }
       
 35112 +  // Figure out what the new string length would be, taking into
       
 35113 +  // account user selections.
       
 35114 +  int newStringLength =
       
 35115 +    [[textView string] length] - affectedCharRange.length +
       
 35116 +    [replacementString length];
       
 35117 +  if (newStringLength > maximumLength_) {
       
 35118 +    return NO;
       
 35119 +  } else {
       
 35120 +    return YES;
       
 35121 +  }
       
 35122 +}
       
 35123 +
       
 35124 +// Cut, copy, and paste have to be caught specifically since there is no menu.
       
 35125 +- (BOOL)performKeyEquivalent:(NSEvent*)event {
       
 35126 +  // Only handle the key equivalent if |self| is the text field with focus.
       
 35127 +  NSText* fieldEditor = [self currentEditor];
       
 35128 +  if (fieldEditor != nil) {
       
 35129 +    // Check for a single "Command" modifier
       
 35130 +    unsigned int modifiers = [event modifierFlags];
       
 35131 +    modifiers &= NSDeviceIndependentModifierFlagsMask;
       
 35132 +    if (modifiers == NSCommandKeyMask) {
       
 35133 +      // Now, check for Select All, Cut, Copy, or Paste key equivalents.
       
 35134 +      NSString* characters = [event characters];
       
 35135 +      // Select All is Command-A.
       
 35136 +      if ([characters isEqualToString:@"a"]) {
       
 35137 +        [fieldEditor selectAll:self];
       
 35138 +        return YES;
       
 35139 +      // Cut is Command-X.
       
 35140 +      } else if ([characters isEqualToString:@"x"]) {
       
 35141 +        [fieldEditor cut:self];
       
 35142 +        return YES;
       
 35143 +      // Copy is Command-C.
       
 35144 +      } else if ([characters isEqualToString:@"c"]) {
       
 35145 +        [fieldEditor copy:self];
       
 35146 +        return YES;
       
 35147 +      // Paste is Command-V.
       
 35148 +      } else if ([characters isEqualToString:@"v"]) {
       
 35149 +        [fieldEditor paste:self];
       
 35150 +        return YES;
       
 35151 +      }
       
 35152 +    }
       
 35153 +  }
       
 35154 +  // Let the super class handle the rest (e.g. Command-Period will cancel).
       
 35155 +  return [super performKeyEquivalent:event];
       
 35156 +}
       
 35157 +
       
 35158 +@end
       
 35159 +
       
 35160 +//=============================================================================
       
 35161 +int main(int argc, const char *argv[]) {
       
 35162 +  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
       
 35163 +#if DEBUG
       
 35164 +  // Log to stderr in debug builds.
       
 35165 +  [GTMLogger setSharedLogger:[GTMLogger standardLoggerWithStderr]];
       
 35166 +#endif
       
 35167 +  GTMLoggerDebug(@"Reporter Launched, argc=%d", argc);
       
 35168 +  // The expectation is that there will be one argument which is the path
       
 35169 +  // to the configuration file
       
 35170 +  if (argc != 2) {
       
 35171 +    exit(1);
       
 35172 +  }
       
 35173 +
       
 35174 +  // Open the file before (potentially) switching to console user
       
 35175 +  int configFile = open(argv[1], O_RDONLY, 0600);
       
 35176 +
       
 35177 +  if (configFile == -1) {
       
 35178 +    GTMLoggerDebug(@"Couldn't open config file %s - %s",
       
 35179 +                   argv[1],
       
 35180 +                   strerror(errno));
       
 35181 +  }
       
 35182 +
       
 35183 +  // we want to avoid a build-up of old config files even if they
       
 35184 +  // have been incorrectly written by the framework
       
 35185 +  unlink(argv[1]);
       
 35186 +
       
 35187 +  if (configFile == -1) {
       
 35188 +    GTMLoggerDebug(@"Couldn't unlink config file %s - %s",
       
 35189 +                   argv[1],
       
 35190 +                   strerror(errno));
       
 35191 +    exit(1);
       
 35192 +  }
       
 35193 +
       
 35194 +  Reporter *reporter = [[Reporter alloc] initWithConfigurationFD:configFile];
       
 35195 +
       
 35196 +  // Gather the configuration data
       
 35197 +  if (![reporter readConfigurationData]) {
       
 35198 +    GTMLoggerDebug(@"reporter readConfigurationData failed");
       
 35199 +    exit(1);
       
 35200 +  }
       
 35201 +
       
 35202 +  // Read the minidump into memory before we (potentially) switch from the
       
 35203 +  // root user
       
 35204 +  [reporter readMinidumpData];
       
 35205 +
       
 35206 +  [reporter readLogFileData];
       
 35207 +
       
 35208 +  // only submit a report if we have not recently crashed in the past
       
 35209 +  BOOL shouldSubmitReport = [reporter reportIntervalElapsed];
       
 35210 +  BOOL okayToSend = NO;
       
 35211 +
       
 35212 +  // ask user if we should send
       
 35213 +  if (shouldSubmitReport) {
       
 35214 +    if ([reporter shouldSubmitSilently]) {
       
 35215 +      GTMLoggerDebug(@"Skipping confirmation and sending report");
       
 35216 +      okayToSend = YES;
       
 35217 +    } else {
       
 35218 +      okayToSend = [reporter askUserPermissionToSend];
       
 35219 +    }
       
 35220 +  }
       
 35221 +
       
 35222 +  // If we're running as root, switch over to nobody
       
 35223 +  if (getuid() == 0 || geteuid() == 0) {
       
 35224 +    struct passwd *pw = getpwnam("nobody");
       
 35225 +
       
 35226 +    // If we can't get a non-root uid, don't send the report
       
 35227 +    if (!pw) {
       
 35228 +      GTMLoggerDebug(@"!pw - %s", strerror(errno));
       
 35229 +      exit(0);
       
 35230 +    }
       
 35231 +
       
 35232 +    if (setgid(pw->pw_gid) == -1) {
       
 35233 +      GTMLoggerDebug(@"setgid(pw->pw_gid) == -1 - %s", strerror(errno));
       
 35234 +      exit(0);
       
 35235 +    }
       
 35236 +
       
 35237 +    if (setuid(pw->pw_uid) == -1) {
       
 35238 +      GTMLoggerDebug(@"setuid(pw->pw_uid) == -1 - %s", strerror(errno));
       
 35239 +      exit(0);
       
 35240 +    }
       
 35241 +  }
       
 35242 +  else {
       
 35243 +     GTMLoggerDebug(@"getuid() !=0 || geteuid() != 0");
       
 35244 +  }
       
 35245 +
       
 35246 +  if (okayToSend && shouldSubmitReport) {
       
 35247 +    GTMLoggerDebug(@"Sending Report");
       
 35248 +    [reporter report];
       
 35249 +    GTMLoggerDebug(@"Report Sent!");
       
 35250 +  } else {
       
 35251 +    GTMLoggerDebug(@"Not sending crash report okayToSend=%d, "\
       
 35252 +                     "shouldSubmitReport=%d", okayToSend, shouldSubmitReport);
       
 35253 +  }
       
 35254 +
       
 35255 +  GTMLoggerDebug(@"Exiting with no errors");
       
 35256 +  // Cleanup
       
 35257 +  [reporter release];
       
 35258 +  [pool release];
       
 35259 +  return 0;
       
 35260 +}
       
 35261 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/sender/goArrow.png b/toolkit/crashreporter/google-breakpad/src/client/mac/sender/goArrow.png
       
 35262 new file mode 100644
       
 35263 index 0000000000000000000000000000000000000000..f318a56711d43d1b8925f1c26e709da0872dd607
       
 35264 GIT binary patch
       
 35265 literal 3591
       
 35266 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
       
 35335 N002ovPDHLkV1jxL0`LF;
       
 35336 
       
 35337 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.h b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.h
       
 35338 new file mode 100644
       
 35339 --- /dev/null
       
 35340 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.h
       
 35341 @@ -0,0 +1,65 @@
       
 35342 +// Copyright (c) 2006, Google Inc.
       
 35343 +// All rights reserved.
       
 35344 +//
       
 35345 +// Redistribution and use in source and binary forms, with or without
       
 35346 +// modification, are permitted provided that the following conditions are
       
 35347 +// met:
       
 35348 +//
       
 35349 +//     * Redistributions of source code must retain the above copyright
       
 35350 +// notice, this list of conditions and the following disclaimer.
       
 35351 +//     * Redistributions in binary form must reproduce the above
       
 35352 +// copyright notice, this list of conditions and the following disclaimer
       
 35353 +// in the documentation and/or other materials provided with the
       
 35354 +// distribution.
       
 35355 +//     * Neither the name of Google Inc. nor the names of its
       
 35356 +// contributors may be used to endorse or promote products derived from
       
 35357 +// this software without specific prior written permission.
       
 35358 +//
       
 35359 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 35360 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 35361 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 35362 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 35363 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 35364 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 35365 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 35366 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 35367 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 35368 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 35369 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 35370 +
       
 35371 +#import <Cocoa/Cocoa.h>
       
 35372 +
       
 35373 +#import <Breakpad/Breakpad.h>
       
 35374 +
       
 35375 +enum BreakpadForkBehavior {
       
 35376 +  DONOTHING = 0,
       
 35377 +  UNINSTALL,
       
 35378 +  RESETEXCEPTIONPORT
       
 35379 +};
       
 35380 +
       
 35381 +enum BreakpadForkTestCrashPoint {
       
 35382 +  DURINGLAUNCH = 5,
       
 35383 +  AFTERLAUNCH = 6,
       
 35384 +  BETWEENFORKEXEC = 7
       
 35385 +};
       
 35386 +
       
 35387 +@interface Controller : NSObject {
       
 35388 +  IBOutlet NSWindow *window_;
       
 35389 +  IBOutlet NSWindow *forkTestOptions_;
       
 35390 +
       
 35391 +  BreakpadRef breakpad_;
       
 35392 +
       
 35393 +  enum BreakpadForkBehavior bpForkOption;
       
 35394 +
       
 35395 +  BOOL useVFork;
       
 35396 +  enum BreakpadForkTestCrashPoint progCrashPoint;
       
 35397 +}
       
 35398 +
       
 35399 +- (IBAction)crash:(id)sender;
       
 35400 +- (IBAction)forkTestOptions:(id)sender;
       
 35401 +- (IBAction)forkTestGo:(id)sender;
       
 35402 +- (IBAction)showForkTestWindow:(id) sender;
       
 35403 +- (void)generateReportWithoutCrash:(id)sender;
       
 35404 +- (void)awakeFromNib;
       
 35405 +
       
 35406 +@end
       
 35407 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.m b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.m
       
 35408 new file mode 100644
       
 35409 --- /dev/null
       
 35410 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Controller.m
       
 35411 @@ -0,0 +1,260 @@
       
 35412 +// Copyright (c) 2006, Google Inc.
       
 35413 +// All rights reserved.
       
 35414 +//
       
 35415 +// Redistribution and use in source and binary forms, with or without
       
 35416 +// modification, are permitted provided that the following conditions are
       
 35417 +// met:
       
 35418 +//
       
 35419 +//     * Redistributions of source code must retain the above copyright
       
 35420 +// notice, this list of conditions and the following disclaimer.
       
 35421 +//     * Redistributions in binary form must reproduce the above
       
 35422 +// copyright notice, this list of conditions and the following disclaimer
       
 35423 +// in the documentation and/or other materials provided with the
       
 35424 +// distribution.
       
 35425 +//     * Neither the name of Google Inc. nor the names of its
       
 35426 +// contributors may be used to endorse or promote products derived from
       
 35427 +// this software without specific prior written permission.
       
 35428 +//
       
 35429 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 35430 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 35431 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 35432 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 35433 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 35434 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 35435 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 35436 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 35437 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 35438 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 35439 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 35440 +
       
 35441 +#import <Breakpad/Breakpad.h>
       
 35442 +
       
 35443 +#import "Controller.h"
       
 35444 +#import "TestClass.h"
       
 35445 +#include <unistd.h>
       
 35446 +#include <mach/mach.h>
       
 35447 +
       
 35448 +@implementation Controller
       
 35449 +
       
 35450 +- (void)causeCrash {
       
 35451 +  float *aPtr = nil;
       
 35452 +  NSLog(@"Crash!");
       
 35453 +  NSLog(@"Bad programmer: %f", *aPtr);
       
 35454 +}
       
 35455 +
       
 35456 +- (void)generateReportWithoutCrash:(id)sender {
       
 35457 +  BreakpadGenerateAndSendReport(breakpad_);
       
 35458 +}
       
 35459 +
       
 35460 +- (IBAction)showForkTestWindow:(id) sender {
       
 35461 +  [forkTestOptions_ setIsVisible:YES];
       
 35462 +}
       
 35463 +
       
 35464 +- (IBAction)forkTestOptions:(id)sender {
       
 35465 +  int tag = [[sender selectedCell] tag];
       
 35466 +  NSLog(@"sender tag: %d", tag);
       
 35467 +  if (tag <= 2) {
       
 35468 +    bpForkOption = tag;
       
 35469 +  }
       
 35470 +
       
 35471 +  if (tag == 3) {
       
 35472 +    useVFork = NO;
       
 35473 +  }
       
 35474 +
       
 35475 +  if (tag == 4) {
       
 35476 +    useVFork = YES;
       
 35477 +  }
       
 35478 +
       
 35479 +  if (tag >= 5 && tag <= 7) {
       
 35480 +    progCrashPoint = tag;
       
 35481 +  }
       
 35482 +
       
 35483 +}
       
 35484 +
       
 35485 +- (IBAction)forkTestGo:(id)sender {
       
 35486 +
       
 35487 +  NSString *resourcePath = [[NSBundle bundleForClass:
       
 35488 +                                        [self class]] resourcePath];
       
 35489 +  NSString *execProgname;
       
 35490 +  if (progCrashPoint == DURINGLAUNCH) {
       
 35491 +    execProgname = [resourcePath stringByAppendingString:@"/crashduringload"];
       
 35492 +  } else if (progCrashPoint == AFTERLAUNCH) {
       
 35493 +    execProgname = [resourcePath stringByAppendingString:@"/crashInMain"];
       
 35494 +  }
       
 35495 +
       
 35496 +  const char *progName = NULL;
       
 35497 +  if (progCrashPoint != BETWEENFORKEXEC) {
       
 35498 +    progName = [execProgname UTF8String];
       
 35499 +  }
       
 35500 +
       
 35501 +  int pid;
       
 35502 +
       
 35503 +  if (bpForkOption == UNINSTALL) {
       
 35504 +    BreakpadRelease(breakpad_);
       
 35505 +  }
       
 35506 +
       
 35507 +  if (useVFork) {
       
 35508 +    pid = vfork();
       
 35509 +  } else {
       
 35510 +    pid = fork();
       
 35511 +  }
       
 35512 +
       
 35513 +  if (pid == 0) {
       
 35514 +    sleep(3);
       
 35515 +    NSLog(@"Child continuing");
       
 35516 +    FILE *fd = fopen("/tmp/childlog.txt","wt");
       
 35517 +    kern_return_t kr;
       
 35518 +    if (bpForkOption == RESETEXCEPTIONPORT) {
       
 35519 +      kr = task_set_exception_ports(mach_task_self(),
       
 35520 +                               EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_INSTRUCTION |
       
 35521 +                               EXC_MASK_ARITHMETIC | EXC_MASK_BREAKPOINT,
       
 35522 +                               MACH_PORT_NULL,
       
 35523 +                               EXCEPTION_DEFAULT,
       
 35524 +                               THREAD_STATE_NONE);
       
 35525 +      fprintf(fd,"task_set_exception_ports returned %d\n", kr);
       
 35526 +    }
       
 35527 +
       
 35528 +    if (progCrashPoint == BETWEENFORKEXEC) {
       
 35529 +      fprintf(fd,"crashing post-fork\n");
       
 35530 +      int *a = NULL;
       
 35531 +      printf("%d\n",*a++);
       
 35532 +    }
       
 35533 +
       
 35534 +    fprintf(fd,"about to call exec with %s\n", progName);
       
 35535 +    fclose(fd);
       
 35536 +    int i = execl(progName, progName, NULL);
       
 35537 +    fprintf(fd, "exec returned! %d\n", i);
       
 35538 +    fclose(fd);
       
 35539 +  }
       
 35540 +}
       
 35541 +
       
 35542 +- (IBAction)crash:(id)sender {
       
 35543 +  int tag = [sender tag];
       
 35544 +
       
 35545 +  if (tag == 1) {
       
 35546 +    [NSObject cancelPreviousPerformRequestsWithTarget:self];
       
 35547 +    [self performSelector:@selector(causeCrash) withObject:nil afterDelay:10];
       
 35548 +    [sender setState:NSOnState];
       
 35549 +    return;
       
 35550 +  }
       
 35551 +
       
 35552 +  if (tag == 2 && breakpad_) {
       
 35553 +    BreakpadRelease(breakpad_);
       
 35554 +    breakpad_ = NULL;
       
 35555 +    return;
       
 35556 +  }
       
 35557 +
       
 35558 +  [self causeCrash];
       
 35559 +}
       
 35560 +
       
 35561 +- (void)anotherThread {
       
 35562 +  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
       
 35563 +  TestClass *tc = [[TestClass alloc] init];
       
 35564 +
       
 35565 +  [tc wait];
       
 35566 +
       
 35567 +  [pool release];
       
 35568 +}
       
 35569 +
       
 35570 +- (void)awakeFromNib {
       
 35571 +  NSBundle *bundle = [NSBundle mainBundle];
       
 35572 +  NSDictionary *info = [bundle infoDictionary];
       
 35573 +
       
 35574 +
       
 35575 +  breakpad_ = BreakpadCreate(info);
       
 35576 +
       
 35577 +  // Do some unit tests with keys
       
 35578 +  // first a series of bogus values
       
 35579 +  BreakpadSetKeyValue(breakpad_, nil, @"bad2");
       
 35580 +  BreakpadSetKeyValue(nil, @"bad3", @"bad3");
       
 35581 +
       
 35582 +  // Now some good ones
       
 35583 +  BreakpadSetKeyValue(breakpad_,@"key1", @"value1");
       
 35584 +  BreakpadSetKeyValue(breakpad_,@"key2", @"value2");
       
 35585 +  BreakpadSetKeyValue(breakpad_,@"key3", @"value3");
       
 35586 +
       
 35587 +  // Look for a bogus one that we didn't try to set
       
 35588 +  NSString *test = BreakpadKeyValue(breakpad_, @"bad4");
       
 35589 +  if (test) {
       
 35590 +    NSLog(@"Bad BreakpadKeyValue (bad4)");
       
 35591 +  }
       
 35592 +
       
 35593 +  // Look for a bogus one we did try to set
       
 35594 +  test = BreakpadKeyValue(breakpad_, @"bad1");
       
 35595 +  if (test) {
       
 35596 +    NSLog(@"Bad BreakpadKeyValue (bad1)");
       
 35597 +  }
       
 35598 +
       
 35599 +  // Test some bad args for BreakpadKeyValue
       
 35600 +  test = BreakpadKeyValue(nil, @"bad5");
       
 35601 +  if (test) {
       
 35602 +    NSLog(@"Bad BreakpadKeyValue (bad5)");
       
 35603 +  }
       
 35604 +
       
 35605 +  test = BreakpadKeyValue(breakpad_, nil);
       
 35606 +  if (test) {
       
 35607 +    NSLog(@"Bad BreakpadKeyValue (nil)");
       
 35608 +  }
       
 35609 +
       
 35610 +  // Find some we did set
       
 35611 +  test = BreakpadKeyValue(breakpad_, @"key1");
       
 35612 +  if (![test isEqualToString:@"value1"]) {
       
 35613 +    NSLog(@"Can't find BreakpadKeyValue (key1)");
       
 35614 +  }
       
 35615 +  test = BreakpadKeyValue(breakpad_, @"key2");
       
 35616 +  if (![test isEqualToString:@"value2"]) {
       
 35617 +    NSLog(@"Can't find BreakpadKeyValue (key2)");
       
 35618 +  }
       
 35619 +  test = BreakpadKeyValue(breakpad_, @"key3");
       
 35620 +  if (![test isEqualToString:@"value3"]) {
       
 35621 +    NSLog(@"Can't find BreakpadKeyValue (key3)");
       
 35622 +  }
       
 35623 +
       
 35624 +  // Bad args for BreakpadRemoveKeyValue
       
 35625 +  BreakpadRemoveKeyValue(nil, @"bad6");
       
 35626 +  BreakpadRemoveKeyValue(breakpad_, nil);
       
 35627 +
       
 35628 +  // Remove one that is valid
       
 35629 +  BreakpadRemoveKeyValue(breakpad_, @"key3");
       
 35630 +
       
 35631 +  // Try and find it
       
 35632 +  test = BreakpadKeyValue(breakpad_, @"key3");
       
 35633 +  if (test) {
       
 35634 +    NSLog(@"Shouldn't find BreakpadKeyValue (key3)");
       
 35635 +  }
       
 35636 +
       
 35637 +  // Try and remove it again
       
 35638 +  BreakpadRemoveKeyValue(breakpad_, @"key3");
       
 35639 +
       
 35640 +  // Try removal by setting to nil
       
 35641 +  BreakpadSetKeyValue(breakpad_,@"key2", nil);
       
 35642 +  // Try and find it
       
 35643 +  test = BreakpadKeyValue(breakpad_, @"key2");
       
 35644 +  if (test) {
       
 35645 +    NSLog(@"Shouldn't find BreakpadKeyValue (key2)");
       
 35646 +  }
       
 35647 +
       
 35648 +  BreakpadAddUploadParameter(breakpad_,
       
 35649 +                             @"MeaningOfLife",
       
 35650 +                             @"42");
       
 35651 +  [NSThread detachNewThreadSelector:@selector(anotherThread)
       
 35652 +                           toTarget:self withObject:nil];
       
 35653 +
       
 35654 +  NSUserDefaults *args = [NSUserDefaults standardUserDefaults];
       
 35655 +
       
 35656 +  // If the user specified autocrash on the command line, toggle
       
 35657 +  // Breakpad to not confirm and crash immediately.  This is for
       
 35658 +  // automated testing.
       
 35659 +  if ([args boolForKey:@"autocrash"]) {
       
 35660 +    BreakpadSetKeyValue(breakpad_,
       
 35661 +                        @BREAKPAD_SKIP_CONFIRM,
       
 35662 +                        @"YES");
       
 35663 +    [self causeCrash];
       
 35664 +  }
       
 35665 +
       
 35666 +  progCrashPoint = DURINGLAUNCH;
       
 35667 +  [window_ center];
       
 35668 +  [window_ makeKeyAndOrderFront:self];
       
 35669 +}
       
 35670 +
       
 35671 +@end
       
 35672 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/InfoPlist.strings b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/InfoPlist.strings
       
 35673 new file mode 100644
       
 35674 index 0000000000000000000000000000000000000000..b8c6c6bf0ba1a55cea7e4656822a4ee5d65546b8
       
 35675 GIT binary patch
       
 35676 literal 192
       
 35677 zc$_Vb%?`m(5Ju0sPtjO5g4kGyl?4*9;0dZ)1Z~qI;f=f`jvJZG&;90`bKf8OB*ZMK
       
 35678 z$VfSJ<Vns>?QU;qRVqq*Y%i<}UxjmzI`~_zswdr#;7Vjh#)=JdZd~M+tlg(_Q?_2^
       
 35679 kOeNG_G!ph40%Kx!cv)v|EA^kV`~Ncw(~yBN(l;jh0-VJm6#xJL
       
 35680 
       
 35681 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.nib/classes.nib b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.nib/classes.nib
       
 35682 new file mode 100644
       
 35683 --- /dev/null
       
 35684 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.nib/classes.nib
       
 35685 @@ -0,0 +1,47 @@
       
 35686 +<?xml version="1.0" encoding="UTF-8"?>
       
 35687 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 35688 +<plist version="1.0">
       
 35689 +<dict>
       
 35690 +	<key>IBClasses</key>
       
 35691 +	<array>
       
 35692 +		<dict>
       
 35693 +			<key>ACTIONS</key>
       
 35694 +			<dict>
       
 35695 +				<key>crash</key>
       
 35696 +				<string>id</string>
       
 35697 +				<key>forkTestGo</key>
       
 35698 +				<string>id</string>
       
 35699 +				<key>forkTestOptions</key>
       
 35700 +				<string>id</string>
       
 35701 +				<key>generateReportWithoutCrash</key>
       
 35702 +				<string>id</string>
       
 35703 +				<key>showForkTestWindow</key>
       
 35704 +				<string>id</string>
       
 35705 +			</dict>
       
 35706 +			<key>CLASS</key>
       
 35707 +			<string>Controller</string>
       
 35708 +			<key>LANGUAGE</key>
       
 35709 +			<string>ObjC</string>
       
 35710 +			<key>OUTLETS</key>
       
 35711 +			<dict>
       
 35712 +				<key>forkTestOptions_</key>
       
 35713 +				<string>NSWindow</string>
       
 35714 +				<key>window_</key>
       
 35715 +				<string>NSWindow</string>
       
 35716 +			</dict>
       
 35717 +			<key>SUPERCLASS</key>
       
 35718 +			<string>NSObject</string>
       
 35719 +		</dict>
       
 35720 +		<dict>
       
 35721 +			<key>CLASS</key>
       
 35722 +			<string>FirstResponder</string>
       
 35723 +			<key>LANGUAGE</key>
       
 35724 +			<string>ObjC</string>
       
 35725 +			<key>SUPERCLASS</key>
       
 35726 +			<string>NSObject</string>
       
 35727 +		</dict>
       
 35728 +	</array>
       
 35729 +	<key>IBVersion</key>
       
 35730 +	<string>1</string>
       
 35731 +</dict>
       
 35732 +</plist>
       
 35733 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.nib/info.nib b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.nib/info.nib
       
 35734 new file mode 100644
       
 35735 --- /dev/null
       
 35736 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.nib/info.nib
       
 35737 @@ -0,0 +1,22 @@
       
 35738 +<?xml version="1.0" encoding="UTF-8"?>
       
 35739 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 35740 +<plist version="1.0">
       
 35741 +<dict>
       
 35742 +	<key>IBFramework Version</key>
       
 35743 +	<string>670</string>
       
 35744 +	<key>IBLastKnownRelativeProjectPath</key>
       
 35745 +	<string>../GoogleBreakpadTest.xcodeproj</string>
       
 35746 +	<key>IBOldestOS</key>
       
 35747 +	<integer>5</integer>
       
 35748 +	<key>IBOpenObjects</key>
       
 35749 +	<array>
       
 35750 +		<integer>221</integer>
       
 35751 +		<integer>29</integer>
       
 35752 +		<integer>2</integer>
       
 35753 +	</array>
       
 35754 +	<key>IBSystem Version</key>
       
 35755 +	<string>9F33</string>
       
 35756 +	<key>targetFramework</key>
       
 35757 +	<string>IBCocoaFramework</string>
       
 35758 +</dict>
       
 35759 +</plist>
       
 35760 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.nib/keyedobjects.nib b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/English.lproj/MainMenu.nib/keyedobjects.nib
       
 35761 new file mode 100644
       
 35762 index 0000000000000000000000000000000000000000..1c6baaf7b83cf03445585669d076ca65adf51031
       
 35763 GIT binary patch
       
 35764 literal 34374
       
 35765 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
       
 36166 
       
 36167 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Info.plist b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Info.plist
       
 36168 new file mode 100644
       
 36169 --- /dev/null
       
 36170 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/Info.plist
       
 36171 @@ -0,0 +1,55 @@
       
 36172 +<?xml version="1.0" encoding="UTF-8"?>
       
 36173 +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
       
 36174 +<plist version="1.0">
       
 36175 +<dict>
       
 36176 +	<key>CFBundleDevelopmentRegion</key>
       
 36177 +	<string>English</string>
       
 36178 +	<key>CFBundleExecutable</key>
       
 36179 +	<string>${EXECUTABLE_NAME}</string>
       
 36180 +	<key>CFBundleIconFile</key>
       
 36181 +	<string>bomb</string>
       
 36182 +	<key>CFBundleIdentifier</key>
       
 36183 +	<string>com.Google.BreakpadTest</string>
       
 36184 +	<key>CFBundleInfoDictionaryVersion</key>
       
 36185 +	<string>6.0</string>
       
 36186 +	<key>CFBundleName</key>
       
 36187 +	<string>${PRODUCT_NAME}</string>
       
 36188 +	<key>CFBundlePackageType</key>
       
 36189 +	<string>APPL</string>
       
 36190 +	<key>CFBundleSignature</key>
       
 36191 +	<string>????</string>
       
 36192 +	<key>CFBundleVersion</key>
       
 36193 +	<string>1.0</string>
       
 36194 +	<key>NSMainNibFile</key>
       
 36195 +	<string>MainMenu</string>
       
 36196 +	<key>NSPrincipalClass</key>
       
 36197 +	<string>NSApplication</string>
       
 36198 +	<key>BreakpadProductDisplay</key>
       
 36199 +	<string>Breakpad Tester</string>
       
 36200 +	<key>BreakpadProduct</key>
       
 36201 +	<string>Breakpad_Tester</string>
       
 36202 +	<key>BreakpadVersion</key>
       
 36203 +	<string>1.2.3.4</string>
       
 36204 +	<key>BreakpadReportInterval</key>
       
 36205 +	<string>10</string>
       
 36206 +	<key>BreakpadSkipConfirm</key>
       
 36207 +	<string>NO</string>
       
 36208 +	<key>BreakpadSendAndExit</key>
       
 36209 +	<string>YES</string>
       
 36210 +	<key>BreakpadRequestEmail</key>
       
 36211 +	<string>YES</string>
       
 36212 +	<key>BreakpadRequestComments</key>
       
 36213 +	<string>YES</string>
       
 36214 +	<key>BreakpadVendor</key>
       
 36215 +	<string>Foo Bar Corp, Incorporated, LTD, LLC</string>
       
 36216 +	<key>BreakpadServerParameters</key>
       
 36217 +	<dict>
       
 36218 +	  <key>Param1</key>
       
 36219 +	  <string>Value1</string>
       
 36220 +	  <key>Param2</key>
       
 36221 +	  <string>Value2</string>
       
 36222 +	</dict>
       
 36223 +	<key>LSUIElement</key>
       
 36224 +	<string>1</string>
       
 36225 +</dict>
       
 36226 +</plist>
       
 36227 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.h b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.h
       
 36228 new file mode 100644
       
 36229 --- /dev/null
       
 36230 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.h
       
 36231 @@ -0,0 +1,37 @@
       
 36232 +// Copyright (c) 2006, Google Inc.
       
 36233 +// All rights reserved.
       
 36234 +//
       
 36235 +// Redistribution and use in source and binary forms, with or without
       
 36236 +// modification, are permitted provided that the following conditions are
       
 36237 +// met:
       
 36238 +//
       
 36239 +//     * Redistributions of source code must retain the above copyright
       
 36240 +// notice, this list of conditions and the following disclaimer.
       
 36241 +//     * Redistributions in binary form must reproduce the above
       
 36242 +// copyright notice, this list of conditions and the following disclaimer
       
 36243 +// in the documentation and/or other materials provided with the
       
 36244 +// distribution.
       
 36245 +//     * Neither the name of Google Inc. nor the names of its
       
 36246 +// contributors may be used to endorse or promote products derived from
       
 36247 +// this software without specific prior written permission.
       
 36248 +//
       
 36249 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 36250 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 36251 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 36252 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 36253 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 36254 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 36255 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 36256 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 36257 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 36258 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 36259 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 36260 +
       
 36261 +#import <Cocoa/Cocoa.h>
       
 36262 +
       
 36263 +@interface TestClass : NSObject {
       
 36264 +}
       
 36265 +
       
 36266 +- (void)wait;
       
 36267 +
       
 36268 +@end
       
 36269 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.mm b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.mm
       
 36270 new file mode 100644
       
 36271 --- /dev/null
       
 36272 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/TestClass.mm
       
 36273 @@ -0,0 +1,95 @@
       
 36274 +// Copyright (c) 2006, Google Inc.
       
 36275 +// All rights reserved.
       
 36276 +//
       
 36277 +// Redistribution and use in source and binary forms, with or without
       
 36278 +// modification, are permitted provided that the following conditions are
       
 36279 +// met:
       
 36280 +//
       
 36281 +//     * Redistributions of source code must retain the above copyright
       
 36282 +// notice, this list of conditions and the following disclaimer.
       
 36283 +//     * Redistributions in binary form must reproduce the above
       
 36284 +// copyright notice, this list of conditions and the following disclaimer
       
 36285 +// in the documentation and/or other materials provided with the
       
 36286 +// distribution.
       
 36287 +//     * Neither the name of Google Inc. nor the names of its
       
 36288 +// contributors may be used to endorse or promote products derived from
       
 36289 +// this software without specific prior written permission.
       
 36290 +//
       
 36291 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 36292 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 36293 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 36294 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 36295 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 36296 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 36297 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 36298 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 36299 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 36300 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 36301 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 36302 +
       
 36303 +#include <unistd.h>
       
 36304 +
       
 36305 +#import "TestClass.h"
       
 36306 +
       
 36307 +struct AStruct {
       
 36308 +  int x;
       
 36309 +  float y;
       
 36310 +  double z;
       
 36311 +};
       
 36312 +
       
 36313 +class InternalTestClass {
       
 36314 + public:
       
 36315 +  InternalTestClass(int a) : a_(a) {}
       
 36316 +  ~InternalTestClass() {}
       
 36317 +
       
 36318 +  void snooze(float a);
       
 36319 +  void snooze(int a);
       
 36320 +  int snooze(int a, float b);
       
 36321 +
       
 36322 + protected:
       
 36323 +  int a_;
       
 36324 +  AStruct s_;
       
 36325 +
       
 36326 +  static void InternalFunction(AStruct &s);
       
 36327 +  static float kStaticFloatValue;
       
 36328 +};
       
 36329 +
       
 36330 +void InternalTestClass::snooze(float a) {
       
 36331 +  InternalFunction(s_);
       
 36332 +  sleep(a_ * a);
       
 36333 +}
       
 36334 +
       
 36335 +void InternalTestClass::snooze(int a) {
       
 36336 +  InternalFunction(s_);
       
 36337 +  sleep(a_ * a);
       
 36338 +}
       
 36339 +
       
 36340 +int InternalTestClass::snooze(int a, float b) {
       
 36341 +  InternalFunction(s_);
       
 36342 +  sleep(a_ * a * b);
       
 36343 +
       
 36344 +  return 33;
       
 36345 +}
       
 36346 +
       
 36347 +void InternalTestClass::InternalFunction(AStruct &s) {
       
 36348 +  s.x = InternalTestClass::kStaticFloatValue;
       
 36349 +}
       
 36350 +
       
 36351 +float InternalTestClass::kStaticFloatValue = 42;
       
 36352 +
       
 36353 +static float PlainOldFunction() {
       
 36354 +  return 3.14145;
       
 36355 +}
       
 36356 +
       
 36357 +@implementation TestClass
       
 36358 +
       
 36359 +- (void)wait {
       
 36360 +  InternalTestClass t(10);
       
 36361 +  float z = PlainOldFunction();
       
 36362 +
       
 36363 +  while (1) {
       
 36364 +    t.snooze(z);
       
 36365 +  }
       
 36366 +}
       
 36367 +
       
 36368 +@end
       
 36369 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/bomb.icns b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/bomb.icns
       
 36370 new file mode 100644
       
 36371 index 0000000000000000000000000000000000000000..c360dbf618946920498958680eddb253a1ff677f
       
 36372 GIT binary patch
       
 36373 literal 23659
       
 36374 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
       
 36459 C-1BPy
       
 36460 
       
 36461 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/crashInMain b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/crashInMain
       
 36462 new file mode 100755
       
 36463 index 0000000000000000000000000000000000000000..03bb3172769307065261123d239ca253e4dbf1cf
       
 36464 GIT binary patch
       
 36465 literal 12588
       
 36466 zc%1E<&ui0g6u`e(GgrE~71=>lT#<Nkv=cmd@L**{hx<{s3d2oe+Gbt0HZ5s7HV`a?
       
 36467 z9ZDE_@Sr#G;?;u(Pcoe#BKkKBbkM_u9SY(O&i9h9O}4eWsR-`_ukYoX_v@Q}4-LG2
       
 36468 z-u?Eoi!l}e=>X{gS%-^N&;rP15Lr&fuP1INCMTFjn6(At)}6RiVmfsoChXZ*x0Bap
       
 36469 zj=!lco1Xi@_`3s)Jwe^)#W;wp>cwQrrlIM%HaUI_pgZWk{XP5hdHoN^Q*qyoh;I+P
       
 36470 z{{Zv%pH)o7-~ZwGe!lm8{ri9%EBS2u9Q}~v4C*6tVE^}=*pad1#H6?TA>Mn$>%WWp
       
 36471 zyR{Z7g_3M4>AcF?#E1Akj``{Z-AC$tm)@Bf9T~rw7#{f@eU;aS9D~CCx(M#&B(H&I
       
 36472 z@G<B|pu0hm+$X>VV?(U{{*i}6t?&0T_xWLsSfy;l@>)8^ANgtC!|v<qC+qpEE2oaj
       
 36473 zJE3Q>bDg{gfgO454}s^k6<GTcujTeAIMVC~B$vs^<><vIw5Fw7#0Wz1P|Vay*;EVB
       
 36474 zYt0~nAP9mW2!bH~DhsT(WqsYTw!`)vu{JBQwXtArR1&QX;mwy0;Ug>s?SQo*uC7<U
       
 36475 z!$nVh5Ta_s600lluF<GtlIgt{i=gZ({^sA?bl2>v>|EWdZB1F*lCwDTKG8sJCmMEm
       
 36476 zEzz);SW8Lbnsot_ic<Xq<h0&NGaok2XG1L;cHV6_9|S?r?uo$r9f%0xyf+dAK@bE%
       
 36477 z5ClOG1o7X|X!5T+AqavX2!bF8f*=UuPl2<<X9dQd4!HBrXukwI3U+URv2es4-R=vx
       
 36478 zvj8`^jWYpBZsT0QEW_FCurohU;_Emwu!1(^d<!}6a~tQP-TxN|&iJ$KvvDY)+ewK-
       
 36479 z*>c&eq~)}xXEi-1&#U>8YVZ+xd9I>o<b1KXSSh)_azV+=gOid)r}62yk;`zs1VM7i
       
 36480 uDCTsfpn_ePm(^u8Q!&-1zp5{3Mp0*wMblZ?R16aqmo@k-8Jcd+G4=}v0o=s^
       
 36481 
       
 36482 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/crashduringload b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/crashduringload
       
 36483 new file mode 100755
       
 36484 index 0000000000000000000000000000000000000000..5ca9debb755d4cebdae609cea91156ff244b6793
       
 36485 GIT binary patch
       
 36486 literal 12588
       
 36487 zc%1E<&r2Io5XaxTu?Dp!hZG8mrjT1DTIj)JQw*)tAHg3W)v|0h>t^j{6E+)bKu}mL
       
 36488 zgdi=n2cgivpojL-v&CLY!BhVLp$a)z+JjK&p>}5X)m?wYo0P(QVDe^P<~uVlyO)K@
       
 36489 z&aZF3+ZbaaSPR%yusyg~hgAR@0+Xan>R$R`dUAsKL|Ic%x8>@l)3ej3G*REjx~;q}
       
 36490 zbK`Aw+4jRv>y19f99$#5#wEnoe2r4JE#1_b<oFIbx^Ru0>^Ydv?|(QooeF#r51fJb
       
 36491 zFS20&IoXzj{h!sx_}NeN9{_Sxja>5_G04$_>jgQm{}op|GM1T`^iMy?dyo75xAAzd
       
 36492 z)?%ell59C^sH};;ouA`Mpk5g70Q2sp|ICbzj6X;ZkNj2N;k6-0zi_fHf@itTYjnc0
       
 36493 z3F}K(JHRqLM&yRtcGmp-$n(MTzsGxzzaQ2ZsFbY%L(dNIpS+v*5L)ehxAOYS`&UnI
       
 36494 zmR@WQMOt|e0=w|BKLb9m=Yh2oyq4Re*zH!&8ghP7*EHR(x-qwdF>ZCi?-@)}6serN
       
 36495 zm4x>7EYBO%2tx6UW~y4Y)k5;_v4|iDf*=TjAc#w0k=6E{y&uj&wEiemn@_Nfv2blP
       
 36496 z5puSL4_{k^&#)D)i_UgveXH^lE;<|ipsEcgSYrm>I}RI|WcKK-1WSEQfzP8|Z?C>K
       
 36497 z<zCIy_NSbKn7cW*;ao#`DADKvwevAH_h~z?8b+}{{-kIbxf|y;>Au_UJ`01P-x-JZ
       
 36498 zJFpO#``$<p1VIo4K@bE%5X67S;W7WZ6M`TJf*=TjAP9mWE(@F!?iCn&)91}UqrU}y
       
 36499 z68tWav1r^I-HwRfEWmy4<4iz?`#2Xc&u}(7>dp_8_&&}IRMCf=JCJjg`#2Zv{l7p!
       
 36500 zHLC}Foa^pzQ{qszRJJQwDXW_~-PEMKYLrxqkH||46;qLnV)1dM<i$z_S;<3?oWr2;
       
 36501 z*_5Rzd|d*ORI-YiDHl}m3wcRhR+Wma9>=TZl5Q1E23d5Im2KIwVRKoB&yuB^_5x#n
       
 36502 E0DI)!$N&HU
       
 36503 
       
 36504 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/main.m b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/main.m
       
 36505 new file mode 100644
       
 36506 --- /dev/null
       
 36507 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/testapp/main.m
       
 36508 @@ -0,0 +1,34 @@
       
 36509 +// Copyright (c) 2006, Google Inc.
       
 36510 +// All rights reserved.
       
 36511 +//
       
 36512 +// Redistribution and use in source and binary forms, with or without
       
 36513 +// modification, are permitted provided that the following conditions are
       
 36514 +// met:
       
 36515 +//
       
 36516 +//     * Redistributions of source code must retain the above copyright
       
 36517 +// notice, this list of conditions and the following disclaimer.
       
 36518 +//     * Redistributions in binary form must reproduce the above
       
 36519 +// copyright notice, this list of conditions and the following disclaimer
       
 36520 +// in the documentation and/or other materials provided with the
       
 36521 +// distribution.
       
 36522 +//     * Neither the name of Google Inc. nor the names of its
       
 36523 +// contributors may be used to endorse or promote products derived from
       
 36524 +// this software without specific prior written permission.
       
 36525 +//
       
 36526 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 36527 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 36528 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 36529 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 36530 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 36531 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 36532 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 36533 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 36534 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 36535 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 36536 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 36537 +
       
 36538 +#import <Cocoa/Cocoa.h>
       
 36539 +
       
 36540 +int main(int argc, char *argv[]) {
       
 36541 +  return NSApplicationMain(argc,  (const char **) argv);
       
 36542 +}
       
 36543 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/tests/BreakpadFramework_Test.mm b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/BreakpadFramework_Test.mm
       
 36544 new file mode 100644
       
 36545 --- /dev/null
       
 36546 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/BreakpadFramework_Test.mm
       
 36547 @@ -0,0 +1,217 @@
       
 36548 +// Copyright (c) 2009, Google Inc.
       
 36549 +// All rights reserved.
       
 36550 +//
       
 36551 +// Redistribution and use in source and binary forms, with or without
       
 36552 +// modification, are permitted provided that the following conditions are
       
 36553 +// met:
       
 36554 +//
       
 36555 +//     * Redistributions of source code must retain the above copyright
       
 36556 +// notice, this list of conditions and the following disclaimer.
       
 36557 +//     * Redistributions in binary form must reproduce the above
       
 36558 +// copyright notice, this list of conditions and the following disclaimer
       
 36559 +// in the documentation and/or other materials provided with the
       
 36560 +// distribution.
       
 36561 +//     * Neither the name of Google Inc. nor the names of its
       
 36562 +// contributors may be used to endorse or promote products derived from
       
 36563 +// this software without specific prior written permission.
       
 36564 +//
       
 36565 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 36566 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 36567 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 36568 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 36569 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 36570 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 36571 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 36572 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 36573 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 36574 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 36575 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 36576 +//
       
 36577 +// BreakpadFramework_Test.mm
       
 36578 +// Test case file for Breakpad.h/mm.
       
 36579 +//
       
 36580 +
       
 36581 +#import "GTMSenTestCase.h"
       
 36582 +#import "Breakpad.h"
       
 36583 +
       
 36584 +#include <mach/mach.h>
       
 36585 +
       
 36586 +@interface BreakpadFramework_Test : GTMTestCase {
       
 36587 + @private
       
 36588 +  int last_exception_code_;
       
 36589 +  int last_exception_type_;
       
 36590 +  mach_port_t last_exception_thread_;
       
 36591 +  // We're not using Obj-C BOOL because we need to interop with
       
 36592 +  // Breakpad's callback.
       
 36593 +  bool shouldHandleException_;
       
 36594 +}
       
 36595 +
       
 36596 +// This method is used by a callback used by test cases to determine
       
 36597 +// whether to return true or false to Breakpad when handling an
       
 36598 +// exception.
       
 36599 +- (bool)shouldHandleException;
       
 36600 +// This method returns a minimal dictionary that has what
       
 36601 +// Breakpad needs to initialize.
       
 36602 +- (NSMutableDictionary *)breakpadInitializationDictionary;
       
 36603 +// This method is used by the exception handling callback
       
 36604 +// to communicate to test cases the properites of the last
       
 36605 +// exception.
       
 36606 +- (void)setLastExceptionType:(int)type andCode:(int)code
       
 36607 +                   andThread:(mach_port_t)thread;
       
 36608 +@end
       
 36609 +
       
 36610 +// Callback for Breakpad exceptions
       
 36611 +bool myBreakpadCallback(int exception_type,
       
 36612 +                        int exception_code,
       
 36613 +                        mach_port_t crashing_thread,
       
 36614 +                        void *context);
       
 36615 +
       
 36616 +bool myBreakpadCallback(int exception_type,
       
 36617 +                        int exception_code,
       
 36618 +                        mach_port_t crashing_thread,
       
 36619 +                        void *context) {
       
 36620 +  BreakpadFramework_Test *testCaseClass =
       
 36621 +    (BreakpadFramework_Test *)context;
       
 36622 +  [testCaseClass setLastExceptionType:exception_type
       
 36623 +                              andCode:exception_code
       
 36624 +                            andThread:crashing_thread];
       
 36625 +  bool shouldHandleException =
       
 36626 +    [testCaseClass shouldHandleException];
       
 36627 +  NSLog(@"Callback returning %d", shouldHandleException);
       
 36628 +  return shouldHandleException;
       
 36629 +}
       
 36630 +const int kNoLastExceptionCode = -1;
       
 36631 +const int kNoLastExceptionType = -1;
       
 36632 +const mach_port_t kNoLastExceptionThread = MACH_PORT_NULL;
       
 36633 +
       
 36634 +@implementation BreakpadFramework_Test
       
 36635 +- (void) initializeExceptionStateVariables {
       
 36636 +  last_exception_code_ = kNoLastExceptionCode;
       
 36637 +  last_exception_type_ = kNoLastExceptionType;
       
 36638 +  last_exception_thread_ = kNoLastExceptionThread;
       
 36639 +}
       
 36640 +
       
 36641 +- (NSMutableDictionary *)breakpadInitializationDictionary {
       
 36642 +  NSMutableDictionary *breakpadParams =
       
 36643 +    [NSMutableDictionary dictionaryWithCapacity:3];
       
 36644 +
       
 36645 +  [breakpadParams setObject:@"UnitTests" forKey:@BREAKPAD_PRODUCT];
       
 36646 +  [breakpadParams setObject:@"1.0" forKey:@BREAKPAD_VERSION];
       
 36647 +  [breakpadParams setObject:@"http://staging" forKey:@BREAKPAD_URL];
       
 36648 +  return breakpadParams;
       
 36649 +}
       
 36650 +
       
 36651 +- (bool)shouldHandleException {
       
 36652 +  return shouldHandleException_;
       
 36653 +}
       
 36654 +
       
 36655 +- (void)setLastExceptionType:(int)type 
       
 36656 +		     andCode:(int)code
       
 36657 +                   andThread:(mach_port_t)thread {
       
 36658 +  last_exception_type_ = type;
       
 36659 +  last_exception_code_ = code;
       
 36660 +  last_exception_thread_ = thread;
       
 36661 +}
       
 36662 +
       
 36663 +// Test that the parameters mark required actually enable Breakpad to
       
 36664 +// be initialized.
       
 36665 +- (void)testBreakpadInstantiationWithRequiredParameters {
       
 36666 +  BreakpadRef b = BreakpadCreate([self breakpadInitializationDictionary]);
       
 36667 +  STAssertNotNULL(b, @"BreakpadCreate failed with required parameters");
       
 36668 +  BreakpadRelease(b);
       
 36669 +}
       
 36670 +
       
 36671 +// Test that Breakpad fails to initialize cleanly when required
       
 36672 +// parameters are not present.
       
 36673 +- (void)testBreakpadInstantiationWithoutRequiredParameters {
       
 36674 +  NSMutableDictionary *breakpadDictionary =
       
 36675 +    [self breakpadInitializationDictionary];
       
 36676 +
       
 36677 +  // Skip setting version, so that BreakpadCreate fails.
       
 36678 +  [breakpadDictionary removeObjectForKey:@BREAKPAD_VERSION];
       
 36679 +  BreakpadRef b = BreakpadCreate(breakpadDictionary);
       
 36680 +  STAssertNULL(b, @"BreakpadCreate did not fail when missing a required"
       
 36681 +               " parameter!");
       
 36682 +
       
 36683 +  breakpadDictionary = [self breakpadInitializationDictionary];
       
 36684 +  // Now test with no product
       
 36685 +  [breakpadDictionary removeObjectForKey:@BREAKPAD_PRODUCT];
       
 36686 +  b = BreakpadCreate(breakpadDictionary);
       
 36687 +  STAssertNULL(b, @"BreakpadCreate did not fail when missing a required"
       
 36688 +               " parameter!");
       
 36689 +
       
 36690 +  breakpadDictionary = [self breakpadInitializationDictionary];
       
 36691 +  // Now test with no URL
       
 36692 +  [breakpadDictionary removeObjectForKey:@BREAKPAD_URL];
       
 36693 +  b = BreakpadCreate(breakpadDictionary);
       
 36694 +  STAssertNULL(b, @"BreakpadCreate did not fail when missing a required"
       
 36695 +               " parameter!");
       
 36696 +  BreakpadRelease(b);
       
 36697 +}
       
 36698 +
       
 36699 +// Test to ensure that when we call BreakpadAddUploadParameter,
       
 36700 +// it's added to the dictionary correctly(this test depends on
       
 36701 +// some internal details of Breakpad, namely, the special prefix
       
 36702 +// that it uses to figure out which key/value pairs to upload).
       
 36703 +- (void)testAddingBreakpadServerVariable {
       
 36704 +  NSMutableDictionary *breakpadDictionary =
       
 36705 +    [self breakpadInitializationDictionary];
       
 36706 +
       
 36707 +  BreakpadRef b = BreakpadCreate(breakpadDictionary);
       
 36708 +  STAssertNotNULL(b, @"BreakpadCreate failed with valid dictionary!");
       
 36709 +
       
 36710 +  BreakpadAddUploadParameter(b,
       
 36711 +                             @"key",
       
 36712 +                             @"value");
       
 36713 +
       
 36714 +  // Test that it did not add the key/value directly, e.g. without
       
 36715 +  // prepending the key with the prefix.
       
 36716 +  STAssertNil(BreakpadKeyValue(b, @"key"),
       
 36717 +              @"AddUploadParameter added key directly to dictionary"
       
 36718 +              " instead of prepending it!");
       
 36719 +
       
 36720 +  NSString *prependedKeyname =
       
 36721 +    [@BREAKPAD_SERVER_PARAMETER_PREFIX stringByAppendingString:@"key"];
       
 36722 +    
       
 36723 +  STAssertEqualStrings(BreakpadKeyValue(b, prependedKeyname),
       
 36724 +                       @"value",
       
 36725 +                       @"Calling BreakpadAddUploadParameter did not prepend "
       
 36726 +                       "key name");
       
 36727 +  BreakpadRelease(b);
       
 36728 +}
       
 36729 +
       
 36730 +// Test that when we do on-demand minidump generation,
       
 36731 +// the exception code/type/thread are set properly.
       
 36732 +- (void)testFilterCallbackReturnsFalse {
       
 36733 +  NSMutableDictionary *breakpadDictionary =
       
 36734 +    [self breakpadInitializationDictionary];
       
 36735 +
       
 36736 +  BreakpadRef b = BreakpadCreate(breakpadDictionary);
       
 36737 +  STAssertNotNULL(b, @"BreakpadCreate failed with valid dictionary!");
       
 36738 +  BreakpadSetFilterCallback(b, &myBreakpadCallback, self);
       
 36739 +
       
 36740 +  // This causes the callback to return false, meaning
       
 36741 +  // Breakpad won't take the exception
       
 36742 +  shouldHandleException_ = false;
       
 36743 +
       
 36744 +  [self initializeExceptionStateVariables];
       
 36745 +  STAssertEquals(last_exception_type_, kNoLastExceptionType,
       
 36746 +                 @"Last exception type not initialized correctly.");
       
 36747 +  STAssertEquals(last_exception_code_, kNoLastExceptionCode,
       
 36748 +                 @"Last exception code not initialized correctly.");
       
 36749 +  STAssertEquals(last_exception_thread_, kNoLastExceptionThread,
       
 36750 +                 @"Last exception thread is not initialized correctly.");
       
 36751 +
       
 36752 +  // Cause Breakpad's exception handler to be invoked.
       
 36753 +  BreakpadGenerateAndSendReport(b);
       
 36754 +
       
 36755 +  STAssertEquals(last_exception_type_, 0,
       
 36756 +                 @"Last exception type is not 0 for on demand");
       
 36757 +  STAssertEquals(last_exception_code_, 0,
       
 36758 +                 @"Last exception code is not 0 for on demand");
       
 36759 +  STAssertEquals(last_exception_thread_, mach_thread_self(),
       
 36760 +                 @"Last exception thread is not mach_thread_self() "
       
 36761 +                 "for on demand");
       
 36762 +}
       
 36763 +
       
 36764 +@end
       
 36765 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.h b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.h
       
 36766 new file mode 100644
       
 36767 --- /dev/null
       
 36768 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.h
       
 36769 @@ -0,0 +1,40 @@
       
 36770 +// Copyright (c) 2008, Google Inc.
       
 36771 +// All rights reserved.
       
 36772 +//
       
 36773 +// Redistribution and use in source and binary forms, with or without
       
 36774 +// modification, are permitted provided that the following conditions are
       
 36775 +// met:
       
 36776 +//
       
 36777 +//     * Redistributions of source code must retain the above copyright
       
 36778 +// notice, this list of conditions and the following disclaimer.
       
 36779 +//     * Redistributions in binary form must reproduce the above
       
 36780 +// copyright notice, this list of conditions and the following disclaimer
       
 36781 +// in the documentation and/or other materials provided with the
       
 36782 +// distribution.
       
 36783 +//     * Neither the name of Google Inc. nor the names of its
       
 36784 +// contributors may be used to endorse or promote products derived from
       
 36785 +// this software without specific prior written permission.
       
 36786 +//
       
 36787 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 36788 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 36789 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 36790 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 36791 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 36792 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 36793 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 36794 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 36795 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 36796 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 36797 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 36798 +
       
 36799 +#import <GTMSenTestCase.h>
       
 36800 +#import "SimpleStringDictionary.h"
       
 36801 +
       
 36802 +@interface SimpleStringDictionaryTest : GTMTestCase {
       
 36803 +
       
 36804 +}
       
 36805 +
       
 36806 +- (void)testKeyValueEntry;
       
 36807 +- (void)testSimpleStringDictionary;
       
 36808 +- (void)testSimpleStringDictionaryIterator;
       
 36809 +@end
       
 36810 diff --git a/toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.mm b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.mm
       
 36811 new file mode 100644
       
 36812 --- /dev/null
       
 36813 +++ b/toolkit/crashreporter/google-breakpad/src/client/mac/tests/SimpleStringDictionaryTest.mm
       
 36814 @@ -0,0 +1,243 @@
       
 36815 +// Copyright (c) 2008, Google Inc.
       
 36816 +// All rights reserved.
       
 36817 +//
       
 36818 +// Redistribution and use in source and binary forms, with or without
       
 36819 +// modification, are permitted provided that the following conditions are
       
 36820 +// met:
       
 36821 +//
       
 36822 +//     * Redistributions of source code must retain the above copyright
       
 36823 +// notice, this list of conditions and the following disclaimer.
       
 36824 +//     * Redistributions in binary form must reproduce the above
       
 36825 +// copyright notice, this list of conditions and the following disclaimer
       
 36826 +// in the documentation and/or other materials provided with the
       
 36827 +// distribution.
       
 36828 +//     * Neither the name of Google Inc. nor the names of its
       
 36829 +// contributors may be used to endorse or promote products derived from
       
 36830 +// this software without specific prior written permission.
       
 36831 +//
       
 36832 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 36833 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 36834 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 36835 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 36836 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 36837 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 36838 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 36839 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 36840 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 36841 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 36842 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 36843 +
       
 36844 +#import "SimpleStringDictionaryTest.h"
       
 36845 +#import "SimpleStringDictionary.h"
       
 36846 +
       
 36847 +using google_breakpad::KeyValueEntry;
       
 36848 +using google_breakpad::SimpleStringDictionary;
       
 36849 +using google_breakpad::SimpleStringDictionaryIterator;
       
 36850 +
       
 36851 +@implementation SimpleStringDictionaryTest
       
 36852 +
       
 36853 +//==============================================================================
       
 36854 +- (void)testKeyValueEntry {
       
 36855 +  KeyValueEntry entry;
       
 36856 +
       
 36857 +  // Verify that initial state is correct
       
 36858 +  STAssertFalse(entry.IsActive(), @"Initial key value entry is active!");
       
 36859 +  STAssertEquals(strlen(entry.GetKey()), (size_t)0, @"Empty key value did not "
       
 36860 +                 @"have length 0");
       
 36861 +  STAssertEquals(strlen(entry.GetValue()), (size_t)0, @"Empty key value did not "
       
 36862 +                 @"have length 0");
       
 36863 +
       
 36864 +  // Try setting a key/value and then verify
       
 36865 +  entry.SetKeyValue("key1", "value1");
       
 36866 +  STAssertEqualCStrings(entry.GetKey(), "key1", @"key was not equal to key1");
       
 36867 +  STAssertEqualCStrings(entry.GetValue(), "value1", @"value was not equal");
       
 36868 +
       
 36869 +  // Try setting a new value
       
 36870 +  entry.SetValue("value3");
       
 36871 +
       
 36872 +  // Make sure the new value took
       
 36873 +  STAssertEqualCStrings(entry.GetValue(), "value3", @"value was not equal");
       
 36874 +
       
 36875 +  // Make sure the key didn't change
       
 36876 +  STAssertEqualCStrings(entry.GetKey(), "key1", @"key changed after setting "
       
 36877 +                        @"value!");
       
 36878 +
       
 36879 +  // Try setting a new key/value and then verify
       
 36880 +  entry.SetKeyValue("key2", "value2");
       
 36881 +  STAssertEqualCStrings(entry.GetKey(), "key2", @"New key was not equal to "
       
 36882 +                        @"key2");
       
 36883 +  STAssertEqualCStrings(entry.GetValue(), "value2", @"New value was not equal "
       
 36884 +                        @"to value2");
       
 36885 +
       
 36886 +  // Clear the entry and verify the key and value are empty strings
       
 36887 +  entry.Clear();
       
 36888 +  STAssertFalse(entry.IsActive(), @"Key value clear did not clear object");
       
 36889 +  STAssertEquals(strlen(entry.GetKey()), (size_t)0, @"Length of cleared key "
       
 36890 +		 @"was not 0");
       
 36891 +  STAssertEquals(strlen(entry.GetValue()), (size_t)0, @"Length of cleared "
       
 36892 +		 @"value was not 0!");
       
 36893 +}
       
 36894 +
       
 36895 +- (void)testEmptyKeyValueCombos {
       
 36896 +  KeyValueEntry entry;
       
 36897 +  entry.SetKeyValue(NULL, NULL);
       
 36898 +  STAssertEqualCStrings(entry.GetKey(), "", @"Setting NULL key did not return "
       
 36899 +			@"empty key!");
       
 36900 +  STAssertEqualCStrings(entry.GetValue(), "", @"Setting NULL value did not "
       
 36901 +			@"set empty string value!");
       
 36902 +}
       
 36903 +
       
 36904 +
       
 36905 +//==============================================================================
       
 36906 +- (void)testSimpleStringDictionary {
       
 36907 +  // Make a new dictionary
       
 36908 +  SimpleStringDictionary *dict = new SimpleStringDictionary();
       
 36909 +  STAssertTrue(dict != NULL, nil);
       
 36910 +
       
 36911 +  // try passing in NULL for key
       
 36912 +  //dict->SetKeyValue(NULL, "bad");   // causes assert() to fire
       
 36913 +
       
 36914 +  // Set three distinct values on three keys
       
 36915 +  dict->SetKeyValue("key1", "value1");
       
 36916 +  dict->SetKeyValue("key2", "value2");
       
 36917 +  dict->SetKeyValue("key3", "value3");
       
 36918 +
       
 36919 +  STAssertTrue(!strcmp(dict->GetValueForKey("key1"), "value1"), nil);
       
 36920 +  STAssertTrue(!strcmp(dict->GetValueForKey("key2"), "value2"), nil);
       
 36921 +  STAssertTrue(!strcmp(dict->GetValueForKey("key3"), "value3"), nil);
       
 36922 +  STAssertEquals(dict->GetCount(), 3, @"GetCount did not return 3");
       
 36923 +  // try an unknown key
       
 36924 +  STAssertTrue(dict->GetValueForKey("key4") == NULL, nil);
       
 36925 +
       
 36926 +  // try a NULL key
       
 36927 +  //STAssertTrue(dict->GetValueForKey(NULL) == NULL, nil);  // asserts
       
 36928 +
       
 36929 +  // Remove a key
       
 36930 +  dict->RemoveKey("key3");
       
 36931 +
       
 36932 +  // Now make sure it's not there anymore
       
 36933 +  STAssertTrue(dict->GetValueForKey("key3") == NULL, nil);
       
 36934 +
       
 36935 +  // Remove a NULL key
       
 36936 +  //dict->RemoveKey(NULL);  // will cause assert() to fire
       
 36937 +
       
 36938 +  // Remove by setting value to NULL
       
 36939 +  dict->SetKeyValue("key2", NULL);
       
 36940 +
       
 36941 +  // Now make sure it's not there anymore
       
 36942 +  STAssertTrue(dict->GetValueForKey("key2") == NULL, nil);
       
 36943 +}
       
 36944 +
       
 36945 +//==============================================================================
       
 36946 +// The idea behind this test is to add a bunch of values to the dictionary,
       
 36947 +// remove some in the middle, then add a few more in.  We then create a
       
 36948 +// SimpleStringDictionaryIterator and iterate through the dictionary, taking
       
 36949 +// note of the key/value pairs we see.  We then verify that it iterates
       
 36950 +// through exactly the number of key/value pairs we expect, and that they
       
 36951 +// match one-for-one with what we would expect.  In all cases we're setting
       
 36952 +// key value pairs of the form:
       
 36953 +//
       
 36954 +// key<n>/value<n>   (like key0/value0, key17,value17, etc.)
       
 36955 +//
       
 36956 +- (void)testSimpleStringDictionaryIterator {
       
 36957 +  SimpleStringDictionary *dict = new SimpleStringDictionary();
       
 36958 +  STAssertTrue(dict != NULL, nil);
       
 36959 +
       
 36960 +  char key[KeyValueEntry::MAX_STRING_STORAGE_SIZE];
       
 36961 +  char value[KeyValueEntry::MAX_STRING_STORAGE_SIZE];
       
 36962 +
       
 36963 +  const int kDictionaryCapacity = SimpleStringDictionary::MAX_NUM_ENTRIES;
       
 36964 +  const int kPartitionIndex = kDictionaryCapacity - 5;
       
 36965 +
       
 36966 +  // We assume at least this size in the tests below
       
 36967 +  STAssertTrue(kDictionaryCapacity >= 64, nil);
       
 36968 +
       
 36969 +  // We'll keep track of the number of key/value pairs we think should
       
 36970 +  // be in the dictionary
       
 36971 +  int expectedDictionarySize = 0;
       
 36972 +
       
 36973 +  // Set a bunch of key/value pairs like key0/value0, key1/value1, ...
       
 36974 +  for (int i = 0; i < kPartitionIndex; ++i) {
       
 36975 +    sprintf(key, "key%d", i);
       
 36976 +    sprintf(value, "value%d", i);
       
 36977 +    dict->SetKeyValue(key, value);
       
 36978 +  }
       
 36979 +  expectedDictionarySize = kPartitionIndex;
       
 36980 +
       
 36981 +  // set a couple of the keys twice (with the same value) - should be nop
       
 36982 +  dict->SetKeyValue("key2", "value2");
       
 36983 +  dict->SetKeyValue("key4", "value4");
       
 36984 +  dict->SetKeyValue("key15", "value15");
       
 36985 +
       
 36986 +  // Remove some random elements in the middle
       
 36987 +  dict->RemoveKey("key7");
       
 36988 +  dict->RemoveKey("key18");
       
 36989 +  dict->RemoveKey("key23");
       
 36990 +  dict->RemoveKey("key31");
       
 36991 +  expectedDictionarySize -= 4;  // we just removed four key/value pairs
       
 36992 +
       
 36993 +  // Set some more key/value pairs like key59/value59, key60/value60, ...
       
 36994 +  for (int i = kPartitionIndex; i < kDictionaryCapacity; ++i) {
       
 36995 +    sprintf(key, "key%d", i);
       
 36996 +    sprintf(value, "value%d", i);
       
 36997 +    dict->SetKeyValue(key, value);
       
 36998 +  }
       
 36999 +  expectedDictionarySize += kDictionaryCapacity - kPartitionIndex;
       
 37000 +
       
 37001 +  // Now create an iterator on the dictionary
       
 37002 +  SimpleStringDictionaryIterator iter(*dict);
       
 37003 +
       
 37004 +  // We then verify that it iterates through exactly the number of
       
 37005 +  // key/value pairs we expect, and that they match one-for-one with what we
       
 37006 +  // would expect.  The ordering of the iteration does not matter...
       
 37007 +
       
 37008 +  // used to keep track of number of occurrences found for key/value pairs
       
 37009 +  int count[kDictionaryCapacity];
       
 37010 +  memset(count, 0, sizeof(count));
       
 37011 +
       
 37012 +  int totalCount = 0;
       
 37013 +
       
 37014 +  const KeyValueEntry *entry;
       
 37015 +
       
 37016 +  while ((entry = iter.Next())) {
       
 37017 +    totalCount++;
       
 37018 +
       
 37019 +    // Extract keyNumber from a string of the form key<keyNumber>
       
 37020 +    int keyNumber;
       
 37021 +    sscanf(entry->GetKey(), "key%d", &keyNumber);
       
 37022 +
       
 37023 +    // Extract valueNumber from a string of the form value<valueNumber>
       
 37024 +    int valueNumber;
       
 37025 +    sscanf(entry->GetValue(), "value%d", &valueNumber);
       
 37026 +
       
 37027 +    // The value number should equal the key number since that's how we set them
       
 37028 +    STAssertTrue(keyNumber == valueNumber, nil);
       
 37029 +
       
 37030 +    // Key and value numbers should be in proper range:
       
 37031 +    // 0 <= keyNumber < kDictionaryCapacity
       
 37032 +    bool isKeyInGoodRange =
       
 37033 +      (keyNumber >= 0 && keyNumber < kDictionaryCapacity);
       
 37034 +    bool isValueInGoodRange =
       
 37035 +      (valueNumber >= 0 && valueNumber < kDictionaryCapacity);
       
 37036 +    STAssertTrue(isKeyInGoodRange, nil);
       
 37037 +    STAssertTrue(isValueInGoodRange, nil);
       
 37038 +
       
 37039 +    if (isKeyInGoodRange && isValueInGoodRange) {
       
 37040 +      ++count[keyNumber];
       
 37041 +    }
       
 37042 +  }
       
 37043 +
       
 37044 +  // Make sure each of the key/value pairs showed up exactly one time, except
       
 37045 +  // for the ones which we removed.
       
 37046 +  for (int i = 0; i < kDictionaryCapacity; ++i) {
       
 37047 +    // Skip over key7, key18, key23, and key31, since we removed them
       
 37048 +    if (!(i == 7 || i == 18 || i == 23 || i == 31)) {
       
 37049 +      STAssertTrue(count[i] == 1, nil);
       
 37050 +    }
       
 37051 +  }
       
 37052 +
       
 37053 +  // Make sure the number of iterations matches the expected dictionary size.
       
 37054 +  STAssertTrue(totalCount == expectedDictionarySize, nil);
       
 37055 +}
       
 37056 +
       
 37057 +@end
       
 37058 diff --git a/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer.cc b/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer.cc
       
 37059 --- a/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer.cc
       
 37060 +++ b/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer.cc
       
 37061 @@ -32,43 +32,53 @@
       
 37062  // See minidump_file_writer.h for documentation.
       
 37063  
       
 37064  #include <fcntl.h>
       
 37065  #include <limits.h>
       
 37066  #include <stdio.h>
       
 37067  #include <string.h>
       
 37068  #include <unistd.h>
       
 37069  
       
 37070 +#include "common/linux/linux_syscall_support.h"
       
 37071 +#include "common/linux/linux_libc_support.h"
       
 37072  #include "client/minidump_file_writer-inl.h"
       
 37073  #include "common/string_conversion.h"
       
 37074  
       
 37075  namespace google_breakpad {
       
 37076  
       
 37077  const MDRVA MinidumpFileWriter::kInvalidMDRVA = static_cast<MDRVA>(-1);
       
 37078  
       
 37079  MinidumpFileWriter::MinidumpFileWriter() : file_(-1), position_(0), size_(0) {
       
 37080  }
       
 37081  
       
 37082  MinidumpFileWriter::~MinidumpFileWriter() {
       
 37083    Close();
       
 37084  }
       
 37085  
       
 37086  bool MinidumpFileWriter::Open(const char *path) {
       
 37087    assert(file_ == -1);
       
 37088 +#if __linux__
       
 37089 +  file_ = sys_open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);
       
 37090 +#else
       
 37091    file_ = open(path, O_WRONLY | O_CREAT | O_EXCL, 0600);
       
 37092 +#endif
       
 37093  
       
 37094    return file_ != -1;
       
 37095  }
       
 37096  
       
 37097  bool MinidumpFileWriter::Close() {
       
 37098    bool result = true;
       
 37099  
       
 37100    if (file_ != -1) {
       
 37101      ftruncate(file_, position_);
       
 37102 +#if __linux__
       
 37103 +    result = (sys_close(file_) == 0);
       
 37104 +#else
       
 37105      result = (close(file_) == 0);
       
 37106 +#endif
       
 37107      file_ = -1;
       
 37108    }
       
 37109  
       
 37110    return result;
       
 37111  }
       
 37112  
       
 37113  bool MinidumpFileWriter::CopyStringToMDString(const wchar_t *str,
       
 37114                                                unsigned int length,
       
 37115 @@ -222,19 +232,26 @@ bool MinidumpFileWriter::Copy(MDRVA posi
       
 37116    assert(size);
       
 37117    assert(file_ != -1);
       
 37118  
       
 37119    // Ensure that the data will fit in the allocated space
       
 37120    if (size + position > size_)
       
 37121      return false;
       
 37122  
       
 37123    // Seek and write the data
       
 37124 -  if (lseek(file_, position, SEEK_SET) == static_cast<off_t>(position))
       
 37125 -    if (write(file_, src, size) == size)
       
 37126 +#if __linux__
       
 37127 +  if (sys_lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {
       
 37128 +    if (sys_write(file_, src, size) == size) {
       
 37129 +#else
       
 37130 +  if (lseek(file_, position, SEEK_SET) == static_cast<off_t>(position)) {
       
 37131 +    if (write(file_, src, size) == size) {
       
 37132 +#endif
       
 37133        return true;
       
 37134 +    }
       
 37135 +  }
       
 37136  
       
 37137    return false;
       
 37138  }
       
 37139  
       
 37140  bool UntypedMDRVA::Allocate(size_t size) {
       
 37141    assert(size_ == 0);
       
 37142    size_ = size;
       
 37143    position_ = writer_->Allocate(size_);
       
 37144 diff --git a/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer_unittest.cc b/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer_unittest.cc
       
 37145 --- a/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer_unittest.cc
       
 37146 +++ b/toolkit/crashreporter/google-breakpad/src/client/minidump_file_writer_unittest.cc
       
 37147 @@ -121,27 +121,32 @@ static bool CompareFile(const char *path
       
 37148      0x01000002, 0x00000003, 0x02000003, 0x00000004, 0x03000004, 0x00000005,
       
 37149      0x04000005, 0x00000006, 0x05000006, 0x00000007, 0x06000007, 0x00000008,
       
 37150      0x07000008, 0x00000009, 0x08000009, 0x0000000a, 0x0900000a, 0x0000000b,
       
 37151      0x0000000a, 0x00000001, 0x00000002, 0x01000002, 0x00000003, 0x02000003,
       
 37152      0x00000004, 0x03000004, 0x00000005, 0x04000005, 0x00000006, 0x05000006,
       
 37153      0x00000007, 0x06000007, 0x00000008, 0x07000008, 0x00000009, 0x08000009,
       
 37154      0x0000000a, 0x0900000a, 0x0000000b, 0x00000000
       
 37155  #else
       
 37156 -    0x0000beef, 0x0000001e, 0x00000018, 0x00000020, 0x00000038, 0x00000000,
       
 37157 -    0x00000018, 0x00690046, 0x00730072, 0x00200074, 0x00740053, 0x00690072,
       
 37158 -    0x0067006e, 0x00000000, 0x0000001a, 0x00650053, 0x006f0063, 0x0064006e,
       
 37159 -    0x00530020, 0x00720074, 0x006e0069, 0x00000067, 0x0001da00, 0x00000002,
       
 37160 -    0x0002da01, 0x00000003, 0x0003da02, 0x00000004, 0x0004da03, 0x00000005,
       
 37161 -    0x0005da04, 0x00000006, 0x0006da05, 0x00000007, 0x0007da06, 0x00000008,
       
 37162 -    0x0008da07, 0x00000009, 0x0009da08, 0x0000000a, 0x000ada09, 0x0000000b,
       
 37163 -    0x0000000a, 0x00018700, 0x00000002, 0x00028701, 0x00000003, 0x00038702,
       
 37164 -    0x00000004, 0x00048703, 0x00000005, 0x00058704, 0x00000006, 0x00068705,
       
 37165 -    0x00000007, 0x00078706, 0x00000008, 0x00088707, 0x00000009, 0x00098708,
       
 37166 -    0x0000000a, 0x000a8709, 0x0000000b, 0x00000000, 
       
 37167 +    0x0000beef, 0x0000001e, 0x00000018, 0x00000020,
       
 37168 +    0x00000038, 0x00000000, 0x00000018, 0x00690046,
       
 37169 +    0x00730072, 0x00200074, 0x00740053, 0x00690072,
       
 37170 +    0x0067006e, 0x00000000, 0x0000001a, 0x00650053,
       
 37171 +    0x006f0063, 0x0064006e, 0x00530020, 0x00720074,
       
 37172 +    0x006e0069, 0x00000067, 0x00011e00, 0x00000002,
       
 37173 +    0x00021e01, 0x00000003, 0x00031e02, 0x00000004,
       
 37174 +    0x00041e03, 0x00000005, 0x00051e04, 0x00000006,
       
 37175 +    0x00061e05, 0x00000007, 0x00071e06, 0x00000008,
       
 37176 +    0x00081e07, 0x00000009, 0x00091e08, 0x0000000a,
       
 37177 +    0x000a1e09, 0x0000000b, 0x0000000a, 0x00011c00,
       
 37178 +    0x00000002, 0x00021c01, 0x00000003, 0x00031c02,
       
 37179 +    0x00000004, 0x00041c03, 0x00000005, 0x00051c04,
       
 37180 +    0x00000006, 0x00061c05, 0x00000007, 0x00071c06,
       
 37181 +    0x00000008, 0x00081c07, 0x00000009, 0x00091c08,
       
 37182 +    0x0000000a, 0x000a1c09, 0x0000000b, 0x00000000,
       
 37183  #endif
       
 37184    };
       
 37185    unsigned int expected_byte_count = sizeof(expected);
       
 37186    int fd = open(path, O_RDONLY, 0600);
       
 37187    void *buffer = malloc(expected_byte_count);
       
 37188    ASSERT_NE(fd, -1);
       
 37189    ASSERT_TRUE(buffer);
       
 37190    ASSERT_EQ(read(fd, buffer, expected_byte_count), expected_byte_count);
       
 37191 @@ -151,17 +156,16 @@ static bool CompareFile(const char *path
       
 37192    b2 = (char*)expected;
       
 37193    while (*b1 == *b2) {
       
 37194      b1++;
       
 37195      b2++;
       
 37196    }
       
 37197  
       
 37198    printf("%d\n",b1 - (char*)buffer);
       
 37199  
       
 37200 -
       
 37201    ASSERT_EQ(memcmp(buffer, expected, expected_byte_count), 0);
       
 37202    return true;
       
 37203  }
       
 37204  
       
 37205  static bool RunTests() {
       
 37206    const char *path = "/tmp/minidump_file_writer_unittest.dmp";
       
 37207    ASSERT_TRUE(WriteFile(path));
       
 37208    ASSERT_TRUE(CompareFile(path));
       
 37209 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/breakpad_client.sln b/toolkit/crashreporter/google-breakpad/src/client/windows/breakpad_client.sln
       
 37210 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/breakpad_client.sln
       
 37211 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/breakpad_client.sln
       
 37212 @@ -5,16 +5,18 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C9
       
 37213  	ProjectSection(ProjectDependencies) = postProject
       
 37214  		{A820AF62-6239-4693-8430-4F516C1838F4} = {A820AF62-6239-4693-8430-4F516C1838F4}
       
 37215  	EndProjectSection
       
 37216  EndProject
       
 37217  Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_report_sender", "sender\crash_report_sender.vcproj", "{9946A048-043B-4F8F-9E07-9297B204714C}"
       
 37218  EndProject
       
 37219  Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_generation", "crash_generation\crash_generation.vcproj", "{A820AF62-6239-4693-8430-4F516C1838F4}"
       
 37220  EndProject
       
 37221 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exception_handler_test", "handler\exception_handler_test\exception_handler_test.vcproj", "{89094A11-CF25-4037-AF43-EACFA751405E}"
       
 37222 +EndProject
       
 37223  Global
       
 37224  	GlobalSection(SolutionConfigurationPlatforms) = preSolution
       
 37225  		Debug|Win32 = Debug|Win32
       
 37226  		DebugStaticCRT|Win32 = DebugStaticCRT|Win32
       
 37227  		Release|Win32 = Release|Win32
       
 37228  		ReleaseStaticCRT|Win32 = ReleaseStaticCRT|Win32
       
 37229  	EndGlobalSection
       
 37230  	GlobalSection(ProjectConfigurationPlatforms) = postSolution
       
 37231 @@ -37,13 +39,21 @@ Global
       
 37232  		{A820AF62-6239-4693-8430-4F516C1838F4}.Debug|Win32.ActiveCfg = Debug|Win32
       
 37233  		{A820AF62-6239-4693-8430-4F516C1838F4}.Debug|Win32.Build.0 = Debug|Win32
       
 37234  		{A820AF62-6239-4693-8430-4F516C1838F4}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32
       
 37235  		{A820AF62-6239-4693-8430-4F516C1838F4}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32
       
 37236  		{A820AF62-6239-4693-8430-4F516C1838F4}.Release|Win32.ActiveCfg = Release|Win32
       
 37237  		{A820AF62-6239-4693-8430-4F516C1838F4}.Release|Win32.Build.0 = Release|Win32
       
 37238  		{A820AF62-6239-4693-8430-4F516C1838F4}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32
       
 37239  		{A820AF62-6239-4693-8430-4F516C1838F4}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32
       
 37240 +		{89094A11-CF25-4037-AF43-EACFA751405E}.Debug|Win32.ActiveCfg = Debug|Win32
       
 37241 +		{89094A11-CF25-4037-AF43-EACFA751405E}.Debug|Win32.Build.0 = Debug|Win32
       
 37242 +		{89094A11-CF25-4037-AF43-EACFA751405E}.DebugStaticCRT|Win32.ActiveCfg = Debug|Win32
       
 37243 +		{89094A11-CF25-4037-AF43-EACFA751405E}.DebugStaticCRT|Win32.Build.0 = Debug|Win32
       
 37244 +		{89094A11-CF25-4037-AF43-EACFA751405E}.Release|Win32.ActiveCfg = Release|Win32
       
 37245 +		{89094A11-CF25-4037-AF43-EACFA751405E}.Release|Win32.Build.0 = Release|Win32
       
 37246 +		{89094A11-CF25-4037-AF43-EACFA751405E}.ReleaseStaticCRT|Win32.ActiveCfg = Release|Win32
       
 37247 +		{89094A11-CF25-4037-AF43-EACFA751405E}.ReleaseStaticCRT|Win32.Build.0 = Release|Win32
       
 37248  	EndGlobalSection
       
 37249  	GlobalSection(SolutionProperties) = preSolution
       
 37250  		HideSolutionNode = FALSE
       
 37251  	EndGlobalSection
       
 37252  EndGlobal
       
 37253 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/common/ipc_protocol.h b/toolkit/crashreporter/google-breakpad/src/client/windows/common/ipc_protocol.h
       
 37254 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/common/ipc_protocol.h
       
 37255 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/common/ipc_protocol.h
       
 37256 @@ -90,17 +90,17 @@ enum MessageTag {
       
 37257    MESSAGE_TAG_NONE = 0,
       
 37258    MESSAGE_TAG_REGISTRATION_REQUEST = 1,
       
 37259    MESSAGE_TAG_REGISTRATION_RESPONSE = 2,
       
 37260    MESSAGE_TAG_REGISTRATION_ACK = 3
       
 37261  };
       
 37262  
       
 37263  struct CustomClientInfo {
       
 37264    const CustomInfoEntry* entries;
       
 37265 -  int count;
       
 37266 +  size_t count;
       
 37267  };
       
 37268  
       
 37269  // Message structure for IPC between crash client and crash server.
       
 37270  struct ProtocolMessage {
       
 37271    ProtocolMessage()
       
 37272        : tag(MESSAGE_TAG_NONE),
       
 37273          pid(0),
       
 37274          dump_type(MiniDumpNormal),
       
 37275 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc b/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc
       
 37276 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc
       
 37277 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc
       
 37278 @@ -124,16 +124,29 @@ CrashGenerationServer::CrashGenerationSe
       
 37279      dump_generator_.reset(new MinidumpGenerator(*dump_path));
       
 37280    }
       
 37281  }
       
 37282  
       
 37283  CrashGenerationServer::~CrashGenerationServer() {
       
 37284    // Indicate to existing threads that server is shutting down.
       
 37285    shutting_down_ = true;
       
 37286  
       
 37287 +  // Even if there are no current worker threads running, it is possible that
       
 37288 +  // an I/O request is pending on the pipe right now but not yet done. In fact,
       
 37289 +  // it's very likely this is the case unless we are in an ERROR state. If we
       
 37290 +  // don't wait for the pending I/O to be done, then when the I/O completes,
       
 37291 +  // it may write to invalid memory. AppVerifier will flag this problem too.
       
 37292 +  // So we disconnect from the pipe and then wait for the server to get into
       
 37293 +  // error state so that the pending I/O will fail and get cleared.
       
 37294 +  DisconnectNamedPipe(pipe_);
       
 37295 +  int num_tries = 100;
       
 37296 +  while (num_tries-- && server_state_ != IPC_SERVER_STATE_ERROR) {
       
 37297 +    Sleep(10);
       
 37298 +  }
       
 37299 +
       
 37300    // Unregister wait on the pipe.
       
 37301    if (pipe_wait_handle_) {
       
 37302      // Wait for already executing callbacks to finish.
       
 37303      UnregisterWaitEx(pipe_wait_handle_, INVALID_HANDLE_VALUE);
       
 37304    }
       
 37305  
       
 37306    // Close the pipe to avoid further client connections.
       
 37307    if (pipe_) {
       
 37308 @@ -200,22 +213,24 @@ bool CrashGenerationServer::Start() {
       
 37309                                     TRUE,   // Manual reset.
       
 37310                                     FALSE,  // Initially signaled.
       
 37311                                     NULL);  // Name.
       
 37312    if (!overlapped_.hEvent) {
       
 37313      return false;
       
 37314    }
       
 37315  
       
 37316    // Register a callback with the thread pool for the client connection.
       
 37317 -  RegisterWaitForSingleObject(&pipe_wait_handle_,
       
 37318 -                              overlapped_.hEvent,
       
 37319 -                              OnPipeConnected,
       
 37320 -                              this,
       
 37321 -                              INFINITE,
       
 37322 -                              kPipeIOThreadFlags);
       
 37323 +  if (!RegisterWaitForSingleObject(&pipe_wait_handle_,
       
 37324 +                                   overlapped_.hEvent,
       
 37325 +                                   OnPipeConnected,
       
 37326 +                                   this,
       
 37327 +                                   INFINITE,
       
 37328 +                                   kPipeIOThreadFlags)) {
       
 37329 +    return false;
       
 37330 +  }
       
 37331  
       
 37332    pipe_ = CreateNamedPipe(pipe_name_.c_str(),
       
 37333                            kPipeAttr,
       
 37334                            kPipeMode,
       
 37335                            1,
       
 37336                            kOutBufferSize,
       
 37337                            kInBufferSize,
       
 37338                            0,
       
 37339 @@ -624,16 +639,24 @@ bool CrashGenerationServer::RespondToCli
       
 37340  
       
 37341    return success || GetLastError() == ERROR_IO_PENDING;
       
 37342  }
       
 37343  
       
 37344  // The server thread servicing the clients runs this method. The method
       
 37345  // implements the state machine described in ReadMe.txt along with the
       
 37346  // helper methods HandleXXXState.
       
 37347  void CrashGenerationServer::HandleConnectionRequest() {
       
 37348 +  // If we are shutting doen then get into ERROR state, reset the event so more
       
 37349 +  // workers don't run and return immediately.
       
 37350 +  if (shutting_down_) {
       
 37351 +    server_state_ = IPC_SERVER_STATE_ERROR;
       
 37352 +    ResetEvent(overlapped_.hEvent);
       
 37353 +    return;
       
 37354 +  }
       
 37355 +
       
 37356    switch (server_state_) {
       
 37357      case IPC_SERVER_STATE_ERROR:
       
 37358        HandleErrorState();
       
 37359        break;
       
 37360  
       
 37361      case IPC_SERVER_STATE_INITIAL:
       
 37362        HandleInitialState();
       
 37363        break;
       
 37364 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.h b/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.h
       
 37365 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.h
       
 37366 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/crash_generation_server.h
       
 37367 @@ -236,17 +236,17 @@ class CrashGenerationServer {
       
 37368  
       
 37369    // Instance of a mini dump generator.
       
 37370    scoped_ptr<MinidumpGenerator> dump_generator_;
       
 37371  
       
 37372    // State of the server in performing the IPC with the client.
       
 37373    // Note that since we restrict the pipe to one instance, we
       
 37374    // only need to keep one state of the server. Otherwise, server
       
 37375    // would have one state per client it is talking to.
       
 37376 -  IPCServerState server_state_;
       
 37377 +  volatile IPCServerState server_state_;
       
 37378  
       
 37379    // Whether the server is shutting down.
       
 37380    volatile bool shutting_down_;
       
 37381  
       
 37382    // Overlapped instance for async I/O on the pipe.
       
 37383    OVERLAPPED overlapped_;
       
 37384  
       
 37385    // Message object used in IPC with the client.
       
 37386 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.cc b/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.cc
       
 37387 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.cc
       
 37388 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.cc
       
 37389 @@ -35,22 +35,23 @@
       
 37390  #include "common/windows/string_utils-inl.h"
       
 37391  
       
 37392  #include "client/windows/common/ipc_protocol.h"
       
 37393  #include "client/windows/handler/exception_handler.h"
       
 37394  #include "common/windows/guid_string.h"
       
 37395  
       
 37396  namespace google_breakpad {
       
 37397  
       
 37398 +static const int kWaitForHandlerThreadMs = 60000;
       
 37399  static const int kExceptionHandlerThreadInitialStackSize = 64 * 1024;
       
 37400  
       
 37401  vector<ExceptionHandler*>* ExceptionHandler::handler_stack_ = NULL;
       
 37402  LONG ExceptionHandler::handler_stack_index_ = 0;
       
 37403  CRITICAL_SECTION ExceptionHandler::handler_stack_critical_section_;
       
 37404 -bool ExceptionHandler::handler_stack_critical_section_initialized_ = false;
       
 37405 +volatile LONG ExceptionHandler::instance_count_ = 0;
       
 37406  
       
 37407  ExceptionHandler::ExceptionHandler(const wstring& dump_path,
       
 37408                                     FilterCallback filter,
       
 37409                                     MinidumpCallback callback,
       
 37410                                     void* callback_context,
       
 37411                                     int handler_types,
       
 37412                                     MINIDUMP_TYPE dump_type,
       
 37413                                     const wchar_t* pipe_name,
       
 37414 @@ -83,16 +84,17 @@ ExceptionHandler::ExceptionHandler(const
       
 37415  void ExceptionHandler::Initialize(const wstring& dump_path,
       
 37416                                    FilterCallback filter,
       
 37417                                    MinidumpCallback callback,
       
 37418                                    void* callback_context,
       
 37419                                    int handler_types,
       
 37420                                    MINIDUMP_TYPE dump_type,
       
 37421                                    const wchar_t* pipe_name,
       
 37422                                    const CustomClientInfo* custom_info) {
       
 37423 +  LONG instance_count = InterlockedIncrement(&instance_count_);
       
 37424    filter_ = filter;
       
 37425    callback_ = callback;
       
 37426    callback_context_ = callback_context;
       
 37427    dump_path_c_ = NULL;
       
 37428    next_minidump_id_c_ = NULL;
       
 37429    next_minidump_path_c_ = NULL;
       
 37430    dbghelp_module_ = NULL;
       
 37431    minidump_write_dump_ = NULL;
       
 37432 @@ -101,16 +103,17 @@ void ExceptionHandler::Initialize(const 
       
 37433    uuid_create_ = NULL;
       
 37434    handler_types_ = handler_types;
       
 37435    previous_filter_ = NULL;
       
 37436  #if _MSC_VER >= 1400  // MSVC 2005/8
       
 37437    previous_iph_ = NULL;
       
 37438  #endif  // _MSC_VER >= 1400
       
 37439    previous_pch_ = NULL;
       
 37440    handler_thread_ = NULL;
       
 37441 +  is_shutdown_ = false;
       
 37442    handler_start_semaphore_ = NULL;
       
 37443    handler_finish_semaphore_ = NULL;
       
 37444    requesting_thread_id_ = 0;
       
 37445    exception_info_ = NULL;
       
 37446    assertion_ = NULL;
       
 37447    handler_return_value_ = false;
       
 37448    handle_debug_exceptions_ = false;
       
 37449  
       
 37450 @@ -172,22 +175,32 @@ void ExceptionHandler::Initialize(const 
       
 37451            GetProcAddress(rpcrt4_module_, "UuidCreate"));
       
 37452      }
       
 37453  
       
 37454      // set_dump_path calls UpdateNextID.  This sets up all of the path and id
       
 37455      // strings, and their equivalent c_str pointers.
       
 37456      set_dump_path(dump_path);
       
 37457    }
       
 37458  
       
 37459 +  // There is a race condition here. If the first instance has not yet
       
 37460 +  // initialized the critical section, the second (and later) instances may
       
 37461 +  // try to use uninitialized critical section object. The feature of multiple
       
 37462 +  // instances in one module is not used much, so leave it as is for now.
       
 37463 +  // One way to solve this in the current design (that is, keeping the static
       
 37464 +  // handler stack) is to use spin locks with volatile bools to synchronize
       
 37465 +  // the handler stack. This works only if the compiler guarantees to generate
       
 37466 +  // cache coherent code for volatile.
       
 37467 +  // TODO(munjal): Fix this in a better way by changing the design if possible.
       
 37468 +
       
 37469 +  // Lazy initialization of the handler_stack_critical_section_
       
 37470 +  if (instance_count == 1) {
       
 37471 +    InitializeCriticalSection(&handler_stack_critical_section_);
       
 37472 +  }
       
 37473 +
       
 37474    if (handler_types != HANDLER_NONE) {
       
 37475 -    if (!handler_stack_critical_section_initialized_) {
       
 37476 -      InitializeCriticalSection(&handler_stack_critical_section_);
       
 37477 -      handler_stack_critical_section_initialized_ = true;
       
 37478 -    }
       
 37479 -
       
 37480      EnterCriticalSection(&handler_stack_critical_section_);
       
 37481  
       
 37482      // The first time an ExceptionHandler that installs a handler is
       
 37483      // created, set up the handler stack.
       
 37484      if (!handler_stack_) {
       
 37485        handler_stack_ = new vector<ExceptionHandler*>();
       
 37486      }
       
 37487      handler_stack_->push_back(this);
       
 37488 @@ -231,22 +244,22 @@ ExceptionHandler::~ExceptionHandler() {
       
 37489        _set_purecall_handler(previous_pch_);
       
 37490  
       
 37491      if (handler_stack_->back() == this) {
       
 37492        handler_stack_->pop_back();
       
 37493      } else {
       
 37494        // TODO(mmentovai): use advapi32!ReportEvent to log the warning to the
       
 37495        // system's application event log.
       
 37496        fprintf(stderr, "warning: removing Breakpad handler out of order\n");
       
 37497 -      for (vector<ExceptionHandler*>::iterator iterator =
       
 37498 -               handler_stack_->begin();
       
 37499 -           iterator != handler_stack_->end();
       
 37500 -           ++iterator) {
       
 37501 +      vector<ExceptionHandler*>::iterator iterator = handler_stack_->begin();
       
 37502 +      while (iterator != handler_stack_->end()) {
       
 37503          if (*iterator == this) {
       
 37504 -          handler_stack_->erase(iterator);
       
 37505 +          iterator = handler_stack_->erase(iterator);
       
 37506 +        } else {
       
 37507 +          ++iterator;
       
 37508          }
       
 37509        }
       
 37510      }
       
 37511  
       
 37512      if (handler_stack_->empty()) {
       
 37513        // When destroying the last ExceptionHandler that installed a handler,
       
 37514        // clean up the handler stack.
       
 37515        delete handler_stack_;
       
 37516 @@ -254,45 +267,76 @@ ExceptionHandler::~ExceptionHandler() {
       
 37517      }
       
 37518  
       
 37519      LeaveCriticalSection(&handler_stack_critical_section_);
       
 37520    }
       
 37521  
       
 37522    // Some of the objects were only initialized if out of process
       
 37523    // registration was not done.
       
 37524    if (!IsOutOfProcess()) {
       
 37525 -    // Clean up the handler thread and synchronization primitives.
       
 37526 +#ifdef BREAKPAD_NO_TERMINATE_THREAD
       
 37527 +    // Clean up the handler thread and synchronization primitives. The handler
       
 37528 +    // thread is either waiting on the semaphore to handle a crash or it is
       
 37529 +    // handling a crash. Coming out of the wait is fast but wait more in the
       
 37530 +    // eventuality a crash is handled.  This compilation option results in a
       
 37531 +    // deadlock if the exception handler is destroyed while executing code
       
 37532 +    // inside DllMain.
       
 37533 +    is_shutdown_ = true;
       
 37534 +    ReleaseSemaphore(handler_start_semaphore_, 1, NULL);
       
 37535 +    WaitForSingleObject(handler_thread_, kWaitForHandlerThreadMs);
       
 37536 +#else
       
 37537      TerminateThread(handler_thread_, 1);
       
 37538 +#endif  // BREAKPAD_NO_TERMINATE_THREAD
       
 37539 +
       
 37540 +    CloseHandle(handler_thread_);
       
 37541 +    handler_thread_ = NULL;
       
 37542      DeleteCriticalSection(&handler_critical_section_);
       
 37543      CloseHandle(handler_start_semaphore_);
       
 37544      CloseHandle(handler_finish_semaphore_);
       
 37545    }
       
 37546 +
       
 37547 +  // There is a race condition in the code below: if this instance is
       
 37548 +  // deleting the static critical section and a new instance of the class
       
 37549 +  // is created, then there is a possibility that the critical section be
       
 37550 +  // initialized while the same critical section is being deleted. Given the
       
 37551 +  // usage pattern for the code, this race condition is unlikely to hit, but it
       
 37552 +  // is a race condition nonetheless.
       
 37553 +  if (InterlockedDecrement(&instance_count_) == 0) {
       
 37554 +    DeleteCriticalSection(&handler_stack_critical_section_);
       
 37555 +  }
       
 37556  }
       
 37557  
       
 37558  // static
       
 37559  DWORD ExceptionHandler::ExceptionHandlerThreadMain(void* lpParameter) {
       
 37560    ExceptionHandler* self = reinterpret_cast<ExceptionHandler *>(lpParameter);
       
 37561    assert(self);
       
 37562    assert(self->handler_start_semaphore_ != NULL);
       
 37563    assert(self->handler_finish_semaphore_ != NULL);
       
 37564  
       
 37565    while (true) {
       
 37566      if (WaitForSingleObject(self->handler_start_semaphore_, INFINITE) ==
       
 37567          WAIT_OBJECT_0) {
       
 37568        // Perform the requested action.
       
 37569 -      self->handler_return_value_ = self->WriteMinidumpWithException(
       
 37570 -          self->requesting_thread_id_, self->exception_info_, self->assertion_);
       
 37571 +      if (self->is_shutdown_) {
       
 37572 +        // The instance of the exception handler is being destroyed.
       
 37573 +        break;
       
 37574 +      } else {
       
 37575 +        self->handler_return_value_ =
       
 37576 +            self->WriteMinidumpWithException(self->requesting_thread_id_,
       
 37577 +                                             self->exception_info_,
       
 37578 +                                             self->assertion_);
       
 37579 +      }
       
 37580  
       
 37581        // Allow the requesting thread to proceed.
       
 37582        ReleaseSemaphore(self->handler_finish_semaphore_, 1, NULL);
       
 37583      }
       
 37584    }
       
 37585  
       
 37586 -  // Not reached.  This thread will be terminated by ExceptionHandler's
       
 37587 -  // destructor.
       
 37588 +  // This statement is not reached when the thread is unconditionally
       
 37589 +  // terminated by the ExceptionHandler destructor.
       
 37590    return 0;
       
 37591  }
       
 37592  
       
 37593  // HandleException and HandleInvalidParameter must create an
       
 37594  // AutoExceptionHandler object to maintain static state and to determine which
       
 37595  // ExceptionHandler instance to use.  The constructor locates the correct
       
 37596  // instance, and makes it available through get_handler().  The destructor
       
 37597  // restores the state in effect prior to allocating the AutoExceptionHandler.
       
 37598 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.h b/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.h
       
 37599 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.h
       
 37600 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler.h
       
 37601 @@ -335,16 +335,22 @@ class ExceptionHandler {
       
 37602  
       
 37603    // The CRT allows you to override the default handler for pure
       
 37604    // virtual function calls.
       
 37605    _purecall_handler previous_pch_;
       
 37606  
       
 37607    // The exception handler thread.
       
 37608    HANDLE handler_thread_;
       
 37609  
       
 37610 +  // True if the exception handler is being destroyed.
       
 37611 +  // Starting with MSVC 2005, Visual C has stronger guarantees on volatile vars.
       
 37612 +  // It has release semantics on write and acquire semantics on reads.
       
 37613 +  // See the msdn documentation.
       
 37614 +  volatile bool is_shutdown_;
       
 37615 +
       
 37616    // The critical section enforcing the requirement that only one exception be
       
 37617    // handled by a handler at a time.
       
 37618    CRITICAL_SECTION handler_critical_section_;
       
 37619  
       
 37620    // Semaphores used to move exception handling between the exception thread
       
 37621    // and the handler thread.  handler_start_semaphore_ is signalled by the
       
 37622    // exception thread to wake up the handler thread when an exception occurs.
       
 37623    // handler_finish_semaphore_ is signalled by the handler thread to wake up
       
 37624 @@ -385,21 +391,22 @@ class ExceptionHandler {
       
 37625  
       
 37626    // The index of the ExceptionHandler in handler_stack_ that will handle the
       
 37627    // next exception.  Note that 0 means the last entry in handler_stack_, 1
       
 37628    // means the next-to-last entry, and so on.  This is used by HandleException
       
 37629    // to support multiple stacked Breakpad handlers.
       
 37630    static LONG handler_stack_index_;
       
 37631  
       
 37632    // handler_stack_critical_section_ guards operations on handler_stack_ and
       
 37633 -  // handler_stack_index_.
       
 37634 +  // handler_stack_index_. The critical section is initialized by the
       
 37635 +  // first instance of the class and destroyed by the last instance of it.
       
 37636    static CRITICAL_SECTION handler_stack_critical_section_;
       
 37637  
       
 37638 -  // True when handler_stack_critical_section_ has been initialized.
       
 37639 -  static bool handler_stack_critical_section_initialized_;
       
 37640 +  // The number of instances of this class.
       
 37641 +  volatile static LONG instance_count_;
       
 37642  
       
 37643    // disallow copy ctor and operator=
       
 37644    explicit ExceptionHandler(const ExceptionHandler &);
       
 37645    void operator=(const ExceptionHandler &);
       
 37646  };
       
 37647  
       
 37648  }  // namespace google_breakpad
       
 37649  
       
 37650 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler_test/exception_handler_test.cc b/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler_test/exception_handler_test.cc
       
 37651 new file mode 100644
       
 37652 --- /dev/null
       
 37653 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler_test/exception_handler_test.cc
       
 37654 @@ -0,0 +1,164 @@
       
 37655 +// Copyright 2009, Google Inc.
       
 37656 +// All rights reserved.
       
 37657 +//
       
 37658 +// Redistribution and use in source and binary forms, with or without
       
 37659 +// modification, are permitted provided that the following conditions are
       
 37660 +// met:
       
 37661 +//
       
 37662 +//     * Redistributions of source code must retain the above copyright
       
 37663 +// notice, this list of conditions and the following disclaimer.
       
 37664 +//     * Redistributions in binary form must reproduce the above
       
 37665 +// copyright notice, this list of conditions and the following disclaimer
       
 37666 +// in the documentation and/or other materials provided with the
       
 37667 +// distribution.
       
 37668 +//     * Neither the name of Google Inc. nor the names of its
       
 37669 +// contributors may be used to endorse or promote products derived from
       
 37670 +// this software without specific prior written permission.
       
 37671 +//
       
 37672 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 37673 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 37674 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 37675 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 37676 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 37677 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 37678 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 37679 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 37680 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 37681 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 37682 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 37683 +
       
 37684 +#include "breakpad_googletest_includes.h"
       
 37685 +#include "client/windows/crash_generation/crash_generation_server.h"
       
 37686 +#include "client/windows/handler/exception_handler.h"
       
 37687 +#include <windows.h>
       
 37688 +#include <dbghelp.h>
       
 37689 +#include <strsafe.h>
       
 37690 +#include <objbase.h>
       
 37691 +#include <shellapi.h>
       
 37692 +
       
 37693 +namespace {
       
 37694 +const wchar_t kPipeName[] = L"\\\\.\\pipe\\BreakpadCrashTest\\TestCaseServer";
       
 37695 +const char kSuccessIndicator[] = "success";
       
 37696 +const char kFailureIndicator[] = "failure";
       
 37697 +
       
 37698 +// Utility function to test for a path's existence.
       
 37699 +BOOL DoesPathExist(const TCHAR *path_name);
       
 37700 +
       
 37701 +class ExceptionHandlerDeathTest : public ::testing::Test {
       
 37702 +protected:
       
 37703 +  // Member variable for each test that they can use
       
 37704 +  // for temporary storage.
       
 37705 +  TCHAR temp_path_[MAX_PATH];
       
 37706 +  // Actually constructs a temp path name.
       
 37707 +  virtual void SetUp();
       
 37708 +  // A helper method that tests can use to crash.
       
 37709 +  void DoCrash();
       
 37710 +};
       
 37711 +
       
 37712 +void ExceptionHandlerDeathTest::SetUp() {
       
 37713 +  const ::testing::TestInfo* const test_info =
       
 37714 +    ::testing::UnitTest::GetInstance()->current_test_info();
       
 37715 +  TCHAR temp_path[MAX_PATH] = { '\0' };
       
 37716 +  TCHAR test_name_wide[MAX_PATH] = { '\0' };
       
 37717 +  // We want the temporary directory to be what the OS returns
       
 37718 +  // to us, + the test case name.  
       
 37719 +  GetTempPath(MAX_PATH, temp_path);
       
 37720 +  // THe test case name is exposed to use as a c-style string,
       
 37721 +  // But we might be working in UNICODE here on Windows.
       
 37722 +  int dwRet = MultiByteToWideChar(CP_ACP, 0, test_info->name(), 
       
 37723 +    (int)strlen(test_info->name()), test_name_wide, MAX_PATH);
       
 37724 +  if (!dwRet) {
       
 37725 +    assert(false);
       
 37726 +  }
       
 37727 +  StringCchPrintfW(temp_path_, MAX_PATH, L"%s%s", temp_path, test_name_wide);
       
 37728 +  CreateDirectory(temp_path_, NULL);
       
 37729 +}
       
 37730 +
       
 37731 +BOOL DoesPathExist(const TCHAR *path_name) {
       
 37732 +  DWORD flags = GetFileAttributes(path_name);
       
 37733 +  if (flags == INVALID_FILE_ATTRIBUTES) {
       
 37734 +    return FALSE;
       
 37735 +  }
       
 37736 +  return TRUE;
       
 37737 +}
       
 37738 +
       
 37739 +bool MinidumpWrittenCallback(const wchar_t* dump_path, 
       
 37740 +                             const wchar_t* minidump_id,
       
 37741 +                             void* context,
       
 37742 +                             EXCEPTION_POINTERS* exinfo,
       
 37743 +                             MDRawAssertionInfo* assertion,
       
 37744 +                             bool succeeded) {
       
 37745 +  if (succeeded && DoesPathExist(dump_path)) {
       
 37746 +    fprintf(stderr, kSuccessIndicator);
       
 37747 +  } else {
       
 37748 +    fprintf(stderr, kFailureIndicator);
       
 37749 +  }
       
 37750 +  // If we don't flush, the output doesn't get sent before
       
 37751 +  // this process dies.
       
 37752 +  fflush(stderr);
       
 37753 +  return succeeded;
       
 37754 +}
       
 37755 +
       
 37756 +TEST_F(ExceptionHandlerDeathTest, InProcTest) {
       
 37757 +  // For the in-proc test, we just need to instantiate an exception
       
 37758 +  // handler in in-proc mode, and crash.   Since the entire test is
       
 37759 +  // reexecuted in the child process, we don't have to worry about
       
 37760 +  // the semantics of the exception handler being inherited/not
       
 37761 +  // inherited across CreateProcess().
       
 37762 +  ASSERT_TRUE(DoesPathExist(temp_path_));
       
 37763 +  google_breakpad::ExceptionHandler *exc = 
       
 37764 +    new google_breakpad::ExceptionHandler(
       
 37765 +    temp_path_, NULL, &MinidumpWrittenCallback, NULL, 
       
 37766 +    google_breakpad::ExceptionHandler::HANDLER_ALL);
       
 37767 +  int *i = NULL;  
       
 37768 +  ASSERT_DEATH((*i)++, kSuccessIndicator);
       
 37769 +  delete exc;
       
 37770 +}
       
 37771 +
       
 37772 +static bool gDumpCallbackCalled = false;
       
 37773 +
       
 37774 +void clientDumpCallback(void *dump_context,
       
 37775 +                        const google_breakpad::ClientInfo *client_info,
       
 37776 +                        const std::wstring *dump_path){
       
 37777 +
       
 37778 +  gDumpCallbackCalled = true;
       
 37779 +}
       
 37780 +
       
 37781 +void ExceptionHandlerDeathTest::DoCrash() {
       
 37782 +  google_breakpad::ExceptionHandler *exc = 
       
 37783 +    new google_breakpad::ExceptionHandler(
       
 37784 +    temp_path_, NULL, NULL, NULL,
       
 37785 +    google_breakpad::ExceptionHandler::HANDLER_ALL, MiniDumpNormal, kPipeName,
       
 37786 +    NULL);
       
 37787 +  // Although this is executing in the child process of the death test,
       
 37788 +  // if it's not true we'll still get an error rather than the crash 
       
 37789 +  // being expected.
       
 37790 +  ASSERT_TRUE(exc->IsOutOfProcess());
       
 37791 +  int *i = NULL;
       
 37792 +  printf("%d\n", (*i)++);
       
 37793 +}
       
 37794 +
       
 37795 +TEST_F(ExceptionHandlerDeathTest, OutOfProcTest) {
       
 37796 +  // We can take advantage of a detail of google test here to save some
       
 37797 +  // complexity in testing: when you do a death test, it actually forks.
       
 37798 +  // So we can make the main test harness the crash generation server, 
       
 37799 +  // and call ASSERT_DEATH on a NULL dereference, it to expecting test
       
 37800 +  // the out of process scenario, since it's happening in a different
       
 37801 +  // process!  This is different from the above because, above, we pass
       
 37802 +  // a NULL pipe name, and we also don't start a crash generation server.
       
 37803 +
       
 37804 +  ASSERT_TRUE(DoesPathExist(temp_path_));
       
 37805 +  std::wstring dump_path(temp_path_);
       
 37806 +  google_breakpad::CrashGenerationServer server(
       
 37807 +    kPipeName, NULL, NULL, NULL, &clientDumpCallback, NULL, NULL, NULL, true,
       
 37808 +    &dump_path);
       
 37809 +  
       
 37810 +  // This HAS to be EXPECT_, because when this test case is executed in the
       
 37811 +  // child process, the server registration will fail due to the named pipe
       
 37812 +  // being the same.
       
 37813 +  EXPECT_TRUE(server.Start());
       
 37814 +  EXPECT_FALSE(gDumpCallbackCalled);
       
 37815 +  ASSERT_DEATH(this->DoCrash(), "");
       
 37816 +  EXPECT_TRUE(gDumpCallbackCalled);
       
 37817 +}
       
 37818 +}
       
 37819 \ No newline at end of file
       
 37820 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler_test/exception_handler_test.vcproj b/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler_test/exception_handler_test.vcproj
       
 37821 new file mode 100644
       
 37822 --- /dev/null
       
 37823 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/handler/exception_handler_test/exception_handler_test.vcproj
       
 37824 @@ -0,0 +1,266 @@
       
 37825 +<?xml version="1.0" encoding="Windows-1252"?>
       
 37826 +<VisualStudioProject
       
 37827 +	ProjectType="Visual C++"
       
 37828 +	Version="8.00"
       
 37829 +	Name="exception_handler_test"
       
 37830 +	ProjectGUID="{89094A11-CF25-4037-AF43-EACFA751405E}"
       
 37831 +	RootNamespace="exception_handler_test"
       
 37832 +	Keyword="Win32Proj"
       
 37833 +	>
       
 37834 +	<Platforms>
       
 37835 +		<Platform
       
 37836 +			Name="Win32"
       
 37837 +		/>
       
 37838 +	</Platforms>
       
 37839 +	<ToolFiles>
       
 37840 +	</ToolFiles>
       
 37841 +	<Configurations>
       
 37842 +		<Configuration
       
 37843 +			Name="Debug|Win32"
       
 37844 +			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
       
 37845 +			IntermediateDirectory="$(ConfigurationName)"
       
 37846 +			ConfigurationType="1"
       
 37847 +			CharacterSet="1"
       
 37848 +			>
       
 37849 +			<Tool
       
 37850 +				Name="VCPreBuildEventTool"
       
 37851 +			/>
       
 37852 +			<Tool
       
 37853 +				Name="VCCustomBuildTool"
       
 37854 +				Description=""
       
 37855 +				CommandLine=""
       
 37856 +				Outputs=""
       
 37857 +			/>
       
 37858 +			<Tool
       
 37859 +				Name="VCXMLDataGeneratorTool"
       
 37860 +			/>
       
 37861 +			<Tool
       
 37862 +				Name="VCWebServiceProxyGeneratorTool"
       
 37863 +			/>
       
 37864 +			<Tool
       
 37865 +				Name="VCMIDLTool"
       
 37866 +			/>
       
 37867 +			<Tool
       
 37868 +				Name="VCCLCompilerTool"
       
 37869 +				Optimization="0"
       
 37870 +				AdditionalIncludeDirectories="..\..\..\..\testing;..\..\..\..\testing\include;..\..\..\..\testing\gtest;..\..\..\..\testing\gtest\include;..\..\..\..\"
       
 37871 +				PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500"
       
 37872 +				MinimalRebuild="true"
       
 37873 +				BasicRuntimeChecks="3"
       
 37874 +				RuntimeLibrary="3"
       
 37875 +				UsePrecompiledHeader="0"
       
 37876 +				WarningLevel="3"
       
 37877 +				Detect64BitPortabilityProblems="true"
       
 37878 +				DebugInformationFormat="4"
       
 37879 +			/>
       
 37880 +			<Tool
       
 37881 +				Name="VCManagedResourceCompilerTool"
       
 37882 +			/>
       
 37883 +			<Tool
       
 37884 +				Name="VCResourceCompilerTool"
       
 37885 +			/>
       
 37886 +			<Tool
       
 37887 +				Name="VCPreLinkEventTool"
       
 37888 +			/>
       
 37889 +			<Tool
       
 37890 +				Name="VCLinkerTool"
       
 37891 +				LinkIncremental="2"
       
 37892 +				GenerateDebugInformation="true"
       
 37893 +				SubSystem="1"
       
 37894 +				TargetMachine="1"
       
 37895 +			/>
       
 37896 +			<Tool
       
 37897 +				Name="VCALinkTool"
       
 37898 +			/>
       
 37899 +			<Tool
       
 37900 +				Name="VCManifestTool"
       
 37901 +			/>
       
 37902 +			<Tool
       
 37903 +				Name="VCXDCMakeTool"
       
 37904 +			/>
       
 37905 +			<Tool
       
 37906 +				Name="VCBscMakeTool"
       
 37907 +			/>
       
 37908 +			<Tool
       
 37909 +				Name="VCFxCopTool"
       
 37910 +			/>
       
 37911 +			<Tool
       
 37912 +				Name="VCAppVerifierTool"
       
 37913 +			/>
       
 37914 +			<Tool
       
 37915 +				Name="VCWebDeploymentTool"
       
 37916 +			/>
       
 37917 +			<Tool
       
 37918 +				Name="VCPostBuildEventTool"
       
 37919 +				Description="Running tests"
       
 37920 +				CommandLine="$(OutDir)\$(ProjectName).exe"
       
 37921 +			/>
       
 37922 +		</Configuration>
       
 37923 +		<Configuration
       
 37924 +			Name="Release|Win32"
       
 37925 +			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
       
 37926 +			IntermediateDirectory="$(ConfigurationName)"
       
 37927 +			ConfigurationType="1"
       
 37928 +			CharacterSet="1"
       
 37929 +			WholeProgramOptimization="1"
       
 37930 +			>
       
 37931 +			<Tool
       
 37932 +				Name="VCPreBuildEventTool"
       
 37933 +			/>
       
 37934 +			<Tool
       
 37935 +				Name="VCCustomBuildTool"
       
 37936 +			/>
       
 37937 +			<Tool
       
 37938 +				Name="VCXMLDataGeneratorTool"
       
 37939 +			/>
       
 37940 +			<Tool
       
 37941 +				Name="VCWebServiceProxyGeneratorTool"
       
 37942 +			/>
       
 37943 +			<Tool
       
 37944 +				Name="VCMIDLTool"
       
 37945 +			/>
       
 37946 +			<Tool
       
 37947 +				Name="VCCLCompilerTool"
       
 37948 +				AdditionalIncludeDirectories="..\..\..\..\testing;..\..\..\..\testing\include;..\..\..\..\testing\gtest;..\..\..\..\testing\gtest\include;..\..\..\..\"
       
 37949 +				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500"
       
 37950 +				RuntimeLibrary="2"
       
 37951 +				UsePrecompiledHeader="0"
       
 37952 +				WarningLevel="3"
       
 37953 +				Detect64BitPortabilityProblems="true"
       
 37954 +				DebugInformationFormat="3"
       
 37955 +			/>
       
 37956 +			<Tool
       
 37957 +				Name="VCManagedResourceCompilerTool"
       
 37958 +			/>
       
 37959 +			<Tool
       
 37960 +				Name="VCResourceCompilerTool"
       
 37961 +			/>
       
 37962 +			<Tool
       
 37963 +				Name="VCPreLinkEventTool"
       
 37964 +			/>
       
 37965 +			<Tool
       
 37966 +				Name="VCLinkerTool"
       
 37967 +				LinkIncremental="1"
       
 37968 +				GenerateDebugInformation="true"
       
 37969 +				SubSystem="1"
       
 37970 +				OptimizeReferences="2"
       
 37971 +				EnableCOMDATFolding="2"
       
 37972 +				TargetMachine="1"
       
 37973 +			/>
       
 37974 +			<Tool
       
 37975 +				Name="VCALinkTool"
       
 37976 +			/>
       
 37977 +			<Tool
       
 37978 +				Name="VCManifestTool"
       
 37979 +			/>
       
 37980 +			<Tool
       
 37981 +				Name="VCXDCMakeTool"
       
 37982 +			/>
       
 37983 +			<Tool
       
 37984 +				Name="VCBscMakeTool"
       
 37985 +			/>
       
 37986 +			<Tool
       
 37987 +				Name="VCFxCopTool"
       
 37988 +			/>
       
 37989 +			<Tool
       
 37990 +				Name="VCAppVerifierTool"
       
 37991 +			/>
       
 37992 +			<Tool
       
 37993 +				Name="VCWebDeploymentTool"
       
 37994 +			/>
       
 37995 +			<Tool
       
 37996 +				Name="VCPostBuildEventTool"
       
 37997 +				Description="Running tests"
       
 37998 +				CommandLine="$(OutDir)\$(ProjectName).exe"
       
 37999 +			/>
       
 38000 +		</Configuration>
       
 38001 +	</Configurations>
       
 38002 +	<References>
       
 38003 +	</References>
       
 38004 +	<Files>
       
 38005 +		<Filter
       
 38006 +			Name="Source Files"
       
 38007 +			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
       
 38008 +			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
       
 38009 +			>
       
 38010 +			<File
       
 38011 +				RelativePath="..\..\crash_generation\client_info.cc"
       
 38012 +				>
       
 38013 +			</File>
       
 38014 +			<File
       
 38015 +				RelativePath="..\..\crash_generation\crash_generation_client.cc"
       
 38016 +				>
       
 38017 +			</File>
       
 38018 +			<File
       
 38019 +				RelativePath="..\..\crash_generation\crash_generation_server.cc"
       
 38020 +				>
       
 38021 +			</File>
       
 38022 +			<File
       
 38023 +				RelativePath="..\exception_handler.cc"
       
 38024 +				>
       
 38025 +			</File>
       
 38026 +			<File
       
 38027 +				RelativePath=".\exception_handler_test.cc"
       
 38028 +				>
       
 38029 +			</File>
       
 38030 +			<File
       
 38031 +				RelativePath="..\..\..\..\testing\gtest\src\gtest-all.cc"
       
 38032 +				>
       
 38033 +			</File>
       
 38034 +			<File
       
 38035 +				RelativePath="..\..\..\..\testing\gtest\src\gtest_main.cc"
       
 38036 +				>
       
 38037 +			</File>
       
 38038 +			<File
       
 38039 +				RelativePath="..\..\..\..\common\windows\guid_string.cc"
       
 38040 +				>
       
 38041 +			</File>
       
 38042 +			<File
       
 38043 +				RelativePath="..\..\crash_generation\minidump_generator.cc"
       
 38044 +				>
       
 38045 +			</File>
       
 38046 +		</Filter>
       
 38047 +		<Filter
       
 38048 +			Name="Header Files"
       
 38049 +			Filter="h;hpp;hxx;hm;inl;inc;xsd"
       
 38050 +			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
       
 38051 +			>
       
 38052 +			<File
       
 38053 +				RelativePath="..\..\crash_generation\client_info.h"
       
 38054 +				>
       
 38055 +			</File>
       
 38056 +			<File
       
 38057 +				RelativePath="..\..\crash_generation\crash_generation_client.h"
       
 38058 +				>
       
 38059 +			</File>
       
 38060 +			<File
       
 38061 +				RelativePath="..\..\crash_generation\crash_generation_server.h"
       
 38062 +				>
       
 38063 +			</File>
       
 38064 +			<File
       
 38065 +				RelativePath="..\exception_handler.h"
       
 38066 +				>
       
 38067 +			</File>
       
 38068 +			<File
       
 38069 +				RelativePath="..\..\..\..\common\windows\guid_string.h"
       
 38070 +				>
       
 38071 +			</File>
       
 38072 +			<File
       
 38073 +				RelativePath="..\..\crash_generation\minidump_generator.h"
       
 38074 +				>
       
 38075 +			</File>
       
 38076 +		</Filter>
       
 38077 +		<Filter
       
 38078 +			Name="Resource Files"
       
 38079 +			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
       
 38080 +			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
       
 38081 +			>
       
 38082 +		</Filter>
       
 38083 +		<File
       
 38084 +			RelativePath=".\ReadMe.txt"
       
 38085 +			>
       
 38086 +		</File>
       
 38087 +	</Files>
       
 38088 +	<Globals>
       
 38089 +	</Globals>
       
 38090 +</VisualStudioProject>
       
 38091 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.cc b/toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.cc
       
 38092 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.cc
       
 38093 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.cc
       
 38094 @@ -64,17 +64,17 @@ ReportResult CrashReportSender::SendCras
       
 38095    if (today == last_sent_date_ &&
       
 38096        max_reports_per_day_ != -1 &&
       
 38097        reports_sent_ >= max_reports_per_day_) {
       
 38098      return RESULT_THROTTLED;
       
 38099    }
       
 38100  
       
 38101    int http_response = 0;
       
 38102    bool result = HTTPUpload::SendRequest(
       
 38103 -    url, parameters, dump_file_name, L"upload_file_minidump", report_code,
       
 38104 +    url, parameters, dump_file_name, L"upload_file_minidump", NULL, report_code,
       
 38105      &http_response);
       
 38106  
       
 38107    if (result) {
       
 38108      ReportSent(today);
       
 38109      return RESULT_SUCCEEDED;
       
 38110    } else if (http_response == 400) {  // TODO: update if/when the server
       
 38111                                        //       switches to a different code
       
 38112      return RESULT_REJECTED;
       
 38113 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.vcproj b/toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.vcproj
       
 38114 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.vcproj
       
 38115 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/sender/crash_report_sender.vcproj
       
 38116 @@ -41,18 +41,18 @@
       
 38117  				Name="VCCLCompilerTool"
       
 38118  				Optimization="0"
       
 38119  				AdditionalIncludeDirectories="..\..\.."
       
 38120  				PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN"
       
 38121  				MinimalRebuild="true"
       
 38122  				BasicRuntimeChecks="3"
       
 38123  				RuntimeLibrary="3"
       
 38124  				UsePrecompiledHeader="0"
       
 38125 -				WarningLevel="3"
       
 38126 -				Detect64BitPortabilityProblems="true"
       
 38127 +				WarningLevel="4"
       
 38128 +				Detect64BitPortabilityProblems="false"
       
 38129  				DebugInformationFormat="4"
       
 38130  			/>
       
 38131  			<Tool
       
 38132  				Name="VCManagedResourceCompilerTool"
       
 38133  			/>
       
 38134  			<Tool
       
 38135  				Name="VCResourceCompilerTool"
       
 38136  			/>
       
 38137 diff --git a/toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc b/toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc
       
 38138 --- a/toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc
       
 38139 +++ b/toolkit/crashreporter/google-breakpad/src/client/windows/tests/crash_generation_app/crash_generation_app.cc
       
 38140 @@ -178,17 +178,17 @@ bool ShowDumpResults(const wchar_t* dump
       
 38141    int result = swprintf_s(text,
       
 38142                            kMaximumLineLength,
       
 38143                            TEXT("Dump generation request %s\r\n"),
       
 38144                            succeeded ? TEXT("succeeded") : TEXT("failed"));
       
 38145    if (result == -1) {
       
 38146      delete [] text;
       
 38147    }
       
 38148  
       
 38149 -  AppendTextWorker(text);
       
 38150 +  QueueUserWorkItem(AppendTextWorker, text, WT_EXECUTEDEFAULT);
       
 38151    return succeeded;
       
 38152  }
       
 38153  
       
 38154  static void _cdecl ShowClientConnected(void* context,
       
 38155                                         const ClientInfo* client_info) {
       
 38156    TCHAR* line = new TCHAR[kMaximumLineLength];
       
 38157    line[0] = _T('\0');
       
 38158    int result = swprintf_s(line,
       
 38159 @@ -462,16 +462,17 @@ int APIENTRY _tWinMain(HINSTANCE instanc
       
 38160    UNREFERENCED_PARAMETER(previous_instance);
       
 38161    UNREFERENCED_PARAMETER(command_line);
       
 38162  
       
 38163    cs_edit = new CRITICAL_SECTION();
       
 38164    InitializeCriticalSection(cs_edit);
       
 38165  
       
 38166    CustomClientInfo custom_info = {kCustomInfoEntries, kCustomInfoCount};
       
 38167  
       
 38168 +  CrashServerStart();
       
 38169    // This is needed for CRT to not show dialog for invalid param
       
 38170    // failures and instead let the code handle it.
       
 38171    _CrtSetReportMode(_CRT_ASSERT, 0);
       
 38172    handler = new ExceptionHandler(L"C:\\dumps\\",
       
 38173                                   NULL,
       
 38174                                   google_breakpad::ShowDumpResults,
       
 38175                                   NULL,
       
 38176                                   ExceptionHandler::HANDLER_ALL,
       
 38177 diff --git a/toolkit/crashreporter/google-breakpad/src/common/Makefile.in b/toolkit/crashreporter/google-breakpad/src/common/Makefile.in
       
 38178 --- a/toolkit/crashreporter/google-breakpad/src/common/Makefile.in
       
 38179 +++ b/toolkit/crashreporter/google-breakpad/src/common/Makefile.in
       
 38180 @@ -42,16 +42,20 @@ VPATH		= @srcdir@
       
 38181  include $(DEPTH)/config/autoconf.mk
       
 38182  
       
 38183  MODULE		= breakpad_common
       
 38184  LIBRARY_NAME	= breakpad_common_s
       
 38185  HOST_LIBRARY_NAME = host_breakpad_common_s
       
 38186  
       
 38187  LOCAL_INCLUDES 	= -I$(srcdir)/..
       
 38188  
       
 38189 +ifeq ($(OS_ARCH),Darwin)
       
 38190 +DIRS = dwarf
       
 38191 +endif
       
 38192 +
       
 38193  CPPSRCS	= \
       
 38194    string_conversion.cc \
       
 38195    $(NULL)
       
 38196  
       
 38197  CSRCS = \
       
 38198    convert_UTF.c \
       
 38199    md5.c \
       
 38200    $(NULL)
       
 38201 @@ -60,14 +64,8 @@ HOST_CPPSRCS = $(CPPSRCS)
       
 38202  
       
 38203  HOST_CSRCS = $(CSRCS)
       
 38204  
       
 38205  # need static lib
       
 38206  FORCE_STATIC_LIB = 1
       
 38207  FORCE_USE_PIC = 1
       
 38208  
       
 38209  include $(topsrcdir)/config/rules.mk
       
 38210 -
       
 38211 -# XXX, bug 417045, make -jN combines badly with -save-temps in
       
 38212 -# CFLAGS/CXXFLAGS (for stabs symbols with XCode3)
       
 38213 -ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
       
 38214 -.NOTPARALLEL:
       
 38215 -endif
       
 38216 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/Makefile.in b/toolkit/crashreporter/google-breakpad/src/common/dwarf/Makefile.in
       
 38217 new file mode 100644
       
 38218 --- /dev/null
       
 38219 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/Makefile.in
       
 38220 @@ -0,0 +1,61 @@
       
 38221 +# ***** BEGIN LICENSE BLOCK *****
       
 38222 +# Version: MPL 1.1/GPL 2.0/LGPL 2.1
       
 38223 +#
       
 38224 +# The contents of this file are subject to the Mozilla Public License Version
       
 38225 +# 1.1 (the "License"); you may not use this file except in compliance with
       
 38226 +# the License. You may obtain a copy of the License at
       
 38227 +# http://www.mozilla.org/MPL/
       
 38228 +#
       
 38229 +# Software distributed under the License is distributed on an "AS IS" basis,
       
 38230 +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
       
 38231 +# for the specific language governing rights and limitations under the
       
 38232 +# License.
       
 38233 +#
       
 38234 +# The Original Code is Mozilla Breakpad integration
       
 38235 +#
       
 38236 +# The Initial Developer of the Original Code is
       
 38237 +# The Mozilla Foundation
       
 38238 +# Portions created by the Initial Developer are Copyright (C) 2008
       
 38239 +# the Initial Developer. All Rights Reserved.
       
 38240 +#
       
 38241 +# Contributor(s):
       
 38242 +# Ted Mielczarek <ted.mielczarek@gmail.com>
       
 38243 +#
       
 38244 +# Alternatively, the contents of this file may be used under the terms of
       
 38245 +# either the GNU General Public License Version 2 or later (the "GPL"), or
       
 38246 +# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
       
 38247 +# in which case the provisions of the GPL or the LGPL are applicable instead
       
 38248 +# of those above. If you wish to allow use of your version of this file only
       
 38249 +# under the terms of either the GPL or the LGPL, and not to allow others to
       
 38250 +# use your version of this file under the terms of the MPL, indicate your
       
 38251 +# decision by deleting the provisions above and replace them with the notice
       
 38252 +# and other provisions required by the GPL or the LGPL. If you do not delete
       
 38253 +# the provisions above, a recipient may use your version of this file under
       
 38254 +# the terms of any one of the MPL, the GPL or the LGPL.
       
 38255 +#
       
 38256 +# ***** END LICENSE BLOCK *****
       
 38257 +
       
 38258 +DEPTH		= ../../../../../..
       
 38259 +topsrcdir	= @top_srcdir@
       
 38260 +srcdir		= @srcdir@
       
 38261 +VPATH		= @srcdir@
       
 38262 +
       
 38263 +include $(DEPTH)/config/autoconf.mk
       
 38264 +
       
 38265 +MODULE		= breakpad_dwarf
       
 38266 +HOST_LIBRARY_NAME = host_breakpad_dwarf_s
       
 38267 +
       
 38268 +LOCAL_INCLUDES 	= -I$(srcdir)/../..
       
 38269 +
       
 38270 +HOST_CPPSRCS = \
       
 38271 +  bytereader.cc \
       
 38272 +  dwarf2reader.cc \
       
 38273 +  functioninfo.cc \
       
 38274 +  $(NULL)
       
 38275 +
       
 38276 +HOST_CXXFLAGS += -funsigned-char
       
 38277 +
       
 38278 +# need static lib
       
 38279 +FORCE_STATIC_LIB = 1
       
 38280 +
       
 38281 +include $(topsrcdir)/config/rules.mk
       
 38282 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader-inl.h b/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader-inl.h
       
 38283 new file mode 100644
       
 38284 --- /dev/null
       
 38285 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader-inl.h
       
 38286 @@ -0,0 +1,149 @@
       
 38287 +// Copyright 2006 Google Inc. All Rights Reserved.
       
 38288 +//
       
 38289 +// Redistribution and use in source and binary forms, with or without
       
 38290 +// modification, are permitted provided that the following conditions are
       
 38291 +// met:
       
 38292 +//
       
 38293 +//     * Redistributions of source code must retain the above copyright
       
 38294 +// notice, this list of conditions and the following disclaimer.
       
 38295 +//     * Redistributions in binary form must reproduce the above
       
 38296 +// copyright notice, this list of conditions and the following disclaimer
       
 38297 +// in the documentation and/or other materials provided with the
       
 38298 +// distribution.
       
 38299 +//     * Neither the name of Google Inc. nor the names of its
       
 38300 +// contributors may be used to endorse or promote products derived from
       
 38301 +// this software without specific prior written permission.
       
 38302 +//
       
 38303 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 38304 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 38305 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 38306 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 38307 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 38308 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 38309 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 38310 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 38311 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 38312 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 38313 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 38314 +
       
 38315 +#ifndef UTIL_DEBUGINFO_BYTEREADER_INL_H__
       
 38316 +#define UTIL_DEBUGINFO_BYTEREADER_INL_H__
       
 38317 +
       
 38318 +#include <cassert>
       
 38319 +
       
 38320 +#include "common/dwarf/bytereader.h"
       
 38321 +
       
 38322 +namespace dwarf2reader {
       
 38323 +
       
 38324 +inline uint8 ByteReader::ReadOneByte(const char* buffer) const {
       
 38325 +  return buffer[0];
       
 38326 +}
       
 38327 +
       
 38328 +inline uint16 ByteReader::ReadTwoBytes(const char* signed_buffer) const {
       
 38329 +  const unsigned char *buffer
       
 38330 +    = reinterpret_cast<const unsigned char *>(signed_buffer);
       
 38331 +  const uint16 buffer0 = buffer[0];
       
 38332 +  const uint16 buffer1 = buffer[1];
       
 38333 +  if (endian_ == ENDIANNESS_LITTLE) {
       
 38334 +    return buffer0 | buffer1 << 8;
       
 38335 +  } else {
       
 38336 +    return buffer1 | buffer0 << 8;
       
 38337 +  }
       
 38338 +}
       
 38339 +
       
 38340 +inline uint64 ByteReader::ReadFourBytes(const char* signed_buffer) const {
       
 38341 +  const unsigned char *buffer
       
 38342 +    = reinterpret_cast<const unsigned char *>(signed_buffer);
       
 38343 +  const uint32 buffer0 = buffer[0];
       
 38344 +  const uint32 buffer1 = buffer[1];
       
 38345 +  const uint32 buffer2 = buffer[2];
       
 38346 +  const uint32 buffer3 = buffer[3];
       
 38347 +  if (endian_ == ENDIANNESS_LITTLE) {
       
 38348 +    return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24;
       
 38349 +  } else {
       
 38350 +    return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24;
       
 38351 +  }
       
 38352 +}
       
 38353 +
       
 38354 +inline uint64 ByteReader::ReadEightBytes(const char* signed_buffer) const {
       
 38355 +  const unsigned char *buffer
       
 38356 +    = reinterpret_cast<const unsigned char *>(signed_buffer);
       
 38357 +  const uint64 buffer0 = buffer[0];
       
 38358 +  const uint64 buffer1 = buffer[1];
       
 38359 +  const uint64 buffer2 = buffer[2];
       
 38360 +  const uint64 buffer3 = buffer[3];
       
 38361 +  const uint64 buffer4 = buffer[4];
       
 38362 +  const uint64 buffer5 = buffer[5];
       
 38363 +  const uint64 buffer6 = buffer[6];
       
 38364 +  const uint64 buffer7 = buffer[7];
       
 38365 +  if (endian_ == ENDIANNESS_LITTLE) {
       
 38366 +    return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 |
       
 38367 +      buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56;
       
 38368 +  } else {
       
 38369 +    return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 |
       
 38370 +      buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56;
       
 38371 +  }
       
 38372 +}
       
 38373 +
       
 38374 +// Read an unsigned LEB128 number.  Each byte contains 7 bits of
       
 38375 +// information, plus one bit saying whether the number continues or
       
 38376 +// not.
       
 38377 +
       
 38378 +inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer,
       
 38379 +                                             size_t* len) const {
       
 38380 +  uint64 result = 0;
       
 38381 +  size_t num_read = 0;
       
 38382 +  unsigned int shift = 0;
       
 38383 +  unsigned char byte;
       
 38384 +
       
 38385 +  do {
       
 38386 +    byte = *buffer++;
       
 38387 +    num_read++;
       
 38388 +
       
 38389 +    result |= (static_cast<uint64>(byte & 0x7f)) << shift;
       
 38390 +
       
 38391 +    shift += 7;
       
 38392 +
       
 38393 +  } while (byte & 0x80);
       
 38394 +
       
 38395 +  *len = num_read;
       
 38396 +
       
 38397 +  return result;
       
 38398 +}
       
 38399 +
       
 38400 +// Read a signed LEB128 number.  These are like regular LEB128
       
 38401 +// numbers, except the last byte may have a sign bit set.
       
 38402 +
       
 38403 +inline int64 ByteReader::ReadSignedLEB128(const char* buffer,
       
 38404 +                                          size_t* len) const {
       
 38405 +  int64 result = 0;
       
 38406 +  unsigned int shift = 0;
       
 38407 +  size_t num_read = 0;
       
 38408 +  unsigned char byte;
       
 38409 +
       
 38410 +  do {
       
 38411 +      byte = *buffer++;
       
 38412 +      num_read++;
       
 38413 +      result |= (static_cast<uint64>(byte & 0x7f) << shift);
       
 38414 +      shift += 7;
       
 38415 +  } while (byte & 0x80);
       
 38416 +
       
 38417 +  if ((shift < 8 * sizeof (result)) && (byte & 0x40))
       
 38418 +    result |= -((static_cast<int64>(1)) << shift);
       
 38419 +  *len = num_read;
       
 38420 +  return result;
       
 38421 +}
       
 38422 +
       
 38423 +inline uint64 ByteReader::ReadOffset(const char* buffer) const {
       
 38424 +  assert(this->offset_reader_);
       
 38425 +  return (this->*offset_reader_)(buffer);
       
 38426 +}
       
 38427 +
       
 38428 +inline uint64 ByteReader::ReadAddress(const char* buffer) const {
       
 38429 +  assert(this->address_reader_);
       
 38430 +  return (this->*address_reader_)(buffer);
       
 38431 +}
       
 38432 +
       
 38433 +}  // namespace dwarf2reader
       
 38434 +
       
 38435 +#endif  // UTIL_DEBUGINFO_BYTEREADER_INL_H__
       
 38436 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.cc b/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.cc
       
 38437 new file mode 100644
       
 38438 --- /dev/null
       
 38439 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.cc
       
 38440 @@ -0,0 +1,63 @@
       
 38441 +// Copyright 2006 Google Inc. All Rights Reserved.
       
 38442 +//
       
 38443 +// Redistribution and use in source and binary forms, with or without
       
 38444 +// modification, are permitted provided that the following conditions are
       
 38445 +// met:
       
 38446 +//
       
 38447 +//     * Redistributions of source code must retain the above copyright
       
 38448 +// notice, this list of conditions and the following disclaimer.
       
 38449 +//     * Redistributions in binary form must reproduce the above
       
 38450 +// copyright notice, this list of conditions and the following disclaimer
       
 38451 +// in the documentation and/or other materials provided with the
       
 38452 +// distribution.
       
 38453 +//     * Neither the name of Google Inc. nor the names of its
       
 38454 +// contributors may be used to endorse or promote products derived from
       
 38455 +// this software without specific prior written permission.
       
 38456 +//
       
 38457 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 38458 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 38459 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 38460 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 38461 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 38462 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 38463 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 38464 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 38465 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 38466 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 38467 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 38468 +
       
 38469 +#include <assert.h>
       
 38470 +
       
 38471 +#include "common/dwarf/bytereader-inl.h"
       
 38472 +#include "common/dwarf/bytereader.h"
       
 38473 +
       
 38474 +namespace dwarf2reader {
       
 38475 +
       
 38476 +ByteReader::ByteReader(enum Endianness endian)
       
 38477 +    :offset_reader_(NULL), address_reader_(NULL), endian_(endian),
       
 38478 +     address_size_(0), offset_size_(0)
       
 38479 +{ }
       
 38480 +
       
 38481 +ByteReader::~ByteReader() { }
       
 38482 +
       
 38483 +void ByteReader::SetOffsetSize(uint8 size) {
       
 38484 +  offset_size_ = size;
       
 38485 +  assert(size == 4 || size == 8);
       
 38486 +  if (size == 4) {
       
 38487 +    this->offset_reader_ = &ByteReader::ReadFourBytes;
       
 38488 +  } else {
       
 38489 +    this->offset_reader_ = &ByteReader::ReadEightBytes;
       
 38490 +  }
       
 38491 +}
       
 38492 +
       
 38493 +void ByteReader::SetAddressSize(uint8 size) {
       
 38494 +  address_size_ = size;
       
 38495 +  assert(size == 4 || size == 8);
       
 38496 +  if (size == 4) {
       
 38497 +    this->address_reader_ = &ByteReader::ReadFourBytes;
       
 38498 +  } else {
       
 38499 +    this->address_reader_ = &ByteReader::ReadEightBytes;
       
 38500 +  }
       
 38501 +}
       
 38502 +
       
 38503 +}  // namespace dwarf2reader
       
 38504 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.h b/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.h
       
 38505 new file mode 100644
       
 38506 --- /dev/null
       
 38507 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/bytereader.h
       
 38508 @@ -0,0 +1,132 @@
       
 38509 +// Copyright 2006 Google Inc. All Rights Reserved.
       
 38510 +//
       
 38511 +// Redistribution and use in source and binary forms, with or without
       
 38512 +// modification, are permitted provided that the following conditions are
       
 38513 +// met:
       
 38514 +//
       
 38515 +//     * Redistributions of source code must retain the above copyright
       
 38516 +// notice, this list of conditions and the following disclaimer.
       
 38517 +//     * Redistributions in binary form must reproduce the above
       
 38518 +// copyright notice, this list of conditions and the following disclaimer
       
 38519 +// in the documentation and/or other materials provided with the
       
 38520 +// distribution.
       
 38521 +//     * Neither the name of Google Inc. nor the names of its
       
 38522 +// contributors may be used to endorse or promote products derived from
       
 38523 +// this software without specific prior written permission.
       
 38524 +//
       
 38525 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 38526 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 38527 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 38528 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 38529 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 38530 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 38531 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 38532 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 38533 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 38534 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 38535 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 38536 +
       
 38537 +#ifndef COMMON_DWARF_BYTEREADER_H__
       
 38538 +#define COMMON_DWARF_BYTEREADER_H__
       
 38539 +
       
 38540 +#include <string>
       
 38541 +#include "common/dwarf/types.h"
       
 38542 +
       
 38543 +namespace dwarf2reader {
       
 38544 +
       
 38545 +// We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN
       
 38546 +// because it conflicts with a macro
       
 38547 +enum Endianness {
       
 38548 +  ENDIANNESS_BIG,
       
 38549 +  ENDIANNESS_LITTLE
       
 38550 +};
       
 38551 +
       
 38552 +// Class that knows how to read both big endian and little endian
       
 38553 +// numbers, for use in DWARF2/3 reader.
       
 38554 +// Takes an endianness argument.
       
 38555 +// To read addresses and offsets, SetAddressSize and SetOffsetSize
       
 38556 +// must be called first.
       
 38557 +class ByteReader {
       
 38558 + public:
       
 38559 +  explicit ByteReader(enum Endianness endian);
       
 38560 +  virtual ~ByteReader();
       
 38561 +
       
 38562 +  // Set the address size to SIZE, which sets up the ReadAddress member
       
 38563 +  // so that it works.
       
 38564 +  void SetAddressSize(uint8 size);
       
 38565 +
       
 38566 +  // Set the offset size to SIZE, which sets up the ReadOffset member
       
 38567 +  // so that it works.
       
 38568 +  void SetOffsetSize(uint8 size);
       
 38569 +
       
 38570 +  // Return the current offset size
       
 38571 +  uint8 OffsetSize() const { return offset_size_; }
       
 38572 +
       
 38573 +  // Return the current address size
       
 38574 +  uint8 AddressSize() const { return address_size_; }
       
 38575 +
       
 38576 +  // Read a single byte from BUFFER and return it as an unsigned 8 bit
       
 38577 +  // number.
       
 38578 +  uint8 ReadOneByte(const char* buffer) const;
       
 38579 +
       
 38580 +  // Read two bytes from BUFFER and return it as an unsigned 16 bit
       
 38581 +  // number.
       
 38582 +  uint16 ReadTwoBytes(const char* buffer) const;
       
 38583 +
       
 38584 +  // Read four bytes from BUFFER and return it as an unsigned 32 bit
       
 38585 +  // number.  This function returns a uint64 so that it is compatible
       
 38586 +  // with ReadAddress and ReadOffset.  The number it returns will
       
 38587 +  // never be outside the range of an unsigned 32 bit integer.
       
 38588 +  uint64 ReadFourBytes(const char* buffer) const;
       
 38589 +
       
 38590 +  // Read eight bytes from BUFFER and return it as an unsigned 64 bit
       
 38591 +  // number
       
 38592 +  uint64 ReadEightBytes(const char* buffer) const;
       
 38593 +
       
 38594 +  // Read an unsigned LEB128 (Little Endian Base 128) number from
       
 38595 +  // BUFFER and return it as an unsigned 64 bit integer.  LEN is set
       
 38596 +  // to the length read.  Everybody seems to reinvent LEB128 as a
       
 38597 +  // variable size integer encoding, DWARF has had it for a long time.
       
 38598 +  uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const;
       
 38599 +
       
 38600 +  // Read a signed LEB128 number from BUFFER and return it as an
       
 38601 +  // signed 64 bit integer.  LEN is set to the length read.
       
 38602 +  int64 ReadSignedLEB128(const char* buffer, size_t* len) const;
       
 38603 +
       
 38604 +  // Read an offset from BUFFER and return it as an unsigned 64 bit
       
 38605 +  // integer.  DWARF2/3 define offsets as either 4 or 8 bytes,
       
 38606 +  // generally depending on the amount of DWARF2/3 info present.
       
 38607 +  uint64 ReadOffset(const char* buffer) const;
       
 38608 +
       
 38609 +  // Read an address from BUFFER and return it as an unsigned 64 bit
       
 38610 +  // integer.  DWARF2/3 allow addresses to be any size from 0-255
       
 38611 +  // bytes currently.  Internally we support 4 and 8 byte addresses,
       
 38612 +  // and will CHECK on anything else.
       
 38613 +  uint64 ReadAddress(const char* buffer) const;
       
 38614 +
       
 38615 + private:
       
 38616 +
       
 38617 +  // Function pointer type for our address and offset readers.
       
 38618 +  typedef uint64 (ByteReader::*AddressReader)(const char*) const;
       
 38619 +
       
 38620 +  // Read an offset from BUFFER and return it as an unsigned 64 bit
       
 38621 +  // integer.  DWARF2/3 define offsets as either 4 or 8 bytes,
       
 38622 +  // generally depending on the amount of DWARF2/3 info present.
       
 38623 +  // This function pointer gets set by SetOffsetSize.
       
 38624 +  AddressReader offset_reader_;
       
 38625 +
       
 38626 +  // Read an address from BUFFER and return it as an unsigned 64 bit
       
 38627 +  // integer.  DWARF2/3 allow addresses to be any size from 0-255
       
 38628 +  // bytes currently.  Internally we support 4 and 8 byte addresses,
       
 38629 +  // and will CHECK on anything else.
       
 38630 +  // This function pointer gets set by SetAddressSize.
       
 38631 +  AddressReader address_reader_;
       
 38632 +
       
 38633 +  Endianness endian_;
       
 38634 +  uint8 address_size_;
       
 38635 +  uint8 offset_size_;
       
 38636 +};
       
 38637 +
       
 38638 +}  // namespace dwarf2reader
       
 38639 +
       
 38640 +#endif  // COMMON_DWARF_BYTEREADER_H__
       
 38641 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2enums.h b/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2enums.h
       
 38642 new file mode 100644
       
 38643 --- /dev/null
       
 38644 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2enums.h
       
 38645 @@ -0,0 +1,490 @@
       
 38646 +// Copyright 2006 Google Inc. All Rights Reserved.
       
 38647 +//
       
 38648 +// Redistribution and use in source and binary forms, with or without
       
 38649 +// modification, are permitted provided that the following conditions are
       
 38650 +// met:
       
 38651 +//
       
 38652 +//     * Redistributions of source code must retain the above copyright
       
 38653 +// notice, this list of conditions and the following disclaimer.
       
 38654 +//     * Redistributions in binary form must reproduce the above
       
 38655 +// copyright notice, this list of conditions and the following disclaimer
       
 38656 +// in the documentation and/or other materials provided with the
       
 38657 +// distribution.
       
 38658 +//     * Neither the name of Google Inc. nor the names of its
       
 38659 +// contributors may be used to endorse or promote products derived from
       
 38660 +// this software without specific prior written permission.
       
 38661 +//
       
 38662 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 38663 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 38664 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 38665 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 38666 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 38667 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 38668 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 38669 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 38670 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 38671 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 38672 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 38673 +
       
 38674 +#ifndef COMMON_DWARF_DWARF2ENUMS_H__
       
 38675 +#define COMMON_DWARF_DWARF2ENUMS_H__
       
 38676 +
       
 38677 +namespace dwarf2reader {
       
 38678 +
       
 38679 +// These enums do not follow the google3 style only because they are
       
 38680 +// known universally (specs, other implementations) by the names in
       
 38681 +// exactly this capitalization.
       
 38682 +// Tag names and codes.
       
 38683 +enum DwarfTag {
       
 38684 +  DW_TAG_padding = 0x00,
       
 38685 +  DW_TAG_array_type = 0x01,
       
 38686 +  DW_TAG_class_type = 0x02,
       
 38687 +  DW_TAG_entry_point = 0x03,
       
 38688 +  DW_TAG_enumeration_type = 0x04,
       
 38689 +  DW_TAG_formal_parameter = 0x05,
       
 38690 +  DW_TAG_imported_declaration = 0x08,
       
 38691 +  DW_TAG_label = 0x0a,
       
 38692 +  DW_TAG_lexical_block = 0x0b,
       
 38693 +  DW_TAG_member = 0x0d,
       
 38694 +  DW_TAG_pointer_type = 0x0f,
       
 38695 +  DW_TAG_reference_type = 0x10,
       
 38696 +  DW_TAG_compile_unit = 0x11,
       
 38697 +  DW_TAG_string_type = 0x12,
       
 38698 +  DW_TAG_structure_type = 0x13,
       
 38699 +  DW_TAG_subroutine_type = 0x15,
       
 38700 +  DW_TAG_typedef = 0x16,
       
 38701 +  DW_TAG_union_type = 0x17,
       
 38702 +  DW_TAG_unspecified_parameters = 0x18,
       
 38703 +  DW_TAG_variant = 0x19,
       
 38704 +  DW_TAG_common_block = 0x1a,
       
 38705 +  DW_TAG_common_inclusion = 0x1b,
       
 38706 +  DW_TAG_inheritance = 0x1c,
       
 38707 +  DW_TAG_inlined_subroutine = 0x1d,
       
 38708 +  DW_TAG_module = 0x1e,
       
 38709 +  DW_TAG_ptr_to_member_type = 0x1f,
       
 38710 +  DW_TAG_set_type = 0x20,
       
 38711 +  DW_TAG_subrange_type = 0x21,
       
 38712 +  DW_TAG_with_stmt = 0x22,
       
 38713 +  DW_TAG_access_declaration = 0x23,
       
 38714 +  DW_TAG_base_type = 0x24,
       
 38715 +  DW_TAG_catch_block = 0x25,
       
 38716 +  DW_TAG_const_type = 0x26,
       
 38717 +  DW_TAG_constant = 0x27,
       
 38718 +  DW_TAG_enumerator = 0x28,
       
 38719 +  DW_TAG_file_type = 0x29,
       
 38720 +  DW_TAG_friend = 0x2a,
       
 38721 +  DW_TAG_namelist = 0x2b,
       
 38722 +  DW_TAG_namelist_item = 0x2c,
       
 38723 +  DW_TAG_packed_type = 0x2d,
       
 38724 +  DW_TAG_subprogram = 0x2e,
       
 38725 +  DW_TAG_template_type_param = 0x2f,
       
 38726 +  DW_TAG_template_value_param = 0x30,
       
 38727 +  DW_TAG_thrown_type = 0x31,
       
 38728 +  DW_TAG_try_block = 0x32,
       
 38729 +  DW_TAG_variant_part = 0x33,
       
 38730 +  DW_TAG_variable = 0x34,
       
 38731 +  DW_TAG_volatile_type = 0x35,
       
 38732 +  // DWARF 3.
       
 38733 +  DW_TAG_dwarf_procedure = 0x36,
       
 38734 +  DW_TAG_restrict_type = 0x37,
       
 38735 +  DW_TAG_interface_type = 0x38,
       
 38736 +  DW_TAG_namespace = 0x39,
       
 38737 +  DW_TAG_imported_module = 0x3a,
       
 38738 +  DW_TAG_unspecified_type = 0x3b,
       
 38739 +  DW_TAG_partial_unit = 0x3c,
       
 38740 +  DW_TAG_imported_unit = 0x3d,
       
 38741 +  // SGI/MIPS Extensions.
       
 38742 +  DW_TAG_MIPS_loop = 0x4081,
       
 38743 +  // HP extensions.  See:
       
 38744 +  // ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz
       
 38745 +  DW_TAG_HP_array_descriptor = 0x4090,
       
 38746 +  // GNU extensions.
       
 38747 +  DW_TAG_format_label = 0x4101,  // For FORTRAN 77 and Fortran 90.
       
 38748 +  DW_TAG_function_template = 0x4102,  // For C++.
       
 38749 +  DW_TAG_class_template = 0x4103,  // For C++.
       
 38750 +  DW_TAG_GNU_BINCL = 0x4104,
       
 38751 +  DW_TAG_GNU_EINCL = 0x4105,
       
 38752 +  // Extensions for UPC.  See: http://upc.gwu.edu/~upc.
       
 38753 +  DW_TAG_upc_shared_type = 0x8765,
       
 38754 +  DW_TAG_upc_strict_type = 0x8766,
       
 38755 +  DW_TAG_upc_relaxed_type = 0x8767,
       
 38756 +  // PGI (STMicroelectronics) extensions.  No documentation available.
       
 38757 +  DW_TAG_PGI_kanji_type      = 0xA000,
       
 38758 +  DW_TAG_PGI_interface_block = 0xA020
       
 38759 +};
       
 38760 +
       
 38761 +
       
 38762 +enum DwarfHasChild {
       
 38763 +  DW_children_no = 0,
       
 38764 +  DW_children_yes = 1
       
 38765 +};
       
 38766 +
       
 38767 +// Form names and codes.
       
 38768 +enum DwarfForm {
       
 38769 +  DW_FORM_addr = 0x01,
       
 38770 +  DW_FORM_block2 = 0x03,
       
 38771 +  DW_FORM_block4 = 0x04,
       
 38772 +  DW_FORM_data2 = 0x05,
       
 38773 +  DW_FORM_data4 = 0x06,
       
 38774 +  DW_FORM_data8 = 0x07,
       
 38775 +  DW_FORM_string = 0x08,
       
 38776 +  DW_FORM_block = 0x09,
       
 38777 +  DW_FORM_block1 = 0x0a,
       
 38778 +  DW_FORM_data1 = 0x0b,
       
 38779 +  DW_FORM_flag = 0x0c,
       
 38780 +  DW_FORM_sdata = 0x0d,
       
 38781 +  DW_FORM_strp = 0x0e,
       
 38782 +  DW_FORM_udata = 0x0f,
       
 38783 +  DW_FORM_ref_addr = 0x10,
       
 38784 +  DW_FORM_ref1 = 0x11,
       
 38785 +  DW_FORM_ref2 = 0x12,
       
 38786 +  DW_FORM_ref4 = 0x13,
       
 38787 +  DW_FORM_ref8 = 0x14,
       
 38788 +  DW_FORM_ref_udata = 0x15,
       
 38789 +  DW_FORM_indirect = 0x16
       
 38790 +};
       
 38791 +
       
 38792 +// Attribute names and codes
       
 38793 +enum DwarfAttribute {
       
 38794 +  DW_AT_sibling = 0x01,
       
 38795 +  DW_AT_location = 0x02,
       
 38796 +  DW_AT_name = 0x03,
       
 38797 +  DW_AT_ordering = 0x09,
       
 38798 +  DW_AT_subscr_data = 0x0a,
       
 38799 +  DW_AT_byte_size = 0x0b,
       
 38800 +  DW_AT_bit_offset = 0x0c,
       
 38801 +  DW_AT_bit_size = 0x0d,
       
 38802 +  DW_AT_element_list = 0x0f,
       
 38803 +  DW_AT_stmt_list = 0x10,
       
 38804 +  DW_AT_low_pc = 0x11,
       
 38805 +  DW_AT_high_pc = 0x12,
       
 38806 +  DW_AT_language = 0x13,
       
 38807 +  DW_AT_member = 0x14,
       
 38808 +  DW_AT_discr = 0x15,
       
 38809 +  DW_AT_discr_value = 0x16,
       
 38810 +  DW_AT_visibility = 0x17,
       
 38811 +  DW_AT_import = 0x18,
       
 38812 +  DW_AT_string_length = 0x19,
       
 38813 +  DW_AT_common_reference = 0x1a,
       
 38814 +  DW_AT_comp_dir = 0x1b,
       
 38815 +  DW_AT_const_value = 0x1c,
       
 38816 +  DW_AT_containing_type = 0x1d,
       
 38817 +  DW_AT_default_value = 0x1e,
       
 38818 +  DW_AT_inline = 0x20,
       
 38819 +  DW_AT_is_optional = 0x21,
       
 38820 +  DW_AT_lower_bound = 0x22,
       
 38821 +  DW_AT_producer = 0x25,
       
 38822 +  DW_AT_prototyped = 0x27,
       
 38823 +  DW_AT_return_addr = 0x2a,
       
 38824 +  DW_AT_start_scope = 0x2c,
       
 38825 +  DW_AT_stride_size = 0x2e,
       
 38826 +  DW_AT_upper_bound = 0x2f,
       
 38827 +  DW_AT_abstract_origin = 0x31,
       
 38828 +  DW_AT_accessibility = 0x32,
       
 38829 +  DW_AT_address_class = 0x33,
       
 38830 +  DW_AT_artificial = 0x34,
       
 38831 +  DW_AT_base_types = 0x35,
       
 38832 +  DW_AT_calling_convention = 0x36,
       
 38833 +  DW_AT_count = 0x37,
       
 38834 +  DW_AT_data_member_location = 0x38,
       
 38835 +  DW_AT_decl_column = 0x39,
       
 38836 +  DW_AT_decl_file = 0x3a,
       
 38837 +  DW_AT_decl_line = 0x3b,
       
 38838 +  DW_AT_declaration = 0x3c,
       
 38839 +  DW_AT_discr_list = 0x3d,
       
 38840 +  DW_AT_encoding = 0x3e,
       
 38841 +  DW_AT_external = 0x3f,
       
 38842 +  DW_AT_frame_base = 0x40,
       
 38843 +  DW_AT_friend = 0x41,
       
 38844 +  DW_AT_identifier_case = 0x42,
       
 38845 +  DW_AT_macro_info = 0x43,
       
 38846 +  DW_AT_namelist_items = 0x44,
       
 38847 +  DW_AT_priority = 0x45,
       
 38848 +  DW_AT_segment = 0x46,
       
 38849 +  DW_AT_specification = 0x47,
       
 38850 +  DW_AT_static_link = 0x48,
       
 38851 +  DW_AT_type = 0x49,
       
 38852 +  DW_AT_use_location = 0x4a,
       
 38853 +  DW_AT_variable_parameter = 0x4b,
       
 38854 +  DW_AT_virtuality = 0x4c,
       
 38855 +  DW_AT_vtable_elem_location = 0x4d,
       
 38856 +  // DWARF 3 values.
       
 38857 +  DW_AT_allocated     = 0x4e,
       
 38858 +  DW_AT_associated    = 0x4f,
       
 38859 +  DW_AT_data_location = 0x50,
       
 38860 +  DW_AT_stride        = 0x51,
       
 38861 +  DW_AT_entry_pc      = 0x52,
       
 38862 +  DW_AT_use_UTF8      = 0x53,
       
 38863 +  DW_AT_extension     = 0x54,
       
 38864 +  DW_AT_ranges        = 0x55,
       
 38865 +  DW_AT_trampoline    = 0x56,
       
 38866 +  DW_AT_call_column   = 0x57,
       
 38867 +  DW_AT_call_file     = 0x58,
       
 38868 +  DW_AT_call_line     = 0x59,
       
 38869 +  // SGI/MIPS extensions.
       
 38870 +  DW_AT_MIPS_fde = 0x2001,
       
 38871 +  DW_AT_MIPS_loop_begin = 0x2002,
       
 38872 +  DW_AT_MIPS_tail_loop_begin = 0x2003,
       
 38873 +  DW_AT_MIPS_epilog_begin = 0x2004,
       
 38874 +  DW_AT_MIPS_loop_unroll_factor = 0x2005,
       
 38875 +  DW_AT_MIPS_software_pipeline_depth = 0x2006,
       
 38876 +  DW_AT_MIPS_linkage_name = 0x2007,
       
 38877 +  DW_AT_MIPS_stride = 0x2008,
       
 38878 +  DW_AT_MIPS_abstract_name = 0x2009,
       
 38879 +  DW_AT_MIPS_clone_origin = 0x200a,
       
 38880 +  DW_AT_MIPS_has_inlines = 0x200b,
       
 38881 +  // HP extensions.
       
 38882 +  DW_AT_HP_block_index         = 0x2000,
       
 38883 +  DW_AT_HP_unmodifiable        = 0x2001,  // Same as DW_AT_MIPS_fde.
       
 38884 +  DW_AT_HP_actuals_stmt_list   = 0x2010,
       
 38885 +  DW_AT_HP_proc_per_section    = 0x2011,
       
 38886 +  DW_AT_HP_raw_data_ptr        = 0x2012,
       
 38887 +  DW_AT_HP_pass_by_reference   = 0x2013,
       
 38888 +  DW_AT_HP_opt_level           = 0x2014,
       
 38889 +  DW_AT_HP_prof_version_id     = 0x2015,
       
 38890 +  DW_AT_HP_opt_flags           = 0x2016,
       
 38891 +  DW_AT_HP_cold_region_low_pc  = 0x2017,
       
 38892 +  DW_AT_HP_cold_region_high_pc = 0x2018,
       
 38893 +  DW_AT_HP_all_variables_modifiable = 0x2019,
       
 38894 +  DW_AT_HP_linkage_name        = 0x201a,
       
 38895 +  DW_AT_HP_prof_flags          = 0x201b,  // In comp unit of procs_info for -g.
       
 38896 +  // GNU extensions.
       
 38897 +  DW_AT_sf_names   = 0x2101,
       
 38898 +  DW_AT_src_info   = 0x2102,
       
 38899 +  DW_AT_mac_info   = 0x2103,
       
 38900 +  DW_AT_src_coords = 0x2104,
       
 38901 +  DW_AT_body_begin = 0x2105,
       
 38902 +  DW_AT_body_end   = 0x2106,
       
 38903 +  DW_AT_GNU_vector = 0x2107,
       
 38904 +  // VMS extensions.
       
 38905 +  DW_AT_VMS_rtnbeg_pd_address = 0x2201,
       
 38906 +  // UPC extension.
       
 38907 +  DW_AT_upc_threads_scaled = 0x3210,
       
 38908 +  // PGI (STMicroelectronics) extensions.
       
 38909 +  DW_AT_PGI_lbase    = 0x3a00,
       
 38910 +  DW_AT_PGI_soffset  = 0x3a01,
       
 38911 +  DW_AT_PGI_lstride  = 0x3a02
       
 38912 +};
       
 38913 +
       
 38914 +
       
 38915 +// Line number opcodes.
       
 38916 +enum DwarfLineNumberOps {
       
 38917 +  DW_LNS_extended_op = 0,
       
 38918 +  DW_LNS_copy = 1,
       
 38919 +  DW_LNS_advance_pc = 2,
       
 38920 +  DW_LNS_advance_line = 3,
       
 38921 +  DW_LNS_set_file = 4,
       
 38922 +  DW_LNS_set_column = 5,
       
 38923 +  DW_LNS_negate_stmt = 6,
       
 38924 +  DW_LNS_set_basic_block = 7,
       
 38925 +  DW_LNS_const_add_pc = 8,
       
 38926 +  DW_LNS_fixed_advance_pc = 9,
       
 38927 +  // DWARF 3.
       
 38928 +  DW_LNS_set_prologue_end = 10,
       
 38929 +  DW_LNS_set_epilogue_begin = 11,
       
 38930 +  DW_LNS_set_isa = 12
       
 38931 +};
       
 38932 +
       
 38933 +// Line number extended opcodes.
       
 38934 +enum DwarfLineNumberExtendedOps {
       
 38935 +  DW_LNE_end_sequence = 1,
       
 38936 +  DW_LNE_set_address = 2,
       
 38937 +  DW_LNE_define_file = 3,
       
 38938 +  // HP extensions.
       
 38939 +  DW_LNE_HP_negate_is_UV_update      = 0x11,
       
 38940 +  DW_LNE_HP_push_context             = 0x12,
       
 38941 +  DW_LNE_HP_pop_context              = 0x13,
       
 38942 +  DW_LNE_HP_set_file_line_column     = 0x14,
       
 38943 +  DW_LNE_HP_set_routine_name         = 0x15,
       
 38944 +  DW_LNE_HP_set_sequence             = 0x16,
       
 38945 +  DW_LNE_HP_negate_post_semantics    = 0x17,
       
 38946 +  DW_LNE_HP_negate_function_exit     = 0x18,
       
 38947 +  DW_LNE_HP_negate_front_end_logical = 0x19,
       
 38948 +  DW_LNE_HP_define_proc              = 0x20
       
 38949 +};
       
 38950 +
       
 38951 +// Type encoding names and codes
       
 38952 +enum DwarfEncoding {
       
 38953 +  DW_ATE_address                     =0x1,
       
 38954 +  DW_ATE_boolean                     =0x2,
       
 38955 +  DW_ATE_complex_float               =0x3,
       
 38956 +  DW_ATE_float                       =0x4,
       
 38957 +  DW_ATE_signed                      =0x5,
       
 38958 +  DW_ATE_signed_char                 =0x6,
       
 38959 +  DW_ATE_unsigned                    =0x7,
       
 38960 +  DW_ATE_unsigned_char               =0x8,
       
 38961 +  // DWARF3/DWARF3f
       
 38962 +  DW_ATE_imaginary_float             =0x9,
       
 38963 +  DW_ATE_packed_decimal              =0xa,
       
 38964 +  DW_ATE_numeric_string              =0xb,
       
 38965 +  DW_ATE_edited                      =0xc,
       
 38966 +  DW_ATE_signed_fixed                =0xd,
       
 38967 +  DW_ATE_unsigned_fixed              =0xe,
       
 38968 +  DW_ATE_decimal_float               =0xf,
       
 38969 +  DW_ATE_lo_user                     =0x80,
       
 38970 +  DW_ATE_hi_user                     =0xff
       
 38971 +};
       
 38972 +
       
 38973 +// Location virtual machine opcodes
       
 38974 +enum DwarfOpcode {
       
 38975 +  DW_OP_addr                         =0x03,
       
 38976 +  DW_OP_deref                        =0x06,
       
 38977 +  DW_OP_const1u                      =0x08,
       
 38978 +  DW_OP_const1s                      =0x09,
       
 38979 +  DW_OP_const2u                      =0x0a,
       
 38980 +  DW_OP_const2s                      =0x0b,
       
 38981 +  DW_OP_const4u                      =0x0c,
       
 38982 +  DW_OP_const4s                      =0x0d,
       
 38983 +  DW_OP_const8u                      =0x0e,
       
 38984 +  DW_OP_const8s                      =0x0f,
       
 38985 +  DW_OP_constu                       =0x10,
       
 38986 +  DW_OP_consts                       =0x11,
       
 38987 +  DW_OP_dup                          =0x12,
       
 38988 +  DW_OP_drop                         =0x13,
       
 38989 +  DW_OP_over                         =0x14,
       
 38990 +  DW_OP_pick                         =0x15,
       
 38991 +  DW_OP_swap                         =0x16,
       
 38992 +  DW_OP_rot                          =0x17,
       
 38993 +  DW_OP_xderef                       =0x18,
       
 38994 +  DW_OP_abs                          =0x19,
       
 38995 +  DW_OP_and                          =0x1a,
       
 38996 +  DW_OP_div                          =0x1b,
       
 38997 +  DW_OP_minus                        =0x1c,
       
 38998 +  DW_OP_mod                          =0x1d,
       
 38999 +  DW_OP_mul                          =0x1e,
       
 39000 +  DW_OP_neg                          =0x1f,
       
 39001 +  DW_OP_not                          =0x20,
       
 39002 +  DW_OP_or                           =0x21,
       
 39003 +  DW_OP_plus                         =0x22,
       
 39004 +  DW_OP_plus_uconst                  =0x23,
       
 39005 +  DW_OP_shl                          =0x24,
       
 39006 +  DW_OP_shr                          =0x25,
       
 39007 +  DW_OP_shra                         =0x26,
       
 39008 +  DW_OP_xor                          =0x27,
       
 39009 +  DW_OP_bra                          =0x28,
       
 39010 +  DW_OP_eq                           =0x29,
       
 39011 +  DW_OP_ge                           =0x2a,
       
 39012 +  DW_OP_gt                           =0x2b,
       
 39013 +  DW_OP_le                           =0x2c,
       
 39014 +  DW_OP_lt                           =0x2d,
       
 39015 +  DW_OP_ne                           =0x2e,
       
 39016 +  DW_OP_skip                         =0x2f,
       
 39017 +  DW_OP_lit0                         =0x30,
       
 39018 +  DW_OP_lit1                         =0x31,
       
 39019 +  DW_OP_lit2                         =0x32,
       
 39020 +  DW_OP_lit3                         =0x33,
       
 39021 +  DW_OP_lit4                         =0x34,
       
 39022 +  DW_OP_lit5                         =0x35,
       
 39023 +  DW_OP_lit6                         =0x36,
       
 39024 +  DW_OP_lit7                         =0x37,
       
 39025 +  DW_OP_lit8                         =0x38,
       
 39026 +  DW_OP_lit9                         =0x39,
       
 39027 +  DW_OP_lit10                        =0x3a,
       
 39028 +  DW_OP_lit11                        =0x3b,
       
 39029 +  DW_OP_lit12                        =0x3c,
       
 39030 +  DW_OP_lit13                        =0x3d,
       
 39031 +  DW_OP_lit14                        =0x3e,
       
 39032 +  DW_OP_lit15                        =0x3f,
       
 39033 +  DW_OP_lit16                        =0x40,
       
 39034 +  DW_OP_lit17                        =0x41,
       
 39035 +  DW_OP_lit18                        =0x42,
       
 39036 +  DW_OP_lit19                        =0x43,
       
 39037 +  DW_OP_lit20                        =0x44,
       
 39038 +  DW_OP_lit21                        =0x45,
       
 39039 +  DW_OP_lit22                        =0x46,
       
 39040 +  DW_OP_lit23                        =0x47,
       
 39041 +  DW_OP_lit24                        =0x48,
       
 39042 +  DW_OP_lit25                        =0x49,
       
 39043 +  DW_OP_lit26                        =0x4a,
       
 39044 +  DW_OP_lit27                        =0x4b,
       
 39045 +  DW_OP_lit28                        =0x4c,
       
 39046 +  DW_OP_lit29                        =0x4d,
       
 39047 +  DW_OP_lit30                        =0x4e,
       
 39048 +  DW_OP_lit31                        =0x4f,
       
 39049 +  DW_OP_reg0                         =0x50,
       
 39050 +  DW_OP_reg1                         =0x51,
       
 39051 +  DW_OP_reg2                         =0x52,
       
 39052 +  DW_OP_reg3                         =0x53,
       
 39053 +  DW_OP_reg4                         =0x54,
       
 39054 +  DW_OP_reg5                         =0x55,
       
 39055 +  DW_OP_reg6                         =0x56,
       
 39056 +  DW_OP_reg7                         =0x57,
       
 39057 +  DW_OP_reg8                         =0x58,
       
 39058 +  DW_OP_reg9                         =0x59,
       
 39059 +  DW_OP_reg10                        =0x5a,
       
 39060 +  DW_OP_reg11                        =0x5b,
       
 39061 +  DW_OP_reg12                        =0x5c,
       
 39062 +  DW_OP_reg13                        =0x5d,
       
 39063 +  DW_OP_reg14                        =0x5e,
       
 39064 +  DW_OP_reg15                        =0x5f,
       
 39065 +  DW_OP_reg16                        =0x60,
       
 39066 +  DW_OP_reg17                        =0x61,
       
 39067 +  DW_OP_reg18                        =0x62,
       
 39068 +  DW_OP_reg19                        =0x63,
       
 39069 +  DW_OP_reg20                        =0x64,
       
 39070 +  DW_OP_reg21                        =0x65,
       
 39071 +  DW_OP_reg22                        =0x66,
       
 39072 +  DW_OP_reg23                        =0x67,
       
 39073 +  DW_OP_reg24                        =0x68,
       
 39074 +  DW_OP_reg25                        =0x69,
       
 39075 +  DW_OP_reg26                        =0x6a,
       
 39076 +  DW_OP_reg27                        =0x6b,
       
 39077 +  DW_OP_reg28                        =0x6c,
       
 39078 +  DW_OP_reg29                        =0x6d,
       
 39079 +  DW_OP_reg30                        =0x6e,
       
 39080 +  DW_OP_reg31                        =0x6f,
       
 39081 +  DW_OP_breg0                        =0x70,
       
 39082 +  DW_OP_breg1                        =0x71,
       
 39083 +  DW_OP_breg2                        =0x72,
       
 39084 +  DW_OP_breg3                        =0x73,
       
 39085 +  DW_OP_breg4                        =0x74,
       
 39086 +  DW_OP_breg5                        =0x75,
       
 39087 +  DW_OP_breg6                        =0x76,
       
 39088 +  DW_OP_breg7                        =0x77,
       
 39089 +  DW_OP_breg8                        =0x78,
       
 39090 +  DW_OP_breg9                        =0x79,
       
 39091 +  DW_OP_breg10                       =0x7a,
       
 39092 +  DW_OP_breg11                       =0x7b,
       
 39093 +  DW_OP_breg12                       =0x7c,
       
 39094 +  DW_OP_breg13                       =0x7d,
       
 39095 +  DW_OP_breg14                       =0x7e,
       
 39096 +  DW_OP_breg15                       =0x7f,
       
 39097 +  DW_OP_breg16                       =0x80,
       
 39098 +  DW_OP_breg17                       =0x81,
       
 39099 +  DW_OP_breg18                       =0x82,
       
 39100 +  DW_OP_breg19                       =0x83,
       
 39101 +  DW_OP_breg20                       =0x84,
       
 39102 +  DW_OP_breg21                       =0x85,
       
 39103 +  DW_OP_breg22                       =0x86,
       
 39104 +  DW_OP_breg23                       =0x87,
       
 39105 +  DW_OP_breg24                       =0x88,
       
 39106 +  DW_OP_breg25                       =0x89,
       
 39107 +  DW_OP_breg26                       =0x8a,
       
 39108 +  DW_OP_breg27                       =0x8b,
       
 39109 +  DW_OP_breg28                       =0x8c,
       
 39110 +  DW_OP_breg29                       =0x8d,
       
 39111 +  DW_OP_breg30                       =0x8e,
       
 39112 +  DW_OP_breg31                       =0x8f,
       
 39113 +  DW_OP_regX                         =0x90,
       
 39114 +  DW_OP_fbreg                        =0x91,
       
 39115 +  DW_OP_bregX                        =0x92,
       
 39116 +  DW_OP_piece                        =0x93,
       
 39117 +  DW_OP_deref_size                   =0x94,
       
 39118 +  DW_OP_xderef_size                  =0x95,
       
 39119 +  DW_OP_nop                          =0x96,
       
 39120 +  // DWARF3/DWARF3f
       
 39121 +  DW_OP_push_object_address          =0x97,
       
 39122 +  DW_OP_call2                        =0x98,
       
 39123 +  DW_OP_call4                        =0x99,
       
 39124 +  DW_OP_call_ref                     =0x9a,
       
 39125 +  DW_OP_form_tls_address             =0x9b,
       
 39126 +  DW_OP_call_frame_cfa               =0x9c,
       
 39127 +  DW_OP_bit_piece                    =0x9d,
       
 39128 +  DW_OP_lo_user                      =0xe0,
       
 39129 +  DW_OP_hi_user                      =0xff,  
       
 39130 +  // GNU extensions
       
 39131 +  DW_OP_GNU_push_tls_address         =0xe0
       
 39132 +};
       
 39133 +
       
 39134 +}  // namespace dwarf2reader
       
 39135 +#endif  // COMMON_DWARF_DWARF2ENUMS_H__
       
 39136 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.cc b/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.cc
       
 39137 new file mode 100644
       
 39138 --- /dev/null
       
 39139 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.cc
       
 39140 @@ -0,0 +1,825 @@
       
 39141 +// Copyright 2006 Google Inc. All Rights Reserved.
       
 39142 +//
       
 39143 +// Redistribution and use in source and binary forms, with or without
       
 39144 +// modification, are permitted provided that the following conditions are
       
 39145 +// met:
       
 39146 +//
       
 39147 +//     * Redistributions of source code must retain the above copyright
       
 39148 +// notice, this list of conditions and the following disclaimer.
       
 39149 +//     * Redistributions in binary form must reproduce the above
       
 39150 +// copyright notice, this list of conditions and the following disclaimer
       
 39151 +// in the documentation and/or other materials provided with the
       
 39152 +// distribution.
       
 39153 +//     * Neither the name of Google Inc. nor the names of its
       
 39154 +// contributors may be used to endorse or promote products derived from
       
 39155 +// this software without specific prior written permission.
       
 39156 +//
       
 39157 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 39158 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 39159 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 39160 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 39161 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 39162 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 39163 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 39164 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 39165 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 39166 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 39167 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 39168 +
       
 39169 +#include <cassert>
       
 39170 +#include <cstdio>
       
 39171 +#include <cstring>
       
 39172 +#include <memory>
       
 39173 +#include <stack>
       
 39174 +#include <utility>
       
 39175 +
       
 39176 +#include "common/dwarf/bytereader-inl.h"
       
 39177 +#include "common/dwarf/dwarf2reader.h"
       
 39178 +#include "common/dwarf/bytereader.h"
       
 39179 +#include "common/dwarf/line_state_machine.h"
       
 39180 +
       
 39181 +namespace dwarf2reader {
       
 39182 +
       
 39183 +// Read a DWARF2/3 initial length field from START, using READER, and
       
 39184 +// report the length in LEN.  Return the actual initial length.
       
 39185 +
       
 39186 +static uint64 ReadInitialLength(const char* start,
       
 39187 +                                ByteReader* reader, size_t* len) {
       
 39188 +  const uint64 initial_length = reader->ReadFourBytes(start);
       
 39189 +  start += 4;
       
 39190 +
       
 39191 +  // In DWARF2/3, if the initial length is all 1 bits, then the offset
       
 39192 +  // size is 8 and we need to read the next 8 bytes for the real length.
       
 39193 +  if (initial_length == 0xffffffff) {
       
 39194 +    reader->SetOffsetSize(8);
       
 39195 +    *len = 12;
       
 39196 +    return reader->ReadOffset(start);
       
 39197 +  } else {
       
 39198 +    reader->SetOffsetSize(4);
       
 39199 +    *len = 4;
       
 39200 +  }
       
 39201 +  return initial_length;
       
 39202 +}
       
 39203 +
       
 39204 +CompilationUnit::CompilationUnit(const SectionMap& sections, uint64 offset,
       
 39205 +                                 ByteReader* reader, Dwarf2Handler* handler)
       
 39206 +    : offset_from_section_start_(offset), reader_(reader),
       
 39207 +      sections_(sections), handler_(handler), abbrevs_(NULL),
       
 39208 +      string_buffer_(NULL), string_buffer_length_(0) {}
       
 39209 +
       
 39210 +// Read a DWARF2/3 abbreviation section.
       
 39211 +// Each abbrev consists of a abbreviation number, a tag, a byte
       
 39212 +// specifying whether the tag has children, and a list of
       
 39213 +// attribute/form pairs.
       
 39214 +// The list of forms is terminated by a 0 for the attribute, and a
       
 39215 +// zero for the form.  The entire abbreviation section is terminated
       
 39216 +// by a zero for the code.
       
 39217 +
       
 39218 +void CompilationUnit::ReadAbbrevs() {
       
 39219 +  if (abbrevs_)
       
 39220 +    return;
       
 39221 +
       
 39222 +  // First get the debug_abbrev section
       
 39223 +  SectionMap::const_iterator iter = sections_.find("__debug_abbrev");
       
 39224 +  assert(iter != sections_.end());
       
 39225 +
       
 39226 +  abbrevs_ = new vector<Abbrev>;
       
 39227 +  abbrevs_->resize(1);
       
 39228 +
       
 39229 +  // The only way to check whether we are reading over the end of the
       
 39230 +  // buffer would be to first compute the size of the leb128 data by
       
 39231 +  // reading it, then go back and read it again.
       
 39232 +  const char* abbrev_start = iter->second.first +
       
 39233 +                                      header_.abbrev_offset;
       
 39234 +  const char* abbrevptr = abbrev_start;
       
 39235 +#ifndef NDEBUG
       
 39236 +  const uint64 abbrev_length = iter->second.second - header_.abbrev_offset;
       
 39237 +#endif
       
 39238 +
       
 39239 +  while (1) {
       
 39240 +    CompilationUnit::Abbrev abbrev;
       
 39241 +    size_t len;
       
 39242 +    const uint32 number = reader_->ReadUnsignedLEB128(abbrevptr, &len);
       
 39243 +
       
 39244 +    if (number == 0)
       
 39245 +      break;
       
 39246 +    abbrev.number = number;
       
 39247 +    abbrevptr += len;
       
 39248 +
       
 39249 +    assert(abbrevptr < abbrev_start + abbrev_length);
       
 39250 +    const uint32 tag = reader_->ReadUnsignedLEB128(abbrevptr, &len);
       
 39251 +    abbrevptr += len;
       
 39252 +    abbrev.tag = static_cast<enum DwarfTag>(tag);
       
 39253 +
       
 39254 +    assert(abbrevptr < abbrev_start + abbrev_length);
       
 39255 +    abbrev.has_children = reader_->ReadOneByte(abbrevptr);
       
 39256 +    abbrevptr += 1;
       
 39257 +
       
 39258 +    assert(abbrevptr < abbrev_start + abbrev_length);
       
 39259 +
       
 39260 +    while (1) {
       
 39261 +      const uint32 nametemp = reader_->ReadUnsignedLEB128(abbrevptr, &len);
       
 39262 +      abbrevptr += len;
       
 39263 +
       
 39264 +      assert(abbrevptr < abbrev_start + abbrev_length);
       
 39265 +      const uint32 formtemp = reader_->ReadUnsignedLEB128(abbrevptr, &len);
       
 39266 +      abbrevptr += len;
       
 39267 +      if (nametemp == 0 && formtemp == 0)
       
 39268 +        break;
       
 39269 +
       
 39270 +      const enum DwarfAttribute name =
       
 39271 +        static_cast<enum DwarfAttribute>(nametemp);
       
 39272 +      const enum DwarfForm form = static_cast<enum DwarfForm>(formtemp);
       
 39273 +      abbrev.attributes.push_back(make_pair(name, form));
       
 39274 +    }
       
 39275 +    assert(abbrev.number == abbrevs_->size());
       
 39276 +    abbrevs_->push_back(abbrev);
       
 39277 +  }
       
 39278 +}
       
 39279 +
       
 39280 +// Skips a single DIE's attributes.
       
 39281 +const char* CompilationUnit::SkipDIE(const char* start,
       
 39282 +                                              const Abbrev& abbrev) {
       
 39283 +  for (AttributeList::const_iterator i = abbrev.attributes.begin();
       
 39284 +       i != abbrev.attributes.end();
       
 39285 +       i++)  {
       
 39286 +    start = SkipAttribute(start, i->second);
       
 39287 +  }
       
 39288 +  return start;
       
 39289 +}
       
 39290 +
       
 39291 +// Skips a single attribute form's data.
       
 39292 +const char* CompilationUnit::SkipAttribute(const char* start,
       
 39293 +                                                    enum DwarfForm form) {
       
 39294 +  size_t len;
       
 39295 +
       
 39296 +  switch (form) {
       
 39297 +    case DW_FORM_indirect:
       
 39298 +      form = static_cast<enum DwarfForm>(reader_->ReadUnsignedLEB128(start,
       
 39299 +                                                                     &len));
       
 39300 +      start += len;
       
 39301 +      return SkipAttribute(start, form);
       
 39302 +      break;
       
 39303 +
       
 39304 +    case DW_FORM_data1:
       
 39305 +    case DW_FORM_flag:
       
 39306 +    case DW_FORM_ref1:
       
 39307 +      return start + 1;
       
 39308 +      break;
       
 39309 +    case DW_FORM_ref2:
       
 39310 +    case DW_FORM_data2:
       
 39311 +      return start + 2;
       
 39312 +      break;
       
 39313 +    case DW_FORM_ref4:
       
 39314 +    case DW_FORM_data4:
       
 39315 +      return start + 4;
       
 39316 +      break;
       
 39317 +    case DW_FORM_ref8:
       
 39318 +    case DW_FORM_data8:
       
 39319 +      return start + 8;
       
 39320 +      break;
       
 39321 +    case DW_FORM_string:
       
 39322 +      return start + strlen(start) + 1;
       
 39323 +      break;
       
 39324 +    case DW_FORM_udata:
       
 39325 +    case DW_FORM_ref_udata:
       
 39326 +      reader_->ReadUnsignedLEB128(start, &len);
       
 39327 +      return start + len;
       
 39328 +      break;
       
 39329 +
       
 39330 +    case DW_FORM_sdata:
       
 39331 +      reader_->ReadSignedLEB128(start, &len);
       
 39332 +      return start + len;
       
 39333 +      break;
       
 39334 +    case DW_FORM_addr:
       
 39335 +      return start + reader_->AddressSize();
       
 39336 +      break;
       
 39337 +    case DW_FORM_ref_addr:
       
 39338 +      // DWARF2 and 3 differ on whether ref_addr is address size or
       
 39339 +      // offset size.
       
 39340 +      assert(header_.version == 2 || header_.version == 3);
       
 39341 +      if (header_.version == 2) {
       
 39342 +        return start + reader_->AddressSize();
       
 39343 +      } else if (header_.version == 3) {
       
 39344 +        return start + reader_->OffsetSize();
       
 39345 +      }
       
 39346 +      break;
       
 39347 +
       
 39348 +    case DW_FORM_block1:
       
 39349 +      return start + 1 + reader_->ReadOneByte(start);
       
 39350 +      break;
       
 39351 +    case DW_FORM_block2:
       
 39352 +      return start + 2 + reader_->ReadTwoBytes(start);
       
 39353 +      break;
       
 39354 +    case DW_FORM_block4:
       
 39355 +      return start + 4 + reader_->ReadFourBytes(start);
       
 39356 +      break;
       
 39357 +    case DW_FORM_block: {
       
 39358 +      uint64 size = reader_->ReadUnsignedLEB128(start, &len);
       
 39359 +      return start + size + len;
       
 39360 +    }
       
 39361 +      break;
       
 39362 +    case DW_FORM_strp:
       
 39363 +        return start + reader_->OffsetSize();
       
 39364 +      break;
       
 39365 +    default:
       
 39366 +      fprintf(stderr,"Unhandled form type");
       
 39367 +  }
       
 39368 +  fprintf(stderr,"Unhandled form type");
       
 39369 +  return NULL;
       
 39370 +}
       
 39371 +
       
 39372 +// Read a DWARF2/3 header.
       
 39373 +// The header is variable length in DWARF3 (and DWARF2 as extended by
       
 39374 +// most compilers), and consists of an length field, a version number,
       
 39375 +// the offset in the .debug_abbrev section for our abbrevs, and an
       
 39376 +// address size.
       
 39377 +void CompilationUnit::ReadHeader() {
       
 39378 +  const char* headerptr = buffer_;
       
 39379 +  size_t initial_length_size;
       
 39380 +
       
 39381 +  assert(headerptr + 4 < buffer_ + buffer_length_);
       
 39382 +  const uint64 initial_length = ReadInitialLength(headerptr, reader_,
       
 39383 +                                                  &initial_length_size);
       
 39384 +  headerptr += initial_length_size;
       
 39385 +  header_.length = initial_length;
       
 39386 +
       
 39387 +  assert(headerptr + 2 < buffer_ + buffer_length_);
       
 39388 +  header_.version = reader_->ReadTwoBytes(headerptr);
       
 39389 +  headerptr += 2;
       
 39390 +
       
 39391 +  assert(headerptr + reader_->OffsetSize() < buffer_ + buffer_length_);
       
 39392 +  header_.abbrev_offset = reader_->ReadOffset(headerptr);
       
 39393 +  headerptr += reader_->OffsetSize();
       
 39394 +
       
 39395 +  assert(headerptr + 1 < buffer_ + buffer_length_);
       
 39396 +  header_.address_size = reader_->ReadOneByte(headerptr);
       
 39397 +  reader_->SetAddressSize(header_.address_size);
       
 39398 +  headerptr += 1;
       
 39399 +
       
 39400 +  after_header_ = headerptr;
       
 39401 +
       
 39402 +  // This check ensures that we don't have to do checking during the
       
 39403 +  // reading of DIEs. header_.length does not include the size of the
       
 39404 +  // initial length.
       
 39405 +  assert(buffer_ + initial_length_size + header_.length <=
       
 39406 +        buffer_ + buffer_length_);
       
 39407 +}
       
 39408 +
       
 39409 +uint64 CompilationUnit::Start() {
       
 39410 +  // First get the debug_info section
       
 39411 +  SectionMap::const_iterator iter = sections_.find("__debug_info");
       
 39412 +  assert(iter != sections_.end());
       
 39413 +
       
 39414 +  // Set up our buffer
       
 39415 +  buffer_ = iter->second.first + offset_from_section_start_;
       
 39416 +  buffer_length_ = iter->second.second - offset_from_section_start_;
       
 39417 +
       
 39418 +  // Read the header
       
 39419 +  ReadHeader();
       
 39420 +
       
 39421 +  // Figure out the real length from the end of the initial length to
       
 39422 +  // the end of the compilation unit, since that is the value we
       
 39423 +  // return.
       
 39424 +  uint64 ourlength = header_.length;
       
 39425 +  if (reader_->OffsetSize() == 8)
       
 39426 +    ourlength += 12;
       
 39427 +  else
       
 39428 +    ourlength += 4;
       
 39429 +
       
 39430 +  // See if the user wants this compilation unit, and if not, just return.
       
 39431 +  if (!handler_->StartCompilationUnit(offset_from_section_start_,
       
 39432 +                                      reader_->AddressSize(),
       
 39433 +                                      reader_->OffsetSize(),
       
 39434 +                                      header_.length,
       
 39435 +                                      header_.version))
       
 39436 +    return ourlength;
       
 39437 +
       
 39438 +  // Otherwise, continue by reading our abbreviation entries.
       
 39439 +  ReadAbbrevs();
       
 39440 +
       
 39441 +  // Set the string section if we have one.
       
 39442 +  iter = sections_.find("__debug_str");
       
 39443 +  if (iter != sections_.end()) {
       
 39444 +    string_buffer_ = iter->second.first;
       
 39445 +    string_buffer_length_ = iter->second.second;
       
 39446 +  }
       
 39447 +
       
 39448 +  // Now that we have our abbreviations, start processing DIE's.
       
 39449 +  ProcessDIEs();
       
 39450 +
       
 39451 +  return ourlength;
       
 39452 +}
       
 39453 +
       
 39454 +// If one really wanted, you could merge SkipAttribute and
       
 39455 +// ProcessAttribute
       
 39456 +// This is all boring data manipulation and calling of the handler.
       
 39457 +const char* CompilationUnit::ProcessAttribute(
       
 39458 +    uint64 dieoffset, const char* start, enum DwarfAttribute attr,
       
 39459 +    enum DwarfForm form) {
       
 39460 +  size_t len;
       
 39461 +
       
 39462 +  switch (form) {
       
 39463 +    // DW_FORM_indirect is never used because it is such a space
       
 39464 +    // waster.
       
 39465 +    case DW_FORM_indirect:
       
 39466 +      form = static_cast<enum DwarfForm>(reader_->ReadUnsignedLEB128(start,
       
 39467 +                                                                     &len));
       
 39468 +      start += len;
       
 39469 +      return ProcessAttribute(dieoffset, start, attr, form);
       
 39470 +      break;
       
 39471 +
       
 39472 +    case DW_FORM_data1:
       
 39473 +    case DW_FORM_flag:
       
 39474 +    case DW_FORM_ref1:
       
 39475 +      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 39476 +                                         reader_->ReadOneByte(start));
       
 39477 +      return start + 1;
       
 39478 +      break;
       
 39479 +    case DW_FORM_ref2:
       
 39480 +    case DW_FORM_data2:
       
 39481 +      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 39482 +                                         reader_->ReadTwoBytes(start));
       
 39483 +      return start + 2;
       
 39484 +      break;
       
 39485 +    case DW_FORM_ref4:
       
 39486 +    case DW_FORM_data4:
       
 39487 +      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 39488 +                                         reader_->ReadFourBytes(start));
       
 39489 +      return start + 4;
       
 39490 +      break;
       
 39491 +    case DW_FORM_ref8:
       
 39492 +    case DW_FORM_data8:
       
 39493 +      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 39494 +                                         reader_->ReadEightBytes(start));
       
 39495 +      return start + 8;
       
 39496 +      break;
       
 39497 +    case DW_FORM_string: {
       
 39498 +      const char* str = start;
       
 39499 +      handler_->ProcessAttributeString(dieoffset, attr, form,
       
 39500 +                                       str);
       
 39501 +      return start + strlen(str) + 1;
       
 39502 +    }
       
 39503 +      break;
       
 39504 +    case DW_FORM_udata:
       
 39505 +    case DW_FORM_ref_udata:
       
 39506 +      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 39507 +                                         reader_->ReadUnsignedLEB128(start,
       
 39508 +                                                                     &len));
       
 39509 +      return start + len;
       
 39510 +      break;
       
 39511 +
       
 39512 +    case DW_FORM_sdata:
       
 39513 +      handler_->ProcessAttributeSigned(dieoffset, attr, form,
       
 39514 +                                      reader_->ReadSignedLEB128(start, &len));
       
 39515 +      return start + len;
       
 39516 +      break;
       
 39517 +    case DW_FORM_addr:
       
 39518 +      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 39519 +                                         reader_->ReadAddress(start));
       
 39520 +      return start + reader_->AddressSize();
       
 39521 +      break;
       
 39522 +    case DW_FORM_ref_addr:
       
 39523 +      // DWARF2 and 3 differ on whether ref_addr is address size or
       
 39524 +      // offset size.
       
 39525 +      assert(header_.version == 2 || header_.version == 3);
       
 39526 +      if (header_.version == 2) {
       
 39527 +        handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 39528 +                                           reader_->ReadAddress(start));
       
 39529 +        return start + reader_->AddressSize();
       
 39530 +      } else if (header_.version == 3) {
       
 39531 +        handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 39532 +                                           reader_->ReadOffset(start));
       
 39533 +        return start + reader_->OffsetSize();
       
 39534 +      }
       
 39535 +      break;
       
 39536 +
       
 39537 +    case DW_FORM_block1: {
       
 39538 +      uint64 datalen = reader_->ReadOneByte(start);
       
 39539 +      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 1,
       
 39540 +                                      datalen);
       
 39541 +      return start + 1 + datalen;
       
 39542 +    }
       
 39543 +      break;
       
 39544 +    case DW_FORM_block2: {
       
 39545 +      uint64 datalen = reader_->ReadTwoBytes(start);
       
 39546 +      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 2,
       
 39547 +                                      datalen);
       
 39548 +      return start + 2 + datalen;
       
 39549 +    }
       
 39550 +      break;
       
 39551 +    case DW_FORM_block4: {
       
 39552 +      uint64 datalen = reader_->ReadFourBytes(start);
       
 39553 +      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 4,
       
 39554 +                                      datalen);
       
 39555 +      return start + 4 + datalen;
       
 39556 +    }
       
 39557 +      break;
       
 39558 +    case DW_FORM_block: {
       
 39559 +      uint64 datalen = reader_->ReadUnsignedLEB128(start, &len);
       
 39560 +      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + len,
       
 39561 +                                      datalen);
       
 39562 +      return start + datalen + len;
       
 39563 +    }
       
 39564 +      break;
       
 39565 +    case DW_FORM_strp: {
       
 39566 +      assert(string_buffer_ != NULL);
       
 39567 +
       
 39568 +      const uint64 offset = reader_->ReadOffset(start);
       
 39569 +      assert(string_buffer_ + offset < string_buffer_ + string_buffer_length_);
       
 39570 +
       
 39571 +      const char* str = string_buffer_ + offset;
       
 39572 +      handler_->ProcessAttributeString(dieoffset, attr, form,
       
 39573 +                                       str);
       
 39574 +      return start + reader_->OffsetSize();
       
 39575 +    }
       
 39576 +      break;
       
 39577 +    default:
       
 39578 +      fprintf(stderr, "Unhandled form type");
       
 39579 +  }
       
 39580 +  fprintf(stderr, "Unhandled form type");
       
 39581 +  return NULL;
       
 39582 +}
       
 39583 +
       
 39584 +const char* CompilationUnit::ProcessDIE(uint64 dieoffset,
       
 39585 +                                                 const char* start,
       
 39586 +                                                 const Abbrev& abbrev) {
       
 39587 +  for (AttributeList::const_iterator i = abbrev.attributes.begin();
       
 39588 +       i != abbrev.attributes.end();
       
 39589 +       i++)  {
       
 39590 +    start = ProcessAttribute(dieoffset, start, i->first, i->second);
       
 39591 +  }
       
 39592 +  return start;
       
 39593 +}
       
 39594 +
       
 39595 +void CompilationUnit::ProcessDIEs() {
       
 39596 +  const char* dieptr = after_header_;
       
 39597 +  size_t len;
       
 39598 +
       
 39599 +  // lengthstart is the place the length field is based on.
       
 39600 +  // It is the point in the header after the initial length field
       
 39601 +  const char* lengthstart = buffer_;
       
 39602 +
       
 39603 +  // In 64 bit dwarf, the initial length is 12 bytes, because of the
       
 39604 +  // 0xffffffff at the start.
       
 39605 +  if (reader_->OffsetSize() == 8)
       
 39606 +    lengthstart += 12;
       
 39607 +  else
       
 39608 +    lengthstart += 4;
       
 39609 +
       
 39610 +  // we need semantics of boost scoped_ptr here - no intention of trasnferring
       
 39611 +  // ownership of the stack.  use const, but then we limit ourselves to not
       
 39612 +  // ever being able to call .reset() on the smart pointer.
       
 39613 +  std::auto_ptr<stack<uint64> > const die_stack(new stack<uint64>);
       
 39614 +
       
 39615 +  while (dieptr < (lengthstart + header_.length)) {
       
 39616 +    // We give the user the absolute offset from the beginning of
       
 39617 +    // debug_info, since they need it to deal with ref_addr forms.
       
 39618 +    uint64 absolute_offset = (dieptr - buffer_) + offset_from_section_start_;
       
 39619 +
       
 39620 +    uint64 abbrev_num = reader_->ReadUnsignedLEB128(dieptr, &len);
       
 39621 +
       
 39622 +    dieptr += len;
       
 39623 +
       
 39624 +    // Abbrev == 0 represents the end of a list of children.
       
 39625 +    if (abbrev_num == 0) {
       
 39626 +      const uint64 offset = die_stack->top();
       
 39627 +      die_stack->pop();
       
 39628 +      handler_->EndDIE(offset);
       
 39629 +      continue;
       
 39630 +    }
       
 39631 +
       
 39632 +    const Abbrev& abbrev = abbrevs_->at(abbrev_num);
       
 39633 +    const enum DwarfTag tag = abbrev.tag;
       
 39634 +    if (!handler_->StartDIE(absolute_offset, tag, abbrev.attributes)) {
       
 39635 +      dieptr = SkipDIE(dieptr, abbrev);
       
 39636 +    } else {
       
 39637 +      dieptr = ProcessDIE(absolute_offset, dieptr, abbrev);
       
 39638 +    }
       
 39639 +
       
 39640 +    if (abbrev.has_children) {
       
 39641 +      die_stack->push(absolute_offset);
       
 39642 +    } else {
       
 39643 +      handler_->EndDIE(absolute_offset);
       
 39644 +    }
       
 39645 +  }
       
 39646 +}
       
 39647 +
       
 39648 +LineInfo::LineInfo(const char* buffer, uint64 buffer_length,
       
 39649 +                   ByteReader* reader, LineInfoHandler* handler):
       
 39650 +    handler_(handler), reader_(reader), buffer_(buffer),
       
 39651 +    buffer_length_(buffer_length) {
       
 39652 +  header_.std_opcode_lengths = NULL;
       
 39653 +}
       
 39654 +
       
 39655 +uint64 LineInfo::Start() {
       
 39656 +  ReadHeader();
       
 39657 +  ReadLines();
       
 39658 +  return after_header_ - buffer_;
       
 39659 +}
       
 39660 +
       
 39661 +// The header for a debug_line section is mildly complicated, because
       
 39662 +// the line info is very tightly encoded.
       
 39663 +void LineInfo::ReadHeader() {
       
 39664 +  const char* lineptr = buffer_;
       
 39665 +  size_t initial_length_size;
       
 39666 +
       
 39667 +  const uint64 initial_length = ReadInitialLength(lineptr, reader_,
       
 39668 +                                                  &initial_length_size);
       
 39669 +
       
 39670 +  lineptr += initial_length_size;
       
 39671 +  header_.total_length = initial_length;
       
 39672 +  assert(buffer_ + initial_length_size + header_.total_length <=
       
 39673 +        buffer_ + buffer_length_);
       
 39674 +
       
 39675 +  // Address size *must* be set by CU ahead of time.
       
 39676 +  assert(reader_->AddressSize() != 0);
       
 39677 +
       
 39678 +  header_.version = reader_->ReadTwoBytes(lineptr);
       
 39679 +  lineptr += 2;
       
 39680 +
       
 39681 +  header_.prologue_length = reader_->ReadOffset(lineptr);
       
 39682 +  lineptr += reader_->OffsetSize();
       
 39683 +
       
 39684 +  header_.min_insn_length = reader_->ReadOneByte(lineptr);
       
 39685 +  lineptr += 1;
       
 39686 +
       
 39687 +  header_.default_is_stmt = reader_->ReadOneByte(lineptr);
       
 39688 +  lineptr += 1;
       
 39689 +
       
 39690 +  header_.line_base = *reinterpret_cast<const int8*>(lineptr);
       
 39691 +  lineptr += 1;
       
 39692 +
       
 39693 +  header_.line_range = reader_->ReadOneByte(lineptr);
       
 39694 +  lineptr += 1;
       
 39695 +
       
 39696 +  header_.opcode_base = reader_->ReadOneByte(lineptr);
       
 39697 +  lineptr += 1;
       
 39698 +
       
 39699 +  header_.std_opcode_lengths = new vector<unsigned char>;
       
 39700 +  header_.std_opcode_lengths->resize(header_.opcode_base + 1);
       
 39701 +  (*header_.std_opcode_lengths)[0] = 0;
       
 39702 +  for (int i = 1; i < header_.opcode_base; i++) {
       
 39703 +    (*header_.std_opcode_lengths)[i] = reader_->ReadOneByte(lineptr);
       
 39704 +    lineptr += 1;
       
 39705 +  }
       
 39706 +
       
 39707 +  // It is legal for the directory entry table to be empty.
       
 39708 +  if (*lineptr) {
       
 39709 +    uint32 dirindex = 1;
       
 39710 +    while (*lineptr) {
       
 39711 +      const char* dirname = lineptr;
       
 39712 +      handler_->DefineDir(dirname, dirindex);
       
 39713 +      lineptr += strlen(dirname) + 1;
       
 39714 +      dirindex++;
       
 39715 +    }
       
 39716 +  }
       
 39717 +  lineptr++;
       
 39718 +
       
 39719 +  // It is also legal for the file entry table to be empty.
       
 39720 +  if (*lineptr) {
       
 39721 +    uint32 fileindex = 1;
       
 39722 +    size_t len;
       
 39723 +    while (*lineptr) {
       
 39724 +      const char* filename = lineptr;
       
 39725 +      lineptr += strlen(filename) + 1;
       
 39726 +
       
 39727 +      uint64 dirindex = reader_->ReadUnsignedLEB128(lineptr, &len);
       
 39728 +      lineptr += len;
       
 39729 +
       
 39730 +      uint64 mod_time = reader_->ReadUnsignedLEB128(lineptr, &len);
       
 39731 +      lineptr += len;
       
 39732 +
       
 39733 +      uint64 filelength = reader_->ReadUnsignedLEB128(lineptr, &len);
       
 39734 +      lineptr += len;
       
 39735 +      handler_->DefineFile(filename, fileindex, dirindex, mod_time,
       
 39736 +                           filelength);
       
 39737 +      fileindex++;
       
 39738 +    }
       
 39739 +  }
       
 39740 +  lineptr++;
       
 39741 +
       
 39742 +  after_header_ = lineptr;
       
 39743 +}
       
 39744 +
       
 39745 +/* static */
       
 39746 +bool LineInfo::ProcessOneOpcode(ByteReader* reader,
       
 39747 +                                LineInfoHandler* handler,
       
 39748 +                                const struct LineInfoHeader &header,
       
 39749 +                                const char* start,
       
 39750 +                                struct LineStateMachine* lsm,
       
 39751 +                                size_t* len,
       
 39752 +                                uintptr pc,
       
 39753 +                                bool *lsm_passes_pc) {
       
 39754 +  size_t oplen = 0;
       
 39755 +  size_t templen;
       
 39756 +  uint8 opcode = reader->ReadOneByte(start);
       
 39757 +  oplen++;
       
 39758 +  start++;
       
 39759 +
       
 39760 +  // If the opcode is great than the opcode_base, it is a special
       
 39761 +  // opcode. Most line programs consist mainly of special opcodes.
       
 39762 +  if (opcode >= header.opcode_base) {
       
 39763 +    opcode -= header.opcode_base;
       
 39764 +    const int64 advance_address = (opcode / header.line_range)
       
 39765 +                                  * header.min_insn_length;
       
 39766 +    const int64 advance_line = (opcode % header.line_range)
       
 39767 +                               + header.line_base;
       
 39768 +
       
 39769 +    // Check if the lsm passes "pc". If so, mark it as passed.
       
 39770 +    if (lsm_passes_pc &&
       
 39771 +        lsm->address <= pc && pc < lsm->address + advance_address) {
       
 39772 +      *lsm_passes_pc = true;
       
 39773 +    }
       
 39774 +
       
 39775 +    lsm->address += advance_address;
       
 39776 +    lsm->line_num += advance_line;
       
 39777 +    lsm->basic_block = true;
       
 39778 +    *len = oplen;
       
 39779 +    return true;
       
 39780 +  }
       
 39781 +
       
 39782 +  // Otherwise, we have the regular opcodes
       
 39783 +  switch (opcode) {
       
 39784 +    case DW_LNS_copy: {
       
 39785 +      lsm->basic_block = false;
       
 39786 +      *len = oplen;
       
 39787 +      return true;
       
 39788 +    }
       
 39789 +
       
 39790 +    case DW_LNS_advance_pc: {
       
 39791 +      uint64 advance_address = reader->ReadUnsignedLEB128(start, &templen);
       
 39792 +      oplen += templen;
       
 39793 +
       
 39794 +      // Check if the lsm passes "pc". If so, mark it as passed.
       
 39795 +      if (lsm_passes_pc && lsm->address <= pc &&
       
 39796 +          pc < lsm->address + header.min_insn_length * advance_address) {
       
 39797 +        *lsm_passes_pc = true;
       
 39798 +      }
       
 39799 +
       
 39800 +      lsm->address += header.min_insn_length * advance_address;
       
 39801 +    }
       
 39802 +      break;
       
 39803 +    case DW_LNS_advance_line: {
       
 39804 +      const int64 advance_line = reader->ReadSignedLEB128(start, &templen);
       
 39805 +      oplen += templen;
       
 39806 +      lsm->line_num += advance_line;
       
 39807 +
       
 39808 +      // With gcc 4.2.1, we can get the line_no here for the first time
       
 39809 +      // since DW_LNS_advance_line is called after DW_LNE_set_address is
       
 39810 +      // called. So we check if the lsm passes "pc" here, not in
       
 39811 +      // DW_LNE_set_address.
       
 39812 +      if (lsm_passes_pc && lsm->address == pc) {
       
 39813 +        *lsm_passes_pc = true;
       
 39814 +      }
       
 39815 +    }
       
 39816 +      break;
       
 39817 +    case DW_LNS_set_file: {
       
 39818 +      const uint64 fileno = reader->ReadUnsignedLEB128(start, &templen);
       
 39819 +      oplen += templen;
       
 39820 +      lsm->file_num = fileno;
       
 39821 +    }
       
 39822 +      break;
       
 39823 +    case DW_LNS_set_column: {
       
 39824 +      const uint64 colno = reader->ReadUnsignedLEB128(start, &templen);
       
 39825 +      oplen += templen;
       
 39826 +      lsm->column_num = colno;
       
 39827 +    }
       
 39828 +      break;
       
 39829 +    case DW_LNS_negate_stmt: {
       
 39830 +      lsm->is_stmt = !lsm->is_stmt;
       
 39831 +    }
       
 39832 +      break;
       
 39833 +    case DW_LNS_set_basic_block: {
       
 39834 +      lsm->basic_block = true;
       
 39835 +    }
       
 39836 +      break;
       
 39837 +    case DW_LNS_fixed_advance_pc: {
       
 39838 +      const uint16 advance_address = reader->ReadTwoBytes(start);
       
 39839 +      oplen += 2;
       
 39840 +
       
 39841 +      // Check if the lsm passes "pc". If so, mark it as passed.
       
 39842 +      if (lsm_passes_pc &&
       
 39843 +          lsm->address <= pc && pc < lsm->address + advance_address) {
       
 39844 +        *lsm_passes_pc = true;
       
 39845 +      }
       
 39846 +
       
 39847 +      lsm->address += advance_address;
       
 39848 +    }
       
 39849 +      break;
       
 39850 +    case DW_LNS_const_add_pc: {
       
 39851 +      const int64 advance_address = header.min_insn_length
       
 39852 +                                    * ((255 - header.opcode_base)
       
 39853 +                                       / header.line_range);
       
 39854 +
       
 39855 +      // Check if the lsm passes "pc". If so, mark it as passed.
       
 39856 +      if (lsm_passes_pc &&
       
 39857 +          lsm->address <= pc && pc < lsm->address + advance_address) {
       
 39858 +        *lsm_passes_pc = true;
       
 39859 +      }
       
 39860 +
       
 39861 +      lsm->address += advance_address;
       
 39862 +    }
       
 39863 +      break;
       
 39864 +    case DW_LNS_extended_op: {
       
 39865 +      const size_t extended_op_len = reader->ReadUnsignedLEB128(start,
       
 39866 +                                                                &templen);
       
 39867 +      start += templen;
       
 39868 +      oplen += templen + extended_op_len;
       
 39869 +
       
 39870 +      const uint64 extended_op = reader->ReadOneByte(start);
       
 39871 +      start++;
       
 39872 +
       
 39873 +      switch (extended_op) {
       
 39874 +        case DW_LNE_end_sequence: {
       
 39875 +          lsm->end_sequence = true;
       
 39876 +          *len = oplen;
       
 39877 +          return true;
       
 39878 +        }
       
 39879 +          break;
       
 39880 +        case DW_LNE_set_address: {
       
 39881 +          // With gcc 4.2.1, we cannot tell the line_no here since
       
 39882 +          // DW_LNE_set_address is called before DW_LNS_advance_line is
       
 39883 +          // called.  So we do not check if the lsm passes "pc" here.  See
       
 39884 +          // also the comment in DW_LNS_advance_line.
       
 39885 +          uint64 address = reader->ReadAddress(start);
       
 39886 +          lsm->address = address;
       
 39887 +        }
       
 39888 +          break;
       
 39889 +        case DW_LNE_define_file: {
       
 39890 +          const char* filename  = start;
       
 39891 +
       
 39892 +          templen = strlen(filename) + 1;
       
 39893 +          start += templen;
       
 39894 +
       
 39895 +          uint64 dirindex = reader->ReadUnsignedLEB128(start, &templen);
       
 39896 +          oplen += templen;
       
 39897 +
       
 39898 +          const uint64 mod_time = reader->ReadUnsignedLEB128(start,
       
 39899 +                                                             &templen);
       
 39900 +          oplen += templen;
       
 39901 +
       
 39902 +          const uint64 filelength = reader->ReadUnsignedLEB128(start,
       
 39903 +                                                               &templen);
       
 39904 +          oplen += templen;
       
 39905 +
       
 39906 +          if (handler) {
       
 39907 +            handler->DefineFile(filename, -1, dirindex, mod_time,
       
 39908 +                                filelength);
       
 39909 +          }
       
 39910 +        }
       
 39911 +          break;
       
 39912 +      }
       
 39913 +    }
       
 39914 +      break;
       
 39915 +
       
 39916 +    default: {
       
 39917 +      // Ignore unknown opcode  silently
       
 39918 +      if (header.std_opcode_lengths) {
       
 39919 +        for (int i = 0; i < (*header.std_opcode_lengths)[opcode]; i++) {
       
 39920 +          size_t templen;
       
 39921 +          reader->ReadUnsignedLEB128(start, &templen);
       
 39922 +          start += templen;
       
 39923 +          oplen += templen;
       
 39924 +        }
       
 39925 +      }
       
 39926 +    }
       
 39927 +      break;
       
 39928 +  }
       
 39929 +  *len = oplen;
       
 39930 +  return false;
       
 39931 +}
       
 39932 +
       
 39933 +void LineInfo::ReadLines() {
       
 39934 +  struct LineStateMachine lsm;
       
 39935 +
       
 39936 +  // lengthstart is the place the length field is based on.
       
 39937 +  // It is the point in the header after the initial length field
       
 39938 +  const char* lengthstart = buffer_;
       
 39939 +
       
 39940 +  // In 64 bit dwarf, the initial length is 12 bytes, because of the
       
 39941 +  // 0xffffffff at the start.
       
 39942 +  if (reader_->OffsetSize() == 8)
       
 39943 +    lengthstart += 12;
       
 39944 +  else
       
 39945 +    lengthstart += 4;
       
 39946 +
       
 39947 +  const char* lineptr = after_header_;
       
 39948 +  while (lineptr < lengthstart + header_.total_length) {
       
 39949 +    lsm.Reset(header_.default_is_stmt);
       
 39950 +    while (!lsm.end_sequence) {
       
 39951 +      size_t oplength;
       
 39952 +      bool add_line = ProcessOneOpcode(reader_, handler_, header_,
       
 39953 +                                       lineptr, &lsm, &oplength, (uintptr)-1,
       
 39954 +                                       NULL);
       
 39955 +      if (add_line)
       
 39956 +        handler_->AddLine(lsm.address, lsm.file_num, lsm.line_num,
       
 39957 +                          lsm.column_num);
       
 39958 +      lineptr += oplength;
       
 39959 +    }
       
 39960 +  }
       
 39961 +
       
 39962 +  after_header_ = lengthstart + header_.total_length;
       
 39963 +}
       
 39964 +
       
 39965 +}  // namespace dwarf2reader
       
 39966 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.h b/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.h
       
 39967 new file mode 100644
       
 39968 --- /dev/null
       
 39969 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/dwarf2reader.h
       
 39970 @@ -0,0 +1,393 @@
       
 39971 +// Copyright 2006 Google Inc. All Rights Reserved.
       
 39972 +//
       
 39973 +// Redistribution and use in source and binary forms, with or without
       
 39974 +// modification, are permitted provided that the following conditions are
       
 39975 +// met:
       
 39976 +//
       
 39977 +//     * Redistributions of source code must retain the above copyright
       
 39978 +// notice, this list of conditions and the following disclaimer.
       
 39979 +//     * Redistributions in binary form must reproduce the above
       
 39980 +// copyright notice, this list of conditions and the following disclaimer
       
 39981 +// in the documentation and/or other materials provided with the
       
 39982 +// distribution.
       
 39983 +//     * Neither the name of Google Inc. nor the names of its
       
 39984 +// contributors may be used to endorse or promote products derived from
       
 39985 +// this software without specific prior written permission.
       
 39986 +//
       
 39987 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 39988 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 39989 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 39990 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 39991 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 39992 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 39993 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 39994 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 39995 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 39996 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 39997 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 39998 +
       
 39999 +// This file contains definitions related to the DWARF2/3 reader and
       
 40000 +// it's handler interfaces.
       
 40001 +// The DWARF2/3 specification can be found at
       
 40002 +// http://dwarf.freestandards.org and should be considered required
       
 40003 +// reading if you wish to modify the implementation.
       
 40004 +// Only a cursory attempt is made to explain terminology that is
       
 40005 +// used here, as it is much better explained in the standard documents
       
 40006 +#ifndef COMMON_DWARF_DWARF2READER_H__
       
 40007 +#define COMMON_DWARF_DWARF2READER_H__
       
 40008 +
       
 40009 +#include <list>
       
 40010 +#include <map>
       
 40011 +#include <string>
       
 40012 +#include <utility>
       
 40013 +#include <vector>
       
 40014 +
       
 40015 +#include "common/dwarf/dwarf2enums.h"
       
 40016 +#include "common/dwarf/types.h"
       
 40017 +
       
 40018 +using namespace std;
       
 40019 +
       
 40020 +namespace dwarf2reader {
       
 40021 +struct LineStateMachine;
       
 40022 +class ByteReader;
       
 40023 +class Dwarf2Handler;
       
 40024 +class LineInfoHandler;
       
 40025 +
       
 40026 +// This maps from a string naming a section to a pair containing a
       
 40027 +// the data for the section, and the size of the section.
       
 40028 +typedef map<string, pair<const char*, uint64> > SectionMap;
       
 40029 +typedef list<pair<enum DwarfAttribute, enum DwarfForm> > AttributeList;
       
 40030 +typedef AttributeList::iterator AttributeIterator;
       
 40031 +typedef AttributeList::const_iterator ConstAttributeIterator;
       
 40032 +
       
 40033 +struct LineInfoHeader {
       
 40034 +  uint64 total_length;
       
 40035 +  uint16 version;
       
 40036 +  uint64 prologue_length;
       
 40037 +  uint8 min_insn_length; // insn stands for instructin
       
 40038 +  bool default_is_stmt; // stmt stands for statement
       
 40039 +  int8 line_base;
       
 40040 +  uint8 line_range;
       
 40041 +  uint8 opcode_base;
       
 40042 +  // Use a pointer so that signalsafe_addr2line is able to use this structure
       
 40043 +  // without heap allocation problem.
       
 40044 +  vector<unsigned char> *std_opcode_lengths;
       
 40045 +};
       
 40046 +
       
 40047 +class LineInfo {
       
 40048 + public:
       
 40049 +
       
 40050 +  // Initializes a .debug_line reader. Buffer and buffer length point
       
 40051 +  // to the beginning and length of the line information to read.
       
 40052 +  // Reader is a ByteReader class that has the endianness set
       
 40053 +  // properly.
       
 40054 +  LineInfo(const char* buffer_, uint64 buffer_length,
       
 40055 +           ByteReader* reader, LineInfoHandler* handler);
       
 40056 +
       
 40057 +  virtual ~LineInfo() {
       
 40058 +    if (header_.std_opcode_lengths) {
       
 40059 +      delete header_.std_opcode_lengths;
       
 40060 +    }
       
 40061 +  }
       
 40062 +
       
 40063 +  // Start processing line info, and calling callbacks in the handler.
       
 40064 +  // Consumes the line number information for a single compilation unit.
       
 40065 +  // Returns the number of bytes processed.
       
 40066 +  uint64 Start();
       
 40067 +
       
 40068 +  // Process a single line info opcode at START using the state
       
 40069 +  // machine at LSM.  Return true if we should define a line using the
       
 40070 +  // current state of the line state machine.  Place the length of the
       
 40071 +  // opcode in LEN.
       
 40072 +  // If LSM_PASSES_PC is non-NULL, this function also checks if the lsm
       
 40073 +  // passes the address of PC. In other words, LSM_PASSES_PC will be
       
 40074 +  // set to true, if the following condition is met.
       
 40075 +  //
       
 40076 +  // lsm's old address < PC <= lsm's new address
       
 40077 +  static bool ProcessOneOpcode(ByteReader* reader,
       
 40078 +                               LineInfoHandler* handler,
       
 40079 +                               const struct LineInfoHeader &header,
       
 40080 +                               const char* start,
       
 40081 +                               struct LineStateMachine* lsm,
       
 40082 +                               size_t* len,
       
 40083 +                               uintptr pc,
       
 40084 +                               bool *lsm_passes_pc);
       
 40085 +
       
 40086 + private:
       
 40087 +  // Reads the DWARF2/3 header for this line info.
       
 40088 +  void ReadHeader();
       
 40089 +
       
 40090 +  // Reads the DWARF2/3 line information
       
 40091 +  void ReadLines();
       
 40092 +
       
 40093 +  // The associated handler to call processing functions in
       
 40094 +  LineInfoHandler* handler_;
       
 40095 +
       
 40096 +  // The associated ByteReader that handles endianness issues for us
       
 40097 +  ByteReader* reader_;
       
 40098 +
       
 40099 +  // A DWARF2/3 line info header.  This is not the same size as
       
 40100 +  // in the actual file, as the one in the file may have a 32 bit or
       
 40101 +  // 64 bit lengths
       
 40102 +
       
 40103 +  struct LineInfoHeader header_;
       
 40104 +
       
 40105 +  // buffer is the buffer for our line info, starting at exactly where
       
 40106 +  // the line info to read is.  after_header is the place right after
       
 40107 +  // the end of the line information header.
       
 40108 +  const char* buffer_;
       
 40109 +  uint64 buffer_length_;
       
 40110 +  const char* after_header_;
       
 40111 +};
       
 40112 +
       
 40113 +// This class is the main interface between the line info reader and
       
 40114 +// the client.  The virtual functions inside this get called for
       
 40115 +// interesting events that happen during line info reading.  The
       
 40116 +// default implementation does nothing
       
 40117 +
       
 40118 +class LineInfoHandler {
       
 40119 + public:
       
 40120 +  LineInfoHandler() { }
       
 40121 +
       
 40122 +  virtual ~LineInfoHandler() { }
       
 40123 +
       
 40124 +  // Called when we define a directory.  NAME is the directory name,
       
 40125 +  // DIR_NUM is the directory number
       
 40126 +  virtual void DefineDir(const string& name, uint32 dir_num) { }
       
 40127 +
       
 40128 +  // Called when we define a filename. NAME is the filename, FILE_NUM
       
 40129 +  // is the file number which is -1 if the file index is the next
       
 40130 +  // index after the last numbered index (this happens when files are
       
 40131 +  // dynamically defined by the line program), DIR_NUM is the
       
 40132 +  // directory index for the directory name of this file, MOD_TIME is
       
 40133 +  // the modification time of the file, and LENGTH is the length of
       
 40134 +  // the file
       
 40135 +  virtual void DefineFile(const string& name, int32 file_num,
       
 40136 +                          uint32 dir_num, uint64 mod_time,
       
 40137 +                          uint64 length) { }
       
 40138 +
       
 40139 +  // Called when the line info reader has a new line, address pair
       
 40140 +  // ready for us.  ADDRESS is the address of the code, FILE_NUM is
       
 40141 +  // the file number containing the code, LINE_NUM is the line number in
       
 40142 +  // that file for the code, and COLUMN_NUM is the column number the code
       
 40143 +  // starts at, if we know it (0 otherwise).
       
 40144 +  virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num,
       
 40145 +                       uint32 column_num) { }
       
 40146 +};
       
 40147 +
       
 40148 +// The base of DWARF2/3 debug info is a DIE (Debugging Information
       
 40149 +// Entry.
       
 40150 +// DWARF groups DIE's into a tree and calls the root of this tree a
       
 40151 +// "compilation unit".  Most of the time, there is one compilation
       
 40152 +// unit in the .debug_info section for each file that had debug info
       
 40153 +// generated.
       
 40154 +// Each DIE consists of
       
 40155 +
       
 40156 +// 1. a tag specifying a thing that is being described (ie
       
 40157 +// DW_TAG_subprogram for functions, DW_TAG_variable for variables, etc
       
 40158 +// 2. attributes (such as DW_AT_location for location in memory,
       
 40159 +// DW_AT_name for name), and data for each attribute.
       
 40160 +// 3. A flag saying whether the DIE has children or not
       
 40161 +
       
 40162 +// In order to gain some amount of compression, the format of
       
 40163 +// each DIE (tag name, attributes and data forms for the attributes)
       
 40164 +// are stored in a separate table called the "abbreviation table".
       
 40165 +// This is done because a large number of DIEs have the exact same tag
       
 40166 +// and list of attributes, but different data for those attributes.
       
 40167 +// As a result, the .debug_info section is just a stream of data, and
       
 40168 +// requires reading of the .debug_abbrev section to say what the data
       
 40169 +// means.
       
 40170 +
       
 40171 +// As a warning to the user, it should be noted that the reason for
       
 40172 +// using absolute offsets from the beginning of .debug_info is that
       
 40173 +// DWARF2/3 supports referencing DIE's from other DIE's by their offset
       
 40174 +// from either the current compilation unit start, *or* the beginning
       
 40175 +// of the .debug_info section.  This means it is possible to reference
       
 40176 +// a DIE in one compilation unit from a DIE in another compilation
       
 40177 +// unit.  This style of reference is usually used to eliminate
       
 40178 +// duplicated information that occurs across compilation
       
 40179 +// units, such as base types, etc.  GCC 3.4+ support this with
       
 40180 +// -feliminate-dwarf2-dups.  Other toolchains will sometimes do
       
 40181 +// duplicate elimination in the linker.
       
 40182 +
       
 40183 +class CompilationUnit {
       
 40184 + public:
       
 40185 +
       
 40186 +  // Initialize a compilation unit.  This requires a map of sections,
       
 40187 +  // the offset of this compilation unit in the .debug_info section, a
       
 40188 +  // ByteReader, and a Dwarf2Handler class to call callbacks in.
       
 40189 +  CompilationUnit(const SectionMap& sections, uint64 offset,
       
 40190 +                  ByteReader* reader, Dwarf2Handler* handler);
       
 40191 +  virtual ~CompilationUnit() {
       
 40192 +    if (abbrevs_) delete abbrevs_;
       
 40193 +  }
       
 40194 +
       
 40195 +  // Begin reading a Dwarf2 compilation unit, and calling the
       
 40196 +  // callbacks in the Dwarf2Handler
       
 40197 +
       
 40198 +  // Return the full length of the compilation unit, including
       
 40199 +  // headers. This plus the starting offset passed to the constructor
       
 40200 +  // is the offset of the end of the compilation unit --- and the
       
 40201 +  // start of the next compilation unit, if there is one.
       
 40202 +  uint64 Start();
       
 40203 +
       
 40204 + private:
       
 40205 +
       
 40206 +  // This struct represents a single DWARF2/3 abbreviation
       
 40207 +  // The abbreviation tells how to read a DWARF2/3 DIE, and consist of a
       
 40208 +  // tag and a list of attributes, as well as the data form of each attribute.
       
 40209 +  struct Abbrev {
       
 40210 +    uint32 number;
       
 40211 +    enum DwarfTag tag;
       
 40212 +    bool has_children;
       
 40213 +    AttributeList attributes;
       
 40214 +  };
       
 40215 +
       
 40216 +  // A DWARF2/3 compilation unit header.  This is not the same size as
       
 40217 +  // in the actual file, as the one in the file may have a 32 bit or
       
 40218 +  // 64 bit length.
       
 40219 +  struct CompilationUnitHeader {
       
 40220 +    uint64 length;
       
 40221 +    uint16 version;
       
 40222 +    uint64 abbrev_offset;
       
 40223 +    uint8 address_size;
       
 40224 +  } header_;
       
 40225 +
       
 40226 +  // Reads the DWARF2/3 header for this compilation unit.
       
 40227 +  void ReadHeader();
       
 40228 +
       
 40229 +  // Reads the DWARF2/3 abbreviations for this compilation unit
       
 40230 +  void ReadAbbrevs();
       
 40231 +
       
 40232 +  // Processes a single DIE for this compilation unit and return a new
       
 40233 +  // pointer just past the end of it
       
 40234 +  const char* ProcessDIE(uint64 dieoffset,
       
 40235 +                                  const char* start,
       
 40236 +                                  const Abbrev& abbrev);
       
 40237 +
       
 40238 +  // Processes a single attribute and return a new pointer just past the
       
 40239 +  // end of it
       
 40240 +  const char* ProcessAttribute(uint64 dieoffset,
       
 40241 +                                        const char* start,
       
 40242 +                                        enum DwarfAttribute attr,
       
 40243 +                                        enum DwarfForm form);
       
 40244 +
       
 40245 +  // Processes all DIEs for this compilation unit
       
 40246 +  void ProcessDIEs();
       
 40247 +
       
 40248 +  // Skips the die with attributes specified in ABBREV starting at
       
 40249 +  // START, and return the new place to position the stream to.
       
 40250 +  const char* SkipDIE(const char* start,
       
 40251 +                               const Abbrev& abbrev);
       
 40252 +
       
 40253 +  // Skips the attribute starting at START, with FORM, and return the
       
 40254 +  // new place to position the stream to.
       
 40255 +  const char* SkipAttribute(const char* start,
       
 40256 +                                     enum DwarfForm form);
       
 40257 +
       
 40258 +  // Offset from section start is the offset of this compilation unit
       
 40259 +  // from the beginning of the .debug_info section.
       
 40260 +  uint64 offset_from_section_start_;
       
 40261 +
       
 40262 +  // buffer is the buffer for our CU, starting at .debug_info + offset
       
 40263 +  // passed in from constructor.
       
 40264 +  // after_header points to right after the compilation unit header.
       
 40265 +  const char* buffer_;
       
 40266 +  uint64 buffer_length_;
       
 40267 +  const char* after_header_;
       
 40268 +
       
 40269 +  // The associated ByteReader that handles endianness issues for us
       
 40270 +  ByteReader* reader_;
       
 40271 +
       
 40272 +  // The map of sections in our file to buffers containing their data
       
 40273 +  const SectionMap& sections_;
       
 40274 +
       
 40275 +  // The associated handler to call processing functions in
       
 40276 +  Dwarf2Handler* handler_;
       
 40277 +
       
 40278 +  // Set of DWARF2/3 abbreviations for this compilation unit.  Indexed
       
 40279 +  // by abbreviation number, which means that abbrevs_[0] is not
       
 40280 +  // valid.
       
 40281 +  vector<Abbrev>* abbrevs_;
       
 40282 +
       
 40283 +  // String section buffer and length, if we have a string section.
       
 40284 +  // This is here to avoid doing a section lookup for strings in
       
 40285 +  // ProcessAttribute, which is in the hot path for DWARF2 reading.
       
 40286 +  const char* string_buffer_;
       
 40287 +  uint64 string_buffer_length_;
       
 40288 +};
       
 40289 +
       
 40290 +// This class is the main interface between the reader and the
       
 40291 +// client.  The virtual functions inside this get called for
       
 40292 +// interesting events that happen during DWARF2 reading.
       
 40293 +// The default implementation skips everything.
       
 40294 +
       
 40295 +class Dwarf2Handler {
       
 40296 + public:
       
 40297 +  Dwarf2Handler() { }
       
 40298 +
       
 40299 +  virtual ~Dwarf2Handler() { }
       
 40300 +
       
 40301 +  // Start to process a compilation unit at OFFSET from the beginning of the
       
 40302 +  // .debug_info section. Return false if you would like to skip this
       
 40303 +  // compilation unit.
       
 40304 +  virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
       
 40305 +                                    uint8 offset_size, uint64 cu_length,
       
 40306 +                                    uint8 dwarf_version) { return false; }
       
 40307 +
       
 40308 +  // Start to process a DIE at OFFSET from the beginning of the .debug_info
       
 40309 +  // section. Return false if you would like to skip this DIE.
       
 40310 +  virtual bool StartDIE(uint64 offset, enum DwarfTag tag,
       
 40311 +                        const AttributeList& attrs) { return false; }
       
 40312 +
       
 40313 +  // Called when we have an attribute with unsigned data to give to our
       
 40314 +  // handler. The attribute is for the DIE at OFFSET from the beginning of the
       
 40315 +  // .debug_info section. Its name is ATTR, its form is FORM, and its value is
       
 40316 +  // DATA.
       
 40317 +  virtual void ProcessAttributeUnsigned(uint64 offset,
       
 40318 +                                        enum DwarfAttribute attr,
       
 40319 +                                        enum DwarfForm form,
       
 40320 +                                        uint64 data) { }
       
 40321 +
       
 40322 +  // Called when we have an attribute with signed data to give to our handler.
       
 40323 +  // The attribute is for the DIE at OFFSET from the beginning of the
       
 40324 +  // .debug_info section. Its name is ATTR, its form is FORM, and its value is
       
 40325 +  // DATA.
       
 40326 +  virtual void ProcessAttributeSigned(uint64 offset,
       
 40327 +                                      enum DwarfAttribute attr,
       
 40328 +                                      enum DwarfForm form,
       
 40329 +                                      int64 data) { }
       
 40330 +
       
 40331 +  // Called when we have an attribute with a buffer of data to give to our
       
 40332 +  // handler. The attribute is for the DIE at OFFSET from the beginning of the
       
 40333 +  // .debug_info section. Its name is ATTR, its form is FORM, DATA points to
       
 40334 +  // the buffer's contents, and its length in bytes is LENGTH. The buffer is
       
 40335 +  // owned by the caller, not the callee, and may not persist for very long.
       
 40336 +  // If you want the data to be available later, it needs to be copied.
       
 40337 +  virtual void ProcessAttributeBuffer(uint64 offset,
       
 40338 +                                      enum DwarfAttribute attr,
       
 40339 +                                      enum DwarfForm form,
       
 40340 +                                      const char* data,
       
 40341 +                                      uint64 len) { }
       
 40342 +
       
 40343 +  // Called when we have an attribute with string data to give to our handler.
       
 40344 +  // The attribute is for the DIE at OFFSET from the beginning of the
       
 40345 +  // .debug_info section. Its name is ATTR, its form is FORM, and its value is
       
 40346 +  // DATA.
       
 40347 +  virtual void ProcessAttributeString(uint64 offset,
       
 40348 +                                      enum DwarfAttribute attr,
       
 40349 +                                      enum DwarfForm form,
       
 40350 +                                      const string& data) { }
       
 40351 +
       
 40352 +  // Called when finished processing the DIE at OFFSET.
       
 40353 +  // Because DWARF2/3 specifies a tree of DIEs, you may get starts
       
 40354 +  // before ends of the previous DIE, as we process children before
       
 40355 +  // ending the parent.
       
 40356 +  virtual void EndDIE(uint64 offset) { }
       
 40357 +
       
 40358 +};
       
 40359 +
       
 40360 +
       
 40361 +}  // namespace dwarf2reader
       
 40362 +
       
 40363 +#endif  // UTIL_DEBUGINFO_DWARF2READER_H__
       
 40364 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/functioninfo.cc b/toolkit/crashreporter/google-breakpad/src/common/dwarf/functioninfo.cc
       
 40365 new file mode 100644
       
 40366 --- /dev/null
       
 40367 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/functioninfo.cc
       
 40368 @@ -0,0 +1,231 @@
       
 40369 +// Copyright 2006 Google Inc. All Rights Reserved.
       
 40370 +//
       
 40371 +// Redistribution and use in source and binary forms, with or without
       
 40372 +// modification, are permitted provided that the following conditions are
       
 40373 +// met:
       
 40374 +//
       
 40375 +//     * Redistributions of source code must retain the above copyright
       
 40376 +// notice, this list of conditions and the following disclaimer.
       
 40377 +//     * Redistributions in binary form must reproduce the above
       
 40378 +// copyright notice, this list of conditions and the following disclaimer
       
 40379 +// in the documentation and/or other materials provided with the
       
 40380 +// distribution.
       
 40381 +//     * Neither the name of Google Inc. nor the names of its
       
 40382 +// contributors may be used to endorse or promote products derived from
       
 40383 +// this software without specific prior written permission.
       
 40384 +//
       
 40385 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 40386 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 40387 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 40388 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 40389 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 40390 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 40391 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 40392 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 40393 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 40394 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 40395 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 40396 +
       
 40397 +// This is a client for the dwarf2reader to extract function and line
       
 40398 +// information from the debug info.
       
 40399 +
       
 40400 +#include <assert.h>
       
 40401 +
       
 40402 +#include <map>
       
 40403 +#include <queue>
       
 40404 +#include <vector>
       
 40405 +
       
 40406 +#include "common/dwarf/functioninfo.h"
       
 40407 +
       
 40408 +#include "common/dwarf/bytereader.h"
       
 40409 +
       
 40410 +
       
 40411 +namespace dwarf2reader {
       
 40412 +
       
 40413 +// Given an offset value, its form, and the base offset of the
       
 40414 +// compilation unit containing this value, return an absolute offset
       
 40415 +// within the .debug_info section.
       
 40416 +uint64 GetAbsoluteOffset(uint64 offset,
       
 40417 +                         enum DwarfForm form,
       
 40418 +                         uint64 compilation_unit_base) {
       
 40419 +  switch (form) {
       
 40420 +    case DW_FORM_ref1:
       
 40421 +    case DW_FORM_ref2:
       
 40422 +    case DW_FORM_ref4:
       
 40423 +    case DW_FORM_ref8:
       
 40424 +    case DW_FORM_ref_udata:
       
 40425 +      return offset + compilation_unit_base;
       
 40426 +    case DW_FORM_ref_addr:
       
 40427 +    default:
       
 40428 +      return offset;
       
 40429 +  }
       
 40430 +}
       
 40431 +
       
 40432 +CULineInfoHandler::CULineInfoHandler(vector<SourceFileInfo>* files,
       
 40433 +                                     vector<string>* dirs,
       
 40434 +                                     LineMap* linemap):linemap_(linemap),
       
 40435 +                                                       files_(files),
       
 40436 +                                                       dirs_(dirs) {
       
 40437 +  // The dirs and files are 1 indexed, so just make sure we put
       
 40438 +  // nothing in the 0 vector.
       
 40439 +  assert(dirs->size() == 0);
       
 40440 +  assert(files->size() == 0);
       
 40441 +  dirs->push_back("");
       
 40442 +  SourceFileInfo s;
       
 40443 +  s.name = "";
       
 40444 +  s.lowpc = ULLONG_MAX;
       
 40445 +  files->push_back(s);
       
 40446 +}
       
 40447 +
       
 40448 +void CULineInfoHandler::DefineDir(const string& name, uint32 dir_num) {
       
 40449 +  // These should never come out of order, actually
       
 40450 +  assert(dir_num == dirs_->size());
       
 40451 +  dirs_->push_back(name);
       
 40452 +}
       
 40453 +
       
 40454 +void CULineInfoHandler::DefineFile(const string& name,
       
 40455 +                                   int32 file_num, uint32 dir_num,
       
 40456 +                                   uint64 mod_time, uint64 length) {
       
 40457 +  assert(dir_num >= 0);
       
 40458 +  assert(dir_num < dirs_->size());
       
 40459 +
       
 40460 +  // These should never come out of order, actually.
       
 40461 +  if (file_num == (int32)files_->size() || file_num == -1) {
       
 40462 +    string dir = dirs_->at(dir_num);
       
 40463 +
       
 40464 +    SourceFileInfo s;
       
 40465 +    s.lowpc = ULLONG_MAX;
       
 40466 +
       
 40467 +    if (dir == "") {
       
 40468 +      s.name = name;
       
 40469 +    } else {
       
 40470 +      s.name = dir + "/" + name;
       
 40471 +    }
       
 40472 +
       
 40473 +    files_->push_back(s);
       
 40474 +  } else {
       
 40475 +    fprintf(stderr, "error in DefineFile");
       
 40476 +  }
       
 40477 +}
       
 40478 +
       
 40479 +void CULineInfoHandler::AddLine(uint64 address, uint32 file_num,
       
 40480 +                                uint32 line_num, uint32 column_num) {
       
 40481 +  if (file_num < files_->size()) {
       
 40482 +    linemap_->insert(make_pair(address, make_pair(files_->at(file_num).name.c_str(),
       
 40483 +                                                  line_num)));
       
 40484 +
       
 40485 +    if(address < files_->at(file_num).lowpc) {
       
 40486 +      files_->at(file_num).lowpc = address;
       
 40487 +    }
       
 40488 +  } else {
       
 40489 +    fprintf(stderr,"error in AddLine");
       
 40490 +  }
       
 40491 +}
       
 40492 +
       
 40493 +bool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset,
       
 40494 +                                                 uint8 address_size,
       
 40495 +                                                 uint8 offset_size,
       
 40496 +                                                 uint64 cu_length,
       
 40497 +                                                 uint8 dwarf_version) {
       
 40498 +  current_compilation_unit_offset_ = offset;
       
 40499 +  return true;
       
 40500 +}
       
 40501 +
       
 40502 +
       
 40503 +// For function info, we only care about subprograms and inlined
       
 40504 +// subroutines. For line info, the DW_AT_stmt_list lives in the
       
 40505 +// compile unit tag.
       
 40506 +
       
 40507 +bool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag,
       
 40508 +                                     const AttributeList& attrs) {
       
 40509 +  switch (tag) {
       
 40510 +    case DW_TAG_subprogram:
       
 40511 +    case DW_TAG_inlined_subroutine: {
       
 40512 +      current_function_info_ = new FunctionInfo;
       
 40513 +      current_function_info_->lowpc = current_function_info_->highpc = 0;
       
 40514 +      current_function_info_->name = "";
       
 40515 +      current_function_info_->line = 0;
       
 40516 +      current_function_info_->file = "";
       
 40517 +      offset_to_funcinfo_->insert(make_pair(offset, current_function_info_));
       
 40518 +    };
       
 40519 +      // FALLTHROUGH
       
 40520 +    case DW_TAG_compile_unit:
       
 40521 +      return true;
       
 40522 +    default:
       
 40523 +      return false;
       
 40524 +  }
       
 40525 +  return false;
       
 40526 +}
       
 40527 +
       
 40528 +// Only care about the name attribute for functions
       
 40529 +
       
 40530 +void CUFunctionInfoHandler::ProcessAttributeString(uint64 offset,
       
 40531 +                                                   enum DwarfAttribute attr,
       
 40532 +                                                   enum DwarfForm form,
       
 40533 +                                                   const string &data) {
       
 40534 +  if (current_function_info_) {
       
 40535 +    if (attr == DW_AT_name)
       
 40536 +      current_function_info_->name = data;
       
 40537 +    else if(attr == DW_AT_MIPS_linkage_name)
       
 40538 +      current_function_info_->mangled_name = data;
       
 40539 +  }
       
 40540 +}
       
 40541 +
       
 40542 +void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset,
       
 40543 +                                                     enum DwarfAttribute attr,
       
 40544 +                                                     enum DwarfForm form,
       
 40545 +                                                     uint64 data) {
       
 40546 +  if (attr == DW_AT_stmt_list) {
       
 40547 +    SectionMap::const_iterator iter = sections_.find("__debug_line");
       
 40548 +    assert(iter != sections_.end());
       
 40549 +
       
 40550 +    // this should be a scoped_ptr but we dont' use boost :-(
       
 40551 +    auto_ptr<LineInfo> lireader(new LineInfo(iter->second.first + data,
       
 40552 +                                               iter->second.second  - data,
       
 40553 +                                               reader_, linehandler_));
       
 40554 +    lireader->Start();
       
 40555 +  } else if (current_function_info_) {
       
 40556 +    switch (attr) {
       
 40557 +      case DW_AT_low_pc:
       
 40558 +        current_function_info_->lowpc = data;
       
 40559 +        break;
       
 40560 +      case DW_AT_high_pc:
       
 40561 +        current_function_info_->highpc = data;
       
 40562 +        break;
       
 40563 +      case DW_AT_decl_line:
       
 40564 +        current_function_info_->line = data;
       
 40565 +        break;
       
 40566 +      case DW_AT_decl_file:
       
 40567 +        current_function_info_->file = files_->at(data).name;
       
 40568 +        break;
       
 40569 +      case DW_AT_specification: {
       
 40570 +        // Some functions have a "specification" attribute
       
 40571 +        // which means they were defined elsewhere. The name
       
 40572 +        // attribute is not repeated, and must be taken from
       
 40573 +        // the specification DIE. Here we'll assume that
       
 40574 +        // any DIE referenced in this manner will already have
       
 40575 +        // been seen, but that's not really required by the spec.
       
 40576 +        uint64 abs_offset = GetAbsoluteOffset(data, form, current_compilation_unit_offset_);
       
 40577 +        FunctionMap::iterator iter = offset_to_funcinfo_->find(abs_offset);
       
 40578 +        if (iter != offset_to_funcinfo_->end()) {
       
 40579 +          current_function_info_->name = iter->second->name;
       
 40580 +          current_function_info_->mangled_name = iter->second->mangled_name;
       
 40581 +        } else {
       
 40582 +          // If you hit this, this code probably needs to be rewritten.
       
 40583 +          fprintf(stderr, "Error: DW_AT_specification was seen before the referenced DIE! (Looking for DIE at offset %08llx, in DIE at offset %08llx)\n", abs_offset, offset);
       
 40584 +        }
       
 40585 +        break;
       
 40586 +      }
       
 40587 +      default:
       
 40588 +        break;
       
 40589 +    }
       
 40590 +  }
       
 40591 +}
       
 40592 +
       
 40593 +void CUFunctionInfoHandler::EndDIE(uint64 offset) {
       
 40594 +  if (current_function_info_ && current_function_info_->lowpc)
       
 40595 +    address_to_funcinfo_->insert(make_pair(current_function_info_->lowpc,
       
 40596 +                                           current_function_info_));
       
 40597 +}
       
 40598 +
       
 40599 +}  // namespace dwarf2reader
       
 40600 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/functioninfo.h b/toolkit/crashreporter/google-breakpad/src/common/dwarf/functioninfo.h
       
 40601 new file mode 100644
       
 40602 --- /dev/null
       
 40603 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/functioninfo.h
       
 40604 @@ -0,0 +1,178 @@
       
 40605 +// Copyright 2006 Google Inc. All Rights Reserved.
       
 40606 +//
       
 40607 +// Redistribution and use in source and binary forms, with or without
       
 40608 +// modification, are permitted provided that the following conditions are
       
 40609 +// met:
       
 40610 +//
       
 40611 +//     * Redistributions of source code must retain the above copyright
       
 40612 +// notice, this list of conditions and the following disclaimer.
       
 40613 +//     * Redistributions in binary form must reproduce the above
       
 40614 +// copyright notice, this list of conditions and the following disclaimer
       
 40615 +// in the documentation and/or other materials provided with the
       
 40616 +// distribution.
       
 40617 +//     * Neither the name of Google Inc. nor the names of its
       
 40618 +// contributors may be used to endorse or promote products derived from
       
 40619 +// this software without specific prior written permission.
       
 40620 +//
       
 40621 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 40622 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 40623 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 40624 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 40625 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 40626 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 40627 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 40628 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 40629 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 40630 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 40631 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 40632 +
       
 40633 +
       
 40634 +// This file contains the definitions for a DWARF2/3 information
       
 40635 +// collector that uses the DWARF2/3 reader interface to build a mapping
       
 40636 +// of addresses to files, lines, and functions.
       
 40637 +
       
 40638 +#ifndef COMMON_DWARF_FUNCTIONINFO_H__
       
 40639 +#define COMMON_DWARF_FUNCTIONINFO_H__
       
 40640 +
       
 40641 +#include <map>
       
 40642 +#include <string>
       
 40643 +#include <utility>
       
 40644 +#include <vector>
       
 40645 +
       
 40646 +#include "common/dwarf/dwarf2reader.h"
       
 40647 +
       
 40648 +
       
 40649 +namespace dwarf2reader {
       
 40650 +
       
 40651 +struct FunctionInfo {
       
 40652 +  // Name of the function
       
 40653 +  string name;
       
 40654 +  // Mangled name of the function
       
 40655 +  string mangled_name;
       
 40656 +  // File containing this function
       
 40657 +  string file;
       
 40658 +  // Line number for start of function.
       
 40659 +  uint32 line;
       
 40660 +  // Beginning address for this function
       
 40661 +  uint64 lowpc;
       
 40662 +  // End address for this function.
       
 40663 +  uint64 highpc;
       
 40664 +};
       
 40665 +
       
 40666 +struct SourceFileInfo {
       
 40667 +  // Name of the source file name
       
 40668 +  string name;
       
 40669 +  // Low address of source file name
       
 40670 +  uint64 lowpc;
       
 40671 +};
       
 40672 +
       
 40673 +typedef map<uint64, FunctionInfo*> FunctionMap;
       
 40674 +typedef map<uint64, pair<string, uint32> > LineMap;
       
 40675 +
       
 40676 +// This class is a basic line info handler that fills in the dirs,
       
 40677 +// file, and linemap passed into it with the data produced from the
       
 40678 +// LineInfoHandler.
       
 40679 +class CULineInfoHandler: public LineInfoHandler {
       
 40680 + public:
       
 40681 +
       
 40682 +  //
       
 40683 +  CULineInfoHandler(vector<SourceFileInfo>* files,
       
 40684 +                    vector<string>* dirs,
       
 40685 +                    LineMap* linemap);
       
 40686 +  virtual ~CULineInfoHandler() { }
       
 40687 +
       
 40688 +  // Called when we define a directory.  We just place NAME into dirs_
       
 40689 +  // at position DIR_NUM.
       
 40690 +  virtual void DefineDir(const string& name, uint32 dir_num);
       
 40691 +
       
 40692 +  // Called when we define a filename.  We just place
       
 40693 +  // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM.
       
 40694 +  virtual void DefineFile(const string& name, int32 file_num,
       
 40695 +                          uint32 dir_num, uint64 mod_time, uint64 length);
       
 40696 +
       
 40697 +
       
 40698 +  // Called when the line info reader has a new line, address pair
       
 40699 +  // ready for us.  ADDRESS is the address of the code, FILE_NUM is
       
 40700 +  // the file number containing the code, LINE_NUM is the line number
       
 40701 +  // in that file for the code, and COLUMN_NUM is the column number
       
 40702 +  // the code starts at, if we know it (0 otherwise).
       
 40703 +  virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num,
       
 40704 +                       uint32 column_num);
       
 40705 +
       
 40706 +
       
 40707 + private:
       
 40708 +  LineMap* linemap_;
       
 40709 +  vector<SourceFileInfo>* files_;
       
 40710 +  vector<string>* dirs_;
       
 40711 +};
       
 40712 +
       
 40713 +class CUFunctionInfoHandler: public Dwarf2Handler {
       
 40714 + public:
       
 40715 +  CUFunctionInfoHandler(vector<SourceFileInfo>* files,
       
 40716 +                        vector<string>* dirs,
       
 40717 +                        LineMap* linemap,
       
 40718 +                        FunctionMap* offset_to_funcinfo,
       
 40719 +                        FunctionMap* address_to_funcinfo,
       
 40720 +                        CULineInfoHandler* linehandler,
       
 40721 +                        const SectionMap& sections,
       
 40722 +                        ByteReader* reader)
       
 40723 +      : files_(files), dirs_(dirs), linemap_(linemap),
       
 40724 +        offset_to_funcinfo_(offset_to_funcinfo),
       
 40725 +        address_to_funcinfo_(address_to_funcinfo),
       
 40726 +        linehandler_(linehandler), sections_(sections),
       
 40727 +        reader_(reader), current_function_info_(NULL) { }
       
 40728 +
       
 40729 +  virtual ~CUFunctionInfoHandler() { }
       
 40730 +
       
 40731 +  // Start to process a compilation unit at OFFSET from the beginning of the
       
 40732 +  // .debug_info section.  We want to see all compilation units, so we
       
 40733 +  // always return true.
       
 40734 +
       
 40735 +  virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
       
 40736 +                                    uint8 offset_size, uint64 cu_length,
       
 40737 +                                    uint8 dwarf_version);
       
 40738 +
       
 40739 +  // Start to process a DIE at OFFSET from the beginning of the
       
 40740 +  // .debug_info section.  We only care about function related DIE's.
       
 40741 +  virtual bool StartDIE(uint64 offset, enum DwarfTag tag,
       
 40742 +                        const AttributeList& attrs);
       
 40743 +
       
 40744 +  // Called when we have an attribute with unsigned data to give to
       
 40745 +  // our handler.  The attribute is for the DIE at OFFSET from the
       
 40746 +  // beginning of the .debug_info section, has a name of ATTR, a form of
       
 40747 +  // FORM, and the actual data of the attribute is in DATA.
       
 40748 +  virtual void ProcessAttributeUnsigned(uint64 offset,
       
 40749 +                                        enum DwarfAttribute attr,
       
 40750 +                                        enum DwarfForm form,
       
 40751 +                                        uint64 data);
       
 40752 +
       
 40753 +  // Called when we have an attribute with string data to give to
       
 40754 +  // our handler.  The attribute is for the DIE at OFFSET from the
       
 40755 +  // beginning of the .debug_info section, has a name of ATTR, a form of
       
 40756 +  // FORM, and the actual data of the attribute is in DATA.
       
 40757 +  virtual void ProcessAttributeString(uint64 offset,
       
 40758 +                                      enum DwarfAttribute attr,
       
 40759 +                                      enum DwarfForm form,
       
 40760 +                                      const string& data);
       
 40761 +
       
 40762 +  // Called when finished processing the DIE at OFFSET.
       
 40763 +  // Because DWARF2/3 specifies a tree of DIEs, you may get starts
       
 40764 +  // before ends of the previous DIE, as we process children before
       
 40765 +  // ending the parent.
       
 40766 +  virtual void EndDIE(uint64 offset);
       
 40767 +
       
 40768 + private:
       
 40769 +  vector<SourceFileInfo>* files_;
       
 40770 +  vector<string>* dirs_;
       
 40771 +  LineMap* linemap_;
       
 40772 +  FunctionMap* offset_to_funcinfo_;
       
 40773 +  FunctionMap* address_to_funcinfo_;
       
 40774 +  CULineInfoHandler* linehandler_;
       
 40775 +  const SectionMap& sections_;
       
 40776 +  ByteReader* reader_;
       
 40777 +  FunctionInfo* current_function_info_;
       
 40778 +  uint64 current_compilation_unit_offset_;
       
 40779 +};
       
 40780 +
       
 40781 +}  // namespace dwarf2reader
       
 40782 +#endif  // COMMON_DWARF_FUNCTIONINFO_H__
       
 40783 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/line_state_machine.h b/toolkit/crashreporter/google-breakpad/src/common/dwarf/line_state_machine.h
       
 40784 new file mode 100644
       
 40785 --- /dev/null
       
 40786 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/line_state_machine.h
       
 40787 @@ -0,0 +1,61 @@
       
 40788 +// Copyright 2008 Google Inc. All Rights Reserved.
       
 40789 +//
       
 40790 +// Redistribution and use in source and binary forms, with or without
       
 40791 +// modification, are permitted provided that the following conditions are
       
 40792 +// met:
       
 40793 +//
       
 40794 +//     * Redistributions of source code must retain the above copyright
       
 40795 +// notice, this list of conditions and the following disclaimer.
       
 40796 +//     * Redistributions in binary form must reproduce the above
       
 40797 +// copyright notice, this list of conditions and the following disclaimer
       
 40798 +// in the documentation and/or other materials provided with the
       
 40799 +// distribution.
       
 40800 +//     * Neither the name of Google Inc. nor the names of its
       
 40801 +// contributors may be used to endorse or promote products derived from
       
 40802 +// this software without specific prior written permission.
       
 40803 +//
       
 40804 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 40805 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 40806 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 40807 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 40808 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 40809 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 40810 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 40811 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 40812 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 40813 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 40814 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 40815 +
       
 40816 +
       
 40817 +#ifndef COMMON_DWARF_LINE_STATE_MACHINE_H__
       
 40818 +#define COMMON_DWARF_LINE_STATE_MACHINE_H__
       
 40819 +
       
 40820 +namespace dwarf2reader {
       
 40821 +
       
 40822 +// This is the format of a DWARF2/3 line state machine that we process
       
 40823 +// opcodes using.  There is no need for anything outside the lineinfo
       
 40824 +// processor to know how this works.
       
 40825 +struct LineStateMachine {
       
 40826 +  void Reset(bool default_is_stmt) {
       
 40827 +    file_num = 1;
       
 40828 +    address = 0;
       
 40829 +    line_num = 1;
       
 40830 +    column_num = 0;
       
 40831 +    is_stmt = default_is_stmt;
       
 40832 +    basic_block = false;
       
 40833 +    end_sequence = false;
       
 40834 +  }
       
 40835 +
       
 40836 +  uint32 file_num;
       
 40837 +  uint64 address;
       
 40838 +  uint64 line_num;
       
 40839 +  uint32 column_num;
       
 40840 +  bool is_stmt;  // stmt means statement.
       
 40841 +  bool basic_block;
       
 40842 +  bool end_sequence;
       
 40843 +};
       
 40844 +
       
 40845 +}  // namespace dwarf2reader
       
 40846 +
       
 40847 +
       
 40848 +#endif  // COMMON_DWARF_LINE_STATE_MACHINE_H__
       
 40849 diff --git a/toolkit/crashreporter/google-breakpad/src/common/dwarf/types.h b/toolkit/crashreporter/google-breakpad/src/common/dwarf/types.h
       
 40850 new file mode 100644
       
 40851 --- /dev/null
       
 40852 +++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf/types.h
       
 40853 @@ -0,0 +1,53 @@
       
 40854 +// Copyright 2008 Google, Inc.  All Rights reserved
       
 40855 +//
       
 40856 +// Redistribution and use in source and binary forms, with or without
       
 40857 +// modification, are permitted provided that the following conditions are
       
 40858 +// met:
       
 40859 +//
       
 40860 +//     * Redistributions of source code must retain the above copyright
       
 40861 +// notice, this list of conditions and the following disclaimer.
       
 40862 +//     * Redistributions in binary form must reproduce the above
       
 40863 +// copyright notice, this list of conditions and the following disclaimer
       
 40864 +// in the documentation and/or other materials provided with the
       
 40865 +// distribution.
       
 40866 +//     * Neither the name of Google Inc. nor the names of its
       
 40867 +// contributors may be used to endorse or promote products derived from
       
 40868 +// this software without specific prior written permission.
       
 40869 +//
       
 40870 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 40871 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 40872 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 40873 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 40874 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 40875 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 40876 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 40877 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 40878 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 40879 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 40880 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 40881 +
       
 40882 +
       
 40883 +// This file contains some typedefs for basic types
       
 40884 +
       
 40885 +
       
 40886 +#ifndef _COMMON_DWARF_TYPES_H__
       
 40887 +#define _COMMON_DWARF_TYPES_H__
       
 40888 +
       
 40889 +typedef signed char         int8;
       
 40890 +typedef short               int16;
       
 40891 +typedef int                 int32;
       
 40892 +typedef long long           int64;
       
 40893 +
       
 40894 +typedef unsigned char      uint8;
       
 40895 +typedef unsigned short     uint16;
       
 40896 +typedef unsigned int       uint32;
       
 40897 +typedef unsigned long long uint64;
       
 40898 +
       
 40899 +#ifdef __PTRDIFF_TYPE__
       
 40900 +typedef          __PTRDIFF_TYPE__ intptr;
       
 40901 +typedef unsigned __PTRDIFF_TYPE__ uintptr;
       
 40902 +#else
       
 40903 +#error "Can't find pointer-sized integral types."
       
 40904 +#endif
       
 40905 +
       
 40906 +#endif // _COMMON_DWARF_TYPES_H__
       
 40907 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/Makefile.in b/toolkit/crashreporter/google-breakpad/src/common/linux/Makefile.in
       
 40908 --- a/toolkit/crashreporter/google-breakpad/src/common/linux/Makefile.in
       
 40909 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/Makefile.in
       
 40910 @@ -42,27 +42,27 @@ VPATH		= @srcdir@
       
 40911  include $(DEPTH)/config/autoconf.mk
       
 40912  
       
 40913  MODULE		= breakpad_linux_common
       
 40914  LIBRARY_NAME	= breakpad_linux_common_s
       
 40915  HOST_LIBRARY_NAME = host_breakpad_linux_common_s
       
 40916  
       
 40917  LOCAL_INCLUDES 	= -I$(srcdir)/../..
       
 40918  
       
 40919 -# not compiling http_upload.cc currently
       
 40920 -# since it depends on libcurl
       
 40921  CPPSRCS	= \
       
 40922 -  dump_symbols.cc \
       
 40923    file_id.cc \
       
 40924    guid_creator.cc \
       
 40925 +  http_upload.cc \
       
 40926    $(NULL)
       
 40927  
       
 40928  HOST_CPPSRCS = \
       
 40929    dump_symbols.cc \
       
 40930    file_id.cc \
       
 40931    guid_creator.cc \
       
 40932 +  module.cc \
       
 40933 +  stabs_reader.cc \
       
 40934    $(NULL)
       
 40935  
       
 40936  # need static lib
       
 40937  FORCE_STATIC_LIB = 1
       
 40938  FORCE_USE_PIC = 1
       
 40939  
       
 40940  include $(topsrcdir)/config/rules.mk
       
 40941 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
       
 40942 --- a/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
       
 40943 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
       
 40944 @@ -22,136 +22,70 @@
       
 40945  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 40946  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 40947  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 40948  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 40949  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 40950  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 40951  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 40952  
       
 40953 -#include <a.out.h>
       
 40954 -#include <cstdarg>
       
 40955 -#include <cstdlib>
       
 40956 +#include <assert.h>
       
 40957  #include <cxxabi.h>
       
 40958 -#include <stdio.h>
       
 40959  #include <elf.h>
       
 40960  #include <errno.h>
       
 40961  #include <fcntl.h>
       
 40962  #include <link.h>
       
 40963 +#include <string.h>
       
 40964  #include <sys/mman.h>
       
 40965 -#include <stab.h>
       
 40966  #include <sys/stat.h>
       
 40967  #include <sys/types.h>
       
 40968  #include <unistd.h>
       
 40969 +
       
 40970  #include <algorithm>
       
 40971 -
       
 40972 +#include <cstdarg>
       
 40973 +#include <cstdio>
       
 40974 +#include <cstdlib>
       
 40975 +#include <cstring>
       
 40976  #include <functional>
       
 40977  #include <list>
       
 40978 +#include <map>
       
 40979 +#include <string>
       
 40980  #include <vector>
       
 40981 -#include <string.h>
       
 40982  
       
 40983  #include "common/linux/dump_symbols.h"
       
 40984  #include "common/linux/file_id.h"
       
 40985 -#include "common/linux/guid_creator.h"
       
 40986 -#include "processor/scoped_ptr.h"
       
 40987 +#include "common/linux/module.h"
       
 40988 +#include "common/linux/stabs_reader.h"
       
 40989  
       
 40990  // This namespace contains helper functions.
       
 40991  namespace {
       
 40992  
       
 40993 -// Infomation of a line.
       
 40994 -struct LineInfo {
       
 40995 -  // The index into string table for the name of the source file which
       
 40996 -  // this line belongs to.
       
 40997 -  // Load from stab symbol.
       
 40998 -  uint32_t source_name_index;
       
 40999 -  // Offset from start of the function.
       
 41000 -  // Load from stab symbol.
       
 41001 -  ElfW(Off) rva_to_func;
       
 41002 -  // Offset from base of the loading binary.
       
 41003 -  ElfW(Off) rva_to_base;
       
 41004 -  // Size of the line.
       
 41005 -  // It is the difference of the starting address of the line and starting
       
 41006 -  // address of the next N_SLINE, N_FUN or N_SO.
       
 41007 -  uint32_t size;
       
 41008 -  // Line number.
       
 41009 -  uint32_t line_num;
       
 41010 -  // Id of the source file for this line.
       
 41011 -  int source_id;
       
 41012 -};
       
 41013 -
       
 41014 -typedef std::list<struct LineInfo> LineInfoList;
       
 41015 -
       
 41016 -// Information of a function.
       
 41017 -struct FuncInfo {
       
 41018 -  // Name of the function.
       
 41019 -  const char *name;
       
 41020 -  // Offset from the base of the loading address.
       
 41021 -  ElfW(Off) rva_to_base;
       
 41022 -  // Virtual address of the function.
       
 41023 -  // Load from stab symbol.
       
 41024 -  ElfW(Addr) addr;
       
 41025 -  // Size of the function.
       
 41026 -  // It is the difference of the starting address of the function and starting
       
 41027 -  // address of the next N_FUN or N_SO.
       
 41028 -  uint32_t size;
       
 41029 -  // Total size of stack parameters.
       
 41030 -  uint32_t stack_param_size;
       
 41031 -  // Is there any lines included from other files?
       
 41032 -  bool has_sol;
       
 41033 -  // Line information array.
       
 41034 -  LineInfoList line_info;
       
 41035 -};
       
 41036 -
       
 41037 -typedef std::list<struct FuncInfo> FuncInfoList;
       
 41038 -
       
 41039 -// Information of a source file.
       
 41040 -struct SourceFileInfo {
       
 41041 -  // Name string index into the string table.
       
 41042 -  uint32_t name_index;
       
 41043 -  // Name of the source file.
       
 41044 -  const char *name;
       
 41045 -  // Starting address of the source file.
       
 41046 -  ElfW(Addr) addr;
       
 41047 -  // Id of the source file.
       
 41048 -  int source_id;
       
 41049 -  // Functions information.
       
 41050 -  FuncInfoList func_info;
       
 41051 -};
       
 41052 -
       
 41053 -typedef std::list<struct SourceFileInfo> SourceFileInfoList;
       
 41054 -
       
 41055 -// Information of a symbol table.
       
 41056 -// This is the root of all types of symbol.
       
 41057 -struct SymbolInfo {
       
 41058 -  SourceFileInfoList source_file_info;
       
 41059 -
       
 41060 -  // The next source id for newly found source file.
       
 41061 -  int next_source_id;
       
 41062 -};
       
 41063 +using google_breakpad::Module;
       
 41064 +using std::vector;
       
 41065  
       
 41066  // Stab section name.
       
 41067  static const char *kStabName = ".stab";
       
 41068  
       
 41069  // Demangle using abi call.
       
 41070  // Older GCC may not support it.
       
 41071 -static std::string Demangle(const char *mangled) {
       
 41072 +static std::string Demangle(const std::string &mangled) {
       
 41073    int status = 0;
       
 41074 -  char *demangled = abi::__cxa_demangle(mangled, NULL, NULL, &status);
       
 41075 +  char *demangled = abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status);
       
 41076    if (status == 0 && demangled != NULL) {
       
 41077      std::string str(demangled);
       
 41078      free(demangled);
       
 41079      return str;
       
 41080    }
       
 41081    return std::string(mangled);
       
 41082  }
       
 41083  
       
 41084  // Fix offset into virtual address by adding the mapped base into offsets.
       
 41085  // Make life easier when want to find something by offset.
       
 41086  static void FixAddress(void *obj_base) {
       
 41087 -  ElfW(Word) base = reinterpret_cast<ElfW(Word)>(obj_base);
       
 41088 +  ElfW(Addr) base = reinterpret_cast<ElfW(Addr)>(obj_base);
       
 41089    ElfW(Ehdr) *elf_header = static_cast<ElfW(Ehdr) *>(obj_base);
       
 41090    elf_header->e_phoff += base;
       
 41091    elf_header->e_shoff += base;
       
 41092    ElfW(Shdr) *sections = reinterpret_cast<ElfW(Shdr) *>(elf_header->e_shoff);
       
 41093    for (int i = 0; i < elf_header->e_shnum; ++i)
       
 41094      sections[i].sh_offset += base;
       
 41095  }
       
 41096  
       
 41097 @@ -164,28 +98,16 @@ static ElfW(Addr) GetLoadingAddress(cons
       
 41098      if (header.p_type == PT_LOAD &&
       
 41099          header.p_offset == 0)
       
 41100        return header.p_vaddr;
       
 41101    }
       
 41102    // For other types of ELF, return 0.
       
 41103    return 0;
       
 41104  }
       
 41105  
       
 41106 -static bool WriteFormat(int fd, const char *fmt, ...) {
       
 41107 -  va_list list;
       
 41108 -  char buffer[4096];
       
 41109 -  ssize_t expected, written;
       
 41110 -  va_start(list, fmt);
       
 41111 -  vsnprintf(buffer, sizeof(buffer), fmt, list);
       
 41112 -  expected = strlen(buffer);
       
 41113 -  written = write(fd, buffer, strlen(buffer));
       
 41114 -  va_end(list);
       
 41115 -  return expected == written;
       
 41116 -}
       
 41117 -
       
 41118  static bool IsValidElf(const ElfW(Ehdr) *elf_header) {
       
 41119    return memcmp(elf_header, ELFMAG, SELFMAG) == 0;
       
 41120  }
       
 41121  
       
 41122  static const ElfW(Shdr) *FindSectionByName(const char *name,
       
 41123                                             const ElfW(Shdr) *sections,
       
 41124                                             const ElfW(Shdr) *strtab,
       
 41125                                             int nsection) {
       
 41126 @@ -194,508 +116,251 @@ static const ElfW(Shdr) *FindSectionByNa
       
 41127    assert(nsection > 0);
       
 41128  
       
 41129    int name_len = strlen(name);
       
 41130    if (name_len == 0)
       
 41131      return NULL;
       
 41132  
       
 41133    for (int i = 0; i < nsection; ++i) {
       
 41134      const char *section_name =
       
 41135 -      (char*)(strtab->sh_offset + sections[i].sh_name);
       
 41136 +      reinterpret_cast<char*>(strtab->sh_offset + sections[i].sh_name);
       
 41137      if (!strncmp(name, section_name, name_len))
       
 41138        return sections + i;
       
 41139    }
       
 41140    return NULL;
       
 41141  }
       
 41142  
       
 41143 -// TODO(liuli): Computer the stack parameter size.
       
 41144 -// Expect parameter variables are immediately following the N_FUN symbol.
       
 41145 -// Will need to parse the type information to get a correct size.
       
 41146 -static int LoadStackParamSize(struct nlist *list,
       
 41147 -                              struct nlist *list_end,
       
 41148 -                              struct FuncInfo *func_info) {
       
 41149 -  struct nlist *cur_list = list;
       
 41150 -  assert(cur_list->n_type == N_FUN);
       
 41151 -  ++cur_list;
       
 41152 -  int step = 1;
       
 41153 -  while (cur_list < list_end && cur_list->n_type == N_PSYM) {
       
 41154 -    ++cur_list;
       
 41155 -    ++step;
       
 41156 -  }
       
 41157 -  func_info->stack_param_size = 0;
       
 41158 -  return step;
       
 41159 +// Our handler class for STABS data.
       
 41160 +class DumpStabsHandler: public google_breakpad::StabsHandler {
       
 41161 + public:
       
 41162 +  DumpStabsHandler(Module *module) :
       
 41163 +      module_(module),
       
 41164 +      comp_unit_base_address_(0),
       
 41165 +      current_function_(NULL),
       
 41166 +      current_source_file_(NULL),
       
 41167 +      current_source_file_name_(NULL) { }
       
 41168 +
       
 41169 +  bool StartCompilationUnit(const char *name, uint64_t address,
       
 41170 +                            const char *build_directory);
       
 41171 +  bool EndCompilationUnit(uint64_t address);
       
 41172 +  bool StartFunction(const std::string &name, uint64_t address);
       
 41173 +  bool EndFunction(uint64_t address);
       
 41174 +  bool Line(uint64_t address, const char *name, int number);
       
 41175 +  void Warning(const char *format, ...);
       
 41176 +
       
 41177 +  // Do any final processing necessary to make module_ contain all the
       
 41178 +  // data provided by the STABS reader.
       
 41179 +  //
       
 41180 +  // Because STABS does not provide reliable size information for
       
 41181 +  // functions and lines, we need to make a pass over the data after
       
 41182 +  // processing all the STABS to compute those sizes.  We take care of
       
 41183 +  // that here.
       
 41184 +  void Finalize();
       
 41185 +
       
 41186 + private:
       
 41187 +
       
 41188 +  // An arbitrary, but very large, size to use for functions whose
       
 41189 +  // size we can't compute properly.
       
 41190 +  static const uint64_t kFallbackSize = 0x10000000;
       
 41191 +
       
 41192 +  // The module we're contributing debugging info to.
       
 41193 +  Module *module_;
       
 41194 +
       
 41195 +  // The functions we've generated so far.  We don't add these to
       
 41196 +  // module_ as we parse them.  Instead, we wait until we've computed
       
 41197 +  // their ending address, and their lines' ending addresses.
       
 41198 +  //
       
 41199 +  // We could just stick them in module_ from the outset, but if
       
 41200 +  // module_ already contains data gathered from other debugging
       
 41201 +  // formats, that would complicate the size computation.
       
 41202 +  vector<Module::Function *> functions_;
       
 41203 +
       
 41204 +  // Boundary addresses.  STABS doesn't necessarily supply sizes for
       
 41205 +  // functions and lines, so we need to compute them ourselves by
       
 41206 +  // finding the next object.
       
 41207 +  vector<Module::Address> boundaries_;
       
 41208 +
       
 41209 +  // The base address of the current compilation unit.  We use this to
       
 41210 +  // recognize functions we should omit from the symbol file.  (If you
       
 41211 +  // know the details of why we omit these, please patch this
       
 41212 +  // comment.)
       
 41213 +  Module::Address comp_unit_base_address_;
       
 41214 +
       
 41215 +  // The function we're currently contributing lines to.
       
 41216 +  Module::Function *current_function_;
       
 41217 +
       
 41218 +  // The last Module::File we got a line number in.
       
 41219 +  Module::File *current_source_file_;
       
 41220 +
       
 41221 +  // The pointer in the .stabstr section of the name that
       
 41222 +  // current_source_file_ is built from.  This allows us to quickly
       
 41223 +  // recognize when the current line is in the same file as the
       
 41224 +  // previous one (which it usually is).
       
 41225 +  const char *current_source_file_name_;
       
 41226 +};
       
 41227 +    
       
 41228 +bool DumpStabsHandler::StartCompilationUnit(const char *name, uint64_t address,
       
 41229 +                                            const char *build_directory) {
       
 41230 +  assert(! comp_unit_base_address_);
       
 41231 +  current_source_file_name_ = name;
       
 41232 +  current_source_file_ = module_->FindFile(name);
       
 41233 +  comp_unit_base_address_ = address;
       
 41234 +  boundaries_.push_back(static_cast<Module::Address>(address));
       
 41235 +  return true;
       
 41236  }
       
 41237  
       
 41238 -static int LoadLineInfo(struct nlist *list,
       
 41239 -                        struct nlist *list_end,
       
 41240 -                        const struct SourceFileInfo &source_file_info,
       
 41241 -                        struct FuncInfo *func_info) {
       
 41242 -  struct nlist *cur_list = list;
       
 41243 -  func_info->has_sol = false;
       
 41244 -  // Records which source file the following lines belongs. Default
       
 41245 -  // to the file we are handling. This helps us handling inlined source.
       
 41246 -  // When encountering N_SOL, we will change this to the source file
       
 41247 -  // specified by N_SOL.
       
 41248 -  int current_source_name_index = source_file_info.name_index;
       
 41249 -  do {
       
 41250 -    // Skip non line information.
       
 41251 -    while (cur_list < list_end && cur_list->n_type != N_SLINE) {
       
 41252 -      // Only exit when got another function, or source file.
       
 41253 -      if (cur_list->n_type == N_FUN || cur_list->n_type == N_SO)
       
 41254 -        return cur_list - list;
       
 41255 -      // N_SOL means source lines following it will be from
       
 41256 -      // another source file.
       
 41257 -      if (cur_list->n_type == N_SOL) {
       
 41258 -        func_info->has_sol = true;
       
 41259 -
       
 41260 -        if (cur_list->n_un.n_strx > 0 &&
       
 41261 -            cur_list->n_un.n_strx != current_source_name_index) {
       
 41262 -          // The following lines will be from this source file.
       
 41263 -          current_source_name_index = cur_list->n_un.n_strx;
       
 41264 -        }
       
 41265 -      }
       
 41266 -      ++cur_list;
       
 41267 -    }
       
 41268 -    struct LineInfo line;
       
 41269 -    while (cur_list < list_end && cur_list->n_type == N_SLINE) {
       
 41270 -      line.source_name_index = current_source_name_index;
       
 41271 -      line.rva_to_func = cur_list->n_value;
       
 41272 -      // n_desc is a signed short
       
 41273 -      line.line_num = (unsigned short)cur_list->n_desc;
       
 41274 -      // Don't set it here.
       
 41275 -      // Will be processed in later pass.
       
 41276 -      line.source_id = -1;
       
 41277 -      func_info->line_info.push_back(line);
       
 41278 -      ++cur_list;
       
 41279 -    }
       
 41280 -  } while (list < list_end);
       
 41281 -
       
 41282 -  return cur_list - list;
       
 41283 +bool DumpStabsHandler::EndCompilationUnit(uint64_t address) {
       
 41284 +  assert(comp_unit_base_address_);
       
 41285 +  comp_unit_base_address_ = 0;
       
 41286 +  current_source_file_ = NULL;
       
 41287 +  current_source_file_name_ = NULL;
       
 41288 +  if (address)
       
 41289 +    boundaries_.push_back(static_cast<Module::Address>(address));
       
 41290 +  return true;
       
 41291  }
       
 41292  
       
 41293 -static int LoadFuncSymbols(struct nlist *list,
       
 41294 -                           struct nlist *list_end,
       
 41295 -                           const ElfW(Shdr) *stabstr_section,
       
 41296 -                           struct SourceFileInfo *source_file_info) {
       
 41297 -  struct nlist *cur_list = list;
       
 41298 -  assert(cur_list->n_type == N_SO);
       
 41299 -  ++cur_list;
       
 41300 -  source_file_info->func_info.clear();
       
 41301 -  while (cur_list < list_end) {
       
 41302 -    // Go until the function symbol.
       
 41303 -    while (cur_list < list_end && cur_list->n_type != N_FUN) {
       
 41304 -      if (cur_list->n_type == N_SO) {
       
 41305 -        return cur_list - list;
       
 41306 -      }
       
 41307 -      ++cur_list;
       
 41308 -      continue;
       
 41309 -    }
       
 41310 -    if (cur_list->n_type == N_FUN) {
       
 41311 -      struct FuncInfo func_info;
       
 41312 -      func_info.name =
       
 41313 -        reinterpret_cast<char *>(cur_list->n_un.n_strx +
       
 41314 -                                 stabstr_section->sh_offset);
       
 41315 -      func_info.addr = cur_list->n_value;
       
 41316 -      func_info.rva_to_base = 0;
       
 41317 -      func_info.size = 0;
       
 41318 -      func_info.stack_param_size = 0;
       
 41319 -      func_info.has_sol = 0;
       
 41320 +bool DumpStabsHandler::StartFunction(const std::string &name,
       
 41321 +                                     uint64_t address) {
       
 41322 +  assert(! current_function_);
       
 41323 +  Module::Function *f = new Module::Function;
       
 41324 +  f->name_ = Demangle(name);
       
 41325 +  f->address_ = address;
       
 41326 +  f->size_ = 0;           // We compute this in DumpStabsHandler::Finalize().
       
 41327 +  f->parameter_size_ = 0; // We don't provide this information.
       
 41328 +  current_function_ = f;
       
 41329 +  boundaries_.push_back(static_cast<Module::Address>(address));
       
 41330 +  return true;
       
 41331 +}
       
 41332  
       
 41333 -      // Stack parameter size.
       
 41334 -      cur_list += LoadStackParamSize(cur_list, list_end, &func_info);
       
 41335 -      // Line info.
       
 41336 -      cur_list += LoadLineInfo(cur_list,
       
 41337 -                               list_end,
       
 41338 -                               *source_file_info,
       
 41339 -                               &func_info);
       
 41340 +bool DumpStabsHandler::EndFunction(uint64_t address) {
       
 41341 +  assert(current_function_);
       
 41342 +  // Functions in this compilation unit should have address bigger
       
 41343 +  // than the compilation unit's starting address.  There may be a lot
       
 41344 +  // of duplicated entries for functions in the STABS data; only one
       
 41345 +  // entry can meet this requirement.
       
 41346 +  //
       
 41347 +  // (I don't really understand the above comment; just bringing it
       
 41348 +  // along from the previous code, and leaving the behaivor unchanged.
       
 41349 +  // If you know the whole story, please patch this comment.  --jimb)
       
 41350 +  if (current_function_->address_ >= comp_unit_base_address_)
       
 41351 +    functions_.push_back(current_function_);
       
 41352 +  else
       
 41353 +    delete current_function_;
       
 41354 +  current_function_ = NULL;
       
 41355 +  if (address)
       
 41356 +    boundaries_.push_back(static_cast<Module::Address>(address));
       
 41357 +  return true;
       
 41358 +}
       
 41359  
       
 41360 -      // Functions in this module should have address bigger than the module
       
 41361 -      // startring address.
       
 41362 -      // There maybe a lot of duplicated entry for a function in the symbol,
       
 41363 -      // only one of them can met this.
       
 41364 -      if (func_info.addr >= source_file_info->addr) {
       
 41365 -        source_file_info->func_info.push_back(func_info);
       
 41366 -      }
       
 41367 +bool DumpStabsHandler::Line(uint64_t address, const char *name, int number) {
       
 41368 +  assert(current_function_);
       
 41369 +  assert(current_source_file_);
       
 41370 +  if (name != current_source_file_name_) {
       
 41371 +    current_source_file_ = module_->FindFile(name);
       
 41372 +    current_source_file_name_ = name;
       
 41373 +  }
       
 41374 +  Module::Line line;
       
 41375 +  line.address_ = address;
       
 41376 +  line.size_ = 0;  // We compute this in DumpStabsHandler::Finalize().
       
 41377 +  line.file_ = current_source_file_;
       
 41378 +  line.number_ = number;
       
 41379 +  current_function_->lines_.push_back(line);
       
 41380 +  return true;
       
 41381 +}
       
 41382 +
       
 41383 +void DumpStabsHandler::Warning(const char *format, ...) {
       
 41384 +  va_list args;
       
 41385 +  va_start(args, format);
       
 41386 +  vfprintf(stderr, format, args);
       
 41387 +  va_end(args);
       
 41388 +}
       
 41389 +
       
 41390 +void DumpStabsHandler::Finalize() {
       
 41391 +  // Sort our boundary list, so we can search it quickly.
       
 41392 +  sort(boundaries_.begin(), boundaries_.end());
       
 41393 +  // Sort all functions by address, just for neatness.
       
 41394 +  sort(functions_.begin(), functions_.end(),
       
 41395 +       Module::Function::CompareByAddress);
       
 41396 +  for (vector<Module::Function *>::iterator func_it = functions_.begin();
       
 41397 +       func_it != functions_.end();
       
 41398 +       func_it++) {
       
 41399 +    Module::Function *f = *func_it;
       
 41400 +    // Compute the function f's size.
       
 41401 +    vector<Module::Address>::iterator boundary
       
 41402 +        = std::upper_bound(boundaries_.begin(), boundaries_.end(), f->address_);
       
 41403 +    if (boundary != boundaries_.end())
       
 41404 +      f->size_ = *boundary - f->address_;
       
 41405 +    else
       
 41406 +      // If this is the last function in the module, and the STABS
       
 41407 +      // reader was unable to give us its ending address, then assign
       
 41408 +      // it a bogus, very large value.  This will happen at most once
       
 41409 +      // per module: since we've added all functions' addresses to the
       
 41410 +      // boundary table, only one can be the last.
       
 41411 +      f->size_ = kFallbackSize;
       
 41412 +
       
 41413 +    // Compute sizes for each of the function f's lines --- if it has any.
       
 41414 +    if (! f->lines_.empty()) {
       
 41415 +      stable_sort(f->lines_.begin(), f->lines_.end(),
       
 41416 +                  Module::Line::CompareByAddress);
       
 41417 +      vector<Module::Line>::iterator last_line = f->lines_.end() - 1;
       
 41418 +      for (vector<Module::Line>::iterator line_it = f->lines_.begin();
       
 41419 +           line_it != last_line; line_it++)
       
 41420 +        line_it[0].size_ = line_it[1].address_ - line_it[0].address_;
       
 41421 +      // Compute the size of the last line from f's end address.
       
 41422 +      last_line->size_ = (f->address_ + f->size_) - last_line->address_;
       
 41423      }
       
 41424    }
       
 41425 -  return cur_list - list;
       
 41426 -}
       
 41427 -
       
 41428 -// Comapre the address.
       
 41429 -// The argument should have a memeber named "addr"
       
 41430 -template<class T1, class T2>
       
 41431 -static bool CompareAddress(T1 *a, T2 *b) {
       
 41432 -  return a->addr < b->addr;
       
 41433 -}
       
 41434 -
       
 41435 -// Sort the array into increasing ordered array based on the virtual address.
       
 41436 -// Return vector of pointers to the elements in the incoming array. So caller
       
 41437 -// should make sure the returned vector lives longer than the incoming vector.
       
 41438 -template<class Container>
       
 41439 -static std::vector<typename Container::value_type *> SortByAddress(
       
 41440 -    Container *container) {
       
 41441 -  typedef typename Container::iterator It;
       
 41442 -  typedef typename Container::value_type T;
       
 41443 -  std::vector<T *> sorted_array_ptr;
       
 41444 -  sorted_array_ptr.reserve(container->size());
       
 41445 -  for (It it = container->begin(); it != container->end(); it++)
       
 41446 -    sorted_array_ptr.push_back(&(*it));
       
 41447 -  std::sort(sorted_array_ptr.begin(),
       
 41448 -            sorted_array_ptr.end(),
       
 41449 -            std::ptr_fun(CompareAddress<T, T>));
       
 41450 -
       
 41451 -  return sorted_array_ptr;
       
 41452 -}
       
 41453 -
       
 41454 -// Find the address of the next function or source file symbol in the symbol
       
 41455 -// table. The address should be bigger than the current function's address.
       
 41456 -static ElfW(Addr) NextAddress(
       
 41457 -    std::vector<struct FuncInfo *> *sorted_functions,
       
 41458 -    std::vector<struct SourceFileInfo *> *sorted_files,
       
 41459 -    const struct FuncInfo &func_info) {
       
 41460 -  std::vector<struct FuncInfo *>::iterator next_func_iter =
       
 41461 -    std::find_if(sorted_functions->begin(),
       
 41462 -                 sorted_functions->end(),
       
 41463 -                 std::bind1st(
       
 41464 -                     std::ptr_fun(
       
 41465 -                         CompareAddress<struct FuncInfo,
       
 41466 -                                        struct FuncInfo>
       
 41467 -                         ),
       
 41468 -                     &func_info)
       
 41469 -                );
       
 41470 -  if (next_func_iter != sorted_functions->end())
       
 41471 -    return (*next_func_iter)->addr;
       
 41472 -
       
 41473 -  std::vector<struct SourceFileInfo *>::iterator next_file_iter =
       
 41474 -    std::find_if(sorted_files->begin(),
       
 41475 -                 sorted_files->end(),
       
 41476 -                 std::bind1st(
       
 41477 -                     std::ptr_fun(
       
 41478 -                         CompareAddress<struct FuncInfo,
       
 41479 -                                        struct SourceFileInfo>
       
 41480 -                         ),
       
 41481 -                     &func_info)
       
 41482 -                );
       
 41483 -  if (next_file_iter != sorted_files->end()) {
       
 41484 -    return (*next_file_iter)->addr;
       
 41485 -  }
       
 41486 -  return 0;
       
 41487 -}
       
 41488 -
       
 41489 -static int FindFileByNameIdx(uint32_t name_index,
       
 41490 -                             SourceFileInfoList &files) {
       
 41491 -  for (SourceFileInfoList::iterator it = files.begin();
       
 41492 -       it != files.end(); it++) {
       
 41493 -    if (it->name_index == name_index)
       
 41494 -      return it->source_id;
       
 41495 -  }
       
 41496 -
       
 41497 -  return -1;
       
 41498 -}
       
 41499 -
       
 41500 -// Add included file information.
       
 41501 -// Also fix the source id for the line info.
       
 41502 -static void AddIncludedFiles(struct SymbolInfo *symbols,
       
 41503 -                             const ElfW(Shdr) *stabstr_section) {
       
 41504 -  for (SourceFileInfoList::iterator source_file_it =
       
 41505 -	 symbols->source_file_info.begin();
       
 41506 -       source_file_it != symbols->source_file_info.end();
       
 41507 -       ++source_file_it) {
       
 41508 -    struct SourceFileInfo &source_file = *source_file_it;
       
 41509 -
       
 41510 -    for (FuncInfoList::iterator func_info_it = source_file.func_info.begin(); 
       
 41511 -	 func_info_it != source_file.func_info.end();
       
 41512 -	 ++func_info_it) {
       
 41513 -      struct FuncInfo &func_info = *func_info_it;
       
 41514 -
       
 41515 -      for (LineInfoList::iterator line_info_it = func_info.line_info.begin(); 
       
 41516 -	   line_info_it != func_info.line_info.end(); ++line_info_it) {
       
 41517 -        struct LineInfo &line_info = *line_info_it;
       
 41518 -
       
 41519 -        assert(line_info.source_name_index > 0);
       
 41520 -        assert(source_file.name_index > 0);
       
 41521 -
       
 41522 -        // Check if the line belongs to the source file by comparing the
       
 41523 -        // name index into string table.
       
 41524 -        if (line_info.source_name_index != source_file.name_index) {
       
 41525 -          // This line is not from the current source file, check if this
       
 41526 -          // source file has been added before.
       
 41527 -          int found_source_id = FindFileByNameIdx(line_info.source_name_index,
       
 41528 -                                                  symbols->source_file_info);
       
 41529 -          if (found_source_id < 0) {
       
 41530 -            // Got a new included file.
       
 41531 -            // Those included files don't have address or line information.
       
 41532 -            SourceFileInfo new_file;
       
 41533 -            new_file.name_index = line_info.source_name_index;
       
 41534 -            new_file.name = reinterpret_cast<char *>(new_file.name_index +
       
 41535 -                                                     stabstr_section->sh_offset);
       
 41536 -            new_file.addr = 0;
       
 41537 -            new_file.source_id = symbols->next_source_id++;
       
 41538 -            line_info.source_id = new_file.source_id;
       
 41539 -            symbols->source_file_info.push_back(new_file);
       
 41540 -          } else {
       
 41541 -            // The file has been added.
       
 41542 -            line_info.source_id = found_source_id;
       
 41543 -          }
       
 41544 -        } else {
       
 41545 -          // The line belongs to the file.
       
 41546 -          line_info.source_id = source_file.source_id;
       
 41547 -        }
       
 41548 -      }  // for each line.
       
 41549 -    }  // for each function.
       
 41550 -  } // for each source file.
       
 41551 -
       
 41552 -}
       
 41553 -
       
 41554 -// Compute size and rva information based on symbols loaded from stab section.
       
 41555 -static bool ComputeSizeAndRVA(ElfW(Addr) loading_addr,
       
 41556 -                              struct SymbolInfo *symbols) {
       
 41557 -  std::vector<struct SourceFileInfo *> sorted_files =
       
 41558 -    SortByAddress(&(symbols->source_file_info));
       
 41559 -  for (size_t i = 0; i < sorted_files.size(); ++i) {
       
 41560 -    struct SourceFileInfo &source_file = *sorted_files[i];
       
 41561 -    std::vector<struct FuncInfo *> sorted_functions =
       
 41562 -      SortByAddress(&(source_file.func_info));
       
 41563 -    for (size_t j = 0; j < sorted_functions.size(); ++j) {
       
 41564 -      struct FuncInfo &func_info = *sorted_functions[j];
       
 41565 -      assert(func_info.addr >= loading_addr);
       
 41566 -      func_info.rva_to_base = func_info.addr - loading_addr;
       
 41567 -      func_info.size = 0;
       
 41568 -      ElfW(Addr) next_addr = NextAddress(&sorted_functions,
       
 41569 -                                         &sorted_files,
       
 41570 -                                         func_info);
       
 41571 -      // I've noticed functions with an address bigger than any other functions
       
 41572 -      // and source files modules, this is probably the last function in the
       
 41573 -      // module, due to limitions of Linux stab symbol, it is impossible to get
       
 41574 -      // the exact size of this kind of function, thus we give it a default
       
 41575 -      // very big value. This should be safe since this is the last function.
       
 41576 -      // But it is a ugly hack.....
       
 41577 -      // The following code can reproduce the case:
       
 41578 -      // template<class T>
       
 41579 -      // void Foo(T value) {
       
 41580 -      // }
       
 41581 -      //
       
 41582 -      // int main(void) {
       
 41583 -      //   Foo(10);
       
 41584 -      //   Foo(std::string("hello"));
       
 41585 -      //   return 0;
       
 41586 -      // }
       
 41587 -      // TODO(liuli): Find a better solution.
       
 41588 -      static const int kDefaultSize = 0x10000000;
       
 41589 -      static int no_next_addr_count = 0;
       
 41590 -      if (next_addr != 0) {
       
 41591 -        func_info.size = next_addr - func_info.addr;
       
 41592 -      } else {
       
 41593 -        if (no_next_addr_count > 1) {
       
 41594 -          fprintf(stderr, "Got more than one funtion without the \
       
 41595 -                  following symbol. Igore this function.\n");
       
 41596 -          fprintf(stderr, "The dumped symbol may not correct.\n");
       
 41597 -          assert(!"This should not happen!\n");
       
 41598 -          func_info.size = 0;
       
 41599 -          continue;
       
 41600 -        }
       
 41601 -
       
 41602 -        no_next_addr_count++;
       
 41603 -        func_info.size = kDefaultSize;
       
 41604 -      }
       
 41605 -      // Compute line size.
       
 41606 -      for (LineInfoList::iterator line_info_it = func_info.line_info.begin(); 
       
 41607 -	   line_info_it != func_info.line_info.end(); line_info_it++) {
       
 41608 -        struct LineInfo &line_info = *line_info_it;
       
 41609 -	LineInfoList::iterator next_line_info_it = line_info_it;
       
 41610 -	next_line_info_it++;
       
 41611 -        line_info.size = 0;
       
 41612 -        if (next_line_info_it != func_info.line_info.end()) {
       
 41613 -          line_info.size =
       
 41614 -            next_line_info_it->rva_to_func - line_info.rva_to_func;
       
 41615 -        } else {
       
 41616 -          // The last line in the function.
       
 41617 -          // If we can find a function or source file symbol immediately
       
 41618 -          // following the line, we can get the size of the line by computing
       
 41619 -          // the difference of the next address to the starting address of this
       
 41620 -          // line.
       
 41621 -          // Otherwise, we need to set a default big enough value. This occurs
       
 41622 -          // mostly because the this function is the last one in the module.
       
 41623 -          if (next_addr != 0) {
       
 41624 -            ElfW(Off) next_addr_offset = next_addr - func_info.addr;
       
 41625 -            line_info.size = next_addr_offset - line_info.rva_to_func;
       
 41626 -          } else {
       
 41627 -            line_info.size = kDefaultSize;
       
 41628 -          }
       
 41629 -        }
       
 41630 -        line_info.rva_to_base = line_info.rva_to_func + func_info.rva_to_base;
       
 41631 -      }  // for each line.
       
 41632 -    }  // for each function.
       
 41633 -  } // for each source file.
       
 41634 -  return true;
       
 41635 +  // Now that everything has a size, add our functions to the module, and
       
 41636 +  // dispose of our private list.
       
 41637 +  module_->AddFunctions(functions_.begin(), functions_.end());
       
 41638 +  functions_.clear();
       
 41639  }
       
 41640  
       
 41641  static bool LoadSymbols(const ElfW(Shdr) *stab_section,
       
 41642                          const ElfW(Shdr) *stabstr_section,
       
 41643 -                        ElfW(Addr) loading_addr,
       
 41644 -                        struct SymbolInfo *symbols) {
       
 41645 +                        Module *module) {
       
 41646    if (stab_section == NULL || stabstr_section == NULL)
       
 41647      return false;
       
 41648  
       
 41649 -  struct nlist *lists =
       
 41650 -    reinterpret_cast<struct nlist *>(stab_section->sh_offset);
       
 41651 -  int nstab = stab_section->sh_size / sizeof(struct nlist);
       
 41652 -  // First pass, load all symbols from the object file.
       
 41653 -  for (int i = 0; i < nstab; ) {
       
 41654 -    int step = 1;
       
 41655 -    struct nlist *cur_list = lists + i;
       
 41656 -    if (cur_list->n_type == N_SO) {
       
 41657 -      // FUNC <address> <length> <param_stack_size> <function>
       
 41658 -      struct SourceFileInfo source_file_info;
       
 41659 -      source_file_info.name_index = cur_list->n_un.n_strx;
       
 41660 -      source_file_info.name = reinterpret_cast<char *>(cur_list->n_un.n_strx +
       
 41661 -                                 stabstr_section->sh_offset);
       
 41662 -      source_file_info.addr = cur_list->n_value;
       
 41663 -      if (strchr(source_file_info.name, '.'))
       
 41664 -        source_file_info.source_id = symbols->next_source_id++;
       
 41665 -      else
       
 41666 -        source_file_info.source_id = -1;
       
 41667 -      step = LoadFuncSymbols(cur_list, lists + nstab,
       
 41668 -                             stabstr_section, &source_file_info);
       
 41669 -      symbols->source_file_info.push_back(source_file_info);
       
 41670 -    }
       
 41671 -    i += step;
       
 41672 -  }
       
 41673 -
       
 41674 -  // Second pass, compute the size of functions and lines.
       
 41675 -  if (ComputeSizeAndRVA(loading_addr, symbols)) {
       
 41676 -    // Third pass, check for included source code, especially for header files.
       
 41677 -    // Until now, we only have compiling unit information, but they can
       
 41678 -    // have code from include files, add them here.
       
 41679 -    AddIncludedFiles(symbols, stabstr_section);
       
 41680 -    return true;
       
 41681 -  }
       
 41682 -  return false;
       
 41683 +  // A callback object to handle data from the STABS reader.
       
 41684 +  DumpStabsHandler handler(module);
       
 41685 +  // Find the addresses of the STABS data, and create a STABS reader object.
       
 41686 +  uint8_t *stabs = reinterpret_cast<uint8_t *>(stab_section->sh_offset);
       
 41687 +  uint8_t *stabstr = reinterpret_cast<uint8_t *>(stabstr_section->sh_offset);
       
 41688 +  google_breakpad::StabsReader reader(stabs, stab_section->sh_size,
       
 41689 +                                      stabstr, stabstr_section->sh_size,
       
 41690 +                                      &handler);
       
 41691 +  // Read the STABS data, and do post-processing.
       
 41692 +  if (! reader.Process())
       
 41693 +    return false;
       
 41694 +  handler.Finalize();
       
 41695 +  return true;
       
 41696  }
       
 41697  
       
 41698 -static bool LoadSymbols(ElfW(Ehdr) *elf_header, struct SymbolInfo *symbols) {
       
 41699 +static bool LoadSymbols(ElfW(Ehdr) *elf_header, Module *module) {
       
 41700    // Translate all offsets in section headers into address.
       
 41701    FixAddress(elf_header);
       
 41702    ElfW(Addr) loading_addr = GetLoadingAddress(
       
 41703        reinterpret_cast<ElfW(Phdr) *>(elf_header->e_phoff),
       
 41704        elf_header->e_phnum);
       
 41705 +  module->SetLoadAddress(loading_addr);
       
 41706  
       
 41707    const ElfW(Shdr) *sections =
       
 41708      reinterpret_cast<ElfW(Shdr) *>(elf_header->e_shoff);
       
 41709    const ElfW(Shdr) *strtab = sections + elf_header->e_shstrndx;
       
 41710    const ElfW(Shdr) *stab_section =
       
 41711      FindSectionByName(kStabName, sections, strtab, elf_header->e_shnum);
       
 41712    if (stab_section == NULL) {
       
 41713      fprintf(stderr, "Stab section not found.\n");
       
 41714      return false;
       
 41715    }
       
 41716    const ElfW(Shdr) *stabstr_section = stab_section->sh_link + sections;
       
 41717  
       
 41718    // Load symbols.
       
 41719 -  return LoadSymbols(stab_section, stabstr_section, loading_addr, symbols);
       
 41720 -}
       
 41721 -
       
 41722 -static bool WriteModuleInfo(int fd,
       
 41723 -                            ElfW(Half) arch,
       
 41724 -                            const std::string &obj_file) {
       
 41725 -  const char *arch_name = NULL;
       
 41726 -  if (arch == EM_386)
       
 41727 -    arch_name = "x86";
       
 41728 -  else if (arch == EM_X86_64)
       
 41729 -    arch_name = "x86_64";
       
 41730 -  else
       
 41731 -    return false;
       
 41732 -
       
 41733 -  unsigned char identifier[16];
       
 41734 -  google_breakpad::FileID file_id(obj_file.c_str());
       
 41735 -  if (file_id.ElfFileIdentifier(identifier)) {
       
 41736 -    char identifier_str[40];
       
 41737 -    file_id.ConvertIdentifierToString(identifier,
       
 41738 -                                      identifier_str, sizeof(identifier_str));
       
 41739 -    char id_no_dash[40];
       
 41740 -    int id_no_dash_len = 0;
       
 41741 -    memset(id_no_dash, 0, sizeof(id_no_dash));
       
 41742 -    for (int i = 0; identifier_str[i] != '\0'; ++i)
       
 41743 -      if (identifier_str[i] != '-')
       
 41744 -        id_no_dash[id_no_dash_len++] = identifier_str[i];
       
 41745 -    // Add an extra "0" by the end.
       
 41746 -    id_no_dash[id_no_dash_len++] = '0';
       
 41747 -    std::string filename = obj_file;
       
 41748 -    size_t slash_pos = obj_file.find_last_of("/");
       
 41749 -    if (slash_pos != std::string::npos)
       
 41750 -      filename = obj_file.substr(slash_pos + 1);
       
 41751 -    return WriteFormat(fd, "MODULE Linux %s %s %s\n", arch_name,
       
 41752 -                       id_no_dash, filename.c_str());
       
 41753 -  }
       
 41754 -  return false;
       
 41755 -}
       
 41756 -
       
 41757 -static bool WriteSourceFileInfo(int fd, const struct SymbolInfo &symbols) {
       
 41758 -  for (SourceFileInfoList::const_iterator it =
       
 41759 -	 symbols.source_file_info.begin();
       
 41760 -       it != symbols.source_file_info.end(); it++) {
       
 41761 -    if (it->source_id != -1) {
       
 41762 -      const char *name = it->name;
       
 41763 -      if (!WriteFormat(fd, "FILE %d %s\n", it->source_id, name))
       
 41764 -        return false;
       
 41765 -    }
       
 41766 -  }
       
 41767 -  return true;
       
 41768 -}
       
 41769 -
       
 41770 -static bool WriteOneFunction(int fd,
       
 41771 -                             const struct FuncInfo &func_info){
       
 41772 -  // Discard the ending part of the name.
       
 41773 -  std::string func_name(func_info.name);
       
 41774 -  std::string::size_type last_colon = func_name.find_last_of(':');
       
 41775 -  if (last_colon != std::string::npos)
       
 41776 -    func_name = func_name.substr(0, last_colon);
       
 41777 -  func_name = Demangle(func_name.c_str());
       
 41778 -
       
 41779 -  if (func_info.size <= 0)
       
 41780 -    return true;
       
 41781 -
       
 41782 -  if (WriteFormat(fd, "FUNC %lx %lx %d %s\n",
       
 41783 -                  func_info.rva_to_base,
       
 41784 -                  func_info.size,
       
 41785 -                  func_info.stack_param_size,
       
 41786 -                  func_name.c_str())) {
       
 41787 -    for (LineInfoList::const_iterator it = func_info.line_info.begin();
       
 41788 -	 it != func_info.line_info.end(); it++) {
       
 41789 -      const struct LineInfo &line_info = *it;
       
 41790 -      if (!WriteFormat(fd, "%lx %lx %d %d\n",
       
 41791 -                       line_info.rva_to_base,
       
 41792 -                       line_info.size,
       
 41793 -                       line_info.line_num,
       
 41794 -                       line_info.source_id))
       
 41795 -        return false;
       
 41796 -    }
       
 41797 -    return true;
       
 41798 -  }
       
 41799 -  return false;
       
 41800 -}
       
 41801 -
       
 41802 -static bool WriteFunctionInfo(int fd, const struct SymbolInfo &symbols) {
       
 41803 -  for (SourceFileInfoList::const_iterator it =
       
 41804 -	 symbols.source_file_info.begin();
       
 41805 -       it != symbols.source_file_info.end(); it++) {
       
 41806 -    const struct SourceFileInfo &file_info = *it;
       
 41807 -    for (FuncInfoList::const_iterator fiIt = file_info.func_info.begin(); 
       
 41808 -	 fiIt != file_info.func_info.end(); fiIt++) {
       
 41809 -      const struct FuncInfo &func_info = *fiIt;
       
 41810 -      if (!WriteOneFunction(fd, func_info))
       
 41811 -        return false;
       
 41812 -    }
       
 41813 -  }
       
 41814 -  return true;
       
 41815 -}
       
 41816 -
       
 41817 -static bool DumpStabSymbols(int fd, const struct SymbolInfo &symbols) {
       
 41818 -  return WriteSourceFileInfo(fd, symbols) &&
       
 41819 -    WriteFunctionInfo(fd, symbols);
       
 41820 +  return LoadSymbols(stab_section, stabstr_section, module);
       
 41821  }
       
 41822  
       
 41823  //
       
 41824  // FDWrapper
       
 41825  //
       
 41826  // Wrapper class to make sure opened file is closed.
       
 41827  //
       
 41828  class FDWrapper {
       
 41829 @@ -740,43 +405,95 @@ class MmapWrapper {
       
 41830       size_ = 0;
       
 41831     }
       
 41832  
       
 41833    private:
       
 41834     void *base_;
       
 41835     size_t size_;
       
 41836  };
       
 41837  
       
 41838 +// Return the breakpad symbol file identifier for the architecture of
       
 41839 +// ELF_HEADER.
       
 41840 +const char *ElfArchitecture(const ElfW(Ehdr) *elf_header) {
       
 41841 +  ElfW(Half) arch = elf_header->e_machine;
       
 41842 +  if (arch == EM_386)
       
 41843 +    return "x86";
       
 41844 +  else if (arch == EM_X86_64)
       
 41845 +    return "x86_64";
       
 41846 +  else
       
 41847 +    return NULL;
       
 41848 +}
       
 41849 +
       
 41850 +// Format the Elf file identifier in IDENTIFIER as a UUID with the
       
 41851 +// dashes removed.
       
 41852 +std::string FormatIdentifier(unsigned char identifier[16]) {
       
 41853 +  char identifier_str[40];
       
 41854 +  google_breakpad::FileID::ConvertIdentifierToString(
       
 41855 +      identifier,
       
 41856 +      identifier_str,
       
 41857 +      sizeof(identifier_str));
       
 41858 +  std::string id_no_dash;
       
 41859 +  for (int i = 0; identifier_str[i] != '\0'; ++i)
       
 41860 +    if (identifier_str[i] != '-')
       
 41861 +      id_no_dash += identifier_str[i];
       
 41862 +  // Add an extra "0" by the end.  PDB files on Windows have an 'age'
       
 41863 +  // number appended to the end of the file identifier; this isn't
       
 41864 +  // really used or necessary on other platforms, but let's preserve
       
 41865 +  // the pattern.
       
 41866 +  id_no_dash += '0';
       
 41867 +  return id_no_dash;
       
 41868 +}
       
 41869 +
       
 41870 +// Return the non-directory portion of FILENAME: the portion after the
       
 41871 +// last slash, or the whole filename if there are no slashes.
       
 41872 +std::string BaseFileName(const std::string &filename) {
       
 41873 +  // Lots of copies!  basename's behavior is less than ideal.
       
 41874 +  char *c_filename = strdup(filename.c_str());
       
 41875 +  std::string base = basename(c_filename);
       
 41876 +  free(c_filename);
       
 41877 +  return base;
       
 41878 +}
       
 41879 +
       
 41880  }  // namespace
       
 41881  
       
 41882  namespace google_breakpad {
       
 41883  
       
 41884  bool DumpSymbols::WriteSymbolFile(const std::string &obj_file,
       
 41885 -                                  int sym_fd) {
       
 41886 +                                  FILE *sym_file) {
       
 41887    int obj_fd = open(obj_file.c_str(), O_RDONLY);
       
 41888    if (obj_fd < 0)
       
 41889      return false;
       
 41890    FDWrapper obj_fd_wrapper(obj_fd);
       
 41891    struct stat st;
       
 41892    if (fstat(obj_fd, &st) != 0 && st.st_size <= 0)
       
 41893      return false;
       
 41894    void *obj_base = mmap(NULL, st.st_size,
       
 41895                          PROT_READ | PROT_WRITE, MAP_PRIVATE, obj_fd, 0);
       
 41896 -  if (!obj_base)
       
 41897 +  if (obj_base == MAP_FAILED)
       
 41898      return false;
       
 41899    MmapWrapper map_wrapper(obj_base, st.st_size);
       
 41900    ElfW(Ehdr) *elf_header = reinterpret_cast<ElfW(Ehdr) *>(obj_base);
       
 41901    if (!IsValidElf(elf_header))
       
 41902      return false;
       
 41903 -  struct SymbolInfo symbols;
       
 41904 -  symbols.next_source_id = 0;
       
 41905  
       
 41906 -  if (!LoadSymbols(elf_header, &symbols))
       
 41907 -     return false;
       
 41908 -  // Write to symbol file.
       
 41909 -  if (WriteModuleInfo(sym_fd, elf_header->e_machine, obj_file) &&
       
 41910 -      DumpStabSymbols(sym_fd, symbols))
       
 41911 -    return true;
       
 41912 +  unsigned char identifier[16];
       
 41913 +  google_breakpad::FileID file_id(obj_file.c_str());
       
 41914 +  if (! file_id.ElfFileIdentifier(identifier))
       
 41915 +    return false;
       
 41916  
       
 41917 -  return false;
       
 41918 +  const char *architecture = ElfArchitecture(elf_header);
       
 41919 +  if (! architecture)
       
 41920 +    return false;
       
 41921 +
       
 41922 +  std::string name = BaseFileName(obj_file);
       
 41923 +  std::string os = "Linux";
       
 41924 +  std::string id = FormatIdentifier(identifier);
       
 41925 +
       
 41926 +  Module module(name, os, architecture, id);
       
 41927 +  if (!LoadSymbols(elf_header, &module))
       
 41928 +    return false;
       
 41929 +  if (!module.Write(sym_file))
       
 41930 +    return false;
       
 41931 +
       
 41932 +  return true;
       
 41933  }
       
 41934  
       
 41935  }  // namespace google_breakpad
       
 41936 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.h b/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.h
       
 41937 --- a/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.h
       
 41938 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.h
       
 41939 @@ -29,20 +29,21 @@
       
 41940  //
       
 41941  // dump_symbols.cc: Implements a linux stab debugging format dumper.
       
 41942  //
       
 41943  
       
 41944  #ifndef COMMON_LINUX_DUMP_SYMBOLS_H__
       
 41945  #define COMMON_LINUX_DUMP_SYMBOLS_H__
       
 41946  
       
 41947  #include <string>
       
 41948 +#include <cstdio>
       
 41949  
       
 41950  namespace google_breakpad {
       
 41951  
       
 41952  class DumpSymbols {
       
 41953   public:
       
 41954    bool WriteSymbolFile(const std::string &obj_file,
       
 41955 -                       int sym_fd);
       
 41956 +                       FILE *sym_file);
       
 41957  };
       
 41958  
       
 41959  }  // namespace google_breakpad
       
 41960  
       
 41961  #endif  // COMMON_LINUX_DUMP_SYMBOLS_H__
       
 41962 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.cc
       
 41963 --- a/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.cc
       
 41964 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.cc
       
 41965 @@ -27,114 +27,148 @@
       
 41966  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 41967  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 41968  //
       
 41969  // file_id.cc: Return a unique identifier for a file
       
 41970  //
       
 41971  // See file_id.h for documentation
       
 41972  //
       
 41973  
       
 41974 -#include <cassert>
       
 41975 -#include <cstdio>
       
 41976 +#include "common/linux/file_id.h"
       
 41977 +#include "common/linux/linux_libc_support.h"
       
 41978 +#include "common/linux/linux_syscall_support.h"
       
 41979 +
       
 41980 +#include <arpa/inet.h>
       
 41981  #include <elf.h>
       
 41982  #include <fcntl.h>
       
 41983  #include <link.h>
       
 41984 +#include <string.h>
       
 41985  #include <sys/mman.h>
       
 41986 -#include <string.h>
       
 41987  #include <unistd.h>
       
 41988  
       
 41989 -#include "common/linux/file_id.h"
       
 41990 -#include "common/md5.h"
       
 41991 +#include <algorithm>
       
 41992 +#include <cassert>
       
 41993 +#include <cstdio>
       
 41994  
       
 41995  namespace google_breakpad {
       
 41996  
       
 41997 -static bool FindElfTextSection(const void *elf_mapped_base,
       
 41998 -                               const void **text_start,
       
 41999 -                               int *text_size) {
       
 42000 +FileID::FileID(const char* path) {
       
 42001 +  strncpy(path_, path, sizeof(path_));
       
 42002 +}
       
 42003 +
       
 42004 +// These two functions are also used inside the crashed process, so be safe
       
 42005 +// and use the syscall/libc wrappers instead of direct syscalls or libc.
       
 42006 +  static bool FindElfTextSection(const void *elf_mapped_base,
       
 42007 +                                 const void **text_start,
       
 42008 +                                 int *text_size) {
       
 42009    assert(elf_mapped_base);
       
 42010    assert(text_start);
       
 42011    assert(text_size);
       
 42012  
       
 42013 -  const unsigned char *elf_base =
       
 42014 -    static_cast<const unsigned char *>(elf_mapped_base);
       
 42015 -  const ElfW(Ehdr) *elf_header =
       
 42016 -    reinterpret_cast<const ElfW(Ehdr) *>(elf_base);
       
 42017 -  if (memcmp(elf_header, ELFMAG, SELFMAG) != 0)
       
 42018 +  const char* elf_base =
       
 42019 +    static_cast<const char*>(elf_mapped_base);
       
 42020 +  const ElfW(Ehdr)* elf_header =
       
 42021 +    reinterpret_cast<const ElfW(Ehdr)*>(elf_base);
       
 42022 +  if (my_strncmp(elf_base, ELFMAG, SELFMAG) != 0)
       
 42023 +    return false;
       
 42024 +#if __ELF_NATIVE_CLASS == 32
       
 42025 +#define ELFCLASS ELFCLASS32
       
 42026 +#else
       
 42027 +#define ELFCLASS ELFCLASS64
       
 42028 +#endif
       
 42029 +  //TODO: support dumping 32-bit binaries from a 64-bit dump_syms?
       
 42030 +  if (elf_header->e_ident[EI_CLASS] != ELFCLASS)
       
 42031      return false;
       
 42032    *text_start = NULL;
       
 42033    *text_size = 0;
       
 42034 -  const ElfW(Shdr) *sections =
       
 42035 -    reinterpret_cast<const ElfW(Shdr) *>(elf_base + elf_header->e_shoff);
       
 42036 -  const char *text_section_name = ".text";
       
 42037 -  int name_len = strlen(text_section_name);
       
 42038 -  const ElfW(Shdr) *string_section = sections + elf_header->e_shstrndx;
       
 42039 -  const ElfW(Shdr) *text_section = NULL;
       
 42040 +  const ElfW(Shdr)* sections =
       
 42041 +    reinterpret_cast<const ElfW(Shdr)*>(elf_base + elf_header->e_shoff);
       
 42042 +  const char* text_section_name = ".text";
       
 42043 +  int name_len = my_strlen(text_section_name);
       
 42044 +  const ElfW(Shdr)* string_section = sections + elf_header->e_shstrndx;
       
 42045 +  const ElfW(Shdr)* text_section = NULL;
       
 42046    for (int i = 0; i < elf_header->e_shnum; ++i) {
       
 42047      if (sections[i].sh_type == SHT_PROGBITS) {
       
 42048 -      const char *section_name = (char*)(elf_base +
       
 42049 +      const char* section_name = (char*)(elf_base +
       
 42050                                           string_section->sh_offset +
       
 42051                                           sections[i].sh_name);
       
 42052 -      if (!strncmp(section_name, text_section_name, name_len)) {
       
 42053 +      if (!my_strncmp(section_name, text_section_name, name_len)) {
       
 42054          text_section = &sections[i];
       
 42055          break;
       
 42056        }
       
 42057      }
       
 42058    }
       
 42059    if (text_section != NULL && text_section->sh_size > 0) {
       
 42060 -    int text_section_size = text_section->sh_size;
       
 42061      *text_start = elf_base + text_section->sh_offset;
       
 42062 -    *text_size = text_section_size;
       
 42063 +    *text_size = text_section->sh_size;
       
 42064    }
       
 42065    return true;
       
 42066  }
       
 42067  
       
 42068 -FileID::FileID(const char *path) {
       
 42069 -  strncpy(path_, path, sizeof(path_));
       
 42070 +// static
       
 42071 +bool FileID::ElfFileIdentifierFromMappedFile(void* base,
       
 42072 +                                             uint8_t identifier[kMDGUIDSize])
       
 42073 +{
       
 42074 +  const void* text_section = NULL;
       
 42075 +  int text_size = 0;
       
 42076 +  bool success = false;
       
 42077 +  if (FindElfTextSection(base, &text_section, &text_size) && (text_size > 0)) {
       
 42078 +    my_memset(identifier, 0, kMDGUIDSize);
       
 42079 +    const uint8_t* ptr = reinterpret_cast<const uint8_t*>(text_section);
       
 42080 +    const uint8_t* ptr_end = ptr + std::min(text_size, 4096);
       
 42081 +    while (ptr < ptr_end) {
       
 42082 +      for (unsigned i = 0; i < kMDGUIDSize; i++)
       
 42083 +        identifier[i] ^= ptr[i];
       
 42084 +      ptr += kMDGUIDSize;
       
 42085 +    }
       
 42086 +    success = true;
       
 42087 +  }
       
 42088 +  return success;
       
 42089  }
       
 42090  
       
 42091 -bool FileID::ElfFileIdentifier(unsigned char identifier[16]) {
       
 42092 +bool FileID::ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]) {
       
 42093    int fd = open(path_, O_RDONLY);
       
 42094    if (fd < 0)
       
 42095      return false;
       
 42096    struct stat st;
       
 42097 -  if (fstat(fd, &st) != 0 && st.st_size <= 0) {
       
 42098 +  if (fstat(fd, &st) != 0) {
       
 42099      close(fd);
       
 42100      return false;
       
 42101    }
       
 42102 -  void *base = mmap(NULL, st.st_size,
       
 42103 +  void* base = mmap(NULL, st.st_size,
       
 42104                      PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
       
 42105 -  if (!base) {
       
 42106 -    close(fd);
       
 42107 +  close(fd);
       
 42108 +  if (base == MAP_FAILED)
       
 42109      return false;
       
 42110 -  }
       
 42111 -  bool success = false;
       
 42112 -  const void *text_section = NULL;
       
 42113 -  int text_size = 0;
       
 42114 -  if (FindElfTextSection(base, &text_section, &text_size) && (text_size > 0)) {
       
 42115 -    struct MD5Context md5;
       
 42116 -    MD5Init(&md5);
       
 42117 -    MD5Update(&md5,
       
 42118 -              static_cast<const unsigned char*>(text_section),
       
 42119 -              text_size);
       
 42120 -    MD5Final(identifier, &md5);
       
 42121 -    success = true;
       
 42122 -  }
       
 42123  
       
 42124 -  close(fd);
       
 42125 +  bool success = ElfFileIdentifierFromMappedFile(base, identifier);
       
 42126    munmap(base, st.st_size);
       
 42127    return success;
       
 42128  }
       
 42129  
       
 42130  // static
       
 42131 -void FileID::ConvertIdentifierToString(const unsigned char identifier[16],
       
 42132 -                                       char *buffer, int buffer_length) {
       
 42133 +void FileID::ConvertIdentifierToString(const uint8_t identifier[kMDGUIDSize],
       
 42134 +                                       char* buffer, int buffer_length) {
       
 42135 +  uint8_t identifier_swapped[kMDGUIDSize];
       
 42136 +
       
 42137 +  // Endian-ness swap to match dump processor expectation.
       
 42138 +  memcpy(identifier_swapped, identifier, kMDGUIDSize);
       
 42139 +  uint32_t* data1 = reinterpret_cast<uint32_t*>(identifier_swapped);
       
 42140 +  *data1 = htonl(*data1);
       
 42141 +  uint16_t* data2 = reinterpret_cast<uint16_t*>(identifier_swapped + 4);
       
 42142 +  *data2 = htons(*data2);
       
 42143 +  uint16_t* data3 = reinterpret_cast<uint16_t*>(identifier_swapped + 6);
       
 42144 +  *data3 = htons(*data3);
       
 42145 +
       
 42146    int buffer_idx = 0;
       
 42147 -  for (int idx = 0; (buffer_idx < buffer_length) && (idx < 16); ++idx) {
       
 42148 -    int hi = (identifier[idx] >> 4) & 0x0F;
       
 42149 -    int lo = (identifier[idx]) & 0x0F;
       
 42150 +  for (unsigned int idx = 0;
       
 42151 +       (buffer_idx < buffer_length) && (idx < kMDGUIDSize);
       
 42152 +       ++idx) {
       
 42153 +    int hi = (identifier_swapped[idx] >> 4) & 0x0F;
       
 42154 +    int lo = (identifier_swapped[idx]) & 0x0F;
       
 42155  
       
 42156      if (idx == 4 || idx == 6 || idx == 8 || idx == 10)
       
 42157        buffer[buffer_idx++] = '-';
       
 42158  
       
 42159      buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi;
       
 42160      buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo;
       
 42161    }
       
 42162  
       
 42163 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.h b/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.h
       
 42164 --- a/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.h
       
 42165 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/file_id.h
       
 42166 @@ -30,37 +30,47 @@
       
 42167  // file_id.h: Return a unique identifier for a file
       
 42168  //
       
 42169  
       
 42170  #ifndef COMMON_LINUX_FILE_ID_H__
       
 42171  #define COMMON_LINUX_FILE_ID_H__
       
 42172  
       
 42173  #include <limits.h>
       
 42174  
       
 42175 +#include "common/linux/guid_creator.h"
       
 42176 +
       
 42177  namespace google_breakpad {
       
 42178  
       
 42179 +static const size_t kMDGUIDSize = sizeof(MDGUID);
       
 42180 +
       
 42181  class FileID {
       
 42182   public:
       
 42183 -  FileID(const char *path);
       
 42184 -  ~FileID() {};
       
 42185 +  explicit FileID(const char* path);
       
 42186 +  ~FileID() {}
       
 42187  
       
 42188    // Load the identifier for the elf file path specified in the constructor into
       
 42189    // |identifier|.  Return false if the identifier could not be created for the
       
 42190    // file.
       
 42191 -  // The current implementation will return the MD5 hash of the file's bytes.
       
 42192 -  bool ElfFileIdentifier(unsigned char identifier[16]);
       
 42193 +  // The current implementation will XOR the first 4096 bytes of the
       
 42194 +  // .text section to generate an identifier.
       
 42195 +  bool ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]);
       
 42196 +
       
 42197 +  // Load the identifier for the elf file mapped into memory at |base| into
       
 42198 +  // |identifier|.  Return false if the identifier could not be created for the
       
 42199 +  // file.
       
 42200 +  static bool ElfFileIdentifierFromMappedFile(void* base,
       
 42201 +                                              uint8_t identifier[kMDGUIDSize]);
       
 42202  
       
 42203    // Convert the |identifier| data to a NULL terminated string.  The string will
       
 42204    // be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE).
       
 42205    // The |buffer| should be at least 37 bytes long to receive all of the data
       
 42206    // and termination.  Shorter buffers will contain truncated data.
       
 42207 -  static void ConvertIdentifierToString(const unsigned char identifier[16],
       
 42208 -                                        char *buffer, int buffer_length);
       
 42209 +  static void ConvertIdentifierToString(const uint8_t identifier[kMDGUIDSize],
       
 42210 +                                        char* buffer, int buffer_length);
       
 42211  
       
 42212   private:
       
 42213    // Storage for the path specified
       
 42214    char path_[PATH_MAX];
       
 42215  };
       
 42216  
       
 42217  }  // namespace google_breakpad
       
 42218  
       
 42219  #endif  // COMMON_LINUX_FILE_ID_H__
       
 42220 -
       
 42221 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/file_id_unittest.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/file_id_unittest.cc
       
 42222 new file mode 100644
       
 42223 --- /dev/null
       
 42224 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/file_id_unittest.cc
       
 42225 @@ -0,0 +1,76 @@
       
 42226 +// Copyright (c) 2009, Google Inc.
       
 42227 +// All rights reserved.
       
 42228 +//
       
 42229 +// Redistribution and use in source and binary forms, with or without
       
 42230 +// modification, are permitted provided that the following conditions are
       
 42231 +// met:
       
 42232 +//
       
 42233 +//     * Redistributions of source code must retain the above copyright
       
 42234 +// notice, this list of conditions and the following disclaimer.
       
 42235 +//     * Redistributions in binary form must reproduce the above
       
 42236 +// copyright notice, this list of conditions and the following disclaimer
       
 42237 +// in the documentation and/or other materials provided with the
       
 42238 +// distribution.
       
 42239 +//     * Neither the name of Google Inc. nor the names of its
       
 42240 +// contributors may be used to endorse or promote products derived from
       
 42241 +// this software without specific prior written permission.
       
 42242 +//
       
 42243 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 42244 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 42245 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 42246 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 42247 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 42248 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 42249 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 42250 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 42251 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 42252 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 42253 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 42254 +
       
 42255 +// Unit tests for FileID
       
 42256 +
       
 42257 +#include <stdlib.h>
       
 42258 +
       
 42259 +#include "common/linux/file_id.h"
       
 42260 +#include "breakpad_googletest_includes.h"
       
 42261 +
       
 42262 +using namespace google_breakpad;
       
 42263 +
       
 42264 +
       
 42265 +namespace {
       
 42266 +typedef testing::Test FileIDTest;
       
 42267 +}
       
 42268 +
       
 42269 +TEST(FileIDTest, FileIDStrip) {
       
 42270 +  // Calculate the File ID of our binary using
       
 42271 +  // FileID::ElfFileIdentifier, then make a copy of our binary,
       
 42272 +  // strip it, and ensure that we still get the same result.
       
 42273 +  char exe_name[PATH_MAX];
       
 42274 +  ssize_t len = readlink("/proc/self/exe", exe_name, PATH_MAX - 1);
       
 42275 +  ASSERT_NE(len, -1);
       
 42276 +  exe_name[len] = '\0';
       
 42277 +
       
 42278 +  // copy our binary to a temp file, and strip it
       
 42279 +  char templ[] = "/tmp/file-id-unittest-XXXXXX";
       
 42280 +  mktemp(templ);
       
 42281 +  char cmdline[4096];
       
 42282 +  sprintf(cmdline, "cp \"%s\" \"%s\"", exe_name, templ);
       
 42283 +  ASSERT_EQ(system(cmdline), 0);
       
 42284 +  sprintf(cmdline, "strip \"%s\"", templ);
       
 42285 +  ASSERT_EQ(system(cmdline), 0);
       
 42286 +
       
 42287 +  uint8_t identifier1[sizeof(MDGUID)];
       
 42288 +  uint8_t identifier2[sizeof(MDGUID)];
       
 42289 +  FileID fileid1(exe_name);
       
 42290 +  EXPECT_TRUE(fileid1.ElfFileIdentifier(identifier1));
       
 42291 +  FileID fileid2(templ);
       
 42292 +  EXPECT_TRUE(fileid2.ElfFileIdentifier(identifier2));
       
 42293 +  char identifier_string1[37];
       
 42294 +  char identifier_string2[37];
       
 42295 +  FileID::ConvertIdentifierToString(identifier1, identifier_string1,
       
 42296 +                                    37);
       
 42297 +  FileID::ConvertIdentifierToString(identifier2, identifier_string2,
       
 42298 +                                    37);
       
 42299 +  EXPECT_STREQ(identifier_string1, identifier_string2);
       
 42300 +  unlink(templ);
       
 42301 +}
       
 42302 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader.cc
       
 42303 new file mode 100644
       
 42304 --- /dev/null
       
 42305 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader.cc
       
 42306 @@ -0,0 +1,196 @@
       
 42307 +// Copyright (c) 2009, Google Inc.
       
 42308 +// All rights reserved.
       
 42309 +//
       
 42310 +// Redistribution and use in source and binary forms, with or without
       
 42311 +// modification, are permitted provided that the following conditions are
       
 42312 +// met:
       
 42313 +//
       
 42314 +//     * Redistributions of source code must retain the above copyright
       
 42315 +// notice, this list of conditions and the following disclaimer.
       
 42316 +//     * Redistributions in binary form must reproduce the above
       
 42317 +// copyright notice, this list of conditions and the following disclaimer
       
 42318 +// in the documentation and/or other materials provided with the
       
 42319 +// distribution.
       
 42320 +//     * Neither the name of Google Inc. nor the names of its
       
 42321 +// contributors may be used to endorse or promote products derived from
       
 42322 +// this software without specific prior written permission.
       
 42323 +//
       
 42324 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 42325 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 42326 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 42327 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 42328 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 42329 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 42330 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 42331 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 42332 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 42333 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 42334 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 42335 +
       
 42336 +
       
 42337 +#include "common/linux/google_crashdump_uploader.h"
       
 42338 +#include "common/linux/libcurl_wrapper.h"
       
 42339 +#include "third_party/linux/include/glog/logging.h"
       
 42340 +
       
 42341 +#include <sys/types.h>
       
 42342 +#include <sys/stat.h>
       
 42343 +#include <unistd.h>
       
 42344 +
       
 42345 +namespace google_breakpad {
       
 42346 +
       
 42347 +GoogleCrashdumpUploader::GoogleCrashdumpUploader(const std::string& product,
       
 42348 +                                                 const std::string& version,
       
 42349 +                                                 const std::string& guid,
       
 42350 +                                                 const std::string& ptime,
       
 42351 +                                                 const std::string& ctime,
       
 42352 +                                                 const std::string& email,
       
 42353 +                                                 const std::string& comments,
       
 42354 +                                                 const std::string& minidump_pathname,
       
 42355 +                                                 const std::string& crash_server,
       
 42356 +                                                 const std::string& proxy_host,
       
 42357 +                                                 const std::string& proxy_userpassword) {
       
 42358 +  LibcurlWrapper* http_layer = new LibcurlWrapper();
       
 42359 +  Init(product,
       
 42360 +       version,
       
 42361 +       guid,
       
 42362 +       ptime,
       
 42363 +       ctime,
       
 42364 +       email,
       
 42365 +       comments,
       
 42366 +       minidump_pathname,
       
 42367 +       crash_server,
       
 42368 +       proxy_host,
       
 42369 +       proxy_userpassword,
       
 42370 +       http_layer);
       
 42371 +}
       
 42372 +
       
 42373 +GoogleCrashdumpUploader::GoogleCrashdumpUploader(const std::string& product,
       
 42374 +                                                 const std::string& version,
       
 42375 +                                                 const std::string& guid,
       
 42376 +                                                 const std::string& ptime,
       
 42377 +                                                 const std::string& ctime,
       
 42378 +                                                 const std::string& email,
       
 42379 +                                                 const std::string& comments,
       
 42380 +                                                 const std::string& minidump_pathname,
       
 42381 +                                                 const std::string& crash_server,
       
 42382 +                                                 const std::string& proxy_host,
       
 42383 +                                                 const std::string& proxy_userpassword,
       
 42384 +                                                 LibcurlWrapper* http_layer) {
       
 42385 +  Init(product,
       
 42386 +       version,
       
 42387 +       guid,
       
 42388 +       ptime,
       
 42389 +       ctime,
       
 42390 +       email,
       
 42391 +       comments,
       
 42392 +       minidump_pathname,
       
 42393 +       crash_server,
       
 42394 +       proxy_host,
       
 42395 +       proxy_userpassword,
       
 42396 +       http_layer);
       
 42397 +}
       
 42398 +
       
 42399 +void GoogleCrashdumpUploader::Init(const std::string& product,
       
 42400 +                                   const std::string& version,
       
 42401 +                                   const std::string& guid,
       
 42402 +                                   const std::string& ptime,
       
 42403 +                                   const std::string& ctime,
       
 42404 +                                   const std::string& email,
       
 42405 +                                   const std::string& comments,
       
 42406 +                                   const std::string& minidump_pathname,
       
 42407 +                                   const std::string& crash_server,
       
 42408 +                                   const std::string& proxy_host,
       
 42409 +                                   const std::string& proxy_userpassword,
       
 42410 +                                   LibcurlWrapper* http_layer) {
       
 42411 +  product_ = product;
       
 42412 +  version_ = version;
       
 42413 +  guid_ = guid;
       
 42414 +  ptime_ = ptime;
       
 42415 +  ctime_ = ctime;
       
 42416 +  email_ = email;
       
 42417 +  comments_ = comments;
       
 42418 +  http_layer_ = http_layer;
       
 42419 +
       
 42420 +  crash_server_ = crash_server;
       
 42421 +  proxy_host_ = proxy_host;
       
 42422 +  proxy_userpassword_ = proxy_userpassword;
       
 42423 +  minidump_pathname_ = minidump_pathname;
       
 42424 +  LOG(INFO) << "Uploader initializing";
       
 42425 +  LOG(INFO) << "\tProduct: " << product_;
       
 42426 +  LOG(INFO) << "\tVersion: " << version_;
       
 42427 +  LOG(INFO) << "\tGUID: " << guid_;
       
 42428 +  if (!ptime_.empty()) {
       
 42429 +    LOG(INFO) << "\tProcess uptime: " << ptime_;
       
 42430 +  }
       
 42431 +  if (!ctime_.empty()) {
       
 42432 +    LOG(INFO) << "\tCumulative Process uptime: " << ctime_;
       
 42433 +  }
       
 42434 +  if (!email_.empty()) {
       
 42435 +    LOG(INFO) << "\tEmail: " << email_;
       
 42436 +  }
       
 42437 +  if (!comments_.empty()) {
       
 42438 +    LOG(INFO) << "\tComments: " << comments_;
       
 42439 +  }
       
 42440 +}
       
 42441 +
       
 42442 +bool GoogleCrashdumpUploader::CheckRequiredParametersArePresent() {
       
 42443 +  std::string error_text;
       
 42444 +  if (product_.empty()) {
       
 42445 +    error_text.append("\nProduct name must be specified.");
       
 42446 +  }
       
 42447 +
       
 42448 +  if (version_.empty()) {
       
 42449 +    error_text.append("\nProduct version must be specified.");
       
 42450 +  }
       
 42451 +
       
 42452 +  if (guid_.empty()) {
       
 42453 +    error_text.append("\nClient ID must be specified.");
       
 42454 +  }
       
 42455 +
       
 42456 +  if (minidump_pathname_.empty()) {
       
 42457 +    error_text.append("\nMinidump pathname must be specified.");
       
 42458 +  }
       
 42459 +
       
 42460 +  if (!error_text.empty()) {
       
 42461 +    LOG(ERROR) << error_text;
       
 42462 +    return false;
       
 42463 +  }
       
 42464 +  return true;
       
 42465 +
       
 42466 +}
       
 42467 +
       
 42468 +bool GoogleCrashdumpUploader::Upload() {
       
 42469 +  bool ok = http_layer_->Init();
       
 42470 +  if (!ok) {
       
 42471 +    LOG(WARNING) << "http layer init failed";
       
 42472 +    return ok;
       
 42473 +  }
       
 42474 +
       
 42475 +  if (!CheckRequiredParametersArePresent()) {
       
 42476 +    return false;
       
 42477 +  }
       
 42478 +
       
 42479 +  struct stat st;
       
 42480 +  int err = stat(minidump_pathname_.c_str(), &st);
       
 42481 +  if (err) {
       
 42482 +    LOG(WARNING) << minidump_pathname_ << " could not be found: " << errno;
       
 42483 +    return false;
       
 42484 +  }
       
 42485 +
       
 42486 +  parameters_["prod"] = product_;
       
 42487 +  parameters_["ver"] = version_;
       
 42488 +  parameters_["guid"] = guid_;
       
 42489 +  parameters_["ptime"] = ptime_;
       
 42490 +  parameters_["ctime"] = ctime_;
       
 42491 +  parameters_["email"] = email_;
       
 42492 +  parameters_["comments_"] = comments_;
       
 42493 +  if (!http_layer_->AddFile(minidump_pathname_,
       
 42494 +                            "upload_file_minidump")) {
       
 42495 +    return false;
       
 42496 +  }
       
 42497 +  LOG(INFO) << "Sending request to " << crash_server_;
       
 42498 +  return http_layer_->SendRequest(crash_server_,
       
 42499 +                                  parameters_,
       
 42500 +                                  NULL);
       
 42501 +}
       
 42502 +}
       
 42503 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader.h b/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader.h
       
 42504 new file mode 100644
       
 42505 --- /dev/null
       
 42506 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader.h
       
 42507 @@ -0,0 +1,98 @@
       
 42508 +// Copyright (c) 2009, Google Inc.
       
 42509 +// All rights reserved.
       
 42510 +//
       
 42511 +// Redistribution and use in source and binary forms, with or without
       
 42512 +// modification, are permitted provided that the following conditions are
       
 42513 +// met:
       
 42514 +//
       
 42515 +//     * Redistributions of source code must retain the above copyright
       
 42516 +// notice, this list of conditions and the following disclaimer.
       
 42517 +//     * Redistributions in binary form must reproduce the above
       
 42518 +// copyright notice, this list of conditions and the following disclaimer
       
 42519 +// in the documentation and/or other materials provided with the
       
 42520 +// distribution.
       
 42521 +//     * Neither the name of Google Inc. nor the names of its
       
 42522 +// contributors may be used to endorse or promote products derived from
       
 42523 +// this software without specific prior written permission.
       
 42524 +//
       
 42525 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 42526 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 42527 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 42528 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 42529 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 42530 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 42531 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 42532 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 42533 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 42534 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 42535 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 42536 +
       
 42537 +
       
 42538 +#include <string>
       
 42539 +#include <map>
       
 42540 +
       
 42541 +namespace google_breakpad {
       
 42542 +
       
 42543 +class LibcurlWrapper;
       
 42544 +
       
 42545 +class GoogleCrashdumpUploader {
       
 42546 + public:
       
 42547 +  GoogleCrashdumpUploader(const std::string& product,
       
 42548 +                          const std::string& version,
       
 42549 +                          const std::string& guid,
       
 42550 +                          const std::string& ptime,
       
 42551 +                          const std::string& ctime,
       
 42552 +                          const std::string& email,
       
 42553 +                          const std::string& comments,
       
 42554 +                          const std::string& minidump_pathname,
       
 42555 +                          const std::string& crash_server,
       
 42556 +                          const std::string& proxy_host,
       
 42557 +                          const std::string& proxy_userpassword);
       
 42558 +
       
 42559 +  GoogleCrashdumpUploader(const std::string& product,
       
 42560 +                          const std::string& version,
       
 42561 +                          const std::string& guid,
       
 42562 +                          const std::string& ptime,
       
 42563 +                          const std::string& ctime,
       
 42564 +                          const std::string& email,
       
 42565 +                          const std::string& comments,
       
 42566 +                          const std::string& minidump_pathname,
       
 42567 +                          const std::string& crash_server,
       
 42568 +                          const std::string& proxy_host,
       
 42569 +                          const std::string& proxy_userpassword,
       
 42570 +                          LibcurlWrapper* http_layer);
       
 42571 +
       
 42572 +  void Init(const std::string& product,
       
 42573 +            const std::string& version,
       
 42574 +            const std::string& guid,
       
 42575 +            const std::string& ptime,
       
 42576 +            const std::string& ctime,
       
 42577 +            const std::string& email,
       
 42578 +            const std::string& comments,
       
 42579 +            const std::string& minidump_pathname,
       
 42580 +            const std::string& crash_server,
       
 42581 +            const std::string& proxy_host,
       
 42582 +            const std::string& proxy_userpassword,
       
 42583 +            LibcurlWrapper* http_layer);
       
 42584 +  bool Upload();
       
 42585 +
       
 42586 + private:
       
 42587 +  bool CheckRequiredParametersArePresent();
       
 42588 +
       
 42589 +  LibcurlWrapper* http_layer_;
       
 42590 +  std::string product_;
       
 42591 +  std::string version_;
       
 42592 +  std::string guid_;
       
 42593 +  std::string ptime_;
       
 42594 +  std::string ctime_;
       
 42595 +  std::string email_;
       
 42596 +  std::string comments_;
       
 42597 +  std::string minidump_pathname_;
       
 42598 +
       
 42599 +  std::string crash_server_;
       
 42600 +  std::string proxy_host_;
       
 42601 +  std::string proxy_userpassword_;
       
 42602 +
       
 42603 +  std::map<std::string, std::string> parameters_;
       
 42604 +};
       
 42605 +}
       
 42606 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader_test.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader_test.cc
       
 42607 new file mode 100644
       
 42608 --- /dev/null
       
 42609 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/google_crashdump_uploader_test.cc
       
 42610 @@ -0,0 +1,166 @@
       
 42611 +// Copyright (c) 2009, Google Inc.
       
 42612 +// All rights reserved.
       
 42613 +//
       
 42614 +// Redistribution and use in source and binary forms, with or without
       
 42615 +// modification, are permitted provided that the following conditions are
       
 42616 +// met:
       
 42617 +//
       
 42618 +//     * Redistributions of source code must retain the above copyright
       
 42619 +// notice, this list of conditions and the following disclaimer.
       
 42620 +//     * Redistributions in binary form must reproduce the above
       
 42621 +// copyright notice, this list of conditions and the following disclaimer
       
 42622 +// in the documentation and/or other materials provided with the
       
 42623 +// distribution.
       
 42624 +//     * Neither the name of Google Inc. nor the names of its
       
 42625 +// contributors may be used to endorse or promote products derived from
       
 42626 +// this software without specific prior written permission.
       
 42627 +//
       
 42628 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 42629 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 42630 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 42631 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 42632 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 42633 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 42634 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 42635 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 42636 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 42637 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 42638 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 42639 +
       
 42640 +// Unit test for crash dump uploader.
       
 42641 +
       
 42642 +#include "common/linux/google_crashdump_uploader.h"
       
 42643 +#include "common/linux/libcurl_wrapper.h"
       
 42644 +#include "breakpad_googletest_includes.h"
       
 42645 +
       
 42646 +namespace google_breakpad {
       
 42647 +
       
 42648 +using ::testing::Return;
       
 42649 +using ::testing::_;
       
 42650 +
       
 42651 +class MockLibcurlWrapper : public LibcurlWrapper {
       
 42652 + public:
       
 42653 +  MOCK_METHOD0(Init, bool());
       
 42654 +  MOCK_METHOD2(SetProxy, bool(const std::string& proxy_host,
       
 42655 +                              const std::string& proxy_userpwd));
       
 42656 +  MOCK_METHOD2(AddFile, bool(const std::string& upload_file_path,
       
 42657 +                             const std::string& basename));
       
 42658 +  MOCK_METHOD3(SendRequest,
       
 42659 +               bool(const std::string& url,
       
 42660 +                    const std::map<std::string, std::string>& parameters,
       
 42661 +                    std::string* server_response));
       
 42662 +};
       
 42663 +
       
 42664 +class GoogleCrashdumpUploaderTest : public ::testing::Test {
       
 42665 +};
       
 42666 +
       
 42667 +TEST_F(GoogleCrashdumpUploaderTest, InitFailsCausesUploadFailure) {
       
 42668 +  MockLibcurlWrapper m;
       
 42669 +  EXPECT_CALL(m, Init()).Times(1).WillOnce(Return(false));
       
 42670 +  GoogleCrashdumpUploader *uploader = new GoogleCrashdumpUploader("foobar",
       
 42671 +                                                                  "1.0",
       
 42672 +                                                                  "AAA-BBB",
       
 42673 +                                                                  "",
       
 42674 +                                                                  "",
       
 42675 +                                                                  "test@test.com",
       
 42676 +                                                                  "none",
       
 42677 +                                                                  "/tmp/foo.dmp",
       
 42678 +                                                                  "http://foo.com",
       
 42679 +                                                                  "",
       
 42680 +                                                                  "",
       
 42681 +                                                                  &m);
       
 42682 +  ASSERT_FALSE(uploader->Upload());
       
 42683 +}
       
 42684 +
       
 42685 +TEST_F(GoogleCrashdumpUploaderTest, TestSendRequestHappensWithValidParameters) {
       
 42686 +  // Create a temp file
       
 42687 +  char tempfn[80] = "/tmp/googletest-upload-XXXXXX";
       
 42688 +  int fd = mkstemp(tempfn);
       
 42689 +  ASSERT_NE(fd, -1);
       
 42690 +  close(fd);
       
 42691 +
       
 42692 +  MockLibcurlWrapper m;
       
 42693 +  EXPECT_CALL(m, Init()).Times(1).WillOnce(Return(true));
       
 42694 +  EXPECT_CALL(m, AddFile(tempfn, _)).WillOnce(Return(true));
       
 42695 +  EXPECT_CALL(m,
       
 42696 +              SendRequest("http://foo.com",_,_)).Times(1).WillOnce(Return(true));
       
 42697 +  GoogleCrashdumpUploader *uploader = new GoogleCrashdumpUploader("foobar",
       
 42698 +                                                                  "1.0",
       
 42699 +                                                                  "AAA-BBB",
       
 42700 +                                                                  "",
       
 42701 +                                                                  "",
       
 42702 +                                                                  "test@test.com",
       
 42703 +                                                                  "none",
       
 42704 +                                                                  tempfn,
       
 42705 +                                                                  "http://foo.com",
       
 42706 +                                                                  "",
       
 42707 +                                                                  "",
       
 42708 +                                                                  &m);
       
 42709 +  ASSERT_TRUE(uploader->Upload());
       
 42710 +}
       
 42711 +
       
 42712 +
       
 42713 +TEST_F(GoogleCrashdumpUploaderTest, InvalidPathname) {
       
 42714 +  MockLibcurlWrapper m;
       
 42715 +  EXPECT_CALL(m, Init()).Times(1).WillOnce(Return(true));
       
 42716 +  EXPECT_CALL(m, SendRequest(_,_,_)).Times(0);
       
 42717 +  GoogleCrashdumpUploader *uploader = new GoogleCrashdumpUploader("foobar",
       
 42718 +                                                                  "1.0",
       
 42719 +                                                                  "AAA-BBB",
       
 42720 +                                                                  "",
       
 42721 +                                                                  "",
       
 42722 +                                                                  "test@test.com",
       
 42723 +                                                                  "none",
       
 42724 +                                                                  "/tmp/foo.dmp",
       
 42725 +                                                                  "http://foo.com",
       
 42726 +                                                                  "",
       
 42727 +                                                                  "",
       
 42728 +                                                                  &m);
       
 42729 +  ASSERT_FALSE(uploader->Upload());
       
 42730 +}
       
 42731 +
       
 42732 +TEST_F(GoogleCrashdumpUploaderTest, TestRequiredParametersMustBePresent) {
       
 42733 +  // Test with empty product name.
       
 42734 +  GoogleCrashdumpUploader uploader("",
       
 42735 +                                   "1.0",
       
 42736 +                                   "AAA-BBB",
       
 42737 +                                   "",
       
 42738 +                                   "",
       
 42739 +                                   "test@test.com",
       
 42740 +                                   "none",
       
 42741 +                                   "/tmp/foo.dmp",
       
 42742 +                                   "http://foo.com",
       
 42743 +                                   "",
       
 42744 +                                   "");
       
 42745 +  ASSERT_FALSE(uploader.Upload());
       
 42746 +
       
 42747 +  // Test with empty product version.
       
 42748 +  GoogleCrashdumpUploader uploader1("product",
       
 42749 +                                    "",
       
 42750 +                                    "AAA-BBB",
       
 42751 +                                    "",
       
 42752 +                                    "",
       
 42753 +                                    "",
       
 42754 +                                    "",
       
 42755 +                                    "/tmp/foo.dmp",
       
 42756 +                                    "",
       
 42757 +                                    "",
       
 42758 +                                    "");
       
 42759 +
       
 42760 +  ASSERT_FALSE(uploader1.Upload());
       
 42761 +
       
 42762 +  // Test with empty client GUID.
       
 42763 +  GoogleCrashdumpUploader uploader2("product",
       
 42764 +                                    "1.0",
       
 42765 +                                    "",
       
 42766 +                                    "",
       
 42767 +                                    "",
       
 42768 +                                    "",
       
 42769 +                                    "",
       
 42770 +                                    "/tmp/foo.dmp",
       
 42771 +                                    "",
       
 42772 +                                    "",
       
 42773 +                                    "");
       
 42774 +  ASSERT_FALSE(uploader2.Upload());
       
 42775 +}
       
 42776 +}
       
 42777 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.cc
       
 42778 --- a/toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.cc
       
 42779 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/guid_creator.cc
       
 42780 @@ -44,22 +44,36 @@
       
 42781  // crash to happen very offen.
       
 42782  //
       
 42783  class GUIDGenerator {
       
 42784   public:
       
 42785    GUIDGenerator() {
       
 42786      srandom(time(NULL));
       
 42787    }
       
 42788  
       
 42789 +  static u_int32_t BytesToUInt32(const u_int8_t bytes[]) {
       
 42790 +    return ((u_int32_t) bytes[0]
       
 42791 +            | ((u_int32_t) bytes[1] << 8)
       
 42792 +            | ((u_int32_t) bytes[2] << 16)
       
 42793 +            | ((u_int32_t) bytes[3] << 24));
       
 42794 +  }
       
 42795 +
       
 42796 +  static void UInt32ToBytes(u_int8_t bytes[], u_int32_t n) {
       
 42797 +    bytes[0] = n & 0xff;
       
 42798 +    bytes[1] = (n >> 8) & 0xff;
       
 42799 +    bytes[2] = (n >> 16) & 0xff;
       
 42800 +    bytes[3] = (n >> 24) & 0xff;
       
 42801 +  }
       
 42802 +
       
 42803    bool CreateGUID(GUID *guid) const {
       
 42804      guid->data1 = random();
       
 42805      guid->data2 = (u_int16_t)(random());
       
 42806      guid->data3 = (u_int16_t)(random());
       
 42807 -    *reinterpret_cast<u_int32_t*>(&guid->data4[0]) = random();
       
 42808 -    *reinterpret_cast<u_int32_t*>(&guid->data4[4]) = random();
       
 42809 +    UInt32ToBytes(&guid->data4[0], random());
       
 42810 +    UInt32ToBytes(&guid->data4[4], random());
       
 42811      return true;
       
 42812    }
       
 42813  };
       
 42814  
       
 42815  // Guid generator.
       
 42816  const GUIDGenerator kGuidGenerator;
       
 42817  
       
 42818  bool CreateGUID(GUID *guid) {
       
 42819 @@ -67,16 +81,16 @@ bool CreateGUID(GUID *guid) {
       
 42820  }
       
 42821  
       
 42822  // Parse guid to string.
       
 42823  bool GUIDToString(const GUID *guid, char *buf, int buf_len) {
       
 42824    // Should allow more space the the max length of GUID.
       
 42825    assert(buf_len > kGUIDStringLength);
       
 42826    int num = snprintf(buf, buf_len, kGUIDFormatString,
       
 42827                       guid->data1, guid->data2, guid->data3,
       
 42828 -                     *reinterpret_cast<const u_int32_t *>(&(guid->data4[0])),
       
 42829 -                     *reinterpret_cast<const u_int32_t *>(&(guid->data4[4])));
       
 42830 +                     GUIDGenerator::BytesToUInt32(&(guid->data4[0])),
       
 42831 +                     GUIDGenerator::BytesToUInt32(&(guid->data4[4])));
       
 42832    if (num != kGUIDStringLength)
       
 42833      return false;
       
 42834  
       
 42835    buf[num] = '\0';
       
 42836    return true;
       
 42837  }
       
 42838 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/libcurl_wrapper.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/libcurl_wrapper.cc
       
 42839 new file mode 100644
       
 42840 --- /dev/null
       
 42841 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/libcurl_wrapper.cc
       
 42842 @@ -0,0 +1,209 @@
       
 42843 +// Copyright (c) 2009, Google Inc.
       
 42844 +// All rights reserved.
       
 42845 +//
       
 42846 +// Redistribution and use in source and binary forms, with or without
       
 42847 +// modification, are permitted provided that the following conditions are
       
 42848 +// met:
       
 42849 +//
       
 42850 +//     * Redistributions of source code must retain the above copyright
       
 42851 +// notice, this list of conditions and the following disclaimer.
       
 42852 +//     * Redistributions in binary form must reproduce the above
       
 42853 +// copyright notice, this list of conditions and the following disclaimer
       
 42854 +// in the documentation and/or other materials provided with the
       
 42855 +// distribution.
       
 42856 +//     * Neither the name of Google Inc. nor the names of its
       
 42857 +// contributors may be used to endorse or promote products derived from
       
 42858 +// this software without specific prior written permission.
       
 42859 +//
       
 42860 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 42861 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 42862 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 42863 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 42864 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 42865 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 42866 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 42867 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 42868 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 42869 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 42870 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 42871 +
       
 42872 +#include <curl/curl.h>
       
 42873 +#include <curl/easy.h>
       
 42874 +#include <curl/types.h>
       
 42875 +#include <dlfcn.h>
       
 42876 +
       
 42877 +#include <string>
       
 42878 +
       
 42879 +#include "common/linux/libcurl_wrapper.h"
       
 42880 +#include "third_party/linux/include/glog/logging.h"
       
 42881 +
       
 42882 +namespace google_breakpad {
       
 42883 +LibcurlWrapper::LibcurlWrapper()
       
 42884 +    : init_ok_(false),
       
 42885 +      formpost_(NULL),
       
 42886 +      lastptr_(NULL),
       
 42887 +      headerlist_(NULL) {
       
 42888 +  curl_lib_ = dlopen("libcurl.so", RTLD_NOW);
       
 42889 +  if (!curl_lib_) {
       
 42890 +    curl_lib_ = dlopen("libcurl.so.4", RTLD_NOW);
       
 42891 +  }
       
 42892 +  if (!curl_lib_) {
       
 42893 +    curl_lib_ = dlopen("libcurl.so.3", RTLD_NOW);
       
 42894 +  }
       
 42895 +  if (!curl_lib_) {
       
 42896 +    LOG(WARNING) << "Could not find libcurl via dlopen";
       
 42897 +    return;
       
 42898 +  }
       
 42899 +  LOG(INFO) << "LibcurlWrapper init succeeded";
       
 42900 +  init_ok_ = true;
       
 42901 +  return;
       
 42902 +}
       
 42903 +
       
 42904 +bool LibcurlWrapper::SetProxy(const std::string& proxy_host,
       
 42905 +                              const std::string& proxy_userpwd) {
       
 42906 +  if (!init_ok_) {
       
 42907 +    return false;
       
 42908 +  }
       
 42909 +  // Set proxy information if necessary.
       
 42910 +  if (!proxy_host.empty()) {
       
 42911 +    (*easy_setopt_)(curl_, CURLOPT_PROXY, proxy_host.c_str());
       
 42912 +  } else {
       
 42913 +    LOG(WARNING) << "SetProxy called with empty proxy host.";
       
 42914 +    return false;
       
 42915 +  }
       
 42916 +  if (!proxy_userpwd.empty()) {
       
 42917 +    (*easy_setopt_)(curl_, CURLOPT_PROXYUSERPWD, proxy_userpwd.c_str());
       
 42918 +  } else {
       
 42919 +    LOG(WARNING) << "SetProxy called with empty proxy username/password.";
       
 42920 +    return false;
       
 42921 +  }
       
 42922 +  LOG(INFO) << "Set proxy host to " << proxy_host;
       
 42923 +  return true;
       
 42924 +}
       
 42925 +
       
 42926 +bool LibcurlWrapper::AddFile(const std::string& upload_file_path,
       
 42927 +                             const std::string& basename) {
       
 42928 +  if (!init_ok_) {
       
 42929 +    return false;
       
 42930 +  }
       
 42931 +  LOG(INFO) << "Adding " << upload_file_path << " to form upload.";
       
 42932 +  // Add form file.
       
 42933 +  (*formadd_)(&formpost_, &lastptr_,
       
 42934 +              CURLFORM_COPYNAME, basename.c_str(),
       
 42935 +              CURLFORM_FILE, upload_file_path.c_str(),
       
 42936 +              CURLFORM_END);
       
 42937 +
       
 42938 +  return true;
       
 42939 +}
       
 42940 +
       
 42941 +// Callback to get the response data from server.
       
 42942 +static size_t WriteCallback(void *ptr, size_t size,
       
 42943 +                            size_t nmemb, void *userp) {
       
 42944 +  if (!userp)
       
 42945 +    return 0;
       
 42946 +
       
 42947 +  std::string *response = reinterpret_cast<std::string *>(userp);
       
 42948 +  size_t real_size = size * nmemb;
       
 42949 +  response->append(reinterpret_cast<char *>(ptr), real_size);
       
 42950 +  return real_size;
       
 42951 +}
       
 42952 +
       
 42953 +bool LibcurlWrapper::SendRequest(const std::string& url,
       
 42954 +                                 const std::map<std::string, std::string>& parameters,
       
 42955 +                                 std::string* server_response) {
       
 42956 +  (*easy_setopt_)(curl_, CURLOPT_URL, url.c_str());
       
 42957 +  std::map<std::string, std::string>::const_iterator iter = parameters.begin();
       
 42958 +  for (; iter != parameters.end(); ++iter)
       
 42959 +    (*formadd_)(&formpost_, &lastptr_,
       
 42960 +                CURLFORM_COPYNAME, iter->first.c_str(),
       
 42961 +                CURLFORM_COPYCONTENTS, iter->second.c_str(),
       
 42962 +                CURLFORM_END);
       
 42963 +
       
 42964 +  (*easy_setopt_)(curl_, CURLOPT_HTTPPOST, formpost_);
       
 42965 +  if (server_response != NULL) {
       
 42966 +    (*easy_setopt_)(curl_, CURLOPT_WRITEFUNCTION, WriteCallback);
       
 42967 +    (*easy_setopt_)(curl_, CURLOPT_WRITEDATA,
       
 42968 +                     reinterpret_cast<void *>(server_response));
       
 42969 +  }
       
 42970 +
       
 42971 +  CURLcode err_code = CURLE_OK;
       
 42972 +  err_code = (*easy_perform_)(curl_);
       
 42973 +  *(void**) (&easy_strerror_) = dlsym(curl_lib_, "curl_easy_strerror");
       
 42974 +#ifndef NDEBUG
       
 42975 +  if (err_code != CURLE_OK)
       
 42976 +    fprintf(stderr, "Failed to send http request to %s, error: %s\n",
       
 42977 +            url.c_str(),
       
 42978 +            (*easy_strerror_)(err_code));
       
 42979 +#endif
       
 42980 +  if (headerlist_ != NULL) {
       
 42981 +    (*slist_free_all_)(headerlist_);
       
 42982 +  }
       
 42983 +
       
 42984 +  (*easy_cleanup_)(curl_);
       
 42985 +  if (formpost_ != NULL) {
       
 42986 +    (*formfree_)(formpost_);
       
 42987 +  }
       
 42988 +
       
 42989 +  return err_code == CURLE_OK;
       
 42990 +}
       
 42991 +
       
 42992 +bool LibcurlWrapper::Init() {
       
 42993 +  if (!init_ok_) {
       
 42994 +    LOG(WARNING) << "Init_OK was not true in LibcurlWrapper::Init(), check earlier log messages";
       
 42995 +    return false;
       
 42996 +  }
       
 42997 +
       
 42998 +  if (!SetFunctionPointers()) {
       
 42999 +    LOG(WARNING) << "Could not find function pointers";
       
 43000 +    init_ok_ = false;
       
 43001 +    return false;
       
 43002 +  }
       
 43003 +
       
 43004 +  curl_ = (*easy_init_)();
       
 43005 +
       
 43006 +  last_curl_error_ = "No Error";
       
 43007 +
       
 43008 +  if (!curl_) {
       
 43009 +    dlclose(curl_lib_);
       
 43010 +    LOG(WARNING) << "Curl initialization failed";
       
 43011 +    return false;
       
 43012 +  }
       
 43013 +
       
 43014 +  // Disable 100-continue header.
       
 43015 +  char buf[] = "Expect:";
       
 43016 +
       
 43017 +  headerlist_ = (*slist_append_)(headerlist_, buf);
       
 43018 +  (*easy_setopt_)(curl_, CURLOPT_HTTPHEADER, headerlist_);
       
 43019 +  return true;
       
 43020 +}
       
 43021 +
       
 43022 +#define SET_AND_CHECK_FUNCTION_POINTER(var, function_name)      \
       
 43023 +  *(void**) (&var) = dlsym(curl_lib_, function_name);       \
       
 43024 +  if (!var) { \
       
 43025 +    LOG(WARNING) << "Could not find libcurl function " << function_name; \
       
 43026 +    init_ok_ = false; \
       
 43027 +    return false; \
       
 43028 +  }
       
 43029 +
       
 43030 +bool LibcurlWrapper::SetFunctionPointers() {
       
 43031 +
       
 43032 +  SET_AND_CHECK_FUNCTION_POINTER(easy_init_,
       
 43033 +                                 "curl_easy_init");
       
 43034 +  SET_AND_CHECK_FUNCTION_POINTER(easy_setopt_,
       
 43035 +                                 "curl_easy_setopt");
       
 43036 +  SET_AND_CHECK_FUNCTION_POINTER(formadd_,
       
 43037 +                                 "curl_formadd");
       
 43038 +  SET_AND_CHECK_FUNCTION_POINTER(slist_append_,
       
 43039 +                                 "curl_slist_append");
       
 43040 +  SET_AND_CHECK_FUNCTION_POINTER(easy_perform_,
       
 43041 +                                 "curl_easy_perform");
       
 43042 +  SET_AND_CHECK_FUNCTION_POINTER(easy_cleanup_,
       
 43043 +                                 "curl_easy_cleanup");
       
 43044 +  SET_AND_CHECK_FUNCTION_POINTER(slist_free_all_,
       
 43045 +                                 "curl_slist_free_all");
       
 43046 +  SET_AND_CHECK_FUNCTION_POINTER(formfree_,
       
 43047 +                                 "curl_formfree");
       
 43048 +  return true;
       
 43049 +}
       
 43050 +
       
 43051 +}
       
 43052 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/libcurl_wrapper.h b/toolkit/crashreporter/google-breakpad/src/common/linux/libcurl_wrapper.h
       
 43053 new file mode 100644
       
 43054 --- /dev/null
       
 43055 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/libcurl_wrapper.h
       
 43056 @@ -0,0 +1,82 @@
       
 43057 +// Copyright (c) 2009, Google Inc.
       
 43058 +// All rights reserved.
       
 43059 +//
       
 43060 +// Redistribution and use in source and binary forms, with or without
       
 43061 +// modification, are permitted provided that the following conditions are
       
 43062 +// met:
       
 43063 +//
       
 43064 +//     * Redistributions of source code must retain the above copyright
       
 43065 +// notice, this list of conditions and the following disclaimer.
       
 43066 +//     * Redistributions in binary form must reproduce the above
       
 43067 +// copyright notice, this list of conditions and the following disclaimer
       
 43068 +// in the documentation and/or other materials provided with the
       
 43069 +// distribution.
       
 43070 +//     * Neither the name of Google Inc. nor the names of its
       
 43071 +// contributors may be used to endorse or promote products derived from
       
 43072 +// this software without specific prior written permission.
       
 43073 +//
       
 43074 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 43075 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 43076 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 43077 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 43078 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 43079 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 43080 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 43081 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 43082 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 43083 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 43084 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 43085 +
       
 43086 +// A wrapper for libcurl to do HTTP Uploads, to support easy mocking
       
 43087 +// and unit testing of the HTTPUpload class.
       
 43088 +
       
 43089 +#include <string>
       
 43090 +#include <map>
       
 43091 +#include <curl/curl.h>
       
 43092 +
       
 43093 +namespace google_breakpad {
       
 43094 +class LibcurlWrapper {
       
 43095 + public:
       
 43096 +  LibcurlWrapper();
       
 43097 +  virtual bool Init();
       
 43098 +  virtual bool SetProxy(const std::string& proxy_host,
       
 43099 +                        const std::string& proxy_userpwd);
       
 43100 +  virtual bool AddFile(const std::string& upload_file_path,
       
 43101 +                       const std::string& basename);
       
 43102 +  virtual bool SendRequest(const std::string& url,
       
 43103 +                           const std::map<std::string, std::string>& parameters,
       
 43104 +                           std::string* server_response);
       
 43105 + private:
       
 43106 +  // This function initializes class state corresponding to function
       
 43107 +  // pointers into the CURL library.
       
 43108 +  bool SetFunctionPointers();
       
 43109 +
       
 43110 +  bool init_ok_;                 // Whether init succeeded
       
 43111 +  void* curl_lib_;               // Pointer to result of dlopen() on
       
 43112 +                                 // curl library
       
 43113 +  std::string last_curl_error_;  // The text of the last error when
       
 43114 +                                 // dealing
       
 43115 +  // with CURL.
       
 43116 +
       
 43117 +  CURL *curl_;                   // Pointer for handle for CURL calls.
       
 43118 +
       
 43119 +  CURL* (*easy_init_)(void);
       
 43120 +
       
 43121 +  // Stateful pointers for calling into curl_formadd()
       
 43122 +  struct curl_httppost *formpost_;
       
 43123 +  struct curl_httppost *lastptr_;
       
 43124 +  struct curl_slist *headerlist_;
       
 43125 +
       
 43126 +  // Function pointers into CURL library
       
 43127 +  CURLcode (*easy_setopt_)(CURL *, CURLoption, ...);
       
 43128 +  CURLFORMcode (*formadd_)(struct curl_httppost **,
       
 43129 +                           struct curl_httppost **, ...);
       
 43130 +  struct curl_slist* (*slist_append_)(struct curl_slist *, const char *);
       
 43131 +  void (*slist_free_all_)(struct curl_slist *);
       
 43132 +  CURLcode (*easy_perform_)(CURL *);
       
 43133 +  const char* (*easy_strerror_)(CURLcode);
       
 43134 +  void (*easy_cleanup_)(CURL *);
       
 43135 +  void (*formfree_)(struct curl_httppost *);
       
 43136 +
       
 43137 +};
       
 43138 +}
       
 43139 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support.h b/toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support.h
       
 43140 new file mode 100644
       
 43141 --- /dev/null
       
 43142 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support.h
       
 43143 @@ -0,0 +1,178 @@
       
 43144 +// Copyright (c) 2009, Google Inc.
       
 43145 +// All rights reserved.
       
 43146 +//
       
 43147 +// Redistribution and use in source and binary forms, with or without
       
 43148 +// modification, are permitted provided that the following conditions are
       
 43149 +// met:
       
 43150 +//
       
 43151 +//     * Redistributions of source code must retain the above copyright
       
 43152 +// notice, this list of conditions and the following disclaimer.
       
 43153 +//     * Redistributions in binary form must reproduce the above
       
 43154 +// copyright notice, this list of conditions and the following disclaimer
       
 43155 +// in the documentation and/or other materials provided with the
       
 43156 +// distribution.
       
 43157 +//     * Neither the name of Google Inc. nor the names of its
       
 43158 +// contributors may be used to endorse or promote products derived from
       
 43159 +// this software without specific prior written permission.
       
 43160 +//
       
 43161 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 43162 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 43163 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 43164 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 43165 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 43166 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 43167 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 43168 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 43169 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 43170 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 43171 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 43172 +
       
 43173 +// This header provides replacements for libc functions that we need. We if
       
 43174 +// call the libc functions directly we risk crashing in the dynamic linker as
       
 43175 +// it tries to resolve uncached PLT entries.
       
 43176 +
       
 43177 +#ifndef CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
       
 43178 +#define CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
       
 43179 +
       
 43180 +#include <stdint.h>
       
 43181 +#include <limits.h>
       
 43182 +#include <sys/types.h>
       
 43183 +
       
 43184 +extern "C" {
       
 43185 +
       
 43186 +static inline size_t
       
 43187 +my_strlen(const char* s) {
       
 43188 +  size_t len = 0;
       
 43189 +  while (*s++) len++;
       
 43190 +  return len;
       
 43191 +}
       
 43192 +
       
 43193 +static inline int
       
 43194 +my_strcmp(const char* a, const char* b) {
       
 43195 +  for (;;) {
       
 43196 +    if (*a < *b)
       
 43197 +      return -1;
       
 43198 +    else if (*a > *b)
       
 43199 +      return 1;
       
 43200 +    else if (*a == 0)
       
 43201 +      return 0;
       
 43202 +    a++;
       
 43203 +    b++;
       
 43204 +  }
       
 43205 +}
       
 43206 +
       
 43207 +static inline int
       
 43208 +my_strncmp(const char* a, const char* b, size_t len) {
       
 43209 +  for (size_t i = 0; i < len; ++i) {
       
 43210 +    if (*a < *b)
       
 43211 +      return -1;
       
 43212 +    else if (*a > *b)
       
 43213 +      return 1;
       
 43214 +    else if (*a == 0)
       
 43215 +      return 0;
       
 43216 +    a++;
       
 43217 +    b++;
       
 43218 +  }
       
 43219 +
       
 43220 +  return 0;
       
 43221 +}
       
 43222 +
       
 43223 +// Parse a non-negative integer.
       
 43224 +//   result: (output) the resulting non-negative integer
       
 43225 +//   s: a NUL terminated string
       
 43226 +// Return true iff successful.
       
 43227 +static inline bool
       
 43228 +my_strtoui(int* result, const char* s) {
       
 43229 +  if (*s == 0)
       
 43230 +    return false;
       
 43231 +  int r = 0;
       
 43232 +  for (;; s++) {
       
 43233 +    if (*s == 0)
       
 43234 +      break;
       
 43235 +    const int old_r = r;
       
 43236 +    r *= 10;
       
 43237 +    if (*s < '0' || *s > '9')
       
 43238 +      return false;
       
 43239 +    r += *s - '0';
       
 43240 +    if (r < old_r)
       
 43241 +      return false;
       
 43242 +  }
       
 43243 +
       
 43244 +  *result = r;
       
 43245 +  return true;
       
 43246 +}
       
 43247 +
       
 43248 +// Return the length of the given, non-negative integer when expressed in base
       
 43249 +// 10.
       
 43250 +static inline unsigned
       
 43251 +my_int_len(int i) {
       
 43252 +  if (!i)
       
 43253 +    return 1;
       
 43254 +
       
 43255 +  int len = 0;
       
 43256 +  while (i) {
       
 43257 +    len++;
       
 43258 +    i /= 10;
       
 43259 +  }
       
 43260 +
       
 43261 +  return len;
       
 43262 +}
       
 43263 +
       
 43264 +// Convert a non-negative integer to a string
       
 43265 +//   output: (output) the resulting string is written here. This buffer must be
       
 43266 +//     large enough to hold the resulting string. Call |my_int_len| to get the
       
 43267 +//     required length.
       
 43268 +//   i: the non-negative integer to serialise.
       
 43269 +//   i_len: the length of the integer in base 10 (see |my_int_len|).
       
 43270 +static inline void
       
 43271 +my_itos(char* output, int i, unsigned i_len) {
       
 43272 +  for (unsigned index = i_len; index; --index, i /= 10)
       
 43273 +    output[index - 1] = '0' + (i % 10);
       
 43274 +}
       
 43275 +
       
 43276 +static inline const char*
       
 43277 +my_strchr(const char* haystack, char needle) {
       
 43278 +  while (*haystack && *haystack != needle)
       
 43279 +    haystack++;
       
 43280 +  if (*haystack == needle)
       
 43281 +    return haystack;
       
 43282 +  return (const char*) 0;
       
 43283 +}
       
 43284 +
       
 43285 +// Read a hex value
       
 43286 +//   result: (output) the resulting value
       
 43287 +//   s: a string
       
 43288 +// Returns a pointer to the first invalid charactor.
       
 43289 +static inline const char*
       
 43290 +my_read_hex_ptr(uintptr_t* result, const char* s) {
       
 43291 +  uintptr_t r = 0;
       
 43292 +
       
 43293 +  for (;; ++s) {
       
 43294 +    if (*s >= '0' && *s <= '9') {
       
 43295 +      r <<= 4;
       
 43296 +      r += *s - '0';
       
 43297 +    } else if (*s >= 'a' && *s <= 'f') {
       
 43298 +      r <<= 4;
       
 43299 +      r += (*s - 'a') + 10;
       
 43300 +    } else if (*s >= 'A' && *s <= 'F') {
       
 43301 +      r <<= 4;
       
 43302 +      r += (*s - 'A') + 10;
       
 43303 +    } else {
       
 43304 +      break;
       
 43305 +    }
       
 43306 +  }
       
 43307 +
       
 43308 +  *result = r;
       
 43309 +  return s;
       
 43310 +}
       
 43311 +
       
 43312 +static inline void
       
 43313 +my_memset(void* ip, char c, size_t len) {
       
 43314 +  char* p = (char *) ip;
       
 43315 +  while (len--)
       
 43316 +    *p++ = c;
       
 43317 +}
       
 43318 +
       
 43319 +}  // extern "C"
       
 43320 +
       
 43321 +#endif  // CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_
       
 43322 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support_unittest.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support_unittest.cc
       
 43323 new file mode 100644
       
 43324 --- /dev/null
       
 43325 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/linux_libc_support_unittest.cc
       
 43326 @@ -0,0 +1,153 @@
       
 43327 +// Copyright (c) 2009, Google Inc.
       
 43328 +// All rights reserved.
       
 43329 +//
       
 43330 +// Redistribution and use in source and binary forms, with or without
       
 43331 +// modification, are permitted provided that the following conditions are
       
 43332 +// met:
       
 43333 +//
       
 43334 +//     * Redistributions of source code must retain the above copyright
       
 43335 +// notice, this list of conditions and the following disclaimer.
       
 43336 +//     * Redistributions in binary form must reproduce the above
       
 43337 +// copyright notice, this list of conditions and the following disclaimer
       
 43338 +// in the documentation and/or other materials provided with the
       
 43339 +// distribution.
       
 43340 +//     * Neither the name of Google Inc. nor the names of its
       
 43341 +// contributors may be used to endorse or promote products derived from
       
 43342 +// this software without specific prior written permission.
       
 43343 +//
       
 43344 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 43345 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 43346 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 43347 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 43348 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 43349 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 43350 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 43351 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 43352 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 43353 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 43354 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 43355 +
       
 43356 +#include "common/linux/linux_libc_support.h"
       
 43357 +#include "testing/gtest/include/gtest/gtest.h"
       
 43358 +
       
 43359 +namespace {
       
 43360 +typedef testing::Test LinuxLibcSupportTest;
       
 43361 +}
       
 43362 +
       
 43363 +TEST(LinuxLibcSupportTest, strlen) {
       
 43364 +  static const char* test_data[] = { "", "a", "aa", "aaa", "aabc", NULL };
       
 43365 +  for (unsigned i = 0; ; ++i) {
       
 43366 +    if (!test_data[i])
       
 43367 +      break;
       
 43368 +    ASSERT_EQ(strlen(test_data[i]), my_strlen(test_data[i]));
       
 43369 +  }
       
 43370 +}
       
 43371 +
       
 43372 +TEST(LinuxLibcSupportTest, strcmp) {
       
 43373 +  static const char* test_data[] = {
       
 43374 +    "", "",
       
 43375 +    "a", "",
       
 43376 +    "", "a",
       
 43377 +    "a", "b",
       
 43378 +    "a", "a",
       
 43379 +    "ab", "aa",
       
 43380 +    "abc", "ab",
       
 43381 +    "abc", "abc",
       
 43382 +    NULL,
       
 43383 +  };
       
 43384 +
       
 43385 +  for (unsigned i = 0; ; ++i) {
       
 43386 +    if (!test_data[i*2])
       
 43387 +      break;
       
 43388 +    ASSERT_EQ(my_strcmp(test_data[i*2], test_data[i*2 + 1]),
       
 43389 +              strcmp(test_data[i*2], test_data[i*2 + 1]));
       
 43390 +  }
       
 43391 +}
       
 43392 +
       
 43393 +TEST(LinuxLibcSupportTest, strtoui) {
       
 43394 +  int result;
       
 43395 +
       
 43396 +  ASSERT_FALSE(my_strtoui(&result, ""));
       
 43397 +  ASSERT_FALSE(my_strtoui(&result, "-1"));
       
 43398 +  ASSERT_FALSE(my_strtoui(&result, "-"));
       
 43399 +  ASSERT_FALSE(my_strtoui(&result, "a"));
       
 43400 +  ASSERT_FALSE(my_strtoui(&result, "23472893472938472987987398472398"));
       
 43401 +
       
 43402 +  ASSERT_TRUE(my_strtoui(&result, "0"));
       
 43403 +  ASSERT_EQ(result, 0);
       
 43404 +  ASSERT_TRUE(my_strtoui(&result, "1"));
       
 43405 +  ASSERT_EQ(result, 1);
       
 43406 +  ASSERT_TRUE(my_strtoui(&result, "12"));
       
 43407 +  ASSERT_EQ(result, 12);
       
 43408 +  ASSERT_TRUE(my_strtoui(&result, "123"));
       
 43409 +  ASSERT_EQ(result, 123);
       
 43410 +  ASSERT_TRUE(my_strtoui(&result, "0123"));
       
 43411 +  ASSERT_EQ(result, 123);
       
 43412 +}
       
 43413 +
       
 43414 +TEST(LinuxLibcSupportTest, int_len) {
       
 43415 +  ASSERT_EQ(my_int_len(0), 1);
       
 43416 +  ASSERT_EQ(my_int_len(2), 1);
       
 43417 +  ASSERT_EQ(my_int_len(5), 1);
       
 43418 +  ASSERT_EQ(my_int_len(9), 1);
       
 43419 +  ASSERT_EQ(my_int_len(10), 2);
       
 43420 +  ASSERT_EQ(my_int_len(99), 2);
       
 43421 +  ASSERT_EQ(my_int_len(100), 3);
       
 43422 +  ASSERT_EQ(my_int_len(101), 3);
       
 43423 +  ASSERT_EQ(my_int_len(1000), 4);
       
 43424 +}
       
 43425 +
       
 43426 +TEST(LinuxLibcSupportTest, itos) {
       
 43427 +  char buf[10];
       
 43428 +
       
 43429 +  my_itos(buf, 0, 1);
       
 43430 +  ASSERT_EQ(0, memcmp(buf, "0", 1));
       
 43431 +
       
 43432 +  my_itos(buf, 1, 1);
       
 43433 +  ASSERT_EQ(0, memcmp(buf, "1", 1));
       
 43434 +
       
 43435 +  my_itos(buf, 10, 2);
       
 43436 +  ASSERT_EQ(0, memcmp(buf, "10", 2));
       
 43437 +
       
 43438 +  my_itos(buf, 63, 2);
       
 43439 +  ASSERT_EQ(0, memcmp(buf, "63", 2));
       
 43440 +
       
 43441 +  my_itos(buf, 101, 3);
       
 43442 +  ASSERT_EQ(0, memcmp(buf, "101", 2));
       
 43443 +}
       
 43444 +
       
 43445 +TEST(LinuxLibcSupportTest, strchr) {
       
 43446 +  ASSERT_EQ(NULL, my_strchr("abc", 'd'));
       
 43447 +  ASSERT_EQ(NULL, my_strchr("", 'd'));
       
 43448 +  ASSERT_EQ(NULL, my_strchr("efghi", 'd'));
       
 43449 +
       
 43450 +  ASSERT_TRUE(my_strchr("a", 'a'));
       
 43451 +  ASSERT_TRUE(my_strchr("abc", 'a'));
       
 43452 +  ASSERT_TRUE(my_strchr("bcda", 'a'));
       
 43453 +  ASSERT_TRUE(my_strchr("sdfasdf", 'a'));
       
 43454 +}
       
 43455 +
       
 43456 +TEST(LinuxLibcSupportTest, read_hex_ptr) {
       
 43457 +  uintptr_t result;
       
 43458 +  const char* last;
       
 43459 +
       
 43460 +  last = my_read_hex_ptr(&result, "");
       
 43461 +  ASSERT_EQ(result, 0);
       
 43462 +  ASSERT_EQ(*last, 0);
       
 43463 +
       
 43464 +  last = my_read_hex_ptr(&result, "0");
       
 43465 +  ASSERT_EQ(result, 0);
       
 43466 +  ASSERT_EQ(*last, 0);
       
 43467 +
       
 43468 +  last = my_read_hex_ptr(&result, "0123");
       
 43469 +  ASSERT_EQ(result, 0x123);
       
 43470 +  ASSERT_EQ(*last, 0);
       
 43471 +
       
 43472 +  last = my_read_hex_ptr(&result, "0123a");
       
 43473 +  ASSERT_EQ(result, 0x123a);
       
 43474 +  ASSERT_EQ(*last, 0);
       
 43475 +
       
 43476 +  last = my_read_hex_ptr(&result, "0123a-");
       
 43477 +  ASSERT_EQ(result, 0x123a);
       
 43478 +  ASSERT_EQ(*last, '-');
       
 43479 +}
       
 43480 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/linux_syscall_support.h b/toolkit/crashreporter/google-breakpad/src/common/linux/linux_syscall_support.h
       
 43481 new file mode 100644
       
 43482 --- /dev/null
       
 43483 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/linux_syscall_support.h
       
 43484 @@ -0,0 +1,2800 @@
       
 43485 +/* Copyright (c) 2005-2008, Google Inc.
       
 43486 + * All rights reserved.
       
 43487 + *
       
 43488 + * Redistribution and use in source and binary forms, with or without
       
 43489 + * modification, are permitted provided that the following conditions are
       
 43490 + * met:
       
 43491 + *
       
 43492 + *     * Redistributions of source code must retain the above copyright
       
 43493 + * notice, this list of conditions and the following disclaimer.
       
 43494 + *     * Redistributions in binary form must reproduce the above
       
 43495 + * copyright notice, this list of conditions and the following disclaimer
       
 43496 + * in the documentation and/or other materials provided with the
       
 43497 + * distribution.
       
 43498 + *     * Neither the name of Google Inc. nor the names of its
       
 43499 + * contributors may be used to endorse or promote products derived from
       
 43500 + * this software without specific prior written permission.
       
 43501 + *
       
 43502 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 43503 + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 43504 + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 43505 + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 43506 + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 43507 + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 43508 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 43509 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 43510 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 43511 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 43512 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 43513 + *
       
 43514 + * ---
       
 43515 + * Author: Markus Gutschke
       
 43516 + */
       
 43517 +
       
 43518 +/* This file includes Linux-specific support functions common to the
       
 43519 + * coredumper and the thread lister; primarily, this is a collection
       
 43520 + * of direct system calls, and a couple of symbols missing from
       
 43521 + * standard header files.
       
 43522 + * There are a few options that the including file can set to control
       
 43523 + * the behavior of this file:
       
 43524 + *
       
 43525 + * SYS_CPLUSPLUS:
       
 43526 + *   The entire header file will normally be wrapped in 'extern "C" { }",
       
 43527 + *   making it suitable for compilation as both C and C++ source. If you
       
 43528 + *   do not want to do this, you can set the SYS_CPLUSPLUS macro to inhibit
       
 43529 + *   the wrapping. N.B. doing so will suppress inclusion of all prerequisite
       
 43530 + *   system header files, too. It is the caller's responsibility to provide
       
 43531 + *   the necessary definitions.
       
 43532 + *
       
 43533 + * SYS_ERRNO:
       
 43534 + *   All system calls will update "errno" unless overriden by setting the
       
 43535 + *   SYS_ERRNO macro prior to including this file. SYS_ERRNO should be
       
 43536 + *   an l-value.
       
 43537 + *
       
 43538 + * SYS_INLINE:
       
 43539 + *   New symbols will be defined "static inline", unless overridden by
       
 43540 + *   the SYS_INLINE macro.
       
 43541 + *
       
 43542 + * SYS_LINUX_SYSCALL_SUPPORT_H
       
 43543 + *   This macro is used to avoid multiple inclusions of this header file.
       
 43544 + *   If you need to include this file more than once, make sure to
       
 43545 + *   unset SYS_LINUX_SYSCALL_SUPPORT_H before each inclusion.
       
 43546 + *
       
 43547 + * SYS_PREFIX:
       
 43548 + *   New system calls will have a prefix of "sys_" unless overridden by
       
 43549 + *   the SYS_PREFIX macro. Valid values for this macro are [0..9] which
       
 43550 + *   results in prefixes "sys[0..9]_". It is also possible to set this
       
 43551 + *   macro to -1, which avoids all prefixes.
       
 43552 + *
       
 43553 + * This file defines a few internal symbols that all start with "LSS_".
       
 43554 + * Do not access these symbols from outside this file. They are not part
       
 43555 + * of the supported API.
       
 43556 + */
       
 43557 +#ifndef SYS_LINUX_SYSCALL_SUPPORT_H
       
 43558 +#define SYS_LINUX_SYSCALL_SUPPORT_H
       
 43559 +
       
 43560 +/* We currently only support x86-32, x86-64, ARM, MIPS, and PPC on Linux.
       
 43561 + * Porting to other related platforms should not be difficult.
       
 43562 + */
       
 43563 +#if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) ||   \
       
 43564 +     defined(__mips__) || defined(__PPC__)) && defined(__linux)
       
 43565 +
       
 43566 +#ifndef SYS_CPLUSPLUS
       
 43567 +#ifdef __cplusplus
       
 43568 +/* Some system header files in older versions of gcc neglect to properly
       
 43569 + * handle being included from C++. As it appears to be harmless to have
       
 43570 + * multiple nested 'extern "C"' blocks, just add another one here.
       
 43571 + */
       
 43572 +extern "C" {
       
 43573 +#endif
       
 43574 +
       
 43575 +#include <errno.h>
       
 43576 +#include <signal.h>
       
 43577 +#include <stdarg.h>
       
 43578 +#include <string.h>
       
 43579 +#include <sys/ptrace.h>
       
 43580 +#include <sys/resource.h>
       
 43581 +#include <sys/time.h>
       
 43582 +#include <sys/types.h>
       
 43583 +#include <syscall.h>
       
 43584 +#include <unistd.h>
       
 43585 +#include <linux/unistd.h>
       
 43586 +#include <endian.h>
       
 43587 +
       
 43588 +#ifdef __mips__
       
 43589 +/* Include definitions of the ABI currently in use.                          */
       
 43590 +#include <sgidefs.h>
       
 43591 +#endif
       
 43592 +
       
 43593 +#endif
       
 43594 +
       
 43595 +/* As glibc often provides subtly incompatible data structures (and implicit
       
 43596 + * wrapper functions that convert them), we provide our own kernel data
       
 43597 + * structures for use by the system calls.
       
 43598 + * These structures have been developed by using Linux 2.6.23 headers for
       
 43599 + * reference. Note though, we do not care about exact API compatibility
       
 43600 + * with the kernel, and in fact the kernel often does not have a single
       
 43601 + * API that works across architectures. Instead, we try to mimic the glibc
       
 43602 + * API where reasonable, and only guarantee ABI compatibility with the
       
 43603 + * kernel headers.
       
 43604 + * Most notably, here are a few changes that were made to the structures
       
 43605 + * defined by kernel headers:
       
 43606 + *
       
 43607 + * - we only define structures, but not symbolic names for kernel data
       
 43608 + *   types. For the latter, we directly use the native C datatype
       
 43609 + *   (i.e. "unsigned" instead of "mode_t").
       
 43610 + * - in a few cases, it is possible to define identical structures for
       
 43611 + *   both 32bit (e.g. i386) and 64bit (e.g. x86-64) platforms by
       
 43612 + *   standardizing on the 64bit version of the data types. In particular,
       
 43613 + *   this means that we use "unsigned" where the 32bit headers say
       
 43614 + *   "unsigned long".
       
 43615 + * - overall, we try to minimize the number of cases where we need to
       
 43616 + *   conditionally define different structures.
       
 43617 + * - the "struct kernel_sigaction" class of structures have been
       
 43618 + *   modified to more closely mimic glibc's API by introducing an
       
 43619 + *   anonymous union for the function pointer.
       
 43620 + * - a small number of field names had to have an underscore appended to
       
 43621 + *   them, because glibc defines a global macro by the same name.
       
 43622 + */
       
 43623 +
       
 43624 +/* include/linux/dirent.h                                                    */
       
 43625 +struct kernel_dirent64 {
       
 43626 +  unsigned long long d_ino;
       
 43627 +  long long          d_off;
       
 43628 +  unsigned short     d_reclen;
       
 43629 +  unsigned char      d_type;
       
 43630 +  char               d_name[256];
       
 43631 +};
       
 43632 +
       
 43633 +/* include/linux/dirent.h                                                    */
       
 43634 +struct kernel_dirent {
       
 43635 +  long               d_ino;
       
 43636 +  long               d_off;
       
 43637 +  unsigned short     d_reclen;
       
 43638 +  char               d_name[256];
       
 43639 +};
       
 43640 +
       
 43641 +/* include/linux/uio.h                                                       */
       
 43642 +struct kernel_iovec {
       
 43643 +  void               *iov_base;
       
 43644 +  unsigned long      iov_len;
       
 43645 +};
       
 43646 +
       
 43647 +/* include/linux/socket.h                                                    */
       
 43648 +struct kernel_msghdr {
       
 43649 +  void               *msg_name;
       
 43650 +  int                msg_namelen;
       
 43651 +  struct kernel_iovec*msg_iov;
       
 43652 +  unsigned long      msg_iovlen;
       
 43653 +  void               *msg_control;
       
 43654 +  unsigned long      msg_controllen;
       
 43655 +  unsigned           msg_flags;
       
 43656 +};
       
 43657 +
       
 43658 +/* include/asm-generic/poll.h                                                */
       
 43659 +struct kernel_pollfd {
       
 43660 +  int                fd;
       
 43661 +  short              events;
       
 43662 +  short              revents;
       
 43663 +};
       
 43664 +
       
 43665 +/* include/linux/resource.h                                                  */
       
 43666 +struct kernel_rlimit {
       
 43667 +  unsigned long      rlim_cur;
       
 43668 +  unsigned long      rlim_max;
       
 43669 +};
       
 43670 +
       
 43671 +/* include/linux/time.h                                                      */
       
 43672 +struct kernel_timespec {
       
 43673 +  long               tv_sec;
       
 43674 +  long               tv_nsec;
       
 43675 +};
       
 43676 +
       
 43677 +/* include/linux/time.h                                                      */
       
 43678 +struct kernel_timeval {
       
 43679 +  long               tv_sec;
       
 43680 +  long               tv_usec;
       
 43681 +};
       
 43682 +
       
 43683 +/* include/linux/resource.h                                                  */
       
 43684 +struct kernel_rusage {
       
 43685 +  struct kernel_timeval ru_utime;
       
 43686 +  struct kernel_timeval ru_stime;
       
 43687 +  long               ru_maxrss;
       
 43688 +  long               ru_ixrss;
       
 43689 +  long               ru_idrss;
       
 43690 +  long               ru_isrss;
       
 43691 +  long               ru_minflt;
       
 43692 +  long               ru_majflt;
       
 43693 +  long               ru_nswap;
       
 43694 +  long               ru_inblock;
       
 43695 +  long               ru_oublock;
       
 43696 +  long               ru_msgsnd;
       
 43697 +  long               ru_msgrcv;
       
 43698 +  long               ru_nsignals;
       
 43699 +  long               ru_nvcsw;
       
 43700 +  long               ru_nivcsw;
       
 43701 +};
       
 43702 +
       
 43703 +struct siginfo;
       
 43704 +#if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__PPC__)
       
 43705 +
       
 43706 +/* include/asm-{arm,i386,mips,ppc}/signal.h                                  */
       
 43707 +struct kernel_old_sigaction {
       
 43708 +  union {
       
 43709 +    void             (*sa_handler_)(int);
       
 43710 +    void             (*sa_sigaction_)(int, struct siginfo *, void *);
       
 43711 +  };
       
 43712 +  unsigned long      sa_mask;
       
 43713 +  unsigned long      sa_flags;
       
 43714 +  void               (*sa_restorer)(void);
       
 43715 +} __attribute__((packed,aligned(4)));
       
 43716 +#elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)
       
 43717 +  #define kernel_old_sigaction kernel_sigaction
       
 43718 +#endif
       
 43719 +
       
 43720 +/* Some kernel functions (e.g. sigaction() in 2.6.23) require that the
       
 43721 + * exactly match the size of the signal set, even though the API was
       
 43722 + * intended to be extensible. We define our own KERNEL_NSIG to deal with
       
 43723 + * this.
       
 43724 + * Please note that glibc provides signals [1.._NSIG-1], whereas the
       
 43725 + * kernel (and this header) provides the range [1..KERNEL_NSIG]. The
       
 43726 + * actual number of signals is obviously the same, but the constants
       
 43727 + * differ by one.
       
 43728 + */
       
 43729 +#ifdef __mips__
       
 43730 +#define KERNEL_NSIG 128
       
 43731 +#else
       
 43732 +#define KERNEL_NSIG  64
       
 43733 +#endif
       
 43734 +
       
 43735 +/* include/asm-{arm,i386,mips,x86_64}/signal.h                               */
       
 43736 +struct kernel_sigset_t {
       
 43737 +  unsigned long sig[(KERNEL_NSIG + 8*sizeof(unsigned long) - 1)/
       
 43738 +                    (8*sizeof(unsigned long))];
       
 43739 +};
       
 43740 +
       
 43741 +/* include/asm-{arm,i386,mips,x86_64,ppc}/signal.h                           */
       
 43742 +struct kernel_sigaction {
       
 43743 +#ifdef __mips__
       
 43744 +  unsigned long      sa_flags;
       
 43745 +  union {
       
 43746 +    void             (*sa_handler_)(int);
       
 43747 +    void             (*sa_sigaction_)(int, struct siginfo *, void *);
       
 43748 +  };
       
 43749 +  struct kernel_sigset_t sa_mask;
       
 43750 +#else
       
 43751 +  union {
       
 43752 +    void             (*sa_handler_)(int);
       
 43753 +    void             (*sa_sigaction_)(int, struct siginfo *, void *);
       
 43754 +  };
       
 43755 +  unsigned long      sa_flags;
       
 43756 +  void               (*sa_restorer)(void);
       
 43757 +  struct kernel_sigset_t sa_mask;
       
 43758 +#endif
       
 43759 +};
       
 43760 +
       
 43761 +/* include/linux/socket.h                                                    */
       
 43762 +struct kernel_sockaddr {
       
 43763 +  unsigned short     sa_family;
       
 43764 +  char               sa_data[14];
       
 43765 +};
       
 43766 +
       
 43767 +/* include/asm-{arm,i386,mips,ppc}/stat.h                                    */
       
 43768 +#ifdef __mips__
       
 43769 +#if _MIPS_SIM == _MIPS_SIM_ABI64
       
 43770 +struct kernel_stat {
       
 43771 +#else
       
 43772 +struct kernel_stat64 {
       
 43773 +#endif
       
 43774 +  unsigned           st_dev;
       
 43775 +  unsigned           __pad0[3];
       
 43776 +  unsigned long long st_ino;
       
 43777 +  unsigned           st_mode;
       
 43778 +  unsigned           st_nlink;
       
 43779 +  unsigned           st_uid;
       
 43780 +  unsigned           st_gid;
       
 43781 +  unsigned           st_rdev;
       
 43782 +  unsigned           __pad1[3];
       
 43783 +  long long          st_size;
       
 43784 +  unsigned           st_atime_;
       
 43785 +  unsigned           st_atime_nsec_;
       
 43786 +  unsigned           st_mtime_;
       
 43787 +  unsigned           st_mtime_nsec_;
       
 43788 +  unsigned           st_ctime_;
       
 43789 +  unsigned           st_ctime_nsec_;
       
 43790 +  unsigned           st_blksize;
       
 43791 +  unsigned           __pad2;
       
 43792 +  unsigned long long st_blocks;
       
 43793 +};
       
 43794 +#elif defined __PPC__
       
 43795 +struct kernel_stat64 {
       
 43796 +  unsigned long long st_dev;
       
 43797 +  unsigned long long st_ino;
       
 43798 +  unsigned           st_mode;
       
 43799 +  unsigned           st_nlink;
       
 43800 +  unsigned           st_uid;
       
 43801 +  unsigned           st_gid;
       
 43802 +  unsigned long long st_rdev;
       
 43803 +  unsigned short int __pad2;
       
 43804 +  long long          st_size;
       
 43805 +  long               st_blksize;
       
 43806 +  long long          st_blocks;
       
 43807 +  long               st_atime_;
       
 43808 +  unsigned long      st_atime_nsec_;
       
 43809 +  long               st_mtime_;
       
 43810 +  unsigned long      st_mtime_nsec_;
       
 43811 +  long               st_ctime_;
       
 43812 +  unsigned long      st_ctime_nsec_;
       
 43813 +  unsigned long      __unused4;
       
 43814 +  unsigned long      __unused5;
       
 43815 +};
       
 43816 +#else
       
 43817 +struct kernel_stat64 {
       
 43818 +  unsigned long long st_dev;
       
 43819 +  unsigned char      __pad0[4];
       
 43820 +  unsigned           __st_ino;
       
 43821 +  unsigned           st_mode;
       
 43822 +  unsigned           st_nlink;
       
 43823 +  unsigned           st_uid;
       
 43824 +  unsigned           st_gid;
       
 43825 +  unsigned long long st_rdev;
       
 43826 +  unsigned char      __pad3[4];
       
 43827 +  long long          st_size;
       
 43828 +  unsigned           st_blksize;
       
 43829 +  unsigned long long st_blocks;
       
 43830 +  unsigned           st_atime_;
       
 43831 +  unsigned           st_atime_nsec_;
       
 43832 +  unsigned           st_mtime_;
       
 43833 +  unsigned           st_mtime_nsec_;
       
 43834 +  unsigned           st_ctime_;
       
 43835 +  unsigned           st_ctime_nsec_;
       
 43836 +  unsigned long long st_ino;
       
 43837 +};
       
 43838 +#endif
       
 43839 +
       
 43840 +/* include/asm-{arm,i386,mips,x86_64,ppc}/stat.h                             */
       
 43841 +#if defined(__i386__) || defined(__ARM_ARCH_3__)
       
 43842 +struct kernel_stat {
       
 43843 +  /* The kernel headers suggest that st_dev and st_rdev should be 32bit
       
 43844 +   * quantities encoding 12bit major and 20bit minor numbers in an interleaved
       
 43845 +   * format. In reality, we do not see useful data in the top bits. So,
       
 43846 +   * we'll leave the padding in here, until we find a better solution.
       
 43847 +   */
       
 43848 +  unsigned short     st_dev;
       
 43849 +  short              pad1;
       
 43850 +  unsigned           st_ino;
       
 43851 +  unsigned short     st_mode;
       
 43852 +  unsigned short     st_nlink;
       
 43853 +  unsigned short     st_uid;
       
 43854 +  unsigned short     st_gid;
       
 43855 +  unsigned short     st_rdev;
       
 43856 +  short              pad2;
       
 43857 +  unsigned           st_size;
       
 43858 +  unsigned           st_blksize;
       
 43859 +  unsigned           st_blocks;
       
 43860 +  unsigned           st_atime_;
       
 43861 +  unsigned           st_atime_nsec_;
       
 43862 +  unsigned           st_mtime_;
       
 43863 +  unsigned           st_mtime_nsec_;
       
 43864 +  unsigned           st_ctime_;
       
 43865 +  unsigned           st_ctime_nsec_;
       
 43866 +  unsigned           __unused4;
       
 43867 +  unsigned           __unused5;
       
 43868 +};
       
 43869 +#elif defined(__x86_64__)
       
 43870 +struct kernel_stat {
       
 43871 +  unsigned long      st_dev;
       
 43872 +  unsigned long      st_ino;
       
 43873 +  unsigned long      st_nlink;
       
 43874 +  unsigned           st_mode;
       
 43875 +  unsigned           st_uid;
       
 43876 +  unsigned           st_gid;
       
 43877 +  unsigned           __pad0;
       
 43878 +  unsigned long      st_rdev;
       
 43879 +  long               st_size;
       
 43880 +  long               st_blksize;
       
 43881 +  long               st_blocks;
       
 43882 +  unsigned long      st_atime_;
       
 43883 +  unsigned long      st_atime_nsec_;
       
 43884 +  unsigned long      st_mtime_;
       
 43885 +  unsigned long      st_mtime_nsec_;
       
 43886 +  unsigned long      st_ctime_;
       
 43887 +  unsigned long      st_ctime_nsec_;
       
 43888 +  long               __unused[3];
       
 43889 +};
       
 43890 +#elif defined(__PPC__)
       
 43891 +struct kernel_stat {
       
 43892 +  unsigned           st_dev;
       
 43893 +  unsigned long      st_ino;      // ino_t
       
 43894 +  unsigned long      st_mode;     // mode_t
       
 43895 +  unsigned short     st_nlink;    // nlink_t
       
 43896 +  unsigned           st_uid;      // uid_t
       
 43897 +  unsigned           st_gid;      // gid_t
       
 43898 +  unsigned           st_rdev;
       
 43899 +  long               st_size;     // off_t
       
 43900 +  unsigned long      st_blksize;
       
 43901 +  unsigned long      st_blocks;
       
 43902 +  unsigned long      st_atime_;
       
 43903 +  unsigned long      st_atime_nsec_;
       
 43904 +  unsigned long      st_mtime_;
       
 43905 +  unsigned long      st_mtime_nsec_;
       
 43906 +  unsigned long      st_ctime_;
       
 43907 +  unsigned long      st_ctime_nsec_;
       
 43908 +  unsigned long      __unused4;
       
 43909 +  unsigned long      __unused5;
       
 43910 +};
       
 43911 +#elif (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64)
       
 43912 +struct kernel_stat {
       
 43913 +  unsigned           st_dev;
       
 43914 +  int                st_pad1[3];
       
 43915 +  unsigned           st_ino;
       
 43916 +  unsigned           st_mode;
       
 43917 +  unsigned           st_nlink;
       
 43918 +  unsigned           st_uid;
       
 43919 +  unsigned           st_gid;
       
 43920 +  unsigned           st_rdev;
       
 43921 +  int                st_pad2[2];
       
 43922 +  long               st_size;
       
 43923 +  int                st_pad3;
       
 43924 +  long               st_atime_;
       
 43925 +  long               st_atime_nsec_;
       
 43926 +  long               st_mtime_;
       
 43927 +  long               st_mtime_nsec_;
       
 43928 +  long               st_ctime_;
       
 43929 +  long               st_ctime_nsec_;
       
 43930 +  int                st_blksize;
       
 43931 +  int                st_blocks;
       
 43932 +  int                st_pad4[14];
       
 43933 +};
       
 43934 +#endif
       
 43935 +
       
 43936 +/* include/asm-{arm,i386,mips,x86_64,ppc}/statfs.h                           */
       
 43937 +#ifdef __mips__
       
 43938 +#if _MIPS_SIM != _MIPS_SIM_ABI64
       
 43939 +struct kernel_statfs64 {
       
 43940 +  unsigned long      f_type;
       
 43941 +  unsigned long      f_bsize;
       
 43942 +  unsigned long      f_frsize;
       
 43943 +  unsigned long      __pad;
       
 43944 +  unsigned long long f_blocks;
       
 43945 +  unsigned long long f_bfree;
       
 43946 +  unsigned long long f_files;
       
 43947 +  unsigned long long f_ffree;
       
 43948 +  unsigned long long f_bavail;
       
 43949 +  struct { int val[2]; } f_fsid;
       
 43950 +  unsigned long      f_namelen;
       
 43951 +  unsigned long      f_spare[6];
       
 43952 +};
       
 43953 +#endif
       
 43954 +#elif !defined(__x86_64__)
       
 43955 +struct kernel_statfs64 {
       
 43956 +  unsigned long      f_type;
       
 43957 +  unsigned long      f_bsize;
       
 43958 +  unsigned long long f_blocks;
       
 43959 +  unsigned long long f_bfree;
       
 43960 +  unsigned long long f_bavail;
       
 43961 +  unsigned long long f_files;
       
 43962 +  unsigned long long f_ffree;
       
 43963 +  struct { int val[2]; } f_fsid;
       
 43964 +  unsigned long      f_namelen;
       
 43965 +  unsigned long      f_frsize;
       
 43966 +  unsigned long      f_spare[5];
       
 43967 +};
       
 43968 +#endif
       
 43969 +
       
 43970 +/* include/asm-{arm,i386,mips,x86_64,ppc,generic}/statfs.h                   */
       
 43971 +#ifdef __mips__
       
 43972 +struct kernel_statfs {
       
 43973 +  long               f_type;
       
 43974 +  long               f_bsize;
       
 43975 +  long               f_frsize;
       
 43976 +  long               f_blocks;
       
 43977 +  long               f_bfree;
       
 43978 +  long               f_files;
       
 43979 +  long               f_ffree;
       
 43980 +  long               f_bavail;
       
 43981 +  struct { int val[2]; } f_fsid;
       
 43982 +  long               f_namelen;
       
 43983 +  long               f_spare[6];
       
 43984 +};
       
 43985 +#else
       
 43986 +struct kernel_statfs {
       
 43987 +  /* x86_64 actually defines all these fields as signed, whereas all other  */
       
 43988 +  /* platforms define them as unsigned. Leaving them at unsigned should not */
       
 43989 +  /* cause any problems.                                                    */
       
 43990 +  unsigned long      f_type;
       
 43991 +  unsigned long      f_bsize;
       
 43992 +  unsigned long      f_blocks;
       
 43993 +  unsigned long      f_bfree;
       
 43994 +  unsigned long      f_bavail;
       
 43995 +  unsigned long      f_files;
       
 43996 +  unsigned long      f_ffree;
       
 43997 +  struct { int val[2]; } f_fsid;
       
 43998 +  unsigned long      f_namelen;
       
 43999 +  unsigned long      f_frsize;
       
 44000 +  unsigned long      f_spare[5];
       
 44001 +};
       
 44002 +#endif
       
 44003 +
       
 44004 +
       
 44005 +/* Definitions missing from the standard header files                        */
       
 44006 +#ifndef O_DIRECTORY
       
 44007 +#if defined(__ARM_ARCH_3__)
       
 44008 +#define O_DIRECTORY             0040000
       
 44009 +#else
       
 44010 +#define O_DIRECTORY             0200000
       
 44011 +#endif
       
 44012 +#endif
       
 44013 +#ifndef NT_PRXFPREG
       
 44014 +#define NT_PRXFPREG             0x46e62b7f
       
 44015 +#endif
       
 44016 +#ifndef PTRACE_GETFPXREGS
       
 44017 +#define PTRACE_GETFPXREGS       ((enum __ptrace_request)18)
       
 44018 +#endif
       
 44019 +#ifndef PR_GET_DUMPABLE
       
 44020 +#define PR_GET_DUMPABLE         3
       
 44021 +#endif
       
 44022 +#ifndef PR_SET_DUMPABLE
       
 44023 +#define PR_SET_DUMPABLE         4
       
 44024 +#endif
       
 44025 +#ifndef AT_FDCWD
       
 44026 +#define AT_FDCWD                (-100)
       
 44027 +#endif
       
 44028 +#ifndef AT_SYMLINK_NOFOLLOW
       
 44029 +#define AT_SYMLINK_NOFOLLOW     0x100
       
 44030 +#endif
       
 44031 +#ifndef AT_REMOVEDIR
       
 44032 +#define AT_REMOVEDIR            0x200
       
 44033 +#endif
       
 44034 +#ifndef MREMAP_FIXED
       
 44035 +#define MREMAP_FIXED            2
       
 44036 +#endif
       
 44037 +#ifndef SA_RESTORER
       
 44038 +#define SA_RESTORER             0x04000000
       
 44039 +#endif
       
 44040 +
       
 44041 +#if defined(__i386__)
       
 44042 +#ifndef __NR_setresuid
       
 44043 +#define __NR_setresuid          164
       
 44044 +#define __NR_setresgid          170
       
 44045 +#endif
       
 44046 +#ifndef __NR_rt_sigaction
       
 44047 +#define __NR_rt_sigaction       174
       
 44048 +#define __NR_rt_sigprocmask     175
       
 44049 +#define __NR_rt_sigpending      176
       
 44050 +#define __NR_rt_sigsuspend      179
       
 44051 +#endif
       
 44052 +#ifndef __NR_pread64
       
 44053 +#define __NR_pread64            180
       
 44054 +#endif
       
 44055 +#ifndef __NR_pwrite64
       
 44056 +#define __NR_pwrite64           181
       
 44057 +#endif
       
 44058 +#ifndef __NR_ugetrlimit
       
 44059 +#define __NR_ugetrlimit         191
       
 44060 +#endif
       
 44061 +#ifndef __NR_stat64
       
 44062 +#define __NR_stat64             195
       
 44063 +#endif
       
 44064 +#ifndef __NR_fstat64
       
 44065 +#define __NR_fstat64            197
       
 44066 +#endif
       
 44067 +#ifndef __NR_setresuid32
       
 44068 +#define __NR_setresuid32        208
       
 44069 +#define __NR_setresgid32        210
       
 44070 +#endif
       
 44071 +#ifndef __NR_setfsuid32
       
 44072 +#define __NR_setfsuid32         215
       
 44073 +#define __NR_setfsgid32         216
       
 44074 +#endif
       
 44075 +#ifndef __NR_getdents64
       
 44076 +#define __NR_getdents64         220
       
 44077 +#endif
       
 44078 +#ifndef __NR_gettid
       
 44079 +#define __NR_gettid             224
       
 44080 +#endif
       
 44081 +#ifndef __NR_readahead
       
 44082 +#define __NR_readahead          225
       
 44083 +#endif
       
 44084 +#ifndef __NR_setxattr
       
 44085 +#define __NR_setxattr           226
       
 44086 +#endif
       
 44087 +#ifndef __NR_lsetxattr
       
 44088 +#define __NR_lsetxattr          227
       
 44089 +#endif
       
 44090 +#ifndef __NR_getxattr
       
 44091 +#define __NR_getxattr           229
       
 44092 +#endif
       
 44093 +#ifndef __NR_lgetxattr
       
 44094 +#define __NR_lgetxattr          230
       
 44095 +#endif
       
 44096 +#ifndef __NR_futex
       
 44097 +#define __NR_futex              240
       
 44098 +#endif
       
 44099 +#ifndef __NR_sched_setaffinity
       
 44100 +#define __NR_sched_setaffinity  241
       
 44101 +#define __NR_sched_getaffinity  242
       
 44102 +#endif
       
 44103 +#ifndef __NR_set_tid_address
       
 44104 +#define __NR_set_tid_address    258
       
 44105 +#endif
       
 44106 +#ifndef __NR_statfs64
       
 44107 +#define __NR_statfs64           268
       
 44108 +#endif
       
 44109 +#ifndef __NR_fstatfs64
       
 44110 +#define __NR_fstatfs64          269
       
 44111 +#endif
       
 44112 +#ifndef __NR_fadvise64_64
       
 44113 +#define __NR_fadvise64_64       272
       
 44114 +#endif
       
 44115 +#ifndef __NR_openat
       
 44116 +#define __NR_openat             295
       
 44117 +#endif
       
 44118 +#ifndef __NR_fstatat64
       
 44119 +#define __NR_fstatat64          300
       
 44120 +#endif
       
 44121 +#ifndef __NR_unlinkat
       
 44122 +#define __NR_unlinkat           301
       
 44123 +#endif
       
 44124 +#ifndef __NR_move_pages
       
 44125 +#define __NR_move_pages         317
       
 44126 +#endif
       
 44127 +/* End of i386 definitions                                                   */
       
 44128 +#elif defined(__ARM_ARCH_3__)
       
 44129 +#ifndef __NR_setresuid
       
 44130 +#define __NR_setresuid          (__NR_SYSCALL_BASE + 164)
       
 44131 +#define __NR_setresgid          (__NR_SYSCALL_BASE + 170)
       
 44132 +#endif
       
 44133 +#ifndef __NR_rt_sigaction
       
 44134 +#define __NR_rt_sigaction       (__NR_SYSCALL_BASE + 174)
       
 44135 +#define __NR_rt_sigprocmask     (__NR_SYSCALL_BASE + 175)
       
 44136 +#define __NR_rt_sigpending      (__NR_SYSCALL_BASE + 176)
       
 44137 +#define __NR_rt_sigsuspend      (__NR_SYSCALL_BASE + 179)
       
 44138 +#endif
       
 44139 +#ifndef __NR_pread64
       
 44140 +#define __NR_pread64            (__NR_SYSCALL_BASE + 180)
       
 44141 +#endif
       
 44142 +#ifndef __NR_pwrite64
       
 44143 +#define __NR_pwrite64           (__NR_SYSCALL_BASE + 181)
       
 44144 +#endif
       
 44145 +#ifndef __NR_ugetrlimit
       
 44146 +#define __NR_ugetrlimit         (__NR_SYSCALL_BASE + 191)
       
 44147 +#endif
       
 44148 +#ifndef __NR_stat64
       
 44149 +#define __NR_stat64             (__NR_SYSCALL_BASE + 195)
       
 44150 +#endif
       
 44151 +#ifndef __NR_fstat64
       
 44152 +#define __NR_fstat64            (__NR_SYSCALL_BASE + 197)
       
 44153 +#endif
       
 44154 +#ifndef __NR_setresuid32
       
 44155 +#define __NR_setresuid32        (__NR_SYSCALL_BASE + 208)
       
 44156 +#define __NR_setresgid32        (__NR_SYSCALL_BASE + 210)
       
 44157 +#endif
       
 44158 +#ifndef __NR_setfsuid32
       
 44159 +#define __NR_setfsuid32         (__NR_SYSCALL_BASE + 215)
       
 44160 +#define __NR_setfsgid32         (__NR_SYSCALL_BASE + 216)
       
 44161 +#endif
       
 44162 +#ifndef __NR_getdents64
       
 44163 +#define __NR_getdents64         (__NR_SYSCALL_BASE + 217)
       
 44164 +#endif
       
 44165 +#ifndef __NR_gettid
       
 44166 +#define __NR_gettid             (__NR_SYSCALL_BASE + 224)
       
 44167 +#endif
       
 44168 +#ifndef __NR_readahead
       
 44169 +#define __NR_readahead          (__NR_SYSCALL_BASE + 225)
       
 44170 +#endif
       
 44171 +#ifndef __NR_setxattr
       
 44172 +#define __NR_setxattr           (__NR_SYSCALL_BASE + 226)
       
 44173 +#endif
       
 44174 +#ifndef __NR_lsetxattr
       
 44175 +#define __NR_lsetxattr          (__NR_SYSCALL_BASE + 227)
       
 44176 +#endif
       
 44177 +#ifndef __NR_getxattr
       
 44178 +#define __NR_getxattr           (__NR_SYSCALL_BASE + 229)
       
 44179 +#endif
       
 44180 +#ifndef __NR_lgetxattr
       
 44181 +#define __NR_lgetxattr          (__NR_SYSCALL_BASE + 230)
       
 44182 +#endif
       
 44183 +#ifndef __NR_futex
       
 44184 +#define __NR_futex              (__NR_SYSCALL_BASE + 240)
       
 44185 +#endif
       
 44186 +#ifndef __NR_sched_setaffinity
       
 44187 +#define __NR_sched_setaffinity  (__NR_SYSCALL_BASE + 241)
       
 44188 +#define __NR_sched_getaffinity  (__NR_SYSCALL_BASE + 242)
       
 44189 +#endif
       
 44190 +#ifndef __NR_set_tid_address
       
 44191 +#define __NR_set_tid_address    (__NR_SYSCALL_BASE + 256)
       
 44192 +#endif
       
 44193 +#ifndef __NR_statfs64
       
 44194 +#define __NR_statfs64           (__NR_SYSCALL_BASE + 266)
       
 44195 +#endif
       
 44196 +#ifndef __NR_fstatfs64
       
 44197 +#define __NR_fstatfs64          (__NR_SYSCALL_BASE + 267)
       
 44198 +#endif
       
 44199 +#ifndef __NR_move_pages
       
 44200 +#define __NR_move_pages         (__NR_SYSCALL_BASE + 344)
       
 44201 +#endif
       
 44202 +/* End of ARM 3 definitions                                                  */
       
 44203 +#elif defined(__x86_64__)
       
 44204 +#ifndef __NR_setresuid
       
 44205 +#define __NR_setresuid          117
       
 44206 +#define __NR_setresgid          119
       
 44207 +#endif
       
 44208 +#ifndef __NR_gettid
       
 44209 +#define __NR_gettid             186
       
 44210 +#endif
       
 44211 +#ifndef __NR_readahead
       
 44212 +#define __NR_readahead          187
       
 44213 +#endif
       
 44214 +#ifndef __NR_setxattr
       
 44215 +#define __NR_setxattr           188
       
 44216 +#endif
       
 44217 +#ifndef __NR_lsetxattr
       
 44218 +#define __NR_lsetxattr          189
       
 44219 +#endif
       
 44220 +#ifndef __NR_getxattr
       
 44221 +#define __NR_getxattr           191
       
 44222 +#endif
       
 44223 +#ifndef __NR_lgetxattr
       
 44224 +#define __NR_lgetxattr          192
       
 44225 +#endif
       
 44226 +#ifndef __NR_futex
       
 44227 +#define __NR_futex              202
       
 44228 +#endif
       
 44229 +#ifndef __NR_sched_setaffinity
       
 44230 +#define __NR_sched_setaffinity  203
       
 44231 +#define __NR_sched_getaffinity  204
       
 44232 +#endif
       
 44233 +#ifndef __NR_getdents64
       
 44234 +#define __NR_getdents64         217
       
 44235 +#endif
       
 44236 +#ifndef __NR_set_tid_address
       
 44237 +#define __NR_set_tid_address    218
       
 44238 +#endif
       
 44239 +#ifndef __NR_fadvise64
       
 44240 +#define __NR_fadvise64          221
       
 44241 +#endif
       
 44242 +#ifndef __NR_openat
       
 44243 +#define __NR_openat             257
       
 44244 +#endif
       
 44245 +#ifndef __NR_newfstatat
       
 44246 +#define __NR_newfstatat         262
       
 44247 +#endif
       
 44248 +#ifndef __NR_unlinkat
       
 44249 +#define __NR_unlinkat           263
       
 44250 +#endif
       
 44251 +#ifndef __NR_move_pages
       
 44252 +#define __NR_move_pages         279
       
 44253 +#endif
       
 44254 +/* End of x86-64 definitions                                                 */
       
 44255 +#elif defined(__mips__)
       
 44256 +#if _MIPS_SIM == _MIPS_SIM_ABI32
       
 44257 +#ifndef __NR_setresuid
       
 44258 +#define __NR_setresuid          (__NR_Linux + 185)
       
 44259 +#define __NR_setresgid          (__NR_Linux + 190)
       
 44260 +#endif
       
 44261 +#ifndef __NR_rt_sigaction
       
 44262 +#define __NR_rt_sigaction       (__NR_Linux + 194)
       
 44263 +#define __NR_rt_sigprocmask     (__NR_Linux + 195)
       
 44264 +#define __NR_rt_sigpending      (__NR_Linux + 196)
       
 44265 +#define __NR_rt_sigsuspend      (__NR_Linux + 199)
       
 44266 +#endif
       
 44267 +#ifndef __NR_pread64
       
 44268 +#define __NR_pread64            (__NR_Linux + 200)
       
 44269 +#endif
       
 44270 +#ifndef __NR_pwrite64
       
 44271 +#define __NR_pwrite64           (__NR_Linux + 201)
       
 44272 +#endif
       
 44273 +#ifndef __NR_stat64
       
 44274 +#define __NR_stat64             (__NR_Linux + 213)
       
 44275 +#endif
       
 44276 +#ifndef __NR_fstat64
       
 44277 +#define __NR_fstat64            (__NR_Linux + 215)
       
 44278 +#endif
       
 44279 +#ifndef __NR_getdents64
       
 44280 +#define __NR_getdents64         (__NR_Linux + 219)
       
 44281 +#endif
       
 44282 +#ifndef __NR_gettid
       
 44283 +#define __NR_gettid             (__NR_Linux + 222)
       
 44284 +#endif
       
 44285 +#ifndef __NR_readahead
       
 44286 +#define __NR_readahead          (__NR_Linux + 223)
       
 44287 +#endif
       
 44288 +#ifndef __NR_setxattr
       
 44289 +#define __NR_setxattr           (__NR_Linux + 224)
       
 44290 +#endif
       
 44291 +#ifndef __NR_lsetxattr
       
 44292 +#define __NR_lsetxattr          (__NR_Linux + 225)
       
 44293 +#endif
       
 44294 +#ifndef __NR_getxattr
       
 44295 +#define __NR_getxattr           (__NR_Linux + 227)
       
 44296 +#endif
       
 44297 +#ifndef __NR_lgetxattr
       
 44298 +#define __NR_lgetxattr          (__NR_Linux + 228)
       
 44299 +#endif
       
 44300 +#ifndef __NR_futex
       
 44301 +#define __NR_futex              (__NR_Linux + 238)
       
 44302 +#endif
       
 44303 +#ifndef __NR_sched_setaffinity
       
 44304 +#define __NR_sched_setaffinity  (__NR_Linux + 239)
       
 44305 +#define __NR_sched_getaffinity  (__NR_Linux + 240)
       
 44306 +#endif
       
 44307 +#ifndef __NR_set_tid_address
       
 44308 +#define __NR_set_tid_address    (__NR_Linux + 252)
       
 44309 +#endif
       
 44310 +#ifndef __NR_statfs64
       
 44311 +#define __NR_statfs64           (__NR_Linux + 255)
       
 44312 +#endif
       
 44313 +#ifndef __NR_fstatfs64
       
 44314 +#define __NR_fstatfs64          (__NR_Linux + 256)
       
 44315 +#endif
       
 44316 +#ifndef __NR_openat
       
 44317 +#define __NR_openat             (__NR_Linux + 288)
       
 44318 +#endif
       
 44319 +#ifndef __NR_fstatat
       
 44320 +#define __NR_fstatat            (__NR_Linux + 293)
       
 44321 +#endif
       
 44322 +#ifndef __NR_unlinkat
       
 44323 +#define __NR_unlinkat           (__NR_Linux + 294)
       
 44324 +#endif
       
 44325 +#ifndef __NR_move_pages
       
 44326 +#define __NR_move_pages         (__NR_Linux + 308)
       
 44327 +#endif
       
 44328 +/* End of MIPS (old 32bit API) definitions */
       
 44329 +#elif  _MIPS_SIM == _MIPS_SIM_ABI64
       
 44330 +#ifndef __NR_setresuid
       
 44331 +#define __NR_setresuid          (__NR_Linux + 115)
       
 44332 +#define __NR_setresgid          (__NR_Linux + 117)
       
 44333 +#endif
       
 44334 +#ifndef __NR_gettid
       
 44335 +#define __NR_gettid             (__NR_Linux + 178)
       
 44336 +#endif
       
 44337 +#ifndef __NR_readahead
       
 44338 +#define __NR_readahead          (__NR_Linux + 179)
       
 44339 +#endif
       
 44340 +#ifndef __NR_setxattr
       
 44341 +#define __NR_setxattr           (__NR_Linux + 180)
       
 44342 +#endif
       
 44343 +#ifndef __NR_lsetxattr
       
 44344 +#define __NR_lsetxattr          (__NR_Linux + 181)
       
 44345 +#endif
       
 44346 +#ifndef __NR_getxattr
       
 44347 +#define __NR_getxattr           (__NR_Linux + 183)
       
 44348 +#endif
       
 44349 +#ifndef __NR_lgetxattr
       
 44350 +#define __NR_lgetxattr          (__NR_Linux + 184)
       
 44351 +#endif
       
 44352 +#ifndef __NR_futex
       
 44353 +#define __NR_futex              (__NR_Linux + 194)
       
 44354 +#endif
       
 44355 +#ifndef __NR_sched_setaffinity
       
 44356 +#define __NR_sched_setaffinity  (__NR_Linux + 195)
       
 44357 +#define __NR_sched_getaffinity  (__NR_Linux + 196)
       
 44358 +#endif
       
 44359 +#ifndef __NR_set_tid_address
       
 44360 +#define __NR_set_tid_address    (__NR_Linux + 212)
       
 44361 +#endif
       
 44362 +#ifndef __NR_openat
       
 44363 +#define __NR_openat             (__NR_Linux + 247)
       
 44364 +#endif
       
 44365 +#ifndef __NR_fstatat
       
 44366 +#define __NR_fstatat            (__NR_Linux + 252)
       
 44367 +#endif
       
 44368 +#ifndef __NR_unlinkat
       
 44369 +#define __NR_unlinkat           (__NR_Linux + 253)
       
 44370 +#endif
       
 44371 +#ifndef __NR_move_pages
       
 44372 +#define __NR_move_pages         (__NR_Linux + 267)
       
 44373 +#endif
       
 44374 +/* End of MIPS (64bit API) definitions */
       
 44375 +#else
       
 44376 +#ifndef __NR_setresuid
       
 44377 +#define __NR_setresuid          (__NR_Linux + 115)
       
 44378 +#define __NR_setresgid          (__NR_Linux + 117)
       
 44379 +#endif
       
 44380 +#ifndef __NR_gettid
       
 44381 +#define __NR_gettid             (__NR_Linux + 178)
       
 44382 +#endif
       
 44383 +#ifndef __NR_readahead
       
 44384 +#define __NR_readahead          (__NR_Linux + 179)
       
 44385 +#endif
       
 44386 +#ifndef __NR_setxattr
       
 44387 +#define __NR_setxattr           (__NR_Linux + 180)
       
 44388 +#endif
       
 44389 +#ifndef __NR_lsetxattr
       
 44390 +#define __NR_lsetxattr          (__NR_Linux + 181)
       
 44391 +#endif
       
 44392 +#ifndef __NR_getxattr
       
 44393 +#define __NR_getxattr           (__NR_Linux + 183)
       
 44394 +#endif
       
 44395 +#ifndef __NR_lgetxattr
       
 44396 +#define __NR_lgetxattr          (__NR_Linux + 184)
       
 44397 +#endif
       
 44398 +#ifndef __NR_futex
       
 44399 +#define __NR_futex              (__NR_Linux + 194)
       
 44400 +#endif
       
 44401 +#ifndef __NR_sched_setaffinity
       
 44402 +#define __NR_sched_setaffinity  (__NR_Linux + 195)
       
 44403 +#define __NR_sched_getaffinity  (__NR_Linux + 196)
       
 44404 +#endif
       
 44405 +#ifndef __NR_set_tid_address
       
 44406 +#define __NR_set_tid_address    (__NR_Linux + 213)
       
 44407 +#endif
       
 44408 +#ifndef __NR_statfs64
       
 44409 +#define __NR_statfs64           (__NR_Linux + 217)
       
 44410 +#endif
       
 44411 +#ifndef __NR_fstatfs64
       
 44412 +#define __NR_fstatfs64          (__NR_Linux + 218)
       
 44413 +#endif
       
 44414 +#ifndef __NR_openat
       
 44415 +#define __NR_openat             (__NR_Linux + 251)
       
 44416 +#endif
       
 44417 +#ifndef __NR_fstatat
       
 44418 +#define __NR_fstatat            (__NR_Linux + 256)
       
 44419 +#endif
       
 44420 +#ifndef __NR_unlinkat
       
 44421 +#define __NR_unlinkat           (__NR_Linux + 257)
       
 44422 +#endif
       
 44423 +#ifndef __NR_move_pages
       
 44424 +#define __NR_move_pages         (__NR_Linux + 271)
       
 44425 +#endif
       
 44426 +/* End of MIPS (new 32bit API) definitions                                   */
       
 44427 +#endif
       
 44428 +/* End of MIPS definitions                                                   */
       
 44429 +#elif defined(__PPC__)
       
 44430 +#ifndef __NR_setfsuid
       
 44431 +#define __NR_setfsuid           138
       
 44432 +#define __NR_setfsgid           139
       
 44433 +#endif
       
 44434 +#ifndef __NR_setresuid
       
 44435 +#define __NR_setresuid          164
       
 44436 +#define __NR_setresgid          169
       
 44437 +#endif
       
 44438 +#ifndef __NR_rt_sigaction
       
 44439 +#define __NR_rt_sigaction       173
       
 44440 +#define __NR_rt_sigprocmask     174
       
 44441 +#define __NR_rt_sigpending      175
       
 44442 +#define __NR_rt_sigsuspend      178
       
 44443 +#endif
       
 44444 +#ifndef __NR_pread64
       
 44445 +#define __NR_pread64            179
       
 44446 +#endif
       
 44447 +#ifndef __NR_pwrite64
       
 44448 +#define __NR_pwrite64           180
       
 44449 +#endif
       
 44450 +#ifndef __NR_ugetrlimit
       
 44451 +#define __NR_ugetrlimit         190
       
 44452 +#endif
       
 44453 +#ifndef __NR_readahead
       
 44454 +#define __NR_readahead          191
       
 44455 +#endif
       
 44456 +#ifndef __NR_stat64
       
 44457 +#define __NR_stat64             195
       
 44458 +#endif
       
 44459 +#ifndef __NR_fstat64
       
 44460 +#define __NR_fstat64            197
       
 44461 +#endif
       
 44462 +#ifndef __NR_getdents64
       
 44463 +#define __NR_getdents64         202
       
 44464 +#endif
       
 44465 +#ifndef __NR_gettid
       
 44466 +#define __NR_gettid             207
       
 44467 +#endif
       
 44468 +#ifndef __NR_setxattr
       
 44469 +#define __NR_setxattr           209
       
 44470 +#endif
       
 44471 +#ifndef __NR_lsetxattr
       
 44472 +#define __NR_lsetxattr          210
       
 44473 +#endif
       
 44474 +#ifndef __NR_getxattr
       
 44475 +#define __NR_getxattr           212
       
 44476 +#endif
       
 44477 +#ifndef __NR_lgetxattr
       
 44478 +#define __NR_lgetxattr          213
       
 44479 +#endif
       
 44480 +#ifndef __NR_futex
       
 44481 +#define __NR_futex              221
       
 44482 +#endif
       
 44483 +#ifndef __NR_sched_setaffinity
       
 44484 +#define __NR_sched_setaffinity  222
       
 44485 +#define __NR_sched_getaffinity  223
       
 44486 +#endif
       
 44487 +#ifndef __NR_set_tid_address
       
 44488 +#define __NR_set_tid_address    232
       
 44489 +#endif
       
 44490 +#ifndef __NR_statfs64
       
 44491 +#define __NR_statfs64           252
       
 44492 +#endif
       
 44493 +#ifndef __NR_fstatfs64
       
 44494 +#define __NR_fstatfs64          253
       
 44495 +#endif
       
 44496 +#ifndef __NR_fadvise64_64
       
 44497 +#define __NR_fadvise64_64       254
       
 44498 +#endif
       
 44499 +#ifndef __NR_openat
       
 44500 +#define __NR_openat             286
       
 44501 +#endif
       
 44502 +#ifndef __NR_fstatat64
       
 44503 +#define __NR_fstatat64          291
       
 44504 +#endif
       
 44505 +#ifndef __NR_unlinkat
       
 44506 +#define __NR_unlinkat           292
       
 44507 +#endif
       
 44508 +#ifndef __NR_move_pages
       
 44509 +#define __NR_move_pages         301
       
 44510 +#endif
       
 44511 +/* End of powerpc defininitions                                              */
       
 44512 +#endif
       
 44513 +
       
 44514 +
       
 44515 +/* After forking, we must make sure to only call system calls.               */
       
 44516 +#if __BOUNDED_POINTERS__
       
 44517 +  #error "Need to port invocations of syscalls for bounded ptrs"
       
 44518 +#else
       
 44519 +  /* The core dumper and the thread lister get executed after threads
       
 44520 +   * have been suspended. As a consequence, we cannot call any functions
       
 44521 +   * that acquire locks. Unfortunately, libc wraps most system calls
       
 44522 +   * (e.g. in order to implement pthread_atfork, and to make calls
       
 44523 +   * cancellable), which means we cannot call these functions. Instead,
       
 44524 +   * we have to call syscall() directly.
       
 44525 +   */
       
 44526 +  #undef LSS_ERRNO
       
 44527 +  #ifdef SYS_ERRNO
       
 44528 +    /* Allow the including file to override the location of errno. This can
       
 44529 +     * be useful when using clone() with the CLONE_VM option.
       
 44530 +     */
       
 44531 +    #define LSS_ERRNO SYS_ERRNO
       
 44532 +  #else
       
 44533 +    #define LSS_ERRNO errno
       
 44534 +  #endif
       
 44535 +
       
 44536 +  #undef LSS_INLINE
       
 44537 +  #ifdef SYS_INLINE
       
 44538 +    #define LSS_INLINE SYS_INLINE
       
 44539 +  #else
       
 44540 +    #define LSS_INLINE static inline
       
 44541 +  #endif
       
 44542 +
       
 44543 +  /* Allow the including file to override the prefix used for all new
       
 44544 +   * system calls. By default, it will be set to "sys_".
       
 44545 +   */
       
 44546 +  #undef LSS_NAME
       
 44547 +  #ifndef SYS_PREFIX
       
 44548 +    #define LSS_NAME(name) sys_##name
       
 44549 +  #elif SYS_PREFIX < 0
       
 44550 +    #define LSS_NAME(name) name
       
 44551 +  #elif SYS_PREFIX == 0
       
 44552 +    #define LSS_NAME(name) sys0_##name
       
 44553 +  #elif SYS_PREFIX == 1
       
 44554 +    #define LSS_NAME(name) sys1_##name
       
 44555 +  #elif SYS_PREFIX == 2
       
 44556 +    #define LSS_NAME(name) sys2_##name
       
 44557 +  #elif SYS_PREFIX == 3
       
 44558 +    #define LSS_NAME(name) sys3_##name
       
 44559 +  #elif SYS_PREFIX == 4
       
 44560 +    #define LSS_NAME(name) sys4_##name
       
 44561 +  #elif SYS_PREFIX == 5
       
 44562 +    #define LSS_NAME(name) sys5_##name
       
 44563 +  #elif SYS_PREFIX == 6
       
 44564 +    #define LSS_NAME(name) sys6_##name
       
 44565 +  #elif SYS_PREFIX == 7
       
 44566 +    #define LSS_NAME(name) sys7_##name
       
 44567 +  #elif SYS_PREFIX == 8
       
 44568 +    #define LSS_NAME(name) sys8_##name
       
 44569 +  #elif SYS_PREFIX == 9
       
 44570 +    #define LSS_NAME(name) sys9_##name
       
 44571 +  #endif
       
 44572 +
       
 44573 +  #undef  LSS_RETURN
       
 44574 +  #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__))
       
 44575 +  /* Failing system calls return a negative result in the range of
       
 44576 +   * -1..-4095. These are "errno" values with the sign inverted.
       
 44577 +   */
       
 44578 +  #define LSS_RETURN(type, res)                                               \
       
 44579 +    do {                                                                      \
       
 44580 +      if ((unsigned long)(res) >= (unsigned long)(-4095)) {                   \
       
 44581 +        LSS_ERRNO = -(res);                                                   \
       
 44582 +        res = -1;                                                             \
       
 44583 +      }                                                                       \
       
 44584 +      return (type) (res);                                                    \
       
 44585 +    } while (0)
       
 44586 +  #elif defined(__mips__)
       
 44587 +  /* On MIPS, failing system calls return -1, and set errno in a
       
 44588 +   * separate CPU register.
       
 44589 +   */
       
 44590 +  #define LSS_RETURN(type, res, err)                                          \
       
 44591 +    do {                                                                      \
       
 44592 +      if (err) {                                                              \
       
 44593 +        LSS_ERRNO = (res);                                                    \
       
 44594 +        res = -1;                                                             \
       
 44595 +      }                                                                       \
       
 44596 +      return (type) (res);                                                    \
       
 44597 +    } while (0)
       
 44598 +  #elif defined(__PPC__)
       
 44599 +  /* On PPC, failing system calls return -1, and set errno in a
       
 44600 +   * separate CPU register. See linux/unistd.h.
       
 44601 +   */
       
 44602 +  #define LSS_RETURN(type, res, err)                                          \
       
 44603 +   do {                                                                       \
       
 44604 +     if (err & 0x10000000 ) {                                                 \
       
 44605 +       LSS_ERRNO = (res);                                                     \
       
 44606 +       res = -1;                                                              \
       
 44607 +     }                                                                        \
       
 44608 +     return (type) (res);                                                     \
       
 44609 +   } while (0)
       
 44610 +  #endif
       
 44611 +  #if defined(__i386__)
       
 44612 +    /* In PIC mode (e.g. when building shared libraries), gcc for i386
       
 44613 +     * reserves ebx. Unfortunately, most distribution ship with implementations
       
 44614 +     * of _syscallX() which clobber ebx.
       
 44615 +     * Also, most definitions of _syscallX() neglect to mark "memory" as being
       
 44616 +     * clobbered. This causes problems with compilers, that do a better job
       
 44617 +     * at optimizing across __asm__ calls.
       
 44618 +     * So, we just have to redefine all of the _syscallX() macros.
       
 44619 +     */
       
 44620 +    #undef  LSS_BODY
       
 44621 +    #define LSS_BODY(type,args...)                                            \
       
 44622 +      long __res;                                                             \
       
 44623 +      __asm__ __volatile__("push %%ebx\n"                                     \
       
 44624 +                           "movl %2,%%ebx\n"                                  \
       
 44625 +                           "int $0x80\n"                                      \
       
 44626 +                           "pop %%ebx"                                        \
       
 44627 +                           args                                               \
       
 44628 +                           : "memory");                                       \
       
 44629 +      LSS_RETURN(type,__res)
       
 44630 +    #undef  _syscall0
       
 44631 +    #define _syscall0(type,name)                                              \
       
 44632 +      type LSS_NAME(name)(void) {                                             \
       
 44633 +        long __res;                                                           \
       
 44634 +        __asm__ volatile("int $0x80"                                          \
       
 44635 +                         : "=a" (__res)                                       \
       
 44636 +                         : "0" (__NR_##name)                                  \
       
 44637 +                         : "memory");                                         \
       
 44638 +        LSS_RETURN(type,__res);                                               \
       
 44639 +      }
       
 44640 +    #undef  _syscall1
       
 44641 +    #define _syscall1(type,name,type1,arg1)                                   \
       
 44642 +      type LSS_NAME(name)(type1 arg1) {                                       \
       
 44643 +        LSS_BODY(type,                                                        \
       
 44644 +             : "=a" (__res)                                                   \
       
 44645 +             : "0" (__NR_##name), "ri" ((long)(arg1)));                       \
       
 44646 +      }
       
 44647 +    #undef  _syscall2
       
 44648 +    #define _syscall2(type,name,type1,arg1,type2,arg2)                        \
       
 44649 +      type LSS_NAME(name)(type1 arg1,type2 arg2) {                            \
       
 44650 +        LSS_BODY(type,                                                        \
       
 44651 +             : "=a" (__res)                                                   \
       
 44652 +             : "0" (__NR_##name),"ri" ((long)(arg1)), "c" ((long)(arg2)));    \
       
 44653 +      }
       
 44654 +    #undef  _syscall3
       
 44655 +    #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)             \
       
 44656 +      type LSS_NAME(name)(type1 arg1,type2 arg2,type3 arg3) {                 \
       
 44657 +        LSS_BODY(type,                                                        \
       
 44658 +             : "=a" (__res)                                                   \
       
 44659 +             : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)),    \
       
 44660 +               "d" ((long)(arg3)));                                           \
       
 44661 +      }
       
 44662 +    #undef  _syscall4
       
 44663 +    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \
       
 44664 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \
       
 44665 +        LSS_BODY(type,                                                        \
       
 44666 +             : "=a" (__res)                                                   \
       
 44667 +             : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)),    \
       
 44668 +               "d" ((long)(arg3)),"S" ((long)(arg4)));                        \
       
 44669 +      }
       
 44670 +    #undef  _syscall5
       
 44671 +    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 44672 +                      type5,arg5)                                             \
       
 44673 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 44674 +                          type5 arg5) {                                       \
       
 44675 +        long __res;                                                           \
       
 44676 +        __asm__ __volatile__("push %%ebx\n"                                   \
       
 44677 +                             "movl %2,%%ebx\n"                                \
       
 44678 +                             "movl %1,%%eax\n"                                \
       
 44679 +                             "int  $0x80\n"                                   \
       
 44680 +                             "pop  %%ebx"                                     \
       
 44681 +                             : "=a" (__res)                                   \
       
 44682 +                             : "i" (__NR_##name), "ri" ((long)(arg1)),        \
       
 44683 +                               "c" ((long)(arg2)), "d" ((long)(arg3)),        \
       
 44684 +                               "S" ((long)(arg4)), "D" ((long)(arg5))         \
       
 44685 +                             : "memory");                                     \
       
 44686 +        LSS_RETURN(type,__res);                                               \
       
 44687 +      }
       
 44688 +    #undef  _syscall6
       
 44689 +    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 44690 +                      type5,arg5,type6,arg6)                                  \
       
 44691 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 44692 +                          type5 arg5, type6 arg6) {                           \
       
 44693 +        long __res;                                                           \
       
 44694 +        struct { long __a1; long __a6; } __s = { (long)arg1, (long) arg6 };   \
       
 44695 +        __asm__ __volatile__("push %%ebp\n"                                   \
       
 44696 +                             "push %%ebx\n"                                   \
       
 44697 +                             "movl 4(%2),%%ebp\n"                             \
       
 44698 +                             "movl 0(%2), %%ebx\n"                            \
       
 44699 +                             "movl %1,%%eax\n"                                \
       
 44700 +                             "int  $0x80\n"                                   \
       
 44701 +                             "pop  %%ebx\n"                                   \
       
 44702 +                             "pop  %%ebp"                                     \
       
 44703 +                             : "=a" (__res)                                   \
       
 44704 +                             : "i" (__NR_##name),  "0" ((long)(&__s)),        \
       
 44705 +                               "c" ((long)(arg2)), "d" ((long)(arg3)),        \
       
 44706 +                               "S" ((long)(arg4)), "D" ((long)(arg5))         \
       
 44707 +                             : "memory");                                     \
       
 44708 +        LSS_RETURN(type,__res);                                               \
       
 44709 +      }
       
 44710 +    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
       
 44711 +                                   int flags, void *arg, int *parent_tidptr,
       
 44712 +                                   void *newtls, int *child_tidptr) {
       
 44713 +      long __res;
       
 44714 +      __asm__ __volatile__(/* if (fn == NULL)
       
 44715 +                            *   return -EINVAL;
       
 44716 +                            */
       
 44717 +                           "movl   %3,%%ecx\n"
       
 44718 +                           "jecxz  1f\n"
       
 44719 +
       
 44720 +                           /* if (child_stack == NULL)
       
 44721 +                            *   return -EINVAL;
       
 44722 +                            */
       
 44723 +                           "movl   %4,%%ecx\n"
       
 44724 +                           "jecxz  1f\n"
       
 44725 +
       
 44726 +                           /* Set up alignment of the child stack:
       
 44727 +                            * child_stack = (child_stack & ~0xF) - 20;
       
 44728 +                            */
       
 44729 +                           "andl   $-16,%%ecx\n"
       
 44730 +                           "subl   $20,%%ecx\n"
       
 44731 +
       
 44732 +                           /* Push "arg" and "fn" onto the stack that will be
       
 44733 +                            * used by the child.
       
 44734 +                            */
       
 44735 +                           "movl   %6,%%eax\n"
       
 44736 +                           "movl   %%eax,4(%%ecx)\n"
       
 44737 +                           "movl   %3,%%eax\n"
       
 44738 +                           "movl   %%eax,(%%ecx)\n"
       
 44739 +
       
 44740 +                           /* %eax = syscall(%eax = __NR_clone,
       
 44741 +                            *                %ebx = flags,
       
 44742 +                            *                %ecx = child_stack,
       
 44743 +                            *                %edx = parent_tidptr,
       
 44744 +                            *                %esi = newtls,
       
 44745 +                            *                %edi = child_tidptr)
       
 44746 +                            * Also, make sure that %ebx gets preserved as it is
       
 44747 +                            * used in PIC mode.
       
 44748 +                            */
       
 44749 +                           "movl   %8,%%esi\n"
       
 44750 +                           "movl   %7,%%edx\n"
       
 44751 +                           "movl   %5,%%eax\n"
       
 44752 +                           "movl   %9,%%edi\n"
       
 44753 +                           "pushl  %%ebx\n"
       
 44754 +                           "movl   %%eax,%%ebx\n"
       
 44755 +                           "movl   %2,%%eax\n"
       
 44756 +                           "int    $0x80\n"
       
 44757 +
       
 44758 +                           /* In the parent: restore %ebx
       
 44759 +                            * In the child:  move "fn" into %ebx
       
 44760 +                            */
       
 44761 +                           "popl   %%ebx\n"
       
 44762 +
       
 44763 +                           /* if (%eax != 0)
       
 44764 +                            *   return %eax;
       
 44765 +                            */
       
 44766 +                           "test   %%eax,%%eax\n"
       
 44767 +                           "jnz    1f\n"
       
 44768 +
       
 44769 +                           /* In the child, now. Terminate frame pointer chain.
       
 44770 +                            */
       
 44771 +                           "movl   $0,%%ebp\n"
       
 44772 +
       
 44773 +                           /* Call "fn". "arg" is already on the stack.
       
 44774 +                            */
       
 44775 +                           "call   *%%ebx\n"
       
 44776 +
       
 44777 +                           /* Call _exit(%ebx). Unfortunately older versions
       
 44778 +                            * of gcc restrict the number of arguments that can
       
 44779 +                            * be passed to asm(). So, we need to hard-code the
       
 44780 +                            * system call number.
       
 44781 +                            */
       
 44782 +                           "movl   %%eax,%%ebx\n"
       
 44783 +                           "movl   $1,%%eax\n"
       
 44784 +                           "int    $0x80\n"
       
 44785 +
       
 44786 +                           /* Return to parent.
       
 44787 +                            */
       
 44788 +                         "1:\n"
       
 44789 +                           : "=a" (__res)
       
 44790 +                           : "0"(-EINVAL), "i"(__NR_clone),
       
 44791 +                             "m"(fn), "m"(child_stack), "m"(flags), "m"(arg),
       
 44792 +                             "m"(parent_tidptr), "m"(newtls), "m"(child_tidptr)
       
 44793 +                           : "memory", "ecx", "edx", "esi", "edi");
       
 44794 +      LSS_RETURN(int, __res);
       
 44795 +    }
       
 44796 +
       
 44797 +    #define __NR__fadvise64_64 __NR_fadvise64_64
       
 44798 +    LSS_INLINE _syscall6(int, _fadvise64_64, int, fd,
       
 44799 +                         unsigned, offset_lo, unsigned, offset_hi,
       
 44800 +                         unsigned, len_lo, unsigned, len_hi,
       
 44801 +                         int, advice)
       
 44802 +
       
 44803 +    LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset,
       
 44804 +                                       loff_t len, int advice) {
       
 44805 +      return LSS_NAME(_fadvise64_64)(fd,
       
 44806 +                                     (unsigned)offset, (unsigned)(offset >>32),
       
 44807 +                                     (unsigned)len, (unsigned)(len >> 32),
       
 44808 +                                     advice);
       
 44809 +    }
       
 44810 +
       
 44811 +    LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) {
       
 44812 +      /* On i386, the kernel does not know how to return from a signal
       
 44813 +       * handler. Instead, it relies on user space to provide a
       
 44814 +       * restorer function that calls the {rt_,}sigreturn() system call.
       
 44815 +       * Unfortunately, we cannot just reference the glibc version of this
       
 44816 +       * function, as glibc goes out of its way to make it inaccessible.
       
 44817 +       */
       
 44818 +      void (*res)(void);
       
 44819 +      __asm__ __volatile__("call   2f\n"
       
 44820 +                         "0:.align 16\n"
       
 44821 +                         "1:movl   %1,%%eax\n"
       
 44822 +                           "int    $0x80\n"
       
 44823 +                         "2:popl   %0\n"
       
 44824 +                           "addl   $(1b-0b),%0\n"
       
 44825 +                           : "=a" (res)
       
 44826 +                           : "i"  (__NR_rt_sigreturn));
       
 44827 +      return res;
       
 44828 +    }
       
 44829 +    LSS_INLINE void (*LSS_NAME(restore)(void))(void) {
       
 44830 +      /* On i386, the kernel does not know how to return from a signal
       
 44831 +       * handler. Instead, it relies on user space to provide a
       
 44832 +       * restorer function that calls the {rt_,}sigreturn() system call.
       
 44833 +       * Unfortunately, we cannot just reference the glibc version of this
       
 44834 +       * function, as glibc goes out of its way to make it inaccessible.
       
 44835 +       */
       
 44836 +      void (*res)(void);
       
 44837 +      __asm__ __volatile__("call   2f\n"
       
 44838 +                         "0:.align 16\n"
       
 44839 +                         "1:pop    %%eax\n"
       
 44840 +                           "movl   %1,%%eax\n"
       
 44841 +                           "int    $0x80\n"
       
 44842 +                         "2:popl   %0\n"
       
 44843 +                           "addl   $(1b-0b),%0\n"
       
 44844 +                           : "=a" (res)
       
 44845 +                           : "i"  (__NR_sigreturn));
       
 44846 +      return res;
       
 44847 +    }
       
 44848 +  #elif defined(__x86_64__)
       
 44849 +    /* There are no known problems with any of the _syscallX() macros
       
 44850 +     * currently shipping for x86_64, but we still need to be able to define
       
 44851 +     * our own version so that we can override the location of the errno
       
 44852 +     * location (e.g. when using the clone() system call with the CLONE_VM
       
 44853 +     * option).
       
 44854 +     */
       
 44855 +    #undef  LSS_BODY
       
 44856 +    #define LSS_BODY(type,name, ...)                                          \
       
 44857 +          long __res;                                                         \
       
 44858 +          __asm__ __volatile__("syscall" : "=a" (__res) : "0" (__NR_##name),  \
       
 44859 +            ##__VA_ARGS__ : "r11", "rcx", "memory");                          \
       
 44860 +          LSS_RETURN(type, __res)
       
 44861 +    #undef _syscall0
       
 44862 +    #define _syscall0(type,name)                                              \
       
 44863 +      type LSS_NAME(name)() {                                                 \
       
 44864 +        LSS_BODY(type, name);                                                 \
       
 44865 +      }
       
 44866 +    #undef _syscall1
       
 44867 +    #define _syscall1(type,name,type1,arg1)                                   \
       
 44868 +      type LSS_NAME(name)(type1 arg1) {                                       \
       
 44869 +        LSS_BODY(type, name, "D" ((long)(arg1)));                             \
       
 44870 +      }
       
 44871 +    #undef _syscall2
       
 44872 +    #define _syscall2(type,name,type1,arg1,type2,arg2)                        \
       
 44873 +      type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \
       
 44874 +        LSS_BODY(type, name, "D" ((long)(arg1)), "S" ((long)(arg2)));         \
       
 44875 +      }
       
 44876 +    #undef _syscall3
       
 44877 +    #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)             \
       
 44878 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \
       
 44879 +        LSS_BODY(type, name, "D" ((long)(arg1)), "S" ((long)(arg2)),          \
       
 44880 +                             "d" ((long)(arg3)));                             \
       
 44881 +      }
       
 44882 +    #undef _syscall4
       
 44883 +    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \
       
 44884 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \
       
 44885 +          long __res;                                                         \
       
 44886 +          __asm__ __volatile__("movq %5,%%r10; syscall" :                     \
       
 44887 +            "=a" (__res) : "0" (__NR_##name),                                 \
       
 44888 +            "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)),       \
       
 44889 +            "g" ((long)(arg4)) : "r10", "r11", "rcx", "memory");              \
       
 44890 +          LSS_RETURN(type, __res);                                            \
       
 44891 +      }
       
 44892 +    #undef _syscall5
       
 44893 +    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 44894 +                      type5,arg5)                                             \
       
 44895 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 44896 +                          type5 arg5) {                                       \
       
 44897 +          long __res;                                                         \
       
 44898 +          __asm__ __volatile__("movq %5,%%r10; movq %6,%%r8; syscall" :       \
       
 44899 +            "=a" (__res) : "0" (__NR_##name),                                 \
       
 44900 +            "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)),       \
       
 44901 +            "g" ((long)(arg4)), "g" ((long)(arg5)) :                          \
       
 44902 +            "r8", "r10", "r11", "rcx", "memory");                             \
       
 44903 +          LSS_RETURN(type, __res);                                            \
       
 44904 +      }
       
 44905 +    #undef _syscall6
       
 44906 +    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 44907 +                      type5,arg5,type6,arg6)                                  \
       
 44908 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 44909 +                          type5 arg5, type6 arg6) {                           \
       
 44910 +          long __res;                                                         \
       
 44911 +          __asm__ __volatile__("movq %5,%%r10; movq %6,%%r8; movq %7,%%r9;"   \
       
 44912 +                               "syscall" :                                    \
       
 44913 +            "=a" (__res) : "0" (__NR_##name),                                 \
       
 44914 +            "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)),       \
       
 44915 +            "g" ((long)(arg4)), "g" ((long)(arg5)), "g" ((long)(arg6)) :      \
       
 44916 +            "r8", "r9", "r10", "r11", "rcx", "memory");                       \
       
 44917 +          LSS_RETURN(type, __res);                                            \
       
 44918 +      }
       
 44919 +    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
       
 44920 +                                   int flags, void *arg, int *parent_tidptr,
       
 44921 +                                   void *newtls, int *child_tidptr) {
       
 44922 +      long __res;
       
 44923 +      {
       
 44924 +        register void *__tls  __asm__("r8")  = newtls;
       
 44925 +        register int  *__ctid __asm__("r10") = child_tidptr;
       
 44926 +        __asm__ __volatile__(/* if (fn == NULL)
       
 44927 +                              *   return -EINVAL;
       
 44928 +                              */
       
 44929 +                             "testq  %4,%4\n"
       
 44930 +                             "jz     1f\n"
       
 44931 +
       
 44932 +                             /* if (child_stack == NULL)
       
 44933 +                              *   return -EINVAL;
       
 44934 +                              */
       
 44935 +                             "testq  %5,%5\n"
       
 44936 +                             "jz     1f\n"
       
 44937 +
       
 44938 +                             /* childstack -= 2*sizeof(void *);
       
 44939 +                              */
       
 44940 +                             "subq   $16,%5\n"
       
 44941 +
       
 44942 +                             /* Push "arg" and "fn" onto the stack that will be
       
 44943 +                              * used by the child.
       
 44944 +                              */
       
 44945 +                             "movq   %7,8(%5)\n"
       
 44946 +                             "movq   %4,0(%5)\n"
       
 44947 +
       
 44948 +                             /* %rax = syscall(%rax = __NR_clone,
       
 44949 +                              *                %rdi = flags,
       
 44950 +                              *                %rsi = child_stack,
       
 44951 +                              *                %rdx = parent_tidptr,
       
 44952 +                              *                %r8  = new_tls,
       
 44953 +                              *                %r10 = child_tidptr)
       
 44954 +                              */
       
 44955 +                             "movq   %2,%%rax\n"
       
 44956 +                             "syscall\n"
       
 44957 +
       
 44958 +                             /* if (%rax != 0)
       
 44959 +                              *   return;
       
 44960 +                              */
       
 44961 +                             "testq  %%rax,%%rax\n"
       
 44962 +                             "jnz    1f\n"
       
 44963 +
       
 44964 +                             /* In the child. Terminate frame pointer chain.
       
 44965 +                              */
       
 44966 +                             "xorq   %%rbp,%%rbp\n"
       
 44967 +
       
 44968 +                             /* Call "fn(arg)".
       
 44969 +                              */
       
 44970 +                             "popq   %%rax\n"
       
 44971 +                             "popq   %%rdi\n"
       
 44972 +                             "call   *%%rax\n"
       
 44973 +
       
 44974 +                             /* Call _exit(%ebx).
       
 44975 +                              */
       
 44976 +                             "movq   %%rax,%%rdi\n"
       
 44977 +                             "movq   %3,%%rax\n"
       
 44978 +                             "syscall\n"
       
 44979 +
       
 44980 +                             /* Return to parent.
       
 44981 +                              */
       
 44982 +                           "1:\n"
       
 44983 +                             : "=a" (__res)
       
 44984 +                             : "0"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit),
       
 44985 +                               "r"(fn), "S"(child_stack), "D"(flags), "r"(arg),
       
 44986 +                               "d"(parent_tidptr), "r"(__tls), "r"(__ctid)
       
 44987 +                             : "memory", "r11", "rcx");
       
 44988 +      }
       
 44989 +      LSS_RETURN(int, __res);
       
 44990 +    }
       
 44991 +    LSS_INLINE _syscall4(int, fadvise64, int, fd, loff_t, offset, loff_t, len,
       
 44992 +                         int,  advice)
       
 44993 +
       
 44994 +    LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) {
       
 44995 +      /* On x86-64, the kernel does not know how to return from
       
 44996 +       * a signal handler. Instead, it relies on user space to provide a
       
 44997 +       * restorer function that calls the rt_sigreturn() system call.
       
 44998 +       * Unfortunately, we cannot just reference the glibc version of this
       
 44999 +       * function, as glibc goes out of its way to make it inaccessible.
       
 45000 +       */
       
 45001 +      void (*res)(void);
       
 45002 +      __asm__ __volatile__("call   2f\n"
       
 45003 +                         "0:.align 16\n"
       
 45004 +                         "1:movq   %1,%%rax\n"
       
 45005 +                           "syscall\n"
       
 45006 +                         "2:popq   %0\n"
       
 45007 +                           "addq   $(1b-0b),%0\n"
       
 45008 +                           : "=a" (res)
       
 45009 +                           : "i"  (__NR_rt_sigreturn));
       
 45010 +      return res;
       
 45011 +    }
       
 45012 +  #elif defined(__ARM_ARCH_3__)
       
 45013 +    /* Most definitions of _syscallX() neglect to mark "memory" as being
       
 45014 +     * clobbered. This causes problems with compilers, that do a better job
       
 45015 +     * at optimizing across __asm__ calls.
       
 45016 +     * So, we just have to redefine all fo the _syscallX() macros.
       
 45017 +     */
       
 45018 +    #undef LSS_REG
       
 45019 +    #define LSS_REG(r,a) register long __r##r __asm__("r"#r) = (long)a
       
 45020 +    #undef  LSS_BODY
       
 45021 +    #define LSS_BODY(type,name,args...)                                       \
       
 45022 +          register long __res_r0 __asm__("r0");                               \
       
 45023 +          long __res;                                                         \
       
 45024 +          __asm__ __volatile__ (__syscall(name)                               \
       
 45025 +                                : "=r"(__res_r0) : args : "lr", "memory");    \
       
 45026 +          __res = __res_r0;                                                   \
       
 45027 +          LSS_RETURN(type, __res)
       
 45028 +    #undef _syscall0
       
 45029 +    #define _syscall0(type, name)                                             \
       
 45030 +      type LSS_NAME(name)() {                                                 \
       
 45031 +        LSS_BODY(type, name);                                                 \
       
 45032 +      }
       
 45033 +    #undef _syscall1
       
 45034 +    #define _syscall1(type, name, type1, arg1)                                \
       
 45035 +      type LSS_NAME(name)(type1 arg1) {                                       \
       
 45036 +        LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0));                    \
       
 45037 +      }
       
 45038 +    #undef _syscall2
       
 45039 +    #define _syscall2(type, name, type1, arg1, type2, arg2)                   \
       
 45040 +      type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \
       
 45041 +        LSS_REG(0, arg1); LSS_REG(1, arg2);                                   \
       
 45042 +        LSS_BODY(type, name, "r"(__r0), "r"(__r1));                           \
       
 45043 +      }
       
 45044 +    #undef _syscall3
       
 45045 +    #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \
       
 45046 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \
       
 45047 +        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \
       
 45048 +        LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2));                \
       
 45049 +      }
       
 45050 +    #undef _syscall4
       
 45051 +    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \
       
 45052 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \
       
 45053 +        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \
       
 45054 +        LSS_REG(3, arg4);                                                     \
       
 45055 +        LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3));     \
       
 45056 +      }
       
 45057 +    #undef _syscall5
       
 45058 +    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 45059 +                      type5,arg5)                                             \
       
 45060 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 45061 +                          type5 arg5) {                                       \
       
 45062 +        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \
       
 45063 +        LSS_REG(3, arg4); LSS_REG(4, arg5);                                   \
       
 45064 +        LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3),      \
       
 45065 +                             "r"(__r4));                                      \
       
 45066 +      }
       
 45067 +    #undef _syscall6
       
 45068 +    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 45069 +                      type5,arg5,type6,arg6)                                  \
       
 45070 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 45071 +                          type5 arg5, type6 arg6) {                           \
       
 45072 +        LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3);                 \
       
 45073 +        LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6);                 \
       
 45074 +        LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3),      \
       
 45075 +                             "r"(__r4), "r"(__r5));                           \
       
 45076 +      }
       
 45077 +    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
       
 45078 +                                   int flags, void *arg, int *parent_tidptr,
       
 45079 +                                   void *newtls, int *child_tidptr) {
       
 45080 +      long __res;
       
 45081 +      {
       
 45082 +        register int   __flags __asm__("r0") = flags;
       
 45083 +        register void *__stack __asm__("r1") = child_stack;
       
 45084 +        register void *__ptid  __asm__("r2") = parent_tidptr;
       
 45085 +        register void *__tls   __asm__("r3") = newtls;
       
 45086 +        register int  *__ctid  __asm__("r4") = child_tidptr;
       
 45087 +        __asm__ __volatile__(/* if (fn == NULL || child_stack == NULL)
       
 45088 +                              *   return -EINVAL;
       
 45089 +                              */
       
 45090 +                             "cmp   %2,#0\n"
       
 45091 +                             "cmpne %3,#0\n"
       
 45092 +                             "moveq %0,%1\n"
       
 45093 +                             "beq   1f\n"
       
 45094 +
       
 45095 +                             /* Push "arg" and "fn" onto the stack that will be
       
 45096 +                              * used by the child.
       
 45097 +                              */
       
 45098 +                             "str   %5,[%3,#-4]!\n"
       
 45099 +                             "str   %2,[%3,#-4]!\n"
       
 45100 +
       
 45101 +                             /* %r0 = syscall(%r0 = flags,
       
 45102 +                              *               %r1 = child_stack,
       
 45103 +                              *               %r2 = parent_tidptr,
       
 45104 +                              *               %r3 = newtls,
       
 45105 +                              *               %r4 = child_tidptr)
       
 45106 +                              */
       
 45107 +                             __syscall(clone)"\n"
       
 45108 +
       
 45109 +                             /* if (%r0 != 0)
       
 45110 +                              *   return %r0;
       
 45111 +                              */
       
 45112 +                             "movs  %0,r0\n"
       
 45113 +                             "bne   1f\n"
       
 45114 +
       
 45115 +                             /* In the child, now. Call "fn(arg)".
       
 45116 +                              */
       
 45117 +                             "ldr   r0,[sp, #4]\n"
       
 45118 +                             "mov   lr,pc\n"
       
 45119 +                             "ldr   pc,[sp]\n"
       
 45120 +
       
 45121 +                             /* Call _exit(%r0).
       
 45122 +                              */
       
 45123 +                             __syscall(exit)"\n"
       
 45124 +                           "1:\n"
       
 45125 +                             : "=r" (__res)
       
 45126 +                             : "i"(-EINVAL),
       
 45127 +                               "r"(fn), "r"(__stack), "r"(__flags), "r"(arg),
       
 45128 +                               "r"(__ptid), "r"(__tls), "r"(__ctid)
       
 45129 +                             : "lr", "memory");
       
 45130 +      }
       
 45131 +      LSS_RETURN(int, __res);
       
 45132 +    }
       
 45133 +  #elif defined(__mips__)
       
 45134 +    #undef LSS_REG
       
 45135 +    #define LSS_REG(r,a) register unsigned long __r##r __asm__("$"#r) =       \
       
 45136 +                                 (unsigned long)(a)
       
 45137 +    #undef  LSS_BODY
       
 45138 +    #define LSS_BODY(type,name,r7,...)                                        \
       
 45139 +          register unsigned long __v0 __asm__("$2") = __NR_##name;            \
       
 45140 +          __asm__ __volatile__ ("syscall\n"                                   \
       
 45141 +                                : "=&r"(__v0), r7 (__r7)                      \
       
 45142 +                                : "0"(__v0), ##__VA_ARGS__                    \
       
 45143 +                                : "$8", "$9", "$10", "$11", "$12",            \
       
 45144 +                                  "$13", "$14", "$15", "$24", "memory");      \
       
 45145 +          LSS_RETURN(type, __v0, __r7)
       
 45146 +    #undef _syscall0
       
 45147 +    #define _syscall0(type, name)                                             \
       
 45148 +      type LSS_NAME(name)() {                                                 \
       
 45149 +        register unsigned long __r7 __asm__("$7");                            \
       
 45150 +        LSS_BODY(type, name, "=r");                                           \
       
 45151 +      }
       
 45152 +    #undef _syscall1
       
 45153 +    #define _syscall1(type, name, type1, arg1)                                \
       
 45154 +      type LSS_NAME(name)(type1 arg1) {                                       \
       
 45155 +        register unsigned long __r7 __asm__("$7");                            \
       
 45156 +        LSS_REG(4, arg1); LSS_BODY(type, name, "=r", "r"(__r4));              \
       
 45157 +      }
       
 45158 +    #undef _syscall2
       
 45159 +    #define _syscall2(type, name, type1, arg1, type2, arg2)                   \
       
 45160 +      type LSS_NAME(name)(type1 arg1, type2 arg2) {                           \
       
 45161 +        register unsigned long __r7 __asm__("$7");                            \
       
 45162 +        LSS_REG(4, arg1); LSS_REG(5, arg2);                                   \
       
 45163 +        LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5));                     \
       
 45164 +      }
       
 45165 +    #undef _syscall3
       
 45166 +    #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \
       
 45167 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {               \
       
 45168 +        register unsigned long __r7 __asm__("$7");                            \
       
 45169 +        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
       
 45170 +        LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5), "r"(__r6));          \
       
 45171 +      }
       
 45172 +    #undef _syscall4
       
 45173 +    #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)  \
       
 45174 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {   \
       
 45175 +        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
       
 45176 +        LSS_REG(7, arg4);                                                     \
       
 45177 +        LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6));          \
       
 45178 +      }
       
 45179 +    #undef _syscall5
       
 45180 +    #if _MIPS_SIM == _MIPS_SIM_ABI32
       
 45181 +    /* The old 32bit MIPS system call API passes the fifth and sixth argument
       
 45182 +     * on the stack, whereas the new APIs use registers "r8" and "r9".
       
 45183 +     */
       
 45184 +    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 45185 +                      type5,arg5)                                             \
       
 45186 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 45187 +                          type5 arg5) {                                       \
       
 45188 +        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
       
 45189 +        LSS_REG(7, arg4);                                                     \
       
 45190 +        register unsigned long __v0 __asm__("$2");                            \
       
 45191 +        __asm__ __volatile__ (".set noreorder\n"                              \
       
 45192 +                              "lw    $2, %6\n"                                \
       
 45193 +                              "subu  $29, 32\n"                               \
       
 45194 +                              "sw    $2, 16($29)\n"                           \
       
 45195 +                              "li    $2, %2\n"                                \
       
 45196 +                              "syscall\n"                                     \
       
 45197 +                              "addiu $29, 32\n"                               \
       
 45198 +                              ".set reorder\n"                                \
       
 45199 +                              : "=&r"(__v0), "+r" (__r7)                      \
       
 45200 +                              : "i" (__NR_##name), "r"(__r4), "r"(__r5),      \
       
 45201 +                                "r"(__r6), "m" ((unsigned long)arg5)          \
       
 45202 +                              : "$8", "$9", "$10", "$11", "$12",              \
       
 45203 +                                "$13", "$14", "$15", "$24", "memory");        \
       
 45204 +        LSS_RETURN(type, __v0, __r7);                                         \
       
 45205 +      }
       
 45206 +    #else
       
 45207 +    #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 45208 +                      type5,arg5)                                             \
       
 45209 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 45210 +                          type5 arg5) {                                       \
       
 45211 +        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
       
 45212 +        LSS_REG(7, arg4); LSS_REG(8, arg5);                                   \
       
 45213 +        LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6),           \
       
 45214 +                 "r"(__r8));                                                  \
       
 45215 +      }
       
 45216 +    #endif
       
 45217 +    #undef _syscall6
       
 45218 +    #if _MIPS_SIM == _MIPS_SIM_ABI32
       
 45219 +    /* The old 32bit MIPS system call API passes the fifth and sixth argument
       
 45220 +     * on the stack, whereas the new APIs use registers "r8" and "r9".
       
 45221 +     */
       
 45222 +    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 45223 +                      type5,arg5,type6,arg6)                                  \
       
 45224 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 45225 +                          type5 arg5, type6 arg6) {                           \
       
 45226 +        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
       
 45227 +        LSS_REG(7, arg4);                                                     \
       
 45228 +        register unsigned long __v0 __asm__("$2");                            \
       
 45229 +        __asm__ __volatile__ (".set noreorder\n"                              \
       
 45230 +                              "lw    $2, %6\n"                                \
       
 45231 +                              "lw    $8, %7\n"                                \
       
 45232 +                              "subu  $29, 32\n"                               \
       
 45233 +                              "sw    $2, 16($29)\n"                           \
       
 45234 +                              "sw    $8, 20($29)\n"                           \
       
 45235 +                              "li    $2, %2\n"                                \
       
 45236 +                              "syscall\n"                                     \
       
 45237 +                              "addiu $29, 32\n"                               \
       
 45238 +                              ".set reorder\n"                                \
       
 45239 +                              : "=&r"(__v0), "+r" (__r7)                      \
       
 45240 +                              : "i" (__NR_##name), "r"(__r4), "r"(__r5),      \
       
 45241 +                                "r"(__r6), "r" ((unsigned long)arg5),         \
       
 45242 +                                "r" ((unsigned long)arg6)                     \
       
 45243 +                              : "$8", "$9", "$10", "$11", "$12",              \
       
 45244 +                                "$13", "$14", "$15", "$24", "memory");        \
       
 45245 +        LSS_RETURN(type, __v0, __r7);                                         \
       
 45246 +      }
       
 45247 +    #else
       
 45248 +    #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,  \
       
 45249 +                      type5,arg5,type6,arg6)                                  \
       
 45250 +      type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,     \
       
 45251 +                          type5 arg5,type6 arg6) {                            \
       
 45252 +        LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3);                 \
       
 45253 +        LSS_REG(7, arg4); LSS_REG(8, arg5); LSS_REG(9, arg6);                 \
       
 45254 +        LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6),           \
       
 45255 +                 "r"(__r8), "r"(__r9));                                       \
       
 45256 +      }
       
 45257 +    #endif
       
 45258 +    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
       
 45259 +                                   int flags, void *arg, int *parent_tidptr,
       
 45260 +                                   void *newtls, int *child_tidptr) {
       
 45261 +      register unsigned long __v0 __asm__("$2");
       
 45262 +      register unsigned long __r7 __asm__("$7") = (unsigned long)newtls;
       
 45263 +      {
       
 45264 +        register int   __flags __asm__("$4") = flags;
       
 45265 +        register void *__stack __asm__("$5") = child_stack;
       
 45266 +        register void *__ptid  __asm__("$6") = parent_tidptr;
       
 45267 +        register int  *__ctid  __asm__("$8") = child_tidptr;
       
 45268 +        __asm__ __volatile__(
       
 45269 +          #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32
       
 45270 +                             "subu  $29,24\n"
       
 45271 +          #elif _MIPS_SIM == _MIPS_SIM_NABI32
       
 45272 +                             "sub   $29,16\n"
       
 45273 +          #else
       
 45274 +                             "dsubu $29,16\n"
       
 45275 +          #endif
       
 45276 +
       
 45277 +                             /* if (fn == NULL || child_stack == NULL)
       
 45278 +                              *   return -EINVAL;
       
 45279 +                              */
       
 45280 +                             "li    %0,%2\n"
       
 45281 +                             "beqz  %5,1f\n"
       
 45282 +                             "beqz  %6,1f\n"
       
 45283 +
       
 45284 +                             /* Push "arg" and "fn" onto the stack that will be
       
 45285 +                              * used by the child.
       
 45286 +                              */
       
 45287 +          #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32
       
 45288 +                             "subu  %6,32\n"
       
 45289 +                             "sw    %5,0(%6)\n"
       
 45290 +                             "sw    %8,4(%6)\n"
       
 45291 +          #elif _MIPS_SIM == _MIPS_SIM_NABI32
       
 45292 +                             "sub   %6,32\n"
       
 45293 +                             "sw    %5,0(%6)\n"
       
 45294 +                             "sw    %8,8(%6)\n"
       
 45295 +          #else
       
 45296 +                             "dsubu %6,32\n"
       
 45297 +                             "sd    %5,0(%6)\n"
       
 45298 +                             "sd    %8,8(%6)\n"
       
 45299 +          #endif
       
 45300 +
       
 45301 +                             /* $7 = syscall($4 = flags,
       
 45302 +                              *              $5 = child_stack,
       
 45303 +                              *              $6 = parent_tidptr,
       
 45304 +                              *              $7 = newtls,
       
 45305 +                              *              $8 = child_tidptr)
       
 45306 +                              */
       
 45307 +                             "li    $2,%3\n"
       
 45308 +                             "syscall\n"
       
 45309 +
       
 45310 +                             /* if ($7 != 0)
       
 45311 +                              *   return $2;
       
 45312 +                              */
       
 45313 +                             "bnez  $7,1f\n"
       
 45314 +                             "bnez  $2,1f\n"
       
 45315 +
       
 45316 +                             /* In the child, now. Call "fn(arg)".
       
 45317 +                              */
       
 45318 +          #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32
       
 45319 +                            "lw    $25,0($29)\n"
       
 45320 +                            "lw    $4,4($29)\n"
       
 45321 +          #elif _MIPS_SIM == _MIPS_SIM_NABI32
       
 45322 +                            "lw    $25,0($29)\n"
       
 45323 +                            "lw    $4,8($29)\n"
       
 45324 +          #else
       
 45325 +                            "ld    $25,0($29)\n"
       
 45326 +                            "ld    $4,8($29)\n"
       
 45327 +          #endif
       
 45328 +                            "jalr  $25\n"
       
 45329 +
       
 45330 +                             /* Call _exit($2)
       
 45331 +                              */
       
 45332 +                            "move  $4,$2\n"
       
 45333 +                            "li    $2,%4\n"
       
 45334 +                            "syscall\n"
       
 45335 +
       
 45336 +                           "1:\n"
       
 45337 +          #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32
       
 45338 +                             "addu  $29, 24\n"
       
 45339 +          #elif _MIPS_SIM == _MIPS_SIM_NABI32
       
 45340 +                             "add   $29, 16\n"
       
 45341 +          #else
       
 45342 +                             "daddu $29,16\n"
       
 45343 +          #endif
       
 45344 +                             : "=&r" (__v0), "=r" (__r7)
       
 45345 +                             : "i"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit),
       
 45346 +                               "r"(fn), "r"(__stack), "r"(__flags), "r"(arg),
       
 45347 +                               "r"(__ptid), "r"(__r7), "r"(__ctid)
       
 45348 +                             : "$9", "$10", "$11", "$12", "$13", "$14", "$15",
       
 45349 +                               "$24", "memory");
       
 45350 +      }
       
 45351 +      LSS_RETURN(int, __v0, __r7);
       
 45352 +    }
       
 45353 +  #elif defined (__PPC__)
       
 45354 +    #undef  LSS_LOADARGS_0
       
 45355 +    #define LSS_LOADARGS_0(name, dummy...)                                    \
       
 45356 +        __sc_0 = __NR_##name
       
 45357 +    #undef  LSS_LOADARGS_1
       
 45358 +    #define LSS_LOADARGS_1(name, arg1)                                        \
       
 45359 +            LSS_LOADARGS_0(name);                                             \
       
 45360 +            __sc_3 = (unsigned long) (arg1)
       
 45361 +    #undef  LSS_LOADARGS_2
       
 45362 +    #define LSS_LOADARGS_2(name, arg1, arg2)                                  \
       
 45363 +            LSS_LOADARGS_1(name, arg1);                                       \
       
 45364 +            __sc_4 = (unsigned long) (arg2)
       
 45365 +    #undef  LSS_LOADARGS_3
       
 45366 +    #define LSS_LOADARGS_3(name, arg1, arg2, arg3)                            \
       
 45367 +            LSS_LOADARGS_2(name, arg1, arg2);                                 \
       
 45368 +            __sc_5 = (unsigned long) (arg3)
       
 45369 +    #undef  LSS_LOADARGS_4
       
 45370 +    #define LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4)                      \
       
 45371 +            LSS_LOADARGS_3(name, arg1, arg2, arg3);                           \
       
 45372 +            __sc_6 = (unsigned long) (arg4)
       
 45373 +    #undef  LSS_LOADARGS_5
       
 45374 +    #define LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5)                \
       
 45375 +            LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4);                     \
       
 45376 +            __sc_7 = (unsigned long) (arg5)
       
 45377 +    #undef  LSS_LOADARGS_6
       
 45378 +    #define LSS_LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6)          \
       
 45379 +            LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5);               \
       
 45380 +            __sc_8 = (unsigned long) (arg6)
       
 45381 +    #undef  LSS_ASMINPUT_0
       
 45382 +    #define LSS_ASMINPUT_0 "0" (__sc_0)
       
 45383 +    #undef  LSS_ASMINPUT_1
       
 45384 +    #define LSS_ASMINPUT_1 LSS_ASMINPUT_0, "1" (__sc_3)
       
 45385 +    #undef  LSS_ASMINPUT_2
       
 45386 +    #define LSS_ASMINPUT_2 LSS_ASMINPUT_1, "2" (__sc_4)
       
 45387 +    #undef  LSS_ASMINPUT_3
       
 45388 +    #define LSS_ASMINPUT_3 LSS_ASMINPUT_2, "3" (__sc_5)
       
 45389 +    #undef  LSS_ASMINPUT_4
       
 45390 +    #define LSS_ASMINPUT_4 LSS_ASMINPUT_3, "4" (__sc_6)
       
 45391 +    #undef  LSS_ASMINPUT_5
       
 45392 +    #define LSS_ASMINPUT_5 LSS_ASMINPUT_4, "5" (__sc_7)
       
 45393 +    #undef  LSS_ASMINPUT_6
       
 45394 +    #define LSS_ASMINPUT_6 LSS_ASMINPUT_5, "6" (__sc_8)
       
 45395 +    #undef  LSS_BODY
       
 45396 +    #define LSS_BODY(nr, type, name, args...)                                 \
       
 45397 +        long __sc_ret, __sc_err;                                              \
       
 45398 +        {                                                                     \
       
 45399 +                        register unsigned long __sc_0 __asm__ ("r0");         \
       
 45400 +                        register unsigned long __sc_3 __asm__ ("r3");         \
       
 45401 +                        register unsigned long __sc_4 __asm__ ("r4");         \
       
 45402 +                        register unsigned long __sc_5 __asm__ ("r5");         \
       
 45403 +                        register unsigned long __sc_6 __asm__ ("r6");         \
       
 45404 +                        register unsigned long __sc_7 __asm__ ("r7");         \
       
 45405 +                        register unsigned long __sc_8 __asm__ ("r8");         \
       
 45406 +                                                                              \
       
 45407 +            LSS_LOADARGS_##nr(name, args);                                    \
       
 45408 +            __asm__ __volatile__                                              \
       
 45409 +                ("sc\n\t"                                                     \
       
 45410 +                 "mfcr %0"                                                    \
       
 45411 +                 : "=&r" (__sc_0),                                            \
       
 45412 +                   "=&r" (__sc_3), "=&r" (__sc_4),                            \
       
 45413 +                   "=&r" (__sc_5), "=&r" (__sc_6),                            \
       
 45414 +                   "=&r" (__sc_7), "=&r" (__sc_8)                             \
       
 45415 +                 : LSS_ASMINPUT_##nr                                          \
       
 45416 +                 : "cr0", "ctr", "memory",                                    \
       
 45417 +                   "r9", "r10", "r11", "r12");                                \
       
 45418 +            __sc_ret = __sc_3;                                                \
       
 45419 +            __sc_err = __sc_0;                                                \
       
 45420 +        }                                                                     \
       
 45421 +        LSS_RETURN(type, __sc_ret, __sc_err)
       
 45422 +    #undef _syscall0
       
 45423 +    #define _syscall0(type, name)                                             \
       
 45424 +       type LSS_NAME(name)(void) {                                            \
       
 45425 +          LSS_BODY(0, type, name);                                            \
       
 45426 +       }
       
 45427 +    #undef _syscall1
       
 45428 +    #define _syscall1(type, name, type1, arg1)                                \
       
 45429 +       type LSS_NAME(name)(type1 arg1) {                                      \
       
 45430 +          LSS_BODY(1, type, name, arg1);                                      \
       
 45431 +       }
       
 45432 +    #undef _syscall2
       
 45433 +    #define _syscall2(type, name, type1, arg1, type2, arg2)                   \
       
 45434 +       type LSS_NAME(name)(type1 arg1, type2 arg2) {                          \
       
 45435 +          LSS_BODY(2, type, name, arg1, arg2);                                \
       
 45436 +       }
       
 45437 +    #undef _syscall3
       
 45438 +    #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3)      \
       
 45439 +       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) {              \
       
 45440 +          LSS_BODY(3, type, name, arg1, arg2, arg3);                          \
       
 45441 +       }
       
 45442 +    #undef _syscall4
       
 45443 +    #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3,      \
       
 45444 +                                  type4, arg4)                                \
       
 45445 +       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) {  \
       
 45446 +          LSS_BODY(4, type, name, arg1, arg2, arg3, arg4);                    \
       
 45447 +       }
       
 45448 +    #undef _syscall5
       
 45449 +    #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3,      \
       
 45450 +                                  type4, arg4, type5, arg5)                   \
       
 45451 +       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
       
 45452 +                                               type5 arg5) {                  \
       
 45453 +          LSS_BODY(5, type, name, arg1, arg2, arg3, arg4, arg5);              \
       
 45454 +       }
       
 45455 +    #undef _syscall6
       
 45456 +    #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3,      \
       
 45457 +                                  type4, arg4, type5, arg5, type6, arg6)      \
       
 45458 +       type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4,    \
       
 45459 +                                               type5 arg5, type6 arg6) {      \
       
 45460 +          LSS_BODY(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6);        \
       
 45461 +       }
       
 45462 +    /* clone function adapted from glibc 2.3.6 clone.S                       */
       
 45463 +    /* TODO(csilvers): consider wrapping some args up in a struct, like we
       
 45464 +     * do for i386's _syscall6, so we can compile successfully on gcc 2.95
       
 45465 +     */
       
 45466 +    LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack,
       
 45467 +                                   int flags, void *arg, int *parent_tidptr,
       
 45468 +                                   void *newtls, int *child_tidptr) {
       
 45469 +      long __ret, __err;
       
 45470 +      {
       
 45471 +        register int (*__fn)(void *)    __asm__ ("r8")  = fn;
       
 45472 +        register void *__cstack                 __asm__ ("r4")  = child_stack;
       
 45473 +        register int __flags                    __asm__ ("r3")  = flags;
       
 45474 +        register void * __arg                   __asm__ ("r9")  = arg;
       
 45475 +        register int * __ptidptr                __asm__ ("r5")  = parent_tidptr;
       
 45476 +        register void * __newtls                __asm__ ("r6")  = newtls;
       
 45477 +        register int * __ctidptr                __asm__ ("r7")  = child_tidptr;
       
 45478 +        __asm__ __volatile__(
       
 45479 +            /* check for fn == NULL
       
 45480 +             * and child_stack == NULL
       
 45481 +             */
       
 45482 +            "cmpwi cr0, %6, 0\n\t"
       
 45483 +            "cmpwi cr1, %7, 0\n\t"
       
 45484 +            "cror cr0*4+eq, cr1*4+eq, cr0*4+eq\n\t"
       
 45485 +            "beq- cr0, 1f\n\t"
       
 45486 +
       
 45487 +            /* set up stack frame for child                                  */
       
 45488 +            "clrrwi %7, %7, 4\n\t"
       
 45489 +            "li 0, 0\n\t"
       
 45490 +            "stwu 0, -16(%7)\n\t"
       
 45491 +
       
 45492 +            /* fn, arg, child_stack are saved across the syscall: r28-30     */
       
 45493 +            "mr 28, %6\n\t"
       
 45494 +            "mr 29, %7\n\t"
       
 45495 +            "mr 27, %9\n\t"
       
 45496 +
       
 45497 +            /* syscall                                                       */
       
 45498 +            "li 0, %4\n\t"
       
 45499 +            /* flags already in r3
       
 45500 +             * child_stack already in r4
       
 45501 +             * ptidptr already in r5
       
 45502 +             * newtls already in r6
       
 45503 +             * ctidptr already in r7
       
 45504 +             */
       
 45505 +            "sc\n\t"
       
 45506 +
       
 45507 +            /* Test if syscall was successful                                */
       
 45508 +            "cmpwi cr1, 3, 0\n\t"
       
 45509 +            "crandc cr1*4+eq, cr1*4+eq, cr0*4+so\n\t"
       
 45510 +            "bne- cr1, 1f\n\t"
       
 45511 +
       
 45512 +            /* Do the function call                                          */
       
 45513 +            "mtctr 28\n\t"
       
 45514 +            "mr 3, 27\n\t"
       
 45515 +            "bctrl\n\t"
       
 45516 +
       
 45517 +            /* Call _exit(r3)                                                */
       
 45518 +            "li 0, %5\n\t"
       
 45519 +            "sc\n\t"
       
 45520 +
       
 45521 +            /* Return to parent                                              */
       
 45522 +            "1:\n"
       
 45523 +            "mfcr %1\n\t"
       
 45524 +            "mr %0, 3\n\t"
       
 45525 +              : "=r" (__ret), "=r" (__err)
       
 45526 +              : "0" (-1), "1" (EINVAL),
       
 45527 +                "i" (__NR_clone), "i" (__NR_exit),
       
 45528 +                "r" (__fn), "r" (__cstack), "r" (__flags),
       
 45529 +                "r" (__arg), "r" (__ptidptr), "r" (__newtls),
       
 45530 +                "r" (__ctidptr)
       
 45531 +              : "cr0", "cr1", "memory", "ctr",
       
 45532 +                "r0", "r29", "r27", "r28");
       
 45533 +      }
       
 45534 +      LSS_RETURN(int, __ret, __err);
       
 45535 +    }
       
 45536 +  #endif
       
 45537 +  #define __NR__exit   __NR_exit
       
 45538 +  #define __NR__gettid __NR_gettid
       
 45539 +  #define __NR__mremap __NR_mremap
       
 45540 +  LSS_INLINE _syscall1(int,     chdir,           const char *,p)
       
 45541 +  LSS_INLINE _syscall1(int,     close,           int,         f)
       
 45542 +  LSS_INLINE _syscall1(int,     dup,             int,         f)
       
 45543 +  LSS_INLINE _syscall2(int,     dup2,            int,         s,
       
 45544 +                       int,            d)
       
 45545 +  LSS_INLINE _syscall3(int,     execve,          const char*, f,
       
 45546 +                       const char*const*,a,const char*const*, e)
       
 45547 +  LSS_INLINE _syscall1(int,     _exit,           int,         e)
       
 45548 +  LSS_INLINE _syscall3(int,     fcntl,           int,         f,
       
 45549 +                       int,            c, long,   a)
       
 45550 +  LSS_INLINE _syscall0(pid_t,   fork)
       
 45551 +  LSS_INLINE _syscall2(int,     fstat,           int,         f,
       
 45552 +                      struct kernel_stat*,   b)
       
 45553 +  LSS_INLINE _syscall2(int,     fstatfs,         int,         f,
       
 45554 +                      struct kernel_statfs*, b)
       
 45555 +  LSS_INLINE _syscall4(int,     futex,           int*,        a,
       
 45556 +                       int,            o, int,    v,
       
 45557 +                      struct kernel_timespec*, t)
       
 45558 +  LSS_INLINE _syscall3(int,     getdents,        int,         f,
       
 45559 +                      struct kernel_dirent*, d, int,    c)
       
 45560 +  LSS_INLINE _syscall3(int,     getdents64,      int,         f,
       
 45561 +                      struct kernel_dirent64*, d, int,    c)
       
 45562 +  LSS_INLINE _syscall0(gid_t,   getegid)
       
 45563 +  LSS_INLINE _syscall0(uid_t,   geteuid)
       
 45564 +  LSS_INLINE _syscall0(pid_t,   getpgrp)
       
 45565 +  LSS_INLINE _syscall0(pid_t,   getpid)
       
 45566 +  LSS_INLINE _syscall0(pid_t,   getppid)
       
 45567 +  LSS_INLINE _syscall2(int,     getpriority,     int,         a,
       
 45568 +                       int,            b)
       
 45569 +  LSS_INLINE _syscall2(int,     getrlimit,       int,         r,
       
 45570 +                      struct kernel_rlimit*, l)
       
 45571 +  LSS_INLINE _syscall1(pid_t,   getsid,          pid_t,       p)
       
 45572 +  LSS_INLINE _syscall0(pid_t,   _gettid)
       
 45573 +  LSS_INLINE _syscall5(int,     setxattr,        const char *,p,
       
 45574 +                       const char *,   n,        const void *,v,
       
 45575 +                       size_t,         s,        int,         f)
       
 45576 +  LSS_INLINE _syscall5(int,     lsetxattr,       const char *,p,
       
 45577 +                       const char *,   n,        const void *,v,
       
 45578 +                       size_t,         s,        int,         f)
       
 45579 +  LSS_INLINE _syscall4(ssize_t, getxattr,        const char *,p,
       
 45580 +                       const char *,   n,        void *,      v, size_t, s)
       
 45581 +  LSS_INLINE _syscall4(ssize_t, lgetxattr,       const char *,p,
       
 45582 +                       const char *,   n,        void *,      v, size_t, s)
       
 45583 +  LSS_INLINE _syscall2(int,     kill,            pid_t,       p,
       
 45584 +                       int,            s)
       
 45585 +  LSS_INLINE _syscall3(off_t,   lseek,           int,         f,
       
 45586 +                       off_t,          o, int,    w)
       
 45587 +  LSS_INLINE _syscall2(int,     munmap,          void*,       s,
       
 45588 +                       size_t,         l)
       
 45589 +  LSS_INLINE _syscall6(long,    move_pages,      pid_t,       p,
       
 45590 +                       unsigned long,  n, void **,g, int *,   d,
       
 45591 +                       int *,          s, int,    f)
       
 45592 +  LSS_INLINE _syscall5(void*,   _mremap,         void*,       o,
       
 45593 +                       size_t,         os,       size_t,      ns,
       
 45594 +                       unsigned long,  f, void *, a)
       
 45595 +  LSS_INLINE _syscall3(int,     open,            const char*, p,
       
 45596 +                       int,            f, int,    m)
       
 45597 +  LSS_INLINE _syscall3(int,     poll,           struct kernel_pollfd*, u,
       
 45598 +                       unsigned int,   n, int,    t)
       
 45599 +  LSS_INLINE _syscall2(int,     prctl,           int,         o,
       
 45600 +                       long,           a)
       
 45601 +  LSS_INLINE _syscall4(long,    ptrace,          int,         r,
       
 45602 +                       pid_t,          p, void *, a, void *, d)
       
 45603 +  LSS_INLINE _syscall3(ssize_t, read,            int,         f,
       
 45604 +                       void *,         b, size_t, c)
       
 45605 +  LSS_INLINE _syscall3(int,     readlink,        const char*, p,
       
 45606 +                       char*,          b, size_t, s)
       
 45607 +  LSS_INLINE _syscall4(int,     rt_sigaction,    int,         s,
       
 45608 +                       const struct kernel_sigaction*, a,
       
 45609 +                       struct kernel_sigaction*, o, size_t,   c)
       
 45610 +  LSS_INLINE _syscall2(int, rt_sigpending, struct kernel_sigset_t *, s,
       
 45611 +                       size_t,         c)
       
 45612 +  LSS_INLINE _syscall4(int, rt_sigprocmask,      int,         h,
       
 45613 +                       const struct kernel_sigset_t*,  s,
       
 45614 +                       struct kernel_sigset_t*,        o, size_t, c)
       
 45615 +  LSS_INLINE _syscall2(int, rt_sigsuspend,
       
 45616 +                       const struct kernel_sigset_t*, s,  size_t, c)
       
 45617 +  LSS_INLINE _syscall3(int,     sched_getaffinity,pid_t,      p,
       
 45618 +                       unsigned int,   l, unsigned long *, m)
       
 45619 +  LSS_INLINE _syscall3(int,     sched_setaffinity,pid_t,      p,
       
 45620 +                       unsigned int,   l, unsigned long *, m)
       
 45621 +  LSS_INLINE _syscall0(int,     sched_yield)
       
 45622 +  LSS_INLINE _syscall1(long,    set_tid_address, int *,       t)
       
 45623 +  LSS_INLINE _syscall1(int,     setfsgid,        gid_t,       g)
       
 45624 +  LSS_INLINE _syscall1(int,     setfsuid,        uid_t,       u)
       
 45625 +  LSS_INLINE _syscall2(int,     setpgid,         pid_t,       p,
       
 45626 +                       pid_t,          g)
       
 45627 +  LSS_INLINE _syscall3(int,     setpriority,     int,         a,
       
 45628 +                       int,            b, int,    p)
       
 45629 +  LSS_INLINE _syscall3(int,     setresgid,       gid_t,       r,
       
 45630 +                       gid_t,          e, gid_t,  s)
       
 45631 +  LSS_INLINE _syscall3(int,     setresuid,       uid_t,       r,
       
 45632 +                       uid_t,          e, uid_t,  s)
       
 45633 +  LSS_INLINE _syscall2(int,     setrlimit,       int,         r,
       
 45634 +                       const struct kernel_rlimit*, l)
       
 45635 +  LSS_INLINE _syscall0(pid_t,    setsid)
       
 45636 +  LSS_INLINE _syscall2(int,     sigaltstack,     const stack_t*, s,
       
 45637 +                       const stack_t*, o)
       
 45638 +  LSS_INLINE _syscall2(int,     stat,            const char*, f,
       
 45639 +                      struct kernel_stat*,   b)
       
 45640 +  LSS_INLINE _syscall2(int,     statfs,          const char*, f,
       
 45641 +                      struct kernel_statfs*, b)
       
 45642 +  LSS_INLINE _syscall1(int,    unlink,          const char*, f)
       
 45643 +  LSS_INLINE _syscall3(ssize_t, write,            int,        f,
       
 45644 +                       const void *,   b, size_t, c)
       
 45645 +  LSS_INLINE _syscall3(ssize_t, writev,           int,        f,
       
 45646 +                       const struct kernel_iovec*, v, size_t, c)
       
 45647 +  #if defined(__x86_64__) ||                                                  \
       
 45648 +     (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32)
       
 45649 +    LSS_INLINE _syscall3(int, recvmsg,            int,   s,
       
 45650 +                        struct kernel_msghdr*,     m, int, f)
       
 45651 +    LSS_INLINE _syscall3(int, sendmsg,            int,   s,
       
 45652 +                         const struct kernel_msghdr*, m, int, f)
       
 45653 +    LSS_INLINE _syscall6(int, sendto,             int,   s,
       
 45654 +                         const void*,             m, size_t, l,
       
 45655 +                         int,                     f,
       
 45656 +                         const struct kernel_sockaddr*, a, int, t)
       
 45657 +    LSS_INLINE _syscall2(int, shutdown,           int,   s,
       
 45658 +                         int,                     h)
       
 45659 +    LSS_INLINE _syscall3(int, socket,             int,   d,
       
 45660 +                         int,                     t, int,       p)
       
 45661 +    LSS_INLINE _syscall4(int, socketpair,         int,   d,
       
 45662 +                         int,                     t, int,       p, int*, s)
       
 45663 +  #endif
       
 45664 +  #if defined(__x86_64__)
       
 45665 +    LSS_INLINE _syscall6(void*, mmap,              void*, s,
       
 45666 +                         size_t,                   l, int,               p,
       
 45667 +                         int,                      f, int,               d,
       
 45668 +                         __off64_t,                o)
       
 45669 +    LSS_INLINE _syscall4(int, newfstatat,         int,   d,
       
 45670 +                         const char *,            p,
       
 45671 +                        struct kernel_stat*,       b, int, f)
       
 45672 +
       
 45673 +    LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) {
       
 45674 +      return LSS_NAME(setfsgid)(gid);
       
 45675 +    }
       
 45676 +
       
 45677 +    LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) {
       
 45678 +      return LSS_NAME(setfsuid)(uid);
       
 45679 +    }
       
 45680 +
       
 45681 +    LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) {
       
 45682 +      return LSS_NAME(setresgid)(rgid, egid, sgid);
       
 45683 +    }
       
 45684 +
       
 45685 +    LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) {
       
 45686 +      return LSS_NAME(setresuid)(ruid, euid, suid);
       
 45687 +    }
       
 45688 +
       
 45689 +    LSS_INLINE int LSS_NAME(sigaction)(int signum,
       
 45690 +                                       const struct kernel_sigaction *act,
       
 45691 +                                       struct kernel_sigaction *oldact) {
       
 45692 +      /* On x86_64, the kernel requires us to always set our own
       
 45693 +       * SA_RESTORER in order to be able to return from a signal handler.
       
 45694 +       * This function must have a "magic" signature that the "gdb"
       
 45695 +       * (and maybe the kernel?) can recognize.
       
 45696 +       */
       
 45697 +      if (act != NULL && !(act->sa_flags & SA_RESTORER)) {
       
 45698 +        struct kernel_sigaction a = *act;
       
 45699 +        a.sa_flags   |= SA_RESTORER;
       
 45700 +        a.sa_restorer = LSS_NAME(restore_rt)();
       
 45701 +        return LSS_NAME(rt_sigaction)(signum, &a, oldact,
       
 45702 +                                      (KERNEL_NSIG+7)/8);
       
 45703 +      } else {
       
 45704 +        return LSS_NAME(rt_sigaction)(signum, act, oldact,
       
 45705 +                                      (KERNEL_NSIG+7)/8);
       
 45706 +      }
       
 45707 +    }
       
 45708 +
       
 45709 +    LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) {
       
 45710 +      return LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8);
       
 45711 +    }
       
 45712 +
       
 45713 +    LSS_INLINE int LSS_NAME(sigprocmask)(int how,
       
 45714 +                                         const struct kernel_sigset_t *set,
       
 45715 +                                         struct kernel_sigset_t *oldset) {
       
 45716 +      return LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8);
       
 45717 +    }
       
 45718 +
       
 45719 +    LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) {
       
 45720 +      return LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8);
       
 45721 +    }
       
 45722 +  #endif
       
 45723 +  #if defined(__x86_64__) || defined(__ARM_ARCH_3__) ||                       \
       
 45724 +     (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32)
       
 45725 +    LSS_INLINE _syscall4(pid_t, wait4,            pid_t, p,
       
 45726 +                         int*,                    s, int,       o,
       
 45727 +                        struct kernel_rusage*,     r)
       
 45728 +
       
 45729 +    LSS_INLINE pid_t LSS_NAME(waitpid)(pid_t pid, int *status, int options){
       
 45730 +      return LSS_NAME(wait4)(pid, status, options, 0);
       
 45731 +    }
       
 45732 +  #endif
       
 45733 +  #if defined(__i386__) || defined(__x86_64__)
       
 45734 +    LSS_INLINE _syscall4(int, openat, int, d, const char *, p, int, f, int, m)
       
 45735 +    LSS_INLINE _syscall3(int, unlinkat, int, d, const char *, p, int, f)
       
 45736 +  #endif
       
 45737 +  #if defined(__i386__) || defined(__ARM_ARCH_3__)
       
 45738 +    #define __NR__setfsgid32  __NR_setfsgid32
       
 45739 +    #define __NR__setfsuid32  __NR_setfsuid32
       
 45740 +    #define __NR__setresgid32 __NR_setresgid32
       
 45741 +    #define __NR__setresuid32 __NR_setresuid32
       
 45742 +    LSS_INLINE _syscall2(int,   ugetrlimit,        int,          r,
       
 45743 +                        struct kernel_rlimit*, l)
       
 45744 +    LSS_INLINE _syscall1(int,     _setfsgid32,      gid_t,       f)
       
 45745 +    LSS_INLINE _syscall1(int,     _setfsuid32,      uid_t,       f)
       
 45746 +    LSS_INLINE _syscall3(int,     _setresgid32,    gid_t,       r,
       
 45747 +                         gid_t,          e, gid_t,  s)
       
 45748 +    LSS_INLINE _syscall3(int,     _setresuid32,    uid_t,       r,
       
 45749 +                         uid_t,          e, uid_t,  s)
       
 45750 +
       
 45751 +    LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) {
       
 45752 +      int rc;
       
 45753 +      if ((rc = LSS_NAME(_setfsgid32)(gid)) < 0 &&
       
 45754 +          LSS_ERRNO == ENOSYS) {
       
 45755 +        if ((unsigned int)gid & ~0xFFFFu) {
       
 45756 +          rc = EINVAL;
       
 45757 +        } else {
       
 45758 +          rc = LSS_NAME(setfsgid)(gid);
       
 45759 +        }
       
 45760 +      }
       
 45761 +      return rc;
       
 45762 +    }
       
 45763 +
       
 45764 +    LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) {
       
 45765 +      int rc;
       
 45766 +      if ((rc = LSS_NAME(_setfsuid32)(uid)) < 0 &&
       
 45767 +          LSS_ERRNO == ENOSYS) {
       
 45768 +        if ((unsigned int)uid & ~0xFFFFu) {
       
 45769 +          rc = EINVAL;
       
 45770 +        } else {
       
 45771 +          rc = LSS_NAME(setfsuid)(uid);
       
 45772 +        }
       
 45773 +      }
       
 45774 +      return rc;
       
 45775 +    }
       
 45776 +
       
 45777 +    LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) {
       
 45778 +      int rc;
       
 45779 +      if ((rc = LSS_NAME(_setresgid32)(rgid, egid, sgid)) < 0 &&
       
 45780 +          LSS_ERRNO == ENOSYS) {
       
 45781 +        if ((unsigned int)rgid & ~0xFFFFu ||
       
 45782 +            (unsigned int)egid & ~0xFFFFu ||
       
 45783 +            (unsigned int)sgid & ~0xFFFFu) {
       
 45784 +          rc = EINVAL;
       
 45785 +        } else {
       
 45786 +          rc = LSS_NAME(setresgid)(rgid, egid, sgid);
       
 45787 +        }
       
 45788 +      }
       
 45789 +      return rc;
       
 45790 +    }
       
 45791 +
       
 45792 +    LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) {
       
 45793 +      int rc;
       
 45794 +      if ((rc = LSS_NAME(_setresuid32)(ruid, euid, suid)) < 0 &&
       
 45795 +          LSS_ERRNO == ENOSYS) {
       
 45796 +        if ((unsigned int)ruid & ~0xFFFFu ||
       
 45797 +            (unsigned int)euid & ~0xFFFFu ||
       
 45798 +            (unsigned int)suid & ~0xFFFFu) {
       
 45799 +          rc = EINVAL;
       
 45800 +        } else {
       
 45801 +          rc = LSS_NAME(setresuid)(ruid, euid, suid);
       
 45802 +        }
       
 45803 +      }
       
 45804 +      return rc;
       
 45805 +    }
       
 45806 +  #endif
       
 45807 +  LSS_INLINE int LSS_NAME(sigemptyset)(struct kernel_sigset_t *set) {
       
 45808 +    memset(&set->sig, 0, sizeof(set->sig));
       
 45809 +    return 0;
       
 45810 +  }
       
 45811 +  
       
 45812 +  LSS_INLINE int LSS_NAME(sigfillset)(struct kernel_sigset_t *set) {
       
 45813 +    memset(&set->sig, -1, sizeof(set->sig));
       
 45814 +    return 0;
       
 45815 +  }
       
 45816 +  
       
 45817 +  LSS_INLINE int LSS_NAME(sigaddset)(struct kernel_sigset_t *set,
       
 45818 +                                     int signum) {
       
 45819 +    if (signum < 1 || signum > (int)(8*sizeof(set->sig))) {
       
 45820 +      LSS_ERRNO = EINVAL;
       
 45821 +      return -1;
       
 45822 +    } else {
       
 45823 +      set->sig[(signum - 1)/(8*sizeof(set->sig[0]))]
       
 45824 +          |= 1UL << ((signum - 1) % (8*sizeof(set->sig[0])));
       
 45825 +      return 0;
       
 45826 +    }
       
 45827 +  }
       
 45828 +  
       
 45829 +  LSS_INLINE int LSS_NAME(sigdelset)(struct kernel_sigset_t *set,
       
 45830 +                                        int signum) {
       
 45831 +    if (signum < 1 || signum > (int)(8*sizeof(set->sig))) {
       
 45832 +      LSS_ERRNO = EINVAL;
       
 45833 +      return -1;
       
 45834 +    } else {
       
 45835 +      set->sig[(signum - 1)/(8*sizeof(set->sig[0]))]
       
 45836 +          &= ~(1UL << ((signum - 1) % (8*sizeof(set->sig[0]))));
       
 45837 +      return 0;
       
 45838 +    }
       
 45839 +  }
       
 45840 +  
       
 45841 +  LSS_INLINE int LSS_NAME(sigismember)(struct kernel_sigset_t *set,
       
 45842 +                                          int signum) {
       
 45843 +    if (signum < 1 || signum > (int)(8*sizeof(set->sig))) {
       
 45844 +      LSS_ERRNO = EINVAL;
       
 45845 +      return -1;
       
 45846 +    } else {
       
 45847 +      return !!(set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] &
       
 45848 +                (1UL << ((signum - 1) % (8*sizeof(set->sig[0])))));
       
 45849 +    }
       
 45850 +  }
       
 45851 +  #if defined(__i386__) || defined(__ARM_ARCH_3__) ||                         \
       
 45852 +     (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || defined(__PPC__)
       
 45853 +    #define __NR__sigaction   __NR_sigaction
       
 45854 +    #define __NR__sigpending  __NR_sigpending
       
 45855 +    #define __NR__sigprocmask __NR_sigprocmask
       
 45856 +    #define __NR__sigsuspend  __NR_sigsuspend
       
 45857 +    #define __NR__socketcall  __NR_socketcall
       
 45858 +    LSS_INLINE _syscall2(int, fstat64,             int, f,
       
 45859 +                         struct kernel_stat64 *, b)
       
 45860 +    LSS_INLINE _syscall5(int, _llseek,     uint, fd, ulong, hi, ulong, lo,
       
 45861 +                         loff_t *, res, uint, wh)
       
 45862 +    LSS_INLINE _syscall1(void*, mmap,              void*, a)
       
 45863 +    LSS_INLINE _syscall6(void*, mmap2,             void*, s,
       
 45864 +                         size_t,                   l, int,               p,
       
 45865 +                         int,                      f, int,               d,
       
 45866 +                         __off64_t,                o)
       
 45867 +    LSS_INLINE _syscall3(int,   _sigaction,        int,   s,
       
 45868 +                         const struct kernel_old_sigaction*,  a,
       
 45869 +                         struct kernel_old_sigaction*,        o)
       
 45870 +    LSS_INLINE _syscall1(int,   _sigpending, unsigned long*, s)
       
 45871 +    LSS_INLINE _syscall3(int,   _sigprocmask,      int,   h,
       
 45872 +                         const unsigned long*,     s,
       
 45873 +                         unsigned long*,           o)
       
 45874 +    #ifdef __PPC__
       
 45875 +    LSS_INLINE _syscall1(int, _sigsuspend,         unsigned long, s)
       
 45876 +    #else
       
 45877 +    LSS_INLINE _syscall3(int, _sigsuspend,         const void*, a,
       
 45878 +                         int,                      b,
       
 45879 +                         unsigned long,            s)
       
 45880 +    #endif
       
 45881 +    LSS_INLINE _syscall2(int, stat64,              const char *, p,
       
 45882 +                         struct kernel_stat64 *, b)
       
 45883 +
       
 45884 +    LSS_INLINE int LSS_NAME(sigaction)(int signum,
       
 45885 +                                       const struct kernel_sigaction *act,
       
 45886 +                                       struct kernel_sigaction *oldact) {
       
 45887 +      int old_errno = LSS_ERRNO;
       
 45888 +      int rc;
       
 45889 +      struct kernel_sigaction a;
       
 45890 +      if (act != NULL) {
       
 45891 +        a             = *act;
       
 45892 +        #ifdef __i386__
       
 45893 +        /* On i386, the kernel requires us to always set our own
       
 45894 +         * SA_RESTORER when using realtime signals. Otherwise, it does not
       
 45895 +         * know how to return from a signal handler. This function must have
       
 45896 +         * a "magic" signature that the "gdb" (and maybe the kernel?) can
       
 45897 +         * recognize.
       
 45898 +         * Apparently, a SA_RESTORER is implicitly set by the kernel, when
       
 45899 +         * using non-realtime signals.
       
 45900 +         *
       
 45901 +         * TODO: Test whether ARM needs a restorer
       
 45902 +         */
       
 45903 +        if (!(a.sa_flags & SA_RESTORER)) {
       
 45904 +          a.sa_flags   |= SA_RESTORER;
       
 45905 +          a.sa_restorer = (a.sa_flags & SA_SIGINFO)
       
 45906 +                          ? LSS_NAME(restore_rt)() : LSS_NAME(restore)();
       
 45907 +        }
       
 45908 +        #endif
       
 45909 +      }
       
 45910 +      rc = LSS_NAME(rt_sigaction)(signum, act ? &a : act, oldact,
       
 45911 +                                  (KERNEL_NSIG+7)/8);
       
 45912 +      if (rc < 0 && LSS_ERRNO == ENOSYS) {
       
 45913 +        struct kernel_old_sigaction oa, ooa, *ptr_a = &oa, *ptr_oa = &ooa;
       
 45914 +        if (!act) {
       
 45915 +          ptr_a            = NULL;
       
 45916 +        } else {
       
 45917 +          oa.sa_handler_   = act->sa_handler_;
       
 45918 +          memcpy(&oa.sa_mask, &act->sa_mask, sizeof(oa.sa_mask));
       
 45919 +          #ifndef __mips__
       
 45920 +          oa.sa_restorer   = act->sa_restorer;
       
 45921 +          #endif
       
 45922 +          oa.sa_flags      = act->sa_flags;
       
 45923 +        }
       
 45924 +        if (!oldact) {
       
 45925 +          ptr_oa           = NULL;
       
 45926 +        }
       
 45927 +        LSS_ERRNO = old_errno;
       
 45928 +        rc = LSS_NAME(_sigaction)(signum, ptr_a, ptr_oa);
       
 45929 +        if (rc == 0 && oldact) {
       
 45930 +          if (act) {
       
 45931 +            memcpy(oldact, act, sizeof(*act));
       
 45932 +          } else {
       
 45933 +            memset(oldact, 0, sizeof(*oldact));
       
 45934 +          }
       
 45935 +          oldact->sa_handler_    = ptr_oa->sa_handler_;
       
 45936 +          oldact->sa_flags       = ptr_oa->sa_flags;
       
 45937 +          memcpy(&oldact->sa_mask, &ptr_oa->sa_mask, sizeof(ptr_oa->sa_mask));
       
 45938 +          #ifndef __mips__
       
 45939 +          oldact->sa_restorer    = ptr_oa->sa_restorer;
       
 45940 +          #endif
       
 45941 +        }
       
 45942 +      }
       
 45943 +      return rc;
       
 45944 +    }
       
 45945 +
       
 45946 +    LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) {
       
 45947 +      int old_errno = LSS_ERRNO;
       
 45948 +      int rc = LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8);
       
 45949 +      if (rc < 0 && LSS_ERRNO == ENOSYS) {
       
 45950 +        LSS_ERRNO = old_errno;
       
 45951 +        LSS_NAME(sigemptyset)(set);
       
 45952 +        rc = LSS_NAME(_sigpending)(&set->sig[0]);
       
 45953 +      }
       
 45954 +      return rc;
       
 45955 +    }
       
 45956 +
       
 45957 +    LSS_INLINE int LSS_NAME(sigprocmask)(int how,
       
 45958 +                                         const struct kernel_sigset_t *set,
       
 45959 +                                         struct kernel_sigset_t *oldset) {
       
 45960 +      int olderrno = LSS_ERRNO;
       
 45961 +      int rc = LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8);
       
 45962 +      if (rc < 0 && LSS_ERRNO == ENOSYS) {
       
 45963 +        LSS_ERRNO = olderrno;
       
 45964 +        if (oldset) {
       
 45965 +          LSS_NAME(sigemptyset)(oldset);
       
 45966 +        }
       
 45967 +        rc = LSS_NAME(_sigprocmask)(how,
       
 45968 +                                    set ? &set->sig[0] : NULL,
       
 45969 +                                    oldset ? &oldset->sig[0] : NULL);
       
 45970 +      }
       
 45971 +      return rc;
       
 45972 +    }
       
 45973 +
       
 45974 +    LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) {
       
 45975 +      int olderrno = LSS_ERRNO;
       
 45976 +      int rc = LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8);
       
 45977 +      if (rc < 0 && LSS_ERRNO == ENOSYS) {
       
 45978 +        LSS_ERRNO = olderrno;
       
 45979 +        rc = LSS_NAME(_sigsuspend)(
       
 45980 +        #ifndef __PPC__
       
 45981 +                                   set, 0,
       
 45982 +        #endif
       
 45983 +                                   set->sig[0]);
       
 45984 +      }
       
 45985 +      return rc;
       
 45986 +    }
       
 45987 +  #endif
       
 45988 +  #if defined(__PPC__)
       
 45989 +    #undef LSS_SC_LOADARGS_0
       
 45990 +    #define LSS_SC_LOADARGS_0(dummy...)
       
 45991 +    #undef LSS_SC_LOADARGS_1
       
 45992 +    #define LSS_SC_LOADARGS_1(arg1)                                           \
       
 45993 +        __sc_4  = (unsigned long) (arg1)
       
 45994 +    #undef LSS_SC_LOADARGS_2
       
 45995 +    #define LSS_SC_LOADARGS_2(arg1, arg2)                                     \
       
 45996 +        LSS_SC_LOADARGS_1(arg1);                                              \
       
 45997 +        __sc_5  = (unsigned long) (arg2)
       
 45998 +    #undef LSS_SC_LOADARGS_3
       
 45999 +    #define LSS_SC_LOADARGS_3(arg1, arg2, arg3)                               \
       
 46000 +        LSS_SC_LOADARGS_2(arg1, arg2);                                        \
       
 46001 +        __sc_6  = (unsigned long) (arg3)
       
 46002 +    #undef LSS_SC_LOADARGS_4
       
 46003 +    #define LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4)                         \
       
 46004 +        LSS_SC_LOADARGS_3(arg1, arg2, arg3);                                  \
       
 46005 +        __sc_7  = (unsigned long) (arg4)
       
 46006 +    #undef LSS_SC_LOADARGS_5
       
 46007 +    #define LSS_SC_LOADARGS_5(arg1, arg2, arg3, arg4, arg5)                   \
       
 46008 +        LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4);                            \
       
 46009 +        __sc_8  = (unsigned long) (arg5)
       
 46010 +    #undef LSS_SC_BODY
       
 46011 +    #define LSS_SC_BODY(nr, type, opt, args...)                               \
       
 46012 +        long __sc_ret, __sc_err;                                              \
       
 46013 +        {                                                                     \
       
 46014 +          register unsigned long __sc_0 __asm__ ("r0") = __NR_socketcall;     \
       
 46015 +          register unsigned long __sc_3 __asm__ ("r3") = opt;                 \
       
 46016 +          register unsigned long __sc_4 __asm__ ("r4");                       \
       
 46017 +          register unsigned long __sc_5 __asm__ ("r5");                       \
       
 46018 +          register unsigned long __sc_6 __asm__ ("r6");                       \
       
 46019 +          register unsigned long __sc_7 __asm__ ("r7");                       \
       
 46020 +          register unsigned long __sc_8 __asm__ ("r8");                       \
       
 46021 +          LSS_SC_LOADARGS_##nr(args);                                         \
       
 46022 +          __asm__ __volatile__                                                \
       
 46023 +              ("stwu 1, -48(1)\n\t"                                           \
       
 46024 +               "stw 4, 20(1)\n\t"                                             \
       
 46025 +               "stw 5, 24(1)\n\t"                                             \
       
 46026 +               "stw 6, 28(1)\n\t"                                             \
       
 46027 +               "stw 7, 32(1)\n\t"                                             \
       
 46028 +               "stw 8, 36(1)\n\t"                                             \
       
 46029 +               "addi 4, 1, 20\n\t"                                            \
       
 46030 +               "sc\n\t"                                                       \
       
 46031 +               "mfcr %0"                                                      \
       
 46032 +                 : "=&r" (__sc_0),                                            \
       
 46033 +                   "=&r" (__sc_3), "=&r" (__sc_4),                            \
       
 46034 +                   "=&r" (__sc_5), "=&r" (__sc_6),                            \
       
 46035 +                   "=&r" (__sc_7), "=&r" (__sc_8)                             \
       
 46036 +                 : LSS_ASMINPUT_##nr                                          \
       
 46037 +                 : "cr0", "ctr", "memory");                                   \
       
 46038 +          __sc_ret = __sc_3;                                                  \
       
 46039 +          __sc_err = __sc_0;                                                  \
       
 46040 +        }                                                                     \
       
 46041 +        LSS_RETURN(type, __sc_ret, __sc_err)
       
 46042 +
       
 46043 +    LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg,
       
 46044 +                                         int flags){
       
 46045 +      LSS_SC_BODY(3, ssize_t, 17, s, msg, flags);
       
 46046 +    }
       
 46047 +
       
 46048 +    LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s,
       
 46049 +                                         const struct kernel_msghdr *msg,
       
 46050 +                                         int flags) {
       
 46051 +      LSS_SC_BODY(3, ssize_t, 16, s, msg, flags);
       
 46052 +    }
       
 46053 +
       
 46054 +    // TODO(csilvers): why is this ifdef'ed out?
       
 46055 +#if 0
       
 46056 +    LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len,
       
 46057 +                                        int flags,
       
 46058 +                                        const struct kernel_sockaddr *to,
       
 46059 +                                        unsigned int tolen) {
       
 46060 +      LSS_BODY(6, ssize_t, 11, s, buf, len, flags, to, tolen);
       
 46061 +    }
       
 46062 +#endif
       
 46063 +
       
 46064 +    LSS_INLINE int LSS_NAME(shutdown)(int s, int how) {
       
 46065 +      LSS_SC_BODY(2, int, 13, s, how);
       
 46066 +    }
       
 46067 +
       
 46068 +    LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) {
       
 46069 +      LSS_SC_BODY(3, int, 1, domain, type, protocol);
       
 46070 +    }
       
 46071 +
       
 46072 +    LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol,
       
 46073 +                                        int sv[2]) {
       
 46074 +      LSS_SC_BODY(4, int, 8, d, type, protocol, sv);
       
 46075 +    }
       
 46076 +  #endif
       
 46077 +  #if defined(__i386__) || defined(__ARM_ARCH_3__) ||                         \
       
 46078 +      (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)
       
 46079 +    #define __NR__socketcall  __NR_socketcall
       
 46080 +    LSS_INLINE _syscall2(int,      _socketcall,    int,   c,
       
 46081 +                         va_list,                  a)
       
 46082 +
       
 46083 +    LSS_INLINE int LSS_NAME(socketcall)(int op, ...) {
       
 46084 +      int rc;
       
 46085 +      va_list ap;
       
 46086 +      va_start(ap, op);
       
 46087 +      rc = LSS_NAME(_socketcall)(op, ap);
       
 46088 +      va_end(ap);
       
 46089 +      return rc;
       
 46090 +    }
       
 46091 +
       
 46092 +    LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg,
       
 46093 +                                         int flags){
       
 46094 +      return (ssize_t)LSS_NAME(socketcall)(17, s, msg, flags);
       
 46095 +    }
       
 46096 +
       
 46097 +    LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s,
       
 46098 +                                         const struct kernel_msghdr *msg,
       
 46099 +                                         int flags) {
       
 46100 +      return (ssize_t)LSS_NAME(socketcall)(16, s, msg, flags);
       
 46101 +    }
       
 46102 +
       
 46103 +    LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len,
       
 46104 +                                        int flags,
       
 46105 +                                        const struct kernel_sockaddr *to,
       
 46106 +                                        unsigned int tolen) {
       
 46107 +      return (ssize_t)LSS_NAME(socketcall)(11, s, buf, len, flags, to, tolen);
       
 46108 +    }
       
 46109 +
       
 46110 +    LSS_INLINE int LSS_NAME(shutdown)(int s, int how) {
       
 46111 +      return LSS_NAME(socketcall)(13, s, how);
       
 46112 +    }
       
 46113 +
       
 46114 +    LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) {
       
 46115 +      return LSS_NAME(socketcall)(1, domain, type, protocol);
       
 46116 +    }
       
 46117 +
       
 46118 +    LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol,
       
 46119 +                                        int sv[2]) {
       
 46120 +      return LSS_NAME(socketcall)(8, d, type, protocol, sv);
       
 46121 +    }
       
 46122 +  #endif
       
 46123 +  #if defined(__i386__) || defined(__PPC__)
       
 46124 +    LSS_INLINE _syscall4(int,   fstatat64,        int,   d,
       
 46125 +                         const char *,      p,
       
 46126 +                         struct kernel_stat64 *,   b,    int,   f)
       
 46127 +  #endif
       
 46128 +  #if defined(__i386__) || defined(__PPC__) ||                                \
       
 46129 +     (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32)
       
 46130 +    LSS_INLINE _syscall3(pid_t, waitpid,          pid_t, p,
       
 46131 +                         int*,              s,    int,   o)
       
 46132 +  #endif
       
 46133 +  #if defined(__mips__)
       
 46134 +    /* sys_pipe() on MIPS has non-standard calling conventions, as it returns
       
 46135 +     * both file handles through CPU registers.
       
 46136 +     */
       
 46137 +    LSS_INLINE int LSS_NAME(pipe)(int *p) {
       
 46138 +      register unsigned long __v0 __asm__("$2") = __NR_pipe;
       
 46139 +      register unsigned long __v1 __asm__("$3");
       
 46140 +      register unsigned long __r7 __asm__("$7");
       
 46141 +      __asm__ __volatile__ ("syscall\n"
       
 46142 +                            : "=&r"(__v0), "=&r"(__v1), "+r" (__r7)
       
 46143 +                            : "0"(__v0)
       
 46144 +                            : "$8", "$9", "$10", "$11", "$12",
       
 46145 +                              "$13", "$14", "$15", "$24", "memory");
       
 46146 +      if (__r7) {
       
 46147 +        LSS_ERRNO = __v0;
       
 46148 +        return -1;
       
 46149 +      } else {
       
 46150 +        p[0] = __v0;
       
 46151 +        p[1] = __v1;
       
 46152 +        return 0;
       
 46153 +      }
       
 46154 +    }
       
 46155 +  #else
       
 46156 +    LSS_INLINE _syscall1(int,     pipe,           int *, p)
       
 46157 +  #endif
       
 46158 +  /* TODO(csilvers): see if ppc can/should support this as well              */
       
 46159 +  #if defined(__i386__) || defined(__ARM_ARCH_3__) ||                         \
       
 46160 +     (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64)
       
 46161 +    #define __NR__statfs64  __NR_statfs64
       
 46162 +    #define __NR__fstatfs64 __NR_fstatfs64
       
 46163 +    LSS_INLINE _syscall3(int, _statfs64,     const char*, p,
       
 46164 +                         size_t, s,struct kernel_statfs64*, b)
       
 46165 +    LSS_INLINE _syscall3(int, _fstatfs64,          int,   f,
       
 46166 +                         size_t, s,struct kernel_statfs64*, b)
       
 46167 +    LSS_INLINE int LSS_NAME(statfs64)(const char *p,
       
 46168 +                                     struct kernel_statfs64 *b) {
       
 46169 +      return LSS_NAME(_statfs64)(p, sizeof(*b), b);
       
 46170 +    }
       
 46171 +    LSS_INLINE int LSS_NAME(fstatfs64)(int f,struct kernel_statfs64 *b) {
       
 46172 +      return LSS_NAME(_fstatfs64)(f, sizeof(*b), b);
       
 46173 +    }
       
 46174 +  #endif
       
 46175 +
       
 46176 +  LSS_INLINE int LSS_NAME(execv)(const char *path, const char *const argv[]) {
       
 46177 +    extern char **environ;
       
 46178 +    return LSS_NAME(execve)(path, argv, (const char *const *)environ);
       
 46179 +  }
       
 46180 +
       
 46181 +  LSS_INLINE pid_t LSS_NAME(gettid)() {
       
 46182 +    pid_t tid = LSS_NAME(_gettid)();
       
 46183 +    if (tid != -1) {
       
 46184 +      return tid;
       
 46185 +    }
       
 46186 +    return LSS_NAME(getpid)();
       
 46187 +  }
       
 46188 +
       
 46189 +  LSS_INLINE void *LSS_NAME(mremap)(void *old_address, size_t old_size,
       
 46190 +                                    size_t new_size, int flags, ...) {
       
 46191 +    va_list ap;
       
 46192 +    void *new_address, *rc;
       
 46193 +    va_start(ap, flags);
       
 46194 +    new_address = va_arg(ap, void *);
       
 46195 +    rc = LSS_NAME(_mremap)(old_address, old_size, new_size,
       
 46196 +                           flags, new_address);
       
 46197 +    va_end(ap);
       
 46198 +    return rc;
       
 46199 +  }
       
 46200 +
       
 46201 +  LSS_INLINE int LSS_NAME(ptrace_detach)(pid_t pid) {
       
 46202 +    /* PTRACE_DETACH can sometimes forget to wake up the tracee and it
       
 46203 +     * then sends job control signals to the real parent, rather than to
       
 46204 +     * the tracer. We reduce the risk of this happening by starting a
       
 46205 +     * whole new time slice, and then quickly sending a SIGCONT signal
       
 46206 +     * right after detaching from the tracee.
       
 46207 +     */
       
 46208 +    int rc, err;
       
 46209 +    LSS_NAME(sched_yield)();
       
 46210 +    rc = LSS_NAME(ptrace)(PTRACE_DETACH, pid, (void *)0, (void *)0);
       
 46211 +    err = LSS_ERRNO;
       
 46212 +    LSS_NAME(kill)(pid, SIGCONT);
       
 46213 +    LSS_ERRNO = err;
       
 46214 +    return rc;
       
 46215 +  }
       
 46216 +
       
 46217 +  LSS_INLINE int LSS_NAME(raise)(int sig) {
       
 46218 +    return LSS_NAME(kill)(LSS_NAME(getpid)(), sig);
       
 46219 +  }
       
 46220 +
       
 46221 +  LSS_INLINE int LSS_NAME(setpgrp)() {
       
 46222 +    return LSS_NAME(setpgid)(0, 0);
       
 46223 +  }
       
 46224 +
       
 46225 +  LSS_INLINE int LSS_NAME(sysconf)(int name) {
       
 46226 +    extern int __getpagesize(void);
       
 46227 +    switch (name) {
       
 46228 +      case _SC_OPEN_MAX: {
       
 46229 +        struct kernel_rlimit limit;
       
 46230 +        return LSS_NAME(getrlimit)(RLIMIT_NOFILE, &limit) < 0
       
 46231 +               ? 8192 : limit.rlim_cur;
       
 46232 +      }
       
 46233 +      case _SC_PAGESIZE:
       
 46234 +        return __getpagesize();
       
 46235 +      default:
       
 46236 +        errno = ENOSYS;
       
 46237 +        return -1;
       
 46238 +    }
       
 46239 +  }
       
 46240 +  #if defined(__x86_64__) ||                                                  \
       
 46241 +     (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64)
       
 46242 +    /* pread64() and pwrite64() do not exist on 64-bit systems...            */
       
 46243 +    LSS_INLINE _syscall3(int,     readahead,      int,         f,
       
 46244 +                         loff_t,         o, unsigned, c)
       
 46245 +  #else
       
 46246 +    #define __NR__pread64   __NR_pread64
       
 46247 +    #define __NR__pwrite64  __NR_pwrite64
       
 46248 +    #define __NR__readahead __NR_readahead
       
 46249 +    LSS_INLINE _syscall5(ssize_t, _pread64,        int,         f,
       
 46250 +                         void *,         b, size_t, c, unsigned, o1,
       
 46251 +                         unsigned, o2)
       
 46252 +    LSS_INLINE _syscall5(ssize_t, _pwrite64,       int,         f,
       
 46253 +                         const void *,   b, size_t, c, unsigned, o1,
       
 46254 +                         long, o2)
       
 46255 +    LSS_INLINE _syscall4(int, _readahead,          int,         f,
       
 46256 +                         unsigned,       o1, unsigned, o2, size_t, c)
       
 46257 +    /* We force 64bit-wide parameters onto the stack, then access each
       
 46258 +     * 32-bit component individually. This guarantees that we build the
       
 46259 +     * correct parameters independent of the native byte-order of the
       
 46260 +     * underlying architecture.
       
 46261 +     */
       
 46262 +    LSS_INLINE ssize_t LSS_NAME(pread64)(int fd, void *buf, size_t count,
       
 46263 +                                         loff_t off) {
       
 46264 +      union { loff_t off; unsigned arg[2]; } o = { off };
       
 46265 +      return LSS_NAME(_pread64)(fd, buf, count, o.arg[0], o.arg[1]);
       
 46266 +    }
       
 46267 +    LSS_INLINE ssize_t LSS_NAME(pwrite64)(int fd, const void *buf,
       
 46268 +                                          size_t count, loff_t off) {
       
 46269 +      union { loff_t off; unsigned arg[2]; } o = { off };
       
 46270 +      return LSS_NAME(_pwrite64)(fd, buf, count, o.arg[0], o.arg[1]);
       
 46271 +    }
       
 46272 +    LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, int len) {
       
 46273 +      union { loff_t off; unsigned arg[2]; } o = { off };
       
 46274 +      return LSS_NAME(_readahead)(fd, o.arg[0], o.arg[1], len);
       
 46275 +    }
       
 46276 +  #endif
       
 46277 +#endif
       
 46278 +
       
 46279 +#if defined(__cplusplus) && !defined(SYS_CPLUSPLUS)
       
 46280 +}
       
 46281 +#endif
       
 46282 +
       
 46283 +#endif
       
 46284 +#endif
       
 46285 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/memory.h b/toolkit/crashreporter/google-breakpad/src/common/linux/memory.h
       
 46286 new file mode 100644
       
 46287 --- /dev/null
       
 46288 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/memory.h
       
 46289 @@ -0,0 +1,181 @@
       
 46290 +// Copyright (c) 2009, Google Inc.
       
 46291 +// All rights reserved.
       
 46292 +//
       
 46293 +// Redistribution and use in source and binary forms, with or without
       
 46294 +// modification, are permitted provided that the following conditions are
       
 46295 +// met:
       
 46296 +//
       
 46297 +//     * Redistributions of source code must retain the above copyright
       
 46298 +// notice, this list of conditions and the following disclaimer.
       
 46299 +//     * Redistributions in binary form must reproduce the above
       
 46300 +// copyright notice, this list of conditions and the following disclaimer
       
 46301 +// in the documentation and/or other materials provided with the
       
 46302 +// distribution.
       
 46303 +//     * Neither the name of Google Inc. nor the names of its
       
 46304 +// contributors may be used to endorse or promote products derived from
       
 46305 +// this software without specific prior written permission.
       
 46306 +//
       
 46307 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 46308 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 46309 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 46310 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 46311 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 46312 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 46313 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 46314 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 46315 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 46316 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 46317 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 46318 +
       
 46319 +#ifndef CLIENT_LINUX_HANDLER_MEMORY_H_
       
 46320 +#define CLIENT_LINUX_HANDLER_MEMORY_H_
       
 46321 +
       
 46322 +#include <stdint.h>
       
 46323 +#include <stdlib.h>
       
 46324 +#include <unistd.h>
       
 46325 +#include <sys/mman.h>
       
 46326 +
       
 46327 +#include "common/linux/linux_syscall_support.h"
       
 46328 +
       
 46329 +namespace google_breakpad {
       
 46330 +
       
 46331 +// This is very simple allocator which fetches pages from the kernel directly.
       
 46332 +// Thus, it can be used even when the heap may be corrupted.
       
 46333 +//
       
 46334 +// There is no free operation. The pages are only freed when the object is
       
 46335 +// destroyed.
       
 46336 +class PageAllocator {
       
 46337 + public:
       
 46338 +  PageAllocator()
       
 46339 +      : page_size_(getpagesize()),
       
 46340 +        last_(NULL),
       
 46341 +        current_page_(NULL),
       
 46342 +        page_offset_(0) {
       
 46343 +  }
       
 46344 +
       
 46345 +  ~PageAllocator() {
       
 46346 +    FreeAll();
       
 46347 +  }
       
 46348 +
       
 46349 +  void *Alloc(unsigned bytes) {
       
 46350 +    if (!bytes)
       
 46351 +      return NULL;
       
 46352 +
       
 46353 +    if (current_page_ && page_size_ - page_offset_ >= bytes) {
       
 46354 +      uint8_t *const ret = current_page_ + page_offset_;
       
 46355 +      page_offset_ += bytes;
       
 46356 +      if (page_offset_ == page_size_) {
       
 46357 +        page_offset_ = 0;
       
 46358 +        current_page_ = NULL;
       
 46359 +      }
       
 46360 +
       
 46361 +      return ret;
       
 46362 +    }
       
 46363 +
       
 46364 +    const unsigned pages =
       
 46365 +        (bytes + sizeof(PageHeader) + page_size_ - 1) / page_size_;
       
 46366 +    uint8_t *const ret = GetNPages(pages);
       
 46367 +    if (!ret)
       
 46368 +      return NULL;
       
 46369 +
       
 46370 +    page_offset_ = (page_size_ - (page_size_ * pages - (bytes + sizeof(PageHeader)))) % page_size_;
       
 46371 +    current_page_ = page_offset_ ? ret + page_size_ * (pages - 1) : NULL;
       
 46372 +
       
 46373 +    return ret + sizeof(PageHeader);
       
 46374 +  }
       
 46375 +
       
 46376 + private:
       
 46377 +  uint8_t *GetNPages(unsigned num_pages) {
       
 46378 +#ifdef __x86_64
       
 46379 +    void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,
       
 46380 +                       MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       
 46381 +#else
       
 46382 +    void *a = sys_mmap2(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE,
       
 46383 +                        MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
       
 46384 +#endif
       
 46385 +    if (a == MAP_FAILED)
       
 46386 +      return NULL;
       
 46387 +
       
 46388 +    struct PageHeader *header = reinterpret_cast<PageHeader*>(a);
       
 46389 +    header->next = last_;
       
 46390 +    header->num_pages = num_pages;
       
 46391 +    last_ = header;
       
 46392 +
       
 46393 +    return reinterpret_cast<uint8_t*>(a);
       
 46394 +  }
       
 46395 +
       
 46396 +  void FreeAll() {
       
 46397 +    PageHeader *next;
       
 46398 +
       
 46399 +    for (PageHeader *cur = last_; cur; cur = next) {
       
 46400 +      next = cur->next;
       
 46401 +      sys_munmap(cur, cur->num_pages * page_size_);
       
 46402 +    }
       
 46403 +  }
       
 46404 +
       
 46405 +  struct PageHeader {
       
 46406 +    PageHeader *next;  // pointer to the start of the next set of pages.
       
 46407 +    unsigned num_pages;  // the number of pages in this set.
       
 46408 +  };
       
 46409 +
       
 46410 +  const unsigned page_size_;
       
 46411 +  PageHeader *last_;
       
 46412 +  uint8_t *current_page_;
       
 46413 +  unsigned page_offset_;
       
 46414 +};
       
 46415 +
       
 46416 +// A wasteful vector is like a normal std::vector, except that it's very much
       
 46417 +// simplier and it allocates memory from a PageAllocator. It's wasteful
       
 46418 +// because, when resizing, it always allocates a whole new array since the
       
 46419 +// PageAllocator doesn't support realloc.
       
 46420 +template<class T>
       
 46421 +class wasteful_vector {
       
 46422 + public:
       
 46423 +  wasteful_vector(PageAllocator *allocator, unsigned size_hint = 16)
       
 46424 +      : allocator_(allocator),
       
 46425 +        a_((T*) allocator->Alloc(sizeof(T) * size_hint)),
       
 46426 +        allocated_(size_hint),
       
 46427 +        used_(0) {
       
 46428 +  }
       
 46429 +
       
 46430 +  void push_back(const T& new_element) {
       
 46431 +    if (used_ == allocated_)
       
 46432 +      Realloc(allocated_ * 2);
       
 46433 +    a_[used_++] = new_element;
       
 46434 +  }
       
 46435 +
       
 46436 +  size_t size() const {
       
 46437 +    return used_;
       
 46438 +  }
       
 46439 +
       
 46440 +  T& operator[](size_t index) {
       
 46441 +    return a_[index];
       
 46442 +  }
       
 46443 +
       
 46444 +  const T& operator[](size_t index) const {
       
 46445 +    return a_[index];
       
 46446 +  }
       
 46447 +
       
 46448 + private:
       
 46449 +  void Realloc(unsigned new_size) {
       
 46450 +    T *new_array =
       
 46451 +        reinterpret_cast<T*>(allocator_->Alloc(sizeof(T) * new_size));
       
 46452 +    memcpy(new_array, a_, used_ * sizeof(T));
       
 46453 +    a_ = new_array;
       
 46454 +    allocated_ = new_size;
       
 46455 +  }
       
 46456 +
       
 46457 +  PageAllocator *const allocator_;
       
 46458 +  T *a_;  // pointer to an array of |allocated_| elements.
       
 46459 +  unsigned allocated_;  // size of |a_|, in elements.
       
 46460 +  unsigned used_;  // number of used slots in |a_|.
       
 46461 +};
       
 46462 +
       
 46463 +}  // namespace google_breakpad
       
 46464 +
       
 46465 +inline void* operator new(size_t nbytes,
       
 46466 +                          google_breakpad::PageAllocator& allocator) {
       
 46467 +   return allocator.Alloc(nbytes);
       
 46468 +}
       
 46469 +
       
 46470 +#endif  // CLIENT_LINUX_HANDLER_MEMORY_H_
       
 46471 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/memory_unittest.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/memory_unittest.cc
       
 46472 new file mode 100644
       
 46473 --- /dev/null
       
 46474 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/memory_unittest.cc
       
 46475 @@ -0,0 +1,84 @@
       
 46476 +// Copyright (c) 2009, Google Inc.
       
 46477 +// All rights reserved.
       
 46478 +//
       
 46479 +// Redistribution and use in source and binary forms, with or without
       
 46480 +// modification, are permitted provided that the following conditions are
       
 46481 +// met:
       
 46482 +//
       
 46483 +//     * Redistributions of source code must retain the above copyright
       
 46484 +// notice, this list of conditions and the following disclaimer.
       
 46485 +//     * Redistributions in binary form must reproduce the above
       
 46486 +// copyright notice, this list of conditions and the following disclaimer
       
 46487 +// in the documentation and/or other materials provided with the
       
 46488 +// distribution.
       
 46489 +//     * Neither the name of Google Inc. nor the names of its
       
 46490 +// contributors may be used to endorse or promote products derived from
       
 46491 +// this software without specific prior written permission.
       
 46492 +//
       
 46493 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 46494 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 46495 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 46496 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 46497 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 46498 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 46499 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 46500 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 46501 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 46502 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 46503 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 46504 +
       
 46505 +#include "common/linux/memory.h"
       
 46506 +#include "testing/gtest/include/gtest/gtest.h"
       
 46507 +
       
 46508 +using namespace google_breakpad;
       
 46509 +
       
 46510 +namespace {
       
 46511 +typedef testing::Test PageAllocatorTest;
       
 46512 +}
       
 46513 +
       
 46514 +TEST(PageAllocatorTest, Setup) {
       
 46515 +  PageAllocator allocator;
       
 46516 +}
       
 46517 +
       
 46518 +TEST(PageAllocatorTest, SmallObjects) {
       
 46519 +  PageAllocator allocator;
       
 46520 +
       
 46521 +  for (unsigned i = 1; i < 1024; ++i) {
       
 46522 +    uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
       
 46523 +    ASSERT_FALSE(p == NULL);
       
 46524 +    memset(p, 0, i);
       
 46525 +  }
       
 46526 +}
       
 46527 +
       
 46528 +TEST(PageAllocatorTest, LargeObject) {
       
 46529 +  PageAllocator allocator;
       
 46530 +
       
 46531 +  uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(10000));
       
 46532 +  ASSERT_FALSE(p == NULL);
       
 46533 +  for (unsigned i = 1; i < 10; ++i) {
       
 46534 +    uint8_t *p = reinterpret_cast<uint8_t*>(allocator.Alloc(i));
       
 46535 +    ASSERT_FALSE(p == NULL);
       
 46536 +    memset(p, 0, i);
       
 46537 +  }
       
 46538 +}
       
 46539 +
       
 46540 +namespace {
       
 46541 +typedef testing::Test WastefulVectorTest;
       
 46542 +}
       
 46543 +
       
 46544 +TEST(WastefulVectorTest, Setup) {
       
 46545 +  PageAllocator allocator_;
       
 46546 +  wasteful_vector<int> v(&allocator_);
       
 46547 +  ASSERT_EQ(v.size(), 0u);
       
 46548 +}
       
 46549 +
       
 46550 +TEST(WastefulVectorTest, Simple) {
       
 46551 +  PageAllocator allocator_;
       
 46552 +  wasteful_vector<int> v(&allocator_);
       
 46553 +
       
 46554 +  for (unsigned i = 0; i < 256; ++i)
       
 46555 +    v.push_back(i);
       
 46556 +  ASSERT_EQ(v.size(), 256u);
       
 46557 +  for (unsigned i = 0; i < 256; ++i)
       
 46558 +    ASSERT_EQ(v[i], i);
       
 46559 +}
       
 46560 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/module.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/module.cc
       
 46561 new file mode 100644
       
 46562 --- /dev/null
       
 46563 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/module.cc
       
 46564 @@ -0,0 +1,167 @@
       
 46565 +// Copyright (c) 2009, Google Inc.
       
 46566 +// All rights reserved.
       
 46567 +//
       
 46568 +// Redistribution and use in source and binary forms, with or without
       
 46569 +// modification, are permitted provided that the following conditions are
       
 46570 +// met:
       
 46571 +//
       
 46572 +//     * Redistributions of source code must retain the above copyright
       
 46573 +// notice, this list of conditions and the following disclaimer.
       
 46574 +//     * Redistributions in binary form must reproduce the above
       
 46575 +// copyright notice, this list of conditions and the following disclaimer
       
 46576 +// in the documentation and/or other materials provided with the
       
 46577 +// distribution.
       
 46578 +//     * Neither the name of Google Inc. nor the names of its
       
 46579 +// contributors may be used to endorse or promote products derived from
       
 46580 +// this software without specific prior written permission.
       
 46581 +//
       
 46582 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 46583 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 46584 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 46585 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 46586 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 46587 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 46588 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 46589 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 46590 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 46591 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 46592 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 46593 +
       
 46594 +#include <cerrno>
       
 46595 +#include <cstring>
       
 46596 +#include "common/linux/module.h"
       
 46597 +
       
 46598 +namespace google_breakpad {
       
 46599 +
       
 46600 +Module::Module(const string &name, const string &os,
       
 46601 +               const string &architecture, const string &id) :
       
 46602 +    name_(name),
       
 46603 +    os_(os),
       
 46604 +    architecture_(architecture),
       
 46605 +    id_(id),
       
 46606 +    load_address_(0) { }
       
 46607 +
       
 46608 +Module::~Module() {
       
 46609 +  for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); it++)
       
 46610 +    delete it->second;
       
 46611 +  for (vector<Function *>::iterator it = functions_.begin();
       
 46612 +       it != functions_.end(); it++)
       
 46613 +    delete *it;
       
 46614 +}
       
 46615 +
       
 46616 +void Module::SetLoadAddress(Address address) {
       
 46617 +  load_address_ = address;
       
 46618 +}
       
 46619 +
       
 46620 +void Module::AddFunction(Function *function) {
       
 46621 +  functions_.push_back(function);
       
 46622 +}
       
 46623 +
       
 46624 +void Module::AddFunctions(vector<Function *>::iterator begin,
       
 46625 +                          vector<Function *>::iterator end) {
       
 46626 +  functions_.insert(functions_.end(), begin, end);
       
 46627 +}
       
 46628 +
       
 46629 +Module::File *Module::FindFile(const string &name) {
       
 46630 +  // A tricky bit here.  The key of each map entry needs to be a
       
 46631 +  // pointer to the entry's File's name string.  This means that we
       
 46632 +  // can't do the initial lookup with any operation that would create
       
 46633 +  // an empty entry for us if the name isn't found (like, say,
       
 46634 +  // operator[] or insert do), because such a created entry's key will
       
 46635 +  // be a pointer the string passed as our argument.  Since the key of
       
 46636 +  // a map's value type is const, we can't fix it up once we've
       
 46637 +  // created our file.  lower_bound does the lookup without doing an
       
 46638 +  // insertion, and returns a good hint iterator to pass to insert.
       
 46639 +  // Our "destiny" is where we belong, whether we're there or not now.
       
 46640 +  FileByNameMap::iterator destiny = files_.lower_bound(&name);
       
 46641 +  if (destiny == files_.end()
       
 46642 +      || *destiny->first != name) {  // Repeated string comparison, boo hoo.
       
 46643 +    File *file = new File;
       
 46644 +    file->name_ = name;
       
 46645 +    file->source_id_ = -1;
       
 46646 +    destiny = files_.insert(destiny,
       
 46647 +                            FileByNameMap::value_type(&file->name_, file));
       
 46648 +  }
       
 46649 +  return destiny->second;
       
 46650 +}
       
 46651 +
       
 46652 +Module::File *Module::FindFile(const char *name) {
       
 46653 +  string name_string = name;
       
 46654 +  return FindFile(name_string);
       
 46655 +}
       
 46656 +
       
 46657 +void Module::AssignSourceIds() {
       
 46658 +  // First, give every source file an id of -1.
       
 46659 +  for (FileByNameMap::iterator file_it = files_.begin();
       
 46660 +       file_it != files_.end(); file_it++)
       
 46661 +    file_it->second->source_id_ = -1;
       
 46662 +
       
 46663 +  // Next, mark all files actually cited by our functions' line number
       
 46664 +  // info, by setting each one's source id to zero.
       
 46665 +  for (vector<Function *>::const_iterator func_it = functions_.begin();
       
 46666 +       func_it != functions_.end(); func_it++) {
       
 46667 +    Function *func = *func_it;
       
 46668 +    for (vector<Line>::iterator line_it = func->lines_.begin();
       
 46669 +         line_it != func->lines_.end(); line_it++)
       
 46670 +      line_it->file_->source_id_ = 0;
       
 46671 +  }
       
 46672 +
       
 46673 +  // Finally, assign source ids to those files that have been marked.
       
 46674 +  // We could have just assigned source id numbers while traversing
       
 46675 +  // the line numbers, but doing it this way numbers the files in
       
 46676 +  // lexicographical order by name, which is neat.
       
 46677 +  int next_source_id = 0;
       
 46678 +  for (FileByNameMap::iterator file_it = files_.begin();
       
 46679 +       file_it != files_.end(); file_it++)
       
 46680 +    if (! file_it->second->source_id_)
       
 46681 +      file_it->second->source_id_ = next_source_id++;
       
 46682 +}
       
 46683 +
       
 46684 +bool Module::ReportError() {
       
 46685 +  fprintf(stderr, "error writing symbol file: %s\n",
       
 46686 +          strerror (errno));
       
 46687 +  return false;
       
 46688 +}
       
 46689 +
       
 46690 +bool Module::Write(FILE *stream) {
       
 46691 +  if (0 > fprintf(stream, "MODULE %s %s %s %s\n",
       
 46692 +                  os_.c_str(), architecture_.c_str(), id_.c_str(),
       
 46693 +                  name_.c_str()))
       
 46694 +    return ReportError();
       
 46695 +
       
 46696 +  // Write out files.
       
 46697 +  AssignSourceIds();
       
 46698 +  for (FileByNameMap::iterator file_it = files_.begin();
       
 46699 +       file_it != files_.end(); file_it++) {
       
 46700 +    File *file = file_it->second;
       
 46701 +    if (file->source_id_ >= 0) {
       
 46702 +      if (0 > fprintf(stream, "FILE %d %s\n",
       
 46703 +                      file->source_id_, file->name_.c_str()))
       
 46704 +        return ReportError();
       
 46705 +    }
       
 46706 +  }
       
 46707 +
       
 46708 +  // Write out functions and their lines.
       
 46709 +  for (vector<Function *>::const_iterator func_it = functions_.begin();
       
 46710 +       func_it != functions_.end(); func_it++) {
       
 46711 +    Function *func = *func_it;
       
 46712 +    if (0 > fprintf(stream, "FUNC %lx %lx %lu %s\n",
       
 46713 +                    (unsigned long) (func->address_ - load_address_),
       
 46714 +                    (unsigned long) func->size_,
       
 46715 +                    (unsigned long) func->parameter_size_,
       
 46716 +                    func->name_.c_str()))
       
 46717 +      return ReportError();
       
 46718 +    for (vector<Line>::iterator line_it = func->lines_.begin();
       
 46719 +         line_it != func->lines_.end(); line_it++)
       
 46720 +      if (0 > fprintf(stream, "%lx %lx %d %d\n",
       
 46721 +                      (unsigned long) (line_it->address_ - load_address_),
       
 46722 +                      (unsigned long) line_it->size_,
       
 46723 +                      line_it->number_,
       
 46724 +                      line_it->file_->source_id_))
       
 46725 +        return ReportError();
       
 46726 +  }
       
 46727 +
       
 46728 +  return true;
       
 46729 +}
       
 46730 +
       
 46731 +} // namespace google_breakpad
       
 46732 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/module.h b/toolkit/crashreporter/google-breakpad/src/common/linux/module.h
       
 46733 new file mode 100644
       
 46734 --- /dev/null
       
 46735 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/module.h
       
 46736 @@ -0,0 +1,193 @@
       
 46737 +// Copyright (c) 2009, Google Inc.             -*- mode: c++ -*-
       
 46738 +// All rights reserved.
       
 46739 +//
       
 46740 +// Redistribution and use in source and binary forms, with or without
       
 46741 +// modification, are permitted provided that the following conditions are
       
 46742 +// met:
       
 46743 +//
       
 46744 +//     * Redistributions of source code must retain the above copyright
       
 46745 +// notice, this list of conditions and the following disclaimer.
       
 46746 +//     * Redistributions in binary form must reproduce the above
       
 46747 +// copyright notice, this list of conditions and the following disclaimer
       
 46748 +// in the documentation and/or other materials provided with the
       
 46749 +// distribution.
       
 46750 +//     * Neither the name of Google Inc. nor the names of its
       
 46751 +// contributors may be used to endorse or promote products derived from
       
 46752 +// this software without specific prior written permission.
       
 46753 +//
       
 46754 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 46755 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 46756 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 46757 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 46758 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 46759 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 46760 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 46761 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 46762 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 46763 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 46764 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 46765 +
       
 46766 +// module.h: defines google_breakpad::Module, for writing breakpad symbol files
       
 46767 +
       
 46768 +#ifndef COMMON_LINUX_MODULE_H__
       
 46769 +#define COMMON_LINUX_MODULE_H__
       
 46770 +
       
 46771 +#include <map>
       
 46772 +#include <string>
       
 46773 +#include <vector>
       
 46774 +#include <cstdio>
       
 46775 +
       
 46776 +#include "google_breakpad/common/breakpad_types.h"
       
 46777 +
       
 46778 +namespace google_breakpad {
       
 46779 +
       
 46780 +using std::string;
       
 46781 +using std::vector;
       
 46782 +using std::map;
       
 46783 +
       
 46784 +// A Module represents the contents of a module, and supports methods
       
 46785 +// for adding information produced by parsing STABS or DWARF data
       
 46786 +// --- possibly both from the same file --- and then writing out the
       
 46787 +// unified contents as a Breakpad-format symbol file.
       
 46788 +class Module {
       
 46789 + public:
       
 46790 +  // The type of addresses and sizes in a symbol table.
       
 46791 +  typedef u_int64_t Address;
       
 46792 +  struct File;
       
 46793 +  struct Function;
       
 46794 +  struct Line;
       
 46795 +
       
 46796 +  // Addresses appearing in File, Function, and Line structures are
       
 46797 +  // absolute, not relative to the the module's load address.  That
       
 46798 +  // is, if the module were loaded at its nominal load address, the
       
 46799 +  // addresses would be correct.
       
 46800 +
       
 46801 +  // A source file.
       
 46802 +  struct File {
       
 46803 +    // The name of the source file.
       
 46804 +    string name_;
       
 46805 +
       
 46806 +    // The file's source id.  The Write member function clears this
       
 46807 +    // field and assigns source ids a fresh, so any value placed here
       
 46808 +    // before calling Write will be lost.
       
 46809 +    int source_id_;
       
 46810 +  };
       
 46811 +
       
 46812 +  // A function.
       
 46813 +  struct Function {
       
 46814 +    // For sorting by address.  (Not style-guide compliant, but it's
       
 46815 +    // stupid not to put this in the struct.)
       
 46816 +    static bool CompareByAddress(const Function *x, const Function *y) {
       
 46817 +      return x->address_ < y->address_;
       
 46818 +    }
       
 46819 +
       
 46820 +    // The function's name.
       
 46821 +    string name_;
       
 46822 +    
       
 46823 +    // The start address and length of the function's code.
       
 46824 +    Address address_, size_;
       
 46825 +
       
 46826 +    // The function's parameter size.
       
 46827 +    Address parameter_size_;
       
 46828 +
       
 46829 +    // Source lines belonging to this function, sorted by increasing
       
 46830 +    // address.
       
 46831 +    vector<Line> lines_;
       
 46832 +  };
       
 46833 +
       
 46834 +  // A source line.
       
 46835 +  struct Line {
       
 46836 +    // For sorting by address.  (Not style-guide compliant, but it's
       
 46837 +    // stupid not to put this in the struct.)
       
 46838 +    static bool CompareByAddress(const Module::Line &x, const Module::Line &y) {
       
 46839 +      return x.address_ < y.address_;
       
 46840 +    }
       
 46841 +
       
 46842 +    Address address_, size_;    // The address and size of the line's code.
       
 46843 +    File *file_;                // The source file.
       
 46844 +    int number_;                // The source line number.
       
 46845 +  };
       
 46846 +    
       
 46847 +  // Create a new module with the given name, operating system,
       
 46848 +  // architecture, and ID string.
       
 46849 +  Module(const string &name, const string &os, const string &architecture, 
       
 46850 +         const string &id);
       
 46851 +  ~Module();
       
 46852 +
       
 46853 +  // Set the module's load address to LOAD_ADDRESS; addresses given
       
 46854 +  // for functions and lines will be written to the Breakpad symbol
       
 46855 +  // file as offsets from this address.  Construction initializes this
       
 46856 +  // module's load address to zero: addresses written to the symbol
       
 46857 +  // file will be the same as they appear in the File and Line
       
 46858 +  // structures.
       
 46859 +  void SetLoadAddress(Address load_address);
       
 46860 +
       
 46861 +  // Add FUNCTION to the module.
       
 46862 +  // Destroying this module frees all Function objects that have been
       
 46863 +  // added with this function.
       
 46864 +  void AddFunction(Function *function);
       
 46865 +
       
 46866 +  // Add all the functions in [BEGIN,END) to the module.
       
 46867 +  // Destroying this module frees all Function objects that have been
       
 46868 +  // added with this function.
       
 46869 +  void AddFunctions(vector<Function *>::iterator begin,
       
 46870 +                    vector<Function *>::iterator end);
       
 46871 +
       
 46872 +  // If this module has a file named NAME, return a pointer to it.  If
       
 46873 +  // it has none, then create one and return a pointer to the new
       
 46874 +  // file.  Destroying this module frees all File objects that have
       
 46875 +  // been created using this function, or with Insert.
       
 46876 +  File *FindFile(const string &name);
       
 46877 +  File *FindFile(const char *name);
       
 46878 +
       
 46879 +  // Write this module to STREAM in the breakpad symbol format.
       
 46880 +  // Return true if all goes well, or false if an error occurs.  This
       
 46881 +  // method writes out:
       
 46882 +  // - a header based on the values given to the constructor,
       
 46883 +  // - the source files added via FindFile, and finally
       
 46884 +  // - the functions added via AddFunctions, each with its lines.
       
 46885 +  // Addresses in the output are all relative to the load address
       
 46886 +  // established by SetLoadAddress.
       
 46887 +  bool Write(FILE *stream);
       
 46888 +
       
 46889 +private:
       
 46890 +
       
 46891 +  // Find those files in this module that are actually referred to by
       
 46892 +  // functions' line number data, and assign them source id numbers.
       
 46893 +  // Set the source id numbers for all other files --- unused by the
       
 46894 +  // source line data --- to -1.  We do this before writing out the
       
 46895 +  // symbol file, at which point we omit any unused files.
       
 46896 +  void AssignSourceIds();
       
 46897 +
       
 46898 +  // Report an error that has occurred writing the symbol file, using
       
 46899 +  // errno to find the appropriate cause.  Return false.
       
 46900 +  static bool ReportError();
       
 46901 +
       
 46902 +  // Module header entries.
       
 46903 +  string name_, os_, architecture_, id_;
       
 46904 +
       
 46905 +  // The module's nominal load address.  Addresses for functions and
       
 46906 +  // lines are absolute, assuming the module is loaded at this
       
 46907 +  // address.
       
 46908 +  Address load_address_;
       
 46909 +
       
 46910 +  // Relation for maps whose keys are strings shared with some other
       
 46911 +  // structure.
       
 46912 +  struct CompareStringPtrs {
       
 46913 +    bool operator()(const string *x, const string *y) { return *x < *y; };
       
 46914 +  };
       
 46915 +
       
 46916 +  // A map from filenames to File structures.  The map's keys are
       
 46917 +  // pointers to the Files' names.
       
 46918 +  typedef map<const string *, File *, CompareStringPtrs> FileByNameMap;
       
 46919 +
       
 46920 +  // The module owns all the files and functions that have been added
       
 46921 +  // to it; destroying the module frees the Files and Functions these
       
 46922 +  // point to.
       
 46923 +  FileByNameMap files_;                 // This module's source files.  
       
 46924 +  vector<Function *> functions_;        // This module's functions.
       
 46925 +};
       
 46926 +
       
 46927 +} // namespace google_breakpad
       
 46928 +
       
 46929 +#endif  // COMMON_LINUX_MODULE_H__
       
 46930 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader.cc
       
 46931 new file mode 100644
       
 46932 --- /dev/null
       
 46933 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader.cc
       
 46934 @@ -0,0 +1,200 @@
       
 46935 +// Copyright 2009 Google Inc. All Rights Reserved.
       
 46936 +//
       
 46937 +// Redistribution and use in source and binary forms, with or without
       
 46938 +// modification, are permitted provided that the following conditions are
       
 46939 +// met:
       
 46940 +//
       
 46941 +//     * Redistributions of source code must retain the above copyright
       
 46942 +// notice, this list of conditions and the following disclaimer.
       
 46943 +//     * Redistributions in binary form must reproduce the above
       
 46944 +// copyright notice, this list of conditions and the following disclaimer
       
 46945 +// in the documentation and/or other materials provided with the
       
 46946 +// distribution.
       
 46947 +//     * Neither the name of Google Inc. nor the names of its
       
 46948 +// contributors may be used to endorse or promote products derived from
       
 46949 +// this software without specific prior written permission.
       
 46950 +//
       
 46951 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 46952 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 46953 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 46954 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 46955 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 46956 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 46957 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 46958 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 46959 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 46960 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 46961 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 46962 +
       
 46963 +// This file implements the google_breakpad::StabsReader class.
       
 46964 +
       
 46965 +#include <a.out.h>
       
 46966 +#include <stab.h>
       
 46967 +#include <cstring>
       
 46968 +#include <cassert>
       
 46969 +
       
 46970 +#include "common/linux/stabs_reader.h"
       
 46971 +
       
 46972 +namespace google_breakpad {
       
 46973 +
       
 46974 +StabsReader::StabsReader(const uint8_t *stab,    size_t stab_size,
       
 46975 +                         const uint8_t *stabstr, size_t stabstr_size,
       
 46976 +                         StabsHandler *handler) :
       
 46977 +    stabstr_(stabstr),
       
 46978 +    stabstr_size_(stabstr_size),
       
 46979 +    handler_(handler),
       
 46980 +    symbol_(NULL),
       
 46981 +    current_source_file_(NULL) { 
       
 46982 +  symbols_ = reinterpret_cast<const struct nlist *>(stab);
       
 46983 +  symbols_end_ = symbols_ + (stab_size / sizeof (*symbols_));
       
 46984 +}
       
 46985 +
       
 46986 +const char *StabsReader::SymbolString() {
       
 46987 +  ptrdiff_t offset = symbol_->n_un.n_strx;
       
 46988 +  if (offset < 0 || (size_t) offset >= stabstr_size_) {
       
 46989 +    handler_->Warning("symbol %d: name offset outside the string section",
       
 46990 +                      symbol_ - symbols_);
       
 46991 +    // Return our null string, to keep our promise about all names being
       
 46992 +    // taken from the string section.
       
 46993 +    offset = 0;
       
 46994 +  }
       
 46995 +  return reinterpret_cast<const char *>(stabstr_ + offset);
       
 46996 +}
       
 46997 +
       
 46998 +bool StabsReader::Process() {
       
 46999 +  symbol_ = symbols_;
       
 47000 +  while (symbol_ < symbols_end_) {
       
 47001 +    if (symbol_->n_type == N_SO) {
       
 47002 +      if (! ProcessCompilationUnit())
       
 47003 +        return false;
       
 47004 +    } else
       
 47005 +      symbol_++;
       
 47006 +  }
       
 47007 +  return true;
       
 47008 +}
       
 47009 +
       
 47010 +bool StabsReader::ProcessCompilationUnit() {
       
 47011 +  assert(symbol_ < symbols_end_ && symbol_->n_type == N_SO);
       
 47012 +
       
 47013 +  // There may be an N_SO entry whose name ends with a slash,
       
 47014 +  // indicating the directory in which the compilation occurred.
       
 47015 +  // The build directory defaults to NULL.
       
 47016 +  const char *build_directory = NULL;  
       
 47017 +  {
       
 47018 +    const char *name = SymbolString();
       
 47019 +    if (name[0] && name[strlen(name) - 1] == '/') {
       
 47020 +      build_directory = name;
       
 47021 +      symbol_++;
       
 47022 +    }
       
 47023 +  }
       
 47024 +      
       
 47025 +  // We expect to see an N_SO entry with a filename next, indicating
       
 47026 +  // the start of the compilation unit.
       
 47027 +  {
       
 47028 +    if (symbol_ >= symbols_end_ || symbol_->n_type != N_SO)
       
 47029 +      return true;
       
 47030 +    const char *name = SymbolString();
       
 47031 +    if (name[0] == '\0') {
       
 47032 +      // This seems to be a stray end-of-compilation-unit marker;
       
 47033 +      // consume it, but don't report the end, since we didn't see a
       
 47034 +      // beginning.
       
 47035 +      symbol_++;
       
 47036 +      return true;
       
 47037 +    }
       
 47038 +    current_source_file_ = name;
       
 47039 +  }
       
 47040 +
       
 47041 +  if (! handler_->StartCompilationUnit(current_source_file_,
       
 47042 +                                       SymbolValue(),
       
 47043 +                                       build_directory))
       
 47044 +    return false;
       
 47045 +
       
 47046 +  symbol_++;
       
 47047 +
       
 47048 +  // The STABS documentation says that some compilers may emit
       
 47049 +  // additional N_SO entries with names immediately following the
       
 47050 +  // first, and that they should be ignored.  However, the original
       
 47051 +  // Breakpad STABS reader doesn't ignore them, so we won't either.
       
 47052 +
       
 47053 +  // Process the body of the compilation unit, up to the next N_SO.
       
 47054 +  while (symbol_ < symbols_end_ && symbol_->n_type != N_SO) {
       
 47055 +    if (symbol_->n_type == N_FUN) {
       
 47056 +      if (! ProcessFunction())
       
 47057 +        return false;
       
 47058 +    } else
       
 47059 +      // Ignore anything else.
       
 47060 +      symbol_++;
       
 47061 +  }
       
 47062 +
       
 47063 +  // An N_SO with an empty name indicates the end of the compilation
       
 47064 +  // unit.  Default to zero.
       
 47065 +  uint64_t ending_address = 0;
       
 47066 +  if (symbol_ < symbols_end_) {
       
 47067 +    assert(symbol_->n_type == N_SO);
       
 47068 +    const char *name = SymbolString();
       
 47069 +    if (name[0] == '\0') {
       
 47070 +      ending_address = SymbolValue();
       
 47071 +      symbol_++;
       
 47072 +    }
       
 47073 +  }
       
 47074 +
       
 47075 +  if (! handler_->EndCompilationUnit(ending_address))
       
 47076 +    return false;
       
 47077 +
       
 47078 +  return true;
       
 47079 +}          
       
 47080 +
       
 47081 +bool StabsReader::ProcessFunction() {
       
 47082 +  assert(symbol_ < symbols_end_ && symbol_->n_type == N_FUN);
       
 47083 +
       
 47084 +  uint64_t function_address = SymbolValue();
       
 47085 +  // The STABS string for an N_FUN entry is the name of the function,
       
 47086 +  // followed by a colon, followed by type information for the
       
 47087 +  // function.  We want to pass the name alone to StartFunction.
       
 47088 +  const char *stab_string = SymbolString();
       
 47089 +  const char *name_end = strchr(stab_string, ':');
       
 47090 +  if (! name_end)
       
 47091 +    name_end = stab_string + strlen(stab_string);
       
 47092 +  std::string name(stab_string, name_end - stab_string);
       
 47093 +  if (! handler_->StartFunction(name, function_address))
       
 47094 +    return false;
       
 47095 +  symbol_++;
       
 47096 +
       
 47097 +  while (symbol_ < symbols_end_) {
       
 47098 +    if (symbol_->n_type == N_SO || symbol_->n_type == N_FUN)
       
 47099 +      break;
       
 47100 +    else if (symbol_->n_type == N_SLINE) {
       
 47101 +      // The value of an N_SLINE entry is the offset of the line from
       
 47102 +      // the function's start address.
       
 47103 +      uint64_t line_address = function_address + SymbolValue();
       
 47104 +      // The n_desc of a N_SLINE entry is the line number.  It's a
       
 47105 +      // signed 16-bit field; line numbers from 32768 to 65535 are
       
 47106 +      // stored as n-65536.
       
 47107 +      uint16_t line_number = symbol_->n_desc;
       
 47108 +      if (! handler_->Line(line_address, current_source_file_, line_number))
       
 47109 +        return false;
       
 47110 +      symbol_++;
       
 47111 +    } else if (symbol_->n_type == N_SOL) {
       
 47112 +      current_source_file_ = SymbolString();
       
 47113 +      symbol_++;
       
 47114 +    } else
       
 47115 +      // Ignore anything else.
       
 47116 +      symbol_++;
       
 47117 +  }
       
 47118 +
       
 47119 +  // If there is a subsequent N_SO or N_FUN entry, its address is our
       
 47120 +  // end address.
       
 47121 +  uint64_t ending_address = 0;
       
 47122 +  if (symbol_ < symbols_end_) {
       
 47123 +    assert(symbol_->n_type == N_SO || symbol_->n_type == N_FUN);
       
 47124 +    ending_address = SymbolValue();
       
 47125 +    // Note: we do not increment symbol_ here, since we haven't consumed it.
       
 47126 +  }
       
 47127 +
       
 47128 +  if (! handler_->EndFunction(ending_address))
       
 47129 +    return false;
       
 47130 +
       
 47131 +  return true;
       
 47132 +}
       
 47133 +
       
 47134 +} // namespace google_breakpad
       
 47135 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader.h b/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader.h
       
 47136 new file mode 100644
       
 47137 --- /dev/null
       
 47138 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader.h
       
 47139 @@ -0,0 +1,192 @@
       
 47140 +// Copyright 2009 Google Inc. All Rights Reserved.  -*- mode: c++ -*-
       
 47141 +//
       
 47142 +// Redistribution and use in source and binary forms, with or without
       
 47143 +// modification, are permitted provided that the following conditions are
       
 47144 +// met:
       
 47145 +//
       
 47146 +//     * Redistributions of source code must retain the above copyright
       
 47147 +// notice, this list of conditions and the following disclaimer.
       
 47148 +//     * Redistributions in binary form must reproduce the above
       
 47149 +// copyright notice, this list of conditions and the following disclaimer
       
 47150 +// in the documentation and/or other materials provided with the
       
 47151 +// distribution.
       
 47152 +//     * Neither the name of Google Inc. nor the names of its
       
 47153 +// contributors may be used to endorse or promote products derived from
       
 47154 +// this software without specific prior written permission.
       
 47155 +//
       
 47156 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 47157 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 47158 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 47159 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 47160 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 47161 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 47162 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 47163 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 47164 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 47165 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 47166 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 47167 +
       
 47168 +// This file contains definitions related to the STABS reader and
       
 47169 +// its handler interfaces.
       
 47170 +// A description of the STABS debugging format can be found at
       
 47171 +// http://sourceware.org/gdb/current/onlinedocs/stabs_toc.html
       
 47172 +// The comments here assume you understand the format.
       
 47173 +//
       
 47174 +// This reader assumes that the system's <a.out.h> and <stab.h>
       
 47175 +// headers accurately describe the layout of the STABS data; this code
       
 47176 +// is not cross-platform safe.
       
 47177 +
       
 47178 +#ifndef COMMON_LINUX_STABS_READER_H__
       
 47179 +#define COMMON_LINUX_STABS_READER_H__
       
 47180 +
       
 47181 +#include <stdint.h>
       
 47182 +#include <cstddef>
       
 47183 +#include <a.out.h>
       
 47184 +
       
 47185 +#include <string>
       
 47186 +
       
 47187 +namespace google_breakpad {
       
 47188 +
       
 47189 +class StabsHandler;
       
 47190 +
       
 47191 +class StabsReader {
       
 47192 + public:
       
 47193 +  // Create a reader for the STABS debug information whose .stab
       
 47194 +  // section is the STAB_SIZE bytes at STAB, and whose .stabstr
       
 47195 +  // section is the STABSTR_SIZE bytes at STABSTR.  The reader will
       
 47196 +  // call the member functions of HANDLER to report the information it
       
 47197 +  // finds, when the reader's 'Process' member function is called.
       
 47198 +  // 
       
 47199 +  // Note that, in ELF, the .stabstr section should be found using the
       
 47200 +  // 'sh_link' field of the .stab section header, not by name.
       
 47201 +  StabsReader(const uint8_t *stab,    size_t stab_size,
       
 47202 +              const uint8_t *stabstr, size_t stabstr_size,
       
 47203 +              StabsHandler *handler);
       
 47204 +
       
 47205 +  // Process the STABS data, calling the handler's member functions to
       
 47206 +  // report what we find.  While the handler functions return true,
       
 47207 +  // continue to process until we reach the end of the section.  If we
       
 47208 +  // processed the entire section and all handlers returned true,
       
 47209 +  // return true.  If any handler returned false, return false.
       
 47210 +  bool Process();
       
 47211 +
       
 47212 + private:
       
 47213 +  // Return the name of the current symbol.
       
 47214 +  const char *SymbolString();
       
 47215 +
       
 47216 +  // Return the value of the current symbol.
       
 47217 +  const uint64_t SymbolValue() {
       
 47218 +    return symbol_->n_value;
       
 47219 +  }
       
 47220 +
       
 47221 +  // Process a compilation unit starting at symbol_.  Return true
       
 47222 +  // to continue processing, or false to abort.
       
 47223 +  bool ProcessCompilationUnit();
       
 47224 +
       
 47225 +  // Process a function in current_source_file_ starting at symbol_.
       
 47226 +  // Return true to continue processing, or false to abort.
       
 47227 +  bool ProcessFunction();
       
 47228 +
       
 47229 +  // The debugging information we're reading.
       
 47230 +  const struct nlist *symbols_, *symbols_end_;
       
 47231 +  const uint8_t *stabstr_;
       
 47232 +  size_t stabstr_size_;
       
 47233 +
       
 47234 +  StabsHandler *handler_;
       
 47235 +
       
 47236 +  // The current symbol we're processing.
       
 47237 +  const struct nlist *symbol_;
       
 47238 +
       
 47239 +  // The current source file name.
       
 47240 +  const char *current_source_file_;
       
 47241 +};
       
 47242 +
       
 47243 +// Consumer-provided callback structure for the STABS reader.  Clients
       
 47244 +// of the STABS reader provide an instance of this structure.  The
       
 47245 +// reader then invokes the member functions of that instance to report
       
 47246 +// the information it finds.
       
 47247 +//
       
 47248 +// The default definitions of the member functions do nothing, and return
       
 47249 +// true so processing will continue.
       
 47250 +class StabsHandler {
       
 47251 + public:
       
 47252 +  StabsHandler() { }
       
 47253 +  virtual ~StabsHandler() { }
       
 47254 +
       
 47255 +  // Some general notes about the handler callback functions:
       
 47256 +
       
 47257 +  // Processing proceeds until the end of the .stabs section, or until
       
 47258 +  // one of these functions returns false.
       
 47259 +
       
 47260 +  // The addresses given are as reported in the STABS info, without
       
 47261 +  // regard for whether the module may be loaded at different
       
 47262 +  // addresses at different times (a shared library, say).  When
       
 47263 +  // processing STABS from an ELF shared library, the addresses given
       
 47264 +  // all assume the library is loaded at its nominal load address.
       
 47265 +  // They are *not* offsets from the nominal load address.  If you
       
 47266 +  // want offsets, you must subtract off the library's nominal load
       
 47267 +  // address.
       
 47268 +
       
 47269 +  // The arguments to these functions named FILENAME are all
       
 47270 +  // references to strings stored in the .stabstr section.  Because
       
 47271 +  // both the Linux and Solaris linkers factor out duplicate strings
       
 47272 +  // from the .stabstr section, the consumer can assume that if two
       
 47273 +  // FILENAME values are different addresses, they represent different
       
 47274 +  // file names.
       
 47275 +  //
       
 47276 +  // Thus, it's safe to use (say) std::map<char *, ...>, which does
       
 47277 +  // string address comparisons, not string content comparisons.
       
 47278 +  // Since all the strings are in same array of characters --- the
       
 47279 +  // .stabstr section --- comparing their addresses produces
       
 47280 +  // predictable, if not lexicographically meaningful, results.
       
 47281 +
       
 47282 +  // Begin processing a compilation unit whose main source file is
       
 47283 +  // named FILENAME, and whose base address is ADDRESS.  If
       
 47284 +  // BUILD_DIRECTORY is non-NULL, it is the name of the build
       
 47285 +  // directory in which the compilation occurred.
       
 47286 +  virtual bool StartCompilationUnit(const char *filename, uint64_t address,
       
 47287 +                                    const char *build_directory) {
       
 47288 +    return true;
       
 47289 +  }
       
 47290 +
       
 47291 +  // Finish processing the compilation unit.  If ADDRESS is non-zero,
       
 47292 +  // it is the ending address of the compilation unit.  If ADDRESS is
       
 47293 +  // zero, then the compilation unit's ending address is not
       
 47294 +  // available, and the consumer must infer it by other means.
       
 47295 +  virtual bool EndCompilationUnit(uint64_t address) { return true; }
       
 47296 +
       
 47297 +  // Begin processing a function named NAME, whose starting address is
       
 47298 +  // ADDRESS.  This function belongs to the compilation unit that was
       
 47299 +  // most recently started but not ended.
       
 47300 +  //
       
 47301 +  // Note that, unlike filenames, NAME is not a pointer into the
       
 47302 +  // .stabstr section; this is because the name as it appears in the
       
 47303 +  // STABS data is followed by type information.  The value passed to
       
 47304 +  // StartFunction is the function name alone.
       
 47305 +  //
       
 47306 +  // In languages that use name mangling, like C++, NAME is mangled.
       
 47307 +  virtual bool StartFunction(const std::string &name, uint64_t address) {
       
 47308 +    return true;
       
 47309 +  }
       
 47310 +
       
 47311 +  // Finish processing the function.  If ADDRESS is non-zero, it is
       
 47312 +  // the ending address for the function.  If ADDRESS is zero, then
       
 47313 +  // the function's ending address is not available, and the consumer
       
 47314 +  // must infer it by other means.
       
 47315 +  virtual bool EndFunction(uint64_t address) { return true; }
       
 47316 +  
       
 47317 +  // Report that the code at ADDRESS is attributable to line NUMBER of
       
 47318 +  // the source file named FILENAME.  The caller must infer the ending
       
 47319 +  // address of the line.
       
 47320 +  virtual bool Line(uint64_t address, const char *filename, int number) {
       
 47321 +    return true;
       
 47322 +  }
       
 47323 +
       
 47324 +  // Report a warning.  FORMAT is a printf-like format string,
       
 47325 +  // specifying how to format the subsequent arguments.
       
 47326 +  virtual void Warning(const char *format, ...) = 0;
       
 47327 +};
       
 47328 +
       
 47329 +} // namespace google_breakpad
       
 47330 +
       
 47331 +#endif  // COMMON_LINUX_STABS_READER_H__
       
 47332 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader_unittest.cc b/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader_unittest.cc
       
 47333 new file mode 100644
       
 47334 --- /dev/null
       
 47335 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/stabs_reader_unittest.cc
       
 47336 @@ -0,0 +1,548 @@
       
 47337 +// Copyright (c) 2009, Google Inc.
       
 47338 +// All rights reserved.
       
 47339 +//
       
 47340 +// Redistribution and use in source and binary forms, with or without
       
 47341 +// modification, are permitted provided that the following conditions are
       
 47342 +// met:
       
 47343 +//
       
 47344 +//     * Redistributions of source code must retain the above copyright
       
 47345 +// notice, this list of conditions and the following disclaimer.
       
 47346 +//     * Redistributions in binary form must reproduce the above
       
 47347 +// copyright notice, this list of conditions and the following disclaimer
       
 47348 +// in the documentation and/or other materials provided with the
       
 47349 +// distribution.
       
 47350 +//     * Neither the name of Google Inc. nor the names of its
       
 47351 +// contributors may be used to endorse or promote products derived from
       
 47352 +// this software without specific prior written permission.
       
 47353 +//
       
 47354 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 47355 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 47356 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 47357 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 47358 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 47359 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 47360 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 47361 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 47362 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 47363 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 47364 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 47365 +
       
 47366 +// stabs_reader_unittest.cc: Unit tests for StabsReader.
       
 47367 +
       
 47368 +#include <a.out.h>
       
 47369 +#include <cassert>
       
 47370 +#include <cerrno>
       
 47371 +#include <cstdarg>
       
 47372 +#include <cstdlib>
       
 47373 +#include <cstring>
       
 47374 +#include <fstream>
       
 47375 +#include <iomanip>
       
 47376 +#include <iostream>
       
 47377 +#include <map>
       
 47378 +#include <sstream>
       
 47379 +#include <stab.h>
       
 47380 +
       
 47381 +#include "breakpad_googletest_includes.h"
       
 47382 +#include "common/linux/stabs_reader.h"
       
 47383 +
       
 47384 +using std::istream;
       
 47385 +using std::istringstream;
       
 47386 +using std::map;
       
 47387 +using std::ostream;
       
 47388 +using std::ostringstream;
       
 47389 +using std::string;
       
 47390 +
       
 47391 +using ::testing::_;
       
 47392 +using ::testing::InSequence;
       
 47393 +using ::testing::Return;
       
 47394 +using ::testing::Sequence;
       
 47395 +using ::testing::StrEq;
       
 47396 +
       
 47397 +using google_breakpad::StabsHandler;
       
 47398 +using google_breakpad::StabsReader;
       
 47399 +
       
 47400 +namespace {
       
 47401 +
       
 47402 +// Mock stabs file parser
       
 47403 +//
       
 47404 +// In order to test StabsReader, we parse a human-readable input file
       
 47405 +// describing STABS entries into in-memory .stab and .stabstr
       
 47406 +// sections, and then pass those to StabsReader to look at. The
       
 47407 +// human-readable file is called a "mock stabs file".
       
 47408 +//
       
 47409 +// Each line of a mock stabs file should have the following form:
       
 47410 +//
       
 47411 +//   TYPE OTHER DESC VALUE NAME
       
 47412 +// 
       
 47413 +// where all data is Latin-1 bytes and fields are separated by single
       
 47414 +// space characters, except for NAME, which may contain spaces and
       
 47415 +// continues to the end of the line.  The fields have the following
       
 47416 +// meanings:
       
 47417 +// 
       
 47418 +// - TYPE: the name of the stabs symbol type; like SO or FUN.  These are
       
 47419 +//   the names from /usr/include/bits/stab.def, without the leading N_.
       
 47420 +//
       
 47421 +// - OTHER, DESC, VALUE: numeric values for the n_other, n_desc, and
       
 47422 +//   n_value fields of the stab.  These can be decimal or hex,
       
 47423 +//   using C++ notation (10, 0x10)
       
 47424 +//   
       
 47425 +// - NAME: textual data for the entry.  STABS packs all kinds of
       
 47426 +//   interesting data into entries' NAME fields, so calling it a NAME
       
 47427 +//   is misleading, but that's how it is.  For SO, this may be a
       
 47428 +//   filename; for FUN, this is the function name, plus type data; and
       
 47429 +//   so on.
       
 47430 +
       
 47431 +// I don't know if the whole parser/handler pattern is really worth
       
 47432 +// the bureaucracy in this case.  But just writing it out as
       
 47433 +// old-fashioned functions wasn't astonishingly clear either, so it
       
 47434 +// seemed worth a try.
       
 47435 +
       
 47436 +// A handler class for mock stabs data.
       
 47437 +class MockStabsHandler {
       
 47438 + public:
       
 47439 +  MockStabsHandler() { }
       
 47440 +  virtual ~MockStabsHandler() { }
       
 47441 +  // The mock stabs parser calls this member function for each entry
       
 47442 +  // it parses, passing it the contents of the entry.  If this function
       
 47443 +  // returns true, the parser continues; if it returns false, the parser
       
 47444 +  // stops, and its Process member function returns false.
       
 47445 +  virtual bool Entry(enum __stab_debug_code type, char other, short desc,
       
 47446 +                     unsigned long value, const string &name) { return true; }
       
 47447 +  // Report an error in parsing the mock stabs data.  If this returns true,
       
 47448 +  // the parser continues; if it returns false, the parser stops and
       
 47449 +  // its Process member function returns false.
       
 47450 +  virtual bool Error(const char *format, ...) = 0;
       
 47451 +};
       
 47452 +
       
 47453 +// A class for parsing mock stabs files.
       
 47454 +class MockStabsParser {
       
 47455 + public:
       
 47456 +  // Create a parser reading input from STREAM and passing data to HANDLER.
       
 47457 +  // Use FILENAME when reporting errors.
       
 47458 +  MockStabsParser(const string &filename, istream *stream,
       
 47459 +                  MockStabsHandler *handler);
       
 47460 +  // Parse data from the STREAM, invoking HANDLER->Entry for each
       
 47461 +  // entry we get.  Return true if we parsed all the data succesfully,
       
 47462 +  // or false if we stopped early because Entry returned false, or if
       
 47463 +  // there were any errors during parsing.
       
 47464 +  bool Process();
       
 47465 + private:
       
 47466 +  // A type for maps from stab type names ("SO", "SLINE", etc.) to
       
 47467 +  // n_type values.
       
 47468 +  typedef map<string, unsigned char> StabTypeNameTable;
       
 47469 +
       
 47470 +  // Initialize the table mapping STAB type names to n_type values.
       
 47471 +  void InitializeTypeNames();
       
 47472 +
       
 47473 +  // Parse LINE, one line of input from a mock stabs file, and pass
       
 47474 +  // its contents to handler_->Entry and return the boolean value that
       
 47475 +  // returns.  If we encounter an error parsing the line, report it
       
 47476 +  // using handler->Error.
       
 47477 +  bool ParseLine(const string &line);
       
 47478 +
       
 47479 +  const string &filename_;
       
 47480 +  istream *stream_;
       
 47481 +  MockStabsHandler *handler_;
       
 47482 +  int line_number_;
       
 47483 +  StabTypeNameTable type_names_;
       
 47484 +};
       
 47485 +
       
 47486 +MockStabsParser::MockStabsParser(const string &filename, istream *stream,
       
 47487 +                                 MockStabsHandler *handler):
       
 47488 +    filename_(filename), stream_(stream), handler_(handler),
       
 47489 +    line_number_(0) {
       
 47490 +  InitializeTypeNames();
       
 47491 +}
       
 47492 +
       
 47493 +bool MockStabsParser::Process() {
       
 47494 +  // Iterate once per line, including a line at EOF without a
       
 47495 +  // terminating newline.
       
 47496 +  for(;;) {
       
 47497 +    string line;
       
 47498 +    std::getline(*stream_, line, '\n');
       
 47499 +    if (line.empty() && stream_->eof())
       
 47500 +      break;
       
 47501 +    line_number_++;
       
 47502 +    if (! ParseLine(line))
       
 47503 +      return false;
       
 47504 +  }
       
 47505 +  return true;
       
 47506 +}
       
 47507 +
       
 47508 +void MockStabsParser::InitializeTypeNames() {
       
 47509 +  // On GLIBC-based systems, <bits/stab.def> is a file containing a
       
 47510 +  // call to an unspecified macro __define_stab for each stab type.
       
 47511 +  // <stab.h> uses it to define the __stab_debug_code enum type.  We
       
 47512 +  // use it here to initialize our mapping from type names to enum
       
 47513 +  // values.
       
 47514 +  //
       
 47515 +  // This isn't portable to non-GLIBC systems.  Feel free to just
       
 47516 +  // hard-code the values if this becomes a problem.
       
 47517 +#  define __define_stab(name, code, str) type_names_[string(str)] = code;
       
 47518 +#  include <bits/stab.def>
       
 47519 +#  undef __define_stab
       
 47520 +}
       
 47521 +
       
 47522 +bool MockStabsParser::ParseLine(const string &line) {
       
 47523 +  istringstream linestream(line);
       
 47524 +  // Allow "0x" prefix for hex, and so on.
       
 47525 +  linestream.unsetf(istringstream::basefield);
       
 47526 +  // Parse and validate the stabs type.
       
 47527 +  string typeName;
       
 47528 +  linestream >> typeName;
       
 47529 +  StabTypeNameTable::const_iterator typeIt = type_names_.find(typeName);
       
 47530 +  if (typeIt == type_names_.end())
       
 47531 +    return handler_->Error("%s:%d: unrecognized stab type: %s\n",
       
 47532 +                           filename_.c_str(), line_number_, typeName.c_str());
       
 47533 +  // These are int, not char and unsigned char, to ensure they're parsed
       
 47534 +  // as decimal numbers, not characters.
       
 47535 +  int otherInt, descInt;
       
 47536 +  unsigned long value;
       
 47537 +  linestream >> otherInt >> descInt >> value;
       
 47538 +  if (linestream.fail())
       
 47539 +    return handler_->Error("%s:%d: malformed mock stabs input line\n",
       
 47540 +                           filename_.c_str(), line_number_);
       
 47541 +  if (linestream.peek() == ' ')
       
 47542 +    linestream.get();
       
 47543 +  string name;
       
 47544 +  getline(linestream, name, '\n');
       
 47545 +  return handler_->Entry(static_cast<__stab_debug_code>(typeIt->second),
       
 47546 +                         otherInt, descInt, value, name);
       
 47547 +}
       
 47548 +
       
 47549 +// A class for constructing .stab sections.
       
 47550 +//
       
 47551 +// A .stab section is an array of struct nlist entries.  These
       
 47552 +// entries' n_un.n_strx fields are indices into an accompanying
       
 47553 +// .stabstr section.
       
 47554 +class StabSection {
       
 47555 + public:
       
 47556 +  StabSection(): used_(0), size_(1) {
       
 47557 +    entries_ = (struct nlist *) malloc(sizeof(*entries_) * size_);
       
 47558 +  }
       
 47559 +  ~StabSection() { free(entries_); }
       
 47560 +
       
 47561 +  // Append a new 'struct nlist' entry to the end of the section, and
       
 47562 +  // return a pointer to it.  This pointer is valid until the next
       
 47563 +  // call to Append.  The caller should initialize the returned entry
       
 47564 +  // as needed.
       
 47565 +  struct nlist *Append();
       
 47566 +  // Set SECTION to the contents of a .stab section holding the
       
 47567 +  // accumulated list of entries added with Append.
       
 47568 +  void GetSection(string *section);
       
 47569 +
       
 47570 + private:
       
 47571 +  // The array of stabs entries,
       
 47572 +  struct nlist *entries_;
       
 47573 +  // The number of elements of entries_ that are used, and the allocated size
       
 47574 +  // of the array.
       
 47575 +  size_t used_, size_;
       
 47576 +};
       
 47577 +
       
 47578 +struct nlist *StabSection::Append() {
       
 47579 +  if (used_ == size_) {
       
 47580 +    size_ *= 2;
       
 47581 +    entries_ = (struct nlist *) realloc(entries_, sizeof(*entries_) * size_);
       
 47582 +  }
       
 47583 +  assert(used_ < size_);
       
 47584 +  return &entries_[used_++];
       
 47585 +}
       
 47586 +
       
 47587 +void StabSection::GetSection(string *section) {
       
 47588 +  section->assign(reinterpret_cast<char *>(entries_),
       
 47589 +                  sizeof(*entries_) * used_);
       
 47590 +}
       
 47591 +
       
 47592 +// A class for building .stabstr sections.
       
 47593 +// 
       
 47594 +// A .stabstr section is an array of characters containing a bunch of
       
 47595 +// null-terminated strings.  A string is identified by the index of
       
 47596 +// its initial character in the array.  The array always starts with a
       
 47597 +// null byte, so that an index of zero refers to the empty string.
       
 47598 +//
       
 47599 +// This implementation also ensures that if two strings are equal, we
       
 47600 +// assign them the same indices; most linkers do this, and some
       
 47601 +// clients may rely upon it.  (Note that this is not quite the same as
       
 47602 +// ensuring that a string only appears once in the section; you could
       
 47603 +// share space when one string is a suffix of another, but we don't.)
       
 47604 +class StabstrSection {
       
 47605 + public:
       
 47606 +  StabstrSection(): next_byte_(1) { string_indices_[""] = 0; }
       
 47607 +  // Ensure STR is present in the string section, and return its index.
       
 47608 +  size_t Insert(const string &str);
       
 47609 +  // Set SECTION to the contents of a .stabstr section in which the
       
 47610 +  // strings passed to Insert appear at the indices we promised.
       
 47611 +  void GetSection(string *section);
       
 47612 + private:
       
 47613 +  // Maps from strings to .stabstr indices and back.
       
 47614 +  typedef map<string, size_t> StringToIndex;
       
 47615 +  typedef map<size_t, const string *> IndexToString;
       
 47616 +
       
 47617 +  // A map from strings to the indices we've assigned them.
       
 47618 +  StringToIndex string_indices_;
       
 47619 +
       
 47620 +  // The next unused byte in the section.  The next string we add
       
 47621 +  // will get this index.
       
 47622 +  size_t next_byte_;
       
 47623 +};
       
 47624 +
       
 47625 +size_t StabstrSection::Insert(const string &str) {
       
 47626 +  StringToIndex::iterator it = string_indices_.find(str);
       
 47627 +  size_t index;
       
 47628 +  if (it != string_indices_.end()) {
       
 47629 +    index = it->second;
       
 47630 +  } else {
       
 47631 +    // This is the first time we've seen STR; add it to the table.
       
 47632 +    string_indices_[str] = next_byte_;
       
 47633 +    index = next_byte_;
       
 47634 +    next_byte_ += str.size() + 1;
       
 47635 +  }
       
 47636 +  return index;
       
 47637 +}
       
 47638 +
       
 47639 +void StabstrSection::GetSection(string *section) {
       
 47640 +  // First we have to invert the map.
       
 47641 +  IndexToString byIndex;
       
 47642 +  for (StringToIndex::const_iterator it = string_indices_.begin();
       
 47643 +       it != string_indices_.end(); it++)
       
 47644 +    byIndex[it->second] = &it->first;
       
 47645 +  // Now we build the .stabstr section.
       
 47646 +  section->clear();
       
 47647 +  for (IndexToString::const_iterator it = byIndex.begin();
       
 47648 +       it != byIndex.end(); it++) {
       
 47649 +    // Make sure we're actually assigning it the index we claim to be.
       
 47650 +    assert(it->first == section->size());
       
 47651 +    *section += *(it->second);
       
 47652 +    *section += '\0';
       
 47653 +  }
       
 47654 +}
       
 47655 +
       
 47656 +// A mock stabs parser handler class that builds .stab and .stabstr
       
 47657 +// sections.
       
 47658 +class StabsSectionsBuilder: public MockStabsHandler {
       
 47659 + public:
       
 47660 +  // Construct a handler that will receive data from a MockStabsParser
       
 47661 +  // and construct .stab and .stabstr sections.  FILENAME should be
       
 47662 +  // the name of the mock stabs input file; we use it in error
       
 47663 +  // messages.
       
 47664 +  StabsSectionsBuilder(const string &filename):
       
 47665 +      filename_(filename), error_count_(0) { }
       
 47666 +
       
 47667 +  // Overridden virtual member functions.
       
 47668 +  bool Entry(enum __stab_debug_code type, char other, short desc,
       
 47669 +             unsigned long value, const string &name);
       
 47670 +  virtual bool Error(const char *format, ...);
       
 47671 +
       
 47672 +  // Set SECTION to the contents of a .stab or .stabstr section
       
 47673 +  // reflecting the entries that have been passed to us via Entry.
       
 47674 +  void GetStab(string *section);
       
 47675 +  void GetStabstr(string *section);
       
 47676 +
       
 47677 + private:
       
 47678 +  StabSection stab_;                    // stabs entries we've seen
       
 47679 +  StabstrSection stabstr_;              // and the strings they love
       
 47680 +  const string &filename_;              // input filename, for error messages
       
 47681 +  int error_count_;                     // number of errors we've seen so far
       
 47682 +};
       
 47683 +
       
 47684 +bool StabsSectionsBuilder::Entry(enum __stab_debug_code type, char other,
       
 47685 +                                 short desc, unsigned long value,
       
 47686 +                                 const string &name) {
       
 47687 +  struct nlist *entry = stab_.Append();
       
 47688 +  entry->n_type = type;
       
 47689 +  entry->n_other = other;
       
 47690 +  entry->n_desc = desc;
       
 47691 +  entry->n_value = value;
       
 47692 +  entry->n_un.n_strx = stabstr_.Insert(name);
       
 47693 +  return true;
       
 47694 +}
       
 47695 +
       
 47696 +bool StabsSectionsBuilder::Error(const char *format, ...) {
       
 47697 +  va_list args;
       
 47698 +  va_start(args, format);
       
 47699 +  vfprintf(stderr, format, args);
       
 47700 +  va_end(args);
       
 47701 +  error_count_++;
       
 47702 +  if (error_count_ >= 20) {
       
 47703 +    fprintf(stderr,
       
 47704 +            "%s: lots of errors; is this really a mock stabs file?\n",
       
 47705 +            filename_.c_str());
       
 47706 +    return false;
       
 47707 +  }
       
 47708 +  return true;
       
 47709 +}
       
 47710 +
       
 47711 +void StabsSectionsBuilder::GetStab(string *section) {
       
 47712 +  stab_.GetSection(section);
       
 47713 +}
       
 47714 +
       
 47715 +void StabsSectionsBuilder::GetStabstr(string *section) {
       
 47716 +  stabstr_.GetSection(section);
       
 47717 +}
       
 47718 +
       
 47719 +class MockStabsReaderHandler: public StabsHandler {
       
 47720 + public:
       
 47721 +  MOCK_METHOD3(StartCompilationUnit,
       
 47722 +               bool(const char *, uint64_t, const char *));
       
 47723 +  MOCK_METHOD1(EndCompilationUnit, bool(uint64_t));
       
 47724 +  MOCK_METHOD2(StartFunction, bool(const std::string &, uint64_t));
       
 47725 +  MOCK_METHOD1(EndFunction, bool(uint64_t));
       
 47726 +  MOCK_METHOD3(Line, bool(uint64_t, const char *, int));
       
 47727 +  void Warning(const char *format, ...) { MockWarning(format); }
       
 47728 +  MOCK_METHOD1(MockWarning, void(const char *));
       
 47729 +};
       
 47730 +
       
 47731 +// Create a StabsReader to parse the mock stabs data in INPUT_FILE,
       
 47732 +// passing the parsed information to HANDLER. If all goes well, return
       
 47733 +// the result of calling the reader's Process member function.
       
 47734 +// Otherwise, return false. INPUT_FILE should be relative to the top
       
 47735 +// of the source tree.
       
 47736 +static bool ApplyHandlerToMockStabsData(StabsHandler *handler,
       
 47737 +                                        const string &input_file) {
       
 47738 +  string full_input_file
       
 47739 +      = string(getenv("srcdir") ? getenv("srcdir") : ".") + "/" + input_file;
       
 47740 +
       
 47741 +  // Open the input file.
       
 47742 +  std::ifstream stream(full_input_file.c_str());
       
 47743 +  if (stream.fail()) {
       
 47744 +    fprintf(stderr, "error opening mock stabs input file %s: %s\n",
       
 47745 +            full_input_file.c_str(), strerror(errno));
       
 47746 +    return false;
       
 47747 +  }
       
 47748 +
       
 47749 +  // Parse the mock stabs data, and produce stabs sections to use as
       
 47750 +  // test input to the reader.
       
 47751 +  StabsSectionsBuilder builder(full_input_file);
       
 47752 +  MockStabsParser mock_parser(full_input_file, &stream, &builder);
       
 47753 +  if (!mock_parser.Process())
       
 47754 +    return false;
       
 47755 +  string stab, stabstr;
       
 47756 +  builder.GetStab(&stab);
       
 47757 +  builder.GetStabstr(&stabstr);
       
 47758 +
       
 47759 +  // Run the parser on the test input, passing whatever we find to HANDLER.
       
 47760 +  StabsReader reader(
       
 47761 +      reinterpret_cast<const uint8_t *>(stab.data()),    stab.size(),
       
 47762 +      reinterpret_cast<const uint8_t *>(stabstr.data()), stabstr.size(),
       
 47763 +      handler);
       
 47764 +  return reader.Process();
       
 47765 +}
       
 47766 +
       
 47767 +TEST(StabsReaderTestCase, MockStabsInput) {
       
 47768 +  MockStabsReaderHandler mock_handler;
       
 47769 +
       
 47770 +  {
       
 47771 +    InSequence s;
       
 47772 +
       
 47773 +    EXPECT_CALL(mock_handler, StartCompilationUnit(StrEq("file1.c"), 
       
 47774 +                                                   0x42, StrEq("builddir1/")))
       
 47775 +        .WillOnce(Return(true));
       
 47776 +    EXPECT_CALL(mock_handler, StartFunction(StrEq("fun1"), 0x62))
       
 47777 +        .WillOnce(Return(true));
       
 47778 +    EXPECT_CALL(mock_handler, Line(0xe4, StrEq("file1.c"), 91))
       
 47779 +        .WillOnce(Return(true));
       
 47780 +    EXPECT_CALL(mock_handler, Line(0x164, StrEq("header.h"), 111))
       
 47781 +        .WillOnce(Return(true));
       
 47782 +    EXPECT_CALL(mock_handler, EndFunction(0x112))
       
 47783 +        .WillOnce(Return(true));
       
 47784 +    EXPECT_CALL(mock_handler, StartFunction(StrEq("fun2"), 0x112))
       
 47785 +        .WillOnce(Return(true));
       
 47786 +    EXPECT_CALL(mock_handler, Line(0x234, StrEq("header.h"), 131))
       
 47787 +        .WillOnce(Return(true));
       
 47788 +    EXPECT_CALL(mock_handler, Line(0x254, StrEq("file1.c"), 151))
       
 47789 +        .WillOnce(Return(true));
       
 47790 +    EXPECT_CALL(mock_handler, EndFunction(0x152))
       
 47791 +        .WillOnce(Return(true));
       
 47792 +    EXPECT_CALL(mock_handler, EndCompilationUnit(0x152))
       
 47793 +        .WillOnce(Return(true));
       
 47794 +    EXPECT_CALL(mock_handler, StartCompilationUnit(StrEq("file3.c"), 
       
 47795 +                                                   0x182, NULL))
       
 47796 +        .WillOnce(Return(true));
       
 47797 +    EXPECT_CALL(mock_handler, EndCompilationUnit(0x192))
       
 47798 +        .WillOnce(Return(true));
       
 47799 +  }
       
 47800 +
       
 47801 +  ASSERT_TRUE(ApplyHandlerToMockStabsData(
       
 47802 +                  &mock_handler, 
       
 47803 +                  "common/linux/testdata/stabs_reader_unittest.input1"));
       
 47804 +}
       
 47805 +
       
 47806 +TEST(StabsReaderTestCase, AbruptCU) {
       
 47807 +  MockStabsReaderHandler mock_handler;
       
 47808 +
       
 47809 +  {
       
 47810 +    InSequence s;
       
 47811 +
       
 47812 +    EXPECT_CALL(mock_handler,
       
 47813 +                StartCompilationUnit(StrEq("file2-1.c"), 0x12, NULL))
       
 47814 +        .WillOnce(Return(true));
       
 47815 +    EXPECT_CALL(mock_handler, EndCompilationUnit(NULL))
       
 47816 +        .WillOnce(Return(true));
       
 47817 +  }
       
 47818 +
       
 47819 +  ASSERT_TRUE(ApplyHandlerToMockStabsData(
       
 47820 +                  &mock_handler, 
       
 47821 +                  "common/linux/testdata/stabs_reader_unittest.input2"));
       
 47822 +}
       
 47823 +
       
 47824 +TEST(StabsReaderTestCase, AbruptFunction) {
       
 47825 +  MockStabsReaderHandler mock_handler;
       
 47826 +
       
 47827 +  {
       
 47828 +    InSequence s;
       
 47829 +
       
 47830 +    EXPECT_CALL(mock_handler,
       
 47831 +                StartCompilationUnit(StrEq("file3-1.c"), 0x12, NULL))
       
 47832 +        .WillOnce(Return(true));
       
 47833 +    EXPECT_CALL(mock_handler, StartFunction(StrEq("fun3_1"), 0x22))
       
 47834 +        .WillOnce(Return(true));
       
 47835 +    EXPECT_CALL(mock_handler, EndFunction(NULL))
       
 47836 +        .WillOnce(Return(true));
       
 47837 +    EXPECT_CALL(mock_handler, EndCompilationUnit(NULL))
       
 47838 +        .WillOnce(Return(true));
       
 47839 +  }
       
 47840 +
       
 47841 +  ASSERT_TRUE(ApplyHandlerToMockStabsData(
       
 47842 +                  &mock_handler, 
       
 47843 +                  "common/linux/testdata/stabs_reader_unittest.input3"));
       
 47844 +}
       
 47845 +
       
 47846 +TEST(StabsReaderTestCase, NoCU) {
       
 47847 +  MockStabsReaderHandler mock_handler;
       
 47848 +
       
 47849 +  EXPECT_CALL(mock_handler, StartCompilationUnit(_, _, _))
       
 47850 +      .Times(0);
       
 47851 +  EXPECT_CALL(mock_handler, StartFunction(_, _))
       
 47852 +      .Times(0);
       
 47853 +
       
 47854 +  ASSERT_TRUE(ApplyHandlerToMockStabsData(
       
 47855 +                  &mock_handler, 
       
 47856 +                  "common/linux/testdata/stabs_reader_unittest.input4"));
       
 47857 +  
       
 47858 +}
       
 47859 +
       
 47860 +TEST(StabsReaderTestCase, NoCUEnd) {
       
 47861 +  MockStabsReaderHandler mock_handler;
       
 47862 +
       
 47863 +  {
       
 47864 +    InSequence s;
       
 47865 +
       
 47866 +    EXPECT_CALL(mock_handler,
       
 47867 +                StartCompilationUnit(StrEq("file5-1.c"), 0x12, NULL))
       
 47868 +        .WillOnce(Return(true));
       
 47869 +    EXPECT_CALL(mock_handler, EndCompilationUnit(NULL))
       
 47870 +        .WillOnce(Return(true));
       
 47871 +    EXPECT_CALL(mock_handler,
       
 47872 +                StartCompilationUnit(StrEq("file5-2.c"), 0x22, NULL))
       
 47873 +        .WillOnce(Return(true));
       
 47874 +    EXPECT_CALL(mock_handler, EndCompilationUnit(NULL))
       
 47875 +        .WillOnce(Return(true));
       
 47876 +  }
       
 47877 +
       
 47878 +  ASSERT_TRUE(ApplyHandlerToMockStabsData(
       
 47879 +                  &mock_handler, 
       
 47880 +                  "common/linux/testdata/stabs_reader_unittest.input5"));
       
 47881 +  
       
 47882 +}
       
 47883 +
       
 47884 +} // anonymous namespace
       
 47885 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input1 b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input1
       
 47886 new file mode 100644
       
 47887 --- /dev/null
       
 47888 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input1
       
 47889 @@ -0,0 +1,19 @@
       
 47890 +SO      10   11   0x02 builddir/
       
 47891 +FUN     20   21   0x12 not the SO with source file name we expected 
       
 47892 +SO      30   31   0x22 
       
 47893 +SO      40   41   0x32 builddir1/
       
 47894 +SO      50   51   0x42 file1.c
       
 47895 +LSYM    60   61   0x52 not the FUN we're looking for
       
 47896 +FUN     70   71   0x62 fun1
       
 47897 +BINCL   80   81   0x72 something to ignore in a FUN body
       
 47898 +SLINE   90   91   0x82
       
 47899 +SOL    100  101   0x92 header.h
       
 47900 +SLINE  110  111  0x102
       
 47901 +FUN    120  121  0x112 fun2:some stabs type info here, to trim from the name
       
 47902 +SLINE  130  131  0x122
       
 47903 +SOL    140  141  0x132 file1.c
       
 47904 +SLINE  150  151  0x142
       
 47905 +SO     160  161  0x152
       
 47906 +LSYM   170  171  0x162
       
 47907 +SO     180  181  0x182 file3.c
       
 47908 +SO     190  191  0x192
       
 47909 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input2 b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input2
       
 47910 new file mode 100644
       
 47911 --- /dev/null
       
 47912 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input2
       
 47913 @@ -0,0 +1,1 @@
       
 47914 +SO      10   11   0x12 file2-1.c
       
 47915 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input3 b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input3
       
 47916 new file mode 100644
       
 47917 --- /dev/null
       
 47918 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input3
       
 47919 @@ -0,0 +1,2 @@
       
 47920 +SO      10   11   0x12 file3-1.c
       
 47921 +FUN     20   21   0x22 fun3_1
       
 47922 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input4 b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input4
       
 47923 new file mode 100644
       
 47924 --- /dev/null
       
 47925 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input4
       
 47926 @@ -0,0 +1,1 @@
       
 47927 +SO      10   11   0x12 build-directory/
       
 47928 diff --git a/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input5 b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input5
       
 47929 new file mode 100644
       
 47930 --- /dev/null
       
 47931 +++ b/toolkit/crashreporter/google-breakpad/src/common/linux/testdata/stabs_reader_unittest.input5
       
 47932 @@ -0,0 +1,2 @@
       
 47933 +SO      10   11   0x12 file5-1.c
       
 47934 +SO      20   21   0x22 file5-2.c
       
 47935 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/GTMDefines.h b/toolkit/crashreporter/google-breakpad/src/common/mac/GTMDefines.h
       
 47936 new file mode 100644
       
 47937 --- /dev/null
       
 47938 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/GTMDefines.h
       
 47939 @@ -0,0 +1,241 @@
       
 47940 +// 
       
 47941 +// GTMDefines.h
       
 47942 +//
       
 47943 +//  Copyright 2008 Google Inc.
       
 47944 +//
       
 47945 +//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
       
 47946 +//  use this file except in compliance with the License.  You may obtain a copy
       
 47947 +//  of the License at
       
 47948 +// 
       
 47949 +//  http://www.apache.org/licenses/LICENSE-2.0
       
 47950 +// 
       
 47951 +//  Unless required by applicable law or agreed to in writing, software
       
 47952 +//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
       
 47953 +//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
       
 47954 +//  License for the specific language governing permissions and limitations under
       
 47955 +//  the License.
       
 47956 +//
       
 47957 + 
       
 47958 +// ============================================================================
       
 47959 +
       
 47960 +#include <AvailabilityMacros.h>
       
 47961 +#include <TargetConditionals.h>
       
 47962 +
       
 47963 +// Not all MAC_OS_X_VERSION_10_X macros defined in past SDKs
       
 47964 +#ifndef MAC_OS_X_VERSION_10_5
       
 47965 +  #define MAC_OS_X_VERSION_10_5 1050
       
 47966 +#endif
       
 47967 +#ifndef MAC_OS_X_VERSION_10_6
       
 47968 +  #define MAC_OS_X_VERSION_10_6 1060
       
 47969 +#endif
       
 47970 +
       
 47971 +// ----------------------------------------------------------------------------
       
 47972 +// CPP symbols that can be overridden in a prefix to control how the toolbox
       
 47973 +// is compiled.
       
 47974 +// ----------------------------------------------------------------------------
       
 47975 +
       
 47976 +
       
 47977 +// By setting the GTM_CONTAINERS_VALIDATION_FAILED_LOG and 
       
 47978 +// GTM_CONTAINERS_VALIDATION_FAILED_ASSERT macros you can control what happens
       
 47979 +// when a validation fails. If you implement your own validators, you may want
       
 47980 +// to control their internals using the same macros for consistency.
       
 47981 +#ifndef GTM_CONTAINERS_VALIDATION_FAILED_ASSERT
       
 47982 +  #define GTM_CONTAINERS_VALIDATION_FAILED_ASSERT 0
       
 47983 +#endif
       
 47984 +
       
 47985 +// Give ourselves a consistent way to do inlines.  Apple's macros even use
       
 47986 +// a few different actual definitions, so we're based off of the foundation
       
 47987 +// one.
       
 47988 +#if !defined(GTM_INLINE)
       
 47989 +  #if defined (__GNUC__) && (__GNUC__ == 4)
       
 47990 +    #define GTM_INLINE static __inline__ __attribute__((always_inline))
       
 47991 +  #else
       
 47992 +    #define GTM_INLINE static __inline__
       
 47993 +  #endif
       
 47994 +#endif
       
 47995 +
       
 47996 +// Give ourselves a consistent way of doing externs that links up nicely
       
 47997 +// when mixing objc and objc++
       
 47998 +#if !defined (GTM_EXTERN)
       
 47999 +  #if defined __cplusplus
       
 48000 +    #define GTM_EXTERN extern "C"
       
 48001 +  #else
       
 48002 +    #define GTM_EXTERN extern
       
 48003 +  #endif
       
 48004 +#endif
       
 48005 +
       
 48006 +// Give ourselves a consistent way of exporting things if we have visibility
       
 48007 +// set to hidden.
       
 48008 +#if !defined (GTM_EXPORT)
       
 48009 +  #define GTM_EXPORT __attribute__((visibility("default")))
       
 48010 +#endif
       
 48011 +
       
 48012 +// _GTMDevLog & _GTMDevAssert
       
 48013 +//
       
 48014 +// _GTMDevLog & _GTMDevAssert are meant to be a very lightweight shell for
       
 48015 +// developer level errors.  This implementation simply macros to NSLog/NSAssert.
       
 48016 +// It is not intended to be a general logging/reporting system.
       
 48017 +//
       
 48018 +// Please see http://code.google.com/p/google-toolbox-for-mac/wiki/DevLogNAssert
       
 48019 +// for a little more background on the usage of these macros.
       
 48020 +//
       
 48021 +//    _GTMDevLog           log some error/problem in debug builds
       
 48022 +//    _GTMDevAssert        assert if conditon isn't met w/in a method/function
       
 48023 +//                           in all builds.
       
 48024 +// 
       
 48025 +// To replace this system, just provide different macro definitions in your
       
 48026 +// prefix header.  Remember, any implementation you provide *must* be thread
       
 48027 +// safe since this could be called by anything in what ever situtation it has
       
 48028 +// been placed in.
       
 48029 +// 
       
 48030 +
       
 48031 +// We only define the simple macros if nothing else has defined this.
       
 48032 +#ifndef _GTMDevLog
       
 48033 +
       
 48034 +#ifdef DEBUG
       
 48035 +  #define _GTMDevLog(...) NSLog(__VA_ARGS__)
       
 48036 +#else
       
 48037 +  #define _GTMDevLog(...) do { } while (0)
       
 48038 +#endif
       
 48039 +
       
 48040 +#endif // _GTMDevLog
       
 48041 +
       
 48042 +// Declared here so that it can easily be used for logging tracking if
       
 48043 +// necessary. See GTMUnitTestDevLog.h for details.
       
 48044 +@class NSString;
       
 48045 +GTM_EXTERN void _GTMUnitTestDevLog(NSString *format, ...);
       
 48046 +
       
 48047 +#ifndef _GTMDevAssert
       
 48048 +// we directly invoke the NSAssert handler so we can pass on the varargs
       
 48049 +// (NSAssert doesn't have a macro we can use that takes varargs)
       
 48050 +#if !defined(NS_BLOCK_ASSERTIONS)
       
 48051 +  #define _GTMDevAssert(condition, ...)                                       \
       
 48052 +    do {                                                                      \
       
 48053 +      if (!(condition)) {                                                     \
       
 48054 +        [[NSAssertionHandler currentHandler]                                  \
       
 48055 +            handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__] \
       
 48056 +                               file:[NSString stringWithUTF8String:__FILE__]  \
       
 48057 +                         lineNumber:__LINE__                                  \
       
 48058 +                        description:__VA_ARGS__];                             \
       
 48059 +      }                                                                       \
       
 48060 +    } while(0)
       
 48061 +#else // !defined(NS_BLOCK_ASSERTIONS)
       
 48062 +  #define _GTMDevAssert(condition, ...) do { } while (0)
       
 48063 +#endif // !defined(NS_BLOCK_ASSERTIONS)
       
 48064 +
       
 48065 +#endif // _GTMDevAssert
       
 48066 +
       
 48067 +// _GTMCompileAssert
       
 48068 +// _GTMCompileAssert is an assert that is meant to fire at compile time if you
       
 48069 +// want to check things at compile instead of runtime. For example if you
       
 48070 +// want to check that a wchar is 4 bytes instead of 2 you would use
       
 48071 +// _GTMCompileAssert(sizeof(wchar_t) == 4, wchar_t_is_4_bytes_on_OS_X)
       
 48072 +// Note that the second "arg" is not in quotes, and must be a valid processor
       
 48073 +// symbol in it's own right (no spaces, punctuation etc).
       
 48074 +
       
 48075 +// Wrapping this in an #ifndef allows external groups to define their own
       
 48076 +// compile time assert scheme.
       
 48077 +#ifndef _GTMCompileAssert
       
 48078 +  // We got this technique from here:
       
 48079 +  // http://unixjunkie.blogspot.com/2007/10/better-compile-time-asserts_29.html
       
 48080 +
       
 48081 +  #define _GTMCompileAssertSymbolInner(line, msg) _GTMCOMPILEASSERT ## line ## __ ## msg
       
 48082 +  #define _GTMCompileAssertSymbol(line, msg) _GTMCompileAssertSymbolInner(line, msg)
       
 48083 +  #define _GTMCompileAssert(test, msg) \
       
 48084 +    typedef char _GTMCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ]
       
 48085 +#endif // _GTMCompileAssert
       
 48086 +
       
 48087 +// Macro to allow fast enumeration when building for 10.5 or later, and
       
 48088 +// reliance on NSEnumerator for 10.4.  Remember, NSDictionary w/ FastEnumeration
       
 48089 +// does keys, so pick the right thing, nothing is done on the FastEnumeration
       
 48090 +// side to be sure you're getting what you wanted.
       
 48091 +#ifndef GTM_FOREACH_OBJECT
       
 48092 +  #if TARGET_OS_IPHONE || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5)
       
 48093 +    #define GTM_FOREACH_OBJECT(element, collection) \
       
 48094 +      for (element in collection)
       
 48095 +    #define GTM_FOREACH_KEY(element, collection) \
       
 48096 +      for (element in collection)
       
 48097 +  #else
       
 48098 +    #define GTM_FOREACH_OBJECT(element, collection) \
       
 48099 +      for (NSEnumerator * _ ## element ## _enum = [collection objectEnumerator]; \
       
 48100 +           (element = [_ ## element ## _enum nextObject]) != nil; )
       
 48101 +    #define GTM_FOREACH_KEY(element, collection) \
       
 48102 +      for (NSEnumerator * _ ## element ## _enum = [collection keyEnumerator]; \
       
 48103 +           (element = [_ ## element ## _enum nextObject]) != nil; )
       
 48104 +  #endif
       
 48105 +#endif
       
 48106 +
       
 48107 +// ============================================================================
       
 48108 +
       
 48109 +// ----------------------------------------------------------------------------
       
 48110 +// CPP symbols defined based on the project settings so the GTM code has
       
 48111 +// simple things to test against w/o scattering the knowledge of project
       
 48112 +// setting through all the code.
       
 48113 +// ----------------------------------------------------------------------------
       
 48114 +
       
 48115 +// Provide a single constant CPP symbol that all of GTM uses for ifdefing
       
 48116 +// iPhone code.
       
 48117 +#if TARGET_OS_IPHONE // iPhone SDK
       
 48118 +  // For iPhone specific stuff
       
 48119 +  #define GTM_IPHONE_SDK 1
       
 48120 +  #if TARGET_IPHONE_SIMULATOR
       
 48121 +    #define GTM_IPHONE_SIMULATOR 1
       
 48122 +  #else
       
 48123 +    #define GTM_IPHONE_DEVICE 1
       
 48124 +  #endif  // TARGET_IPHONE_SIMULATOR
       
 48125 +#else
       
 48126 +  // For MacOS specific stuff
       
 48127 +  #define GTM_MACOS_SDK 1
       
 48128 +#endif
       
 48129 +
       
 48130 +// Provide a symbol to include/exclude extra code for GC support.  (This mainly
       
 48131 +// just controls the inclusion of finalize methods).
       
 48132 +#ifndef GTM_SUPPORT_GC
       
 48133 +  #if GTM_IPHONE_SDK
       
 48134 +    // iPhone never needs GC
       
 48135 +    #define GTM_SUPPORT_GC 0
       
 48136 +  #else
       
 48137 +    // We can't find a symbol to tell if GC is supported/required, so best we
       
 48138 +    // do on Mac targets is include it if we're on 10.5 or later.
       
 48139 +    #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
       
 48140 +      #define GTM_SUPPORT_GC 0
       
 48141 +    #else
       
 48142 +      #define GTM_SUPPORT_GC 1
       
 48143 +    #endif
       
 48144 +  #endif
       
 48145 +#endif
       
 48146 +
       
 48147 +// To simplify support for 64bit (and Leopard in general), we provide the type
       
 48148 +// defines for non Leopard SDKs
       
 48149 +#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
       
 48150 + // NSInteger/NSUInteger and Max/Mins
       
 48151 +  #ifndef NSINTEGER_DEFINED
       
 48152 +    #if __LP64__ || NS_BUILD_32_LIKE_64
       
 48153 +      typedef long NSInteger;
       
 48154 +      typedef unsigned long NSUInteger;
       
 48155 +    #else
       
 48156 +      typedef int NSInteger;
       
 48157 +      typedef unsigned int NSUInteger;
       
 48158 +    #endif
       
 48159 +    #define NSIntegerMax    LONG_MAX
       
 48160 +    #define NSIntegerMin    LONG_MIN
       
 48161 +    #define NSUIntegerMax   ULONG_MAX
       
 48162 +    #define NSINTEGER_DEFINED 1
       
 48163 +  #endif  // NSINTEGER_DEFINED
       
 48164 +  // CGFloat
       
 48165 +  #ifndef CGFLOAT_DEFINED
       
 48166 +    #if defined(__LP64__) && __LP64__
       
 48167 +      // This really is an untested path (64bit on Tiger?)
       
 48168 +      typedef double CGFloat;
       
 48169 +      #define CGFLOAT_MIN DBL_MIN
       
 48170 +      #define CGFLOAT_MAX DBL_MAX
       
 48171 +      #define CGFLOAT_IS_DOUBLE 1
       
 48172 +    #else /* !defined(__LP64__) || !__LP64__ */
       
 48173 +      typedef float CGFloat;
       
 48174 +      #define CGFLOAT_MIN FLT_MIN
       
 48175 +      #define CGFLOAT_MAX FLT_MAX
       
 48176 +      #define CGFLOAT_IS_DOUBLE 0
       
 48177 +    #endif /* !defined(__LP64__) || !__LP64__ */
       
 48178 +    #define CGFLOAT_DEFINED 1
       
 48179 +  #endif // CGFLOAT_DEFINED
       
 48180 +#endif  // MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
       
 48181 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/GTMGarbageCollection.h b/toolkit/crashreporter/google-breakpad/src/common/mac/GTMGarbageCollection.h
       
 48182 new file mode 100644
       
 48183 --- /dev/null
       
 48184 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/GTMGarbageCollection.h
       
 48185 @@ -0,0 +1,72 @@
       
 48186 +//
       
 48187 +//  GTMGarbageCollection.h
       
 48188 +//
       
 48189 +//  Copyright 2007-2008 Google Inc.
       
 48190 +//
       
 48191 +//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
       
 48192 +//  use this file except in compliance with the License.  You may obtain a copy
       
 48193 +//  of the License at
       
 48194 +// 
       
 48195 +//  http://www.apache.org/licenses/LICENSE-2.0
       
 48196 +// 
       
 48197 +//  Unless required by applicable law or agreed to in writing, software
       
 48198 +//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
       
 48199 +//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
       
 48200 +//  License for the specific language governing permissions and limitations under
       
 48201 +//  the License.
       
 48202 +//
       
 48203 +
       
 48204 +#import <Foundation/Foundation.h>
       
 48205 +
       
 48206 +#import "GTMDefines.h"
       
 48207 +
       
 48208 +// This allows us to easily move our code from GC to non GC.
       
 48209 +// They are no-ops unless we are require Leopard or above.
       
 48210 +// See 
       
 48211 +// http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/index.html
       
 48212 +// and
       
 48213 +// http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html#//apple_ref/doc/uid/TP40006687-SW1
       
 48214 +// for details.
       
 48215 +
       
 48216 +#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) && !GTM_IPHONE_SDK
       
 48217 +// General use would be to call this through GTMCFAutorelease
       
 48218 +// but there may be a reason the you want to make something collectable
       
 48219 +// but not autoreleased, especially in pure GC code where you don't
       
 48220 +// want to bother with the nop autorelease. Done as a define instead of an 
       
 48221 +// inline so that tools like Clang's scan-build don't report code as leaking.
       
 48222 +#define GTMNSMakeCollectable(cf) ((id)NSMakeCollectable(cf))
       
 48223 +
       
 48224 +// GTMNSMakeUncollectable is for global maps, etc. that we don't
       
 48225 +// want released ever. You should still retain these in non-gc code.
       
 48226 +GTM_INLINE void GTMNSMakeUncollectable(id object) {
       
 48227 +  [[NSGarbageCollector defaultCollector] disableCollectorForPointer:object];
       
 48228 +}
       
 48229 +
       
 48230 +// Hopefully no code really needs this, but GTMIsGarbageCollectionEnabled is
       
 48231 +// a common way to check at runtime if GC is on.
       
 48232 +// There are some places where GC doesn't work w/ things w/in Apple's
       
 48233 +// frameworks, so this is here so GTM unittests and detect it, and not run
       
 48234 +// individual tests to work around bugs in Apple's frameworks.
       
 48235 +GTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) {
       
 48236 +  return ([NSGarbageCollector defaultCollector] != nil);
       
 48237 +}
       
 48238 +
       
 48239 +#else
       
 48240 +
       
 48241 +#define GTMNSMakeCollectable(cf) ((id)(cf))
       
 48242 +
       
 48243 +GTM_INLINE void GTMNSMakeUncollectable(id object) {
       
 48244 +}
       
 48245 +
       
 48246 +GTM_INLINE BOOL GTMIsGarbageCollectionEnabled(void) {
       
 48247 +  return NO;
       
 48248 +}
       
 48249 +
       
 48250 +#endif
       
 48251 +
       
 48252 +// GTMCFAutorelease makes a CF object collectable in GC mode, or adds it 
       
 48253 +// to the autorelease pool in non-GC mode. Either way it is taken care
       
 48254 +// of. Done as a define instead of an inline so that tools like Clang's
       
 48255 +// scan-build don't report code as leaking.
       
 48256 +#define GTMCFAutorelease(cf) ([GTMNSMakeCollectable(cf) autorelease])
       
 48257 +
       
 48258 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/GTMLogger.h b/toolkit/crashreporter/google-breakpad/src/common/mac/GTMLogger.h
       
 48259 new file mode 100644
       
 48260 --- /dev/null
       
 48261 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/GTMLogger.h
       
 48262 @@ -0,0 +1,458 @@
       
 48263 +//
       
 48264 +//  GTMLogger.h
       
 48265 +//
       
 48266 +//  Copyright 2007-2008 Google Inc.
       
 48267 +//
       
 48268 +//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
       
 48269 +//  use this file except in compliance with the License.  You may obtain a copy
       
 48270 +//  of the License at
       
 48271 +// 
       
 48272 +//  http://www.apache.org/licenses/LICENSE-2.0
       
 48273 +// 
       
 48274 +//  Unless required by applicable law or agreed to in writing, software
       
 48275 +//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
       
 48276 +//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
       
 48277 +//  License for the specific language governing permissions and limitations under
       
 48278 +//  the License.
       
 48279 +//
       
 48280 +
       
 48281 +// Key Abstractions
       
 48282 +// ----------------
       
 48283 +// 
       
 48284 +// This file declares multiple classes and protocols that are used by the 
       
 48285 +// GTMLogger logging system. The 4 main abstractions used in this file are the
       
 48286 +// following:
       
 48287 +//
       
 48288 +//   * logger (GTMLogger) - The main logging class that users interact with. It
       
 48289 +//   has methods for logging at different levels and uses a log writer, a log
       
 48290 +//   formatter, and a log filter to get the job done.
       
 48291 +// 
       
 48292 +//   * log writer (GTMLogWriter) - Writes a given string to some log file, where
       
 48293 +//   a "log file" can be a physical file on disk, a POST over HTTP to some URL,
       
 48294 +//   or even some in-memory structure (e.g., a ring buffer).
       
 48295 +//
       
 48296 +//   * log formatter (GTMLogFormatter) - Given a format string and arguments as
       
 48297 +//   a va_list, returns a single formatted NSString. A "formatted string" could
       
 48298 +//   be a string with the date prepended, a string with values in a CSV format,
       
 48299 +//   or even a string of XML.
       
 48300 +//
       
 48301 +//   * log filter (GTMLogFilter) - Given a formatted log message as an NSString
       
 48302 +//   and the level at which the message is to be logged, this class will decide
       
 48303 +//   whether the given message should be logged or not. This is a flexible way
       
 48304 +//   to filter out messages logged at a certain level, messages that contain
       
 48305 +//   certain text, or filter nothing out at all. This gives the caller the
       
 48306 +//   flexibility to dynamically enable debug logging in Release builds.
       
 48307 +//
       
 48308 +// This file also declares some classes to handle the common log writer, log
       
 48309 +// formatter, and log filter cases. Callers can also create their own writers, 
       
 48310 +// formatters, and filters and they can even build them on top of the ones
       
 48311 +// declared here. Keep in mind that your custom writer/formatter/filter may be
       
 48312 +// called from multiple threads, so it must be thread-safe.
       
 48313 +
       
 48314 +#import <Foundation/Foundation.h>
       
 48315 +#import "GTMDefines.h"
       
 48316 +
       
 48317 +// Predeclaration of used protocols that are declared later in this file.
       
 48318 +@protocol GTMLogWriter, GTMLogFormatter, GTMLogFilter;
       
 48319 +
       
 48320 +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5
       
 48321 +#define CHECK_FORMAT_NSSTRING(a, b) __attribute__((format(__NSString__, a, b)))
       
 48322 +#else
       
 48323 +#define CHECK_FORMAT_NSSTRING(a, b)
       
 48324 +#endif
       
 48325 +
       
 48326 +// GTMLogger
       
 48327 +//
       
 48328 +// GTMLogger is the primary user-facing class for an object-oriented logging
       
 48329 +// system. It is built on the concept of log formatters (GTMLogFormatter), log
       
 48330 +// writers (GTMLogWriter), and log filters (GTMLogFilter). When a message is
       
 48331 +// sent to a GTMLogger to log a message, the message is formatted using the log
       
 48332 +// formatter, then the log filter is consulted to see if the message should be
       
 48333 +// logged, and if so, the message is sent to the log writer to be written out.
       
 48334 +// 
       
 48335 +// GTMLogger is intended to be a flexible and thread-safe logging solution. Its
       
 48336 +// flexibility comes from the fact that GTMLogger instances can be customized
       
 48337 +// with user defined formatters, filters, and writers. And these writers,
       
 48338 +// filters, and formatters can be combined, stacked, and customized in arbitrary
       
 48339 +// ways to suit the needs at hand. For example, multiple writers can be used at
       
 48340 +// the same time, and a GTMLogger instance can even be used as another
       
 48341 +// GTMLogger's writer. This allows for arbitrarily deep logging trees.
       
 48342 +// 
       
 48343 +// A standard GTMLogger uses a writer that sends messages to standard out, a
       
 48344 +// formatter that smacks a timestamp and a few other bits of interesting
       
 48345 +// information on the message, and a filter that filters out debug messages from
       
 48346 +// release builds. Using the standard log settings, a log message will look like
       
 48347 +// the following:
       
 48348 +//
       
 48349 +//   2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] foo=<Foo: 0x123>
       
 48350 +// 
       
 48351 +// The output contains the date and time of the log message, the name of the
       
 48352 +// process followed by its process ID/thread ID, the log level at which the
       
 48353 +// message was logged (in the previous example the level was 1:
       
 48354 +// kGTMLoggerLevelDebug), and finally, the user-specified log message itself (in
       
 48355 +// this case, the log message was @"foo=%@", foo).
       
 48356 +// 
       
 48357 +// Multiple instances of GTMLogger can be created, each configured their own
       
 48358 +// way.  Though GTMLogger is not a singleton (in the GoF sense), it does provide
       
 48359 +// access to a shared (i.e., globally accessible) GTMLogger instance. This makes
       
 48360 +// it convenient for all code in a process to use the same GTMLogger instance.
       
 48361 +// The shared GTMLogger instance can also be configured in an arbitrary, and
       
 48362 +// these configuration changes will affect all code that logs through the shared
       
 48363 +// instance.
       
 48364 +
       
 48365 +//
       
 48366 +// Log Levels
       
 48367 +// ----------
       
 48368 +// GTMLogger has 3 different log levels: Debug, Info, and Error. GTMLogger
       
 48369 +// doesn't take any special action based on the log level; it simply forwards
       
 48370 +// this information on to formatters, filters, and writers, each of which may
       
 48371 +// optionally take action based on the level. Since log level filtering is
       
 48372 +// performed at runtime, log messages are typically not filtered out at compile
       
 48373 +// time.  The exception to this rule is that calls to the GTMLoggerDebug() macro
       
 48374 +// *ARE* filtered out of non-DEBUG builds. This is to be backwards compatible
       
 48375 +// with behavior that many developers are currently used to. Note that this
       
 48376 +// means that GTMLoggerDebug(@"hi") will be compiled out of Release builds, but
       
 48377 +// [[GTMLogger sharedLogger] logDebug:@"hi"] will NOT be compiled out.
       
 48378 +// 
       
 48379 +// Standard loggers are created with the GTMLogLevelFilter log filter, which
       
 48380 +// filters out certain log messages based on log level, and some other settings.
       
 48381 +// 
       
 48382 +// In addition to the -logDebug:, -logInfo:, and -logError: methods defined on
       
 48383 +// GTMLogger itself, there are also C macros that make usage of the shared
       
 48384 +// GTMLogger instance very convenient. These macros are:
       
 48385 +//
       
 48386 +//   GTMLoggerDebug(...)
       
 48387 +//   GTMLoggerInfo(...)
       
 48388 +//   GTMLoggerError(...)
       
 48389 +//
       
 48390 +// Again, a notable feature of these macros is that GTMLogDebug() calls *will be
       
 48391 +// compiled out of non-DEBUG builds*.
       
 48392 +//
       
 48393 +// Standard Loggers
       
 48394 +// ----------------
       
 48395 +// GTMLogger has the concept of "standard loggers". A standard logger is simply
       
 48396 +// a logger that is pre-configured with some standard/common writer, formatter,
       
 48397 +// and filter combination. Standard loggers are created using the creation
       
 48398 +// methods beginning with "standard". The alternative to a standard logger is a
       
 48399 +// regular logger, which will send messages to stdout, with no special
       
 48400 +// formatting, and no filtering.
       
 48401 +//
       
 48402 +// How do I use GTMLogger?
       
 48403 +// ----------------------
       
 48404 +// The typical way you will want to use GTMLogger is to simply use the
       
 48405 +// GTMLogger*() macros for logging from code. That way we can easily make
       
 48406 +// changes to the GTMLogger class and simply update the macros accordingly. Only
       
 48407 +// your application startup code (perhaps, somewhere in main()) should use the
       
 48408 +// GTMLogger class directly in order to configure the shared logger, which all
       
 48409 +// of the code using the macros will be using. Again, this is just the typical
       
 48410 +// situation.
       
 48411 +// 
       
 48412 +// To be complete, there are cases where you may want to use GTMLogger directly,
       
 48413 +// or even create separate GTMLogger instances for some reason. That's fine,
       
 48414 +// too.
       
 48415 +//
       
 48416 +// Examples
       
 48417 +// --------
       
 48418 +// The following show some common GTMLogger use cases.
       
 48419 +//
       
 48420 +// 1. You want to log something as simply as possible. Also, this call will only
       
 48421 +//    appear in debug builds. In non-DEBUG builds it will be completely removed.
       
 48422 +//
       
 48423 +//      GTMLoggerDebug(@"foo = %@", foo);
       
 48424 +//
       
 48425 +// 2. The previous example is similar to the following. The major difference is 
       
 48426 +//    that the previous call (example 1) will be compiled out of Release builds
       
 48427 +//    but this statement will not be compiled out.
       
 48428 +//
       
 48429 +//      [[GTMLogger sharedLogger] logDebug:@"foo = %@", foo];
       
 48430 +//
       
 48431 +// 3. Send all logging output from the shared logger to a file. We do this by
       
 48432 +//    creating an NSFileHandle for writing associated with a file, and setting 
       
 48433 +//    that file handle as the logger's writer.
       
 48434 +//
       
 48435 +//      NSFileHandle *f = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/f.log"
       
 48436 +//                                                          create:YES];
       
 48437 +//      [[GTMLogger sharedLogger] setWriter:f];
       
 48438 +//      GTMLoggerError(@"hi");  // This will be sent to /tmp/f.log
       
 48439 +//
       
 48440 +// 4. Create a new GTMLogger that will log to a file. This example differs from
       
 48441 +//    the previous one because here we create a new GTMLogger that is different
       
 48442 +//    from the shared logger.
       
 48443 +//
       
 48444 +//      GTMLogger *logger = [GTMLogger standardLoggerWithPath:@"/tmp/temp.log"];
       
 48445 +//      [logger logInfo:@"hi temp log file"];
       
 48446 +//
       
 48447 +// 5. Create a logger that writes to stdout and does NOT do any formatting to
       
 48448 +//    the log message. This might be useful, for example, when writing a help
       
 48449 +//    screen for a command-line tool to standard output.
       
 48450 +//      
       
 48451 +//      GTMLogger *logger = [GTMLogger logger];
       
 48452 +//      [logger logInfo:@"%@ version 0.1 usage", progName];
       
 48453 +//
       
 48454 +// 6. Send log output to stdout AND to a log file. The trick here is that 
       
 48455 +//    NSArrays function as composite log writers, which means when an array is 
       
 48456 +//    set as the log writer, it forwards all logging messages to all of its
       
 48457 +//    contained GTMLogWriters.
       
 48458 +//
       
 48459 +//      // Create array of GTMLogWriters
       
 48460 +//      NSArray *writers = [NSArray arrayWithObjects:
       
 48461 +//          [NSFileHandle fileHandleForWritingAtPath:@"/tmp/f.log" create:YES],
       
 48462 +//          [NSFileHandle fileHandleWithStandardOutput], nil];
       
 48463 +//      
       
 48464 +//      GTMLogger *logger = [GTMLogger standardLogger];
       
 48465 +//      [logger setWriter:writers];
       
 48466 +//      [logger logInfo:@"hi"];  // Output goes to stdout and /tmp/f.log
       
 48467 +//
       
 48468 +// For futher details on log writers, formatters, and filters, see the
       
 48469 +// documentation below.
       
 48470 +//
       
 48471 +// NOTE: GTMLogger is application level logging.  By default it does nothing
       
 48472 +// with _GTMDevLog/_GTMDevAssert (see GTMDefines.h).  An application can choose
       
 48473 +// to bridge _GTMDevLog/_GTMDevAssert to GTMLogger by providing macro
       
 48474 +// definitions in its prefix header (see GTMDefines.h for how one would do
       
 48475 +// that).
       
 48476 +//
       
 48477 +@interface GTMLogger : NSObject {
       
 48478 + @private
       
 48479 +  id<GTMLogWriter> writer_;
       
 48480 +  id<GTMLogFormatter> formatter_;
       
 48481 +  id<GTMLogFilter> filter_;
       
 48482 +}
       
 48483 +
       
 48484 +//
       
 48485 +// Accessors for the shared logger instance
       
 48486 +//
       
 48487 +
       
 48488 +// Returns a shared/global standard GTMLogger instance. Callers should typically
       
 48489 +// use this method to get a GTMLogger instance, unless they explicitly want
       
 48490 +// their own instance to configure for their own needs. This is the only method
       
 48491 +// that returns a shared instance; all the rest return new GTMLogger instances.
       
 48492 ++ (id)sharedLogger;
       
 48493 +
       
 48494 +// Sets the shared logger instance to |logger|. Future calls to +sharedLogger
       
 48495 +// will return |logger| instead.
       
 48496 ++ (void)setSharedLogger:(GTMLogger *)logger;
       
 48497 +
       
 48498 +//
       
 48499 +// Creation methods
       
 48500 +//
       
 48501 +
       
 48502 +// Returns a new autoreleased GTMLogger instance that will log to stdout, using
       
 48503 +// the GTMLogStandardFormatter, and the GTMLogLevelFilter filter.
       
 48504 ++ (id)standardLogger;
       
 48505 +
       
 48506 +// Same as +standardLogger, but logs to stderr.
       
 48507 ++ (id)standardLoggerWithStderr;
       
 48508 +
       
 48509 +// Returns a new standard GTMLogger instance with a log writer that will
       
 48510 +// write to the file at |path|, and will use the GTMLogStandardFormatter and
       
 48511 +// GTMLogLevelFilter classes. If |path| does not exist, it will be created.
       
 48512 ++ (id)standardLoggerWithPath:(NSString *)path;
       
 48513 +
       
 48514 +// Returns an autoreleased GTMLogger instance that will use the specified
       
 48515 +// |writer|, |formatter|, and |filter|.
       
 48516 ++ (id)loggerWithWriter:(id<GTMLogWriter>)writer
       
 48517 +             formatter:(id<GTMLogFormatter>)formatter
       
 48518 +                filter:(id<GTMLogFilter>)filter;
       
 48519 +
       
 48520 +// Returns an autoreleased GTMLogger instance that logs to stdout, with the
       
 48521 +// basic formatter, and no filter. The returned logger differs from the logger
       
 48522 +// returned by +standardLogger because this one does not do any filtering and
       
 48523 +// does not do any special log formatting; this is the difference between a
       
 48524 +// "regular" logger and a "standard" logger.
       
 48525 ++ (id)logger;
       
 48526 +
       
 48527 +// Designated initializer. This method returns a GTMLogger initialized with the
       
 48528 +// specified |writer|, |formatter|, and |filter|. See the setter methods below
       
 48529 +// for what values will be used if nil is passed for a parameter.
       
 48530 +- (id)initWithWriter:(id<GTMLogWriter>)writer
       
 48531 +           formatter:(id<GTMLogFormatter>)formatter
       
 48532 +              filter:(id<GTMLogFilter>)filter;
       
 48533 +
       
 48534 +//
       
 48535 +// Logging  methods
       
 48536 +//
       
 48537 +
       
 48538 +// Logs a message at the debug level (kGTMLoggerLevelDebug).
       
 48539 +- (void)logDebug:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2);
       
 48540 +// Logs a message at the info level (kGTMLoggerLevelInfo).
       
 48541 +- (void)logInfo:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2);
       
 48542 +// Logs a message at the error level (kGTMLoggerLevelError).
       
 48543 +- (void)logError:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2);
       
 48544 +// Logs a message at the assert level (kGTMLoggerLevelAssert).
       
 48545 +- (void)logAssert:(NSString *)fmt, ... CHECK_FORMAT_NSSTRING(1, 2);
       
 48546 +
       
 48547 +
       
 48548 +//
       
 48549 +// Accessors
       
 48550 +//
       
 48551 +
       
 48552 +// Accessor methods for the log writer. If the log writer is set to nil,  
       
 48553 +// [NSFileHandle fileHandleWithStandardOutput] is used.
       
 48554 +- (id<GTMLogWriter>)writer;
       
 48555 +- (void)setWriter:(id<GTMLogWriter>)writer;
       
 48556 +
       
 48557 +// Accessor methods for the log formatter. If the log formatter is set to nil,
       
 48558 +// GTMLogBasicFormatter is used. This formatter will format log messages in a
       
 48559 +// plain printf style.
       
 48560 +- (id<GTMLogFormatter>)formatter;
       
 48561 +- (void)setFormatter:(id<GTMLogFormatter>)formatter;
       
 48562 +
       
 48563 +// Accessor methods for the log filter. If the log filter is set to nil,
       
 48564 +// GTMLogNoFilter is used, which allows all log messages through.
       
 48565 +- (id<GTMLogFilter>)filter;
       
 48566 +- (void)setFilter:(id<GTMLogFilter>)filter;
       
 48567 +
       
 48568 +@end  // GTMLogger
       
 48569 +
       
 48570 +
       
 48571 +// Helper functions that are used by the convenience GTMLogger*() macros that 
       
 48572 +// enable the logging of function names.
       
 48573 +@interface GTMLogger (GTMLoggerMacroHelpers)
       
 48574 +- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ...
       
 48575 +  CHECK_FORMAT_NSSTRING(2, 3);
       
 48576 +- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ...
       
 48577 +  CHECK_FORMAT_NSSTRING(2, 3);
       
 48578 +- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ...
       
 48579 +  CHECK_FORMAT_NSSTRING(2, 3);
       
 48580 +- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ...
       
 48581 +  CHECK_FORMAT_NSSTRING(2, 3);
       
 48582 +@end  // GTMLoggerMacroHelpers
       
 48583 +
       
 48584 +
       
 48585 +// Convenience macros that log to the shared GTMLogger instance. These macros
       
 48586 +// are how users should typically log to GTMLogger. Notice that GTMLoggerDebug()
       
 48587 +// calls will be compiled out of non-Debug builds.
       
 48588 +#define GTMLoggerDebug(...)  \
       
 48589 +  [[GTMLogger sharedLogger] logFuncDebug:__func__ msg:__VA_ARGS__]
       
 48590 +#define GTMLoggerInfo(...)   \
       
 48591 +  [[GTMLogger sharedLogger] logFuncInfo:__func__ msg:__VA_ARGS__]
       
 48592 +#define GTMLoggerError(...)  \
       
 48593 +  [[GTMLogger sharedLogger] logFuncError:__func__ msg:__VA_ARGS__]
       
 48594 +#define GTMLoggerAssert(...) \
       
 48595 +  [[GTMLogger sharedLogger] logFuncAssert:__func__ msg:__VA_ARGS__]
       
 48596 +
       
 48597 +// If we're not in a debug build, remove the GTMLoggerDebug statements. This
       
 48598 +// makes calls to GTMLoggerDebug "compile out" of Release builds
       
 48599 +#ifndef DEBUG
       
 48600 +#undef GTMLoggerDebug
       
 48601 +#define GTMLoggerDebug(...) do {} while(0)
       
 48602 +#endif
       
 48603 +
       
 48604 +// Log levels.
       
 48605 +typedef enum {
       
 48606 +  kGTMLoggerLevelUnknown,
       
 48607 +  kGTMLoggerLevelDebug,
       
 48608 +  kGTMLoggerLevelInfo,
       
 48609 +  kGTMLoggerLevelError,
       
 48610 +  kGTMLoggerLevelAssert,
       
 48611 +} GTMLoggerLevel;
       
 48612 +
       
 48613 +
       
 48614 +//
       
 48615 +//   Log Writers
       
 48616 +//
       
 48617 +
       
 48618 +// Protocol to be implemented by a GTMLogWriter instance.
       
 48619 +@protocol GTMLogWriter <NSObject>
       
 48620 +// Writes the given log message to where the log writer is configured to write.
       
 48621 +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level;
       
 48622 +@end  // GTMLogWriter
       
 48623 +
       
 48624 +
       
 48625 +// Simple category on NSFileHandle that makes NSFileHandles valid log writers.
       
 48626 +// This is convenient because something like, say, +fileHandleWithStandardError
       
 48627 +// now becomes a valid log writer. Log messages are written to the file handle
       
 48628 +// with a newline appended.
       
 48629 +@interface NSFileHandle (GTMFileHandleLogWriter) <GTMLogWriter>
       
 48630 +// Opens the file at |path| in append mode, and creates the file with |mode| 
       
 48631 +// if it didn't previously exist.
       
 48632 ++ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode;
       
 48633 +@end  // NSFileHandle
       
 48634 +
       
 48635 +
       
 48636 +// This category makes NSArray a GTMLogWriter that can be composed of other
       
 48637 +// GTMLogWriters. This is the classic Composite GoF design pattern. When the
       
 48638 +// GTMLogWriter -logMessage:level: message is sent to the array, the array
       
 48639 +// forwards the message to all of its elements that implement the GTMLogWriter
       
 48640 +// protocol.
       
 48641 +//
       
 48642 +// This is useful in situations where you would like to send log output to
       
 48643 +// multiple log writers at the same time. Simply create an NSArray of the log
       
 48644 +// writers you wish to use, then set the array as the "writer" for your 
       
 48645 +// GTMLogger instance.
       
 48646 +@interface NSArray (GTMArrayCompositeLogWriter) <GTMLogWriter>
       
 48647 +@end  // GTMArrayCompositeLogWriter
       
 48648 +
       
 48649 +
       
 48650 +// This category adapts the GTMLogger interface so that it can be used as a log
       
 48651 +// writer; it's an "adapter" in the GoF Adapter pattern sense.
       
 48652 +//
       
 48653 +// This is useful when you want to configure a logger to log to a specific
       
 48654 +// writer with a specific formatter and/or filter. But you want to also compose
       
 48655 +// that with a different log writer that may have its own formatter and/or 
       
 48656 +// filter.
       
 48657 +@interface GTMLogger (GTMLoggerLogWriter) <GTMLogWriter>
       
 48658 +@end  // GTMLoggerLogWriter
       
 48659 +
       
 48660 +
       
 48661 +//
       
 48662 +//   Log Formatters
       
 48663 +//
       
 48664 +
       
 48665 +// Protocol to be implemented by a GTMLogFormatter instance.
       
 48666 +@protocol GTMLogFormatter <NSObject>
       
 48667 +// Returns a formatted string using the format specified in |fmt| and the va
       
 48668 +// args specified in |args|.
       
 48669 +- (NSString *)stringForFunc:(NSString *)func
       
 48670 +                 withFormat:(NSString *)fmt
       
 48671 +                     valist:(va_list)args
       
 48672 +                      level:(GTMLoggerLevel)level;
       
 48673 +@end  // GTMLogFormatter
       
 48674 +
       
 48675 +
       
 48676 +// A basic log formatter that formats a string the same way that NSLog (or 
       
 48677 +// printf) would. It does not do anything fancy, nor does it add any data of its
       
 48678 +// own.
       
 48679 +@interface GTMLogBasicFormatter : NSObject <GTMLogFormatter>
       
 48680 +@end  // GTMLogBasicFormatter
       
 48681 +
       
 48682 +
       
 48683 +// A log formatter that formats the log string like the basic formatter, but
       
 48684 +// also prepends a timestamp and some basic process info to the message, as
       
 48685 +// shown in the following sample output.
       
 48686 +//   2007-12-30 10:29:24.177 myapp[4588/0xa07d0f60] [lvl=1] log mesage here
       
 48687 +@interface GTMLogStandardFormatter : GTMLogBasicFormatter {
       
 48688 + @private
       
 48689 +  NSDateFormatter *dateFormatter_;  // yyyy-MM-dd HH:mm:ss.SSS
       
 48690 +  NSString *pname_;
       
 48691 +  pid_t pid_;
       
 48692 +}
       
 48693 +@end  // GTMLogStandardFormatter
       
 48694 +
       
 48695 +
       
 48696 +//
       
 48697 +//   Log Filters
       
 48698 +//
       
 48699 +
       
 48700 +// Protocol to be imlemented by a GTMLogFilter instance.
       
 48701 +@protocol GTMLogFilter <NSObject>
       
 48702 +// Returns YES if |msg| at |level| should be filtered out; NO otherwise.
       
 48703 +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level;
       
 48704 +@end  // GTMLogFilter
       
 48705 +
       
 48706 +
       
 48707 +// A log filter that filters messages at the kGTMLoggerLevelDebug level out of
       
 48708 +// non-debug builds. Messages at the kGTMLoggerLevelInfo level are also filtered
       
 48709 +// out of non-debug builds unless GTMVerboseLogging is set in the environment or
       
 48710 +// the processes's defaults. Messages at the kGTMLoggerLevelError level are
       
 48711 +// never filtered.
       
 48712 +@interface GTMLogLevelFilter : NSObject <GTMLogFilter>
       
 48713 +@end  // GTMLogLevelFilter
       
 48714 +
       
 48715 +
       
 48716 +// A simple log filter that does NOT filter anything out;
       
 48717 +// -filterAllowsMessage:level will always return YES. This can be a convenient
       
 48718 +// way to enable debug-level logging in release builds (if you so desire).
       
 48719 +@interface GTMLogNoFilter : NSObject <GTMLogFilter>
       
 48720 +@end  // GTMLogNoFilter
       
 48721 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/GTMLogger.m b/toolkit/crashreporter/google-breakpad/src/common/mac/GTMLogger.m
       
 48722 new file mode 100644
       
 48723 --- /dev/null
       
 48724 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/GTMLogger.m
       
 48725 @@ -0,0 +1,445 @@
       
 48726 +//
       
 48727 +//  GTMLogger.m
       
 48728 +//
       
 48729 +//  Copyright 2007-2008 Google Inc.
       
 48730 +//
       
 48731 +//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
       
 48732 +//  use this file except in compliance with the License.  You may obtain a copy
       
 48733 +//  of the License at
       
 48734 +// 
       
 48735 +//  http://www.apache.org/licenses/LICENSE-2.0
       
 48736 +// 
       
 48737 +//  Unless required by applicable law or agreed to in writing, software
       
 48738 +//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
       
 48739 +//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
       
 48740 +//  License for the specific language governing permissions and limitations under
       
 48741 +//  the License.
       
 48742 +//
       
 48743 +
       
 48744 +#import "GTMLogger.h"
       
 48745 +#import "GTMGarbageCollection.h"
       
 48746 +#import <fcntl.h>
       
 48747 +#import <unistd.h>
       
 48748 +#import <stdlib.h>
       
 48749 +#import <pthread.h>
       
 48750 +
       
 48751 +
       
 48752 +// Define a trivial assertion macro to avoid dependencies
       
 48753 +#ifdef DEBUG
       
 48754 +  #define GTMLOGGER_ASSERT(expr) assert(expr)
       
 48755 +#else
       
 48756 +  #define GTMLOGGER_ASSERT(expr)
       
 48757 +#endif
       
 48758 +
       
 48759 +
       
 48760 +@interface GTMLogger (PrivateMethods)
       
 48761 +
       
 48762 +- (void)logInternalFunc:(const char *)func
       
 48763 +                 format:(NSString *)fmt
       
 48764 +                 valist:(va_list)args 
       
 48765 +                  level:(GTMLoggerLevel)level;
       
 48766 +
       
 48767 +@end
       
 48768 +
       
 48769 +
       
 48770 +// Reference to the shared GTMLogger instance. This is not a singleton, it's 
       
 48771 +// just an easy reference to one shared instance.
       
 48772 +static GTMLogger *gSharedLogger = nil;
       
 48773 +
       
 48774 +
       
 48775 +@implementation GTMLogger
       
 48776 +
       
 48777 +// Returns a pointer to the shared logger instance. If none exists, a standard 
       
 48778 +// logger is created and returned.
       
 48779 ++ (id)sharedLogger {
       
 48780 +  @synchronized(self) {
       
 48781 +    if (gSharedLogger == nil) {
       
 48782 +      gSharedLogger = [[self standardLogger] retain];
       
 48783 +    }
       
 48784 +    GTMLOGGER_ASSERT(gSharedLogger != nil);
       
 48785 +  }
       
 48786 +  return [[gSharedLogger retain] autorelease];
       
 48787 +}
       
 48788 +
       
 48789 ++ (void)setSharedLogger:(GTMLogger *)logger {
       
 48790 +  @synchronized(self) {
       
 48791 +    [gSharedLogger autorelease];
       
 48792 +    gSharedLogger = [logger retain];
       
 48793 +  }
       
 48794 +}
       
 48795 +
       
 48796 ++ (id)standardLogger {
       
 48797 +  id<GTMLogWriter> writer = [NSFileHandle fileHandleWithStandardOutput];
       
 48798 +  id<GTMLogFormatter> fr = [[[GTMLogStandardFormatter alloc] init] autorelease];
       
 48799 +  id<GTMLogFilter> filter = [[[GTMLogLevelFilter alloc] init] autorelease];
       
 48800 +  return [self loggerWithWriter:writer formatter:fr filter:filter];
       
 48801 +}
       
 48802 +
       
 48803 ++ (id)standardLoggerWithStderr {
       
 48804 +  id me = [self standardLogger];
       
 48805 +  [me setWriter:[NSFileHandle fileHandleWithStandardError]];
       
 48806 +  return me;
       
 48807 +}
       
 48808 +
       
 48809 ++ (id)standardLoggerWithPath:(NSString *)path {
       
 48810 +  NSFileHandle *fh = [NSFileHandle fileHandleForLoggingAtPath:path mode:0644];
       
 48811 +  if (fh == nil) return nil;
       
 48812 +  id me = [self standardLogger];
       
 48813 +  [me setWriter:fh];
       
 48814 +  return me;
       
 48815 +}
       
 48816 +
       
 48817 ++ (id)loggerWithWriter:(id<GTMLogWriter>)writer
       
 48818 +             formatter:(id<GTMLogFormatter>)formatter
       
 48819 +                filter:(id<GTMLogFilter>)filter {
       
 48820 +  return [[[self alloc] initWithWriter:writer
       
 48821 +                             formatter:formatter
       
 48822 +                                filter:filter] autorelease];
       
 48823 +}
       
 48824 +
       
 48825 ++ (id)logger {
       
 48826 +  return [[[self alloc] init] autorelease];
       
 48827 +}
       
 48828 +
       
 48829 +- (id)init {
       
 48830 +  return [self initWithWriter:nil formatter:nil filter:nil];
       
 48831 +}
       
 48832 +
       
 48833 +- (id)initWithWriter:(id<GTMLogWriter>)writer
       
 48834 +           formatter:(id<GTMLogFormatter>)formatter
       
 48835 +              filter:(id<GTMLogFilter>)filter {
       
 48836 +  if ((self = [super init])) {
       
 48837 +    [self setWriter:writer];
       
 48838 +    [self setFormatter:formatter];
       
 48839 +    [self setFilter:filter];
       
 48840 +    GTMLOGGER_ASSERT(formatter_ != nil);
       
 48841 +    GTMLOGGER_ASSERT(filter_ != nil);
       
 48842 +    GTMLOGGER_ASSERT(writer_ != nil);
       
 48843 +  }
       
 48844 +  return self;
       
 48845 +}
       
 48846 +
       
 48847 +- (void)dealloc {
       
 48848 +  GTMLOGGER_ASSERT(writer_ != nil);
       
 48849 +  GTMLOGGER_ASSERT(formatter_ != nil);
       
 48850 +  GTMLOGGER_ASSERT(filter_ != nil);
       
 48851 +  [writer_ release];
       
 48852 +  [formatter_ release];
       
 48853 +  [filter_ release];
       
 48854 +  [super dealloc];
       
 48855 +}
       
 48856 +
       
 48857 +- (id<GTMLogWriter>)writer {
       
 48858 +  GTMLOGGER_ASSERT(writer_ != nil);
       
 48859 +  return [[writer_ retain] autorelease];
       
 48860 +}
       
 48861 +
       
 48862 +- (void)setWriter:(id<GTMLogWriter>)writer {
       
 48863 +  @synchronized(self) {
       
 48864 +    [writer_ autorelease];
       
 48865 +    if (writer == nil)
       
 48866 +      writer_ = [[NSFileHandle fileHandleWithStandardOutput] retain];
       
 48867 +    else
       
 48868 +      writer_ = [writer retain];
       
 48869 +  }
       
 48870 +  GTMLOGGER_ASSERT(writer_ != nil);
       
 48871 +}
       
 48872 +
       
 48873 +- (id<GTMLogFormatter>)formatter {
       
 48874 +  GTMLOGGER_ASSERT(formatter_ != nil);
       
 48875 +  return [[formatter_ retain] autorelease];
       
 48876 +}
       
 48877 +
       
 48878 +- (void)setFormatter:(id<GTMLogFormatter>)formatter {
       
 48879 +  @synchronized(self) {
       
 48880 +    [formatter_ autorelease];
       
 48881 +    if (formatter == nil)
       
 48882 +      formatter_ = [[GTMLogBasicFormatter alloc] init];
       
 48883 +    else
       
 48884 +      formatter_ = [formatter retain];
       
 48885 +  }
       
 48886 +  GTMLOGGER_ASSERT(formatter_ != nil);
       
 48887 +}
       
 48888 +
       
 48889 +- (id<GTMLogFilter>)filter {
       
 48890 +  GTMLOGGER_ASSERT(filter_ != nil);
       
 48891 +  return [[filter_ retain] autorelease];
       
 48892 +}
       
 48893 +
       
 48894 +- (void)setFilter:(id<GTMLogFilter>)filter {
       
 48895 +  @synchronized(self) {
       
 48896 +    [filter_ autorelease];
       
 48897 +    if (filter == nil)
       
 48898 +      filter_ = [[GTMLogNoFilter alloc] init];
       
 48899 +    else
       
 48900 +      filter_ = [filter retain];
       
 48901 +  }
       
 48902 +  GTMLOGGER_ASSERT(filter_ != nil);
       
 48903 +}
       
 48904 +
       
 48905 +- (void)logDebug:(NSString *)fmt, ... {
       
 48906 +  va_list args;
       
 48907 +  va_start(args, fmt);
       
 48908 +  [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelDebug];
       
 48909 +  va_end(args);
       
 48910 +}
       
 48911 +
       
 48912 +- (void)logInfo:(NSString *)fmt, ... {
       
 48913 +  va_list args;
       
 48914 +  va_start(args, fmt);
       
 48915 +  [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelInfo];
       
 48916 +  va_end(args);
       
 48917 +}
       
 48918 +
       
 48919 +- (void)logError:(NSString *)fmt, ... {
       
 48920 +  va_list args;
       
 48921 +  va_start(args, fmt);
       
 48922 +  [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelError];
       
 48923 +  va_end(args);
       
 48924 +}
       
 48925 +
       
 48926 +- (void)logAssert:(NSString *)fmt, ... {
       
 48927 +  va_list args;
       
 48928 +  va_start(args, fmt);
       
 48929 +  [self logInternalFunc:NULL format:fmt valist:args level:kGTMLoggerLevelAssert];
       
 48930 +  va_end(args);
       
 48931 +}
       
 48932 +
       
 48933 +@end  // GTMLogger
       
 48934 +
       
 48935 +
       
 48936 +@implementation GTMLogger (GTMLoggerMacroHelpers)
       
 48937 +
       
 48938 +- (void)logFuncDebug:(const char *)func msg:(NSString *)fmt, ... {
       
 48939 +  va_list args;
       
 48940 +  va_start(args, fmt);
       
 48941 +  [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelDebug];
       
 48942 +  va_end(args);
       
 48943 +}
       
 48944 +
       
 48945 +- (void)logFuncInfo:(const char *)func msg:(NSString *)fmt, ... {
       
 48946 +  va_list args;
       
 48947 +  va_start(args, fmt);
       
 48948 +  [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelInfo];
       
 48949 +  va_end(args);
       
 48950 +}
       
 48951 +
       
 48952 +- (void)logFuncError:(const char *)func msg:(NSString *)fmt, ... {
       
 48953 +  va_list args;
       
 48954 +  va_start(args, fmt);
       
 48955 +  [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelError];
       
 48956 +  va_end(args);
       
 48957 +}
       
 48958 +
       
 48959 +- (void)logFuncAssert:(const char *)func msg:(NSString *)fmt, ... {
       
 48960 +  va_list args;
       
 48961 +  va_start(args, fmt);
       
 48962 +  [self logInternalFunc:func format:fmt valist:args level:kGTMLoggerLevelAssert];
       
 48963 +  va_end(args);
       
 48964 +}
       
 48965 +
       
 48966 +@end  // GTMLoggerMacroHelpers
       
 48967 +
       
 48968 +
       
 48969 +@implementation GTMLogger (PrivateMethods)
       
 48970 +
       
 48971 +- (void)logInternalFunc:(const char *)func
       
 48972 +                 format:(NSString *)fmt
       
 48973 +                 valist:(va_list)args 
       
 48974 +                  level:(GTMLoggerLevel)level {
       
 48975 +  GTMLOGGER_ASSERT(formatter_ != nil);
       
 48976 +  GTMLOGGER_ASSERT(filter_ != nil);
       
 48977 +  GTMLOGGER_ASSERT(writer_ != nil);
       
 48978 +  
       
 48979 +  NSString *fname = func ? [NSString stringWithUTF8String:func] : nil;
       
 48980 +  NSString *msg = [formatter_ stringForFunc:fname
       
 48981 +                                 withFormat:fmt
       
 48982 +                                     valist:args 
       
 48983 +                                      level:level];
       
 48984 +  if (msg && [filter_ filterAllowsMessage:msg level:level])
       
 48985 +    [writer_ logMessage:msg level:level];
       
 48986 +}
       
 48987 +
       
 48988 +@end  // PrivateMethods
       
 48989 +
       
 48990 +
       
 48991 +@implementation NSFileHandle (GTMFileHandleLogWriter)
       
 48992 +
       
 48993 ++ (id)fileHandleForLoggingAtPath:(NSString *)path mode:(mode_t)mode {
       
 48994 +  int fd = -1;
       
 48995 +  if (path) {
       
 48996 +    int flags = O_WRONLY | O_APPEND | O_CREAT;
       
 48997 +    fd = open([path fileSystemRepresentation], flags, mode);
       
 48998 +  }
       
 48999 +  if (fd == -1) return nil;
       
 49000 +  return [[[self alloc] initWithFileDescriptor:fd
       
 49001 +                                closeOnDealloc:YES] autorelease];
       
 49002 +}
       
 49003 +
       
 49004 +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {
       
 49005 +  @synchronized(self) {
       
 49006 +    NSString *line = [NSString stringWithFormat:@"%@\n", msg];
       
 49007 +    [self writeData:[line dataUsingEncoding:NSUTF8StringEncoding]];
       
 49008 +  }
       
 49009 +}
       
 49010 +
       
 49011 +@end  // GTMFileHandleLogWriter
       
 49012 +
       
 49013 +
       
 49014 +@implementation NSArray (GTMArrayCompositeLogWriter)
       
 49015 +
       
 49016 +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {
       
 49017 +  @synchronized(self) {
       
 49018 +    id<GTMLogWriter> child = nil;
       
 49019 +    GTM_FOREACH_OBJECT(child, self) {
       
 49020 +      if ([child conformsToProtocol:@protocol(GTMLogWriter)])
       
 49021 +        [child logMessage:msg level:level];
       
 49022 +    }
       
 49023 +  }
       
 49024 +}
       
 49025 +
       
 49026 +@end  // GTMArrayCompositeLogWriter
       
 49027 +
       
 49028 +
       
 49029 +@implementation GTMLogger (GTMLoggerLogWriter)
       
 49030 +
       
 49031 +- (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {
       
 49032 +  switch (level) {
       
 49033 +    case kGTMLoggerLevelDebug:
       
 49034 +      [self logDebug:@"%@", msg]; 
       
 49035 +      break;
       
 49036 +    case kGTMLoggerLevelInfo:
       
 49037 +      [self logInfo:@"%@", msg];
       
 49038 +      break;
       
 49039 +    case kGTMLoggerLevelError:   
       
 49040 +      [self logError:@"%@", msg];
       
 49041 +      break;
       
 49042 +    case kGTMLoggerLevelAssert:
       
 49043 +      [self logAssert:@"%@", msg];
       
 49044 +      break;
       
 49045 +    default: 
       
 49046 +      // Ignore the message.
       
 49047 +      break;
       
 49048 +  }
       
 49049 +}
       
 49050 +
       
 49051 +@end  // GTMLoggerLogWriter
       
 49052 +
       
 49053 +
       
 49054 +@implementation GTMLogBasicFormatter
       
 49055 +
       
 49056 +- (NSString *)stringForFunc:(NSString *)func
       
 49057 +                 withFormat:(NSString *)fmt
       
 49058 +                     valist:(va_list)args 
       
 49059 +                      level:(GTMLoggerLevel)level {
       
 49060 +  // Performance note: since we always have to create a new NSString from the 
       
 49061 +  // returned CFStringRef, we may want to do a quick check here to see if |fmt|
       
 49062 +  // contains a '%', and if not, simply return 'fmt'. 
       
 49063 +  CFStringRef cfmsg = NULL;  
       
 49064 +  cfmsg = CFStringCreateWithFormatAndArguments(kCFAllocatorDefault, 
       
 49065 +                                               NULL,  // format options
       
 49066 +                                               (CFStringRef)fmt, 
       
 49067 +                                               args);
       
 49068 +  return GTMCFAutorelease(cfmsg);
       
 49069 +}
       
 49070 +
       
 49071 +@end  // GTMLogBasicFormatter
       
 49072 +
       
 49073 +
       
 49074 +@implementation GTMLogStandardFormatter
       
 49075 +
       
 49076 +- (id)init {
       
 49077 +  if ((self = [super init])) {
       
 49078 +    dateFormatter_ = [[NSDateFormatter alloc] init];
       
 49079 +    [dateFormatter_ setFormatterBehavior:NSDateFormatterBehavior10_4];
       
 49080 +    [dateFormatter_ setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
       
 49081 +    pname_ = [[[NSProcessInfo processInfo] processName] copy];
       
 49082 +    pid_ = [[NSProcessInfo processInfo] processIdentifier];
       
 49083 +  }
       
 49084 +  return self;
       
 49085 +}
       
 49086 +
       
 49087 +- (void)dealloc {
       
 49088 +  [dateFormatter_ release];
       
 49089 +  [pname_ release];
       
 49090 +  [super dealloc];
       
 49091 +}
       
 49092 +
       
 49093 +- (NSString *)stringForFunc:(NSString *)func
       
 49094 +                 withFormat:(NSString *)fmt
       
 49095 +                     valist:(va_list)args 
       
 49096 +                      level:(GTMLoggerLevel)level {
       
 49097 +  GTMLOGGER_ASSERT(dateFormatter_ != nil);
       
 49098 +  NSString *tstamp = nil;
       
 49099 +  @synchronized (dateFormatter_) {
       
 49100 +    tstamp = [dateFormatter_ stringFromDate:[NSDate date]];
       
 49101 +  }
       
 49102 +  return [NSString stringWithFormat:@"%@ %@[%d/%p] [lvl=%d] %@ %@",
       
 49103 +          tstamp, pname_, pid_, pthread_self(),
       
 49104 +          level, (func ? func : @"(no func)"),
       
 49105 +          [super stringForFunc:func withFormat:fmt valist:args level:level]];
       
 49106 +}
       
 49107 +
       
 49108 +@end  // GTMLogStandardFormatter
       
 49109 +
       
 49110 +
       
 49111 +@implementation GTMLogLevelFilter
       
 49112 +
       
 49113 +// Check the environment and the user preferences for the GTMVerboseLogging key
       
 49114 +// to see if verbose logging has been enabled. The environment variable will
       
 49115 +// override the defaults setting, so check the environment first.
       
 49116 +// COV_NF_START
       
 49117 +static BOOL IsVerboseLoggingEnabled(void) {
       
 49118 +  static NSString *const kVerboseLoggingKey = @"GTMVerboseLogging";
       
 49119 +  static char *env = NULL;
       
 49120 +  if (env == NULL)
       
 49121 +    env = getenv([kVerboseLoggingKey UTF8String]);
       
 49122 +  
       
 49123 +  if (env && env[0]) {
       
 49124 +    return (strtol(env, NULL, 10) != 0);
       
 49125 +  }
       
 49126 +
       
 49127 +  return [[NSUserDefaults standardUserDefaults] boolForKey:kVerboseLoggingKey];
       
 49128 +}
       
 49129 +// COV_NF_END
       
 49130 +
       
 49131 +// In DEBUG builds, log everything. If we're not in a debug build we'll assume
       
 49132 +// that we're in a Release build.
       
 49133 +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level {
       
 49134 +#if DEBUG
       
 49135 +  return YES;
       
 49136 +#endif
       
 49137 +    
       
 49138 +  BOOL allow = YES;
       
 49139 +  
       
 49140 +  switch (level) {
       
 49141 +    case kGTMLoggerLevelDebug:
       
 49142 +      allow = NO;
       
 49143 +      break;
       
 49144 +    case kGTMLoggerLevelInfo:
       
 49145 +      allow = (IsVerboseLoggingEnabled() == YES);
       
 49146 +      break;
       
 49147 +    case kGTMLoggerLevelError:
       
 49148 +      allow = YES;
       
 49149 +      break;
       
 49150 +    case kGTMLoggerLevelAssert:
       
 49151 +      allow = YES;
       
 49152 +      break;
       
 49153 +    default:
       
 49154 +      allow = YES;
       
 49155 +      break;
       
 49156 +  }
       
 49157 +
       
 49158 +  return allow;
       
 49159 +}
       
 49160 +
       
 49161 +@end  // GTMLogLevelFilter
       
 49162 +
       
 49163 +
       
 49164 +@implementation GTMLogNoFilter
       
 49165 +
       
 49166 +- (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level {
       
 49167 +  return YES;  // Allow everything through
       
 49168 +}
       
 49169 +
       
 49170 +@end  // GTMLogNoFilter
       
 49171 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.h b/toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.h
       
 49172 new file mode 100644
       
 49173 --- /dev/null
       
 49174 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.h
       
 49175 @@ -0,0 +1,304 @@
       
 49176 +// Copyright (c) 2007, Google Inc.
       
 49177 +// All rights reserved.
       
 49178 +//
       
 49179 +// Redistribution and use in source and binary forms, with or without
       
 49180 +// modification, are permitted provided that the following conditions are
       
 49181 +// met:
       
 49182 +//
       
 49183 +//     * Redistributions of source code must retain the above copyright
       
 49184 +// notice, this list of conditions and the following disclaimer.
       
 49185 +//     * Redistributions in binary form must reproduce the above
       
 49186 +// copyright notice, this list of conditions and the following disclaimer
       
 49187 +// in the documentation and/or other materials provided with the
       
 49188 +// distribution.
       
 49189 +//     * Neither the name of Google Inc. nor the names of its
       
 49190 +// contributors may be used to endorse or promote products derived from
       
 49191 +// this software without specific prior written permission.
       
 49192 +//
       
 49193 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 49194 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 49195 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 49196 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 49197 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 49198 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 49199 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 49200 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 49201 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 49202 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 49203 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 49204 +//
       
 49205 +//  MachIPC.h
       
 49206 +//
       
 49207 +//  Some helpful wrappers for using Mach IPC calls
       
 49208 +
       
 49209 +#ifndef MACH_IPC_H__
       
 49210 +#define MACH_IPC_H__
       
 49211 +
       
 49212 +#import <mach/mach.h>
       
 49213 +#import <mach/message.h>
       
 49214 +#import <servers/bootstrap.h>
       
 49215 +#import <sys/types.h>
       
 49216 +
       
 49217 +#import <CoreServices/CoreServices.h>
       
 49218 +
       
 49219 +//==============================================================================
       
 49220 +// DISCUSSION:
       
 49221 +//
       
 49222 +// The three main classes of interest are
       
 49223 +//
       
 49224 +//  MachMessage:    a wrapper for a mach message of the following form
       
 49225 +//   mach_msg_header_t
       
 49226 +//   mach_msg_body_t
       
 49227 +//   optional descriptors
       
 49228 +//   optional extra message data
       
 49229 +//
       
 49230 +//  MachReceiveMessage and MachSendMessage subclass MachMessage
       
 49231 +//    and are used instead of MachMessage which is an abstract base class
       
 49232 +//
       
 49233 +//  ReceivePort:
       
 49234 +//    Represents a mach port for which we have receive rights
       
 49235 +//
       
 49236 +//  MachPortSender:
       
 49237 +//    Represents a mach port for which we have send rights
       
 49238 +//
       
 49239 +// Here's an example to receive a message on a server port:
       
 49240 +//
       
 49241 +//        // This creates our named server port
       
 49242 +//        ReceivePort receivePort("com.Google.MyService");
       
 49243 +//
       
 49244 +//        MachReceiveMessage message;
       
 49245 +//        kern_return_t result = receivePort.WaitForMessage(&message, 0);
       
 49246 +//
       
 49247 +//        if (result == KERN_SUCCESS && message.GetMessageID() == 57) {
       
 49248 +//          mach_port_t task = message.GetTranslatedPort(0);
       
 49249 +//          mach_port_t thread = message.GetTranslatedPort(1);
       
 49250 +//
       
 49251 +//          char *messageString = message.GetData();
       
 49252 +//
       
 49253 +//          printf("message string = %s\n", messageString);
       
 49254 +//        }
       
 49255 +//
       
 49256 +// Here is an example of using these classes to send a message to this port:
       
 49257 +//
       
 49258 +//    // send to already named port
       
 49259 +//    MachPortSender sender("com.Google.MyService");
       
 49260 +//    MachSendMessage message(57);      // our message ID is 57
       
 49261 +//
       
 49262 +//    // add some ports to be translated for us
       
 49263 +//    message.AddDescriptor(mach_task_self());     // our task
       
 49264 +//    message.AddDescriptor(mach_thread_self());   // this thread
       
 49265 +//
       
 49266 +//    char messageString[] = "Hello server!\n";
       
 49267 +//    message.SetData(messageString, strlen(messageString)+1);
       
 49268 +//
       
 49269 +//    kern_return_t result = sender.SendMessage(message, 1000); // timeout 1000ms
       
 49270 +//
       
 49271 +
       
 49272 +#define PRINT_MACH_RESULT(result_, message_) \
       
 49273 +  printf(message_" %s (%d)\n", mach_error_string(result_), result_ );
       
 49274 +
       
 49275 +//==============================================================================
       
 49276 +// A wrapper class for mach_msg_port_descriptor_t (with same memory layout)
       
 49277 +// with convenient constructors and accessors
       
 49278 +class MachMsgPortDescriptor : public mach_msg_port_descriptor_t {
       
 49279 + public:
       
 49280 +  // General-purpose constructor
       
 49281 +  MachMsgPortDescriptor(mach_port_t in_name,
       
 49282 +                        mach_msg_type_name_t in_disposition) {
       
 49283 +    name = in_name;
       
 49284 +    pad1 = 0;
       
 49285 +    pad2 = 0;
       
 49286 +    disposition = in_disposition;
       
 49287 +    type = MACH_MSG_PORT_DESCRIPTOR;
       
 49288 +  }
       
 49289 +
       
 49290 +  // For passing send rights to a port
       
 49291 +  MachMsgPortDescriptor(mach_port_t in_name) {
       
 49292 +    name = in_name;
       
 49293 +    pad1 = 0;
       
 49294 +    pad2 = 0;
       
 49295 +    disposition = MACH_MSG_TYPE_COPY_SEND;
       
 49296 +    type = MACH_MSG_PORT_DESCRIPTOR;
       
 49297 +  }
       
 49298 +
       
 49299 +  // Copy constructor
       
 49300 +  MachMsgPortDescriptor(const MachMsgPortDescriptor& desc) {
       
 49301 +    name = desc.name;
       
 49302 +    pad1 = desc.pad1;
       
 49303 +    pad2 = desc.pad2;
       
 49304 +    disposition = desc.disposition;
       
 49305 +    type = desc.type;
       
 49306 +  }
       
 49307 +
       
 49308 +  mach_port_t GetMachPort() const {
       
 49309 +    return name;
       
 49310 +  }
       
 49311 +
       
 49312 +  mach_msg_type_name_t GetDisposition() const {
       
 49313 +    return disposition;
       
 49314 +  }
       
 49315 +
       
 49316 +  // We're just a simple wrapper for mach_msg_port_descriptor_t
       
 49317 +  // and have the same memory layout
       
 49318 +  operator mach_msg_port_descriptor_t&() {
       
 49319 +    return *this;
       
 49320 +  }
       
 49321 +
       
 49322 +  // For convenience
       
 49323 +  operator mach_port_t() const {
       
 49324 +    return GetMachPort();
       
 49325 +  }
       
 49326 +};
       
 49327 +
       
 49328 +//==============================================================================
       
 49329 +// MachMessage: a wrapper for a mach message
       
 49330 +//  (mach_msg_header_t, mach_msg_body_t, extra data)
       
 49331 +//
       
 49332 +//  This considerably simplifies the construction of a message for sending
       
 49333 +//  and the getting at relevant data and descriptors for the receiver.
       
 49334 +//
       
 49335 +//  Currently the combined size of the descriptors plus data must be
       
 49336 +//  less than 1024.  But as a benefit no memory allocation is necessary.
       
 49337 +//
       
 49338 +// TODO: could consider adding malloc() support for very large messages
       
 49339 +//
       
 49340 +//  A MachMessage object is used by ReceivePort::WaitForMessage
       
 49341 +//  and MachPortSender::SendMessage
       
 49342 +//
       
 49343 +class MachMessage {
       
 49344 + public:
       
 49345 +
       
 49346 +  // The receiver of the message can retrieve the raw data this way
       
 49347 +  u_int8_t *GetData() {
       
 49348 +    return GetDataLength() > 0 ? GetDataPacket()->data : NULL;
       
 49349 +  }
       
 49350 +
       
 49351 +  u_int32_t GetDataLength() {
       
 49352 +    return EndianU32_LtoN(GetDataPacket()->data_length);
       
 49353 +  }
       
 49354 +
       
 49355 +  // The message ID may be used as a code identifying the type of message
       
 49356 +  void SetMessageID(int32_t message_id) {
       
 49357 +    GetDataPacket()->id = EndianU32_NtoL(message_id);
       
 49358 +  }
       
 49359 +
       
 49360 +  int32_t GetMessageID() { return EndianU32_LtoN(GetDataPacket()->id); }
       
 49361 +
       
 49362 +  // Adds a descriptor (typically a mach port) to be translated
       
 49363 +  // returns true if successful, otherwise not enough space
       
 49364 +  bool AddDescriptor(const MachMsgPortDescriptor &desc);
       
 49365 +
       
 49366 +  int GetDescriptorCount() const { return body.msgh_descriptor_count; }
       
 49367 +  MachMsgPortDescriptor *GetDescriptor(int n);
       
 49368 +
       
 49369 +  // Convenience method which gets the mach port described by the descriptor
       
 49370 +  mach_port_t GetTranslatedPort(int n);
       
 49371 +
       
 49372 +  // A simple message is one with no descriptors
       
 49373 +  bool IsSimpleMessage() const { return GetDescriptorCount() == 0; }
       
 49374 +
       
 49375 +  // Sets raw data for the message (returns false if not enough space)
       
 49376 +  bool SetData(void *data, int32_t data_length);
       
 49377 +
       
 49378 + protected:
       
 49379 +  // Consider this an abstract base class - must create an actual instance
       
 49380 +  // of MachReceiveMessage or MachSendMessage
       
 49381 +
       
 49382 +  MachMessage() {
       
 49383 +    memset(this, 0, sizeof(MachMessage));
       
 49384 +  }
       
 49385 +
       
 49386 +  friend class ReceivePort;
       
 49387 +  friend class MachPortSender;
       
 49388 +
       
 49389 +  // Represents raw data in our message
       
 49390 +  struct MessageDataPacket {
       
 49391 +    int32_t      id;          // little-endian
       
 49392 +    int32_t      data_length; // little-endian
       
 49393 +    u_int8_t     data[1];     // actual size limited by sizeof(MachMessage)
       
 49394 +  };
       
 49395 +
       
 49396 +  MessageDataPacket* GetDataPacket();
       
 49397 +
       
 49398 +  void SetDescriptorCount(int n);
       
 49399 +  void SetDescriptor(int n, const MachMsgPortDescriptor &desc);
       
 49400 +
       
 49401 +  // Returns total message size setting msgh_size in the header to this value
       
 49402 +  int CalculateSize();
       
 49403 +
       
 49404 +  mach_msg_header_t  head;
       
 49405 +  mach_msg_body_t    body;
       
 49406 +  u_int8_t           padding[1024]; // descriptors and data may be embedded here
       
 49407 +};
       
 49408 +
       
 49409 +//==============================================================================
       
 49410 +// MachReceiveMessage and MachSendMessage are useful to separate the idea
       
 49411 +// of a mach message being sent and being received, and adds increased type
       
 49412 +// safety:
       
 49413 +//  ReceivePort::WaitForMessage() only accepts a MachReceiveMessage
       
 49414 +//  MachPortSender::SendMessage() only accepts a MachSendMessage
       
 49415 +
       
 49416 +//==============================================================================
       
 49417 +class MachReceiveMessage : public MachMessage {
       
 49418 + public:
       
 49419 +  MachReceiveMessage() : MachMessage() {};
       
 49420 +};
       
 49421 +
       
 49422 +//==============================================================================
       
 49423 +class MachSendMessage : public MachMessage {
       
 49424 + public:
       
 49425 +  MachSendMessage(int32_t message_id);
       
 49426 +};
       
 49427 +
       
 49428 +//==============================================================================
       
 49429 +// Represents a mach port for which we have receive rights
       
 49430 +class ReceivePort {
       
 49431 + public:
       
 49432 +  // Creates a new mach port for receiving messages and registers a name for it
       
 49433 +  ReceivePort(const char *receive_port_name);
       
 49434 +
       
 49435 +  // Given an already existing mach port, use it.  We take ownership of the
       
 49436 +  // port and deallocate it in our destructor.
       
 49437 +  ReceivePort(mach_port_t receive_port);
       
 49438 +
       
 49439 +  // Create a new mach port for receiving messages
       
 49440 +  ReceivePort();
       
 49441 +
       
 49442 +  ~ReceivePort();
       
 49443 +
       
 49444 +  // Waits on the mach port until message received or timeout
       
 49445 +  kern_return_t WaitForMessage(MachReceiveMessage *out_message,
       
 49446 +                               mach_msg_timeout_t timeout);
       
 49447 +
       
 49448 +  // The underlying mach port that we wrap
       
 49449 +  mach_port_t  GetPort() const { return port_; }
       
 49450 +
       
 49451 + private:
       
 49452 +  ReceivePort(const ReceivePort&);  // disable copy c-tor
       
 49453 +
       
 49454 +  mach_port_t   port_;
       
 49455 +  kern_return_t init_result_;
       
 49456 +};
       
 49457 +
       
 49458 +//==============================================================================
       
 49459 +// Represents a mach port for which we have send rights
       
 49460 +class MachPortSender {
       
 49461 + public:
       
 49462 +  // get a port with send rights corresponding to a named registered service
       
 49463 +  MachPortSender(const char *receive_port_name);
       
 49464 +
       
 49465 +
       
 49466 +  // Given an already existing mach port, use it.
       
 49467 +  MachPortSender(mach_port_t send_port);
       
 49468 +
       
 49469 +  kern_return_t SendMessage(MachSendMessage &message,
       
 49470 +                            mach_msg_timeout_t timeout);
       
 49471 +
       
 49472 + private:
       
 49473 +  MachPortSender(const MachPortSender&);  // disable copy c-tor
       
 49474 +
       
 49475 +  mach_port_t   send_port_;
       
 49476 +  kern_return_t init_result_;
       
 49477 +};
       
 49478 +
       
 49479 +#endif // MACH_IPC_H__
       
 49480 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.mm b/toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.mm
       
 49481 new file mode 100644
       
 49482 --- /dev/null
       
 49483 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/MachIPC.mm
       
 49484 @@ -0,0 +1,297 @@
       
 49485 +// Copyright (c) 2007, Google Inc.
       
 49486 +// All rights reserved.
       
 49487 +//
       
 49488 +// Redistribution and use in source and binary forms, with or without
       
 49489 +// modification, are permitted provided that the following conditions are
       
 49490 +// met:
       
 49491 +//
       
 49492 +//     * Redistributions of source code must retain the above copyright
       
 49493 +// notice, this list of conditions and the following disclaimer.
       
 49494 +//     * Redistributions in binary form must reproduce the above
       
 49495 +// copyright notice, this list of conditions and the following disclaimer
       
 49496 +// in the documentation and/or other materials provided with the
       
 49497 +// distribution.
       
 49498 +//     * Neither the name of Google Inc. nor the names of its
       
 49499 +// contributors may be used to endorse or promote products derived from
       
 49500 +// this software without specific prior written permission.
       
 49501 +//
       
 49502 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 49503 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 49504 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 49505 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 49506 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 49507 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 49508 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 49509 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 49510 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 49511 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 49512 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 49513 +//
       
 49514 +//  MachIPC.mm
       
 49515 +//  Wrapper for mach IPC calls
       
 49516 +
       
 49517 +#import <stdio.h>
       
 49518 +#import "MachIPC.h"
       
 49519 +
       
 49520 +//==============================================================================
       
 49521 +MachSendMessage::MachSendMessage(int32_t message_id) : MachMessage() {
       
 49522 +  head.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0);
       
 49523 +
       
 49524 +  // head.msgh_remote_port = ...; // filled out in MachPortSender::SendMessage()
       
 49525 +  head.msgh_local_port = MACH_PORT_NULL;
       
 49526 +  head.msgh_reserved = 0;
       
 49527 +  head.msgh_id = 0;
       
 49528 +
       
 49529 +  SetDescriptorCount(0);  // start out with no descriptors
       
 49530 +
       
 49531 +  SetMessageID(message_id);
       
 49532 +  SetData(NULL, 0);       // client may add data later
       
 49533 +}
       
 49534 +
       
 49535 +//==============================================================================
       
 49536 +// returns true if successful
       
 49537 +bool MachMessage::SetData(void *data,
       
 49538 +                          int32_t data_length) {
       
 49539 +  // first check to make sure we have enough space
       
 49540 +  int size = CalculateSize();
       
 49541 +  int new_size = size + data_length;
       
 49542 +  
       
 49543 +  if ((unsigned)new_size > sizeof(MachMessage)) {
       
 49544 +    return false;  // not enough space
       
 49545 +  }
       
 49546 +
       
 49547 +  GetDataPacket()->data_length = EndianU32_NtoL(data_length);
       
 49548 +  if (data) memcpy(GetDataPacket()->data, data, data_length);
       
 49549 +
       
 49550 +  CalculateSize();
       
 49551 +
       
 49552 +  return true;
       
 49553 +}
       
 49554 +
       
 49555 +//==============================================================================
       
 49556 +// calculates and returns the total size of the message
       
 49557 +// Currently, the entire message MUST fit inside of the MachMessage
       
 49558 +//    messsage size <= sizeof(MachMessage)
       
 49559 +int MachMessage::CalculateSize() {
       
 49560 +  int size = sizeof(mach_msg_header_t) + sizeof(mach_msg_body_t);
       
 49561 +  
       
 49562 +  // add space for MessageDataPacket
       
 49563 +  int32_t alignedDataLength = (GetDataLength() + 3) & ~0x3;
       
 49564 +  size += 2*sizeof(int32_t) + alignedDataLength;
       
 49565 +  
       
 49566 +  // add space for descriptors
       
 49567 +  size += GetDescriptorCount() * sizeof(MachMsgPortDescriptor);
       
 49568 +  
       
 49569 +  head.msgh_size = size;
       
 49570 +  
       
 49571 +  return size;
       
 49572 +}
       
 49573 +
       
 49574 +//==============================================================================
       
 49575 +MachMessage::MessageDataPacket *MachMessage::GetDataPacket() {
       
 49576 +  int desc_size = sizeof(MachMsgPortDescriptor)*GetDescriptorCount();
       
 49577 +  MessageDataPacket *packet =
       
 49578 +    reinterpret_cast<MessageDataPacket*>(padding + desc_size);
       
 49579 +
       
 49580 +  return packet;
       
 49581 +}
       
 49582 +
       
 49583 +//==============================================================================
       
 49584 +void MachMessage::SetDescriptor(int n,
       
 49585 +                                const MachMsgPortDescriptor &desc) {
       
 49586 +  MachMsgPortDescriptor *desc_array =
       
 49587 +    reinterpret_cast<MachMsgPortDescriptor*>(padding);
       
 49588 +  desc_array[n] = desc;
       
 49589 +}
       
 49590 +
       
 49591 +//==============================================================================
       
 49592 +// returns true if successful otherwise there was not enough space
       
 49593 +bool MachMessage::AddDescriptor(const MachMsgPortDescriptor &desc) {
       
 49594 +  // first check to make sure we have enough space
       
 49595 +  int size = CalculateSize();
       
 49596 +  int new_size = size + sizeof(MachMsgPortDescriptor);
       
 49597 +  
       
 49598 +  if ((unsigned)new_size > sizeof(MachMessage)) {
       
 49599 +    return false;  // not enough space
       
 49600 +  }
       
 49601 +
       
 49602 +  // unfortunately, we need to move the data to allow space for the
       
 49603 +  // new descriptor
       
 49604 +  u_int8_t *p = reinterpret_cast<u_int8_t*>(GetDataPacket());
       
 49605 +  bcopy(p, p+sizeof(MachMsgPortDescriptor), GetDataLength()+2*sizeof(int32_t));
       
 49606 +  
       
 49607 +  SetDescriptor(GetDescriptorCount(), desc);
       
 49608 +  SetDescriptorCount(GetDescriptorCount() + 1);
       
 49609 +
       
 49610 +  CalculateSize();
       
 49611 +  
       
 49612 +  return true;
       
 49613 +}
       
 49614 +
       
 49615 +//==============================================================================
       
 49616 +void MachMessage::SetDescriptorCount(int n) {
       
 49617 +  body.msgh_descriptor_count = n;
       
 49618 +
       
 49619 +  if (n > 0) {
       
 49620 +    head.msgh_bits |= MACH_MSGH_BITS_COMPLEX;
       
 49621 +  } else {
       
 49622 +    head.msgh_bits &= ~MACH_MSGH_BITS_COMPLEX;
       
 49623 +  }
       
 49624 +}
       
 49625 +
       
 49626 +//==============================================================================
       
 49627 +MachMsgPortDescriptor *MachMessage::GetDescriptor(int n) {
       
 49628 +  if (n < GetDescriptorCount()) {
       
 49629 +    MachMsgPortDescriptor *desc =
       
 49630 +      reinterpret_cast<MachMsgPortDescriptor*>(padding);
       
 49631 +    return desc + n;
       
 49632 +  }
       
 49633 +  
       
 49634 +  return nil;
       
 49635 +}
       
 49636 +
       
 49637 +//==============================================================================
       
 49638 +mach_port_t MachMessage::GetTranslatedPort(int n) {
       
 49639 +  if (n < GetDescriptorCount()) {
       
 49640 +    return GetDescriptor(n)->GetMachPort();
       
 49641 +  }
       
 49642 +  return MACH_PORT_NULL;
       
 49643 +}
       
 49644 +
       
 49645 +#pragma mark -
       
 49646 +
       
 49647 +//==============================================================================
       
 49648 +// create a new mach port for receiving messages and register a name for it
       
 49649 +ReceivePort::ReceivePort(const char *receive_port_name) {
       
 49650 +  mach_port_t current_task = mach_task_self();
       
 49651 +
       
 49652 +  init_result_ = mach_port_allocate(current_task,
       
 49653 +                                    MACH_PORT_RIGHT_RECEIVE,
       
 49654 +                                    &port_);
       
 49655 +
       
 49656 +  if (init_result_ != KERN_SUCCESS)
       
 49657 +    return;
       
 49658 +    
       
 49659 +  init_result_ = mach_port_insert_right(current_task,
       
 49660 +                                        port_,
       
 49661 +                                        port_,
       
 49662 +                                        MACH_MSG_TYPE_MAKE_SEND);
       
 49663 +
       
 49664 +  if (init_result_ != KERN_SUCCESS)
       
 49665 +    return;
       
 49666 +
       
 49667 +  mach_port_t bootstrap_port = 0;
       
 49668 +  init_result_ = task_get_bootstrap_port(current_task, &bootstrap_port);
       
 49669 +
       
 49670 +  if (init_result_ != KERN_SUCCESS)
       
 49671 +    return;
       
 49672 +
       
 49673 +  init_result_ = bootstrap_register(bootstrap_port,
       
 49674 +                                    const_cast<char*>(receive_port_name),
       
 49675 +                                    port_);
       
 49676 +}
       
 49677 +
       
 49678 +//==============================================================================
       
 49679 +// create a new mach port for receiving messages
       
 49680 +ReceivePort::ReceivePort() {
       
 49681 +  mach_port_t current_task = mach_task_self();
       
 49682 +
       
 49683 +  init_result_ = mach_port_allocate(current_task,
       
 49684 +                                    MACH_PORT_RIGHT_RECEIVE,
       
 49685 +                                    &port_);
       
 49686 +
       
 49687 +  if (init_result_ != KERN_SUCCESS)
       
 49688 +    return;
       
 49689 +
       
 49690 +  init_result_ =   mach_port_insert_right(current_task,
       
 49691 +                                          port_,
       
 49692 +                                          port_,
       
 49693 +                                          MACH_MSG_TYPE_MAKE_SEND);
       
 49694 +}
       
 49695 +
       
 49696 +//==============================================================================
       
 49697 +// Given an already existing mach port, use it.  We take ownership of the
       
 49698 +// port and deallocate it in our destructor.
       
 49699 +ReceivePort::ReceivePort(mach_port_t receive_port)
       
 49700 +  : port_(receive_port),
       
 49701 +    init_result_(KERN_SUCCESS) {
       
 49702 +}
       
 49703 +
       
 49704 +//==============================================================================
       
 49705 +ReceivePort::~ReceivePort() {
       
 49706 +  if (init_result_ == KERN_SUCCESS)
       
 49707 +    mach_port_deallocate(mach_task_self(), port_);
       
 49708 +}
       
 49709 +
       
 49710 +//==============================================================================
       
 49711 +kern_return_t ReceivePort::WaitForMessage(MachReceiveMessage *out_message,
       
 49712 +                                          mach_msg_timeout_t timeout) {
       
 49713 +  if (!out_message) {
       
 49714 +    return KERN_INVALID_ARGUMENT;
       
 49715 +  }
       
 49716 +
       
 49717 +  // return any error condition encountered in constructor
       
 49718 +  if (init_result_ != KERN_SUCCESS)
       
 49719 +    return init_result_;
       
 49720 +  
       
 49721 +  out_message->head.msgh_bits = 0;
       
 49722 +  out_message->head.msgh_local_port = port_;
       
 49723 +  out_message->head.msgh_remote_port = MACH_PORT_NULL;
       
 49724 +  out_message->head.msgh_reserved = 0;
       
 49725 +  out_message->head.msgh_id = 0;
       
 49726 +
       
 49727 +  kern_return_t result = mach_msg(&out_message->head,
       
 49728 +                                  MACH_RCV_MSG | MACH_RCV_TIMEOUT,
       
 49729 +                                  0,
       
 49730 +                                  sizeof(MachMessage),
       
 49731 +                                  port_,
       
 49732 +                                  timeout,              // timeout in ms
       
 49733 +                                  MACH_PORT_NULL);
       
 49734 +
       
 49735 +  return result;
       
 49736 +}
       
 49737 +
       
 49738 +#pragma mark -
       
 49739 +
       
 49740 +//==============================================================================
       
 49741 +// get a port with send rights corresponding to a named registered service
       
 49742 +MachPortSender::MachPortSender(const char *receive_port_name) {
       
 49743 +  mach_port_t bootstrap_port = 0;
       
 49744 +  init_result_ = task_get_bootstrap_port(mach_task_self(), &bootstrap_port);
       
 49745 +  
       
 49746 +  if (init_result_ != KERN_SUCCESS)
       
 49747 +    return;
       
 49748 +
       
 49749 +  init_result_ = bootstrap_look_up(bootstrap_port,
       
 49750 +                    const_cast<char*>(receive_port_name),
       
 49751 +                    &send_port_);
       
 49752 +}
       
 49753 +
       
 49754 +//==============================================================================
       
 49755 +MachPortSender::MachPortSender(mach_port_t send_port) 
       
 49756 +  : send_port_(send_port),
       
 49757 +    init_result_(KERN_SUCCESS) {
       
 49758 +}
       
 49759 +
       
 49760 +//==============================================================================
       
 49761 +kern_return_t MachPortSender::SendMessage(MachSendMessage &message,
       
 49762 +                                          mach_msg_timeout_t timeout) {
       
 49763 +  if (message.head.msgh_size == 0) {
       
 49764 +    return KERN_INVALID_VALUE;    // just for safety -- never should occur
       
 49765 +  };
       
 49766 +  
       
 49767 +  if (init_result_ != KERN_SUCCESS)
       
 49768 +    return init_result_;
       
 49769 +  
       
 49770 +  message.head.msgh_remote_port = send_port_;
       
 49771 +
       
 49772 +  kern_return_t result = mach_msg(&message.head,
       
 49773 +                                  MACH_SEND_MSG | MACH_SEND_TIMEOUT,
       
 49774 +                                  message.head.msgh_size,
       
 49775 +                                  0,
       
 49776 +                                  MACH_PORT_NULL,
       
 49777 +                                  timeout,              // timeout in ms
       
 49778 +                                  MACH_PORT_NULL);
       
 49779 +
       
 49780 +  return result;
       
 49781 +}
       
 49782 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/Makefile.in b/toolkit/crashreporter/google-breakpad/src/common/mac/Makefile.in
       
 49783 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/Makefile.in
       
 49784 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/Makefile.in
       
 49785 @@ -42,18 +42,16 @@ VPATH		= @srcdir@
       
 49786  include $(DEPTH)/config/autoconf.mk
       
 49787  
       
 49788  MODULE		= breakpad_mac_common
       
 49789  LIBRARY_NAME	= breakpad_mac_common_s
       
 49790  HOST_LIBRARY_NAME = host_breakpad_mac_common_s
       
 49791  
       
 49792  LOCAL_INCLUDES 	= -I$(srcdir)/../..
       
 49793  
       
 49794 -DIRS = dwarf
       
 49795 -
       
 49796  # This is a little weird, but we're building a host and a target lib here.
       
 49797  # The host lib is used for dump_syms, and the target lib for the
       
 49798  # crash reporter client.  Therefore, we don't need all the srcs in both.
       
 49799  CPPSRCS	= \
       
 49800    file_id.cc \
       
 49801    macho_id.cc \
       
 49802    macho_walker.cc \
       
 49803    string_utilities.cc \
       
 49804 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/SimpleStringDictionary.h b/toolkit/crashreporter/google-breakpad/src/common/mac/SimpleStringDictionary.h
       
 49805 new file mode 100644
       
 49806 --- /dev/null
       
 49807 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/SimpleStringDictionary.h
       
 49808 @@ -0,0 +1,195 @@
       
 49809 +// Copyright (c) 2007, Google Inc.
       
 49810 +// All rights reserved.
       
 49811 +//
       
 49812 +// Redistribution and use in source and binary forms, with or without
       
 49813 +// modification, are permitted provided that the following conditions are
       
 49814 +// met:
       
 49815 +//
       
 49816 +//     * Redistributions of source code must retain the above copyright
       
 49817 +// notice, this list of conditions and the following disclaimer.
       
 49818 +//     * Redistributions in binary form must reproduce the above
       
 49819 +// copyright notice, this list of conditions and the following disclaimer
       
 49820 +// in the documentation and/or other materials provided with the
       
 49821 +// distribution.
       
 49822 +//     * Neither the name of Google Inc. nor the names of its
       
 49823 +// contributors may be used to endorse or promote products derived from
       
 49824 +// this software without specific prior written permission.
       
 49825 +//
       
 49826 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 49827 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 49828 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 49829 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 49830 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 49831 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 49832 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 49833 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 49834 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 49835 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 49836 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 49837 +//
       
 49838 +//  SimpleStringDictionary.h
       
 49839 +//
       
 49840 +
       
 49841 +#ifndef SimpleStringDictionary_H__
       
 49842 +#define SimpleStringDictionary_H__
       
 49843 +
       
 49844 +#import <string>
       
 49845 +#import <vector>
       
 49846 +
       
 49847 +namespace google_breakpad {
       
 49848 +
       
 49849 +//==============================================================================
       
 49850 +// SimpleStringDictionary (and associated class KeyValueEntry) implement a very
       
 49851 +// basic dictionary container class.  It has the property of not making any
       
 49852 +// memory allocations when getting and setting values.  But it is not very
       
 49853 +// efficient, with calls to get and set values operating in linear time.
       
 49854 +// It has the additional limitation of having a fairly small fixed capacity of
       
 49855 +// SimpleStringDictionary::MAX_NUM_ENTRIES entries.  An assert() will fire if
       
 49856 +// the client attempts to set more than this number of key/value pairs.
       
 49857 +// Ordinarilly a C++ programmer would use something like the std::map template
       
 49858 +// class, or on the Macintosh would often choose CFDictionary or NSDictionary.
       
 49859 +// But these dictionary classes may call malloc() during get and set operations.
       
 49860 +// Google Breakpad requires that no memory allocations be made in code running
       
 49861 +// in its exception handling thread, so it uses SimpleStringDictionary as the
       
 49862 +// underlying implementation for the GoogleBreakpad.framework APIs:
       
 49863 +// GoogleBreakpadSetKeyValue(),  GoogleBreakpadKeyValue(), and
       
 49864 +// GoogleBreakpadRemoveKeyValue()
       
 49865 +//
       
 49866 +
       
 49867 +//==============================================================================
       
 49868 +// KeyValueEntry
       
 49869 +//
       
 49870 +// A helper class used by SimpleStringDictionary representing a single
       
 49871 +// storage cell for a key/value pair.  Each key and value string are
       
 49872 +// limited to MAX_STRING_STORAGE_SIZE-1 bytes (not glyphs).  This class
       
 49873 +// performs no memory allocations.  It has methods for setting  and getting
       
 49874 +// key and value strings.
       
 49875 +//
       
 49876 +class KeyValueEntry {
       
 49877 + public:
       
 49878 +  KeyValueEntry() {
       
 49879 +    Clear();
       
 49880 +  }
       
 49881 +  
       
 49882 +  KeyValueEntry(const char *key, const char *value) {
       
 49883 +    SetKeyValue(key, value);
       
 49884 +  }
       
 49885 +
       
 49886 +  void        SetKeyValue(const char *key, const char *value) {
       
 49887 +    if (!key) {
       
 49888 +      key = "";
       
 49889 +    }
       
 49890 +    if (!value) {
       
 49891 +      value = "";
       
 49892 +    }
       
 49893 +    
       
 49894 +    strlcpy(key_, key, sizeof(key_));
       
 49895 +    strlcpy(value_, value, sizeof(value_));
       
 49896 +  }  
       
 49897 +
       
 49898 +  void        SetValue(const char *value) {
       
 49899 +    if (!value) {
       
 49900 +      value = "";
       
 49901 +    }
       
 49902 +    strlcpy(value_, value, sizeof(value_));
       
 49903 +  };
       
 49904 +  
       
 49905 +  // Removes the key/value
       
 49906 +  void        Clear() {
       
 49907 +    memset(key_, 0, sizeof(key_));
       
 49908 +    memset(value_, 0, sizeof(value_));
       
 49909 +  }
       
 49910 +
       
 49911 +  bool        IsActive() const { return key_[0] != '\0'; }
       
 49912 +  const char *GetKey() const { return key_; }
       
 49913 +  const char *GetValue() const { return value_; }
       
 49914 +
       
 49915 +  // Don't change this without considering the fixed size
       
 49916 +  // of MachMessage (in MachIPC.h)
       
 49917 +  // (see also struct KeyValueMessageData in Inspector.h)
       
 49918 +  enum {MAX_STRING_STORAGE_SIZE = 256};
       
 49919 +  
       
 49920 + private:
       
 49921 +  char key_[MAX_STRING_STORAGE_SIZE];
       
 49922 +  char value_[MAX_STRING_STORAGE_SIZE];
       
 49923 +};
       
 49924 +
       
 49925 +//==============================================================================
       
 49926 +// This class is not an efficient dictionary, but for the purposes of breakpad
       
 49927 +// will be just fine.  We're just dealing with ten or so distinct
       
 49928 +// key/value pairs.  The idea is to avoid any malloc() or free() calls
       
 49929 +// in certain important methods to be called when a process is in a
       
 49930 +// crashed state.  Each key and value string are limited to
       
 49931 +// KeyValueEntry::MAX_STRING_STORAGE_SIZE-1 bytes (not glyphs).  Strings passed
       
 49932 +// in exceeding this length will be truncated.
       
 49933 +//
       
 49934 +class SimpleStringDictionary {
       
 49935 + public:
       
 49936 +  SimpleStringDictionary() {};  // entries will all be cleared
       
 49937 +  
       
 49938 +  // Returns the number of active key/value pairs.  The upper limit for this
       
 49939 +  // is MAX_NUM_ENTRIES.
       
 49940 +  int GetCount() const;
       
 49941 +
       
 49942 +  // Given |key|, returns its corresponding |value|.
       
 49943 +  // If |key| is NULL, an assert will fire or NULL will be returned.  If |key|
       
 49944 +  // is not found or is an empty string, NULL is returned.
       
 49945 +  const char *GetValueForKey(const char *key);
       
 49946 +    
       
 49947 +  // Stores a string |value| represented by |key|.  If |key| is NULL or an empty
       
 49948 +  // string, this will assert (or do nothing).  If |value| is NULL then
       
 49949 +  // the |key| will be removed.  An empty string is OK for |value|.
       
 49950 +  void SetKeyValue(const char *key, const char *value);
       
 49951 +  
       
 49952 +  // Given |key|, removes any associated value.  It will assert (or do nothing)
       
 49953 +  // if NULL is passed in.  It will do nothing if |key| is not found.
       
 49954 +  void RemoveKey(const char *key);
       
 49955 +
       
 49956 +  // This is the maximum number of key/value pairs which may be set in the
       
 49957 +  // dictionary.  An assert may fire if more values than this are set.
       
 49958 +  // Don't change this without also changing comment in GoogleBreakpad.h
       
 49959 +  enum {MAX_NUM_ENTRIES = 64};
       
 49960 +
       
 49961 + private:
       
 49962 +  friend class SimpleStringDictionaryIterator;
       
 49963 +
       
 49964 +  const KeyValueEntry *GetEntry(int i) const;
       
 49965 +
       
 49966 +  KeyValueEntry             entries_[MAX_NUM_ENTRIES];
       
 49967 +};
       
 49968 +
       
 49969 +//==============================================================================
       
 49970 +class SimpleStringDictionaryIterator {
       
 49971 + public:
       
 49972 +  SimpleStringDictionaryIterator(const SimpleStringDictionary &dict)
       
 49973 +    : dict_(dict), i_(0) {
       
 49974 +    }
       
 49975 +
       
 49976 +  // Initializes iterator to the beginning (may later call Next() )
       
 49977 +  void Start() {
       
 49978 +    i_ = 0;
       
 49979 +  }
       
 49980 +  
       
 49981 +  // like the nextObject method of NSEnumerator (in Cocoa)
       
 49982 +  // returns NULL when there are no more entries
       
 49983 +  //
       
 49984 +  const KeyValueEntry* Next() {
       
 49985 +    for (; i_ < SimpleStringDictionary::MAX_NUM_ENTRIES; ++i_) {
       
 49986 +      const KeyValueEntry *entry = dict_.GetEntry(i_);
       
 49987 +      if (entry->IsActive()) {
       
 49988 +        i_++;   // move to next entry for next time
       
 49989 +        return entry;
       
 49990 +      }
       
 49991 +    }
       
 49992 +
       
 49993 +    return NULL;  // reached end of array
       
 49994 +  }
       
 49995 +  
       
 49996 + private:
       
 49997 +  const SimpleStringDictionary&   dict_;
       
 49998 +  int                             i_;
       
 49999 +};
       
 50000 +
       
 50001 +}  // namespace google_breakpad
       
 50002 +
       
 50003 +#endif  // SimpleStringDictionary_H__
       
 50004 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/SimpleStringDictionary.mm b/toolkit/crashreporter/google-breakpad/src/common/mac/SimpleStringDictionary.mm
       
 50005 new file mode 100644
       
 50006 --- /dev/null
       
 50007 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/SimpleStringDictionary.mm
       
 50008 @@ -0,0 +1,133 @@
       
 50009 +// Copyright (c) 2007, Google Inc.
       
 50010 +// All rights reserved.
       
 50011 +//
       
 50012 +// Redistribution and use in source and binary forms, with or without
       
 50013 +// modification, are permitted provided that the following conditions are
       
 50014 +// met:
       
 50015 +//
       
 50016 +//     * Redistributions of source code must retain the above copyright
       
 50017 +// notice, this list of conditions and the following disclaimer.
       
 50018 +//     * Redistributions in binary form must reproduce the above
       
 50019 +// copyright notice, this list of conditions and the following disclaimer
       
 50020 +// in the documentation and/or other materials provided with the
       
 50021 +// distribution.
       
 50022 +//     * Neither the name of Google Inc. nor the names of its
       
 50023 +// contributors may be used to endorse or promote products derived from
       
 50024 +// this software without specific prior written permission.
       
 50025 +//
       
 50026 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 50027 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 50028 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 50029 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 50030 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 50031 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 50032 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 50033 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 50034 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 50035 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 50036 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 50037 +//
       
 50038 +//  SimpleStringDictionary.mm
       
 50039 +//  Simple string dictionary that does not allocate memory
       
 50040 +//
       
 50041 +
       
 50042 +#include <assert.h>
       
 50043 +
       
 50044 +#import "SimpleStringDictionary.h"
       
 50045 +
       
 50046 +namespace google_breakpad {
       
 50047 +
       
 50048 +//==============================================================================
       
 50049 +const KeyValueEntry *SimpleStringDictionary::GetEntry(int i) const {
       
 50050 +  return (i >= 0 && i < MAX_NUM_ENTRIES) ? &entries_[i] : NULL;
       
 50051 +}
       
 50052 +
       
 50053 +//==============================================================================
       
 50054 +int SimpleStringDictionary::GetCount() const {
       
 50055 +  int count = 0;
       
 50056 +  for (int i = 0; i < MAX_NUM_ENTRIES; ++i) {
       
 50057 +    if (entries_[i].IsActive() ) {
       
 50058 +      ++count;
       
 50059 +    }
       
 50060 +  }
       
 50061 +  
       
 50062 +  return count;
       
 50063 +}
       
 50064 +
       
 50065 +//==============================================================================
       
 50066 +const char *SimpleStringDictionary::GetValueForKey(const char *key) {
       
 50067 +  assert(key);
       
 50068 +  if (!key)
       
 50069 +    return NULL;
       
 50070 +
       
 50071 +  for (int i = 0; i < MAX_NUM_ENTRIES; ++i) {
       
 50072 +    KeyValueEntry &entry = entries_[i];
       
 50073 +    if (entry.IsActive() && !strcmp(entry.GetKey(), key)) {
       
 50074 +      return entry.GetValue();
       
 50075 +    }
       
 50076 +  }
       
 50077 +
       
 50078 +  return NULL;
       
 50079 +}
       
 50080 +
       
 50081 +//==============================================================================
       
 50082 +void SimpleStringDictionary::SetKeyValue(const char *key,
       
 50083 +                                         const char *value) {
       
 50084 +  if (!value) {
       
 50085 +    RemoveKey(key);
       
 50086 +    return;
       
 50087 +  }
       
 50088 +
       
 50089 +  // key must not be NULL
       
 50090 +  assert(key);
       
 50091 +  if (!key)
       
 50092 +    return;
       
 50093 +  
       
 50094 +  // key must not be empty string
       
 50095 +  assert(key[0] != '\0');
       
 50096 +  if (key[0] == '\0')
       
 50097 +    return;
       
 50098 +  
       
 50099 +  int free_index = -1;
       
 50100 +  
       
 50101 +  // check if key already exists
       
 50102 +  for (int i = 0; i < MAX_NUM_ENTRIES; ++i) {
       
 50103 +    KeyValueEntry &entry = entries_[i];
       
 50104 +    
       
 50105 +    if (entry.IsActive()) {
       
 50106 +      if (!strcmp(entry.GetKey(), key)) {
       
 50107 +        entry.SetValue(value);
       
 50108 +        return;
       
 50109 +      }
       
 50110 +    } else {
       
 50111 +      // Make a note of an empty slot
       
 50112 +      if (free_index == -1) {
       
 50113 +        free_index = i;
       
 50114 +      }
       
 50115 +    }
       
 50116 +  }
       
 50117 +  
       
 50118 +  // check if we've run out of space
       
 50119 +  assert(free_index != -1);
       
 50120 +  
       
 50121 +  // Put new key into an empty slot (if found)
       
 50122 +  if (free_index != -1) {
       
 50123 +    entries_[free_index].SetKeyValue(key, value);
       
 50124 +  }
       
 50125 +}
       
 50126 +
       
 50127 +//==============================================================================
       
 50128 +void SimpleStringDictionary::RemoveKey(const char *key) {
       
 50129 +  assert(key);
       
 50130 +  if (!key)
       
 50131 +    return;
       
 50132 +
       
 50133 +  for (int i = 0; i < MAX_NUM_ENTRIES; ++i) {
       
 50134 +    if (!strcmp(entries_[i].GetKey(), key)) {
       
 50135 +      entries_[i].Clear();
       
 50136 +      return;
       
 50137 +    }
       
 50138 +  }
       
 50139 +}
       
 50140 +
       
 50141 +}  // namespace google_breakpad
       
 50142 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.h b/toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.h
       
 50143 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.h
       
 50144 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.h
       
 50145 @@ -28,21 +28,21 @@
       
 50146  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 50147  
       
 50148  // dump_syms.h: Interface for DumpSymbols.  This class will take a mach-o file
       
 50149  // and extract the symbol information and write it to a file using the
       
 50150  // breakpad symbol file format.  
       
 50151  
       
 50152  #import <Foundation/Foundation.h>
       
 50153  #include <mach-o/loader.h>
       
 50154 -#include "common/mac/dwarf/dwarf2reader.h"
       
 50155 +#include "common/dwarf/dwarf2reader.h"
       
 50156  
       
 50157  // This will map from an architecture string to a SectionMap, which
       
 50158  // will contain the offsets for all the sections in the dictionary
       
 50159 -typedef hash_map<string, dwarf2reader::SectionMap *> ArchSectionMap;
       
 50160 +typedef map<string, dwarf2reader::SectionMap *> ArchSectionMap;
       
 50161  
       
 50162  @interface DumpSymbols : NSObject {
       
 50163   @protected
       
 50164    NSString *sourcePath_;              // Source of symbols (STRONG)
       
 50165    NSString *architecture_;            // Architecture to extract (STRONG)
       
 50166    NSMutableDictionary *addresses_;    // Addresses and symbols (STRONG)
       
 50167    NSMutableSet *functionAddresses_;   // Function addresses (STRONG)
       
 50168    NSMutableDictionary *sources_;      // Address and Source file paths (STRONG)
       
 50169 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.mm b/toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.mm
       
 50170 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.mm
       
 50171 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.mm
       
 50172 @@ -42,19 +42,19 @@
       
 50173  #include <mach-o/stab.h>
       
 50174  #include <fcntl.h>
       
 50175  
       
 50176  #import <Foundation/Foundation.h>
       
 50177  
       
 50178  #import "dump_syms.h"
       
 50179  #import "common/mac/file_id.h"
       
 50180  #import "common/mac/macho_utilities.h"
       
 50181 -#import "common/mac/dwarf/dwarf2reader.h"
       
 50182 -#import "common/mac/dwarf/functioninfo.h"
       
 50183 -#import "common/mac/dwarf/bytereader.h"
       
 50184 +#import "common/dwarf/dwarf2reader.h"
       
 50185 +#import "common/dwarf/functioninfo.h"
       
 50186 +#import "common/dwarf/bytereader.h"
       
 50187  
       
 50188  using google_breakpad::FileID;
       
 50189  
       
 50190  static NSString *kAddressSymbolKey = @"symbol";
       
 50191  static NSString *kAddressConvertedSymbolKey = @"converted_symbol";
       
 50192  static NSString *kAddressSourceLineKey = @"line";
       
 50193  static NSString *kFunctionSizeKey = @"size";
       
 50194  static NSString *kFunctionFileKey = @"source_file";
       
 50195 @@ -63,25 +63,16 @@ static NSString *kHeaderSizeKey = @"size
       
 50196  static NSString *kHeaderOffsetKey = @"offset";  // Offset to the header
       
 50197  static NSString *kHeaderIs64BitKey = @"is64";
       
 50198  static NSString *kHeaderCPUTypeKey = @"cpuType";
       
 50199  
       
 50200  // The section for __TEXT, __text seems to be always 1.  This is useful
       
 50201  // for pruning out extraneous non-function symbols.
       
 50202  static const int kTextSection = 1;
       
 50203  
       
 50204 -namespace __gnu_cxx {
       
 50205 -template<> 
       
 50206 -  struct hash<std::string> {
       
 50207 -    size_t operator()(const std::string& k) const {
       
 50208 -      return hash< const char* >()( k.c_str() );
       
 50209 -  }
       
 50210 -};
       
 50211 -}
       
 50212 -
       
 50213  // Dump FunctionMap to stdout.  Print address, function name, file
       
 50214  // name, line number, lowpc, and highpc if available.
       
 50215  void DumpFunctionMap(const dwarf2reader::FunctionMap function_map) {
       
 50216    for (dwarf2reader::FunctionMap::const_iterator iter = function_map.begin();
       
 50217         iter != function_map.end(); ++iter) {
       
 50218      if (iter->second->name.empty()) {
       
 50219        continue;
       
 50220      }
       
 50221 @@ -316,42 +307,49 @@ void DumpFunctionMap(const dwarf2reader:
       
 50222  
       
 50223  #define SwapLongLongIfNeeded(a) (swap ? NXSwapLongLong(a) : (a))
       
 50224  #define SwapLongIfNeeded(a) (swap ? NXSwapLong(a) : (a))
       
 50225  #define SwapIntIfNeeded(a) (swap ? NXSwapInt(a) : (a))
       
 50226  #define SwapShortIfNeeded(a) (swap ? NXSwapShort(a) : (a))
       
 50227  
       
 50228  //=============================================================================
       
 50229  - (BOOL)loadSymbolInfo:(void *)base offset:(uint32_t)offset {
       
 50230 +  BOOL loadedStabs = [self loadSTABSSymbolInfo:base offset:offset];
       
 50231 +
       
 50232    NSMutableDictionary *archSections = [sectionData_ objectForKey:architecture_];
       
 50233 +  BOOL loadedDWARF = NO;
       
 50234    if ([archSections objectForKey:@"__DWARF__debug_info"]) {
       
 50235      // Treat this this as debug information
       
 50236 -    return [self loadDWARFSymbolInfo:base offset:offset];
       
 50237 +    loadedDWARF = [self loadDWARFSymbolInfo:base offset:offset];
       
 50238    }
       
 50239  
       
 50240 -  return [self loadSTABSSymbolInfo:base offset:offset];
       
 50241 +  return loadedDWARF || loadedStabs;
       
 50242  }
       
 50243  
       
 50244  //=============================================================================
       
 50245  - (BOOL)loadDWARFSymbolInfo:(void *)base offset:(uint32_t)offset {
       
 50246  
       
 50247    struct mach_header *header = (struct mach_header *) 
       
 50248      ((uint32_t)base + offset);
       
 50249    BOOL swap = (header->magic == MH_CIGAM);
       
 50250  
       
 50251    NSMutableDictionary *archSections = [sectionData_ objectForKey:architecture_];
       
 50252    assert (archSections != nil);
       
 50253    section *dbgInfoSection = [[archSections objectForKey:@"__DWARF__debug_info"] sectionPointer];
       
 50254    uint32_t debugInfoSize = SwapLongIfNeeded(dbgInfoSection->size);
       
 50255  
       
 50256 -  // i think this will break if run on a big-endian machine
       
 50257 +#if __BIG_ENDIAN__
       
 50258 +  dwarf2reader::ByteReader byte_reader(swap ?
       
 50259 +                                       dwarf2reader::ENDIANNESS_LITTLE :
       
 50260 +                                       dwarf2reader::ENDIANNESS_BIG);
       
 50261 +#elif __LITTLE_ENDIAN__
       
 50262    dwarf2reader::ByteReader byte_reader(swap ?
       
 50263                                         dwarf2reader::ENDIANNESS_BIG :
       
 50264                                         dwarf2reader::ENDIANNESS_LITTLE);
       
 50265 -
       
 50266 +#endif
       
 50267    uint64_t dbgOffset = 0;
       
 50268  
       
 50269    dwarf2reader::SectionMap* oneArchitectureSectionMap = [self getSectionMapForArchitecture:architecture_];
       
 50270  
       
 50271    while (dbgOffset < debugInfoSize) {
       
 50272      // Prepare necessary objects.
       
 50273      dwarf2reader::FunctionMap off_to_funcinfo;
       
 50274      dwarf2reader::FunctionMap address_to_funcinfo;
       
 50275 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/Makefile.in b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/Makefile.in
       
 50276 deleted file mode 100644
       
 50277 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/Makefile.in
       
 50278 +++ /dev/null
       
 50279 @@ -1,61 +0,0 @@
       
 50280 -# ***** BEGIN LICENSE BLOCK *****
       
 50281 -# Version: MPL 1.1/GPL 2.0/LGPL 2.1
       
 50282 -#
       
 50283 -# The contents of this file are subject to the Mozilla Public License Version
       
 50284 -# 1.1 (the "License"); you may not use this file except in compliance with
       
 50285 -# the License. You may obtain a copy of the License at
       
 50286 -# http://www.mozilla.org/MPL/
       
 50287 -#
       
 50288 -# Software distributed under the License is distributed on an "AS IS" basis,
       
 50289 -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
       
 50290 -# for the specific language governing rights and limitations under the
       
 50291 -# License.
       
 50292 -#
       
 50293 -# The Original Code is Mozilla Breakpad integration
       
 50294 -#
       
 50295 -# The Initial Developer of the Original Code is
       
 50296 -# The Mozilla Foundation
       
 50297 -# Portions created by the Initial Developer are Copyright (C) 2008
       
 50298 -# the Initial Developer. All Rights Reserved.
       
 50299 -#
       
 50300 -# Contributor(s):
       
 50301 -# Ted Mielczarek <ted.mielczarek@gmail.com>
       
 50302 -#
       
 50303 -# Alternatively, the contents of this file may be used under the terms of
       
 50304 -# either the GNU General Public License Version 2 or later (the "GPL"), or
       
 50305 -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
       
 50306 -# in which case the provisions of the GPL or the LGPL are applicable instead
       
 50307 -# of those above. If you wish to allow use of your version of this file only
       
 50308 -# under the terms of either the GPL or the LGPL, and not to allow others to
       
 50309 -# use your version of this file under the terms of the MPL, indicate your
       
 50310 -# decision by deleting the provisions above and replace them with the notice
       
 50311 -# and other provisions required by the GPL or the LGPL. If you do not delete
       
 50312 -# the provisions above, a recipient may use your version of this file under
       
 50313 -# the terms of any one of the MPL, the GPL or the LGPL.
       
 50314 -#
       
 50315 -# ***** END LICENSE BLOCK *****
       
 50316 -
       
 50317 -DEPTH		= ../../../../../../..
       
 50318 -topsrcdir	= @top_srcdir@
       
 50319 -srcdir		= @srcdir@
       
 50320 -VPATH		= @srcdir@
       
 50321 -
       
 50322 -include $(DEPTH)/config/autoconf.mk
       
 50323 -
       
 50324 -MODULE		= breakpad_mac_dwarf
       
 50325 -HOST_LIBRARY_NAME = host_breakpad_mac_dwarf_s
       
 50326 -
       
 50327 -LOCAL_INCLUDES 	= -I$(srcdir)/../../..
       
 50328 -
       
 50329 -HOST_CPPSRCS = \
       
 50330 -  bytereader.cc \
       
 50331 -  dwarf2reader.cc \
       
 50332 -  functioninfo.cc \
       
 50333 -  $(NULL)
       
 50334 -
       
 50335 -HOST_CXXFLAGS += -funsigned-char
       
 50336 -
       
 50337 -# need static lib
       
 50338 -FORCE_STATIC_LIB = 1
       
 50339 -
       
 50340 -include $(topsrcdir)/config/rules.mk
       
 50341 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader-inl.h b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader-inl.h
       
 50342 deleted file mode 100644
       
 50343 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader-inl.h
       
 50344 +++ /dev/null
       
 50345 @@ -1,141 +0,0 @@
       
 50346 -// Copyright 2006 Google Inc. All Rights Reserved.
       
 50347 -//
       
 50348 -// Redistribution and use in source and binary forms, with or without
       
 50349 -// modification, are permitted provided that the following conditions are
       
 50350 -// met:
       
 50351 -//
       
 50352 -//     * Redistributions of source code must retain the above copyright
       
 50353 -// notice, this list of conditions and the following disclaimer.
       
 50354 -//     * Redistributions in binary form must reproduce the above
       
 50355 -// copyright notice, this list of conditions and the following disclaimer
       
 50356 -// in the documentation and/or other materials provided with the
       
 50357 -// distribution.
       
 50358 -//     * Neither the name of Google Inc. nor the names of its
       
 50359 -// contributors may be used to endorse or promote products derived from
       
 50360 -// this software without specific prior written permission.
       
 50361 -//
       
 50362 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 50363 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 50364 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 50365 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 50366 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 50367 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 50368 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 50369 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 50370 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 50371 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 50372 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 50373 -
       
 50374 -#ifndef UTIL_DEBUGINFO_BYTEREADER_INL_H__
       
 50375 -#define UTIL_DEBUGINFO_BYTEREADER_INL_H__
       
 50376 -
       
 50377 -#include "common/mac/dwarf/bytereader.h"
       
 50378 -
       
 50379 -namespace dwarf2reader {
       
 50380 -
       
 50381 -inline uint8 ByteReader::ReadOneByte(const char* buffer) const {
       
 50382 -  return buffer[0];
       
 50383 -}
       
 50384 -
       
 50385 -inline uint16 ByteReader::ReadTwoBytes(const char* buffer) const {
       
 50386 -  const uint16 buffer0 = static_cast<uint16>(buffer[0]);
       
 50387 -  const uint16 buffer1 = static_cast<uint16>(buffer[1]);
       
 50388 -  if (endian_ == ENDIANNESS_LITTLE) {
       
 50389 -    return buffer0 | buffer1 << 8;
       
 50390 -  } else {
       
 50391 -    return buffer1 | buffer0 << 8;
       
 50392 -  }
       
 50393 -}
       
 50394 -
       
 50395 -inline uint64 ByteReader::ReadFourBytes(const char* buffer) const {
       
 50396 -  const uint32 buffer0 = static_cast<uint32>(buffer[0]);
       
 50397 -  const uint32 buffer1 = static_cast<uint32>(buffer[1]);
       
 50398 -  const uint32 buffer2 = static_cast<uint32>(buffer[2]);
       
 50399 -  const uint32 buffer3 = static_cast<uint32>(buffer[3]);
       
 50400 -  if (endian_ == ENDIANNESS_LITTLE) {
       
 50401 -    return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24;
       
 50402 -  } else {
       
 50403 -    return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24;
       
 50404 -  }
       
 50405 -}
       
 50406 -
       
 50407 -inline uint64 ByteReader::ReadEightBytes(const char* buffer) const {
       
 50408 -  const uint64 buffer0 = static_cast<uint64>(buffer[0]);
       
 50409 -  const uint64 buffer1 = static_cast<uint64>(buffer[1]);
       
 50410 -  const uint64 buffer2 = static_cast<uint64>(buffer[2]);
       
 50411 -  const uint64 buffer3 = static_cast<uint64>(buffer[3]);
       
 50412 -  const uint64 buffer4 = static_cast<uint64>(buffer[4]);
       
 50413 -  const uint64 buffer5 = static_cast<uint64>(buffer[5]);
       
 50414 -  const uint64 buffer6 = static_cast<uint64>(buffer[6]);
       
 50415 -  const uint64 buffer7 = static_cast<uint64>(buffer[7]);
       
 50416 -  if (endian_ == ENDIANNESS_LITTLE) {
       
 50417 -    return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 |
       
 50418 -      buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56;
       
 50419 -  } else {
       
 50420 -    return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 |
       
 50421 -      buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56;
       
 50422 -  }
       
 50423 -}
       
 50424 -
       
 50425 -// Read an unsigned LEB128 number.  Each byte contains 7 bits of
       
 50426 -// information, plus one bit saying whether the number continues or
       
 50427 -// not.
       
 50428 -
       
 50429 -inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer,
       
 50430 -                                             size_t* len) const {
       
 50431 -  uint64 result = 0;
       
 50432 -  size_t num_read = 0;
       
 50433 -  unsigned int shift = 0;
       
 50434 -  unsigned char byte;
       
 50435 -
       
 50436 -  do {
       
 50437 -    byte = *buffer++;
       
 50438 -    num_read++;
       
 50439 -
       
 50440 -    result |= (static_cast<uint64>(byte & 0x7f)) << shift;
       
 50441 -
       
 50442 -    shift += 7;
       
 50443 -
       
 50444 -  } while (byte & 0x80);
       
 50445 -
       
 50446 -  *len = num_read;
       
 50447 -
       
 50448 -  return result;
       
 50449 -}
       
 50450 -
       
 50451 -// Read a signed LEB128 number.  These are like regular LEB128
       
 50452 -// numbers, except the last byte may have a sign bit set.
       
 50453 -
       
 50454 -inline int64 ByteReader::ReadSignedLEB128(const char* buffer,
       
 50455 -                                          size_t* len) const {
       
 50456 -  int64 result = 0;
       
 50457 -  unsigned int shift = 0;
       
 50458 -  size_t num_read = 0;
       
 50459 -  unsigned char byte;
       
 50460 -
       
 50461 -  do {
       
 50462 -      byte = *buffer++;
       
 50463 -      num_read++;
       
 50464 -      result |= (static_cast<uint64>(byte & 0x7f) << shift);
       
 50465 -      shift += 7;
       
 50466 -  } while (byte & 0x80);
       
 50467 -
       
 50468 -  if ((shift < 8 * sizeof (result)) && (byte & 0x40))
       
 50469 -    result |= -((static_cast<int64>(1)) << shift);
       
 50470 -  *len = num_read;
       
 50471 -  return result;
       
 50472 -}
       
 50473 -
       
 50474 -inline uint64 ByteReader::ReadOffset(const char* buffer) const {
       
 50475 -  assert(this->offset_reader_);
       
 50476 -  return (this->*offset_reader_)(buffer);
       
 50477 -}
       
 50478 -
       
 50479 -inline uint64 ByteReader::ReadAddress(const char* buffer) const {
       
 50480 -  assert(this->address_reader_);
       
 50481 -  return (this->*address_reader_)(buffer);
       
 50482 -}
       
 50483 -
       
 50484 -}  // namespace dwarf2reader
       
 50485 -
       
 50486 -#endif  // UTIL_DEBUGINFO_BYTEREADER_INL_H__
       
 50487 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader.cc b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader.cc
       
 50488 deleted file mode 100644
       
 50489 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader.cc
       
 50490 +++ /dev/null
       
 50491 @@ -1,62 +0,0 @@
       
 50492 -// Copyright 2006 Google Inc. All Rights Reserved.
       
 50493 -//
       
 50494 -// Redistribution and use in source and binary forms, with or without
       
 50495 -// modification, are permitted provided that the following conditions are
       
 50496 -// met:
       
 50497 -//
       
 50498 -//     * Redistributions of source code must retain the above copyright
       
 50499 -// notice, this list of conditions and the following disclaimer.
       
 50500 -//     * Redistributions in binary form must reproduce the above
       
 50501 -// copyright notice, this list of conditions and the following disclaimer
       
 50502 -// in the documentation and/or other materials provided with the
       
 50503 -// distribution.
       
 50504 -//     * Neither the name of Google Inc. nor the names of its
       
 50505 -// contributors may be used to endorse or promote products derived from
       
 50506 -// this software without specific prior written permission.
       
 50507 -//
       
 50508 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 50509 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 50510 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 50511 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 50512 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 50513 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 50514 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 50515 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 50516 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 50517 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 50518 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 50519 -
       
 50520 -#include "common/mac/dwarf/bytereader-inl.h"
       
 50521 -
       
 50522 -#include "common/mac/dwarf/bytereader.h"
       
 50523 -
       
 50524 -namespace dwarf2reader {
       
 50525 -
       
 50526 -ByteReader::ByteReader(enum Endianness endian)
       
 50527 -    :offset_reader_(NULL), address_reader_(NULL), endian_(endian),
       
 50528 -     address_size_(0), offset_size_(0)
       
 50529 -{ }
       
 50530 -
       
 50531 -ByteReader::~ByteReader() { }
       
 50532 -
       
 50533 -void ByteReader::SetOffsetSize(uint8 size) {
       
 50534 -  offset_size_ = size;
       
 50535 -  assert(size == 4 || size == 8);
       
 50536 -  if (size == 4) {
       
 50537 -    this->offset_reader_ = &ByteReader::ReadFourBytes;
       
 50538 -  } else {
       
 50539 -    this->offset_reader_ = &ByteReader::ReadEightBytes;
       
 50540 -  }
       
 50541 -}
       
 50542 -
       
 50543 -void ByteReader::SetAddressSize(uint8 size) {
       
 50544 -  address_size_ = size;
       
 50545 -  assert(size == 4 || size == 8);
       
 50546 -  if (size == 4) {
       
 50547 -    this->address_reader_ = &ByteReader::ReadFourBytes;
       
 50548 -  } else {
       
 50549 -    this->address_reader_ = &ByteReader::ReadEightBytes;
       
 50550 -  }
       
 50551 -}
       
 50552 -
       
 50553 -}  // namespace dwarf2reader
       
 50554 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader.h b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader.h
       
 50555 deleted file mode 100644
       
 50556 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/bytereader.h
       
 50557 +++ /dev/null
       
 50558 @@ -1,132 +0,0 @@
       
 50559 -// Copyright 2006 Google Inc. All Rights Reserved.
       
 50560 -//
       
 50561 -// Redistribution and use in source and binary forms, with or without
       
 50562 -// modification, are permitted provided that the following conditions are
       
 50563 -// met:
       
 50564 -//
       
 50565 -//     * Redistributions of source code must retain the above copyright
       
 50566 -// notice, this list of conditions and the following disclaimer.
       
 50567 -//     * Redistributions in binary form must reproduce the above
       
 50568 -// copyright notice, this list of conditions and the following disclaimer
       
 50569 -// in the documentation and/or other materials provided with the
       
 50570 -// distribution.
       
 50571 -//     * Neither the name of Google Inc. nor the names of its
       
 50572 -// contributors may be used to endorse or promote products derived from
       
 50573 -// this software without specific prior written permission.
       
 50574 -//
       
 50575 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 50576 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 50577 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 50578 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 50579 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 50580 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 50581 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 50582 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 50583 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 50584 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 50585 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 50586 -
       
 50587 -#ifndef COMMON_MAC_DWARF_BYTEREADER_H__
       
 50588 -#define COMMON_MAC_DWARF_BYTEREADER_H__
       
 50589 -
       
 50590 -#include <string>
       
 50591 -#include "common/mac/dwarf/types.h"
       
 50592 -
       
 50593 -namespace dwarf2reader {
       
 50594 -
       
 50595 -// We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN
       
 50596 -// because it conflicts with a macro
       
 50597 -enum Endianness {
       
 50598 -  ENDIANNESS_BIG,
       
 50599 -  ENDIANNESS_LITTLE
       
 50600 -};
       
 50601 -
       
 50602 -// Class that knows how to read both big endian and little endian
       
 50603 -// numbers, for use in DWARF2/3 reader.
       
 50604 -// Takes an endianness argument.
       
 50605 -// To read addresses and offsets, SetAddressSize and SetOffsetSize
       
 50606 -// must be called first.
       
 50607 -class ByteReader {
       
 50608 - public:
       
 50609 -  explicit ByteReader(enum Endianness endian);
       
 50610 -  virtual ~ByteReader();
       
 50611 -
       
 50612 -  // Set the address size to SIZE, which sets up the ReadAddress member
       
 50613 -  // so that it works.
       
 50614 -  void SetAddressSize(uint8 size);
       
 50615 -
       
 50616 -  // Set the offset size to SIZE, which sets up the ReadOffset member
       
 50617 -  // so that it works.
       
 50618 -  void SetOffsetSize(uint8 size);
       
 50619 -
       
 50620 -  // Return the current offset size
       
 50621 -  uint8 OffsetSize() const { return offset_size_; }
       
 50622 -
       
 50623 -  // Return the current address size
       
 50624 -  uint8 AddressSize() const { return address_size_; }
       
 50625 -
       
 50626 -  // Read a single byte from BUFFER and return it as an unsigned 8 bit
       
 50627 -  // number.
       
 50628 -  uint8 ReadOneByte(const char* buffer) const;
       
 50629 -
       
 50630 -  // Read two bytes from BUFFER and return it as an unsigned 16 bit
       
 50631 -  // number.
       
 50632 -  uint16 ReadTwoBytes(const char* buffer) const;
       
 50633 -
       
 50634 -  // Read four bytes from BUFFER and return it as an unsigned 32 bit
       
 50635 -  // number.  This function returns a uint64 so that it is compatible
       
 50636 -  // with ReadAddress and ReadOffset.  The number it returns will
       
 50637 -  // never be outside the range of an unsigned 32 bit integer.
       
 50638 -  uint64 ReadFourBytes(const char* buffer) const;
       
 50639 -
       
 50640 -  // Read eight bytes from BUFFER and return it as an unsigned 64 bit
       
 50641 -  // number
       
 50642 -  uint64 ReadEightBytes(const char* buffer) const;
       
 50643 -
       
 50644 -  // Read an unsigned LEB128 (Little Endian Base 128) number from
       
 50645 -  // BUFFER and return it as an unsigned 64 bit integer.  LEN is set
       
 50646 -  // to the length read.  Everybody seems to reinvent LEB128 as a
       
 50647 -  // variable size integer encoding, DWARF has had it for a long time.
       
 50648 -  uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const;
       
 50649 -
       
 50650 -  // Read a signed LEB128 number from BUFFER and return it as an
       
 50651 -  // signed 64 bit integer.  LEN is set to the length read.
       
 50652 -  int64 ReadSignedLEB128(const char* buffer, size_t* len) const;
       
 50653 -
       
 50654 -  // Read an offset from BUFFER and return it as an unsigned 64 bit
       
 50655 -  // integer.  DWARF2/3 define offsets as either 4 or 8 bytes,
       
 50656 -  // generally depending on the amount of DWARF2/3 info present.
       
 50657 -  uint64 ReadOffset(const char* buffer) const;
       
 50658 -
       
 50659 -  // Read an address from BUFFER and return it as an unsigned 64 bit
       
 50660 -  // integer.  DWARF2/3 allow addresses to be any size from 0-255
       
 50661 -  // bytes currently.  Internally we support 4 and 8 byte addresses,
       
 50662 -  // and will CHECK on anything else.
       
 50663 -  uint64 ReadAddress(const char* buffer) const;
       
 50664 -
       
 50665 - private:
       
 50666 -
       
 50667 -  // Function pointer type for our address and offset readers.
       
 50668 -  typedef uint64 (ByteReader::*AddressReader)(const char*) const;
       
 50669 -
       
 50670 -  // Read an offset from BUFFER and return it as an unsigned 64 bit
       
 50671 -  // integer.  DWARF2/3 define offsets as either 4 or 8 bytes,
       
 50672 -  // generally depending on the amount of DWARF2/3 info present.
       
 50673 -  // This function pointer gets set by SetOffsetSize.
       
 50674 -  AddressReader offset_reader_;
       
 50675 -
       
 50676 -  // Read an address from BUFFER and return it as an unsigned 64 bit
       
 50677 -  // integer.  DWARF2/3 allow addresses to be any size from 0-255
       
 50678 -  // bytes currently.  Internally we support 4 and 8 byte addresses,
       
 50679 -  // and will CHECK on anything else.
       
 50680 -  // This function pointer gets set by SetAddressSize.
       
 50681 -  AddressReader address_reader_;
       
 50682 -
       
 50683 -  Endianness endian_;
       
 50684 -  uint8 address_size_;
       
 50685 -  uint8 offset_size_;
       
 50686 -};
       
 50687 -
       
 50688 -}  // namespace dwarf2reader
       
 50689 -
       
 50690 -#endif  // COMMON_MAC_DWARF_BYTEREADER_H__
       
 50691 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2enums.h b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2enums.h
       
 50692 deleted file mode 100644
       
 50693 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2enums.h
       
 50694 +++ /dev/null
       
 50695 @@ -1,490 +0,0 @@
       
 50696 -// Copyright 2006 Google Inc. All Rights Reserved.
       
 50697 -//
       
 50698 -// Redistribution and use in source and binary forms, with or without
       
 50699 -// modification, are permitted provided that the following conditions are
       
 50700 -// met:
       
 50701 -//
       
 50702 -//     * Redistributions of source code must retain the above copyright
       
 50703 -// notice, this list of conditions and the following disclaimer.
       
 50704 -//     * Redistributions in binary form must reproduce the above
       
 50705 -// copyright notice, this list of conditions and the following disclaimer
       
 50706 -// in the documentation and/or other materials provided with the
       
 50707 -// distribution.
       
 50708 -//     * Neither the name of Google Inc. nor the names of its
       
 50709 -// contributors may be used to endorse or promote products derived from
       
 50710 -// this software without specific prior written permission.
       
 50711 -//
       
 50712 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 50713 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 50714 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 50715 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 50716 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 50717 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 50718 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 50719 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 50720 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 50721 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 50722 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 50723 -
       
 50724 -#ifndef COMMON_MAC_DWARF_DWARF2ENUMS_H__
       
 50725 -#define COMMON_MAC_DWARF_DWARF2ENUMS_H__
       
 50726 -
       
 50727 -namespace dwarf2reader {
       
 50728 -
       
 50729 -// These enums do not follow the google3 style only because they are
       
 50730 -// known universally (specs, other implementations) by the names in
       
 50731 -// exactly this capitalization.
       
 50732 -// Tag names and codes.
       
 50733 -enum DwarfTag {
       
 50734 -  DW_TAG_padding = 0x00,
       
 50735 -  DW_TAG_array_type = 0x01,
       
 50736 -  DW_TAG_class_type = 0x02,
       
 50737 -  DW_TAG_entry_point = 0x03,
       
 50738 -  DW_TAG_enumeration_type = 0x04,
       
 50739 -  DW_TAG_formal_parameter = 0x05,
       
 50740 -  DW_TAG_imported_declaration = 0x08,
       
 50741 -  DW_TAG_label = 0x0a,
       
 50742 -  DW_TAG_lexical_block = 0x0b,
       
 50743 -  DW_TAG_member = 0x0d,
       
 50744 -  DW_TAG_pointer_type = 0x0f,
       
 50745 -  DW_TAG_reference_type = 0x10,
       
 50746 -  DW_TAG_compile_unit = 0x11,
       
 50747 -  DW_TAG_string_type = 0x12,
       
 50748 -  DW_TAG_structure_type = 0x13,
       
 50749 -  DW_TAG_subroutine_type = 0x15,
       
 50750 -  DW_TAG_typedef = 0x16,
       
 50751 -  DW_TAG_union_type = 0x17,
       
 50752 -  DW_TAG_unspecified_parameters = 0x18,
       
 50753 -  DW_TAG_variant = 0x19,
       
 50754 -  DW_TAG_common_block = 0x1a,
       
 50755 -  DW_TAG_common_inclusion = 0x1b,
       
 50756 -  DW_TAG_inheritance = 0x1c,
       
 50757 -  DW_TAG_inlined_subroutine = 0x1d,
       
 50758 -  DW_TAG_module = 0x1e,
       
 50759 -  DW_TAG_ptr_to_member_type = 0x1f,
       
 50760 -  DW_TAG_set_type = 0x20,
       
 50761 -  DW_TAG_subrange_type = 0x21,
       
 50762 -  DW_TAG_with_stmt = 0x22,
       
 50763 -  DW_TAG_access_declaration = 0x23,
       
 50764 -  DW_TAG_base_type = 0x24,
       
 50765 -  DW_TAG_catch_block = 0x25,
       
 50766 -  DW_TAG_const_type = 0x26,
       
 50767 -  DW_TAG_constant = 0x27,
       
 50768 -  DW_TAG_enumerator = 0x28,
       
 50769 -  DW_TAG_file_type = 0x29,
       
 50770 -  DW_TAG_friend = 0x2a,
       
 50771 -  DW_TAG_namelist = 0x2b,
       
 50772 -  DW_TAG_namelist_item = 0x2c,
       
 50773 -  DW_TAG_packed_type = 0x2d,
       
 50774 -  DW_TAG_subprogram = 0x2e,
       
 50775 -  DW_TAG_template_type_param = 0x2f,
       
 50776 -  DW_TAG_template_value_param = 0x30,
       
 50777 -  DW_TAG_thrown_type = 0x31,
       
 50778 -  DW_TAG_try_block = 0x32,
       
 50779 -  DW_TAG_variant_part = 0x33,
       
 50780 -  DW_TAG_variable = 0x34,
       
 50781 -  DW_TAG_volatile_type = 0x35,
       
 50782 -  // DWARF 3.
       
 50783 -  DW_TAG_dwarf_procedure = 0x36,
       
 50784 -  DW_TAG_restrict_type = 0x37,
       
 50785 -  DW_TAG_interface_type = 0x38,
       
 50786 -  DW_TAG_namespace = 0x39,
       
 50787 -  DW_TAG_imported_module = 0x3a,
       
 50788 -  DW_TAG_unspecified_type = 0x3b,
       
 50789 -  DW_TAG_partial_unit = 0x3c,
       
 50790 -  DW_TAG_imported_unit = 0x3d,
       
 50791 -  // SGI/MIPS Extensions.
       
 50792 -  DW_TAG_MIPS_loop = 0x4081,
       
 50793 -  // HP extensions.  See:
       
 50794 -  // ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz
       
 50795 -  DW_TAG_HP_array_descriptor = 0x4090,
       
 50796 -  // GNU extensions.
       
 50797 -  DW_TAG_format_label = 0x4101,  // For FORTRAN 77 and Fortran 90.
       
 50798 -  DW_TAG_function_template = 0x4102,  // For C++.
       
 50799 -  DW_TAG_class_template = 0x4103,  // For C++.
       
 50800 -  DW_TAG_GNU_BINCL = 0x4104,
       
 50801 -  DW_TAG_GNU_EINCL = 0x4105,
       
 50802 -  // Extensions for UPC.  See: http://upc.gwu.edu/~upc.
       
 50803 -  DW_TAG_upc_shared_type = 0x8765,
       
 50804 -  DW_TAG_upc_strict_type = 0x8766,
       
 50805 -  DW_TAG_upc_relaxed_type = 0x8767,
       
 50806 -  // PGI (STMicroelectronics) extensions.  No documentation available.
       
 50807 -  DW_TAG_PGI_kanji_type      = 0xA000,
       
 50808 -  DW_TAG_PGI_interface_block = 0xA020
       
 50809 -};
       
 50810 -
       
 50811 -
       
 50812 -enum DwarfHasChild {
       
 50813 -  DW_children_no = 0,
       
 50814 -  DW_children_yes = 1
       
 50815 -};
       
 50816 -
       
 50817 -// Form names and codes.
       
 50818 -enum DwarfForm {
       
 50819 -  DW_FORM_addr = 0x01,
       
 50820 -  DW_FORM_block2 = 0x03,
       
 50821 -  DW_FORM_block4 = 0x04,
       
 50822 -  DW_FORM_data2 = 0x05,
       
 50823 -  DW_FORM_data4 = 0x06,
       
 50824 -  DW_FORM_data8 = 0x07,
       
 50825 -  DW_FORM_string = 0x08,
       
 50826 -  DW_FORM_block = 0x09,
       
 50827 -  DW_FORM_block1 = 0x0a,
       
 50828 -  DW_FORM_data1 = 0x0b,
       
 50829 -  DW_FORM_flag = 0x0c,
       
 50830 -  DW_FORM_sdata = 0x0d,
       
 50831 -  DW_FORM_strp = 0x0e,
       
 50832 -  DW_FORM_udata = 0x0f,
       
 50833 -  DW_FORM_ref_addr = 0x10,
       
 50834 -  DW_FORM_ref1 = 0x11,
       
 50835 -  DW_FORM_ref2 = 0x12,
       
 50836 -  DW_FORM_ref4 = 0x13,
       
 50837 -  DW_FORM_ref8 = 0x14,
       
 50838 -  DW_FORM_ref_udata = 0x15,
       
 50839 -  DW_FORM_indirect = 0x16
       
 50840 -};
       
 50841 -
       
 50842 -// Attribute names and codes
       
 50843 -enum DwarfAttribute {
       
 50844 -  DW_AT_sibling = 0x01,
       
 50845 -  DW_AT_location = 0x02,
       
 50846 -  DW_AT_name = 0x03,
       
 50847 -  DW_AT_ordering = 0x09,
       
 50848 -  DW_AT_subscr_data = 0x0a,
       
 50849 -  DW_AT_byte_size = 0x0b,
       
 50850 -  DW_AT_bit_offset = 0x0c,
       
 50851 -  DW_AT_bit_size = 0x0d,
       
 50852 -  DW_AT_element_list = 0x0f,
       
 50853 -  DW_AT_stmt_list = 0x10,
       
 50854 -  DW_AT_low_pc = 0x11,
       
 50855 -  DW_AT_high_pc = 0x12,
       
 50856 -  DW_AT_language = 0x13,
       
 50857 -  DW_AT_member = 0x14,
       
 50858 -  DW_AT_discr = 0x15,
       
 50859 -  DW_AT_discr_value = 0x16,
       
 50860 -  DW_AT_visibility = 0x17,
       
 50861 -  DW_AT_import = 0x18,
       
 50862 -  DW_AT_string_length = 0x19,
       
 50863 -  DW_AT_common_reference = 0x1a,
       
 50864 -  DW_AT_comp_dir = 0x1b,
       
 50865 -  DW_AT_const_value = 0x1c,
       
 50866 -  DW_AT_containing_type = 0x1d,
       
 50867 -  DW_AT_default_value = 0x1e,
       
 50868 -  DW_AT_inline = 0x20,
       
 50869 -  DW_AT_is_optional = 0x21,
       
 50870 -  DW_AT_lower_bound = 0x22,
       
 50871 -  DW_AT_producer = 0x25,
       
 50872 -  DW_AT_prototyped = 0x27,
       
 50873 -  DW_AT_return_addr = 0x2a,
       
 50874 -  DW_AT_start_scope = 0x2c,
       
 50875 -  DW_AT_stride_size = 0x2e,
       
 50876 -  DW_AT_upper_bound = 0x2f,
       
 50877 -  DW_AT_abstract_origin = 0x31,
       
 50878 -  DW_AT_accessibility = 0x32,
       
 50879 -  DW_AT_address_class = 0x33,
       
 50880 -  DW_AT_artificial = 0x34,
       
 50881 -  DW_AT_base_types = 0x35,
       
 50882 -  DW_AT_calling_convention = 0x36,
       
 50883 -  DW_AT_count = 0x37,
       
 50884 -  DW_AT_data_member_location = 0x38,
       
 50885 -  DW_AT_decl_column = 0x39,
       
 50886 -  DW_AT_decl_file = 0x3a,
       
 50887 -  DW_AT_decl_line = 0x3b,
       
 50888 -  DW_AT_declaration = 0x3c,
       
 50889 -  DW_AT_discr_list = 0x3d,
       
 50890 -  DW_AT_encoding = 0x3e,
       
 50891 -  DW_AT_external = 0x3f,
       
 50892 -  DW_AT_frame_base = 0x40,
       
 50893 -  DW_AT_friend = 0x41,
       
 50894 -  DW_AT_identifier_case = 0x42,
       
 50895 -  DW_AT_macro_info = 0x43,
       
 50896 -  DW_AT_namelist_items = 0x44,
       
 50897 -  DW_AT_priority = 0x45,
       
 50898 -  DW_AT_segment = 0x46,
       
 50899 -  DW_AT_specification = 0x47,
       
 50900 -  DW_AT_static_link = 0x48,
       
 50901 -  DW_AT_type = 0x49,
       
 50902 -  DW_AT_use_location = 0x4a,
       
 50903 -  DW_AT_variable_parameter = 0x4b,
       
 50904 -  DW_AT_virtuality = 0x4c,
       
 50905 -  DW_AT_vtable_elem_location = 0x4d,
       
 50906 -  // DWARF 3 values.
       
 50907 -  DW_AT_allocated     = 0x4e,
       
 50908 -  DW_AT_associated    = 0x4f,
       
 50909 -  DW_AT_data_location = 0x50,
       
 50910 -  DW_AT_stride        = 0x51,
       
 50911 -  DW_AT_entry_pc      = 0x52,
       
 50912 -  DW_AT_use_UTF8      = 0x53,
       
 50913 -  DW_AT_extension     = 0x54,
       
 50914 -  DW_AT_ranges        = 0x55,
       
 50915 -  DW_AT_trampoline    = 0x56,
       
 50916 -  DW_AT_call_column   = 0x57,
       
 50917 -  DW_AT_call_file     = 0x58,
       
 50918 -  DW_AT_call_line     = 0x59,
       
 50919 -  // SGI/MIPS extensions.
       
 50920 -  DW_AT_MIPS_fde = 0x2001,
       
 50921 -  DW_AT_MIPS_loop_begin = 0x2002,
       
 50922 -  DW_AT_MIPS_tail_loop_begin = 0x2003,
       
 50923 -  DW_AT_MIPS_epilog_begin = 0x2004,
       
 50924 -  DW_AT_MIPS_loop_unroll_factor = 0x2005,
       
 50925 -  DW_AT_MIPS_software_pipeline_depth = 0x2006,
       
 50926 -  DW_AT_MIPS_linkage_name = 0x2007,
       
 50927 -  DW_AT_MIPS_stride = 0x2008,
       
 50928 -  DW_AT_MIPS_abstract_name = 0x2009,
       
 50929 -  DW_AT_MIPS_clone_origin = 0x200a,
       
 50930 -  DW_AT_MIPS_has_inlines = 0x200b,
       
 50931 -  // HP extensions.
       
 50932 -  DW_AT_HP_block_index         = 0x2000,
       
 50933 -  DW_AT_HP_unmodifiable        = 0x2001,  // Same as DW_AT_MIPS_fde.
       
 50934 -  DW_AT_HP_actuals_stmt_list   = 0x2010,
       
 50935 -  DW_AT_HP_proc_per_section    = 0x2011,
       
 50936 -  DW_AT_HP_raw_data_ptr        = 0x2012,
       
 50937 -  DW_AT_HP_pass_by_reference   = 0x2013,
       
 50938 -  DW_AT_HP_opt_level           = 0x2014,
       
 50939 -  DW_AT_HP_prof_version_id     = 0x2015,
       
 50940 -  DW_AT_HP_opt_flags           = 0x2016,
       
 50941 -  DW_AT_HP_cold_region_low_pc  = 0x2017,
       
 50942 -  DW_AT_HP_cold_region_high_pc = 0x2018,
       
 50943 -  DW_AT_HP_all_variables_modifiable = 0x2019,
       
 50944 -  DW_AT_HP_linkage_name        = 0x201a,
       
 50945 -  DW_AT_HP_prof_flags          = 0x201b,  // In comp unit of procs_info for -g.
       
 50946 -  // GNU extensions.
       
 50947 -  DW_AT_sf_names   = 0x2101,
       
 50948 -  DW_AT_src_info   = 0x2102,
       
 50949 -  DW_AT_mac_info   = 0x2103,
       
 50950 -  DW_AT_src_coords = 0x2104,
       
 50951 -  DW_AT_body_begin = 0x2105,
       
 50952 -  DW_AT_body_end   = 0x2106,
       
 50953 -  DW_AT_GNU_vector = 0x2107,
       
 50954 -  // VMS extensions.
       
 50955 -  DW_AT_VMS_rtnbeg_pd_address = 0x2201,
       
 50956 -  // UPC extension.
       
 50957 -  DW_AT_upc_threads_scaled = 0x3210,
       
 50958 -  // PGI (STMicroelectronics) extensions.
       
 50959 -  DW_AT_PGI_lbase    = 0x3a00,
       
 50960 -  DW_AT_PGI_soffset  = 0x3a01,
       
 50961 -  DW_AT_PGI_lstride  = 0x3a02
       
 50962 -};
       
 50963 -
       
 50964 -
       
 50965 -// Line number opcodes.
       
 50966 -enum DwarfLineNumberOps {
       
 50967 -  DW_LNS_extended_op = 0,
       
 50968 -  DW_LNS_copy = 1,
       
 50969 -  DW_LNS_advance_pc = 2,
       
 50970 -  DW_LNS_advance_line = 3,
       
 50971 -  DW_LNS_set_file = 4,
       
 50972 -  DW_LNS_set_column = 5,
       
 50973 -  DW_LNS_negate_stmt = 6,
       
 50974 -  DW_LNS_set_basic_block = 7,
       
 50975 -  DW_LNS_const_add_pc = 8,
       
 50976 -  DW_LNS_fixed_advance_pc = 9,
       
 50977 -  // DWARF 3.
       
 50978 -  DW_LNS_set_prologue_end = 10,
       
 50979 -  DW_LNS_set_epilogue_begin = 11,
       
 50980 -  DW_LNS_set_isa = 12
       
 50981 -};
       
 50982 -
       
 50983 -// Line number extended opcodes.
       
 50984 -enum DwarfLineNumberExtendedOps {
       
 50985 -  DW_LNE_end_sequence = 1,
       
 50986 -  DW_LNE_set_address = 2,
       
 50987 -  DW_LNE_define_file = 3,
       
 50988 -  // HP extensions.
       
 50989 -  DW_LNE_HP_negate_is_UV_update      = 0x11,
       
 50990 -  DW_LNE_HP_push_context             = 0x12,
       
 50991 -  DW_LNE_HP_pop_context              = 0x13,
       
 50992 -  DW_LNE_HP_set_file_line_column     = 0x14,
       
 50993 -  DW_LNE_HP_set_routine_name         = 0x15,
       
 50994 -  DW_LNE_HP_set_sequence             = 0x16,
       
 50995 -  DW_LNE_HP_negate_post_semantics    = 0x17,
       
 50996 -  DW_LNE_HP_negate_function_exit     = 0x18,
       
 50997 -  DW_LNE_HP_negate_front_end_logical = 0x19,
       
 50998 -  DW_LNE_HP_define_proc              = 0x20
       
 50999 -};
       
 51000 -
       
 51001 -// Type encoding names and codes
       
 51002 -enum DwarfEncoding {
       
 51003 -  DW_ATE_address                     =0x1,
       
 51004 -  DW_ATE_boolean                     =0x2,
       
 51005 -  DW_ATE_complex_float               =0x3,
       
 51006 -  DW_ATE_float                       =0x4,
       
 51007 -  DW_ATE_signed                      =0x5,
       
 51008 -  DW_ATE_signed_char                 =0x6,
       
 51009 -  DW_ATE_unsigned                    =0x7,
       
 51010 -  DW_ATE_unsigned_char               =0x8,
       
 51011 -  // DWARF3/DWARF3f
       
 51012 -  DW_ATE_imaginary_float             =0x9,
       
 51013 -  DW_ATE_packed_decimal              =0xa,
       
 51014 -  DW_ATE_numeric_string              =0xb,
       
 51015 -  DW_ATE_edited                      =0xc,
       
 51016 -  DW_ATE_signed_fixed                =0xd,
       
 51017 -  DW_ATE_unsigned_fixed              =0xe,
       
 51018 -  DW_ATE_decimal_float               =0xf,
       
 51019 -  DW_ATE_lo_user                     =0x80,
       
 51020 -  DW_ATE_hi_user                     =0xff
       
 51021 -};
       
 51022 -
       
 51023 -// Location virtual machine opcodes
       
 51024 -enum DwarfOpcode {
       
 51025 -  DW_OP_addr                         =0x03,
       
 51026 -  DW_OP_deref                        =0x06,
       
 51027 -  DW_OP_const1u                      =0x08,
       
 51028 -  DW_OP_const1s                      =0x09,
       
 51029 -  DW_OP_const2u                      =0x0a,
       
 51030 -  DW_OP_const2s                      =0x0b,
       
 51031 -  DW_OP_const4u                      =0x0c,
       
 51032 -  DW_OP_const4s                      =0x0d,
       
 51033 -  DW_OP_const8u                      =0x0e,
       
 51034 -  DW_OP_const8s                      =0x0f,
       
 51035 -  DW_OP_constu                       =0x10,
       
 51036 -  DW_OP_consts                       =0x11,
       
 51037 -  DW_OP_dup                          =0x12,
       
 51038 -  DW_OP_drop                         =0x13,
       
 51039 -  DW_OP_over                         =0x14,
       
 51040 -  DW_OP_pick                         =0x15,
       
 51041 -  DW_OP_swap                         =0x16,
       
 51042 -  DW_OP_rot                          =0x17,
       
 51043 -  DW_OP_xderef                       =0x18,
       
 51044 -  DW_OP_abs                          =0x19,
       
 51045 -  DW_OP_and                          =0x1a,
       
 51046 -  DW_OP_div                          =0x1b,
       
 51047 -  DW_OP_minus                        =0x1c,
       
 51048 -  DW_OP_mod                          =0x1d,
       
 51049 -  DW_OP_mul                          =0x1e,
       
 51050 -  DW_OP_neg                          =0x1f,
       
 51051 -  DW_OP_not                          =0x20,
       
 51052 -  DW_OP_or                           =0x21,
       
 51053 -  DW_OP_plus                         =0x22,
       
 51054 -  DW_OP_plus_uconst                  =0x23,
       
 51055 -  DW_OP_shl                          =0x24,
       
 51056 -  DW_OP_shr                          =0x25,
       
 51057 -  DW_OP_shra                         =0x26,
       
 51058 -  DW_OP_xor                          =0x27,
       
 51059 -  DW_OP_bra                          =0x28,
       
 51060 -  DW_OP_eq                           =0x29,
       
 51061 -  DW_OP_ge                           =0x2a,
       
 51062 -  DW_OP_gt                           =0x2b,
       
 51063 -  DW_OP_le                           =0x2c,
       
 51064 -  DW_OP_lt                           =0x2d,
       
 51065 -  DW_OP_ne                           =0x2e,
       
 51066 -  DW_OP_skip                         =0x2f,
       
 51067 -  DW_OP_lit0                         =0x30,
       
 51068 -  DW_OP_lit1                         =0x31,
       
 51069 -  DW_OP_lit2                         =0x32,
       
 51070 -  DW_OP_lit3                         =0x33,
       
 51071 -  DW_OP_lit4                         =0x34,
       
 51072 -  DW_OP_lit5                         =0x35,
       
 51073 -  DW_OP_lit6                         =0x36,
       
 51074 -  DW_OP_lit7                         =0x37,
       
 51075 -  DW_OP_lit8                         =0x38,
       
 51076 -  DW_OP_lit9                         =0x39,
       
 51077 -  DW_OP_lit10                        =0x3a,
       
 51078 -  DW_OP_lit11                        =0x3b,
       
 51079 -  DW_OP_lit12                        =0x3c,
       
 51080 -  DW_OP_lit13                        =0x3d,
       
 51081 -  DW_OP_lit14                        =0x3e,
       
 51082 -  DW_OP_lit15                        =0x3f,
       
 51083 -  DW_OP_lit16                        =0x40,
       
 51084 -  DW_OP_lit17                        =0x41,
       
 51085 -  DW_OP_lit18                        =0x42,
       
 51086 -  DW_OP_lit19                        =0x43,
       
 51087 -  DW_OP_lit20                        =0x44,
       
 51088 -  DW_OP_lit21                        =0x45,
       
 51089 -  DW_OP_lit22                        =0x46,
       
 51090 -  DW_OP_lit23                        =0x47,
       
 51091 -  DW_OP_lit24                        =0x48,
       
 51092 -  DW_OP_lit25                        =0x49,
       
 51093 -  DW_OP_lit26                        =0x4a,
       
 51094 -  DW_OP_lit27                        =0x4b,
       
 51095 -  DW_OP_lit28                        =0x4c,
       
 51096 -  DW_OP_lit29                        =0x4d,
       
 51097 -  DW_OP_lit30                        =0x4e,
       
 51098 -  DW_OP_lit31                        =0x4f,
       
 51099 -  DW_OP_reg0                         =0x50,
       
 51100 -  DW_OP_reg1                         =0x51,
       
 51101 -  DW_OP_reg2                         =0x52,
       
 51102 -  DW_OP_reg3                         =0x53,
       
 51103 -  DW_OP_reg4                         =0x54,
       
 51104 -  DW_OP_reg5                         =0x55,
       
 51105 -  DW_OP_reg6                         =0x56,
       
 51106 -  DW_OP_reg7                         =0x57,
       
 51107 -  DW_OP_reg8                         =0x58,
       
 51108 -  DW_OP_reg9                         =0x59,
       
 51109 -  DW_OP_reg10                        =0x5a,
       
 51110 -  DW_OP_reg11                        =0x5b,
       
 51111 -  DW_OP_reg12                        =0x5c,
       
 51112 -  DW_OP_reg13                        =0x5d,
       
 51113 -  DW_OP_reg14                        =0x5e,
       
 51114 -  DW_OP_reg15                        =0x5f,
       
 51115 -  DW_OP_reg16                        =0x60,
       
 51116 -  DW_OP_reg17                        =0x61,
       
 51117 -  DW_OP_reg18                        =0x62,
       
 51118 -  DW_OP_reg19                        =0x63,
       
 51119 -  DW_OP_reg20                        =0x64,
       
 51120 -  DW_OP_reg21                        =0x65,
       
 51121 -  DW_OP_reg22                        =0x66,
       
 51122 -  DW_OP_reg23                        =0x67,
       
 51123 -  DW_OP_reg24                        =0x68,
       
 51124 -  DW_OP_reg25                        =0x69,
       
 51125 -  DW_OP_reg26                        =0x6a,
       
 51126 -  DW_OP_reg27                        =0x6b,
       
 51127 -  DW_OP_reg28                        =0x6c,
       
 51128 -  DW_OP_reg29                        =0x6d,
       
 51129 -  DW_OP_reg30                        =0x6e,
       
 51130 -  DW_OP_reg31                        =0x6f,
       
 51131 -  DW_OP_breg0                        =0x70,
       
 51132 -  DW_OP_breg1                        =0x71,
       
 51133 -  DW_OP_breg2                        =0x72,
       
 51134 -  DW_OP_breg3                        =0x73,
       
 51135 -  DW_OP_breg4                        =0x74,
       
 51136 -  DW_OP_breg5                        =0x75,
       
 51137 -  DW_OP_breg6                        =0x76,
       
 51138 -  DW_OP_breg7                        =0x77,
       
 51139 -  DW_OP_breg8                        =0x78,
       
 51140 -  DW_OP_breg9                        =0x79,
       
 51141 -  DW_OP_breg10                       =0x7a,
       
 51142 -  DW_OP_breg11                       =0x7b,
       
 51143 -  DW_OP_breg12                       =0x7c,
       
 51144 -  DW_OP_breg13                       =0x7d,
       
 51145 -  DW_OP_breg14                       =0x7e,
       
 51146 -  DW_OP_breg15                       =0x7f,
       
 51147 -  DW_OP_breg16                       =0x80,
       
 51148 -  DW_OP_breg17                       =0x81,
       
 51149 -  DW_OP_breg18                       =0x82,
       
 51150 -  DW_OP_breg19                       =0x83,
       
 51151 -  DW_OP_breg20                       =0x84,
       
 51152 -  DW_OP_breg21                       =0x85,
       
 51153 -  DW_OP_breg22                       =0x86,
       
 51154 -  DW_OP_breg23                       =0x87,
       
 51155 -  DW_OP_breg24                       =0x88,
       
 51156 -  DW_OP_breg25                       =0x89,
       
 51157 -  DW_OP_breg26                       =0x8a,
       
 51158 -  DW_OP_breg27                       =0x8b,
       
 51159 -  DW_OP_breg28                       =0x8c,
       
 51160 -  DW_OP_breg29                       =0x8d,
       
 51161 -  DW_OP_breg30                       =0x8e,
       
 51162 -  DW_OP_breg31                       =0x8f,
       
 51163 -  DW_OP_regX                         =0x90,
       
 51164 -  DW_OP_fbreg                        =0x91,
       
 51165 -  DW_OP_bregX                        =0x92,
       
 51166 -  DW_OP_piece                        =0x93,
       
 51167 -  DW_OP_deref_size                   =0x94,
       
 51168 -  DW_OP_xderef_size                  =0x95,
       
 51169 -  DW_OP_nop                          =0x96,
       
 51170 -  // DWARF3/DWARF3f
       
 51171 -  DW_OP_push_object_address          =0x97,
       
 51172 -  DW_OP_call2                        =0x98,
       
 51173 -  DW_OP_call4                        =0x99,
       
 51174 -  DW_OP_call_ref                     =0x9a,
       
 51175 -  DW_OP_form_tls_address             =0x9b,
       
 51176 -  DW_OP_call_frame_cfa               =0x9c,
       
 51177 -  DW_OP_bit_piece                    =0x9d,
       
 51178 -  DW_OP_lo_user                      =0xe0,
       
 51179 -  DW_OP_hi_user                      =0xff,  
       
 51180 -  // GNU extensions
       
 51181 -  DW_OP_GNU_push_tls_address         =0xe0
       
 51182 -};
       
 51183 -
       
 51184 -}  // namespace dwarf2reader
       
 51185 -#endif  // COMMON_MAC_DWARF_DWARF2ENUMS_H__
       
 51186 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2reader.cc b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2reader.cc
       
 51187 deleted file mode 100644
       
 51188 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2reader.cc
       
 51189 +++ /dev/null
       
 51190 @@ -1,830 +0,0 @@
       
 51191 -// Copyright 2006 Google Inc. All Rights Reserved.
       
 51192 -//
       
 51193 -// Redistribution and use in source and binary forms, with or without
       
 51194 -// modification, are permitted provided that the following conditions are
       
 51195 -// met:
       
 51196 -//
       
 51197 -//     * Redistributions of source code must retain the above copyright
       
 51198 -// notice, this list of conditions and the following disclaimer.
       
 51199 -//     * Redistributions in binary form must reproduce the above
       
 51200 -// copyright notice, this list of conditions and the following disclaimer
       
 51201 -// in the documentation and/or other materials provided with the
       
 51202 -// distribution.
       
 51203 -//     * Neither the name of Google Inc. nor the names of its
       
 51204 -// contributors may be used to endorse or promote products derived from
       
 51205 -// this software without specific prior written permission.
       
 51206 -//
       
 51207 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 51208 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 51209 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 51210 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 51211 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 51212 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 51213 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 51214 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 51215 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 51216 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 51217 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 51218 -
       
 51219 -#include <ext/hash_map>
       
 51220 -#include <stack>
       
 51221 -#include <utility>
       
 51222 -
       
 51223 -#include "common/mac/dwarf/bytereader-inl.h"
       
 51224 -#include "common/mac/dwarf/dwarf2reader.h"
       
 51225 -#include "common/mac/dwarf/bytereader.h"
       
 51226 -#include "common/mac/dwarf/line_state_machine.h"
       
 51227 -
       
 51228 -namespace __gnu_cxx
       
 51229 -{
       
 51230 -  template<> struct hash< std::string >
       
 51231 -  {
       
 51232 -    size_t operator()( const std::string& x ) const
       
 51233 -    {
       
 51234 -      return hash< const char* >()( x.c_str() );
       
 51235 -    }
       
 51236 -  };
       
 51237 -}
       
 51238 -
       
 51239 -namespace dwarf2reader {
       
 51240 -
       
 51241 -// Read a DWARF2/3 initial length field from START, using READER, and
       
 51242 -// report the length in LEN.  Return the actual initial length.
       
 51243 -
       
 51244 -static uint64 ReadInitialLength(const char* start,
       
 51245 -                                ByteReader* reader, size_t* len) {
       
 51246 -  const uint64 initial_length = reader->ReadFourBytes(start);
       
 51247 -  start += 4;
       
 51248 -
       
 51249 -  // In DWARF2/3, if the initial length is all 1 bits, then the offset
       
 51250 -  // size is 8 and we need to read the next 8 bytes for the real length.
       
 51251 -  if (initial_length == 0xffffffff) {
       
 51252 -    reader->SetOffsetSize(8);
       
 51253 -    *len = 12;
       
 51254 -    return reader->ReadOffset(start);
       
 51255 -  } else {
       
 51256 -    reader->SetOffsetSize(4);
       
 51257 -    *len = 4;
       
 51258 -  }
       
 51259 -  return initial_length;
       
 51260 -}
       
 51261 -
       
 51262 -CompilationUnit::CompilationUnit(const SectionMap& sections, uint64 offset,
       
 51263 -                                 ByteReader* reader, Dwarf2Handler* handler)
       
 51264 -    : offset_from_section_start_(offset), reader_(reader),
       
 51265 -      sections_(sections), handler_(handler), abbrevs_(NULL),
       
 51266 -      string_buffer_(NULL), string_buffer_length_(0) {}
       
 51267 -
       
 51268 -// Read a DWARF2/3 abbreviation section.
       
 51269 -// Each abbrev consists of a abbreviation number, a tag, a byte
       
 51270 -// specifying whether the tag has children, and a list of
       
 51271 -// attribute/form pairs.
       
 51272 -// The list of forms is terminated by a 0 for the attribute, and a
       
 51273 -// zero for the form.  The entire abbreviation section is terminated
       
 51274 -// by a zero for the code.
       
 51275 -
       
 51276 -void CompilationUnit::ReadAbbrevs() {
       
 51277 -  if (abbrevs_)
       
 51278 -    return;
       
 51279 -
       
 51280 -  // First get the debug_abbrev section
       
 51281 -  SectionMap::const_iterator iter = sections_.find("__debug_abbrev");
       
 51282 -  assert(iter != sections_.end());
       
 51283 -
       
 51284 -  abbrevs_ = new vector<Abbrev>;
       
 51285 -  abbrevs_->resize(1);
       
 51286 -
       
 51287 -  // The only way to check whether we are reading over the end of the
       
 51288 -  // buffer would be to first compute the size of the leb128 data by
       
 51289 -  // reading it, then go back and read it again.
       
 51290 -  const char* abbrev_start = iter->second.first +
       
 51291 -                                      header_.abbrev_offset;
       
 51292 -  const char* abbrevptr = abbrev_start;
       
 51293 -  const uint64 abbrev_length = iter->second.second - header_.abbrev_offset;
       
 51294 -
       
 51295 -  while (1) {
       
 51296 -    CompilationUnit::Abbrev abbrev;
       
 51297 -    size_t len;
       
 51298 -    const uint32 number = reader_->ReadUnsignedLEB128(abbrevptr, &len);
       
 51299 -
       
 51300 -    if (number == 0)
       
 51301 -      break;
       
 51302 -    abbrev.number = number;
       
 51303 -    abbrevptr += len;
       
 51304 -
       
 51305 -    assert(abbrevptr < abbrev_start + abbrev_length);
       
 51306 -    const uint32 tag = reader_->ReadUnsignedLEB128(abbrevptr, &len);
       
 51307 -    abbrevptr += len;
       
 51308 -    abbrev.tag = static_cast<enum DwarfTag>(tag);
       
 51309 -
       
 51310 -    assert(abbrevptr < abbrev_start + abbrev_length);
       
 51311 -    abbrev.has_children = reader_->ReadOneByte(abbrevptr);
       
 51312 -    abbrevptr += 1;
       
 51313 -
       
 51314 -    assert(abbrevptr < abbrev_start + abbrev_length);
       
 51315 -
       
 51316 -    while (1) {
       
 51317 -      const uint32 nametemp = reader_->ReadUnsignedLEB128(abbrevptr, &len);
       
 51318 -      abbrevptr += len;
       
 51319 -
       
 51320 -      assert(abbrevptr < abbrev_start + abbrev_length);
       
 51321 -      const uint32 formtemp = reader_->ReadUnsignedLEB128(abbrevptr, &len);
       
 51322 -      abbrevptr += len;
       
 51323 -      if (nametemp == 0 && formtemp == 0)
       
 51324 -        break;
       
 51325 -
       
 51326 -      const enum DwarfAttribute name =
       
 51327 -        static_cast<enum DwarfAttribute>(nametemp);
       
 51328 -      const enum DwarfForm form = static_cast<enum DwarfForm>(formtemp);
       
 51329 -      abbrev.attributes.push_back(make_pair(name, form));
       
 51330 -    }
       
 51331 -    assert(abbrev.number == abbrevs_->size());
       
 51332 -    abbrevs_->push_back(abbrev);
       
 51333 -  }
       
 51334 -}
       
 51335 -
       
 51336 -// Skips a single DIE's attributes.
       
 51337 -const char* CompilationUnit::SkipDIE(const char* start,
       
 51338 -                                              const Abbrev& abbrev) {
       
 51339 -  for (AttributeList::const_iterator i = abbrev.attributes.begin();
       
 51340 -       i != abbrev.attributes.end();
       
 51341 -       i++)  {
       
 51342 -    start = SkipAttribute(start, i->second);
       
 51343 -  }
       
 51344 -  return start;
       
 51345 -}
       
 51346 -
       
 51347 -// Skips a single attribute form's data.
       
 51348 -const char* CompilationUnit::SkipAttribute(const char* start,
       
 51349 -                                                    enum DwarfForm form) {
       
 51350 -  size_t len;
       
 51351 -
       
 51352 -  switch (form) {
       
 51353 -    case DW_FORM_indirect:
       
 51354 -      form = static_cast<enum DwarfForm>(reader_->ReadUnsignedLEB128(start,
       
 51355 -                                                                     &len));
       
 51356 -      start += len;
       
 51357 -      return SkipAttribute(start, form);
       
 51358 -      break;
       
 51359 -
       
 51360 -    case DW_FORM_data1:
       
 51361 -    case DW_FORM_flag:
       
 51362 -    case DW_FORM_ref1:
       
 51363 -      return start + 1;
       
 51364 -      break;
       
 51365 -    case DW_FORM_ref2:
       
 51366 -    case DW_FORM_data2:
       
 51367 -      return start + 2;
       
 51368 -      break;
       
 51369 -    case DW_FORM_ref4:
       
 51370 -    case DW_FORM_data4:
       
 51371 -      return start + 4;
       
 51372 -      break;
       
 51373 -    case DW_FORM_ref8:
       
 51374 -    case DW_FORM_data8:
       
 51375 -      return start + 8;
       
 51376 -      break;
       
 51377 -    case DW_FORM_string:
       
 51378 -      return start + strlen(start) + 1;
       
 51379 -      break;
       
 51380 -    case DW_FORM_udata:
       
 51381 -    case DW_FORM_ref_udata:
       
 51382 -      reader_->ReadUnsignedLEB128(start, &len);
       
 51383 -      return start + len;
       
 51384 -      break;
       
 51385 -
       
 51386 -    case DW_FORM_sdata:
       
 51387 -      reader_->ReadSignedLEB128(start, &len);
       
 51388 -      return start + len;
       
 51389 -      break;
       
 51390 -    case DW_FORM_addr:
       
 51391 -      return start + reader_->AddressSize();
       
 51392 -      break;
       
 51393 -    case DW_FORM_ref_addr:
       
 51394 -      // DWARF2 and 3 differ on whether ref_addr is address size or
       
 51395 -      // offset size.
       
 51396 -      assert(header_.version == 2 || header_.version == 3);
       
 51397 -      if (header_.version == 2) {
       
 51398 -        return start + reader_->AddressSize();
       
 51399 -      } else if (header_.version == 3) {
       
 51400 -        return start + reader_->OffsetSize();
       
 51401 -      }
       
 51402 -      break;
       
 51403 -
       
 51404 -    case DW_FORM_block1:
       
 51405 -      return start + 1 + reader_->ReadOneByte(start);
       
 51406 -      break;
       
 51407 -    case DW_FORM_block2:
       
 51408 -      return start + 2 + reader_->ReadTwoBytes(start);
       
 51409 -      break;
       
 51410 -    case DW_FORM_block4:
       
 51411 -      return start + 4 + reader_->ReadFourBytes(start);
       
 51412 -      break;
       
 51413 -    case DW_FORM_block: {
       
 51414 -      uint64 size = reader_->ReadUnsignedLEB128(start, &len);
       
 51415 -      return start + size + len;
       
 51416 -    }
       
 51417 -      break;
       
 51418 -    case DW_FORM_strp:
       
 51419 -        return start + reader_->OffsetSize();
       
 51420 -      break;
       
 51421 -    default:
       
 51422 -      fprintf(stderr,"Unhandled form type");
       
 51423 -  }
       
 51424 -  fprintf(stderr,"Unhandled form type");
       
 51425 -  return NULL;
       
 51426 -}
       
 51427 -
       
 51428 -// Read a DWARF2/3 header.
       
 51429 -// The header is variable length in DWARF3 (and DWARF2 as extended by
       
 51430 -// most compilers), and consists of an length field, a version number,
       
 51431 -// the offset in the .debug_abbrev section for our abbrevs, and an
       
 51432 -// address size.
       
 51433 -void CompilationUnit::ReadHeader() {
       
 51434 -  const char* headerptr = buffer_;
       
 51435 -  size_t initial_length_size;
       
 51436 -
       
 51437 -  assert(headerptr + 4 < buffer_ + buffer_length_);
       
 51438 -  const uint64 initial_length = ReadInitialLength(headerptr, reader_,
       
 51439 -                                                  &initial_length_size);
       
 51440 -  headerptr += initial_length_size;
       
 51441 -  header_.length = initial_length;
       
 51442 -
       
 51443 -  assert(headerptr + 2 < buffer_ + buffer_length_);
       
 51444 -  header_.version = reader_->ReadTwoBytes(headerptr);
       
 51445 -  headerptr += 2;
       
 51446 -
       
 51447 -  assert(headerptr + reader_->OffsetSize() < buffer_ + buffer_length_);
       
 51448 -  header_.abbrev_offset = reader_->ReadOffset(headerptr);
       
 51449 -  headerptr += reader_->OffsetSize();
       
 51450 -
       
 51451 -  assert(headerptr + 1 < buffer_ + buffer_length_);
       
 51452 -  header_.address_size = reader_->ReadOneByte(headerptr);
       
 51453 -  reader_->SetAddressSize(header_.address_size);
       
 51454 -  headerptr += 1;
       
 51455 -
       
 51456 -  after_header_ = headerptr;
       
 51457 -
       
 51458 -  // This check ensures that we don't have to do checking during the
       
 51459 -  // reading of DIEs. header_.length does not include the size of the
       
 51460 -  // initial length.
       
 51461 -  assert(buffer_ + initial_length_size + header_.length <=
       
 51462 -        buffer_ + buffer_length_);
       
 51463 -}
       
 51464 -
       
 51465 -uint64 CompilationUnit::Start() {
       
 51466 -  // First get the debug_info section
       
 51467 -  SectionMap::const_iterator iter = sections_.find("__debug_info");
       
 51468 -  assert(iter != sections_.end());
       
 51469 -
       
 51470 -  // Set up our buffer
       
 51471 -  buffer_ = iter->second.first + offset_from_section_start_;
       
 51472 -  buffer_length_ = iter->second.second - offset_from_section_start_;
       
 51473 -
       
 51474 -  // Read the header
       
 51475 -  ReadHeader();
       
 51476 -
       
 51477 -  // Figure out the real length from the end of the initial length to
       
 51478 -  // the end of the compilation unit, since that is the value we
       
 51479 -  // return.
       
 51480 -  uint64 ourlength = header_.length;
       
 51481 -  if (reader_->OffsetSize() == 8)
       
 51482 -    ourlength += 12;
       
 51483 -  else
       
 51484 -    ourlength += 4;
       
 51485 -
       
 51486 -  // See if the user wants this compilation unit, and if not, just return.
       
 51487 -  if (!handler_->StartCompilationUnit(offset_from_section_start_,
       
 51488 -                                      reader_->AddressSize(),
       
 51489 -                                      reader_->OffsetSize(),
       
 51490 -                                      header_.length,
       
 51491 -                                      header_.version))
       
 51492 -    return ourlength;
       
 51493 -
       
 51494 -  // Otherwise, continue by reading our abbreviation entries.
       
 51495 -  ReadAbbrevs();
       
 51496 -
       
 51497 -  // Set the string section if we have one.
       
 51498 -  iter = sections_.find("__debug_str");
       
 51499 -  if (iter != sections_.end()) {
       
 51500 -    string_buffer_ = iter->second.first;
       
 51501 -    string_buffer_length_ = iter->second.second;
       
 51502 -  }
       
 51503 -
       
 51504 -  // Now that we have our abbreviations, start processing DIE's.
       
 51505 -  ProcessDIEs();
       
 51506 -
       
 51507 -  return ourlength;
       
 51508 -}
       
 51509 -
       
 51510 -// If one really wanted, you could merge SkipAttribute and
       
 51511 -// ProcessAttribute
       
 51512 -// This is all boring data manipulation and calling of the handler.
       
 51513 -const char* CompilationUnit::ProcessAttribute(
       
 51514 -    uint64 dieoffset, const char* start, enum DwarfAttribute attr,
       
 51515 -    enum DwarfForm form) {
       
 51516 -  size_t len;
       
 51517 -
       
 51518 -  switch (form) {
       
 51519 -    // DW_FORM_indirect is never used because it is such a space
       
 51520 -    // waster.
       
 51521 -    case DW_FORM_indirect:
       
 51522 -      form = static_cast<enum DwarfForm>(reader_->ReadUnsignedLEB128(start,
       
 51523 -                                                                     &len));
       
 51524 -      start += len;
       
 51525 -      return ProcessAttribute(dieoffset, start, attr, form);
       
 51526 -      break;
       
 51527 -
       
 51528 -    case DW_FORM_data1:
       
 51529 -    case DW_FORM_flag:
       
 51530 -    case DW_FORM_ref1:
       
 51531 -      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 51532 -                                         reader_->ReadOneByte(start));
       
 51533 -      return start + 1;
       
 51534 -      break;
       
 51535 -    case DW_FORM_ref2:
       
 51536 -    case DW_FORM_data2:
       
 51537 -      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 51538 -                                         reader_->ReadTwoBytes(start));
       
 51539 -      return start + 2;
       
 51540 -      break;
       
 51541 -    case DW_FORM_ref4:
       
 51542 -    case DW_FORM_data4:
       
 51543 -      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 51544 -                                         reader_->ReadFourBytes(start));
       
 51545 -      return start + 4;
       
 51546 -      break;
       
 51547 -    case DW_FORM_ref8:
       
 51548 -    case DW_FORM_data8:
       
 51549 -      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 51550 -                                         reader_->ReadEightBytes(start));
       
 51551 -      return start + 8;
       
 51552 -      break;
       
 51553 -    case DW_FORM_string: {
       
 51554 -      const char* str = start;
       
 51555 -      handler_->ProcessAttributeString(dieoffset, attr, form,
       
 51556 -                                       str);
       
 51557 -      return start + strlen(str) + 1;
       
 51558 -    }
       
 51559 -      break;
       
 51560 -    case DW_FORM_udata:
       
 51561 -    case DW_FORM_ref_udata:
       
 51562 -      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 51563 -                                         reader_->ReadUnsignedLEB128(start,
       
 51564 -                                                                     &len));
       
 51565 -      return start + len;
       
 51566 -      break;
       
 51567 -
       
 51568 -    case DW_FORM_sdata:
       
 51569 -      handler_->ProcessAttributeSigned(dieoffset, attr, form,
       
 51570 -                                      reader_->ReadSignedLEB128(start, &len));
       
 51571 -      return start + len;
       
 51572 -      break;
       
 51573 -    case DW_FORM_addr:
       
 51574 -      handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 51575 -                                         reader_->ReadAddress(start));
       
 51576 -      return start + reader_->AddressSize();
       
 51577 -      break;
       
 51578 -    case DW_FORM_ref_addr:
       
 51579 -      // DWARF2 and 3 differ on whether ref_addr is address size or
       
 51580 -      // offset size.
       
 51581 -      assert(header_.version == 2 || header_.version == 3);
       
 51582 -      if (header_.version == 2) {
       
 51583 -        handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 51584 -                                           reader_->ReadAddress(start));
       
 51585 -        return start + reader_->AddressSize();
       
 51586 -      } else if (header_.version == 3) {
       
 51587 -        handler_->ProcessAttributeUnsigned(dieoffset, attr, form,
       
 51588 -                                           reader_->ReadOffset(start));
       
 51589 -        return start + reader_->OffsetSize();
       
 51590 -      }
       
 51591 -      break;
       
 51592 -
       
 51593 -    case DW_FORM_block1: {
       
 51594 -      uint64 datalen = reader_->ReadOneByte(start);
       
 51595 -      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 1,
       
 51596 -                                      datalen);
       
 51597 -      return start + 1 + datalen;
       
 51598 -    }
       
 51599 -      break;
       
 51600 -    case DW_FORM_block2: {
       
 51601 -      uint64 datalen = reader_->ReadTwoBytes(start);
       
 51602 -      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 2,
       
 51603 -                                      datalen);
       
 51604 -      return start + 2 + datalen;
       
 51605 -    }
       
 51606 -      break;
       
 51607 -    case DW_FORM_block4: {
       
 51608 -      uint64 datalen = reader_->ReadFourBytes(start);
       
 51609 -      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 4,
       
 51610 -                                      datalen);
       
 51611 -      return start + 4 + datalen;
       
 51612 -    }
       
 51613 -      break;
       
 51614 -    case DW_FORM_block: {
       
 51615 -      uint64 datalen = reader_->ReadUnsignedLEB128(start, &len);
       
 51616 -      handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + len,
       
 51617 -                                      datalen);
       
 51618 -      return start + datalen + len;
       
 51619 -    }
       
 51620 -      break;
       
 51621 -    case DW_FORM_strp: {
       
 51622 -      assert(string_buffer_ != NULL);
       
 51623 -
       
 51624 -      const uint64 offset = reader_->ReadOffset(start);
       
 51625 -      assert(string_buffer_ + offset < string_buffer_ + string_buffer_length_);
       
 51626 -
       
 51627 -      const char* str = string_buffer_ + offset;
       
 51628 -      handler_->ProcessAttributeString(dieoffset, attr, form,
       
 51629 -                                       str);
       
 51630 -      return start + reader_->OffsetSize();
       
 51631 -    }
       
 51632 -      break;
       
 51633 -    default:
       
 51634 -      fprintf(stderr, "Unhandled form type");
       
 51635 -  }
       
 51636 -  fprintf(stderr, "Unhandled form type");
       
 51637 -  return NULL;
       
 51638 -}
       
 51639 -
       
 51640 -const char* CompilationUnit::ProcessDIE(uint64 dieoffset,
       
 51641 -                                                 const char* start,
       
 51642 -                                                 const Abbrev& abbrev) {
       
 51643 -  for (AttributeList::const_iterator i = abbrev.attributes.begin();
       
 51644 -       i != abbrev.attributes.end();
       
 51645 -       i++)  {
       
 51646 -    start = ProcessAttribute(dieoffset, start, i->first, i->second);
       
 51647 -  }
       
 51648 -  return start;
       
 51649 -}
       
 51650 -
       
 51651 -void CompilationUnit::ProcessDIEs() {
       
 51652 -  const char* dieptr = after_header_;
       
 51653 -  size_t len;
       
 51654 -
       
 51655 -  // lengthstart is the place the length field is based on.
       
 51656 -  // It is the point in the header after the initial length field
       
 51657 -  const char* lengthstart = buffer_;
       
 51658 -
       
 51659 -  // In 64 bit dwarf, the initial length is 12 bytes, because of the
       
 51660 -  // 0xffffffff at the start.
       
 51661 -  if (reader_->OffsetSize() == 8)
       
 51662 -    lengthstart += 12;
       
 51663 -  else
       
 51664 -    lengthstart += 4;
       
 51665 -
       
 51666 -  // we need semantics of boost scoped_ptr here - no intention of trasnferring
       
 51667 -  // ownership of the stack.  use const, but then we limit ourselves to not
       
 51668 -  // ever being able to call .reset() on the smart pointer.
       
 51669 -  auto_ptr<stack<uint64> > const die_stack(new stack<uint64>);
       
 51670 -
       
 51671 -  while (dieptr < (lengthstart + header_.length)) {
       
 51672 -    // We give the user the absolute offset from the beginning of
       
 51673 -    // debug_info, since they need it to deal with ref_addr forms.
       
 51674 -    uint64 absolute_offset = (dieptr - buffer_) + offset_from_section_start_;
       
 51675 -
       
 51676 -    uint64 abbrev_num = reader_->ReadUnsignedLEB128(dieptr, &len);
       
 51677 -
       
 51678 -    dieptr += len;
       
 51679 -
       
 51680 -    // Abbrev == 0 represents the end of a list of children.
       
 51681 -    if (abbrev_num == 0) {
       
 51682 -      const uint64 offset = die_stack->top();
       
 51683 -      die_stack->pop();
       
 51684 -      handler_->EndDIE(offset);
       
 51685 -      continue;
       
 51686 -    }
       
 51687 -
       
 51688 -    const Abbrev& abbrev = abbrevs_->at(abbrev_num);
       
 51689 -    const enum DwarfTag tag = abbrev.tag;
       
 51690 -    if (!handler_->StartDIE(absolute_offset, tag, abbrev.attributes)) {
       
 51691 -      dieptr = SkipDIE(dieptr, abbrev);
       
 51692 -    } else {
       
 51693 -      dieptr = ProcessDIE(absolute_offset, dieptr, abbrev);
       
 51694 -    }
       
 51695 -
       
 51696 -    if (abbrev.has_children) {
       
 51697 -      die_stack->push(absolute_offset);
       
 51698 -    } else {
       
 51699 -      handler_->EndDIE(absolute_offset);
       
 51700 -    }
       
 51701 -  }
       
 51702 -}
       
 51703 -
       
 51704 -LineInfo::LineInfo(const char* buffer, uint64 buffer_length,
       
 51705 -                   ByteReader* reader, LineInfoHandler* handler):
       
 51706 -    handler_(handler), reader_(reader), buffer_(buffer),
       
 51707 -    buffer_length_(buffer_length) {
       
 51708 -  header_.std_opcode_lengths = NULL;
       
 51709 -}
       
 51710 -
       
 51711 -uint64 LineInfo::Start() {
       
 51712 -  ReadHeader();
       
 51713 -  ReadLines();
       
 51714 -  return after_header_ - buffer_;
       
 51715 -}
       
 51716 -
       
 51717 -// The header for a debug_line section is mildly complicated, because
       
 51718 -// the line info is very tightly encoded.
       
 51719 -void LineInfo::ReadHeader() {
       
 51720 -  const char* lineptr = buffer_;
       
 51721 -  size_t initial_length_size;
       
 51722 -
       
 51723 -  const uint64 initial_length = ReadInitialLength(lineptr, reader_,
       
 51724 -                                                  &initial_length_size);
       
 51725 -
       
 51726 -  lineptr += initial_length_size;
       
 51727 -  header_.total_length = initial_length;
       
 51728 -  assert(buffer_ + initial_length_size + header_.total_length <=
       
 51729 -        buffer_ + buffer_length_);
       
 51730 -
       
 51731 -  // Address size *must* be set by CU ahead of time.
       
 51732 -  assert(reader_->AddressSize() != 0);
       
 51733 -
       
 51734 -  header_.version = reader_->ReadTwoBytes(lineptr);
       
 51735 -  lineptr += 2;
       
 51736 -
       
 51737 -  header_.prologue_length = reader_->ReadOffset(lineptr);
       
 51738 -  lineptr += reader_->OffsetSize();
       
 51739 -
       
 51740 -  header_.min_insn_length = reader_->ReadOneByte(lineptr);
       
 51741 -  lineptr += 1;
       
 51742 -
       
 51743 -  header_.default_is_stmt = reader_->ReadOneByte(lineptr);
       
 51744 -  lineptr += 1;
       
 51745 -
       
 51746 -  header_.line_base = *reinterpret_cast<const int8*>(lineptr);
       
 51747 -  lineptr += 1;
       
 51748 -
       
 51749 -  header_.line_range = reader_->ReadOneByte(lineptr);
       
 51750 -  lineptr += 1;
       
 51751 -
       
 51752 -  header_.opcode_base = reader_->ReadOneByte(lineptr);
       
 51753 -  lineptr += 1;
       
 51754 -
       
 51755 -  header_.std_opcode_lengths = new vector<unsigned char>;
       
 51756 -  header_.std_opcode_lengths->resize(header_.opcode_base + 1);
       
 51757 -  (*header_.std_opcode_lengths)[0] = 0;
       
 51758 -  for (int i = 1; i < header_.opcode_base; i++) {
       
 51759 -    (*header_.std_opcode_lengths)[i] = reader_->ReadOneByte(lineptr);
       
 51760 -    lineptr += 1;
       
 51761 -  }
       
 51762 -
       
 51763 -  // It is legal for the directory entry table to be empty.
       
 51764 -  if (*lineptr) {
       
 51765 -    uint32 dirindex = 1;
       
 51766 -    while (*lineptr) {
       
 51767 -      const char* dirname = lineptr;
       
 51768 -      handler_->DefineDir(dirname, dirindex);
       
 51769 -      lineptr += strlen(dirname) + 1;
       
 51770 -      dirindex++;
       
 51771 -    }
       
 51772 -  }
       
 51773 -  lineptr++;
       
 51774 -
       
 51775 -  // It is also legal for the file entry table to be empty.
       
 51776 -  if (*lineptr) {
       
 51777 -    uint32 fileindex = 1;
       
 51778 -    size_t len;
       
 51779 -    while (*lineptr) {
       
 51780 -      const char* filename = lineptr;
       
 51781 -      lineptr += strlen(filename) + 1;
       
 51782 -
       
 51783 -      uint64 dirindex = reader_->ReadUnsignedLEB128(lineptr, &len);
       
 51784 -      lineptr += len;
       
 51785 -
       
 51786 -      uint64 mod_time = reader_->ReadUnsignedLEB128(lineptr, &len);
       
 51787 -      lineptr += len;
       
 51788 -
       
 51789 -      uint64 filelength = reader_->ReadUnsignedLEB128(lineptr, &len);
       
 51790 -      lineptr += len;
       
 51791 -      handler_->DefineFile(filename, fileindex, dirindex, mod_time,
       
 51792 -                           filelength);
       
 51793 -      fileindex++;
       
 51794 -    }
       
 51795 -  }
       
 51796 -  lineptr++;
       
 51797 -
       
 51798 -  after_header_ = lineptr;
       
 51799 -}
       
 51800 -
       
 51801 -/* static */
       
 51802 -bool LineInfo::ProcessOneOpcode(ByteReader* reader,
       
 51803 -                                LineInfoHandler* handler,
       
 51804 -                                const struct LineInfoHeader &header,
       
 51805 -                                const char* start,
       
 51806 -                                struct LineStateMachine* lsm,
       
 51807 -                                size_t* len,
       
 51808 -                                uintptr_t pc,
       
 51809 -                                bool *lsm_passes_pc) {
       
 51810 -  size_t oplen = 0;
       
 51811 -  size_t templen;
       
 51812 -  uint8 opcode = reader->ReadOneByte(start);
       
 51813 -  oplen++;
       
 51814 -  start++;
       
 51815 -
       
 51816 -  // If the opcode is great than the opcode_base, it is a special
       
 51817 -  // opcode. Most line programs consist mainly of special opcodes.
       
 51818 -  if (opcode >= header.opcode_base) {
       
 51819 -    opcode -= header.opcode_base;
       
 51820 -    const int64 advance_address = (opcode / header.line_range)
       
 51821 -                                  * header.min_insn_length;
       
 51822 -    const int64 advance_line = (opcode % header.line_range)
       
 51823 -                               + header.line_base;
       
 51824 -
       
 51825 -    // Check if the lsm passes "pc". If so, mark it as passed.
       
 51826 -    if (lsm_passes_pc &&
       
 51827 -        lsm->address <= pc && pc < lsm->address + advance_address) {
       
 51828 -      *lsm_passes_pc = true;
       
 51829 -    }
       
 51830 -
       
 51831 -    lsm->address += advance_address;
       
 51832 -    lsm->line_num += advance_line;
       
 51833 -    lsm->basic_block = true;
       
 51834 -    *len = oplen;
       
 51835 -    return true;
       
 51836 -  }
       
 51837 -
       
 51838 -  // Otherwise, we have the regular opcodes
       
 51839 -  switch (opcode) {
       
 51840 -    case DW_LNS_copy: {
       
 51841 -      lsm->basic_block = false;
       
 51842 -      *len = oplen;
       
 51843 -      return true;
       
 51844 -    }
       
 51845 -
       
 51846 -    case DW_LNS_advance_pc: {
       
 51847 -      uint64 advance_address = reader->ReadUnsignedLEB128(start, &templen);
       
 51848 -      oplen += templen;
       
 51849 -
       
 51850 -      // Check if the lsm passes "pc". If so, mark it as passed.
       
 51851 -      if (lsm_passes_pc && lsm->address <= pc &&
       
 51852 -          pc < lsm->address + header.min_insn_length * advance_address) {
       
 51853 -        *lsm_passes_pc = true;
       
 51854 -      }
       
 51855 -
       
 51856 -      lsm->address += header.min_insn_length * advance_address;
       
 51857 -    }
       
 51858 -      break;
       
 51859 -    case DW_LNS_advance_line: {
       
 51860 -      const int64 advance_line = reader->ReadSignedLEB128(start, &templen);
       
 51861 -      oplen += templen;
       
 51862 -      lsm->line_num += advance_line;
       
 51863 -
       
 51864 -      // With gcc 4.2.1, we can get the line_no here for the first time
       
 51865 -      // since DW_LNS_advance_line is called after DW_LNE_set_address is
       
 51866 -      // called. So we check if the lsm passes "pc" here, not in
       
 51867 -      // DW_LNE_set_address.
       
 51868 -      if (lsm_passes_pc && lsm->address == pc) {
       
 51869 -        *lsm_passes_pc = true;
       
 51870 -      }
       
 51871 -    }
       
 51872 -      break;
       
 51873 -    case DW_LNS_set_file: {
       
 51874 -      const uint64 fileno = reader->ReadUnsignedLEB128(start, &templen);
       
 51875 -      oplen += templen;
       
 51876 -      lsm->file_num = fileno;
       
 51877 -    }
       
 51878 -      break;
       
 51879 -    case DW_LNS_set_column: {
       
 51880 -      const uint64 colno = reader->ReadUnsignedLEB128(start, &templen);
       
 51881 -      oplen += templen;
       
 51882 -      lsm->column_num = colno;
       
 51883 -    }
       
 51884 -      break;
       
 51885 -    case DW_LNS_negate_stmt: {
       
 51886 -      lsm->is_stmt = !lsm->is_stmt;
       
 51887 -    }
       
 51888 -      break;
       
 51889 -    case DW_LNS_set_basic_block: {
       
 51890 -      lsm->basic_block = true;
       
 51891 -    }
       
 51892 -      break;
       
 51893 -    case DW_LNS_fixed_advance_pc: {
       
 51894 -      const uint16 advance_address = reader->ReadTwoBytes(start);
       
 51895 -      oplen += 2;
       
 51896 -
       
 51897 -      // Check if the lsm passes "pc". If so, mark it as passed.
       
 51898 -      if (lsm_passes_pc &&
       
 51899 -          lsm->address <= pc && pc < lsm->address + advance_address) {
       
 51900 -        *lsm_passes_pc = true;
       
 51901 -      }
       
 51902 -
       
 51903 -      lsm->address += advance_address;
       
 51904 -    }
       
 51905 -      break;
       
 51906 -    case DW_LNS_const_add_pc: {
       
 51907 -      const int64 advance_address = header.min_insn_length
       
 51908 -                                    * ((255 - header.opcode_base)
       
 51909 -                                       / header.line_range);
       
 51910 -
       
 51911 -      // Check if the lsm passes "pc". If so, mark it as passed.
       
 51912 -      if (lsm_passes_pc &&
       
 51913 -          lsm->address <= pc && pc < lsm->address + advance_address) {
       
 51914 -        *lsm_passes_pc = true;
       
 51915 -      }
       
 51916 -
       
 51917 -      lsm->address += advance_address;
       
 51918 -    }
       
 51919 -      break;
       
 51920 -    case DW_LNS_extended_op: {
       
 51921 -      const size_t extended_op_len = reader->ReadUnsignedLEB128(start,
       
 51922 -                                                                &templen);
       
 51923 -      start += templen;
       
 51924 -      oplen += templen + extended_op_len;
       
 51925 -
       
 51926 -      const uint64 extended_op = reader->ReadOneByte(start);
       
 51927 -      start++;
       
 51928 -
       
 51929 -      switch (extended_op) {
       
 51930 -        case DW_LNE_end_sequence: {
       
 51931 -          lsm->end_sequence = true;
       
 51932 -          *len = oplen;
       
 51933 -          return true;
       
 51934 -        }
       
 51935 -          break;
       
 51936 -        case DW_LNE_set_address: {
       
 51937 -          // With gcc 4.2.1, we cannot tell the line_no here since
       
 51938 -          // DW_LNE_set_address is called before DW_LNS_advance_line is
       
 51939 -          // called.  So we do not check if the lsm passes "pc" here.  See
       
 51940 -          // also the comment in DW_LNS_advance_line.
       
 51941 -          uint64 address = reader->ReadAddress(start);
       
 51942 -          lsm->address = address;
       
 51943 -        }
       
 51944 -          break;
       
 51945 -        case DW_LNE_define_file: {
       
 51946 -          const char* filename  = start;
       
 51947 -
       
 51948 -          templen = strlen(filename) + 1;
       
 51949 -          start += templen;
       
 51950 -
       
 51951 -          uint64 dirindex = reader->ReadUnsignedLEB128(start, &templen);
       
 51952 -          oplen += templen;
       
 51953 -
       
 51954 -          const uint64 mod_time = reader->ReadUnsignedLEB128(start,
       
 51955 -                                                             &templen);
       
 51956 -          oplen += templen;
       
 51957 -
       
 51958 -          const uint64 filelength = reader->ReadUnsignedLEB128(start,
       
 51959 -                                                               &templen);
       
 51960 -          oplen += templen;
       
 51961 -
       
 51962 -          if (handler) {
       
 51963 -            handler->DefineFile(filename, -1, dirindex, mod_time,
       
 51964 -                                filelength);
       
 51965 -          }
       
 51966 -        }
       
 51967 -          break;
       
 51968 -      }
       
 51969 -    }
       
 51970 -      break;
       
 51971 -
       
 51972 -    default: {
       
 51973 -      // Ignore unknown opcode  silently
       
 51974 -      if (header.std_opcode_lengths) {
       
 51975 -        for (int i = 0; i < (*header.std_opcode_lengths)[opcode]; i++) {
       
 51976 -          size_t templen;
       
 51977 -          reader->ReadUnsignedLEB128(start, &templen);
       
 51978 -          start += templen;
       
 51979 -          oplen += templen;
       
 51980 -        }
       
 51981 -      }
       
 51982 -    }
       
 51983 -      break;
       
 51984 -  }
       
 51985 -  *len = oplen;
       
 51986 -  return false;
       
 51987 -}
       
 51988 -
       
 51989 -void LineInfo::ReadLines() {
       
 51990 -  struct LineStateMachine lsm;
       
 51991 -
       
 51992 -  // lengthstart is the place the length field is based on.
       
 51993 -  // It is the point in the header after the initial length field
       
 51994 -  const char* lengthstart = buffer_;
       
 51995 -
       
 51996 -  // In 64 bit dwarf, the initial length is 12 bytes, because of the
       
 51997 -  // 0xffffffff at the start.
       
 51998 -  if (reader_->OffsetSize() == 8)
       
 51999 -    lengthstart += 12;
       
 52000 -  else
       
 52001 -    lengthstart += 4;
       
 52002 -
       
 52003 -  const char* lineptr = after_header_;
       
 52004 -  while (lineptr < lengthstart + header_.total_length) {
       
 52005 -    lsm.Reset(header_.default_is_stmt);
       
 52006 -    while (!lsm.end_sequence) {
       
 52007 -      size_t oplength;
       
 52008 -      bool add_line = ProcessOneOpcode(reader_, handler_, header_,
       
 52009 -                                       lineptr, &lsm, &oplength, (uintptr_t)-1, NULL);
       
 52010 -      if (add_line)
       
 52011 -        handler_->AddLine(lsm.address, lsm.file_num, lsm.line_num,
       
 52012 -                          lsm.column_num);
       
 52013 -      lineptr += oplength;
       
 52014 -    }
       
 52015 -  }
       
 52016 -
       
 52017 -  after_header_ = lengthstart + header_.total_length;
       
 52018 -}
       
 52019 -
       
 52020 -}  // namespace dwarf2reader
       
 52021 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2reader.h b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2reader.h
       
 52022 deleted file mode 100644
       
 52023 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/dwarf2reader.h
       
 52024 +++ /dev/null
       
 52025 @@ -1,393 +0,0 @@
       
 52026 -// Copyright 2006 Google Inc. All Rights Reserved.
       
 52027 -//
       
 52028 -// Redistribution and use in source and binary forms, with or without
       
 52029 -// modification, are permitted provided that the following conditions are
       
 52030 -// met:
       
 52031 -//
       
 52032 -//     * Redistributions of source code must retain the above copyright
       
 52033 -// notice, this list of conditions and the following disclaimer.
       
 52034 -//     * Redistributions in binary form must reproduce the above
       
 52035 -// copyright notice, this list of conditions and the following disclaimer
       
 52036 -// in the documentation and/or other materials provided with the
       
 52037 -// distribution.
       
 52038 -//     * Neither the name of Google Inc. nor the names of its
       
 52039 -// contributors may be used to endorse or promote products derived from
       
 52040 -// this software without specific prior written permission.
       
 52041 -//
       
 52042 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 52043 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 52044 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 52045 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 52046 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 52047 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 52048 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 52049 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 52050 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 52051 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 52052 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 52053 -
       
 52054 -// This file contains definitions related to the DWARF2/3 reader and
       
 52055 -// it's handler interfaces.
       
 52056 -// The DWARF2/3 specification can be found at
       
 52057 -// http://dwarf.freestandards.org and should be considered required
       
 52058 -// reading if you wish to modify the implementation.
       
 52059 -// Only a cursory attempt is made to explain terminology that is
       
 52060 -// used here, as it is much better explained in the standard documents
       
 52061 -#ifndef COMMON_MAC_DWARF_DWARF2READER_H__
       
 52062 -#define COMMON_MAC_DWARF_DWARF2READER_H__
       
 52063 -
       
 52064 -#include <ext/hash_map>
       
 52065 -#include <list>
       
 52066 -#include <string>
       
 52067 -#include <utility>
       
 52068 -#include <vector>
       
 52069 -
       
 52070 -#include "common/mac/dwarf/dwarf2enums.h"
       
 52071 -#include "common/mac/dwarf/types.h"
       
 52072 -
       
 52073 -using namespace std;
       
 52074 -using namespace __gnu_cxx;
       
 52075 -
       
 52076 -namespace dwarf2reader {
       
 52077 -struct LineStateMachine;
       
 52078 -class ByteReader;
       
 52079 -class Dwarf2Handler;
       
 52080 -class LineInfoHandler;
       
 52081 -
       
 52082 -// This maps from a string naming a section to a pair containing a
       
 52083 -// the data for the section, and the size of the section.
       
 52084 -typedef hash_map<string, pair<const char*, uint64> > SectionMap;
       
 52085 -typedef list<pair<enum DwarfAttribute, enum DwarfForm> > AttributeList;
       
 52086 -typedef AttributeList::iterator AttributeIterator;
       
 52087 -typedef AttributeList::const_iterator ConstAttributeIterator;
       
 52088 -
       
 52089 -struct LineInfoHeader {
       
 52090 -  uint64 total_length;
       
 52091 -  uint16 version;
       
 52092 -  uint64 prologue_length;
       
 52093 -  uint8 min_insn_length; // insn stands for instructin
       
 52094 -  bool default_is_stmt; // stmt stands for statement
       
 52095 -  int8 line_base;
       
 52096 -  uint8 line_range;
       
 52097 -  uint8 opcode_base;
       
 52098 -  // Use a pointer so that signalsafe_addr2line is able to use this structure
       
 52099 -  // without heap allocation problem.
       
 52100 -  vector<unsigned char> *std_opcode_lengths;
       
 52101 -};
       
 52102 -
       
 52103 -class LineInfo {
       
 52104 - public:
       
 52105 -
       
 52106 -  // Initializes a .debug_line reader. Buffer and buffer length point
       
 52107 -  // to the beginning and length of the line information to read.
       
 52108 -  // Reader is a ByteReader class that has the endianness set
       
 52109 -  // properly.
       
 52110 -  LineInfo(const char* buffer_, uint64 buffer_length,
       
 52111 -           ByteReader* reader, LineInfoHandler* handler);
       
 52112 -
       
 52113 -  virtual ~LineInfo() {
       
 52114 -    if (header_.std_opcode_lengths) {
       
 52115 -      delete header_.std_opcode_lengths;
       
 52116 -    }
       
 52117 -  }
       
 52118 -
       
 52119 -  // Start processing line info, and calling callbacks in the handler.
       
 52120 -  // Consumes the line number information for a single compilation unit.
       
 52121 -  // Returns the number of bytes processed.
       
 52122 -  uint64 Start();
       
 52123 -
       
 52124 -  // Process a single line info opcode at START using the state
       
 52125 -  // machine at LSM.  Return true if we should define a line using the
       
 52126 -  // current state of the line state machine.  Place the length of the
       
 52127 -  // opcode in LEN.
       
 52128 -  // If LSM_PASSES_PC is non-NULL, this function also checks if the lsm
       
 52129 -  // passes the address of PC. In other words, LSM_PASSES_PC will be
       
 52130 -  // set to true, if the following condition is met.
       
 52131 -  //
       
 52132 -  // lsm's old address < PC <= lsm's new address
       
 52133 -  static bool ProcessOneOpcode(ByteReader* reader,
       
 52134 -                               LineInfoHandler* handler,
       
 52135 -                               const struct LineInfoHeader &header,
       
 52136 -                               const char* start,
       
 52137 -                               struct LineStateMachine* lsm,
       
 52138 -                               size_t* len,
       
 52139 -                               uintptr_t pc,
       
 52140 -                               bool *lsm_passes_pc);
       
 52141 -
       
 52142 - private:
       
 52143 -  // Reads the DWARF2/3 header for this line info.
       
 52144 -  void ReadHeader();
       
 52145 -
       
 52146 -  // Reads the DWARF2/3 line information
       
 52147 -  void ReadLines();
       
 52148 -
       
 52149 -  // The associated handler to call processing functions in
       
 52150 -  LineInfoHandler* handler_;
       
 52151 -
       
 52152 -  // The associated ByteReader that handles endianness issues for us
       
 52153 -  ByteReader* reader_;
       
 52154 -
       
 52155 -  // A DWARF2/3 line info header.  This is not the same size as
       
 52156 -  // in the actual file, as the one in the file may have a 32 bit or
       
 52157 -  // 64 bit lengths
       
 52158 -
       
 52159 -  struct LineInfoHeader header_;
       
 52160 -
       
 52161 -  // buffer is the buffer for our line info, starting at exactly where
       
 52162 -  // the line info to read is.  after_header is the place right after
       
 52163 -  // the end of the line information header.
       
 52164 -  const char* buffer_;
       
 52165 -  uint64 buffer_length_;
       
 52166 -  const char* after_header_;
       
 52167 -};
       
 52168 -
       
 52169 -// This class is the main interface between the line info reader and
       
 52170 -// the client.  The virtual functions inside this get called for
       
 52171 -// interesting events that happen during line info reading.  The
       
 52172 -// default implementation does nothing
       
 52173 -
       
 52174 -class LineInfoHandler {
       
 52175 - public:
       
 52176 -  LineInfoHandler() { }
       
 52177 -
       
 52178 -  virtual ~LineInfoHandler() { }
       
 52179 -
       
 52180 -  // Called when we define a directory.  NAME is the directory name,
       
 52181 -  // DIR_NUM is the directory number
       
 52182 -  virtual void DefineDir(const string& name, uint32 dir_num) { }
       
 52183 -
       
 52184 -  // Called when we define a filename. NAME is the filename, FILE_NUM
       
 52185 -  // is the file number which is -1 if the file index is the next
       
 52186 -  // index after the last numbered index (this happens when files are
       
 52187 -  // dynamically defined by the line program), DIR_NUM is the
       
 52188 -  // directory index for the directory name of this file, MOD_TIME is
       
 52189 -  // the modification time of the file, and LENGTH is the length of
       
 52190 -  // the file
       
 52191 -  virtual void DefineFile(const string& name, int32 file_num,
       
 52192 -                          uint32 dir_num, uint64 mod_time,
       
 52193 -                          uint64 length) { }
       
 52194 -
       
 52195 -  // Called when the line info reader has a new line, address pair
       
 52196 -  // ready for us.  ADDRESS is the address of the code, FILE_NUM is
       
 52197 -  // the file number containing the code, LINE_NUM is the line number in
       
 52198 -  // that file for the code, and COLUMN_NUM is the column number the code
       
 52199 -  // starts at, if we know it (0 otherwise).
       
 52200 -  virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num,
       
 52201 -                       uint32 column_num) { }
       
 52202 -};
       
 52203 -
       
 52204 -// The base of DWARF2/3 debug info is a DIE (Debugging Information
       
 52205 -// Entry.
       
 52206 -// DWARF groups DIE's into a tree and calls the root of this tree a
       
 52207 -// "compilation unit".  Most of the time, their is one compilation
       
 52208 -// unit in the .debug_info section for each file that had debug info
       
 52209 -// generated.
       
 52210 -// Each DIE consists of
       
 52211 -
       
 52212 -// 1. a tag specifying a thing that is being described (ie
       
 52213 -// DW_TAG_subprogram for functions, DW_TAG_variable for variables, etc
       
 52214 -// 2. attributes (such as DW_AT_location for location in memory,
       
 52215 -// DW_AT_name for name), and data for each attribute.
       
 52216 -// 3. A flag saying whether the DIE has children or not
       
 52217 -
       
 52218 -// In order to gain some amount of compression, the format of
       
 52219 -// each DIE (tag name, attributes and data forms for the attributes)
       
 52220 -// are stored in a separate table called the "abbreviation table".
       
 52221 -// This is done because a large number of DIEs have the exact same tag
       
 52222 -// and list of attributes, but different data for those attributes.
       
 52223 -// As a result, the .debug_info section is just a stream of data, and
       
 52224 -// requires reading of the .debug_abbrev section to say what the data
       
 52225 -// means.
       
 52226 -
       
 52227 -// As a warning to the user, it should be noted that the reason for
       
 52228 -// using absolute offsets from the beginning of .debug_info is that
       
 52229 -// DWARF2/3 support referencing DIE's from other DIE's by their offset
       
 52230 -// from either the current compilation unit start, *or* the beginning
       
 52231 -// of the .debug_info section.  This means it is possible to reference
       
 52232 -// a DIE in one compilation unit from a DIE in another compilation
       
 52233 -// unit.  This style of reference is usually used to eliminate
       
 52234 -// duplicated information that occurs across compilation
       
 52235 -// units, such as base types, etc.  GCC 3.4+ support this with
       
 52236 -// -feliminate-dwarf2-dups.  Other toolchains will sometimes do
       
 52237 -// duplicate elimination in the linker.
       
 52238 -
       
 52239 -class CompilationUnit {
       
 52240 - public:
       
 52241 -
       
 52242 -  // Initialize a compilation unit.  This requires a map of sections,
       
 52243 -  // the offset of this compilation unit in the debug_info section, a
       
 52244 -  // ByteReader, and a Dwarf2Handler class to call callbacks in.
       
 52245 -  CompilationUnit(const SectionMap& sections, uint64 offset,
       
 52246 -                  ByteReader* reader, Dwarf2Handler* handler);
       
 52247 -  virtual ~CompilationUnit() {
       
 52248 -    if (abbrevs_) delete abbrevs_;
       
 52249 -  }
       
 52250 -
       
 52251 -  // Begin reading a Dwarf2 compilation unit, and calling the
       
 52252 -  // callbacks in the Dwarf2Handler
       
 52253 -  // Return the offset of the end of the compilation unit - the passed
       
 52254 -  // in offset.
       
 52255 -  uint64 Start();
       
 52256 -
       
 52257 - private:
       
 52258 -
       
 52259 -  // This struct represents a single DWARF2/3 abbreviation
       
 52260 -  // The abbreviation tells how to read a DWARF2/3 DIE, and consist of a
       
 52261 -  // tag and a list of attributes, as well as the data form of each attribute.
       
 52262 -  struct Abbrev {
       
 52263 -    uint32 number;
       
 52264 -    enum DwarfTag tag;
       
 52265 -    bool has_children;
       
 52266 -    AttributeList attributes;
       
 52267 -  };
       
 52268 -
       
 52269 -  // A DWARF2/3 compilation unit header.  This is not the same size as
       
 52270 -  // in the actual file, as the one in the file may have a 32 bit or
       
 52271 -  // 64 bit length.
       
 52272 -  struct CompilationUnitHeader {
       
 52273 -    uint64 length;
       
 52274 -    uint16 version;
       
 52275 -    uint64 abbrev_offset;
       
 52276 -    uint8 address_size;
       
 52277 -  } header_;
       
 52278 -
       
 52279 -  // Reads the DWARF2/3 header for this compilation unit.
       
 52280 -  void ReadHeader();
       
 52281 -
       
 52282 -  // Reads the DWARF2/3 abbreviations for this compilation unit
       
 52283 -  void ReadAbbrevs();
       
 52284 -
       
 52285 -  // Processes a single DIE for this compilation unit and return a new
       
 52286 -  // pointer just past the end of it
       
 52287 -  const char* ProcessDIE(uint64 dieoffset,
       
 52288 -                                  const char* start,
       
 52289 -                                  const Abbrev& abbrev);
       
 52290 -
       
 52291 -  // Processes a single attribute and return a new pointer just past the
       
 52292 -  // end of it
       
 52293 -  const char* ProcessAttribute(uint64 dieoffset,
       
 52294 -                                        const char* start,
       
 52295 -                                        enum DwarfAttribute attr,
       
 52296 -                                        enum DwarfForm form);
       
 52297 -
       
 52298 -  // Processes all DIEs for this compilation unit
       
 52299 -  void ProcessDIEs();
       
 52300 -
       
 52301 -  // Skips the die with attributes specified in ABBREV starting at
       
 52302 -  // START, and return the new place to position the stream to.
       
 52303 -  const char* SkipDIE(const char* start,
       
 52304 -                               const Abbrev& abbrev);
       
 52305 -
       
 52306 -  // Skips the attribute starting at START, with FORM, and return the
       
 52307 -  // new place to position the stream to.
       
 52308 -  const char* SkipAttribute(const char* start,
       
 52309 -                                     enum DwarfForm form);
       
 52310 -
       
 52311 -  // Offset from section start is the offset of this compilation unit
       
 52312 -  // from the beginning of the .debug_info section.
       
 52313 -  uint64 offset_from_section_start_;
       
 52314 -
       
 52315 -  // buffer is the buffer for our CU, starting at .debug_info + offset
       
 52316 -  // passed in from constructor.
       
 52317 -  // after_header points to right after the compilation unit header.
       
 52318 -  const char* buffer_;
       
 52319 -  uint64 buffer_length_;
       
 52320 -  const char* after_header_;
       
 52321 -
       
 52322 -  // The associated ByteReader that handles endianness issues for us
       
 52323 -  ByteReader* reader_;
       
 52324 -
       
 52325 -  // The map of sections in our file to buffers containing their data
       
 52326 -  const SectionMap& sections_;
       
 52327 -
       
 52328 -  // The associated handler to call processing functions in
       
 52329 -  Dwarf2Handler* handler_;
       
 52330 -
       
 52331 -  // Set of DWARF2/3 abbreviations for this compilation unit.  Indexed
       
 52332 -  // by abbreviation number, which means that abbrevs_[0] is not
       
 52333 -  // valid.
       
 52334 -  vector<Abbrev>* abbrevs_;
       
 52335 -
       
 52336 -  // String section buffer and length, if we have a string section.
       
 52337 -  // This is here to avoid doing a section lookup for strings in
       
 52338 -  // ProcessAttribute, which is in the hot path for DWARF2 reading.
       
 52339 -  const char* string_buffer_;
       
 52340 -  uint64 string_buffer_length_;
       
 52341 -};
       
 52342 -
       
 52343 -// This class is the main interface between the reader and the
       
 52344 -// client.  The virtual functions inside this get called for
       
 52345 -// interesting events that happen during DWARF2 reading.
       
 52346 -// The default implementation skips everything.
       
 52347 -
       
 52348 -class Dwarf2Handler {
       
 52349 - public:
       
 52350 -  Dwarf2Handler() { }
       
 52351 -
       
 52352 -  virtual ~Dwarf2Handler() { }
       
 52353 -
       
 52354 -  // Start to process a compilation unit at OFFSET from the beginning of the
       
 52355 -  // debug_info section.  Return false if you would like
       
 52356 -  // to skip this compilation unit.
       
 52357 -  virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
       
 52358 -                                    uint8 offset_size, uint64 cu_length,
       
 52359 -                                    uint8 dwarf_version) { return false; }
       
 52360 -
       
 52361 -  // Start to process a DIE at OFFSET from the beginning of the
       
 52362 -  // debug_info section.  Return false if you would like to skip this
       
 52363 -  // DIE.
       
 52364 -  virtual bool StartDIE(uint64 offset, enum DwarfTag tag,
       
 52365 -                        const AttributeList& attrs) { return false; }
       
 52366 -
       
 52367 -  // Called when we have an attribute with unsigned data to give to
       
 52368 -  // our handler.  The attribute is for the DIE at OFFSET from the
       
 52369 -  // beginning of compilation unit, has a name of ATTR, a form of
       
 52370 -  // FORM, and the actual data of the attribute is in DATA.
       
 52371 -  virtual void ProcessAttributeUnsigned(uint64 offset,
       
 52372 -                                        enum DwarfAttribute attr,
       
 52373 -                                        enum DwarfForm form,
       
 52374 -                                        uint64 data) { }
       
 52375 -
       
 52376 -  // Called when we have an attribute with signed data to give to
       
 52377 -  // our handler.  The attribute is for the DIE at OFFSET from the
       
 52378 -  // beginning of compilation unit, has a name of ATTR, a form of
       
 52379 -  // FORM, and the actual data of the attribute is in DATA.
       
 52380 -  virtual void ProcessAttributeSigned(uint64 offset,
       
 52381 -                                      enum DwarfAttribute attr,
       
 52382 -                                      enum DwarfForm form,
       
 52383 -                                      int64 data) { }
       
 52384 -
       
 52385 -  // Called when we have an attribute with a buffer of data to give to
       
 52386 -  // our handler.  The attribute is for the DIE at OFFSET from the
       
 52387 -  // beginning of compilation unit, has a name of ATTR, a form of
       
 52388 -  // FORM, and the actual data of the attribute is in DATA, and the
       
 52389 -  // length of the buffer is LENGTH.  The buffer is owned by the
       
 52390 -  // caller, not the callee, and may not persist for very long.  If
       
 52391 -  // you want the data to be available later, it needs to be copied.
       
 52392 -  virtual void ProcessAttributeBuffer(uint64 offset,
       
 52393 -                                      enum DwarfAttribute attr,
       
 52394 -                                      enum DwarfForm form,
       
 52395 -                                      const char* data,
       
 52396 -                                      uint64 len) { }
       
 52397 -
       
 52398 -  // Called when we have an attribute with string data to give to
       
 52399 -  // our handler.  The attribute is for the DIE at OFFSET from the
       
 52400 -  // beginning of compilation unit, has a name of ATTR, a form of
       
 52401 -  // FORM, and the actual data of the attribute is in DATA.
       
 52402 -  virtual void ProcessAttributeString(uint64 offset,
       
 52403 -                                      enum DwarfAttribute attr,
       
 52404 -                                      enum DwarfForm form,
       
 52405 -                                      const string& data) { }
       
 52406 -
       
 52407 -  // Called when finished processing the DIE at OFFSET.
       
 52408 -  // Because DWARF2/3 specifies a tree of DIEs, you may get starts
       
 52409 -  // before ends of the previous DIE, as we process children before
       
 52410 -  // ending the parent.
       
 52411 -  virtual void EndDIE(uint64 offset) { }
       
 52412 -
       
 52413 -};
       
 52414 -
       
 52415 -
       
 52416 -}  // namespace dwarf2reader
       
 52417 -
       
 52418 -#endif  // UTIL_DEBUGINFO_DWARF2READER_H__
       
 52419 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/functioninfo.cc b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/functioninfo.cc
       
 52420 deleted file mode 100644
       
 52421 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/functioninfo.cc
       
 52422 +++ /dev/null
       
 52423 @@ -1,240 +0,0 @@
       
 52424 -// Copyright 2006 Google Inc. All Rights Reserved.
       
 52425 -//
       
 52426 -// Redistribution and use in source and binary forms, with or without
       
 52427 -// modification, are permitted provided that the following conditions are
       
 52428 -// met:
       
 52429 -//
       
 52430 -//     * Redistributions of source code must retain the above copyright
       
 52431 -// notice, this list of conditions and the following disclaimer.
       
 52432 -//     * Redistributions in binary form must reproduce the above
       
 52433 -// copyright notice, this list of conditions and the following disclaimer
       
 52434 -// in the documentation and/or other materials provided with the
       
 52435 -// distribution.
       
 52436 -//     * Neither the name of Google Inc. nor the names of its
       
 52437 -// contributors may be used to endorse or promote products derived from
       
 52438 -// this software without specific prior written permission.
       
 52439 -//
       
 52440 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 52441 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 52442 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 52443 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 52444 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 52445 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 52446 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 52447 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 52448 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 52449 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 52450 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 52451 -
       
 52452 -// This is a client for the dwarf2reader to extract function and line
       
 52453 -// information from the debug info.
       
 52454 -
       
 52455 -#include <map>
       
 52456 -#include <queue>
       
 52457 -#include <vector>
       
 52458 -
       
 52459 -
       
 52460 -#include "common/mac/dwarf/functioninfo.h"
       
 52461 -
       
 52462 -#include "common/mac/dwarf/bytereader.h"
       
 52463 -
       
 52464 -
       
 52465 -namespace __gnu_cxx 
       
 52466 -{
       
 52467 -  template<> 
       
 52468 -    struct hash<std::string> 
       
 52469 -    {
       
 52470 -      size_t operator()(const std::string& k) const;
       
 52471 -    };
       
 52472 -}
       
 52473 -
       
 52474 -
       
 52475 -namespace dwarf2reader {
       
 52476 -
       
 52477 -// Given an offset value, its form, and the base offset of the
       
 52478 -// compilation unit containing this value, return an absolute offset
       
 52479 -// within the .debug_info section.
       
 52480 -uint64 GetAbsoluteOffset(uint64 offset,
       
 52481 -                         enum DwarfForm form,
       
 52482 -                         uint64 compilation_unit_base) {
       
 52483 -  switch (form) {
       
 52484 -    case DW_FORM_ref1:
       
 52485 -    case DW_FORM_ref2:
       
 52486 -    case DW_FORM_ref4:
       
 52487 -    case DW_FORM_ref8:
       
 52488 -    case DW_FORM_ref_udata:
       
 52489 -      return offset + compilation_unit_base;
       
 52490 -    case DW_FORM_ref_addr:
       
 52491 -    default:
       
 52492 -      return offset;
       
 52493 -  }
       
 52494 -}
       
 52495 -
       
 52496 -CULineInfoHandler::CULineInfoHandler(vector<SourceFileInfo>* files,
       
 52497 -                                     vector<string>* dirs,
       
 52498 -                                     LineMap* linemap):linemap_(linemap),
       
 52499 -                                                       files_(files),
       
 52500 -                                                       dirs_(dirs) {
       
 52501 -  // The dirs and files are 1 indexed, so just make sure we put
       
 52502 -  // nothing in the 0 vector.
       
 52503 -  assert(dirs->size() == 0);
       
 52504 -  assert(files->size() == 0);
       
 52505 -  dirs->push_back("");
       
 52506 -  SourceFileInfo s;
       
 52507 -  s.name = "";
       
 52508 -  s.lowpc = ULLONG_MAX;
       
 52509 -  files->push_back(s);
       
 52510 -}
       
 52511 -
       
 52512 -void CULineInfoHandler::DefineDir(const string& name, uint32 dir_num) {
       
 52513 -  // These should never come out of order, actually
       
 52514 -  assert(dir_num == dirs_->size());
       
 52515 -  dirs_->push_back(name);
       
 52516 -}
       
 52517 -
       
 52518 -void CULineInfoHandler::DefineFile(const string& name,
       
 52519 -                                   int32 file_num, uint32 dir_num,
       
 52520 -                                   uint64 mod_time, uint64 length) {
       
 52521 -  assert(dir_num >= 0);
       
 52522 -  assert(dir_num < dirs_->size());
       
 52523 -
       
 52524 -  // These should never come out of order, actually.
       
 52525 -  if (file_num == (int32)files_->size() || file_num == -1) {
       
 52526 -    string dir = dirs_->at(dir_num);
       
 52527 -
       
 52528 -    SourceFileInfo s;
       
 52529 -    s.lowpc = ULLONG_MAX;
       
 52530 -
       
 52531 -    if (dir == "") {
       
 52532 -      s.name = name;
       
 52533 -    } else {
       
 52534 -      s.name = dir + "/" + name;
       
 52535 -    }
       
 52536 -
       
 52537 -    files_->push_back(s);
       
 52538 -  } else {
       
 52539 -    fprintf(stderr, "error in DefineFile");
       
 52540 -  }
       
 52541 -}
       
 52542 -
       
 52543 -void CULineInfoHandler::AddLine(uint64 address, uint32 file_num,
       
 52544 -                                uint32 line_num, uint32 column_num) {
       
 52545 -  if (file_num < files_->size()) {
       
 52546 -    linemap_->insert(make_pair(address, make_pair(files_->at(file_num).name.c_str(),
       
 52547 -                                                  line_num)));
       
 52548 -
       
 52549 -    if(address < files_->at(file_num).lowpc) {
       
 52550 -      files_->at(file_num).lowpc = address;
       
 52551 -    }
       
 52552 -  } else {
       
 52553 -    fprintf(stderr,"error in AddLine");
       
 52554 -  }
       
 52555 -}
       
 52556 -
       
 52557 -bool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset,
       
 52558 -                                                 uint8 address_size,
       
 52559 -                                                 uint8 offset_size,
       
 52560 -                                                 uint64 cu_length,
       
 52561 -                                                 uint8 dwarf_version) {
       
 52562 -  current_compilation_unit_offset_ = offset;
       
 52563 -  return true;
       
 52564 -}
       
 52565 -
       
 52566 -
       
 52567 -// For function info, we only care about subprograms and inlined
       
 52568 -// subroutines. For line info, the DW_AT_stmt_list lives in the
       
 52569 -// compile unit tag.
       
 52570 -
       
 52571 -bool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag,
       
 52572 -                                     const AttributeList& attrs) {
       
 52573 -  switch (tag) {
       
 52574 -    case DW_TAG_subprogram:
       
 52575 -    case DW_TAG_inlined_subroutine: {
       
 52576 -      current_function_info_ = new FunctionInfo;
       
 52577 -      current_function_info_->lowpc = current_function_info_->highpc = 0;
       
 52578 -      current_function_info_->name = "";
       
 52579 -      current_function_info_->line = 0;
       
 52580 -      current_function_info_->file = "";
       
 52581 -      offset_to_funcinfo_->insert(make_pair(offset, current_function_info_));
       
 52582 -    };
       
 52583 -      // FALLTHROUGH
       
 52584 -    case DW_TAG_compile_unit:
       
 52585 -      return true;
       
 52586 -    default:
       
 52587 -      return false;
       
 52588 -  }
       
 52589 -  return false;
       
 52590 -}
       
 52591 -
       
 52592 -// Only care about the name attribute for functions
       
 52593 -
       
 52594 -void CUFunctionInfoHandler::ProcessAttributeString(uint64 offset,
       
 52595 -                                                   enum DwarfAttribute attr,
       
 52596 -                                                   enum DwarfForm form,
       
 52597 -                                                   const string &data) {
       
 52598 -  if (current_function_info_) {
       
 52599 -    if (attr == DW_AT_name)
       
 52600 -      current_function_info_->name = data;
       
 52601 -    else if(attr == DW_AT_MIPS_linkage_name)
       
 52602 -      current_function_info_->mangled_name = data;
       
 52603 -  }
       
 52604 -}
       
 52605 -
       
 52606 -void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset,
       
 52607 -                                                     enum DwarfAttribute attr,
       
 52608 -                                                     enum DwarfForm form,
       
 52609 -                                                     uint64 data) {
       
 52610 -  if (attr == DW_AT_stmt_list) {
       
 52611 -    SectionMap::const_iterator iter = sections_.find("__debug_line");
       
 52612 -    assert(iter != sections_.end());
       
 52613 -
       
 52614 -    // this should be a scoped_ptr but we dont' use boost :-(
       
 52615 -    auto_ptr<LineInfo> lireader(new LineInfo(iter->second.first + data,
       
 52616 -                                               iter->second.second  - data,
       
 52617 -                                               reader_, linehandler_));
       
 52618 -    lireader->Start();
       
 52619 -  } else if (current_function_info_) {
       
 52620 -    switch (attr) {
       
 52621 -      case DW_AT_low_pc:
       
 52622 -        current_function_info_->lowpc = data;
       
 52623 -        break;
       
 52624 -      case DW_AT_high_pc:
       
 52625 -        current_function_info_->highpc = data;
       
 52626 -        break;
       
 52627 -      case DW_AT_decl_line:
       
 52628 -        current_function_info_->line = data;
       
 52629 -        break;
       
 52630 -      case DW_AT_decl_file:
       
 52631 -        current_function_info_->file = files_->at(data).name;
       
 52632 -        break;
       
 52633 -      case DW_AT_specification: {
       
 52634 -        // Some functions have a "specification" attribute
       
 52635 -        // which means they were defined elsewhere. The name
       
 52636 -        // attribute is not repeated, and must be taken from
       
 52637 -        // the specification DIE. Here we'll assume that
       
 52638 -        // any DIE referenced in this manner will already have
       
 52639 -        // been seen, but that's not really required by the spec.
       
 52640 -        uint64 abs_offset = GetAbsoluteOffset(data, form, current_compilation_unit_offset_);
       
 52641 -        FunctionMap::iterator iter = offset_to_funcinfo_->find(abs_offset);
       
 52642 -        if (iter != offset_to_funcinfo_->end()) {
       
 52643 -          current_function_info_->name = iter->second->name;
       
 52644 -          current_function_info_->mangled_name = iter->second->mangled_name;
       
 52645 -        } else {
       
 52646 -          // If you hit this, this code probably needs to be rewritten.
       
 52647 -          fprintf(stderr, "Error: DW_AT_specification was seen before the referenced DIE! (Looking for DIE at offset %08llx, in DIE at offset %08llx)\n", abs_offset, offset);
       
 52648 -        }
       
 52649 -        break;
       
 52650 -      }
       
 52651 -      default:
       
 52652 -        break;
       
 52653 -    }
       
 52654 -  }
       
 52655 -}
       
 52656 -
       
 52657 -void CUFunctionInfoHandler::EndDIE(uint64 offset) {
       
 52658 -  if (current_function_info_ && current_function_info_->lowpc)
       
 52659 -    address_to_funcinfo_->insert(make_pair(current_function_info_->lowpc,
       
 52660 -                                           current_function_info_));
       
 52661 -}
       
 52662 -
       
 52663 -}  // namespace dwarf2reader
       
 52664 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/functioninfo.h b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/functioninfo.h
       
 52665 deleted file mode 100644
       
 52666 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/functioninfo.h
       
 52667 +++ /dev/null
       
 52668 @@ -1,178 +0,0 @@
       
 52669 -// Copyright 2006 Google Inc. All Rights Reserved.
       
 52670 -//
       
 52671 -// Redistribution and use in source and binary forms, with or without
       
 52672 -// modification, are permitted provided that the following conditions are
       
 52673 -// met:
       
 52674 -//
       
 52675 -//     * Redistributions of source code must retain the above copyright
       
 52676 -// notice, this list of conditions and the following disclaimer.
       
 52677 -//     * Redistributions in binary form must reproduce the above
       
 52678 -// copyright notice, this list of conditions and the following disclaimer
       
 52679 -// in the documentation and/or other materials provided with the
       
 52680 -// distribution.
       
 52681 -//     * Neither the name of Google Inc. nor the names of its
       
 52682 -// contributors may be used to endorse or promote products derived from
       
 52683 -// this software without specific prior written permission.
       
 52684 -//
       
 52685 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 52686 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 52687 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 52688 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 52689 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 52690 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 52691 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 52692 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 52693 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 52694 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 52695 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 52696 -
       
 52697 -
       
 52698 -// This file contains the definitions for a DWARF2/3 information
       
 52699 -// collector that uses the DWARF2/3 reader interface to build a mapping
       
 52700 -// of addresses to files, lines, and functions.
       
 52701 -
       
 52702 -#ifndef COMMON_MAC_DWARF_FUNCTIONINFO_H__
       
 52703 -#define COMMON_MAC_DWARF_FUNCTIONINFO_H__
       
 52704 -
       
 52705 -#include <map>
       
 52706 -#include <string>
       
 52707 -#include <utility>
       
 52708 -#include <vector>
       
 52709 -
       
 52710 -#include "common/mac/dwarf/dwarf2reader.h"
       
 52711 -
       
 52712 -
       
 52713 -namespace dwarf2reader {
       
 52714 -
       
 52715 -struct FunctionInfo {
       
 52716 -  // Name of the function
       
 52717 -  string name;
       
 52718 -  // Mangled name of the function
       
 52719 -  string mangled_name;
       
 52720 -  // File containing this function
       
 52721 -  string file;
       
 52722 -  // Line number for start of function.
       
 52723 -  uint32 line;
       
 52724 -  // Beginning address for this function
       
 52725 -  uint64 lowpc;
       
 52726 -  // End address for this function.
       
 52727 -  uint64 highpc;
       
 52728 -};
       
 52729 -
       
 52730 -struct SourceFileInfo {
       
 52731 -  // Name of the source file name
       
 52732 -  string name;
       
 52733 -  // Low address of source file name
       
 52734 -  uint64 lowpc;
       
 52735 -};
       
 52736 -
       
 52737 -typedef map<uint64, FunctionInfo*> FunctionMap;
       
 52738 -typedef map<uint64, pair<string, uint32> > LineMap;
       
 52739 -
       
 52740 -// This class is a basic line info handler that fills in the dirs,
       
 52741 -// file, and linemap passed into it with the data produced from the
       
 52742 -// LineInfoHandler.
       
 52743 -class CULineInfoHandler: public LineInfoHandler {
       
 52744 - public:
       
 52745 -
       
 52746 -  //
       
 52747 -  CULineInfoHandler(vector<SourceFileInfo>* files,
       
 52748 -                    vector<string>* dirs,
       
 52749 -                    LineMap* linemap);
       
 52750 -  virtual ~CULineInfoHandler() { }
       
 52751 -
       
 52752 -  // Called when we define a directory.  We just place NAME into dirs_
       
 52753 -  // at position DIR_NUM.
       
 52754 -  virtual void DefineDir(const string& name, uint32 dir_num);
       
 52755 -
       
 52756 -  // Called when we define a filename.  We just place
       
 52757 -  // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM.
       
 52758 -  virtual void DefineFile(const string& name, int32 file_num,
       
 52759 -                          uint32 dir_num, uint64 mod_time, uint64 length);
       
 52760 -
       
 52761 -
       
 52762 -  // Called when the line info reader has a new line, address pair
       
 52763 -  // ready for us.  ADDRESS is the address of the code, FILE_NUM is
       
 52764 -  // the file number containing the code, LINE_NUM is the line number
       
 52765 -  // in that file for the code, and COLUMN_NUM is the column number
       
 52766 -  // the code starts at, if we know it (0 otherwise).
       
 52767 -  virtual void AddLine(uint64 address, uint32 file_num, uint32 line_num,
       
 52768 -                       uint32 column_num);
       
 52769 -
       
 52770 -
       
 52771 - private:
       
 52772 -  LineMap* linemap_;
       
 52773 -  vector<SourceFileInfo>* files_;
       
 52774 -  vector<string>* dirs_;
       
 52775 -};
       
 52776 -
       
 52777 -class CUFunctionInfoHandler: public Dwarf2Handler {
       
 52778 - public:
       
 52779 -  CUFunctionInfoHandler(vector<SourceFileInfo>* files,
       
 52780 -                        vector<string>* dirs,
       
 52781 -                        LineMap* linemap,
       
 52782 -                        FunctionMap* offset_to_funcinfo,
       
 52783 -                        FunctionMap* address_to_funcinfo,
       
 52784 -                        CULineInfoHandler* linehandler,
       
 52785 -                        const SectionMap& sections,
       
 52786 -                        ByteReader* reader)
       
 52787 -      : files_(files), dirs_(dirs), linemap_(linemap),
       
 52788 -        offset_to_funcinfo_(offset_to_funcinfo),
       
 52789 -        address_to_funcinfo_(address_to_funcinfo),
       
 52790 -        linehandler_(linehandler), sections_(sections),
       
 52791 -        reader_(reader), current_function_info_(NULL) { }
       
 52792 -
       
 52793 -  virtual ~CUFunctionInfoHandler() { }
       
 52794 -
       
 52795 -  // Start to process a compilation unit at OFFSET from the beginning of the
       
 52796 -  // debug_info section.  We want to see all compilation units, so we
       
 52797 -  // always return true.
       
 52798 -
       
 52799 -  virtual bool StartCompilationUnit(uint64 offset, uint8 address_size,
       
 52800 -                                    uint8 offset_size, uint64 cu_length,
       
 52801 -                                    uint8 dwarf_version);
       
 52802 -
       
 52803 -  // Start to process a DIE at OFFSET from the beginning of the
       
 52804 -  // debug_info section.  We only care about function related DIE's.
       
 52805 -  virtual bool StartDIE(uint64 offset, enum DwarfTag tag,
       
 52806 -                        const AttributeList& attrs);
       
 52807 -
       
 52808 -  // Called when we have an attribute with unsigned data to give to
       
 52809 -  // our handler.  The attribute is for the DIE at OFFSET from the
       
 52810 -  // beginning of compilation unit, has a name of ATTR, a form of
       
 52811 -  // FORM, and the actual data of the attribute is in DATA.
       
 52812 -  virtual void ProcessAttributeUnsigned(uint64 offset,
       
 52813 -                                        enum DwarfAttribute attr,
       
 52814 -                                        enum DwarfForm form,
       
 52815 -                                        uint64 data);
       
 52816 -
       
 52817 -  // Called when we have an attribute with string data to give to
       
 52818 -  // our handler.  The attribute is for the DIE at OFFSET from the
       
 52819 -  // beginning of compilation unit, has a name of ATTR, a form of
       
 52820 -  // FORM, and the actual data of the attribute is in DATA.
       
 52821 -  virtual void ProcessAttributeString(uint64 offset,
       
 52822 -                                      enum DwarfAttribute attr,
       
 52823 -                                      enum DwarfForm form,
       
 52824 -                                      const string& data);
       
 52825 -
       
 52826 -  // Called when finished processing the DIE at OFFSET.
       
 52827 -  // Because DWARF2/3 specifies a tree of DIEs, you may get starts
       
 52828 -  // before ends of the previous DIE, as we process children before
       
 52829 -  // ending the parent.
       
 52830 -  virtual void EndDIE(uint64 offset);
       
 52831 -
       
 52832 - private:
       
 52833 -  vector<SourceFileInfo>* files_;
       
 52834 -  vector<string>* dirs_;
       
 52835 -  LineMap* linemap_;
       
 52836 -  FunctionMap* offset_to_funcinfo_;
       
 52837 -  FunctionMap* address_to_funcinfo_;
       
 52838 -  CULineInfoHandler* linehandler_;
       
 52839 -  const SectionMap& sections_;
       
 52840 -  ByteReader* reader_;
       
 52841 -  FunctionInfo* current_function_info_;
       
 52842 -  uint64 current_compilation_unit_offset_;
       
 52843 -};
       
 52844 -
       
 52845 -}  // namespace dwarf2reader
       
 52846 -#endif  // COMMON_MAC_DWARF_FUNCTIONINFO_H__
       
 52847 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/line_state_machine.h b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/line_state_machine.h
       
 52848 deleted file mode 100644
       
 52849 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/line_state_machine.h
       
 52850 +++ /dev/null
       
 52851 @@ -1,61 +0,0 @@
       
 52852 -// Copyright 2008 Google Inc. All Rights Reserved.
       
 52853 -//
       
 52854 -// Redistribution and use in source and binary forms, with or without
       
 52855 -// modification, are permitted provided that the following conditions are
       
 52856 -// met:
       
 52857 -//
       
 52858 -//     * Redistributions of source code must retain the above copyright
       
 52859 -// notice, this list of conditions and the following disclaimer.
       
 52860 -//     * Redistributions in binary form must reproduce the above
       
 52861 -// copyright notice, this list of conditions and the following disclaimer
       
 52862 -// in the documentation and/or other materials provided with the
       
 52863 -// distribution.
       
 52864 -//     * Neither the name of Google Inc. nor the names of its
       
 52865 -// contributors may be used to endorse or promote products derived from
       
 52866 -// this software without specific prior written permission.
       
 52867 -//
       
 52868 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 52869 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 52870 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 52871 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 52872 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 52873 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 52874 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 52875 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 52876 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 52877 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 52878 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 52879 -
       
 52880 -
       
 52881 -#ifndef COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__
       
 52882 -#define COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__
       
 52883 -
       
 52884 -namespace dwarf2reader {
       
 52885 -
       
 52886 -// This is the format of a DWARF2/3 line state machine that we process
       
 52887 -// opcodes using.  There is no need for anything outside the lineinfo
       
 52888 -// processor to know how this works.
       
 52889 -struct LineStateMachine {
       
 52890 -  void Reset(bool default_is_stmt) {
       
 52891 -    file_num = 1;
       
 52892 -    address = 0;
       
 52893 -    line_num = 1;
       
 52894 -    column_num = 0;
       
 52895 -    is_stmt = default_is_stmt;
       
 52896 -    basic_block = false;
       
 52897 -    end_sequence = false;
       
 52898 -  }
       
 52899 -
       
 52900 -  uint32 file_num;
       
 52901 -  uint64 address;
       
 52902 -  uint64 line_num;
       
 52903 -  uint32 column_num;
       
 52904 -  bool is_stmt;  // stmt means statement.
       
 52905 -  bool basic_block;
       
 52906 -  bool end_sequence;
       
 52907 -};
       
 52908 -
       
 52909 -}  // namespace dwarf2reader
       
 52910 -
       
 52911 -
       
 52912 -#endif  // COMMON_MAC_DWARF_LINE_STATE_MACHINE_H__
       
 52913 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/types.h b/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/types.h
       
 52914 deleted file mode 100644
       
 52915 --- a/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/types.h
       
 52916 +++ /dev/null
       
 52917 @@ -1,46 +0,0 @@
       
 52918 -// Copyright 2008 Google, Inc.  All Rights reserved
       
 52919 -//
       
 52920 -// Redistribution and use in source and binary forms, with or without
       
 52921 -// modification, are permitted provided that the following conditions are
       
 52922 -// met:
       
 52923 -//
       
 52924 -//     * Redistributions of source code must retain the above copyright
       
 52925 -// notice, this list of conditions and the following disclaimer.
       
 52926 -//     * Redistributions in binary form must reproduce the above
       
 52927 -// copyright notice, this list of conditions and the following disclaimer
       
 52928 -// in the documentation and/or other materials provided with the
       
 52929 -// distribution.
       
 52930 -//     * Neither the name of Google Inc. nor the names of its
       
 52931 -// contributors may be used to endorse or promote products derived from
       
 52932 -// this software without specific prior written permission.
       
 52933 -//
       
 52934 -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 52935 -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 52936 -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 52937 -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 52938 -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 52939 -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 52940 -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 52941 -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 52942 -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 52943 -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 52944 -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 52945 -
       
 52946 -
       
 52947 -// This file contains some typedefs for basic types
       
 52948 -
       
 52949 -
       
 52950 -#ifndef _COMMON_MAC_DWARF_TYPES_H__
       
 52951 -#define _COMMON_MAC_DWARF_TYPES_H__
       
 52952 -
       
 52953 -typedef signed char         int8;
       
 52954 -typedef short               int16;
       
 52955 -typedef int                 int32;
       
 52956 -typedef long long           int64;
       
 52957 -
       
 52958 -typedef unsigned char      uint8;
       
 52959 -typedef unsigned short     uint16;
       
 52960 -typedef unsigned int       uint32;
       
 52961 -typedef unsigned long long uint64;
       
 52962 -
       
 52963 -#endif // _COMMON_MAC_DWARF_TYPES_H__
       
 52964 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/testing/GTMSenTestCase.h b/toolkit/crashreporter/google-breakpad/src/common/mac/testing/GTMSenTestCase.h
       
 52965 new file mode 100644
       
 52966 --- /dev/null
       
 52967 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/testing/GTMSenTestCase.h
       
 52968 @@ -0,0 +1,1004 @@
       
 52969 +//
       
 52970 +//  GTMSenTestCase.h
       
 52971 +//
       
 52972 +//  Copyright 2007-2008 Google Inc.
       
 52973 +//
       
 52974 +//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
       
 52975 +//  use this file except in compliance with the License.  You may obtain a copy
       
 52976 +//  of the License at
       
 52977 +// 
       
 52978 +//  http://www.apache.org/licenses/LICENSE-2.0
       
 52979 +// 
       
 52980 +//  Unless required by applicable law or agreed to in writing, software
       
 52981 +//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
       
 52982 +//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
       
 52983 +//  License for the specific language governing permissions and limitations under
       
 52984 +//  the License.
       
 52985 +//
       
 52986 +
       
 52987 +// Portions of this file fall under the following license, marked with
       
 52988 +// SENTE_BEGIN - SENTE_END
       
 52989 +//
       
 52990 +// Copyright (c) 1997-2005, Sen:te (Sente SA).  All rights reserved.
       
 52991 +//
       
 52992 +// Use of this source code is governed by the following license:
       
 52993 +// 
       
 52994 +// Redistribution and use in source and binary forms, with or without modification, 
       
 52995 +// are permitted provided that the following conditions are met:
       
 52996 +// 
       
 52997 +// (1) Redistributions of source code must retain the above copyright notice, 
       
 52998 +// this list of conditions and the following disclaimer.
       
 52999 +// 
       
 53000 +// (2) Redistributions in binary form must reproduce the above copyright notice, 
       
 53001 +// this list of conditions and the following disclaimer in the documentation 
       
 53002 +// and/or other materials provided with the distribution.
       
 53003 +// 
       
 53004 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 
       
 53005 +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
       
 53006 +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
       
 53007 +// IN NO EVENT SHALL Sente SA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
       
 53008 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
       
 53009 +// OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
       
 53010 +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
       
 53011 +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
       
 53012 +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 53013 +// 
       
 53014 +// Note: this license is equivalent to the FreeBSD license.
       
 53015 +// 
       
 53016 +// This notice may not be removed from this file.
       
 53017 +
       
 53018 +// Some extra test case macros that would have been convenient for SenTestingKit 
       
 53019 +// to provide. I didn't stick GTM in front of the Macro names, so that they would 
       
 53020 +// be easy to remember.
       
 53021 +
       
 53022 +#import "GTMDefines.h"
       
 53023 +
       
 53024 +#if (!GTM_IPHONE_SDK) 
       
 53025 +#import <SenTestingKit/SenTestingKit.h>
       
 53026 +#else
       
 53027 +#import <Foundation/Foundation.h>
       
 53028 +NSString *STComposeString(NSString *, ...);
       
 53029 +#endif
       
 53030 +
       
 53031 +// Generates a failure when a1 != noErr
       
 53032 +//  Args:
       
 53033 +//    a1: should be either an OSErr or an OSStatus
       
 53034 +//    description: A format string as in the printf() function. Can be nil or
       
 53035 +//                 an empty string but must be present.
       
 53036 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53037 +#define STAssertNoErr(a1, description, ...) \
       
 53038 +do { \
       
 53039 +  @try {\
       
 53040 +    OSStatus a1value = (a1); \
       
 53041 +    if (a1value != noErr) { \
       
 53042 +      NSString *_expression = [NSString stringWithFormat:@"Expected noErr, got %ld for (%s)", a1value, #a1]; \
       
 53043 +      if (description) { \
       
 53044 +        _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \
       
 53045 +      } \
       
 53046 +      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53047 +                                                  atLine:__LINE__ \
       
 53048 +                                         withDescription:_expression]]; \
       
 53049 +    } \
       
 53050 +  }\
       
 53051 +  @catch (id anException) {\
       
 53052 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == noErr fails", #a1] \
       
 53053 +                                              exception:anException \
       
 53054 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53055 +                                                 atLine:__LINE__ \
       
 53056 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53057 +  }\
       
 53058 +} while(0)
       
 53059 +
       
 53060 +// Generates a failure when a1 != a2
       
 53061 +//  Args:
       
 53062 +//    a1: received value. Should be either an OSErr or an OSStatus
       
 53063 +//    a2: expected value. Should be either an OSErr or an OSStatus
       
 53064 +//    description: A format string as in the printf() function. Can be nil or
       
 53065 +//                 an empty string but must be present.
       
 53066 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53067 +#define STAssertErr(a1, a2, description, ...) \
       
 53068 +do { \
       
 53069 +  @try {\
       
 53070 +    OSStatus a1value = (a1); \
       
 53071 +    OSStatus a2value = (a2); \
       
 53072 +    if (a1value != a2value) { \
       
 53073 +      NSString *_expression = [NSString stringWithFormat:@"Expected %s(%ld) but got %ld for (%s)", #a2, a2value, a1value, #a1]; \
       
 53074 +      if (description) { \
       
 53075 +        _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \
       
 53076 +      } \
       
 53077 +      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53078 +                                                  atLine:__LINE__ \
       
 53079 +                                         withDescription:_expression]]; \
       
 53080 +    } \
       
 53081 +  }\
       
 53082 +  @catch (id anException) {\
       
 53083 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == (%s) fails", #a1, #a2] \
       
 53084 +                                              exception:anException \
       
 53085 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53086 +                                                 atLine:__LINE__ \
       
 53087 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53088 +  }\
       
 53089 +} while(0)
       
 53090 +
       
 53091 +
       
 53092 +// Generates a failure when a1 is NULL
       
 53093 +//  Args:
       
 53094 +//    a1: should be a pointer (use STAssertNotNil for an object)
       
 53095 +//    description: A format string as in the printf() function. Can be nil or
       
 53096 +//                 an empty string but must be present.
       
 53097 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53098 +#define STAssertNotNULL(a1, description, ...) \
       
 53099 +do { \
       
 53100 +  @try {\
       
 53101 +    const void* a1value = (a1); \
       
 53102 +    if (a1value == NULL) { \
       
 53103 +      NSString *_expression = [NSString stringWithFormat:@"(%s) != NULL", #a1]; \
       
 53104 +      if (description) { \
       
 53105 +        _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \
       
 53106 +      } \
       
 53107 +      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53108 +                                                  atLine:__LINE__ \
       
 53109 +                                         withDescription:_expression]]; \
       
 53110 +    } \
       
 53111 +  }\
       
 53112 +  @catch (id anException) {\
       
 53113 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != NULL fails", #a1] \
       
 53114 +                                              exception:anException \
       
 53115 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53116 +                                                 atLine:__LINE__ \
       
 53117 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53118 +  }\
       
 53119 +} while(0)
       
 53120 +
       
 53121 +// Generates a failure when a1 is not NULL
       
 53122 +//  Args:
       
 53123 +//    a1: should be a pointer (use STAssertNil for an object)
       
 53124 +//    description: A format string as in the printf() function. Can be nil or
       
 53125 +//                 an empty string but must be present.
       
 53126 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53127 +#define STAssertNULL(a1, description, ...) \
       
 53128 +do { \
       
 53129 +  @try {\
       
 53130 +    const void* a1value = (a1); \
       
 53131 +    if (a1value != NULL) { \
       
 53132 +      NSString *_expression = [NSString stringWithFormat:@"(%s) == NULL", #a1]; \
       
 53133 +      if (description) { \
       
 53134 +        _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \
       
 53135 +      } \
       
 53136 +      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53137 +                                                  atLine:__LINE__ \
       
 53138 +                                         withDescription:_expression]]; \
       
 53139 +    } \
       
 53140 +  }\
       
 53141 +  @catch (id anException) {\
       
 53142 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) == NULL fails", #a1] \
       
 53143 +                                              exception:anException \
       
 53144 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53145 +                                                 atLine:__LINE__ \
       
 53146 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53147 +  }\
       
 53148 +} while(0)
       
 53149 +
       
 53150 +// Generates a failure when a1 is equal to a2. This test is for C scalars, 
       
 53151 +// structs and unions.
       
 53152 +//  Args:
       
 53153 +//    a1: argument 1
       
 53154 +//    a2: argument 2
       
 53155 +//    description: A format string as in the printf() function. Can be nil or
       
 53156 +//                 an empty string but must be present.
       
 53157 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53158 +#define STAssertNotEquals(a1, a2, description, ...) \
       
 53159 +do { \
       
 53160 +  @try {\
       
 53161 +    if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \
       
 53162 +      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53163 +                                                  atLine:__LINE__ \
       
 53164 +                                         withDescription:[[[NSString stringWithFormat:@"Type mismatch (%@/%@) -- ",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \
       
 53165 +    } else { \
       
 53166 +      __typeof__(a1) a1value = (a1); \
       
 53167 +      __typeof__(a2) a2value = (a2); \
       
 53168 +      NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \
       
 53169 +      NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \
       
 53170 +      if ([a1encoded isEqualToValue:a2encoded]) { \
       
 53171 +        NSString *_expression = [NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2]; \
       
 53172 +        if (description) { \
       
 53173 +          _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \
       
 53174 +        } \
       
 53175 +        [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53176 +                                                    atLine:__LINE__ \
       
 53177 +                                          withDescription:_expression]]; \
       
 53178 +      } \
       
 53179 +    } \
       
 53180 +  } \
       
 53181 +  @catch (id anException) {\
       
 53182 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat:@"(%s) != (%s)", #a1, #a2] \
       
 53183 +                                              exception:anException \
       
 53184 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53185 +                                                 atLine:__LINE__ \
       
 53186 +            withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53187 +  }\
       
 53188 +} while(0)
       
 53189 +
       
 53190 +// Generates a failure when a1 is equal to a2. This test is for objects.
       
 53191 +//  Args:
       
 53192 +//    a1: argument 1. object.
       
 53193 +//    a2: argument 2. object.
       
 53194 +//    description: A format string as in the printf() function. Can be nil or
       
 53195 +//                 an empty string but must be present.
       
 53196 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53197 +#define STAssertNotEqualObjects(a1, a2, desc, ...) \
       
 53198 +do { \
       
 53199 +  @try {\
       
 53200 +    id a1value = (a1); \
       
 53201 +    id a2value = (a2); \
       
 53202 +    if ( (@encode(__typeof__(a1value)) == @encode(id)) && \
       
 53203 +         (@encode(__typeof__(a2value)) == @encode(id)) && \
       
 53204 +         ![(id)a1value isEqual:(id)a2value] ) continue; \
       
 53205 +         NSString *_expression = [NSString stringWithFormat:@"%s('%@') != %s('%@')", #a1, [a1 description], #a2, [a2 description]]; \
       
 53206 +         if (desc) { \
       
 53207 +           _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(desc, ##__VA_ARGS__)]; \
       
 53208 +         } \
       
 53209 +         [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53210 +                                                     atLine:__LINE__ \
       
 53211 +                                            withDescription:_expression]]; \
       
 53212 +  }\
       
 53213 +  @catch (id anException) {\
       
 53214 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \
       
 53215 +                                              exception:anException \
       
 53216 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53217 +                                                 atLine:__LINE__ \
       
 53218 +                                        withDescription:STComposeString(desc, ##__VA_ARGS__)]]; \
       
 53219 +  }\
       
 53220 +} while(0)
       
 53221 +
       
 53222 +// Generates a failure when a1 is not 'op' to a2. This test is for C scalars. 
       
 53223 +//  Args:
       
 53224 +//    a1: argument 1
       
 53225 +//    a2: argument 2
       
 53226 +//    op: operation
       
 53227 +//    description: A format string as in the printf() function. Can be nil or
       
 53228 +//                 an empty string but must be present.
       
 53229 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53230 +#define STAssertOperation(a1, a2, op, description, ...) \
       
 53231 +do { \
       
 53232 +  @try {\
       
 53233 +    if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \
       
 53234 +      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53235 +                                                  atLine:__LINE__ \
       
 53236 +                                         withDescription:[[[NSString stringWithFormat:@"Type mismatch (%@/%@) -- ",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \
       
 53237 +    } else { \
       
 53238 +      __typeof__(a1) a1value = (a1); \
       
 53239 +      __typeof__(a2) a2value = (a2); \
       
 53240 +      if (!(a1value op a2value)) { \
       
 53241 +        double a1DoubleValue = a1value; \
       
 53242 +        double a2DoubleValue = a2value; \
       
 53243 +        NSString *_expression = [NSString stringWithFormat:@"%s (%lg) %s %s (%lg)", #a1, a1DoubleValue, #op, #a2, a2DoubleValue]; \
       
 53244 +        if (description) { \
       
 53245 +          _expression = [NSString stringWithFormat:@"%@: %@", _expression, STComposeString(description, ##__VA_ARGS__)]; \
       
 53246 +        } \
       
 53247 +        [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53248 +                                                    atLine:__LINE__ \
       
 53249 +                                           withDescription:_expression]]; \
       
 53250 +      } \
       
 53251 +    } \
       
 53252 +  } \
       
 53253 +  @catch (id anException) {\
       
 53254 +    [self failWithException:[NSException \
       
 53255 +             failureInRaise:[NSString stringWithFormat:@"(%s) %s (%s)", #a1, #op, #a2] \
       
 53256 +                  exception:anException \
       
 53257 +                     inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53258 +                     atLine:__LINE__ \
       
 53259 +            withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53260 +  }\
       
 53261 +} while(0)
       
 53262 +
       
 53263 +// Generates a failure when a1 is not > a2. This test is for C scalars. 
       
 53264 +//  Args:
       
 53265 +//    a1: argument 1
       
 53266 +//    a2: argument 2
       
 53267 +//    op: operation
       
 53268 +//    description: A format string as in the printf() function. Can be nil or
       
 53269 +//                 an empty string but must be present.
       
 53270 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53271 +#define STAssertGreaterThan(a1, a2, description, ...) \
       
 53272 +  STAssertOperation(a1, a2, >, description, ##__VA_ARGS__)
       
 53273 +
       
 53274 +// Generates a failure when a1 is not >= a2. This test is for C scalars. 
       
 53275 +//  Args:
       
 53276 +//    a1: argument 1
       
 53277 +//    a2: argument 2
       
 53278 +//    op: operation
       
 53279 +//    description: A format string as in the printf() function. Can be nil or
       
 53280 +//                 an empty string but must be present.
       
 53281 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53282 +#define STAssertGreaterThanOrEqual(a1, a2, description, ...) \
       
 53283 +  STAssertOperation(a1, a2, >=, description, ##__VA_ARGS__)
       
 53284 +
       
 53285 +// Generates a failure when a1 is not < a2. This test is for C scalars. 
       
 53286 +//  Args:
       
 53287 +//    a1: argument 1
       
 53288 +//    a2: argument 2
       
 53289 +//    op: operation
       
 53290 +//    description: A format string as in the printf() function. Can be nil or
       
 53291 +//                 an empty string but must be present.
       
 53292 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53293 +#define STAssertLessThan(a1, a2, description, ...) \
       
 53294 +  STAssertOperation(a1, a2, <, description, ##__VA_ARGS__)
       
 53295 +
       
 53296 +// Generates a failure when a1 is not <= a2. This test is for C scalars. 
       
 53297 +//  Args:
       
 53298 +//    a1: argument 1
       
 53299 +//    a2: argument 2
       
 53300 +//    op: operation
       
 53301 +//    description: A format string as in the printf() function. Can be nil or
       
 53302 +//                 an empty string but must be present.
       
 53303 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53304 +#define STAssertLessThanOrEqual(a1, a2, description, ...) \
       
 53305 +  STAssertOperation(a1, a2, <=, description, ##__VA_ARGS__)
       
 53306 +
       
 53307 +// Generates a failure when string a1 is not equal to string a2. This call
       
 53308 +// differs from STAssertEqualObjects in that strings that are different in
       
 53309 +// composition (precomposed vs decomposed) will compare equal if their final
       
 53310 +// representation is equal.
       
 53311 +// ex O + umlaut decomposed is the same as O + umlaut composed.
       
 53312 +//  Args:
       
 53313 +//    a1: string 1
       
 53314 +//    a2: string 2
       
 53315 +//    description: A format string as in the printf() function. Can be nil or
       
 53316 +//                 an empty string but must be present.
       
 53317 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53318 +#define STAssertEqualStrings(a1, a2, description, ...) \
       
 53319 +do { \
       
 53320 +  @try {\
       
 53321 +    id a1value = (a1); \
       
 53322 +    id a2value = (a2); \
       
 53323 +    if (a1value == a2value) continue; \
       
 53324 +    if ([a1value isKindOfClass:[NSString class]] && \
       
 53325 +        [a2value isKindOfClass:[NSString class]] && \
       
 53326 +        [a1value compare:a2value options:0] == NSOrderedSame) continue; \
       
 53327 +     [self failWithException:[NSException failureInEqualityBetweenObject: a1value \
       
 53328 +                                                               andObject: a2value \
       
 53329 +                                                                  inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53330 +                                                                  atLine: __LINE__ \
       
 53331 +                                                         withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53332 +  }\
       
 53333 +  @catch (id anException) {\
       
 53334 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \
       
 53335 +                                              exception:anException \
       
 53336 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53337 +                                                 atLine:__LINE__ \
       
 53338 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53339 +  }\
       
 53340 +} while(0)
       
 53341 +
       
 53342 +// Generates a failure when string a1 is equal to string a2. This call
       
 53343 +// differs from STAssertEqualObjects in that strings that are different in
       
 53344 +// composition (precomposed vs decomposed) will compare equal if their final
       
 53345 +// representation is equal.
       
 53346 +// ex O + umlaut decomposed is the same as O + umlaut composed.
       
 53347 +//  Args:
       
 53348 +//    a1: string 1
       
 53349 +//    a2: string 2
       
 53350 +//    description: A format string as in the printf() function. Can be nil or
       
 53351 +//                 an empty string but must be present.
       
 53352 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53353 +#define STAssertNotEqualStrings(a1, a2, description, ...) \
       
 53354 +do { \
       
 53355 +  @try {\
       
 53356 +    id a1value = (a1); \
       
 53357 +    id a2value = (a2); \
       
 53358 +    if ([a1value isKindOfClass:[NSString class]] && \
       
 53359 +        [a2value isKindOfClass:[NSString class]] && \
       
 53360 +        [a1value compare:a2value options:0] != NSOrderedSame) continue; \
       
 53361 +     [self failWithException:[NSException failureInEqualityBetweenObject: a1value \
       
 53362 +                                                               andObject: a2value \
       
 53363 +                                                                  inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53364 +                                                                  atLine: __LINE__ \
       
 53365 +                                                         withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53366 +  }\
       
 53367 +  @catch (id anException) {\
       
 53368 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \
       
 53369 +                                              exception:anException \
       
 53370 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53371 +                                                 atLine:__LINE__ \
       
 53372 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53373 +  }\
       
 53374 +} while(0)
       
 53375 +
       
 53376 +// Generates a failure when c-string a1 is not equal to c-string a2.
       
 53377 +//  Args:
       
 53378 +//    a1: string 1
       
 53379 +//    a2: string 2
       
 53380 +//    description: A format string as in the printf() function. Can be nil or
       
 53381 +//                 an empty string but must be present.
       
 53382 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53383 +#define STAssertEqualCStrings(a1, a2, description, ...) \
       
 53384 +do { \
       
 53385 +  @try {\
       
 53386 +    const char* a1value = (a1); \
       
 53387 +    const char* a2value = (a2); \
       
 53388 +    if (a1value == a2value) continue; \
       
 53389 +    if (strcmp(a1value, a2value) == 0) continue; \
       
 53390 +    [self failWithException:[NSException failureInEqualityBetweenObject: [NSString stringWithUTF8String:a1value] \
       
 53391 +                                                              andObject: [NSString stringWithUTF8String:a2value] \
       
 53392 +                                                                 inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53393 +                                                                 atLine: __LINE__ \
       
 53394 +                                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53395 +  }\
       
 53396 +  @catch (id anException) {\
       
 53397 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \
       
 53398 +                                              exception:anException \
       
 53399 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53400 +                                                 atLine:__LINE__ \
       
 53401 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53402 +  }\
       
 53403 +} while(0)
       
 53404 +
       
 53405 +// Generates a failure when c-string a1 is equal to c-string a2.
       
 53406 +//  Args:
       
 53407 +//    a1: string 1
       
 53408 +//    a2: string 2
       
 53409 +//    description: A format string as in the printf() function. Can be nil or
       
 53410 +//                 an empty string but must be present.
       
 53411 +//    ...: A variable number of arguments to the format string. Can be absent.
       
 53412 +#define STAssertNotEqualCStrings(a1, a2, description, ...) \
       
 53413 +do { \
       
 53414 +  @try {\
       
 53415 +    const char* a1value = (a1); \
       
 53416 +    const char* a2value = (a2); \
       
 53417 +    if (strcmp(a1value, a2value) != 0) continue; \
       
 53418 +    [self failWithException:[NSException failureInEqualityBetweenObject: [NSString stringWithUTF8String:a1value] \
       
 53419 +                                                              andObject: [NSString stringWithUTF8String:a2value] \
       
 53420 +                                                                 inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53421 +                                                                 atLine: __LINE__ \
       
 53422 +                                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53423 +  }\
       
 53424 +  @catch (id anException) {\
       
 53425 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != (%s)", #a1, #a2] \
       
 53426 +                                              exception:anException \
       
 53427 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53428 +                                                 atLine:__LINE__ \
       
 53429 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53430 +  }\
       
 53431 +} while(0)
       
 53432 +
       
 53433 +#if GTM_IPHONE_SDK
       
 53434 +
       
 53435 +// SENTE_BEGIN
       
 53436 +/*" Generates a failure when !{ [a1 isEqualTo:a2] } is false 
       
 53437 +	(or one is nil and the other is not). 
       
 53438 +	_{a1    The object on the left.}
       
 53439 +	_{a2    The object on the right.}
       
 53440 +	_{description A format string as in the printf() function. Can be nil or
       
 53441 +		an empty string but must be present.}
       
 53442 +	_{... A variable number of arguments to the format string. Can be absent.}
       
 53443 +"*/
       
 53444 +#define STAssertEqualObjects(a1, a2, description, ...) \
       
 53445 +do { \
       
 53446 +  @try {\
       
 53447 +    id a1value = (a1); \
       
 53448 +    id a2value = (a2); \
       
 53449 +    if (a1value == a2value) continue; \
       
 53450 +    if ( (@encode(__typeof__(a1value)) == @encode(id)) && \
       
 53451 +         (@encode(__typeof__(a2value)) == @encode(id)) && \
       
 53452 +         [(id)a1value isEqual: (id)a2value] ) continue; \
       
 53453 +    [self failWithException:[NSException failureInEqualityBetweenObject: a1value \
       
 53454 +                                                              andObject: a2value \
       
 53455 +                                                                 inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53456 +                                                                 atLine: __LINE__ \
       
 53457 +                                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53458 +  }\
       
 53459 +  @catch (id anException) {\
       
 53460 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \
       
 53461 +                                              exception:anException \
       
 53462 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53463 +                                                 atLine:__LINE__ \
       
 53464 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53465 +  }\
       
 53466 +} while(0)
       
 53467 +
       
 53468 +
       
 53469 +/*" Generates a failure when a1 is not equal to a2. This test is for
       
 53470 +    C scalars, structs and unions.
       
 53471 +    _{a1    The argument on the left.}
       
 53472 +    _{a2    The argument on the right.}
       
 53473 +    _{description A format string as in the printf() function. Can be nil or
       
 53474 +                        an empty string but must be present.}
       
 53475 +    _{... A variable number of arguments to the format string. Can be absent.}
       
 53476 +"*/
       
 53477 +#define STAssertEquals(a1, a2, description, ...) \
       
 53478 +do { \
       
 53479 +  @try {\
       
 53480 +    if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \
       
 53481 +      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53482 +                                                                                 atLine:__LINE__ \
       
 53483 +			       withDescription:[[NSString stringWithFormat:@"Type mismatch (%@/%@) -- ",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \
       
 53484 +    } else { \
       
 53485 +      __typeof__(a1) a1value = (a1); \
       
 53486 +      __typeof__(a2) a2value = (a2); \
       
 53487 +      NSValue *a1encoded = [NSValue value:&a1value withObjCType: @encode(__typeof__(a1))]; \
       
 53488 +      NSValue *a2encoded = [NSValue value:&a2value withObjCType: @encode(__typeof__(a2))]; \
       
 53489 +      if (![a1encoded isEqualToValue:a2encoded]) { \
       
 53490 +        [self failWithException:[NSException failureInEqualityBetweenValue: a1encoded \
       
 53491 +                                                                  andValue: a2encoded \
       
 53492 +                                                              withAccuracy: nil \
       
 53493 +                                                                    inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53494 +                                                                    atLine: __LINE__ \
       
 53495 +                                                           withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53496 +      } \
       
 53497 +    } \
       
 53498 +  } \
       
 53499 +  @catch (id anException) {\
       
 53500 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \
       
 53501 +                                              exception:anException \
       
 53502 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53503 +                                                 atLine:__LINE__ \
       
 53504 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53505 +  }\
       
 53506 +} while(0)
       
 53507 +
       
 53508 +#define STAbsoluteDifference(left,right) (MAX(left,right)-MIN(left,right))
       
 53509 +
       
 53510 +
       
 53511 +/*" Generates a failure when a1 is not equal to a2 within + or - accuracy is false. 
       
 53512 +  This test is for scalars such as floats and doubles where small differences 
       
 53513 +  could make these items not exactly equal, but also works for all scalars.
       
 53514 +  _{a1    The scalar on the left.}
       
 53515 +  _{a2    The scalar on the right.}
       
 53516 +  _{accuracy  The maximum difference between a1 and a2 for these values to be
       
 53517 +  considered equal.}
       
 53518 +  _{description A format string as in the printf() function. Can be nil or
       
 53519 +                      an empty string but must be present.}
       
 53520 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53521 +"*/
       
 53522 +
       
 53523 +#define STAssertEqualsWithAccuracy(a1, a2, accuracy, description, ...) \
       
 53524 +do { \
       
 53525 +  @try {\
       
 53526 +    if (@encode(__typeof__(a1)) != @encode(__typeof__(a2))) { \
       
 53527 +      [self failWithException:[NSException failureInFile:[NSString stringWithUTF8String:__FILE__] \
       
 53528 +                                                                                 atLine:__LINE__ \
       
 53529 +                                                                        withDescription:[[[NSString stringWithFormat:@"Type mismatch (%@/%@) -- ",@encode(__typeof__(a1)),@encode(__typeof__(a2))] stringByAppendingString:STComposeString(description, ##__VA_ARGS__)]]]; \
       
 53530 +    } else { \
       
 53531 +      __typeof__(a1) a1value = (a1); \
       
 53532 +      __typeof__(a2) a2value = (a2); \
       
 53533 +      __typeof__(accuracy) accuracyvalue = (accuracy); \
       
 53534 +      if (STAbsoluteDifference(a1value, a2value) > accuracyvalue) { \
       
 53535 +              NSValue *a1encoded = [NSValue value:&a1value withObjCType:@encode(__typeof__(a1))]; \
       
 53536 +              NSValue *a2encoded = [NSValue value:&a2value withObjCType:@encode(__typeof__(a2))]; \
       
 53537 +              NSValue *accuracyencoded = [NSValue value:&accuracyvalue withObjCType:@encode(__typeof__(accuracy))]; \
       
 53538 +              [self failWithException:[NSException failureInEqualityBetweenValue: a1encoded \
       
 53539 +                                                                        andValue: a2encoded \
       
 53540 +                                                                    withAccuracy: accuracyencoded \
       
 53541 +                                                                          inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53542 +                                                                          atLine: __LINE__ \
       
 53543 +                                                                 withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53544 +      } \
       
 53545 +    } \
       
 53546 +  } \
       
 53547 +  @catch (id anException) {\
       
 53548 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == (%s)", #a1, #a2] \
       
 53549 +                                                                         exception:anException \
       
 53550 +                                                                            inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53551 +                                                                            atLine:__LINE__ \
       
 53552 +                                                                   withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53553 +  }\
       
 53554 +} while(0)
       
 53555 +
       
 53556 +
       
 53557 +
       
 53558 +/*" Generates a failure unconditionally. 
       
 53559 +  _{description A format string as in the printf() function. Can be nil or
       
 53560 +                      an empty string but must be present.}
       
 53561 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53562 +"*/
       
 53563 +#define STFail(description, ...) \
       
 53564 +[self failWithException:[NSException failureInFile: [NSString stringWithUTF8String:__FILE__] \
       
 53565 +                                            atLine: __LINE__ \
       
 53566 +                                   withDescription: STComposeString(description, ##__VA_ARGS__)]]
       
 53567 +
       
 53568 +
       
 53569 +
       
 53570 +/*" Generates a failure when a1 is not nil.
       
 53571 +  _{a1    An object.}
       
 53572 +  _{description A format string as in the printf() function. Can be nil or
       
 53573 +    an empty string but must be present.}
       
 53574 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53575 +"*/
       
 53576 +#define STAssertNil(a1, description, ...) \
       
 53577 +do { \
       
 53578 +  @try {\
       
 53579 +    id a1value = (a1); \
       
 53580 +    if (a1value != nil) { \
       
 53581 +      NSString *_a1 = [NSString stringWithUTF8String: #a1]; \
       
 53582 +      NSString *_expression = [NSString stringWithFormat:@"((%@) == nil)", _a1]; \
       
 53583 +      [self failWithException:[NSException failureInCondition: _expression \
       
 53584 +                                                       isTrue: NO \
       
 53585 +                                                       inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53586 +                                                       atLine: __LINE__ \
       
 53587 +                                              withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53588 +    } \
       
 53589 +  }\
       
 53590 +  @catch (id anException) {\
       
 53591 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) == nil fails", #a1] \
       
 53592 +                                              exception:anException \
       
 53593 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53594 +                                                 atLine:__LINE__ \
       
 53595 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53596 +  }\
       
 53597 +} while(0)
       
 53598 +
       
 53599 +
       
 53600 +/*" Generates a failure when a1 is nil.
       
 53601 +  _{a1    An object.}
       
 53602 +  _{description A format string as in the printf() function. Can be nil or
       
 53603 +  an empty string but must be present.}
       
 53604 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53605 +"*/
       
 53606 +#define STAssertNotNil(a1, description, ...) \
       
 53607 +do { \
       
 53608 +  @try {\
       
 53609 +    id a1value = (a1); \
       
 53610 +    if (a1value == nil) { \
       
 53611 +      NSString *_a1 = [NSString stringWithUTF8String: #a1]; \
       
 53612 +      NSString *_expression = [NSString stringWithFormat:@"((%@) != nil)", _a1]; \
       
 53613 +      [self failWithException:[NSException failureInCondition: _expression \
       
 53614 +                                                       isTrue: NO \
       
 53615 +                                                       inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53616 +                                                       atLine: __LINE__ \
       
 53617 +                                              withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53618 +    } \
       
 53619 +  }\
       
 53620 +  @catch (id anException) {\
       
 53621 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) != nil fails", #a1] \
       
 53622 +                                              exception:anException \
       
 53623 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53624 +                                                 atLine:__LINE__ \
       
 53625 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53626 +  }\
       
 53627 +} while(0)
       
 53628 +
       
 53629 +
       
 53630 +/*" Generates a failure when expression evaluates to false. 
       
 53631 +  _{expr    The expression that is tested.}
       
 53632 +  _{description A format string as in the printf() function. Can be nil or
       
 53633 +  an empty string but must be present.}
       
 53634 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53635 +"*/
       
 53636 +#define STAssertTrue(expr, description, ...) \
       
 53637 +do { \
       
 53638 +  BOOL _evaluatedExpression = (expr);\
       
 53639 +  if (!_evaluatedExpression) {\
       
 53640 +    NSString *_expression = [NSString stringWithUTF8String: #expr];\
       
 53641 +    [self failWithException:[NSException failureInCondition: _expression \
       
 53642 +                                                     isTrue: NO \
       
 53643 +                                                     inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53644 +                                                     atLine: __LINE__ \
       
 53645 +                                            withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53646 +  } \
       
 53647 +} while (0)
       
 53648 +
       
 53649 +
       
 53650 +/*" Generates a failure when expression evaluates to false and in addition will 
       
 53651 +  generate error messages if an exception is encountered. 
       
 53652 +  _{expr    The expression that is tested.}
       
 53653 +  _{description A format string as in the printf() function. Can be nil or
       
 53654 +  an empty string but must be present.}
       
 53655 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53656 +"*/
       
 53657 +#define STAssertTrueNoThrow(expr, description, ...) \
       
 53658 +do { \
       
 53659 +  @try {\
       
 53660 +    BOOL _evaluatedExpression = (expr);\
       
 53661 +    if (!_evaluatedExpression) {\
       
 53662 +      NSString *_expression = [NSString stringWithUTF8String: #expr];\
       
 53663 +      [self failWithException:[NSException failureInCondition: _expression \
       
 53664 +                                                       isTrue: NO \
       
 53665 +                                                       inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53666 +                                                       atLine: __LINE__ \
       
 53667 +                                              withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53668 +    } \
       
 53669 +  } \
       
 53670 +  @catch (id anException) {\
       
 53671 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"(%s) ", #expr] \
       
 53672 +                                              exception:anException \
       
 53673 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53674 +                                                 atLine:__LINE__ \
       
 53675 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53676 +  }\
       
 53677 +} while (0)
       
 53678 +
       
 53679 +
       
 53680 +/*" Generates a failure when the expression evaluates to true. 
       
 53681 +  _{expr    The expression that is tested.}
       
 53682 +  _{description A format string as in the printf() function. Can be nil or
       
 53683 +  an empty string but must be present.}
       
 53684 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53685 +"*/
       
 53686 +#define STAssertFalse(expr, description, ...) \
       
 53687 +do { \
       
 53688 +  BOOL _evaluatedExpression = (expr);\
       
 53689 +  if (_evaluatedExpression) {\
       
 53690 +    NSString *_expression = [NSString stringWithUTF8String: #expr];\
       
 53691 +    [self failWithException:[NSException failureInCondition: _expression \
       
 53692 +                                                     isTrue: YES \
       
 53693 +                                                     inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53694 +                                                     atLine: __LINE__ \
       
 53695 +                                            withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53696 +  } \
       
 53697 +} while (0)
       
 53698 +
       
 53699 +
       
 53700 +/*" Generates a failure when the expression evaluates to true and in addition 
       
 53701 +  will generate error messages if an exception is encountered.
       
 53702 +  _{expr    The expression that is tested.}
       
 53703 +  _{description A format string as in the printf() function. Can be nil or
       
 53704 +  an empty string but must be present.}
       
 53705 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53706 +"*/
       
 53707 +#define STAssertFalseNoThrow(expr, description, ...) \
       
 53708 +do { \
       
 53709 +  @try {\
       
 53710 +    BOOL _evaluatedExpression = (expr);\
       
 53711 +    if (_evaluatedExpression) {\
       
 53712 +      NSString *_expression = [NSString stringWithUTF8String: #expr];\
       
 53713 +      [self failWithException:[NSException failureInCondition: _expression \
       
 53714 +                                                       isTrue: YES \
       
 53715 +                                                       inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53716 +                                                       atLine: __LINE__ \
       
 53717 +                                              withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53718 +    } \
       
 53719 +  } \
       
 53720 +  @catch (id anException) {\
       
 53721 +    [self failWithException:[NSException failureInRaise:[NSString stringWithFormat: @"!(%s) ", #expr] \
       
 53722 +                                              exception:anException \
       
 53723 +                                                 inFile:[NSString stringWithUTF8String:__FILE__] \
       
 53724 +                                                 atLine:__LINE__ \
       
 53725 +                                        withDescription:STComposeString(description, ##__VA_ARGS__)]]; \
       
 53726 +  }\
       
 53727 +} while (0)
       
 53728 +
       
 53729 +
       
 53730 +/*" Generates a failure when expression does not throw an exception. 
       
 53731 +  _{expression    The expression that is evaluated.}
       
 53732 +  _{description A format string as in the printf() function. Can be nil or
       
 53733 +  an empty string but must be present.}
       
 53734 +  _{... A variable number of arguments to the format string. Can be absent.
       
 53735 +"*/
       
 53736 +#define STAssertThrows(expr, description, ...) \
       
 53737 +do { \
       
 53738 +  @try { \
       
 53739 +    (expr);\
       
 53740 +  } \
       
 53741 +  @catch (id anException) { \
       
 53742 +    continue; \
       
 53743 +  }\
       
 53744 +  [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53745 +                                            exception: nil \
       
 53746 +                                               inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53747 +                                               atLine: __LINE__ \
       
 53748 +                                      withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53749 +} while (0)
       
 53750 +
       
 53751 +
       
 53752 +/*" Generates a failure when expression does not throw an exception of a 
       
 53753 +  specific class. 
       
 53754 +  _{expression    The expression that is evaluated.}
       
 53755 +  _{specificException    The specified class of the exception.}
       
 53756 +  _{description A format string as in the printf() function. Can be nil or
       
 53757 +  an empty string but must be present.}
       
 53758 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53759 +"*/
       
 53760 +#define STAssertThrowsSpecific(expr, specificException, description, ...) \
       
 53761 +do { \
       
 53762 +  @try { \
       
 53763 +    (expr);\
       
 53764 +  } \
       
 53765 +  @catch (specificException *anException) { \
       
 53766 +    continue; \
       
 53767 +  }\
       
 53768 +  @catch (id anException) {\
       
 53769 +    NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\
       
 53770 +    [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53771 +                                              exception: anException \
       
 53772 +                                                 inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53773 +                                                 atLine: __LINE__ \
       
 53774 +                                        withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \
       
 53775 +                                            continue; \
       
 53776 +  }\
       
 53777 +  NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\
       
 53778 +  [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53779 +                                            exception: nil \
       
 53780 +                                               inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53781 +                                               atLine: __LINE__ \
       
 53782 +                                      withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \
       
 53783 +} while (0)
       
 53784 +
       
 53785 +
       
 53786 +/*" Generates a failure when expression does not throw an exception of a 
       
 53787 +  specific class with a specific name.  Useful for those frameworks like
       
 53788 +  AppKit or Foundation that throw generic NSException w/specific names 
       
 53789 +  (NSInvalidArgumentException, etc).
       
 53790 +  _{expression    The expression that is evaluated.}
       
 53791 +  _{specificException    The specified class of the exception.}
       
 53792 +  _{aName    The name of the specified exception.}
       
 53793 +  _{description A format string as in the printf() function. Can be nil or
       
 53794 +  an empty string but must be present.}
       
 53795 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53796 +
       
 53797 +"*/
       
 53798 +#define STAssertThrowsSpecificNamed(expr, specificException, aName, description, ...) \
       
 53799 +do { \
       
 53800 +  @try { \
       
 53801 +    (expr);\
       
 53802 +  } \
       
 53803 +  @catch (specificException *anException) { \
       
 53804 +    if ([aName isEqualToString: [anException name]]) continue; \
       
 53805 +    NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description);\
       
 53806 +    [self failWithException: \
       
 53807 +      [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53808 +                        exception: anException \
       
 53809 +                           inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53810 +                           atLine: __LINE__ \
       
 53811 +                  withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \
       
 53812 +    continue; \
       
 53813 +  }\
       
 53814 +  @catch (id anException) {\
       
 53815 +    NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\
       
 53816 +    [self failWithException: \
       
 53817 +      [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53818 +                        exception: anException \
       
 53819 +                           inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53820 +                           atLine: __LINE__ \
       
 53821 +                  withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \
       
 53822 +    continue; \
       
 53823 +  }\
       
 53824 +  NSString *_descrip = STComposeString(@"(Expected exception: %@) %@", NSStringFromClass([specificException class]), description);\
       
 53825 +  [self failWithException: \
       
 53826 +    [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53827 +                      exception: nil \
       
 53828 +                         inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53829 +                         atLine: __LINE__ \
       
 53830 +                withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \
       
 53831 +} while (0)
       
 53832 +
       
 53833 +
       
 53834 +/*" Generates a failure when expression does throw an exception. 
       
 53835 +  _{expression    The expression that is evaluated.}
       
 53836 +  _{description A format string as in the printf() function. Can be nil or
       
 53837 +  an empty string but must be present.}
       
 53838 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53839 +"*/
       
 53840 +#define STAssertNoThrow(expr, description, ...) \
       
 53841 +do { \
       
 53842 +  @try { \
       
 53843 +    (expr);\
       
 53844 +  } \
       
 53845 +  @catch (id anException) { \
       
 53846 +    [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53847 +                                              exception: anException \
       
 53848 +                                                 inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53849 +                                                 atLine: __LINE__ \
       
 53850 +                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53851 +  }\
       
 53852 +} while (0)
       
 53853 +
       
 53854 +
       
 53855 +/*" Generates a failure when expression does throw an exception of the specitied
       
 53856 +  class. Any other exception is okay (i.e. does not generate a failure).
       
 53857 +  _{expression    The expression that is evaluated.}
       
 53858 +  _{specificException    The specified class of the exception.}
       
 53859 +  _{description A format string as in the printf() function. Can be nil or
       
 53860 +  an empty string but must be present.}
       
 53861 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53862 +"*/
       
 53863 +#define STAssertNoThrowSpecific(expr, specificException, description, ...) \
       
 53864 +do { \
       
 53865 +  @try { \
       
 53866 +    (expr);\
       
 53867 +  } \
       
 53868 +  @catch (specificException *anException) { \
       
 53869 +    [self failWithException:[NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53870 +                                              exception: anException \
       
 53871 +                                                 inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53872 +                                                 atLine: __LINE__ \
       
 53873 +                                        withDescription: STComposeString(description, ##__VA_ARGS__)]]; \
       
 53874 +  }\
       
 53875 +  @catch (id anythingElse) {\
       
 53876 +    ; \
       
 53877 +  }\
       
 53878 +} while (0)
       
 53879 +
       
 53880 +
       
 53881 +/*" Generates a failure when expression does throw an exception of a 
       
 53882 +  specific class with a specific name.  Useful for those frameworks like
       
 53883 +  AppKit or Foundation that throw generic NSException w/specific names 
       
 53884 +  (NSInvalidArgumentException, etc).
       
 53885 +  _{expression    The expression that is evaluated.}
       
 53886 +  _{specificException    The specified class of the exception.}
       
 53887 +  _{aName    The name of the specified exception.}
       
 53888 +  _{description A format string as in the printf() function. Can be nil or
       
 53889 +  an empty string but must be present.}
       
 53890 +  _{... A variable number of arguments to the format string. Can be absent.}
       
 53891 +
       
 53892 +"*/
       
 53893 +#define STAssertNoThrowSpecificNamed(expr, specificException, aName, description, ...) \
       
 53894 +do { \
       
 53895 +  @try { \
       
 53896 +    (expr);\
       
 53897 +  } \
       
 53898 +  @catch (specificException *anException) { \
       
 53899 +    if ([aName isEqualToString: [anException name]]) { \
       
 53900 +      NSString *_descrip = STComposeString(@"(Expected exception: %@ (name: %@)) %@", NSStringFromClass([specificException class]), aName, description);\
       
 53901 +      [self failWithException: \
       
 53902 +        [NSException failureInRaise: [NSString stringWithUTF8String:#expr] \
       
 53903 +                          exception: anException \
       
 53904 +                             inFile: [NSString stringWithUTF8String:__FILE__] \
       
 53905 +                             atLine: __LINE__ \
       
 53906 +                    withDescription: STComposeString(_descrip, ##__VA_ARGS__)]]; \
       
 53907 +    } \
       
 53908 +    continue; \
       
 53909 +  }\
       
 53910 +  @catch (id anythingElse) {\
       
 53911 +    ; \
       
 53912 +  }\
       
 53913 +} while (0)
       
 53914 +
       
 53915 +
       
 53916 +
       
 53917 +@interface NSException (GTMSenTestAdditions)
       
 53918 ++ (NSException *)failureInFile:(NSString *)filename 
       
 53919 +                        atLine:(int)lineNumber 
       
 53920 +               withDescription:(NSString *)formatString, ...;
       
 53921 ++ (NSException *)failureInCondition:(NSString *)condition 
       
 53922 +                             isTrue:(BOOL)isTrue 
       
 53923 +                             inFile:(NSString *)filename 
       
 53924 +                             atLine:(int)lineNumber 
       
 53925 +                    withDescription:(NSString *)formatString, ...;
       
 53926 ++ (NSException *)failureInEqualityBetweenObject:(id)left
       
 53927 +                                      andObject:(id)right
       
 53928 +                                         inFile:(NSString *)filename
       
 53929 +                                         atLine:(int)lineNumber
       
 53930 +                                withDescription:(NSString *)formatString, ...;
       
 53931 ++ (NSException *)failureInEqualityBetweenValue:(NSValue *)left 
       
 53932 +                                      andValue:(NSValue *)right 
       
 53933 +                                  withAccuracy:(NSValue *)accuracy 
       
 53934 +                                        inFile:(NSString *)filename 
       
 53935 +                                        atLine:(int) ineNumber
       
 53936 +                               withDescription:(NSString *)formatString, ...;
       
 53937 ++ (NSException *)failureInRaise:(NSString *)expression 
       
 53938 +                         inFile:(NSString *)filename 
       
 53939 +                         atLine:(int)lineNumber
       
 53940 +                withDescription:(NSString *)formatString, ...;
       
 53941 ++ (NSException *)failureInRaise:(NSString *)expression 
       
 53942 +                      exception:(NSException *)exception 
       
 53943 +                         inFile:(NSString *)filename 
       
 53944 +                         atLine:(int)lineNumber 
       
 53945 +                withDescription:(NSString *)formatString, ...;
       
 53946 +@end
       
 53947 +
       
 53948 +// SENTE_END
       
 53949 +
       
 53950 +@interface SenTestCase : NSObject {
       
 53951 +  SEL currentSelector_;
       
 53952 +}
       
 53953 +
       
 53954 +- (void)setUp;
       
 53955 +- (void)invokeTest;
       
 53956 +- (void)tearDown;
       
 53957 +- (void)performTest:(SEL)sel;
       
 53958 +- (void)failWithException:(NSException*)exception;
       
 53959 +@end
       
 53960 +
       
 53961 +GTM_EXTERN NSString *const SenTestFailureException;
       
 53962 +
       
 53963 +GTM_EXTERN NSString *const SenTestFilenameKey;
       
 53964 +GTM_EXTERN NSString *const SenTestLineNumberKey;
       
 53965 +
       
 53966 +#endif // GTM_IPHONE_SDK
       
 53967 +
       
 53968 +// All unittest cases in GTM should inherit from GTMTestCase. It makes sure
       
 53969 +// to set up our logging system correctly to verify logging calls.
       
 53970 +// See GTMUnitTestDevLog.h for details
       
 53971 +@interface GTMTestCase : SenTestCase
       
 53972 +@end
       
 53973 diff --git a/toolkit/crashreporter/google-breakpad/src/common/mac/testing/GTMSenTestCase.m b/toolkit/crashreporter/google-breakpad/src/common/mac/testing/GTMSenTestCase.m
       
 53974 new file mode 100644
       
 53975 --- /dev/null
       
 53976 +++ b/toolkit/crashreporter/google-breakpad/src/common/mac/testing/GTMSenTestCase.m
       
 53977 @@ -0,0 +1,366 @@
       
 53978 +//
       
 53979 +//  GTMSenTestCase.m
       
 53980 +//
       
 53981 +//  Copyright 2007-2008 Google Inc.
       
 53982 +//
       
 53983 +//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
       
 53984 +//  use this file except in compliance with the License.  You may obtain a copy
       
 53985 +//  of the License at
       
 53986 +//
       
 53987 +//  http://www.apache.org/licenses/LICENSE-2.0
       
 53988 +//
       
 53989 +//  Unless required by applicable law or agreed to in writing, software
       
 53990 +//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
       
 53991 +//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
       
 53992 +//  License for the specific language governing permissions and limitations under
       
 53993 +//  the License.
       
 53994 +//
       
 53995 +
       
 53996 +#import "GTMSenTestCase.h"
       
 53997 +#import <unistd.h>
       
 53998 +
       
 53999 +#if !GTM_IPHONE_SDK
       
 54000 +#import "GTMGarbageCollection.h"
       
 54001 +#endif  // !GTM_IPHONE_SDK
       
 54002 +
       
 54003 +#if GTM_IPHONE_SDK
       
 54004 +#import <stdarg.h>
       
 54005 +
       
 54006 +@interface NSException (GTMSenTestPrivateAdditions)
       
 54007 ++ (NSException *)failureInFile:(NSString *)filename
       
 54008 +                        atLine:(int)lineNumber
       
 54009 +                        reason:(NSString *)reason;
       
 54010 +@end
       
 54011 +
       
 54012 +@implementation NSException (GTMSenTestPrivateAdditions)
       
 54013 ++ (NSException *)failureInFile:(NSString *)filename
       
 54014 +                        atLine:(int)lineNumber
       
 54015 +                        reason:(NSString *)reason {
       
 54016 +  NSDictionary *userInfo =
       
 54017 +    [NSDictionary dictionaryWithObjectsAndKeys:
       
 54018 +     [NSNumber numberWithInteger:lineNumber], SenTestLineNumberKey,
       
 54019 +     filename, SenTestFilenameKey,
       
 54020 +     nil];
       
 54021 +
       
 54022 +  return [self exceptionWithName:SenTestFailureException
       
 54023 +                          reason:reason
       
 54024 +                        userInfo:userInfo];
       
 54025 +}
       
 54026 +@end
       
 54027 +
       
 54028 +@implementation NSException (GTMSenTestAdditions)
       
 54029 +
       
 54030 ++ (NSException *)failureInFile:(NSString *)filename
       
 54031 +                        atLine:(int)lineNumber
       
 54032 +               withDescription:(NSString *)formatString, ... {
       
 54033 +
       
 54034 +  NSString *testDescription = @"";
       
 54035 +  if (formatString) {
       
 54036 +    va_list vl;
       
 54037 +    va_start(vl, formatString);
       
 54038 +    testDescription =
       
 54039 +      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];
       
 54040 +    va_end(vl);
       
 54041 +  }
       
 54042 +
       
 54043 +  NSString *reason = testDescription;
       
 54044 +
       
 54045 +  return [self failureInFile:filename atLine:lineNumber reason:reason];
       
 54046 +}
       
 54047 +
       
 54048 ++ (NSException *)failureInCondition:(NSString *)condition
       
 54049 +                             isTrue:(BOOL)isTrue
       
 54050 +                             inFile:(NSString *)filename
       
 54051 +                             atLine:(int)lineNumber
       
 54052 +                    withDescription:(NSString *)formatString, ... {
       
 54053 +
       
 54054 +  NSString *testDescription = @"";
       
 54055 +  if (formatString) {
       
 54056 +    va_list vl;
       
 54057 +    va_start(vl, formatString);
       
 54058 +    testDescription =
       
 54059 +      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];
       
 54060 +    va_end(vl);
       
 54061 +  }
       
 54062 +
       
 54063 +  NSString *reason = [NSString stringWithFormat:@"'%@' should be %s. %@",
       
 54064 +                      condition, isTrue ? "TRUE" : "FALSE", testDescription];
       
 54065 +
       
 54066 +  return [self failureInFile:filename atLine:lineNumber reason:reason];
       
 54067 +}
       
 54068 +
       
 54069 ++ (NSException *)failureInEqualityBetweenObject:(id)left
       
 54070 +                                      andObject:(id)right
       
 54071 +                                         inFile:(NSString *)filename
       
 54072 +                                         atLine:(int)lineNumber
       
 54073 +                                withDescription:(NSString *)formatString, ... {
       
 54074 +
       
 54075 +  NSString *testDescription = @"";
       
 54076 +  if (formatString) {
       
 54077 +    va_list vl;
       
 54078 +    va_start(vl, formatString);
       
 54079 +    testDescription =
       
 54080 +      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];
       
 54081 +    va_end(vl);
       
 54082 +  }
       
 54083 +
       
 54084 +  NSString *reason =
       
 54085 +    [NSString stringWithFormat:@"'%@' should be equal to '%@'. %@",
       
 54086 +     [left description], [right description], testDescription];
       
 54087 +
       
 54088 +  return [self failureInFile:filename atLine:lineNumber reason:reason];
       
 54089 +}
       
 54090 +
       
 54091 ++ (NSException *)failureInEqualityBetweenValue:(NSValue *)left
       
 54092 +                                      andValue:(NSValue *)right
       
 54093 +                                  withAccuracy:(NSValue *)accuracy
       
 54094 +                                        inFile:(NSString *)filename
       
 54095 +                                        atLine:(int)lineNumber
       
 54096 +                               withDescription:(NSString *)formatString, ... {
       
 54097 +
       
 54098 +  NSString *testDescription = @"";
       
 54099 +  if (formatString) {
       
 54100 +    va_list vl;
       
 54101 +    va_start(vl, formatString);
       
 54102 +    testDescription =
       
 54103 +      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];
       
 54104 +    va_end(vl);
       
 54105 +  }
       
 54106 +
       
 54107 +  NSString *reason;
       
 54108 +  if (accuracy) {
       
 54109 +    reason =
       
 54110 +      [NSString stringWithFormat:@"'%@' should be equal to '%@'. %@",
       
 54111 +       left, right, testDescription];
       
 54112 +  } else {
       
 54113 +    reason =
       
 54114 +      [NSString stringWithFormat:@"'%@' should be equal to '%@' +/-'%@'. %@",
       
 54115 +       left, right, accuracy, testDescription];
       
 54116 +  }
       
 54117 +
       
 54118 +  return [self failureInFile:filename atLine:lineNumber reason:reason];
       
 54119 +}
       
 54120 +
       
 54121 ++ (NSException *)failureInRaise:(NSString *)expression
       
 54122 +                         inFile:(NSString *)filename
       
 54123 +                         atLine:(int)lineNumber
       
 54124 +                withDescription:(NSString *)formatString, ... {
       
 54125 +
       
 54126 +  NSString *testDescription = @"";
       
 54127 +  if (formatString) {
       
 54128 +    va_list vl;
       
 54129 +    va_start(vl, formatString);
       
 54130 +    testDescription =
       
 54131 +      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];
       
 54132 +    va_end(vl);
       
 54133 +  }
       
 54134 +
       
 54135 +  NSString *reason = [NSString stringWithFormat:@"'%@' should raise. %@",
       
 54136 +                      expression, testDescription];
       
 54137 +
       
 54138 +  return [self failureInFile:filename atLine:lineNumber reason:reason];
       
 54139 +}
       
 54140 +
       
 54141 ++ (NSException *)failureInRaise:(NSString *)expression
       
 54142 +                      exception:(NSException *)exception
       
 54143 +                         inFile:(NSString *)filename
       
 54144 +                         atLine:(int)lineNumber
       
 54145 +                withDescription:(NSString *)formatString, ... {
       
 54146 +
       
 54147 +  NSString *testDescription = @"";
       
 54148 +  if (formatString) {
       
 54149 +    va_list vl;
       
 54150 +    va_start(vl, formatString);
       
 54151 +    testDescription =
       
 54152 +      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];
       
 54153 +    va_end(vl);
       
 54154 +  }
       
 54155 +
       
 54156 +  NSString *reason;
       
 54157 +  if ([[exception name] isEqualToString:SenTestFailureException]) {
       
 54158 +    // it's our exception, assume it has the right description on it.
       
 54159 +    reason = [exception reason];
       
 54160 +  } else {
       
 54161 +    // not one of our exception, use the exceptions reason and our description
       
 54162 +    reason = [NSString stringWithFormat:@"'%@' raised '%@'. %@",
       
 54163 +              expression, [exception reason], testDescription];
       
 54164 +  }
       
 54165 +
       
 54166 +  return [self failureInFile:filename atLine:lineNumber reason:reason];
       
 54167 +}
       
 54168 +
       
 54169 +@end
       
 54170 +
       
 54171 +NSString *STComposeString(NSString *formatString, ...) {
       
 54172 +  NSString *reason = @"";
       
 54173 +  if (formatString) {
       
 54174 +    va_list vl;
       
 54175 +    va_start(vl, formatString);
       
 54176 +    reason =
       
 54177 +      [[[NSString alloc] initWithFormat:formatString arguments:vl] autorelease];
       
 54178 +    va_end(vl);
       
 54179 +  }
       
 54180 +  return reason;
       
 54181 +}
       
 54182 +
       
 54183 +NSString *const SenTestFailureException = @"SenTestFailureException";
       
 54184 +NSString *const SenTestFilenameKey = @"SenTestFilenameKey";
       
 54185 +NSString *const SenTestLineNumberKey = @"SenTestLineNumberKey";
       
 54186 +
       
 54187 +@interface SenTestCase (SenTestCasePrivate)
       
 54188 +// our method of logging errors
       
 54189 ++ (void)printException:(NSException *)exception fromTestName:(NSString *)name;
       
 54190 +@end
       
 54191 +
       
 54192 +@implementation SenTestCase
       
 54193 +- (void)failWithException:(NSException*)exception {
       
 54194 +  [exception raise];
       
 54195 +}
       
 54196 +
       
 54197 +- (void)setUp {
       
 54198 +}
       
 54199 +
       
 54200 +- (void)performTest:(SEL)sel {
       
 54201 +  currentSelector_ = sel;
       
 54202 +  @try {
       
 54203 +    [self invokeTest];
       
 54204 +  } @catch (NSException *exception) {
       
 54205 +    [[self class] printException:exception
       
 54206 +                    fromTestName:NSStringFromSelector(sel)];
       
 54207 +    [exception raise];
       
 54208 +  }
       
 54209 +}
       
 54210 +
       
 54211 ++ (void)printException:(NSException *)exception fromTestName:(NSString *)name {
       
 54212 +  NSDictionary *userInfo = [exception userInfo];
       
 54213 +  NSString *filename = [userInfo objectForKey:SenTestFilenameKey];
       
 54214 +  NSNumber *lineNumber = [userInfo objectForKey:SenTestLineNumberKey];
       
 54215 +  NSString *className = NSStringFromClass([self class]);
       
 54216 +  if ([filename length] == 0) {
       
 54217 +    filename = @"Unknown.m";
       
 54218 +  }
       
 54219 +  fprintf(stderr, "%s:%ld: error: -[%s %s] : %s\n",
       
 54220 +          [filename UTF8String],
       
 54221 +          (long)[lineNumber integerValue],
       
 54222 +          [className UTF8String],
       
 54223 +          [name UTF8String],
       
 54224 +          [[exception reason] UTF8String]);
       
 54225 +  fflush(stderr);
       
 54226 +}
       
 54227 +
       
 54228 +- (void)invokeTest {
       
 54229 +  NSException *e = nil;
       
 54230 +  @try {
       
 54231 +    // Wrap things in autorelease pools because they may
       
 54232 +    // have an STMacro in their dealloc which may get called
       
 54233 +    // when the pool is cleaned up
       
 54234 +    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
       
 54235 +    // We don't log exceptions here, instead we let the person that called
       
 54236 +    // this log the exception.  This ensures they are only logged once but the
       
 54237 +    // outer layers get the exceptions to report counts, etc.
       
 54238 +    @try {
       
 54239 +      [self setUp];
       
 54240 +      @try {
       
 54241 +        [self performSelector:currentSelector_];
       
 54242 +      } @catch (NSException *exception) {
       
 54243 +        e = [exception retain];
       
 54244 +      }
       
 54245 +      [self tearDown];
       
 54246 +    } @catch (NSException *exception) {
       
 54247 +      e = [exception retain];
       
 54248 +    }
       
 54249 +    [pool release];
       
 54250 +  } @catch (NSException *exception) {
       
 54251 +    e = [exception retain];
       
 54252 +  }
       
 54253 +  if (e) {
       
 54254 +    [e autorelease];
       
 54255 +    [e raise];
       
 54256 +  }
       
 54257 +}
       
 54258 +
       
 54259 +- (void)tearDown {
       
 54260 +}
       
 54261 +
       
 54262 +- (NSString *)description {
       
 54263 +  // This matches the description OCUnit would return to you
       
 54264 +  return [NSString stringWithFormat:@"-[%@ %@]", [self class], 
       
 54265 +          NSStringFromSelector(currentSelector_)];
       
 54266 +}
       
 54267 +@end
       
 54268 +
       
 54269 +#endif  // GTM_IPHONE_SDK
       
 54270 +
       
 54271 +@implementation GTMTestCase : SenTestCase
       
 54272 +- (void)invokeTest {
       
 54273 +  Class devLogClass = NSClassFromString(@"GTMUnitTestDevLog");
       
 54274 +  if (devLogClass) {
       
 54275 +    [devLogClass performSelector:@selector(enableTracking)];
       
 54276 +    [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)];
       
 54277 +
       
 54278 +  }
       
 54279 +  [super invokeTest];
       
 54280 +  if (devLogClass) {
       
 54281 +    [devLogClass performSelector:@selector(verifyNoMoreLogsExpected)];
       
 54282 +    [devLogClass performSelector:@selector(disableTracking)];
       
 54283 +  }
       
 54284 +}
       
 54285 +@end
       
 54286 +
       
 54287 +// Leak detection
       
 54288 +#if !GTM_IPHONE_DEVICE
       
 54289 +// Don't want to get leaks on the iPhone Device as the device doesn't
       
 54290 +// have 'leaks'. The simulator does though.
       
 54291 +
       
 54292 +// COV_NF_START
       
 54293 +// We don't have leak checking on by default, so this won't be hit.
       
 54294 +static void _GTMRunLeaks(void) {
       
 54295 +  // This is an atexit handler. It runs leaks for us to check if we are 
       
 54296 +  // leaking anything in our tests. 
       
 54297 +  const char* cExclusionsEnv = getenv("GTM_LEAKS_SYMBOLS_TO_IGNORE");
       
 54298 +  NSMutableString *exclusions = [NSMutableString string];
       
 54299 +  if (cExclusionsEnv) {
       
 54300 +    NSString *exclusionsEnv = [NSString stringWithUTF8String:cExclusionsEnv];
       
 54301 +    NSArray *exclusionsArray = [exclusionsEnv componentsSeparatedByString:@","];
       
 54302 +    NSString *exclusion;
       
 54303 +    NSCharacterSet *wcSet = [NSCharacterSet whitespaceCharacterSet];
       
 54304 +    GTM_FOREACH_OBJECT(exclusion, exclusionsArray) {
       
 54305 +      exclusion = [exclusion stringByTrimmingCharactersInSet:wcSet];
       
 54306 +      [exclusions appendFormat:@"-exclude \"%@\" ", exclusion];
       
 54307 +    }
       
 54308 +  }
       
 54309 +  NSString *string 
       
 54310 +    = [NSString stringWithFormat:@"/usr/bin/leaks %@%d"
       
 54311 +       @"| /usr/bin/sed -e 's/Leak: /Leaks:0: warning: Leak /'", 
       
 54312 +       exclusions, getpid()];
       
 54313 +  int ret = system([string UTF8String]);
       
 54314 +  if (ret) {
       
 54315 +    fprintf(stderr, "%s:%d: Error: Unable to run leaks. 'system' returned: %d", 
       
 54316 +            __FILE__, __LINE__, ret);
       
 54317 +    fflush(stderr);
       
 54318 +  }
       
 54319 +}
       
 54320 +// COV_NF_END
       
 54321 +
       
 54322 +static __attribute__((constructor)) void _GTMInstallLeaks(void) {
       
 54323 +  BOOL checkLeaks = YES;
       
 54324 +#if !GTM_IPHONE_SDK
       
 54325 +  checkLeaks = GTMIsGarbageCollectionEnabled() ? NO : YES;
       
 54326 +#endif  // !GTM_IPHONE_SDK
       
 54327 +  if (checkLeaks) {
       
 54328 +    checkLeaks = getenv("GTM_ENABLE_LEAKS") ? YES : NO;
       
 54329 +    if (checkLeaks) {
       
 54330 +      // COV_NF_START
       
 54331 +      // We don't have leak checking on by default, so this won't be hit.
       
 54332 +      fprintf(stderr, "Leak Checking Enabled\n");
       
 54333 +      fflush(stderr);
       
 54334 +      int ret = atexit(&_GTMRunLeaks);
       
 54335 +      _GTMDevAssert(ret == 0, 
       
 54336 +                    @"Unable to install _GTMRunLeaks as an atexit handler (%d)", 
       
 54337 +                    errno);
       
 54338 +      // COV_NF_END
       
 54339 +    }  
       
 54340 +  }
       
 54341 +}
       
 54342 +
       
 54343 +#endif   // !GTM_IPHONE_DEVICE
       
 54344 diff --git a/toolkit/crashreporter/google-breakpad/src/common/solaris/dump_symbols.cc b/toolkit/crashreporter/google-breakpad/src/common/solaris/dump_symbols.cc
       
 54345 --- a/toolkit/crashreporter/google-breakpad/src/common/solaris/dump_symbols.cc
       
 54346 +++ b/toolkit/crashreporter/google-breakpad/src/common/solaris/dump_symbols.cc
       
 54347 @@ -171,34 +171,35 @@ inline void RecalculateOffset(struct sli
       
 54348    }
       
 54349    // Skip the extra '\0'
       
 54350    ++stringOffset;
       
 54351  }
       
 54352  
       
 54353  // Demangle using demangle library on Solaris.
       
 54354  std::string Demangle(const char *mangled) {
       
 54355    int status = 0;
       
 54356 +  std::string str(mangled);
       
 54357    char *demangled = (char *)malloc(demangleLen);
       
 54358 +
       
 54359    if (!demangled) {
       
 54360      fprintf(stderr, "no enough memory.\n");
       
 54361      goto out;
       
 54362    }
       
 54363  
       
 54364    if ((status = cplus_demangle(mangled, demangled, demangleLen)) ==
       
 54365        DEMANGLE_ESPACE) {
       
 54366      fprintf(stderr, "incorrect demangle.\n");
       
 54367      goto out;
       
 54368    }
       
 54369  
       
 54370 -  std::string str(demangled);
       
 54371 +  str = demangled;
       
 54372    free(demangled);
       
 54373 -  return str;
       
 54374  
       
 54375  out:
       
 54376 -  return std::string(mangled);
       
 54377 +  return str; 
       
 54378  }
       
 54379  
       
 54380  bool WriteFormat(int fd, const char *fmt, ...) {
       
 54381    va_list list;
       
 54382    char buffer[4096];
       
 54383    ssize_t expected, written;
       
 54384    va_start(list, fmt);
       
 54385    vsnprintf(buffer, sizeof(buffer), fmt, list);
       
 54386 @@ -645,17 +646,17 @@ bool DumpSymbols::WriteSymbolFile(const 
       
 54387    if (obj_fd < 0)
       
 54388      return false;
       
 54389    FDWrapper obj_fd_wrapper(obj_fd);
       
 54390    struct stat st;
       
 54391    if (fstat(obj_fd, &st) != 0 && st.st_size <= 0)
       
 54392      return false;
       
 54393    void *obj_base = mmap(NULL, st.st_size,
       
 54394                          PROT_READ, MAP_PRIVATE, obj_fd, 0);
       
 54395 -  if (!obj_base)
       
 54396 +  if (obj_base == MAP_FAILED))
       
 54397      return false;
       
 54398    MmapWrapper map_wrapper(obj_base, st.st_size);
       
 54399    GElf_Ehdr elf_header;
       
 54400    Elf *elf = elf_begin(obj_fd, ELF_C_READ, NULL);
       
 54401    AutoElfEnder elfEnder(elf);
       
 54402  
       
 54403    if (gelf_getehdr(elf, &elf_header) == (GElf_Ehdr *)NULL) {
       
 54404      fprintf(stderr, "failed to read elf header: %s\n", elf_errmsg(-1));
       
 54405 diff --git a/toolkit/crashreporter/google-breakpad/src/common/solaris/file_id.cc b/toolkit/crashreporter/google-breakpad/src/common/solaris/file_id.cc
       
 54406 --- a/toolkit/crashreporter/google-breakpad/src/common/solaris/file_id.cc
       
 54407 +++ b/toolkit/crashreporter/google-breakpad/src/common/solaris/file_id.cc
       
 54408 @@ -146,17 +146,17 @@ bool FileID::ElfFileIdentifier(unsigned 
       
 54409      return false;
       
 54410  
       
 54411    AutoCloser autocloser(fd);
       
 54412    struct stat st;
       
 54413    if (fstat(fd, &st) != 0 || st.st_size <= 0)
       
 54414      return false;
       
 54415  
       
 54416    void *base = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
       
 54417 -  if (!base)
       
 54418 +  if (base == MAP_FAILED)
       
 54419      return false;
       
 54420  
       
 54421    bool success = false;
       
 54422    const void *text_section = NULL;
       
 54423    int text_size = 0;
       
 54424  
       
 54425    if (FindElfTextSection(fd, base, &text_section, &text_size)) {
       
 54426      MD5Context md5;
       
 54427 diff --git a/toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.cc b/toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.cc
       
 54428 --- a/toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.cc
       
 54429 +++ b/toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.cc
       
 54430 @@ -25,17 +25,17 @@
       
 54431  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 54432  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 54433  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 54434  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 54435  
       
 54436  #include <assert.h>
       
 54437  
       
 54438  // Disable exception handler warnings.
       
 54439 -#pragma warning( disable : 4530 ) 
       
 54440 +#pragma warning( disable : 4530 )
       
 54441  
       
 54442  #include <fstream>
       
 54443  
       
 54444  #include "common/windows/string_utils-inl.h"
       
 54445  
       
 54446  #include "common/windows/http_upload.h"
       
 54447  
       
 54448  namespace google_breakpad {
       
 54449 @@ -61,22 +61,23 @@ class HTTPUpload::AutoInternetHandle {
       
 54450    HINTERNET handle_;
       
 54451  };
       
 54452  
       
 54453  // static
       
 54454  bool HTTPUpload::SendRequest(const wstring &url,
       
 54455                               const map<wstring, wstring> &parameters,
       
 54456                               const wstring &upload_file,
       
 54457                               const wstring &file_part_name,
       
 54458 +                             int *timeout,
       
 54459                               wstring *response_body,
       
 54460                               int *response_code) {
       
 54461    if (response_code) {
       
 54462      *response_code = 0;
       
 54463    }
       
 54464 -                               
       
 54465 +
       
 54466    // TODO(bryner): support non-ASCII parameter names
       
 54467    if (!CheckParameters(parameters)) {
       
 54468      return false;
       
 54469    }
       
 54470  
       
 54471    // Break up the URL and make sure we can handle it
       
 54472    wchar_t scheme[16], host[256], path[256];
       
 54473    URL_COMPONENTS components;
       
 54474 @@ -141,16 +142,32 @@ bool HTTPUpload::SendRequest(const wstri
       
 54475                          HTTP_ADDREQ_FLAG_ADD);
       
 54476  
       
 54477    string request_body;
       
 54478    if (!GenerateRequestBody(parameters, upload_file,
       
 54479                             file_part_name, boundary, &request_body)) {
       
 54480      return false;
       
 54481    }
       
 54482  
       
 54483 +  if (timeout) {
       
 54484 +    if (!InternetSetOption(request.get(),
       
 54485 +                           INTERNET_OPTION_SEND_TIMEOUT,
       
 54486 +                           timeout,
       
 54487 +                           sizeof(timeout))) {
       
 54488 +      fwprintf(stderr, L"Could not unset send timeout, continuing...\n");
       
 54489 +    }
       
 54490 +
       
 54491 +    if (!InternetSetOption(request.get(),
       
 54492 +                           INTERNET_OPTION_RECEIVE_TIMEOUT,
       
 54493 +                           timeout,
       
 54494 +                           sizeof(timeout))) {
       
 54495 +      fwprintf(stderr, L"Could not unset receive timeout, continuing...\n");
       
 54496 +    }
       
 54497 +  }
       
 54498 +  
       
 54499    if (!HttpSendRequest(request.get(), NULL, 0,
       
 54500                         const_cast<char *>(request_body.data()),
       
 54501                         static_cast<DWORD>(request_body.size()))) {
       
 54502      return false;
       
 54503    }
       
 54504  
       
 54505    // The server indicates a successful upload with HTTP status 200.
       
 54506    wchar_t http_status[4];
       
 54507 @@ -189,27 +206,29 @@ bool HTTPUpload::ReadResponse(HINTERNET 
       
 54508      has_content_length_header = true;
       
 54509      claimed_size = wcstol(content_length, NULL, 10);
       
 54510      response_body.reserve(claimed_size);
       
 54511    }
       
 54512  
       
 54513  
       
 54514    DWORD bytes_available;
       
 54515    DWORD total_read = 0;
       
 54516 -  bool return_code;
       
 54517 +  BOOL return_code;
       
 54518  
       
 54519 -  while ((return_code = InternetQueryDataAvailable(request, &bytes_available,
       
 54520 -                                                   0, 0) != 0) &&
       
 54521 -          bytes_available > 0) {
       
 54522 +  while (((return_code = InternetQueryDataAvailable(request, &bytes_available,
       
 54523 +	  0, 0)) != 0) && bytes_available > 0) {
       
 54524 +
       
 54525      vector<char> response_buffer(bytes_available);
       
 54526      DWORD size_read;
       
 54527  
       
 54528 -    if ((return_code = InternetReadFile(request, &response_buffer[0],
       
 54529 -                                        bytes_available, &size_read) != 0) &&
       
 54530 -        size_read > 0) {
       
 54531 +    return_code = InternetReadFile(request,
       
 54532 +                                   &response_buffer[0],
       
 54533 +                                   bytes_available, &size_read);
       
 54534 +
       
 54535 +    if (return_code && size_read > 0) {
       
 54536        total_read += size_read;
       
 54537        response_body.append(&response_buffer[0], size_read);
       
 54538      } else {
       
 54539        break;
       
 54540      }
       
 54541    }
       
 54542  
       
 54543    bool succeeded = return_code && (!has_content_length_header ||
       
 54544 @@ -311,17 +330,17 @@ void HTTPUpload::GetFileContents(const w
       
 54545  #if _MSC_VER >= 1400  // MSVC 2005/8
       
 54546    ifstream file;
       
 54547    file.open(filename.c_str(), ios::binary);
       
 54548  #else  // _MSC_VER >= 1400
       
 54549    ifstream file(_wfopen(filename.c_str(), L"rb"));
       
 54550  #endif  // _MSC_VER >= 1400
       
 54551    if (file.is_open()) {
       
 54552      file.seekg(0, ios::end);
       
 54553 -    int length = file.tellg();
       
 54554 +    std::streamoff length = file.tellg();
       
 54555      contents->resize(length);
       
 54556      if (length != 0) {
       
 54557          file.seekg(0, ios::beg);
       
 54558          file.read(&((*contents)[0]), length);
       
 54559      }
       
 54560      file.close();
       
 54561    } else {
       
 54562      contents->clear();
       
 54563 diff --git a/toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.h b/toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.h
       
 54564 --- a/toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.h
       
 54565 +++ b/toolkit/crashreporter/google-breakpad/src/common/windows/http_upload.h
       
 54566 @@ -64,16 +64,17 @@ class HTTPUpload {
       
 54567    // If the request is successful and response_body is non-NULL,
       
 54568    // the response body will be returned in response_body.
       
 54569    // If response_code is non-NULL, it will be set to the HTTP response code
       
 54570    // received (or 0 if the request failed before getting an HTTP response).
       
 54571    static bool SendRequest(const wstring &url,
       
 54572                            const map<wstring, wstring> &parameters,
       
 54573                            const wstring &upload_file,
       
 54574                            const wstring &file_part_name,
       
 54575 +                          int *timeout,
       
 54576                            wstring *response_body,
       
 54577                            int *response_code);
       
 54578  
       
 54579   private:
       
 54580    class AutoInternetHandle;
       
 54581  
       
 54582    // Retrieves the HTTP response.  If NULL is passed in for response,
       
 54583    // this merely checks (via the return value) that we were successfully
       
 54584 diff --git a/toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.cc b/toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.cc
       
 54585 --- a/toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.cc
       
 54586 +++ b/toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.cc
       
 54587 @@ -113,45 +113,48 @@ bool PDBSourceLineWriter::PrintLines(IDi
       
 54588      }
       
 54589  
       
 54590      DWORD length;
       
 54591      if (FAILED(line->get_length(&length))) {
       
 54592        fprintf(stderr, "failed to get line code length\n");
       
 54593        return false;
       
 54594      }
       
 54595  
       
 54596 -    DWORD source_id;
       
 54597 -    if (FAILED(line->get_sourceFileId(&source_id))) {
       
 54598 +    DWORD dia_source_id;
       
 54599 +    if (FAILED(line->get_sourceFileId(&dia_source_id))) {
       
 54600        fprintf(stderr, "failed to get line source file id\n");
       
 54601        return false;
       
 54602      }
       
 54603 +    // duplicate file names are coalesced to share one ID
       
 54604 +    DWORD source_id = GetRealFileID(dia_source_id);
       
 54605  
       
 54606      DWORD line_num;
       
 54607      if (FAILED(line->get_lineNumber(&line_num))) {
       
 54608        fprintf(stderr, "failed to get line number\n");
       
 54609        return false;
       
 54610      }
       
 54611  
       
 54612      fprintf(output_, "%x %x %d %d\n", rva, length, line_num, source_id);
       
 54613      line.Release();
       
 54614    }
       
 54615    return true;
       
 54616  }
       
 54617  
       
 54618 -bool PDBSourceLineWriter::PrintFunction(IDiaSymbol *function) {
       
 54619 +bool PDBSourceLineWriter::PrintFunction(IDiaSymbol *function,
       
 54620 +                                        IDiaSymbol *block) {
       
 54621    // The function format is:
       
 54622    // FUNC <address> <length> <param_stack_size> <function>
       
 54623    DWORD rva;
       
 54624 -  if (FAILED(function->get_relativeVirtualAddress(&rva))) {
       
 54625 +  if (FAILED(block->get_relativeVirtualAddress(&rva))) {
       
 54626      fprintf(stderr, "couldn't get rva\n");
       
 54627      return false;
       
 54628    }
       
 54629  
       
 54630    ULONGLONG length;
       
 54631 -  if (FAILED(function->get_length(&length))) {
       
 54632 +  if (FAILED(block->get_length(&length))) {
       
 54633      fprintf(stderr, "failed to get function length\n");
       
 54634      return false;
       
 54635    }
       
 54636  
       
 54637    if (length == 0) {
       
 54638      // Silently ignore zero-length functions, which can infrequently pop up.
       
 54639      return true;
       
 54640    }
       
 54641 @@ -210,17 +213,26 @@ bool PDBSourceLineWriter::PrintSourceFil
       
 54642          return false;
       
 54643        }
       
 54644  
       
 54645        CComBSTR file_name;
       
 54646        if (FAILED(file->get_fileName(&file_name))) {
       
 54647          return false;
       
 54648        }
       
 54649  
       
 54650 -      fwprintf(output_, L"FILE %d %s\n", file_id, file_name);
       
 54651 +      wstring file_name_string(file_name);
       
 54652 +      if (!FileIDIsCached(file_name_string)) {
       
 54653 +        // this is a new file name, cache it and output a FILE line.
       
 54654 +        CacheFileID(file_name_string, file_id);
       
 54655 +        fwprintf(output_, L"FILE %d %s\n", file_id, file_name);
       
 54656 +      } else {
       
 54657 +        // this file name has already been seen, just save this
       
 54658 +        // ID for later lookup.
       
 54659 +        StoreDuplicateFileID(file_name_string, file_id);
       
 54660 +      }
       
 54661        file.Release();
       
 54662      }
       
 54663      compiland.Release();
       
 54664    }
       
 54665    return true;
       
 54666  }
       
 54667  
       
 54668  bool PDBSourceLineWriter::PrintFunctions() {
       
 54669 @@ -250,27 +262,85 @@ bool PDBSourceLineWriter::PrintFunctions
       
 54670        return false;
       
 54671      }
       
 54672  
       
 54673      // For a given function, DIA seems to give either a symbol with
       
 54674      // SymTagFunction or SymTagPublicSymbol, but not both.  This means
       
 54675      // that PDBSourceLineWriter will output either a FUNC or PUBLIC line,
       
 54676      // but not both.
       
 54677      if (tag == SymTagFunction) {
       
 54678 -      if (!PrintFunction(symbol)) {
       
 54679 +      if (!PrintFunction(symbol, symbol)) {
       
 54680          return false;
       
 54681        }
       
 54682      } else if (tag == SymTagPublicSymbol) {
       
 54683        if (!PrintCodePublicSymbol(symbol)) {
       
 54684          return false;
       
 54685        }
       
 54686      }
       
 54687      symbol.Release();
       
 54688    } while (SUCCEEDED(symbols->Next(1, &symbol, &count)) && count == 1);
       
 54689  
       
 54690 +  // When building with PGO, the compiler can split functions into
       
 54691 +  // "hot" and "cold" blocks, and move the "cold" blocks out to separate
       
 54692 +  // pages, so the function can be noncontiguous. To find these blocks,
       
 54693 +  // we have to iterate over all the compilands, and then find blocks
       
 54694 +  // that are children of them. We can then find the lexical parents
       
 54695 +  // of those blocks and print out an extra FUNC line for blocks
       
 54696 +  // that are not contained in their parent functions.
       
 54697 +  CComPtr<IDiaSymbol> global;
       
 54698 +  if (FAILED(session_->get_globalScope(&global))) {
       
 54699 +    fprintf(stderr, "get_globalScope failed\n");
       
 54700 +    return false;
       
 54701 +  }
       
 54702 +
       
 54703 +  CComPtr<IDiaEnumSymbols> compilands;
       
 54704 +  if (FAILED(global->findChildren(SymTagCompiland, NULL,
       
 54705 +                                  nsNone, &compilands))) {
       
 54706 +    fprintf(stderr, "findChildren failed on the global\n");
       
 54707 +    return false;
       
 54708 +  }
       
 54709 +
       
 54710 +  CComPtr<IDiaSymbol> compiland;
       
 54711 +  while (SUCCEEDED(compilands->Next(1, &compiland, &count)) && count == 1) {
       
 54712 +    CComPtr<IDiaEnumSymbols> blocks;
       
 54713 +    if (FAILED(compiland->findChildren(SymTagBlock, NULL,
       
 54714 +                                       nsNone, &blocks))) {
       
 54715 +      fprintf(stderr, "findChildren failed on a compiland\n");
       
 54716 +      return false;
       
 54717 +    }
       
 54718 +
       
 54719 +    CComPtr<IDiaSymbol> block;
       
 54720 +    while (SUCCEEDED(blocks->Next(1, &block, &count)) && count == 1) {
       
 54721 +      // find this block's lexical parent function
       
 54722 +      CComPtr<IDiaSymbol> parent;
       
 54723 +      DWORD tag;
       
 54724 +      if (SUCCEEDED(block->get_lexicalParent(&parent)) &&
       
 54725 +          SUCCEEDED(parent->get_symTag(&tag)) &&
       
 54726 +          tag == SymTagFunction) {
       
 54727 +        // now get the block's offset and the function's offset and size,
       
 54728 +        // and determine if the block is outside of the function
       
 54729 +        DWORD func_rva, block_rva;
       
 54730 +        ULONGLONG func_length;
       
 54731 +        if (SUCCEEDED(block->get_relativeVirtualAddress(&block_rva)) &&
       
 54732 +            SUCCEEDED(parent->get_relativeVirtualAddress(&func_rva)) &&
       
 54733 +            SUCCEEDED(parent->get_length(&func_length))) {
       
 54734 +          if (block_rva < func_rva || block_rva > (func_rva + func_length)) {
       
 54735 +            if (!PrintFunction(parent, block)) {
       
 54736 +              return false;
       
 54737 +            }
       
 54738 +          }
       
 54739 +        }
       
 54740 +      }
       
 54741 +      parent.Release();
       
 54742 +      block.Release();
       
 54743 +    }
       
 54744 +    blocks.Release();
       
 54745 +    compiland.Release();
       
 54746 +  }
       
 54747 +
       
 54748    return true;
       
 54749  }
       
 54750  
       
 54751  bool PDBSourceLineWriter::PrintFrameData() {
       
 54752    // It would be nice if it were possible to output frame data alongside the
       
 54753    // associated function, as is done with line numbers, but the DIA API
       
 54754    // doesn't make it possible to get the frame data in that way.
       
 54755  
       
 54756 diff --git a/toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.h b/toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.h
       
 54757 --- a/toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.h
       
 54758 +++ b/toolkit/crashreporter/google-breakpad/src/common/windows/pdb_source_line_writer.h
       
 54759 @@ -30,25 +30,27 @@
       
 54760  // PDBSourceLineWriter uses a pdb file produced by Visual C++ to output
       
 54761  // a line/address map for use with BasicSourceLineResolver.
       
 54762  
       
 54763  #ifndef _PDB_SOURCE_LINE_WRITER_H__
       
 54764  #define _PDB_SOURCE_LINE_WRITER_H__
       
 54765  
       
 54766  #include <atlcomcli.h>
       
 54767  
       
 54768 +#include <hash_map>
       
 54769  #include <string>
       
 54770  
       
 54771  struct IDiaEnumLineNumbers;
       
 54772  struct IDiaSession;
       
 54773  struct IDiaSymbol;
       
 54774  
       
 54775  namespace google_breakpad {
       
 54776  
       
 54777  using std::wstring;
       
 54778 +using stdext::hash_map;
       
 54779  
       
 54780  // A structure that carries information that identifies a pdb file.
       
 54781  struct PDBModuleInfo {
       
 54782   public:
       
 54783    // The basename of the pdb file from which information was loaded.
       
 54784    wstring debug_file;
       
 54785  
       
 54786    // The pdb's identifier.  For recent pdb files, the identifier consists
       
 54787 @@ -106,18 +108,21 @@ class PDBSourceLineWriter {
       
 54788    bool UsesGUID(bool *uses_guid);
       
 54789  
       
 54790   private:
       
 54791    // Outputs the line/address pairs for each line in the enumerator.
       
 54792    // Returns true on success.
       
 54793    bool PrintLines(IDiaEnumLineNumbers *lines);
       
 54794  
       
 54795    // Outputs a function address and name, followed by its source line list.
       
 54796 +  // block can be the same object as function, or it can be a reference
       
 54797 +  // to a code block that is lexically part of this function, but
       
 54798 +  // resides at a separate address.
       
 54799    // Returns true on success.
       
 54800 -  bool PrintFunction(IDiaSymbol *function);
       
 54801 +  bool PrintFunction(IDiaSymbol *function, IDiaSymbol *block);
       
 54802  
       
 54803    // Outputs all functions as described above.  Returns true on success.
       
 54804    bool PrintFunctions();
       
 54805  
       
 54806    // Outputs all of the source files in the session's pdb file.
       
 54807    // Returns true on success.
       
 54808    bool PrintSourceFiles();
       
 54809  
       
 54810 @@ -129,16 +134,47 @@ class PDBSourceLineWriter {
       
 54811    // to a code address.  Returns true on success.  If symbol is does not
       
 54812    // correspond to code, returns true without outputting anything.
       
 54813    bool PrintCodePublicSymbol(IDiaSymbol *symbol);
       
 54814  
       
 54815    // Outputs a line identifying the PDB file that is being dumped, along with
       
 54816    // its uuid and age.
       
 54817    bool PrintPDBInfo();
       
 54818  
       
 54819 +  // Returns true if this filename has already been seen,
       
 54820 +  // and an ID is stored for it, or false if it has not.
       
 54821 +  bool FileIDIsCached(const wstring &file) {
       
 54822 +    return unique_files_.find(file) != unique_files_.end();
       
 54823 +  };
       
 54824 +
       
 54825 +  // Cache this filename and ID for later reuse.
       
 54826 +  void CacheFileID(const wstring &file, DWORD id) {
       
 54827 +    unique_files_[file] = id;
       
 54828 +  };
       
 54829 +
       
 54830 +  // Store this ID in the cache as a duplicate for this filename.
       
 54831 +  void StoreDuplicateFileID(const wstring &file, DWORD id) {
       
 54832 +    hash_map<wstring, DWORD>::iterator iter = unique_files_.find(file);
       
 54833 +    if (iter != unique_files_.end()) {
       
 54834 +      // map this id to the previously seen one
       
 54835 +      file_ids_[id] = iter->second;
       
 54836 +    }
       
 54837 +  };
       
 54838 +
       
 54839 +  // Given a file's unique ID, return the ID that should be used to
       
 54840 +  // reference it. There may be multiple files with identical filenames
       
 54841 +  // but different unique IDs. The cache attempts to coalesce these into
       
 54842 +  // one ID per unique filename.
       
 54843 +  DWORD GetRealFileID(DWORD id) {
       
 54844 +    hash_map<DWORD, DWORD>::iterator iter = file_ids_.find(id);
       
 54845 +    if (iter == file_ids_.end())
       
 54846 +      return id;
       
 54847 +    return iter->second;
       
 54848 +  };
       
 54849 +
       
 54850    // Returns the function name for a symbol.  If possible, the name is
       
 54851    // undecorated.  If the symbol's decorated form indicates the size of
       
 54852    // parameters on the stack, this information is returned in stack_param_size.
       
 54853    // Returns true on success.  If the symbol doesn't encode parameter size
       
 54854    // information, stack_param_size is set to -1.
       
 54855    static bool GetSymbolFunctionName(IDiaSymbol *function, BSTR *name,
       
 54856                                      int *stack_param_size);
       
 54857  
       
 54858 @@ -148,16 +184,23 @@ class PDBSourceLineWriter {
       
 54859    static int GetFunctionStackParamSize(IDiaSymbol *function);
       
 54860  
       
 54861    // The session for the currently-open pdb file.
       
 54862    CComPtr<IDiaSession> session_;
       
 54863  
       
 54864    // The current output file for this WriteMap invocation.
       
 54865    FILE *output_;
       
 54866  
       
 54867 +  // There may be many duplicate filenames with different IDs.
       
 54868 +  // This maps from the DIA "unique ID" to a single ID per unique
       
 54869 +  // filename.
       
 54870 +  hash_map<DWORD, DWORD> file_ids_;
       
 54871 +  // This maps unique filenames to file IDs.
       
 54872 +  hash_map<wstring, DWORD> unique_files_;
       
 54873 +
       
 54874    // Disallow copy ctor and operator=
       
 54875    PDBSourceLineWriter(const PDBSourceLineWriter&);
       
 54876    void operator=(const PDBSourceLineWriter&);
       
 54877  };
       
 54878  
       
 54879  }  // namespace google_breakpad
       
 54880  
       
 54881  #endif  // _PDB_SOURCE_LINE_WRITER_H__
       
 54882 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_arm.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_arm.h
       
 54883 new file mode 100644
       
 54884 --- /dev/null
       
 54885 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_arm.h
       
 54886 @@ -0,0 +1,130 @@
       
 54887 +/* Copyright (c) 2009, Google Inc.
       
 54888 + * All rights reserved.
       
 54889 + *
       
 54890 + * Redistribution and use in source and binary forms, with or without
       
 54891 + * modification, are permitted provided that the following conditions are
       
 54892 + * met:
       
 54893 + *
       
 54894 + *     * Redistributions of source code must retain the above copyright
       
 54895 + * notice, this list of conditions and the following disclaimer.
       
 54896 + *     * Redistributions in binary form must reproduce the above
       
 54897 + * copyright notice, this list of conditions and the following disclaimer
       
 54898 + * in the documentation and/or other materials provided with the
       
 54899 + * distribution.
       
 54900 + *     * Neither the name of Google Inc. nor the names of its
       
 54901 + * contributors may be used to endorse or promote products derived from
       
 54902 + * this software without specific prior written permission.
       
 54903 + *
       
 54904 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 54905 + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 54906 + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 54907 + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 54908 + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 54909 + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 54910 + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 54911 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 54912 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 54913 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 54914 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
       
 54915 +
       
 54916 +/* minidump_format.h: A cross-platform reimplementation of minidump-related
       
 54917 + * portions of DbgHelp.h from the Windows Platform SDK.
       
 54918 + *
       
 54919 + * (This is C99 source, please don't corrupt it with C++.)
       
 54920 + *
       
 54921 + * This file contains the necessary definitions to read minidump files
       
 54922 + * produced on ARM.  These files may be read on any platform provided
       
 54923 + * that the alignments of these structures on the processing system are
       
 54924 + * identical to the alignments of these structures on the producing system.
       
 54925 + * For this reason, precise-sized types are used.  The structures defined
       
 54926 + * by this file have been laid out to minimize alignment problems by
       
 54927 + * ensuring that all members are aligned on their natural boundaries.
       
 54928 + * In some cases, tail-padding may be significant when different ABIs specify
       
 54929 + * different tail-padding behaviors.  To avoid problems when reading or
       
 54930 + * writing affected structures, MD_*_SIZE macros are provided where needed,
       
 54931 + * containing the useful size of the structures without padding.
       
 54932 + *
       
 54933 + * Structures that are defined by Microsoft to contain a zero-length array
       
 54934 + * are instead defined here to contain an array with one element, as
       
 54935 + * zero-length arrays are forbidden by standard C and C++.  In these cases,
       
 54936 + * *_minsize constants are provided to be used in place of sizeof.  For a
       
 54937 + * cleaner interface to these sizes when using C++, see minidump_size.h.
       
 54938 + *
       
 54939 + * These structures are also sufficient to populate minidump files.
       
 54940 + *
       
 54941 + * Because precise data type sizes are crucial for this implementation to
       
 54942 + * function properly and portably, a set of primitive types with known sizes
       
 54943 + * are used as the basis of each structure defined by this file.
       
 54944 + *
       
 54945 + * Author: Julian Seward
       
 54946 + */
       
 54947 +
       
 54948 +/*
       
 54949 + * ARM support
       
 54950 + */
       
 54951 +
       
 54952 +#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__
       
 54953 +#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__
       
 54954 +
       
 54955 +#define MD_FLOATINGSAVEAREA_ARM_FPR_COUNT 32
       
 54956 +#define MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT 8
       
 54957 +
       
 54958 +/*
       
 54959 + * Note that these structures *do not* map directly to the CONTEXT
       
 54960 + * structure defined in WinNT.h in the Windows Mobile SDK. That structure
       
 54961 + * does not accomodate VFPv3, and I'm unsure if it was ever used in the
       
 54962 + * wild anyway, as Windows CE only seems to produce "cedumps" which
       
 54963 + * are not exactly minidumps.
       
 54964 + */
       
 54965 +typedef struct {
       
 54966 +  u_int64_t	fpscr;      /* FPU status register */
       
 54967 +
       
 54968 +  /* 32 64-bit floating point registers, d0 .. d31. */
       
 54969 +  u_int64_t	regs[MD_FLOATINGSAVEAREA_ARM_FPR_COUNT];
       
 54970 +
       
 54971 +  /* Miscellaneous control words */
       
 54972 +  u_int32_t     extra[MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT];
       
 54973 +} MDFloatingSaveAreaARM;
       
 54974 +
       
 54975 +#define MD_CONTEXT_ARM_GPR_COUNT 16
       
 54976 +
       
 54977 +typedef struct {
       
 54978 +  /* The next field determines the layout of the structure, and which parts
       
 54979 +   * of it are populated
       
 54980 +   */
       
 54981 +  u_int32_t	context_flags;
       
 54982 +
       
 54983 +  /* 16 32-bit integer registers, r0 .. r15
       
 54984 +   * Note the following fixed uses:
       
 54985 +   *   r13 is the stack pointer
       
 54986 +   *   r14 is the link register
       
 54987 +   *   r15 is the program counter
       
 54988 +   */
       
 54989 +  u_int32_t     iregs[MD_CONTEXT_ARM_GPR_COUNT];
       
 54990 +
       
 54991 +  /* CPSR (flags, basically): 32 bits:
       
 54992 +        bit 31 - N (negative)
       
 54993 +        bit 30 - Z (zero)
       
 54994 +        bit 29 - C (carry)
       
 54995 +        bit 28 - V (overflow)
       
 54996 +        bit 27 - Q (saturation flag, sticky)
       
 54997 +     All other fields -- ignore */
       
 54998 +  u_int32_t    cpsr;
       
 54999 +
       
 55000 +  /* The next field is included with MD_CONTEXT_ARM_FLOATING_POINT */
       
 55001 +  MDFloatingSaveAreaARM float_save;
       
 55002 +
       
 55003 +} MDRawContextARM;
       
 55004 +
       
 55005 +/* For (MDRawContextARM).context_flags.  These values indicate the type of
       
 55006 + * context stored in the structure. */
       
 55007 +#define MD_CONTEXT_ARM_INTEGER           (MD_CONTEXT_ARM | 0x00000002)
       
 55008 +#define MD_CONTEXT_ARM_FLOATING_POINT    (MD_CONTEXT_ARM | 0x00000004)
       
 55009 +
       
 55010 +#define MD_CONTEXT_ARM_FULL              (MD_CONTEXT_ARM_INTEGER | \
       
 55011 +                                          MD_CONTEXT_ARM_FLOATING_POINT)
       
 55012 +
       
 55013 +#define MD_CONTEXT_ARM_ALL               (MD_CONTEXT_ARM_INTEGER | \
       
 55014 +                                          MD_CONTEXT_ARM_FLOATING_POINT)
       
 55015 +
       
 55016 +#endif  /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ */
       
 55017 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc.h
       
 55018 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc.h
       
 55019 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc.h
       
 55020 @@ -102,17 +102,21 @@ typedef struct {
       
 55021  } MDVectorSaveAreaPPC;  /* ppc_vector_state */
       
 55022  
       
 55023  
       
 55024  #define MD_CONTEXT_PPC_GPR_COUNT 32
       
 55025  
       
 55026  /* Use the same 32-bit alignment when accessing this structure from 64-bit code
       
 55027   * as is used natively in 32-bit code.  #pragma pack is a MSVC extension
       
 55028   * supported by gcc. */
       
 55029 +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
       
 55030 +#pragma pack(4)
       
 55031 +#else
       
 55032  #pragma pack(push, 4)
       
 55033 +#endif
       
 55034  
       
 55035  typedef struct {
       
 55036    /* context_flags is not present in ppc_thread_state, but it aids
       
 55037     * identification of MDRawContextPPC among other raw context types,
       
 55038     * and it guarantees alignment when we get to float_save. */
       
 55039    u_int32_t             context_flags;
       
 55040  
       
 55041    u_int32_t             srr0;    /* Machine status save/restore: stores pc
       
 55042 @@ -131,17 +135,21 @@ typedef struct {
       
 55043  
       
 55044    /* float_save and vector_save aren't present in ppc_thread_state, but
       
 55045     * are represented in separate structures that still define a thread's
       
 55046     * context. */
       
 55047    MDFloatingSaveAreaPPC float_save;
       
 55048    MDVectorSaveAreaPPC   vector_save;
       
 55049  } MDRawContextPPC;  /* Based on ppc_thread_state */
       
 55050  
       
 55051 +#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
       
 55052 +#pragma pack(0)
       
 55053 +#else
       
 55054  #pragma pack(pop)
       
 55055 +#endif
       
 55056  
       
 55057  /* For (MDRawContextPPC).context_flags.  These values indicate the type of
       
 55058   * context stored in the structure.  MD_CONTEXT_PPC is Breakpad-defined.  Its
       
 55059   * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other
       
 55060   * CPUs. */
       
 55061  #define MD_CONTEXT_PPC                0x20000000
       
 55062  #define MD_CONTEXT_PPC_BASE           (MD_CONTEXT_PPC | 0x00000001)
       
 55063  #define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008)
       
 55064 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_win32.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_win32.h
       
 55065 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_win32.h
       
 55066 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_exception_win32.h
       
 55067 @@ -89,14 +89,17 @@ typedef enum {
       
 55068    MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO   = 0xc0000094,
       
 55069        /* EXCEPTION_INT_DIVIDE_BY_ZERO */
       
 55070    MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW         = 0xc0000095,
       
 55071        /* EXCEPTION_INT_OVERFLOW */
       
 55072    MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION   = 0xc0000096,
       
 55073        /* EXCEPTION_PRIV_INSTRUCTION */
       
 55074    MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW           = 0xc00000fd,
       
 55075        /* EXCEPTION_STACK_OVERFLOW */
       
 55076 -  MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK        = 0xc0000194
       
 55077 +  MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK        = 0xc0000194,
       
 55078        /* EXCEPTION_POSSIBLE_DEADLOCK */
       
 55079 +  MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION  = 0xe06d7363
       
 55080 +      /* Per http://support.microsoft.com/kb/185294,
       
 55081 +         generated by Visual C++ compiler */
       
 55082  } MDExceptionCodeWin;
       
 55083  
       
 55084  
       
 55085  #endif  /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ */
       
 55086 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_format.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_format.h
       
 55087 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_format.h
       
 55088 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/common/minidump_format.h
       
 55089 @@ -107,22 +107,22 @@ typedef struct {
       
 55090  
       
 55091  /* This is a base type for MDRawContextX86 and MDRawContextPPC.  This
       
 55092   * structure should never be allocated directly.  The actual structure type
       
 55093   * can be determined by examining the context_flags field. */
       
 55094  typedef struct {
       
 55095    u_int32_t context_flags;
       
 55096  } MDRawContextBase;
       
 55097  
       
 55098 +#include "minidump_cpu_amd64.h"
       
 55099 +#include "minidump_cpu_arm.h"
       
 55100 +#include "minidump_cpu_ppc.h"
       
 55101 +#include "minidump_cpu_ppc64.h"
       
 55102  #include "minidump_cpu_sparc.h"
       
 55103  #include "minidump_cpu_x86.h"
       
 55104 -#include "minidump_cpu_ppc.h"
       
 55105 -#include "minidump_cpu_ppc64.h"
       
 55106 -#include "minidump_cpu_amd64.h"
       
 55107 -
       
 55108  
       
 55109  /*
       
 55110   * WinVer.h
       
 55111   */
       
 55112  
       
 55113  
       
 55114  typedef struct {
       
 55115    u_int32_t signature;
       
 55116 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/basic_source_line_resolver.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/basic_source_line_resolver.h
       
 55117 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/basic_source_line_resolver.h
       
 55118 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/basic_source_line_resolver.h
       
 55119 @@ -28,79 +28,61 @@
       
 55120  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 55121  
       
 55122  // BasicSourceLineResolver implements SourceLineResolverInterface, using
       
 55123  // address map files produced by a compatible writer, e.g. PDBSourceLineWriter.
       
 55124  
       
 55125  #ifndef GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__
       
 55126  #define GOOGLE_BREAKPAD_PROCESSOR_BASIC_SOURCE_LINE_RESOLVER_H__
       
 55127  
       
 55128 -// TODO: Platforms that have no hash_map can use map, at the likely cost of
       
 55129 -// performance.
       
 55130 -#ifdef __SUNPRO_CC
       
 55131 -#define BSLR_NO_HASH_MAP
       
 55132 -#endif  // __SUNPRO_CC
       
 55133 -
       
 55134 -#ifdef BSLR_NO_HASH_MAP
       
 55135  #include <map>
       
 55136 -#else  // BSLR_NO_HASH_MAP
       
 55137 -#include <ext/hash_map>
       
 55138 -#endif  // BSLR_NO_HASH_MAP
       
 55139  
       
 55140  #include "google_breakpad/processor/source_line_resolver_interface.h"
       
 55141  
       
 55142  namespace google_breakpad {
       
 55143  
       
 55144  using std::string;
       
 55145 -#ifdef BSLR_NO_HASH_MAP
       
 55146  using std::map;
       
 55147 -#else  // BSLR_NO_HASH_MAP
       
 55148 -using __gnu_cxx::hash_map;
       
 55149 -#endif  // BSLR_NO_HASH_MAP
       
 55150  
       
 55151  class BasicSourceLineResolver : public SourceLineResolverInterface {
       
 55152   public:
       
 55153    BasicSourceLineResolver();
       
 55154    virtual ~BasicSourceLineResolver();
       
 55155  
       
 55156    // SourceLineResolverInterface methods, see source_line_resolver_interface.h
       
 55157    // for more details.
       
 55158  
       
 55159    // Adds a module to this resolver, returning true on success.
       
 55160    // The given map_file is read into memory, and its symbols will be
       
 55161    // retained until the BasicSourceLineResolver is destroyed.
       
 55162    virtual bool LoadModule(const string &module_name, const string &map_file);
       
 55163  
       
 55164 +  // Exactly the same as above, except the given map_buffer is used
       
 55165 +  // for symbols. 
       
 55166 +  virtual bool LoadModuleUsingMapBuffer(const string &module_name,
       
 55167 +                                        const string &map_buffer);
       
 55168 +
       
 55169 +
       
 55170    virtual bool HasModule(const string &module_name) const;
       
 55171  
       
 55172    virtual StackFrameInfo* FillSourceLineInfo(StackFrame *frame) const;
       
 55173  
       
 55174   private:
       
 55175    template<class T> class MemAddrMap;
       
 55176    struct Line;
       
 55177    struct Function;
       
 55178    struct PublicSymbol;
       
 55179    struct File;
       
 55180 -#ifdef BSLR_NO_HASH_MAP
       
 55181    struct CompareString {
       
 55182      bool operator()(const string &s1, const string &s2) const;
       
 55183    };
       
 55184 -#else  // BSLR_NO_HASH_MAP
       
 55185 -  struct HashString {
       
 55186 -    size_t operator()(const string &s) const;
       
 55187 -  };
       
 55188 -#endif  // BSLR_NO_HASH_MAP
       
 55189    class Module;
       
 55190  
       
 55191    // All of the modules we've loaded
       
 55192 -#ifdef BSLR_NO_HASH_MAP
       
 55193    typedef map<string, Module*, CompareString> ModuleMap;
       
 55194 -#else  // BSLR_NO_HASH_MAP
       
 55195 -  typedef hash_map<string, Module*, HashString> ModuleMap;
       
 55196 -#endif  // BSLR_NO_HASH_MAP
       
 55197    ModuleMap *modules_;
       
 55198  
       
 55199    // Disallow unwanted copy ctor and assignment operator
       
 55200    BasicSourceLineResolver(const BasicSourceLineResolver&);
       
 55201    void operator=(const BasicSourceLineResolver&);
       
 55202  };
       
 55203  
       
 55204  }  // namespace google_breakpad
       
 55205 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump.h
       
 55206 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump.h
       
 55207 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump.h
       
 55208 @@ -76,16 +76,17 @@
       
 55209  //
       
 55210  // Author: Mark Mentovai
       
 55211  
       
 55212  #ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__
       
 55213  #define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_H__
       
 55214  
       
 55215  #include <unistd.h>
       
 55216  
       
 55217 +#include <iostream>
       
 55218  #include <map>
       
 55219  #include <string>
       
 55220  #include <vector>
       
 55221  
       
 55222  #include "google_breakpad/common/minidump_format.h"
       
 55223  #include "google_breakpad/processor/code_module.h"
       
 55224  #include "google_breakpad/processor/code_modules.h"
       
 55225  #include "google_breakpad/processor/memory_region.h"
       
 55226 @@ -173,20 +174,21 @@ class MinidumpContext : public MinidumpS
       
 55227    // identifying the CPU type that the context was collected from.  The
       
 55228    // returned value will identify the CPU only, and will have any other
       
 55229    // MD_CONTEXT_* bits masked out.  Returns 0 on failure.
       
 55230    u_int32_t GetContextCPU() const;
       
 55231  
       
 55232    // Returns raw CPU-specific context data for the named CPU type.  If the
       
 55233    // context data does not match the CPU type or does not exist, returns
       
 55234    // NULL.
       
 55235 +  const MDRawContextAMD64* GetContextAMD64() const;
       
 55236 +  const MDRawContextARM*   GetContextARM() const;
       
 55237 +  const MDRawContextPPC*   GetContextPPC() const;
       
 55238 +  const MDRawContextSPARC* GetContextSPARC() const;
       
 55239    const MDRawContextX86*   GetContextX86() const;
       
 55240 -  const MDRawContextPPC*   GetContextPPC() const;
       
 55241 -  const MDRawContextAMD64* GetContextAMD64() const;
       
 55242 -  const MDRawContextSPARC* GetContextSPARC() const;
       
 55243   
       
 55244    // Print a human-readable representation of the object to stdout.
       
 55245    void Print();
       
 55246  
       
 55247   private:
       
 55248    friend class MinidumpThread;
       
 55249    friend class MinidumpException;
       
 55250  
       
 55251 @@ -210,17 +212,18 @@ class MinidumpContext : public MinidumpS
       
 55252    // The CPU-specific context structure.
       
 55253    union {
       
 55254      MDRawContextBase*  base;
       
 55255      MDRawContextX86*   x86;
       
 55256      MDRawContextPPC*   ppc;
       
 55257      MDRawContextAMD64* amd64;
       
 55258      // on Solaris SPARC, sparc is defined as a numeric constant,
       
 55259      // so variables can NOT be named as sparc
       
 55260 -    MDRawContextSPARC*  ctx_sparc;
       
 55261 +    MDRawContextSPARC* ctx_sparc;
       
 55262 +    MDRawContextARM*   arm;
       
 55263    } context_;
       
 55264  };
       
 55265  
       
 55266  
       
 55267  // MinidumpMemoryRegion does not wrap any MDRaw structure, and only contains
       
 55268  // a reference to an MDMemoryDescriptor.  This object is intended to wrap
       
 55269  // portions of a minidump file that contain memory dumps.  In normal
       
 55270  // minidumps, each MinidumpThread owns a MinidumpMemoryRegion corresponding
       
 55271 @@ -331,17 +334,19 @@ class MinidumpThreadList : public Minidu
       
 55272   public:
       
 55273    virtual ~MinidumpThreadList();
       
 55274  
       
 55275    static void set_max_threads(u_int32_t max_threads) {
       
 55276      max_threads_ = max_threads;
       
 55277    }
       
 55278    static u_int32_t max_threads() { return max_threads_; }
       
 55279  
       
 55280 -  unsigned int thread_count() const { return valid_ ? thread_count_ : 0; }
       
 55281 +  unsigned int thread_count() const {
       
 55282 +    return valid_ ? thread_count_ : 0;
       
 55283 +  }
       
 55284  
       
 55285    // Sequential access to threads.
       
 55286    MinidumpThread* GetThreadAtIndex(unsigned int index) const;
       
 55287  
       
 55288    // Random access to threads.
       
 55289    MinidumpThread* GetThreadByID(u_int32_t thread_id);
       
 55290  
       
 55291    // Print a human-readable representation of the object to stdout.
       
 55292 @@ -632,16 +637,56 @@ class MinidumpException : public Minidum
       
 55293    explicit MinidumpException(Minidump* minidump);
       
 55294  
       
 55295    bool Read(u_int32_t expected_size);
       
 55296  
       
 55297    MDRawExceptionStream exception_;
       
 55298    MinidumpContext*     context_;
       
 55299  };
       
 55300  
       
 55301 +// MinidumpAssertion wraps MDRawAssertionInfo, which contains information
       
 55302 +// about an assertion that caused the minidump to be generated.
       
 55303 +class MinidumpAssertion : public MinidumpStream {
       
 55304 + public:
       
 55305 +  virtual ~MinidumpAssertion();
       
 55306 +
       
 55307 +  const MDRawAssertionInfo* assertion() const {
       
 55308 +    return valid_ ? &assertion_ : NULL;
       
 55309 +  }
       
 55310 +
       
 55311 +  string expression() const {
       
 55312 +    return valid_ ? expression_ : "";
       
 55313 +  }
       
 55314 +
       
 55315 +  string function() const {
       
 55316 +    return valid_ ? function_ : "";
       
 55317 +  }
       
 55318 +
       
 55319 +  string file() const {
       
 55320 +    return valid_ ? file_ : "";
       
 55321 +  }
       
 55322 +
       
 55323 +  // Print a human-readable representation of the object to stdout.
       
 55324 +  void Print();
       
 55325 +
       
 55326 + private:
       
 55327 +  friend class Minidump;
       
 55328 +
       
 55329 +  static const u_int32_t kStreamType = MD_ASSERTION_INFO_STREAM;
       
 55330 +
       
 55331 +  explicit MinidumpAssertion(Minidump* minidump);
       
 55332 +
       
 55333 +  bool Read(u_int32_t expected_size);
       
 55334 +
       
 55335 +  MDRawAssertionInfo assertion_;
       
 55336 +  string expression_;
       
 55337 +  string function_;
       
 55338 +  string file_;
       
 55339 +};
       
 55340 +
       
 55341  
       
 55342  // MinidumpSystemInfo wraps MDRawSystemInfo and provides information about
       
 55343  // the system on which the minidump was generated.  See also MinidumpMiscInfo.
       
 55344  class MinidumpSystemInfo : public MinidumpStream {
       
 55345   public:
       
 55346    virtual ~MinidumpSystemInfo();
       
 55347  
       
 55348    const MDRawSystemInfo* system_info() const {
       
 55349 @@ -749,45 +794,54 @@ class MinidumpBreakpadInfo : public Mini
       
 55350  
       
 55351  
       
 55352  // Minidump is the user's interface to a minidump file.  It wraps MDRawHeader
       
 55353  // and provides access to the minidump's top-level stream directory.
       
 55354  class Minidump {
       
 55355   public:
       
 55356    // path is the pathname of a file containing the minidump.
       
 55357    explicit Minidump(const string& path);
       
 55358 +  // input is an istream wrapping minidump data. Minidump holds a
       
 55359 +  // weak pointer to input, and the caller must ensure that the stream
       
 55360 +  // is valid as long as the Minidump object is.
       
 55361 +  explicit Minidump(std::istream& input);
       
 55362  
       
 55363 -  ~Minidump();
       
 55364 +  virtual ~Minidump();
       
 55365  
       
 55366 +  // path may be empty if the minidump was not opened from a file
       
 55367 +  virtual string path() const {
       
 55368 +    return path_;
       
 55369 +  }
       
 55370    static void set_max_streams(u_int32_t max_streams) {
       
 55371      max_streams_ = max_streams;
       
 55372    }
       
 55373    static u_int32_t max_streams() { return max_streams_; }
       
 55374  
       
 55375    static void set_max_string_length(u_int32_t max_string_length) {
       
 55376      max_string_length_ = max_string_length;
       
 55377    }
       
 55378    static u_int32_t max_string_length() { return max_string_length_; }
       
 55379  
       
 55380 -  const MDRawHeader* header() const { return valid_ ? &header_ : NULL; }
       
 55381 +  virtual const MDRawHeader* header() const { return valid_ ? &header_ : NULL; }
       
 55382  
       
 55383    // Reads the minidump file's header and top-level stream directory.
       
 55384    // The minidump is expected to be positioned at the beginning of the
       
 55385    // header.  Read() sets up the stream list and map, and validates the
       
 55386    // Minidump object.
       
 55387 -  bool Read();
       
 55388 +  virtual bool Read();
       
 55389  
       
 55390    // The next set of methods are stubs that call GetStream.  They exist to
       
 55391    // force code generation of the templatized API within the module, and
       
 55392    // to avoid exposing an ugly API (GetStream needs to accept a garbage
       
 55393    // parameter).
       
 55394 -  MinidumpThreadList* GetThreadList();
       
 55395 +  virtual MinidumpThreadList* GetThreadList();
       
 55396    MinidumpModuleList* GetModuleList();
       
 55397    MinidumpMemoryList* GetMemoryList();
       
 55398    MinidumpException* GetException();
       
 55399 +  MinidumpAssertion* GetAssertion();
       
 55400    MinidumpSystemInfo* GetSystemInfo();
       
 55401    MinidumpMiscInfo* GetMiscInfo();
       
 55402    MinidumpBreakpadInfo* GetBreakpadInfo();
       
 55403  
       
 55404    // The next set of methods are provided for users who wish to access
       
 55405    // data in minidump files directly, while leveraging the rest of
       
 55406    // this class and related classes to handle the basic minidump
       
 55407    // structure and known stream types.
       
 55408 @@ -803,17 +857,17 @@ class Minidump {
       
 55409    // the storage area pointed to by bytes.  bytes must be of sufficient
       
 55410    // size.  After the read, the file position is advanced by count.
       
 55411    bool ReadBytes(void* bytes, size_t count);
       
 55412  
       
 55413    // Sets the position of the minidump file to offset.
       
 55414    bool SeekSet(off_t offset);
       
 55415  
       
 55416    // Returns the current position of the minidump file.
       
 55417 -  off_t Tell() { return valid_ ? lseek(fd_, 0, SEEK_CUR) : (off_t)-1; }
       
 55418 +  off_t Tell();
       
 55419  
       
 55420    // The next 2 methods are medium-level I/O routines.
       
 55421  
       
 55422    // ReadString returns a string which is owned by the caller!  offset
       
 55423    // specifies the offset that a length-encoded string is stored at in the
       
 55424    // minidump file.
       
 55425    string* ReadString(off_t offset);
       
 55426  
       
 55427 @@ -874,21 +928,22 @@ class Minidump {
       
 55428  
       
 55429    // The list of streams.
       
 55430    MinidumpDirectoryEntries* directory_;
       
 55431  
       
 55432    // Access to streams using the stream type as the key.
       
 55433    MinidumpStreamMap*        stream_map_;
       
 55434  
       
 55435    // The pathname of the minidump file to process, set in the constructor.
       
 55436 +  // This may be empty if the minidump was opened directly from a stream.
       
 55437    const string              path_;
       
 55438  
       
 55439 -  // The file descriptor for all file I/O.  Used by ReadBytes and SeekSet.
       
 55440 -  // Set based on the |path_| member by Open, which is called by Read.
       
 55441 -  int                       fd_;
       
 55442 +  // The stream for all file I/O.  Used by ReadBytes and SeekSet.
       
 55443 +  // Set based on the path in Open, or directly in the constructor.
       
 55444 +  std::istream*             stream_;
       
 55445  
       
 55446    // swap_ is true if the minidump file should be byte-swapped.  If the
       
 55447    // minidump was produced by a CPU that is other-endian than the CPU
       
 55448    // processing the minidump, this will be true.  If the two CPUs are
       
 55449    // same-endian, this will be false.
       
 55450    bool                      swap_;
       
 55451  
       
 55452    // Validity of the Minidump structure, false immediately after
       
 55453 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump_processor.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump_processor.h
       
 55454 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump_processor.h
       
 55455 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/minidump_processor.h
       
 55456 @@ -25,48 +25,90 @@
       
 55457  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 55458  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 55459  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 55460  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 55461  
       
 55462  #ifndef GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__
       
 55463  #define GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__
       
 55464  
       
 55465 +#include <cassert>
       
 55466  #include <string>
       
 55467  #include "google_breakpad/common/breakpad_types.h"
       
 55468  
       
 55469  namespace google_breakpad {
       
 55470  
       
 55471  using std::string;
       
 55472  
       
 55473  class Minidump;
       
 55474  class ProcessState;
       
 55475  class SourceLineResolverInterface;
       
 55476  class SymbolSupplier;
       
 55477  class SystemInfo;
       
 55478 +// Return type for Process()
       
 55479 +enum ProcessResult {
       
 55480 +  PROCESS_OK,                                 // The minidump was
       
 55481 +                                              // processed
       
 55482 +                                              // successfully.
       
 55483 +
       
 55484 +  PROCESS_ERROR_MINIDUMP_NOT_FOUND,           // The minidump file
       
 55485 +                                              // was not found.
       
 55486 +
       
 55487 +  PROCESS_ERROR_NO_MINIDUMP_HEADER,           // The minidump file
       
 55488 +                                              // had no header
       
 55489 +
       
 55490 +  PROCESS_ERROR_NO_THREAD_LIST,               // The minidump file
       
 55491 +                                              // had no thread list.
       
 55492 +
       
 55493 +  PROCESS_ERROR_GETTING_THREAD,               // There was an error
       
 55494 +                                              // getting one
       
 55495 +                                              // thread's data from
       
 55496 +                                              // the minidump.
       
 55497 +
       
 55498 +  PROCESS_ERROR_GETTING_THREAD_ID,            // There was an error
       
 55499 +                                              // getting a thread id
       
 55500 +                                              // from the thread's
       
 55501 +                                              // data.
       
 55502 +
       
 55503 +  PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS, // There was more than
       
 55504 +                                              // one requesting
       
 55505 +                                              // thread.
       
 55506 +
       
 55507 +  PROCESS_ERROR_NO_MEMORY_FOR_THREAD,         // A thread had no
       
 55508 +                                              // memory region.
       
 55509 +
       
 55510 +  PROCESS_ERROR_NO_STACKWALKER_FOR_THREAD,    // We couldn't
       
 55511 +                                              // determine the
       
 55512 +                                              // StackWalker to walk
       
 55513 +                                              // the minidump's
       
 55514 +                                              // threads.
       
 55515 +
       
 55516 +  PROCESS_SYMBOL_SUPPLIER_INTERRUPTED         // The minidump
       
 55517 +                                              // processing was
       
 55518 +                                              // interrupted by the
       
 55519 +                                              // SymbolSupplier(not
       
 55520 +                                              // fatal)
       
 55521 +};
       
 55522  
       
 55523  class MinidumpProcessor {
       
 55524   public:
       
 55525 -  // Return type for Process()
       
 55526 -  enum ProcessResult {
       
 55527 -    PROCESS_OK,           // the minidump was processed successfully
       
 55528 -    PROCESS_ERROR,        // there was an error processing the minidump
       
 55529 -    PROCESS_INTERRUPTED   // processing was interrupted by the SymbolSupplier
       
 55530 -  };
       
 55531 -
       
 55532    // Initializes this MinidumpProcessor.  supplier should be an
       
 55533    // implementation of the SymbolSupplier abstract base class.
       
 55534    MinidumpProcessor(SymbolSupplier *supplier,
       
 55535                      SourceLineResolverInterface *resolver);
       
 55536    ~MinidumpProcessor();
       
 55537  
       
 55538    // Processes the minidump file and fills process_state with the result.
       
 55539    ProcessResult Process(const string &minidump_file,
       
 55540                          ProcessState *process_state);
       
 55541  
       
 55542 +  // Processes the minidump structure and fills process_state with the
       
 55543 +  // result.
       
 55544 +  ProcessResult Process(Minidump *minidump,
       
 55545 +                        ProcessState *process_state);
       
 55546    // Populates the cpu_* fields of the |info| parameter with textual
       
 55547    // representations of the CPU type that the minidump in |dump| was
       
 55548    // produced on.  Returns false if this information is not available in
       
 55549    // the minidump.
       
 55550    static bool GetCPUInfo(Minidump *dump, SystemInfo *info);
       
 55551  
       
 55552    // Populates the os_* fields of the |info| parameter with textual
       
 55553    // representations of the operating system that the minidump in |dump|
       
 55554 @@ -79,16 +121,36 @@ class MinidumpProcessor {
       
 55555    // an empty string if this information cannot be determined.  If address
       
 55556    // is non-NULL, it will be set to contain the address that caused the
       
 55557    // exception, if this information is available.  This will be a code
       
 55558    // address when the crash was caused by problems such as illegal
       
 55559    // instructions or divisions by zero, or a data address when the crash
       
 55560    // was caused by a memory access violation.
       
 55561    static string GetCrashReason(Minidump *dump, u_int64_t *address);
       
 55562  
       
 55563 +  // This function returns true if the passed-in error code is
       
 55564 +  // something unrecoverable(i.e. retry should not happen).  For
       
 55565 +  // instance, if the minidump is corrupt, then it makes no sense to
       
 55566 +  // retry as we won't be able to glean additional information.
       
 55567 +  // However, as an example of the other case, the symbol supplier can
       
 55568 +  // return an error code indicating it was 'interrupted', which can
       
 55569 +  // happen of the symbols are fetched from a remote store, and a
       
 55570 +  // retry might be successful later on.
       
 55571 +  // You should not call this method with PROCESS_OK! Test for
       
 55572 +  // that separately before calling this.
       
 55573 +  static bool IsErrorUnrecoverable(ProcessResult p) {
       
 55574 +    assert(p !=  PROCESS_OK);
       
 55575 +    return (p != PROCESS_SYMBOL_SUPPLIER_INTERRUPTED);
       
 55576 +  }
       
 55577 +
       
 55578 +  // Returns a textual representation of an assertion included
       
 55579 +  // in the minidump.  Returns an empty string if this information
       
 55580 +  // does not exist or cannot be determined.
       
 55581 +  static string GetAssertion(Minidump *dump);
       
 55582 +
       
 55583   private:
       
 55584    SymbolSupplier *supplier_;
       
 55585    SourceLineResolverInterface *resolver_;
       
 55586  };
       
 55587  
       
 55588  }  // namespace google_breakpad
       
 55589  
       
 55590  #endif  // GOOGLE_BREAKPAD_PROCESSOR_MINIDUMP_PROCESSOR_H__
       
 55591 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/process_state.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/process_state.h
       
 55592 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/process_state.h
       
 55593 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/process_state.h
       
 55594 @@ -31,18 +31,19 @@
       
 55595  //
       
 55596  // Author: Mark Mentovai
       
 55597  
       
 55598  #ifndef GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__
       
 55599  #define GOOGLE_BREAKPAD_PROCESSOR_PROCESS_STATE_H__
       
 55600  
       
 55601  #include <string>
       
 55602  #include <vector>
       
 55603 +#include "google_breakpad/common/breakpad_types.h"
       
 55604  #include "google_breakpad/processor/system_info.h"
       
 55605 -#include "google_breakpad/common/breakpad_types.h"
       
 55606 +#include "google_breakpad/processor/minidump.h"
       
 55607  
       
 55608  namespace google_breakpad {
       
 55609  
       
 55610  using std::string;
       
 55611  using std::vector;
       
 55612  
       
 55613  class CallStack;
       
 55614  class CodeModules;
       
 55615 @@ -55,18 +56,22 @@ class ProcessState {
       
 55616    // Resets the ProcessState to its default values
       
 55617    void Clear();
       
 55618  
       
 55619    // Accessors.  See the data declarations below.
       
 55620    u_int32_t time_date_stamp() const { return time_date_stamp_; }
       
 55621    bool crashed() const { return crashed_; }
       
 55622    string crash_reason() const { return crash_reason_; }
       
 55623    u_int64_t crash_address() const { return crash_address_; }
       
 55624 +  string assertion() const { return assertion_; }
       
 55625    int requesting_thread() const { return requesting_thread_; }
       
 55626    const vector<CallStack*>* threads() const { return &threads_; }
       
 55627 +  const vector<MinidumpMemoryRegion*>* thread_memory_regions() const {
       
 55628 +    return &thread_memory_regions_;
       
 55629 +  }
       
 55630    const SystemInfo* system_info() const { return &system_info_; }
       
 55631    const CodeModules* modules() const { return modules_; }
       
 55632  
       
 55633   private:
       
 55634    // MinidumpProcessor is responsible for building ProcessState objects.
       
 55635    friend class MinidumpProcessor;
       
 55636  
       
 55637    // The time-date stamp of the minidump (time_t format)
       
 55638 @@ -83,29 +88,35 @@ class ProcessState {
       
 55639    string crash_reason_;
       
 55640  
       
 55641    // If the process crashed, and if crash_reason implicates memory,
       
 55642    // the memory address that caused the crash.  For data access errors,
       
 55643    // this will be the data address that caused the fault.  For code errors,
       
 55644    // this will be the address of the instruction that caused the fault.
       
 55645    u_int64_t crash_address_;
       
 55646  
       
 55647 +  // If there was an assertion that was hit, a textual representation
       
 55648 +  // of that assertion, possibly including the file and line at which
       
 55649 +  // it occurred.
       
 55650 +  string assertion_;
       
 55651 +
       
 55652    // The index of the thread that requested a dump be written in the
       
 55653    // threads vector.  If a dump was produced as a result of a crash, this
       
 55654    // will point to the thread that crashed.  If the dump was produced as
       
 55655    // by user code without crashing, and the dump contains extended Breakpad
       
 55656    // information, this will point to the thread that requested the dump.
       
 55657    // If the dump was not produced as a result of an exception and no
       
 55658    // extended Breakpad information is present, this field will be set to -1,
       
 55659    // indicating that the dump thread is not available.
       
 55660    int requesting_thread_;
       
 55661  
       
 55662    // Stacks for each thread (except possibly the exception handler
       
 55663    // thread) at the time of the crash.
       
 55664    vector<CallStack*> threads_;
       
 55665 +  vector<MinidumpMemoryRegion*> thread_memory_regions_;
       
 55666  
       
 55667    // OS and CPU information.
       
 55668    SystemInfo system_info_;
       
 55669  
       
 55670    // The modules that were loaded into the process represented by the
       
 55671    // ProcessState.
       
 55672    const CodeModules *modules_;
       
 55673  };
       
 55674 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/source_line_resolver_interface.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/source_line_resolver_interface.h
       
 55675 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/source_line_resolver_interface.h
       
 55676 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/source_line_resolver_interface.h
       
 55677 @@ -51,16 +51,19 @@ class SourceLineResolverInterface {
       
 55678    // Adds a module to this resolver, returning true on success.
       
 55679    //
       
 55680    // module_name may be an arbitrary string.  Typically, it will be the
       
 55681    // filename of the module, optionally with version identifiers.
       
 55682    //
       
 55683    // map_file should contain line/address mappings for this module.
       
 55684    virtual bool LoadModule(const string &module_name,
       
 55685                            const string &map_file) = 0;
       
 55686 +  // Same as above, but takes the contents of a pre-read map buffer
       
 55687 +  virtual bool LoadModuleUsingMapBuffer(const string &module_name,
       
 55688 +                                        const string &map_buffer) = 0;
       
 55689  
       
 55690    // Returns true if a module with the given name has been loaded.
       
 55691    virtual bool HasModule(const string &module_name) const = 0;
       
 55692  
       
 55693    // Fills in the function_base, function_name, source_file_name,
       
 55694    // and source_line fields of the StackFrame.  The instruction and
       
 55695    // module_name fields must already be filled in.  Additional debugging
       
 55696    // information, if available, is returned.  If the information is not
       
 55697 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stack_frame_cpu.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stack_frame_cpu.h
       
 55698 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stack_frame_cpu.h
       
 55699 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stack_frame_cpu.h
       
 55700 @@ -53,28 +53,48 @@ struct StackFrameX86 : public StackFrame
       
 55701      CONTEXT_VALID_ESP  = 1 << 1,
       
 55702      CONTEXT_VALID_EBP  = 1 << 2,
       
 55703      CONTEXT_VALID_EBX  = 1 << 3,
       
 55704      CONTEXT_VALID_ESI  = 1 << 4,
       
 55705      CONTEXT_VALID_EDI  = 1 << 5,
       
 55706      CONTEXT_VALID_ALL  = -1
       
 55707    };
       
 55708  
       
 55709 -  StackFrameX86() : context(), context_validity(CONTEXT_VALID_NONE) {}
       
 55710 +  // Indicates how well we trust the instruction pointer we derived
       
 55711 +  // during stack walking. Since the stack walker can resort to
       
 55712 +  // stack scanning, we can wind up with dubious frames.
       
 55713 +  // In rough order of "trust metric".
       
 55714 +  enum FrameTrust {
       
 55715 +    FRAME_TRUST_NONE,     // Unknown
       
 55716 +    FRAME_TRUST_SCAN,     // Scanned the stack, found this
       
 55717 +    FRAME_TRUST_CFI_SCAN, // Scanned the stack using call frame info, found this
       
 55718 +    FRAME_TRUST_FP,       // Derived from frame pointer
       
 55719 +    FRAME_TRUST_CFI,      // Derived from call frame info
       
 55720 +    FRAME_TRUST_CONTEXT   // Given as instruction pointer in a context
       
 55721 +  };
       
 55722 +
       
 55723 + StackFrameX86()
       
 55724 +     : context(),
       
 55725 +       context_validity(CONTEXT_VALID_NONE),
       
 55726 +       trust(FRAME_TRUST_NONE) {}
       
 55727  
       
 55728    // Register state.  This is only fully valid for the topmost frame in a
       
 55729    // stack.  In other frames, the values of nonvolatile registers may be
       
 55730    // present, given sufficient debugging information.  Refer to
       
 55731    // context_validity.
       
 55732    MDRawContextX86 context;
       
 55733  
       
 55734    // context_validity is actually ContextValidity, but int is used because
       
 55735    // the OR operator doesn't work well with enumerated types.  This indicates
       
 55736    // which fields in context are valid.
       
 55737    int context_validity;
       
 55738 +  
       
 55739 +  // Amount of trust the stack walker has in the instruction pointer
       
 55740 +  // of this frame.
       
 55741 +  FrameTrust trust;
       
 55742  };
       
 55743  
       
 55744  struct StackFramePPC : public StackFrame {
       
 55745    // ContextValidity should eventually contain entries for the validity of
       
 55746    // other nonvolatile (callee-save) registers as in
       
 55747    // StackFrameX86::ContextValidity, but the ppc stackwalker doesn't currently
       
 55748    // locate registers other than the ones listed here.
       
 55749    enum ContextValidity {
       
 55750 @@ -143,11 +163,38 @@ struct StackFrameSPARC : public StackFra
       
 55751    MDRawContextSPARC context;
       
 55752  
       
 55753    // context_validity is actually ContextValidity, but int is used because
       
 55754    // the OR operator doesn't work well with enumerated types.  This indicates
       
 55755    // which fields in context are valid.
       
 55756    int context_validity;
       
 55757  };
       
 55758  
       
 55759 +struct StackFrameARM : public StackFrame {
       
 55760 +  // ContextValidity should eventually contain entries for the validity of
       
 55761 +  // other nonvolatile (callee-save) registers as in
       
 55762 +  // StackFrameX86::ContextValidity. I suspect this list is sufficient
       
 55763 +  // for arm stackwalking.
       
 55764 +  enum ContextValidity {
       
 55765 +    CONTEXT_VALID_NONE = 0,
       
 55766 +    CONTEXT_VALID_R13 = 1 << 0,
       
 55767 +    CONTEXT_VALID_R14 = 1 << 1,
       
 55768 +    CONTEXT_VALID_R15 = 1 << 2,
       
 55769 +    CONTEXT_VALID_ALL = -1
       
 55770 +  };
       
 55771 +
       
 55772 +  StackFrameARM() : context(), context_validity(CONTEXT_VALID_NONE) {}
       
 55773 +
       
 55774 +  // Register state.  This is only fully valid for the topmost frame in a
       
 55775 +  // stack.  In other frames, the values of nonvolatile registers may be
       
 55776 +  // present, given sufficient debugging information.  Refer to
       
 55777 +  // context_validity.
       
 55778 +  MDRawContextARM context;
       
 55779 +
       
 55780 +  // context_validity is actually ContextValidity, but int is used because
       
 55781 +  // the OR operator doesn't work well with enumerated types.  This indicates
       
 55782 +  // which fields in context are valid.
       
 55783 +  int context_validity;
       
 55784 +};
       
 55785 +
       
 55786  }  // namespace google_breakpad
       
 55787  
       
 55788  #endif  // GOOGLE_BREAKPAD_PROCESSOR_STACK_FRAME_CPU_H__
       
 55789 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stackwalker.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stackwalker.h
       
 55790 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stackwalker.h
       
 55791 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/stackwalker.h
       
 55792 @@ -37,16 +37,17 @@
       
 55793  //
       
 55794  // Author: Mark Mentovai
       
 55795  
       
 55796  
       
 55797  #ifndef GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__
       
 55798  #define GOOGLE_BREAKPAD_PROCESSOR_STACKWALKER_H__
       
 55799  
       
 55800  #include <vector>
       
 55801 +#include "google_breakpad/common/breakpad_types.h"
       
 55802  
       
 55803  namespace google_breakpad {
       
 55804  
       
 55805  class CallStack;
       
 55806  class CodeModules;
       
 55807  template<typename T> class linked_ptr;
       
 55808  class MemoryRegion;
       
 55809  class MinidumpContext;
       
 55810 @@ -90,16 +91,26 @@ class Stackwalker {
       
 55811    // (see source_line_resolver_interface.h and basic_source_line_resolver.h).
       
 55812    // If resolver is NULL, source line info will not be resolved.
       
 55813    Stackwalker(const SystemInfo *system_info,
       
 55814                MemoryRegion *memory,
       
 55815                const CodeModules *modules,
       
 55816                SymbolSupplier *supplier,
       
 55817                SourceLineResolverInterface *resolver);
       
 55818  
       
 55819 +  // This can be used to filter out potential return addresses when
       
 55820 +  // the stack walker resorts to stack scanning.
       
 55821 +  // Returns true if any of:
       
 55822 +  // * This address is within a loaded module, but we don't have symbols
       
 55823 +  //   for that module.
       
 55824 +  // * This address is within a loaded module for which we have symbols,
       
 55825 +  //   and falls inside a function in that module.
       
 55826 +  // Returns false otherwise.
       
 55827 +  bool InstructionAddressSeemsValid(u_int64_t address);
       
 55828 +
       
 55829    // Information about the system that produced the minidump.  Subclasses
       
 55830    // and the SymbolSupplier may find this information useful.
       
 55831    const SystemInfo *system_info_;
       
 55832  
       
 55833    // The stack memory to walk.  Subclasses will require this region to
       
 55834    // get information from the stack.
       
 55835    MemoryRegion *memory_;
       
 55836  
       
 55837 diff --git a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/symbol_supplier.h b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/symbol_supplier.h
       
 55838 --- a/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/symbol_supplier.h
       
 55839 +++ b/toolkit/crashreporter/google-breakpad/src/google_breakpad/processor/symbol_supplier.h
       
 55840 @@ -54,19 +54,29 @@ class SymbolSupplier {
       
 55841      // stops processing the minidump immediately
       
 55842      INTERRUPT
       
 55843    };
       
 55844  
       
 55845    virtual ~SymbolSupplier() {}
       
 55846  
       
 55847    // Retrieves the symbol file for the given CodeModule, placing the
       
 55848    // path in symbol_file if successful.  system_info contains strings
       
 55849 -  // identifying the operating system and CPU; SymbolSupplier may use to help
       
 55850 -  // locate the symbol file.  system_info may be NULL or its fields may be
       
 55851 -  // empty if these values are unknown.
       
 55852 +  // identifying the operating system and CPU; SymbolSupplier may use
       
 55853 +  // to help locate the symbol file.  system_info may be NULL or its
       
 55854 +  // fields may be empty if these values are unknown.  symbol_file
       
 55855 +  // must be a pointer to a valid string
       
 55856    virtual SymbolResult GetSymbolFile(const CodeModule *module,
       
 55857                                       const SystemInfo *system_info,
       
 55858                                       string *symbol_file) = 0;
       
 55859 +  // Same as above, except also places symbol data into symbol_data.
       
 55860 +  // If symbol_data is NULL, the data is not returned.
       
 55861 +  // TODO(nealsid) Once we have symbol data caching behavior implemented
       
 55862 +  // investigate making all symbol suppliers implement all methods,
       
 55863 +  // and make this pure virtual
       
 55864 +  virtual SymbolResult GetSymbolFile(const CodeModule *module,
       
 55865 +                                     const SystemInfo *system_info,
       
 55866 +                                     string *symbol_file,
       
 55867 +                                     string *symbol_data) = 0;
       
 55868  };
       
 55869  
       
 55870  }  // namespace google_breakpad
       
 55871  
       
 55872  #endif  // GOOGLE_BREAKPAD_PROCESSOR_SYMBOL_SUPPLIER_H__
       
 55873 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver.cc b/toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver.cc
       
 55874 --- a/toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver.cc
       
 55875 +++ b/toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver.cc
       
 55876 @@ -24,16 +24,19 @@
       
 55877  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 55878  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 55879  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 55880  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 55881  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 55882  
       
 55883  #include <stdio.h>
       
 55884  #include <string.h>
       
 55885 +#include <sys/types.h>
       
 55886 +#include <sys/stat.h>
       
 55887 +#include <unistd.h>
       
 55888  
       
 55889  #include <map>
       
 55890  #include <utility>
       
 55891  #include <vector>
       
 55892  
       
 55893  #include "processor/address_map-inl.h"
       
 55894  #include "processor/contained_range_map-inl.h"
       
 55895  #include "processor/range_map-inl.h"
       
 55896 @@ -43,19 +46,16 @@
       
 55897  #include "google_breakpad/processor/stack_frame.h"
       
 55898  #include "processor/linked_ptr.h"
       
 55899  #include "processor/scoped_ptr.h"
       
 55900  #include "processor/stack_frame_info.h"
       
 55901  
       
 55902  using std::map;
       
 55903  using std::vector;
       
 55904  using std::make_pair;
       
 55905 -#ifndef BSLR_NO_HASH_MAP
       
 55906 -using __gnu_cxx::hash;
       
 55907 -#endif  // BSLR_NO_HASH_MAP
       
 55908  
       
 55909  namespace google_breakpad {
       
 55910  
       
 55911  struct BasicSourceLineResolver::Line {
       
 55912    Line(MemAddr addr, MemAddr code_size, int file_id, int source_line)
       
 55913        : address(addr)
       
 55914        , size(code_size)
       
 55915        , source_file_id(file_id)
       
 55916 @@ -101,33 +101,33 @@ struct BasicSourceLineResolver::PublicSy
       
 55917    // stack, if known.
       
 55918    int parameter_size;
       
 55919  };
       
 55920  
       
 55921  class BasicSourceLineResolver::Module {
       
 55922   public:
       
 55923    Module(const string &name) : name_(name) { }
       
 55924  
       
 55925 -  // Loads the given map file, returning true on success.
       
 55926 +  // Loads the given map file, returning true on success.  Reads the
       
 55927 +  // map file into memory and calls LoadMapFromBuffer
       
 55928    bool LoadMap(const string &map_file);
       
 55929  
       
 55930 +  // Loads a map from the given buffer, returning true on success
       
 55931 +  bool LoadMapFromBuffer(const string &map_buffer);
       
 55932 +
       
 55933    // Looks up the given relative address, and fills the StackFrame struct
       
 55934    // with the result.  Additional debugging information, if available, is
       
 55935    // returned.  If no additional information is available, returns NULL.
       
 55936    // A NULL return value is not an error.  The caller takes ownership of
       
 55937    // any returned StackFrameInfo object.
       
 55938    StackFrameInfo* LookupAddress(StackFrame *frame) const;
       
 55939  
       
 55940   private:
       
 55941    friend class BasicSourceLineResolver;
       
 55942 -#ifdef BSLR_NO_HASH_MAP
       
 55943    typedef map<int, string> FileMap;
       
 55944 -#else  // BSLR_NO_HASH_MAP
       
 55945 -  typedef hash_map<int, string> FileMap;
       
 55946 -#endif  // BSLR_NO_HASH_MAP
       
 55947  
       
 55948    // The types for stack_info_.  This is equivalent to MS DIA's
       
 55949    // StackFrameTypeEnum.  Each identifies a different type of frame
       
 55950    // information, although all are represented in the symbol file in the
       
 55951    // same format.  These are used as indices to the stack_info_ array.
       
 55952    enum StackInfoTypes {
       
 55953      STACK_INFO_FPO = 0,
       
 55954      STACK_INFO_TRAP,  // not used here
       
 55955 @@ -206,16 +206,37 @@ bool BasicSourceLineResolver::LoadModule
       
 55956      delete module;
       
 55957      return false;
       
 55958    }
       
 55959  
       
 55960    modules_->insert(make_pair(module_name, module));
       
 55961    return true;
       
 55962  }
       
 55963  
       
 55964 +bool BasicSourceLineResolver::LoadModuleUsingMapBuffer(
       
 55965 +    const string &module_name,
       
 55966 +    const string &map_buffer) {
       
 55967 +  // Make sure we don't already have a module with the given name.
       
 55968 +  if (modules_->find(module_name) != modules_->end()) {
       
 55969 +    BPLOG(INFO) << "Symbols for module " << module_name << " already loaded";
       
 55970 +    return false;
       
 55971 +  }
       
 55972 +
       
 55973 +  BPLOG(INFO) << "Loading symbols for module " << module_name << " from buffer";
       
 55974 +
       
 55975 +  Module *module = new Module(module_name);
       
 55976 +  if (!module->LoadMapFromBuffer(map_buffer)) {
       
 55977 +    delete module;
       
 55978 +    return false;
       
 55979 +  }
       
 55980 +
       
 55981 +  modules_->insert(make_pair(module_name, module));
       
 55982 +  return true;
       
 55983 +}
       
 55984 +
       
 55985  bool BasicSourceLineResolver::HasModule(const string &module_name) const {
       
 55986    return modules_->find(module_name) != modules_->end();
       
 55987  }
       
 55988  
       
 55989  StackFrameInfo* BasicSourceLineResolver::FillSourceLineInfo(
       
 55990      StackFrame *frame) const {
       
 55991    if (frame->module) {
       
 55992      ModuleMap::const_iterator it = modules_->find(frame->module->code_file());
       
 55993 @@ -233,96 +254,170 @@ class AutoFileCloser {
       
 55994      if (file_)
       
 55995        fclose(file_);
       
 55996    }
       
 55997  
       
 55998   private:
       
 55999    FILE *file_;
       
 56000  };
       
 56001  
       
 56002 -bool BasicSourceLineResolver::Module::LoadMap(const string &map_file) {
       
 56003 -  FILE *f = fopen(map_file.c_str(), "r");
       
 56004 -  if (!f) {
       
 56005 -    string error_string;
       
 56006 -    int error_code = ErrnoString(&error_string);
       
 56007 -    BPLOG(ERROR) << "Could not open " << map_file <<
       
 56008 -                    ", error " << error_code << ": " << error_string;
       
 56009 +bool BasicSourceLineResolver::Module::LoadMapFromBuffer(
       
 56010 +    const string &map_buffer) {
       
 56011 +  linked_ptr<Function> cur_func;
       
 56012 +  int line_number = 0;
       
 56013 +  const char *map_buffer_c_str = map_buffer.c_str();
       
 56014 +  char *save_ptr;
       
 56015 +
       
 56016 +  // set up our input buffer as a c-style string so we
       
 56017 +  // can we use strtok()
       
 56018 +  // have to copy because modifying the result of string::c_str is not
       
 56019 +  // permitted
       
 56020 +  size_t map_buffer_length = strlen(map_buffer_c_str);
       
 56021 +
       
 56022 +  // If the length is 0, we can still pretend we have a symbol file. This is
       
 56023 +  // for scenarios that want to test symbol lookup, but don't necessarily care if
       
 56024 +  // certain modules do not have any information, like system libraries.
       
 56025 +  if (map_buffer_length == 0) {
       
 56026 +    return true;
       
 56027 +  }
       
 56028 +
       
 56029 +  scoped_array<char> map_buffer_chars(new char[map_buffer_length]);
       
 56030 +  if (map_buffer_chars == NULL) {
       
 56031 +    BPLOG(ERROR) << "Memory allocation of " << map_buffer_length <<
       
 56032 +        " bytes failed";
       
 56033      return false;
       
 56034    }
       
 56035  
       
 56036 -  AutoFileCloser closer(f);
       
 56037 +  strncpy(map_buffer_chars.get(), map_buffer_c_str, map_buffer_length);
       
 56038  
       
 56039 -  // TODO(mmentovai): this might not be large enough to handle really long
       
 56040 -  // lines, which might be present for FUNC lines of highly-templatized
       
 56041 -  // code.
       
 56042 -  char buffer[8192];
       
 56043 -  linked_ptr<Function> cur_func;
       
 56044 +  if (map_buffer_chars[map_buffer_length - 1] == '\n') {
       
 56045 +    map_buffer_chars[map_buffer_length - 1] = '\0';
       
 56046 +  }
       
 56047 +  char *buffer;
       
 56048 +  buffer = strtok_r(map_buffer_chars.get(), "\r\n", &save_ptr);
       
 56049  
       
 56050 -  int line_number = 0;
       
 56051 -  while (fgets(buffer, sizeof(buffer), f)) {
       
 56052 +  while (buffer != NULL) {
       
 56053      ++line_number;
       
 56054 +
       
 56055      if (strncmp(buffer, "FILE ", 5) == 0) {
       
 56056        if (!ParseFile(buffer)) {
       
 56057 -        BPLOG(ERROR) << "ParseFile failed at " <<
       
 56058 -                        map_file << ":" << line_number;
       
 56059 +        BPLOG(ERROR) << "ParseFile on buffer failed at " <<
       
 56060 +            ":" << line_number;
       
 56061          return false;
       
 56062        }
       
 56063      } else if (strncmp(buffer, "STACK ", 6) == 0) {
       
 56064        if (!ParseStackInfo(buffer)) {
       
 56065          BPLOG(ERROR) << "ParseStackInfo failed at " <<
       
 56066 -                        map_file << ":" << line_number;
       
 56067 +            ":" << line_number;
       
 56068          return false;
       
 56069        }
       
 56070      } else if (strncmp(buffer, "FUNC ", 5) == 0) {
       
 56071        cur_func.reset(ParseFunction(buffer));
       
 56072        if (!cur_func.get()) {
       
 56073          BPLOG(ERROR) << "ParseFunction failed at " <<
       
 56074 -                        map_file << ":" << line_number;
       
 56075 +            ":" << line_number;
       
 56076          return false;
       
 56077        }
       
 56078        // StoreRange will fail if the function has an invalid address or size.
       
 56079        // We'll silently ignore this, the function and any corresponding lines
       
 56080        // will be destroyed when cur_func is released.
       
 56081        functions_.StoreRange(cur_func->address, cur_func->size, cur_func);
       
 56082      } else if (strncmp(buffer, "PUBLIC ", 7) == 0) {
       
 56083        // Clear cur_func: public symbols don't contain line number information.
       
 56084        cur_func.reset();
       
 56085  
       
 56086        if (!ParsePublicSymbol(buffer)) {
       
 56087          BPLOG(ERROR) << "ParsePublicSymbol failed at " <<
       
 56088 -                        map_file << ":" << line_number;
       
 56089 +            ":" << line_number;
       
 56090          return false;
       
 56091        }
       
 56092      } else if (strncmp(buffer, "MODULE ", 7) == 0) {
       
 56093        // Ignore these.  They're not of any use to BasicSourceLineResolver,
       
 56094        // which is fed modules by a SymbolSupplier.  These lines are present to
       
 56095        // aid other tools in properly placing symbol files so that they can
       
 56096        // be accessed by a SymbolSupplier.
       
 56097        //
       
 56098        // MODULE <guid> <age> <filename>
       
 56099      } else {
       
 56100        if (!cur_func.get()) {
       
 56101          BPLOG(ERROR) << "Found source line data without a function at " <<
       
 56102 -                        map_file << ":" << line_number;
       
 56103 +            ":" << line_number;
       
 56104          return false;
       
 56105        }
       
 56106        Line *line = ParseLine(buffer);
       
 56107        if (!line) {
       
 56108 -        BPLOG(ERROR) << "ParseLine failed at " <<
       
 56109 -                        map_file << ":" << line_number;
       
 56110 +        BPLOG(ERROR) << "ParseLine failed at " << line_number << " for " <<
       
 56111 +            buffer;
       
 56112          return false;
       
 56113        }
       
 56114        cur_func->lines.StoreRange(line->address, line->size,
       
 56115                                   linked_ptr<Line>(line));
       
 56116      }
       
 56117 +
       
 56118 +    buffer = strtok_r(NULL, "\r\n", &save_ptr);
       
 56119    }
       
 56120  
       
 56121    return true;
       
 56122  }
       
 56123  
       
 56124 +bool BasicSourceLineResolver::Module::LoadMap(const string &map_file) {
       
 56125 +  struct stat buf;
       
 56126 +  int error_code = stat(map_file.c_str(), &buf);
       
 56127 +  if (error_code == -1) {
       
 56128 +    string error_string;
       
 56129 +    int error_code = ErrnoString(&error_string);
       
 56130 +    BPLOG(ERROR) << "Could not open " << map_file <<
       
 56131 +        ", error " << error_code << ": " << error_string;
       
 56132 +    return false;
       
 56133 +  }
       
 56134 +
       
 56135 +  off_t file_size = buf.st_size;
       
 56136 +
       
 56137 +  // Allocate memory for file contents, plus a null terminator
       
 56138 +  // since we'll use strtok() on the contents.
       
 56139 +  char *file_buffer = new char[sizeof(char)*file_size + 1];
       
 56140 +
       
 56141 +  if (file_buffer == NULL) {
       
 56142 +    BPLOG(ERROR) << "Could not allocate memory for " << map_file;
       
 56143 +    return false;
       
 56144 +  }
       
 56145 +
       
 56146 +  BPLOG(ERROR) << "Opening " << map_file;
       
 56147 +
       
 56148 +  FILE *f = fopen(map_file.c_str(), "rt");
       
 56149 +  if (!f) {
       
 56150 +    string error_string;
       
 56151 +    int error_code = ErrnoString(&error_string);
       
 56152 +    BPLOG(ERROR) << "Could not open " << map_file <<
       
 56153 +        ", error " << error_code << ": " << error_string;
       
 56154 +    delete [] file_buffer;
       
 56155 +    return false;
       
 56156 +  }
       
 56157 +
       
 56158 +  AutoFileCloser closer(f);
       
 56159 +
       
 56160 +  int items_read = 0;
       
 56161 +
       
 56162 +  items_read = fread(file_buffer, 1, file_size, f);
       
 56163 +
       
 56164 +  if (items_read != file_size) {
       
 56165 +    string error_string;
       
 56166 +    int error_code = ErrnoString(&error_string);
       
 56167 +    BPLOG(ERROR) << "Could not slurp " << map_file <<
       
 56168 +        ", error " << error_code << ": " << error_string;
       
 56169 +    delete [] file_buffer;
       
 56170 +    return false;
       
 56171 +  }
       
 56172 +  file_buffer[file_size] = '\0';
       
 56173 +  string map_buffer(file_buffer);
       
 56174 +  delete [] file_buffer;
       
 56175 +
       
 56176 +  return LoadMapFromBuffer(map_buffer);
       
 56177 +}
       
 56178 +
       
 56179  StackFrameInfo* BasicSourceLineResolver::Module::LookupAddress(
       
 56180      StackFrame *frame) const {
       
 56181    MemAddr address = frame->instruction - frame->module->base_address();
       
 56182  
       
 56183    linked_ptr<StackFrameInfo> retrieved_info;
       
 56184    // Check for debugging info first, before any possible early returns.
       
 56185    //
       
 56186    // We only know about STACK_INFO_FRAME_DATA and STACK_INFO_FPO.  Prefer
       
 56187 @@ -595,20 +690,14 @@ bool BasicSourceLineResolver::Module::Pa
       
 56188                           max_stack_size,
       
 56189                           allocates_base_pointer,
       
 56190                           program_string));
       
 56191    stack_info_[type].StoreRange(rva, code_size, stack_frame_info);
       
 56192  
       
 56193    return true;
       
 56194  }
       
 56195  
       
 56196 -#ifdef BSLR_NO_HASH_MAP
       
 56197  bool BasicSourceLineResolver::CompareString::operator()(
       
 56198      const string &s1, const string &s2) const {
       
 56199    return strcmp(s1.c_str(), s2.c_str()) < 0;
       
 56200  }
       
 56201 -#else  // BSLR_NO_HASH_MAP
       
 56202 -size_t BasicSourceLineResolver::HashString::operator()(const string &s) const {
       
 56203 -  return hash<const char*>()(s.c_str());
       
 56204 -}
       
 56205 -#endif  // BSLR_NO_HASH_MAP
       
 56206  
       
 56207  }  // namespace google_breakpad
       
 56208 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver_unittest.cc b/toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver_unittest.cc
       
 56209 --- a/toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver_unittest.cc
       
 56210 +++ b/toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver_unittest.cc
       
 56211 @@ -168,30 +168,34 @@ static bool RunTests() {
       
 56212    ASSERT_EQ(frame.module->code_file(), "module2");
       
 56213    ASSERT_EQ(frame.source_file_name, "file2_2.cc");
       
 56214    ASSERT_EQ(frame.source_line, 21);
       
 56215    ASSERT_EQ(frame.source_line_base, 0x2180);
       
 56216    ASSERT_TRUE(frame_info.get());
       
 56217    ASSERT_EQ(frame_info->prolog_size, 1);
       
 56218  
       
 56219    frame.instruction = 0x216f;
       
 56220 -  resolver.FillSourceLineInfo(&frame);
       
 56221 +  StackFrameInfo *s;
       
 56222 +  s = resolver.FillSourceLineInfo(&frame);
       
 56223    ASSERT_EQ(frame.function_name, "Public2_1");
       
 56224 +  delete s;
       
 56225  
       
 56226    ClearSourceLineInfo(&frame);
       
 56227    frame.instruction = 0x219f;
       
 56228    frame.module = &module2;
       
 56229    resolver.FillSourceLineInfo(&frame);
       
 56230    ASSERT_TRUE(frame.function_name.empty());
       
 56231  
       
 56232    frame.instruction = 0x21a0;
       
 56233    frame.module = &module2;
       
 56234 -  resolver.FillSourceLineInfo(&frame);
       
 56235 +  s = resolver.FillSourceLineInfo(&frame);
       
 56236    ASSERT_EQ(frame.function_name, "Public2_2");
       
 56237  
       
 56238 +  delete s;
       
 56239 +
       
 56240    ASSERT_FALSE(resolver.LoadModule("module3",
       
 56241                                     testdata_dir + "/module3_bad.out"));
       
 56242    ASSERT_FALSE(resolver.HasModule("module3"));
       
 56243    ASSERT_FALSE(resolver.LoadModule("module4",
       
 56244                                     testdata_dir + "/module4_bad.out"));
       
 56245    ASSERT_FALSE(resolver.HasModule("module4"));
       
 56246    ASSERT_FALSE(resolver.LoadModule("module5",
       
 56247                                     testdata_dir + "/invalid-filename"));
       
 56248 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/contained_range_map-inl.h b/toolkit/crashreporter/google-breakpad/src/processor/contained_range_map-inl.h
       
 56249 --- a/toolkit/crashreporter/google-breakpad/src/processor/contained_range_map-inl.h
       
 56250 +++ b/toolkit/crashreporter/google-breakpad/src/processor/contained_range_map-inl.h
       
 56251 @@ -55,18 +55,22 @@ ContainedRangeMap<AddressType, EntryType
       
 56252  
       
 56253  template<typename AddressType, typename EntryType>
       
 56254  bool ContainedRangeMap<AddressType, EntryType>::StoreRange(
       
 56255      const AddressType &base, const AddressType &size, const EntryType &entry) {
       
 56256    AddressType high = base + size - 1;
       
 56257  
       
 56258    // Check for undersize or overflow.
       
 56259    if (size <= 0 || high < base) {
       
 56260 -    BPLOG(INFO) << "StoreRange failed, " << HexString(base) << "+" <<
       
 56261 -                   HexString(size) << ", " << HexString(high);
       
 56262 +    //TODO(nealsid) We are commenting this out in order to prevent
       
 56263 +    // excessive logging.  We plan to move to better logging as this
       
 56264 +    // failure happens quite often and is expected(see comment in
       
 56265 +    // basic_source_line_resolver.cc:671).
       
 56266 +    // BPLOG(INFO) << "StoreRange failed, " << HexString(base) << "+"
       
 56267 +    // << HexString(size) << ", " << HexString(high);
       
 56268      return false;
       
 56269    }
       
 56270  
       
 56271    if (!map_)
       
 56272      map_ = new AddressToRangeMap();
       
 56273  
       
 56274    MapIterator iterator_base = map_->lower_bound(base);
       
 56275    MapIterator iterator_high = map_->lower_bound(high);
       
 56276 @@ -76,18 +80,19 @@ bool ContainedRangeMap<AddressType, Entr
       
 56277        base >= iterator_base->second->base_) {
       
 56278      // The new range is entirely within an existing child range.
       
 56279  
       
 56280      // If the new range's geometry is exactly equal to an existing child
       
 56281      // range's, it violates the containment rules, and an attempt to store
       
 56282      // it must fail.  iterator_base->first contains the key, which was the
       
 56283      // containing child's high address.
       
 56284      if (iterator_base->second->base_ == base && iterator_base->first == high) {
       
 56285 -      BPLOG(INFO) << "StoreRange failed, identical range is already "
       
 56286 -                     "present: " << HexString(base) << "+" << HexString(size);
       
 56287 +      // TODO(nealsid): See the TODO above on why this is commented out.
       
 56288 +//       BPLOG(INFO) << "StoreRange failed, identical range is already "
       
 56289 +//                      "present: " << HexString(base) << "+" << HexString(size);
       
 56290        return false;
       
 56291      }
       
 56292  
       
 56293      // Pass the new range on to the child to attempt to store.
       
 56294      return iterator_base->second->StoreRange(base, size, entry);
       
 56295    }
       
 56296  
       
 56297    // iterator_high might refer to an irrelevant range: one whose base address
       
 56298 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/minidump.cc b/toolkit/crashreporter/google-breakpad/src/processor/minidump.cc
       
 56299 --- a/toolkit/crashreporter/google-breakpad/src/processor/minidump.cc
       
 56300 +++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump.cc
       
 56301 @@ -45,32 +45,36 @@ typedef SSIZE_T ssize_t;
       
 56302  #define open _open
       
 56303  #define read _read
       
 56304  #define lseek _lseek
       
 56305  #else  // _WIN32
       
 56306  #define O_BINARY 0
       
 56307  #endif  // _WIN32
       
 56308  
       
 56309  #include <cassert>
       
 56310 +#include <fstream>
       
 56311 +#include <iostream>
       
 56312  #include <limits>
       
 56313  #include <map>
       
 56314  #include <vector>
       
 56315  
       
 56316  #include "processor/range_map-inl.h"
       
 56317  
       
 56318  #include "google_breakpad/processor/minidump.h"
       
 56319  #include "processor/basic_code_module.h"
       
 56320  #include "processor/basic_code_modules.h"
       
 56321  #include "processor/logging.h"
       
 56322  #include "processor/scoped_ptr.h"
       
 56323  
       
 56324  
       
 56325  namespace google_breakpad {
       
 56326  
       
 56327  
       
 56328 +using std::istream;
       
 56329 +using std::ifstream;
       
 56330  using std::numeric_limits;
       
 56331  using std::vector;
       
 56332  
       
 56333  
       
 56334  //
       
 56335  // Swapping routines
       
 56336  //
       
 56337  // Inlining these doesn't increase code size significantly, and it saves
       
 56338 @@ -238,16 +242,25 @@ static string* UTF16ToUTF8(const vector<
       
 56339                        HexString(unichar) << " in UTF-8";
       
 56340        return NULL;
       
 56341      }
       
 56342    }
       
 56343  
       
 56344    return out.release();
       
 56345  }
       
 56346  
       
 56347 +// Return the smaller of the number of code units in the UTF-16 string,
       
 56348 +// not including the terminating null word, or maxlen.
       
 56349 +static size_t UTF16codeunits(const u_int16_t *string, size_t maxlen) {
       
 56350 +  size_t count = 0;
       
 56351 +  while (count < maxlen && string[count] != 0)
       
 56352 +    count++;
       
 56353 +  return count;
       
 56354 +}
       
 56355 +
       
 56356  
       
 56357  //
       
 56358  // MinidumpObject
       
 56359  //
       
 56360  
       
 56361  
       
 56362  MinidumpObject::MinidumpObject(Minidump* minidump)
       
 56363      : minidump_(minidump),
       
 56364 @@ -602,19 +615,75 @@ bool MinidumpContext::Read(u_int32_t exp
       
 56365            Swap(&context_sparc->float_save.filler);
       
 56366            Swap(&context_sparc->float_save.fsr);
       
 56367          }
       
 56368          context_.ctx_sparc = context_sparc.release();
       
 56369  
       
 56370          break;
       
 56371        }
       
 56372  
       
 56373 +      case MD_CONTEXT_ARM: {
       
 56374 +        if (expected_size != sizeof(MDRawContextARM)) {
       
 56375 +          BPLOG(ERROR) << "MinidumpContext arm size mismatch, " <<
       
 56376 +            expected_size << " != " << sizeof(MDRawContextARM);
       
 56377 +          return false;
       
 56378 +        }
       
 56379 +
       
 56380 +        scoped_ptr<MDRawContextARM> context_arm(new MDRawContextARM());
       
 56381 +
       
 56382 +        // Set the context_flags member, which has already been read, and
       
 56383 +        // read the rest of the structure beginning with the first member
       
 56384 +        // after context_flags.
       
 56385 +        context_arm->context_flags = context_flags;
       
 56386 +
       
 56387 +        size_t flags_size = sizeof(context_arm->context_flags);
       
 56388 +        u_int8_t* context_after_flags =
       
 56389 +            reinterpret_cast<u_int8_t*>(context_arm.get()) + flags_size;
       
 56390 +        if (!minidump_->ReadBytes(context_after_flags,
       
 56391 +                                  sizeof(MDRawContextARM) - flags_size)) {
       
 56392 +          BPLOG(ERROR) << "MinidumpContext could not read arm context";
       
 56393 +          return false;
       
 56394 +        }
       
 56395 +
       
 56396 +        // Do this after reading the entire MDRawContext structure because
       
 56397 +        // GetSystemInfo may seek minidump to a new position.
       
 56398 +        if (!CheckAgainstSystemInfo(cpu_type)) {
       
 56399 +          BPLOG(ERROR) << "MinidumpContext arm does not match system info";
       
 56400 +          return false;
       
 56401 +        }
       
 56402 +
       
 56403 +        if (minidump_->swap()) {
       
 56404 +          // context_arm->context_flags was already swapped.
       
 56405 +          for (unsigned int ireg_index = 0;
       
 56406 +               ireg_index < MD_CONTEXT_ARM_GPR_COUNT;
       
 56407 +               ++ireg_index) {
       
 56408 +            Swap(&context_arm->iregs[ireg_index]);
       
 56409 +          }
       
 56410 +          Swap(&context_arm->cpsr);
       
 56411 +          Swap(&context_arm->float_save.fpscr);
       
 56412 +          for (unsigned int fpr_index = 0;
       
 56413 +               fpr_index < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT;
       
 56414 +               ++fpr_index) {
       
 56415 +            Swap(&context_arm->float_save.regs[fpr_index]);
       
 56416 +          }
       
 56417 +          for (unsigned int fpe_index = 0;
       
 56418 +               fpe_index < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT;
       
 56419 +               ++fpe_index) {
       
 56420 +            Swap(&context_arm->float_save.extra[fpe_index]);
       
 56421 +          }
       
 56422 +        }
       
 56423 +        context_.arm = context_arm.release();
       
 56424 +
       
 56425 +        break;
       
 56426 +      }
       
 56427 +
       
 56428        default: {
       
 56429 -        // Unknown context type
       
 56430 -        BPLOG(ERROR) << "MinidumpContext unknown context type " <<
       
 56431 +        // Unknown context type - Don't log as an error yet. Let the 
       
 56432 +        // caller work that out.
       
 56433 +        BPLOG(INFO) << "MinidumpContext unknown context type " <<
       
 56434            HexString(cpu_type);
       
 56435          return false;
       
 56436          break;
       
 56437        }
       
 56438      }
       
 56439      context_flags_ = context_flags;
       
 56440    }
       
 56441  
       
 56442 @@ -666,16 +735,25 @@ const MDRawContextSPARC* MinidumpContext
       
 56443    if (GetContextCPU() != MD_CONTEXT_SPARC) {
       
 56444      BPLOG(ERROR) << "MinidumpContext cannot get sparc context";
       
 56445      return NULL;
       
 56446    }
       
 56447  
       
 56448    return context_.ctx_sparc;
       
 56449  }
       
 56450  
       
 56451 +const MDRawContextARM* MinidumpContext::GetContextARM() const {
       
 56452 +  if (GetContextCPU() != MD_CONTEXT_ARM) {
       
 56453 +    BPLOG(ERROR) << "MinidumpContext cannot get arm context";
       
 56454 +    return NULL;
       
 56455 +  }
       
 56456 +
       
 56457 +  return context_.arm;
       
 56458 +}
       
 56459 +
       
 56460  void MinidumpContext::FreeContext() {
       
 56461    switch (GetContextCPU()) {
       
 56462      case MD_CONTEXT_X86:
       
 56463        delete context_.x86;
       
 56464        break;
       
 56465  
       
 56466      case MD_CONTEXT_PPC:
       
 56467        delete context_.ppc;
       
 56468 @@ -684,16 +762,20 @@ void MinidumpContext::FreeContext() {
       
 56469      case MD_CONTEXT_AMD64:
       
 56470        delete context_.amd64;
       
 56471        break;
       
 56472  
       
 56473      case MD_CONTEXT_SPARC:
       
 56474        delete context_.ctx_sparc;
       
 56475        break;
       
 56476  
       
 56477 +    case MD_CONTEXT_ARM:
       
 56478 +      delete context_.arm;
       
 56479 +      break;
       
 56480 +
       
 56481      default:
       
 56482        // There is no context record (valid_ is false) or there's a
       
 56483        // context record for an unknown CPU (shouldn't happen, only known
       
 56484        // records are stored by Read).
       
 56485        break;
       
 56486    }
       
 56487  
       
 56488    context_flags_ = 0;
       
 56489 @@ -743,16 +825,21 @@ bool MinidumpContext::CheckAgainstSystem
       
 56490        if (system_info_cpu_type == MD_CPU_ARCHITECTURE_AMD64)
       
 56491          return_value = true;
       
 56492        break;
       
 56493  
       
 56494      case MD_CONTEXT_SPARC:
       
 56495        if (system_info_cpu_type == MD_CPU_ARCHITECTURE_SPARC)
       
 56496          return_value = true;
       
 56497        break;
       
 56498 +
       
 56499 +    case MD_CONTEXT_ARM:
       
 56500 +      if (system_info_cpu_type == MD_CPU_ARCHITECTURE_ARM)
       
 56501 +        return_value = true;
       
 56502 +      break;
       
 56503    }
       
 56504  
       
 56505    BPLOG_IF(ERROR, !return_value) << "MinidumpContext CPU " <<
       
 56506                                      HexString(context_cpu_type) <<
       
 56507                                      " wrong for MinidumpSysmtemInfo CPU " <<
       
 56508                                      HexString(system_info_cpu_type);
       
 56509  
       
 56510    return return_value;
       
 56511 @@ -948,16 +1035,46 @@ void MinidumpContext::Print() {
       
 56512        }
       
 56513        printf("  float_save.filler   = 0x%" PRIx64 "\n",
       
 56514               context_sparc->float_save.filler);
       
 56515        printf("  float_save.fsr      = 0x%" PRIx64 "\n",
       
 56516               context_sparc->float_save.fsr);
       
 56517        break;
       
 56518      }
       
 56519  
       
 56520 +    case MD_CONTEXT_ARM: {
       
 56521 +      const MDRawContextARM* context_arm = GetContextARM();
       
 56522 +      printf("MDRawContextARM\n");
       
 56523 +      printf("  context_flags       = 0x%x\n",
       
 56524 +             context_arm->context_flags);
       
 56525 +      for (unsigned int ireg_index = 0;
       
 56526 +           ireg_index < MD_CONTEXT_ARM_GPR_COUNT;
       
 56527 +           ++ireg_index) {
       
 56528 +        printf("  iregs[%2d]            = 0x%x\n",
       
 56529 +               ireg_index, context_arm->iregs[ireg_index]);
       
 56530 +      }
       
 56531 +      printf("  cpsr                = 0x%x\n", context_arm->cpsr);
       
 56532 +      printf("  float_save.fpscr     = 0x%" PRIx64 "\n",
       
 56533 +             context_arm->float_save.fpscr);
       
 56534 +      for (unsigned int fpr_index = 0;
       
 56535 +           fpr_index < MD_FLOATINGSAVEAREA_ARM_FPR_COUNT;
       
 56536 +           ++fpr_index) {
       
 56537 +        printf("  float_save.regs[%2d] = 0x%" PRIx64 "\n",
       
 56538 +               fpr_index, context_arm->float_save.regs[fpr_index]);
       
 56539 +      }
       
 56540 +      for (unsigned int fpe_index = 0;
       
 56541 +           fpe_index < MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT;
       
 56542 +           ++fpe_index) {
       
 56543 +        printf("  float_save.extra[%2d] = 0x%" PRIx64 "\n",
       
 56544 +               fpe_index, context_arm->float_save.extra[fpe_index]);
       
 56545 +      }
       
 56546 +
       
 56547 +      break;
       
 56548 +    }
       
 56549 +
       
 56550      default: {
       
 56551        break;
       
 56552      }
       
 56553    }
       
 56554  }
       
 56555  
       
 56556  
       
 56557  //
       
 56558 @@ -1297,17 +1414,17 @@ void MinidumpThread::Print() {
       
 56559  }
       
 56560  
       
 56561  
       
 56562  //
       
 56563  // MinidumpThreadList
       
 56564  //
       
 56565  
       
 56566  
       
 56567 -u_int32_t MinidumpThreadList::max_threads_ = 256;
       
 56568 +u_int32_t MinidumpThreadList::max_threads_ = 4096;
       
 56569  
       
 56570  
       
 56571  MinidumpThreadList::MinidumpThreadList(Minidump* minidump)
       
 56572      : MinidumpStream(minidump),
       
 56573        id_to_thread_map_(),
       
 56574        threads_(NULL),
       
 56575        thread_count_(0) {
       
 56576  }
       
 56577 @@ -1459,18 +1576,18 @@ void MinidumpThreadList::Print() {
       
 56578  }
       
 56579  
       
 56580  
       
 56581  //
       
 56582  // MinidumpModule
       
 56583  //
       
 56584  
       
 56585  
       
 56586 -u_int32_t MinidumpModule::max_cv_bytes_ = 1024;
       
 56587 -u_int32_t MinidumpModule::max_misc_bytes_ = 1024;
       
 56588 +u_int32_t MinidumpModule::max_cv_bytes_ = 32768;
       
 56589 +u_int32_t MinidumpModule::max_misc_bytes_ = 32768;
       
 56590  
       
 56591  
       
 56592  MinidumpModule::MinidumpModule(Minidump* minidump)
       
 56593      : MinidumpObject(minidump),
       
 56594        module_valid_(false),
       
 56595        has_debug_info_(false),
       
 56596        module_(),
       
 56597        name_(NULL),
       
 56598 @@ -2419,17 +2536,17 @@ void MinidumpModuleList::Print() {
       
 56599  }
       
 56600  
       
 56601  
       
 56602  //
       
 56603  // MinidumpMemoryList
       
 56604  //
       
 56605  
       
 56606  
       
 56607 -u_int32_t MinidumpMemoryList::max_regions_ = 256;
       
 56608 +u_int32_t MinidumpMemoryList::max_regions_ = 4096;
       
 56609  
       
 56610  
       
 56611  MinidumpMemoryList::MinidumpMemoryList(Minidump* minidump)
       
 56612      : MinidumpStream(minidump),
       
 56613        range_map_(new RangeMap<u_int64_t, unsigned int>()),
       
 56614        descriptors_(NULL),
       
 56615        regions_(NULL),
       
 56616        region_count_(0) {
       
 56617 @@ -2708,18 +2825,20 @@ MinidumpContext* MinidumpException::GetC
       
 56618    if (!context_) {
       
 56619      if (!minidump_->SeekSet(exception_.thread_context.rva)) {
       
 56620        BPLOG(ERROR) << "MinidumpException cannot seek to context";
       
 56621        return NULL;
       
 56622      }
       
 56623  
       
 56624      scoped_ptr<MinidumpContext> context(new MinidumpContext(minidump_));
       
 56625  
       
 56626 +    // Don't log as an error if we can still fall back on the thread's context
       
 56627 +    // (which must be possible if we got this far.)
       
 56628      if (!context->Read(exception_.thread_context.data_size)) {
       
 56629 -      BPLOG(ERROR) << "MinidumpException cannot read context";
       
 56630 +      BPLOG(INFO) << "MinidumpException cannot read context";
       
 56631        return NULL;
       
 56632      }
       
 56633  
       
 56634      context_ = context.release();
       
 56635    }
       
 56636  
       
 56637    return context_;
       
 56638  }
       
 56639 @@ -2760,16 +2879,119 @@ void MinidumpException::Print() {
       
 56640      printf("\n");
       
 56641      context->Print();
       
 56642    } else {
       
 56643      printf("  (no context)\n");
       
 56644      printf("\n");
       
 56645    }
       
 56646  }
       
 56647  
       
 56648 +//
       
 56649 +// MinidumpAssertion
       
 56650 +//
       
 56651 +
       
 56652 +
       
 56653 +MinidumpAssertion::MinidumpAssertion(Minidump* minidump)
       
 56654 +    : MinidumpStream(minidump),
       
 56655 +      assertion_(),
       
 56656 +      expression_(),
       
 56657 +      function_(),
       
 56658 +      file_() {
       
 56659 +}
       
 56660 +
       
 56661 +
       
 56662 +MinidumpAssertion::~MinidumpAssertion() {
       
 56663 +}
       
 56664 +
       
 56665 +
       
 56666 +bool MinidumpAssertion::Read(u_int32_t expected_size) {
       
 56667 +  // Invalidate cached data.
       
 56668 +  valid_ = false;
       
 56669 +
       
 56670 +  if (expected_size != sizeof(assertion_)) {
       
 56671 +    BPLOG(ERROR) << "MinidumpAssertion size mismatch, " << expected_size <<
       
 56672 +                    " != " << sizeof(assertion_);
       
 56673 +    return false;
       
 56674 +  }
       
 56675 +
       
 56676 +  if (!minidump_->ReadBytes(&assertion_, sizeof(assertion_))) {
       
 56677 +    BPLOG(ERROR) << "MinidumpAssertion cannot read assertion";
       
 56678 +    return false;
       
 56679 +  }
       
 56680 +
       
 56681 +  // Each of {expression, function, file} is a UTF-16 string,
       
 56682 +  // we'll convert them to UTF-8 for ease of use.
       
 56683 +  // expression
       
 56684 +  // Since we don't have an explicit byte length for each string,
       
 56685 +  // we use UTF16codeunits to calculate word length, then derive byte
       
 56686 +  // length from that.
       
 56687 +  u_int32_t word_length = UTF16codeunits(assertion_.expression,
       
 56688 +                                         sizeof(assertion_.expression));
       
 56689 +  if (word_length > 0) {
       
 56690 +    u_int32_t byte_length = word_length * 2;
       
 56691 +    vector<u_int16_t> expression_utf16(word_length);
       
 56692 +    memcpy(&expression_utf16[0], &assertion_.expression[0], byte_length);
       
 56693 +
       
 56694 +    scoped_ptr<string> new_expression(UTF16ToUTF8(expression_utf16,
       
 56695 +                                                  minidump_->swap()));
       
 56696 +    expression_ = *new_expression;
       
 56697 +  }
       
 56698 +  
       
 56699 +  // assertion
       
 56700 +  word_length = UTF16codeunits(assertion_.function,
       
 56701 +                               sizeof(assertion_.function));
       
 56702 +  if (word_length) {
       
 56703 +    u_int32_t byte_length = word_length * 2;
       
 56704 +    vector<u_int16_t> function_utf16(word_length);
       
 56705 +    memcpy(&function_utf16[0], &assertion_.function[0], byte_length);
       
 56706 +    scoped_ptr<string> new_function(UTF16ToUTF8(function_utf16,
       
 56707 +                                                minidump_->swap()));
       
 56708 +    function_ = *new_function;
       
 56709 +  }
       
 56710 +
       
 56711 +  // file
       
 56712 +  word_length = UTF16codeunits(assertion_.file,
       
 56713 +                               sizeof(assertion_.file));
       
 56714 +  if (word_length > 0) {
       
 56715 +    u_int32_t byte_length = word_length * 2;
       
 56716 +    vector<u_int16_t> file_utf16(word_length);
       
 56717 +    memcpy(&file_utf16[0], &assertion_.file[0], byte_length);
       
 56718 +    scoped_ptr<string> new_file(UTF16ToUTF8(file_utf16,
       
 56719 +                                            minidump_->swap()));
       
 56720 +    file_ = *new_file;
       
 56721 +  }
       
 56722 +
       
 56723 +  if (minidump_->swap()) {
       
 56724 +    Swap(&assertion_.line);
       
 56725 +    Swap(&assertion_.type);
       
 56726 +  }
       
 56727 +
       
 56728 +  valid_ = true;
       
 56729 +  return true;
       
 56730 +}
       
 56731 +
       
 56732 +void MinidumpAssertion::Print() {
       
 56733 +  if (!valid_) {
       
 56734 +    BPLOG(ERROR) << "MinidumpAssertion cannot print invalid data";
       
 56735 +    return;
       
 56736 +  }
       
 56737 +
       
 56738 +  printf("MDAssertion\n");
       
 56739 +  printf("  expression                                 = %s\n",
       
 56740 +         expression_.c_str());
       
 56741 +  printf("  function                                   = %s\n",
       
 56742 +         function_.c_str());
       
 56743 +  printf("  file                                       = %s\n",
       
 56744 +         file_.c_str());
       
 56745 +  printf("  line                                       = %u\n",
       
 56746 +         assertion_.line);
       
 56747 +  printf("  type                                       = %u\n",
       
 56748 +         assertion_.type);
       
 56749 +  printf("\n");
       
 56750 +}
       
 56751  
       
 56752  //
       
 56753  // MinidumpSystemInfo
       
 56754  //
       
 56755  
       
 56756  
       
 56757  MinidumpSystemInfo::MinidumpSystemInfo(Minidump* minidump)
       
 56758      : MinidumpStream(minidump),
       
 56759 @@ -2882,24 +3104,32 @@ string MinidumpSystemInfo::GetCPU() {
       
 56760    string cpu;
       
 56761  
       
 56762    switch (system_info_.processor_architecture) {
       
 56763      case MD_CPU_ARCHITECTURE_X86:
       
 56764      case MD_CPU_ARCHITECTURE_X86_WIN64:
       
 56765        cpu = "x86";
       
 56766        break;
       
 56767  
       
 56768 +    case MD_CPU_ARCHITECTURE_AMD64:
       
 56769 +      cpu = "x86-64";
       
 56770 +      break;
       
 56771 +
       
 56772      case MD_CPU_ARCHITECTURE_PPC:
       
 56773        cpu = "ppc";
       
 56774        break;
       
 56775  
       
 56776      case MD_CPU_ARCHITECTURE_SPARC:
       
 56777        cpu = "sparc";
       
 56778        break;
       
 56779  
       
 56780 +    case MD_CPU_ARCHITECTURE_ARM:
       
 56781 +      cpu = "arm";
       
 56782 +      break;
       
 56783 +
       
 56784      default:
       
 56785        BPLOG(ERROR) << "MinidumpSystemInfo unknown CPU for architecture " <<
       
 56786                        HexString(system_info_.processor_architecture);
       
 56787        break;
       
 56788    }
       
 56789  
       
 56790    return cpu;
       
 56791  }
       
 56792 @@ -3211,53 +3441,62 @@ u_int32_t Minidump::max_streams_ = 128;
       
 56793  unsigned int Minidump::max_string_length_ = 1024;
       
 56794  
       
 56795  
       
 56796  Minidump::Minidump(const string& path)
       
 56797      : header_(),
       
 56798        directory_(NULL),
       
 56799        stream_map_(new MinidumpStreamMap()),
       
 56800        path_(path),
       
 56801 -      fd_(-1),
       
 56802 +      stream_(NULL),
       
 56803        swap_(false),
       
 56804        valid_(false) {
       
 56805  }
       
 56806  
       
 56807 +Minidump::Minidump(istream& stream)
       
 56808 +    : header_(),
       
 56809 +      directory_(NULL),
       
 56810 +      stream_map_(new MinidumpStreamMap()),
       
 56811 +      path_(),
       
 56812 +      stream_(&stream),
       
 56813 +      swap_(false),
       
 56814 +      valid_(false) {
       
 56815 +}
       
 56816  
       
 56817  Minidump::~Minidump() {
       
 56818 +  if (stream_) {
       
 56819 +    BPLOG(INFO) << "Minidump closing minidump";
       
 56820 +  }
       
 56821 +  if (!path_.empty()) {
       
 56822 +    delete stream_;
       
 56823 +  }
       
 56824    delete directory_;
       
 56825    delete stream_map_;
       
 56826 -  if (fd_ != -1) {
       
 56827 -    BPLOG(INFO) << "Minidump closing minidump on fd " << fd_;
       
 56828 -    close(fd_);
       
 56829 -  }
       
 56830  }
       
 56831  
       
 56832  
       
 56833  bool Minidump::Open() {
       
 56834 -  if (fd_ != -1) {
       
 56835 -    BPLOG(INFO) << "Minidump reopening minidump " << path_ << " on fd " << fd_;
       
 56836 +  if (stream_ != NULL) {
       
 56837 +    BPLOG(INFO) << "Minidump reopening minidump " << path_;
       
 56838  
       
 56839      // The file is already open.  Seek to the beginning, which is the position
       
 56840      // the file would be at if it were opened anew.
       
 56841      return SeekSet(0);
       
 56842    }
       
 56843  
       
 56844 -  // O_BINARY is useful (and defined) on Windows.  On other platforms, it's
       
 56845 -  // useless, and because it's defined as 0 above, harmless.
       
 56846 -  fd_ = open(path_.c_str(), O_RDONLY | O_BINARY);
       
 56847 -  if (fd_ == -1) {
       
 56848 +  stream_ = new ifstream(path_.c_str(), std::ios::in | std::ios::binary);
       
 56849 +  if (!stream_ || !stream_->good()) {
       
 56850      string error_string;
       
 56851      int error_code = ErrnoString(&error_string);
       
 56852      BPLOG(ERROR) << "Minidump could not open minidump " << path_ <<
       
 56853                      ", error " << error_code << ": " << error_string;
       
 56854      return false;
       
 56855    }
       
 56856  
       
 56857 -  BPLOG(INFO) << "Minidump opened minidump " << path_ << " on fd " << fd_;
       
 56858 +  BPLOG(INFO) << "Minidump opened minidump " << path_;
       
 56859    return true;
       
 56860  }
       
 56861  
       
 56862  
       
 56863  bool Minidump::Read() {
       
 56864    // Invalidate cached data.
       
 56865    delete directory_;
       
 56866    directory_ = NULL;
       
 56867 @@ -3407,16 +3646,21 @@ MinidumpMemoryList* Minidump::GetMemoryL
       
 56868  }
       
 56869  
       
 56870  
       
 56871  MinidumpException* Minidump::GetException() {
       
 56872    MinidumpException* exception;
       
 56873    return GetStream(&exception);
       
 56874  }
       
 56875  
       
 56876 +MinidumpAssertion* Minidump::GetAssertion() {
       
 56877 +  MinidumpAssertion* assertion;
       
 56878 +  return GetStream(&assertion);
       
 56879 +}
       
 56880 +
       
 56881  
       
 56882  MinidumpSystemInfo* Minidump::GetSystemInfo() {
       
 56883    MinidumpSystemInfo* system_info;
       
 56884    return GetStream(&system_info);
       
 56885  }
       
 56886  
       
 56887  
       
 56888  MinidumpMiscInfo* Minidump::GetMiscInfo() {
       
 56889 @@ -3492,53 +3736,60 @@ const MDRawDirectory* Minidump::GetDirec
       
 56890    }
       
 56891  
       
 56892    return &(*directory_)[index];
       
 56893  }
       
 56894  
       
 56895  
       
 56896  bool Minidump::ReadBytes(void* bytes, size_t count) {
       
 56897    // Can't check valid_ because Read needs to call this method before
       
 56898 -  // validity can be determined.  The only member that this method
       
 56899 -  // depends on is mFD, and an unset or invalid fd may generate an
       
 56900 -  // error but should not cause a crash.
       
 56901 -  ssize_t bytes_read = read(fd_, bytes, count);
       
 56902 +  // validity can be determined.
       
 56903 +  if (!stream_) {
       
 56904 +    return false;
       
 56905 +  }
       
 56906 +  stream_->read(static_cast<char*>(bytes), count);
       
 56907 +  size_t bytes_read = stream_->gcount();
       
 56908    if (static_cast<size_t>(bytes_read) != count) {
       
 56909      if (bytes_read == -1) {
       
 56910        string error_string;
       
 56911        int error_code = ErrnoString(&error_string);
       
 56912        BPLOG(ERROR) << "ReadBytes: error " << error_code << ": " << error_string;
       
 56913      } else {
       
 56914        BPLOG(ERROR) << "ReadBytes: read " << bytes_read << "/" << count;
       
 56915      }
       
 56916      return false;
       
 56917    }
       
 56918    return true;
       
 56919  }
       
 56920  
       
 56921  
       
 56922  bool Minidump::SeekSet(off_t offset) {
       
 56923    // Can't check valid_ because Read needs to call this method before
       
 56924 -  // validity can be determined.  The only member that this method
       
 56925 -  // depends on is mFD, and an unset or invalid fd may generate an
       
 56926 -  // error but should not cause a crash.
       
 56927 -  off_t sought = lseek(fd_, offset, SEEK_SET);
       
 56928 -  if (sought != offset) {
       
 56929 -    if (sought == -1) {
       
 56930 -      string error_string;
       
 56931 -      int error_code = ErrnoString(&error_string);
       
 56932 -      BPLOG(ERROR) << "SeekSet: error " << error_code << ": " << error_string;
       
 56933 -    } else {
       
 56934 -      BPLOG(ERROR) << "SeekSet: sought " << sought << "/" << offset;
       
 56935 -    }
       
 56936 +  // validity can be determined.
       
 56937 +  if (!stream_) {
       
 56938 +    return false;
       
 56939 +  }
       
 56940 +  stream_->seekg(offset, std::ios_base::beg);
       
 56941 +  if (!stream_->good()) {
       
 56942 +    string error_string;
       
 56943 +    int error_code = ErrnoString(&error_string);
       
 56944 +    BPLOG(ERROR) << "SeekSet: error " << error_code << ": " << error_string;
       
 56945      return false;
       
 56946    }
       
 56947    return true;
       
 56948  }
       
 56949  
       
 56950 +off_t Minidump::Tell() {
       
 56951 +  if (!valid_ || !stream_) {
       
 56952 +    return (off_t)-1;
       
 56953 +  }
       
 56954 +
       
 56955 +  return stream_->tellg();
       
 56956 +}
       
 56957 +
       
 56958  
       
 56959  string* Minidump::ReadString(off_t offset) {
       
 56960    if (!valid_) {
       
 56961      BPLOG(ERROR) << "Invalid Minidump for ReadString";
       
 56962      return NULL;
       
 56963    }
       
 56964    if (!SeekSet(offset)) {
       
 56965      BPLOG(ERROR) << "ReadString could not seek to string at offset " << offset;
       
 56966 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/minidump_dump.cc b/toolkit/crashreporter/google-breakpad/src/processor/minidump_dump.cc
       
 56967 --- a/toolkit/crashreporter/google-breakpad/src/processor/minidump_dump.cc
       
 56968 +++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump_dump.cc
       
 56969 @@ -39,16 +39,17 @@
       
 56970  
       
 56971  namespace {
       
 56972  
       
 56973  using google_breakpad::Minidump;
       
 56974  using google_breakpad::MinidumpThreadList;
       
 56975  using google_breakpad::MinidumpModuleList;
       
 56976  using google_breakpad::MinidumpMemoryList;
       
 56977  using google_breakpad::MinidumpException;
       
 56978 +using google_breakpad::MinidumpAssertion;
       
 56979  using google_breakpad::MinidumpSystemInfo;
       
 56980  using google_breakpad::MinidumpMiscInfo;
       
 56981  using google_breakpad::MinidumpBreakpadInfo;
       
 56982  
       
 56983  static bool PrintMinidumpDump(const char *minidump_file) {
       
 56984    Minidump minidump(minidump_file);
       
 56985    if (!minidump.Read()) {
       
 56986      BPLOG(ERROR) << "minidump.Read() failed";
       
 56987 @@ -84,16 +85,23 @@ static bool PrintMinidumpDump(const char
       
 56988  
       
 56989    MinidumpException *exception = minidump.GetException();
       
 56990    if (!exception) {
       
 56991      BPLOG(INFO) << "minidump.GetException() failed";
       
 56992    } else {
       
 56993      exception->Print();
       
 56994    }
       
 56995  
       
 56996 +  MinidumpAssertion *assertion = minidump.GetAssertion();
       
 56997 +  if (!assertion) {
       
 56998 +    BPLOG(INFO) << "minidump.GetAssertion() failed";
       
 56999 +  } else {
       
 57000 +    assertion->Print();
       
 57001 +  }
       
 57002 +
       
 57003    MinidumpSystemInfo *system_info = minidump.GetSystemInfo();
       
 57004    if (!system_info) {
       
 57005      ++errors;
       
 57006      BPLOG(ERROR) << "minidump.GetSystemInfo() failed";
       
 57007    } else {
       
 57008      system_info->Print();
       
 57009    }
       
 57010  
       
 57011 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor.cc b/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor.cc
       
 57012 --- a/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor.cc
       
 57013 +++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor.cc
       
 57014 @@ -23,16 +23,17 @@
       
 57015  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 57016  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 57017  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 57018  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 57019  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 57020  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 57021  
       
 57022  #include <cassert>
       
 57023 +#include <cstdio>
       
 57024  
       
 57025  #include "google_breakpad/processor/minidump_processor.h"
       
 57026  #include "google_breakpad/processor/call_stack.h"
       
 57027  #include "google_breakpad/processor/minidump.h"
       
 57028  #include "google_breakpad/processor/process_state.h"
       
 57029  #include "processor/logging.h"
       
 57030  #include "processor/scoped_ptr.h"
       
 57031  #include "processor/stackwalker_x86.h"
       
 57032 @@ -42,102 +43,102 @@ namespace google_breakpad {
       
 57033  MinidumpProcessor::MinidumpProcessor(SymbolSupplier *supplier,
       
 57034                                       SourceLineResolverInterface *resolver)
       
 57035      : supplier_(supplier), resolver_(resolver) {
       
 57036  }
       
 57037  
       
 57038  MinidumpProcessor::~MinidumpProcessor() {
       
 57039  }
       
 57040  
       
 57041 -MinidumpProcessor::ProcessResult MinidumpProcessor::Process(
       
 57042 -    const string &minidump_file, ProcessState *process_state) {
       
 57043 -  BPLOG(INFO) << "Processing minidump in file " << minidump_file;
       
 57044 -
       
 57045 -  Minidump dump(minidump_file);
       
 57046 -  if (!dump.Read()) {
       
 57047 -    BPLOG(ERROR) << "Minidump " << minidump_file << " could not be read";
       
 57048 -    return PROCESS_ERROR;
       
 57049 -  }
       
 57050 +ProcessResult MinidumpProcessor::Process(
       
 57051 +    Minidump *dump, ProcessState *process_state) {
       
 57052 +  assert(dump);
       
 57053 +  assert(process_state);
       
 57054  
       
 57055    process_state->Clear();
       
 57056  
       
 57057 -  const MDRawHeader *header = dump.header();
       
 57058 -  BPLOG_IF(ERROR, !header) << "Minidump " << minidump_file << " has no header";
       
 57059 -  assert(header);
       
 57060 +  const MDRawHeader *header = dump->header();
       
 57061 +  if (!header) {
       
 57062 +    BPLOG(ERROR) << "Minidump " << dump->path() << " has no header";
       
 57063 +    return PROCESS_ERROR_NO_MINIDUMP_HEADER;
       
 57064 +  }
       
 57065    process_state->time_date_stamp_ = header->time_date_stamp;
       
 57066  
       
 57067 -  bool has_cpu_info = GetCPUInfo(&dump, &process_state->system_info_);
       
 57068 -  bool has_os_info = GetOSInfo(&dump, &process_state->system_info_);
       
 57069 +  bool has_cpu_info = GetCPUInfo(dump, &process_state->system_info_);
       
 57070 +  bool has_os_info = GetOSInfo(dump, &process_state->system_info_);
       
 57071  
       
 57072    u_int32_t dump_thread_id = 0;
       
 57073    bool has_dump_thread = false;
       
 57074    u_int32_t requesting_thread_id = 0;
       
 57075    bool has_requesting_thread = false;
       
 57076  
       
 57077 -  MinidumpBreakpadInfo *breakpad_info = dump.GetBreakpadInfo();
       
 57078 +  MinidumpBreakpadInfo *breakpad_info = dump->GetBreakpadInfo();
       
 57079    if (breakpad_info) {
       
 57080      has_dump_thread = breakpad_info->GetDumpThreadID(&dump_thread_id);
       
 57081      has_requesting_thread =
       
 57082          breakpad_info->GetRequestingThreadID(&requesting_thread_id);
       
 57083    }
       
 57084  
       
 57085 -  MinidumpException *exception = dump.GetException();
       
 57086 +  MinidumpException *exception = dump->GetException();
       
 57087    if (exception) {
       
 57088      process_state->crashed_ = true;
       
 57089      has_requesting_thread = exception->GetThreadID(&requesting_thread_id);
       
 57090  
       
 57091      process_state->crash_reason_ = GetCrashReason(
       
 57092 -        &dump, &process_state->crash_address_);
       
 57093 +        dump, &process_state->crash_address_);
       
 57094    }
       
 57095  
       
 57096 -  MinidumpModuleList *module_list = dump.GetModuleList();
       
 57097 +   // This will just return an empty string if it doesn't exist.
       
 57098 +   process_state->assertion_ = GetAssertion(dump);
       
 57099 +
       
 57100 +  MinidumpModuleList *module_list = dump->GetModuleList();
       
 57101  
       
 57102    // Put a copy of the module list into ProcessState object.  This is not
       
 57103    // necessarily a MinidumpModuleList, but it adheres to the CodeModules
       
 57104    // interface, which is all that ProcessState needs to expose.
       
 57105    if (module_list)
       
 57106      process_state->modules_ = module_list->Copy();
       
 57107  
       
 57108 -  MinidumpThreadList *threads = dump.GetThreadList();
       
 57109 +  MinidumpThreadList *threads = dump->GetThreadList();
       
 57110    if (!threads) {
       
 57111 -    BPLOG(ERROR) << "Minidump " << minidump_file << " has no thread list";
       
 57112 -    return PROCESS_ERROR;
       
 57113 +    BPLOG(ERROR) << "Minidump " << dump->path() << " has no thread list";
       
 57114 +    return PROCESS_ERROR_NO_THREAD_LIST;
       
 57115    }
       
 57116  
       
 57117 -  BPLOG(INFO) << "Minidump " << minidump_file << " has " <<
       
 57118 -              (has_cpu_info           ? "" : "no ") << "CPU info, " <<
       
 57119 -              (has_os_info            ? "" : "no ") << "OS info, " <<
       
 57120 -              (breakpad_info != NULL  ? "" : "no ") << "Breakpad info, " <<
       
 57121 -              (exception != NULL      ? "" : "no ") << "exception, " <<
       
 57122 -              (module_list != NULL    ? "" : "no ") << "module list, " <<
       
 57123 -              (threads != NULL        ? "" : "no ") << "thread list, " <<
       
 57124 -              (has_dump_thread        ? "" : "no ") << "dump thread, and " <<
       
 57125 -              (has_requesting_thread  ? "" : "no ") << "requesting thread";
       
 57126 +  BPLOG(INFO) << "Minidump " << dump->path() << " has " <<
       
 57127 +      (has_cpu_info           ? "" : "no ") << "CPU info, " <<
       
 57128 +      (has_os_info            ? "" : "no ") << "OS info, " <<
       
 57129 +      (breakpad_info != NULL  ? "" : "no ") << "Breakpad info, " <<
       
 57130 +      (exception != NULL      ? "" : "no ") << "exception, " <<
       
 57131 +      (module_list != NULL    ? "" : "no ") << "module list, " <<
       
 57132 +      (threads != NULL        ? "" : "no ") << "thread list, " <<
       
 57133 +      (has_dump_thread        ? "" : "no ") << "dump thread, and " <<
       
 57134 +      (has_requesting_thread  ? "" : "no ") << "requesting thread";
       
 57135  
       
 57136    bool interrupted = false;
       
 57137    bool found_requesting_thread = false;
       
 57138    unsigned int thread_count = threads->thread_count();
       
 57139    for (unsigned int thread_index = 0;
       
 57140         thread_index < thread_count;
       
 57141         ++thread_index) {
       
 57142      char thread_string_buffer[64];
       
 57143      snprintf(thread_string_buffer, sizeof(thread_string_buffer), "%d/%d",
       
 57144               thread_index, thread_count);
       
 57145 -    string thread_string = minidump_file + ":" + thread_string_buffer;
       
 57146 +    string thread_string = dump->path() + ":" + thread_string_buffer;
       
 57147  
       
 57148      MinidumpThread *thread = threads->GetThreadAtIndex(thread_index);
       
 57149      if (!thread) {
       
 57150        BPLOG(ERROR) << "Could not get thread for " << thread_string;
       
 57151 -      return PROCESS_ERROR;
       
 57152 +      return PROCESS_ERROR_GETTING_THREAD;
       
 57153      }
       
 57154  
       
 57155      u_int32_t thread_id;
       
 57156      if (!thread->GetThreadID(&thread_id)) {
       
 57157        BPLOG(ERROR) << "Could not get thread ID for " << thread_string;
       
 57158 -      return PROCESS_ERROR;
       
 57159 +      return PROCESS_ERROR_GETTING_THREAD_ID;
       
 57160      }
       
 57161  
       
 57162      thread_string += " id " + HexString(thread_id);
       
 57163      BPLOG(INFO) << "Looking at thread " << thread_string;
       
 57164  
       
 57165      // If this thread is the thread that produced the minidump, don't process
       
 57166      // it.  Because of the problems associated with a thread producing a
       
 57167      // dump of itself (when both its context and its stack are in flux),
       
 57168 @@ -147,17 +148,17 @@ MinidumpProcessor::ProcessResult Minidum
       
 57169      }
       
 57170  
       
 57171      MinidumpContext *context = thread->GetContext();
       
 57172  
       
 57173      if (has_requesting_thread && thread_id == requesting_thread_id) {
       
 57174        if (found_requesting_thread) {
       
 57175          // There can't be more than one requesting thread.
       
 57176          BPLOG(ERROR) << "Duplicate requesting thread: " << thread_string;
       
 57177 -        return PROCESS_ERROR;
       
 57178 +        return PROCESS_ERROR_DUPLICATE_REQUESTING_THREADS;
       
 57179        }
       
 57180  
       
 57181        // Use processed_state->threads_.size() instead of thread_index.
       
 57182        // thread_index points to the thread index in the minidump, which
       
 57183        // might be greater than the thread index in the threads vector if
       
 57184        // any of the minidump's threads are skipped and not placed into the
       
 57185        // processed threads vector.  The thread vector's current size will
       
 57186        // be the index of the current thread when it's pushed into the
       
 57187 @@ -166,25 +167,27 @@ MinidumpProcessor::ProcessResult Minidum
       
 57188  
       
 57189        found_requesting_thread = true;
       
 57190  
       
 57191        if (process_state->crashed_) {
       
 57192          // Use the exception record's context for the crashed thread, instead
       
 57193          // of the thread's own context.  For the crashed thread, the thread's
       
 57194          // own context is the state inside the exception handler.  Using it
       
 57195          // would not result in the expected stack trace from the time of the
       
 57196 -        // crash.
       
 57197 -        context = exception->GetContext();
       
 57198 +        // crash. If the exception context is invalid, however, we fall back
       
 57199 +        // on the thread context.
       
 57200 +        MinidumpContext *ctx = exception->GetContext();
       
 57201 +        context = ctx ? ctx : thread->GetContext();
       
 57202        }
       
 57203      }
       
 57204  
       
 57205      MinidumpMemoryRegion *thread_memory = thread->GetMemory();
       
 57206      if (!thread_memory) {
       
 57207        BPLOG(ERROR) << "No memory region for " << thread_string;
       
 57208 -      return PROCESS_ERROR;
       
 57209 +      return PROCESS_ERROR_NO_MEMORY_FOR_THREAD;
       
 57210      }
       
 57211  
       
 57212      // Use process_state->modules_ instead of module_list, because the
       
 57213      // |modules| argument will be used to populate the |module| fields in
       
 57214      // the returned StackFrame objects, which will be placed into the
       
 57215      // returned ProcessState object.  module_list's lifetime is only as
       
 57216      // long as the Minidump object: it will be deleted when this function
       
 57217      // returns.  process_state->modules_ is owned by the ProcessState object
       
 57218 @@ -194,46 +197,60 @@ MinidumpProcessor::ProcessResult Minidum
       
 57219          Stackwalker::StackwalkerForCPU(process_state->system_info(),
       
 57220                                         context,
       
 57221                                         thread_memory,
       
 57222                                         process_state->modules_,
       
 57223                                         supplier_,
       
 57224                                         resolver_));
       
 57225      if (!stackwalker.get()) {
       
 57226        BPLOG(ERROR) << "No stackwalker for " << thread_string;
       
 57227 -      return PROCESS_ERROR;
       
 57228 +      return PROCESS_ERROR_NO_STACKWALKER_FOR_THREAD;
       
 57229      }
       
 57230  
       
 57231      scoped_ptr<CallStack> stack(new CallStack());
       
 57232      if (!stackwalker->Walk(stack.get())) {
       
 57233        BPLOG(INFO) << "Stackwalker interrupt (missing symbols?) at " <<
       
 57234 -                     thread_string;
       
 57235 +          thread_string;
       
 57236        interrupted = true;
       
 57237      }
       
 57238      process_state->threads_.push_back(stack.release());
       
 57239 +    process_state->thread_memory_regions_.push_back(thread_memory);
       
 57240    }
       
 57241  
       
 57242    if (interrupted) {
       
 57243 -    BPLOG(INFO) << "Processing interrupted for " << minidump_file;
       
 57244 -    return PROCESS_INTERRUPTED;
       
 57245 +    BPLOG(INFO) << "Processing interrupted for " << dump->path();
       
 57246 +    return PROCESS_SYMBOL_SUPPLIER_INTERRUPTED;
       
 57247    }
       
 57248  
       
 57249    // If a requesting thread was indicated, it must be present.
       
 57250    if (has_requesting_thread && !found_requesting_thread) {
       
 57251      // Don't mark as an error, but invalidate the requesting thread
       
 57252      BPLOG(ERROR) << "Minidump indicated requesting thread " <<
       
 57253 -                    HexString(requesting_thread_id) << ", not found in " <<
       
 57254 -                    minidump_file;
       
 57255 +        HexString(requesting_thread_id) << ", not found in " <<
       
 57256 +        dump->path();
       
 57257      process_state->requesting_thread_ = -1;
       
 57258    }
       
 57259  
       
 57260 -  BPLOG(INFO) << "Processed " << minidump_file;
       
 57261 +  BPLOG(INFO) << "Processed " << dump->path();
       
 57262    return PROCESS_OK;
       
 57263  }
       
 57264  
       
 57265 +ProcessResult MinidumpProcessor::Process(
       
 57266 +    const string &minidump_file, ProcessState *process_state) {
       
 57267 +  BPLOG(INFO) << "Processing minidump in file " << minidump_file;
       
 57268 +
       
 57269 +  Minidump dump(minidump_file);
       
 57270 +  if (!dump.Read()) {
       
 57271 +     BPLOG(ERROR) << "Minidump " << dump.path() << " could not be read";
       
 57272 +     return PROCESS_ERROR_MINIDUMP_NOT_FOUND;
       
 57273 +   }
       
 57274 +
       
 57275 +  return Process(&dump, process_state);
       
 57276 +}
       
 57277 +
       
 57278  // Returns the MDRawSystemInfo from a minidump, or NULL if system info is
       
 57279  // not available from the minidump.  If system_info is non-NULL, it is used
       
 57280  // to pass back the MinidumpSystemInfo object.
       
 57281  static const MDRawSystemInfo* GetSystemInfo(Minidump *dump,
       
 57282                                              MinidumpSystemInfo **system_info) {
       
 57283    MinidumpSystemInfo *minidump_system_info = dump->GetSystemInfo();
       
 57284    if (!minidump_system_info)
       
 57285      return NULL;
       
 57286 @@ -255,17 +272,17 @@ bool MinidumpProcessor::GetCPUInfo(Minid
       
 57287    MinidumpSystemInfo *system_info;
       
 57288    const MDRawSystemInfo *raw_system_info = GetSystemInfo(dump, &system_info);
       
 57289    if (!raw_system_info)
       
 57290      return false;
       
 57291  
       
 57292    switch (raw_system_info->processor_architecture) {
       
 57293      case MD_CPU_ARCHITECTURE_X86:
       
 57294      case MD_CPU_ARCHITECTURE_AMD64: {
       
 57295 -      if (raw_system_info->processor_architecture == 
       
 57296 +      if (raw_system_info->processor_architecture ==
       
 57297            MD_CPU_ARCHITECTURE_X86)
       
 57298          info->cpu = "x86";
       
 57299        else
       
 57300          info->cpu = "amd64";
       
 57301  
       
 57302        const string *cpu_vendor = system_info->GetCPUVendor();
       
 57303        if (cpu_vendor) {
       
 57304          info->cpu_info = *cpu_vendor;
       
 57305 @@ -286,16 +303,21 @@ bool MinidumpProcessor::GetCPUInfo(Minid
       
 57306        break;
       
 57307      }
       
 57308  
       
 57309      case MD_CPU_ARCHITECTURE_SPARC: {
       
 57310        info->cpu = "sparc";
       
 57311        break;
       
 57312      }
       
 57313  
       
 57314 +    case MD_CPU_ARCHITECTURE_ARM: {
       
 57315 +      info->cpu = "arm";
       
 57316 +      break;
       
 57317 +    }
       
 57318 +
       
 57319      default: {
       
 57320        // Assign the numeric architecture ID into the CPU string.
       
 57321        char cpu_string[7];
       
 57322        snprintf(cpu_string, sizeof(cpu_string), "0x%04x",
       
 57323                 raw_system_info->processor_architecture);
       
 57324        info->cpu = cpu_string;
       
 57325        break;
       
 57326      }
       
 57327 @@ -737,16 +759,19 @@ string MinidumpProcessor::GetCrashReason
       
 57328            reason = "EXCEPTION_PRIV_INSTRUCTION";
       
 57329            break;
       
 57330          case MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW:
       
 57331            reason = "EXCEPTION_STACK_OVERFLOW";
       
 57332            break;
       
 57333          case MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK:
       
 57334            reason = "EXCEPTION_POSSIBLE_DEADLOCK";
       
 57335            break;
       
 57336 +        case MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION:
       
 57337 +	  reason = "Unhandled C++ Exception";
       
 57338 +	  break;
       
 57339          default:
       
 57340            BPLOG(INFO) << "Unknown exception reason " << reason;
       
 57341            break;
       
 57342        }
       
 57343        break;
       
 57344      }
       
 57345  
       
 57346      case MD_OS_LINUX: {
       
 57347 @@ -856,137 +881,190 @@ string MinidumpProcessor::GetCrashReason
       
 57348          case MD_EXCEPTION_CODE_SOL_SIGHUP:
       
 57349            reason = "SIGHUP";
       
 57350            break;
       
 57351          case MD_EXCEPTION_CODE_SOL_SIGINT:
       
 57352            reason = "SIGINT";
       
 57353            break;
       
 57354          case MD_EXCEPTION_CODE_SOL_SIGQUIT:
       
 57355            reason = "SIGQUIT";
       
 57356 -          break;  
       
 57357 +          break;
       
 57358          case MD_EXCEPTION_CODE_SOL_SIGILL:
       
 57359            reason = "SIGILL";
       
 57360 -          break;  
       
 57361 +          break;
       
 57362          case MD_EXCEPTION_CODE_SOL_SIGTRAP:
       
 57363            reason = "SIGTRAP";
       
 57364 -          break;  
       
 57365 +          break;
       
 57366          case MD_EXCEPTION_CODE_SOL_SIGIOT:
       
 57367            reason = "SIGIOT | SIGABRT";
       
 57368 -          break;  
       
 57369 +          break;
       
 57370          case MD_EXCEPTION_CODE_SOL_SIGEMT:
       
 57371            reason = "SIGEMT";
       
 57372 -          break;  
       
 57373 +          break;
       
 57374          case MD_EXCEPTION_CODE_SOL_SIGFPE:
       
 57375            reason = "SIGFPE";
       
 57376 -          break;  
       
 57377 +          break;
       
 57378          case MD_EXCEPTION_CODE_SOL_SIGKILL:
       
 57379            reason = "SIGKILL";
       
 57380 -          break;  
       
 57381 +          break;
       
 57382          case MD_EXCEPTION_CODE_SOL_SIGBUS:
       
 57383            reason = "SIGBUS";
       
 57384 -          break;  
       
 57385 +          break;
       
 57386          case MD_EXCEPTION_CODE_SOL_SIGSEGV:
       
 57387            reason = "SIGSEGV";
       
 57388 -          break;  
       
 57389 +          break;
       
 57390          case MD_EXCEPTION_CODE_SOL_SIGSYS:
       
 57391            reason = "SIGSYS";
       
 57392 -          break;  
       
 57393 +          break;
       
 57394          case MD_EXCEPTION_CODE_SOL_SIGPIPE:
       
 57395            reason = "SIGPIPE";
       
 57396 -          break;  
       
 57397 +          break;
       
 57398          case MD_EXCEPTION_CODE_SOL_SIGALRM:
       
 57399            reason = "SIGALRM";
       
 57400 -          break;  
       
 57401 +          break;
       
 57402          case MD_EXCEPTION_CODE_SOL_SIGTERM:
       
 57403            reason = "SIGTERM";
       
 57404 -          break;  
       
 57405 +          break;
       
 57406          case MD_EXCEPTION_CODE_SOL_SIGUSR1:
       
 57407            reason = "SIGUSR1";
       
 57408 -          break;  
       
 57409 +          break;
       
 57410          case MD_EXCEPTION_CODE_SOL_SIGUSR2:
       
 57411            reason = "SIGUSR2";
       
 57412 -          break;  
       
 57413 +          break;
       
 57414          case MD_EXCEPTION_CODE_SOL_SIGCLD:
       
 57415            reason = "SIGCLD | SIGCHLD";
       
 57416 -          break;  
       
 57417 +          break;
       
 57418          case MD_EXCEPTION_CODE_SOL_SIGPWR:
       
 57419            reason = "SIGPWR";
       
 57420 -          break;  
       
 57421 +          break;
       
 57422          case MD_EXCEPTION_CODE_SOL_SIGWINCH:
       
 57423            reason = "SIGWINCH";
       
 57424 -          break;  
       
 57425 +          break;
       
 57426          case MD_EXCEPTION_CODE_SOL_SIGURG:
       
 57427            reason = "SIGURG";
       
 57428 -          break;  
       
 57429 +          break;
       
 57430          case MD_EXCEPTION_CODE_SOL_SIGPOLL:
       
 57431            reason = "SIGPOLL | SIGIO";
       
 57432 -          break;  
       
 57433 +          break;
       
 57434          case MD_EXCEPTION_CODE_SOL_SIGSTOP:
       
 57435            reason = "SIGSTOP";
       
 57436 -          break;  
       
 57437 +          break;
       
 57438          case MD_EXCEPTION_CODE_SOL_SIGTSTP:
       
 57439            reason = "SIGTSTP";
       
 57440 -          break;  
       
 57441 +          break;
       
 57442          case MD_EXCEPTION_CODE_SOL_SIGCONT:
       
 57443            reason = "SIGCONT";
       
 57444 -          break;  
       
 57445 +          break;
       
 57446          case MD_EXCEPTION_CODE_SOL_SIGTTIN:
       
 57447            reason = "SIGTTIN";
       
 57448 -          break;  
       
 57449 +          break;
       
 57450          case MD_EXCEPTION_CODE_SOL_SIGTTOU:
       
 57451            reason = "SIGTTOU";
       
 57452 -          break;  
       
 57453 +          break;
       
 57454          case MD_EXCEPTION_CODE_SOL_SIGVTALRM:
       
 57455            reason = "SIGVTALRM";
       
 57456 -          break;  
       
 57457 +          break;
       
 57458          case MD_EXCEPTION_CODE_SOL_SIGPROF:
       
 57459            reason = "SIGPROF";
       
 57460 -          break;  
       
 57461 +          break;
       
 57462          case MD_EXCEPTION_CODE_SOL_SIGXCPU:
       
 57463            reason = "SIGXCPU";
       
 57464 -          break;  
       
 57465 +          break;
       
 57466          case MD_EXCEPTION_CODE_SOL_SIGXFSZ:
       
 57467            reason = "SIGXFSZ";
       
 57468 -          break;  
       
 57469 +          break;
       
 57470          case MD_EXCEPTION_CODE_SOL_SIGWAITING:
       
 57471            reason = "SIGWAITING";
       
 57472 -          break;  
       
 57473 +          break;
       
 57474          case MD_EXCEPTION_CODE_SOL_SIGLWP:
       
 57475            reason = "SIGLWP";
       
 57476 -          break;  
       
 57477 +          break;
       
 57478          case MD_EXCEPTION_CODE_SOL_SIGFREEZE:
       
 57479            reason = "SIGFREEZE";
       
 57480 -          break;  
       
 57481 +          break;
       
 57482          case MD_EXCEPTION_CODE_SOL_SIGTHAW:
       
 57483            reason = "SIGTHAW";
       
 57484 -          break;  
       
 57485 +          break;
       
 57486          case MD_EXCEPTION_CODE_SOL_SIGCANCEL:
       
 57487            reason = "SIGCANCEL";
       
 57488 -          break;  
       
 57489 +          break;
       
 57490          case MD_EXCEPTION_CODE_SOL_SIGLOST:
       
 57491            reason = "SIGLOST";
       
 57492 -          break;  
       
 57493 +          break;
       
 57494          case MD_EXCEPTION_CODE_SOL_SIGXRES:
       
 57495            reason = "SIGXRES";
       
 57496 -          break;  
       
 57497 +          break;
       
 57498          case MD_EXCEPTION_CODE_SOL_SIGJVM1:
       
 57499            reason = "SIGJVM1";
       
 57500 -          break;  
       
 57501 +          break;
       
 57502          case MD_EXCEPTION_CODE_SOL_SIGJVM2:
       
 57503            reason = "SIGJVM2";
       
 57504 -          break;  
       
 57505 +          break;
       
 57506          default:
       
 57507            BPLOG(INFO) << "Unknown exception reason " << reason;
       
 57508            break;
       
 57509        }
       
 57510        break;
       
 57511      }
       
 57512  
       
 57513      default: {
       
 57514        BPLOG(INFO) << "Unknown exception reason " << reason;
       
 57515        break;
       
 57516      }
       
 57517    }
       
 57518  
       
 57519    return reason;
       
 57520  }
       
 57521  
       
 57522 +// static
       
 57523 +string MinidumpProcessor::GetAssertion(Minidump *dump)
       
 57524 +{
       
 57525 +  MinidumpAssertion *assertion = dump->GetAssertion();
       
 57526 +  if (!assertion)
       
 57527 +    return "";
       
 57528 +
       
 57529 +  const MDRawAssertionInfo *raw_assertion = assertion->assertion();
       
 57530 +  if (!raw_assertion)
       
 57531 +    return "";
       
 57532 +
       
 57533 +  string assertion_string;
       
 57534 +  switch (raw_assertion->type) {
       
 57535 +  case MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER:
       
 57536 +    assertion_string = "Invalid parameter passed to library function";
       
 57537 +    break;
       
 57538 +  case MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL:
       
 57539 +    assertion_string = "Pure virtual function called";
       
 57540 +    break;
       
 57541 +  default: {
       
 57542 +    char assertion_type[32];
       
 57543 +    sprintf(assertion_type, "0x%08x", raw_assertion->type);
       
 57544 +    assertion_string = "Unknown assertion type ";
       
 57545 +    assertion_string += assertion_type;
       
 57546 +    break;
       
 57547 +  }
       
 57548 +  }
       
 57549 +
       
 57550 +  string expression = assertion->expression();
       
 57551 +  if (!expression.empty()) {
       
 57552 +    assertion_string.append(" " + expression);
       
 57553 +  }
       
 57554 +
       
 57555 +  string function = assertion->function();
       
 57556 +  if (!function.empty()) {
       
 57557 +    assertion_string.append(" in function " + function);
       
 57558 +  }
       
 57559 +
       
 57560 +  string file = assertion->file();
       
 57561 +  if (!file.empty()) {
       
 57562 +    assertion_string.append(", in file " + file);
       
 57563 +  }
       
 57564 +
       
 57565 +  if (raw_assertion->line != 0) {
       
 57566 +    char assertion_line[32];
       
 57567 +    sprintf(assertion_line, "%u", raw_assertion->line);
       
 57568 +    assertion_string.append(" at line ");
       
 57569 +    assertion_string.append(assertion_line);
       
 57570 +  }
       
 57571 +
       
 57572 +  return assertion_string;
       
 57573 +}
       
 57574 +
       
 57575  }  // namespace google_breakpad
       
 57576 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor_unittest.cc b/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor_unittest.cc
       
 57577 --- a/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor_unittest.cc
       
 57578 +++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor_unittest.cc
       
 57579 @@ -27,73 +27,88 @@
       
 57580  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 57581  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 57582  
       
 57583  // Unit test for MinidumpProcessor.  Uses a pre-generated minidump and
       
 57584  // corresponding symbol file, and checks the stack frames for correctness.
       
 57585  
       
 57586  #include <cstdlib>
       
 57587  #include <string>
       
 57588 +#include <iostream>
       
 57589 +#include <fstream>
       
 57590 +#include "breakpad_googletest_includes.h"
       
 57591  #include "google_breakpad/processor/basic_source_line_resolver.h"
       
 57592  #include "google_breakpad/processor/call_stack.h"
       
 57593  #include "google_breakpad/processor/code_module.h"
       
 57594  #include "google_breakpad/processor/code_modules.h"
       
 57595 +#include "google_breakpad/processor/minidump.h"
       
 57596  #include "google_breakpad/processor/minidump_processor.h"
       
 57597  #include "google_breakpad/processor/process_state.h"
       
 57598  #include "google_breakpad/processor/stack_frame.h"
       
 57599  #include "google_breakpad/processor/symbol_supplier.h"
       
 57600  #include "processor/logging.h"
       
 57601  #include "processor/scoped_ptr.h"
       
 57602  
       
 57603 +namespace google_breakpad {
       
 57604 +class MockMinidump : public Minidump {
       
 57605 + public:
       
 57606 +  MockMinidump() : Minidump("") {
       
 57607 +  }
       
 57608 +
       
 57609 +  MOCK_METHOD0(Read,bool());
       
 57610 +  MOCK_CONST_METHOD0(path, string());
       
 57611 +  MOCK_CONST_METHOD0(header,const MDRawHeader*());
       
 57612 +  MOCK_METHOD0(GetThreadList,MinidumpThreadList*());
       
 57613 +};
       
 57614 +}
       
 57615 +
       
 57616  namespace {
       
 57617  
       
 57618 -using std::string;
       
 57619  using google_breakpad::BasicSourceLineResolver;
       
 57620  using google_breakpad::CallStack;
       
 57621  using google_breakpad::CodeModule;
       
 57622  using google_breakpad::MinidumpProcessor;
       
 57623 +using google_breakpad::MinidumpThreadList;
       
 57624 +using google_breakpad::MinidumpThread;
       
 57625 +using google_breakpad::MockMinidump;
       
 57626  using google_breakpad::ProcessState;
       
 57627  using google_breakpad::scoped_ptr;
       
 57628  using google_breakpad::SymbolSupplier;
       
 57629  using google_breakpad::SystemInfo;
       
 57630 +using std::string;
       
 57631 +using ::testing::Return;
       
 57632  
       
 57633  static const char *kSystemInfoOS = "Windows NT";
       
 57634  static const char *kSystemInfoOSShort = "windows";
       
 57635  static const char *kSystemInfoOSVersion = "5.1.2600 Service Pack 2";
       
 57636  static const char *kSystemInfoCPU = "x86";
       
 57637  static const char *kSystemInfoCPUInfo =
       
 57638      "GenuineIntel family 6 model 13 stepping 8";
       
 57639  
       
 57640 -#define ASSERT_TRUE(cond) \
       
 57641 -  if (!(cond)) {                                                        \
       
 57642 -    fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \
       
 57643 -    return false; \
       
 57644 -  }
       
 57645 -
       
 57646 -#define ASSERT_FALSE(cond) ASSERT_TRUE(!(cond))
       
 57647 -
       
 57648 -#define ASSERT_EQ(e1, e2) ASSERT_TRUE((e1) == (e2))
       
 57649 -
       
 57650 -// Use ASSERT_*_ABORT in functions that can't return a boolean.
       
 57651  #define ASSERT_TRUE_ABORT(cond) \
       
 57652    if (!(cond)) {                                                        \
       
 57653      fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \
       
 57654      abort(); \
       
 57655    }
       
 57656  
       
 57657  #define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2))
       
 57658  
       
 57659  class TestSymbolSupplier : public SymbolSupplier {
       
 57660   public:
       
 57661    TestSymbolSupplier() : interrupt_(false) {}
       
 57662  
       
 57663    virtual SymbolResult GetSymbolFile(const CodeModule *module,
       
 57664                                       const SystemInfo *system_info,
       
 57665                                       string *symbol_file);
       
 57666  
       
 57667 +  virtual SymbolResult GetSymbolFile(const CodeModule *module,
       
 57668 +                                     const SystemInfo *system_info,
       
 57669 +                                     string *symbol_file,
       
 57670 +                                     string *symbol_data);
       
 57671 +
       
 57672    // When set to true, causes the SymbolSupplier to return INTERRUPT
       
 57673    void set_interrupt(bool interrupt) { interrupt_ = interrupt; }
       
 57674  
       
 57675   private:
       
 57676    bool interrupt_;
       
 57677  };
       
 57678  
       
 57679  SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(
       
 57680 @@ -118,27 +133,75 @@ SymbolSupplier::SymbolResult TestSymbolS
       
 57681                       module->debug_identifier() +
       
 57682                       "/test_app.sym";
       
 57683      return FOUND;
       
 57684    }
       
 57685  
       
 57686    return NOT_FOUND;
       
 57687  }
       
 57688  
       
 57689 -static bool RunTests() {
       
 57690 +SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(
       
 57691 +    const CodeModule *module,
       
 57692 +    const SystemInfo *system_info,
       
 57693 +    string *symbol_file,
       
 57694 +    string *symbol_data) {
       
 57695 +  SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info,
       
 57696 +                                                 symbol_file);
       
 57697 +  if (s == FOUND) {
       
 57698 +    std::ifstream in(symbol_file->c_str());
       
 57699 +    std::getline(in, *symbol_data, std::string::traits_type::to_char_type(
       
 57700 +                     std::string::traits_type::eof()));
       
 57701 +    in.close();
       
 57702 +  }
       
 57703 +
       
 57704 +  return s;
       
 57705 +}
       
 57706 +
       
 57707 +
       
 57708 +class MinidumpProcessorTest : public ::testing::Test {
       
 57709 +
       
 57710 +};
       
 57711 +
       
 57712 +TEST_F(MinidumpProcessorTest, TestCorruptMinidumps) {
       
 57713 +  MockMinidump dump;
       
 57714 +  TestSymbolSupplier supplier;
       
 57715 +  BasicSourceLineResolver resolver;
       
 57716 +  MinidumpProcessor processor(&supplier, &resolver);
       
 57717 +  ProcessState state;
       
 57718 +
       
 57719 +  EXPECT_EQ(processor.Process("nonexistant minidump", &state),
       
 57720 +            google_breakpad::PROCESS_ERROR_MINIDUMP_NOT_FOUND);
       
 57721 +
       
 57722 +  EXPECT_CALL(dump, path()).WillRepeatedly(Return("mock minidump"));
       
 57723 +  EXPECT_CALL(dump, Read()).WillRepeatedly(Return(true));
       
 57724 +
       
 57725 +  MDRawHeader fakeHeader;
       
 57726 +  fakeHeader.time_date_stamp = 0;
       
 57727 +  EXPECT_CALL(dump, header()).WillOnce(Return((MDRawHeader*)NULL)).
       
 57728 +      WillRepeatedly(Return(&fakeHeader));
       
 57729 +  EXPECT_EQ(processor.Process(&dump, &state),
       
 57730 +            google_breakpad::PROCESS_ERROR_NO_MINIDUMP_HEADER);
       
 57731 +
       
 57732 +  EXPECT_CALL(dump, GetThreadList()).
       
 57733 +      WillOnce(Return((MinidumpThreadList*)NULL));
       
 57734 +  EXPECT_EQ(processor.Process(&dump, &state),
       
 57735 +            google_breakpad::PROCESS_ERROR_NO_THREAD_LIST);
       
 57736 +}
       
 57737 +
       
 57738 +TEST_F(MinidumpProcessorTest, TestBasicProcessing) {
       
 57739    TestSymbolSupplier supplier;
       
 57740    BasicSourceLineResolver resolver;
       
 57741    MinidumpProcessor processor(&supplier, &resolver);
       
 57742  
       
 57743    string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
       
 57744                           "/src/processor/testdata/minidump2.dmp";
       
 57745  
       
 57746    ProcessState state;
       
 57747    ASSERT_EQ(processor.Process(minidump_file, &state),
       
 57748 -            MinidumpProcessor::PROCESS_OK);
       
 57749 +            google_breakpad::PROCESS_OK);
       
 57750    ASSERT_EQ(state.system_info()->os, kSystemInfoOS);
       
 57751    ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort);
       
 57752    ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion);
       
 57753    ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU);
       
 57754    ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo);
       
 57755    ASSERT_TRUE(state.crashed());
       
 57756    ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION");
       
 57757    ASSERT_EQ(state.crash_address(), 0x45);
       
 57758 @@ -192,24 +255,17 @@ static bool RunTests() {
       
 57759              "kernel32.pdb");
       
 57760    ASSERT_EQ(state.modules()->GetModuleForAddress(0x77d43210)->version(),
       
 57761              "5.1.2600.2622");
       
 57762  
       
 57763    // Test that the symbol supplier can interrupt processing
       
 57764    state.Clear();
       
 57765    supplier.set_interrupt(true);
       
 57766    ASSERT_EQ(processor.Process(minidump_file, &state),
       
 57767 -            MinidumpProcessor::PROCESS_INTERRUPTED);
       
 57768 -
       
 57769 -  return true;
       
 57770 +            google_breakpad::PROCESS_SYMBOL_SUPPLIER_INTERRUPTED
       
 57771 +            );
       
 57772  }
       
 57773 -
       
 57774  }  // namespace
       
 57775  
       
 57776  int main(int argc, char *argv[]) {
       
 57777 -  BPLOG_INIT(&argc, &argv);
       
 57778 -
       
 57779 -  if (!RunTests()) {
       
 57780 -    return 1;
       
 57781 -  }
       
 57782 -
       
 57783 -  return 0;
       
 57784 +  ::testing::InitGoogleTest(&argc, argv);
       
 57785 +  return RUN_ALL_TESTS();
       
 57786  }
       
 57787 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/minidump_stackwalk.cc b/toolkit/crashreporter/google-breakpad/src/processor/minidump_stackwalk.cc
       
 57788 --- a/toolkit/crashreporter/google-breakpad/src/processor/minidump_stackwalk.cc
       
 57789 +++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump_stackwalk.cc
       
 57790 @@ -29,16 +29,17 @@
       
 57791  
       
 57792  // minidump_stackwalk.cc: Process a minidump with MinidumpProcessor, printing
       
 57793  // the results, including stack traces.
       
 57794  //
       
 57795  // Author: Mark Mentovai
       
 57796  
       
 57797  #include <cstdio>
       
 57798  #include <cstdlib>
       
 57799 +#include <cstring>
       
 57800  #include <string>
       
 57801  #include <vector>
       
 57802  
       
 57803  #include "google_breakpad/processor/basic_source_line_resolver.h"
       
 57804  #include "google_breakpad/processor/call_stack.h"
       
 57805  #include "google_breakpad/processor/code_module.h"
       
 57806  #include "google_breakpad/processor/code_modules.h"
       
 57807  #include "google_breakpad/processor/minidump.h"
       
 57808 @@ -154,16 +155,38 @@ static void PrintStack(const CallStack *
       
 57809        if (frame_x86->context_validity & StackFrameX86::CONTEXT_VALID_EDI)
       
 57810          sequence = PrintRegister("edi", frame_x86->context.edi, sequence);
       
 57811        if (frame_x86->context_validity == StackFrameX86::CONTEXT_VALID_ALL) {
       
 57812          sequence = PrintRegister("eax", frame_x86->context.eax, sequence);
       
 57813          sequence = PrintRegister("ecx", frame_x86->context.ecx, sequence);
       
 57814          sequence = PrintRegister("edx", frame_x86->context.edx, sequence);
       
 57815          sequence = PrintRegister("efl", frame_x86->context.eflags, sequence);
       
 57816        }
       
 57817 +      const char *trust_name;
       
 57818 +      switch (frame_x86->trust) {
       
 57819 +        case StackFrameX86::FRAME_TRUST_NONE:
       
 57820 +          trust_name = "unknown";
       
 57821 +          break;
       
 57822 +        case StackFrameX86::FRAME_TRUST_CONTEXT:
       
 57823 +          trust_name = "given as instruction pointer in context";
       
 57824 +          break;
       
 57825 +        case StackFrameX86::FRAME_TRUST_CFI:
       
 57826 +          trust_name = "call frame info";
       
 57827 +          break;
       
 57828 +        case StackFrameX86::FRAME_TRUST_CFI_SCAN:
       
 57829 +          trust_name = "call frame info with scanning";
       
 57830 +          break;
       
 57831 +        case StackFrameX86::FRAME_TRUST_FP:
       
 57832 +          trust_name = "previous frame's frame pointer";
       
 57833 +          break;
       
 57834 +        case StackFrameX86::FRAME_TRUST_SCAN:
       
 57835 +          trust_name = "stack scanning";
       
 57836 +          break;
       
 57837 +      }
       
 57838 +      printf("\n    Found by: %s", trust_name);
       
 57839      } else if (cpu == "ppc") {
       
 57840        const StackFramePPC *frame_ppc =
       
 57841            reinterpret_cast<const StackFramePPC*>(frame);
       
 57842  
       
 57843        if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_SRR0)
       
 57844          sequence = PrintRegister("srr0", frame_ppc->context.srr0, sequence);
       
 57845        if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_GPR1)
       
 57846          sequence = PrintRegister("r1", frame_ppc->context.gpr[1], sequence);
       
 57847 @@ -333,16 +356,21 @@ static void PrintProcessState(const Proc
       
 57848    // Print crash information.
       
 57849    if (process_state.crashed()) {
       
 57850      printf("Crash reason:  %s\n", process_state.crash_reason().c_str());
       
 57851      printf("Crash address: 0x%" PRIx64 "\n", process_state.crash_address());
       
 57852    } else {
       
 57853      printf("No crash\n");
       
 57854    }
       
 57855  
       
 57856 +  string assertion = process_state.assertion();
       
 57857 +  if (!assertion.empty()) {
       
 57858 +    printf("Assertion: %s\n", assertion.c_str());
       
 57859 +  }
       
 57860 +
       
 57861    // If the thread that requested the dump is known, print it first.
       
 57862    int requesting_thread = process_state.requesting_thread();
       
 57863    if (requesting_thread != -1) {
       
 57864      printf("\n");
       
 57865      printf("Thread %d (%s)\n",
       
 57866            requesting_thread,
       
 57867            process_state.crashed() ? "crashed" :
       
 57868                                      "requested dump, did not crash");
       
 57869 @@ -385,17 +413,25 @@ static void PrintProcessStateMachineRead
       
 57870    // Print crash information.
       
 57871    // Crash|{Crash Reason}|{Crash Address}|{Crashed Thread}
       
 57872    printf("Crash%c", kOutputSeparator);
       
 57873    if (process_state.crashed()) {
       
 57874      printf("%s%c0x%" PRIx64 "%c",
       
 57875             StripSeparator(process_state.crash_reason()).c_str(),
       
 57876             kOutputSeparator, process_state.crash_address(), kOutputSeparator);
       
 57877    } else {
       
 57878 -    printf("No crash%c%c", kOutputSeparator, kOutputSeparator);
       
 57879 +    // print assertion info, if available, in place of crash reason,
       
 57880 +    // instead of the unhelpful "No crash"
       
 57881 +    string assertion = process_state.assertion();
       
 57882 +    if (!assertion.empty()) {
       
 57883 +      printf("%s%c%c", StripSeparator(assertion).c_str(),
       
 57884 +             kOutputSeparator, kOutputSeparator);
       
 57885 +    } else {
       
 57886 +      printf("No crash%c%c", kOutputSeparator, kOutputSeparator);
       
 57887 +    }
       
 57888    }
       
 57889  
       
 57890    if (requesting_thread != -1) {
       
 57891      printf("%d\n", requesting_thread);
       
 57892    } else {
       
 57893      printf("\n");
       
 57894    }
       
 57895  
       
 57896 @@ -441,17 +477,17 @@ static bool PrintMinidumpProcess(const s
       
 57897    }
       
 57898  
       
 57899    BasicSourceLineResolver resolver;
       
 57900    MinidumpProcessor minidump_processor(symbol_supplier.get(), &resolver);
       
 57901  
       
 57902    // Process the minidump.
       
 57903    ProcessState process_state;
       
 57904    if (minidump_processor.Process(minidump_file, &process_state) !=
       
 57905 -      MinidumpProcessor::PROCESS_OK) {
       
 57906 +      google_breakpad::PROCESS_OK) {
       
 57907      BPLOG(ERROR) << "MinidumpProcessor::Process failed";
       
 57908      return false;
       
 57909    }
       
 57910  
       
 57911    if (machine_readable) {
       
 57912      PrintProcessStateMachineReadable(process_state);
       
 57913    } else {
       
 57914      PrintProcessState(process_state);
       
 57915 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/minidump_unittest.cc b/toolkit/crashreporter/google-breakpad/src/processor/minidump_unittest.cc
       
 57916 new file mode 100644
       
 57917 --- /dev/null
       
 57918 +++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump_unittest.cc
       
 57919 @@ -0,0 +1,103 @@
       
 57920 +// Copyright (c) 2009, Google Inc.
       
 57921 +// All rights reserved.
       
 57922 +//
       
 57923 +// Redistribution and use in source and binary forms, with or without
       
 57924 +// modification, are permitted provided that the following conditions are
       
 57925 +// met:
       
 57926 +//
       
 57927 +//     * Redistributions of source code must retain the above copyright
       
 57928 +// notice, this list of conditions and the following disclaimer.
       
 57929 +//     * Redistributions in binary form must reproduce the above
       
 57930 +// copyright notice, this list of conditions and the following disclaimer
       
 57931 +// in the documentation and/or other materials provided with the
       
 57932 +// distribution.
       
 57933 +//     * Neither the name of Google Inc. nor the names of its
       
 57934 +// contributors may be used to endorse or promote products derived from
       
 57935 +// this software without specific prior written permission.
       
 57936 +//
       
 57937 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 57938 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 57939 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 57940 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 57941 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 57942 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 57943 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 57944 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 57945 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 57946 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 57947 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 57948 +
       
 57949 +// Unit test for Minidump.  Uses a pre-generated minidump and
       
 57950 +// verifies that certain streams are correct.
       
 57951 +
       
 57952 +#include <cstdlib>
       
 57953 +#include <iostream>
       
 57954 +#include <fstream>
       
 57955 +#include <sstream>
       
 57956 +#include <string>
       
 57957 +#include <vector>
       
 57958 +#include "breakpad_googletest_includes.h"
       
 57959 +#include "google_breakpad/common/minidump_format.h"
       
 57960 +#include "google_breakpad/processor/minidump.h"
       
 57961 +#include "processor/logging.h"
       
 57962 +
       
 57963 +namespace {
       
 57964 +
       
 57965 +using google_breakpad::Minidump;
       
 57966 +using std::ifstream;
       
 57967 +using std::istringstream;
       
 57968 +using std::string;
       
 57969 +using std::vector;
       
 57970 +using ::testing::Return;
       
 57971 +
       
 57972 +class MinidumpTest : public ::testing::Test {
       
 57973 +public:
       
 57974 +  void SetUp() {
       
 57975 +    minidump_file_ = string(getenv("srcdir") ? getenv("srcdir") : ".") +
       
 57976 +      "/src/processor/testdata/minidump2.dmp";
       
 57977 +  }
       
 57978 +  string minidump_file_;
       
 57979 +};
       
 57980 +
       
 57981 +TEST_F(MinidumpTest, TestMinidumpFromFile) {
       
 57982 +  Minidump minidump(minidump_file_);
       
 57983 +  ASSERT_EQ(minidump.path(), minidump_file_);
       
 57984 +  ASSERT_TRUE(minidump.Read());
       
 57985 +  const MDRawHeader* header = minidump.header();
       
 57986 +  ASSERT_NE(header, (MDRawHeader*)NULL);
       
 57987 +  ASSERT_EQ(header->signature, MD_HEADER_SIGNATURE);
       
 57988 +  //TODO: add more checks here
       
 57989 +}
       
 57990 +
       
 57991 +TEST_F(MinidumpTest, TestMinidumpFromStream) {
       
 57992 +  // read minidump contents into memory, construct a stringstream around them
       
 57993 +  ifstream file_stream(minidump_file_.c_str(), std::ios::in);
       
 57994 +  ASSERT_TRUE(file_stream.good());
       
 57995 +  vector<char> bytes;
       
 57996 +  file_stream.seekg(0, std::ios_base::end);
       
 57997 +  ASSERT_TRUE(file_stream.good());
       
 57998 +  bytes.resize(file_stream.tellg());
       
 57999 +  file_stream.seekg(0, std::ios_base::beg);
       
 58000 +  ASSERT_TRUE(file_stream.good());
       
 58001 +  file_stream.read(&bytes[0], bytes.size());
       
 58002 +  ASSERT_TRUE(file_stream.good());
       
 58003 +  string str(&bytes[0], bytes.size());
       
 58004 +  istringstream stream(str);
       
 58005 +  ASSERT_TRUE(stream.good());
       
 58006 +
       
 58007 +  // now read minidump from stringstream
       
 58008 +  Minidump minidump(stream);
       
 58009 +  ASSERT_EQ(minidump.path(), "");
       
 58010 +  ASSERT_TRUE(minidump.Read());
       
 58011 +  const MDRawHeader* header = minidump.header();
       
 58012 +  ASSERT_NE(header, (MDRawHeader*)NULL);
       
 58013 +  ASSERT_EQ(header->signature, MD_HEADER_SIGNATURE);
       
 58014 +  //TODO: add more checks here
       
 58015 +}
       
 58016 +
       
 58017 +}  // namespace
       
 58018 +
       
 58019 +int main(int argc, char* argv[]) {
       
 58020 +  ::testing::InitGoogleTest(&argc, argv);
       
 58021 +  return RUN_ALL_TESTS();
       
 58022 +}
       
 58023 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/pathname_stripper_unittest.cc b/toolkit/crashreporter/google-breakpad/src/processor/pathname_stripper_unittest.cc
       
 58024 --- a/toolkit/crashreporter/google-breakpad/src/processor/pathname_stripper_unittest.cc
       
 58025 +++ b/toolkit/crashreporter/google-breakpad/src/processor/pathname_stripper_unittest.cc
       
 58026 @@ -22,16 +22,18 @@
       
 58027  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 58028  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 58029  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 58030  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 58031  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 58032  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 58033  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 58034  
       
 58035 +#include <cstdio>
       
 58036 +
       
 58037  #include "processor/pathname_stripper.h"
       
 58038  #include "processor/logging.h"
       
 58039  
       
 58040  #define ASSERT_TRUE(condition) \
       
 58041    if (!(condition)) { \
       
 58042      fprintf(stderr, "FAIL: %s @ %s:%d\n", #condition, __FILE__, __LINE__); \
       
 58043      return false; \
       
 58044    }
       
 58045 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator-inl.h b/toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator-inl.h
       
 58046 --- a/toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator-inl.h
       
 58047 +++ b/toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator-inl.h
       
 58048 @@ -33,16 +33,17 @@
       
 58049  // Documentation in postfix_evaluator.h.
       
 58050  //
       
 58051  // Author: Mark Mentovai
       
 58052  
       
 58053  #ifndef PROCESSOR_POSTFIX_EVALUATOR_INL_H__
       
 58054  #define PROCESSOR_POSTFIX_EVALUATOR_INL_H__
       
 58055  
       
 58056  
       
 58057 +#include <cstdio>
       
 58058  #include <sstream>
       
 58059  
       
 58060  #include "processor/postfix_evaluator.h"
       
 58061  #include "google_breakpad/processor/memory_region.h"
       
 58062  #include "processor/logging.h"
       
 58063  
       
 58064  namespace google_breakpad {
       
 58065  
       
 58066 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/process_state.cc b/toolkit/crashreporter/google-breakpad/src/processor/process_state.cc
       
 58067 --- a/toolkit/crashreporter/google-breakpad/src/processor/process_state.cc
       
 58068 +++ b/toolkit/crashreporter/google-breakpad/src/processor/process_state.cc
       
 58069 @@ -43,16 +43,17 @@ ProcessState::~ProcessState() {
       
 58070    Clear();
       
 58071  }
       
 58072  
       
 58073  void ProcessState::Clear() {
       
 58074    time_date_stamp_ = 0;
       
 58075    crashed_ = false;
       
 58076    crash_reason_.clear();
       
 58077    crash_address_ = 0;
       
 58078 +  assertion_.clear();
       
 58079    requesting_thread_ = -1;
       
 58080    for (vector<CallStack *>::const_iterator iterator = threads_.begin();
       
 58081         iterator != threads_.end();
       
 58082         ++iterator) {
       
 58083      delete *iterator;
       
 58084    }
       
 58085    threads_.clear();
       
 58086    system_info_.Clear();
       
 58087 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.cc b/toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.cc
       
 58088 --- a/toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.cc
       
 58089 +++ b/toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.cc
       
 58090 @@ -33,16 +33,18 @@
       
 58091  //
       
 58092  // Author: Mark Mentovai
       
 58093  
       
 58094  #include <sys/types.h>
       
 58095  #include <sys/stat.h>
       
 58096  
       
 58097  #include <algorithm>
       
 58098  #include <cassert>
       
 58099 +#include <iostream>
       
 58100 +#include <fstream>
       
 58101  
       
 58102  #include "processor/simple_symbol_supplier.h"
       
 58103  #include "google_breakpad/processor/code_module.h"
       
 58104  #include "google_breakpad/processor/system_info.h"
       
 58105  #include "processor/logging.h"
       
 58106  #include "processor/pathname_stripper.h"
       
 58107  
       
 58108  namespace google_breakpad {
       
 58109 @@ -57,25 +59,45 @@ SymbolSupplier::SymbolResult SimpleSymbo
       
 58110      string *symbol_file) {
       
 58111    BPLOG_IF(ERROR, !symbol_file) << "SimpleSymbolSupplier::GetSymbolFile "
       
 58112                                     "requires |symbol_file|";
       
 58113    assert(symbol_file);
       
 58114    symbol_file->clear();
       
 58115  
       
 58116    for (unsigned int path_index = 0; path_index < paths_.size(); ++path_index) {
       
 58117      SymbolResult result;
       
 58118 -    if ((result = GetSymbolFileAtPath(module, system_info, paths_[path_index],
       
 58119 -                                      symbol_file)) != NOT_FOUND) {
       
 58120 +    if ((result = GetSymbolFileAtPathFromRoot(module, system_info,
       
 58121 +                                              paths_[path_index],
       
 58122 +                                              symbol_file)) != NOT_FOUND) {
       
 58123        return result;
       
 58124      }
       
 58125    }
       
 58126    return NOT_FOUND;
       
 58127  }
       
 58128  
       
 58129 -SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFileAtPath(
       
 58130 +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFile(
       
 58131 +    const CodeModule *module,
       
 58132 +    const SystemInfo *system_info,
       
 58133 +    string *symbol_file,
       
 58134 +    string *symbol_data) {
       
 58135 +  assert(symbol_data);
       
 58136 +  symbol_data->clear();
       
 58137 +
       
 58138 +  SymbolSupplier::SymbolResult s = GetSymbolFile(module, system_info, symbol_file);
       
 58139 +
       
 58140 +  if (s == FOUND) {
       
 58141 +    std::ifstream in(symbol_file->c_str());
       
 58142 +    std::getline(in, *symbol_data, std::string::traits_type::to_char_type(
       
 58143 +                     std::string::traits_type::eof()));
       
 58144 +    in.close();
       
 58145 +  }
       
 58146 +  return s;
       
 58147 +}
       
 58148 +
       
 58149 +SymbolSupplier::SymbolResult SimpleSymbolSupplier::GetSymbolFileAtPathFromRoot(
       
 58150      const CodeModule *module, const SystemInfo *system_info,
       
 58151      const string &root_path, string *symbol_file) {
       
 58152    BPLOG_IF(ERROR, !symbol_file) << "SimpleSymbolSupplier::GetSymbolFileAtPath "
       
 58153                                     "requires |symbol_file|";
       
 58154    assert(symbol_file);
       
 58155    symbol_file->clear();
       
 58156  
       
 58157    if (!module)
       
 58158 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.h b/toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.h
       
 58159 --- a/toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.h
       
 58160 +++ b/toolkit/crashreporter/google-breakpad/src/processor/simple_symbol_supplier.h
       
 58161 @@ -97,25 +97,29 @@ class SimpleSymbolSupplier : public Symb
       
 58162    // Creates a new SimpleSymbolSupplier, using paths as a list of root
       
 58163    // paths where symbols may be stored.
       
 58164    explicit SimpleSymbolSupplier(const vector<string> &paths) : paths_(paths) {}
       
 58165  
       
 58166    virtual ~SimpleSymbolSupplier() {}
       
 58167  
       
 58168    // Returns the path to the symbol file for the given module.  See the
       
 58169    // description above.
       
 58170 -  SymbolResult GetSymbolFile(const CodeModule *module,
       
 58171 -                             const SystemInfo *system_info,
       
 58172 -                             string *symbol_file);
       
 58173 +  virtual SymbolResult GetSymbolFile(const CodeModule *module,
       
 58174 +                                     const SystemInfo *system_info,
       
 58175 +                                     string *symbol_file);
       
 58176  
       
 58177 +  virtual SymbolResult GetSymbolFile(const CodeModule *module,
       
 58178 +                                     const SystemInfo *system_info,
       
 58179 +                                     string *symbol_file,
       
 58180 +                                     string *symbol_data);
       
 58181   protected:
       
 58182 -  SymbolResult GetSymbolFileAtPath(const CodeModule *module,
       
 58183 -                                   const SystemInfo *system_info,
       
 58184 -                                   const string &root_path,
       
 58185 -                                   string *symbol_file);
       
 58186 +  SymbolResult GetSymbolFileAtPathFromRoot(const CodeModule *module,
       
 58187 +                                           const SystemInfo *system_info,
       
 58188 +                                           const string &root_path,
       
 58189 +                                           string *symbol_file);
       
 58190  
       
 58191   private:
       
 58192    vector<string> paths_;
       
 58193  };
       
 58194  
       
 58195  }  // namespace google_breakpad
       
 58196  
       
 58197  #endif  // PROCESSOR_SIMPLE_SYMBOL_SUPPLIER_H__
       
 58198 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/stackwalker.cc b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker.cc
       
 58199 --- a/toolkit/crashreporter/google-breakpad/src/processor/stackwalker.cc
       
 58200 +++ b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker.cc
       
 58201 @@ -47,16 +47,17 @@
       
 58202  #include "processor/linked_ptr.h"
       
 58203  #include "processor/logging.h"
       
 58204  #include "processor/scoped_ptr.h"
       
 58205  #include "processor/stack_frame_info.h"
       
 58206  #include "processor/stackwalker_ppc.h"
       
 58207  #include "processor/stackwalker_sparc.h"
       
 58208  #include "processor/stackwalker_x86.h"
       
 58209  #include "processor/stackwalker_amd64.h"
       
 58210 +#include "processor/stackwalker_arm.h"
       
 58211  
       
 58212  namespace google_breakpad {
       
 58213  
       
 58214  
       
 58215  Stackwalker::Stackwalker(const SystemInfo *system_info,
       
 58216                           MemoryRegion *memory,
       
 58217                           const CodeModules *modules,
       
 58218                           SymbolSupplier *supplier,
       
 58219 @@ -96,23 +97,25 @@ bool Stackwalker::Walk(CallStack *stack)
       
 58220      if (modules_) {
       
 58221        const CodeModule *module =
       
 58222            modules_->GetModuleForAddress(frame->instruction);
       
 58223        if (module) {
       
 58224          frame->module = module;
       
 58225          if (resolver_ &&
       
 58226              !resolver_->HasModule(frame->module->code_file()) &&
       
 58227              supplier_) {
       
 58228 -          string symbol_file;
       
 58229 +          string symbol_data, symbol_file;
       
 58230            SymbolSupplier::SymbolResult symbol_result =
       
 58231 -              supplier_->GetSymbolFile(module, system_info_, &symbol_file);
       
 58232 +              supplier_->GetSymbolFile(module, system_info_,
       
 58233 +                                       &symbol_file, &symbol_data);
       
 58234  
       
 58235            switch (symbol_result) {
       
 58236              case SymbolSupplier::FOUND:
       
 58237 -              resolver_->LoadModule(frame->module->code_file(), symbol_file);
       
 58238 +              resolver_->LoadModuleUsingMapBuffer(frame->module->code_file(),
       
 58239 +                                                  symbol_data);
       
 58240                break;
       
 58241              case SymbolSupplier::NOT_FOUND:
       
 58242                break;  // nothing to do
       
 58243              case SymbolSupplier::INTERRUPT:
       
 58244                return false;
       
 58245            }
       
 58246          }
       
 58247          frame_info.reset(resolver_->FillSourceLineInfo(frame.get()));
       
 58248 @@ -174,18 +177,59 @@ Stackwalker* Stackwalker::StackwalkerFor
       
 58249        break;
       
 58250    
       
 58251      case MD_CONTEXT_SPARC:
       
 58252        cpu_stackwalker = new StackwalkerSPARC(system_info,
       
 58253                                               context->GetContextSPARC(),
       
 58254                                               memory, modules, supplier,
       
 58255                                               resolver);
       
 58256        break;
       
 58257 +
       
 58258 +    case MD_CONTEXT_ARM:
       
 58259 +      cpu_stackwalker = new StackwalkerARM(system_info,
       
 58260 +                                           context->GetContextARM(),
       
 58261 +                                           memory, modules, supplier,
       
 58262 +                                           resolver);
       
 58263 +      break;
       
 58264    }
       
 58265  
       
 58266    BPLOG_IF(ERROR, !cpu_stackwalker) << "Unknown CPU type " << HexString(cpu) <<
       
 58267                                         ", can't choose a stackwalker "
       
 58268                                         "implementation";
       
 58269    return cpu_stackwalker;
       
 58270  }
       
 58271  
       
 58272 +bool Stackwalker::InstructionAddressSeemsValid(u_int64_t address) {
       
 58273 +  const CodeModule *module = modules_->GetModuleForAddress(address);
       
 58274 +  if (!module) {
       
 58275 +    // not inside any loaded module
       
 58276 +    return false;
       
 58277 +  }
       
 58278 +
       
 58279 +  if (!resolver_ || !supplier_) {
       
 58280 +    // we don't have a resolver and or symbol supplier,
       
 58281 +    // but we're inside a known module
       
 58282 +    return true;
       
 58283 +  }
       
 58284 +
       
 58285 +  if (!resolver_->HasModule(module->code_file())) {
       
 58286 +    string symbol_data, symbol_file;
       
 58287 +    SymbolSupplier::SymbolResult symbol_result =
       
 58288 +      supplier_->GetSymbolFile(module, system_info_,
       
 58289 +                               &symbol_file, &symbol_data);
       
 58290 +
       
 58291 +    if (symbol_result != SymbolSupplier::FOUND ||
       
 58292 +        !resolver_->LoadModuleUsingMapBuffer(module->code_file(),
       
 58293 +                                             symbol_data)) {
       
 58294 +      // we don't have symbols, but we're inside a loaded module
       
 58295 +      return true;
       
 58296 +    }
       
 58297 +  }
       
 58298 +
       
 58299 +  StackFrame frame;
       
 58300 +  frame.module = module;
       
 58301 +  frame.instruction = address;
       
 58302 +  resolver_->FillSourceLineInfo(&frame);
       
 58303 +  // we have symbols, so return true if inside a function
       
 58304 +  return !frame.function_name.empty();
       
 58305 +}
       
 58306  
       
 58307  }  // namespace google_breakpad
       
 58308 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.cc b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.cc
       
 58309 new file mode 100644
       
 58310 --- /dev/null
       
 58311 +++ b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.cc
       
 58312 @@ -0,0 +1,92 @@
       
 58313 +// Copyright (c) 2009, Google Inc.
       
 58314 +// All rights reserved.
       
 58315 +//
       
 58316 +// Redistribution and use in source and binary forms, with or without
       
 58317 +// modification, are permitted provided that the following conditions are
       
 58318 +// met:
       
 58319 +//
       
 58320 +//     * Redistributions of source code must retain the above copyright
       
 58321 +// notice, this list of conditions and the following disclaimer.
       
 58322 +//     * Redistributions in binary form must reproduce the above
       
 58323 +// copyright notice, this list of conditions and the following disclaimer
       
 58324 +// in the documentation and/or other materials provided with the
       
 58325 +// distribution.
       
 58326 +//     * Neither the name of Google Inc. nor the names of its
       
 58327 +// contributors may be used to endorse or promote products derived from
       
 58328 +// this software without specific prior written permission.
       
 58329 +//
       
 58330 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 58331 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 58332 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 58333 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 58334 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 58335 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 58336 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 58337 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 58338 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 58339 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 58340 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 58341 +
       
 58342 +// stackwalker_arm.cc: arm-specific stackwalker.
       
 58343 +//
       
 58344 +// See stackwalker_arm.h for documentation.
       
 58345 +//
       
 58346 +// Author: Mark Mentovai, Ted Mielczarek
       
 58347 +
       
 58348 +
       
 58349 +#include "processor/stackwalker_arm.h"
       
 58350 +#include "google_breakpad/processor/call_stack.h"
       
 58351 +#include "google_breakpad/processor/memory_region.h"
       
 58352 +#include "google_breakpad/processor/stack_frame_cpu.h"
       
 58353 +#include "processor/logging.h"
       
 58354 +
       
 58355 +namespace google_breakpad {
       
 58356 +
       
 58357 +
       
 58358 +StackwalkerARM::StackwalkerARM(const SystemInfo *system_info,
       
 58359 +                               const MDRawContextARM *context,
       
 58360 +                               MemoryRegion *memory,
       
 58361 +                               const CodeModules *modules,
       
 58362 +                               SymbolSupplier *supplier,
       
 58363 +                               SourceLineResolverInterface *resolver)
       
 58364 +    : Stackwalker(system_info, memory, modules, supplier, resolver),
       
 58365 +      context_(context) {
       
 58366 +}
       
 58367 +
       
 58368 +
       
 58369 +StackFrame* StackwalkerARM::GetContextFrame() {
       
 58370 +  if (!context_ || !memory_) {
       
 58371 +    BPLOG(ERROR) << "Can't get context frame without context or memory";
       
 58372 +    return NULL;
       
 58373 +  }
       
 58374 +
       
 58375 +  StackFrameARM *frame = new StackFrameARM();
       
 58376 +
       
 58377 +  // The instruction pointer is stored directly in a register (r15), so pull it
       
 58378 +  // straight out of the CPU context structure.
       
 58379 +  frame->context = *context_;
       
 58380 +  frame->context_validity = StackFrameARM::CONTEXT_VALID_ALL;
       
 58381 +  frame->instruction = frame->context.iregs[15];
       
 58382 +
       
 58383 +  return frame;
       
 58384 +}
       
 58385 +
       
 58386 +
       
 58387 +StackFrame* StackwalkerARM::GetCallerFrame(
       
 58388 +    const CallStack *stack,
       
 58389 +    const vector< linked_ptr<StackFrameInfo> > &stack_frame_info) {
       
 58390 +  if (!memory_ || !stack) {
       
 58391 +    BPLOG(ERROR) << "Can't get caller frame without memory or stack";
       
 58392 +    return NULL;
       
 58393 +  }
       
 58394 +
       
 58395 +  StackFrameARM *last_frame = static_cast<StackFrameARM*>(
       
 58396 +      stack->frames()->back());
       
 58397 +
       
 58398 +  // TODO: Can't actually walk the stack on ARM without the CFI data.
       
 58399 +  // Implement this when the CFI symbol dumper changes have landed.
       
 58400 +  return NULL;
       
 58401 +}
       
 58402 +
       
 58403 +
       
 58404 +}  // namespace google_breakpad
       
 58405 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.h b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.h
       
 58406 new file mode 100644
       
 58407 --- /dev/null
       
 58408 +++ b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.h
       
 58409 @@ -0,0 +1,80 @@
       
 58410 +// Copyright (c) 2009, Google Inc.
       
 58411 +// All rights reserved.
       
 58412 +//
       
 58413 +// Redistribution and use in source and binary forms, with or without
       
 58414 +// modification, are permitted provided that the following conditions are
       
 58415 +// met:
       
 58416 +//
       
 58417 +//     * Redistributions of source code must retain the above copyright
       
 58418 +// notice, this list of conditions and the following disclaimer.
       
 58419 +//     * Redistributions in binary form must reproduce the above
       
 58420 +// copyright notice, this list of conditions and the following disclaimer
       
 58421 +// in the documentation and/or other materials provided with the
       
 58422 +// distribution.
       
 58423 +//     * Neither the name of Google Inc. nor the names of its
       
 58424 +// contributors may be used to endorse or promote products derived from
       
 58425 +// this software without specific prior written permission.
       
 58426 +//
       
 58427 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 58428 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 58429 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 58430 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 58431 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 58432 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 58433 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 58434 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 58435 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 58436 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 58437 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 58438 +
       
 58439 +// stackwalker_arm.h: arm-specific stackwalker.
       
 58440 +//
       
 58441 +// Provides stack frames given arm register context and a memory region
       
 58442 +// corresponding to an arm stack.
       
 58443 +//
       
 58444 +// Author: Mark Mentovai, Ted Mielczarek
       
 58445 +
       
 58446 +
       
 58447 +#ifndef PROCESSOR_STACKWALKER_ARM_H__
       
 58448 +#define PROCESSOR_STACKWALKER_ARM_H__
       
 58449 +
       
 58450 +
       
 58451 +#include "google_breakpad/common/breakpad_types.h"
       
 58452 +#include "google_breakpad/common/minidump_format.h"
       
 58453 +#include "google_breakpad/processor/stackwalker.h"
       
 58454 +
       
 58455 +namespace google_breakpad {
       
 58456 +
       
 58457 +class CodeModules;
       
 58458 +
       
 58459 +class StackwalkerARM : public Stackwalker {
       
 58460 + public:
       
 58461 +  // context is an arm context object that gives access to arm-specific
       
 58462 +  // register state corresponding to the innermost called frame to be
       
 58463 +  // included in the stack.  The other arguments are passed directly through
       
 58464 +  // to the base Stackwalker constructor.
       
 58465 +  StackwalkerARM(const SystemInfo *system_info,
       
 58466 +                 const MDRawContextARM *context,
       
 58467 +                 MemoryRegion *memory,
       
 58468 +                 const CodeModules *modules,
       
 58469 +                 SymbolSupplier *supplier,
       
 58470 +                 SourceLineResolverInterface *resolver);
       
 58471 +
       
 58472 + private:
       
 58473 +  // Implementation of Stackwalker, using arm context and stack conventions.
       
 58474 +  // TODO: currently stubbed out, needs CFI symbol dumper support
       
 58475 +  virtual StackFrame* GetContextFrame();
       
 58476 +  virtual StackFrame* GetCallerFrame(
       
 58477 +      const CallStack *stack,
       
 58478 +      const vector< linked_ptr<StackFrameInfo> > &stack_frame_info);
       
 58479 +
       
 58480 +  // Stores the CPU context corresponding to the innermost stack frame to
       
 58481 +  // be returned by GetContextFrame.
       
 58482 +  const MDRawContextARM *context_;
       
 58483 +};
       
 58484 +
       
 58485 +
       
 58486 +}  // namespace google_breakpad
       
 58487 +
       
 58488 +
       
 58489 +#endif  // PROCESSOR_STACKWALKER_ARM_H__
       
 58490 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.cc b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.cc
       
 58491 --- a/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.cc
       
 58492 +++ b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.cc
       
 58493 @@ -74,30 +74,31 @@ StackFrame* StackwalkerX86::GetContextFr
       
 58494    }
       
 58495  
       
 58496    StackFrameX86 *frame = new StackFrameX86();
       
 58497  
       
 58498    // The instruction pointer is stored directly in a register, so pull it
       
 58499    // straight out of the CPU context structure.
       
 58500    frame->context = *context_;
       
 58501    frame->context_validity = StackFrameX86::CONTEXT_VALID_ALL;
       
 58502 +  frame->trust = StackFrameX86::FRAME_TRUST_CONTEXT;
       
 58503    frame->instruction = frame->context.eip;
       
 58504  
       
 58505    return frame;
       
 58506  }
       
 58507  
       
 58508  
       
 58509  StackFrame* StackwalkerX86::GetCallerFrame(
       
 58510      const CallStack *stack,
       
 58511      const vector< linked_ptr<StackFrameInfo> > &stack_frame_info) {
       
 58512    if (!memory_ || !stack) {
       
 58513      BPLOG(ERROR) << "Can't get caller frame without memory or stack";
       
 58514      return NULL;
       
 58515    }
       
 58516 -
       
 58517 +  StackFrameX86::FrameTrust trust = StackFrameX86::FRAME_TRUST_NONE;
       
 58518    StackFrameX86 *last_frame = static_cast<StackFrameX86*>(
       
 58519        stack->frames()->back());
       
 58520    StackFrameInfo *last_frame_info = stack_frame_info.back().get();
       
 58521  
       
 58522    // This stackwalker sets each frame's %esp to its value immediately prior
       
 58523    // to the CALL into the callee.  This means that %esp points to the last
       
 58524    // callee argument pushed onto the stack, which may not be where %esp points
       
 58525    // after the callee returns.  Specifically, the value is correct for the
       
 58526 @@ -178,16 +179,17 @@ StackFrame* StackwalkerX86::GetCallerFra
       
 58527    // without any need for scanning.  The results of program string evaluation
       
 58528    // will be used to determine whether to scan for better values.
       
 58529    string program_string;
       
 58530    bool traditional_frame = true;
       
 58531    bool recover_ebp = true;
       
 58532    if (last_frame_info && last_frame_info->valid == StackFrameInfo::VALID_ALL) {
       
 58533      // FPO data available.
       
 58534      traditional_frame = false;
       
 58535 +    trust = StackFrameX86::FRAME_TRUST_CFI;
       
 58536      if (!last_frame_info->program_string.empty()) {
       
 58537        // The FPO data has its own program string, which will tell us how to
       
 58538        // get to the caller frame, and may even fill in the values of
       
 58539        // nonvolatile registers and provide pointers to local variables and
       
 58540        // parameters.  In some cases, particularly with program strings that use
       
 58541        // .raSearchStart, the stack may need to be scanned afterward.
       
 58542        program_string = last_frame_info->program_string;
       
 58543      } else if (last_frame_info->allocates_base_pointer) {
       
 58544 @@ -275,30 +277,50 @@ StackFrame* StackwalkerX86::GetCallerFra
       
 58545      //
       
 58546      // Instruction and frame pointer recovery for these traditional frames is
       
 58547      // entirely deterministic, and the stack will not be scanned after
       
 58548      // recovering these values.
       
 58549      //
       
 58550      // %eip_new = *(%ebp_old + 4)
       
 58551      // %esp_new = %ebp_old + 8
       
 58552      // %ebp_new = *(%ebp_old)
       
 58553 +    trust = StackFrameX86::FRAME_TRUST_FP;
       
 58554      program_string = "$eip $ebp 4 + ^ = "
       
 58555                       "$esp $ebp 8 + = "
       
 58556                       "$ebp $ebp ^ =";
       
 58557    }
       
 58558  
       
 58559    // Now crank it out, making sure that the program string set at least the
       
 58560    // two required variables.
       
 58561    PostfixEvaluator<u_int32_t> evaluator =
       
 58562        PostfixEvaluator<u_int32_t>(&dictionary, memory_);
       
 58563    PostfixEvaluator<u_int32_t>::DictionaryValidityType dictionary_validity;
       
 58564    if (!evaluator.Evaluate(program_string, &dictionary_validity) ||
       
 58565        dictionary_validity.find("$eip") == dictionary_validity.end() ||
       
 58566        dictionary_validity.find("$esp") == dictionary_validity.end()) {
       
 58567 -    return NULL;
       
 58568 +    // Program string evaluation failed. It may be that %eip is not somewhere
       
 58569 +    // with stack frame info, and %ebp is pointing to non-stack memory, so
       
 58570 +    // our evaluation couldn't succeed. We'll scan the stack for a return
       
 58571 +    // address. This can happen if the stack is in a module for which
       
 58572 +    // we don't have symbols, and that module is compiled without a
       
 58573 +    // frame pointer.
       
 58574 +    u_int32_t location_start = last_frame->context.esp;
       
 58575 +    u_int32_t location, eip;
       
 58576 +    if (!ScanForReturnAddress(location_start, location, eip)) {
       
 58577 +      // if we can't find an instruction pointer even with stack scanning,
       
 58578 +      // give up.
       
 58579 +      return NULL;
       
 58580 +    }
       
 58581 +
       
 58582 +    // This seems like a reasonable return address. Since program string
       
 58583 +    // evaluation failed, use it and set %esp to the location above the
       
 58584 +    // one where the return address was found.
       
 58585 +    dictionary["$eip"] = eip;
       
 58586 +    dictionary["$esp"] = location + 4;
       
 58587 +    trust = StackFrameX86::FRAME_TRUST_SCAN;
       
 58588    }
       
 58589  
       
 58590    // If this stack frame did not use %ebp in a traditional way, locating the
       
 58591    // return address isn't entirely deterministic.  In that case, the stack
       
 58592    // can be scanned to locate the return address.
       
 58593    //
       
 58594    // Even in nontraditional frames, if program string evaluation resulted in
       
 58595    // both %eip and %ebp values of 0, trust that the end of the stack has been
       
 58596 @@ -316,43 +338,28 @@ StackFrame* StackwalkerX86::GetCallerFra
       
 58597      // require dumps that contain MINIDUMP_MEMORY_INFO, which the Breakpad
       
 58598      // client doesn't currently write (it would need to call MiniDumpWriteDump
       
 58599      // with the MiniDumpWithFullMemoryInfo type bit set).  Even given this
       
 58600      // ability, older OSes (pre-XP SP2) and CPUs (pre-P4) don't enforce
       
 58601      // an independent execute privilege on memory pages.
       
 58602  
       
 58603      u_int32_t eip = dictionary["$eip"];
       
 58604      if (modules_ && !modules_->GetModuleForAddress(eip)) {
       
 58605 -      const int kRASearchWords = 15;
       
 58606 -
       
 58607        // The instruction pointer at .raSearchStart was invalid, so start
       
 58608        // looking one 32-bit word above that location.
       
 58609        u_int32_t location_start = dictionary[".raSearchStart"] + 4;
       
 58610 -
       
 58611 -      for (u_int32_t location = location_start;
       
 58612 -           location <= location_start + kRASearchWords * 4;
       
 58613 -           location += 4) {
       
 58614 -        if (!memory_->GetMemoryAtAddress(location, &eip))
       
 58615 -          break;
       
 58616 -
       
 58617 -        if (modules_->GetModuleForAddress(eip)) {
       
 58618 -          // This is a better return address that what program string
       
 58619 -          // evaluation found.  Use it, and set %esp to the location above the
       
 58620 -          // one where the return address was found.
       
 58621 -          //
       
 58622 -          // TODO(mmentovai): The return-address check can be made even
       
 58623 -          // stronger in modules for which debugging data is available.  In
       
 58624 -          // that case, it's possible to check that the candidate return
       
 58625 -          // address is inside a known function.
       
 58626 -
       
 58627 -          dictionary["$eip"] = eip;
       
 58628 -          dictionary["$esp"] = location + 4;
       
 58629 -          offset = location - location_start;
       
 58630 -          break;
       
 58631 -        }
       
 58632 +      u_int32_t location;
       
 58633 +      if (ScanForReturnAddress(location_start, location, eip)) {
       
 58634 +        // This is a better return address that what program string
       
 58635 +        // evaluation found.  Use it, and set %esp to the location above the
       
 58636 +        // one where the return address was found.
       
 58637 +        dictionary["$eip"] = eip;
       
 58638 +        dictionary["$esp"] = location + 4;
       
 58639 +        offset = location - location_start;
       
 58640 +        trust = StackFrameX86::FRAME_TRUST_CFI_SCAN;
       
 58641        }
       
 58642      }
       
 58643  
       
 58644      // When trying to recover the previous value of the frame pointer (%ebp),
       
 58645      // start looking at the lowest possible address in the saved-register
       
 58646      // area, and look at the entire saved register area, increased by the
       
 58647      // size of |offset| to account for additional data that may be on the
       
 58648      // stack.  The scan is performed from the highest possible address to
       
 58649 @@ -387,16 +394,17 @@ StackFrame* StackwalkerX86::GetCallerFra
       
 58650        dictionary["$esp"] <= last_frame->context.esp) {
       
 58651      return NULL;
       
 58652    }
       
 58653  
       
 58654    // Create a new stack frame (ownership will be transferred to the caller)
       
 58655    // and fill it in.
       
 58656    StackFrameX86 *frame = new StackFrameX86();
       
 58657  
       
 58658 +  frame->trust = trust;
       
 58659    frame->context = last_frame->context;
       
 58660    frame->context.eip = dictionary["$eip"];
       
 58661    frame->context.esp = dictionary["$esp"];
       
 58662    frame->context.ebp = dictionary["$ebp"];
       
 58663    frame->context_validity = StackFrameX86::CONTEXT_VALID_EIP |
       
 58664                                  StackFrameX86::CONTEXT_VALID_ESP |
       
 58665                                  StackFrameX86::CONTEXT_VALID_EBP;
       
 58666  
       
 58667 @@ -423,10 +431,32 @@ StackFrame* StackwalkerX86::GetCallerFra
       
 58668    // with the line that contains a function call.  Callers that require the
       
 58669    // exact return address value may access the context.eip field of
       
 58670    // StackFrameX86.
       
 58671    frame->instruction = frame->context.eip - 1;
       
 58672  
       
 58673    return frame;
       
 58674  }
       
 58675  
       
 58676 +bool StackwalkerX86::ScanForReturnAddress(u_int32_t location_start,
       
 58677 +                                          u_int32_t &location_found,
       
 58678 +                                          u_int32_t &eip_found) {
       
 58679 +  const int kRASearchWords = 15;
       
 58680 +  for (u_int32_t location = location_start;
       
 58681 +       location <= location_start + kRASearchWords * 4;
       
 58682 +       location += 4) {
       
 58683 +    u_int32_t eip;
       
 58684 +    if (!memory_->GetMemoryAtAddress(location, &eip))
       
 58685 +      break;
       
 58686 +
       
 58687 +    if (modules_ && modules_->GetModuleForAddress(eip) &&
       
 58688 +        InstructionAddressSeemsValid(eip)) {
       
 58689 +
       
 58690 +      eip_found = eip;
       
 58691 +      location_found = location;
       
 58692 +      return true;
       
 58693 +    }
       
 58694 +  }
       
 58695 +  // nothing found
       
 58696 +  return false;
       
 58697 +}
       
 58698  
       
 58699  }  // namespace google_breakpad
       
 58700 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.h b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.h
       
 58701 --- a/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.h
       
 58702 +++ b/toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.h
       
 58703 @@ -65,16 +65,29 @@ class StackwalkerX86 : public Stackwalke
       
 58704    // Implementation of Stackwalker, using x86 context (%ebp, %esp, %eip) and
       
 58705    // stack conventions (saved %ebp at [%ebp], saved %eip at 4[%ebp], or
       
 58706    // alternate conventions as guided by stack_frame_info_).
       
 58707    virtual StackFrame* GetContextFrame();
       
 58708    virtual StackFrame* GetCallerFrame(
       
 58709        const CallStack *stack,
       
 58710        const vector< linked_ptr<StackFrameInfo> > &stack_frame_info);
       
 58711  
       
 58712 +  // Scan the stack starting at location_start, looking for an address
       
 58713 +  // that looks like a valid instruction pointer. Addresses must
       
 58714 +  // 1) be contained in the current stack memory
       
 58715 +  // 2) pass the checks in Stackwalker::InstructionAddressSeemsValid
       
 58716 +  //
       
 58717 +  // Returns true if a valid-looking instruction pointer was found.
       
 58718 +  // When returning true, sets location_found to the address at which
       
 58719 +  // the value was found, and eip_found to the value contained at that
       
 58720 +  // location in memory.
       
 58721 +  bool ScanForReturnAddress(u_int32_t location_start,
       
 58722 +                            u_int32_t &location_found,
       
 58723 +                            u_int32_t &eip_found);
       
 58724 +
       
 58725    // Stores the CPU context corresponding to the innermost stack frame to
       
 58726    // be returned by GetContextFrame.
       
 58727    const MDRawContextX86 *context_;
       
 58728  };
       
 58729  
       
 58730  
       
 58731  }  // namespace google_breakpad
       
 58732  
       
 58733 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/testdata/linux_test_app.cc b/toolkit/crashreporter/google-breakpad/src/processor/testdata/linux_test_app.cc
       
 58734 new file mode 100644
       
 58735 --- /dev/null
       
 58736 +++ b/toolkit/crashreporter/google-breakpad/src/processor/testdata/linux_test_app.cc
       
 58737 @@ -0,0 +1,81 @@
       
 58738 +// Copyright (c) 2009, Google Inc.
       
 58739 +// All rights reserved.
       
 58740 +//
       
 58741 +// Redistribution and use in source and binary forms, with or without
       
 58742 +// modification, are permitted provided that the following conditions are
       
 58743 +// met:
       
 58744 +//
       
 58745 +//     * Redistributions of source code must retain the above copyright
       
 58746 +// notice, this list of conditions and the following disclaimer.
       
 58747 +//     * Redistributions in binary form must reproduce the above
       
 58748 +// copyright notice, this list of conditions and the following disclaimer
       
 58749 +// in the documentation and/or other materials provided with the
       
 58750 +// distribution.
       
 58751 +//     * Neither the name of Google Inc. nor the names of its
       
 58752 +// contributors may be used to endorse or promote products derived from
       
 58753 +// this software without specific prior written permission.
       
 58754 +//
       
 58755 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 58756 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 58757 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 58758 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 58759 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 58760 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 58761 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 58762 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 58763 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 58764 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 58765 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 58766 +
       
 58767 +// Breakpad test application for Linux. When run, it generates one on-demand
       
 58768 +// minidump and then crashes, which should generate an on-crash minidump.
       
 58769 +// dump_syms can be used to extract symbol information for use in processing.
       
 58770 +
       
 58771 +// To build:
       
 58772 +// g++ -g -o linux_test_app -I ../../ -L../../client/linux linux_test_app.cc \
       
 58773 +//   -lbreakpad
       
 58774 +// Add -m32 to build a 32-bit executable, or -m64 for a 64-bit one
       
 58775 +// (assuming your environment supports it). Replace -g with -gstabs+ to
       
 58776 +// generate an executable with STABS symbols (needs -m32), or -gdwarf-2 for one
       
 58777 +// with DWARF symbols (32- or 64-bit)
       
 58778 +
       
 58779 +#include <sys/types.h>
       
 58780 +#include <unistd.h>
       
 58781 +#include <cstdio>
       
 58782 +#include <string>
       
 58783 +
       
 58784 +#include "common/linux/linux_syscall_support.h"
       
 58785 +#include "client/linux/handler/exception_handler.h"
       
 58786 +
       
 58787 +namespace {
       
 58788 +
       
 58789 +// google_breakpad::MinidumpCallback to invoke after minidump generation.
       
 58790 +static bool callback(const char *dump_path, const char *id,
       
 58791 +                     void *context,
       
 58792 +                     bool succeeded) {
       
 58793 +  if (succeeded) {
       
 58794 +    printf("dump guid is %s\n", id);
       
 58795 +  } else {
       
 58796 +    printf("dump failed\n");
       
 58797 +  }
       
 58798 +  fflush(stdout);
       
 58799 +
       
 58800 +  return succeeded;
       
 58801 +}
       
 58802 +
       
 58803 +static void CrashFunction() {
       
 58804 +  int *i = reinterpret_cast<int*>(0x45);
       
 58805 +  *i = 5;  // crash!
       
 58806 +}
       
 58807 +
       
 58808 +}  // namespace
       
 58809 +
       
 58810 +int main(int argc, char **argv) {
       
 58811 +  google_breakpad::ExceptionHandler eh(".", NULL, callback, NULL, true);
       
 58812 +  if (!eh.WriteMinidump()) {
       
 58813 +    printf("Failed to generate on-demand minidump\n");
       
 58814 +  }
       
 58815 +  CrashFunction();
       
 58816 +  printf("did not crash?\n");
       
 58817 +  return 0;
       
 58818 +}
       
 58819 diff --git a/toolkit/crashreporter/google-breakpad/src/processor/testdata/minidump2.stackwalk.out b/toolkit/crashreporter/google-breakpad/src/processor/testdata/minidump2.stackwalk.out
       
 58820 --- a/toolkit/crashreporter/google-breakpad/src/processor/testdata/minidump2.stackwalk.out
       
 58821 +++ b/toolkit/crashreporter/google-breakpad/src/processor/testdata/minidump2.stackwalk.out
       
 58822 @@ -7,22 +7,26 @@ CPU: x86
       
 58823  Crash reason:  EXCEPTION_ACCESS_VIOLATION
       
 58824  Crash address: 0x45
       
 58825  
       
 58826  Thread 0 (crashed)
       
 58827   0  test_app.exe!`anonymous namespace'::CrashFunction [test_app.cc : 58 + 0x3]
       
 58828      eip = 0x0040429e   esp = 0x0012fe84   ebp = 0x0012fe88   ebx = 0x7c80abc1
       
 58829      esi = 0x00000002   edi = 0x00000a28   eax = 0x00000045   ecx = 0x0012fe94
       
 58830      edx = 0x0042bc58   efl = 0x00010246
       
 58831 +    Found by: given as instruction pointer in context
       
 58832   1  test_app.exe!main [test_app.cc : 65 + 0x4]
       
 58833      eip = 0x00404200   esp = 0x0012fe90   ebp = 0x0012ff70
       
 58834 +    Found by: call frame info
       
 58835   2  test_app.exe!__tmainCRTStartup [crt0.c : 327 + 0x11]
       
 58836      eip = 0x004053ec   esp = 0x0012ff78   ebp = 0x0012ffc0
       
 58837 +    Found by: call frame info
       
 58838   3  kernel32.dll!BaseProcessStart + 0x22
       
 58839      eip = 0x7c816fd7   esp = 0x0012ffc8   ebp = 0x0012fff0
       
 58840 +    Found by: call frame info
       
 58841  
       
 58842  Loaded modules:
       
 58843  0x00400000 - 0x0042cfff  test_app.exe  ???  (main)
       
 58844  0x59a60000 - 0x59b00fff  dbghelp.dll  5.1.2600.2180
       
 58845  0x76390000 - 0x763acfff  imm32.dll  5.1.2600.2180
       
 58846  0x76bf0000 - 0x76bfafff  psapi.dll  5.1.2600.2180
       
 58847  0x774e0000 - 0x7761cfff  ole32.dll  5.1.2600.2726
       
 58848  0x77c00000 - 0x77c07fff  version.dll  5.1.2600.2180
       
 58849 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/gflags/gflags.h b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/gflags/gflags.h
       
 58850 new file mode 100644
       
 58851 --- /dev/null
       
 58852 +++ b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/gflags/gflags.h
       
 58853 @@ -0,0 +1,533 @@
       
 58854 +// Copyright (c) 2006, Google Inc.
       
 58855 +// All rights reserved.
       
 58856 +//
       
 58857 +// Redistribution and use in source and binary forms, with or without
       
 58858 +// modification, are permitted provided that the following conditions are
       
 58859 +// met:
       
 58860 +//
       
 58861 +//     * Redistributions of source code must retain the above copyright
       
 58862 +// notice, this list of conditions and the following disclaimer.
       
 58863 +//     * Redistributions in binary form must reproduce the above
       
 58864 +// copyright notice, this list of conditions and the following disclaimer
       
 58865 +// in the documentation and/or other materials provided with the
       
 58866 +// distribution.
       
 58867 +//     * Neither the name of Google Inc. nor the names of its
       
 58868 +// contributors may be used to endorse or promote products derived from
       
 58869 +// this software without specific prior written permission.
       
 58870 +//
       
 58871 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 58872 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 58873 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 58874 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 58875 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 58876 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 58877 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 58878 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 58879 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 58880 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 58881 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 58882 +
       
 58883 +// ---
       
 58884 +// Author: Ray Sidney
       
 58885 +// Revamped and reorganized by Craig Silverstein
       
 58886 +//
       
 58887 +// This is the file that should be included by any file which declares
       
 58888 +// or defines a command line flag or wants to parse command line flags
       
 58889 +// or print a program usage message (which will include information about
       
 58890 +// flags).  Executive summary, in the form of an example foo.cc file:
       
 58891 +//
       
 58892 +//    #include "foo.h"         // foo.h has a line "DECLARE_int32(start);"
       
 58893 +//
       
 58894 +//    DEFINE_int32(end, 1000, "The last record to read");
       
 58895 +//    DECLARE_bool(verbose);   // some other file has a DEFINE_bool(verbose, ...)
       
 58896 +//
       
 58897 +//    void MyFunc() {
       
 58898 +//      if (FLAGS_verbose) printf("Records %d-%d\n", FLAGS_start, FLAGS_end);
       
 58899 +//    }
       
 58900 +//
       
 58901 +// Then, at the command-line:
       
 58902 +//    ./foo --noverbose --start=5 --end=100
       
 58903 +//
       
 58904 +// For more details, see
       
 58905 +//    doc/gflags.html
       
 58906 +//
       
 58907 +// --- A note about thread-safety:
       
 58908 +//
       
 58909 +// We describe many functions in this routine as being thread-hostile,
       
 58910 +// thread-compatible, or thread-safe.  Here are the meanings we use:
       
 58911 +//
       
 58912 +// thread-safe: it is safe for multiple threads to call this routine
       
 58913 +//   (or, when referring to a class, methods of this class)
       
 58914 +//   concurrently.
       
 58915 +// thread-hostile: it is not safe for multiple threads to call this
       
 58916 +//   routine (or methods of this class) concurrently.  In gflags,
       
 58917 +//   most thread-hostile routines are intended to be called early in,
       
 58918 +//   or even before, main() -- that is, before threads are spawned.
       
 58919 +// thread-compatible: it is safe for multiple threads to read from
       
 58920 +//   this variable (when applied to variables), or to call const
       
 58921 +//   methods of this class (when applied to classes), as long as no
       
 58922 +//   other thread is writing to the variable or calling non-const
       
 58923 +//   methods of this class.
       
 58924 +
       
 58925 +#ifndef GOOGLE_GFLAGS_H_
       
 58926 +#define GOOGLE_GFLAGS_H_
       
 58927 +
       
 58928 +#include <string>
       
 58929 +#include <vector>
       
 58930 +
       
 58931 +// We care a lot about number of bits things take up.  Unfortunately,
       
 58932 +// systems define their bit-specific ints in a lot of different ways.
       
 58933 +// We use our own way, and have a typedef to get there.
       
 58934 +// Note: these commands below may look like "#if 1" or "#if 0", but
       
 58935 +// that's because they were constructed that way at ./configure time.
       
 58936 +// Look at gflags.h.in to see how they're calculated (based on your config).
       
 58937 +#if 1
       
 58938 +#include <stdint.h>             // the normal place uint16_t is defined
       
 58939 +#endif
       
 58940 +#if 1
       
 58941 +#include <sys/types.h>          // the normal place u_int16_t is defined
       
 58942 +#endif
       
 58943 +#if 1
       
 58944 +#include <inttypes.h>           // a third place for uint16_t or u_int16_t
       
 58945 +#endif
       
 58946 +
       
 58947 +namespace google {
       
 58948 +
       
 58949 +#if 1      // the C99 format
       
 58950 +typedef int32_t int32;
       
 58951 +typedef uint32_t uint32;
       
 58952 +typedef int64_t int64;
       
 58953 +typedef uint64_t uint64;
       
 58954 +#elif 1   // the BSD format
       
 58955 +typedef int32_t int32;
       
 58956 +typedef u_int32_t uint32;
       
 58957 +typedef int64_t int64;
       
 58958 +typedef u_int64_t uint64;
       
 58959 +#elif 0     // the windows (vc7) format
       
 58960 +typedef __int32 int32;
       
 58961 +typedef unsigned __int32 uint32;
       
 58962 +typedef __int64 int64;
       
 58963 +typedef unsigned __int64 uint64;
       
 58964 +#else
       
 58965 +#error Do not know how to define a 32-bit integer quantity on your system
       
 58966 +#endif
       
 58967 +
       
 58968 +// --------------------------------------------------------------------
       
 58969 +// To actually define a flag in a file, use DEFINE_bool,
       
 58970 +// DEFINE_string, etc. at the bottom of this file.  You may also find
       
 58971 +// it useful to register a validator with the flag.  This ensures that
       
 58972 +// when the flag is parsed from the commandline, or is later set via
       
 58973 +// SetCommandLineOption, we call the validation function.
       
 58974 +//
       
 58975 +// The validation function should return true if the flag value is valid, and
       
 58976 +// false otherwise. If the function returns false for the new setting of the
       
 58977 +// flag, the flag will retain its current value. If it returns false for the
       
 58978 +// default value, InitGoogle will die.
       
 58979 +//
       
 58980 +// This function is safe to call at global construct time (as in the
       
 58981 +// example below).
       
 58982 +//
       
 58983 +// Example use:
       
 58984 +//    static bool ValidatePort(const char* flagname, int32 value) {
       
 58985 +//       if (value > 0 && value < 32768)   // value is ok
       
 58986 +//         return true;
       
 58987 +//       printf("Invalid value for --%s: %d\n", flagname, (int)value);
       
 58988 +//       return false;
       
 58989 +//    }
       
 58990 +//    DEFINE_int32(port, 0, "What port to listen on");
       
 58991 +//    static bool dummy = RegisterFlagValidator(&FLAGS_port, &ValidatePort);
       
 58992 +
       
 58993 +// Returns true if successfully registered, false if not (because the
       
 58994 +// first argument doesn't point to a command-line flag, or because a
       
 58995 +// validator is already registered for this flag).
       
 58996 +bool RegisterFlagValidator(const bool* flag,
       
 58997 +                           bool (*validate_fn)(const char*, bool));
       
 58998 +bool RegisterFlagValidator(const int32* flag,
       
 58999 +                           bool (*validate_fn)(const char*, int32));
       
 59000 +bool RegisterFlagValidator(const int64* flag,
       
 59001 +                           bool (*validate_fn)(const char*, int64));
       
 59002 +bool RegisterFlagValidator(const uint64* flag,
       
 59003 +                           bool (*validate_fn)(const char*, uint64));
       
 59004 +bool RegisterFlagValidator(const double* flag,
       
 59005 +                           bool (*validate_fn)(const char*, double));
       
 59006 +bool RegisterFlagValidator(const std::string* flag,
       
 59007 +                           bool (*validate_fn)(const char*, const std::string&));
       
 59008 +
       
 59009 +
       
 59010 +// --------------------------------------------------------------------
       
 59011 +// These methods are the best way to get access to info about the
       
 59012 +// list of commandline flags.  Note that these routines are pretty slow.
       
 59013 +//   GetAllFlags: mostly-complete info about the list, sorted by file.
       
 59014 +//   ShowUsageWithFlags: pretty-prints the list to stdout (what --help does)
       
 59015 +//   ShowUsageWithFlagsRestrict: limit to filenames with restrict as a substr
       
 59016 +//
       
 59017 +// In addition to accessing flags, you can also access argv[0] (the program
       
 59018 +// name) and argv (the entire commandline), which we sock away a copy of.
       
 59019 +// These variables are static, so you should only set them once.
       
 59020 +
       
 59021 +struct CommandLineFlagInfo {
       
 59022 +  std::string name;           // the name of the flag
       
 59023 +  std::string type;           // the type of the flag: int32, etc
       
 59024 +  std::string description;    // the "help text" associated with the flag
       
 59025 +  std::string current_value;  // the current value, as a string
       
 59026 +  std::string default_value;  // the default value, as a string
       
 59027 +  std::string filename;       // 'cleaned' version of filename holding the flag
       
 59028 +  bool has_validator_fn;      // true if RegisterFlagValidator called on flag
       
 59029 +  bool is_default;            // true if the flag has default value
       
 59030 +};
       
 59031 +
       
 59032 +extern void GetAllFlags(std::vector<CommandLineFlagInfo>* OUTPUT);
       
 59033 +// These two are actually defined in commandlineflags_reporting.cc.
       
 59034 +extern void ShowUsageWithFlags(const char *argv0);  // what --help does
       
 59035 +extern void ShowUsageWithFlagsRestrict(const char *argv0, const char *restrict);
       
 59036 +
       
 59037 +// Create a descriptive string for a flag.
       
 59038 +// Goes to some trouble to make pretty line breaks.
       
 59039 +extern std::string DescribeOneFlag(const CommandLineFlagInfo& flag);
       
 59040 +
       
 59041 +// Thread-hostile; meant to be called before any threads are spawned.
       
 59042 +extern void SetArgv(int argc, const char** argv);
       
 59043 +// The following functions are thread-safe as long as SetArgv() is
       
 59044 +// only called before any threads start.
       
 59045 +extern const std::vector<std::string>& GetArgvs();  // all of argv as a vector
       
 59046 +extern const char* GetArgv();               // all of argv as a string
       
 59047 +extern const char* GetArgv0();              // only argv0
       
 59048 +extern uint32 GetArgvSum();                 // simple checksum of argv
       
 59049 +extern const char* ProgramInvocationName(); // argv0, or "UNKNOWN" if not set
       
 59050 +extern const char* ProgramInvocationShortName();   // basename(argv0)
       
 59051 +// ProgramUsage() is thread-safe as long as SetUsageMessage() is only
       
 59052 +// called before any threads start.
       
 59053 +extern const char* ProgramUsage();          // string set by SetUsageMessage()
       
 59054 +
       
 59055 +
       
 59056 +// --------------------------------------------------------------------
       
 59057 +// Normally you access commandline flags by just saying "if (FLAGS_foo)"
       
 59058 +// or whatever, and set them by calling "FLAGS_foo = bar" (or, more
       
 59059 +// commonly, via the DEFINE_foo macro).  But if you need a bit more
       
 59060 +// control, we have programmatic ways to get/set the flags as well.
       
 59061 +// These programmatic ways to access flags are thread-safe, but direct
       
 59062 +// access is only thread-compatible.
       
 59063 +
       
 59064 +// Return true iff the flagname was found.
       
 59065 +// OUTPUT is set to the flag's value, or unchanged if we return false.
       
 59066 +extern bool GetCommandLineOption(const char* name, std::string* OUTPUT);
       
 59067 +
       
 59068 +// Return true iff the flagname was found. OUTPUT is set to the flag's
       
 59069 +// CommandLineFlagInfo or unchanged if we return false.
       
 59070 +extern bool GetCommandLineFlagInfo(const char* name,
       
 59071 +                                   CommandLineFlagInfo* OUTPUT);
       
 59072 +
       
 59073 +// Return the CommandLineFlagInfo of the flagname.  exit() if name not found.
       
 59074 +// Example usage, to check if a flag's value is currently the default value:
       
 59075 +//   if (GetCommandLineFlagInfoOrDie("foo").is_default) ...
       
 59076 +extern CommandLineFlagInfo GetCommandLineFlagInfoOrDie(const char* name);
       
 59077 +
       
 59078 +enum FlagSettingMode {
       
 59079 +  // update the flag's value (can call this multiple times).
       
 59080 +  SET_FLAGS_VALUE,
       
 59081 +  // update the flag's value, but *only if* it has not yet been updated
       
 59082 +  // with SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or "FLAGS_xxx = nondef".
       
 59083 +  SET_FLAG_IF_DEFAULT,
       
 59084 +  // set the flag's default value to this.  If the flag has not yet updated
       
 59085 +  // yet (via SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or "FLAGS_xxx = nondef")
       
 59086 +  // change the flag's current value to the new default value as well.
       
 59087 +  SET_FLAGS_DEFAULT
       
 59088 +};
       
 59089 +
       
 59090 +// Set a particular flag ("command line option").  Returns a string
       
 59091 +// describing the new value that the option has been set to.  The
       
 59092 +// return value API is not well-specified, so basically just depend on
       
 59093 +// it to be empty if the setting failed for some reason -- the name is
       
 59094 +// not a valid flag name, or the value is not a valid value -- and
       
 59095 +// non-empty else.
       
 59096 +
       
 59097 +// SetCommandLineOption uses set_mode == SET_FLAGS_VALUE (the common case)
       
 59098 +extern std::string SetCommandLineOption(const char* name, const char* value);
       
 59099 +extern std::string SetCommandLineOptionWithMode(const char* name, const char* value,
       
 59100 +                                                FlagSettingMode set_mode);
       
 59101 +
       
 59102 +
       
 59103 +// --------------------------------------------------------------------
       
 59104 +// Saves the states (value, default value, whether the user has set
       
 59105 +// the flag, registered validators, etc) of all flags, and restores
       
 59106 +// them when the FlagSaver is destroyed.  This is very useful in
       
 59107 +// tests, say, when you want to let your tests change the flags, but
       
 59108 +// make sure that they get reverted to the original states when your
       
 59109 +// test is complete.
       
 59110 +//
       
 59111 +// Example usage:
       
 59112 +//   void TestFoo() {
       
 59113 +//     FlagSaver s1;
       
 59114 +//     FLAG_foo = false;
       
 59115 +//     FLAG_bar = "some value";
       
 59116 +//
       
 59117 +//     // test happens here.  You can return at any time
       
 59118 +//     // without worrying about restoring the FLAG values.
       
 59119 +//   }
       
 59120 +//
       
 59121 +// Note: This class is marked with __attribute__((unused)) because all the
       
 59122 +// work is done in the constructor and destructor, so in the standard
       
 59123 +// usage example above, the compiler would complain that it's an
       
 59124 +// unused variable.
       
 59125 +//
       
 59126 +// This class is thread-safe.
       
 59127 +
       
 59128 +class FlagSaver {
       
 59129 + public:
       
 59130 +  FlagSaver();
       
 59131 +  ~FlagSaver();
       
 59132 +
       
 59133 + private:
       
 59134 +  class FlagSaverImpl* impl_;   // we use pimpl here to keep API steady
       
 59135 +
       
 59136 +  FlagSaver(const FlagSaver&);  // no copying!
       
 59137 +  void operator=(const FlagSaver&);
       
 59138 +} __attribute__ ((unused));
       
 59139 +
       
 59140 +// --------------------------------------------------------------------
       
 59141 +// Some deprecated or hopefully-soon-to-be-deprecated functions.
       
 59142 +
       
 59143 +// This is often used for logging.  TODO(csilvers): figure out a better way
       
 59144 +extern std::string CommandlineFlagsIntoString();
       
 59145 +// Usually where this is used, a FlagSaver should be used instead.
       
 59146 +extern bool ReadFlagsFromString(const std::string& flagfilecontents,
       
 59147 +                                const char* prog_name,
       
 59148 +                                bool errors_are_fatal); // uses SET_FLAGS_VALUE
       
 59149 +
       
 59150 +// These let you manually implement --flagfile functionality.
       
 59151 +// DEPRECATED.
       
 59152 +extern bool AppendFlagsIntoFile(const std::string& filename, const char* prog_name);
       
 59153 +extern bool SaveCommandFlags();  // actually defined in google.cc !
       
 59154 +extern bool ReadFromFlagsFile(const std::string& filename, const char* prog_name,
       
 59155 +                              bool errors_are_fatal);   // uses SET_FLAGS_VALUE
       
 59156 +
       
 59157 +
       
 59158 +// --------------------------------------------------------------------
       
 59159 +// Useful routines for initializing flags from the environment.
       
 59160 +// In each case, if 'varname' does not exist in the environment
       
 59161 +// return defval.  If 'varname' does exist but is not valid
       
 59162 +// (e.g., not a number for an int32 flag), abort with an error.
       
 59163 +// Otherwise, return the value.  NOTE: for booleans, for true use
       
 59164 +// 't' or 'T' or 'true' or '1', for false 'f' or 'F' or 'false' or '0'.
       
 59165 +
       
 59166 +extern bool BoolFromEnv(const char *varname, bool defval);
       
 59167 +extern int32 Int32FromEnv(const char *varname, int32 defval);
       
 59168 +extern int64 Int64FromEnv(const char *varname, int64 defval);
       
 59169 +extern uint64 Uint64FromEnv(const char *varname, uint64 defval);
       
 59170 +extern double DoubleFromEnv(const char *varname, double defval);
       
 59171 +extern const char *StringFromEnv(const char *varname, const char *defval);
       
 59172 +
       
 59173 +
       
 59174 +// --------------------------------------------------------------------
       
 59175 +// The next two functions parse commandlineflags from main():
       
 59176 +
       
 59177 +// Set the "usage" message for this program.  For example:
       
 59178 +//   string usage("This program does nothing.  Sample usage:\n");
       
 59179 +//   usage += argv[0] + " <uselessarg1> <uselessarg2>";
       
 59180 +//   SetUsageMessage(usage);
       
 59181 +// Do not include commandline flags in the usage: we do that for you!
       
 59182 +// Thread-hostile; meant to be called before any threads are spawned.
       
 59183 +extern void SetUsageMessage(const std::string& usage);
       
 59184 +
       
 59185 +// Looks for flags in argv and parses them.  Rearranges argv to put
       
 59186 +// flags first, or removes them entirely if remove_flags is true.
       
 59187 +// If a flag is defined more than once in the command line or flag
       
 59188 +// file, the last definition is used.
       
 59189 +// See top-of-file for more details on this function.
       
 59190 +#ifndef SWIG   // In swig, use ParseCommandLineFlagsScript() instead.
       
 59191 +extern uint32 ParseCommandLineFlags(int *argc, char*** argv,
       
 59192 +                                    bool remove_flags);
       
 59193 +#endif
       
 59194 +
       
 59195 +
       
 59196 +// Calls to ParseCommandLineNonHelpFlags and then to
       
 59197 +// HandleCommandLineHelpFlags can be used instead of a call to
       
 59198 +// ParseCommandLineFlags during initialization, in order to allow for
       
 59199 +// changing default values for some FLAGS (via
       
 59200 +// e.g. SetCommandLineOptionWithMode calls) between the time of
       
 59201 +// command line parsing and the time of dumping help information for
       
 59202 +// the flags as a result of command line parsing.
       
 59203 +// If a flag is defined more than once in the command line or flag
       
 59204 +// file, the last definition is used.
       
 59205 +extern uint32 ParseCommandLineNonHelpFlags(int *argc, char*** argv,
       
 59206 +                                           bool remove_flags);
       
 59207 +// This is actually defined in commandlineflags_reporting.cc.
       
 59208 +// This function is misnamed (it also handles --version, etc.), but
       
 59209 +// it's too late to change that now. :-(
       
 59210 +extern void HandleCommandLineHelpFlags();   // in commandlineflags_reporting.cc
       
 59211 +
       
 59212 +// Allow command line reparsing.  Disables the error normally
       
 59213 +// generated when an unknown flag is found, since it may be found in a
       
 59214 +// later parse.  Thread-hostile; meant to be called before any threads
       
 59215 +// are spawned.
       
 59216 +extern void AllowCommandLineReparsing();
       
 59217 +
       
 59218 +// Reparse the flags that have not yet been recognized.
       
 59219 +// Only flags registered since the last parse will be recognized.
       
 59220 +// Any flag value must be provided as part of the argument using "=",
       
 59221 +// not as a separate command line argument that follows the flag argument.
       
 59222 +// Intended for handling flags from dynamically loaded libraries,
       
 59223 +// since their flags are not registered until they are loaded.
       
 59224 +extern uint32 ReparseCommandLineNonHelpFlags();
       
 59225 +
       
 59226 +
       
 59227 +// --------------------------------------------------------------------
       
 59228 +// Now come the command line flag declaration/definition macros that
       
 59229 +// will actually be used.  They're kind of hairy.  A major reason
       
 59230 +// for this is initialization: we want people to be able to access
       
 59231 +// variables in global constructors and have that not crash, even if
       
 59232 +// their global constructor runs before the global constructor here.
       
 59233 +// (Obviously, we can't guarantee the flags will have the correct
       
 59234 +// default value in that case, but at least accessing them is safe.)
       
 59235 +// The only way to do that is have flags point to a static buffer.
       
 59236 +// So we make one, using a union to ensure proper alignment, and
       
 59237 +// then use placement-new to actually set up the flag with the
       
 59238 +// correct default value.  In the same vein, we have to worry about
       
 59239 +// flag access in global destructors, so FlagRegisterer has to be
       
 59240 +// careful never to destroy the flag-values it constructs.
       
 59241 +//
       
 59242 +// Note that when we define a flag variable FLAGS_<name>, we also
       
 59243 +// preemptively define a junk variable, FLAGS_no<name>.  This is to
       
 59244 +// cause a link-time error if someone tries to define 2 flags with
       
 59245 +// names like "logging" and "nologging".  We do this because a bool
       
 59246 +// flag FLAG can be set from the command line to true with a "-FLAG"
       
 59247 +// argument, and to false with a "-noFLAG" argument, and so this can
       
 59248 +// potentially avert confusion.
       
 59249 +//
       
 59250 +// We also put flags into their own namespace.  It is purposefully
       
 59251 +// named in an opaque way that people should have trouble typing
       
 59252 +// directly.  The idea is that DEFINE puts the flag in the weird
       
 59253 +// namespace, and DECLARE imports the flag from there into the current
       
 59254 +// namespace.  The net result is to force people to use DECLARE to get
       
 59255 +// access to a flag, rather than saying "extern bool FLAGS_whatever;"
       
 59256 +// or some such instead.  We want this so we can put extra
       
 59257 +// functionality (like sanity-checking) in DECLARE if we want, and
       
 59258 +// make sure it is picked up everywhere.
       
 59259 +//
       
 59260 +// We also put the type of the variable in the namespace, so that
       
 59261 +// people can't DECLARE_int32 something that they DEFINE_bool'd
       
 59262 +// elsewhere.
       
 59263 +
       
 59264 +class FlagRegisterer {
       
 59265 + public:
       
 59266 +  FlagRegisterer(const char* name, const char* type,
       
 59267 +                 const char* help, const char* filename,
       
 59268 +                 void* current_storage, void* defvalue_storage);
       
 59269 +};
       
 59270 +
       
 59271 +extern bool FlagsTypeWarn(const char *name);
       
 59272 +
       
 59273 +// If your application #defines STRIP_FLAG_HELP to a non-zero value
       
 59274 +// before #including this file, we remove the help message from the
       
 59275 +// binary file. This can reduce the size of the resulting binary
       
 59276 +// somewhat, and may also be useful for security reasons.
       
 59277 +
       
 59278 +extern const char kStrippedFlagHelp[];
       
 59279 +
       
 59280 +}
       
 59281 +
       
 59282 +#ifndef SWIG  // In swig, ignore the main flag declarations
       
 59283 +
       
 59284 +#if defined(STRIP_FLAG_HELP) && STRIP_FLAG_HELP > 0
       
 59285 +// Need this construct to avoid the 'defined but not used' warning.
       
 59286 +#define MAYBE_STRIPPED_HELP(txt) (false ? (txt) : kStrippedFlagHelp)
       
 59287 +#else
       
 59288 +#define MAYBE_STRIPPED_HELP(txt) txt
       
 59289 +#endif
       
 59290 +
       
 59291 +// Each command-line flag has two variables associated with it: one
       
 59292 +// with the current value, and one with the default value.  However,
       
 59293 +// we have a third variable, which is where value is assigned; it's a
       
 59294 +// constant.  This guarantees that FLAG_##value is initialized at
       
 59295 +// static initialization time (e.g. before program-start) rather than
       
 59296 +// than global construction time (which is after program-start but
       
 59297 +// before main), at least when 'value' is a compile-time constant.  We
       
 59298 +// use a small trick for the "default value" variable, and call it
       
 59299 +// FLAGS_no<name>.  This serves the second purpose of assuring a
       
 59300 +// compile error if someone tries to define a flag named no<name>
       
 59301 +// which is illegal (--foo and --nofoo both affect the "foo" flag).
       
 59302 +#define DEFINE_VARIABLE(type, shorttype, name, value, help) \
       
 59303 +  namespace fL##shorttype {                                     \
       
 59304 +    static const type FLAGS_nono##name = value;                 \
       
 59305 +    type FLAGS_##name = FLAGS_nono##name;                       \
       
 59306 +    type FLAGS_no##name = FLAGS_nono##name;                     \
       
 59307 +    static ::google::FlagRegisterer o_##name(      \
       
 59308 +      #name, #type, MAYBE_STRIPPED_HELP(help), __FILE__,        \
       
 59309 +      &FLAGS_##name, &FLAGS_no##name);                          \
       
 59310 +  }                                                             \
       
 59311 +  using fL##shorttype::FLAGS_##name
       
 59312 +
       
 59313 +#define DECLARE_VARIABLE(type, shorttype, name) \
       
 59314 +  namespace fL##shorttype {                     \
       
 59315 +    extern type FLAGS_##name;                   \
       
 59316 +  }                                             \
       
 59317 +  using fL##shorttype::FLAGS_##name
       
 59318 +
       
 59319 +// For DEFINE_bool, we want to do the extra check that the passed-in
       
 59320 +// value is actually a bool, and not a string or something that can be
       
 59321 +// coerced to a bool.  These declarations (no definition needed!) will
       
 59322 +// help us do that, and never evaluate From, which is important.
       
 59323 +// We'll use 'sizeof(IsBool(val))' to distinguish. This code requires
       
 59324 +// that the compiler have different sizes for bool & double. Since
       
 59325 +// this is not guaranteed by the standard, we check it with a
       
 59326 +// compile-time assert (msg[-1] will give a compile-time error).
       
 59327 +namespace fLB {
       
 59328 +struct CompileAssert {};
       
 59329 +typedef CompileAssert expected_sizeof_double_neq_sizeof_bool[
       
 59330 +                      (sizeof(double) != sizeof(bool)) ? 1 : -1];
       
 59331 +template<typename From> double IsBoolFlag(const From& from);
       
 59332 +bool IsBoolFlag(bool from);
       
 59333 +}  // namespace fLB
       
 59334 +
       
 59335 +#define DECLARE_bool(name)          DECLARE_VARIABLE(bool,B, name)
       
 59336 +#define DEFINE_bool(name,val,txt)                                         \
       
 59337 +  namespace fLB {                                                         \
       
 59338 +    typedef CompileAssert FLAG_##name##_value_is_not_a_bool[              \
       
 59339 +            (sizeof(::fLB::IsBoolFlag(val)) != sizeof(double)) ? 1 : -1]; \
       
 59340 +  }                                                                       \
       
 59341 +  DEFINE_VARIABLE(bool,B, name, val, txt)
       
 59342 +
       
 59343 +#define DECLARE_int32(name)         DECLARE_VARIABLE(::google::int32,I, name)
       
 59344 +#define DEFINE_int32(name,val,txt)  DEFINE_VARIABLE(::google::int32,I, name, val, txt)
       
 59345 +
       
 59346 +#define DECLARE_int64(name)         DECLARE_VARIABLE(::google::int64,I64, name)
       
 59347 +#define DEFINE_int64(name,val,txt)  DEFINE_VARIABLE(::google::int64,I64, name, val, txt)
       
 59348 +
       
 59349 +#define DECLARE_uint64(name)        DECLARE_VARIABLE(::google::uint64,U64, name)
       
 59350 +#define DEFINE_uint64(name,val,txt) DEFINE_VARIABLE(::google::uint64,U64, name, val, txt)
       
 59351 +
       
 59352 +#define DECLARE_double(name)        DECLARE_VARIABLE(double,D, name)
       
 59353 +#define DEFINE_double(name,val,txt) DEFINE_VARIABLE(double,D, name, val, txt)
       
 59354 +
       
 59355 +// Strings are trickier, because they're not a POD, so we can't
       
 59356 +// construct them at static-initialization time (instead they get
       
 59357 +// constructed at global-constructor time, which is much later).  To
       
 59358 +// try to avoid crashes in that case, we use a char buffer to store
       
 59359 +// the string, which we can static-initialize, and then placement-new
       
 59360 +// into it later.  It's not perfect, but the best we can do.
       
 59361 +#define DECLARE_string(name)  namespace fLS { extern std::string& FLAGS_##name; } \
       
 59362 +                              using fLS::FLAGS_##name
       
 59363 +
       
 59364 +// We need to define a var named FLAGS_no##name so people don't define
       
 59365 +// --string and --nostring.  And we need a temporary place to put val
       
 59366 +// so we don't have to evaluate it twice.  Two great needs that go
       
 59367 +// great together!
       
 59368 +// The weird 'using' + 'extern' inside the fLS namespace is to work around
       
 59369 +// an unknown compiler bug/issue with the gcc 4.2.1 on SUSE 10.  See
       
 59370 +//    http://code.google.com/p/google-gflags/issues/detail?id=20
       
 59371 +#define DEFINE_string(name, val, txt)                                     \
       
 59372 +  namespace fLS {                                                         \
       
 59373 +    static union { void* align; char s[sizeof(std::string)]; } s_##name[2]; \
       
 59374 +    const std::string* const FLAGS_no##name = new (s_##name[0].s) std::string(val); \
       
 59375 +    static ::google::FlagRegisterer o_##name(                \
       
 59376 +      #name, "string", MAYBE_STRIPPED_HELP(txt), __FILE__,                \
       
 59377 +      s_##name[0].s, new (s_##name[1].s) std::string(*FLAGS_no##name));   \
       
 59378 +    extern std::string& FLAGS_##name;                                     \
       
 59379 +    using fLS::FLAGS_##name;                                              \
       
 59380 +    std::string& FLAGS_##name = *(reinterpret_cast<std::string*>(s_##name[0].s));   \
       
 59381 +  }                                                                       \
       
 59382 +  using fLS::FLAGS_##name
       
 59383 +
       
 59384 +#endif  // SWIG
       
 59385 +
       
 59386 +#endif  // GOOGLE_GFLAGS_H_
       
 59387 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/gflags/gflags_completions.h b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/gflags/gflags_completions.h
       
 59388 new file mode 100644
       
 59389 --- /dev/null
       
 59390 +++ b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/gflags/gflags_completions.h
       
 59391 @@ -0,0 +1,121 @@
       
 59392 +// Copyright (c) 2008, Google Inc.
       
 59393 +// All rights reserved.
       
 59394 +//
       
 59395 +// Redistribution and use in source and binary forms, with or without
       
 59396 +// modification, are permitted provided that the following conditions are
       
 59397 +// met:
       
 59398 +//
       
 59399 +//     * Redistributions of source code must retain the above copyright
       
 59400 +// notice, this list of conditions and the following disclaimer.
       
 59401 +//     * Redistributions in binary form must reproduce the above
       
 59402 +// copyright notice, this list of conditions and the following disclaimer
       
 59403 +// in the documentation and/or other materials provided with the
       
 59404 +// distribution.
       
 59405 +//     * Neither the name of Google Inc. nor the names of its
       
 59406 +// contributors may be used to endorse or promote products derived from
       
 59407 +// this software without specific prior written permission.
       
 59408 +//
       
 59409 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 59410 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 59411 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 59412 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 59413 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 59414 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 59415 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 59416 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 59417 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 59418 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 59419 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 59420 +//
       
 59421 +// ---
       
 59422 +// Author: Dave Nicponski
       
 59423 +//
       
 59424 +// Implement helpful bash-style command line flag completions
       
 59425 +//
       
 59426 +// ** Functional API:
       
 59427 +// HandleCommandLineCompletions() should be called early during
       
 59428 +// program startup, but after command line flag code has been
       
 59429 +// initialized, such as the beginning of HandleCommandLineHelpFlags().
       
 59430 +// It checks the value of the flag --tab_completion_word.  If this
       
 59431 +// flag is empty, nothing happens here.  If it contains a string,
       
 59432 +// however, then HandleCommandLineCompletions() will hijack the
       
 59433 +// process, attempting to identify the intention behind this
       
 59434 +// completion.  Regardless of the outcome of this deduction, the
       
 59435 +// process will be terminated, similar to --helpshort flag
       
 59436 +// handling.
       
 59437 +//
       
 59438 +// ** Overview of Bash completions:
       
 59439 +// Bash can be told to programatically determine completions for the
       
 59440 +// current 'cursor word'.  It does this by (in this case) invoking a
       
 59441 +// command with some additional arguments identifying the command
       
 59442 +// being executed, the word being completed, and the previous word
       
 59443 +// (if any).  Bash then expects a sequence of output lines to be
       
 59444 +// printed to stdout.  If these lines all contain a common prefix
       
 59445 +// longer than the cursor word, bash will replace the cursor word
       
 59446 +// with that common prefix, and display nothing.  If there isn't such
       
 59447 +// a common prefix, bash will display the lines in pages using 'more'.
       
 59448 +//
       
 59449 +// ** Strategy taken for command line completions:
       
 59450 +// If we can deduce either the exact flag intended, or a common flag
       
 59451 +// prefix, we'll output exactly that.  Otherwise, if information
       
 59452 +// must be displayed to the user, we'll take the opportunity to add
       
 59453 +// some helpful information beyond just the flag name (specifically,
       
 59454 +// we'll include the default flag value and as much of the flag's
       
 59455 +// description as can fit on a single terminal line width, as specified
       
 59456 +// by the flag --tab_completion_columns).  Furthermore, we'll try to
       
 59457 +// make bash order the output such that the most useful or relevent
       
 59458 +// flags are the most likely to be shown at the top.
       
 59459 +//
       
 59460 +// ** Additional features:
       
 59461 +// To assist in finding that one really useful flag, substring matching
       
 59462 +// was implemented.  Before pressing a <TAB> to get completion for the
       
 59463 +// current word, you can append one or more '?' to the flag to do
       
 59464 +// substring matching.  Here's the semantics:
       
 59465 +//   --foo<TAB>     Show me all flags with names prefixed by 'foo'
       
 59466 +//   --foo?<TAB>    Show me all flags with 'foo' somewhere in the name
       
 59467 +//   --foo??<TAB>   Same as prior case, but also search in module
       
 59468 +//                  definition path for 'foo'
       
 59469 +//   --foo???<TAB>  Same as prior case, but also search in flag
       
 59470 +//                  descriptions for 'foo'
       
 59471 +// Finally, we'll trim the output to a relatively small number of
       
 59472 +// flags to keep bash quiet about the verbosity of output.  If one
       
 59473 +// really wanted to see all possible matches, appending a '+' to the
       
 59474 +// search word will force the exhaustive list of matches to be printed.
       
 59475 +//
       
 59476 +// ** How to have bash accept completions from a binary:
       
 59477 +// Bash requires that it be informed about each command that programmatic
       
 59478 +// completion should be enabled for.  Example addition to a .bashrc
       
 59479 +// file would be (your path to gflags_completions.sh file may differ):
       
 59480 +
       
 59481 +/*
       
 59482 +$ complete -o bashdefault -o default -o nospace -C                        \
       
 59483 + '/usr/local/bin/gflags_completions.sh --tab_completion_columns $COLUMNS' \
       
 59484 +  time  env  binary_name  another_binary  [...]
       
 59485 +*/
       
 59486 +
       
 59487 +// This would allow the following to work:
       
 59488 +//   $ /path/to/binary_name --vmodule<TAB>
       
 59489 +// Or:
       
 59490 +//   $ ./bin/path/another_binary --gfs_u<TAB>
       
 59491 +// (etc)
       
 59492 +//
       
 59493 +// Sadly, it appears that bash gives no easy way to force this behavior for
       
 59494 +// all commands.  That's where the "time" in the above example comes in.
       
 59495 +// If you haven't specifically added a command to the list of completion
       
 59496 +// supported commands, you can still get completions by prefixing the
       
 59497 +// entire command with "env".
       
 59498 +//   $ env /some/brand/new/binary --vmod<TAB>
       
 59499 +// Assuming that "binary" is a newly compiled binary, this should still
       
 59500 +// produce the expected completion output.
       
 59501 +
       
 59502 +
       
 59503 +#ifndef GOOGLE_GFLAGS_COMPLETIONS_H_
       
 59504 +#define GOOGLE_GFLAGS_COMPLETIONS_H_
       
 59505 +
       
 59506 +namespace google {
       
 59507 +
       
 59508 +void HandleCommandLineCompletions(void);
       
 59509 +
       
 59510 +}
       
 59511 +
       
 59512 +#endif  // GOOGLE_GFLAGS_COMPLETIONS_H_
       
 59513 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/log_severity.h b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/log_severity.h
       
 59514 new file mode 100644
       
 59515 --- /dev/null
       
 59516 +++ b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/log_severity.h
       
 59517 @@ -0,0 +1,84 @@
       
 59518 +// Copyright (c) 2007, Google Inc.
       
 59519 +// All rights reserved.
       
 59520 +//
       
 59521 +// Redistribution and use in source and binary forms, with or without
       
 59522 +// modification, are permitted provided that the following conditions are
       
 59523 +// met:
       
 59524 +//
       
 59525 +//     * Redistributions of source code must retain the above copyright
       
 59526 +// notice, this list of conditions and the following disclaimer.
       
 59527 +//     * Redistributions in binary form must reproduce the above
       
 59528 +// copyright notice, this list of conditions and the following disclaimer
       
 59529 +// in the documentation and/or other materials provided with the
       
 59530 +// distribution.
       
 59531 +//     * Neither the name of Google Inc. nor the names of its
       
 59532 +// contributors may be used to endorse or promote products derived from
       
 59533 +// this software without specific prior written permission.
       
 59534 +//
       
 59535 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 59536 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 59537 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 59538 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 59539 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 59540 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 59541 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 59542 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 59543 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 59544 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 59545 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 59546 +
       
 59547 +#ifndef BASE_LOG_SEVERITY_H__
       
 59548 +#define BASE_LOG_SEVERITY_H__
       
 59549 +
       
 59550 +// Annoying stuff for windows -- makes sure clients can import these functions
       
 59551 +#ifndef GOOGLE_GLOG_DLL_DECL
       
 59552 +# if defined(_WIN32) && !defined(__CYGWIN__)
       
 59553 +#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)
       
 59554 +# else
       
 59555 +#   define GOOGLE_GLOG_DLL_DECL
       
 59556 +# endif
       
 59557 +#endif
       
 59558 +
       
 59559 +// Variables of type LogSeverity are widely taken to lie in the range
       
 59560 +// [0, NUM_SEVERITIES-1].  Be careful to preserve this assumption if
       
 59561 +// you ever need to change their values or add a new severity.
       
 59562 +typedef int LogSeverity;
       
 59563 +
       
 59564 +const int INFO = 0, WARNING = 1, ERROR = 2, FATAL = 3, NUM_SEVERITIES = 4;
       
 59565 +
       
 59566 +// DFATAL is FATAL in debug mode, ERROR in normal mode
       
 59567 +#ifdef NDEBUG
       
 59568 +#define DFATAL_LEVEL ERROR
       
 59569 +#else
       
 59570 +#define DFATAL_LEVEL FATAL
       
 59571 +#endif
       
 59572 +
       
 59573 +extern GOOGLE_GLOG_DLL_DECL const char* const LogSeverityNames[NUM_SEVERITIES];
       
 59574 +
       
 59575 +// NDEBUG usage helpers related to (RAW_)DCHECK:
       
 59576 +//
       
 59577 +// DEBUG_MODE is for small !NDEBUG uses like
       
 59578 +//   if (DEBUG_MODE) foo.CheckThatFoo();
       
 59579 +// instead of substantially more verbose
       
 59580 +//   #ifndef NDEBUG
       
 59581 +//     foo.CheckThatFoo();
       
 59582 +//   #endif
       
 59583 +//
       
 59584 +// IF_DEBUG_MODE is for small !NDEBUG uses like
       
 59585 +//   IF_DEBUG_MODE( string error; )
       
 59586 +//   DCHECK(Foo(&error)) << error;
       
 59587 +// instead of substantially more verbose
       
 59588 +//   #ifndef NDEBUG
       
 59589 +//     string error;
       
 59590 +//     DCHECK(Foo(&error)) << error;
       
 59591 +//   #endif
       
 59592 +//
       
 59593 +#ifdef NDEBUG
       
 59594 +enum { DEBUG_MODE = 0 };
       
 59595 +#define IF_DEBUG_MODE(x)
       
 59596 +#else
       
 59597 +enum { DEBUG_MODE = 1 };
       
 59598 +#define IF_DEBUG_MODE(x) x
       
 59599 +#endif
       
 59600 +
       
 59601 +#endif  // BASE_LOG_SEVERITY_H__
       
 59602 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/logging.h b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/logging.h
       
 59603 new file mode 100644
       
 59604 --- /dev/null
       
 59605 +++ b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/logging.h
       
 59606 @@ -0,0 +1,1499 @@
       
 59607 +// Copyright (c) 1999, Google Inc.
       
 59608 +// All rights reserved.
       
 59609 +//
       
 59610 +// Redistribution and use in source and binary forms, with or without
       
 59611 +// modification, are permitted provided that the following conditions are
       
 59612 +// met:
       
 59613 +//
       
 59614 +//     * Redistributions of source code must retain the above copyright
       
 59615 +// notice, this list of conditions and the following disclaimer.
       
 59616 +//     * Redistributions in binary form must reproduce the above
       
 59617 +// copyright notice, this list of conditions and the following disclaimer
       
 59618 +// in the documentation and/or other materials provided with the
       
 59619 +// distribution.
       
 59620 +//     * Neither the name of Google Inc. nor the names of its
       
 59621 +// contributors may be used to endorse or promote products derived from
       
 59622 +// this software without specific prior written permission.
       
 59623 +//
       
 59624 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 59625 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 59626 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 59627 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 59628 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 59629 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 59630 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 59631 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 59632 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 59633 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 59634 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 59635 +//
       
 59636 +// Author: Ray Sidney
       
 59637 +//
       
 59638 +// This file contains #include information about logging-related stuff.
       
 59639 +// Pretty much everybody needs to #include this file so that they can
       
 59640 +// log various happenings.
       
 59641 +//
       
 59642 +#ifndef _LOGGING_H_
       
 59643 +#define _LOGGING_H_
       
 59644 +
       
 59645 +#include <errno.h>
       
 59646 +#include <string.h>
       
 59647 +#include <time.h>
       
 59648 +#include <string>
       
 59649 +#if 1
       
 59650 +# include <unistd.h>
       
 59651 +#endif
       
 59652 +#ifdef __DEPRECATED
       
 59653 +// Make GCC quiet.
       
 59654 +# undef __DEPRECATED
       
 59655 +# include <strstream>
       
 59656 +# define __DEPRECATED
       
 59657 +#else
       
 59658 +# include <strstream>
       
 59659 +#endif
       
 59660 +#include <vector>
       
 59661 +
       
 59662 +// Annoying stuff for windows -- makes sure clients can import these functions
       
 59663 +#ifndef GOOGLE_GLOG_DLL_DECL
       
 59664 +# if defined(_WIN32) && !defined(__CYGWIN__)
       
 59665 +#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)
       
 59666 +# else
       
 59667 +#   define GOOGLE_GLOG_DLL_DECL
       
 59668 +# endif
       
 59669 +#endif
       
 59670 +
       
 59671 +// We care a lot about number of bits things take up.  Unfortunately,
       
 59672 +// systems define their bit-specific ints in a lot of different ways.
       
 59673 +// We use our own way, and have a typedef to get there.
       
 59674 +// Note: these commands below may look like "#if 1" or "#if 0", but
       
 59675 +// that's because they were constructed that way at ./configure time.
       
 59676 +// Look at logging.h.in to see how they're calculated (based on your config).
       
 59677 +#if 1
       
 59678 +#include <stdint.h>             // the normal place uint16_t is defined
       
 59679 +#endif
       
 59680 +#if 1
       
 59681 +#include <sys/types.h>          // the normal place u_int16_t is defined
       
 59682 +#endif
       
 59683 +#if 1
       
 59684 +#include <inttypes.h>           // a third place for uint16_t or u_int16_t
       
 59685 +#endif
       
 59686 +
       
 59687 +#if 0
       
 59688 +#include <gflags/gflags.h>
       
 59689 +#endif
       
 59690 +
       
 59691 +namespace google {
       
 59692 +
       
 59693 +#if 1      // the C99 format
       
 59694 +typedef int32_t int32;
       
 59695 +typedef uint32_t uint32;
       
 59696 +typedef int64_t int64;
       
 59697 +typedef uint64_t uint64;
       
 59698 +#elif 1   // the BSD format
       
 59699 +typedef int32_t int32;
       
 59700 +typedef u_int32_t uint32;
       
 59701 +typedef int64_t int64;
       
 59702 +typedef u_int64_t uint64;
       
 59703 +#elif 0    // the windows (vc7) format
       
 59704 +typedef __int32 int32;
       
 59705 +typedef unsigned __int32 uint32;
       
 59706 +typedef __int64 int64;
       
 59707 +typedef unsigned __int64 uint64;
       
 59708 +#else
       
 59709 +#error Do not know how to define a 32-bit integer quantity on your system
       
 59710 +#endif
       
 59711 +
       
 59712 +}
       
 59713 +
       
 59714 +// The global value of GOOGLE_STRIP_LOG. All the messages logged to
       
 59715 +// LOG(XXX) with severity less than GOOGLE_STRIP_LOG will not be displayed.
       
 59716 +// If it can be determined at compile time that the message will not be
       
 59717 +// printed, the statement will be compiled out.
       
 59718 +//
       
 59719 +// Example: to strip out all INFO and WARNING messages, use the value
       
 59720 +// of 2 below. To make an exception for WARNING messages from a single
       
 59721 +// file, add "#define GOOGLE_STRIP_LOG 1" to that file _before_ including
       
 59722 +// base/logging.h
       
 59723 +#ifndef GOOGLE_STRIP_LOG
       
 59724 +#define GOOGLE_STRIP_LOG 0
       
 59725 +#endif
       
 59726 +
       
 59727 +// GCC can be told that a certain branch is not likely to be taken (for
       
 59728 +// instance, a CHECK failure), and use that information in static analysis.
       
 59729 +// Giving it this information can help it optimize for the common case in
       
 59730 +// the absence of better information (ie. -fprofile-arcs).
       
 59731 +//
       
 59732 +#ifndef GOOGLE_PREDICT_BRANCH_NOT_TAKEN
       
 59733 +#if 1
       
 59734 +#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) (__builtin_expect(x, 0))
       
 59735 +#else
       
 59736 +#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) x
       
 59737 +#endif
       
 59738 +#endif
       
 59739 +
       
 59740 +// Make a bunch of macros for logging.  The way to log things is to stream
       
 59741 +// things to LOG(<a particular severity level>).  E.g.,
       
 59742 +//
       
 59743 +//   LOG(INFO) << "Found " << num_cookies << " cookies";
       
 59744 +//
       
 59745 +// You can capture log messages in a string, rather than reporting them
       
 59746 +// immediately:
       
 59747 +//
       
 59748 +//   vector<string> errors;
       
 59749 +//   LOG_STRING(ERROR, &errors) << "Couldn't parse cookie #" << cookie_num;
       
 59750 +//
       
 59751 +// This pushes back the new error onto 'errors'; if given a NULL pointer,
       
 59752 +// it reports the error via LOG(ERROR).
       
 59753 +//
       
 59754 +// You can also do conditional logging:
       
 59755 +//
       
 59756 +//   LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
       
 59757 +//
       
 59758 +// You can also do occasional logging (log every n'th occurrence of an
       
 59759 +// event):
       
 59760 +//
       
 59761 +//   LOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";
       
 59762 +//
       
 59763 +// The above will cause log messages to be output on the 1st, 11th, 21st, ...
       
 59764 +// times it is executed.  Note that the special COUNTER value is used to
       
 59765 +// identify which repetition is happening.
       
 59766 +//
       
 59767 +// You can also do occasional conditional logging (log every n'th
       
 59768 +// occurrence of an event, when condition is satisfied):
       
 59769 +//
       
 59770 +//   LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << COUNTER
       
 59771 +//                                           << "th big cookie";
       
 59772 +//
       
 59773 +// You can log messages the first N times your code executes a line. E.g.
       
 59774 +//
       
 59775 +//   LOG_FIRST_N(INFO, 20) << "Got the " << COUNTER << "th cookie";
       
 59776 +//
       
 59777 +// Outputs log messages for the first 20 times it is executed.
       
 59778 +//
       
 59779 +// Analogous SYSLOG, SYSLOG_IF, and SYSLOG_EVERY_N macros are available.
       
 59780 +// These log to syslog as well as to the normal logs.  If you use these at
       
 59781 +// all, you need to be aware that syslog can drastically reduce performance,
       
 59782 +// especially if it is configured for remote logging!  Don't use these
       
 59783 +// unless you fully understand this and have a concrete need to use them.
       
 59784 +// Even then, try to minimize your use of them.
       
 59785 +//
       
 59786 +// There are also "debug mode" logging macros like the ones above:
       
 59787 +//
       
 59788 +//   DLOG(INFO) << "Found cookies";
       
 59789 +//
       
 59790 +//   DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
       
 59791 +//
       
 59792 +//   DLOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie";
       
 59793 +//
       
 59794 +// All "debug mode" logging is compiled away to nothing for non-debug mode
       
 59795 +// compiles.
       
 59796 +//
       
 59797 +// We also have
       
 59798 +//
       
 59799 +//   LOG_ASSERT(assertion);
       
 59800 +//   DLOG_ASSERT(assertion);
       
 59801 +//
       
 59802 +// which is syntactic sugar for {,D}LOG_IF(FATAL, assert fails) << assertion;
       
 59803 +//
       
 59804 +// There are "verbose level" logging macros.  They look like
       
 59805 +//
       
 59806 +//   VLOG(1) << "I'm printed when you run the program with --v=1 or more";
       
 59807 +//   VLOG(2) << "I'm printed when you run the program with --v=2 or more";
       
 59808 +//
       
 59809 +// These always log at the INFO log level (when they log at all).
       
 59810 +// The verbose logging can also be turned on module-by-module.  For instance,
       
 59811 +//    --vmodule=mapreduce=2,file=1,gfs*=3 --v=0
       
 59812 +// will cause:
       
 59813 +//   a. VLOG(2) and lower messages to be printed from mapreduce.{h,cc}
       
 59814 +//   b. VLOG(1) and lower messages to be printed from file.{h,cc}
       
 59815 +//   c. VLOG(3) and lower messages to be printed from files prefixed with "gfs"
       
 59816 +//   d. VLOG(0) and lower messages to be printed from elsewhere
       
 59817 +//
       
 59818 +// The wildcarding functionality shown by (c) supports both '*' (match
       
 59819 +// 0 or more characters) and '?' (match any single character) wildcards.
       
 59820 +//
       
 59821 +// There's also VLOG_IS_ON(n) "verbose level" condition macro. To be used as
       
 59822 +//
       
 59823 +//   if (VLOG_IS_ON(2)) {
       
 59824 +//     // do some logging preparation and logging
       
 59825 +//     // that can't be accomplished with just VLOG(2) << ...;
       
 59826 +//   }
       
 59827 +//
       
 59828 +// There are also VLOG_IF, VLOG_EVERY_N and VLOG_IF_EVERY_N "verbose level"
       
 59829 +// condition macros for sample cases, when some extra computation and
       
 59830 +// preparation for logs is not needed.
       
 59831 +//   VLOG_IF(1, (size > 1024))
       
 59832 +//      << "I'm printed when size is more than 1024 and when you run the "
       
 59833 +//         "program with --v=1 or more";
       
 59834 +//   VLOG_EVERY_N(1, 10)
       
 59835 +//      << "I'm printed every 10th occurrence, and when you run the program "
       
 59836 +//         "with --v=1 or more. Present occurence is " << COUNTER;
       
 59837 +//   VLOG_IF_EVERY_N(1, (size > 1024), 10)
       
 59838 +//      << "I'm printed on every 10th occurence of case when size is more "
       
 59839 +//         " than 1024, when you run the program with --v=1 or more. ";
       
 59840 +//         "Present occurence is " << COUNTER;
       
 59841 +//
       
 59842 +// The supported severity levels for macros that allow you to specify one
       
 59843 +// are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL.
       
 59844 +// Note that messages of a given severity are logged not only in the
       
 59845 +// logfile for that severity, but also in all logfiles of lower severity.
       
 59846 +// E.g., a message of severity FATAL will be logged to the logfiles of
       
 59847 +// severity FATAL, ERROR, WARNING, and INFO.
       
 59848 +//
       
 59849 +// There is also the special severity of DFATAL, which logs FATAL in
       
 59850 +// debug mode, ERROR in normal mode.
       
 59851 +//
       
 59852 +// Very important: logging a message at the FATAL severity level causes
       
 59853 +// the program to terminate (after the message is logged).
       
 59854 +//
       
 59855 +// Unless otherwise specified, logs will be written to the filename
       
 59856 +// "<program name>.<hostname>.<user name>.log.<severity level>.", followed
       
 59857 +// by the date, time, and pid (you can't prevent the date, time, and pid
       
 59858 +// from being in the filename).
       
 59859 +//
       
 59860 +// The logging code takes two flags:
       
 59861 +//     --v=#           set the verbose level
       
 59862 +//     --logtostderr   log all the messages to stderr instead of to logfiles
       
 59863 +
       
 59864 +// LOG LINE PREFIX FORMAT
       
 59865 +//
       
 59866 +// Log lines have this form:
       
 59867 +//
       
 59868 +//     Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg...
       
 59869 +//
       
 59870 +// where the fields are defined as follows:
       
 59871 +//
       
 59872 +//   L                A single character, representing the log level
       
 59873 +//                    (eg 'I' for INFO)
       
 59874 +//   mm               The month (zero padded; ie May is '05')
       
 59875 +//   dd               The day (zero padded)
       
 59876 +//   hh:mm:ss.uuuuuu  Time in hours, minutes and fractional seconds
       
 59877 +//   threadid         The space-padded thread ID as returned by GetTID()
       
 59878 +//                    (this matches the PID on Linux)
       
 59879 +//   file             The file name
       
 59880 +//   line             The line number
       
 59881 +//   msg              The user-supplied message
       
 59882 +//
       
 59883 +// Example:
       
 59884 +//
       
 59885 +//   I1103 11:57:31.739339 24395 google.cc:2341] Command line: ./some_prog
       
 59886 +//   I1103 11:57:31.739403 24395 google.cc:2342] Process id 24395
       
 59887 +//
       
 59888 +// NOTE: although the microseconds are useful for comparing events on
       
 59889 +// a single machine, clocks on different machines may not be well
       
 59890 +// synchronized.  Hence, use caution when comparing the low bits of
       
 59891 +// timestamps from different machines.
       
 59892 +
       
 59893 +#ifndef DECLARE_VARIABLE
       
 59894 +#define MUST_UNDEF_GFLAGS_DECLARE_MACROS
       
 59895 +#define DECLARE_VARIABLE(type, name, tn)                                      \
       
 59896 +  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead {  \
       
 59897 +  extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name;                              \
       
 59898 +  }                                                                           \
       
 59899 +  using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name
       
 59900 +
       
 59901 +// bool specialization
       
 59902 +#define DECLARE_bool(name) \
       
 59903 +  DECLARE_VARIABLE(bool, name, bool)
       
 59904 +
       
 59905 +// int32 specialization
       
 59906 +#define DECLARE_int32(name) \
       
 59907 +  DECLARE_VARIABLE(google::int32, name, int32)
       
 59908 +
       
 59909 +// Special case for string, because we have to specify the namespace
       
 59910 +// std::string, which doesn't play nicely with our FLAG__namespace hackery.
       
 59911 +#define DECLARE_string(name)                                          \
       
 59912 +  namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead {  \
       
 59913 +  extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name;                       \
       
 59914 +  }                                                                           \
       
 59915 +  using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name
       
 59916 +#endif
       
 59917 +
       
 59918 +// Set whether log messages go to stderr instead of logfiles
       
 59919 +DECLARE_bool(logtostderr);
       
 59920 +
       
 59921 +// Set whether log messages go to stderr in addition to logfiles.
       
 59922 +DECLARE_bool(alsologtostderr);
       
 59923 +
       
 59924 +// Log messages at a level >= this flag are automatically sent to
       
 59925 +// stderr in addition to log files.
       
 59926 +DECLARE_int32(stderrthreshold);
       
 59927 +
       
 59928 +// Set whether the log prefix should be prepended to each line of output.
       
 59929 +DECLARE_bool(log_prefix);
       
 59930 +
       
 59931 +// Log messages at a level <= this flag are buffered.
       
 59932 +// Log messages at a higher level are flushed immediately.
       
 59933 +DECLARE_int32(logbuflevel);
       
 59934 +
       
 59935 +// Sets the maximum number of seconds which logs may be buffered for.
       
 59936 +DECLARE_int32(logbufsecs);
       
 59937 +
       
 59938 +// Log suppression level: messages logged at a lower level than this
       
 59939 +// are suppressed.
       
 59940 +DECLARE_int32(minloglevel);
       
 59941 +
       
 59942 +// If specified, logfiles are written into this directory instead of the
       
 59943 +// default logging directory.
       
 59944 +DECLARE_string(log_dir);
       
 59945 +
       
 59946 +// Sets the path of the directory into which to put additional links
       
 59947 +// to the log files.
       
 59948 +DECLARE_string(log_link);
       
 59949 +
       
 59950 +DECLARE_int32(v);  // in vlog_is_on.cc
       
 59951 +
       
 59952 +// Sets the maximum log file size (in MB).
       
 59953 +DECLARE_int32(max_log_size);
       
 59954 +
       
 59955 +// Sets whether to avoid logging to the disk if the disk is full.
       
 59956 +DECLARE_bool(stop_logging_if_full_disk);
       
 59957 +
       
 59958 +#ifdef MUST_UNDEF_GFLAGS_DECLARE_MACROS
       
 59959 +#undef MUST_UNDEF_GFLAGS_DECLARE_MACROS
       
 59960 +#undef DECLARE_VARIABLE
       
 59961 +#undef DECLARE_bool
       
 59962 +#undef DECLARE_int32
       
 59963 +#undef DECLARE_string
       
 59964 +#endif
       
 59965 +
       
 59966 +// Log messages below the GOOGLE_STRIP_LOG level will be compiled away for
       
 59967 +// security reasons. See LOG(severtiy) below.
       
 59968 +
       
 59969 +// A few definitions of macros that don't generate much code.  Since
       
 59970 +// LOG(INFO) and its ilk are used all over our code, it's
       
 59971 +// better to have compact code for these operations.
       
 59972 +
       
 59973 +#if GOOGLE_STRIP_LOG == 0
       
 59974 +#define COMPACT_GOOGLE_LOG_INFO google::LogMessage( \
       
 59975 +      __FILE__, __LINE__)
       
 59976 +#define LOG_TO_STRING_INFO(message) google::LogMessage( \
       
 59977 +      __FILE__, __LINE__, google::INFO, message)
       
 59978 +#else
       
 59979 +#define COMPACT_GOOGLE_LOG_INFO google::NullStream()
       
 59980 +#define LOG_TO_STRING_INFO(message) google::NullStream()
       
 59981 +#endif
       
 59982 +
       
 59983 +#if GOOGLE_STRIP_LOG <= 1
       
 59984 +#define COMPACT_GOOGLE_LOG_WARNING google::LogMessage( \
       
 59985 +      __FILE__, __LINE__, google::WARNING)
       
 59986 +#define LOG_TO_STRING_WARNING(message) google::LogMessage( \
       
 59987 +      __FILE__, __LINE__, google::WARNING, message)
       
 59988 +#else
       
 59989 +#define COMPACT_GOOGLE_LOG_WARNING google::NullStream()
       
 59990 +#define LOG_TO_STRING_WARNING(message) google::NullStream()
       
 59991 +#endif
       
 59992 +
       
 59993 +#if GOOGLE_STRIP_LOG <= 2
       
 59994 +#define COMPACT_GOOGLE_LOG_ERROR google::LogMessage( \
       
 59995 +      __FILE__, __LINE__, google::ERROR)
       
 59996 +#define LOG_TO_STRING_ERROR(message) google::LogMessage( \
       
 59997 +      __FILE__, __LINE__, google::ERROR, message)
       
 59998 +#else
       
 59999 +#define COMPACT_GOOGLE_LOG_ERROR google::NullStream()
       
 60000 +#define LOG_TO_STRING_ERROR(message) google::NullStream()
       
 60001 +#endif
       
 60002 +
       
 60003 +#if GOOGLE_STRIP_LOG <= 3
       
 60004 +#define COMPACT_GOOGLE_LOG_FATAL google::LogMessageFatal( \
       
 60005 +      __FILE__, __LINE__)
       
 60006 +#define LOG_TO_STRING_FATAL(message) google::LogMessage( \
       
 60007 +      __FILE__, __LINE__, google::FATAL, message)
       
 60008 +#else
       
 60009 +#define COMPACT_GOOGLE_LOG_FATAL google::NullStreamFatal()
       
 60010 +#define LOG_TO_STRING_FATAL(message) google::NullStreamFatal()
       
 60011 +#endif
       
 60012 +
       
 60013 +// For DFATAL, we want to use LogMessage (as opposed to
       
 60014 +// LogMessageFatal), to be consistent with the original behavior.
       
 60015 +#ifdef NDEBUG
       
 60016 +#define COMPACT_GOOGLE_LOG_DFATAL COMPACT_GOOGLE_LOG_ERROR
       
 60017 +#elif GOOGLE_STRIP_LOG <= 3
       
 60018 +#define COMPACT_GOOGLE_LOG_DFATAL LogMessage( \
       
 60019 +      __FILE__, __LINE__, google::FATAL)
       
 60020 +#else
       
 60021 +#define COMPACT_GOOGLE_LOG_DFATAL google::NullStreamFatal()
       
 60022 +#endif
       
 60023 +
       
 60024 +#define GOOGLE_LOG_INFO(counter) google::LogMessage(__FILE__, __LINE__, google::INFO, counter, &google::LogMessage::SendToLog)
       
 60025 +#define SYSLOG_INFO(counter) \
       
 60026 +  google::LogMessage(__FILE__, __LINE__, google::INFO, counter, \
       
 60027 +  &google::LogMessage::SendToSyslogAndLog)
       
 60028 +#define GOOGLE_LOG_WARNING(counter)  \
       
 60029 +  google::LogMessage(__FILE__, __LINE__, google::WARNING, counter, \
       
 60030 +  &google::LogMessage::SendToLog)
       
 60031 +#define SYSLOG_WARNING(counter)  \
       
 60032 +  google::LogMessage(__FILE__, __LINE__, google::WARNING, counter, \
       
 60033 +  &google::LogMessage::SendToSyslogAndLog)
       
 60034 +#define GOOGLE_LOG_ERROR(counter)  \
       
 60035 +  google::LogMessage(__FILE__, __LINE__, google::ERROR, counter, \
       
 60036 +  &google::LogMessage::SendToLog)
       
 60037 +#define SYSLOG_ERROR(counter)  \
       
 60038 +  google::LogMessage(__FILE__, __LINE__, google::ERROR, counter, \
       
 60039 +  &google::LogMessage::SendToSyslogAndLog)
       
 60040 +#define GOOGLE_LOG_FATAL(counter) \
       
 60041 +  google::LogMessage(__FILE__, __LINE__, google::FATAL, counter, \
       
 60042 +  &google::LogMessage::SendToLog)
       
 60043 +#define SYSLOG_FATAL(counter) \
       
 60044 +  google::LogMessage(__FILE__, __LINE__, google::FATAL, counter, \
       
 60045 +  &google::LogMessage::SendToSyslogAndLog)
       
 60046 +#define GOOGLE_LOG_DFATAL(counter) \
       
 60047 +  google::LogMessage(__FILE__, __LINE__, google::DFATAL_LEVEL, counter, \
       
 60048 +  &google::LogMessage::SendToLog)
       
 60049 +#define SYSLOG_DFATAL(counter) \
       
 60050 +  google::LogMessage(__FILE__, __LINE__, google::DFATAL_LEVEL, counter, \
       
 60051 +  &google::LogMessage::SendToSyslogAndLog)
       
 60052 +
       
 60053 +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) || defined(__CYGWIN32__)
       
 60054 +// A very useful logging macro to log windows errors:
       
 60055 +#define LOG_SYSRESULT(result) \
       
 60056 +  if (FAILED(result)) { \
       
 60057 +    LPTSTR message = NULL; \
       
 60058 +    LPTSTR msg = reinterpret_cast<LPTSTR>(&message); \
       
 60059 +    DWORD message_length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | \
       
 60060 +                         FORMAT_MESSAGE_FROM_SYSTEM, \
       
 60061 +                         0, result, 0, msg, 100, NULL); \
       
 60062 +    if (message_length > 0) { \
       
 60063 +      google::LogMessage(__FILE__, __LINE__, ERROR, 0, \
       
 60064 +          &google::LogMessage::SendToLog).stream() << message; \
       
 60065 +      LocalFree(message); \
       
 60066 +    } \
       
 60067 +  }
       
 60068 +#endif
       
 60069 +
       
 60070 +// We use the preprocessor's merging operator, "##", so that, e.g.,
       
 60071 +// LOG(INFO) becomes the token GOOGLE_LOG_INFO.  There's some funny
       
 60072 +// subtle difference between ostream member streaming functions (e.g.,
       
 60073 +// ostream::operator<<(int) and ostream non-member streaming functions
       
 60074 +// (e.g., ::operator<<(ostream&, string&): it turns out that it's
       
 60075 +// impossible to stream something like a string directly to an unnamed
       
 60076 +// ostream. We employ a neat hack by calling the stream() member
       
 60077 +// function of LogMessage which seems to avoid the problem.
       
 60078 +#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream()
       
 60079 +#define SYSLOG(severity) SYSLOG_ ## severity(0).stream()
       
 60080 +
       
 60081 +namespace google {
       
 60082 +
       
 60083 +// They need the definitions of integer types.
       
 60084 +#include "glog/log_severity.h"
       
 60085 +#include "glog/vlog_is_on.h"
       
 60086 +
       
 60087 +// Initialize google's logging library. You will see the program name
       
 60088 +// specified by argv0 in log outputs.
       
 60089 +GOOGLE_GLOG_DLL_DECL void InitGoogleLogging(const char* argv0);
       
 60090 +
       
 60091 +// Install a function which will be called after LOG(FATAL).
       
 60092 +GOOGLE_GLOG_DLL_DECL void InstallFailureFunction(void (*fail_func)());
       
 60093 +
       
 60094 +class LogSink;  // defined below
       
 60095 +
       
 60096 +// If a non-NULL sink pointer is given, we push this message to that sink.
       
 60097 +// For LOG_TO_SINK we then do normal LOG(severity) logging as well.
       
 60098 +// This is useful for capturing messages and passing/storing them
       
 60099 +// somewhere more specific than the global log of the process.
       
 60100 +// Argument types:
       
 60101 +//   LogSink* sink;
       
 60102 +//   LogSeverity severity;
       
 60103 +// The cast is to disambiguate NULL arguments.
       
 60104 +#define LOG_TO_SINK(sink, severity) \
       
 60105 +  google::LogMessage(                                    \
       
 60106 +      __FILE__, __LINE__,                                               \
       
 60107 +      google::severity,                                  \
       
 60108 +      static_cast<google::LogSink*>(sink), true).stream()
       
 60109 +#define LOG_TO_SINK_BUT_NOT_TO_LOGFILE(sink, severity)                  \
       
 60110 +  google::LogMessage(                                    \
       
 60111 +      __FILE__, __LINE__,                                               \
       
 60112 +      google::severity,                                  \
       
 60113 +      static_cast<google::LogSink*>(sink), false).stream()
       
 60114 +
       
 60115 +// If a non-NULL string pointer is given, we write this message to that string.
       
 60116 +// We then do normal LOG(severity) logging as well.
       
 60117 +// This is useful for capturing messages and storing them somewhere more
       
 60118 +// specific than the global log of the process.
       
 60119 +// Argument types:
       
 60120 +//   string* message;
       
 60121 +//   LogSeverity severity;
       
 60122 +// The cast is to disambiguate NULL arguments.
       
 60123 +// NOTE: LOG(severity) expands to LogMessage().stream() for the specified
       
 60124 +// severity.
       
 60125 +#define LOG_TO_STRING(severity, message) \
       
 60126 +  LOG_TO_STRING_##severity(static_cast<string*>(message)).stream()
       
 60127 +
       
 60128 +// If a non-NULL pointer is given, we push the message onto the end
       
 60129 +// of a vector of strings; otherwise, we report it with LOG(severity).
       
 60130 +// This is handy for capturing messages and perhaps passing them back
       
 60131 +// to the caller, rather than reporting them immediately.
       
 60132 +// Argument types:
       
 60133 +//   LogSeverity severity;
       
 60134 +//   vector<string> *outvec;
       
 60135 +// The cast is to disambiguate NULL arguments.
       
 60136 +#define LOG_STRING(severity, outvec) \
       
 60137 +  LOG_TO_STRING_##severity(static_cast<vector<string>*>(outvec)).stream()
       
 60138 +
       
 60139 +#define LOG_IF(severity, condition) \
       
 60140 +  !(condition) ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
       
 60141 +#define SYSLOG_IF(severity, condition) \
       
 60142 +  !(condition) ? (void) 0 : google::LogMessageVoidify() & SYSLOG(severity)
       
 60143 +
       
 60144 +#define LOG_ASSERT(condition)  \
       
 60145 +  LOG_IF(FATAL, !(condition)) << "Assert failed: " #condition
       
 60146 +#define SYSLOG_ASSERT(condition) \
       
 60147 +  SYSLOG_IF(FATAL, !(condition)) << "Assert failed: " #condition
       
 60148 +
       
 60149 +// CHECK dies with a fatal error if condition is not true.  It is *not*
       
 60150 +// controlled by NDEBUG, so the check will be executed regardless of
       
 60151 +// compilation mode.  Therefore, it is safe to do things like:
       
 60152 +//    CHECK(fp->Write(x) == 4)
       
 60153 +#define CHECK(condition)  \
       
 60154 +      LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \
       
 60155 +             << "Check failed: " #condition " "
       
 60156 +
       
 60157 +// A container for a string pointer which can be evaluated to a bool -
       
 60158 +// true iff the pointer is NULL.
       
 60159 +struct CheckOpString {
       
 60160 +  CheckOpString(std::string* str) : str_(str) { }
       
 60161 +  // No destructor: if str_ is non-NULL, we're about to LOG(FATAL),
       
 60162 +  // so there's no point in cleaning up str_.
       
 60163 +  operator bool() const {
       
 60164 +    return GOOGLE_PREDICT_BRANCH_NOT_TAKEN(str_ != NULL);
       
 60165 +  }
       
 60166 +  std::string* str_;
       
 60167 +};
       
 60168 +
       
 60169 +// Function is overloaded for integral types to allow static const
       
 60170 +// integrals declared in classes and not defined to be used as arguments to
       
 60171 +// CHECK* macros. It's not encouraged though.
       
 60172 +template <class T>
       
 60173 +inline const T&       GetReferenceableValue(const T&           t) { return t; }
       
 60174 +inline char           GetReferenceableValue(char               t) { return t; }
       
 60175 +inline unsigned char  GetReferenceableValue(unsigned char      t) { return t; }
       
 60176 +inline signed char    GetReferenceableValue(signed char        t) { return t; }
       
 60177 +inline short          GetReferenceableValue(short              t) { return t; }
       
 60178 +inline unsigned short GetReferenceableValue(unsigned short     t) { return t; }
       
 60179 +inline int            GetReferenceableValue(int                t) { return t; }
       
 60180 +inline unsigned int   GetReferenceableValue(unsigned int       t) { return t; }
       
 60181 +inline long           GetReferenceableValue(long               t) { return t; }
       
 60182 +inline unsigned long  GetReferenceableValue(unsigned long      t) { return t; }
       
 60183 +inline long long      GetReferenceableValue(long long          t) { return t; }
       
 60184 +inline unsigned long long GetReferenceableValue(unsigned long long t) {
       
 60185 +  return t;
       
 60186 +}
       
 60187 +
       
 60188 +// This is a dummy class to define the following operator.
       
 60189 +struct DummyClassToDefineOperator {};
       
 60190 +
       
 60191 +}
       
 60192 +
       
 60193 +// Define global operator<< to declare using ::operator<<.
       
 60194 +// This declaration will allow use to use CHECK macros for user
       
 60195 +// defined classes which have operator<< (e.g., stl_logging.h).
       
 60196 +inline std::ostream& operator<<(
       
 60197 +    std::ostream& out, const google::DummyClassToDefineOperator&) {
       
 60198 +  return out;
       
 60199 +}
       
 60200 +
       
 60201 +namespace google {
       
 60202 +
       
 60203 +// Build the error message string.
       
 60204 +template<class t1, class t2>
       
 60205 +std::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) {
       
 60206 +  // It means that we cannot use stl_logging if compiler doesn't
       
 60207 +  // support using expression for operator.
       
 60208 +  // TODO(hamaji): Figure out a way to fix.
       
 60209 +#if 1
       
 60210 +  using ::operator<<;
       
 60211 +#endif
       
 60212 +  std::strstream ss;
       
 60213 +  ss << names << " (" << v1 << " vs. " << v2 << ")";
       
 60214 +  return new std::string(ss.str(), ss.pcount());
       
 60215 +}
       
 60216 +
       
 60217 +// Helper functions for CHECK_OP macro.
       
 60218 +// The (int, int) specialization works around the issue that the compiler
       
 60219 +// will not instantiate the template version of the function on values of
       
 60220 +// unnamed enum type - see comment below.
       
 60221 +#define DEFINE_CHECK_OP_IMPL(name, op) \
       
 60222 +  template <class t1, class t2> \
       
 60223 +  inline std::string* Check##name##Impl(const t1& v1, const t2& v2, \
       
 60224 +                                        const char* names) { \
       
 60225 +    if (v1 op v2) return NULL; \
       
 60226 +    else return MakeCheckOpString(v1, v2, names); \
       
 60227 +  } \
       
 60228 +  inline std::string* Check##name##Impl(int v1, int v2, const char* names) { \
       
 60229 +    return Check##name##Impl<int, int>(v1, v2, names); \
       
 60230 +  }
       
 60231 +
       
 60232 +// Use _EQ, _NE, _LE, etc. in case the file including base/logging.h
       
 60233 +// provides its own #defines for the simpler names EQ, NE, LE, etc.
       
 60234 +// This happens if, for example, those are used as token names in a
       
 60235 +// yacc grammar.
       
 60236 +DEFINE_CHECK_OP_IMPL(_EQ, ==)
       
 60237 +DEFINE_CHECK_OP_IMPL(_NE, !=)
       
 60238 +DEFINE_CHECK_OP_IMPL(_LE, <=)
       
 60239 +DEFINE_CHECK_OP_IMPL(_LT, < )
       
 60240 +DEFINE_CHECK_OP_IMPL(_GE, >=)
       
 60241 +DEFINE_CHECK_OP_IMPL(_GT, > )
       
 60242 +#undef DEFINE_CHECK_OP_IMPL
       
 60243 +
       
 60244 +// Helper macro for binary operators.
       
 60245 +// Don't use this macro directly in your code, use CHECK_EQ et al below.
       
 60246 +
       
 60247 +#if defined(STATIC_ANALYSIS)
       
 60248 +// Only for static analysis tool to know that it is equivalent to assert
       
 60249 +#define CHECK_OP_LOG(name, op, val1, val2, log) CHECK((val1) op (val2))
       
 60250 +#elif !defined(NDEBUG)
       
 60251 +// In debug mode, avoid constructing CheckOpStrings if possible,
       
 60252 +// to reduce the overhead of CHECK statments by 2x.
       
 60253 +// Real DCHECK-heavy tests have seen 1.5x speedups.
       
 60254 +
       
 60255 +// The meaning of "string" might be different between now and 
       
 60256 +// when this macro gets invoked (e.g., if someone is experimenting
       
 60257 +// with other string implementations that get defined after this
       
 60258 +// file is included).  Save the current meaning now and use it 
       
 60259 +// in the macro.
       
 60260 +typedef std::string _Check_string;
       
 60261 +#define CHECK_OP_LOG(name, op, val1, val2, log) \
       
 60262 +  while (google::_Check_string* _result =                \
       
 60263 +         google::Check##name##Impl(                      \
       
 60264 +             google::GetReferenceableValue(val1),        \
       
 60265 +             google::GetReferenceableValue(val2),        \
       
 60266 +             #val1 " " #op " " #val2))                                  \
       
 60267 +    log(__FILE__, __LINE__,                                             \
       
 60268 +        google::CheckOpString(_result)).stream()
       
 60269 +#else
       
 60270 +// In optimized mode, use CheckOpString to hint to compiler that
       
 60271 +// the while condition is unlikely.
       
 60272 +#define CHECK_OP_LOG(name, op, val1, val2, log) \
       
 60273 +  while (google::CheckOpString _result = \
       
 60274 +         google::Check##name##Impl(GetReferenceableValue(val1), \
       
 60275 +                           GetReferenceableValue(val2), \
       
 60276 +                           #val1 " " #op " " #val2)) \
       
 60277 +    log(__FILE__, __LINE__, _result).stream()
       
 60278 +#endif  // STATIC_ANALYSIS, !NDEBUG
       
 60279 +
       
 60280 +#if GOOGLE_STRIP_LOG <= 3
       
 60281 +#define CHECK_OP(name, op, val1, val2) \
       
 60282 +  CHECK_OP_LOG(name, op, val1, val2, google::LogMessageFatal)
       
 60283 +#else
       
 60284 +#define CHECK_OP(name, op, val1, val2) \
       
 60285 +  CHECK_OP_LOG(name, op, val1, val2, google::NullStreamFatal)
       
 60286 +#endif // STRIP_LOG <= 3
       
 60287 +
       
 60288 +// Equality/Inequality checks - compare two values, and log a FATAL message
       
 60289 +// including the two values when the result is not as expected.  The values
       
 60290 +// must have operator<<(ostream, ...) defined.
       
 60291 +//
       
 60292 +// You may append to the error message like so:
       
 60293 +//   CHECK_NE(1, 2) << ": The world must be ending!";
       
 60294 +//
       
 60295 +// We are very careful to ensure that each argument is evaluated exactly
       
 60296 +// once, and that anything which is legal to pass as a function argument is
       
 60297 +// legal here.  In particular, the arguments may be temporary expressions
       
 60298 +// which will end up being destroyed at the end of the apparent statement,
       
 60299 +// for example:
       
 60300 +//   CHECK_EQ(string("abc")[1], 'b');
       
 60301 +//
       
 60302 +// WARNING: These don't compile correctly if one of the arguments is a pointer
       
 60303 +// and the other is NULL. To work around this, simply static_cast NULL to the
       
 60304 +// type of the desired pointer.
       
 60305 +
       
 60306 +#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2)
       
 60307 +#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2)
       
 60308 +#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2)
       
 60309 +#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2)
       
 60310 +#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2)
       
 60311 +#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2)
       
 60312 +
       
 60313 +// Check that the input is non NULL.  This very useful in constructor
       
 60314 +// initializer lists.
       
 60315 +
       
 60316 +#define CHECK_NOTNULL(val) \
       
 60317 +  google::CheckNotNull(__FILE__, __LINE__, "'" #val "' Must be non NULL", (val))
       
 60318 +
       
 60319 +// Helper functions for string comparisons.
       
 60320 +// To avoid bloat, the definitions are in logging.cc.
       
 60321 +#define DECLARE_CHECK_STROP_IMPL(func, expected) \
       
 60322 +  GOOGLE_GLOG_DLL_DECL std::string* Check##func##expected##Impl( \
       
 60323 +      const char* s1, const char* s2, const char* names);
       
 60324 +DECLARE_CHECK_STROP_IMPL(strcmp, true)
       
 60325 +DECLARE_CHECK_STROP_IMPL(strcmp, false)
       
 60326 +DECLARE_CHECK_STROP_IMPL(strcasecmp, true)
       
 60327 +DECLARE_CHECK_STROP_IMPL(strcasecmp, false)
       
 60328 +#undef DECLARE_CHECK_STROP_IMPL
       
 60329 +
       
 60330 +// Helper macro for string comparisons.
       
 60331 +// Don't use this macro directly in your code, use CHECK_STREQ et al below.
       
 60332 +#define CHECK_STROP(func, op, expected, s1, s2) \
       
 60333 +  while (google::CheckOpString _result = \
       
 60334 +         google::Check##func##expected##Impl((s1), (s2), \
       
 60335 +                                     #s1 " " #op " " #s2)) \
       
 60336 +    LOG(FATAL) << *_result.str_
       
 60337 +
       
 60338 +
       
 60339 +// String (char*) equality/inequality checks.
       
 60340 +// CASE versions are case-insensitive.
       
 60341 +//
       
 60342 +// Note that "s1" and "s2" may be temporary strings which are destroyed
       
 60343 +// by the compiler at the end of the current "full expression"
       
 60344 +// (e.g. CHECK_STREQ(Foo().c_str(), Bar().c_str())).
       
 60345 +
       
 60346 +#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2)
       
 60347 +#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2)
       
 60348 +#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2)
       
 60349 +#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2)
       
 60350 +
       
 60351 +#define CHECK_INDEX(I,A) CHECK(I < (sizeof(A)/sizeof(A[0])))
       
 60352 +#define CHECK_BOUND(B,A) CHECK(B <= (sizeof(A)/sizeof(A[0])))
       
 60353 +
       
 60354 +#define CHECK_DOUBLE_EQ(val1, val2)              \
       
 60355 +  do {                                           \
       
 60356 +    CHECK_LE((val1), (val2)+0.000000000000001L); \
       
 60357 +    CHECK_GE((val1), (val2)-0.000000000000001L); \
       
 60358 +  } while (0)
       
 60359 +
       
 60360 +#define CHECK_NEAR(val1, val2, margin)           \
       
 60361 +  do {                                           \
       
 60362 +    CHECK_LE((val1), (val2)+(margin));           \
       
 60363 +    CHECK_GE((val1), (val2)-(margin));           \
       
 60364 +  } while (0)
       
 60365 +
       
 60366 +// perror()..googly style!
       
 60367 +//
       
 60368 +// PLOG() and PLOG_IF() and PCHECK() behave exactly like their LOG* and
       
 60369 +// CHECK equivalents with the addition that they postpend a description
       
 60370 +// of the current state of errno to their output lines.
       
 60371 +
       
 60372 +#define PLOG(severity) GOOGLE_PLOG(severity, 0).stream()
       
 60373 +
       
 60374 +#define GOOGLE_PLOG(severity, counter)  \
       
 60375 +  google::ErrnoLogMessage( \
       
 60376 +      __FILE__, __LINE__, google::severity, counter, \
       
 60377 +      &google::LogMessage::SendToLog)
       
 60378 +
       
 60379 +#define PLOG_IF(severity, condition) \
       
 60380 +  !(condition) ? (void) 0 : google::LogMessageVoidify() & PLOG(severity)
       
 60381 +
       
 60382 +// A CHECK() macro that postpends errno if the condition is false. E.g.
       
 60383 +//
       
 60384 +// if (poll(fds, nfds, timeout) == -1) { PCHECK(errno == EINTR); ... }
       
 60385 +#define PCHECK(condition)  \
       
 60386 +      PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \
       
 60387 +              << "Check failed: " #condition " "
       
 60388 +
       
 60389 +// A CHECK() macro that lets you assert the success of a function that
       
 60390 +// returns -1 and sets errno in case of an error. E.g.
       
 60391 +//
       
 60392 +// CHECK_ERR(mkdir(path, 0700));
       
 60393 +//
       
 60394 +// or
       
 60395 +//
       
 60396 +// int fd = open(filename, flags); CHECK_ERR(fd) << ": open " << filename;
       
 60397 +#define CHECK_ERR(invocation)                                          \
       
 60398 +PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN((invocation) == -1))    \
       
 60399 +        << #invocation
       
 60400 +
       
 60401 +// Use macro expansion to create, for each use of LOG_EVERY_N(), static
       
 60402 +// variables with the __LINE__ expansion as part of the variable name.
       
 60403 +#define LOG_EVERY_N_VARNAME(base, line) LOG_EVERY_N_VARNAME_CONCAT(base, line)
       
 60404 +#define LOG_EVERY_N_VARNAME_CONCAT(base, line) base ## line
       
 60405 +
       
 60406 +#define LOG_OCCURRENCES LOG_EVERY_N_VARNAME(occurrences_, __LINE__)
       
 60407 +#define LOG_OCCURRENCES_MOD_N LOG_EVERY_N_VARNAME(occurrences_mod_n_, __LINE__)
       
 60408 +
       
 60409 +#define SOME_KIND_OF_LOG_EVERY_N(severity, n, what_to_do) \
       
 60410 +  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \
       
 60411 +  ++LOG_OCCURRENCES; \
       
 60412 +  if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \
       
 60413 +  if (LOG_OCCURRENCES_MOD_N == 1) \
       
 60414 +    google::LogMessage( \
       
 60415 +        __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \
       
 60416 +        &what_to_do).stream()
       
 60417 +
       
 60418 +#define SOME_KIND_OF_LOG_IF_EVERY_N(severity, condition, n, what_to_do) \
       
 60419 +  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \
       
 60420 +  ++LOG_OCCURRENCES; \
       
 60421 +  if (condition && \
       
 60422 +      ((LOG_OCCURRENCES_MOD_N=(LOG_OCCURRENCES_MOD_N + 1) % n) == (1 % n))) \
       
 60423 +    google::LogMessage( \
       
 60424 +        __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \
       
 60425 +                 &what_to_do).stream()
       
 60426 +
       
 60427 +#define SOME_KIND_OF_PLOG_EVERY_N(severity, n, what_to_do) \
       
 60428 +  static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \
       
 60429 +  ++LOG_OCCURRENCES; \
       
 60430 +  if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \
       
 60431 +  if (LOG_OCCURRENCES_MOD_N == 1) \
       
 60432 +    google::ErrnoLogMessage( \
       
 60433 +        __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \
       
 60434 +        &what_to_do).stream()
       
 60435 +
       
 60436 +#define SOME_KIND_OF_LOG_FIRST_N(severity, n, what_to_do) \
       
 60437 +  static int LOG_OCCURRENCES = 0; \
       
 60438 +  if (LOG_OCCURRENCES <= n) \
       
 60439 +    ++LOG_OCCURRENCES; \
       
 60440 +  if (LOG_OCCURRENCES <= n) \
       
 60441 +    google::LogMessage( \
       
 60442 +        __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \
       
 60443 +        &what_to_do).stream()
       
 60444 +
       
 60445 +namespace glog_internal_namespace_ {
       
 60446 +template <bool>
       
 60447 +struct CompileAssert {
       
 60448 +};
       
 60449 +struct CrashReason;
       
 60450 +}  // namespace glog_internal_namespace_
       
 60451 +
       
 60452 +#define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \
       
 60453 +  typedef google::glog_internal_namespace_::CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
       
 60454 +
       
 60455 +#define LOG_EVERY_N(severity, n)                                        \
       
 60456 +  GOOGLE_GLOG_COMPILE_ASSERT(google::severity <          \
       
 60457 +                             google::NUM_SEVERITIES,     \
       
 60458 +                             INVALID_REQUESTED_LOG_SEVERITY);           \
       
 60459 +  SOME_KIND_OF_LOG_EVERY_N(severity, (n), google::LogMessage::SendToLog)
       
 60460 +
       
 60461 +#define SYSLOG_EVERY_N(severity, n) \
       
 60462 +  SOME_KIND_OF_LOG_EVERY_N(severity, (n), google::LogMessage::SendToSyslogAndLog)
       
 60463 +
       
 60464 +#define PLOG_EVERY_N(severity, n) \
       
 60465 +  SOME_KIND_OF_PLOG_EVERY_N(severity, (n), google::LogMessage::SendToLog)
       
 60466 +
       
 60467 +#define LOG_FIRST_N(severity, n) \
       
 60468 +  SOME_KIND_OF_LOG_FIRST_N(severity, (n), google::LogMessage::SendToLog)
       
 60469 +
       
 60470 +#define LOG_IF_EVERY_N(severity, condition, n) \
       
 60471 +  SOME_KIND_OF_LOG_IF_EVERY_N(severity, (condition), (n), google::LogMessage::SendToLog)
       
 60472 +
       
 60473 +// We want the special COUNTER value available for LOG_EVERY_X()'ed messages
       
 60474 +enum PRIVATE_Counter {COUNTER};
       
 60475 +
       
 60476 +
       
 60477 +// Plus some debug-logging macros that get compiled to nothing for production
       
 60478 +
       
 60479 +#ifndef NDEBUG
       
 60480 +
       
 60481 +#define DLOG(severity) LOG(severity)
       
 60482 +#define DVLOG(verboselevel) VLOG(verboselevel)
       
 60483 +#define DLOG_IF(severity, condition) LOG_IF(severity, condition)
       
 60484 +#define DLOG_EVERY_N(severity, n) LOG_EVERY_N(severity, n)
       
 60485 +#define DLOG_IF_EVERY_N(severity, condition, n) \
       
 60486 +  LOG_IF_EVERY_N(severity, condition, n)
       
 60487 +#define DLOG_ASSERT(condition) LOG_ASSERT(condition)
       
 60488 +
       
 60489 +// debug-only checking.  not executed in NDEBUG mode.
       
 60490 +#define DCHECK(condition) CHECK(condition)
       
 60491 +#define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2)
       
 60492 +#define DCHECK_NE(val1, val2) CHECK_NE(val1, val2)
       
 60493 +#define DCHECK_LE(val1, val2) CHECK_LE(val1, val2)
       
 60494 +#define DCHECK_LT(val1, val2) CHECK_LT(val1, val2)
       
 60495 +#define DCHECK_GE(val1, val2) CHECK_GE(val1, val2)
       
 60496 +#define DCHECK_GT(val1, val2) CHECK_GT(val1, val2)
       
 60497 +#define DCHECK_STREQ(str1, str2) CHECK_STREQ(str1, str2)
       
 60498 +#define DCHECK_STRCASEEQ(str1, str2) CHECK_STRCASEEQ(str1, str2)
       
 60499 +#define DCHECK_STRNE(str1, str2) CHECK_STRNE(str1, str2)
       
 60500 +#define DCHECK_STRCASENE(str1, str2) CHECK_STRCASENE(str1, str2)
       
 60501 +
       
 60502 +#else  // NDEBUG
       
 60503 +
       
 60504 +#define DLOG(severity) \
       
 60505 +  true ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
       
 60506 +
       
 60507 +#define DVLOG(verboselevel) \
       
 60508 +  (true || !VLOG_IS_ON(verboselevel)) ?\
       
 60509 +    (void) 0 : google::LogMessageVoidify() & LOG(INFO)
       
 60510 +
       
 60511 +#define DLOG_IF(severity, condition) \
       
 60512 +  (true || !(condition)) ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
       
 60513 +
       
 60514 +#define DLOG_EVERY_N(severity, n) \
       
 60515 +  true ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
       
 60516 +
       
 60517 +#define DLOG_IF_EVERY_N(severity, condition, n) \
       
 60518 +  (true || !(condition))? (void) 0 : google::LogMessageVoidify() & LOG(severity)
       
 60519 +
       
 60520 +#define DLOG_ASSERT(condition) \
       
 60521 +  true ? (void) 0 : LOG_ASSERT(condition)
       
 60522 +
       
 60523 +#define DCHECK(condition) \
       
 60524 +  while (false) \
       
 60525 +    CHECK(condition)
       
 60526 +
       
 60527 +#define DCHECK_EQ(val1, val2) \
       
 60528 +  while (false) \
       
 60529 +    CHECK_EQ(val1, val2)
       
 60530 +
       
 60531 +#define DCHECK_NE(val1, val2) \
       
 60532 +  while (false) \
       
 60533 +    CHECK_NE(val1, val2)
       
 60534 +
       
 60535 +#define DCHECK_LE(val1, val2) \
       
 60536 +  while (false) \
       
 60537 +    CHECK_LE(val1, val2)
       
 60538 +
       
 60539 +#define DCHECK_LT(val1, val2) \
       
 60540 +  while (false) \
       
 60541 +    CHECK_LT(val1, val2)
       
 60542 +
       
 60543 +#define DCHECK_GE(val1, val2) \
       
 60544 +  while (false) \
       
 60545 +    CHECK_GE(val1, val2)
       
 60546 +
       
 60547 +#define DCHECK_GT(val1, val2) \
       
 60548 +  while (false) \
       
 60549 +    CHECK_GT(val1, val2)
       
 60550 +
       
 60551 +#define DCHECK_STREQ(str1, str2) \
       
 60552 +  while (false) \
       
 60553 +    CHECK_STREQ(str1, str2)
       
 60554 +
       
 60555 +#define DCHECK_STRCASEEQ(str1, str2) \
       
 60556 +  while (false) \
       
 60557 +    CHECK_STRCASEEQ(str1, str2)
       
 60558 +
       
 60559 +#define DCHECK_STRNE(str1, str2) \
       
 60560 +  while (false) \
       
 60561 +    CHECK_STRNE(str1, str2)
       
 60562 +
       
 60563 +#define DCHECK_STRCASENE(str1, str2) \
       
 60564 +  while (false) \
       
 60565 +    CHECK_STRCASENE(str1, str2)
       
 60566 +
       
 60567 +
       
 60568 +#endif  // NDEBUG
       
 60569 +
       
 60570 +// Log only in verbose mode.
       
 60571 +
       
 60572 +#define VLOG(verboselevel) LOG_IF(INFO, VLOG_IS_ON(verboselevel))
       
 60573 +
       
 60574 +#define VLOG_IF(verboselevel, condition) \
       
 60575 +  LOG_IF(INFO, (condition) && VLOG_IS_ON(verboselevel))
       
 60576 +
       
 60577 +#define VLOG_EVERY_N(verboselevel, n) \
       
 60578 +  LOG_IF_EVERY_N(INFO, VLOG_IS_ON(verboselevel), n)
       
 60579 +
       
 60580 +#define VLOG_IF_EVERY_N(verboselevel, condition, n) \
       
 60581 +  LOG_IF_EVERY_N(INFO, (condition) && VLOG_IS_ON(verboselevel), n)
       
 60582 +
       
 60583 +//
       
 60584 +// This class more or less represents a particular log message.  You
       
 60585 +// create an instance of LogMessage and then stream stuff to it.
       
 60586 +// When you finish streaming to it, ~LogMessage is called and the
       
 60587 +// full message gets streamed to the appropriate destination.
       
 60588 +//
       
 60589 +// You shouldn't actually use LogMessage's constructor to log things,
       
 60590 +// though.  You should use the LOG() macro (and variants thereof)
       
 60591 +// above.
       
 60592 +class GOOGLE_GLOG_DLL_DECL LogMessage {
       
 60593 +public:
       
 60594 +  enum {
       
 60595 +    // Passing kNoLogPrefix for the line number disables the
       
 60596 +    // log-message prefix. Useful for using the LogMessage
       
 60597 +    // infrastructure as a printing utility. See also the --log_prefix
       
 60598 +    // flag for controlling the log-message prefix on an
       
 60599 +    // application-wide basis.
       
 60600 +    kNoLogPrefix = -1
       
 60601 +  };
       
 60602 +
       
 60603 +  // LogStream inherit from non-DLL-exported class (std::ostrstream)
       
 60604 +  // and VC++ produces a warning for this situation.
       
 60605 +  // However, MSDN says "C4275 can be ignored in Microsoft Visual C++
       
 60606 +  // 2005 if you are deriving from a type in the Standard C++ Library"
       
 60607 +  // http://msdn.microsoft.com/en-us/library/3tdb471s(VS.80).aspx
       
 60608 +  // Let's just ignore the warning.
       
 60609 +#ifdef _MSC_VER
       
 60610 +# pragma warning(disable: 4275)
       
 60611 +#endif
       
 60612 +  class GOOGLE_GLOG_DLL_DECL LogStream : public std::ostrstream {
       
 60613 +#ifdef _MSC_VER
       
 60614 +# pragma warning(default: 4275)
       
 60615 +#endif
       
 60616 +  public:
       
 60617 +    LogStream(char *buf, int len, int ctr)
       
 60618 +      : ostrstream(buf, len),
       
 60619 +        ctr_(ctr) {
       
 60620 +      self_ = this;
       
 60621 +    }
       
 60622 +
       
 60623 +    int ctr() const { return ctr_; }
       
 60624 +    void set_ctr(int ctr) { ctr_ = ctr; }
       
 60625 +    LogStream* self() const { return self_; }
       
 60626 +
       
 60627 +  private:
       
 60628 +    int ctr_;  // Counter hack (for the LOG_EVERY_X() macro)
       
 60629 +    LogStream *self_;  // Consistency check hack
       
 60630 +  };
       
 60631 +
       
 60632 +public:
       
 60633 +  // icc 8 requires this typedef to avoid an internal compiler error.
       
 60634 +  typedef void (LogMessage::*SendMethod)();
       
 60635 +
       
 60636 +  LogMessage(const char* file, int line, LogSeverity severity, int ctr,
       
 60637 +             SendMethod send_method);
       
 60638 +
       
 60639 +  // Two special constructors that generate reduced amounts of code at
       
 60640 +  // LOG call sites for common cases.
       
 60641 +
       
 60642 +  // Used for LOG(INFO): Implied are:
       
 60643 +  // severity = INFO, ctr = 0, send_method = &LogMessage::SendToLog.
       
 60644 +  //
       
 60645 +  // Using this constructor instead of the more complex constructor above
       
 60646 +  // saves 19 bytes per call site.
       
 60647 +  LogMessage(const char* file, int line);
       
 60648 +
       
 60649 +  // Used for LOG(severity) where severity != INFO.  Implied
       
 60650 +  // are: ctr = 0, send_method = &LogMessage::SendToLog
       
 60651 +  //
       
 60652 +  // Using this constructor instead of the more complex constructor above
       
 60653 +  // saves 17 bytes per call site.
       
 60654 +  LogMessage(const char* file, int line, LogSeverity severity);
       
 60655 +
       
 60656 +  // Constructor to log this message to a specified sink (if not NULL).
       
 60657 +  // Implied are: ctr = 0, send_method = &LogMessage::SendToSinkAndLog if
       
 60658 +  // also_send_to_log is true, send_method = &LogMessage::SendToSink otherwise.
       
 60659 +  LogMessage(const char* file, int line, LogSeverity severity, LogSink* sink,
       
 60660 +             bool also_send_to_log);
       
 60661 +
       
 60662 +  // Constructor where we also give a vector<string> pointer
       
 60663 +  // for storing the messages (if the pointer is not NULL).
       
 60664 +  // Implied are: ctr = 0, send_method = &LogMessage::SaveOrSendToLog.
       
 60665 +  LogMessage(const char* file, int line, LogSeverity severity,
       
 60666 +             std::vector<std::string>* outvec);
       
 60667 +
       
 60668 +  // Constructor where we also give a string pointer for storing the
       
 60669 +  // message (if the pointer is not NULL).  Implied are: ctr = 0,
       
 60670 +  // send_method = &LogMessage::WriteToStringAndLog.
       
 60671 +  LogMessage(const char* file, int line, LogSeverity severity,
       
 60672 +             std::string* message);
       
 60673 +
       
 60674 +  // A special constructor used for check failures
       
 60675 +  LogMessage(const char* file, int line, const CheckOpString& result);
       
 60676 +
       
 60677 +  ~LogMessage();
       
 60678 +
       
 60679 +  // Flush a buffered message to the sink set in the constructor.  Always
       
 60680 +  // called by the destructor, it may also be called from elsewhere if
       
 60681 +  // needed.  Only the first call is actioned; any later ones are ignored.
       
 60682 +  void Flush();
       
 60683 +
       
 60684 +  // An arbitrary limit on the length of a single log message.  This
       
 60685 +  // is so that streaming can be done more efficiently.
       
 60686 +  static const size_t kMaxLogMessageLen;
       
 60687 +
       
 60688 +  // Theses should not be called directly outside of logging.*,
       
 60689 +  // only passed as SendMethod arguments to other LogMessage methods:
       
 60690 +  void SendToLog();  // Actually dispatch to the logs
       
 60691 +  void SendToSyslogAndLog();  // Actually dispatch to syslog and the logs
       
 60692 +
       
 60693 +  // Call abort() or similar to perform LOG(FATAL) crash.
       
 60694 +  static void Fail() __attribute__ ((noreturn));
       
 60695 +
       
 60696 +  std::ostream& stream() { return *(data_->stream_); }
       
 60697 +
       
 60698 +  int preserved_errno() const { return data_->preserved_errno_; }
       
 60699 +
       
 60700 +  // Must be called without the log_mutex held.  (L < log_mutex)
       
 60701 +  static int64 num_messages(int severity);
       
 60702 +
       
 60703 +private:
       
 60704 +  // Fully internal SendMethod cases:
       
 60705 +  void SendToSinkAndLog();  // Send to sink if provided and dispatch to the logs
       
 60706 +  void SendToSink();  // Send to sink if provided, do nothing otherwise.
       
 60707 +
       
 60708 +  // Write to string if provided and dispatch to the logs.
       
 60709 +  void WriteToStringAndLog();
       
 60710 +
       
 60711 +  void SaveOrSendToLog();  // Save to stringvec if provided, else to logs
       
 60712 +
       
 60713 +  void Init(const char* file, int line, LogSeverity severity,
       
 60714 +            void (LogMessage::*send_method)());
       
 60715 +
       
 60716 +  // Used to fill in crash information during LOG(FATAL) failures.
       
 60717 +  void RecordCrashReason(glog_internal_namespace_::CrashReason* reason);
       
 60718 +
       
 60719 +  // Counts of messages sent at each priority:
       
 60720 +  static int64 num_messages_[NUM_SEVERITIES];  // under log_mutex
       
 60721 +
       
 60722 +  // We keep the data in a separate struct so that each instance of
       
 60723 +  // LogMessage uses less stack space.
       
 60724 +  struct GOOGLE_GLOG_DLL_DECL LogMessageData {
       
 60725 +    LogMessageData() {};
       
 60726 +
       
 60727 +    int preserved_errno_;      // preserved errno
       
 60728 +    char* buf_;
       
 60729 +    char* message_text_;  // Complete message text (points to selected buffer)
       
 60730 +    LogStream* stream_alloc_;
       
 60731 +    LogStream* stream_;
       
 60732 +    char severity_;      // What level is this LogMessage logged at?
       
 60733 +    int line_;                 // line number where logging call is.
       
 60734 +    void (LogMessage::*send_method_)();  // Call this in destructor to send
       
 60735 +    union {  // At most one of these is used: union to keep the size low.
       
 60736 +      LogSink* sink_;             // NULL or sink to send message to
       
 60737 +      std::vector<std::string>* outvec_; // NULL or vector to push message onto
       
 60738 +      std::string* message_;             // NULL or string to write message into
       
 60739 +    };
       
 60740 +    time_t timestamp_;            // Time of creation of LogMessage
       
 60741 +    struct ::tm tm_time_;         // Time of creation of LogMessage
       
 60742 +    size_t num_prefix_chars_;     // # of chars of prefix in this message
       
 60743 +    size_t num_chars_to_log_;     // # of chars of msg to send to log
       
 60744 +    size_t num_chars_to_syslog_;  // # of chars of msg to send to syslog
       
 60745 +    const char* basename_;        // basename of file that called LOG
       
 60746 +    const char* fullname_;        // fullname of file that called LOG
       
 60747 +    bool has_been_flushed_;       // false => data has not been flushed
       
 60748 +    bool first_fatal_;            // true => this was first fatal msg
       
 60749 +
       
 60750 +    ~LogMessageData();
       
 60751 +   private:
       
 60752 +    LogMessageData(const LogMessageData&);
       
 60753 +    void operator=(const LogMessageData&);
       
 60754 +  };
       
 60755 +
       
 60756 +  static LogMessageData fatal_msg_data_exclusive_;
       
 60757 +  static LogMessageData fatal_msg_data_shared_;
       
 60758 +
       
 60759 +  LogMessageData* allocated_;
       
 60760 +  LogMessageData* data_;
       
 60761 +
       
 60762 +  friend class LogDestination;
       
 60763 +
       
 60764 +  LogMessage(const LogMessage&);
       
 60765 +  void operator=(const LogMessage&);
       
 60766 +};
       
 60767 +
       
 60768 +// This class happens to be thread-hostile because all instances share
       
 60769 +// a single data buffer, but since it can only be created just before
       
 60770 +// the process dies, we don't worry so much.
       
 60771 +class GOOGLE_GLOG_DLL_DECL LogMessageFatal : public LogMessage {
       
 60772 + public:
       
 60773 +  LogMessageFatal(const char* file, int line);
       
 60774 +  LogMessageFatal(const char* file, int line, const CheckOpString& result);
       
 60775 +  ~LogMessageFatal() __attribute__ ((noreturn));
       
 60776 +};
       
 60777 +
       
 60778 +// A non-macro interface to the log facility; (useful
       
 60779 +// when the logging level is not a compile-time constant).
       
 60780 +inline void LogAtLevel(int const severity, std::string const &msg) {
       
 60781 +  LogMessage(__FILE__, __LINE__, severity).stream() << msg;
       
 60782 +}
       
 60783 +
       
 60784 +// A macro alternative of LogAtLevel. New code may want to use this
       
 60785 +// version since there are two advantages: 1. this version outputs the
       
 60786 +// file name and the line number where this macro is put like other
       
 60787 +// LOG macros, 2. this macro can be used as C++ stream.
       
 60788 +#define LOG_AT_LEVEL(severity) LogMessage(__FILE__, __LINE__, severity).stream()
       
 60789 +
       
 60790 +// A small helper for CHECK_NOTNULL().
       
 60791 +template <typename T>
       
 60792 +T* CheckNotNull(const char *file, int line, const char *names, T* t) {
       
 60793 +  if (t == NULL) {
       
 60794 +    LogMessageFatal(file, line, new std::string(names));
       
 60795 +  }
       
 60796 +  return t;
       
 60797 +}
       
 60798 +
       
 60799 +// Allow folks to put a counter in the LOG_EVERY_X()'ed messages. This
       
 60800 +// only works if ostream is a LogStream. If the ostream is not a
       
 60801 +// LogStream you'll get an assert saying as much at runtime.
       
 60802 +GOOGLE_GLOG_DLL_DECL std::ostream& operator<<(std::ostream &os,
       
 60803 +                                              const PRIVATE_Counter&);
       
 60804 +
       
 60805 +
       
 60806 +// Derived class for PLOG*() above.
       
 60807 +class GOOGLE_GLOG_DLL_DECL ErrnoLogMessage : public LogMessage {
       
 60808 + public:
       
 60809 +
       
 60810 +  ErrnoLogMessage(const char* file, int line, LogSeverity severity, int ctr,
       
 60811 +                  void (LogMessage::*send_method)());
       
 60812 +
       
 60813 +  // Postpends ": strerror(errno) [errno]".
       
 60814 +  ~ErrnoLogMessage();
       
 60815 +
       
 60816 + private:
       
 60817 +  ErrnoLogMessage(const ErrnoLogMessage&);
       
 60818 +  void operator=(const ErrnoLogMessage&);
       
 60819 +};
       
 60820 +
       
 60821 +
       
 60822 +// This class is used to explicitly ignore values in the conditional
       
 60823 +// logging macros.  This avoids compiler warnings like "value computed
       
 60824 +// is not used" and "statement has no effect".
       
 60825 +
       
 60826 +class GOOGLE_GLOG_DLL_DECL LogMessageVoidify {
       
 60827 + public:
       
 60828 +  LogMessageVoidify() { }
       
 60829 +  // This has to be an operator with a precedence lower than << but
       
 60830 +  // higher than ?:
       
 60831 +  void operator&(std::ostream&) { }
       
 60832 +};
       
 60833 +
       
 60834 +
       
 60835 +// Flushes all log files that contains messages that are at least of
       
 60836 +// the specified severity level.  Thread-safe.
       
 60837 +GOOGLE_GLOG_DLL_DECL void FlushLogFiles(LogSeverity min_severity);
       
 60838 +
       
 60839 +// Flushes all log files that contains messages that are at least of
       
 60840 +// the specified severity level. Thread-hostile because it ignores
       
 60841 +// locking -- used for catastrophic failures.
       
 60842 +GOOGLE_GLOG_DLL_DECL void FlushLogFilesUnsafe(LogSeverity min_severity);
       
 60843 +
       
 60844 +//
       
 60845 +// Set the destination to which a particular severity level of log
       
 60846 +// messages is sent.  If base_filename is "", it means "don't log this
       
 60847 +// severity".  Thread-safe.
       
 60848 +//
       
 60849 +GOOGLE_GLOG_DLL_DECL void SetLogDestination(LogSeverity severity,
       
 60850 +                                            const char* base_filename);
       
 60851 +
       
 60852 +//
       
 60853 +// Set the basename of the symlink to the latest log file at a given
       
 60854 +// severity.  If symlink_basename is empty, do not make a symlink.  If
       
 60855 +// you don't call this function, the symlink basename is the
       
 60856 +// invocation name of the program.  Thread-safe.
       
 60857 +//
       
 60858 +GOOGLE_GLOG_DLL_DECL void SetLogSymlink(LogSeverity severity,
       
 60859 +                                        const char* symlink_basename);
       
 60860 +
       
 60861 +//
       
 60862 +// Used to send logs to some other kind of destination
       
 60863 +// Users should subclass LogSink and override send to do whatever they want.
       
 60864 +// Implementations must be thread-safe because a shared instance will
       
 60865 +// be called from whichever thread ran the LOG(XXX) line.
       
 60866 +class GOOGLE_GLOG_DLL_DECL LogSink {
       
 60867 + public:
       
 60868 +  virtual ~LogSink();
       
 60869 +
       
 60870 +  // Sink's logging logic (message_len is such as to exclude '\n' at the end).
       
 60871 +  // This method can't use LOG() or CHECK() as logging system mutex(s) are held
       
 60872 +  // during this call.
       
 60873 +  virtual void send(LogSeverity severity, const char* full_filename,
       
 60874 +                    const char* base_filename, int line,
       
 60875 +                    const struct ::tm* tm_time,
       
 60876 +                    const char* message, size_t message_len) = 0;
       
 60877 +
       
 60878 +  // Redefine this to implement waiting for
       
 60879 +  // the sink's logging logic to complete.
       
 60880 +  // It will be called after each send() returns,
       
 60881 +  // but before that LogMessage exits or crashes.
       
 60882 +  // By default this function does nothing.
       
 60883 +  // Using this function one can implement complex logic for send()
       
 60884 +  // that itself involves logging; and do all this w/o causing deadlocks and
       
 60885 +  // inconsistent rearrangement of log messages.
       
 60886 +  // E.g. if a LogSink has thread-specific actions, the send() method
       
 60887 +  // can simply add the message to a queue and wake up another thread that
       
 60888 +  // handles real logging while itself making some LOG() calls;
       
 60889 +  // WaitTillSent() can be implemented to wait for that logic to complete.
       
 60890 +  // See our unittest for an example.
       
 60891 +  virtual void WaitTillSent();
       
 60892 +
       
 60893 +  // Returns the normal text output of the log message.
       
 60894 +  // Can be useful to implement send().
       
 60895 +  static std::string ToString(LogSeverity severity, const char* file, int line,
       
 60896 +                              const struct ::tm* tm_time,
       
 60897 +                              const char* message, size_t message_len);
       
 60898 +};
       
 60899 +
       
 60900 +// Add or remove a LogSink as a consumer of logging data.  Thread-safe.
       
 60901 +GOOGLE_GLOG_DLL_DECL void AddLogSink(LogSink *destination);
       
 60902 +GOOGLE_GLOG_DLL_DECL void RemoveLogSink(LogSink *destination);
       
 60903 +
       
 60904 +//
       
 60905 +// Specify an "extension" added to the filename specified via
       
 60906 +// SetLogDestination.  This applies to all severity levels.  It's
       
 60907 +// often used to append the port we're listening on to the logfile
       
 60908 +// name.  Thread-safe.
       
 60909 +//
       
 60910 +GOOGLE_GLOG_DLL_DECL void SetLogFilenameExtension(
       
 60911 +    const char* filename_extension);
       
 60912 +
       
 60913 +//
       
 60914 +// Make it so that all log messages of at least a particular severity
       
 60915 +// are logged to stderr (in addition to logging to the usual log
       
 60916 +// file(s)).  Thread-safe.
       
 60917 +//
       
 60918 +GOOGLE_GLOG_DLL_DECL void SetStderrLogging(LogSeverity min_severity);
       
 60919 +
       
 60920 +//
       
 60921 +// Make it so that all log messages go only to stderr.  Thread-safe.
       
 60922 +//
       
 60923 +GOOGLE_GLOG_DLL_DECL void LogToStderr();
       
 60924 +
       
 60925 +//
       
 60926 +// Make it so that all log messages of at least a particular severity are
       
 60927 +// logged via email to a list of addresses (in addition to logging to the
       
 60928 +// usual log file(s)).  The list of addresses is just a string containing
       
 60929 +// the email addresses to send to (separated by spaces, say).  Thread-safe.
       
 60930 +//
       
 60931 +GOOGLE_GLOG_DLL_DECL void SetEmailLogging(LogSeverity min_severity,
       
 60932 +                                          const char* addresses);
       
 60933 +
       
 60934 +// A simple function that sends email. dest is a commma-separated
       
 60935 +// list of addressess.  Thread-safe.
       
 60936 +GOOGLE_GLOG_DLL_DECL bool SendEmail(const char *dest,
       
 60937 +                                    const char *subject, const char *body);
       
 60938 +
       
 60939 +GOOGLE_GLOG_DLL_DECL const std::vector<std::string>& GetLoggingDirectories();
       
 60940 +
       
 60941 +// For tests only:  Clear the internal [cached] list of logging directories to
       
 60942 +// force a refresh the next time GetLoggingDirectories is called.
       
 60943 +// Thread-hostile.
       
 60944 +void TestOnly_ClearLoggingDirectoriesList();
       
 60945 +
       
 60946 +// Returns a set of existing temporary directories, which will be a
       
 60947 +// subset of the directories returned by GetLogginDirectories().
       
 60948 +// Thread-safe.
       
 60949 +GOOGLE_GLOG_DLL_DECL void GetExistingTempDirectories(
       
 60950 +    std::vector<std::string>* list);
       
 60951 +
       
 60952 +// Print any fatal message again -- useful to call from signal handler
       
 60953 +// so that the last thing in the output is the fatal message.
       
 60954 +// Thread-hostile, but a race is unlikely.
       
 60955 +GOOGLE_GLOG_DLL_DECL void ReprintFatalMessage();
       
 60956 +
       
 60957 +// Truncate a log file that may be the append-only output of multiple
       
 60958 +// processes and hence can't simply be renamed/reopened (typically a
       
 60959 +// stdout/stderr).  If the file "path" is > "limit" bytes, copy the
       
 60960 +// last "keep" bytes to offset 0 and truncate the rest. Since we could
       
 60961 +// be racing with other writers, this approach has the potential to
       
 60962 +// lose very small amounts of data. For security, only follow symlinks
       
 60963 +// if the path is /proc/self/fd/*
       
 60964 +GOOGLE_GLOG_DLL_DECL void TruncateLogFile(const char *path,
       
 60965 +                                          int64 limit, int64 keep);
       
 60966 +
       
 60967 +// Truncate stdout and stderr if they are over the value specified by
       
 60968 +// --max_log_size; keep the final 1MB.  This function has the same
       
 60969 +// race condition as TruncateLogFile.
       
 60970 +GOOGLE_GLOG_DLL_DECL void TruncateStdoutStderr();
       
 60971 +
       
 60972 +// Return the string representation of the provided LogSeverity level.
       
 60973 +// Thread-safe.
       
 60974 +GOOGLE_GLOG_DLL_DECL const char* GetLogSeverityName(LogSeverity severity);
       
 60975 +
       
 60976 +// ---------------------------------------------------------------------
       
 60977 +// Implementation details that are not useful to most clients
       
 60978 +// ---------------------------------------------------------------------
       
 60979 +
       
 60980 +// A Logger is the interface used by logging modules to emit entries
       
 60981 +// to a log.  A typical implementation will dump formatted data to a
       
 60982 +// sequence of files.  We also provide interfaces that will forward
       
 60983 +// the data to another thread so that the invoker never blocks.
       
 60984 +// Implementations should be thread-safe since the logging system
       
 60985 +// will write to them from multiple threads.
       
 60986 +
       
 60987 +namespace base {
       
 60988 +
       
 60989 +class GOOGLE_GLOG_DLL_DECL Logger {
       
 60990 + public:
       
 60991 +  virtual ~Logger();
       
 60992 +
       
 60993 +  // Writes "message[0,message_len-1]" corresponding to an event that
       
 60994 +  // occurred at "timestamp".  If "force_flush" is true, the log file
       
 60995 +  // is flushed immediately.
       
 60996 +  //
       
 60997 +  // The input message has already been formatted as deemed
       
 60998 +  // appropriate by the higher level logging facility.  For example,
       
 60999 +  // textual log messages already contain timestamps, and the
       
 61000 +  // file:linenumber header.
       
 61001 +  virtual void Write(bool force_flush,
       
 61002 +                     time_t timestamp,
       
 61003 +                     const char* message,
       
 61004 +                     int message_len) = 0;
       
 61005 +
       
 61006 +  // Flush any buffered messages
       
 61007 +  virtual void Flush() = 0;
       
 61008 +
       
 61009 +  // Get the current LOG file size.
       
 61010 +  // The returned value is approximate since some
       
 61011 +  // logged data may not have been flushed to disk yet.
       
 61012 +  virtual uint32 LogSize() = 0;
       
 61013 +};
       
 61014 +
       
 61015 +// Get the logger for the specified severity level.  The logger
       
 61016 +// remains the property of the logging module and should not be
       
 61017 +// deleted by the caller.  Thread-safe.
       
 61018 +extern GOOGLE_GLOG_DLL_DECL Logger* GetLogger(LogSeverity level);
       
 61019 +
       
 61020 +// Set the logger for the specified severity level.  The logger
       
 61021 +// becomes the property of the logging module and should not
       
 61022 +// be deleted by the caller.  Thread-safe.
       
 61023 +extern GOOGLE_GLOG_DLL_DECL void SetLogger(LogSeverity level, Logger* logger);
       
 61024 +
       
 61025 +}
       
 61026 +
       
 61027 +// glibc has traditionally implemented two incompatible versions of
       
 61028 +// strerror_r(). There is a poorly defined convention for picking the
       
 61029 +// version that we want, but it is not clear whether it even works with
       
 61030 +// all versions of glibc.
       
 61031 +// So, instead, we provide this wrapper that automatically detects the
       
 61032 +// version that is in use, and then implements POSIX semantics.
       
 61033 +// N.B. In addition to what POSIX says, we also guarantee that "buf" will
       
 61034 +// be set to an empty string, if this function failed. This means, in most
       
 61035 +// cases, you do not need to check the error code and you can directly
       
 61036 +// use the value of "buf". It will never have an undefined value.
       
 61037 +GOOGLE_GLOG_DLL_DECL int posix_strerror_r(int err, char *buf, size_t len);
       
 61038 +
       
 61039 +
       
 61040 +// A class for which we define operator<<, which does nothing.
       
 61041 +class GOOGLE_GLOG_DLL_DECL NullStream : public LogMessage::LogStream {
       
 61042 + public:
       
 61043 +  // Initialize the LogStream so the messages can be written somewhere
       
 61044 +  // (they'll never be actually displayed). This will be needed if a
       
 61045 +  // NullStream& is implicitly converted to LogStream&, in which case
       
 61046 +  // the overloaded NullStream::operator<< will not be invoked.
       
 61047 +  NullStream() : LogMessage::LogStream(message_buffer_, 1, 0) { }
       
 61048 +  NullStream(const char* /*file*/, int /*line*/,
       
 61049 +             const CheckOpString& /*result*/) :
       
 61050 +      LogMessage::LogStream(message_buffer_, 1, 0) { }
       
 61051 +  NullStream &stream() { return *this; }
       
 61052 + private:
       
 61053 +  // A very short buffer for messages (which we discard anyway). This
       
 61054 +  // will be needed if NullStream& converted to LogStream& (e.g. as a
       
 61055 +  // result of a conditional expression).
       
 61056 +  char message_buffer_[2];
       
 61057 +};
       
 61058 +
       
 61059 +// Do nothing. This operator is inline, allowing the message to be
       
 61060 +// compiled away. The message will not be compiled away if we do
       
 61061 +// something like (flag ? LOG(INFO) : LOG(ERROR)) << message; when
       
 61062 +// SKIP_LOG=WARNING. In those cases, NullStream will be implicitly
       
 61063 +// converted to LogStream and the message will be computed and then
       
 61064 +// quietly discarded.
       
 61065 +template<class T>
       
 61066 +inline NullStream& operator<<(NullStream &str, const T &value) { return str; }
       
 61067 +
       
 61068 +// Similar to NullStream, but aborts the program (without stack
       
 61069 +// trace), like LogMessageFatal.
       
 61070 +class GOOGLE_GLOG_DLL_DECL NullStreamFatal : public NullStream {
       
 61071 + public:
       
 61072 +  NullStreamFatal() { }
       
 61073 +  NullStreamFatal(const char* file, int line, const CheckOpString& result) :
       
 61074 +      NullStream(file, line, result) { }
       
 61075 +  __attribute__ ((noreturn)) ~NullStreamFatal() { _exit(1); }
       
 61076 +};
       
 61077 +
       
 61078 +// Install a signal handler that will dump signal information and a stack
       
 61079 +// trace when the program crashes on certain signals.  We'll install the
       
 61080 +// signal handler for the following signals.
       
 61081 +//
       
 61082 +// SIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, and SIGTERM.
       
 61083 +//
       
 61084 +// By default, the signal handler will write the failure dump to the
       
 61085 +// standard error.  You can customize the destination by installing your
       
 61086 +// own writer function by InstallFailureWriter() below.
       
 61087 +//
       
 61088 +// Note on threading:
       
 61089 +//
       
 61090 +// The function should be called before threads are created, if you want
       
 61091 +// to use the failure signal handler for all threads.  The stack trace
       
 61092 +// will be shown only for the thread that receives the signal.  In other
       
 61093 +// words, stack traces of other threads won't be shown.
       
 61094 +GOOGLE_GLOG_DLL_DECL void InstallFailureSignalHandler();
       
 61095 +
       
 61096 +// Installs a function that is used for writing the failure dump.  "data"
       
 61097 +// is the pointer to the beginning of a message to be written, and "size"
       
 61098 +// is the size of the message.  You should not expect the data is
       
 61099 +// terminated with '\0'.
       
 61100 +GOOGLE_GLOG_DLL_DECL void InstallFailureWriter(
       
 61101 +    void (*writer)(const char* data, int size));
       
 61102 +
       
 61103 +}
       
 61104 +
       
 61105 +#endif // _LOGGING_H_
       
 61106 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/raw_logging.h b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/raw_logging.h
       
 61107 new file mode 100644
       
 61108 --- /dev/null
       
 61109 +++ b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/raw_logging.h
       
 61110 @@ -0,0 +1,185 @@
       
 61111 +// Copyright (c) 2006, Google Inc.
       
 61112 +// All rights reserved.
       
 61113 +//
       
 61114 +// Redistribution and use in source and binary forms, with or without
       
 61115 +// modification, are permitted provided that the following conditions are
       
 61116 +// met:
       
 61117 +//
       
 61118 +//     * Redistributions of source code must retain the above copyright
       
 61119 +// notice, this list of conditions and the following disclaimer.
       
 61120 +//     * Redistributions in binary form must reproduce the above
       
 61121 +// copyright notice, this list of conditions and the following disclaimer
       
 61122 +// in the documentation and/or other materials provided with the
       
 61123 +// distribution.
       
 61124 +//     * Neither the name of Google Inc. nor the names of its
       
 61125 +// contributors may be used to endorse or promote products derived from
       
 61126 +// this software without specific prior written permission.
       
 61127 +//
       
 61128 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 61129 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 61130 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 61131 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 61132 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 61133 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 61134 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 61135 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 61136 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 61137 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 61138 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 61139 +//
       
 61140 +// Author: Maxim Lifantsev
       
 61141 +//
       
 61142 +// Thread-safe logging routines that do not allocate any memory or
       
 61143 +// acquire any locks, and can therefore be used by low-level memory
       
 61144 +// allocation and synchronization code.
       
 61145 +
       
 61146 +#ifndef BASE_RAW_LOGGING_H_
       
 61147 +#define BASE_RAW_LOGGING_H_
       
 61148 +
       
 61149 +#include <time.h>
       
 61150 +
       
 61151 +namespace google {
       
 61152 +
       
 61153 +#include "glog/log_severity.h"
       
 61154 +#include "glog/vlog_is_on.h"
       
 61155 +
       
 61156 +// Annoying stuff for windows -- makes sure clients can import these functions
       
 61157 +#ifndef GOOGLE_GLOG_DLL_DECL
       
 61158 +# if defined(_WIN32) && !defined(__CYGWIN__)
       
 61159 +#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)
       
 61160 +# else
       
 61161 +#   define GOOGLE_GLOG_DLL_DECL
       
 61162 +# endif
       
 61163 +#endif
       
 61164 +
       
 61165 +// This is similar to LOG(severity) << format... and VLOG(level) << format..,
       
 61166 +// but
       
 61167 +// * it is to be used ONLY by low-level modules that can't use normal LOG()
       
 61168 +// * it is desiged to be a low-level logger that does not allocate any
       
 61169 +//   memory and does not need any locks, hence:
       
 61170 +// * it logs straight and ONLY to STDERR w/o buffering
       
 61171 +// * it uses an explicit format and arguments list
       
 61172 +// * it will silently chop off really long message strings
       
 61173 +// Usage example:
       
 61174 +//   RAW_LOG(ERROR, "Failed foo with %i: %s", status, error);
       
 61175 +//   RAW_VLOG(3, "status is %i", status);
       
 61176 +// These will print an almost standard log lines like this to stderr only:
       
 61177 +//   E0821 211317 file.cc:123] RAW: Failed foo with 22: bad_file
       
 61178 +//   I0821 211317 file.cc:142] RAW: status is 20
       
 61179 +#define RAW_LOG(severity, ...) \
       
 61180 +  do { \
       
 61181 +    switch (google::severity) {  \
       
 61182 +      case 0: \
       
 61183 +        RAW_LOG_INFO(__VA_ARGS__); \
       
 61184 +        break; \
       
 61185 +      case 1: \
       
 61186 +        RAW_LOG_WARNING(__VA_ARGS__); \
       
 61187 +        break; \
       
 61188 +      case 2: \
       
 61189 +        RAW_LOG_ERROR(__VA_ARGS__); \
       
 61190 +        break; \
       
 61191 +      case 3: \
       
 61192 +        RAW_LOG_FATAL(__VA_ARGS__); \
       
 61193 +        break; \
       
 61194 +      default: \
       
 61195 +        break; \
       
 61196 +    } \
       
 61197 +  } while (0)
       
 61198 +
       
 61199 +// The following STRIP_LOG testing is performed in the header file so that it's
       
 61200 +// possible to completely compile out the logging code and the log messages.
       
 61201 +#if STRIP_LOG == 0
       
 61202 +#define RAW_VLOG(verboselevel, ...) \
       
 61203 +  do { \
       
 61204 +    if (VLOG_IS_ON(verboselevel)) { \
       
 61205 +      RAW_LOG_INFO(__VA_ARGS__); \
       
 61206 +    } \
       
 61207 +  } while (0)
       
 61208 +#else
       
 61209 +#define RAW_VLOG(verboselevel, ...) RawLogStub__(0, __VA_ARGS__)
       
 61210 +#endif // STRIP_LOG == 0
       
 61211 +
       
 61212 +#if STRIP_LOG == 0
       
 61213 +#define RAW_LOG_INFO(...) google::RawLog__(google::INFO, \
       
 61214 +                                   __FILE__, __LINE__, __VA_ARGS__)
       
 61215 +#else
       
 61216 +#define RAW_LOG_INFO(...) google::RawLogStub__(0, __VA_ARGS__)
       
 61217 +#endif // STRIP_LOG == 0
       
 61218 +
       
 61219 +#if STRIP_LOG <= 1
       
 61220 +#define RAW_LOG_WARNING(...) google::RawLog__(google::WARNING,   \
       
 61221 +                                      __FILE__, __LINE__, __VA_ARGS__)
       
 61222 +#else
       
 61223 +#define RAW_LOG_WARNING(...) google::RawLogStub__(0, __VA_ARGS__)
       
 61224 +#endif // STRIP_LOG <= 1
       
 61225 +
       
 61226 +#if STRIP_LOG <= 2
       
 61227 +#define RAW_LOG_ERROR(...) google::RawLog__(google::ERROR,       \
       
 61228 +                                    __FILE__, __LINE__, __VA_ARGS__)
       
 61229 +#else
       
 61230 +#define RAW_LOG_ERROR(...) google::RawLogStub__(0, __VA_ARGS__)
       
 61231 +#endif // STRIP_LOG <= 2
       
 61232 +
       
 61233 +#if STRIP_LOG <= 3
       
 61234 +#define RAW_LOG_FATAL(...) google::RawLog__(google::FATAL,       \
       
 61235 +                                    __FILE__, __LINE__, __VA_ARGS__)
       
 61236 +#else
       
 61237 +#define RAW_LOG_FATAL(...) \
       
 61238 +  do { \
       
 61239 +    google::RawLogStub__(0, __VA_ARGS__);        \
       
 61240 +    exit(1); \
       
 61241 +  } while (0)
       
 61242 +#endif // STRIP_LOG <= 3
       
 61243 +
       
 61244 +// Similar to CHECK(condition) << message,
       
 61245 +// but for low-level modules: we use only RAW_LOG that does not allocate memory.
       
 61246 +// We do not want to provide args list here to encourage this usage:
       
 61247 +//   if (!cond)  RAW_LOG(FATAL, "foo ...", hard_to_compute_args);
       
 61248 +// so that the args are not computed when not needed.
       
 61249 +#define RAW_CHECK(condition, message)                                   \
       
 61250 +  do {                                                                  \
       
 61251 +    if (!(condition)) {                                                 \
       
 61252 +      RAW_LOG(FATAL, "Check %s failed: %s", #condition, message);       \
       
 61253 +    }                                                                   \
       
 61254 +  } while (0)
       
 61255 +
       
 61256 +// Debug versions of RAW_LOG and RAW_CHECK
       
 61257 +#ifndef NDEBUG
       
 61258 +
       
 61259 +#define RAW_DLOG(severity, ...) RAW_LOG(severity, __VA_ARGS__)
       
 61260 +#define RAW_DCHECK(condition, message) RAW_CHECK(condition, message)
       
 61261 +
       
 61262 +#else  // NDEBUG
       
 61263 +
       
 61264 +#define RAW_DLOG(severity, ...)                                 \
       
 61265 +  while (false)                                                 \
       
 61266 +    RAW_LOG(severity, __VA_ARGS__)
       
 61267 +#define RAW_DCHECK(condition, message) \
       
 61268 +  while (false) \
       
 61269 +    RAW_CHECK(condition, message)
       
 61270 +
       
 61271 +#endif  // NDEBUG
       
 61272 +
       
 61273 +// Stub log function used to work around for unused variable warnings when
       
 61274 +// building with STRIP_LOG > 0.
       
 61275 +static inline void RawLogStub__(int ignored, ...) {
       
 61276 +}
       
 61277 +
       
 61278 +// Helper function to implement RAW_LOG and RAW_VLOG
       
 61279 +// Logs format... at "severity" level, reporting it
       
 61280 +// as called from file:line.
       
 61281 +// This does not allocate memory or acquire locks.
       
 61282 +GOOGLE_GLOG_DLL_DECL void RawLog__(LogSeverity severity,
       
 61283 +                                   const char* file,
       
 61284 +                                   int line,
       
 61285 +                                   const char* format, ...)
       
 61286 +   __attribute__((__format__ (__printf__, 4, 5)));
       
 61287 +
       
 61288 +// Hack to propagate time information into this module so that
       
 61289 +// this module does not have to directly call localtime_r(),
       
 61290 +// which could allocate memory.
       
 61291 +GOOGLE_GLOG_DLL_DECL void RawLog__SetLastTime(const struct tm& t, int usecs);
       
 61292 +
       
 61293 +}
       
 61294 +
       
 61295 +#endif  // BASE_RAW_LOGGING_H_
       
 61296 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/stl_logging.h b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/stl_logging.h
       
 61297 new file mode 100644
       
 61298 --- /dev/null
       
 61299 +++ b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/stl_logging.h
       
 61300 @@ -0,0 +1,154 @@
       
 61301 +// Copyright (c) 2003, Google Inc.
       
 61302 +// All rights reserved.
       
 61303 +//
       
 61304 +// Redistribution and use in source and binary forms, with or without
       
 61305 +// modification, are permitted provided that the following conditions are
       
 61306 +// met:
       
 61307 +//
       
 61308 +//     * Redistributions of source code must retain the above copyright
       
 61309 +// notice, this list of conditions and the following disclaimer.
       
 61310 +//     * Redistributions in binary form must reproduce the above
       
 61311 +// copyright notice, this list of conditions and the following disclaimer
       
 61312 +// in the documentation and/or other materials provided with the
       
 61313 +// distribution.
       
 61314 +//     * Neither the name of Google Inc. nor the names of its
       
 61315 +// contributors may be used to endorse or promote products derived from
       
 61316 +// this software without specific prior written permission.
       
 61317 +//
       
 61318 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 61319 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 61320 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 61321 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 61322 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 61323 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 61324 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 61325 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 61326 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 61327 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 61328 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 61329 +//
       
 61330 +// Stream output operators for STL containers; to be used for logging *only*.
       
 61331 +// Inclusion of this file lets you do:
       
 61332 +//
       
 61333 +// list<string> x;
       
 61334 +// LOG(INFO) << "data: " << x;
       
 61335 +// vector<int> v1, v2;
       
 61336 +// CHECK_EQ(v1, v2);
       
 61337 +//
       
 61338 +// Note that if you want to use these operators from the non-global namespace,
       
 61339 +// you may get an error since they are not in namespace std (and they are not
       
 61340 +// in namespace std since that would result in undefined behavior). You may
       
 61341 +// need to write
       
 61342 +//
       
 61343 +//   using ::operator<<;
       
 61344 +//
       
 61345 +// to fix these errors.
       
 61346 +
       
 61347 +#ifndef UTIL_GTL_STL_LOGGING_INL_H_
       
 61348 +#define UTIL_GTL_STL_LOGGING_INL_H_
       
 61349 +
       
 61350 +#if !1
       
 61351 +# error We do not support stl_logging for this compiler
       
 61352 +#endif
       
 61353 +
       
 61354 +#include <deque>
       
 61355 +#include <list>
       
 61356 +#include <map>
       
 61357 +#include <ostream>
       
 61358 +#include <set>
       
 61359 +#include <utility>
       
 61360 +#include <vector>
       
 61361 +
       
 61362 +#ifdef __GNUC__
       
 61363 +# include <ext/hash_set>
       
 61364 +# include <ext/hash_map>
       
 61365 +# include <ext/slist>
       
 61366 +#endif
       
 61367 +
       
 61368 +template<class First, class Second>
       
 61369 +inline std::ostream& operator<<(std::ostream& out,
       
 61370 +                                const std::pair<First, Second>& p) {
       
 61371 +  out << '(' << p.first << ", " << p.second << ')';
       
 61372 +  return out;
       
 61373 +}
       
 61374 +
       
 61375 +namespace google {
       
 61376 +
       
 61377 +template<class Iter>
       
 61378 +inline void PrintSequence(std::ostream& out, Iter begin, Iter end) {
       
 61379 +  using ::operator<<;
       
 61380 +  // Output at most 100 elements -- appropriate if used for logging.
       
 61381 +  for (int i = 0; begin != end && i < 100; ++i, ++begin) {
       
 61382 +    if (i > 0) out << ' ';
       
 61383 +    out << *begin;
       
 61384 +  }
       
 61385 +  if (begin != end) {
       
 61386 +    out << " ...";
       
 61387 +  }
       
 61388 +}
       
 61389 +
       
 61390 +}
       
 61391 +
       
 61392 +#define OUTPUT_TWO_ARG_CONTAINER(Sequence) \
       
 61393 +template<class T1, class T2> \
       
 61394 +inline std::ostream& operator<<(std::ostream& out, \
       
 61395 +                                const Sequence<T1, T2>& seq) { \
       
 61396 +  google::PrintSequence(out, seq.begin(), seq.end()); \
       
 61397 +  return out; \
       
 61398 +}
       
 61399 +
       
 61400 +OUTPUT_TWO_ARG_CONTAINER(std::vector)
       
 61401 +OUTPUT_TWO_ARG_CONTAINER(std::deque)
       
 61402 +OUTPUT_TWO_ARG_CONTAINER(std::list)
       
 61403 +#ifdef __GNUC__
       
 61404 +OUTPUT_TWO_ARG_CONTAINER(__gnu_cxx::slist)
       
 61405 +#endif
       
 61406 +
       
 61407 +#undef OUTPUT_TWO_ARG_CONTAINER
       
 61408 +
       
 61409 +#define OUTPUT_THREE_ARG_CONTAINER(Sequence) \
       
 61410 +template<class T1, class T2, class T3> \
       
 61411 +inline std::ostream& operator<<(std::ostream& out, \
       
 61412 +                                const Sequence<T1, T2, T3>& seq) { \
       
 61413 +  google::PrintSequence(out, seq.begin(), seq.end()); \
       
 61414 +  return out; \
       
 61415 +}
       
 61416 +
       
 61417 +OUTPUT_THREE_ARG_CONTAINER(std::set)
       
 61418 +OUTPUT_THREE_ARG_CONTAINER(std::multiset)
       
 61419 +
       
 61420 +#undef OUTPUT_THREE_ARG_CONTAINER
       
 61421 +
       
 61422 +#define OUTPUT_FOUR_ARG_CONTAINER(Sequence) \
       
 61423 +template<class T1, class T2, class T3, class T4> \
       
 61424 +inline std::ostream& operator<<(std::ostream& out, \
       
 61425 +                                const Sequence<T1, T2, T3, T4>& seq) { \
       
 61426 +  google::PrintSequence(out, seq.begin(), seq.end()); \
       
 61427 +  return out; \
       
 61428 +}
       
 61429 +
       
 61430 +OUTPUT_FOUR_ARG_CONTAINER(std::map)
       
 61431 +OUTPUT_FOUR_ARG_CONTAINER(std::multimap)
       
 61432 +#ifdef __GNUC__
       
 61433 +OUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_set)
       
 61434 +OUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_multiset)
       
 61435 +#endif
       
 61436 +
       
 61437 +#undef OUTPUT_FOUR_ARG_CONTAINER
       
 61438 +
       
 61439 +#define OUTPUT_FIVE_ARG_CONTAINER(Sequence) \
       
 61440 +template<class T1, class T2, class T3, class T4, class T5> \
       
 61441 +inline std::ostream& operator<<(std::ostream& out, \
       
 61442 +                                const Sequence<T1, T2, T3, T4, T5>& seq) { \
       
 61443 +  google::PrintSequence(out, seq.begin(), seq.end()); \
       
 61444 +  return out; \
       
 61445 +}
       
 61446 +
       
 61447 +#ifdef __GNUC__
       
 61448 +OUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_map)
       
 61449 +OUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_multimap)
       
 61450 +#endif
       
 61451 +
       
 61452 +#undef OUTPUT_FIVE_ARG_CONTAINER
       
 61453 +
       
 61454 +#endif  // UTIL_GTL_STL_LOGGING_INL_H_
       
 61455 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/vlog_is_on.h b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/vlog_is_on.h
       
 61456 new file mode 100644
       
 61457 --- /dev/null
       
 61458 +++ b/toolkit/crashreporter/google-breakpad/src/third_party/linux/include/glog/vlog_is_on.h
       
 61459 @@ -0,0 +1,128 @@
       
 61460 +// Copyright (c) 1999, 2007, Google Inc.
       
 61461 +// All rights reserved.
       
 61462 +//
       
 61463 +// Redistribution and use in source and binary forms, with or without
       
 61464 +// modification, are permitted provided that the following conditions are
       
 61465 +// met:
       
 61466 +//
       
 61467 +//     * Redistributions of source code must retain the above copyright
       
 61468 +// notice, this list of conditions and the following disclaimer.
       
 61469 +//     * Redistributions in binary form must reproduce the above
       
 61470 +// copyright notice, this list of conditions and the following disclaimer
       
 61471 +// in the documentation and/or other materials provided with the
       
 61472 +// distribution.
       
 61473 +//     * Neither the name of Google Inc. nor the names of its
       
 61474 +// contributors may be used to endorse or promote products derived from
       
 61475 +// this software without specific prior written permission.
       
 61476 +//
       
 61477 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 61478 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 61479 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 61480 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 61481 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 61482 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 61483 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 61484 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 61485 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 61486 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 61487 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 61488 +//
       
 61489 +// Author: Ray Sidney and many others
       
 61490 +//
       
 61491 +// Defines the VLOG_IS_ON macro that controls the variable-verbosity
       
 61492 +// conditional logging.
       
 61493 +//
       
 61494 +// It's used by VLOG and VLOG_IF in logging.h
       
 61495 +// and by RAW_VLOG in raw_logging.h to trigger the logging.
       
 61496 +//
       
 61497 +// It can also be used directly e.g. like this:
       
 61498 +//   if (VLOG_IS_ON(2)) {
       
 61499 +//     // do some logging preparation and logging
       
 61500 +//     // that can't be accomplished e.g. via just VLOG(2) << ...;
       
 61501 +//   }
       
 61502 +//
       
 61503 +// The truth value that VLOG_IS_ON(level) returns is determined by 
       
 61504 +// the three verbosity level flags:
       
 61505 +//   --v=<n>  Gives the default maximal active V-logging level;
       
 61506 +//            0 is the default.
       
 61507 +//            Normally positive values are used for V-logging levels.
       
 61508 +//   --vmodule=<str>  Gives the per-module maximal V-logging levels to override
       
 61509 +//                    the value given by --v.
       
 61510 +//                    E.g. "my_module=2,foo*=3" would change the logging level
       
 61511 +//                    for all code in source files "my_module.*" and "foo*.*"
       
 61512 +//                    ("-inl" suffixes are also disregarded for this matching).
       
 61513 +//
       
 61514 +// SetVLOGLevel helper function is provided to do limited dynamic control over
       
 61515 +// V-logging by overriding the per-module settings given via --vmodule flag.
       
 61516 +//
       
 61517 +// CAVEAT: --vmodule functionality is not available in non gcc compilers.
       
 61518 +//
       
 61519 +
       
 61520 +#ifndef BASE_VLOG_IS_ON_H_
       
 61521 +#define BASE_VLOG_IS_ON_H_
       
 61522 +
       
 61523 +#include "glog/log_severity.h"
       
 61524 +
       
 61525 +// Annoying stuff for windows -- makes sure clients can import these functions
       
 61526 +#ifndef GOOGLE_GLOG_DLL_DECL
       
 61527 +# if defined(_WIN32) && !defined(__CYGWIN__)
       
 61528 +#   define GOOGLE_GLOG_DLL_DECL  __declspec(dllimport)
       
 61529 +# else
       
 61530 +#   define GOOGLE_GLOG_DLL_DECL
       
 61531 +# endif
       
 61532 +#endif
       
 61533 +
       
 61534 +#if defined(__GNUC__)
       
 61535 +// We emit an anonymous static int* variable at every VLOG_IS_ON(n) site.
       
 61536 +// (Normally) the first time every VLOG_IS_ON(n) site is hit,
       
 61537 +// we determine what variable will dynamically control logging at this site:
       
 61538 +// it's either FLAGS_v or an appropriate internal variable
       
 61539 +// matching the current source file that represents results of
       
 61540 +// parsing of --vmodule flag and/or SetVLOGLevel calls.
       
 61541 +#define VLOG_IS_ON(verboselevel)                                \
       
 61542 +  ({ static google::int32* vlocal__ = &google::kLogSiteUninitialized;           \
       
 61543 +     google::int32 verbose_level__ = (verboselevel);                    \
       
 61544 +     (*vlocal__ >= verbose_level__) &&                          \
       
 61545 +     ((vlocal__ != &google::kLogSiteUninitialized) ||                   \
       
 61546 +      (google::InitVLOG3__(&vlocal__, &FLAGS_v,                         \
       
 61547 +                   __FILE__, verbose_level__))); })
       
 61548 +#else
       
 61549 +// GNU extensions not available, so we do not support --vmodule.
       
 61550 +// Dynamic value of FLAGS_v always controls the logging level.
       
 61551 +#define VLOG_IS_ON(verboselevel) (FLAGS_v >= (verboselevel))
       
 61552 +#endif
       
 61553 +
       
 61554 +// Set VLOG(_IS_ON) level for module_pattern to log_level.
       
 61555 +// This lets us dynamically control what is normally set by the --vmodule flag.
       
 61556 +// Returns the level that previously applied to module_pattern.
       
 61557 +// NOTE: To change the log level for VLOG(_IS_ON) sites
       
 61558 +//	 that have already executed after/during InitGoogleLogging,
       
 61559 +//	 one needs to supply the exact --vmodule pattern that applied to them.
       
 61560 +//       (If no --vmodule pattern applied to them
       
 61561 +//       the value of FLAGS_v will continue to control them.)
       
 61562 +extern GOOGLE_GLOG_DLL_DECL int SetVLOGLevel(const char* module_pattern,
       
 61563 +                                             int log_level);
       
 61564 +
       
 61565 +// Various declarations needed for VLOG_IS_ON above: =========================
       
 61566 +
       
 61567 +// Special value used to indicate that a VLOG_IS_ON site has not been
       
 61568 +// initialized.  We make this a large value, so the common-case check
       
 61569 +// of "*vlocal__ >= verbose_level__" in VLOG_IS_ON definition
       
 61570 +// passes in such cases and InitVLOG3__ is then triggered.
       
 61571 +extern google::int32 kLogSiteUninitialized;
       
 61572 +
       
 61573 +// Helper routine which determines the logging info for a particalur VLOG site.
       
 61574 +//   site_flag     is the address of the site-local pointer to the controlling
       
 61575 +//                 verbosity level
       
 61576 +//   site_default  is the default to use for *site_flag
       
 61577 +//   fname         is the current source file name
       
 61578 +//   verbose_level is the argument to VLOG_IS_ON
       
 61579 +// We will return the return value for VLOG_IS_ON
       
 61580 +// and if possible set *site_flag appropriately.
       
 61581 +extern GOOGLE_GLOG_DLL_DECL bool InitVLOG3__(
       
 61582 +    google::int32** site_flag,
       
 61583 +    google::int32* site_default,
       
 61584 +    const char* fname,
       
 61585 +    google::int32 verbose_level);
       
 61586 +
       
 61587 +#endif  // BASE_VLOG_IS_ON_H_
       
 61588 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/lib/gflags/libgflags.a b/toolkit/crashreporter/google-breakpad/src/third_party/linux/lib/gflags/libgflags.a
       
 61589 new file mode 100644
       
 61590 index 0000000000000000000000000000000000000000..c0de874c969cb05c58fa24af1293f65642b26dc0
       
 61591 GIT binary patch
       
 61592 literal 390804
       
 61593 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
       
 63337 M&49N8-UIl50Z6-5d;kCd
       
 63338 
       
 63339 diff --git a/toolkit/crashreporter/google-breakpad/src/third_party/linux/lib/glog/libglog.a b/toolkit/crashreporter/google-breakpad/src/third_party/linux/lib/glog/libglog.a
       
 63340 new file mode 100644
       
 63341 index 0000000000000000000000000000000000000000..8d2afaef645de7ae6ba30a1b855f75343f689383
       
 63342 GIT binary patch
       
 63343 literal 226928
       
 63344 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
       
 64562 
       
 64563 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/dump_syms.cc b/toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/dump_syms.cc
       
 64564 --- a/toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/dump_syms.cc
       
 64565 +++ b/toolkit/crashreporter/google-breakpad/src/tools/linux/dump_syms/dump_syms.cc
       
 64566 @@ -38,15 +38,15 @@ int main(int argc, char **argv) {
       
 64567    if (argc != 2) {
       
 64568      fprintf(stderr, "Usage: %s <binary-with-stab-symbol>\n", argv[0]);
       
 64569      return 1;
       
 64570    }
       
 64571  
       
 64572    const char *binary = argv[1];
       
 64573  
       
 64574    DumpSymbols dumper;
       
 64575 -  if (!dumper.WriteSymbolFile(binary, fileno(stdout))) {
       
 64576 +  if (!dumper.WriteSymbolFile(binary, stdout)) {
       
 64577      fprintf(stderr, "Failed to write symbol file.\n");
       
 64578      return 1;
       
 64579    }
       
 64580  
       
 64581    return 0;
       
 64582  }
       
 64583 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/linux/md2core/minidump-2-core.cc b/toolkit/crashreporter/google-breakpad/src/tools/linux/md2core/minidump-2-core.cc
       
 64584 new file mode 100644
       
 64585 --- /dev/null
       
 64586 +++ b/toolkit/crashreporter/google-breakpad/src/tools/linux/md2core/minidump-2-core.cc
       
 64587 @@ -0,0 +1,603 @@
       
 64588 +// Copyright (c) 2009, Google Inc.
       
 64589 +// All rights reserved.
       
 64590 +//
       
 64591 +// Redistribution and use in source and binary forms, with or without
       
 64592 +// modification, are permitted provided that the following conditions are
       
 64593 +// met:
       
 64594 +//
       
 64595 +//     * Redistributions of source code must retain the above copyright
       
 64596 +// notice, this list of conditions and the following disclaimer.
       
 64597 +//     * Redistributions in binary form must reproduce the above
       
 64598 +// copyright notice, this list of conditions and the following disclaimer
       
 64599 +// in the documentation and/or other materials provided with the
       
 64600 +// distribution.
       
 64601 +//     * Neither the name of Google Inc. nor the names of its
       
 64602 +// contributors may be used to endorse or promote products derived from
       
 64603 +// this software without specific prior written permission.
       
 64604 +//
       
 64605 +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
 64606 +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
 64607 +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
 64608 +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
       
 64609 +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
       
 64610 +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
       
 64611 +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
 64612 +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 64613 +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 64614 +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 64615 +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 64616 +
       
 64617 +// Converts a minidump file to a core file which gdb can read.
       
 64618 +// Large parts lifted from the userspace core dumper:
       
 64619 +//   http://code.google.com/p/google-coredumper/
       
 64620 +//
       
 64621 +// Usage: minidump-2-core 1234.dmp > core
       
 64622 +
       
 64623 +#include <vector>
       
 64624 +
       
 64625 +#include <stdio.h>
       
 64626 +#include <string.h>
       
 64627 +
       
 64628 +#include <elf.h>
       
 64629 +#include <errno.h>
       
 64630 +#include <unistd.h>
       
 64631 +#include <fcntl.h>
       
 64632 +#include <sys/user.h>
       
 64633 +#include <sys/mman.h>
       
 64634 +
       
 64635 +#include "google_breakpad/common/minidump_format.h"
       
 64636 +#include "google_breakpad/common/minidump_cpu_x86.h"
       
 64637 +#include "common/linux/linux_syscall_support.h"
       
 64638 +#include "common/linux/minidump_format_linux.h"
       
 64639 +
       
 64640 +#if __WORDSIZE == 64
       
 64641 +  #define ELF_CLASS ELFCLASS64
       
 64642 +  #define Ehdr      Elf64_Ehdr
       
 64643 +  #define Phdr      Elf64_Phdr
       
 64644 +  #define Shdr      Elf64_Shdr
       
 64645 +  #define Nhdr      Elf64_Nhdr
       
 64646 +  #define auxv_t    Elf64_auxv_t
       
 64647 +#else
       
 64648 +  #define ELF_CLASS ELFCLASS32
       
 64649 +  #define Ehdr      Elf32_Ehdr
       
 64650 +  #define Phdr      Elf32_Phdr
       
 64651 +  #define Shdr      Elf32_Shdr
       
 64652 +  #define Nhdr      Elf32_Nhdr
       
 64653 +  #define auxv_t    Elf32_auxv_t
       
 64654 +#endif
       
 64655 +
       
 64656 +
       
 64657 +#if defined(__x86_64__)
       
 64658 +  #define ELF_ARCH  EM_X86_64
       
 64659 +#elif defined(__i386__)
       
 64660 +  #define ELF_ARCH  EM_386
       
 64661 +#elif defined(__ARM_ARCH_3__)
       
 64662 +  #define ELF_ARCH  EM_ARM
       
 64663 +#elif defined(__mips__)
       
 64664 +  #define ELF_ARCH  EM_MIPS
       
 64665 +#endif
       
 64666 +
       
 64667 +static int usage(const char* argv0) {
       
 64668 +  fprintf(stderr, "Usage: %s <minidump file>\n", argv0);
       
 64669 +  return 1;
       
 64670 +}
       
 64671 +
       
 64672 +// Write all of the given buffer, handling short writes and EINTR. Return true
       
 64673 +// iff successful.
       
 64674 +static bool
       
 64675 +writea(int fd, const void* idata, size_t length) {
       
 64676 +  const uint8_t* data = (const uint8_t*) idata;
       
 64677 +
       
 64678 +  size_t done = 0;
       
 64679 +  while (done < length) {
       
 64680 +    ssize_t r;
       
 64681 +    do {
       
 64682 +      r = write(fd, data + done, length - done);
       
 64683 +    } while (r == -1 && errno == EINTR);
       
 64684 +
       
 64685 +    if (r < 1)
       
 64686 +      return false;
       
 64687 +    done += r;
       
 64688 +  }
       
 64689 +
       
 64690 +  return true;
       
 64691 +}
       
 64692 +
       
 64693 +// A range of a mmaped file.
       
 64694 +class MMappedRange {
       
 64695 + public:
       
 64696 +  MMappedRange(const void* data, size_t length)
       
 64697 +      : data_(reinterpret_cast<const uint8_t*>(data)),
       
 64698 +        length_(length) {
       
 64699 +  }
       
 64700 +
       
 64701 +  // Get an object of |length| bytes at |offset| and return a pointer to it
       
 64702 +  // unless it's out of bounds.
       
 64703 +  const void* GetObject(size_t offset, size_t length) {
       
 64704 +    if (offset + length < offset)
       
 64705 +      return NULL;
       
 64706 +    if (offset + length > length_)
       
 64707 +      return NULL;
       
 64708 +    return data_ + offset;
       
 64709 +  }
       
 64710 +
       
 64711 +  // Get element |index| of an array of objects of length |length| starting at
       
 64712 +  // |offset| bytes. Return NULL if out of bounds.
       
 64713 +  const void* GetArrayElement(size_t offset, size_t length, unsigned index) {
       
 64714 +    const size_t element_offset = offset + index * length;
       
 64715 +    return GetObject(element_offset, length);
       
 64716 +  }
       
 64717 +
       
 64718 +  // Return a new range which is a subset of this range.
       
 64719 +  MMappedRange Subrange(const MDLocationDescriptor& location) const {
       
 64720 +    if (location.rva > length_ ||
       
 64721 +        location.rva + location.data_size < location.rva ||
       
 64722 +        location.rva + location.data_size > length_) {
       
 64723 +      return MMappedRange(NULL, 0);
       
 64724 +    }
       
 64725 +
       
 64726 +    return MMappedRange(data_ + location.rva, location.data_size);
       
 64727 +  }
       
 64728 +
       
 64729 +  const uint8_t* data() const { return data_; }
       
 64730 +  size_t length() const { return length_; }
       
 64731 +
       
 64732 + private:
       
 64733 +  const uint8_t* const data_;
       
 64734 +  const size_t length_;
       
 64735 +};
       
 64736 +
       
 64737 +/* Dynamically determines the byte sex of the system. Returns non-zero
       
 64738 + * for big-endian machines.
       
 64739 + */
       
 64740 +static inline int sex() {
       
 64741 +  int probe = 1;
       
 64742 +  return !*(char *)&probe;
       
 64743 +}
       
 64744 +
       
 64745 +typedef struct elf_timeval {    /* Time value with microsecond resolution    */
       
 64746 +  long tv_sec;                  /* Seconds                                   */
       
 64747 +  long tv_usec;                 /* Microseconds                              */
       
 64748 +} elf_timeval;
       
 64749 +
       
 64750 +typedef struct elf_siginfo {    /* Information about signal (unused)         */
       
 64751 +  int32_t si_signo;             /* Signal number                             */
       
 64752 +  int32_t si_code;              /* Extra code                                */
       
 64753 +  int32_t si_errno;             /* Errno                                     */
       
 64754 +} elf_siginfo;
       
 64755 +
       
 64756 +typedef struct prstatus {       /* Information about thread; includes CPU reg*/
       
 64757 +  elf_siginfo    pr_info;       /* Info associated with signal               */
       
 64758 +  uint16_t       pr_cursig;     /* Current signal                            */
       
 64759 +  unsigned long  pr_sigpend;    /* Set of pending signals                    */
       
 64760 +  unsigned long  pr_sighold;    /* Set of held signals                       */
       
 64761 +  pid_t          pr_pid;        /* Process ID                                */
       
 64762 +  pid_t          pr_ppid;       /* Parent's process ID                       */
       
 64763 +  pid_t          pr_pgrp;       /* Group ID                                  */
       
 64764 +  pid_t          pr_sid;        /* Session ID                                */
       
 64765 +  elf_timeval    pr_utime;      /* User time                                 */
       
 64766 +  elf_timeval    pr_stime;      /* System time                               */
       
 64767 +  elf_timeval    pr_cutime;     /* Cumulative user time                      */
       
 64768 +  elf_timeval    pr_cstime;     /* Cumulative system time                    */
       
 64769 +  user_regs_struct pr_reg;      /* CPU registers                             */
       
 64770 +  uint32_t       pr_fpvalid;    /* True if math co-processor being used      */
       
 64771 +} prstatus;
       
 64772 +
       
 64773 +typedef struct prpsinfo {       /* Information about process                 */
       
 64774 +  unsigned char  pr_state;      /* Numeric process state                     */
       
 64775 +  char           pr_sname;      /* Char for pr_state                         */
       
 64776 +  unsigned char  pr_zomb;       /* Zombie                                    */
       
 64777 +  signed char    pr_nice;       /* Nice val                                  */
       
 64778 +  unsigned long  pr_flag;       /* Flags                                     */
       
 64779 +#if defined(__x86_64__) || defined(__mips__)
       
 64780 +  uint32_t       pr_uid;        /* User ID                                   */
       
 64781 +  uint32_t       pr_gid;        /* Group ID                                  */
       
 64782 +#else
       
 64783 +  uint16_t       pr_uid;        /* User ID                                   */
       
 64784 +  uint16_t       pr_gid;        /* Group ID                                  */
       
 64785 +#endif
       
 64786 +  pid_t          pr_pid;        /* Process ID                                */
       
 64787 +  pid_t          pr_ppid;       /* Parent's process ID                       */
       
 64788 +  pid_t          pr_pgrp;       /* Group ID                                  */
       
 64789 +  pid_t          pr_sid;        /* Session ID                                */
       
 64790 +  char           pr_fname[16];  /* Filename of executable                    */
       
 64791 +  char           pr_psargs[80]; /* Initial part of arg list                  */
       
 64792 +} prpsinfo;
       
 64793 +
       
 64794 +// We parse the minidump file and keep the parsed information in this structure.
       
 64795 +struct CrashedProcess {
       
 64796 +  CrashedProcess()
       
 64797 +      : crashing_tid(-1),
       
 64798 +        auxv(NULL),
       
 64799 +        auxv_length(0) {
       
 64800 +    memset(&prps, 0, sizeof(prps));
       
 64801 +    prps.pr_sname = 'R';
       
 64802 +  }
       
 64803 +
       
 64804 +  struct Mapping {
       
 64805 +    uint64_t start_address, end_address;
       
 64806 +  };
       
 64807 +  std::vector<Mapping> mappings;
       
 64808 +
       
 64809 +  pid_t crashing_tid;
       
 64810 +  int fatal_signal;
       
 64811 +
       
 64812 +  struct Thread {
       
 64813 +    pid_t tid;
       
 64814 +    user_regs_struct regs;
       
 64815 +    user_fpregs_struct fpregs;
       
 64816 +    user_fpxregs_struct fpxregs;
       
 64817 +    uintptr_t stack_addr;
       
 64818 +    const uint8_t* stack;
       
 64819 +    size_t stack_length;
       
 64820 +  };
       
 64821 +  std::vector<Thread> threads;
       
 64822 +
       
 64823 +  const uint8_t* auxv;
       
 64824 +  size_t auxv_length;
       
 64825 +
       
 64826 +  prpsinfo prps;
       
 64827 +};
       
 64828 +
       
 64829 +static uint32_t
       
 64830 +U32(const uint8_t* data) {
       
 64831 +  uint32_t v;
       
 64832 +  memcpy(&v, data, sizeof(v));
       
 64833 +  return v;
       
 64834 +}
       
 64835 +
       
 64836 +static uint16_t
       
 64837 +U16(const uint8_t* data) {
       
 64838 +  uint16_t v;
       
 64839 +  memcpy(&v, data, sizeof(v));
       
 64840 +  return v;
       
 64841 +}
       
 64842 +
       
 64843 +#if defined(__i386__)
       
 64844 +static void
       
 64845 +ParseThreadRegisters(CrashedProcess::Thread* thread, MMappedRange range) {
       
 64846 +  const MDRawContextX86* rawregs =
       
 64847 +      (const MDRawContextX86*) range.GetObject(0, sizeof(MDRawContextX86));
       
 64848 +
       
 64849 +  thread->regs.ebx = rawregs->ebx;
       
 64850 +  thread->regs.ecx = rawregs->ecx;
       
 64851 +  thread->regs.edx = rawregs->edx;
       
 64852 +  thread->regs.esi = rawregs->esi;
       
 64853 +  thread->regs.edi = rawregs->edi;
       
 64854 +  thread->regs.ebp = rawregs->ebp;
       
 64855 +  thread->regs.eax = rawregs->eax;
       
 64856 +  thread->regs.xds = rawregs->ds;
       
 64857 +  thread->regs.xes = rawregs->es;
       
 64858 +  thread->regs.xfs = rawregs->fs;
       
 64859 +  thread->regs.xgs = rawregs->gs;
       
 64860 +  thread->regs.orig_eax = rawregs->eax;
       
 64861 +  thread->regs.eip = rawregs->eip;
       
 64862 +  thread->regs.xcs = rawregs->cs;
       
 64863 +  thread->regs.eflags = rawregs->eflags;
       
 64864 +  thread->regs.esp = rawregs->esp;
       
 64865 +  thread->regs.xss = rawregs->ss;
       
 64866 +
       
 64867 +  thread->fpregs.cwd = rawregs->float_save.control_word;
       
 64868 +  thread->fpregs.swd = rawregs->float_save.status_word;
       
 64869 +  thread->fpregs.twd = rawregs->float_save.tag_word;
       
 64870 +  thread->fpregs.fip = rawregs->float_save.error_offset;
       
 64871 +  thread->fpregs.fcs = rawregs->float_save.error_selector;
       
 64872 +  thread->fpregs.foo = rawregs->float_save.data_offset;
       
 64873 +  thread->fpregs.fos = rawregs->float_save.data_selector;
       
 64874 +  memcpy(thread->fpregs.st_space, rawregs->float_save.register_area,
       
 64875 +         10 * 8);
       
 64876 +
       
 64877 +  thread->fpxregs.cwd = rawregs->float_save.control_word;
       
 64878 +  thread->fpxregs.swd = rawregs->float_save.status_word;
       
 64879 +  thread->fpxregs.twd = rawregs->float_save.tag_word;
       
 64880 +  thread->fpxregs.fop = U16(rawregs->extended_registers + 6);
       
 64881 +  thread->fpxregs.fip = U16(rawregs->extended_registers + 8);
       
 64882 +  thread->fpxregs.fcs = U16(rawregs->extended_registers + 12);
       
 64883 +  thread->fpxregs.foo = U16(rawregs->extended_registers + 16);
       
 64884 +  thread->fpxregs.fos = U16(rawregs->extended_registers + 20);
       
 64885 +  thread->fpxregs.mxcsr = U32(rawregs->extended_registers + 24);
       
 64886 +  memcpy(thread->fpxregs.st_space, rawregs->extended_registers + 32, 128);
       
 64887 +  memcpy(thread->fpxregs.xmm_space, rawregs->extended_registers + 160, 128);
       
 64888 +}
       
 64889 +#else
       
 64890 +#error "This code has not been ported to your platform yet"
       
 64891 +#endif
       
 64892 +
       
 64893 +static void
       
 64894 +ParseThreadList(CrashedProcess* crashinfo, MMappedRange range,
       
 64895 +                const MMappedRange& full_file) {
       
 64896 +  const uint32_t num_threads =
       
 64897 +      *(const uint32_t*) range.GetObject(0, sizeof(uint32_t));
       
 64898 +  for (unsigned i = 0; i < num_threads; ++i) {
       
 64899 +    CrashedProcess::Thread thread;
       
 64900 +    memset(&thread, 0, sizeof(thread));
       
 64901 +    const MDRawThread* rawthread =
       
 64902 +        (MDRawThread*) range.GetArrayElement(sizeof(uint32_t),
       
 64903 +                                             sizeof(MDRawThread), i);
       
 64904 +    thread.tid = rawthread->thread_id;
       
 64905 +    thread.stack_addr = rawthread->stack.start_of_memory_range;
       
 64906 +    MMappedRange stack_range = full_file.Subrange(rawthread->stack.memory);
       
 64907 +    thread.stack = stack_range.data();
       
 64908 +    thread.stack_length = rawthread->stack.memory.data_size;
       
 64909 +
       
 64910 +    ParseThreadRegisters(&thread,
       
 64911 +                         full_file.Subrange(rawthread->thread_context));
       
 64912 +
       
 64913 +    crashinfo->threads.push_back(thread);
       
 64914 +  }
       
 64915 +}
       
 64916 +
       
 64917 +static void
       
 64918 +ParseAuxVector(CrashedProcess* crashinfo, MMappedRange range) {
       
 64919 +  crashinfo->auxv = range.data();
       
 64920 +  crashinfo->auxv_length = range.length();
       
 64921 +}
       
 64922 +
       
 64923 +static void
       
 64924 +ParseCmdLine(CrashedProcess* crashinfo, MMappedRange range) {
       
 64925 +  const char* cmdline = (const char*) range.data();
       
 64926 +  for (size_t i = 0; i < range.length(); ++i) {
       
 64927 +    if (cmdline[i] == 0) {
       
 64928 +      static const size_t fname_len = sizeof(crashinfo->prps.pr_fname) - 1;
       
 64929 +      static const size_t args_len = sizeof(crashinfo->prps.pr_psargs) - 1;
       
 64930 +      memset(crashinfo->prps.pr_fname, 0, fname_len + 1);
       
 64931 +      memset(crashinfo->prps.pr_psargs, 0, args_len + 1);
       
 64932 +      const char* binary_name = strrchr(cmdline, '/');
       
 64933 +      if (binary_name) {
       
 64934 +        binary_name++;
       
 64935 +        const unsigned len = strlen(binary_name);
       
 64936 +        memcpy(crashinfo->prps.pr_fname, binary_name,
       
 64937 +               len > fname_len ? fname_len : len);
       
 64938 +      } else {
       
 64939 +        memcpy(crashinfo->prps.pr_fname, cmdline,
       
 64940 +               i > fname_len ? fname_len : i);
       
 64941 +      }
       
 64942 +
       
 64943 +      const unsigned len = range.length() > args_len ?
       
 64944 +                           args_len : range.length();
       
 64945 +      memcpy(crashinfo->prps.pr_psargs, cmdline, len);
       
 64946 +      for (unsigned i = 0; i < len; ++i) {
       
 64947 +        if (crashinfo->prps.pr_psargs[i] == 0)
       
 64948 +          crashinfo->prps.pr_psargs[i] = ' ';
       
 64949 +      }
       
 64950 +    }
       
 64951 +  }
       
 64952 +}
       
 64953 +
       
 64954 +static void
       
 64955 +ParseExceptionStream(CrashedProcess* crashinfo, MMappedRange range) {
       
 64956 +  const MDRawExceptionStream* exp =
       
 64957 +      (MDRawExceptionStream*) range.GetObject(0, sizeof(MDRawExceptionStream));
       
 64958 +  crashinfo->crashing_tid = exp->thread_id;
       
 64959 +  crashinfo->fatal_signal = (int) exp->exception_record.exception_code;
       
 64960 +}
       
 64961 +
       
 64962 +static bool
       
 64963 +WriteThread(const CrashedProcess::Thread& thread, int fatal_signal) {
       
 64964 +  struct prstatus pr;
       
 64965 +  memset(&pr, 0, sizeof(pr));
       
 64966 +
       
 64967 +  pr.pr_info.si_signo = fatal_signal;
       
 64968 +  pr.pr_cursig = fatal_signal;
       
 64969 +  pr.pr_pid = thread.tid;
       
 64970 +  memcpy(&pr.pr_reg, &thread.regs, sizeof(user_regs_struct));
       
 64971 +
       
 64972 +  Nhdr nhdr;
       
 64973 +  memset(&nhdr, 0, sizeof(nhdr));
       
 64974 +  nhdr.n_namesz = 5;
       
 64975 +  nhdr.n_descsz = sizeof(struct prstatus);
       
 64976 +  nhdr.n_type = NT_PRSTATUS;
       
 64977 +  if (!writea(1, &nhdr, sizeof(nhdr)) ||
       
 64978 +      !writea(1, "CORE\0\0\0\0", 8) ||
       
 64979 +      !writea(1, &pr, sizeof(struct prstatus))) {
       
 64980 +    return false;
       
 64981 +  }
       
 64982 +
       
 64983 +  nhdr.n_descsz = sizeof(user_fpregs_struct);
       
 64984 +  nhdr.n_type = NT_FPREGSET;
       
 64985 +  if (!writea(1, &nhdr, sizeof(nhdr)) ||
       
 64986 +      !writea(1, "CORE\0\0\0\0", 8) ||
       
 64987 +      !writea(1, &thread.fpregs, sizeof(user_fpregs_struct))) {
       
 64988 +    return false;
       
 64989 +  }
       
 64990 +
       
 64991 +  nhdr.n_descsz = sizeof(user_fpxregs_struct);
       
 64992 +  nhdr.n_type = NT_PRXFPREG;
       
 64993 +  if (!writea(1, &nhdr, sizeof(nhdr)) ||
       
 64994 +      !writea(1, "LINUX\0\0\0", 8) ||
       
 64995 +      !writea(1, &thread.fpxregs, sizeof(user_fpxregs_struct))) {
       
 64996 +    return false;
       
 64997 +  }
       
 64998 +
       
 64999 +  return true;
       
 65000 +}
       
 65001 +
       
 65002 +static void
       
 65003 +ParseModuleStream(CrashedProcess* crashinfo, MMappedRange range) {
       
 65004 +  const uint32_t num_mappings =
       
 65005 +      *(const uint32_t*) range.GetObject(0, sizeof(uint32_t));
       
 65006 +  for (unsigned i = 0; i < num_mappings; ++i) {
       
 65007 +    CrashedProcess::Mapping mapping;
       
 65008 +    const MDRawModule* rawmodule =
       
 65009 +        (MDRawModule*) range.GetArrayElement(sizeof(uint32_t),
       
 65010 +                                             MD_MODULE_SIZE, i);
       
 65011 +    mapping.start_address = rawmodule->base_of_image;
       
 65012 +    mapping.end_address = rawmodule->size_of_image + rawmodule->base_of_image;
       
 65013 +
       
 65014 +    crashinfo->mappings.push_back(mapping);
       
 65015 +  }
       
 65016 +}
       
 65017 +
       
 65018 +int
       
 65019 +main(int argc, char** argv) {
       
 65020 +  if (argc != 2)
       
 65021 +    return usage(argv[0]);
       
 65022 +
       
 65023 +  const int fd = open(argv[1], O_RDONLY);
       
 65024 +  if (fd < 0)
       
 65025 +    return usage(argv[0]);
       
 65026 +
       
 65027 +  struct stat st;
       
 65028 +  fstat(fd, &st);
       
 65029 +
       
 65030 +  const void* bytes = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
       
 65031 +  close(fd);
       
 65032 +  if (bytes == MAP_FAILED) {
       
 65033 +    perror("Failed to mmap dump file");
       
 65034 +    return 1;
       
 65035 +  }
       
 65036 +
       
 65037 +  MMappedRange dump(bytes, st.st_size);
       
 65038 +
       
 65039 +  const MDRawHeader* header =
       
 65040 +      (const MDRawHeader*) dump.GetObject(0, sizeof(MDRawHeader));
       
 65041 +
       
 65042 +  CrashedProcess crashinfo;
       
 65043 +
       
 65044 +  for (unsigned i = 0; i < header->stream_count; ++i) {
       
 65045 +    const MDRawDirectory* dirent =
       
 65046 +        (const MDRawDirectory*) dump.GetArrayElement(
       
 65047 +            header->stream_directory_rva, sizeof(MDRawDirectory), i);
       
 65048 +    switch (dirent->stream_type) {
       
 65049 +      case MD_THREAD_LIST_STREAM:
       
 65050 +        ParseThreadList(&crashinfo, dump.Subrange(dirent->location), dump);
       
 65051 +        break;
       
 65052 +      case MD_LINUX_AUXV:
       
 65053 +        ParseAuxVector(&crashinfo, dump.Subrange(dirent->location));
       
 65054 +        break;
       
 65055 +      case MD_LINUX_CMD_LINE:
       
 65056 +        ParseCmdLine(&crashinfo, dump.Subrange(dirent->location));
       
 65057 +        break;
       
 65058 +      case MD_EXCEPTION_STREAM:
       
 65059 +        ParseExceptionStream(&crashinfo, dump.Subrange(dirent->location));
       
 65060 +        break;
       
 65061 +      case MD_MODULE_LIST_STREAM:
       
 65062 +        ParseModuleStream(&crashinfo, dump.Subrange(dirent->location));
       
 65063 +      default:
       
 65064 +        fprintf(stderr, "Skipping %x\n", dirent->stream_type);
       
 65065 +    }
       
 65066 +  }
       
 65067 +
       
 65068 +  // Write the ELF header. The file will look like:
       
 65069 +  //   ELF header
       
 65070 +  //   Phdr for the PT_NOTE
       
 65071 +  //   Phdr for each of the thread stacks
       
 65072 +  //   PT_NOTE
       
 65073 +  //   each of the thread stacks
       
 65074 +  Ehdr ehdr;
       
 65075 +  memset(&ehdr, 0, sizeof(Ehdr));
       
 65076 +  ehdr.e_ident[0] = ELFMAG0;
       
 65077 +  ehdr.e_ident[1] = ELFMAG1;
       
 65078 +  ehdr.e_ident[2] = ELFMAG2;
       
 65079 +  ehdr.e_ident[3] = ELFMAG3;
       
 65080 +  ehdr.e_ident[4] = ELF_CLASS;
       
 65081 +  ehdr.e_ident[5] = sex() ? ELFDATA2MSB : ELFDATA2LSB;
       
 65082 +  ehdr.e_ident[6] = EV_CURRENT;
       
 65083 +  ehdr.e_type     = ET_CORE;
       
 65084 +  ehdr.e_machine  = ELF_ARCH;
       
 65085 +  ehdr.e_version  = EV_CURRENT;
       
 65086 +  ehdr.e_phoff    = sizeof(Ehdr);
       
 65087 +  ehdr.e_ehsize   = sizeof(Ehdr);
       
 65088 +  ehdr.e_phentsize= sizeof(Phdr);
       
 65089 +  ehdr.e_phnum    = 1 + crashinfo.threads.size() + crashinfo.mappings.size();
       
 65090 +  ehdr.e_shentsize= sizeof(Shdr);
       
 65091 +  if (!writea(1, &ehdr, sizeof(Ehdr)))
       
 65092 +    return 1;
       
 65093 +
       
 65094 +  size_t offset = sizeof(Ehdr) +
       
 65095 +                  (1 + crashinfo.threads.size() +
       
 65096 +                   crashinfo.mappings.size()) * sizeof(Phdr);
       
 65097 +  size_t filesz = sizeof(Nhdr) + 8 + sizeof(prpsinfo) +
       
 65098 +                  // sizeof(Nhdr) + 8 + sizeof(user) +
       
 65099 +                  sizeof(Nhdr) + 8 + crashinfo.auxv_length +
       
 65100 +                  crashinfo.threads.size() * (
       
 65101 +                    (sizeof(Nhdr) + 8 + sizeof(prstatus)) +
       
 65102 +                     sizeof(Nhdr) + 8 + sizeof(user_fpregs_struct) +
       
 65103 +                     sizeof(Nhdr) + 8 + sizeof(user_fpxregs_struct));
       
 65104 +
       
 65105 +  Phdr phdr;
       
 65106 +  memset(&phdr, 0, sizeof(Phdr));
       
 65107 +  phdr.p_type = PT_NOTE;
       
 65108 +  phdr.p_offset = offset;
       
 65109 +  phdr.p_filesz = filesz;
       
 65110 +  if (!writea(1, &phdr, sizeof(phdr)))
       
 65111 +    return 1;
       
 65112 +
       
 65113 +  phdr.p_type = PT_LOAD;
       
 65114 +  phdr.p_align = getpagesize();
       
 65115 +  size_t note_align = phdr.p_align - ((offset+filesz) % phdr.p_align);
       
 65116 +  if (note_align == phdr.p_align)
       
 65117 +    note_align = 0;
       
 65118 +  offset += note_align;
       
 65119 +
       
 65120 +  for (unsigned i = 0; i < crashinfo.threads.size(); ++i) {
       
 65121 +    const CrashedProcess::Thread& thread = crashinfo.threads[i];
       
 65122 +    offset += filesz;
       
 65123 +    filesz = thread.stack_length;
       
 65124 +    phdr.p_offset = offset;
       
 65125 +    phdr.p_vaddr = thread.stack_addr;
       
 65126 +    phdr.p_filesz = phdr.p_memsz = filesz;
       
 65127 +    phdr.p_flags = PF_R | PF_W;
       
 65128 +    if (!writea(1, &phdr, sizeof(phdr)))
       
 65129 +      return 1;
       
 65130 +  }
       
 65131 +
       
 65132 +  for (unsigned i = 0; i < crashinfo.mappings.size(); ++i) {
       
 65133 +    const CrashedProcess::Mapping& mapping = crashinfo.mappings[i];
       
 65134 +    phdr.p_offset = 0;
       
 65135 +    phdr.p_vaddr = mapping.start_address;
       
 65136 +    phdr.p_filesz = 0;
       
 65137 +    phdr.p_flags = PF_R;
       
 65138 +    phdr.p_memsz = mapping.end_address - mapping.start_address;
       
 65139 +    if (!writea(1, &phdr, sizeof(phdr)))
       
 65140 +      return 1;
       
 65141 +  }
       
 65142 +
       
 65143 +  Nhdr nhdr;
       
 65144 +  memset(&nhdr, 0, sizeof(nhdr));
       
 65145 +  nhdr.n_namesz = 5;
       
 65146 +  nhdr.n_descsz = sizeof(prpsinfo);
       
 65147 +  nhdr.n_type = NT_PRPSINFO;
       
 65148 +  if (!writea(1, &nhdr, sizeof(nhdr)) ||
       
 65149 +      !writea(1, "CORE\0\0\0\0", 8) ||
       
 65150 +      !writea(1, &crashinfo.prps, sizeof(prpsinfo))) {
       
 65151 +    return 1;
       
 65152 +  }
       
 65153 +
       
 65154 +  nhdr.n_descsz = crashinfo.auxv_length;
       
 65155 +  nhdr.n_type = NT_AUXV;
       
 65156 +  if (!writea(1, &nhdr, sizeof(nhdr)) ||
       
 65157 +      !writea(1, "CORE\0\0\0\0", 8) ||
       
 65158 +      !writea(1, &crashinfo.auxv, crashinfo.auxv_length)) {
       
 65159 +    return 1;
       
 65160 +  }
       
 65161 +
       
 65162 +  for (unsigned i = 0; i < crashinfo.threads.size(); ++i) {
       
 65163 +    if (crashinfo.threads[i].tid == crashinfo.crashing_tid) {
       
 65164 +      WriteThread(crashinfo.threads[i], crashinfo.fatal_signal);
       
 65165 +      break;
       
 65166 +    }
       
 65167 +  }
       
 65168 +
       
 65169 +  for (unsigned i = 0; i < crashinfo.threads.size(); ++i) {
       
 65170 +    if (crashinfo.threads[i].tid != crashinfo.crashing_tid)
       
 65171 +      WriteThread(crashinfo.threads[i], 0);
       
 65172 +  }
       
 65173 +
       
 65174 +  if (note_align) {
       
 65175 +    char scratch[note_align];
       
 65176 +    memset(scratch, 0, sizeof(scratch));
       
 65177 +    if (!writea(1, scratch, sizeof(scratch)))
       
 65178 +      return 1;
       
 65179 +  }
       
 65180 +
       
 65181 +  for (unsigned i = 0; i < crashinfo.threads.size(); ++i) {
       
 65182 +    const CrashedProcess::Thread& thread = crashinfo.threads[i];
       
 65183 +    if (!writea(1, thread.stack, thread.stack_length))
       
 65184 +      return 1;
       
 65185 +  }
       
 65186 +
       
 65187 +  munmap(const_cast<void*>(bytes), st.st_size);
       
 65188 +
       
 65189 +  return 0;
       
 65190 +}
       
 65191 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.mm b/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.mm
       
 65192 --- a/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.mm
       
 65193 +++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.mm
       
 65194 @@ -54,30 +54,32 @@
       
 65195  #include "on_demand_symbol_supplier.h"
       
 65196  
       
 65197  using std::string;
       
 65198  
       
 65199  using google_breakpad::BasicSourceLineResolver;
       
 65200  using google_breakpad::CallStack;
       
 65201  using google_breakpad::CodeModule;
       
 65202  using google_breakpad::CodeModules;
       
 65203 +using google_breakpad::Minidump;
       
 65204  using google_breakpad::MinidumpProcessor;
       
 65205  using google_breakpad::OnDemandSymbolSupplier;
       
 65206  using google_breakpad::PathnameStripper;
       
 65207  using google_breakpad::ProcessState;
       
 65208  using google_breakpad::scoped_ptr;
       
 65209  using google_breakpad::StackFrame;
       
 65210  using google_breakpad::StackFramePPC;
       
 65211  using google_breakpad::StackFrameX86;
       
 65212  using google_breakpad::SystemInfo;
       
 65213  
       
 65214  typedef struct {
       
 65215    NSString *minidumpPath;
       
 65216    NSString *searchDir;
       
 65217    NSString *symbolSearchDir;
       
 65218 +  BOOL printThreadMemory;
       
 65219  } Options;
       
 65220  
       
 65221  //=============================================================================
       
 65222  static int PrintRegister(const char *name, u_int32_t value, int sequence) {
       
 65223    if (sequence % 4 == 0) {
       
 65224      printf("\n");
       
 65225    }
       
 65226    printf("%6s = 0x%08x ", name, value);
       
 65227 @@ -185,32 +187,66 @@ static void PrintRegisters(const CallSta
       
 65228        if (frame_ppc->context_validity & StackFramePPC::CONTEXT_VALID_GPR1)
       
 65229          sequence = PrintRegister("r1", frame_ppc->context.gpr[1], sequence);
       
 65230      }
       
 65231    }
       
 65232  
       
 65233    printf("\n");
       
 65234  }
       
 65235  
       
 65236 -//=============================================================================
       
 65237 -static void Start(Options *options) {
       
 65238 -  string minidump_file([options->minidumpPath fileSystemRepresentation]);
       
 65239 +static void PrintModules(const CodeModules *modules) {
       
 65240 +  if (!modules)
       
 65241 +    return;
       
 65242 +        
       
 65243 +  printf("\n");
       
 65244 +  printf("Loaded modules:\n");
       
 65245 +        
       
 65246 +  u_int64_t main_address = 0;
       
 65247 +  const CodeModule *main_module = modules->GetMainModule();
       
 65248 +  if (main_module) {
       
 65249 +    main_address = main_module->base_address();
       
 65250 +  }
       
 65251 +        
       
 65252 +  unsigned int module_count = modules->module_count();
       
 65253 +  for (unsigned int module_sequence = 0;
       
 65254 +       module_sequence < module_count;
       
 65255 +       ++module_sequence) {
       
 65256 +    const CodeModule *module = modules->GetModuleAtSequence(module_sequence);
       
 65257 +    assert(module);
       
 65258 +    u_int64_t base_address = module->base_address();
       
 65259 +    printf("0x%08llx - 0x%08llx  %s  %s%s  %s\n",
       
 65260 +           base_address, base_address + module->size() - 1,
       
 65261 +           PathnameStripper::File(module->code_file()).c_str(),
       
 65262 +           module->version().empty() ? "???" : module->version().c_str(),
       
 65263 +           main_module != NULL && base_address == main_address ?
       
 65264 +           "  (main)" : "",
       
 65265 +           module->code_file().c_str());
       
 65266 +  }
       
 65267 +}
       
 65268  
       
 65269 +static void ProcessSingleReport(Options *options, NSString *file_path) {
       
 65270 +  string minidump_file([file_path fileSystemRepresentation]);  
       
 65271    BasicSourceLineResolver resolver;
       
 65272    string search_dir = options->searchDir ?
       
 65273      [options->searchDir fileSystemRepresentation] : "";
       
 65274    string symbol_search_dir = options->symbolSearchDir ?
       
 65275      [options->symbolSearchDir fileSystemRepresentation] : "";
       
 65276    scoped_ptr<OnDemandSymbolSupplier> symbol_supplier(
       
 65277      new OnDemandSymbolSupplier(search_dir, symbol_search_dir));
       
 65278    scoped_ptr<MinidumpProcessor>
       
 65279      minidump_processor(new MinidumpProcessor(symbol_supplier.get(), &resolver));
       
 65280    ProcessState process_state;
       
 65281 -  if (minidump_processor->Process(minidump_file, &process_state) !=
       
 65282 -      MinidumpProcessor::PROCESS_OK) {
       
 65283 +  scoped_ptr<Minidump> dump(new google_breakpad::Minidump(minidump_file));
       
 65284 +
       
 65285 +  if (!dump->Read()) {
       
 65286 +    fprintf(stderr, "Minidump %s could not be read\n", dump->path().c_str());
       
 65287 +    return;
       
 65288 +  }
       
 65289 +  if (minidump_processor->Process(dump.get(), &process_state) !=
       
 65290 +      google_breakpad::PROCESS_OK) {
       
 65291      fprintf(stderr, "MinidumpProcessor::Process failed\n");
       
 65292      return;
       
 65293    }
       
 65294  
       
 65295    const SystemInfo *system_info = process_state.system_info();
       
 65296    string cpu = system_info->cpu;
       
 65297  
       
 65298    // Convert the time to a string
       
 65299 @@ -239,68 +275,109 @@ static void Start(Options *options) {
       
 65300             requesting_thread,
       
 65301             process_state.crashed() ? "crashed" :
       
 65302             "requested dump, did not crash");
       
 65303      PrintStack(process_state.threads()->at(requesting_thread), cpu);
       
 65304    }
       
 65305  
       
 65306    // Print all of the threads in the dump.
       
 65307    int thread_count = process_state.threads()->size();
       
 65308 +  const std::vector<google_breakpad::MinidumpMemoryRegion*>
       
 65309 +    *thread_memory_regions = process_state.thread_memory_regions();
       
 65310 +
       
 65311    for (int thread_index = 0; thread_index < thread_count; ++thread_index) {
       
 65312      if (thread_index != requesting_thread) {
       
 65313        // Don't print the crash thread again, it was already printed.
       
 65314        printf("\n");
       
 65315        printf("Thread %d\n", thread_index);
       
 65316        PrintStack(process_state.threads()->at(thread_index), cpu);
       
 65317 +      google_breakpad::MinidumpMemoryRegion *thread_stack_bytes =
       
 65318 +        thread_memory_regions->at(thread_index);
       
 65319 +      if (options->printThreadMemory) {
       
 65320 +        thread_stack_bytes->Print();
       
 65321 +      }
       
 65322      }
       
 65323    }
       
 65324  
       
 65325    // Print the crashed registers
       
 65326    if (requesting_thread != -1) {
       
 65327      printf("\nThread %d:", requesting_thread);
       
 65328      PrintRegisters(process_state.threads()->at(requesting_thread), cpu);
       
 65329    }
       
 65330 +
       
 65331 +  // Print information about modules
       
 65332 +  PrintModules(process_state.modules());
       
 65333 +}
       
 65334 +
       
 65335 +//=============================================================================
       
 65336 +static void Start(Options *options) {
       
 65337 +  NSFileManager *manager = [NSFileManager defaultManager];
       
 65338 +  NSString *minidump_path = options->minidumpPath;
       
 65339 +  BOOL is_dir = NO;
       
 65340 +  BOOL file_exists = [manager fileExistsAtPath:minidump_path
       
 65341 +                                   isDirectory:&is_dir];
       
 65342 +  if (file_exists && is_dir) {
       
 65343 +    NSDirectoryEnumerator *enumerator =
       
 65344 +      [manager enumeratorAtPath:minidump_path];
       
 65345 +    NSString *current_file = nil;
       
 65346 +    while ((current_file = [enumerator nextObject])) {
       
 65347 +      if ([[current_file pathExtension] isEqualTo:@"dmp"]) {
       
 65348 +        printf("Attempting to process report: %s\n",
       
 65349 +               [current_file cStringUsingEncoding:NSASCIIStringEncoding]);
       
 65350 +        NSString *full_path =
       
 65351 +          [minidump_path stringByAppendingPathComponent:current_file];
       
 65352 +        ProcessSingleReport(options, full_path);
       
 65353 +      }
       
 65354 +    }
       
 65355 +  } else if (file_exists) {
       
 65356 +    ProcessSingleReport(options, minidump_path);
       
 65357 +  }
       
 65358  }
       
 65359  
       
 65360  //=============================================================================
       
 65361  static void Usage(int argc, const char *argv[]) {
       
 65362    fprintf(stderr, "Convert a minidump to a crash report.  Breakpad symbol "
       
 65363                    "files will be used (or created if missing) in /tmp.\n"
       
 65364                    "If a symbol-file-search-dir is specified, any symbol " 
       
 65365                    "files in it will be used instead of being loaded from "  
       
 65366                    "modules on disk.\n" 
       
 65367                    "If modules cannot be found at the paths stored in the "
       
 65368                    "minidump file, they will be searched for at "    
       
 65369                    "<module-search-dir>/<path-in-minidump-file>.\n");
       
 65370 -  fprintf(stderr, "Usage: %s [-s module-search-dir] [-S symbol-file-search-dir] minidump-file\n", argv[0]);
       
 65371 +  fprintf(stderr, "Usage: %s [-s module-search-dir] [-S symbol-file-search-dir] "
       
 65372 +	          "minidump-file\n", argv[0]);
       
 65373    fprintf(stderr, "\t-s: Specify a search directory to use for missing modules\n" 
       
 65374 -                  "\t-S: Specify a search directory to use for symbol files\n"  
       
 65375 +                  "\t-S: Specify a search directory to use for symbol files\n"
       
 65376 +                  "\t-t: Print thread stack memory in hex\n"
       
 65377                    "\t-h: Usage\n"
       
 65378                    "\t-?: Usage\n");
       
 65379  }
       
 65380  
       
 65381  //=============================================================================
       
 65382  static void SetupOptions(int argc, const char *argv[], Options *options) {
       
 65383    extern int optind;
       
 65384    char ch;
       
 65385  
       
 65386 -  while ((ch = getopt(argc, (char * const *)argv, "S:s:h?")) != -1) {
       
 65387 +  while ((ch = getopt(argc, (char * const *)argv, "S:s:ht?")) != -1) {
       
 65388      switch (ch) {
       
 65389        case 's':
       
 65390          options->searchDir = [[NSFileManager defaultManager]
       
 65391            stringWithFileSystemRepresentation:optarg
       
 65392                                        length:strlen(optarg)];
       
 65393          break;
       
 65394  
       
 65395        case 'S':
       
 65396          options->symbolSearchDir = [[NSFileManager defaultManager]
       
 65397            stringWithFileSystemRepresentation:optarg
       
 65398                                        length:strlen(optarg)];
       
 65399          break;
       
 65400          
       
 65401 +      case 't':
       
 65402 +        options->printThreadMemory = YES;
       
 65403 +        break;
       
 65404        case 'h':
       
 65405        case '?':
       
 65406          Usage(argc, argv);
       
 65407          exit(1);
       
 65408          break;
       
 65409      }
       
 65410    }
       
 65411  
       
 65412 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj b/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj
       
 65413 --- a/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj
       
 65414 +++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/crash_report.xcodeproj/project.pbxproj
       
 65415 @@ -125,19 +125,19 @@
       
 65416  		9BDF1AFA0B1BEB6300F8391B /* address_map-inl.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = "address_map-inl.h"; path = "../../../processor/address_map-inl.h"; sourceTree = SOURCE_ROOT; };
       
 65417  		9BDF1AFB0B1BEB6300F8391B /* address_map.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = address_map.h; path = ../../../processor/address_map.h; sourceTree = SOURCE_ROOT; };
       
 65418  		9BE650AC0B52FE3000611104 /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; };
       
 65419  		9BE650AD0B52FE3000611104 /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; };
       
 65420  		9BE650AE0B52FE3000611104 /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; };
       
 65421  		9BE650AF0B52FE3000611104 /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; };
       
 65422  		9BE650B00B52FE3000611104 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };
       
 65423  		9BE650B10B52FE3000611104 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };
       
 65424 -		F9C7ECE20E8ABCA600E953AD /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/mac/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
       
 65425 -		F9C7ECE30E8ABCA600E953AD /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/mac/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
       
 65426 -		F9C7ECE40E8ABCA600E953AD /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/mac/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
       
 65427 +		F9C7ECE20E8ABCA600E953AD /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
       
 65428 +		F9C7ECE30E8ABCA600E953AD /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
       
 65429 +		F9C7ECE40E8ABCA600E953AD /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
       
 65430  		FD6625C40CF4D438004AC844 /* stackwalker_amd64.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = stackwalker_amd64.cc; path = ../../../processor/stackwalker_amd64.cc; sourceTree = SOURCE_ROOT; };
       
 65431  		FD6625C50CF4D438004AC844 /* stackwalker_amd64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stackwalker_amd64.h; path = ../../../processor/stackwalker_amd64.h; sourceTree = SOURCE_ROOT; };
       
 65432  		FD8EDEAC0CADDAD400A5EDF1 /* stackwalker_sparc.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = stackwalker_sparc.cc; path = ../../../processor/stackwalker_sparc.cc; sourceTree = SOURCE_ROOT; };
       
 65433  		FD8EDEAD0CADDAD400A5EDF1 /* stackwalker_sparc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stackwalker_sparc.h; path = ../../../processor/stackwalker_sparc.h; sourceTree = SOURCE_ROOT; };
       
 65434  /* End PBXFileReference section */
       
 65435  
       
 65436  /* Begin PBXFrameworksBuildPhase section */
       
 65437  		8DD76F9B0486AA7600D96B5E /* Frameworks */ = {
       
 65438 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.h b/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.h
       
 65439 --- a/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.h
       
 65440 +++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.h
       
 65441 @@ -42,30 +42,35 @@ namespace google_breakpad {
       
 65442  using std::map;
       
 65443  using std::string;
       
 65444  class MinidumpModule;
       
 65445  
       
 65446  class OnDemandSymbolSupplier : public SymbolSupplier {
       
 65447   public:
       
 65448    // |search_dir| is the directory to search for alternative symbols with
       
 65449    // the same name as the module in the minidump
       
 65450 -  OnDemandSymbolSupplier(const string &search_dir, 
       
 65451 +  OnDemandSymbolSupplier(const string &search_dir,
       
 65452                           const string &symbol_search_dir);
       
 65453    virtual ~OnDemandSymbolSupplier() {}
       
 65454  
       
 65455    // Returns the path to the symbol file for the given module.
       
 65456    virtual SymbolResult GetSymbolFile(const CodeModule *module,
       
 65457                                       const SystemInfo *system_info,
       
 65458                                       string *symbol_file);
       
 65459  
       
 65460 +  // Returns the path to the symbol file for the given module.
       
 65461 +  virtual SymbolResult GetSymbolFile(const CodeModule *module,
       
 65462 +                                     const SystemInfo *system_info,
       
 65463 +                                     string *symbol_file,
       
 65464 +                                     string *symbol_data);
       
 65465   protected:
       
 65466    // Search directory
       
 65467    string search_dir_;
       
 65468    string symbol_search_dir_;
       
 65469 -  
       
 65470 +
       
 65471    // When we create a symbol file for a module, save the name of the module
       
 65472    // and the path to that module's symbol file.
       
 65473    map<string, string> module_file_map_;
       
 65474  
       
 65475    // Return the name for |module|  This will be the value used as the key
       
 65476    // to the |module_file_map_|.
       
 65477    string GetNameForModule(const CodeModule *module);
       
 65478  
       
 65479 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.mm b/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.mm
       
 65480 --- a/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.mm
       
 65481 +++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/crash_report/on_demand_symbol_supplier.mm
       
 65482 @@ -25,16 +25,18 @@
       
 65483  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
 65484  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
 65485  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
 65486  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
 65487  
       
 65488  #include <sys/stat.h>
       
 65489  #include <map>
       
 65490  #include <string>
       
 65491 +#include <iostream>
       
 65492 +#include <fstream>
       
 65493  
       
 65494  #include "google_breakpad/processor/basic_source_line_resolver.h"
       
 65495  #include "google_breakpad/processor/minidump.h"
       
 65496  #include "google_breakpad/processor/system_info.h"
       
 65497  #include "processor/pathname_stripper.h"
       
 65498  
       
 65499  #include "on_demand_symbol_supplier.h"
       
 65500  #include "dump_syms.h"
       
 65501 @@ -131,16 +133,36 @@ OnDemandSymbolSupplier::GetSymbolFile(co
       
 65502  
       
 65503    if (path.empty())
       
 65504      return NOT_FOUND;
       
 65505  
       
 65506    *symbol_file = path;
       
 65507    return FOUND;
       
 65508  }
       
 65509  
       
 65510 +SymbolSupplier::SymbolResult
       
 65511 +OnDemandSymbolSupplier::GetSymbolFile(const CodeModule *module,
       
 65512 +                                      const SystemInfo *system_info,
       
 65513 +                                      string *symbol_file,
       
 65514 +                                      string *symbol_data) {
       
 65515 +  SymbolSupplier::SymbolResult s = GetSymbolFile(module,
       
 65516 +                                                 system_info,
       
 65517 +                                                 symbol_file);
       
 65518 +
       
 65519 +
       
 65520 +  if (s == FOUND) {
       
 65521 +    ifstream in(symbol_file->c_str());
       
 65522 +    getline(in, *symbol_data, std::string::traits_type::to_char_type(
       
 65523 +                std::string::traits_type::eof()));
       
 65524 +    in.close();
       
 65525 +  }
       
 65526 +
       
 65527 +  return s;
       
 65528 +}
       
 65529 +
       
 65530  string OnDemandSymbolSupplier::GetLocalModulePath(const CodeModule *module) {
       
 65531    NSFileManager *mgr = [NSFileManager defaultManager];
       
 65532    const char *moduleStr = module->code_file().c_str();
       
 65533    NSString *modulePath =
       
 65534      [mgr stringWithFileSystemRepresentation:moduleStr length:strlen(moduleStr)];
       
 65535    const char *searchStr = search_dir_.c_str();
       
 65536    NSString *searchDir =
       
 65537      [mgr stringWithFileSystemRepresentation:searchStr length:strlen(searchStr)];
       
 65538 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/Makefile.in b/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/Makefile.in
       
 65539 --- a/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/Makefile.in
       
 65540 +++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/Makefile.in
       
 65541 @@ -48,18 +48,18 @@ LOCAL_INCLUDES 	= \
       
 65542    -I$(srcdir)/../../../common/mac \
       
 65543    $(NULL)
       
 65544  
       
 65545  HOST_CMMSRCS = \
       
 65546    dump_syms_tool.mm \
       
 65547    $(NULL)
       
 65548  
       
 65549  HOST_LIBS += \
       
 65550 +  $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/dwarf/$(LIB_PREFIX)host_breakpad_dwarf_s.$(LIB_SUFFIX) \
       
 65551    $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/mac/$(LIB_PREFIX)host_breakpad_mac_common_s.$(LIB_SUFFIX) \
       
 65552 -  $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/mac/dwarf/$(LIB_PREFIX)host_breakpad_mac_dwarf_s.$(LIB_SUFFIX) \
       
 65553    $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/$(LIB_PREFIX)host_breakpad_common_s.$(LIB_SUFFIX) \
       
 65554    $(NULL)
       
 65555  
       
 65556  HOST_LDFLAGS += \
       
 65557    -framework Foundation \
       
 65558    -lcrypto \
       
 65559    $(NULL)
       
 65560  
       
 65561 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj b/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
       
 65562 --- a/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
       
 65563 +++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
       
 65564 @@ -40,25 +40,25 @@
       
 65565  		9BDF186D0B1BB43700F8391B /* dump_syms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dump_syms.h; path = ../../../common/mac/dump_syms.h; sourceTree = "<group>"; };
       
 65566  		9BDF186E0B1BB43700F8391B /* dump_syms_tool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = dump_syms_tool.mm; sourceTree = "<group>"; };
       
 65567  		9BE650410B52F6D800611104 /* file_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = file_id.cc; path = ../../../common/mac/file_id.cc; sourceTree = SOURCE_ROOT; };
       
 65568  		9BE650420B52F6D800611104 /* file_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = file_id.h; path = ../../../common/mac/file_id.h; sourceTree = SOURCE_ROOT; };
       
 65569  		9BE650430B52F6D800611104 /* macho_id.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_id.cc; path = ../../../common/mac/macho_id.cc; sourceTree = SOURCE_ROOT; };
       
 65570  		9BE650440B52F6D800611104 /* macho_id.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_id.h; path = ../../../common/mac/macho_id.h; sourceTree = SOURCE_ROOT; };
       
 65571  		9BE650450B52F6D800611104 /* macho_walker.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_walker.cc; path = ../../../common/mac/macho_walker.cc; sourceTree = SOURCE_ROOT; };
       
 65572  		9BE650460B52F6D800611104 /* macho_walker.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_walker.h; path = ../../../common/mac/macho_walker.h; sourceTree = SOURCE_ROOT; };
       
 65573 -		F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "bytereader-inl.h"; path = "../../../common/mac/dwarf/bytereader-inl.h"; sourceTree = SOURCE_ROOT; };
       
 65574 -		F95B422C0E0E22D100DBDE83 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/mac/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
       
 65575 -		F95B422D0E0E22D100DBDE83 /* bytereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bytereader.h; path = ../../../common/mac/dwarf/bytereader.h; sourceTree = SOURCE_ROOT; };
       
 65576 -		F95B422E0E0E22D100DBDE83 /* dwarf2enums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2enums.h; path = ../../../common/mac/dwarf/dwarf2enums.h; sourceTree = SOURCE_ROOT; };
       
 65577 -		F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/mac/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
       
 65578 -		F95B42300E0E22D100DBDE83 /* dwarf2reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2reader.h; path = ../../../common/mac/dwarf/dwarf2reader.h; sourceTree = SOURCE_ROOT; };
       
 65579 -		F95B42310E0E22D100DBDE83 /* line_state_machine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = line_state_machine.h; path = ../../../common/mac/dwarf/line_state_machine.h; sourceTree = SOURCE_ROOT; };
       
 65580 -		F9C7ED420E8AD93000E953AD /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/mac/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
       
 65581 -		F9F5344D0E7C902C0012363F /* functioninfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = functioninfo.h; path = ../../../common/mac/dwarf/functioninfo.h; sourceTree = SOURCE_ROOT; };
       
 65582 +		F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "bytereader-inl.h"; path = "../../../common/dwarf/bytereader-inl.h"; sourceTree = SOURCE_ROOT; };
       
 65583 +		F95B422C0E0E22D100DBDE83 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
       
 65584 +		F95B422D0E0E22D100DBDE83 /* bytereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bytereader.h; path = ../../../common/dwarf/bytereader.h; sourceTree = SOURCE_ROOT; };
       
 65585 +		F95B422E0E0E22D100DBDE83 /* dwarf2enums.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2enums.h; path = ../../../common/dwarf/dwarf2enums.h; sourceTree = SOURCE_ROOT; };
       
 65586 +		F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf2reader.cc; path = ../../../common/dwarf/dwarf2reader.cc; sourceTree = SOURCE_ROOT; };
       
 65587 +		F95B42300E0E22D100DBDE83 /* dwarf2reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf2reader.h; path = ../../../common/dwarf/dwarf2reader.h; sourceTree = SOURCE_ROOT; };
       
 65588 +		F95B42310E0E22D100DBDE83 /* line_state_machine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = line_state_machine.h; path = ../../../common/dwarf/line_state_machine.h; sourceTree = SOURCE_ROOT; };
       
 65589 +		F9C7ED420E8AD93000E953AD /* functioninfo.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = functioninfo.cc; path = ../../../common/dwarf/functioninfo.cc; sourceTree = SOURCE_ROOT; };
       
 65590 +		F9F5344D0E7C902C0012363F /* functioninfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = functioninfo.h; path = ../../../common/dwarf/functioninfo.h; sourceTree = SOURCE_ROOT; };
       
 65591  /* End PBXFileReference section */
       
 65592  
       
 65593  /* Begin PBXFrameworksBuildPhase section */
       
 65594  		8DD76F9B0486AA7600D96B5E /* Frameworks */ = {
       
 65595  			isa = PBXFrameworksBuildPhase;
       
 65596  			buildActionMask = 2147483647;
       
 65597  			files = (
       
 65598  				8DD76F9C0486AA7600D96B5E /* Foundation.framework in Frameworks */,
       
 65599 diff --git a/toolkit/crashreporter/google-breakpad/src/tools/windows/symupload/symupload.cc b/toolkit/crashreporter/google-breakpad/src/tools/windows/symupload/symupload.cc
       
 65600 --- a/toolkit/crashreporter/google-breakpad/src/tools/windows/symupload/symupload.cc
       
 65601 +++ b/toolkit/crashreporter/google-breakpad/src/tools/windows/symupload/symupload.cc
       
 65602 @@ -126,43 +126,65 @@ static bool DumpSymbolsToTempFile(const 
       
 65603  
       
 65604    wchar_t temp_filename[_MAX_PATH];
       
 65605    if (GetTempFileName(temp_path, L"sym", 0, temp_filename) == 0) {
       
 65606      return false;
       
 65607    }
       
 65608  
       
 65609    FILE *temp_file = NULL;
       
 65610  #if _MSC_VER >= 1400  // MSVC 2005/8
       
 65611 -  if (_wfopen_s(&temp_file, temp_filename, L"w") != 0) {
       
 65612 +  if (_wfopen_s(&temp_file, temp_filename, L"w") != 0)
       
 65613  #else  // _MSC_VER >= 1400
       
 65614    // _wfopen_s was introduced in MSVC8.  Use _wfopen for earlier environments.
       
 65615    // Don't use it with MSVC8 and later, because it's deprecated.
       
 65616 -  if (!(temp_file = _wfopen(temp_filename, L"w"))) {
       
 65617 +  if (!(temp_file = _wfopen(temp_filename, L"w")))
       
 65618  #endif  // _MSC_VER >= 1400
       
 65619 +  {
       
 65620      return false;
       
 65621    }
       
 65622  
       
 65623    bool success = writer.WriteMap(temp_file);
       
 65624    fclose(temp_file);
       
 65625    if (!success) {
       
 65626      _wunlink(temp_filename);
       
 65627      return false;
       
 65628    }
       
 65629  
       
 65630    *temp_file_path = temp_filename;
       
 65631  
       
 65632    return writer.GetModuleInfo(pdb_info);
       
 65633  }
       
 65634  
       
 65635 +void printUsageAndExit() {
       
 65636 +  wprintf(L"Usage: symupload [--timeout NN] <file.exe|file.dll> <symbol upload URL>\n\n");
       
 65637 +  wprintf(L"Timeout is in milliseconds, or can be 0 to be unlimited\n\n");
       
 65638 +  wprintf(L"Example:\n\n\tsymupload.exe --timeout 0 chrome.dll http://no.free.symbol.server.for.you\n");
       
 65639 +  exit(0);
       
 65640 +}
       
 65641  int wmain(int argc, wchar_t *argv[]) {
       
 65642 -  if (argc < 3) {
       
 65643 -    wprintf(L"Usage: %s <file.exe|file.dll> <symbol upload URL>\n", argv[0]);
       
 65644 -    return 0;
       
 65645 +  if ((argc != 3) &&
       
 65646 +      (argc != 5)) {
       
 65647 +    printUsageAndExit();
       
 65648    }
       
 65649 -  const wchar_t *module = argv[1], *url = argv[2];
       
 65650 +
       
 65651 +  const wchar_t *module, *url;
       
 65652 +  int timeout = -1;
       
 65653 +  if (argc == 3) {
       
 65654 +    module = argv[1];
       
 65655 +    url = argv[2];
       
 65656 +  } else {
       
 65657 +    // check for timeout flag
       
 65658 +    if (!wcscmp(L"--timeout", argv[1])) {
       
 65659 +      timeout  = _wtoi(argv[2]);
       
 65660 +      module = argv[3];
       
 65661 +      url = argv[4];
       
 65662 +    } else {
       
 65663 +      printUsageAndExit();
       
 65664 +    }
       
 65665 +  }
       
 65666  
       
 65667    wstring symbol_file;
       
 65668    PDBModuleInfo pdb_info;
       
 65669    if (!DumpSymbolsToTempFile(module, &symbol_file, &pdb_info)) {
       
 65670      fwprintf(stderr, L"Could not get symbol data from %s\n", module);
       
 65671      return 1;
       
 65672    }
       
 65673  
       
 65674 @@ -181,16 +203,17 @@ int wmain(int argc, wchar_t *argv[]) {
       
 65675    if (GetFileVersionString(module, &file_version)) {
       
 65676      parameters[L"version"] = file_version;
       
 65677    } else {
       
 65678      fwprintf(stderr, L"Warning: Could not get file version for %s\n", module);
       
 65679    }
       
 65680  
       
 65681    bool success = HTTPUpload::SendRequest(url, parameters,
       
 65682                                           symbol_file, L"symbol_file",
       
 65683 +										 timeout == -1 ? NULL : &timeout,
       
 65684                                           NULL, NULL);
       
 65685    _wunlink(symbol_file.c_str());
       
 65686  
       
 65687    if (!success) {
       
 65688      fwprintf(stderr, L"Symbol file upload failed\n");
       
 65689      return 1;
       
 65690    }
       
 65691  
       
 65692 diff --git a/toolkit/crashreporter/test/unit/test_crashreporter_crash_profile_lock.js b/toolkit/crashreporter/test/unit/test_crashreporter_crash_profile_lock.js
       
 65693 new file mode 100644
       
 65694 --- /dev/null
       
 65695 +++ b/toolkit/crashreporter/test/unit/test_crashreporter_crash_profile_lock.js
       
 65696 @@ -0,0 +1,27 @@
       
 65697 +function run_test()
       
 65698 +{
       
 65699 +  if (!("@mozilla.org/toolkit/crash-reporter;1" in Components.classes)) {
       
 65700 +    dump("INFO | test_crashreporter.js | Can't test crashreporter in a non-libxul build.\n");
       
 65701 +    return;
       
 65702 +  }
       
 65703 +
       
 65704 +  // lock a profile directory, crash, and ensure that
       
 65705 +  // the profile lock signal handler doesn't interfere with
       
 65706 +  // writing a minidump
       
 65707 +  do_crash(function() {
       
 65708 +             let env = Components.classes["@mozilla.org/process/environment;1"]
       
 65709 +               .getService(Components.interfaces.nsIEnvironment);
       
 65710 +             // the python harness sets this in the environment for us
       
 65711 +             let profd = env.get("XPCSHELL_TEST_PROFILE_DIR");
       
 65712 +             let dir = Components.classes["@mozilla.org/file/local;1"]
       
 65713 +               .createInstance(Components.interfaces.nsILocalFile);
       
 65714 +             dir.initWithPath(profd);
       
 65715 +             let mycrasher = Components.classes["@mozilla.org/testcrasher;1"].createInstance(Components.interfaces.nsITestCrasher);
       
 65716 +             let lock = mycrasher.lockDir(dir);
       
 65717 +             // when we crash, the lock file should be cleaned up
       
 65718 +           },
       
 65719 +           function(mdump, extra) {
       
 65720 +             // if we got here, we have a minidump, so that's all we wanted
       
 65721 +             do_check_true(true);
       
 65722 +           });
       
 65723 +}
       
 65724 diff --git a/toolkit/toolkit-makefiles.sh b/toolkit/toolkit-makefiles.sh
       
 65725 --- a/toolkit/toolkit-makefiles.sh
       
 65726 +++ b/toolkit/toolkit-makefiles.sh
       
 65727 @@ -690,16 +690,17 @@ MAKEFILES_embedding="
       
 65728  
       
 65729  MAKEFILES_xulapp="
       
 65730    toolkit/Makefile
       
 65731    toolkit/library/Makefile
       
 65732    toolkit/crashreporter/Makefile
       
 65733    toolkit/crashreporter/client/Makefile
       
 65734    toolkit/crashreporter/google-breakpad/src/client/Makefile
       
 65735    toolkit/crashreporter/google-breakpad/src/client/linux/handler/Makefile
       
 65736 +  toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/Makefile
       
 65737    toolkit/crashreporter/google-breakpad/src/client/mac/handler/Makefile
       
 65738    toolkit/crashreporter/google-breakpad/src/client/solaris/handler/Makefile
       
 65739    toolkit/crashreporter/google-breakpad/src/client/windows/crash_generation/Makefile
       
 65740    toolkit/crashreporter/google-breakpad/src/client/windows/handler/Makefile
       
 65741    toolkit/crashreporter/google-breakpad/src/client/windows/sender/Makefile
       
 65742    toolkit/crashreporter/google-breakpad/src/common/Makefile
       
 65743    toolkit/crashreporter/google-breakpad/src/common/linux/Makefile
       
 65744    toolkit/crashreporter/google-breakpad/src/common/mac/Makefile
       
 65745 diff --git a/toolkit/xre/Makefile.in b/toolkit/xre/Makefile.in
       
 65746 --- a/toolkit/xre/Makefile.in
       
 65747 +++ b/toolkit/xre/Makefile.in
       
 65748 @@ -182,16 +182,17 @@ SHARED_LIBRARY_LIBS += \
       
 65749  	$(DEPTH)/toolkit/crashreporter/google-breakpad/src/client/mac/handler/$(LIB_PREFIX)exception_handler_s.$(LIB_SUFFIX) \
       
 65750  	$(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/$(LIB_PREFIX)breakpad_common_s.$(LIB_SUFFIX) \
       
 65751  	$(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/mac/$(LIB_PREFIX)breakpad_mac_common_s.$(LIB_SUFFIX)
       
 65752  endif
       
 65753  
       
 65754  ifeq ($(OS_ARCH),Linux)
       
 65755  SHARED_LIBRARY_LIBS += \
       
 65756    $(DEPTH)/toolkit/crashreporter/google-breakpad/src/client/linux/handler/$(LIB_PREFIX)exception_handler_s.$(LIB_SUFFIX) \
       
 65757 +  $(DEPTH)/toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/$(LIB_PREFIX)minidump_writer_s.$(LIB_SUFFIX) \
       
 65758    $(DEPTH)/toolkit/crashreporter/google-breakpad/src/client/$(LIB_PREFIX)minidump_file_writer_s.$(LIB_SUFFIX) \
       
 65759    $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/$(LIB_PREFIX)breakpad_common_s.$(LIB_SUFFIX) \
       
 65760    $(DEPTH)/toolkit/crashreporter/google-breakpad/src/common/linux/$(LIB_PREFIX)breakpad_linux_common_s.$(LIB_SUFFIX) \
       
 65761    $(NULL)
       
 65762  endif
       
 65763  
       
 65764  ifeq ($(OS_ARCH),SunOS)
       
 65765  SHARED_LIBRARY_LIBS += \