Backed out changeset cd02e40945d6 (bug 839126)
authorEd Morley <emorley@mozilla.com>
Thu, 07 Feb 2013 18:14:06 +0000
changeset 121182 c4b69b5d4189630fb83c64b741c767e7b8f66623
parent 121181 cd02e40945d646631060324b0d6aa64d3cfd6066
child 121183 968921905c8147e26afb9dd60dddc401642cf1a4
push idunknown
push userunknown
push dateunknown
bugs839126
milestone21.0a1
backs outcd02e40945d646631060324b0d6aa64d3cfd6066
Backed out changeset cd02e40945d6 (bug 839126)
toolkit/crashreporter/breakpad-patches/00-module-api-extras.patch
toolkit/crashreporter/breakpad-patches/01-dump-symbols-just-cfi.patch
toolkit/crashreporter/breakpad-patches/02-cfi-rule-repr.patch
toolkit/crashreporter/breakpad-patches/03-unique-string.patch
toolkit/crashreporter/breakpad-patches/04-uniquestringmap.patch
toolkit/crashreporter/breakpad-patches/05-androidfixup.patch
toolkit/crashreporter/breakpad-patches/06-readsymboldata-mac
toolkit/crashreporter/breakpad-patches/06-readsymboldata-mac.patch
toolkit/crashreporter/google-breakpad/SVN-INFO
toolkit/crashreporter/google-breakpad/src/client/ios/BreakpadController.h
toolkit/crashreporter/google-breakpad/src/client/ios/BreakpadController.mm
toolkit/crashreporter/google-breakpad/src/client/linux/handler/exception_handler_unittest.cc
toolkit/crashreporter/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc
toolkit/crashreporter/google-breakpad/src/common/android/breakpad_getcontext_unittest.cc
toolkit/crashreporter/google-breakpad/src/common/android/testing/mkdtemp.h
toolkit/crashreporter/google-breakpad/src/common/dwarf_cfi_to_module.cc
toolkit/crashreporter/google-breakpad/src/common/dwarf_cfi_to_module_unittest.cc
toolkit/crashreporter/google-breakpad/src/common/dwarf_cu_to_module.cc
toolkit/crashreporter/google-breakpad/src/common/linux/dump_symbols.cc
toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.h
toolkit/crashreporter/google-breakpad/src/common/mac/dump_syms.mm
toolkit/crashreporter/google-breakpad/src/common/module.cc
toolkit/crashreporter/google-breakpad/src/common/module.cc.orig
toolkit/crashreporter/google-breakpad/src/common/module_unittest.cc
toolkit/crashreporter/google-breakpad/src/common/symbol_data.h
toolkit/crashreporter/google-breakpad/src/common/unique_string.cc
toolkit/crashreporter/google-breakpad/src/common/unique_string.h
toolkit/crashreporter/google-breakpad/src/processor/basic_source_line_resolver_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/cfi_frame_info.cc
toolkit/crashreporter/google-breakpad/src/processor/cfi_frame_info_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/fast_source_line_resolver_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/minidump_stackwalk.cc
toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator-inl.h
toolkit/crashreporter/google-breakpad/src/processor/postfix_evaluator_unittest.cc
toolkit/crashreporter/google-breakpad/src/processor/stackwalker_amd64.cc
toolkit/crashreporter/google-breakpad/src/processor/stackwalker_arm.cc
toolkit/crashreporter/google-breakpad/src/processor/stackwalker_x86.cc
toolkit/crashreporter/google-breakpad/src/third_party/glog/google-glog.sln
toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj.orig
--- a/toolkit/crashreporter/breakpad-patches/00-module-api-extras.patch
+++ b/toolkit/crashreporter/breakpad-patches/00-module-api-extras.patch
@@ -1,46 +1,70 @@
 # HG changeset patch
 # User Ted Mielczarek <ted@mielczarek.org>
 # Date 1352220493 18000
-# Node ID a38d670da97e338234375756313b2f47650e01fb
-# Parent  201b7c6793586b6b7cfcaa02f4e29700c4c12ef1
+# Node ID af59ab8ee1ff8efa2a5e9d53fa494bb17ebad582
+# Parent 1b7cd930bef43cf597e66fefba27218affa724d6
 Add APIs for querying Module data
 R=glandium at https://breakpad.appspot.com/511003/
 
 diff --git a/src/common/module.cc b/src/common/module.cc
 --- a/src/common/module.cc
 +++ b/src/common/module.cc
-@@ -63,7 +63,7 @@
+@@ -58,17 +58,17 @@
+ 
+ Module::~Module() {
+   for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); ++it)
+     delete it->second;
+   for (FunctionSet::iterator it = functions_.begin();
         it != functions_.end(); ++it) {
      delete *it;
    }
 -  for (vector<StackFrameEntry *>::iterator it = stack_frame_entries_.begin();
 +  for (StackFrameEntrySet::iterator it = stack_frame_entries_.begin();
         it != stack_frame_entries_.end(); ++it) {
      delete *it;
    }
-@@ -93,8 +93,14 @@
+   for (ExternSet::iterator it = externs_.begin(); it != externs_.end(); ++it)
+     delete *it;
+ }
+ 
+ void Module::SetLoadAddress(Address address) {
+@@ -88,39 +88,84 @@
+ }
+ 
+ void Module::AddFunctions(vector<Function *>::iterator begin,
+                           vector<Function *>::iterator end) {
+   for (vector<Function *>::iterator it = begin; it != end; ++it)
      AddFunction(*it);
  }
  
 -void Module::AddStackFrameEntry(StackFrameEntry *stack_frame_entry) {
 -  stack_frame_entries_.push_back(stack_frame_entry);
 +void Module::AddStackFrameEntry(StackFrameEntry* stack_frame_entry) {
 +  std::pair<StackFrameEntrySet::iterator,bool> ret =
 +      stack_frame_entries_.insert(stack_frame_entry);
 +  if (!ret.second) {
 +    // Free the duplicate that was not inserted because this Module
 +    // now owns it.
 +    delete stack_frame_entry;
 +  }
  }
  
  void Module::AddExtern(Extern *ext) {
-@@ -111,11 +117,50 @@
+   std::pair<ExternSet::iterator,bool> ret = externs_.insert(ext);
+   if (!ret.second) {
+     // Free the duplicate that was not inserted because this Module
+     // now owns it.
+     delete ext;
+   }
+ }
+ 
+ void Module::GetFunctions(vector<Function *> *vec,
+                           vector<Function *>::iterator i) {
    vec->insert(i, functions_.begin(), functions_.end());
  }
  
 +template<typename T>
 +bool EntryContainsAddress(T entry, Module::Address address) {
 +  return entry->address <= address && address < entry->address + entry->size;
 +}
 +
@@ -81,17 +105,27 @@ diff --git a/src/common/module.cc b/src/
 +    return NULL;
 +
 +  return *it;
 +}
 +
  Module::File *Module::FindFile(const string &name) {
    // A tricky bit here.  The key of each map entry needs to be a
    // pointer to the entry's File's name string.  This means that we
-@@ -155,8 +200,25 @@
+   // can't do the initial lookup with any operation that would create
+   // an empty entry for us if the name isn't found (like, say,
+   // operator[] or insert do), because such a created entry's key will
+   // be a pointer the string passed as our argument.  Since the key of
+   // a map's value type is const, we can't fix it up once we've
+@@ -150,18 +195,35 @@
+ }
+ 
+ void Module::GetFiles(vector<File *> *vec) {
+   vec->clear();
+   for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); ++it)
      vec->push_back(it->second);
  }
  
 -void Module::GetStackFrameEntries(vector<StackFrameEntry *> *vec) {
 -  *vec = stack_frame_entries_;
 +void Module::GetStackFrameEntries(vector<StackFrameEntry *>* vec) {
 +  vec->clear();
 +  vec->insert(vec->begin(), stack_frame_entries_.begin(),
@@ -109,124 +143,182 @@ diff --git a/src/common/module.cc b/src/
 +  it--;
 +  if (EntryContainsAddress(*it, address))
 +    return *it;
 +
 +  return NULL;
  }
  
  void Module::AssignSourceIds() {
-@@ -261,7 +323,7 @@
+   // First, give every source file an id of -1.
+   for (FileByNameMap::iterator file_it = files_.begin();
+        file_it != files_.end(); ++file_it) {
+     file_it->second->source_id = -1;
+   }
+@@ -256,17 +318,17 @@
+            << (ext->address - load_address_) << " 0 "
+            << ext->name << dec << endl;
+     if (!stream.good())
+       return ReportError();
+   }
  
    if (cfi) {
      // Write out 'STACK CFI INIT' and 'STACK CFI' records.
 -    vector<StackFrameEntry *>::const_iterator frame_it;
 +    StackFrameEntrySet::const_iterator frame_it;
      for (frame_it = stack_frame_entries_.begin();
           frame_it != stack_frame_entries_.end(); ++frame_it) {
        StackFrameEntry *entry = *frame_it;
+       stream << "STACK CFI INIT " << hex
+              << (entry->address - load_address_) << " "
+              << entry->size << " " << dec;
+       if (!stream.good()
+           || !WriteRuleMap(entry->initial_rules, stream))
 diff --git a/src/common/module.h b/src/common/module.h
 --- a/src/common/module.h
 +++ b/src/common/module.h
-@@ -168,6 +168,13 @@
+@@ -163,16 +163,23 @@
+ 
+   struct ExternCompare {
+     bool operator() (const Extern *lhs,
+                      const Extern *rhs) const {
+       return lhs->address < rhs->address;
      }
    };
  
 +  struct StackFrameEntryCompare {
 +    bool operator() (const StackFrameEntry* lhs,
 +                     const StackFrameEntry* rhs) const {
 +      return lhs->address < rhs->address;
 +    }
 +  };
 +
    // Create a new module with the given name, operating system,
    // architecture, and ID string.
    Module(const string &name, const string &os, const string &architecture,
-@@ -227,6 +234,10 @@
+          const string &id);
+   ~Module();
+ 
+   // Set the module's load address to LOAD_ADDRESS; addresses given
+   // for functions and lines will be written to the Breakpad symbol
+@@ -222,37 +229,49 @@
+ 
+   // Insert pointers to the functions added to this module at I in
+   // VEC. The pointed-to Functions are still owned by this module.
+   // (Since this is effectively a copy of the function list, this is
+   // mostly useful for testing; other uses should probably get a more
    // appropriate interface.)
    void GetFunctions(vector<Function *> *vec, vector<Function *>::iterator i);
  
 +  // If this module has a function at ADDRESS, return a pointer to it.
 +  // Otherwise, return NULL.
 +  Function* FindFunctionByAddress(Address address);
 +
    // Insert pointers to the externs added to this module at I in
    // VEC. The pointed-to Externs are still owned by this module.
    // (Since this is effectively a copy of the extern list, this is
-@@ -234,6 +245,10 @@
+   // mostly useful for testing; other uses should probably get a more
    // appropriate interface.)
    void GetExterns(vector<Extern *> *vec, vector<Extern *>::iterator i);
  
 +  // If this module has an extern whose base address is less than ADDRESS,
 +  // return a pointer to it. Otherwise, return NULL.
 +  Extern* FindExternByAddress(Address address);
 +
    // Clear VEC and fill it with pointers to the Files added to this
    // module, sorted by name. The pointed-to Files are still owned by
    // this module. (Since this is effectively a copy of the file list,
-@@ -248,6 +263,10 @@
+   // this is mostly useful for testing; other uses should probably get
+   // a more appropriate interface.)
+   void GetFiles(vector<File *> *vec);
+ 
+   // Clear VEC and fill it with pointers to the StackFrameEntry
+   // objects that have been added to this module. (Since this is
+   // effectively a copy of the stack frame entry list, this is mostly
+   // useful for testing; other uses should probably get
    // a more appropriate interface.)
    void GetStackFrameEntries(vector<StackFrameEntry *> *vec);
  
 +  // If this module has a StackFrameEntry whose address range covers
 +  // ADDRESS, return it. Otherwise return NULL.
 +  StackFrameEntry* FindStackFrameEntryByAddress(Address address);
 +
    // Find those files in this module that are actually referred to by
    // functions' line number data, and assign them source id numbers.
    // Set the source id numbers for all other files --- unused by the
-@@ -301,6 +320,9 @@
+   // source line data --- to -1.  We do this before writing out the
+   // symbol file, at which point we omit any unused files.
+   void AssignSourceIds();
+ 
+   // Call AssignSourceIds, and write this module to STREAM in the
+@@ -296,25 +315,28 @@
+   typedef map<const string *, File *, CompareStringPtrs> FileByNameMap;
+ 
+   // A set containing Function structures, sorted by address.
+   typedef set<Function *, FunctionCompare> FunctionSet;
+ 
    // A set containing Extern structures, sorted by address.
    typedef set<Extern *, ExternCompare> ExternSet;
  
 +  // A set containing StackFrameEntry structures, sorted by address.
 +  typedef set<StackFrameEntry*, StackFrameEntryCompare> StackFrameEntrySet;
 +
    // The module owns all the files and functions that have been added
    // to it; destroying the module frees the Files and Functions these
    // point to.
-@@ -309,7 +331,7 @@
+   FileByNameMap files_;    // This module's source files.
+   FunctionSet functions_;  // This module's functions.
  
    // The module owns all the call frame info entries that have been
    // added to it.
 -  vector<StackFrameEntry *> stack_frame_entries_;
 +  StackFrameEntrySet stack_frame_entries_;
  
    // The module owns all the externs that have been added to it;
    // destroying the module frees the Externs these point to.
+   ExternSet externs_;
+ };
+ 
+ }  // namespace google_breakpad
+ 
 diff --git a/src/common/module_unittest.cc b/src/common/module_unittest.cc
 --- a/src/common/module_unittest.cc
 +++ b/src/common/module_unittest.cc
-@@ -334,11 +334,6 @@
+@@ -329,63 +329,63 @@
+   entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] =
+     "I think I know";
+   m.AddStackFrameEntry(entry3);
+ 
+   // Check that Write writes STACK CFI records properly.
    m.Write(s, true);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
 -               "STACK CFI INIT ddb5f41285aa7757 1486493370dc5073 \n"
 -               "STACK CFI INIT 8064f3af5e067e38 de2a5ee55509407"
 -               " .cfa: I think that I shall never see"
 -               " cannoli: a tree whose hungry mouth is prest"
 -               " stromboli: a poem lovely as a tree\n"
                 "STACK CFI INIT 5e8d0db0a7075c6c 1c7edb12a7aea229"
                 " .cfa: Whose woods are these\n"
                 "STACK CFI 36682fad3763ffff"
-@@ -346,7 +341,12 @@
+                " .cfa: I think I know"
                 " stromboli: his house is in\n"
                 "STACK CFI 47ceb0f63c269d7f"
                 " calzone: the village though"
 -               " cannoli: he will not see me stopping here\n",
 +               " cannoli: he will not see me stopping here\n"
 +               "STACK CFI INIT 8064f3af5e067e38 de2a5ee55509407"
 +               " .cfa: I think that I shall never see"
 +               " cannoli: a tree whose hungry mouth is prest"
 +               " stromboli: a poem lovely as a tree\n"
 +               "STACK CFI INIT ddb5f41285aa7757 1486493370dc5073 \n",
                 contents.c_str());
  
    // Check that GetStackFrameEntries works.
-@@ -354,10 +354,18 @@
+   vector<Module::StackFrameEntry *> entries;
    m.GetStackFrameEntries(&entries);
    ASSERT_EQ(3U, entries.size());
    // Check first entry.
 -  EXPECT_EQ(0xddb5f41285aa7757ULL, entries[0]->address);
 -  EXPECT_EQ(0x1486493370dc5073ULL, entries[0]->size);
 -  ASSERT_EQ(0U, entries[0]->initial_rules.size());
 -  ASSERT_EQ(0U, entries[0]->rule_changes.size());
 +  EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[0]->address);
@@ -239,17 +331,21 @@ diff --git a/src/common/module_unittest.
 +  entry1_changes[0x36682fad3763ffffULL]["stromboli"] = "his house is in";
 +  entry1_changes[0x47ceb0f63c269d7fULL]["calzone"] = "the village though";
 +  entry1_changes[0x47ceb0f63c269d7fULL]["cannoli"] =
 +    "he will not see me stopping here";
 +  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(entry1_changes));
    // Check second entry.
    EXPECT_EQ(0x8064f3af5e067e38ULL, entries[1]->address);
    EXPECT_EQ(0x0de2a5ee55509407ULL, entries[1]->size);
-@@ -369,18 +377,10 @@
+   ASSERT_EQ(3U, entries[1]->initial_rules.size());
+   Module::RuleMap entry2_initial;
+   entry2_initial[".cfa"] = "I think that I shall never see";
+   entry2_initial["stromboli"] = "a poem lovely as a tree";
+   entry2_initial["cannoli"] = "a tree whose hungry mouth is prest";
    EXPECT_THAT(entries[1]->initial_rules, ContainerEq(entry2_initial));
    ASSERT_EQ(0U, entries[1]->rule_changes.size());
    // Check third entry.
 -  EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[2]->address);
 -  EXPECT_EQ(0x1c7edb12a7aea229ULL, entries[2]->size);
 -  Module::RuleMap entry3_initial;
 -  entry3_initial[".cfa"] = "Whose woods are these";
 -  EXPECT_THAT(entries[2]->initial_rules, ContainerEq(entry3_initial));
@@ -262,17 +358,27 @@ diff --git a/src/common/module_unittest.
 -  EXPECT_THAT(entries[2]->rule_changes, ContainerEq(entry3_changes));
 +  EXPECT_EQ(0xddb5f41285aa7757ULL, entries[2]->address);
 +  EXPECT_EQ(0x1486493370dc5073ULL, entries[2]->size);
 +  ASSERT_EQ(0U, entries[2]->initial_rules.size());
 +  ASSERT_EQ(0U, entries[2]->rule_changes.size());
  }
  
  TEST(Construct, UniqueFiles) {
-@@ -488,3 +488,150 @@
+   Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+   Module::File *file1 = m.FindFile("foo");
+   Module::File *file2 = m.FindFile(string("bar"));
+   Module::File *file3 = m.FindFile(string("foo"));
+   Module::File *file4 = m.FindFile("bar");
+@@ -483,8 +483,155 @@
+   m.Write(s, true);
+   string contents = s.str();
+ 
+   EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " "
+                MODULE_ID " " MODULE_NAME "\n"
                 "PUBLIC ffff 0 _xyz\n",
                 contents.c_str());
  }
 +
 +TEST(Lookup, Function) {
 +  Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
 +
 +  Module::Function *function1 = new(Module::Function);
--- a/toolkit/crashreporter/breakpad-patches/01-dump-symbols-just-cfi.patch
+++ b/toolkit/crashreporter/breakpad-patches/01-dump-symbols-just-cfi.patch
@@ -1,28 +1,43 @@
 # HG changeset patch
 # User Ted Mielczarek <ted@mielczarek.org>
 # Date 1352220493 18000
-# Node ID e57a7855d118e645730887e2b921dc83f89a25e7
-# Parent  a38d670da97e338234375756313b2f47650e01fb
+# Node ID 0f7f04d2a249b9a9bbc61eb350f177054ab11601
+# Parent 96b3a2bb799eb401c8a80ed6c134289f91eb7436
 Allow reading just CFI data when reading symbols
 R=thestig at https://breakpad.appspot.com/517002/
 
 diff --git a/src/common/linux/dump_symbols.cc b/src/common/linux/dump_symbols.cc
 --- a/src/common/linux/dump_symbols.cc
 +++ b/src/common/linux/dump_symbols.cc
-@@ -510,6 +510,7 @@
+@@ -505,16 +505,17 @@
+ };
+ 
+ template<typename ElfClass>
+ bool LoadSymbols(const string& obj_file,
+                  const bool big_endian,
                   const typename ElfClass::Ehdr* elf_header,
                   const bool read_gnu_debug_link,
                   LoadSymbolsInfo<ElfClass>* info,
 +                 SymbolData symbol_data,
                   Module* module) {
    typedef typename ElfClass::Addr Addr;
    typedef typename ElfClass::Phdr Phdr;
-@@ -530,81 +531,85 @@
+   typedef typename ElfClass::Shdr Shdr;
+ 
+   Addr loading_addr = GetLoadingAddress<ElfClass>(
+       GetOffset<ElfClass, Phdr>(elf_header, elf_header->e_phoff),
+       elf_header->e_phnum);
+@@ -525,91 +526,95 @@
+       GetOffset<ElfClass, Shdr>(elf_header, elf_header->e_shoff);
+   const Shdr* section_names = sections + elf_header->e_shstrndx;
+   const char* names =
+       GetOffset<ElfClass, char>(elf_header, section_names->sh_offset);
+   const char *names_end = names + section_names->sh_size;
    bool found_debug_info_section = false;
    bool found_usable_info = false;
  
 -  // Look for STABS debugging information, and load it if present.
 -  const Shdr* stab_section =
 +  if (symbol_data != ONLY_CFI) {
 +    // Look for STABS debugging information, and load it if present.
 +    const Shdr* stab_section =
@@ -161,79 +176,132 @@ diff --git a/src/common/linux/dump_symbo
 +          LoadDwarfCFI<ElfClass>(obj_file, elf_header, ".eh_frame",
 +                                 eh_frame_section, true,
 +                                 got_section, text_section, big_endian, module);
 +      found_usable_info = found_usable_info || result;
 +    }
    }
  
    if (!found_debug_info_section) {
-@@ -636,7 +641,7 @@
+     fprintf(stderr, "%s: file contains no debugging information"
+             " (no \".stab\" or \".debug_info\" sections)\n",
+             obj_file.c_str());
+ 
+     // Failed, but maybe there's a .gnu_debuglink section?
+@@ -631,17 +636,17 @@
+         } else {
+           fprintf(stderr, ".gnu_debuglink section found in '%s', "
+                   "but no debug path specified.\n", obj_file.c_str());
+         }
+       } else {
          fprintf(stderr, "%s does not contain a .gnu_debuglink section.\n",
                  obj_file.c_str());
        }
 -    } else {
 +    } else if (symbol_data != ONLY_CFI) {
        // The caller doesn't want to consult .gnu_debuglink.
        // See if there are export symbols available.
        const Shdr* dynsym_section =
-@@ -731,7 +736,7 @@
+           FindElfSectionByName<ElfClass>(".dynsym", SHT_DYNSYM,
+                                          sections, names, names_end,
+                                          elf_header->e_shnum);
+       const Shdr* dynstr_section =
+           FindElfSectionByName<ElfClass>(".dynstr", SHT_STRTAB,
+@@ -726,17 +731,17 @@
+   free(c_filename);
+   return base;
+ }
+ 
+ template<typename ElfClass>
  bool ReadSymbolDataElfClass(const typename ElfClass::Ehdr* elf_header,
                               const string& obj_filename,
                               const std::vector<string>& debug_dirs,
 -                             bool cfi,
 +                             SymbolData symbol_data,
                               Module** out_module) {
    typedef typename ElfClass::Ehdr Ehdr;
    typedef typename ElfClass::Shdr Shdr;
-@@ -765,7 +770,8 @@
+ 
+   *out_module = NULL;
+ 
+   unsigned char identifier[16];
+   if (!google_breakpad::FileID::ElfFileIdentifierFromMappedFile(elf_header,
+@@ -760,17 +765,18 @@
+ 
+   string name = BaseFileName(obj_filename);
+   string os = "Linux";
+   string id = FormatIdentifier(identifier);
+ 
    LoadSymbolsInfo<ElfClass> info(debug_dirs);
    scoped_ptr<Module> module(new Module(name, os, architecture, id));
    if (!LoadSymbols<ElfClass>(obj_filename, big_endian, elf_header,
 -                             !debug_dirs.empty(), &info, module.get())) {
 +                             !debug_dirs.empty(), &info,
 +                             symbol_data, module.get())) {
      const string debuglink_file = info.debuglink_file();
      if (debuglink_file.empty())
        return false;
-@@ -803,7 +809,8 @@
+ 
+     // Load debuglink ELF file.
+     fprintf(stderr, "Found debugging info in %s\n", debuglink_file.c_str());
+     MmapWrapper debug_map_wrapper;
+     Ehdr* debug_elf_header = NULL;
+@@ -798,75 +804,76 @@
+       return false;
+     if (debug_big_endian != big_endian) {
+       fprintf(stderr, "%s and %s does not match in endianness\n",
+               obj_filename.c_str(), debuglink_file.c_str());
+       return false;
      }
  
      if (!LoadSymbols<ElfClass>(debuglink_file, debug_big_endian,
 -                               debug_elf_header, false, &info, module.get())) {
 +                               debug_elf_header, false, &info,
 +                               symbol_data, module.get())) {
        return false;
      }
    }
-@@ -820,7 +827,7 @@
+ 
+   *out_module = module.release();
+   return true;
+ }
+ 
+ }  // namespace
+ 
+ namespace google_breakpad {
+ 
+ // Not explicitly exported, but not static so it can be used in unit tests.
  bool ReadSymbolDataInternal(const uint8_t* obj_file,
                              const string& obj_filename,
                              const std::vector<string>& debug_dirs,
 -                            bool cfi,
 +                            SymbolData symbol_data,
                              Module** module) {
  
    if (!IsValidElf(obj_file)) {
-@@ -832,12 +839,12 @@
+     fprintf(stderr, "Not a valid ELF file: %s\n", obj_filename.c_str());
+     return false;
+   }
+ 
+   int elfclass = ElfClass(obj_file);
    if (elfclass == ELFCLASS32) {
      return ReadSymbolDataElfClass<ElfClass32>(
          reinterpret_cast<const Elf32_Ehdr*>(obj_file), obj_filename, debug_dirs,
 -        cfi, module);
 +        symbol_data, module);
    }
    if (elfclass == ELFCLASS64) {
      return ReadSymbolDataElfClass<ElfClass64>(
          reinterpret_cast<const Elf64_Ehdr*>(obj_file), obj_filename, debug_dirs,
 -        cfi, module);
 +        symbol_data, module);
    }
  
    return false;
-@@ -845,20 +852,20 @@
+ }
  
  bool WriteSymbolFile(const string &obj_file,
                       const std::vector<string>& debug_dirs,
 -                     bool cfi,
 +                     SymbolData symbol_data,
                       std::ostream &sym_stream) {
    Module* module;
 -  if (!ReadSymbolData(obj_file, debug_dirs, cfi, &module))
@@ -248,111 +316,163 @@ diff --git a/src/common/linux/dump_symbo
  
  bool ReadSymbolData(const string& obj_file,
                      const std::vector<string>& debug_dirs,
 -                    bool cfi,
 +                    SymbolData symbol_data,
                      Module** module) {
    MmapWrapper map_wrapper;
    void* elf_header = NULL;
-@@ -866,7 +873,7 @@
+   if (!LoadELF(obj_file, &map_wrapper, &elf_header))
      return false;
  
    return ReadSymbolDataInternal(reinterpret_cast<uint8_t*>(elf_header),
 -                                obj_file, debug_dirs, cfi, module);
 +                                obj_file, debug_dirs, symbol_data, module);
  }
  
  }  // namespace google_breakpad
 diff --git a/src/common/linux/dump_symbols.h b/src/common/linux/dump_symbols.h
 --- a/src/common/linux/dump_symbols.h
 +++ b/src/common/linux/dump_symbols.h
-@@ -39,6 +39,7 @@
+@@ -34,36 +34,37 @@
+ 
+ #ifndef COMMON_LINUX_DUMP_SYMBOLS_H__
+ #define COMMON_LINUX_DUMP_SYMBOLS_H__
+ 
+ #include <iostream>
  #include <string>
  #include <vector>
  
 +#include "common/symbol_data.h"
  #include "common/using_std_string.h"
  
  namespace google_breakpad {
-@@ -50,10 +51,10 @@
+ 
+ class Module;
+ 
+ // Find all the debugging information in OBJ_FILE, an ELF executable
+ // or shared library, and write it to SYM_STREAM in the Breakpad symbol
  // file format.
  // If OBJ_FILE has been stripped but contains a .gnu_debuglink section,
  // then look for the debug file in DEBUG_DIRS.
 -// If CFI is set to false, then omit the CFI section.
 +// SYMBOL_DATA allows limiting the type of symbol data written.
  bool WriteSymbolFile(const string &obj_file,
                       const std::vector<string>& debug_dirs,
 -                     bool cfi,
 +                     SymbolData symbol_data,
                       std::ostream &sym_stream);
  
  // As above, but simply return the debugging information in MODULE
-@@ -61,7 +62,7 @@
+ // instead of writing it to a stream. The caller owns the resulting
  // Module object and must delete it when finished.
  bool ReadSymbolData(const string& obj_file,
                      const std::vector<string>& debug_dirs,
 -                    bool cfi,
 +                    SymbolData symbol_data,
                      Module** module);
  
  }  // namespace google_breakpad
+ 
+ #endif  // COMMON_LINUX_DUMP_SYMBOLS_H__
 diff --git a/src/common/linux/dump_symbols_unittest.cc b/src/common/linux/dump_symbols_unittest.cc
 --- a/src/common/linux/dump_symbols_unittest.cc
 +++ b/src/common/linux/dump_symbols_unittest.cc
-@@ -48,7 +48,7 @@
+@@ -43,17 +43,17 @@
+ #include "common/linux/synth_elf.h"
+ #include "common/module.h"
+ #include "common/using_std_string.h"
+ 
+ namespace google_breakpad {
  bool ReadSymbolDataInternal(const uint8_t* obj_file,
                              const string& obj_filename,
                              const std::vector<string>& debug_dir,
 -                            bool cfi,
 +                            SymbolData symbol_data,
                              Module** module);
  }
  
-@@ -86,7 +86,7 @@
+ using google_breakpad::synth_elf::ELF;
+ using google_breakpad::synth_elf::StringTable;
+ using google_breakpad::synth_elf::SymbolTable;
+ using google_breakpad::test_assembler::kLittleEndian;
+ using google_breakpad::test_assembler::Section;
+@@ -81,17 +81,17 @@
+ 
+ TEST_F(DumpSymbols, Invalid) {
+   Elf32_Ehdr header;
+   memset(&header, 0, sizeof(header));
+   Module* module;
    EXPECT_FALSE(ReadSymbolDataInternal(reinterpret_cast<uint8_t*>(&header),
                                        "foo",
                                        vector<string>(),
 -                                      true,
 +                                      ALL_SYMBOL_DATA,
                                        &module));
  }
  
-@@ -118,11 +118,11 @@
+ TEST_F(DumpSymbols, SimplePublic32) {
+   ELF elf(EM_386, ELFCLASS32, kLittleEndian);
+   // Zero out text section for simplicity.
+   Section text(kLittleEndian);
+   text.Append(4096, 0);
+@@ -113,21 +113,21 @@
+ 
+   elf.Finish();
+   GetElfContents(elf);
+ 
+   Module* module;
    EXPECT_TRUE(ReadSymbolDataInternal(elfdata,
                                       "foo",
                                       vector<string>(),
 -                                     true,
 +                                     ALL_SYMBOL_DATA,
                                       &module));
  
    stringstream s;
 -  module->Write(s, true);
 +  module->Write(s, ALL_SYMBOL_DATA);
    EXPECT_EQ("MODULE Linux x86 000000000000000000000000000000000 foo\n"
              "PUBLIC 1000 0 superfunc\n",
              s.str());
-@@ -157,11 +157,11 @@
+   delete module;
+ }
+ 
+ TEST_F(DumpSymbols, SimplePublic64) {
+   ELF elf(EM_X86_64, ELFCLASS64, kLittleEndian);
+@@ -152,17 +152,17 @@
+ 
+   elf.Finish();
+   GetElfContents(elf);
+ 
+   Module* module;
    EXPECT_TRUE(ReadSymbolDataInternal(elfdata,
                                       "foo",
                                       vector<string>(),
 -                                     true,
 +                                     ALL_SYMBOL_DATA,
                                       &module));
  
    stringstream s;
 -  module->Write(s, true);
 +  module->Write(s, ALL_SYMBOL_DATA);
    EXPECT_EQ("MODULE Linux x86_64 000000000000000000000000000000000 foo\n"
              "PUBLIC 1000 0 superfunc\n",
              s.str());
+ }
 diff --git a/src/common/mac/dump_syms.h b/src/common/mac/dump_syms.h
 --- a/src/common/mac/dump_syms.h
 +++ b/src/common/mac/dump_syms.h
-@@ -47,13 +47,15 @@
+@@ -42,23 +42,25 @@
+ 
+ #include <ostream>
+ #include <string>
+ #include <vector>
+ 
  #include "common/byte_cursor.h"
  #include "common/mac/macho_reader.h"
  #include "common/module.h"
 +#include "common/symbol_data.h"
  
  namespace google_breakpad {
  
  class DumpSymbols {
@@ -360,83 +480,128 @@ diff --git a/src/common/mac/dump_syms.h 
 -  DumpSymbols()
 -      : input_pathname_(),
 +  explicit DumpSymbols(SymbolData symbol_data)
 +      : symbol_data_(symbol_data),
 +        input_pathname_(),
          object_filename_(),
          contents_(),
          selected_object_file_(),
-@@ -110,9 +112,9 @@
+         selected_object_name_() { }
+   ~DumpSymbols() {
+     [input_pathname_ release];
+     [object_filename_ release];
+     [contents_ release];
+@@ -105,19 +107,19 @@
+   const struct fat_arch *AvailableArchitectures(size_t *count) {
+     *count = object_files_.size();
+     if (object_files_.size() > 0)
+       return &object_files_[0];
+     return NULL;
    }
  
    // Read the selected object file's debugging information, and write it out to
 -  // |stream|. Write the CFI section if |cfi| is true. Return true on success;
 -  // if an error occurs, report it and return false.
 -  bool WriteSymbolFile(std::ostream &stream, bool cfi);
 +  // |stream|. Return true on success; if an error occurs, report it and
 +  // return false.
 +  bool WriteSymbolFile(std::ostream &stream);
  
   private:
    // Used internally.
-@@ -139,6 +141,9 @@
+   class DumperLineToModule;
+   class LoadCommandDumper;
+ 
+   // Return an identifier string for the file this DumpSymbols is dumping.
+   std::string Identifier();
+@@ -134,16 +136,19 @@
+   // then the data is .eh_frame-format data; otherwise, it is standard DWARF
+   // .debug_frame data. On success, return true; on failure, report
+   // the problem and return false.
+   bool ReadCFI(google_breakpad::Module *module,
+                const mach_o::Reader &macho_reader,
                 const mach_o::Section &section,
                 bool eh_frame) const;
  
 +  // The selection of what type of symbol data to read/write.
 +  const SymbolData symbol_data_;
 +
    // The name of the file or bundle whose symbols this will dump.
    // This is the path given to Read, for use in error messages.
    NSString *input_pathname_;
+ 
+   // The name of the file this DumpSymbols will actually read debugging
+   // information from. Normally, this is the same as input_pathname_, but if
+   // filename refers to a dSYM bundle, then this is the resource file
+   // within that bundle.
 diff --git a/src/common/mac/dump_syms.mm b/src/common/mac/dump_syms.mm
 --- a/src/common/mac/dump_syms.mm
 +++ b/src/common/mac/dump_syms.mm
-@@ -55,6 +55,7 @@
+@@ -50,16 +50,17 @@
+ #include "common/dwarf_cu_to_module.h"
+ #include "common/dwarf_line_to_module.h"
+ #include "common/mac/file_id.h"
+ #include "common/mac/arch_utilities.h"
+ #include "common/mac/macho_reader.h"
  #include "common/module.h"
  #include "common/stabs_reader.h"
  #include "common/stabs_to_module.h"
 +#include "common/symbol_data.h"
  
  #ifndef CPU_TYPE_ARM
  #define CPU_TYPE_ARM (static_cast<cpu_type_t>(12))
-@@ -370,8 +371,12 @@
+ #endif //  CPU_TYPE_ARM
+ 
+ using dwarf2reader::ByteReader;
+ using google_breakpad::DwarfCUToModule;
+ using google_breakpad::DwarfLineToModule;
+@@ -365,52 +366,61 @@
+ // Module.
+ class DumpSymbols::LoadCommandDumper:
+       public mach_o::Reader::LoadCommandHandler {
+  public:
+   // Create a load command dumper handling load commands from READER's
    // file, and adding data to MODULE.
    LoadCommandDumper(const DumpSymbols &dumper,
                      google_breakpad::Module *module,
 -                    const mach_o::Reader &reader)
 -      : dumper_(dumper), module_(module), reader_(reader) { }
 +                    const mach_o::Reader &reader,
 +                    SymbolData symbol_data)
 +      : dumper_(dumper),
 +        module_(module),
 +        reader_(reader),
 +        symbol_data_(symbol_data) { }
  
    bool SegmentCommand(const mach_o::Segment &segment);
    bool SymtabCommand(const ByteBuffer &entries, const ByteBuffer &strings);
-@@ -380,6 +385,7 @@
+ 
+  private:
    const DumpSymbols &dumper_;
    google_breakpad::Module *module_;  // WEAK
    const mach_o::Reader &reader_;
 +  const SymbolData symbol_data_;
  };
  
  bool DumpSymbols::LoadCommandDumper::SegmentCommand(const Segment &segment) {
-@@ -387,7 +393,7 @@
+   mach_o::SectionMap section_map;
    if (!reader_.MapSegmentSections(segment, &section_map))
      return false;
  
 -  if (segment.name == "__TEXT") {
 +  if (segment.name == "__TEXT" && symbol_data_ != NO_CFI) {
      module_->SetLoadAddress(segment.vmaddr);
      mach_o::SectionMap::const_iterator eh_frame =
          section_map.find("__eh_frame");
-@@ -399,13 +405,17 @@
+     if (eh_frame != section_map.end()) {
+       // If there is a problem reading this, don't treat it as a fatal error.
+       dumper_.ReadCFI(module_, reader_, eh_frame->second, true);
+     }
+     return true;
    }
  
    if (segment.name == "__DWARF") {
 -    if (!dumper_.ReadDwarf(module_, reader_, section_map))
 -      return false;
 -    mach_o::SectionMap::const_iterator debug_frame
 -        = section_map.find("__debug_frame");
 -    if (debug_frame != section_map.end()) {
@@ -451,43 +616,68 @@ diff --git a/src/common/mac/dump_syms.mm
 +          = section_map.find("__debug_frame");
 +      if (debug_frame != section_map.end()) {
 +        // If there is a problem reading this, don't treat it as a fatal error.
 +        dumper_.ReadCFI(module_, reader_, debug_frame->second, false);
 +      }
      }
    }
  
-@@ -429,7 +439,7 @@
+   return true;
+ }
+ 
+ bool DumpSymbols::LoadCommandDumper::SymtabCommand(const ByteBuffer &entries,
+                                                    const ByteBuffer &strings) {
+@@ -424,17 +434,17 @@
+                            true,
+                            &stabs_to_module);
+   if (!stabs_reader.Process())
+     return false;
+   stabs_to_module.Finalize();
    return true;
  }
  
 -bool DumpSymbols::WriteSymbolFile(std::ostream &stream, bool cfi) {
 +bool DumpSymbols::WriteSymbolFile(std::ostream &stream) {
    // Select an object file, if SetArchitecture hasn't been called to set one
    // explicitly.
    if (!selected_object_file_) {
-@@ -494,11 +504,11 @@
+     // If there's only one architecture, that's the one.
+     if (object_files_.size() == 1)
+       selected_object_file_ = &object_files_[0];
+     else {
+       // Look for an object file whose architecture matches our own.
+@@ -489,16 +499,16 @@
+   if (!reader.Read(reinterpret_cast<const uint8_t *>([contents_ bytes])
+                    + selected_object_file_->offset,
+                    selected_object_file_->size,
+                    selected_object_file_->cputype,
+                    selected_object_file_->cpusubtype))
      return false;
  
    // Walk its load commands, and deal with whatever is there.
 -  LoadCommandDumper load_command_dumper(*this, &module, reader);
 +  LoadCommandDumper load_command_dumper(*this, &module, reader, symbol_data_);
    if (!reader.WalkLoadCommands(&load_command_dumper))
      return false;
  
 -  return module.Write(stream, cfi);
 +  return module.Write(stream, symbol_data_);
  }
  
  }  // namespace google_breakpad
 diff --git a/src/common/module.cc b/src/common/module.cc
 --- a/src/common/module.cc
 +++ b/src/common/module.cc
-@@ -266,62 +266,64 @@
+@@ -256,72 +256,74 @@
+        it != rule_map.end(); ++it) {
+     if (it != rule_map.begin())
+       stream << ' ';
+     stream << it->first << ": " << it->second;
+   }
    return stream.good();
  }
  
 -bool Module::Write(std::ostream &stream, bool cfi) {
 +bool Module::Write(std::ostream &stream, SymbolData symbol_data) {
    stream << "MODULE " << os_ << " " << architecture_ << " "
           << id_ << " " << name_ << endl;
    if (!stream.good())
@@ -587,28 +777,48 @@ diff --git a/src/common/module.cc b/src/
 -      return ReportError();
 -  }
 -
 -  if (cfi) {
 +  if (symbol_data != NO_CFI) {
      // Write out 'STACK CFI INIT' and 'STACK CFI' records.
      StackFrameEntrySet::const_iterator frame_it;
      for (frame_it = stack_frame_entries_.begin();
+          frame_it != stack_frame_entries_.end(); ++frame_it) {
+       StackFrameEntry *entry = *frame_it;
+       stream << "STACK CFI INIT " << hex
+              << (entry->address - load_address_) << " "
+              << entry->size << " " << dec;
 diff --git a/src/common/module.h b/src/common/module.h
 --- a/src/common/module.h
 +++ b/src/common/module.h
-@@ -44,6 +44,7 @@
+@@ -39,16 +39,17 @@
+ #define COMMON_LINUX_MODULE_H__
+ 
+ #include <iostream>
+ #include <map>
+ #include <set>
  #include <string>
  #include <vector>
  
 +#include "common/symbol_data.h"
  #include "common/using_std_string.h"
  #include "google_breakpad/common/breakpad_types.h"
  
-@@ -278,13 +279,15 @@
+ namespace google_breakpad {
+ 
+ using std::set;
+ using std::vector;
+ using std::map;
+@@ -273,23 +274,25 @@
+   // source line data --- to -1.  We do this before writing out the
+   // symbol file, at which point we omit any unused files.
+   void AssignSourceIds();
+ 
+   // Call AssignSourceIds, and write this module to STREAM in the
    // breakpad symbol format. Return true if all goes well, or false if
    // an error occurs. This method writes out:
    // - a header based on the values given to the constructor,
 +  // If symbol_data is not ONLY_CFI then:
    // - the source files added via FindFile,
    // - the functions added via AddFunctions, each with its lines,
    // - all public records,
 -  // - and if CFI is true, all CFI records.
@@ -616,118 +826,233 @@ diff --git a/src/common/module.h b/src/c
 +  // - all CFI records.
    // Addresses in the output are all relative to the load address
    // established by SetLoadAddress.
 -  bool Write(std::ostream &stream, bool cfi);
 +  bool Write(std::ostream &stream, SymbolData symbol_data);
  
   private:
    // Report an error that has occurred writing the symbol file, using
+   // errno to find the appropriate cause.  Return false.
+   static bool ReportError();
+ 
+   // Write RULE_MAP to STREAM, in the form appropriate for 'STACK CFI'
+   // records, without a final newline. Return true if all goes well;
 diff --git a/src/common/module_unittest.cc b/src/common/module_unittest.cc
 --- a/src/common/module_unittest.cc
 +++ b/src/common/module_unittest.cc
-@@ -70,7 +70,7 @@
+@@ -65,17 +65,17 @@
+ #define MODULE_NAME "name with spaces"
+ #define MODULE_OS "os-name"
+ #define MODULE_ARCH "architecture"
+ #define MODULE_ID "id-string"
+ 
  TEST(Write, Header) {
    stringstream s;
    Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n",
                 contents.c_str());
-@@ -91,7 +91,7 @@
+ }
+ 
+ TEST(Write, OneLineFunc) {
+   stringstream s;
+   Module m(MODULE_NAME, MODULE_OS, MODULE_ARCH, MODULE_ID);
+@@ -86,17 +86,17 @@
+   function->address = 0xe165bf8023b9d9abLL;
+   function->size = 0x1e4bb0eb1cbf5b09LL;
+   function->parameter_size = 0x772beee89114358aLL;
+   Module::Line line = { 0xe165bf8023b9d9abLL, 0x1e4bb0eb1cbf5b09LL,
+                         file, 67519080 };
    function->lines.push_back(line);
    m.AddFunction(function);
  
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
                 "FILE 0 file_name.cc\n"
-@@ -141,7 +141,7 @@
+                "FUNC e165bf8023b9d9ab 1e4bb0eb1cbf5b09 772beee89114358a"
+                " function_name\n"
+                "e165bf8023b9d9ab 1e4bb0eb1cbf5b09 67519080 0\n",
+                contents.c_str());
+ }
+@@ -136,17 +136,17 @@
+     "do you like your blueeyed boy";
+   entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death";
+   m.AddStackFrameEntry(entry);
+ 
+   // Set the load address.  Doing this after adding all the data to
    // the module must work fine.
    m.SetLoadAddress(0x2ab698b0b6407073LL);
  
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
                 "FILE 0 filename-a.cc\n"
-@@ -197,7 +197,7 @@
+                "FILE 1 filename-b.cc\n"
+                "FUNC 9410dc39a798c580 2922088f98d3f6fc e5e9aa008bd5f0d0"
+                " A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\n"
+                "b03cc3106d47eb91 cf621b8d324d0eb 67519080 0\n"
+                "9410dc39a798c580 1c2be6d6c5af2611 41676901 1\n"
+@@ -192,17 +192,17 @@
+   EXPECT_NE(-1, vec[0]->source_id);
+   // Expect filename2 not to be used.
+   EXPECT_STREQ("filename2", vec[1]->name.c_str());
+   EXPECT_EQ(-1, vec[1]->source_id);
+   EXPECT_STREQ("filename3", vec[2]->name.c_str());
    EXPECT_NE(-1, vec[2]->source_id);
  
    stringstream s;
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
                 "FILE 0 filename1\n"
-@@ -245,7 +245,7 @@
+                "FILE 1 filename3\n"
+                "FUNC 9b926d464f0b9384 4f524a4ba795e6a6 bbe8133a6641c9b7"
+                " function_name\n"
+                "595fa44ebacc1086 1e1e0191b066c5b3 137850127 0\n"
+                "401ce8c8a12d25e3 895751c41b8d2ce2 28113549 1\n",
+@@ -240,17 +240,17 @@
+     "do you like your blueeyed boy";
+   entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death";
+   m.AddStackFrameEntry(entry);
+ 
+   // Set the load address.  Doing this after adding all the data to
    // the module must work fine.
    m.SetLoadAddress(0x2ab698b0b6407073LL);
  
 -  m.Write(s, false);
 +  m.Write(s, NO_CFI);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
                 "FILE 0 filename.cc\n"
-@@ -279,7 +279,7 @@
+                "FUNC 9410dc39a798c580 2922088f98d3f6fc e5e9aa008bd5f0d0"
+                " A_FLIBBERTIJIBBET::a_will_o_the_wisp(a clown)\n"
+                "9410dc39a798c580 1c2be6d6c5af2611 41676901 0\n",
+                contents.c_str());
+ }
+@@ -274,17 +274,17 @@
+ 
+   // Put them in a vector.
+   vector<Module::Function *> vec;
+   vec.push_back(function1);
+   vec.push_back(function2);
  
    m.AddFunctions(vec.begin(), vec.end());
  
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
                 "FUNC 2987743d0b35b13f b369db048deb3010 938e556cb5a79988"
-@@ -331,7 +331,7 @@
+                " _and_void\n"
+                "FUNC d35024aa7ca7da5c 200b26e605f99071 f14ac4fed48c4a99"
+                " _without_form\n",
+                contents.c_str());
+ 
+@@ -326,17 +326,17 @@
+     "he will not see me stopping here";
+   entry3->rule_changes[0x36682fad3763ffffULL]["stromboli"] =
+     "his house is in";
+   entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] =
+     "I think I know";
    m.AddStackFrameEntry(entry3);
  
    // Check that Write writes STACK CFI records properly.
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
                 "STACK CFI INIT 5e8d0db0a7075c6c 1c7edb12a7aea229"
-@@ -407,7 +407,7 @@
+                " .cfa: Whose woods are these\n"
+                "STACK CFI 36682fad3763ffff"
+                " .cfa: I think I know"
+                " stromboli: his house is in\n"
+                "STACK CFI 47ceb0f63c269d7f"
+@@ -402,17 +402,17 @@
+ 
+   // Two functions.
+   Module::Function *function1 = generate_duplicate_function("_without_form");
+   Module::Function *function2 = generate_duplicate_function("_without_form");
+ 
    m.AddFunction(function1);
    m.AddFunction(function2);
  
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
                 "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99"
-@@ -426,7 +426,7 @@
+                " _without_form\n",
+                contents.c_str());
+ }
+ 
+ TEST(Construct, FunctionsWithSameAddress) {
+@@ -421,17 +421,17 @@
+ 
+   // Two functions.
+   Module::Function *function1 = generate_duplicate_function("_without_form");
+   Module::Function *function2 = generate_duplicate_function("_and_void");
+ 
    m.AddFunction(function1);
    m.AddFunction(function2);
  
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
    EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
                 "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99"
-@@ -453,7 +453,7 @@
+                " _and_void\n"
+                "FUNC d35402aac7a7ad5c 200b26e605f99071 f14ac4fed48c4a99"
+                " _without_form\n",
+                contents.c_str());
+ }
+@@ -448,17 +448,17 @@
+   extern1->name = "_abc";
+   Module::Extern *extern2 = new(Module::Extern);
+   extern2->address = 0xaaaa;
+   extern2->name = "_xyz";
+ 
    m.AddExtern(extern1);
    m.AddExtern(extern2);
  
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
  
    EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " "
-@@ -480,7 +480,7 @@
+                MODULE_ID " " MODULE_NAME "\n"
+                "PUBLIC aaaa 0 _xyz\n"
+                "PUBLIC ffff 0 _abc\n",
+                contents.c_str());
+ }
+@@ -475,17 +475,17 @@
+   extern1->name = "_xyz";
+   Module::Extern *extern2 = new(Module::Extern);
+   extern2->address = 0xffff;
+   extern2->name = "_abc";
+ 
    m.AddExtern(extern1);
    m.AddExtern(extern2);
  
 -  m.Write(s, true);
 +  m.Write(s, ALL_SYMBOL_DATA);
    string contents = s.str();
  
    EXPECT_STREQ("MODULE " MODULE_OS " " MODULE_ARCH " "
+                MODULE_ID " " MODULE_NAME "\n"
+                "PUBLIC ffff 0 _xyz\n",
+                contents.c_str());
+ }
+ 
 diff --git a/src/common/symbol_data.h b/src/common/symbol_data.h
 new file mode 100644
 --- /dev/null
 +++ b/src/common/symbol_data.h
 @@ -0,0 +1,42 @@
 +// -*- mode: c++ -*-
 +
 +// Copyright (c) 2013 Google Inc.
@@ -768,39 +1093,67 @@ new file mode 100644
 +  NO_CFI,
 +  ONLY_CFI
 +};
 +
 +#endif  // COMMON_SYMBOL_DATA_H_
 diff --git a/src/tools/linux/dump_syms/dump_syms.cc b/src/tools/linux/dump_syms/dump_syms.cc
 --- a/src/tools/linux/dump_syms/dump_syms.cc
 +++ b/src/tools/linux/dump_syms/dump_syms.cc
-@@ -68,7 +68,8 @@
+@@ -63,15 +63,16 @@
+   std::vector<string> debug_dirs;
+   binary = argv[binary_index];
+   for (int debug_dir_index = binary_index + 1;
+        debug_dir_index < argc;
+        ++debug_dir_index) {
      debug_dirs.push_back(argv[debug_dir_index]);
    }
  
 -  if (!WriteSymbolFile(binary, debug_dirs, cfi, std::cout)) {
 +  SymbolData symbol_data = cfi ? ALL_SYMBOL_DATA : NO_CFI;
 +  if (!WriteSymbolFile(binary, debug_dirs, symbol_data, std::cout)) {
      fprintf(stderr, "Failed to write symbol file.\n");
      return 1;
    }
+ 
+   return 0;
+ }
 diff --git a/src/tools/mac/dump_syms/dump_syms_tool.mm b/src/tools/mac/dump_syms/dump_syms_tool.mm
 --- a/src/tools/mac/dump_syms/dump_syms_tool.mm
 +++ b/src/tools/mac/dump_syms/dump_syms_tool.mm
-@@ -54,7 +54,7 @@
+@@ -49,17 +49,17 @@
+   Options() : srcPath(), arch(), cfi(true) { }
+   NSString *srcPath;
+   const NXArchInfo *arch;
+   bool cfi;
+ };
  
  //=============================================================================
  static bool Start(const Options &options) {
 -  DumpSymbols dump_symbols;
 +  DumpSymbols dump_symbols(options.cfi ? ALL_SYMBOL_DATA : NO_CFI);
  
    if (!dump_symbols.Read(options.srcPath))
      return false;
-@@ -86,7 +86,7 @@
+ 
+   if (options.arch) {
+     if (!dump_symbols.SetArchitecture(options.arch->cputype,
+                                       options.arch->cpusubtype)) {
+       fprintf(stderr, "%s: no architecture '%s' is present in file.\n",
+@@ -81,17 +81,17 @@
+         else
+           fprintf(stderr, "unrecognized cpu type 0x%x, subtype 0x%x\n",
+                   arch->cputype, arch->cpusubtype);
+       }
+       return false;
      }
    }
  
 -  return dump_symbols.WriteSymbolFile(std::cout, options.cfi);
 +  return dump_symbols.WriteSymbolFile(std::cout);
  }
  
  //=============================================================================
+ static void Usage(int argc, const char *argv[]) {
+   fprintf(stderr, "Output a Breakpad symbol file from a Mach-o file.\n");
+   fprintf(stderr, "Usage: %s [-a ARCHITECTURE] [-c] <Mach-o file>\n",
+           argv[0]);
+   fprintf(stderr, "\t-a: Architecture type [default: native, or whatever is\n");
--- a/toolkit/crashreporter/breakpad-patches/02-cfi-rule-repr.patch
+++ b/toolkit/crashreporter/breakpad-patches/02-cfi-rule-repr.patch
@@ -1,198 +1,381 @@
 # HG changeset patch
-# User Ted Mielczarek <ted.mielczarek@gmail.com>
-# Date 1360255133 18000
-# Node ID dc6d795f6d0b9357f39ac2a291be4e1c533d3c09
-# Parent  e57a7855d118e645730887e2b921dc83f89a25e7
+# Parent f98602ca29804c34e143d3fb337e6dde3e1c558c
 Change the representation of CFI rules to avoid postfix expressions in most cases
 Patch by Julian Seward <jseward@acm.org>
-R=ted
 
 diff --git a/Makefile.am b/Makefile.am
 --- a/Makefile.am
 +++ b/Makefile.am
-@@ -138,6 +138,7 @@
+@@ -133,16 +133,17 @@
+ 	src/google_breakpad/processor/source_line_resolver_base.h \
+ 	src/google_breakpad/processor/source_line_resolver_interface.h \
+ 	src/google_breakpad/processor/stack_frame.h \
+ 	src/google_breakpad/processor/stack_frame_cpu.h \
+ 	src/google_breakpad/processor/stack_frame_symbolizer.h \
  	src/google_breakpad/processor/stackwalker.h \
  	src/google_breakpad/processor/symbol_supplier.h \
  	src/google_breakpad/processor/system_info.h \
 +	src/common/module.cc \
  	src/processor/address_map-inl.h \
  	src/processor/address_map.h \
  	src/processor/basic_code_module.h \
-@@ -560,6 +561,7 @@
+ 	src/processor/basic_code_modules.cc \
+ 	src/processor/basic_code_modules.h \
+ 	src/processor/basic_source_line_resolver_types.h \
+ 	src/processor/basic_source_line_resolver.cc \
+ 	src/processor/binarystream.h \
+@@ -555,30 +556,32 @@
+ 	src/testing/src/gmock-all.cc
+ src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \
+ 	-I$(top_srcdir)/src \
+ 	-I$(top_srcdir)/src/testing/include \
+ 	-I$(top_srcdir)/src/testing/gtest/include \
  	-I$(top_srcdir)/src/testing/gtest \
  	-I$(top_srcdir)/src/testing
  src_processor_basic_source_line_resolver_unittest_LDADD = \
 +	src/common/module.o \
  	src/processor/basic_source_line_resolver.o \
  	src/processor/cfi_frame_info.o \
  	src/processor/pathname_stripper.o \
-@@ -574,6 +576,7 @@
+ 	src/processor/logging.o \
+ 	src/processor/source_line_resolver_base.o \
+ 	src/processor/tokenize.o \
+ 	$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
+ 
+ src_processor_cfi_frame_info_unittest_SOURCES = \
+ 	src/processor/cfi_frame_info_unittest.cc \
+ 	src/testing/gtest/src/gtest-all.cc \
  	src/testing/gtest/src/gtest_main.cc \
  	src/testing/src/gmock-all.cc
  src_processor_cfi_frame_info_unittest_LDADD = \
 +	src/common/module.o \
  	src/processor/cfi_frame_info.o \
  	src/processor/logging.o \
  	src/processor/pathname_stripper.o \
-@@ -603,6 +606,7 @@
+ 	$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
+ src_processor_cfi_frame_info_unittest_CPPFLAGS = \
+ 	-I$(top_srcdir)/src \
+ 	-I$(top_srcdir)/src/testing/include \
+ 	-I$(top_srcdir)/src/testing/gtest/include \
+@@ -598,16 +601,17 @@
+ 	src/testing/src/gmock-all.cc
+ src_processor_exploitability_unittest_CPPFLAGS = \
+ 	-I$(top_srcdir)/src \
+ 	-I$(top_srcdir)/src/testing/include \
+ 	-I$(top_srcdir)/src/testing/gtest/include \
  	-I$(top_srcdir)/src/testing/gtest \
  	-I$(top_srcdir)/src/testing
  src_processor_exploitability_unittest_LDADD = \
 +	src/common/module.o \
  	src/processor/minidump_processor.o \
  	src/processor/process_state.o \
  	src/processor/disassembler_x86.o \
-@@ -654,6 +658,7 @@
+ 	src/processor/exploitability.o \
+ 	src/processor/exploitability_win.o \
+ 	src/processor/basic_code_modules.o \
+ 	src/processor/basic_source_line_resolver.o \
+ 	src/processor/call_stack.o \
+@@ -649,16 +653,17 @@
+ 	src/testing/src/gmock-all.cc
+ src_processor_fast_source_line_resolver_unittest_CPPFLAGS = \
+ 	-I$(top_srcdir)/src \
+ 	-I$(top_srcdir)/src/testing/include \
+ 	-I$(top_srcdir)/src/testing/gtest/include \
  	-I$(top_srcdir)/src/testing/gtest \
  	-I$(top_srcdir)/src/testing
  src_processor_fast_source_line_resolver_unittest_LDADD = \
 +	src/common/module.o \
  	src/processor/fast_source_line_resolver.o \
  	src/processor/basic_source_line_resolver.o \
  	src/processor/cfi_frame_info.o \
-@@ -691,6 +696,7 @@
+ 	src/processor/module_comparer.o \
+ 	src/processor/module_serializer.o \
+ 	src/processor/pathname_stripper.o \
+ 	src/processor/logging.o \
+ 	src/processor/source_line_resolver_base.o \
+@@ -686,16 +691,17 @@
+ 	src/testing/src/gmock-all.cc
+ src_processor_minidump_processor_unittest_CPPFLAGS = \
+ 	-I$(top_srcdir)/src \
+ 	-I$(top_srcdir)/src/testing/include \
+ 	-I$(top_srcdir)/src/testing/gtest/include \
  	-I$(top_srcdir)/src/testing/gtest \
  	-I$(top_srcdir)/src/testing
  src_processor_minidump_processor_unittest_LDADD = \
 +	src/common/module.o \
  	src/processor/basic_code_modules.o \
  	src/processor/basic_source_line_resolver.o \
  	src/processor/call_stack.o \
-@@ -804,6 +810,7 @@
+ 	src/processor/cfi_frame_info.o \
+ 	src/processor/disassembler_x86.o \
+ 	src/processor/exploitability.o \
+ 	src/processor/exploitability_win.o \
+ 	src/processor/logging.o \
+@@ -799,16 +805,17 @@
+ 	src/processor/pathname_stripper_unittest.cc
+ src_processor_pathname_stripper_unittest_LDADD = \
+ 	src/processor/pathname_stripper.o \
+ 	$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
+ 
  src_processor_postfix_evaluator_unittest_SOURCES = \
  	src/processor/postfix_evaluator_unittest.cc
  src_processor_postfix_evaluator_unittest_LDADD = \
 +	src/common/module.o \
  	src/processor/logging.o \
  	src/processor/pathname_stripper.o \
  	$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
-@@ -933,6 +940,7 @@
+ 
+ src_processor_range_map_unittest_SOURCES = \
+ 	src/processor/range_map_unittest.cc
+ src_processor_range_map_unittest_LDADD = \
+ 	src/processor/logging.o \
+@@ -928,16 +935,17 @@
+ 	src/processor/basic_code_modules.o \
+ 	src/processor/logging.o \
+ 	src/processor/minidump.o \
+ 	src/processor/pathname_stripper.o
+ 
  src_processor_minidump_stackwalk_SOURCES = \
  	src/processor/minidump_stackwalk.cc
  src_processor_minidump_stackwalk_LDADD = \
 +	src/common/module.o \
  	src/processor/basic_code_modules.o \
  	src/processor/basic_source_line_resolver.o \
  	src/processor/binarystream.o \
+ 	src/processor/call_stack.o \
+ 	src/processor/cfi_frame_info.o \
+ 	src/processor/disassembler_x86.o \
+ 	src/processor/exploitability.o \
+ 	src/processor/exploitability_win.o \
 diff --git a/Makefile.in b/Makefile.in
 --- a/Makefile.in
 +++ b/Makefile.in
-@@ -1,9 +1,9 @@
+@@ -1,14 +1,14 @@
 -# Makefile.in generated by automake 1.11.1 from Makefile.am.
 +# Makefile.in generated by automake 1.11.3 from Makefile.am.
  # @configure_input@
  
  # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
 -# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
 -# Inc.
 +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
 +# Foundation, Inc.
  # This Makefile.in is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
-@@ -195,6 +195,12 @@
+ 
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ # PARTICULAR PURPOSE.
+@@ -190,16 +190,22 @@
+   sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+   $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+     if (++n[$$2] == $(am__install_max)) \
+       { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+     END { for (dir in files) print dir, files[dir] }'
  am__base_list = \
    sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
    sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
 +am__uninstall_files_from_dir = { \
 +  test -z "$$files" \
 +    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
 +    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
 +         $(am__cd) "$$dir" && rm -f $$files; }; \
 +  }
  am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
  	"$(DESTDIR)$(docdir)"
  LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES)
-@@ -266,8 +272,8 @@
+ AR = ar
+ ARFLAGS = cru
+ src_client_linux_libbreakpad_client_a_AR = $(AR) $(ARFLAGS)
+ src_client_linux_libbreakpad_client_a_LIBADD =
+ am__src_client_linux_libbreakpad_client_a_SOURCES_DIST =  \
+@@ -261,18 +267,18 @@
+ 	src/google_breakpad/processor/source_line_resolver_base.h \
+ 	src/google_breakpad/processor/source_line_resolver_interface.h \
+ 	src/google_breakpad/processor/stack_frame.h \
+ 	src/google_breakpad/processor/stack_frame_cpu.h \
+ 	src/google_breakpad/processor/stack_frame_symbolizer.h \
  	src/google_breakpad/processor/stackwalker.h \
  	src/google_breakpad/processor/symbol_supplier.h \
  	src/google_breakpad/processor/system_info.h \
 -	src/processor/address_map-inl.h src/processor/address_map.h \
 -	src/processor/basic_code_module.h \
 +	src/common/module.cc src/processor/address_map-inl.h \
 +	src/processor/address_map.h src/processor/basic_code_module.h \
  	src/processor/basic_code_modules.cc \
  	src/processor/basic_code_modules.h \
  	src/processor/basic_source_line_resolver_types.h \
-@@ -327,7 +333,9 @@
+ 	src/processor/basic_source_line_resolver.cc \
+ 	src/processor/binarystream.h src/processor/binarystream.cc \
+ 	src/processor/call_stack.cc src/processor/cfi_frame_info.cc \
+ 	src/processor/cfi_frame_info.h \
+ 	src/processor/contained_range_map-inl.h \
+@@ -322,17 +328,19 @@
+ 	src/processor/static_contained_range_map-inl.h \
+ 	src/processor/static_contained_range_map.h \
+ 	src/processor/static_map_iterator-inl.h \
+ 	src/processor/static_map_iterator.h \
+ 	src/processor/static_map-inl.h src/processor/static_map.h \
  	src/processor/static_range_map-inl.h \
  	src/processor/static_range_map.h src/processor/tokenize.cc \
  	src/processor/tokenize.h
 -@DISABLE_PROCESSOR_FALSE@am_src_libbreakpad_a_OBJECTS = src/processor/basic_code_modules.$(OBJEXT) \
 +@DISABLE_PROCESSOR_FALSE@am_src_libbreakpad_a_OBJECTS =  \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.$(OBJEXT) \
 +@DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.$(OBJEXT) \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.$(OBJEXT) \
  @DISABLE_PROCESSOR_FALSE@	src/processor/binarystream.$(OBJEXT) \
  @DISABLE_PROCESSOR_FALSE@	src/processor/call_stack.$(OBJEXT) \
-@@ -625,7 +633,9 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/disassembler_x86.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability_win.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/fast_source_line_resolver.$(OBJEXT) \
+@@ -620,17 +628,19 @@
+ am__src_processor_basic_source_line_resolver_unittest_SOURCES_DIST =  \
+ 	src/processor/basic_source_line_resolver_unittest.cc \
+ 	src/testing/gtest/src/gtest-all.cc \
+ 	src/testing/src/gmock-all.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_basic_source_line_resolver_unittest_OBJECTS = src/processor/src_processor_basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.$(OBJEXT) \
  @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/src_processor_basic_source_line_resolver_unittest-gtest-all.$(OBJEXT) \
  @DISABLE_PROCESSOR_FALSE@	src/testing/src/src_processor_basic_source_line_resolver_unittest-gmock-all.$(OBJEXT)
  src_processor_basic_source_line_resolver_unittest_OBJECTS = $(am_src_processor_basic_source_line_resolver_unittest_OBJECTS)
 -@DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_DEPENDENCIES = src/processor/basic_source_line_resolver.o \
 +@DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_DEPENDENCIES =  \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
 +@DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
-@@ -658,6 +668,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/source_line_resolver_base.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/tokenize.o \
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1) \
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1)
+ am__src_processor_binarystream_unittest_SOURCES_DIST =  \
+@@ -653,16 +663,17 @@
+ 	src/testing/src/gmock-all.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_cfi_frame_info_unittest_OBJECTS = src/processor/src_processor_cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/src_processor_cfi_frame_info_unittest-gtest-all.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/src_processor_cfi_frame_info_unittest-gtest_main.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/src/src_processor_cfi_frame_info_unittest-gmock-all.$(OBJEXT)
  src_processor_cfi_frame_info_unittest_OBJECTS =  \
  	$(am_src_processor_cfi_frame_info_unittest_OBJECTS)
  @DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_DEPENDENCIES =  \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
-@@ -699,6 +710,7 @@
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1) \
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1)
+ am__src_processor_contained_range_map_unittest_SOURCES_DIST =  \
+ 	src/processor/contained_range_map_unittest.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_contained_range_map_unittest_OBJECTS = src/processor/contained_range_map_unittest.$(OBJEXT)
+@@ -694,16 +705,17 @@
+ 	src/testing/src/gmock-all.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_exploitability_unittest_OBJECTS = src/processor/src_processor_exploitability_unittest-exploitability_unittest.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/src_processor_exploitability_unittest-gtest-all.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/src_processor_exploitability_unittest-gtest_main.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/src/src_processor_exploitability_unittest-gmock-all.$(OBJEXT)
  src_processor_exploitability_unittest_OBJECTS =  \
  	$(am_src_processor_exploitability_unittest_OBJECTS)
  @DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_DEPENDENCIES =  \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/minidump_processor.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/process_state.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/disassembler_x86.o \
-@@ -731,7 +743,9 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability_win.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/call_stack.o \
+@@ -726,17 +738,19 @@
+ am__src_processor_fast_source_line_resolver_unittest_SOURCES_DIST =  \
+ 	src/processor/fast_source_line_resolver_unittest.cc \
+ 	src/testing/gtest/src/gtest-all.cc \
+ 	src/testing/src/gmock-all.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_fast_source_line_resolver_unittest_OBJECTS = src/processor/src_processor_fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.$(OBJEXT) \
  @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/src_processor_fast_source_line_resolver_unittest-gtest-all.$(OBJEXT) \
  @DISABLE_PROCESSOR_FALSE@	src/testing/src/src_processor_fast_source_line_resolver_unittest-gmock-all.$(OBJEXT)
  src_processor_fast_source_line_resolver_unittest_OBJECTS = $(am_src_processor_fast_source_line_resolver_unittest_OBJECTS)
 -@DISABLE_PROCESSOR_FALSE@src_processor_fast_source_line_resolver_unittest_DEPENDENCIES = src/processor/fast_source_line_resolver.o \
 +@DISABLE_PROCESSOR_FALSE@src_processor_fast_source_line_resolver_unittest_DEPENDENCIES =  \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
 +@DISABLE_PROCESSOR_FALSE@	src/processor/fast_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/module_comparer.o \
-@@ -776,6 +790,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/module_serializer.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/source_line_resolver_base.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/tokenize.o \
+@@ -771,16 +785,17 @@
+ 	src/testing/gtest/src/gtest-all.cc \
+ 	src/testing/src/gmock-all.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_minidump_processor_unittest_OBJECTS = src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.$(OBJEXT) \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT)
  src_processor_minidump_processor_unittest_OBJECTS =  \
  	$(am_src_processor_minidump_processor_unittest_OBJECTS)
  @DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_DEPENDENCIES =  \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/call_stack.o \
-@@ -806,6 +821,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/disassembler_x86.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability_win.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
+@@ -801,16 +816,17 @@
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1) \
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1)
+ am__src_processor_minidump_stackwalk_SOURCES_DIST =  \
+ 	src/processor/minidump_stackwalk.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_minidump_stackwalk_OBJECTS = src/processor/minidump_stackwalk.$(OBJEXT)
  src_processor_minidump_stackwalk_OBJECTS =  \
  	$(am_src_processor_minidump_stackwalk_OBJECTS)
  @DISABLE_PROCESSOR_FALSE@src_processor_minidump_stackwalk_DEPENDENCIES =  \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/binarystream.o \
-@@ -867,6 +883,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/call_stack.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/disassembler_x86.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability_win.o \
+@@ -862,16 +878,17 @@
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1) \
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1)
+ am__src_processor_postfix_evaluator_unittest_SOURCES_DIST =  \
+ 	src/processor/postfix_evaluator_unittest.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_postfix_evaluator_unittest_OBJECTS = src/processor/postfix_evaluator_unittest.$(OBJEXT)
  src_processor_postfix_evaluator_unittest_OBJECTS =  \
  	$(am_src_processor_postfix_evaluator_unittest_OBJECTS)
  @DISABLE_PROCESSOR_FALSE@src_processor_postfix_evaluator_unittest_DEPENDENCIES =  \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
  @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1) \
-@@ -1217,12 +1234,16 @@
+ @DISABLE_PROCESSOR_FALSE@	$(am__DEPENDENCIES_1)
+ am__src_processor_range_map_unittest_SOURCES_DIST =  \
+ 	src/processor/range_map_unittest.cc
+ @DISABLE_PROCESSOR_FALSE@am_src_processor_range_map_unittest_OBJECTS = src/processor/range_map_unittest.$(OBJEXT)
+ src_processor_range_map_unittest_OBJECTS =  \
+@@ -1212,22 +1229,26 @@
+ ETAGS = etags
+ CTAGS = ctags
+ am__tty_colors = \
+ red=; grn=; lgn=; blu=; std=
+ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
  distdir = $(PACKAGE)-$(VERSION)
  top_distdir = $(distdir)
  am__remove_distdir = \
 -  { test ! -d "$(distdir)" \
 -    || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
 -         && rm -fr "$(distdir)"; }; }
 +  if test -d "$(distdir)"; then \
 +    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
@@ -202,288 +385,517 @@ diff --git a/Makefile.in b/Makefile.in
  DIST_ARCHIVES = $(distdir).tar.gz
  GZIP_ENV = --best
  distuninstallcheck_listfiles = find . -type f -print
 +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
 +  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
  distcleancheck_listfiles = find . -type f -print
  ACLOCAL = @ACLOCAL@
  AMTAR = @AMTAR@
-@@ -1388,6 +1409,7 @@
+ AUTOCONF = @AUTOCONF@
+ AUTOHEADER = @AUTOHEADER@
+ AUTOMAKE = @AUTOMAKE@
+ AWK = @AWK@
+ CC = @CC@
+@@ -1383,16 +1404,17 @@
+ @DISABLE_PROCESSOR_FALSE@	src/google_breakpad/processor/source_line_resolver_base.h \
+ @DISABLE_PROCESSOR_FALSE@	src/google_breakpad/processor/source_line_resolver_interface.h \
+ @DISABLE_PROCESSOR_FALSE@	src/google_breakpad/processor/stack_frame.h \
+ @DISABLE_PROCESSOR_FALSE@	src/google_breakpad/processor/stack_frame_cpu.h \
+ @DISABLE_PROCESSOR_FALSE@	src/google_breakpad/processor/stack_frame_symbolizer.h \
  @DISABLE_PROCESSOR_FALSE@	src/google_breakpad/processor/stackwalker.h \
  @DISABLE_PROCESSOR_FALSE@	src/google_breakpad/processor/symbol_supplier.h \
  @DISABLE_PROCESSOR_FALSE@	src/google_breakpad/processor/system_info.h \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.cc \
  @DISABLE_PROCESSOR_FALSE@	src/processor/address_map-inl.h \
  @DISABLE_PROCESSOR_FALSE@	src/processor/address_map.h \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_module.h \
-@@ -1720,6 +1742,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.cc \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.h \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver_types.h \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.cc \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/binarystream.h \
+@@ -1715,31 +1737,33 @@
+ @DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_CPPFLAGS = \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/include \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/gtest/include \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/gtest \
  @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing
  
  @DISABLE_PROCESSOR_FALSE@src_processor_basic_source_line_resolver_unittest_LDADD = \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
-@@ -1735,6 +1758,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/source_line_resolver_base.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/tokenize.o \
+ @DISABLE_PROCESSOR_FALSE@	$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
+ 
+ @DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_SOURCES = \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info_unittest.cc \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/gtest-all.cc \
+ @DISABLE_PROCESSOR_FALSE@	src/testing/gtest/src/gtest_main.cc \
  @DISABLE_PROCESSOR_FALSE@	src/testing/src/gmock-all.cc
  
  @DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_LDADD = \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
-@@ -1768,6 +1792,7 @@
+ @DISABLE_PROCESSOR_FALSE@	$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
+ 
+ @DISABLE_PROCESSOR_FALSE@src_processor_cfi_frame_info_unittest_CPPFLAGS = \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/include \
+@@ -1763,16 +1787,17 @@
+ @DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_CPPFLAGS = \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/include \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/gtest/include \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/gtest \
  @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing
  
  @DISABLE_PROCESSOR_FALSE@src_processor_exploitability_unittest_LDADD = \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/minidump_processor.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/process_state.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/disassembler_x86.o \
-@@ -1823,6 +1848,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability_win.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/call_stack.o \
+@@ -1818,16 +1843,17 @@
+ @DISABLE_PROCESSOR_FALSE@src_processor_fast_source_line_resolver_unittest_CPPFLAGS = \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/include \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/gtest/include \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/gtest \
  @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing
  
  @DISABLE_PROCESSOR_FALSE@src_processor_fast_source_line_resolver_unittest_LDADD = \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/fast_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
-@@ -1864,6 +1890,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/module_comparer.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/module_serializer.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/source_line_resolver_base.o \
+@@ -1859,16 +1885,17 @@
+ @DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_CPPFLAGS = \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/include \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/gtest/include \
+ @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing/gtest \
  @DISABLE_PROCESSOR_FALSE@	-I$(top_srcdir)/src/testing
  
  @DISABLE_PROCESSOR_FALSE@src_processor_minidump_processor_unittest_LDADD = \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/call_stack.o \
-@@ -1989,6 +2016,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/disassembler_x86.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability_win.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
+@@ -1984,16 +2011,17 @@
+ @DISABLE_PROCESSOR_FALSE@src_processor_pathname_stripper_unittest_LDADD = \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
+ @DISABLE_PROCESSOR_FALSE@	$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
+ 
+ @DISABLE_PROCESSOR_FALSE@src_processor_postfix_evaluator_unittest_SOURCES = \
  @DISABLE_PROCESSOR_FALSE@	src/processor/postfix_evaluator_unittest.cc
  
  @DISABLE_PROCESSOR_FALSE@src_processor_postfix_evaluator_unittest_LDADD = \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o \
  @DISABLE_PROCESSOR_FALSE@	$(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
-@@ -2127,6 +2155,7 @@
+ 
+ @DISABLE_PROCESSOR_FALSE@src_processor_range_map_unittest_SOURCES = \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/range_map_unittest.cc
+ 
+ @DISABLE_PROCESSOR_FALSE@src_processor_range_map_unittest_LDADD = \
+@@ -2122,16 +2150,17 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/logging.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/minidump.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/pathname_stripper.o
+ 
+ @DISABLE_PROCESSOR_FALSE@src_processor_minidump_stackwalk_SOURCES = \
  @DISABLE_PROCESSOR_FALSE@	src/processor/minidump_stackwalk.cc
  
  @DISABLE_PROCESSOR_FALSE@src_processor_minidump_stackwalk_LDADD = \
 +@DISABLE_PROCESSOR_FALSE@	src/common/module.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_code_modules.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/basic_source_line_resolver.o \
  @DISABLE_PROCESSOR_FALSE@	src/processor/binarystream.o \
-@@ -2294,7 +2323,7 @@
+ @DISABLE_PROCESSOR_FALSE@	src/processor/call_stack.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/cfi_frame_info.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/disassembler_x86.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability.o \
+ @DISABLE_PROCESSOR_FALSE@	src/processor/exploitability_win.o \
+@@ -2289,17 +2318,17 @@
+ 	src/tools/windows/dump_syms/testdata/dump_syms_regtest.sym \
+ 	src/tools/windows/symupload/symupload.cc \
+ 	src/tools/windows/symupload/symupload.vcproj
+ 
+ all: all-am
  
  .SUFFIXES:
  .SUFFIXES: .S .c .cc .o .obj
 -am--refresh:
 +am--refresh: Makefile
  	@:
  $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
  	@for dep in $?; do \
-@@ -2330,10 +2359,8 @@
+ 	  case '$(am__configure_deps)' in \
+ 	    *$$dep*) \
+ 	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \
+ 	      $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \
+ 		&& exit 0; \
+@@ -2325,20 +2354,18 @@
+ 
+ $(top_srcdir)/configure:  $(am__configure_deps)
+ 	$(am__cd) $(srcdir) && $(AUTOCONF)
+ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+ 	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
  $(am__aclocal_m4_deps):
  
  src/config.h: src/stamp-h1
 -	@if test ! -f $@; then \
 -	  rm -f src/stamp-h1; \
 -	  $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; \
 -	else :; fi
 +	@if test ! -f $@; then rm -f src/stamp-h1; else :; fi
 +	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1; else :; fi
  
  src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status
  	@rm -f src/stamp-h1
-@@ -2371,9 +2398,7 @@
+ 	cd $(top_builddir) && $(SHELL) ./config.status src/config.h
+ $(top_srcdir)/src/config.h.in:  $(am__configure_deps) 
+ 	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+ 	rm -f src/stamp-h1
+ 	touch $@
+@@ -2366,19 +2393,17 @@
+ 	    ( cd "$(DESTDIR)$(libdir)" && $(RANLIB) $$f ) || exit $$?; \
+ 	  else :; fi; \
+ 	done
+ 
+ uninstall-libLIBRARIES:
  	@$(NORMAL_UNINSTALL)
  	@list='$(lib_LIBRARIES)'; test -n "$(libdir)" || list=; \
  	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 -	test -n "$$files" || exit 0; \
 -	echo " ( cd '$(DESTDIR)$(libdir)' && rm -f "$$files" )"; \
 -	cd "$(DESTDIR)$(libdir)" && rm -f $$files
 +	dir='$(DESTDIR)$(libdir)'; $(am__uninstall_files_from_dir)
  
  clean-libLIBRARIES:
  	-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
-@@ -2482,10 +2507,12 @@
+ 
+ clean-noinstLIBRARIES:
+ 	-test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+ src/client/linux/crash_generation/$(am__dirstamp):
+ 	@$(MKDIR_P) src/client/linux/crash_generation
+@@ -2477,20 +2502,22 @@
+ 	@$(MKDIR_P) src/common/android/$(DEPDIR)
+ 	@: > src/common/android/$(DEPDIR)/$(am__dirstamp)
+ src/common/android/breakpad_getcontext.$(OBJEXT):  \
+ 	src/common/android/$(am__dirstamp) \
+ 	src/common/android/$(DEPDIR)/$(am__dirstamp)
  src/client/linux/$(am__dirstamp):
  	@$(MKDIR_P) src/client/linux
  	@: > src/client/linux/$(am__dirstamp)
 -src/client/linux/libbreakpad_client.a: $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_DEPENDENCIES) src/client/linux/$(am__dirstamp)
 +src/client/linux/libbreakpad_client.a: $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_DEPENDENCIES) $(EXTRA_src_client_linux_libbreakpad_client_a_DEPENDENCIES) src/client/linux/$(am__dirstamp)
  	-rm -f src/client/linux/libbreakpad_client.a
  	$(src_client_linux_libbreakpad_client_a_AR) src/client/linux/libbreakpad_client.a $(src_client_linux_libbreakpad_client_a_OBJECTS) $(src_client_linux_libbreakpad_client_a_LIBADD)
  	$(RANLIB) src/client/linux/libbreakpad_client.a
 +src/common/module.$(OBJEXT): src/common/$(am__dirstamp) \
 +	src/common/$(DEPDIR)/$(am__dirstamp)
  src/processor/$(am__dirstamp):
  	@$(MKDIR_P) src/processor
  	@: > src/processor/$(am__dirstamp)
-@@ -2564,7 +2591,7 @@
+ src/processor/$(DEPDIR)/$(am__dirstamp):
+ 	@$(MKDIR_P) src/processor/$(DEPDIR)
+ 	@: > src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/processor/basic_code_modules.$(OBJEXT):  \
+ 	src/processor/$(am__dirstamp) \
+@@ -2559,17 +2586,17 @@
+ src/processor/stackwalker_x86.$(OBJEXT):  \
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/processor/tokenize.$(OBJEXT): src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
  src/$(am__dirstamp):
  	@$(MKDIR_P) src
  	@: > src/$(am__dirstamp)
 -src/libbreakpad.a: $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_DEPENDENCIES) src/$(am__dirstamp)
 +src/libbreakpad.a: $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_DEPENDENCIES) $(EXTRA_src_libbreakpad_a_DEPENDENCIES) src/$(am__dirstamp)
  	-rm -f src/libbreakpad.a
  	$(src_libbreakpad_a_AR) src/libbreakpad.a $(src_libbreakpad_a_OBJECTS) $(src_libbreakpad_a_LIBADD)
  	$(RANLIB) src/libbreakpad.a
-@@ -2616,7 +2643,7 @@
+ src/third_party/libdisasm/$(am__dirstamp):
+ 	@$(MKDIR_P) src/third_party/libdisasm
+ 	@: > src/third_party/libdisasm/$(am__dirstamp)
+ src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp):
+ 	@$(MKDIR_P) src/third_party/libdisasm/$(DEPDIR)
+@@ -2611,17 +2638,17 @@
+ 	src/third_party/libdisasm/$(am__dirstamp) \
+ 	src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp)
+ src/third_party/libdisasm/x86_misc.$(OBJEXT):  \
+ 	src/third_party/libdisasm/$(am__dirstamp) \
+ 	src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp)
  src/third_party/libdisasm/x86_operand_list.$(OBJEXT):  \
  	src/third_party/libdisasm/$(am__dirstamp) \
  	src/third_party/libdisasm/$(DEPDIR)/$(am__dirstamp)
 -src/third_party/libdisasm/libdisasm.a: $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_DEPENDENCIES) src/third_party/libdisasm/$(am__dirstamp)
 +src/third_party/libdisasm/libdisasm.a: $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_DEPENDENCIES) $(EXTRA_src_third_party_libdisasm_libdisasm_a_DEPENDENCIES) src/third_party/libdisasm/$(am__dirstamp)
  	-rm -f src/third_party/libdisasm/libdisasm.a
  	$(src_third_party_libdisasm_libdisasm_a_AR) src/third_party/libdisasm/libdisasm.a $(src_third_party_libdisasm_libdisasm_a_OBJECTS) $(src_third_party_libdisasm_libdisasm_a_LIBADD)
  	$(RANLIB) src/third_party/libdisasm/libdisasm.a
-@@ -2663,7 +2690,7 @@
+ install-binPROGRAMS: $(bin_PROGRAMS)
+ 	@$(NORMAL_INSTALL)
+ 	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
+ 	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ 	for p in $$list; do echo "$$p $$p"; done | \
+@@ -2658,17 +2685,17 @@
+ clean-binPROGRAMS:
+ 	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+ 
+ clean-checkPROGRAMS:
+ 	-test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
  
  clean-noinstPROGRAMS:
  	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
 -src/client/linux/linux_client_unittest$(EXEEXT): $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_DEPENDENCIES) src/client/linux/$(am__dirstamp)
 +src/client/linux/linux_client_unittest$(EXEEXT): $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_DEPENDENCIES) $(EXTRA_src_client_linux_linux_client_unittest_DEPENDENCIES) src/client/linux/$(am__dirstamp)
  	@rm -f src/client/linux/linux_client_unittest$(EXEEXT)
  	$(src_client_linux_linux_client_unittest_LINK) $(src_client_linux_linux_client_unittest_OBJECTS) $(src_client_linux_linux_client_unittest_LDADD) $(LIBS)
  src/client/linux/handler/src_client_linux_linux_client_unittest_shlib-exception_handler_unittest.$(OBJEXT):  \
-@@ -2756,13 +2783,13 @@
+ 	src/client/linux/handler/$(am__dirstamp) \
+ 	src/client/linux/handler/$(DEPDIR)/$(am__dirstamp)
+ src/client/linux/minidump_writer/src_client_linux_linux_client_unittest_shlib-directory_reader_unittest.$(OBJEXT):  \
+ 	src/client/linux/minidump_writer/$(am__dirstamp) \
+ 	src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp)
+@@ -2751,23 +2778,23 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/common/android/src_client_linux_linux_client_unittest_shlib-breakpad_getcontext.$(OBJEXT):  \
+ 	src/common/android/$(am__dirstamp) \
+ 	src/common/android/$(DEPDIR)/$(am__dirstamp)
  src/common/android/src_client_linux_linux_client_unittest_shlib-breakpad_getcontext_unittest.$(OBJEXT):  \
  	src/common/android/$(am__dirstamp) \
  	src/common/android/$(DEPDIR)/$(am__dirstamp)
 -src/client/linux/linux_client_unittest_shlib$(EXEEXT): $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_DEPENDENCIES) src/client/linux/$(am__dirstamp)
 +src/client/linux/linux_client_unittest_shlib$(EXEEXT): $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_DEPENDENCIES) $(EXTRA_src_client_linux_linux_client_unittest_shlib_DEPENDENCIES) src/client/linux/$(am__dirstamp)
  	@rm -f src/client/linux/linux_client_unittest_shlib$(EXEEXT)
  	$(src_client_linux_linux_client_unittest_shlib_LINK) $(src_client_linux_linux_client_unittest_shlib_OBJECTS) $(src_client_linux_linux_client_unittest_shlib_LDADD) $(LIBS)
  src/client/linux/minidump_writer/src_client_linux_linux_dumper_unittest_helper-linux_dumper_unittest_helper.$(OBJEXT):  \
  	src/client/linux/minidump_writer/$(am__dirstamp) \
  	src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp)
 -src/client/linux/linux_dumper_unittest_helper$(EXEEXT): $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_DEPENDENCIES) src/client/linux/$(am__dirstamp)
 +src/client/linux/linux_dumper_unittest_helper$(EXEEXT): $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_DEPENDENCIES) $(EXTRA_src_client_linux_linux_dumper_unittest_helper_DEPENDENCIES) src/client/linux/$(am__dirstamp)
  	@rm -f src/client/linux/linux_dumper_unittest_helper$(EXEEXT)
  	$(src_client_linux_linux_dumper_unittest_helper_LINK) $(src_client_linux_linux_dumper_unittest_helper_OBJECTS) $(src_client_linux_linux_dumper_unittest_helper_LDADD) $(LIBS)
  src/common/src_common_dumper_unittest-byte_cursor_unittest.$(OBJEXT):  \
-@@ -2906,7 +2933,7 @@
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/common/src_common_dumper_unittest-dwarf_cfi_to_module.$(OBJEXT):  \
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+@@ -2901,17 +2928,17 @@
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_common_dumper_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_common_dumper_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/common/dumper_unittest$(EXEEXT): $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_DEPENDENCIES) src/common/$(am__dirstamp)
 +src/common/dumper_unittest$(EXEEXT): $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_DEPENDENCIES) $(EXTRA_src_common_dumper_unittest_DEPENDENCIES) src/common/$(am__dirstamp)
  	@rm -f src/common/dumper_unittest$(EXEEXT)
  	$(CXXLINK) $(src_common_dumper_unittest_OBJECTS) $(src_common_dumper_unittest_LDADD) $(LIBS)
  src/common/src_common_test_assembler_unittest-test_assembler.$(OBJEXT):  \
-@@ -2924,13 +2951,13 @@
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/common/src_common_test_assembler_unittest-test_assembler_unittest.$(OBJEXT):  \
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+@@ -2919,145 +2946,145 @@
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_common_test_assembler_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_common_test_assembler_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/common/test_assembler_unittest$(EXEEXT): $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_DEPENDENCIES) src/common/$(am__dirstamp)
 +src/common/test_assembler_unittest$(EXEEXT): $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_DEPENDENCIES) $(EXTRA_src_common_test_assembler_unittest_DEPENDENCIES) src/common/$(am__dirstamp)
  	@rm -f src/common/test_assembler_unittest$(EXEEXT)
  	$(CXXLINK) $(src_common_test_assembler_unittest_OBJECTS) $(src_common_test_assembler_unittest_LDADD) $(LIBS)
  src/processor/address_map_unittest.$(OBJEXT):  \
  	src/processor/$(am__dirstamp) \
  	src/processor/$(DEPDIR)/$(am__dirstamp)
 -src/processor/address_map_unittest$(EXEEXT): $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/address_map_unittest$(EXEEXT): $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/address_map_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_address_map_unittest_OBJECTS) $(src_processor_address_map_unittest_LDADD) $(LIBS)
  src/processor/src_processor_basic_source_line_resolver_unittest-basic_source_line_resolver_unittest.$(OBJEXT):  \
-@@ -2942,7 +2969,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_basic_source_line_resolver_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_basic_source_line_resolver_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/basic_source_line_resolver_unittest$(EXEEXT): $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/basic_source_line_resolver_unittest$(EXEEXT): $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_DEPENDENCIES) $(EXTRA_src_processor_basic_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/basic_source_line_resolver_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_basic_source_line_resolver_unittest_OBJECTS) $(src_processor_basic_source_line_resolver_unittest_LDADD) $(LIBS)
  src/processor/src_processor_binarystream_unittest-binarystream_unittest.$(OBJEXT):  \
-@@ -2954,7 +2981,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_binarystream_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_binarystream_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/binarystream_unittest$(EXEEXT): $(src_processor_binarystream_unittest_OBJECTS) $(src_processor_binarystream_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/binarystream_unittest$(EXEEXT): $(src_processor_binarystream_unittest_OBJECTS) $(src_processor_binarystream_unittest_DEPENDENCIES) $(EXTRA_src_processor_binarystream_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/binarystream_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_binarystream_unittest_OBJECTS) $(src_processor_binarystream_unittest_LDADD) $(LIBS)
  src/processor/src_processor_cfi_frame_info_unittest-cfi_frame_info_unittest.$(OBJEXT):  \
-@@ -2969,13 +2996,13 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_cfi_frame_info_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_cfi_frame_info_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_cfi_frame_info_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/cfi_frame_info_unittest$(EXEEXT): $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/cfi_frame_info_unittest$(EXEEXT): $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_DEPENDENCIES) $(EXTRA_src_processor_cfi_frame_info_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/cfi_frame_info_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_cfi_frame_info_unittest_OBJECTS) $(src_processor_cfi_frame_info_unittest_LDADD) $(LIBS)
  src/processor/contained_range_map_unittest.$(OBJEXT):  \
  	src/processor/$(am__dirstamp) \
  	src/processor/$(DEPDIR)/$(am__dirstamp)
 -src/processor/contained_range_map_unittest$(EXEEXT): $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/contained_range_map_unittest$(EXEEXT): $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/contained_range_map_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_contained_range_map_unittest_OBJECTS) $(src_processor_contained_range_map_unittest_LDADD) $(LIBS)
  src/processor/src_processor_disassembler_x86_unittest-disassembler_x86_unittest.$(OBJEXT):  \
-@@ -2990,7 +3017,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_disassembler_x86_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_disassembler_x86_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_disassembler_x86_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/disassembler_x86_unittest$(EXEEXT): $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/disassembler_x86_unittest$(EXEEXT): $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_DEPENDENCIES) $(EXTRA_src_processor_disassembler_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/disassembler_x86_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_disassembler_x86_unittest_OBJECTS) $(src_processor_disassembler_x86_unittest_LDADD) $(LIBS)
  src/processor/src_processor_exploitability_unittest-exploitability_unittest.$(OBJEXT):  \
-@@ -3005,7 +3032,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_exploitability_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_exploitability_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_exploitability_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/exploitability_unittest$(EXEEXT): $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/exploitability_unittest$(EXEEXT): $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_DEPENDENCIES) $(EXTRA_src_processor_exploitability_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/exploitability_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_exploitability_unittest_OBJECTS) $(src_processor_exploitability_unittest_LDADD) $(LIBS)
  src/processor/src_processor_fast_source_line_resolver_unittest-fast_source_line_resolver_unittest.$(OBJEXT):  \
-@@ -3017,7 +3044,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_fast_source_line_resolver_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_fast_source_line_resolver_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/fast_source_line_resolver_unittest$(EXEEXT): $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/fast_source_line_resolver_unittest$(EXEEXT): $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_DEPENDENCIES) $(EXTRA_src_processor_fast_source_line_resolver_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/fast_source_line_resolver_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_fast_source_line_resolver_unittest_OBJECTS) $(src_processor_fast_source_line_resolver_unittest_LDADD) $(LIBS)
  src/processor/src_processor_map_serializers_unittest-map_serializers_unittest.$(OBJEXT):  \
-@@ -3029,12 +3056,12 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_map_serializers_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_map_serializers_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/map_serializers_unittest$(EXEEXT): $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/map_serializers_unittest$(EXEEXT): $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_DEPENDENCIES) $(EXTRA_src_processor_map_serializers_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/map_serializers_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_map_serializers_unittest_OBJECTS) $(src_processor_map_serializers_unittest_LDADD) $(LIBS)
  src/processor/minidump_dump.$(OBJEXT): src/processor/$(am__dirstamp) \
  	src/processor/$(DEPDIR)/$(am__dirstamp)
 -src/processor/minidump_dump$(EXEEXT): $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/minidump_dump$(EXEEXT): $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_DEPENDENCIES) $(EXTRA_src_processor_minidump_dump_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/minidump_dump$(EXEEXT)
  	$(CXXLINK) $(src_processor_minidump_dump_OBJECTS) $(src_processor_minidump_dump_LDADD) $(LIBS)
  src/processor/src_processor_minidump_processor_unittest-minidump_processor_unittest.$(OBJEXT):  \
-@@ -3046,13 +3073,13 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_minidump_processor_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_minidump_processor_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/minidump_processor_unittest$(EXEEXT): $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/minidump_processor_unittest$(EXEEXT): $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_DEPENDENCIES) $(EXTRA_src_processor_minidump_processor_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/minidump_processor_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_minidump_processor_unittest_OBJECTS) $(src_processor_minidump_processor_unittest_LDADD) $(LIBS)
  src/processor/minidump_stackwalk.$(OBJEXT):  \
  	src/processor/$(am__dirstamp) \
  	src/processor/$(DEPDIR)/$(am__dirstamp)
 -src/processor/minidump_stackwalk$(EXEEXT): $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/minidump_stackwalk$(EXEEXT): $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_DEPENDENCIES) $(EXTRA_src_processor_minidump_stackwalk_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/minidump_stackwalk$(EXEEXT)
  	$(CXXLINK) $(src_processor_minidump_stackwalk_OBJECTS) $(src_processor_minidump_stackwalk_LDADD) $(LIBS)
  src/common/src_processor_minidump_unittest-test_assembler.$(OBJEXT):  \
-@@ -3073,25 +3100,25 @@
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/processor/src_processor_minidump_unittest-minidump_unittest.$(OBJEXT):  \
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+@@ -3068,35 +3095,35 @@
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_minidump_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_minidump_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/minidump_unittest$(EXEEXT): $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/minidump_unittest$(EXEEXT): $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_DEPENDENCIES) $(EXTRA_src_processor_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/minidump_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_minidump_unittest_OBJECTS) $(src_processor_minidump_unittest_LDADD) $(LIBS)
  src/processor/pathname_stripper_unittest.$(OBJEXT):  \
@@ -503,168 +915,285 @@ diff --git a/Makefile.in b/Makefile.in
  src/processor/range_map_unittest.$(OBJEXT):  \
  	src/processor/$(am__dirstamp) \
  	src/processor/$(DEPDIR)/$(am__dirstamp)
 -src/processor/range_map_unittest$(EXEEXT): $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/range_map_unittest$(EXEEXT): $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/range_map_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_range_map_unittest_OBJECTS) $(src_processor_range_map_unittest_LDADD) $(LIBS)
  src/common/src_processor_stackwalker_amd64_unittest-test_assembler.$(OBJEXT):  \
-@@ -3109,7 +3136,7 @@
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/processor/src_processor_stackwalker_amd64_unittest-stackwalker_amd64_unittest.$(OBJEXT):  \
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+@@ -3104,17 +3131,17 @@
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_stackwalker_amd64_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_stackwalker_amd64_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/stackwalker_amd64_unittest$(EXEEXT): $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/stackwalker_amd64_unittest$(EXEEXT): $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_amd64_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/stackwalker_amd64_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_stackwalker_amd64_unittest_OBJECTS) $(src_processor_stackwalker_amd64_unittest_LDADD) $(LIBS)
  src/common/src_processor_stackwalker_arm_unittest-test_assembler.$(OBJEXT):  \
-@@ -3127,13 +3154,13 @@
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/processor/src_processor_stackwalker_arm_unittest-stackwalker_arm_unittest.$(OBJEXT):  \
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+@@ -3122,23 +3149,23 @@
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_stackwalker_arm_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_stackwalker_arm_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/stackwalker_arm_unittest$(EXEEXT): $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/stackwalker_arm_unittest$(EXEEXT): $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_arm_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/stackwalker_arm_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_stackwalker_arm_unittest_OBJECTS) $(src_processor_stackwalker_arm_unittest_LDADD) $(LIBS)
  src/processor/stackwalker_selftest.$(OBJEXT):  \
  	src/processor/$(am__dirstamp) \
  	src/processor/$(DEPDIR)/$(am__dirstamp)
 -src/processor/stackwalker_selftest$(EXEEXT): $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/stackwalker_selftest$(EXEEXT): $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_selftest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/stackwalker_selftest$(EXEEXT)
  	$(CXXLINK) $(src_processor_stackwalker_selftest_OBJECTS) $(src_processor_stackwalker_selftest_LDADD) $(LIBS)
  src/common/src_processor_stackwalker_x86_unittest-test_assembler.$(OBJEXT):  \
-@@ -3151,7 +3178,7 @@
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/processor/src_processor_stackwalker_x86_unittest-stackwalker_x86_unittest.$(OBJEXT):  \
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+@@ -3146,65 +3173,65 @@
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_stackwalker_x86_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_stackwalker_x86_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/stackwalker_x86_unittest$(EXEEXT): $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/stackwalker_x86_unittest$(EXEEXT): $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_DEPENDENCIES) $(EXTRA_src_processor_stackwalker_x86_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/stackwalker_x86_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_stackwalker_x86_unittest_OBJECTS) $(src_processor_stackwalker_x86_unittest_LDADD) $(LIBS)
  src/processor/src_processor_static_address_map_unittest-static_address_map_unittest.$(OBJEXT):  \
-@@ -3163,7 +3190,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_static_address_map_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_static_address_map_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/static_address_map_unittest$(EXEEXT): $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/static_address_map_unittest$(EXEEXT): $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_address_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/static_address_map_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_static_address_map_unittest_OBJECTS) $(src_processor_static_address_map_unittest_LDADD) $(LIBS)
  src/processor/src_processor_static_contained_range_map_unittest-static_contained_range_map_unittest.$(OBJEXT):  \
-@@ -3175,7 +3202,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_static_contained_range_map_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_static_contained_range_map_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/static_contained_range_map_unittest$(EXEEXT): $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/static_contained_range_map_unittest$(EXEEXT): $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_contained_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/static_contained_range_map_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_static_contained_range_map_unittest_OBJECTS) $(src_processor_static_contained_range_map_unittest_LDADD) $(LIBS)
  src/processor/src_processor_static_map_unittest-static_map_unittest.$(OBJEXT):  \
-@@ -3187,7 +3214,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_static_map_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_static_map_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/static_map_unittest$(EXEEXT): $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/static_map_unittest$(EXEEXT): $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/static_map_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_static_map_unittest_OBJECTS) $(src_processor_static_map_unittest_LDADD) $(LIBS)
  src/processor/src_processor_static_range_map_unittest-static_range_map_unittest.$(OBJEXT):  \
-@@ -3199,7 +3226,7 @@
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_processor_static_range_map_unittest-gtest-all.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
  src/testing/src/src_processor_static_range_map_unittest-gmock-all.$(OBJEXT):  \
  	src/testing/src/$(am__dirstamp) \
  	src/testing/src/$(DEPDIR)/$(am__dirstamp)
 -src/processor/static_range_map_unittest$(EXEEXT): $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/static_range_map_unittest$(EXEEXT): $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_DEPENDENCIES) $(EXTRA_src_processor_static_range_map_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/static_range_map_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_static_range_map_unittest_OBJECTS) $(src_processor_static_range_map_unittest_LDADD) $(LIBS)
  src/common/src_processor_synth_minidump_unittest-test_assembler.$(OBJEXT):  \
-@@ -3220,7 +3247,7 @@
+ 	src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/processor/src_processor_synth_minidump_unittest-synth_minidump_unittest.$(OBJEXT):  \
+ 	src/processor/$(am__dirstamp) \
+ 	src/processor/$(DEPDIR)/$(am__dirstamp)
+@@ -3215,17 +3242,17 @@
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/src/src_processor_synth_minidump_unittest-gmock-all.$(OBJEXT):  \
+ 	src/testing/src/$(am__dirstamp) \
+ 	src/testing/src/$(DEPDIR)/$(am__dirstamp)
  src/processor/src_processor_synth_minidump_unittest-synth_minidump.$(OBJEXT):  \
  	src/processor/$(am__dirstamp) \
  	src/processor/$(DEPDIR)/$(am__dirstamp)
 -src/processor/synth_minidump_unittest$(EXEEXT): $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
 +src/processor/synth_minidump_unittest$(EXEEXT): $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_DEPENDENCIES) $(EXTRA_src_processor_synth_minidump_unittest_DEPENDENCIES) src/processor/$(am__dirstamp)
  	@rm -f src/processor/synth_minidump_unittest$(EXEEXT)
  	$(CXXLINK) $(src_processor_synth_minidump_unittest_OBJECTS) $(src_processor_synth_minidump_unittest_LDADD) $(LIBS)
  src/tools/linux/core2md/$(am__dirstamp):
-@@ -3238,7 +3265,7 @@
+ 	@$(MKDIR_P) src/tools/linux/core2md
+ 	@: > src/tools/linux/core2md/$(am__dirstamp)
+ src/tools/linux/core2md/$(DEPDIR)/$(am__dirstamp):
+ 	@$(MKDIR_P) src/tools/linux/core2md/$(DEPDIR)
+ 	@: > src/tools/linux/core2md/$(DEPDIR)/$(am__dirstamp)
+@@ -3233,29 +3260,27 @@
+ 	src/tools/linux/core2md/$(am__dirstamp) \
+ 	src/tools/linux/core2md/$(DEPDIR)/$(am__dirstamp)
+ src/client/linux/minidump_writer/linux_core_dumper.$(OBJEXT):  \
+ 	src/client/linux/minidump_writer/$(am__dirstamp) \
+ 	src/client/linux/minidump_writer/$(DEPDIR)/$(am__dirstamp)
  src/common/linux/elf_core_dump.$(OBJEXT):  \
  	src/common/linux/$(am__dirstamp) \
  	src/common/linux/$(DEPDIR)/$(am__dirstamp)
 -src/tools/linux/core2md/core2md$(EXEEXT): $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_DEPENDENCIES) src/tools/linux/core2md/$(am__dirstamp)
 +src/tools/linux/core2md/core2md$(EXEEXT): $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_DEPENDENCIES) $(EXTRA_src_tools_linux_core2md_core2md_DEPENDENCIES) src/tools/linux/core2md/$(am__dirstamp)
  	@rm -f src/tools/linux/core2md/core2md$(EXEEXT)
  	$(CXXLINK) $(src_tools_linux_core2md_core2md_OBJECTS) $(src_tools_linux_core2md_core2md_LDADD) $(LIBS)
  src/common/dwarf_cfi_to_module.$(OBJEXT): src/common/$(am__dirstamp) \
-@@ -3249,8 +3276,6 @@
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/common/dwarf_cu_to_module.$(OBJEXT): src/common/$(am__dirstamp) \
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/common/dwarf_line_to_module.$(OBJEXT): src/common/$(am__dirstamp) \
  	src/common/$(DEPDIR)/$(am__dirstamp)
  src/common/language.$(OBJEXT): src/common/$(am__dirstamp) \
  	src/common/$(DEPDIR)/$(am__dirstamp)
 -src/common/module.$(OBJEXT): src/common/$(am__dirstamp) \
 -	src/common/$(DEPDIR)/$(am__dirstamp)
  src/common/stabs_reader.$(OBJEXT): src/common/$(am__dirstamp) \
  	src/common/$(DEPDIR)/$(am__dirstamp)
  src/common/stabs_to_module.$(OBJEXT): src/common/$(am__dirstamp) \
-@@ -3279,7 +3304,7 @@
+ 	src/common/$(DEPDIR)/$(am__dirstamp)
+ src/common/dwarf/bytereader.$(OBJEXT):  \
+ 	src/common/dwarf/$(am__dirstamp) \
+ 	src/common/dwarf/$(DEPDIR)/$(am__dirstamp)
+ src/common/dwarf/dwarf2diehandler.$(OBJEXT):  \
+@@ -3274,65 +3299,65 @@
+ 	@$(MKDIR_P) src/tools/linux/dump_syms
+ 	@: > src/tools/linux/dump_syms/$(am__dirstamp)
+ src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp):
+ 	@$(MKDIR_P) src/tools/linux/dump_syms/$(DEPDIR)
+ 	@: > src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp)
  src/tools/linux/dump_syms/dump_syms.$(OBJEXT):  \
  	src/tools/linux/dump_syms/$(am__dirstamp) \
  	src/tools/linux/dump_syms/$(DEPDIR)/$(am__dirstamp)
 -src/tools/linux/dump_syms/dump_syms$(EXEEXT): $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_DEPENDENCIES) src/tools/linux/dump_syms/$(am__dirstamp)
 +src/tools/linux/dump_syms/dump_syms$(EXEEXT): $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_DEPENDENCIES) $(EXTRA_src_tools_linux_dump_syms_dump_syms_DEPENDENCIES) src/tools/linux/dump_syms/$(am__dirstamp)
  	@rm -f src/tools/linux/dump_syms/dump_syms$(EXEEXT)
  	$(CXXLINK) $(src_tools_linux_dump_syms_dump_syms_OBJECTS) $(src_tools_linux_dump_syms_dump_syms_LDADD) $(LIBS)
  src/tools/linux/md2core/$(am__dirstamp):
-@@ -3291,7 +3316,7 @@
+ 	@$(MKDIR_P) src/tools/linux/md2core
+ 	@: > src/tools/linux/md2core/$(am__dirstamp)
+ src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp):
+ 	@$(MKDIR_P) src/tools/linux/md2core/$(DEPDIR)
+ 	@: > src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp)
  src/tools/linux/md2core/minidump-2-core.$(OBJEXT):  \
  	src/tools/linux/md2core/$(am__dirstamp) \
  	src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp)
 -src/tools/linux/md2core/minidump-2-core$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp)
 +src/tools/linux/md2core/minidump-2-core$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_DEPENDENCIES) $(EXTRA_src_tools_linux_md2core_minidump_2_core_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp)
  	@rm -f src/tools/linux/md2core/minidump-2-core$(EXEEXT)
  	$(CXXLINK) $(src_tools_linux_md2core_minidump_2_core_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_LDADD) $(LIBS)
  src/testing/gtest/src/src_tools_linux_md2core_minidump_2_core_unittest-gtest-all.$(OBJEXT):  \
-@@ -3306,7 +3331,7 @@
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/gtest/src/src_tools_linux_md2core_minidump_2_core_unittest-gtest_main.$(OBJEXT):  \
+ 	src/testing/gtest/src/$(am__dirstamp) \
+ 	src/testing/gtest/src/$(DEPDIR)/$(am__dirstamp)
+ src/testing/src/src_tools_linux_md2core_minidump_2_core_unittest-gmock-all.$(OBJEXT):  \
+ 	src/testing/src/$(am__dirstamp) \
+ 	src/testing/src/$(DEPDIR)/$(am__dirstamp)
  src/tools/linux/md2core/src_tools_linux_md2core_minidump_2_core_unittest-minidump_memory_range_unittest.$(OBJEXT):  \
  	src/tools/linux/md2core/$(am__dirstamp) \
  	src/tools/linux/md2core/$(DEPDIR)/$(am__dirstamp)
 -src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp)
 +src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT): $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES) $(EXTRA_src_tools_linux_md2core_minidump_2_core_unittest_DEPENDENCIES) src/tools/linux/md2core/$(am__dirstamp)
  	@rm -f src/tools/linux/md2core/minidump_2_core_unittest$(EXEEXT)
  	$(CXXLINK) $(src_tools_linux_md2core_minidump_2_core_unittest_OBJECTS) $(src_tools_linux_md2core_minidump_2_core_unittest_LDADD) $(LIBS)
  src/common/linux/http_upload.$(OBJEXT):  \
-@@ -3321,13 +3346,13 @@
+ 	src/common/linux/$(am__dirstamp) \
+ 	src/common/linux/$(DEPDIR)/$(am__dirstamp)
+ src/tools/linux/symupload/$(am__dirstamp):
+ 	@$(MKDIR_P) src/tools/linux/symupload
+ 	@: > src/tools/linux/symupload/$(am__dirstamp)
+ src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp):
+ 	@$(MKDIR_P) src/tools/linux/symupload/$(DEPDIR)
+ 	@: > src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp)
  src/tools/linux/symupload/minidump_upload.$(OBJEXT):  \
  	src/tools/linux/symupload/$(am__dirstamp) \
  	src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp)
 -src/tools/linux/symupload/minidump_upload$(EXEEXT): $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp)
 +src/tools/linux/symupload/minidump_upload$(EXEEXT): $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_DEPENDENCIES) $(EXTRA_src_tools_linux_symupload_minidump_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp)
  	@rm -f src/tools/linux/symupload/minidump_upload$(EXEEXT)
  	$(CXXLINK) $(src_tools_linux_symupload_minidump_upload_OBJECTS) $(src_tools_linux_symupload_minidump_upload_LDADD) $(LIBS)
  src/tools/linux/symupload/sym_upload.$(OBJEXT):  \
  	src/tools/linux/symupload/$(am__dirstamp) \
  	src/tools/linux/symupload/$(DEPDIR)/$(am__dirstamp)
 -src/tools/linux/symupload/sym_upload$(EXEEXT): $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp)
 +src/tools/linux/symupload/sym_upload$(EXEEXT): $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_DEPENDENCIES) $(EXTRA_src_tools_linux_symupload_sym_upload_DEPENDENCIES) src/tools/linux/symupload/$(am__dirstamp)
  	@rm -f src/tools/linux/symupload/sym_upload$(EXEEXT)
  	$(CXXLINK) $(src_tools_linux_symupload_sym_upload_OBJECTS) $(src_tools_linux_symupload_sym_upload_LDADD) $(LIBS)
  
-@@ -5864,9 +5889,7 @@
+ mostlyclean-compile:
+ 	-rm -f *.$(OBJEXT)
+ 	-rm -f src/client/linux/crash_generation/crash_generation_client.$(OBJEXT)
+ 	-rm -f src/client/linux/crash_generation/crash_generation_server.$(OBJEXT)
+ 	-rm -f src/client/linux/handler/exception_handler.$(OBJEXT)
+@@ -5859,19 +5884,17 @@
+ 	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \
+ 	  $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \
+ 	done
+ 
+ uninstall-dist_docDATA:
  	@$(NORMAL_UNINSTALL)
  	@list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \
  	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 -	test -n "$$files" || exit 0; \
 -	echo " ( cd '$(DESTDIR)$(docdir)' && rm -f" $$files ")"; \
 -	cd "$(DESTDIR)$(docdir)" && rm -f $$files
 +	dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)
  
  ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
  	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-@@ -6001,14 +6024,15 @@
+ 	unique=`for i in $$list; do \
+ 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ 	  done | \
+ 	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+@@ -5996,24 +6019,25 @@
+ 	  report=""; \
+ 	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+ 	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+ 	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+ 	      dashes="$$report"; \
  	  fi; \
  	  dashes=`echo "$$dashes" | sed s/./=/g`; \
  	  if test "$$failed" -eq 0; then \
 -	    echo "$$grn$$dashes"; \
 +	    col="$$grn"; \
  	  else \
 -	    echo "$$red$$dashes"; \
 +	    col="$$red"; \
@@ -676,56 +1205,96 @@ diff --git a/Makefile.in b/Makefile.in
 +	  echo "$${col}$$dashes$${std}"; \
 +	  echo "$${col}$$banner$${std}"; \
 +	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
 +	  test -z "$$report" || echo "$${col}$$report$${std}"; \
 +	  echo "$${col}$$dashes$${std}"; \
  	  test "$$failed" -eq 0; \
  	else :; fi
  
-@@ -6056,7 +6080,11 @@
+ distdir: $(DISTFILES)
+ 	$(am__remove_distdir)
+ 	test -d "$(distdir)" || mkdir "$(distdir)"
+ 	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ 	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+@@ -6051,25 +6075,29 @@
+ 	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ 	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ 	|| chmod -R a+r "$(distdir)"
+ dist-gzip: distdir
+ 	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
  	$(am__remove_distdir)
  
  dist-bzip2: distdir
 -	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
 +	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
 +	$(am__remove_distdir)
 +
 +dist-lzip: distdir
 +	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
  	$(am__remove_distdir)
  
  dist-lzma: distdir
-@@ -6064,7 +6092,7 @@
+ 	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
  	$(am__remove_distdir)
  
  dist-xz: distdir
 -	tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz
 +	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
  	$(am__remove_distdir)
  
  dist-tarZ: distdir
-@@ -6095,6 +6123,8 @@
+ 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ 	$(am__remove_distdir)
+ 
+ dist-shar: distdir
+ 	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+@@ -6090,16 +6118,18 @@
+ distcheck: dist
+ 	case '$(DIST_ARCHIVES)' in \
+ 	*.tar.gz*) \
+ 	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+ 	*.tar.bz2*) \
  	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
  	*.tar.lzma*) \
  	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
 +	*.tar.lz*) \
 +	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
  	*.tar.xz*) \
  	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
  	*.tar.Z*) \
-@@ -6114,6 +6144,7 @@
+ 	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ 	*.shar.gz*) \
+ 	  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\
+ 	*.zip*) \
+ 	  unzip $(distdir).zip ;;\
+@@ -6109,16 +6139,17 @@
+ 	mkdir $(distdir)/_inst
+ 	chmod a-w $(distdir)
+ 	test -d $(distdir)/_build || exit 0; \
+ 	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
  	  && am__cwd=`pwd` \
  	  && $(am__cd) $(distdir)/_build \
  	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
 +	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
  	    $(DISTCHECK_CONFIGURE_FLAGS) \
  	  && $(MAKE) $(AM_MAKEFLAGS) \
  	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-@@ -6142,8 +6173,16 @@
+ 	  && $(MAKE) $(AM_MAKEFLAGS) check \
+ 	  && $(MAKE) $(AM_MAKEFLAGS) install \
+ 	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ 	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ 	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+@@ -6137,18 +6168,26 @@
+ 	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ 	  && cd "$$am__cwd" \
+ 	  || exit 1
+ 	$(am__remove_distdir)
+ 	@(echo "$(distdir) archives ready for distribution: "; \
  	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
  	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
  distuninstallcheck:
 -	@$(am__cd) '$(distuninstallcheck_dir)' \
 -	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
 +	@test -n '$(distuninstallcheck_dir)' || { \
 +	  echo 'ERROR: trying to run $@ with an empty' \
 +	       '$$(distuninstallcheck_dir)' >&2; \
@@ -734,17 +1303,27 @@ diff --git a/Makefile.in b/Makefile.in
 +	$(am__cd) '$(distuninstallcheck_dir)' || { \
 +	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
 +	  exit 1; \
 +	}; \
 +	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
  	   || { echo "ERROR: files left after uninstall:" ; \
  	        if test -n "$(DESTDIR)"; then \
  	          echo "  (check DESTDIR support)"; \
-@@ -6178,10 +6217,15 @@
+ 	        fi ; \
+ 	        $(distuninstallcheck_listfiles) ; \
+ 	        exit 1; } >&2
+ distcleancheck: distclean
+ 	@if test '$(srcdir)' = . ; then \
+@@ -6173,20 +6212,25 @@
+ install-data: install-data-am
+ uninstall: uninstall-am
+ 
+ install-am: all-am
+ 	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
  
  installcheck: installcheck-am
  install-strip:
 -	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 -	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 -	  `test -z '$(STRIP)' || \
 -	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
 +	if test -z '$(STRIP)'; then \
@@ -754,42 +1333,61 @@ diff --git a/Makefile.in b/Makefile.in
 +	else \
 +	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
 +	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
 +	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
 +	fi
  mostlyclean-generic:
  
  clean-generic:
-@@ -6313,8 +6357,8 @@
+ 
+ distclean-generic:
+ 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ 	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ 	-rm -f src/$(am__dirstamp)
+@@ -6308,18 +6352,18 @@
+ uninstall-am: uninstall-binPROGRAMS uninstall-dist_docDATA \
+ 	uninstall-libLIBRARIES
+ 
+ .MAKE: check-am install-am install-strip
+ 
  .PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \
  	clean clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
  	clean-libLIBRARIES clean-noinstLIBRARIES clean-noinstPROGRAMS \
 -	ctags dist dist-all dist-bzip2 dist-gzip dist-lzma dist-shar \
 -	dist-tarZ dist-xz dist-zip distcheck distclean \
 +	ctags dist dist-all dist-bzip2 dist-gzip dist-lzip dist-lzma \
 +	dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \
  	distclean-compile distclean-generic distclean-hdr \
  	distclean-tags distcleancheck distdir distuninstallcheck dvi \
  	dvi-am html html-am info info-am install install-am \
+ 	install-binPROGRAMS install-data install-data-am \
+ 	install-dist_docDATA install-dvi install-dvi-am install-exec \
+ 	install-exec-am install-html install-html-am install-info \
+ 	install-info-am install-libLIBRARIES install-man install-pdf \
+ 	install-pdf-am install-ps install-ps-am install-strip \
 diff --git a/aclocal.m4 b/aclocal.m4
 --- a/aclocal.m4
 +++ b/aclocal.m4
-@@ -1,7 +1,8 @@
+@@ -1,61 +1,65 @@
 -# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
 +# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
  
  # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 -# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
 +# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
 +# Inc.
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
-@@ -13,18 +14,21 @@
+ 
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ # PARTICULAR PURPOSE.
  
  m4_ifndef([AC_AUTOCONF_VERSION],
    [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
 -[m4_warning([this file was generated for autoconf 2.65.
 +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
 +[m4_warning([this file was generated for autoconf 2.68.
  You have another version of autoconf.  It may work, but is not guaranteed to.
@@ -804,51 +1402,81 @@ diff --git a/aclocal.m4 b/aclocal.m4
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 +# serial 1
 +
  # AM_AUTOMAKE_VERSION(VERSION)
  # ----------------------------
  # Automake X.Y traces this macro to ensure aclocal.m4 has been
-@@ -34,7 +38,7 @@
+ # generated from the m4 files accompanying Automake X.Y.
+ # (This private macro should not be called outside this file.)
+ AC_DEFUN([AM_AUTOMAKE_VERSION],
  [am__api_version='1.11'
  dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
  dnl require some minimum version.  Point them to the right macro.
 -m4_if([$1], [1.11.1], [],
 +m4_if([$1], [1.11.3], [],
        [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
  ])
  
-@@ -50,7 +54,7 @@
+ # _AM_AUTOCONF_VERSION(VERSION)
+ # -----------------------------
+ # aclocal traces this macro to find the Autoconf version.
+ # This is a private macro too.  Using m4_define simplifies
+ # the logic in aclocal, which can simply ignore this definition.
+ m4_define([_AM_AUTOCONF_VERSION], [])
+ 
+ # AM_SET_CURRENT_AUTOMAKE_VERSION
+ # -------------------------------
  # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
  # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
  AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
 -[AM_AUTOMAKE_VERSION([1.11.1])dnl
 +[AM_AUTOMAKE_VERSION([1.11.3])dnl
  m4_ifndef([AC_AUTOCONF_VERSION],
    [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
  _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
-@@ -79,12 +83,14 @@
+ 
+ # Figure out how to run the assembler.                      -*- Autoconf -*-
+ 
+ # Copyright (C) 2001, 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+ #
+@@ -74,22 +78,24 @@
+ test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+ AC_ARG_VAR([CCAS],      [assembler compiler command (defaults to CC)])
+ AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)])
+ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
+ ])
  
  # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
  
 -# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
 +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
  #
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 +# serial 1
 +
  # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
  # $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
  # `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-@@ -166,14 +172,14 @@
+ #
+ # Of course, Automake must honor this variable whenever it calls a
+ # tool from the auxiliary directory.  The problem is that $srcdir (and
+ # therefore $ac_aux_dir as well) can be either absolute or relative,
+ # depending on how configure is run.  This is pretty annoying, since
+@@ -161,24 +167,24 @@
+   $1_FALSE=
+ fi
+ AC_CONFIG_COMMANDS_PRE(
+ [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+   AC_MSG_ERROR([[conditional "$1" was never defined.
  Usually this means the macro was only invoked conditionally.]])
  fi])])
  
 -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
 -# Free Software Foundation, Inc.
 +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
 +# 2010, 2011 Free Software Foundation, Inc.
  #
@@ -856,222 +1484,341 @@ diff --git a/aclocal.m4 b/aclocal.m4
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 -# serial 10
 +# serial 12
  
  # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
  # written in clear, in which case automake, when reading aclocal.m4,
-@@ -213,6 +219,7 @@
+ # will think it sees a *use*, and therefore will trigger all it's
+ # C support machinery.  Also note that it means that autoscan, seeing
+ # CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+ 
+ 
+@@ -208,16 +214,17 @@
+ AC_CACHE_CHECK([dependency style of $depcc],
+                [am_cv_$1_dependencies_compiler_type],
+ [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+   # We make a subdir and do the tests there.  Otherwise we can end up
+   # making bogus files that we don't know about and never remove.  For
    # instance it was reported that on HP-UX the gcc test will end up
    # making a dummy file named `D' -- because `-MD' means `put the output
    # in D'.
 +  rm -rf conftest.dir
    mkdir conftest.dir
    # Copy depcomp to subdir because otherwise we won't find it if we're
    # using a relative directory.
-@@ -277,7 +284,7 @@
+   cp "$am_depcomp" conftest.dir
+   cd conftest.dir
+   # We will build objects and dependencies in a subdirectory because
+   # it helps to detect inapplicable dependency modes.  For instance
+   # both Tru64's cc and ICC support -MD to output dependencies as a
+@@ -272,17 +279,17 @@
+       # after this tag, mechanisms are not by side-effect, so they'll
+       # only be used when explicitly requested
+       if test "x$enable_dependency_tracking" = xyes; then
+ 	continue
+       else
  	break
        fi
        ;;
 -    msvisualcpp | msvcmsys)
 +    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
        # This compiler won't grok `-c -o', but also, the minuso test has
        # not run yet.  These depmodes are late enough in the game, and
        # so weak that their functioning should not be impacted.
-@@ -342,10 +349,13 @@
+       am__obj=conftest.${OBJEXT-o}
+       am__minus_obj=
+       ;;
+     none) break ;;
+     esac
+@@ -337,20 +344,23 @@
+ # ------------
+ AC_DEFUN([AM_DEP_TRACK],
+ [AC_ARG_ENABLE(dependency-tracking,
+ [  --disable-dependency-tracking  speeds up one-time build
+   --enable-dependency-tracking   do not reject slow dependency extractors])
  if test "x$enable_dependency_tracking" != xno; then
    am_depcomp="$ac_aux_dir/depcomp"
    AMDEPBACKSLASH='\'
 +  am__nodep='_no'
  fi
  AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
  AC_SUBST([AMDEPBACKSLASH])dnl
  _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
 +AC_SUBST([am__nodep])dnl
 +_AM_SUBST_NOTMAKE([am__nodep])dnl
  ])
  
  # Generate code to set up dependency tracking.              -*- Autoconf -*-
-@@ -579,12 +589,15 @@
+ 
+ # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+ # Free Software Foundation, Inc.
+ #
+ # This file is free software; the Free Software Foundation
+@@ -574,22 +584,25 @@
+     $_am_arg | $_am_arg:* )
+       break ;;
+     * )
+       _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+   esac
  done
  echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
  
 -# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
 +# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
 +# Inc.
  #
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 +# serial 1
 +
  # AM_PROG_INSTALL_SH
  # ------------------
  # Define $install_sh.
-@@ -751,12 +764,15 @@
+ AC_DEFUN([AM_PROG_INSTALL_SH],
+ [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+ if test x"${install_sh}" != xset; then
+   case $am_aux_dir in
+   *\ * | *\	*)
+@@ -746,22 +759,25 @@
+ if eval "$MISSING --run true"; then
+   am_missing_run="$MISSING --run "
+ else
+   am_missing_run=
+   AC_MSG_WARN([`missing' script is too old or missing])
  fi
  ])
  
 -# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
 +# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
 +# Inc.
  #
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 +# serial 1
 +
  # AM_PROG_MKDIR_P
  # ---------------
  # Check for `mkdir -p'.
-@@ -779,13 +795,14 @@
+ AC_DEFUN([AM_PROG_MKDIR_P],
+ [AC_PREREQ([2.60])dnl
+ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+ dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+ dnl while keeping a definition of mkdir_p for backward compatibility.
+@@ -774,53 +790,56 @@
+ case $mkdir_p in
+   [[\\/$]]* | ?:[[\\/]]*) ;;
+   */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+ esac
+ ])
  
  # Helper functions for option handling.                     -*- Autoconf -*-
  
 -# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
 +# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
 +# Foundation, Inc.
  #
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 -# serial 4
 +# serial 5
  
  # _AM_MANGLE_OPTION(NAME)
  # -----------------------
-@@ -793,13 +810,13 @@
+ AC_DEFUN([_AM_MANGLE_OPTION],
  [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
  
  # _AM_SET_OPTION(NAME)
 -# ------------------------------
 +# --------------------
  # Set option NAME.  Presently that only means defining a flag for this option.
  AC_DEFUN([_AM_SET_OPTION],
  [m4_define(_AM_MANGLE_OPTION([$1]), 1)])
  
  # _AM_SET_OPTIONS(OPTIONS)
 -# ----------------------------------
 +# ------------------------
  # OPTIONS is a space-separated list of Automake options.
  AC_DEFUN([_AM_SET_OPTIONS],
  [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-@@ -810,12 +827,14 @@
+ 
+ # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+ # -------------------------------------------
+ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
  AC_DEFUN([_AM_IF_OPTION],
  [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
  
 -# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
 +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
  #
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 +# serial 1
 +
  # AM_RUN_LOG(COMMAND)
  # -------------------
  # Run COMMAND, save the exit status in ac_status, and log it.
-@@ -892,12 +911,14 @@
+ # (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+ AC_DEFUN([AM_RUN_LOG],
+ [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+    ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+    ac_status=$?
+@@ -887,22 +906,24 @@
+    # Ok.
+    :
+ else
+    AC_MSG_ERROR([newly created file is older than distributed files!
+ Check your system clock])
  fi
  AC_MSG_RESULT(yes)])
  
 -# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
 +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
  #
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 +# serial 1
 +
  # AM_PROG_INSTALL_STRIP
  # ---------------------
  # One issue with vendor `install' (even GNU) is that you can't
-@@ -920,13 +941,13 @@
+ # specify the program used to strip binaries.  This is especially
+ # annoying in cross-compiling environments, where the build's strip
+ # is unlikely to handle the host's binaries.
+ # Fortunately install-sh will honor a STRIPPROG variable, so we
+ # always use install-sh in `make install-strip', and initialize
+@@ -915,38 +936,38 @@
+ # will honor the `STRIP' environment variable to overrule this program.
+ dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+ if test "$cross_compiling" != no; then
+   AC_CHECK_TOOL([STRIP], [strip], :)
+ fi
  INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
  AC_SUBST([INSTALL_STRIP_PROGRAM])])
  
 -# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
 +# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
  #
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
  # with or without modifications, as long as this notice is preserved.
  
 -# serial 2
 +# serial 3
  
  # _AM_SUBST_NOTMAKE(VARIABLE)
  # ---------------------------
-@@ -935,13 +956,13 @@
+ # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+ # This macro is traced by Automake.
  AC_DEFUN([_AM_SUBST_NOTMAKE])
  
  # AM_SUBST_NOTMAKE(VARIABLE)
 -# ---------------------------
 +# --------------------------
  # Public sister of _AM_SUBST_NOTMAKE.
  AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
  
  # Check how to create a tarball.                            -*- Autoconf -*-
  
 -# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
 +# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
  #
  # This file is free software; the Free Software Foundation
  # gives unlimited permission to copy and/or distribute it,
-@@ -963,10 +984,11 @@
+ # with or without modifications, as long as this notice is preserved.
+ 
+ # serial 2
+ 
+ # _AM_PROG_TAR(FORMAT)
+@@ -958,20 +979,21 @@
+ # writing to stdout a FORMAT-tarball containing the directory
+ # $tardir.
+ #     tardir=directory && $(am__tar) > result.tar
+ #
+ # Substitute a variable $(am__untar) that extract such
  # a tarball read from stdin.
  #     $(am__untar) < result.tar
  AC_DEFUN([_AM_PROG_TAR],
 -[# Always define AMTAR for backward compatibility.
 -AM_MISSING_PROG([AMTAR], [tar])
 +[# Always define AMTAR for backward compatibility.  Yes, it's still used
 +# in the wild :-(  We should find a proper way to deprecate it ...
 +AC_SUBST([AMTAR], ['$${TAR-tar}'])
  m4_if([$1], [v7],
 -     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
 +     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
       [m4_case([$1], [ustar],, [pax],,
                [m4_fatal([Unknown tar format])])
  AC_MSG_CHECKING([how to create a $1 tar archive])
+ # Loop over all known methods to create a tar archive until one works.
+ _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+ # Do not fold the above two line into one, because Tru64 sh and
+ # Solaris sh will not grok spaces in the rhs of `-'.
 diff --git a/configure b/configure
 --- a/configure
 +++ b/configure
-@@ -1,13 +1,13 @@
+@@ -1,18 +1,18 @@
  #! /bin/sh
  # Guess values for system-dependent variables and create Makefiles.
 -# Generated by GNU Autoconf 2.65 for breakpad 0.1.
 +# Generated by GNU Autoconf 2.68 for breakpad 0.1.
  #
  # Report bugs to <google-breakpad-dev@googlegroups.com>.
  #
  #
  # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
 -# Inc.
 +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
 +# Foundation, Inc.
  #
  #
  # This configure script is free software; the Free Software Foundation
-@@ -91,6 +91,7 @@
+ # gives unlimited permission to copy, distribute and modify it.
+ ## -------------------- ##
+ ## M4sh Initialization. ##
+ ## -------------------- ##
+ 
+@@ -86,16 +86,17 @@
+ # IFS
+ # We need space, tab and new line, in precisely that order.  Quoting is
+ # there to prevent editors from complaining about space-tab.
+ # (If _AS_PATH_WALK were called with IFS unset, it would disable word
+ # splitting by setting IFS to empty value.)
  IFS=" ""	$as_nl"
  
  # Find who we are.  Look in the path if we contain no directory separator.
 +as_myself=
  case $0 in #((
    *[\\/]* ) as_myself=$0 ;;
    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-@@ -216,11 +217,18 @@
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   test -z "$as_dir" && as_dir=.
+     test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+@@ -211,21 +212,28 @@
+ fi; }
+ IFS=$as_save_IFS
+ 
+ 
+       if test "x$CONFIG_SHELL" != x; then :
    # We cannot yet assume a decent shell, so we have to provide a
  	# neutralization value for shells without unset; and this also
  	# works around shells that cannot unset nonexistent variables.
 +	# Preserve -v and -x to the replacement shell.
  	BASH_ENV=/dev/null
  	ENV=/dev/null
  	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
  	export CONFIG_SHELL
@@ -1081,26 +1828,46 @@ diff --git a/configure b/configure
 +	  *v* ) as_opts=-v ;;
 +	  *x* ) as_opts=-x ;;
 +	  * ) as_opts= ;;
 +	esac
 +	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
  fi
  
      if test x$as_have_required = xno; then :
-@@ -319,7 +327,7 @@
+   $as_echo "$0: This script requires a shell more modern than all"
+   $as_echo "$0: the shells that I found on your system."
+   if test x${ZSH_VERSION+set} = xset ; then
+     $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+     $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+@@ -314,17 +322,17 @@
+ 	  /^X\(\/\).*/{
+ 	    s//\1/
+ 	    q
+ 	  }
+ 	  s/.*/./; q'`
        test -d "$as_dir" && break
      done
      test -z "$as_dirs" || eval "mkdir $as_dirs"
 -  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
 +  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
  
  
  } # as_fn_mkdir_p
-@@ -359,19 +367,19 @@
+ # as_fn_append VAR VALUE
+ # ----------------------
+ # Append the text in VALUE to the end of the definition contained in VAR. Take
+ # advantage of any shell optimizations that allow amortized linear growth over
+ # repeated appends, instead of the typical quadratic growth present in naive
+@@ -354,29 +362,29 @@
+ else
+   as_fn_arith ()
+   {
+     as_val=`expr "$@" || test $? -eq 1`
+   }
  fi # as_fn_arith
  
  
 -# as_fn_error ERROR [LINENO LOG_FD]
 -# ---------------------------------
 +# as_fn_error STATUS ERROR [LINENO LOG_FD]
 +# ----------------------------------------
  # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
@@ -1118,271 +1885,482 @@ diff --git a/configure b/configure
 +    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
 +    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
    fi
 -  $as_echo "$as_me: error: $1" >&2
 +  $as_echo "$as_me: error: $2" >&2
    as_fn_exit $as_status
  } # as_fn_error
  
-@@ -533,7 +541,7 @@
+ if expr a : '\(a\)' >/dev/null 2>&1 &&
+    test "X`expr 00001 : '.*\(...\)'`" = X001; then
+   as_expr=expr
+ else
+   as_expr=false
+@@ -528,17 +536,17 @@
+ # Sed expression to map a string onto a valid variable name.
+ as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+ 
+ 
+ test -n "$DJDIR" || exec 7<&0 </dev/null
  exec 6>&1
  
  # Name of the host.
 -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
 +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
  # so uname gets run too.
  ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
  
-@@ -632,6 +640,7 @@
+ #
+ # Initializations.
+ #
+ ac_default_prefix=/usr/local
+ ac_clean_files=
+@@ -627,16 +635,17 @@
+ am__fastdepCCAS_FALSE
+ am__fastdepCCAS_TRUE
+ CCASDEPMODE
+ CCASFLAGS
+ CCAS
  am__fastdepCC_FALSE
  am__fastdepCC_TRUE
  CCDEPMODE
 +am__nodep
  AMDEPBACKSLASH
  AMDEP_FALSE
  AMDEP_TRUE
-@@ -799,8 +808,9 @@
+ am__quote
+ am__include
+ DEPDIR
+ OBJEXT
+ EXEEXT
+@@ -794,18 +803,19 @@
+   # If the previous option needs an argument, assign it.
+   if test -n "$ac_prev"; then
+     eval $ac_prev=\$ac_option
+     ac_prev=
+     continue
    fi
  
    case $ac_option in
 -  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
 -  *)	ac_optarg=yes ;;
 +  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
 +  *=)   ac_optarg= ;;
 +  *)    ac_optarg=yes ;;
    esac
  
    # Accept the important Cygnus configure options, so we can diagnose typos.
-@@ -845,7 +855,7 @@
+ 
+   case $ac_dashdash$ac_option in
+   --)
+     ac_dashdash=yes ;;
+ 
+@@ -840,17 +850,17 @@
+   -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+   | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+     datarootdir=$ac_optarg ;;
+ 
+   -disable-* | --disable-*)
      ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
      # Reject names that are not valid shell variable names.
      expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
 -      as_fn_error "invalid feature name: $ac_useropt"
 +      as_fn_error $? "invalid feature name: $ac_useropt"
      ac_useropt_orig=$ac_useropt
      ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
      case $ac_user_opts in
-@@ -871,7 +881,7 @@
+       *"
+ "enable_$ac_useropt"
+ "*) ;;
+       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ 	 ac_unrecognized_sep=', ';;
+@@ -866,17 +876,17 @@
+     ac_prev=dvidir ;;
+   -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+     dvidir=$ac_optarg ;;
+ 
+   -enable-* | --enable-*)
      ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
      # Reject names that are not valid shell variable names.
      expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
 -      as_fn_error "invalid feature name: $ac_useropt"
 +      as_fn_error $? "invalid feature name: $ac_useropt"
      ac_useropt_orig=$ac_useropt
      ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
      case $ac_user_opts in
-@@ -1075,7 +1085,7 @@
+       *"
+ "enable_$ac_useropt"
+ "*) ;;
+       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ 	 ac_unrecognized_sep=', ';;
+@@ -1070,33 +1080,33 @@
+ 
+   -version | --version | --versio | --versi | --vers | -V)
+     ac_init_version=: ;;
+ 
+   -with-* | --with-*)
      ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
      # Reject names that are not valid shell variable names.
      expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
 -      as_fn_error "invalid package name: $ac_useropt"
 +      as_fn_error $? "invalid package name: $ac_useropt"
      ac_useropt_orig=$ac_useropt
      ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
      case $ac_user_opts in
-@@ -1091,7 +1101,7 @@
+       *"
+ "with_$ac_useropt"
+ "*) ;;
+       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ 	 ac_unrecognized_sep=', ';;
+     esac
+     eval with_$ac_useropt=\$ac_optarg ;;
+ 
+   -without-* | --without-*)
      ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
      # Reject names that are not valid shell variable names.
      expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
 -      as_fn_error "invalid package name: $ac_useropt"
 +      as_fn_error $? "invalid package name: $ac_useropt"
      ac_useropt_orig=$ac_useropt
      ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
      case $ac_user_opts in
-@@ -1121,8 +1131,8 @@
+       *"
+ "with_$ac_useropt"
+ "*) ;;
+       *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ 	 ac_unrecognized_sep=', ';;
+@@ -1116,50 +1126,50 @@
+ 
+   -x-libraries | --x-libraries | --x-librarie | --x-librari \
+   | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+     ac_prev=x_libraries ;;
+   -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
    | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
      x_libraries=$ac_optarg ;;
  
 -  -*) as_fn_error "unrecognized option: \`$ac_option'
 -Try \`$0 --help' for more information."
 +  -*) as_fn_error $? "unrecognized option: \`$ac_option'
 +Try \`$0 --help' for more information"
      ;;
  
    *=*)
-@@ -1130,7 +1140,7 @@
+     ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
      # Reject names that are not valid shell variable names.
      case $ac_envvar in #(
        '' | [0-9]* | *[!_$as_cr_alnum]* )
 -      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
 +      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
      esac
      eval $ac_envvar=\$ac_optarg
      export $ac_envvar ;;
-@@ -1140,7 +1150,7 @@
+ 
+   *)
+     # FIXME: should be removed in autoconf 3.0.
      $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
      expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
        $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
 -    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
 +    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
      ;;
  
    esac
-@@ -1148,13 +1158,13 @@
+ done
  
  if test -n "$ac_prev"; then
    ac_option=--`echo $ac_prev | sed 's/_/-/g'`
 -  as_fn_error "missing argument to $ac_option"
 +  as_fn_error $? "missing argument to $ac_option"
  fi
  
  if test -n "$ac_unrecognized_opts"; then
    case $enable_option_checking in
      no) ;;
 -    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
 +    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
      *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
    esac
  fi
-@@ -1177,7 +1187,7 @@
+ 
+ # Check all directory arguments for consistency.
+ for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ 		datadir sysconfdir sharedstatedir localstatedir includedir \
+ 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+@@ -1172,49 +1182,49 @@
+       ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+       eval $ac_var=\$ac_val;;
+   esac
+   # Be sure to have absolute directory names.
+   case $ac_val in
      [\\/$]* | ?:[\\/]* )  continue;;
      NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
    esac
 -  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
 +  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
  done
  
  # There might be people who depend on the old broken behavior: `$host'
-@@ -1191,8 +1201,8 @@
+ # used to hold the argument of --host etc.
+ # FIXME: To remove some day.
+ build=$build_alias
+ host=$host_alias
+ target=$target_alias
+ 
+ # FIXME: To remove some day.
  if test "x$host_alias" != x; then
    if test "x$build_alias" = x; then
      cross_compiling=maybe
 -    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
 -    If a cross compiler is detected then cross compile mode will be used." >&2
 +    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
 +    If a cross compiler is detected then cross compile mode will be used" >&2
    elif test "x$build_alias" != "x$host_alias"; then
      cross_compiling=yes
    fi
-@@ -1207,9 +1217,9 @@
+ fi
+ 
+ ac_tool_prefix=
+ test -n "$host_alias" && ac_tool_prefix=$host_alias-
+ 
+ test "$silent" = yes && exec 6>/dev/null
+ 
+ 
  ac_pwd=`pwd` && test -n "$ac_pwd" &&
  ac_ls_di=`ls -di .` &&
  ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
 -  as_fn_error "working directory cannot be determined"
 +  as_fn_error $? "working directory cannot be determined"
  test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
 -  as_fn_error "pwd does not report name of working directory"
 +  as_fn_error $? "pwd does not report name of working directory"
  
  
  # Find the source files, if location was not specified.
-@@ -1248,11 +1258,11 @@
+ if test -z "$srcdir"; then
+   ac_srcdir_defaulted=yes
+   # Try the directory containing this script, then the parent directory.
+   ac_confdir=`$as_dirname -- "$as_myself" ||
+ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+@@ -1243,21 +1253,21 @@
+   if test ! -r "$srcdir/$ac_unique_file"; then
+     srcdir=..
+   fi
+ else
+   ac_srcdir_defaulted=no
  fi
  if test ! -r "$srcdir/$ac_unique_file"; then
    test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
 -  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
 +  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
  fi
  ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
  ac_abs_confdir=`(
 -	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
 +	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
  	pwd)`
  # When building in place, set srcdir=.
  if test "$ac_abs_confdir" = "$ac_pwd"; then
-@@ -1292,7 +1302,7 @@
+   srcdir=.
+ fi
+ # Remove unnecessary trailing slashes from srcdir.
+ # Double slashes in file names in object file debugging info
+ # mess up M-x gdb in Emacs.
+@@ -1287,17 +1297,17 @@
+ 
+ Defaults for the options are specified in brackets.
+ 
+ Configuration:
+   -h, --help              display this help and exit
        --help=short        display options specific to this package
        --help=recursive    display the short help of all the included packages
    -V, --version           display version information and exit
 -  -q, --quiet, --silent   do not print \`checking...' messages
 +  -q, --quiet, --silent   do not print \`checking ...' messages
        --cache-file=FILE   cache test results in FILE [disabled]
    -C, --config-cache      alias for \`--cache-file=config.cache'
    -n, --no-create         do not create output files
-@@ -1445,9 +1455,9 @@
+       --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+ 
+ Installation directories:
+   --prefix=PREFIX         install architecture-independent files in PREFIX
+                           [$ac_default_prefix]
+@@ -1440,19 +1450,19 @@
+     cd "$ac_pwd" || { ac_status=$?; break; }
+   done
+ fi
+ 
+ test -n "$ac_init_help" && exit $ac_status
  if $ac_init_version; then
    cat <<\_ACEOF
  breakpad configure 0.1
 -generated by GNU Autoconf 2.65
 -
 -Copyright (C) 2009 Free Software Foundation, Inc.
 +generated by GNU Autoconf 2.68
 +
 +Copyright (C) 2010 Free Software Foundation, Inc.
  This configure script is free software; the Free Software Foundation
  gives unlimited permission to copy, distribute and modify it.
  _ACEOF
-@@ -1491,7 +1501,7 @@
+   exit
+ fi
+ 
+ ## ------------------------ ##
+ ## Autoconf initialization. ##
+@@ -1486,17 +1496,17 @@
+        } && test -s conftest.$ac_objext; then :
+   ac_retval=0
+ else
+   $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
  
  	ac_retval=1
  fi
 -  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
 +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
    as_fn_set_status $ac_retval
  
  } # ac_fn_c_try_compile
-@@ -1517,7 +1527,7 @@
+ 
+ # ac_fn_c_try_cpp LINENO
+ # ----------------------
+ # Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ ac_fn_c_try_cpp ()
+@@ -1512,28 +1522,28 @@
+   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+   ac_status=$?
+   if test -s conftest.err; then
+     grep -v '^ *+' conftest.err >conftest.er1
+     cat conftest.er1 >&5
      mv -f conftest.er1 conftest.err
    fi
    $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
 -  test $ac_status = 0; } >/dev/null && {
 +  test $ac_status = 0; } > conftest.i && {
  	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
  	 test ! -s conftest.err
         }; then :
-@@ -1528,7 +1538,7 @@
+   ac_retval=0
+ else
+   $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
  
      ac_retval=1
  fi
 -  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
 +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
    as_fn_set_status $ac_retval
  
  } # ac_fn_c_try_cpp
-@@ -1566,7 +1576,7 @@
+ 
+ # ac_fn_cxx_try_compile LINENO
+ # ----------------------------
+ # Try to compile conftest.$ac_ext, and return whether this succeeded.
+ ac_fn_cxx_try_compile ()
+@@ -1561,17 +1571,17 @@
+        } && test -s conftest.$ac_objext; then :
+   ac_retval=0
+ else
+   $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
  
  	ac_retval=1
  fi
 -  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
 +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
    as_fn_set_status $ac_retval
  
  } # ac_fn_cxx_try_compile
-@@ -1608,7 +1618,7 @@
+ 
+ # ac_fn_c_try_run LINENO
+ # ----------------------
+ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+ # that executables *can* be run.
+@@ -1603,17 +1613,17 @@
+ else
+   $as_echo "$as_me: program exited with status $ac_status" >&5
+        $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
+ 
         ac_retval=$ac_status
  fi
    rm -rf conftest.dSYM conftest_ipa8_conftest.oo
 -  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
 +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
    as_fn_set_status $ac_retval
  
  } # ac_fn_c_try_run
-@@ -1654,7 +1664,7 @@
+ 
+ # ac_fn_c_try_link LINENO
+ # -----------------------
+ # Try to link conftest.$ac_ext, and return whether this succeeded.
+ ac_fn_c_try_link ()
+@@ -1649,33 +1659,33 @@
+ 
+ 	ac_retval=1
+ fi
+   # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+   # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
    # interfere with the next link command; also delete a directory that is
    # left behind by Apple's compiler.  We do this before executing the actions.
    rm -rf conftest.dSYM conftest_ipa8_conftest.oo
 -  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
 +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
    as_fn_set_status $ac_retval
  
  } # ac_fn_c_try_link
-@@ -1667,10 +1677,10 @@
+ 
+ # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+ # -------------------------------------------------------
+ # Tests whether HEADER exists, giving a warning if it cannot be compiled using
+ # the include files in INCLUDES and setting the cache variable VAR
+ # accordingly.
  ac_fn_c_check_header_mongrel ()
  {
    as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
 -  if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
 +  if eval \${$3+:} false; then :
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
  $as_echo_n "checking for $2... " >&6; }
 -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
 +if eval \${$3+:} false; then :
    $as_echo_n "(cached) " >&6
  fi
  eval ac_res=\$$3
-@@ -1706,7 +1716,7 @@
+ 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+ $as_echo "$ac_res" >&6; }
+ else
+   # Is the header compilable?
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+@@ -1701,17 +1711,17 @@
+ /* end confdefs.h.  */
+ #include <$2>
+ _ACEOF
+ if ac_fn_c_try_cpp "$LINENO"; then :
+   ac_header_preproc=yes
  else
    ac_header_preproc=no
  fi
 -rm -f conftest.err conftest.$ac_ext
 +rm -f conftest.err conftest.i conftest.$ac_ext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
  $as_echo "$ac_header_preproc" >&6; }
  
-@@ -1729,17 +1739,15 @@
+ # So?  What about this header?
+ case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+   yes:no: )
+     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+ $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+@@ -1724,49 +1734,47 @@
+     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+ $as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
  $as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
  $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
 -( cat <<\_ASBOX
 -## --------------------------------------------------- ##
 +( $as_echo "## --------------------------------------------------- ##
  ## Report this to google-breakpad-dev@googlegroups.com ##
 -## --------------------------------------------------- ##
@@ -1393,145 +2371,227 @@ diff --git a/configure b/configure
  esac
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
  $as_echo_n "checking for $2... " >&6; }
 -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
 +if eval \${$3+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    eval "$3=\$ac_header_compiler"
-@@ -1748,7 +1756,7 @@
+ fi
+ eval ac_res=\$$3
  	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
  $as_echo "$ac_res" >&6; }
  fi
 -  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
 +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  
  } # ac_fn_c_check_header_mongrel
  
-@@ -1761,7 +1769,7 @@
+ # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+ # -------------------------------------------------------
+ # Tests whether HEADER exists and can be compiled using the include files in
+ # INCLUDES, setting the cache variable VAR accordingly.
+ ac_fn_c_check_header_compile ()
+ {
    as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
  $as_echo_n "checking for $2... " >&6; }
 -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then :
 +if eval \${$3+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -1779,7 +1787,7 @@
+ /* end confdefs.h.  */
+ $4
+ #include <$2>
+ _ACEOF
+ if ac_fn_c_try_compile "$LINENO"; then :
+@@ -1774,25 +1782,25 @@
+ else
+   eval "$3=no"
+ fi
+ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
  eval ac_res=\$$3
  	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
  $as_echo "$ac_res" >&6; }
 -  eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
 +  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  
  } # ac_fn_c_check_header_compile
  cat >config.log <<_ACEOF
-@@ -1787,7 +1795,7 @@
+ This file contains any messages produced by compilers while
  running configure, to aid debugging if configure makes a mistake.
  
  It was created by breakpad $as_me 0.1, which was
 -generated by GNU Autoconf 2.65.  Invocation command line was
 +generated by GNU Autoconf 2.68.  Invocation command line was
  
    $ $0 $@
  
-@@ -1897,11 +1905,9 @@
+ _ACEOF
+ exec 5>>config.log
+ {
+ cat <<_ASUNAME
+ ## --------- ##
+@@ -1892,21 +1900,19 @@
+ # would cause problems or look ugly.
+ # WARNING: Use '\'' to represent an apostrophe within the trap.
+ # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+ trap 'exit_status=$?
+   # Save into config.log some information that might help in debugging.
    {
      echo
  
 -    cat <<\_ASBOX
 -## ---------------- ##
 +    $as_echo "## ---------------- ##
  ## Cache variables. ##
 -## ---------------- ##
 -_ASBOX
 +## ---------------- ##"
      echo
      # The following way of writing the cache mishandles newlines in values,
  (
-@@ -1935,11 +1941,9 @@
+   for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+     eval ac_val=\$$ac_var
+     case $ac_val in #(
+     *${as_nl}*)
+       case $ac_var in #(
+@@ -1930,56 +1936,50 @@
+     *)
+       sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+       ;;
+     esac |
+     sort
  )
      echo
  
 -    cat <<\_ASBOX
 -## ----------------- ##
 +    $as_echo "## ----------------- ##
  ## Output variables. ##
 -## ----------------- ##
 -_ASBOX
 +## ----------------- ##"
      echo
      for ac_var in $ac_subst_vars
      do
-@@ -1952,11 +1956,9 @@
+       eval ac_val=\$$ac_var
+       case $ac_val in
+       *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+       esac
+       $as_echo "$ac_var='\''$ac_val'\''"
+     done | sort
      echo
  
      if test -n "$ac_subst_files"; then
 -      cat <<\_ASBOX
 -## ------------------- ##
 +      $as_echo "## ------------------- ##
  ## File substitutions. ##
 -## ------------------- ##
 -_ASBOX
 +## ------------------- ##"
        echo
        for ac_var in $ac_subst_files
        do
-@@ -1970,11 +1972,9 @@
+ 	eval ac_val=\$$ac_var
+ 	case $ac_val in
+ 	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ 	esac
+ 	$as_echo "$ac_var='\''$ac_val'\''"
+       done | sort
+       echo
      fi
  
      if test -s confdefs.h; then
 -      cat <<\_ASBOX
 -## ----------- ##
 +      $as_echo "## ----------- ##
  ## confdefs.h. ##
 -## ----------- ##
 -_ASBOX
 +## ----------- ##"
        echo
        cat confdefs.h
        echo
-@@ -2029,7 +2029,12 @@
+     fi
+     test "$ac_signal" != 0 &&
+       $as_echo "$as_me: caught signal $ac_signal"
+     $as_echo "$as_me: exit $exit_status"
+   } >&5
+@@ -2024,32 +2024,41 @@
+ _ACEOF
+ 
+ 
+ # Let the site file select an alternate cache file if it wants to.
+ # Prefer an explicitly selected file to automatically selected ones.
  ac_site_file1=NONE
  ac_site_file2=NONE
  if test -n "$CONFIG_SITE"; then
 -  ac_site_file1=$CONFIG_SITE
 +  # We do not want a PATH search for config.site.
 +  case $CONFIG_SITE in #((
 +    -*)  ac_site_file1=./$CONFIG_SITE;;
 +    */*) ac_site_file1=$CONFIG_SITE;;
 +    *)   ac_site_file1=./$CONFIG_SITE;;
 +  esac
  elif test "x$prefix" != xNONE; then
    ac_site_file1=$prefix/share/config.site
    ac_site_file2=$prefix/etc/config.site
-@@ -2044,7 +2049,11 @@
+ else
+   ac_site_file1=$ac_default_prefix/share/config.site
+   ac_site_file2=$ac_default_prefix/etc/config.site
+ fi
+ for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+ do
+   test "x$ac_site_file" = xNONE && continue
+   if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
  $as_echo "$as_me: loading site script $ac_site_file" >&6;}
      sed 's/^/| /' "$ac_site_file" >&5
 -    . "$ac_site_file"
 +    . "$ac_site_file" \
 +      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 +as_fn_error $? "failed to load site script $ac_site_file
 +See \`config.log' for more details" "$LINENO" 5; }
    fi
  done
  
-@@ -2120,7 +2129,7 @@
+ if test -r "$cache_file"; then
+   # Some versions of bash will fail to source /dev/null (special files
+   # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+   if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+     { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+@@ -2115,77 +2124,83 @@
+     esac
+   fi
+ done
+ if $ac_cache_corrupted; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
  $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
 -  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
 +  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
  fi
  ## -------------------- ##
  ## Main body of script. ##
-@@ -2136,16 +2145,22 @@
+ ## -------------------- ##
+ 
+ ac_ext=c
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ 
+ 
  
  ac_aux_dir=
  for ac_dir in autotools "$srcdir"/autotools; do
 -  for ac_t in install-sh install.sh shtool; do
 -    if test -f "$ac_dir/$ac_t"; then
 -      ac_aux_dir=$ac_dir
 -      ac_install_sh="$ac_aux_dir/$ac_t -c"
 -      break 2
@@ -1552,17 +2612,24 @@ diff --git a/configure b/configure
 +  fi
  done
  if test -z "$ac_aux_dir"; then
 -  as_fn_error "cannot find install-sh, install.sh, or shtool in autotools \"$srcdir\"/autotools" "$LINENO" 5
 +  as_fn_error $? "cannot find install-sh, install.sh, or shtool in autotools \"$srcdir\"/autotools" "$LINENO" 5
  fi
  
  # These three variables are undocumented and unsupported,
-@@ -2160,27 +2175,27 @@
+ # and are intended to be withdrawn in a future Autoconf release.
+ # They can cause serious problems if a builder's source tree is in a directory
+ # whose full name contains unusual characters.
+ ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+ 
+ 
  
  # Make sure we can run config.sub.
  $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
 -  as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
 +  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
  $as_echo_n "checking build system type... " >&6; }
@@ -1585,544 +2652,1030 @@ diff --git a/configure b/configure
  $as_echo "$ac_cv_build" >&6; }
  case $ac_cv_build in
  *-*-*) ;;
 -*) as_fn_error "invalid value of canonical build" "$LINENO" 5;;
 +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
  esac
  build=$ac_cv_build
  ac_save_IFS=$IFS; IFS='-'
-@@ -2198,14 +2213,14 @@
+ set x $ac_cv_build
+ shift
+ build_cpu=$1
+ build_vendor=$2
+ shift; shift
+@@ -2193,32 +2208,32 @@
+ # except with old shells:
+ build_os=$*
+ IFS=$ac_save_IFS
+ case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+ 
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
  $as_echo_n "checking host system type... " >&6; }
 -if test "${ac_cv_host+set}" = set; then :
 +if ${ac_cv_host+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test "x$host_alias" = x; then
    ac_cv_host=$ac_cv_build
  else
    ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
 -    as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
 +    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
  fi
  
  fi
-@@ -2213,7 +2228,7 @@
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
  $as_echo "$ac_cv_host" >&6; }
  case $ac_cv_host in
  *-*-*) ;;
 -*) as_fn_error "invalid value of canonical host" "$LINENO" 5;;
 +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
  esac
  host=$ac_cv_host
  ac_save_IFS=$IFS; IFS='-'
-@@ -2249,7 +2264,7 @@
+ set x $ac_cv_host
+ shift
+ host_cpu=$1
+ host_vendor=$2
+ shift; shift
+@@ -2244,17 +2259,17 @@
+ # AFS /usr/afsws/bin/install, which mishandles nonexistent args
+ # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+ # OS/2's system install, which has a completely different semantic
+ # ./install, which can be erroneously created by make from ./install.sh.
+ # Reject install programs that cannot install multiple files.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
  $as_echo_n "checking for a BSD-compatible install... " >&6; }
  if test -z "$INSTALL"; then
 -if test "${ac_cv_path_install+set}" = set; then :
 +if ${ac_cv_path_install+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-@@ -2336,11 +2351,11 @@
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   test -z "$as_dir" && as_dir=.
+     # Account for people who put trailing slashes in PATH elements.
+@@ -2331,21 +2346,21 @@
+ sleep 1
+ echo timestamp > conftest.file
+ # Reject unsafe characters in $srcdir or the absolute working directory
+ # name.  Accept space and tab only in the latter.
+ am_lf='
  '
  case `pwd` in
    *[\\\"\#\$\&\'\`$am_lf]*)
 -    as_fn_error "unsafe absolute working directory name" "$LINENO" 5;;
 +    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
  esac
  case $srcdir in
    *[\\\"\#\$\&\'\`$am_lf\ \	]*)
 -    as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
 +    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
  esac
  
  # Do `set' in a subshell so we don't clobber the current shell's
-@@ -2362,7 +2377,7 @@
+ # arguments.  Must try -L first in case configure is actually a
+ # symlink; some systems play weird games with the mod time of symlinks
+ # (eg FreeBSD returns the mod time of the symlink's containing
+ # directory).
+ if (
+@@ -2357,27 +2372,27 @@
+    rm -f conftest.file
+    if test "$*" != "X $srcdir/configure conftest.file" \
+       && test "$*" != "X conftest.file $srcdir/configure"; then
+ 
+       # If neither matched, then we have a broken ls.  This can happen
        # if, for instance, CONFIG_SHELL is bash and it inherits a
        # broken ls alias from the environment.  This has actually
        # happened.  Such a system could not be considered "sane".
 -      as_fn_error "ls -t appears to fail.  Make sure there is not a broken
 +      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
  alias in your environment" "$LINENO" 5
     fi
  
-@@ -2372,7 +2387,7 @@
+    test "$2" = conftest.file
+    )
+ then
     # Ok.
     :
  else
 -   as_fn_error "newly created file is older than distributed files!
 +   as_fn_error $? "newly created file is older than distributed files!
  Check your system clock" "$LINENO" 5
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-@@ -2426,7 +2441,7 @@
+ $as_echo "yes" >&6; }
+ test "$program_prefix" != NONE &&
+   program_transform_name="s&^&$program_prefix&;$program_transform_name"
+ # Use a double $ so make ignores it.
+ test "$program_suffix" != NONE &&
+@@ -2421,17 +2436,17 @@
+ # tool to use in cross-compilation environments, therefore Automake
+ # will honor the `STRIP' environment variable to overrule this program.
+ if test "$cross_compiling" != no; then
+   if test -n "$ac_tool_prefix"; then
+   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
  set dummy ${ac_tool_prefix}strip; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_STRIP+set}" = set; then :
 +if ${ac_cv_prog_STRIP+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$STRIP"; then
-@@ -2466,7 +2481,7 @@
+   ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -2461,17 +2476,17 @@
+ 
+ fi
+ if test -z "$ac_cv_prog_STRIP"; then
+   ac_ct_STRIP=$STRIP
+   # Extract the first word of "strip", so it can be a program name with args.
  set dummy strip; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
 +if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$ac_ct_STRIP"; then
-@@ -2519,7 +2534,7 @@
+   ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -2514,17 +2529,17 @@
+ fi
+ 
+ fi
+ INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+ 
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
  $as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
  if test -z "$MKDIR_P"; then
 -  if test "${ac_cv_path_mkdir+set}" = set; then :
 +  if ${ac_cv_path_mkdir+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-@@ -2570,7 +2585,7 @@
+ for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+ do
+   IFS=$as_save_IFS
+   test -z "$as_dir" && as_dir=.
+     for ac_prog in mkdir gmkdir; do
+@@ -2565,17 +2580,17 @@
+ esac
+ 
+ for ac_prog in gawk mawk nawk awk
+ do
+   # Extract the first word of "$ac_prog", so it can be a program name with args.
  set dummy $ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_AWK+set}" = set; then :
 +if ${ac_cv_prog_AWK+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$AWK"; then
-@@ -2610,7 +2625,7 @@
+   ac_cv_prog_AWK="$AWK" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -2605,25 +2620,25 @@
+ 
+   test -n "$AWK" && break
+ done
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
  $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
  set x ${MAKE-make}
  ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
 -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then :
 +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat >conftest.make <<\_ACEOF
-@@ -2618,7 +2633,7 @@
+ SHELL = /bin/sh
  all:
  	@echo '@@@%%%=$(MAKE)=@@@%%%'
  _ACEOF
 -# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
 +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
  case `${MAKE-make} -f conftest.make 2>/dev/null` in
    *@@@%%%=?*=@@@%%%*)
      eval ac_cv_prog_make_${ac_make}_set=yes;;
-@@ -2652,7 +2667,7 @@
+   *)
+     eval ac_cv_prog_make_${ac_make}_set=no;;
+ esac
+ rm -f conftest.make
+ fi
+@@ -2647,17 +2662,17 @@
+ rmdir .tst 2>/dev/null
+ 
+ if test "`cd $srcdir && pwd`" != "`pwd`"; then
+   # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+   # is not polluted with repeated "-I."
    am__isrc=' -I$(srcdir)'
    # test to see if srcdir already configured
    if test -f $srcdir/config.status; then
 -    as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
 +    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
    fi
  fi
  
-@@ -2698,9 +2713,9 @@
+ # test whether we have cygpath
+ if test -z "$CYGPATH_W"; then
+   if (cygpath --version) >/dev/null 2>/dev/null; then
+     CYGPATH_W='cygpath -w'
+   else
+@@ -2693,19 +2708,19 @@
+ 
+ AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+ 
+ 
+ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
  
  # We need awk for the "check" target.  The system "awk" is bad on
  # some platforms.
 -# Always define AMTAR for backward compatibility.
 -
 -AMTAR=${AMTAR-"${am_missing_run}tar"}
 +# Always define AMTAR for backward compatibility.  Yes, it's still used
 +# in the wild :-(  We should find a proper way to deprecate it ...
 +AMTAR='$${TAR-tar}'
  
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5
-@@ -2776,7 +2791,7 @@
+ $as_echo_n "checking how to create a ustar tar archive... " >&6; }
+ # Loop over all known methods to create a tar archive until one works.
+ _am_tools='gnutar plaintar pax cpio none'
+ _am_tools=${am_cv_prog_tar_ustar-$_am_tools}
+ # Do not fold the above two line into one, because Tru64 sh and
+@@ -2771,17 +2786,17 @@
+    ac_status=$?
+    echo "$as_me:$LINENO: \$? = $ac_status" >&5
+    (exit $ac_status); }
+     grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+   fi
  done
  rm -rf conftest.dir
  
 -if test "${am_cv_prog_tar_ustar+set}" = set; then :
 +if ${am_cv_prog_tar_ustar+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    am_cv_prog_tar_ustar=$_am_tool
-@@ -2844,6 +2859,7 @@
+ fi
+ 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5
+ $as_echo "$am_cv_prog_tar_ustar" >&6; }
+ 
+@@ -2839,16 +2854,17 @@
+ # Check whether --enable-dependency-tracking was given.
+ if test "${enable_dependency_tracking+set}" = set; then :
+   enableval=$enable_dependency_tracking;
+ fi
+ 
  if test "x$enable_dependency_tracking" != xno; then
    am_depcomp="$ac_aux_dir/depcomp"
    AMDEPBACKSLASH='\'
 +  am__nodep='_no'
  fi
   if test "x$enable_dependency_tracking" != xno; then
    AMDEP_TRUE=
-@@ -2864,7 +2880,7 @@
+   AMDEP_FALSE='#'
+ else
+   AMDEP_TRUE='#'
+   AMDEP_FALSE=
+ fi
+@@ -2859,17 +2875,17 @@
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ if test -n "$ac_tool_prefix"; then
+   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
  set dummy ${ac_tool_prefix}gcc; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CC+set}" = set; then :
 +if ${ac_cv_prog_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CC"; then
-@@ -2904,7 +2920,7 @@
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -2899,17 +2915,17 @@
+ 
+ fi
+ if test -z "$ac_cv_prog_CC"; then
+   ac_ct_CC=$CC
+   # Extract the first word of "gcc", so it can be a program name with args.
  set dummy gcc; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
 +if ${ac_cv_prog_ac_ct_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$ac_ct_CC"; then
-@@ -2957,7 +2973,7 @@
+   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -2952,17 +2968,17 @@
+ fi
+ 
+ if test -z "$CC"; then
+           if test -n "$ac_tool_prefix"; then
+     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
  set dummy ${ac_tool_prefix}cc; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CC+set}" = set; then :
 +if ${ac_cv_prog_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CC"; then
-@@ -2997,7 +3013,7 @@
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -2992,17 +3008,17 @@
+ 
+   fi
+ fi
+ if test -z "$CC"; then
+   # Extract the first word of "cc", so it can be a program name with args.
  set dummy cc; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CC+set}" = set; then :
 +if ${ac_cv_prog_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CC"; then
-@@ -3056,7 +3072,7 @@
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+   ac_prog_rejected=no
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+@@ -3051,17 +3067,17 @@
+ if test -z "$CC"; then
+   if test -n "$ac_tool_prefix"; then
+   for ac_prog in cl.exe
+   do
+     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
  set dummy $ac_tool_prefix$ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CC+set}" = set; then :
 +if ${ac_cv_prog_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CC"; then
-@@ -3100,7 +3116,7 @@
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -3095,17 +3111,17 @@
+ if test -z "$CC"; then
+   ac_ct_CC=$CC
+   for ac_prog in cl.exe
+ do
+   # Extract the first word of "$ac_prog", so it can be a program name with args.
  set dummy $ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
 +if ${ac_cv_prog_ac_ct_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$ac_ct_CC"; then
-@@ -3154,8 +3170,8 @@
+   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -3149,18 +3165,18 @@
+   fi
+ fi
+ 
+ fi
+ 
  
  test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error "no acceptable C compiler found in \$PATH
 -See \`config.log' for more details." "$LINENO" 5; }
 +as_fn_error $? "no acceptable C compiler found in \$PATH
 +See \`config.log' for more details" "$LINENO" 5; }
  
  # Provide some information about the compiler.
  $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-@@ -3269,9 +3285,8 @@
+ set X $ac_compile
+ ac_compiler=$2
+ for ac_option in --version -v -V -qversion; do
+   { { ac_try="$ac_compiler $ac_option >&5"
+ case "(($ac_try" in
+@@ -3264,19 +3280,18 @@
+ if test -z "$ac_file"; then :
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+ $as_echo "no" >&6; }
+ $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
  
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -{ as_fn_set_status 77
 -as_fn_error "C compiler cannot create executables
 -See \`config.log' for more details." "$LINENO" 5; }; }
 +as_fn_error 77 "C compiler cannot create executables
 +See \`config.log' for more details" "$LINENO" 5; }
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
  $as_echo "yes" >&6; }
-@@ -3313,8 +3328,8 @@
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+ $as_echo_n "checking for C compiler default output file name... " >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+ $as_echo "$ac_file" >&6; }
+@@ -3308,18 +3323,18 @@
+     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ 	  break;;
+     * ) break;;
+   esac
+ done
  else
    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error "cannot compute suffix of executables: cannot compile and link
 -See \`config.log' for more details." "$LINENO" 5; }
 +as_fn_error $? "cannot compute suffix of executables: cannot compile and link
 +See \`config.log' for more details" "$LINENO" 5; }
  fi
  rm -f conftest conftest$ac_cv_exeext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-@@ -3371,9 +3386,9 @@
+ $as_echo "$ac_cv_exeext" >&6; }
+ 
+ rm -f conftest.$ac_ext
+ EXEEXT=$ac_cv_exeext
+ ac_exeext=$EXEEXT
+@@ -3366,30 +3381,30 @@
+   test $ac_status = 0; }; }; then
+     cross_compiling=no
+   else
+     if test "$cross_compiling" = maybe; then
+ 	cross_compiling=yes
      else
  	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error "cannot run C compiled programs.
 +as_fn_error $? "cannot run C compiled programs.
  If you meant to cross compile, use \`--host'.
 -See \`config.log' for more details." "$LINENO" 5; }
 +See \`config.log' for more details" "$LINENO" 5; }
      fi
    fi
  fi
-@@ -3384,7 +3399,7 @@
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+ $as_echo "$cross_compiling" >&6; }
+ 
+ rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
  ac_clean_files=$ac_clean_files_save
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
  $as_echo_n "checking for suffix of object files... " >&6; }
 -if test "${ac_cv_objext+set}" = set; then :
 +if ${ac_cv_objext+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -3424,8 +3439,8 @@
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+@@ -3419,28 +3434,28 @@
+   esac
+ done
+ else
+   $as_echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
  
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error "cannot compute suffix of object files: cannot compile
 -See \`config.log' for more details." "$LINENO" 5; }
 +as_fn_error $? "cannot compute suffix of object files: cannot compile
 +See \`config.log' for more details" "$LINENO" 5; }
  fi
  rm -f conftest.$ac_cv_objext conftest.$ac_ext
  fi
-@@ -3435,7 +3450,7 @@
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+ $as_echo "$ac_cv_objext" >&6; }
+ OBJEXT=$ac_cv_objext
  ac_objext=$OBJEXT
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
  $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
 -if test "${ac_cv_c_compiler_gnu+set}" = set; then :
 +if ${ac_cv_c_compiler_gnu+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -3472,7 +3487,7 @@
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+@@ -3467,17 +3482,17 @@
+   GCC=yes
+ else
+   GCC=
+ fi
+ ac_test_CFLAGS=${CFLAGS+set}
  ac_save_CFLAGS=$CFLAGS
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
  $as_echo_n "checking whether $CC accepts -g... " >&6; }
 -if test "${ac_cv_prog_cc_g+set}" = set; then :
 +if ${ac_cv_prog_cc_g+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    ac_save_c_werror_flag=$ac_c_werror_flag
-@@ -3550,7 +3565,7 @@
+    ac_c_werror_flag=yes
+    ac_cv_prog_cc_g=no
+    CFLAGS="-g"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+@@ -3545,17 +3560,17 @@
+   if test "$GCC" = yes; then
+     CFLAGS="-O2"
+   else
+     CFLAGS=
+   fi
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
  $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
 -if test "${ac_cv_prog_cc_c89+set}" = set; then :
 +if ${ac_cv_prog_cc_c89+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    ac_cv_prog_cc_c89=no
-@@ -3649,7 +3664,7 @@
+ ac_save_CC=$CC
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ #include <stdarg.h>
+ #include <stdio.h>
+@@ -3644,25 +3659,26 @@
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ 
+ depcc="$CC"   am_compiler_list=
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
  $as_echo_n "checking dependency style of $depcc... " >&6; }
 -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
 +if ${am_cv_CC_dependencies_compiler_type+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-@@ -3658,6 +3673,7 @@
+   # We make a subdir and do the tests there.  Otherwise we can end up
+   # making bogus files that we don't know about and never remove.  For
    # instance it was reported that on HP-UX the gcc test will end up
    # making a dummy file named `D' -- because `-MD' means `put the output
    # in D'.
 +  rm -rf conftest.dir
    mkdir conftest.dir
    # Copy depcomp to subdir because otherwise we won't find it if we're
    # using a relative directory.
-@@ -3717,7 +3733,7 @@
+   cp "$am_depcomp" conftest.dir
+   cd conftest.dir
+   # We will build objects and dependencies in a subdirectory because
+   # it helps to detect inapplicable dependency modes.  For instance
+   # both Tru64's cc and ICC support -MD to output dependencies as a
+@@ -3712,17 +3728,17 @@
+       # after this tag, mechanisms are not by side-effect, so they'll
+       # only be used when explicitly requested
+       if test "x$enable_dependency_tracking" = xyes; then
+ 	continue
+       else
  	break
        fi
        ;;
 -    msvisualcpp | msvcmsys)
 +    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
        # This compiler won't grok `-c -o', but also, the minuso test has
        # not run yet.  These depmodes are late enough in the game, and
        # so weak that their functioning should not be impacted.
-@@ -3783,7 +3799,7 @@
+       am__obj=conftest.${OBJEXT-o}
+       am__minus_obj=
+       ;;
+     none) break ;;
+     esac
+@@ -3778,25 +3794,26 @@
+ test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS
+ 
+ 
+ 
+ depcc="$CCAS"   am_compiler_list=
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
  $as_echo_n "checking dependency style of $depcc... " >&6; }
 -if test "${am_cv_CCAS_dependencies_compiler_type+set}" = set; then :
 +if ${am_cv_CCAS_dependencies_compiler_type+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-@@ -3792,6 +3808,7 @@
+   # We make a subdir and do the tests there.  Otherwise we can end up
+   # making bogus files that we don't know about and never remove.  For
    # instance it was reported that on HP-UX the gcc test will end up
    # making a dummy file named `D' -- because `-MD' means `put the output
    # in D'.
 +  rm -rf conftest.dir
    mkdir conftest.dir
    # Copy depcomp to subdir because otherwise we won't find it if we're
    # using a relative directory.
-@@ -3849,7 +3866,7 @@
+   cp "$am_depcomp" conftest.dir
+   cd conftest.dir
+   # We will build objects and dependencies in a subdirectory because
+   # it helps to detect inapplicable dependency modes.  For instance
+   # both Tru64's cc and ICC support -MD to output dependencies as a
+@@ -3844,17 +3861,17 @@
+       # after this tag, mechanisms are not by side-effect, so they'll
+       # only be used when explicitly requested
+       if test "x$enable_dependency_tracking" = xyes; then
+ 	continue
+       else
  	break
        fi
        ;;
 -    msvisualcpp | msvcmsys)
 +    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
        # This compiler won't grok `-c -o', but also, the minuso test has
        # not run yet.  These depmodes are late enough in the game, and
        # so weak that their functioning should not be impacted.
-@@ -3914,7 +3931,7 @@
+       am__obj=conftest.${OBJEXT-o}
+       am__minus_obj=
+       ;;
+     none) break ;;
+     esac
+@@ -3909,17 +3926,17 @@
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ if test -n "$ac_tool_prefix"; then
+   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
  set dummy ${ac_tool_prefix}gcc; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CC+set}" = set; then :
 +if ${ac_cv_prog_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CC"; then
-@@ -3954,7 +3971,7 @@
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -3949,17 +3966,17 @@
+ 
+ fi
+ if test -z "$ac_cv_prog_CC"; then
+   ac_ct_CC=$CC
+   # Extract the first word of "gcc", so it can be a program name with args.
  set dummy gcc; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
 +if ${ac_cv_prog_ac_ct_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$ac_ct_CC"; then
-@@ -4007,7 +4024,7 @@
+   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -4002,17 +4019,17 @@
+ fi
+ 
+ if test -z "$CC"; then
+           if test -n "$ac_tool_prefix"; then
+     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
  set dummy ${ac_tool_prefix}cc; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CC+set}" = set; then :
 +if ${ac_cv_prog_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CC"; then
-@@ -4047,7 +4064,7 @@
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -4042,17 +4059,17 @@
+ 
+   fi
+ fi
+ if test -z "$CC"; then
+   # Extract the first word of "cc", so it can be a program name with args.
  set dummy cc; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CC+set}" = set; then :
 +if ${ac_cv_prog_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CC"; then
-@@ -4106,7 +4123,7 @@
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+   ac_prog_rejected=no
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+@@ -4101,17 +4118,17 @@
+ if test -z "$CC"; then
+   if test -n "$ac_tool_prefix"; then
+   for ac_prog in cl.exe
+   do
+     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
  set dummy $ac_tool_prefix$ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CC+set}" = set; then :
 +if ${ac_cv_prog_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CC"; then
-@@ -4150,7 +4167,7 @@
+   ac_cv_prog_CC="$CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -4145,17 +4162,17 @@
+ if test -z "$CC"; then
+   ac_ct_CC=$CC
+   for ac_prog in cl.exe
+ do
+   # Extract the first word of "$ac_prog", so it can be a program name with args.
  set dummy $ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
 +if ${ac_cv_prog_ac_ct_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$ac_ct_CC"; then
-@@ -4204,8 +4221,8 @@
+   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -4199,18 +4216,18 @@
+   fi
+ fi
+ 
+ fi
+ 
  
  test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error "no acceptable C compiler found in \$PATH
 -See \`config.log' for more details." "$LINENO" 5; }
 +as_fn_error $? "no acceptable C compiler found in \$PATH
 +See \`config.log' for more details" "$LINENO" 5; }
  
  # Provide some information about the compiler.
  $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
-@@ -4234,7 +4251,7 @@
+ set X $ac_compile
+ ac_compiler=$2
+ for ac_option in --version -v -V -qversion; do
+   { { ac_try="$ac_compiler $ac_option >&5"
+ case "(($ac_try" in
+@@ -4229,17 +4246,17 @@
+   fi
+   rm -f conftest.er1 conftest.err
+   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+   test $ac_status = 0; }
+ done
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
  $as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
 -if test "${ac_cv_c_compiler_gnu+set}" = set; then :
 +if ${ac_cv_c_compiler_gnu+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -4271,7 +4288,7 @@
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+@@ -4266,17 +4283,17 @@
+   GCC=yes
+ else
+   GCC=
+ fi
+ ac_test_CFLAGS=${CFLAGS+set}
  ac_save_CFLAGS=$CFLAGS
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
  $as_echo_n "checking whether $CC accepts -g... " >&6; }
 -if test "${ac_cv_prog_cc_g+set}" = set; then :
 +if ${ac_cv_prog_cc_g+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    ac_save_c_werror_flag=$ac_c_werror_flag
-@@ -4349,7 +4366,7 @@
+    ac_c_werror_flag=yes
+    ac_cv_prog_cc_g=no
+    CFLAGS="-g"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+@@ -4344,17 +4361,17 @@
+   if test "$GCC" = yes; then
+     CFLAGS="-O2"
+   else
+     CFLAGS=
+   fi
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
  $as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
 -if test "${ac_cv_prog_cc_c89+set}" = set; then :
 +if ${ac_cv_prog_cc_c89+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    ac_cv_prog_cc_c89=no
-@@ -4448,7 +4465,7 @@
+ ac_save_CC=$CC
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ #include <stdarg.h>
+ #include <stdio.h>
+@@ -4443,25 +4460,26 @@
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ 
+ depcc="$CC"   am_compiler_list=
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
  $as_echo_n "checking dependency style of $depcc... " >&6; }
 -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then :
 +if ${am_cv_CC_dependencies_compiler_type+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-@@ -4457,6 +4474,7 @@
+   # We make a subdir and do the tests there.  Otherwise we can end up
+   # making bogus files that we don't know about and never remove.  For
    # instance it was reported that on HP-UX the gcc test will end up
    # making a dummy file named `D' -- because `-MD' means `put the output
    # in D'.
 +  rm -rf conftest.dir
    mkdir conftest.dir
    # Copy depcomp to subdir because otherwise we won't find it if we're
    # using a relative directory.
-@@ -4516,7 +4534,7 @@
+   cp "$am_depcomp" conftest.dir
+   cd conftest.dir
+   # We will build objects and dependencies in a subdirectory because
+   # it helps to detect inapplicable dependency modes.  For instance
+   # both Tru64's cc and ICC support -MD to output dependencies as a
+@@ -4511,17 +4529,17 @@
+       # after this tag, mechanisms are not by side-effect, so they'll
+       # only be used when explicitly requested
+       if test "x$enable_dependency_tracking" = xyes; then
+ 	continue
+       else
  	break
        fi
        ;;
 -    msvisualcpp | msvcmsys)
 +    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
        # This compiler won't grok `-c -o', but also, the minuso test has
        # not run yet.  These depmodes are late enough in the game, and
        # so weak that their functioning should not be impacted.
-@@ -4580,7 +4598,7 @@
+       am__obj=conftest.${OBJEXT-o}
+       am__minus_obj=
+       ;;
+     none) break ;;
+     esac
+@@ -4575,17 +4593,17 @@
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
+ $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
+ else
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
+ $as_echo_n "checking whether cc understands -c and -o together... " >&6; }
  fi
  set dummy $CC; ac_cc=`$as_echo "$2" |
  		      sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
 -if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then :
 +if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -4709,7 +4727,7 @@
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+@@ -4704,17 +4722,17 @@
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+ $as_echo_n "checking how to run the C preprocessor... " >&6; }
+ # On Suns, sometimes $CPP names a directory.
+ if test -n "$CPP" && test -d "$CPP"; then
    CPP=
  fi
  if test -z "$CPP"; then
 -  if test "${ac_cv_prog_CPP+set}" = set; then :
 +  if ${ac_cv_prog_CPP+:} false; then :
    $as_echo_n "(cached) " >&6
  else
        # Double quotes because CPP needs to be expanded
-@@ -4739,7 +4757,7 @@
+     for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+     do
+       ac_preproc_ok=false
+ for ac_c_preproc_warn_flag in '' yes
+ do
+@@ -4734,37 +4752,37 @@
+ 		     Syntax error
+ _ACEOF
+ if ac_fn_c_try_cpp "$LINENO"; then :
+ 
+ else
    # Broken: fails on valid input.
  continue
  fi
 -rm -f conftest.err conftest.$ac_ext
 +rm -f conftest.err conftest.i conftest.$ac_ext
  
    # OK, works on sane cases.  Now check whether nonexistent headers
    # can be detected and how.
-@@ -4755,11 +4773,11 @@
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ #include <ac_nonexistent.h>
+ _ACEOF
+ if ac_fn_c_try_cpp "$LINENO"; then :
+   # Broken: success on invalid input.
+ continue
+ else
+   # Passes both tests.
  ac_preproc_ok=:
  break
  fi
 -rm -f conftest.err conftest.$ac_ext
 +rm -f conftest.err conftest.i conftest.$ac_ext
  
  done
  # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
 -rm -f conftest.err conftest.$ac_ext
 +rm -f conftest.i conftest.err conftest.$ac_ext
  if $ac_preproc_ok; then :
    break
  fi
-@@ -4798,7 +4816,7 @@
+ 
+     done
+     ac_cv_prog_CPP=$CPP
+ 
+ fi
+@@ -4793,44 +4811,44 @@
+ 		     Syntax error
+ _ACEOF
+ if ac_fn_c_try_cpp "$LINENO"; then :
+ 
+ else
    # Broken: fails on valid input.
  continue
  fi
 -rm -f conftest.err conftest.$ac_ext
 +rm -f conftest.err conftest.i conftest.$ac_ext
  
    # OK, works on sane cases.  Now check whether nonexistent headers
    # can be detected and how.
-@@ -4814,18 +4832,18 @@
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+ #include <ac_nonexistent.h>
+ _ACEOF
+ if ac_fn_c_try_cpp "$LINENO"; then :
+   # Broken: success on invalid input.
+ continue
+ else
+   # Passes both tests.
  ac_preproc_ok=:
  break
  fi
 -rm -f conftest.err conftest.$ac_ext
 +rm -f conftest.err conftest.i conftest.$ac_ext
  
  done
  # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
@@ -2135,224 +3688,437 @@ diff --git a/configure b/configure
  $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
 -as_fn_error "C preprocessor \"$CPP\" fails sanity check
 -See \`config.log' for more details." "$LINENO" 5; }
 +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
 +See \`config.log' for more details" "$LINENO" 5; }
  fi
  
  ac_ext=c
-@@ -4850,7 +4868,7 @@
+ ac_cpp='$CPP $CPPFLAGS'
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ 
+@@ -4845,17 +4863,17 @@
+   else
+     if test -n "$ac_tool_prefix"; then
+   for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+   do
+     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
  set dummy $ac_tool_prefix$ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_CXX+set}" = set; then :
 +if ${ac_cv_prog_CXX+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$CXX"; then
-@@ -4894,7 +4912,7 @@
+   ac_cv_prog_CXX="$CXX" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -4889,17 +4907,17 @@
+ if test -z "$CXX"; then
+   ac_ct_CXX=$CXX
+   for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ do
+   # Extract the first word of "$ac_prog", so it can be a program name with args.
  set dummy $ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then :
 +if ${ac_cv_prog_ac_ct_CXX+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$ac_ct_CXX"; then
-@@ -4972,7 +4990,7 @@
+   ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -4967,17 +4985,17 @@
+   fi
+   rm -f conftest.er1 conftest.err
+   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+   test $ac_status = 0; }
+ done
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
  $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
 -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then :
 +if ${ac_cv_cxx_compiler_gnu+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -5009,7 +5027,7 @@
+ /* end confdefs.h.  */
+ 
+ int
+ main ()
+ {
+@@ -5004,17 +5022,17 @@
+   GXX=yes
+ else
+   GXX=
+ fi
+ ac_test_CXXFLAGS=${CXXFLAGS+set}
  ac_save_CXXFLAGS=$CXXFLAGS
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
  $as_echo_n "checking whether $CXX accepts -g... " >&6; }
 -if test "${ac_cv_prog_cxx_g+set}" = set; then :
 +if ${ac_cv_prog_cxx_g+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-@@ -5095,7 +5113,7 @@
+    ac_cxx_werror_flag=yes
+    ac_cv_prog_cxx_g=no
+    CXXFLAGS="-g"
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h.  */
+@@ -5090,25 +5108,26 @@
+ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+ 
+ depcc="$CXX"  am_compiler_list=
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
  $as_echo_n "checking dependency style of $depcc... " >&6; }
 -if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then :
 +if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-@@ -5104,6 +5122,7 @@
+   # We make a subdir and do the tests there.  Otherwise we can end up
+   # making bogus files that we don't know about and never remove.  For
    # instance it was reported that on HP-UX the gcc test will end up
    # making a dummy file named `D' -- because `-MD' means `put the output
    # in D'.
 +  rm -rf conftest.dir
    mkdir conftest.dir
    # Copy depcomp to subdir because otherwise we won't find it if we're
    # using a relative directory.
-@@ -5163,7 +5182,7 @@
+   cp "$am_depcomp" conftest.dir
+   cd conftest.dir
+   # We will build objects and dependencies in a subdirectory because
+   # it helps to detect inapplicable dependency modes.  For instance
+   # both Tru64's cc and ICC support -MD to output dependencies as a
+@@ -5158,17 +5177,17 @@
+       # after this tag, mechanisms are not by side-effect, so they'll
+       # only be used when explicitly requested
+       if test "x$enable_dependency_tracking" = xyes; then
+ 	continue
+       else
  	break
        fi
        ;;
 -    msvisualcpp | msvcmsys)
 +    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
        # This compiler won't grok `-c -o', but also, the minuso test has
        # not run yet.  These depmodes are late enough in the game, and
        # so weak that their functioning should not be impacted.
-@@ -5223,7 +5242,7 @@
+       am__obj=conftest.${OBJEXT-o}
+       am__minus_obj=
+       ;;
+     none) break ;;
+     esac
+@@ -5218,17 +5237,17 @@
+ fi
+ 
+ 
+ if test -n "$ac_tool_prefix"; then
+   # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
  set dummy ${ac_tool_prefix}ranlib; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_RANLIB+set}" = set; then :
 +if ${ac_cv_prog_RANLIB+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$RANLIB"; then
-@@ -5263,7 +5282,7 @@
+   ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -5258,17 +5277,17 @@
+ 
+ fi
+ if test -z "$ac_cv_prog_RANLIB"; then
+   ac_ct_RANLIB=$RANLIB
+   # Extract the first word of "ranlib", so it can be a program name with args.
  set dummy ranlib; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then :
 +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$ac_ct_RANLIB"; then
-@@ -5323,7 +5342,7 @@
+   ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -5318,17 +5337,17 @@
+   GCC_FALSE=
+ fi
+    # let the Makefile know if we're gcc
+ 
+ 
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
  $as_echo_n "checking for grep that handles long lines and -e... " >&6; }
 -if test "${ac_cv_path_GREP+set}" = set; then :
 +if ${ac_cv_path_GREP+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -z "$GREP"; then
-@@ -5372,7 +5391,7 @@
+   ac_path_GREP_found=false
+   # Loop through the user's path and test for each of PROGNAME-LIST
+   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+ do
+@@ -5367,31 +5386,31 @@
+ esac
+ 
+       $ac_path_GREP_found && break 3
+     done
+   done
    done
  IFS=$as_save_IFS
    if test -z "$ac_cv_path_GREP"; then
 -    as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
 +    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
    fi
  else
    ac_cv_path_GREP=$GREP
-@@ -5386,7 +5405,7 @@
+ fi
+ 
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+ $as_echo "$ac_cv_path_GREP" >&6; }
+  GREP="$ac_cv_path_GREP"
+ 
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
  $as_echo_n "checking for egrep... " >&6; }
 -if test "${ac_cv_path_EGREP+set}" = set; then :
 +if ${ac_cv_path_EGREP+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-@@ -5438,7 +5457,7 @@
+    then ac_cv_path_EGREP="$GREP -E"
+    else
+      if test -z "$EGREP"; then
+   ac_path_EGREP_found=false
+   # Loop through the user's path and test for each of PROGNAME-LIST
+@@ -5433,32 +5452,32 @@
+ esac
+ 
+       $ac_path_EGREP_found && break 3
+     done
+   done
    done
  IFS=$as_save_IFS
    if test -z "$ac_cv_path_EGREP"; then
 -    as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
 +    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
    fi
  else
    ac_cv_path_EGREP=$EGREP
-@@ -5453,7 +5472,7 @@
+ fi
+ 
+    fi
+ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+ $as_echo "$ac_cv_path_EGREP" >&6; }
+  EGREP="$ac_cv_path_EGREP"
+ 
  
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
  $as_echo_n "checking for ANSI C header files... " >&6; }
 -if test "${ac_cv_header_stdc+set}" = set; then :
 +if ${ac_cv_header_stdc+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-@@ -5790,7 +5809,7 @@
+ /* end confdefs.h.  */
+ #include <stdlib.h>
+ #include <stdarg.h>
+ #include <string.h>
+ #include <float.h>
+@@ -5785,17 +5804,17 @@
+                 PTHREAD_CFLAGS="$flag"
+                 ;;
+ 
+ 		pthread-config)
+ 		# Extract the first word of "pthread-config", so it can be a program name with args.
  set dummy pthread-config; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_ax_pthread_config+set}" = set; then :
 +if ${ac_cv_prog_ax_pthread_config+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$ax_pthread_config"; then
-@@ -5951,7 +5970,7 @@
+   ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -5946,17 +5965,17 @@
+         # More AIX lossage: must compile with xlc_r or cc_r
+ 	if test x"$GCC" != xyes; then
+           for ac_prog in xlc_r cc_r
+ do
+   # Extract the first word of "$ac_prog", so it can be a program name with args.
  set dummy $ac_prog; ac_word=$2
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
  $as_echo_n "checking for $ac_word... " >&6; }
 -if test "${ac_cv_prog_PTHREAD_CC+set}" = set; then :
 +if ${ac_cv_prog_PTHREAD_CC+:} false; then :
    $as_echo_n "(cached) " >&6
  else
    if test -n "$PTHREAD_CC"; then
-@@ -6023,8 +6042,7 @@
+   ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
+ else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+ for as_dir in $PATH
+ do
+@@ -6018,31 +6037,30 @@
+ 
+ # On IRIX 5.3, sys/types and inttypes.h are conflicting.
+ for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ 		  inttypes.h stdint.h unistd.h
+ do :
    as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
  ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
  "
 -eval as_val=\$$as_ac_Header
 -   if test "x$as_val" = x""yes; then :
 +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
    cat >>confdefs.h <<_ACEOF
  #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
  _ACEOF
-@@ -6037,7 +6055,7 @@
+ 
+ fi
+ 
+ done
+ 
+ 
  for ac_header in a.out.h
  do :
    ac_fn_c_check_header_mongrel "$LINENO" "a.out.h" "ac_cv_header_a_out_h" "$ac_includes_default"
 -if test "x$ac_cv_header_a_out_h" = x""yes; then :
 +if test "x$ac_cv_header_a_out_h" = xyes; then :
    cat >>confdefs.h <<_ACEOF
  #define HAVE_A_OUT_H 1
  _ACEOF
-@@ -6089,7 +6107,7 @@
+ 
+ fi
+ 
+ done
+ 
+@@ -6084,17 +6102,17 @@
+                    CFLAGS="${CFLAGS} -m32"
+                    CXXFLAGS="${CXXFLAGS} -m32"
+                    usem32=true
+                    ;;
+                  no)
                     usem32=false
                     ;;
                   *)
 -                   as_fn_error "bad value ${enableval} for --enable-m32" "$LINENO" 5
 +                   as_fn_error $? "bad value ${enableval} for --enable-m32" "$LINENO" 5
                     ;;
                 esac
  else
-@@ -6107,7 +6125,7 @@
+   usem32=false
+ fi
+ 
+ 
+ # Check whether --enable-processor was given.
+@@ -6102,17 +6120,17 @@
+   enableval=$enable_processor; case "${enableval}" in
+                  yes)
+                    disable_processor=false
+                    ;;
+                  no)
                     disable_processor=true
                     ;;
                   *)
 -                   as_fn_error "bad value ${enableval} for --disable-processor" "$LINENO" 5
 +                   as_fn_error $? "bad value ${enableval} for --disable-processor" "$LINENO" 5
                     ;;
                 esac
  else
-@@ -6133,7 +6151,7 @@
+   disable_processor=false
+ fi
+ 
+  if test x$disable_processor = xtrue; then
+   DISABLE_PROCESSOR_TRUE=
+@@ -6128,47 +6146,47 @@
+   enableval=$enable_tools; case "${enableval}" in
+                  yes)
+                    disable_tools=false
+                    ;;
+                  no)
                     disable_tools=true
                     ;;
                   *)
 -                   as_fn_error "bad value ${enableval} for --disable-tools" "$LINENO" 5
 +                   as_fn_error $? "bad value ${enableval} for --disable-tools" "$LINENO" 5
                     ;;
                 esac
  else
-@@ -6150,7 +6168,7 @@
+   disable_tools=false
+ fi
+ 
+  if test x$disable_tools = xtrue; then
+   DISABLE_TOOLS_TRUE=
+   DISABLE_TOOLS_FALSE='#'
+ else
+   DISABLE_TOOLS_TRUE='#'
+   DISABLE_TOOLS_FALSE=
+ fi
  
  
  if test x$LINUX_HOST = xfalse -a x$disable_processor = xtrue -a x$disable_tools = xtrue; then
 -   as_fn_error "--disable-processor and --disable-tools were specified, and not building for Linux. Nothing to build!" "$LINENO" 5
 +   as_fn_error $? "--disable-processor and --disable-tools were specified, and not building for Linux. Nothing to build!" "$LINENO" 5
  fi
  
  # Check whether --enable-selftest was given.
-@@ -6163,7 +6181,7 @@
+ if test "${enable_selftest+set}" = set; then :
+   enableval=$enable_selftest; case "${enableval}" in
+                  yes)
+                    selftest=true
+                    ;;
+                  no)
                     selftest=false
                     ;;
                   *)
 -                   as_fn_error "bad value ${enableval} for --enable-selftest" "$LINENO" 5
 +                   as_fn_error $? "bad value ${enableval} for --enable-selftest" "$LINENO" 5
                     ;;
                 esac
  else
-@@ -6245,10 +6263,21 @@
+   selftest=false
+ fi
+ 
+  if test x$selftest = xtrue; then
+   SELFTEST_TRUE=
+@@ -6240,35 +6258,47 @@
+      t clear
+      :clear
+      s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+      t end
+      s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
       :end' >>confcache
  if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
    if test -w "$cache_file"; then
 -    test "x$cache_file" != "x/dev/null" &&
 +    if test "x$cache_file" != "x/dev/null"; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
  $as_echo "$as_me: updating cache $cache_file" >&6;}
 -    cat confcache >$cache_file
@@ -2366,25 +4132,43 @@ diff --git a/configure b/configure
 +        *)
 +	  mv -f confcache "$cache_file" ;;
 +	esac
 +      fi
 +    fi
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
  $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-@@ -6264,6 +6293,7 @@
+   fi
+ fi
+ rm -f confcache
+ 
+ test "x$prefix" = xNONE && prefix=$ac_default_prefix
+ # Let make expand exec_prefix.
+ test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+ 
+ DEFS=-DHAVE_CONFIG_H
  
  ac_libobjs=
  ac_ltlibobjs=
 +U=
  for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
    # 1. Remove the extension, and $U if already installed.
    ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-@@ -6287,51 +6317,51 @@
+   ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+   # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+   #    will be set to the directory where LIBOBJS objects are built.
+   as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+   as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+@@ -6282,61 +6312,61 @@
+   am__EXEEXT_TRUE=
+   am__EXEEXT_FALSE='#'
+ else
+   am__EXEEXT_TRUE='#'
+   am__EXEEXT_FALSE=
  fi
  
  if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
 -  as_fn_error "conditional \"AMDEP\" was never defined.
 +  as_fn_error $? "conditional \"AMDEP\" was never defined.
  Usually this means the macro was only invoked conditionally." "$LINENO" 5
  fi
  if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
@@ -2438,25 +4222,45 @@ diff --git a/configure b/configure
  Usually this means the macro was only invoked conditionally." "$LINENO" 5
  fi
  
 -: ${CONFIG_STATUS=./config.status}
 +: "${CONFIG_STATUS=./config.status}"
  ac_write_fail=0
  ac_clean_files_save=$ac_clean_files
  ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-@@ -6432,6 +6462,7 @@
+ { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+ $as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+ as_write_fail=0
+ cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+ #! $SHELL
+@@ -6427,16 +6457,17 @@
+ # IFS
+ # We need space, tab and new line, in precisely that order.  Quoting is
+ # there to prevent editors from complaining about space-tab.
+ # (If _AS_PATH_WALK were called with IFS unset, it would disable word
+ # splitting by setting IFS to empty value.)
  IFS=" ""	$as_nl"
  
  # Find who we are.  Look in the path if we contain no directory separator.
 +as_myself=
  case $0 in #((
    *[\\/]* ) as_myself=$0 ;;
    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-@@ -6477,19 +6508,19 @@
+ for as_dir in $PATH
+ do
+   IFS=$as_save_IFS
+   test -z "$as_dir" && as_dir=.
+     test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+@@ -6472,29 +6503,29 @@
+ export LC_ALL
+ LANGUAGE=C
+ export LANGUAGE
+ 
+ # CDPATH.
  (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
  
  
 -# as_fn_error ERROR [LINENO LOG_FD]
 -# ---------------------------------
 +# as_fn_error STATUS ERROR [LINENO LOG_FD]
 +# ----------------------------------------
  # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
@@ -2474,48 +4278,88 @@ diff --git a/configure b/configure
 +    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
 +    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
    fi
 -  $as_echo "$as_me: error: $1" >&2
 +  $as_echo "$as_me: error: $2" >&2
    as_fn_exit $as_status
  } # as_fn_error
  
-@@ -6685,7 +6716,7 @@
+ 
+ # as_fn_set_status STATUS
+ # -----------------------
+ # Set $? to STATUS, without forking.
+ as_fn_set_status ()
+@@ -6680,17 +6711,17 @@
+ 	  /^X\(\/\).*/{
+ 	    s//\1/
+ 	    q
+ 	  }
+ 	  s/.*/./; q'`
        test -d "$as_dir" && break
      done
      test -z "$as_dirs" || eval "mkdir $as_dirs"
 -  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
 +  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
  
  
  } # as_fn_mkdir_p
-@@ -6739,7 +6770,7 @@
+ if mkdir -p . 2>/dev/null; then
+   as_mkdir_p='mkdir -p "$as_dir"'
+ else
+   test -d ./-p && rmdir ./-p
+   as_mkdir_p=false
+@@ -6734,17 +6765,17 @@
+ test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+ 
+ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ # Save the log message, to keep $0 and so on meaningful, and to
+ # report actual input values of CONFIG_FILES etc. instead of their
  # values after options handling.
  ac_log="
  This file was extended by breakpad $as_me 0.1, which was
 -generated by GNU Autoconf 2.65.  Invocation command line was
 +generated by GNU Autoconf 2.68.  Invocation command line was
  
    CONFIG_FILES    = $CONFIG_FILES
    CONFIG_HEADERS  = $CONFIG_HEADERS
-@@ -6805,10 +6836,10 @@
+   CONFIG_LINKS    = $CONFIG_LINKS
+   CONFIG_COMMANDS = $CONFIG_COMMANDS
+   $ $0 $@
+ 
+ on `(hostname || uname -n) 2>/dev/null | sed 1q`
+@@ -6800,20 +6831,20 @@
+ 
+ Report bugs to <google-breakpad-dev@googlegroups.com>."
+ 
+ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
  ac_cs_version="\\
  breakpad config.status 0.1
 -configured by $0, generated by GNU Autoconf 2.65,
 +configured by $0, generated by GNU Autoconf 2.68,
    with options \\"\$ac_cs_config\\"
  
 -Copyright (C) 2009 Free Software Foundation, Inc.
 +Copyright (C) 2010 Free Software Foundation, Inc.
  This config.status script is free software; the Free Software Foundation
  gives unlimited permission to copy, distribute and modify it."
  
-@@ -6826,11 +6857,16 @@
+ ac_pwd='$ac_pwd'
+ srcdir='$srcdir'
+ INSTALL='$INSTALL'
+ MKDIR_P='$MKDIR_P'
+ AWK='$AWK'
+@@ -6821,21 +6852,26 @@
+ _ACEOF
+ 
+ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ # The default lists apply if the user does not specify any file.
+ ac_need_defaults=:
  while test $# != 0
  do
    case $1 in
 -  --*=*)
 +  --*=?*)
      ac_option=`expr "X$1" : 'X\([^=]*\)='`
      ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
      ac_shift=:
@@ -2523,96 +4367,142 @@ diff --git a/configure b/configure
 +  --*=)
 +    ac_option=`expr "X$1" : 'X\([^=]*\)='`
 +    ac_optarg=
 +    ac_shift=:
 +    ;;
    *)
      ac_option=$1
      ac_optarg=$2
-@@ -6852,6 +6888,7 @@
+     ac_shift=shift
+     ;;
+   esac
+ 
+   case $ac_option in
+@@ -6847,38 +6883,39 @@
+   --config | --confi | --conf | --con | --co | --c )
+     $as_echo "$ac_cs_config"; exit ;;
+   --debug | --debu | --deb | --de | --d | -d )
+     debug=: ;;
+   --file | --fil | --fi | --f )
      $ac_shift
      case $ac_optarg in
      *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
 +    '') as_fn_error $? "missing file argument" ;;
      esac
      as_fn_append CONFIG_FILES " '$ac_optarg'"
      ac_need_defaults=false;;
-@@ -6864,7 +6901,7 @@
+   --header | --heade | --head | --hea )
+     $ac_shift
+     case $ac_optarg in
+     *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+     esac
+     as_fn_append CONFIG_HEADERS " '$ac_optarg'"
      ac_need_defaults=false;;
    --he | --h)
      # Conflict between --help and --header
 -    as_fn_error "ambiguous option: \`$1'
 +    as_fn_error $? "ambiguous option: \`$1'
  Try \`$0 --help' for more information.";;
    --help | --hel | -h )
      $as_echo "$ac_cs_usage"; exit ;;
-@@ -6873,7 +6910,7 @@
+   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+   | -silent | --silent | --silen | --sile | --sil | --si | --s)
      ac_cs_silent=: ;;
  
    # This is an error.
 -  -*) as_fn_error "unrecognized option: \`$1'
 +  -*) as_fn_error $? "unrecognized option: \`$1'
  Try \`$0 --help' for more information." ;;
  
    *) as_fn_append ac_config_targets " $1"
-@@ -6931,7 +6968,7 @@
+      ac_need_defaults=false ;;
+ 
+   esac
+   shift
+ done
+@@ -6926,17 +6963,17 @@
+ # Handling of arguments.
+ for ac_config_target in $ac_config_targets
+ do
+   case $ac_config_target in
+     "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;;
      "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
      "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
  
 -  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
 +  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
    esac
  done
  
-@@ -6954,9 +6991,10 @@
+ 
+ # If the user did not use the arguments to specify the items to instantiate,
+ # then the envvar interface is used.  Set only those that are not.
+ # We use the long form for the default assignment because of an extremely
+ # bizarre bug on SunOS 4.1.3.
+@@ -6949,82 +6986,84 @@
+ # Have a temporary directory for convenience.  Make it in the build tree
+ # simply because there is no reason against having it here, and in addition,
+ # creating and moving files from /tmp can sometimes cause problems.
+ # Hook for its removal unless debugging.
+ # Note that there is a small window in which the directory will not be cleaned:
  # after its creation but before its name has been assigned to `$tmp'.
  $debug ||
  {
 -  tmp=
 +  tmp= ac_tmp=
    trap 'exit_status=$?
 -  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
 +  : "${ac_tmp:=$tmp}"
 +  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
  ' 0
    trap 'as_fn_exit 1' 1 2 13 15
  }
-@@ -6964,12 +7002,13 @@
+ # Create a (secure) tmp directory for tmp files.
  
  {
    tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
 -  test -n "$tmp" && test -d "$tmp"
 +  test -d "$tmp"
  }  ||
  {
    tmp=./conf$$-$RANDOM
    (umask 077 && mkdir "$tmp")
 -} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
 +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
 +ac_tmp=$tmp
  
  # Set up the scripts for CONFIG_FILES section.
  # No need to generate them if there are no CONFIG_FILES.
-@@ -6986,12 +7025,12 @@
+ # This happens for instance with `./config.status config.h'.
+ if test -n "$CONFIG_FILES"; then
+ 
+ 
+ ac_cr=`echo X | tr X '\015'`
+ # On cygwin, bash can eat \r inside `` if the user requested igncr.
+ # But we know of no other shell where ac_cr would be empty at this
+ # point, so we can use a bashism as a fallback.
+ if test "x$ac_cr" = x; then
+   eval ac_cr=\$\'\\r\'
  fi
  ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
  if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
 -  ac_cs_awk_cr='\r'
 +  ac_cs_awk_cr='\\r'
  else
    ac_cs_awk_cr=$ac_cr
  fi
  
 -echo 'BEGIN {' >"$tmp/subs1.awk" &&
 +echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
  _ACEOF
  
  
-@@ -7000,18 +7039,18 @@
+ {
+   echo "cat >conf$$subs.awk <<_ACEOF" &&
    echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
    echo "_ACEOF"
  } >conf$$subs.sh ||
 -  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
 +  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
  ac_delim='%!_!# '
@@ -2625,35 +4515,55 @@ diff --git a/configure b/configure
    if test $ac_delim_n = $ac_delim_num; then
      break
    elif $ac_last_try; then
 -    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
 +    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
    else
      ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
    fi
-@@ -7019,7 +7058,7 @@
+ done
  rm -f conf$$subs.sh
  
  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
  _ACEOF
  sed -n '
  h
-@@ -7067,7 +7106,7 @@
+ s/^/S["/; s/!.*/"]=/
+ p
+ g
+ s/^[^!]*!//
+ :repl
+@@ -7062,17 +7101,17 @@
+ /^[^""]/{
+   N
+   s/\n//
+ }
+ ' >>$CONFIG_STATUS || ac_write_fail=1
  rm -f conf$$subs.awk
  cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  _ACAWK
 -cat >>"\$tmp/subs1.awk" <<_ACAWK &&
 +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
    for (key in S) S_is_set[key] = 1
    FS = ""
  
-@@ -7099,21 +7138,29 @@
+ }
+ {
+   line = $ 0
+   nfields = split(line, field, "@")
+   substed = 0
+@@ -7094,59 +7133,67 @@
+ 
+ _ACAWK
+ _ACEOF
+ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
    sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
  else
    cat
 -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
 -  || as_fn_error "could not setup config files machinery" "$LINENO" 5
 +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
 +  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
  _ACEOF
@@ -2682,88 +4592,142 @@ diff --git a/configure b/configure
  s/:*$//
 +x
 +s/\(=[	 ]*\).*/\1/
 +G
 +s/\n//
  s/^[^=]*=[	 ]*$//
  }'
  fi
-@@ -7125,7 +7172,7 @@
+ 
+ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ fi # test -n "$CONFIG_FILES"
+ 
+ # Set up the scripts for CONFIG_HEADERS section.
  # No need to generate them if there are no CONFIG_HEADERS.
  # This happens for instance with `./config.status Makefile'.
  if test -n "$CONFIG_HEADERS"; then
 -cat >"$tmp/defines.awk" <<\_ACAWK ||
 +cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
  BEGIN {
  _ACEOF
  
-@@ -7137,11 +7184,11 @@
+ # Transform confdefs.h into an awk script `defines.awk', embedded as
+ # here-document in config.status, that substitutes the proper values into
+ # config.h.in to produce config.h.
+ 
+ # Create a delimiter string that does not exist in confdefs.h, to ease
  # handling of long lines.
  ac_delim='%!_!# '
  for ac_last_try in false false :; do
 -  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
 -  if test -z "$ac_t"; then
 +  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
 +  if test -z "$ac_tt"; then
      break
    elif $ac_last_try; then
 -    as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5
 +    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
    else
      ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
    fi
-@@ -7226,7 +7273,7 @@
+ done
+ 
+ # For the awk script, D is an array of macro values keyed by name,
+ # likewise P contains macro parameters if any.  Preserve backslash
+ # newline sequences.
+@@ -7221,30 +7268,30 @@
+       next
+     }
+   }
+ }
+ { print }
  _ACAWK
  _ACEOF
  cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 -  as_fn_error "could not setup config headers machinery" "$LINENO" 5
 +  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
  fi # test -n "$CONFIG_HEADERS"
  
  
-@@ -7239,7 +7286,7 @@
+ eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+ shift
+ for ac_tag
+ do
+   case $ac_tag in
+   :[FHLC]) ac_mode=$ac_tag; continue;;
    esac
    case $ac_mode$ac_tag in
    :[FHL]*:*);;
 -  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
 +  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
    :[FH]-) ac_tag=-:-;;
    :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
    esac
-@@ -7258,7 +7305,7 @@
+   ac_save_IFS=$IFS
+   IFS=:
+   set x $ac_tag
+   IFS=$ac_save_IFS
+   shift
+@@ -7253,26 +7300,26 @@
+ 
+   case $ac_mode in
+   :L) ac_source=$1;;
+   :[FH])
+     ac_file_inputs=
      for ac_f
      do
        case $ac_f in
 -      -) ac_f="$tmp/stdin";;
 +      -) ac_f="$ac_tmp/stdin";;
        *) # Look for the file first in the build tree, then in the source tree
  	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
  	 # because $ac_f cannot contain `:'.
-@@ -7267,7 +7314,7 @@
+ 	 test -f "$ac_f" ||
+ 	   case $ac_f in
  	   [\\/$]*) false;;
  	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
  	   esac ||
 -	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
 +	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
        esac
        case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
        as_fn_append ac_file_inputs " '$ac_f'"
-@@ -7293,8 +7340,8 @@
+     done
+ 
+     # Let's still pretend it is `configure' which instantiates (i.e., don't
+     # use $as_me), people would be surprised to read:
+     #    /* config.h.  Generated by config.status.  */
+@@ -7288,18 +7335,18 @@
+     case $configure_input in #(
+     *\&* | *\|* | *\\* )
+        ac_sed_conf_input=`$as_echo "$configure_input" |
+        sed 's/[\\\\&|]/\\\\&/g'`;; #(
+     *) ac_sed_conf_input=$configure_input;;
      esac
  
      case $ac_tag in
 -    *:-:* | *:-) cat >"$tmp/stdin" \
 -      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
 +    *:-:* | *:-) cat >"$ac_tmp/stdin" \
 +      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
      esac
      ;;
    esac
-@@ -7430,23 +7477,24 @@
+ 
+   ac_dir=`$as_dirname -- "$ac_file" ||
+ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ 	 X"$ac_file" : 'X\(//\)[^/]' \| \
+ 	 X"$ac_file" : 'X\(//\)$' \| \
+@@ -7425,56 +7472,57 @@
+ s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+ s&@builddir@&$ac_builddir&;t t
+ s&@abs_builddir@&$ac_abs_builddir&;t t
+ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+ s&@INSTALL@&$ac_INSTALL&;t t
  s&@MKDIR_P@&$ac_MKDIR_P&;t t
  $ac_datarootdir_hack
  "
 -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
 -  || as_fn_error "could not create $ac_file" "$LINENO" 5
 +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
 +  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
  
@@ -2789,17 +4753,18 @@ diff --git a/configure b/configure
 +  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
 +  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
    esac \
 -  || as_fn_error "could not create $ac_file" "$LINENO" 5
 +  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
   ;;
    :H)
    #
-@@ -7455,21 +7503,21 @@
+   # CONFIG_HEADER
+   #
    if test x"$ac_file" != x-; then
      {
        $as_echo "/* $configure_input  */" \
 -      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
 -    } >"$tmp/config.h" \
 -      || as_fn_error "could not create $ac_file" "$LINENO" 5
 -    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
 +      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
@@ -2819,48 +4784,86 @@ diff --git a/configure b/configure
      $as_echo "/* $configure_input  */" \
 -      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
 -      || as_fn_error "could not create -" "$LINENO" 5
 +      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
 +      || as_fn_error $? "could not create -" "$LINENO" 5
    fi
  # Compute "$ac_file"'s index in $config_headers.
  _am_arg="$ac_file"
-@@ -7619,7 +7667,7 @@
+ _am_stamp_count=1
+ for _am_header in $config_headers :; do
+   case $_am_header in
+     $_am_arg | $_am_arg:* )
+       break ;;
+@@ -7614,17 +7662,17 @@
+ done # for ac_tag
+ 
+ 
+ as_fn_exit 0
+ _ACEOF
  ac_clean_files=$ac_clean_files_save
  
  test $ac_write_fail = 0 ||
 -  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
 +  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
  
  
  # configure is writing to config.log, and then calls config.status.
-@@ -7640,7 +7688,7 @@
+ # config.status does its own redirection, appending to config.log.
+ # Unfortunately, on DOS this fails, as config.log is still kept open
+ # by configure, so config.status won't be able to write to it; its
+ # output is simply discarded.  So we exec the FD to /dev/null,
+ # effectively closing config.log, so it can be properly (re)opened and
+@@ -7635,15 +7683,15 @@
+   ac_config_status_args=
+   test "$silent" = yes &&
+     ac_config_status_args="$ac_config_status_args --quiet"
+   exec 5>/dev/null
+   $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
    exec 5>>config.log
    # Use ||, not &&, to avoid exiting from the if with $? = 1, which
    # would make configure fail if this is the last instruction.
 -  $ac_cs_success || as_fn_exit $?
 +  $ac_cs_success || as_fn_exit 1
  fi
  if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ fi
+ 
 diff --git a/src/common/dwarf_cfi_to_module.cc b/src/common/dwarf_cfi_to_module.cc
 --- a/src/common/dwarf_cfi_to_module.cc
 +++ b/src/common/dwarf_cfi_to_module.cc
-@@ -127,7 +127,8 @@
+@@ -122,17 +122,18 @@
+   return_address_ = return_address;
+ 
+   // Breakpad STACK CFI records must provide a .ra rule, but DWARF CFI
+   // may not establish any rule for .ra if the return address column
+   // is an ordinary register, and that register holds the return
    // address on entry to the function. So establish an initial .ra
    // rule citing the return address register.
    if (return_address_ < register_names_.size())
 -    entry_->initial_rules[ra_name_] = register_names_[return_address_];
 +    entry_->initial_rules[ra_name_]
 +      = Module::Expr(register_names_[return_address_], 0, false);
  
    return true;
  }
-@@ -153,23 +154,15 @@
+ 
+ string DwarfCFIToModule::RegisterName(int i) {
+   assert(entry_);
+   if (i < 0) {
+     assert(i == kCFARegister);
+@@ -148,69 +149,65 @@
+ 
+   reporter_->UnnamedRegister(entry_offset_, reg);
+   char buf[30];
+   sprintf(buf, "unnamed_register%u", reg);
+   return buf;
  }
  
  void DwarfCFIToModule::Record(Module::Address address, int reg,
 -                              const string &rule) {
 +                              const Module::Expr &rule) {
    assert(entry_);
  
 -  // Place the name in our global set of strings, and then use the string
@@ -2877,17 +4880,19 @@ diff --git a/src/common/dwarf_cfi_to_mod
 +    entry_->initial_rules[RegisterName(reg)] = rule;
    // File it under the appropriate address.
    else
 -    entry_->rule_changes[address][RegisterName(reg)] = shared_rule;
 +    entry_->rule_changes[address][RegisterName(reg)] = rule;
  }
  
  bool DwarfCFIToModule::UndefinedRule(uint64 address, int reg) {
-@@ -179,33 +172,37 @@
+   reporter_->UndefinedNotSupported(entry_offset_, RegisterName(reg));
+   // Treat this as a non-fatal error.
+   return true;
  }
  
  bool DwarfCFIToModule::SameValueRule(uint64 address, int reg) {
 -  ostringstream s;
 -  s << RegisterName(reg);
 -  Record(address, reg, s.str());
 +  // reg + 0
 +  Module::Expr rule
@@ -2927,116 +4932,184 @@ diff --git a/src/common/dwarf_cfi_to_mod
 -  Record(address, reg, s.str());
 +  // base_register + 0
 +  Module::Expr rule
 +    = Module::Expr(RegisterName(base_register), 0, false);
 +  Record(address, reg, rule);
    return true;
  }
  
+ bool DwarfCFIToModule::ExpressionRule(uint64 address, int reg,
+                                       const string &expression) {
+   reporter_->ExpressionsNotSupported(entry_offset_, RegisterName(reg));
+   // Treat this as a non-fatal error.
+   return true;
 diff --git a/src/common/dwarf_cfi_to_module.h b/src/common/dwarf_cfi_to_module.h
 --- a/src/common/dwarf_cfi_to_module.h
 +++ b/src/common/dwarf_cfi_to_module.h
-@@ -152,7 +152,7 @@
+@@ -147,17 +147,17 @@
+                                  const string &expression);
+   virtual bool End();
+ 
+  private:
+   // Return the name to use for register REG.
    string RegisterName(int i);
  
    // Record RULE for register REG at ADDRESS.
 -  void Record(Module::Address address, int reg, const string &rule);
 +  void Record(Module::Address address, int reg, const Module::Expr &rule);
  
    // The module to which we should add entries.
    Module *module_;
+ 
+   // Map from register numbers to register names.
+   const vector<string> &register_names_;
+ 
+   // The reporter to use to report problems.
 diff --git a/src/common/dwarf_cfi_to_module_unittest.cc b/src/common/dwarf_cfi_to_module_unittest.cc
 --- a/src/common/dwarf_cfi_to_module_unittest.cc
 +++ b/src/common/dwarf_cfi_to_module_unittest.cc
-@@ -158,7 +158,7 @@
+@@ -153,69 +153,71 @@
+ }
+ 
+ TEST_F(Rule, SameValueRule) {
+   StartEntry();
+   ASSERT_TRUE(handler.SameValueRule(entry_address, 6));
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial["reg6"] = "reg6";
 +  expected_initial["reg6"] = Module::Expr("reg6", 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    EXPECT_EQ(0U, entries[0]->rule_changes.size());
  }
-@@ -172,7 +172,8 @@
+ 
+ TEST_F(Rule, OffsetRule) {
+   StartEntry();
+   ASSERT_TRUE(handler.OffsetRule(entry_address + 1, return_reg,
+                                  DwarfCFIToModule::kCFARegister,
+                                  16927065));
+   ASSERT_TRUE(handler.End());
    CheckEntry();
    EXPECT_EQ(0U, entries[0]->initial_rules.size());
    Module::RuleChangeMap expected_changes;
 -  expected_changes[entry_address + 1][".ra"] = ".cfa 16927065 + ^";
 +  expected_changes[entry_address + 1][".ra"] =
 +      Module::Expr(".cfa", 16927065, true);
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
  }
  
-@@ -184,7 +185,8 @@
+ TEST_F(Rule, OffsetRuleNegative) {
+   StartEntry();
+   ASSERT_TRUE(handler.OffsetRule(entry_address + 1,
+                                  DwarfCFIToModule::kCFARegister, 4, -34530721));
+   ASSERT_TRUE(handler.End());
    CheckEntry();
    EXPECT_EQ(0U, entries[0]->initial_rules.size());
    Module::RuleChangeMap expected_changes;
 -  expected_changes[entry_address + 1][".cfa"] = "reg4 -34530721 + ^";
 +  expected_changes[entry_address + 1][".cfa"] =
 +      Module::Expr("reg4", -34530721, true);
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
  }
  
-@@ -200,7 +202,7 @@
+ TEST_F(Rule, ValOffsetRule) {
+   // Use an unnamed register number, to exercise that branch of RegisterName.
+   EXPECT_CALL(reporter, UnnamedRegister(_, 11));
+   StartEntry();
+   ASSERT_TRUE(handler.ValOffsetRule(entry_address + 0x5ab7,
+                                     DwarfCFIToModule::kCFARegister,
+                                     11, 61812979));
+   ASSERT_TRUE(handler.End());
+   CheckEntry();
    EXPECT_EQ(0U, entries[0]->initial_rules.size());
    Module::RuleChangeMap expected_changes;
    expected_changes[entry_address + 0x5ab7][".cfa"] =
 -      "unnamed_register11 61812979 +";
 +      Module::Expr("unnamed_register11", 61812979, false);
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
  }
  
-@@ -210,7 +212,7 @@
+ TEST_F(Rule, RegisterRule) {
+   StartEntry();
+   ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 3));
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial[".ra"] = "reg3";
 +  expected_initial[".ra"] = Module::Expr("reg3", 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    EXPECT_EQ(0U, entries[0]->rule_changes.size());
  }
-@@ -244,8 +246,8 @@
+ 
+ TEST_F(Rule, ExpressionRule) {
+   EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg2"));
+   StartEntry();
+   ASSERT_TRUE(handler.ExpressionRule(entry_address + 0xf326, 2,
+@@ -239,45 +241,46 @@
+ 
+ TEST_F(Rule, DefaultReturnAddressRule) {
+   return_reg = 2;
+   StartEntry();
+   ASSERT_TRUE(handler.RegisterRule(entry_address, 0, 1));
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial[".ra"] = "reg2";
 -  expected_initial["reg0"] = "reg1";
 +  expected_initial[".ra"] = Module::Expr("reg2", 0, false);
 +  expected_initial["reg0"] = Module::Expr("reg1", 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    EXPECT_EQ(0U, entries[0]->rule_changes.size());
  }
-@@ -257,7 +259,7 @@
+ 
+ TEST_F(Rule, DefaultReturnAddressRuleOverride) {
+   return_reg = 2;
+   StartEntry();
+   ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 1));
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial[".ra"] = "reg1";
 +  expected_initial[".ra"] = Module::Expr("reg1", 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    EXPECT_EQ(0U, entries[0]->rule_changes.size());
  }
-@@ -269,10 +271,11 @@
+ 
+ TEST_F(Rule, DefaultReturnAddressRuleLater) {
+   return_reg = 2;
+   StartEntry();
+   ASSERT_TRUE(handler.RegisterRule(entry_address + 1, return_reg, 1));
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial[".ra"] = "reg2";
 +  expected_initial[".ra"] = Module::Expr("reg2", 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    Module::RuleChangeMap expected_changes;
 -  expected_changes[entry_address + 1][".ra"] = "reg1";
 +  expected_changes[entry_address + 1][".ra"] =
 +      Module::Expr("reg1", 0, false);
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
  }
  
+ TEST(RegisterNames, I386) {
+   vector<string> names = DwarfCFIToModule::RegisterNames::I386();
+ 
+   EXPECT_EQ("$eax", names[0]);
+   EXPECT_EQ("$ecx", names[1]);
 diff --git a/src/common/module.cc b/src/common/module.cc
 --- a/src/common/module.cc
 +++ b/src/common/module.cc
-@@ -256,6 +256,24 @@
+@@ -246,16 +246,34 @@
+ }
+ 
+ bool Module::ReportError() {
+   fprintf(stderr, "error writing symbol file: %s\n",
+           strerror(errno));
    return false;
  }
  
 +std::ostream& operator<<(std::ostream& stream, const Module::Expr& expr) {
 +  assert(!expr.invalid());
 +  switch (expr.how_) {
 +    case Module::kExprSimple:
 +      stream << expr.ident_ << " " << expr.offset_ << " +";
@@ -3051,20 +5124,30 @@ diff --git a/src/common/module.cc b/src/
 +      break;
 +  }
 +  return stream;
 +}
 +
  bool Module::WriteRuleMap(const RuleMap &rule_map, std::ostream &stream) {
    for (RuleMap::const_iterator it = rule_map.begin();
         it != rule_map.end(); ++it) {
+     if (it != rule_map.begin())
+       stream << ' ';
+     stream << it->first << ": " << it->second;
+   }
+   return stream.good();
 diff --git a/src/common/module.h b/src/common/module.h
 --- a/src/common/module.h
 +++ b/src/common/module.h
-@@ -124,11 +124,71 @@
+@@ -119,21 +119,81 @@
+   };
+ 
+   // An exported symbol.
+   struct Extern {
+     Address address;
      string name;
    };
  
 -  // A map from register names to postfix expressions that recover
 -  // their their values. This can represent a complete set of rules to
 +  // Representation of an expression.  This can either be a postfix
 +  // expression, in which case it is stored as a string, or a simple
 +  // expression of the form (identifier + imm) or *(identifier + imm).
@@ -3129,52 +5212,82 @@ diff --git a/src/common/module.h b/src/c
 +  // their values. This can represent a complete set of rules to
    // follow at some address, or a set of changes to be applied to an
    // extant set of rules.
 -  typedef map<string, string> RuleMap;
 +  typedef map<string, Expr> RuleMap;
  
    // A map from addresses to RuleMaps, representing changes that take
    // effect at given addresses.
+   typedef map<Address, RuleMap> RuleChangeMap;
+ 
+   // A range of 'STACK CFI' stack walking information. An instance of
+   // this structure corresponds to a 'STACK CFI INIT' record and the
+   // subsequent 'STACK CFI' records that fall within its range.
 diff --git a/src/common/module_unittest.cc b/src/common/module_unittest.cc
 --- a/src/common/module_unittest.cc
 +++ b/src/common/module_unittest.cc
-@@ -130,11 +130,11 @@
+@@ -125,21 +125,21 @@
+   function->lines.push_back(line1);
+ 
+   m.AddFunction(function);
+ 
+   // Some stack information.
    Module::StackFrameEntry *entry = new Module::StackFrameEntry();
    entry->address = 0x30f9e5c83323973dULL;
    entry->size = 0x49fc9ca7c7c13dc2ULL;
 -  entry->initial_rules[".cfa"] = "he was a handsome man";
 -  entry->initial_rules["and"] = "what i want to know is";
 +  entry->initial_rules[".cfa"] = Module::Expr("he was a handsome man");
 +  entry->initial_rules["and"] = Module::Expr("what i want to know is");
    entry->rule_changes[0x30f9e5c83323973eULL]["how"] =
 -    "do you like your blueeyed boy";
 -  entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death";
 +    Module::Expr("do you like your blueeyed boy");
 +  entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = Module::Expr("Death");
    m.AddStackFrameEntry(entry);
  
    // Set the load address.  Doing this after adding all the data to
-@@ -234,11 +234,11 @@
+   // the module must work fine.
+   m.SetLoadAddress(0x2ab698b0b6407073LL);
+ 
+   m.Write(s, ALL_SYMBOL_DATA);
+   string contents = s.str();
+@@ -229,21 +229,21 @@
+   function->lines.push_back(line1);
+ 
+   m.AddFunction(function);
+ 
+   // Some stack information.
    Module::StackFrameEntry *entry = new Module::StackFrameEntry();
    entry->address = 0x30f9e5c83323973dULL;
    entry->size = 0x49fc9ca7c7c13dc2ULL;
 -  entry->initial_rules[".cfa"] = "he was a handsome man";
 -  entry->initial_rules["and"] = "what i want to know is";
 +  entry->initial_rules[".cfa"] = Module::Expr("he was a handsome man");
 +  entry->initial_rules["and"] = Module::Expr("what i want to know is");
    entry->rule_changes[0x30f9e5c83323973eULL]["how"] =
 -    "do you like your blueeyed boy";
 -  entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = "Death";
 +    Module::Expr("do you like your blueeyed boy");
 +  entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = Module::Expr("Death");
    m.AddStackFrameEntry(entry);
  
    // Set the load address.  Doing this after adding all the data to
-@@ -310,24 +310,24 @@
+   // the module must work fine.
+   m.SetLoadAddress(0x2ab698b0b6407073LL);
+ 
+   m.Write(s, NO_CFI);
+   string contents = s.str();
+@@ -305,34 +305,34 @@
+   entry1->address = 0xddb5f41285aa7757ULL;
+   entry1->size = 0x1486493370dc5073ULL;
+   m.AddStackFrameEntry(entry1);
+ 
+   // Second STACK CFI entry, with initial rules but no deltas.
    Module::StackFrameEntry *entry2 = new Module::StackFrameEntry();
    entry2->address = 0x8064f3af5e067e38ULL;
    entry2->size = 0x0de2a5ee55509407ULL;
 -  entry2->initial_rules[".cfa"] = "I think that I shall never see";
 -  entry2->initial_rules["stromboli"] = "a poem lovely as a tree";
 -  entry2->initial_rules["cannoli"] = "a tree whose hungry mouth is prest";
 +  entry2->initial_rules[".cfa"] = Module::Expr("I think that I shall never see");
 +  entry2->initial_rules["stromboli"] = Module::Expr("a poem lovely as a tree");
@@ -3197,17 +5310,27 @@ diff --git a/src/common/module_unittest.
 -    "his house is in";
 +    Module::Expr("his house is in");
    entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] =
 -    "I think I know";
 +    Module::Expr("I think I know");
    m.AddStackFrameEntry(entry3);
  
    // Check that Write writes STACK CFI records properly.
-@@ -357,23 +357,23 @@
+   m.Write(s, ALL_SYMBOL_DATA);
+   string contents = s.str();
+   EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+                "STACK CFI INIT 5e8d0db0a7075c6c 1c7edb12a7aea229"
+                " .cfa: Whose woods are these\n"
+@@ -352,33 +352,33 @@
+   // Check that GetStackFrameEntries works.
+   vector<Module::StackFrameEntry *> entries;
+   m.GetStackFrameEntries(&entries);
+   ASSERT_EQ(3U, entries.size());
+   // Check first entry.
    EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[0]->address);
    EXPECT_EQ(0x1c7edb12a7aea229ULL, entries[0]->size);
    Module::RuleMap entry1_initial;
 -  entry1_initial[".cfa"] = "Whose woods are these";
 +  entry1_initial[".cfa"] = Module::Expr("Whose woods are these");
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(entry1_initial));
    Module::RuleChangeMap entry1_changes;
 -  entry1_changes[0x36682fad3763ffffULL][".cfa"] = "I think I know";
@@ -3229,17 +5352,27 @@ diff --git a/src/common/module_unittest.
 -  entry2_initial["stromboli"] = "a poem lovely as a tree";
 -  entry2_initial["cannoli"] = "a tree whose hungry mouth is prest";
 +  entry2_initial[".cfa"] = Module::Expr("I think that I shall never see");
 +  entry2_initial["stromboli"] = Module::Expr("a poem lovely as a tree");
 +  entry2_initial["cannoli"] = Module::Expr("a tree whose hungry mouth is prest");
    EXPECT_THAT(entries[1]->initial_rules, ContainerEq(entry2_initial));
    ASSERT_EQ(0U, entries[1]->rule_changes.size());
    // Check third entry.
-@@ -590,24 +590,24 @@
+   EXPECT_EQ(0xddb5f41285aa7757ULL, entries[2]->address);
+   EXPECT_EQ(0x1486493370dc5073ULL, entries[2]->size);
+   ASSERT_EQ(0U, entries[2]->initial_rules.size());
+   ASSERT_EQ(0U, entries[2]->rule_changes.size());
+ }
+@@ -585,34 +585,34 @@
+   entry1->address = 0x2000;
+   entry1->size = 0x900;
+   m.AddStackFrameEntry(entry1);
+ 
+   // Second STACK CFI entry, with initial rules but no deltas.
    Module::StackFrameEntry *entry2 = new Module::StackFrameEntry();
    entry2->address = 0x3000;
    entry2->size = 0x900;
 -  entry2->initial_rules[".cfa"] = "I think that I shall never see";
 -  entry2->initial_rules["stromboli"] = "a poem lovely as a tree";
 -  entry2->initial_rules["cannoli"] = "a tree whose hungry mouth is prest";
 +  entry2->initial_rules[".cfa"] = Module::Expr("I think that I shall never see");
 +  entry2->initial_rules["stromboli"] = Module::Expr("a poem lovely as a tree");
@@ -3262,42 +5395,72 @@ diff --git a/src/common/module_unittest.
 -    "his house is in";
 +    Module::Expr("his house is in");
    entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] =
 -    "I think I know";
 +    Module::Expr("I think I know");
    m.AddStackFrameEntry(entry3);
  
    Module::StackFrameEntry* s = m.FindStackFrameEntryByAddress(0x1000);
+   EXPECT_EQ(entry3, s);
+   s = m.FindStackFrameEntryByAddress(0x18FF);
+   EXPECT_EQ(entry3, s);
+ 
+   s = m.FindStackFrameEntryByAddress(0x1900);
 diff --git a/src/processor/cfi_frame_info.cc b/src/processor/cfi_frame_info.cc
 --- a/src/processor/cfi_frame_info.cc
 +++ b/src/processor/cfi_frame_info.cc
-@@ -49,7 +49,7 @@
+@@ -44,17 +44,17 @@
+ namespace google_breakpad {
+ 
+ template<typename V>
+ bool CFIFrameInfo::FindCallerRegs(const RegisterValueMap<V> &registers,
+                                   const MemoryRegion &memory,
                                    RegisterValueMap<V> *caller_registers) const {
    // If there are not rules for both .ra and .cfa in effect at this address,
    // don't use this CFI data for stack walking.
 -  if (cfa_rule_.empty() || ra_rule_.empty())
 +  if (cfa_rule_.invalid() || ra_rule_.invalid())
      return false;
  
    RegisterValueMap<V> working;
-@@ -100,10 +100,10 @@
+   PostfixEvaluator<V> evaluator(&working, &memory);
+ 
+   caller_registers->clear();
+ 
+   // First, compute the CFA.
+@@ -95,20 +95,20 @@
+ template bool CFIFrameInfo::FindCallerRegs<u_int64_t>(
+     const RegisterValueMap<u_int64_t> &registers,
+     const MemoryRegion &memory,
+     RegisterValueMap<u_int64_t> *caller_registers) const;
+ 
  string CFIFrameInfo::Serialize() const {
    std::ostringstream stream;
  
 -  if (!cfa_rule_.empty()) {
 +  if (!cfa_rule_.invalid()) {
      stream << ".cfa: " << cfa_rule_;
    }
 -  if (!ra_rule_.empty()) {
 +  if (!ra_rule_.invalid()) {
      if (static_cast<std::streamoff>(stream.tellp()) != 0)
        stream << " ";
      stream << ".ra: " << ra_rule_;
-@@ -167,16 +167,17 @@
+   }
+   for (RuleMap::const_iterator iter = register_rules_.begin();
+        iter != register_rules_.end();
+        ++iter) {
+     if (static_cast<std::streamoff>(stream.tellp()) != 0)
+@@ -162,21 +162,22 @@
+   if (name_.empty() || expression_.empty()) return false;
+   if (name_ == ".cfa") handler_->CFARule(expression_);
+   else if (name_ == ".ra") handler_->RARule(expression_);
+   else handler_->RegisterRule(name_, expression_);
+   return true;
  }
  
  void CFIFrameInfoParseHandler::CFARule(const string &expression) {
 -  frame_info_->SetCFARule(expression);
 +  // 'expression' is a postfix expression string.
 +  frame_info_->SetCFARule(Module::Expr(expression));
  }
  
@@ -3311,25 +5474,40 @@ diff --git a/src/processor/cfi_frame_inf
 -  frame_info_->SetRegisterRule(name, expression);
 +  frame_info_->SetRegisterRule(name, Module::Expr(expression));
  }
  
  } // namespace google_breakpad
 diff --git a/src/processor/cfi_frame_info.h b/src/processor/cfi_frame_info.h
 --- a/src/processor/cfi_frame_info.h
 +++ b/src/processor/cfi_frame_info.h
-@@ -43,6 +43,7 @@
+@@ -38,16 +38,17 @@
+ #ifndef PROCESSOR_CFI_FRAME_INFO_H_
+ #define PROCESSOR_CFI_FRAME_INFO_H_
+ 
+ #include <map>
+ #include <string>
  
  #include "common/using_std_string.h"
  #include "google_breakpad/common/breakpad_types.h"
 +#include "common/module.h"
  
  namespace google_breakpad {
  
-@@ -66,16 +67,17 @@
+ using std::map;
+ 
+ class MemoryRegion;
+ 
+ // A set of rules for recovering the calling frame's registers'
+@@ -61,26 +62,27 @@
+ // INIT' record that covers that instruction, and then apply the
+ // changes given by the 'STACK CFI' records up to our instruction's
+ // address. Then, use the FindCallerRegs member function to apply the
+ // rules to the callee frame's register values, yielding the caller
+ // frame's register values.
  class CFIFrameInfo {
   public:
    // A map from register names onto values.
 -  template<typename ValueType> class RegisterValueMap: 
 +  template<typename ValueType> class RegisterValueMap:
      public map<string, ValueType> { };
  
    // Set the expression for computing a call frame address, return
@@ -3342,17 +5520,27 @@ diff --git a/src/processor/cfi_frame_inf
 +  void SetCFARule(const Module::Expr& rule) { cfa_rule_ = rule; }
 +  void SetRARule(const Module::Expr& rule)  { ra_rule_ = rule; }
 +  void SetRegisterRule(const string& register_name,
 +                       const Module::Expr& rule) {
 +    register_rules_[register_name] = rule;
    }
  
    // Compute the values of the calling frame's registers, according to
-@@ -106,27 +108,23 @@
+   // this rule set. Use ValueType in expression evaluation; this
+   // should be u_int32_t on machines with 32-bit addresses, or
+   // u_int64_t on machines with 64-bit addresses.
+   //
+   // Return true on success, false otherwise.
+@@ -101,37 +103,33 @@
+                       RegisterValueMap<ValueType> *caller_registers) const;
+ 
+   // Serialize the rules in this object into a string in the format
+   // of STACK CFI records.
+   string Serialize() const;
  
   private:
  
 -  // A map from register names onto evaluation rules. 
 -  typedef map<string, string> RuleMap;
 +  // A map from register names onto evaluation rules.
 +  typedef map<string, Module::Expr> RuleMap;
  
@@ -3376,65 +5564,95 @@ diff --git a/src/processor/cfi_frame_inf
 -  // A postfix expression for computing the current frame's return
 -  // address. 
 -  string ra_rule_;
 +  // An expression for computing the current frame's return address.
 +  Module::Expr ra_rule_;
  
    // For a register named REG, rules[REG] is a postfix expression
    // which leaves the value of REG in the calling frame on the top of
+   // the stack. You should evaluate this expression
+   RuleMap register_rules_;
+ };
+ 
+ // A parser for STACK CFI-style rule sets.
 diff --git a/src/processor/cfi_frame_info_unittest.cc b/src/processor/cfi_frame_info_unittest.cc
 --- a/src/processor/cfi_frame_info_unittest.cc
 +++ b/src/processor/cfi_frame_info_unittest.cc
-@@ -35,6 +35,7 @@
+@@ -30,24 +30,26 @@
+ // Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
+ 
+ // cfi_frame_info_unittest.cc: Unit tests for CFIFrameInfo,
+ // CFIRuleParser, CFIFrameInfoParseHandler, and SimpleCFIWalker.
+ 
  #include <string.h>
  
  #include "breakpad_googletest_includes.h"
 +#include "common/module.h"
  #include "common/using_std_string.h"
  #include "processor/cfi_frame_info.h"
  #include "google_breakpad/processor/memory_region.h"
-@@ -43,6 +44,7 @@
+ 
+ using google_breakpad::CFIFrameInfo;
  using google_breakpad::CFIFrameInfoParseHandler;
  using google_breakpad::CFIRuleParser;
  using google_breakpad::MemoryRegion;
 +using google_breakpad::Module;
  using google_breakpad::SimpleCFIWalker;
  using testing::_;
  using testing::A;
-@@ -86,7 +88,7 @@
+ using testing::AtMost;
+ using testing::DoAll;
+ using testing::Return;
+ using testing::SetArgumentPointee;
+ using testing::Test;
+@@ -81,56 +83,56 @@
+ };
+ 
+ class Simple: public CFIFixture, public Test { };
+ 
+ // FindCallerRegs should fail if no .cfa rule is provided.
  TEST_F(Simple, NoCFA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetRARule("0");
 +  cfi.SetRARule(Module::Expr("0"));
    ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                               &caller_registers));
    ASSERT_EQ(".ra: 0", cfi.Serialize());
-@@ -96,7 +98,7 @@
+ }
+ 
+ // FindCallerRegs should fail if no .ra rule is provided.
  TEST_F(Simple, NoRA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("0");
 +  cfi.SetCFARule(Module::Expr("0"));
    ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                               &caller_registers));
    ASSERT_EQ(".cfa: 0", cfi.Serialize());
-@@ -105,8 +107,8 @@
+ }
+ 
  TEST_F(Simple, SetCFAAndRARule) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("330903416631436410");
 -  cfi.SetRARule("5870666104170902211");
 +  cfi.SetCFARule(Module::Expr("330903416631436410"));
 +  cfi.SetRARule(Module::Expr("5870666104170902211"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
-@@ -120,12 +122,12 @@
+   ASSERT_EQ(330903416631436410ULL, caller_registers[".cfa"]);
+   ASSERT_EQ(5870666104170902211ULL, caller_registers[".ra"]);
+ 
+   ASSERT_EQ(".cfa: 330903416631436410 .ra: 5870666104170902211",
+             cfi.Serialize());
+ }
+ 
  TEST_F(Simple, SetManyRules) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("$temp1 68737028 = $temp2 61072337 = $temp1 $temp2 -");
 -  cfi.SetRARule(".cfa 99804755 +");
 -  cfi.SetRegisterRule("register1", ".cfa 54370437 *");
 -  cfi.SetRegisterRule("vodkathumbscrewingly", "24076308 .cfa +");
 -  cfi.SetRegisterRule("pubvexingfjordschmaltzy", ".cfa 29801007 -");
@@ -3443,137 +5661,183 @@ diff --git a/src/processor/cfi_frame_inf
 +  cfi.SetRARule(Module::Expr(".cfa 99804755 +"));
 +  cfi.SetRegisterRule("register1", Module::Expr(".cfa 54370437 *"));
 +  cfi.SetRegisterRule("vodkathumbscrewingly", Module::Expr("24076308 .cfa +"));
 +  cfi.SetRegisterRule("pubvexingfjordschmaltzy", Module::Expr(".cfa 29801007 -"));
 +  cfi.SetRegisterRule("uncopyrightables", Module::Expr("92642917 .cfa /"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(6U, caller_registers.size());
-@@ -147,9 +149,9 @@
+   ASSERT_EQ(7664691U,           caller_registers[".cfa"]);
+   ASSERT_EQ(107469446U,         caller_registers[".ra"]);
+   ASSERT_EQ(416732599139967ULL, caller_registers["register1"]);
+   ASSERT_EQ(31740999U,          caller_registers["vodkathumbscrewingly"]);
+   ASSERT_EQ(-22136316ULL,       caller_registers["pubvexingfjordschmaltzy"]);
+@@ -142,154 +144,154 @@
+             "uncopyrightables: 92642917 .cfa / "
+             "vodkathumbscrewingly: 24076308 .cfa +",
+             cfi.Serialize());
+ }
+ 
  TEST_F(Simple, RulesOverride) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("330903416631436410");
 -  cfi.SetRARule("5870666104170902211");
 -  cfi.SetCFARule("2828089117179001");
 +  cfi.SetCFARule(Module::Expr("330903416631436410"));
 +  cfi.SetRARule(Module::Expr("5870666104170902211"));
 +  cfi.SetCFARule(Module::Expr("2828089117179001"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
-@@ -165,8 +167,8 @@
+   ASSERT_EQ(2828089117179001ULL, caller_registers[".cfa"]);
+   ASSERT_EQ(5870666104170902211ULL, caller_registers[".ra"]);
+   ASSERT_EQ(".cfa: 2828089117179001 .ra: 5870666104170902211",
+             cfi.Serialize());
+ }
+ 
+ class Scope: public CFIFixture, public Test { };
+ 
+ // There should be no value for .cfa in scope when evaluating the CFA rule.
  TEST_F(Scope, CFALacksCFA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule(".cfa");
 -  cfi.SetRARule("0");
 +  cfi.SetCFARule(Module::Expr(".cfa"));
 +  cfi.SetRARule(Module::Expr("0"));
    ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                               &caller_registers));
  }
-@@ -175,8 +177,8 @@
+ 
+ // There should be no value for .ra in scope when evaluating the CFA rule.
  TEST_F(Scope, CFALacksRA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule(".ra");
 -  cfi.SetRARule("0");
 +  cfi.SetCFARule(Module::Expr(".ra"));
 +  cfi.SetRARule(Module::Expr("0"));
    ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                               &caller_registers));
  }
-@@ -188,8 +190,8 @@
+ 
+ // The current frame's registers should be in scope when evaluating
+ // the CFA rule.
+ TEST_F(Scope, CFASeesCurrentRegs) {
+   ExpectNoMemoryReferences();
  
    registers[".baraminology"] = 0x06a7bc63e4f13893ULL;
    registers[".ornithorhynchus"] = 0x5e0bf850bafce9d2ULL;
 -  cfi.SetCFARule(".baraminology .ornithorhynchus +");
 -  cfi.SetRARule("0");
 +  cfi.SetCFARule(Module::Expr(".baraminology .ornithorhynchus +"));
 +  cfi.SetRARule(Module::Expr("0"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
-@@ -201,8 +203,8 @@
+   ASSERT_EQ(0x06a7bc63e4f13893ULL + 0x5e0bf850bafce9d2ULL,
+             caller_registers[".cfa"]);
+ }
+ 
+ // .cfa should be in scope in the return address expression.
  TEST_F(Scope, RASeesCFA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("48364076");
 -  cfi.SetRARule(".cfa");
 +  cfi.SetCFARule(Module::Expr("48364076"));
 +  cfi.SetRARule(Module::Expr(".cfa"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
-@@ -213,8 +215,8 @@
+   ASSERT_EQ(48364076U, caller_registers[".ra"]);
+ }
+ 
+ // There should be no value for .ra in scope when evaluating the CFA rule.
  TEST_F(Scope, RALacksRA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("0");
 -  cfi.SetRARule(".ra");
 +  cfi.SetCFARule(Module::Expr("0"));
 +  cfi.SetRARule(Module::Expr(".ra"));
    ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                               &caller_registers));
  }
-@@ -225,8 +227,8 @@
+ 
+ // The current frame's registers should be in scope in the return
+ // address expression.
+ TEST_F(Scope, RASeesCurrentRegs) {
    ExpectNoMemoryReferences();
  
    registers["noachian"] = 0x54dc4a5d8e5eb503ULL;
 -  cfi.SetCFARule("10359370");
 -  cfi.SetRARule("noachian");
 +  cfi.SetCFARule(Module::Expr("10359370"));
 +  cfi.SetRARule(Module::Expr("noachian"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
-@@ -237,9 +239,9 @@
+   ASSERT_EQ(0x54dc4a5d8e5eb503ULL, caller_registers[".ra"]);
+ }
+ 
+ // .cfa should be in scope for register rules.
  TEST_F(Scope, RegistersSeeCFA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("6515179");
 -  cfi.SetRARule(".cfa");
 -  cfi.SetRegisterRule("rogerian", ".cfa");
 +  cfi.SetCFARule(Module::Expr("6515179"));
 +  cfi.SetRARule(Module::Expr(".cfa"));
 +  cfi.SetRegisterRule("rogerian", Module::Expr(".cfa"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(3U, caller_registers.size());
-@@ -250,9 +252,9 @@
+   ASSERT_EQ(6515179U, caller_registers["rogerian"]);
+ }
+ 
+ // The return address should not be in scope for register rules.
  TEST_F(Scope, RegsLackRA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("42740329");
 -  cfi.SetRARule("27045204");
 -  cfi.SetRegisterRule("$r1", ".ra");
 +  cfi.SetCFARule(Module::Expr("42740329"));
 +  cfi.SetRARule(Module::Expr("27045204"));
 +  cfi.SetRegisterRule("$r1", Module::Expr(".ra"));
    ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                               &caller_registers));
  }
-@@ -263,10 +265,10 @@
+ 
+ // Register rules can see the current frame's register values.
+ TEST_F(Scope, RegsSeeRegs) {
+   ExpectNoMemoryReferences();
  
    registers["$r1"] = 0x6ed3582c4bedb9adULL;
    registers["$r2"] = 0xd27d9e742b8df6d0ULL;
 -  cfi.SetCFARule("88239303");
 -  cfi.SetRARule("30503835");
 -  cfi.SetRegisterRule("$r1", "$r1 42175211 = $r2");
 -  cfi.SetRegisterRule("$r2", "$r2 21357221 = $r1");
 +  cfi.SetCFARule(Module::Expr("88239303"));
 +  cfi.SetRARule(Module::Expr("30503835"));
 +  cfi.SetRegisterRule("$r1", Module::Expr("$r1 42175211 = $r2"));
 +  cfi.SetRegisterRule("$r2", Module::Expr("$r2 21357221 = $r1"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(4U, caller_registers.size());
-@@ -278,13 +280,13 @@
+   ASSERT_EQ(0xd27d9e742b8df6d0ULL, caller_registers["$r1"]);
+   ASSERT_EQ(0x6ed3582c4bedb9adULL, caller_registers["$r2"]);
+ }
+ 
+ // Each rule's temporaries are separate.
  TEST_F(Scope, SeparateTempsRA) {
    ExpectNoMemoryReferences();
  
 -  cfi.SetCFARule("$temp1 76569129 = $temp1");
 -  cfi.SetRARule("0");
 +  cfi.SetCFARule(Module::Expr("$temp1 76569129 = $temp1"));
 +  cfi.SetRARule(Module::Expr("0"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
@@ -3581,35 +5845,55 @@ diff --git a/src/processor/cfi_frame_inf
  
 -  cfi.SetCFARule("$temp1 76569129 = $temp1");
 -  cfi.SetRARule("$temp1");
 +  cfi.SetCFARule(Module::Expr("$temp1 76569129 = $temp1"));
 +  cfi.SetRARule(Module::Expr("$temp1"));
    ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                               &caller_registers));
  }
-@@ -517,10 +519,10 @@
+ 
+ class MockCFIRuleParserHandler: public CFIRuleParser::Handler {
+  public:
+   MOCK_METHOD1(CFARule, void(const string &));
+   MOCK_METHOD1(RARule,  void(const string &));
+@@ -512,20 +514,20 @@
+       .WillRepeatedly(DoAll(SetArgumentPointee<1>(0xdc1975eba8602302ULL),
+                             Return(true)));
+   // Saved return address.
+   EXPECT_CALL(memory,
+               GetMemoryAtAddress(stack_top + 16, A<u_int64_t *>()))
        .WillRepeatedly(DoAll(SetArgumentPointee<1>(0xba5ad6d9acce28deULL),
                              Return(true)));
  
 -  call_frame_info.SetCFARule("sp 24 +");
 -  call_frame_info.SetRARule(".cfa 8 - ^");
 -  call_frame_info.SetRegisterRule("r0", ".cfa 24 - ^");
 -  call_frame_info.SetRegisterRule("r1", "r2");
 +  call_frame_info.SetCFARule(Module::Expr("sp 24 +"));
 +  call_frame_info.SetRARule(Module::Expr(".cfa 8 - ^"));
 +  call_frame_info.SetRegisterRule("r0", Module::Expr(".cfa 24 - ^"));
 +  call_frame_info.SetRegisterRule("r1", Module::Expr("r2"));
  
    callee_context.r0 = 0x94e030ca79edd119ULL;
    callee_context.r1 = 0x937b4d7e95ce52d9ULL;
+   callee_context.r2 = 0x5fe0027416b8b62aULL; // caller's r1
+   // callee_context.r3 is not valid in callee.
+   // callee_context.r4 is not valid in callee.
+   callee_context.sp = stack_top;
+   callee_context.pc = 0x25b21b224311d280ULL;
 diff --git a/src/processor/postfix_evaluator-inl.h b/src/processor/postfix_evaluator-inl.h
 --- a/src/processor/postfix_evaluator-inl.h
 +++ b/src/processor/postfix_evaluator-inl.h
-@@ -231,12 +231,19 @@
+@@ -226,52 +226,100 @@
+       return false;
+     }
+   }
+ 
+   return true;
  }
  
  template<typename ValueType>
 -bool PostfixEvaluator<ValueType>::Evaluate(const string &expression,
 -                                           DictionaryValidityType *assigned) {
 +bool PostfixEvaluator<ValueType>::Evaluate(const Module::Expr& expr,
 +                                           DictionaryValidityType* assigned) {
 +  // The expression is being exevaluated only for its side effects.  Skip
@@ -3622,17 +5906,18 @@ diff --git a/src/processor/postfix_evalu
    // Ensure that the stack is cleared before returning.
    AutoStackClearer clearer(&stack_);
  
 -  if (!EvaluateInternal(expression, assigned))
 +  if (!EvaluateInternal(expr.postfix_, assigned))
      return false;
  
    // If there's anything left on the stack, it indicates incomplete execution.
-@@ -245,28 +252,69 @@
+   // This is a failure case.  If the stack is empty, evalution was complete
+   // and successful.
    if (stack_.empty())
      return true;
  
 -  BPLOG(ERROR) << "Incomplete execution: " << expression;
 +  BPLOG(ERROR) << "Incomplete execution: " << expr;
    return false;
  }
  
@@ -3706,28 +5991,48 @@ diff --git a/src/processor/postfix_evalu
    }
 +}
  
 -  return PopValue(result);
 -}
  
  template<typename ValueType>
  typename PostfixEvaluator<ValueType>::PopResult
+ PostfixEvaluator<ValueType>::PopValueOrIdentifier(
+     ValueType *value, string *identifier) {
+   // There needs to be at least one element on the stack to pop.
+   if (!stack_.size())
+     return POP_RESULT_FAIL;
 diff --git a/src/processor/postfix_evaluator.h b/src/processor/postfix_evaluator.h
 --- a/src/processor/postfix_evaluator.h
 +++ b/src/processor/postfix_evaluator.h
-@@ -75,6 +75,7 @@
+@@ -70,16 +70,17 @@
+ #define PROCESSOR_POSTFIX_EVALUATOR_H__
+ 
+ 
+ #include <map>
+ #include <string>
  #include <vector>
  
  #include "common/using_std_string.h"
 +#include "common/module.h"
  
  namespace google_breakpad {
  
-@@ -105,13 +106,13 @@
+ using std::map;
+ using std::vector;
+ 
+ class MemoryRegion;
+ 
+@@ -100,23 +101,23 @@
+ 
+   // Evaluate the expression, starting with an empty stack. The results of
+   // execution will be stored in one (or more) variables in the dictionary.
+   // Returns false if any failures occur during execution, leaving
+   // variables in the dictionary in an indeterminate state. If assigned is
    // non-NULL, any keys set in the dictionary as a result of evaluation
    // will also be set to true in assigned, providing a way to determine if
    // an expression modifies any of its input variables.
 -  bool Evaluate(const string &expression, DictionaryValidityType *assigned);
 +  bool Evaluate(const Module::Expr &expr, DictionaryValidityType *assigned);
  
 -  // Like Evaluate, but provides the value left on the stack to the
 -  // caller. If evaluation succeeds and leaves exactly one value on
@@ -3737,8 +6042,13 @@ diff --git a/src/processor/postfix_evalu
 +  // Like Evaluate, but expects the expression to denote a value.
 +  // If evaluation succeeds and (in the case of a postfix expression)
 +  // leaves exactly one value on the stack, pop that value, store it in
 +  // *result, and return true. Otherwise, return false.
 +  bool EvaluateForValue(const Module::Expr& expression, ValueType* result);
  
    DictionaryType* dictionary() const { return dictionary_; }
  
+   // Reset the dictionary.  PostfixEvaluator does not take ownership.
+   void set_dictionary(DictionaryType *dictionary) {dictionary_ = dictionary; }
+ 
+  private:
+   // Return values for PopValueOrIdentifier
--- a/toolkit/crashreporter/breakpad-patches/03-unique-string.patch
+++ b/toolkit/crashreporter/breakpad-patches/03-unique-string.patch
@@ -1,13 +1,10 @@
 # HG changeset patch
-# User Ted Mielczarek <ted.mielczarek@gmail.com>
-# Date 1360255134 18000
-# Node ID 229852c0b835929a56f207996034cf072307b343
-# Parent  dc6d795f6d0b9357f39ac2a291be4e1c533d3c09
+# Parent 1d603891eb459b1769329432ec941a1093c6e8f8
 Rework PostfixEvaluator to use a UniqueString type
 R=ted
 
 diff --git a/Makefile.am b/Makefile.am
 --- a/Makefile.am
 +++ b/Makefile.am
 @@ -139,6 +139,7 @@
  	src/google_breakpad/processor/symbol_supplier.h \
@@ -359,24 +356,23 @@ diff --git a/Makefile.in b/Makefile.in
 diff --git a/src/common/dwarf_cfi_to_module.cc b/src/common/dwarf_cfi_to_module.cc
 --- a/src/common/dwarf_cfi_to_module.cc
 +++ b/src/common/dwarf_cfi_to_module.cc
 @@ -42,14 +42,18 @@
  
  using std::ostringstream;
  
 -vector<string> DwarfCFIToModule::RegisterNames::MakeVector(
--    const char * const *strings,
 +vector<const UniqueString*> DwarfCFIToModule::RegisterNames::MakeVector(
-+    const char* const* strings,
+     const char * const *strings,
      size_t size) {
 -  vector<string> names(strings, strings + size);
 +  vector<const UniqueString*> names(size, NULL);
-+  for (size_t i = 0; i < size; ++i) {
-+    names[i] = ToUniqueString(strings[i]);
++  for (size_t i = 0; i < size; i++) {
++    names[i] = toUniqueString(strings[i]);
 +  }
 +
    return names;
  }
  
 -vector<string> DwarfCFIToModule::RegisterNames::I386() {
 +vector<const UniqueString*> DwarfCFIToModule::RegisterNames::I386() {
    static const char *const names[] = {
@@ -428,17 +424,17 @@ diff --git a/src/common/dwarf_cfi_to_mod
 -  if (reg < register_names_.size() && !register_names_[reg].empty())
 +  if (reg < register_names_.size() && register_names_[reg] != ustr__empty())
      return register_names_[reg];
  
    reporter_->UnnamedRegister(entry_offset_, reg);
    char buf[30];
    sprintf(buf, "unnamed_register%u", reg);
 -  return buf;
-+  return ToUniqueString(buf);
++  return toUniqueString(buf);
  }
  
  void DwarfCFIToModule::Record(Module::Address address, int reg,
 @@ -233,23 +237,25 @@
            file_.c_str(), section_.c_str(), offset, reg);
  }
  
 -void DwarfCFIToModule::Reporter::UndefinedNotSupported(size_t offset,
@@ -446,31 +442,31 @@ diff --git a/src/common/dwarf_cfi_to_mod
 +void DwarfCFIToModule::Reporter::UndefinedNotSupported(
 +    size_t offset,
 +    const UniqueString* reg) {
    fprintf(stderr, "%s, section '%s': "
            "the call frame entry at offset 0x%zx sets the rule for "
            "register '%s' to 'undefined', but the Breakpad symbol file format"
            " cannot express this\n",
 -          file_.c_str(), section_.c_str(), offset, reg.c_str());
-+          file_.c_str(), section_.c_str(), offset, FromUniqueString(reg));
++          file_.c_str(), section_.c_str(), offset, fromUniqueString(reg));
  }
  
 -void DwarfCFIToModule::Reporter::ExpressionsNotSupported(size_t offset,
 -                                                         const string &reg) {
 +void DwarfCFIToModule::Reporter::ExpressionsNotSupported(
 +    size_t offset,
 +    const UniqueString* reg) {
    fprintf(stderr, "%s, section '%s': "
            "the call frame entry at offset 0x%zx uses a DWARF expression to"
            " describe how to recover register '%s', "
            " but this translator cannot yet translate DWARF expressions to"
            " Breakpad postfix expressions\n",
 -          file_.c_str(), section_.c_str(), offset, reg.c_str());
-+          file_.c_str(), section_.c_str(), offset, FromUniqueString(reg));
++          file_.c_str(), section_.c_str(), offset, fromUniqueString(reg));
  }
  
  } // namespace google_breakpad
 diff --git a/src/common/dwarf_cfi_to_module.h b/src/common/dwarf_cfi_to_module.h
 --- a/src/common/dwarf_cfi_to_module.h
 +++ b/src/common/dwarf_cfi_to_module.h
 @@ -49,6 +49,7 @@
  #include "common/module.h"
@@ -576,272 +572,252 @@ diff --git a/src/common/dwarf_cfi_to_mod
 -  // of text.
 -  set<string> common_strings_;
  };
  
  } // namespace google_breakpad
 diff --git a/src/common/dwarf_cfi_to_module_unittest.cc b/src/common/dwarf_cfi_to_module_unittest.cc
 --- a/src/common/dwarf_cfi_to_module_unittest.cc
 +++ b/src/common/dwarf_cfi_to_module_unittest.cc
-@@ -42,6 +42,11 @@
- 
- using google_breakpad::Module;
- using google_breakpad::DwarfCFIToModule;
-+using google_breakpad::ToUniqueString;
-+using google_breakpad::UniqueString;
-+using google_breakpad::ustr__ZDcfa;
-+using google_breakpad::ustr__ZDra;
-+using google_breakpad::ustr__empty;
- using testing::ContainerEq;
- using testing::Test;
- using testing::_;
-@@ -50,8 +55,10 @@
+@@ -50,8 +50,10 @@
    MockCFIReporter(const string &file, const string &section)
        : Reporter(file, section) { }
    MOCK_METHOD2(UnnamedRegister, void(size_t offset, int reg));
 -  MOCK_METHOD2(UndefinedNotSupported, void(size_t offset, const string &reg));
 -  MOCK_METHOD2(ExpressionsNotSupported, void(size_t offset, const string &reg));
 +  MOCK_METHOD2(UndefinedNotSupported, void(size_t offset,
 +                                           const UniqueString* reg));
 +  MOCK_METHOD2(ExpressionsNotSupported, void(size_t offset,
 +                                             const UniqueString* reg));
  };
  
  struct DwarfCFIToModuleFixture {
-@@ -59,17 +66,17 @@
+@@ -59,17 +61,17 @@
        : module("module name", "module os", "module arch", "module id"),
          reporter("reporter file", "reporter section"),
          handler(&module, register_names, &reporter) {
 -    register_names.push_back("reg0");
 -    register_names.push_back("reg1");
 -    register_names.push_back("reg2");
 -    register_names.push_back("reg3");
 -    register_names.push_back("reg4");
 -    register_names.push_back("reg5");
 -    register_names.push_back("reg6");
 -    register_names.push_back("reg7");
 -    register_names.push_back("sp");
 -    register_names.push_back("pc");
 -    register_names.push_back("");
-+    register_names.push_back(ToUniqueString("reg0"));
-+    register_names.push_back(ToUniqueString("reg1"));
-+    register_names.push_back(ToUniqueString("reg2"));
-+    register_names.push_back(ToUniqueString("reg3"));
-+    register_names.push_back(ToUniqueString("reg4"));
-+    register_names.push_back(ToUniqueString("reg5"));
-+    register_names.push_back(ToUniqueString("reg6"));
-+    register_names.push_back(ToUniqueString("reg7"));
-+    register_names.push_back(ToUniqueString("sp"));
-+    register_names.push_back(ToUniqueString("pc"));
++    register_names.push_back(toUniqueString("reg0"));
++    register_names.push_back(toUniqueString("reg1"));
++    register_names.push_back(toUniqueString("reg2"));
++    register_names.push_back(toUniqueString("reg3"));
++    register_names.push_back(toUniqueString("reg4"));
++    register_names.push_back(toUniqueString("reg5"));
++    register_names.push_back(toUniqueString("reg6"));
++    register_names.push_back(toUniqueString("reg7"));
++    register_names.push_back(toUniqueString("sp"));
++    register_names.push_back(toUniqueString("pc"));
 +    register_names.push_back(ustr__empty());
  
      EXPECT_CALL(reporter, UnnamedRegister(_, _)).Times(0);
      EXPECT_CALL(reporter, UndefinedNotSupported(_, _)).Times(0);
-@@ -77,7 +84,7 @@
+@@ -77,7 +79,7 @@
    }
  
    Module module;
 -  vector<string> register_names;
 +  vector<const UniqueString*> register_names;
    MockCFIReporter reporter;
    DwarfCFIToModule handler;
    vector<Module::StackFrameEntry *> entries;
-@@ -132,7 +139,7 @@
+@@ -132,7 +134,7 @@
  class Rule: public RuleFixture, public Test { };
  
  TEST_F(Rule, UndefinedRule) {
 -  EXPECT_CALL(reporter, UndefinedNotSupported(_, "reg7"));
-+  EXPECT_CALL(reporter, UndefinedNotSupported(_, ToUniqueString("reg7")));
++  EXPECT_CALL(reporter, UndefinedNotSupported(_, toUniqueString("reg7")));
    StartEntry();
    ASSERT_TRUE(handler.UndefinedRule(entry_address, 7));
    ASSERT_TRUE(handler.End());
-@@ -143,7 +150,8 @@
+@@ -143,7 +145,8 @@
  
  TEST_F(Rule, RegisterWithEmptyName) {
    EXPECT_CALL(reporter, UnnamedRegister(_, 10));
 -  EXPECT_CALL(reporter, UndefinedNotSupported(_, "unnamed_register10"));
 +  EXPECT_CALL(reporter,
-+              UndefinedNotSupported(_, ToUniqueString("unnamed_register10")));
++              UndefinedNotSupported(_, toUniqueString("unnamed_register10")));
    StartEntry();
    ASSERT_TRUE(handler.UndefinedRule(entry_address, 10));
    ASSERT_TRUE(handler.End());
-@@ -158,7 +166,8 @@
+@@ -158,7 +161,8 @@
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial["reg6"] = Module::Expr("reg6", 0, false);
-+  const UniqueString* reg6 = ToUniqueString("reg6");
++  const UniqueString* reg6 = toUniqueString("reg6");
 +  expected_initial[reg6] = Module::Expr(reg6, 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    EXPECT_EQ(0U, entries[0]->rule_changes.size());
  }
-@@ -172,8 +181,8 @@
+@@ -172,8 +176,8 @@
    CheckEntry();
    EXPECT_EQ(0U, entries[0]->initial_rules.size());
    Module::RuleChangeMap expected_changes;
 -  expected_changes[entry_address + 1][".ra"] =
 -      Module::Expr(".cfa", 16927065, true);
 +  expected_changes[entry_address + 1][ustr__ZDra()] =
 +      Module::Expr(ustr__ZDcfa(), 16927065, true);
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
  }
  
-@@ -185,8 +194,8 @@
+@@ -185,8 +189,8 @@
    CheckEntry();
    EXPECT_EQ(0U, entries[0]->initial_rules.size());
    Module::RuleChangeMap expected_changes;
 -  expected_changes[entry_address + 1][".cfa"] =
 -      Module::Expr("reg4", -34530721, true);
 +  expected_changes[entry_address + 1][ustr__ZDcfa()] =
-+      Module::Expr(ToUniqueString("reg4"), -34530721, true);
++      Module::Expr(toUniqueString("reg4"), -34530721, true);
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
  }
  
-@@ -201,8 +210,8 @@
+@@ -201,8 +205,8 @@
    CheckEntry();
    EXPECT_EQ(0U, entries[0]->initial_rules.size());
    Module::RuleChangeMap expected_changes;
 -  expected_changes[entry_address + 0x5ab7][".cfa"] =
 -      Module::Expr("unnamed_register11", 61812979, false);
 +  expected_changes[entry_address + 0x5ab7][ustr__ZDcfa()] =
-+      Module::Expr(ToUniqueString("unnamed_register11"), 61812979, false);
++      Module::Expr(toUniqueString("unnamed_register11"), 61812979, false);
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
  }
  
-@@ -212,13 +221,14 @@
+@@ -212,13 +216,14 @@
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial[".ra"] = Module::Expr("reg3", 0, false);
 +  expected_initial[ustr__ZDra()] =
-+      Module::Expr(ToUniqueString("reg3"), 0, false);
++      Module::Expr(toUniqueString("reg3"), 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    EXPECT_EQ(0U, entries[0]->rule_changes.size());
  }
  
  TEST_F(Rule, ExpressionRule) {
 -  EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg2"));
-+  EXPECT_CALL(reporter, ExpressionsNotSupported(_, ToUniqueString("reg2")));
++  EXPECT_CALL(reporter, ExpressionsNotSupported(_, toUniqueString("reg2")));
    StartEntry();
    ASSERT_TRUE(handler.ExpressionRule(entry_address + 0xf326, 2,
                                       "it takes two to tango"));
-@@ -229,7 +239,7 @@
+@@ -229,7 +234,7 @@
  }
  
  TEST_F(Rule, ValExpressionRule) {
 -  EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg0"));
-+  EXPECT_CALL(reporter, ExpressionsNotSupported(_, ToUniqueString("reg0")));
++  EXPECT_CALL(reporter, ExpressionsNotSupported(_, toUniqueString("reg0")));
    StartEntry();
    ASSERT_TRUE(handler.ValExpressionRule(entry_address + 0x6367, 0,
                                          "bit off more than he could chew"));
-@@ -246,8 +256,10 @@
+@@ -246,8 +251,10 @@
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial[".ra"] = Module::Expr("reg2", 0, false);
 -  expected_initial["reg0"] = Module::Expr("reg1", 0, false);
 +  expected_initial[ustr__ZDra()] =
-+      Module::Expr(ToUniqueString("reg2"), 0, false);
-+  expected_initial[ToUniqueString("reg0")] =
-+      Module::Expr(ToUniqueString("reg1"), 0, false);
++      Module::Expr(toUniqueString("reg2"), 0, false);
++  expected_initial[toUniqueString("reg0")] =
++      Module::Expr(toUniqueString("reg1"), 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    EXPECT_EQ(0U, entries[0]->rule_changes.size());
  }
-@@ -259,7 +271,8 @@
+@@ -259,7 +266,8 @@
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial[".ra"] = Module::Expr("reg1", 0, false);
 +  expected_initial[ustr__ZDra()] =
-+      Module::Expr(ToUniqueString("reg1"), 0, false);
++      Module::Expr(toUniqueString("reg1"), 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    EXPECT_EQ(0U, entries[0]->rule_changes.size());
  }
-@@ -271,39 +284,40 @@
+@@ -271,39 +279,40 @@
    ASSERT_TRUE(handler.End());
    CheckEntry();
    Module::RuleMap expected_initial;
 -  expected_initial[".ra"] = Module::Expr("reg2", 0, false);
 +  expected_initial[ustr__ZDra()] =
-+      Module::Expr(ToUniqueString("reg2"), 0, false);
++      Module::Expr(toUniqueString("reg2"), 0, false);
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
    Module::RuleChangeMap expected_changes;
 -  expected_changes[entry_address + 1][".ra"] =
 -      Module::Expr("reg1", 0, false);
 +  expected_changes[entry_address + 1][ustr__ZDra()] =
-+      Module::Expr(ToUniqueString("reg1"), 0, false);
++      Module::Expr(toUniqueString("reg1"), 0, false);
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
  }
  
  TEST(RegisterNames, I386) {
 -  vector<string> names = DwarfCFIToModule::RegisterNames::I386();
 +  vector<const UniqueString*> names = DwarfCFIToModule::RegisterNames::I386();
  
 -  EXPECT_EQ("$eax", names[0]);
 -  EXPECT_EQ("$ecx", names[1]);
 -  EXPECT_EQ("$esp", names[4]);
 -  EXPECT_EQ("$eip", names[8]);
-+  EXPECT_EQ(ToUniqueString("$eax"), names[0]);
-+  EXPECT_EQ(ToUniqueString("$ecx"), names[1]);
-+  EXPECT_EQ(ToUniqueString("$esp"), names[4]);
-+  EXPECT_EQ(ToUniqueString("$eip"), names[8]);
++  EXPECT_EQ(toUniqueString("$eax"), names[0]);
++  EXPECT_EQ(toUniqueString("$ecx"), names[1]);
++  EXPECT_EQ(toUniqueString("$esp"), names[4]);
++  EXPECT_EQ(toUniqueString("$eip"), names[8]);
  }
  
  TEST(RegisterNames, ARM) {
 -  vector<string> names = DwarfCFIToModule::RegisterNames::ARM();
 +  vector<const UniqueString*> names = DwarfCFIToModule::RegisterNames::ARM();
  
 -  EXPECT_EQ("r0", names[0]);
 -  EXPECT_EQ("r10", names[10]);
 -  EXPECT_EQ("sp", names[13]);
 -  EXPECT_EQ("lr", names[14]);
 -  EXPECT_EQ("pc", names[15]);
-+  EXPECT_EQ(ToUniqueString("r0"), names[0]);
-+  EXPECT_EQ(ToUniqueString("r10"), names[10]);
-+  EXPECT_EQ(ToUniqueString("sp"), names[13]);
-+  EXPECT_EQ(ToUniqueString("lr"), names[14]);
-+  EXPECT_EQ(ToUniqueString("pc"), names[15]);
++  EXPECT_EQ(toUniqueString("r0"), names[0]);
++  EXPECT_EQ(toUniqueString("r10"), names[10]);
++  EXPECT_EQ(toUniqueString("sp"), names[13]);
++  EXPECT_EQ(toUniqueString("lr"), names[14]);
++  EXPECT_EQ(toUniqueString("pc"), names[15]);
  }
  
  TEST(RegisterNames, X86_64) {
 -  vector<string> names = DwarfCFIToModule::RegisterNames::X86_64();
 +  vector<const UniqueString*> names = DwarfCFIToModule::RegisterNames::X86_64();
  
 -  EXPECT_EQ("$rax", names[0]);
 -  EXPECT_EQ("$rdx", names[1]);
 -  EXPECT_EQ("$rbp", names[6]);
 -  EXPECT_EQ("$rsp", names[7]);
 -  EXPECT_EQ("$rip", names[16]);
-+  EXPECT_EQ(ToUniqueString("$rax"), names[0]);
-+  EXPECT_EQ(ToUniqueString("$rdx"), names[1]);
-+  EXPECT_EQ(ToUniqueString("$rbp"), names[6]);
-+  EXPECT_EQ(ToUniqueString("$rsp"), names[7]);
-+  EXPECT_EQ(ToUniqueString("$rip"), names[16]);
++  EXPECT_EQ(toUniqueString("$rax"), names[0]);
++  EXPECT_EQ(toUniqueString("$rdx"), names[1]);
++  EXPECT_EQ(toUniqueString("$rbp"), names[6]);
++  EXPECT_EQ(toUniqueString("$rsp"), names[7]);
++  EXPECT_EQ(toUniqueString("$rip"), names[16]);
  }
 diff --git a/src/common/linux/dump_symbols.cc b/src/common/linux/dump_symbols.cc
 --- a/src/common/linux/dump_symbols.cc
 +++ b/src/common/linux/dump_symbols.cc
-@@ -81,6 +81,7 @@
- using google_breakpad::IsValidElf;
- using google_breakpad::Module;
- using google_breakpad::StabsToModule;
-+using google_breakpad::UniqueString;
- using google_breakpad::scoped_ptr;
- 
- //
-@@ -268,7 +269,7 @@
+@@ -268,7 +268,7 @@
  // supported.
  template<typename ElfClass>
  bool DwarfCFIRegisterNames(const typename ElfClass::Ehdr* elf_header,
 -                           std::vector<string>* register_names) {
 +                           std::vector<const UniqueString*>* register_names) {
    switch (elf_header->e_machine) {
      case EM_386:
        *register_names = DwarfCFIToModule::RegisterNames::I386();
-@@ -296,7 +297,7 @@
+@@ -296,7 +296,7 @@
                    Module* module) {
    // Find the appropriate set of register names for this file's
    // architecture.
 -  std::vector<string> register_names;
 +  std::vector<const UniqueString*> register_names;
    if (!DwarfCFIRegisterNames<ElfClass>(elf_header, &register_names)) {
      fprintf(stderr, "%s: unrecognized ELF machine architecture '%d';"
              " cannot convert DWARF call frame information\n",
@@ -852,56 +828,16 @@ diff --git a/src/common/mac/dump_syms.mm
                            bool eh_frame) const {
    // Find the appropriate set of register names for this file's
    // architecture.
 -  vector<string> register_names;
 +  vector<const UniqueString*> register_names;
    switch (macho_reader.cpu_type()) {
      case CPU_TYPE_X86:
        register_names = DwarfCFIToModule::RegisterNames::I386();
-diff --git a/src/common/module.cc b/src/common/module.cc
---- a/src/common/module.cc
-+++ b/src/common/module.cc
-@@ -38,6 +38,7 @@
- #include <stdio.h>
- #include <string.h>
- 
-+#include <algorithm>
- #include <iostream>
- #include <utility>
- 
-@@ -275,11 +276,25 @@
- }
- 
- bool Module::WriteRuleMap(const RuleMap &rule_map, std::ostream &stream) {
-+  // Visit the register rules in alphabetical order.  Because
-+  // rule_map has the elements in some arbitrary order,
-+  // get the names out into a vector, sort them, and visit in
-+  // sorted order.
-+  std::vector<const UniqueString*> rr_names;
-   for (RuleMap::const_iterator it = rule_map.begin();
-        it != rule_map.end(); ++it) {
--    if (it != rule_map.begin())
--      stream << ' ';
--    stream << it->first << ": " << it->second;
-+    rr_names.push_back(it->first);
-+  }
-+
-+  std::sort(rr_names.begin(), rr_names.end(), LessThan_UniqueString);
-+
-+  // Now visit the register rules in alphabetical order.
-+  for (std::vector<const UniqueString*>::const_iterator name = rr_names.begin();
-+       name != rr_names.end();
-+       ++name) {
-+    if (name != rr_names.begin())
-+      stream << " ";
-+    stream << FromUniqueString(*name) << ": " << rule_map.find(*name)->second;
-   }
-   return stream.good();
- }
 diff --git a/src/common/module.h b/src/common/module.h
 --- a/src/common/module.h
 +++ b/src/common/module.h
 @@ -46,6 +46,7 @@
  
  #include "common/symbol_data.h"
  #include "common/using_std_string.h"
 +#include "common/unique_string.h"
@@ -953,349 +889,298 @@ diff --git a/src/common/module.h b/src/c
 -  typedef map<string, Expr> RuleMap;
 +  typedef map<const UniqueString*, Expr> RuleMap;
  
    // A map from addresses to RuleMaps, representing changes that take
    // effect at given addresses.
 diff --git a/src/common/module_unittest.cc b/src/common/module_unittest.cc
 --- a/src/common/module_unittest.cc
 +++ b/src/common/module_unittest.cc
-@@ -45,6 +45,8 @@
- #include "common/using_std_string.h"
- 
- using google_breakpad::Module;
-+using google_breakpad::ToUniqueString;
-+using google_breakpad::ustr__ZDcfa;
- using std::stringstream;
- using std::vector;
- using testing::ContainerEq;
-@@ -130,11 +132,13 @@
+@@ -130,17 +130,20 @@
    Module::StackFrameEntry *entry = new Module::StackFrameEntry();
    entry->address = 0x30f9e5c83323973dULL;
    entry->size = 0x49fc9ca7c7c13dc2ULL;
 -  entry->initial_rules[".cfa"] = Module::Expr("he was a handsome man");
 -  entry->initial_rules["and"] = Module::Expr("what i want to know is");
 -  entry->rule_changes[0x30f9e5c83323973eULL]["how"] =
 -    Module::Expr("do you like your blueeyed boy");
 -  entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = Module::Expr("Death");
 +  entry->initial_rules[ustr__ZDcfa()] = Module::Expr("he was a handsome man");
-+  entry->initial_rules[ToUniqueString("and")] =
++  entry->initial_rules[toUniqueString("and")] =
 +      Module::Expr("what i want to know is");
-+  entry->rule_changes[0x30f9e5c83323973eULL][ToUniqueString("how")] =
++  entry->rule_changes[0x30f9e5c83323973eULL][toUniqueString("how")] =
 +      Module::Expr("do you like your blueeyed boy");
-+  entry->rule_changes[0x30f9e5c83323973eULL][ToUniqueString("Mister")] =
++  entry->rule_changes[0x30f9e5c83323973eULL][toUniqueString("Mister")] =
 +      Module::Expr("Death");
    m.AddStackFrameEntry(entry);
  
    // Set the load address.  Doing this after adding all the data to
+   // the module must work fine.
+   m.SetLoadAddress(0x2ab698b0b6407073LL);
+ 
++  /*TODO: fix this test. registers are not serialized alphabetically.
+   m.Write(s, ALL_SYMBOL_DATA);
+   string contents = s.str();
+   EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+@@ -157,6 +160,7 @@
+                " Mister: Death"
+                " how: do you like your blueeyed boy\n",
+                contents.c_str());
++  */
+ }
+ 
+ TEST(Write, OmitUnusedFiles) {
 @@ -234,11 +238,13 @@
    Module::StackFrameEntry *entry = new Module::StackFrameEntry();
    entry->address = 0x30f9e5c83323973dULL;
    entry->size = 0x49fc9ca7c7c13dc2ULL;
 -  entry->initial_rules[".cfa"] = Module::Expr("he was a handsome man");
 -  entry->initial_rules["and"] = Module::Expr("what i want to know is");
 -  entry->rule_changes[0x30f9e5c83323973eULL]["how"] =
 -    Module::Expr("do you like your blueeyed boy");
 -  entry->rule_changes[0x30f9e5c83323973eULL]["Mister"] = Module::Expr("Death");
 +  entry->initial_rules[ustr__ZDcfa()] = Module::Expr("he was a handsome man");
-+  entry->initial_rules[ToUniqueString("and")] =
++  entry->initial_rules[toUniqueString("and")] =
 +      Module::Expr("what i want to know is");
-+  entry->rule_changes[0x30f9e5c83323973eULL][ToUniqueString("how")] =
++  entry->rule_changes[0x30f9e5c83323973eULL][toUniqueString("how")] =
 +      Module::Expr("do you like your blueeyed boy");
-+  entry->rule_changes[0x30f9e5c83323973eULL][ToUniqueString("Mister")] =
++  entry->rule_changes[0x30f9e5c83323973eULL][toUniqueString("Mister")] =
 +      Module::Expr("Death");
    m.AddStackFrameEntry(entry);
  
    // Set the load address.  Doing this after adding all the data to
-@@ -310,23 +316,26 @@
+@@ -310,27 +316,31 @@
    Module::StackFrameEntry *entry2 = new Module::StackFrameEntry();
    entry2->address = 0x8064f3af5e067e38ULL;
    entry2->size = 0x0de2a5ee55509407ULL;
 -  entry2->initial_rules[".cfa"] = Module::Expr("I think that I shall never see");
 -  entry2->initial_rules["stromboli"] = Module::Expr("a poem lovely as a tree");
 -  entry2->initial_rules["cannoli"] = Module::Expr("a tree whose hungry mouth is prest");
 +  entry2->initial_rules[ustr__ZDcfa()] =
 +      Module::Expr("I think that I shall never see");
-+  entry2->initial_rules[ToUniqueString("stromboli")] =
++  entry2->initial_rules[toUniqueString("stromboli")] =
 +      Module::Expr("a poem lovely as a tree");
-+  entry2->initial_rules[ToUniqueString("cannoli")] =
++  entry2->initial_rules[toUniqueString("cannoli")] =
 +      Module::Expr("a tree whose hungry mouth is prest");
    m.AddStackFrameEntry(entry2);
  
    // Third STACK CFI entry, with initial rules and deltas.
    Module::StackFrameEntry *entry3 = new Module::StackFrameEntry();
    entry3->address = 0x5e8d0db0a7075c6cULL;
    entry3->size = 0x1c7edb12a7aea229ULL;
 -  entry3->initial_rules[".cfa"] = Module::Expr("Whose woods are these");
 -  entry3->rule_changes[0x47ceb0f63c269d7fULL]["calzone"] =
 +  entry3->initial_rules[ustr__ZDcfa()] = Module::Expr("Whose woods are these");
-+  entry3->rule_changes[0x47ceb0f63c269d7fULL][ToUniqueString("calzone")] =
++  entry3->rule_changes[0x47ceb0f63c269d7fULL][toUniqueString("calzone")] =
      Module::Expr("the village though");
 -  entry3->rule_changes[0x47ceb0f63c269d7fULL]["cannoli"] =
-+  entry3->rule_changes[0x47ceb0f63c269d7fULL][ToUniqueString("cannoli")] =
++  entry3->rule_changes[0x47ceb0f63c269d7fULL][toUniqueString("cannoli")] =
      Module::Expr("he will not see me stopping here");
 -  entry3->rule_changes[0x36682fad3763ffffULL]["stromboli"] =
-+  entry3->rule_changes[0x36682fad3763ffffULL][ToUniqueString("stromboli")] =
++  entry3->rule_changes[0x36682fad3763ffffULL][toUniqueString("stromboli")] =
      Module::Expr("his house is in");
 -  entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] =
 +  entry3->rule_changes[0x36682fad3763ffffULL][ustr__ZDcfa()] =
      Module::Expr("I think I know");
    m.AddStackFrameEntry(entry3);
  
-@@ -357,23 +366,29 @@
+   // Check that Write writes STACK CFI records properly.
++  /*TODO: fix this test
+   m.Write(s, ALL_SYMBOL_DATA);
+   string contents = s.str();
+   EXPECT_STREQ("MODULE os-name architecture id-string name with spaces\n"
+@@ -348,6 +358,7 @@
+                " stromboli: a poem lovely as a tree\n"
+                "STACK CFI INIT ddb5f41285aa7757 1486493370dc5073 \n",
+                contents.c_str());
++  */
+ 
+   // Check that GetStackFrameEntries works.
+   vector<Module::StackFrameEntry *> entries;
+@@ -357,23 +368,29 @@
    EXPECT_EQ(0x5e8d0db0a7075c6cULL, entries[0]->address);
    EXPECT_EQ(0x1c7edb12a7aea229ULL, entries[0]->size);
    Module::RuleMap entry1_initial;
 -  entry1_initial[".cfa"] = Module::Expr("Whose woods are these");
 +  entry1_initial[ustr__ZDcfa()] = Module::Expr("Whose woods are these");
    EXPECT_THAT(entries[0]->initial_rules, ContainerEq(entry1_initial));
    Module::RuleChangeMap entry1_changes;
 -  entry1_changes[0x36682fad3763ffffULL][".cfa"] = Module::Expr("I think I know");
 -  entry1_changes[0x36682fad3763ffffULL]["stromboli"] = Module::Expr("his house is in");
 -  entry1_changes[0x47ceb0f63c269d7fULL]["calzone"] = Module::Expr("the village though");
 -  entry1_changes[0x47ceb0f63c269d7fULL]["cannoli"] =
 -    Module::Expr("he will not see me stopping here");
 +  entry1_changes[0x36682fad3763ffffULL][ustr__ZDcfa()] =
 +      Module::Expr("I think I know");
-+  entry1_changes[0x36682fad3763ffffULL][ToUniqueString("stromboli")] =
++  entry1_changes[0x36682fad3763ffffULL][toUniqueString("stromboli")] =
 +      Module::Expr("his house is in");
-+  entry1_changes[0x47ceb0f63c269d7fULL][ToUniqueString("calzone")] =
++  entry1_changes[0x47ceb0f63c269d7fULL][toUniqueString("calzone")] =
 +      Module::Expr("the village though");
-+  entry1_changes[0x47ceb0f63c269d7fULL][ToUniqueString("cannoli")] =
++  entry1_changes[0x47ceb0f63c269d7fULL][toUniqueString("cannoli")] =
 +      Module::Expr("he will not see me stopping here");
    EXPECT_THAT(entries[0]->rule_changes, ContainerEq(entry1_changes));
    // Check second entry.
    EXPECT_EQ(0x8064f3af5e067e38ULL, entries[1]->address);
    EXPECT_EQ(0x0de2a5ee55509407ULL, entries[1]->size);
    ASSERT_EQ(3U, entries[1]->initial_rules.size());
    Module::RuleMap entry2_initial;
 -  entry2_initial[".cfa"] = Module::Expr("I think that I shall never see");
 -  entry2_initial["stromboli"] = Module::Expr("a poem lovely as a tree");
 -  entry2_initial["cannoli"] = Module::Expr("a tree whose hungry mouth is prest");
 +  entry2_initial[ustr__ZDcfa()] =
 +      Module::Expr("I think that I shall never see");
-+  entry2_initial[ToUniqueString("stromboli")] =
++  entry2_initial[toUniqueString("stromboli")] =
 +      Module::Expr("a poem lovely as a tree");
-+  entry2_initial[ToUniqueString("cannoli")] =
++  entry2_initial[toUniqueString("cannoli")] =
 +      Module::Expr("a tree whose hungry mouth is prest");
    EXPECT_THAT(entries[1]->initial_rules, ContainerEq(entry2_initial));
    ASSERT_EQ(0U, entries[1]->rule_changes.size());
    // Check third entry.
-@@ -590,23 +605,26 @@
+@@ -590,23 +607,26 @@
    Module::StackFrameEntry *entry2 = new Module::StackFrameEntry();
    entry2->address = 0x3000;
    entry2->size = 0x900;
 -  entry2->initial_rules[".cfa"] = Module::Expr("I think that I shall never see");
 -  entry2->initial_rules["stromboli"] = Module::Expr("a poem lovely as a tree");
 -  entry2->initial_rules["cannoli"] = Module::Expr("a tree whose hungry mouth is prest");
 +  entry2->initial_rules[ustr__ZDcfa()] =
 +      Module::Expr("I think that I shall never see");
-+  entry2->initial_rules[ToUniqueString("stromboli")] =
++  entry2->initial_rules[toUniqueString("stromboli")] =
 +      Module::Expr("a poem lovely as a tree");
-+  entry2->initial_rules[ToUniqueString("cannoli")] =
++  entry2->initial_rules[toUniqueString("cannoli")] =
 +      Module::Expr("a tree whose hungry mouth is prest");
    m.AddStackFrameEntry(entry2);
  
    // Third STACK CFI entry, with initial rules and deltas.
    Module::StackFrameEntry *entry3 = new Module::StackFrameEntry();
    entry3->address = 0x1000;
    entry3->size = 0x900;
 -  entry3->initial_rules[".cfa"] = Module::Expr("Whose woods are these");
 -  entry3->rule_changes[0x47ceb0f63c269d7fULL]["calzone"] =
 +  entry3->initial_rules[ustr__ZDcfa()] = Module::Expr("Whose woods are these");
-+  entry3->rule_changes[0x47ceb0f63c269d7fULL][ToUniqueString("calzone")] =
++  entry3->rule_changes[0x47ceb0f63c269d7fULL][toUniqueString("calzone")] =
      Module::Expr("the village though");
 -  entry3->rule_changes[0x47ceb0f63c269d7fULL]["cannoli"] =
-+  entry3->rule_changes[0x47ceb0f63c269d7fULL][ToUniqueString("cannoli")] =
++  entry3->rule_changes[0x47ceb0f63c269d7fULL][toUniqueString("cannoli")] =
      Module::Expr("he will not see me stopping here");
 -  entry3->rule_changes[0x36682fad3763ffffULL]["stromboli"] =
-+  entry3->rule_changes[0x36682fad3763ffffULL][ToUniqueString("stromboli")] =
++  entry3->rule_changes[0x36682fad3763ffffULL][toUniqueString("stromboli")] =
      Module::Expr("his house is in");
 -  entry3->rule_changes[0x36682fad3763ffffULL][".cfa"] =
 +  entry3->rule_changes[0x36682fad3763ffffULL][ustr__ZDcfa()] =
      Module::Expr("I think I know");
    m.AddStackFrameEntry(entry3);
  
 diff --git a/src/common/unique_string.cc b/src/common/unique_string.cc
 new file mode 100644
 --- /dev/null
 +++ b/src/common/unique_string.cc
-@@ -0,0 +1,110 @@
-+// Copyright (c) 2013 Google Inc.
-+// All rights reserved.
-+//
-+// Redistribution and use in source and binary forms, with or without
-+// modification, are permitted provided that the following conditions are
-+// met:
-+//
-+//     * Redistributions of source code must retain the above copyright
-+// notice, this list of conditions and the following disclaimer.
-+//     * Redistributions in binary form must reproduce the above
-+// copyright notice, this list of conditions and the following disclaimer
-+// in the documentation and/or other materials provided with the
-+// distribution.
-+//     * Neither the name of Google Inc. nor the names of its
-+// contributors may be used to endorse or promote products derived from
-+// this software without specific prior written permission.
-+//
-+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@@ -0,0 +1,75 @@
++
++#include <stdlib.h>
++#include <string.h>
++#include <stdio.h> // for debugging only
 +
 +#include <string>
 +#include <map>
-+
-+#include <stdlib.h>
-+#include <string.h>
-+
 +#include "common/unique_string.h"
 +
-+namespace google_breakpad {
-+
 +///////////////////////////////////////////////////////////////////
 +// UniqueString
 +//
 +class UniqueString {
 + public:
 +  UniqueString(string str) { str_ = strdup(str.c_str()); }
-+  ~UniqueString() { free(reinterpret_cast<void*>(const_cast<char*>(str_))); }
++  ~UniqueString() { free((void*)str_); }
 +  const char* str_;
 +};
 +
 +class UniqueStringUniverse {
 + public:
 +  UniqueStringUniverse() {};
-+  const UniqueString* FindOrCopy(string str) {
-+    std::map<string, UniqueString*>::iterator it = map_.find(str);
++  const UniqueString* findOrCopy(string str)
++  {
++    std::map<string, UniqueString*>::iterator it;
++    it = map_.find(str);
 +    if (it == map_.end()) {
 +      UniqueString* ustr = new UniqueString(str);
 +      map_[str] = ustr;
++      fprintf(stderr, "UniqueString %d = \"%s\"\n",
++              (int)map_.size(), str.c_str());
 +      return ustr;
 +    } else {
 +      return it->second;
 +    }
 +  }
 + private:
 +  std::map<string, UniqueString*> map_;
 +};
-+
 +//
 +///////////////////////////////////////////////////////////////////
 +
 +
 +static UniqueStringUniverse* sUSU = NULL;
 +
 +
 +// This isn't threadsafe.
-+const UniqueString* ToUniqueString(string str) {
++const UniqueString* toUniqueString(string str)
++{
 +  if (!sUSU) {
 +    sUSU = new UniqueStringUniverse();
 +  }
-+  return sUSU->FindOrCopy(str);
++  return sUSU->findOrCopy(str);
 +}
 +
 +// This isn't threadsafe.
-+const UniqueString* ToUniqueString_n(const char* str, size_t n) {
++const UniqueString* toUniqueString_n(char* str, size_t n)
++{
 +  if (!sUSU) {
 +    sUSU = new UniqueStringUniverse();
 +  }
-+  string key(str, n);
-+  return sUSU->FindOrCopy(key);
++  string key(str);
++  key.resize(n);
++  return sUSU->findOrCopy(key);
 +}
 +
-+const char Index(const UniqueString* us, int ix)
++const char index(const UniqueString* us, int ix)
 +{
 +  return us->str_[ix];
 +}
 +
-+const char* const FromUniqueString(const UniqueString* ustr)
++const char* const fromUniqueString(const UniqueString* ustr)
 +{
 +  return ustr->str_;
 +}
-+
-+int StrcmpUniqueString(const UniqueString* us1, const UniqueString* us2) {
-+  return strcmp(us1->str_, us2->str_);
-+}
-+
-+bool LessThan_UniqueString(const UniqueString* us1, const UniqueString* us2) {
-+  int r = StrcmpUniqueString(us1, us2);
-+  return r < 0;
-+}
-+
-+}  // namespace google_breakpad
 diff --git a/src/common/unique_string.h b/src/common/unique_string.h
 new file mode 100644
 --- /dev/null
 +++ b/src/common/unique_string.h
-@@ -0,0 +1,239 @@
-+// Copyright (c) 2013 Google Inc.
-+// All rights reserved.
-+//
-+// Redistribution and use in source and binary forms, with or without
-+// modification, are permitted provided that the following conditions are
-+// met:
-+//
-+//     * Redistributions of source code must retain the above copyright
-+// notice, this list of conditions and the following disclaimer.
-+//     * Redistributions in binary form must reproduce the above
-+// copyright notice, this list of conditions and the following disclaimer
-+// in the documentation and/or other materials provided with the
-+// distribution.
-+//     * Neither the name of Google Inc. nor the names of its
-+// contributors may be used to endorse or promote products derived from
-+// this software without specific prior written permission.
-+//
-+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@@ -0,0 +1,202 @@
 +
-+#ifndef COMMON_UNIQUE_STRING_H_
-+#define COMMON_UNIQUE_STRING_H_
++#ifndef COMMON_UNIQUE_STRING_H
++#define COMMON_UNIQUE_STRING_H
 +
 +#include <string>
 +#include "common/using_std_string.h"
 +
-+namespace google_breakpad {
-+
 +// Abstract type
 +class UniqueString;
 +
-+// Unique-ify a string.  |ToUniqueString| can never return NULL.
-+const UniqueString* ToUniqueString(string);
++// Unique-ify a string.  |toUniqueString| can never return NULL.
++const UniqueString* toUniqueString(string);
 +
 +// ditto, starting instead from the first n characters of a C string
-+const UniqueString* ToUniqueString_n(const char* str, size_t n);
++const UniqueString* toUniqueString_n(char* str, size_t n);
 +
 +// Pull chars out of the string.  No range checking.
-+const char Index(const UniqueString*, int);
++const char index(const UniqueString*, int);
 +
 +// Get the contained C string (debugging only)
-+const char* const FromUniqueString(const UniqueString*);
++const char* const fromUniqueString(const UniqueString*);
 +
-+// Do a strcmp-style comparison on the contained C string
-+int StrcmpUniqueString(const UniqueString*, const UniqueString*);
-+
-+// Less-than comparison of two UniqueStrings, usable for std::sort.
-+bool LessThan_UniqueString(const UniqueString*, const UniqueString*);
 +
 +// Some handy pre-uniqified strings.  Z is an escape character:
 +//   ZS        '$'
 +//   ZD        '.'
 +//   Zeq       '='
 +//   Zplus     '+'
 +//   Zstar     '*'
 +//   Zslash    '/'
@@ -1307,231 +1192,208 @@ new file mode 100644
 +// to be different.
 +//
 +// Unfortunately these have to be written as functions so as to
 +// make them safe to use in static initialisers.
 +
 +// ""
 +inline static const UniqueString* ustr__empty() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("");
++  if (!us) us = toUniqueString("");
 +  return us;
 +}
 +
 +// "$eip"
 +inline static const UniqueString* ustr__ZSeip() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("$eip");
++  if (!us) us = toUniqueString("$eip");
 +  return us;
 +}
 +
 +// "$ebp"
 +inline static const UniqueString* ustr__ZSebp() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("$ebp");
++  if (!us) us = toUniqueString("$ebp");
 +  return us;
 +}
 +
 +// "$esp"
 +inline static const UniqueString* ustr__ZSesp() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("$esp");
++  if (!us) us = toUniqueString("$esp");
 +  return us;
 +}
 +
 +// "$ebx"
 +inline static const UniqueString* ustr__ZSebx() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("$ebx");
++  if (!us) us = toUniqueString("$ebx");
 +  return us;
 +}
 +
 +// "$esi"
 +inline static const UniqueString* ustr__ZSesi() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("$esi");
++  if (!us) us = toUniqueString("$esi");
 +  return us;
 +}
 +
 +// "$edi"
 +inline static const UniqueString* ustr__ZSedi() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("$edi");
++  if (!us) us = toUniqueString("$edi");
 +  return us;
 +}
 +
 +// ".cbCalleeParams"
 +inline static const UniqueString* ustr__ZDcbCalleeParams() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString(".cbCalleeParams");
++  if (!us) us = toUniqueString(".cbCalleeParams");
 +  return us;
 +}
 +
 +// ".cbSavedRegs"
 +inline static const UniqueString* ustr__ZDcbSavedRegs() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString(".cbSavedRegs");
++  if (!us) us = toUniqueString(".cbSavedRegs");
 +  return us;
 +}
 +
 +// ".cbLocals"
 +inline static const UniqueString* ustr__ZDcbLocals() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString(".cbLocals");
++  if (!us) us = toUniqueString(".cbLocals");
 +  return us;
 +}
 +
 +// ".raSearchStart"
 +inline static const UniqueString* ustr__ZDraSearchStart() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString(".raSearchStart");
++  if (!us) us = toUniqueString(".raSearchStart");
 +  return us;
 +}
 +
 +// ".raSearch"
 +inline static const UniqueString* ustr__ZDraSearch() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString(".raSearch");
++  if (!us) us = toUniqueString(".raSearch");
 +  return us;
 +}
 +
 +// ".cbParams"
 +inline static const UniqueString* ustr__ZDcbParams() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString(".cbParams");
++  if (!us) us = toUniqueString(".cbParams");
 +  return us;
 +}
 +
 +// "+"
 +inline static const UniqueString* ustr__Zplus() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("+");
++  if (!us) us = toUniqueString("+");
 +  return us;
 +}
 +
 +// "-"
 +inline static const UniqueString* ustr__Zminus() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("-");
++  if (!us) us = toUniqueString("-");
 +  return us;
 +}
 +
 +// "*"
 +inline static const UniqueString* ustr__Zstar() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("*");
++  if (!us) us = toUniqueString("*");
 +  return us;
 +}
 +
 +// "/"
 +inline static const UniqueString* ustr__Zslash() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("/");
++  if (!us) us = toUniqueString("/");
 +  return us;
 +}
 +
 +// "%"
 +inline static const UniqueString* ustr__Zpercent() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("%");
++  if (!us) us = toUniqueString("%");
 +  return us;
 +}
 +
 +// "@"
 +inline static const UniqueString* ustr__Zat() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("@");
++  if (!us) us = toUniqueString("@");
 +  return us;
 +}
 +
 +// "^"
 +inline static const UniqueString* ustr__Zcaret() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("^");
++  if (!us) us = toUniqueString("^");
 +  return us;
 +}
 +
 +// "="
 +inline static const UniqueString* ustr__Zeq() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString("=");
++  if (!us) us = toUniqueString("=");
 +  return us;
 +}
 +
 +// ".cfa"
 +inline static const UniqueString* ustr__ZDcfa() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString(".cfa");
++  if (!us) us = toUniqueString(".cfa");
 +  return us;
 +}
 +
 +// ".ra"
 +inline static const UniqueString* ustr__ZDra() {
 +  static const UniqueString* us = NULL;
-+  if (!us) us = ToUniqueString(".ra");
++  if (!us) us = toUniqueString(".ra");
 +  return us;
 +}
 +
-+}  // namespace google_breakpad
-+
-+#endif  // COMMON_UNIQUE_STRING_H_
++#endif /* ndef COMMON_UNIQUE_STRING_H */
 diff --git a/src/processor/basic_source_line_resolver_unittest.cc b/src/processor/basic_source_line_resolver_unittest.cc
 --- a/src/processor/basic_source_line_resolver_unittest.cc
 +++ b/src/processor/basic_source_line_resolver_unittest.cc
-@@ -48,11 +48,20 @@
- using google_breakpad::BasicSourceLineResolver;
- using google_breakpad::CFIFrameInfo;
- using google_breakpad::CodeModule;
-+using google_breakpad::FromUniqueString;
- using google_breakpad::MemoryRegion;
- using google_breakpad::StackFrame;
-+using google_breakpad::ToUniqueString;
- using google_breakpad::WindowsFrameInfo;
- using google_breakpad::linked_ptr;
- using google_breakpad::scoped_ptr;
-+using google_breakpad::ustr__ZDcfa;
-+using google_breakpad::ustr__ZDra;
-+using google_breakpad::ustr__ZSebx;
-+using google_breakpad::ustr__ZSebp;
-+using google_breakpad::ustr__ZSedi;
-+using google_breakpad::ustr__ZSesi;
-+using google_breakpad::ustr__ZSesp;
- 
- class TestCodeModule : public CodeModule {
-  public:
-@@ -112,10 +121,10 @@
+@@ -112,10 +112,10 @@
      const CFIFrameInfo::RegisterValueMap<u_int32_t> &expected,
      const CFIFrameInfo::RegisterValueMap<u_int32_t> &actual) {
    CFIFrameInfo::RegisterValueMap<u_int32_t>::const_iterator a;
 -  a = actual.find(".cfa");
 +  a = actual.find(ustr__ZDcfa());
    if (a == actual.end())
      return false;
 -  a = actual.find(".ra");
 +  a = actual.find(ustr__ZDra());
    if (a == actual.end())
      return false;
    for (a = actual.begin(); a != actual.end(); a++) {
-@@ -123,13 +132,13 @@
+@@ -123,13 +123,13 @@
        expected.find(a->first);
      if (e == expected.end()) {
        fprintf(stderr, "%s:%d: unexpected register '%s' recovered, value 0x%x\n",
 -              file, line, a->first.c_str(), a->second);
-+              file, line, FromUniqueString(a->first), a->second);
++              file, line, fromUniqueString(a->first), a->second);
        return false;
      }
      if (e->second != a->second) {
        fprintf(stderr,
                "%s:%d: register '%s' recovered value was 0x%x, expected 0x%x\n",
 -              file, line, a->first.c_str(), a->second, e->second);
-+              file, line, FromUniqueString(a->first), a->second, e->second);
++              file, line, fromUniqueString(a->first), a->second, e->second);
        return false;
      }
      // Don't complain if this doesn't recover all registers. Although
-@@ -259,21 +268,21 @@
+@@ -259,21 +259,21 @@
  
    // Regardless of which instruction evaluation takes place at, it
    // should produce the same values for the caller's registers.
 -  expected_caller_registers[".cfa"] = 0x1001c;
 -  expected_caller_registers[".ra"]  = 0xf6438648;
 -  expected_caller_registers["$ebp"] = 0x10038;
 -  expected_caller_registers["$ebx"] = 0x98ecadc3;
 -  expected_caller_registers["$esi"] = 0x878f7524;
@@ -1554,82 +1416,74 @@ diff --git a/src/processor/basic_source_
 +  current_registers[ustr__ZSesp()] = 0x10018;
 +  current_registers[ustr__ZSebp()] = 0x10038;
 +  current_registers[ustr__ZSebx()] = 0x98ecadc3;
 +  current_registers[ustr__ZSesi()] = 0x878f7524;
 +  current_registers[ustr__ZSedi()] = 0x6312f9a5;
    cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -283,7 +292,7 @@
+@@ -283,7 +283,7 @@
                                expected_caller_registers, caller_registers));
  
    frame.instruction = 0x3d41;
 -  current_registers["$esp"] = 0x10014;
 +  current_registers[ustr__ZSesp()] = 0x10014;
    cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -293,7 +302,7 @@
+@@ -293,7 +293,7 @@
                                expected_caller_registers, caller_registers));
  
    frame.instruction = 0x3d43;
 -  current_registers["$ebp"] = 0x10014;
 +  current_registers[ustr__ZSebp()] = 0x10014;
    cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -303,7 +312,7 @@
+@@ -303,7 +303,7 @@
                    expected_caller_registers, caller_registers);
  
    frame.instruction = 0x3d54;
 -  current_registers["$ebx"] = 0x6864f054U;
 +  current_registers[ustr__ZSebx()] = 0x6864f054U;
    cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -313,7 +322,7 @@
+@@ -313,7 +313,7 @@
                    expected_caller_registers, caller_registers);
  
    frame.instruction = 0x3d5a;
 -  current_registers["$esi"] = 0x6285f79aU;
 +  current_registers[ustr__ZSesi()] = 0x6285f79aU;
    cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -323,7 +332,7 @@
+@@ -323,7 +323,7 @@
                    expected_caller_registers, caller_registers);
  
    frame.instruction = 0x3d84;
 -  current_registers["$edi"] = 0x64061449U;
 +  current_registers[ustr__ZSedi()] = 0x64061449U;
    cfi_frame_info.reset(resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
 diff --git a/src/processor/cfi_frame_info.cc b/src/processor/cfi_frame_info.cc
 --- a/src/processor/cfi_frame_info.cc
 +++ b/src/processor/cfi_frame_info.cc
-@@ -36,6 +36,7 @@
- 
- #include <string.h>
- 
-+#include <algorithm>
- #include <sstream>
- 
- #include "common/scoped_ptr.h"
-@@ -66,7 +67,7 @@
+@@ -66,7 +66,7 @@
    // Then, compute the return address.
    V ra;
    working = registers;
 -  working[".cfa"] = cfa;
 +  working[ustr__ZDcfa()] = cfa;
    if (!evaluator.EvaluateForValue(ra_rule_, &ra))
      return false;
  
-@@ -75,14 +76,14 @@
+@@ -75,14 +75,14 @@
         it != register_rules_.end(); it++) {
      V value;
      working = registers;
 -    working[".cfa"] = cfa;
 +    working[ustr__ZDcfa()] = cfa;
      if (!evaluator.EvaluateForValue(it->second, &value))
        return false;
      (*caller_registers)[it->first] = value;
@@ -1637,83 +1491,61 @@ diff --git a/src/processor/cfi_frame_inf
  
 -  (*caller_registers)[".ra"] = ra;
 -  (*caller_registers)[".cfa"] = cfa;
 +  (*caller_registers)[ustr__ZDra()] = ra;
 +  (*caller_registers)[ustr__ZDcfa()] = cfa;
  
    return true;
  }
-@@ -108,12 +109,29 @@
-       stream << " ";
-     stream << ".ra: " << ra_rule_;
-   }
-+
-+  // Visit the register rules in alphabetical order.  Because
-+  // register_rules_ has the elements in some arbitrary order,
-+  // get the names out into a vector, sort them, and visit in
-+  // sorted order.
-+  std::vector<const UniqueString*> rr_names;
-   for (RuleMap::const_iterator iter = register_rules_.begin();
-        iter != register_rules_.end();
+@@ -113,7 +113,7 @@
         ++iter) {
-+    rr_names.push_back(iter->first);
-+  }
-+
-+  std::sort(rr_names.begin(), rr_names.end(), LessThan_UniqueString);
-+
-+  // Now visit the register rules in alphabetical order.
-+  for (std::vector<const UniqueString*>::const_iterator name = rr_names.begin();
-+       name != rr_names.end();
-+       ++name) {
-+    const UniqueString* nm = *name;
-+    Module::Expr rule = register_rules_.at(nm);
      if (static_cast<std::streamoff>(stream.tellp()) != 0)
        stream << " ";
 -    stream << iter->first << ": " << iter->second;
-+    stream << FromUniqueString(nm) << ": " << rule;
++    stream << fromUniqueString(iter->first) << ": " << iter->second;
    }
  
    return stream.str();
-@@ -125,7 +143,7 @@
+@@ -125,7 +125,7 @@
    memcpy(working_copy.get(), rule_set.data(), rule_set_len);
    working_copy[rule_set_len] = '\0';
  
 -  name_.clear();
 +  name_ = ustr__empty();
    expression_.clear();
  
    char *cursor;
-@@ -142,10 +160,10 @@
+@@ -142,10 +142,10 @@
        // Names can't be empty.
        if (token_len < 2) return false;
        // If there is any pending content, report it.
 -      if (!name_.empty() || !expression_.empty()) {
 +      if (name_ != ustr__empty() || !expression_.empty()) {
          if (!Report()) return false;
        }
 -      name_.assign(token, token_len - 1);
-+      name_ = ToUniqueString_n(token, token_len - 1);
++      name_ = toUniqueString_n(token, token_len - 1);
        expression_.clear();
      } else {
        // Another expression component.
-@@ -159,9 +177,9 @@
+@@ -159,9 +159,9 @@
  }
  
  bool CFIRuleParser::Report() {
 -  if (name_.empty() || expression_.empty()) return false;
 -  if (name_ == ".cfa") handler_->CFARule(expression_);
 -  else if (name_ == ".ra") handler_->RARule(expression_);
 +  if (name_ == ustr__empty() || expression_.empty()) return false;
 +  if (name_ == ustr__ZDcfa()) handler_->CFARule(expression_);
 +  else if (name_ == ustr__ZDra()) handler_->RARule(expression_);
    else handler_->RegisterRule(name_, expression_);
    return true;
  }
-@@ -175,7 +193,7 @@
+@@ -175,7 +175,7 @@
    frame_info_->SetRARule(Module::Expr(expression));
  }
  
 -void CFIFrameInfoParseHandler::RegisterRule(const string &name,
 +void CFIFrameInfoParseHandler::RegisterRule(const UniqueString* name,
                                              const string &expression) {
    frame_info_->SetRegisterRule(name, Module::Expr(expression));
  }
@@ -1798,55 +1630,40 @@ diff --git a/src/processor/cfi_frame_inf
 -    const char *alternate_name;
 +    const UniqueString* alternate_name;
  
      // True if the callee is expected to preserve the value of this
      // register. If this flag is true for some register R, and the STACK
 diff --git a/src/processor/cfi_frame_info_unittest.cc b/src/processor/cfi_frame_info_unittest.cc
 --- a/src/processor/cfi_frame_info_unittest.cc
 +++ b/src/processor/cfi_frame_info_unittest.cc
-@@ -43,9 +43,14 @@
- using google_breakpad::CFIFrameInfo;
- using google_breakpad::CFIFrameInfoParseHandler;
- using google_breakpad::CFIRuleParser;
-+using google_breakpad::FromUniqueString;
- using google_breakpad::MemoryRegion;
- using google_breakpad::Module;
- using google_breakpad::SimpleCFIWalker;
-+using google_breakpad::ToUniqueString;
-+using google_breakpad::UniqueString;
-+using google_breakpad::ustr__ZDcfa;
-+using google_breakpad::ustr__ZDra;
- using testing::_;
- using testing::A;
- using testing::AtMost;
-@@ -112,8 +117,8 @@
+@@ -112,8 +112,8 @@
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
 -  ASSERT_EQ(330903416631436410ULL, caller_registers[".cfa"]);
 -  ASSERT_EQ(5870666104170902211ULL, caller_registers[".ra"]);
 +  ASSERT_EQ(330903416631436410ULL, caller_registers[ustr__ZDcfa()]);
 +  ASSERT_EQ(5870666104170902211ULL, caller_registers[ustr__ZDra()]);
  
    ASSERT_EQ(".cfa: 330903416631436410 .ra: 5870666104170902211",
              cfi.Serialize());
-@@ -124,19 +129,25 @@
+@@ -124,19 +124,26 @@
  
    cfi.SetCFARule(Module::Expr("$temp1 68737028 = $temp2 61072337 = $temp1 $temp2 -"));
    cfi.SetRARule(Module::Expr(".cfa 99804755 +"));
 -  cfi.SetRegisterRule("register1", Module::Expr(".cfa 54370437 *"));
 -  cfi.SetRegisterRule("vodkathumbscrewingly", Module::Expr("24076308 .cfa +"));
 -  cfi.SetRegisterRule("pubvexingfjordschmaltzy", Module::Expr(".cfa 29801007 -"));
 -  cfi.SetRegisterRule("uncopyrightables", Module::Expr("92642917 .cfa /"));
 +
-+  const UniqueString* reg1 = ToUniqueString("register1");
-+  const UniqueString* reg2 = ToUniqueString("vodkathumbscrewingly");
-+  const UniqueString* reg3 = ToUniqueString("pubvexingfjordschmaltzy");
-+  const UniqueString* reg4 = ToUniqueString("uncopyrightables");
++  const UniqueString* reg1 = toUniqueString("register1");
++  const UniqueString* reg2 = toUniqueString("vodkathumbscrewingly");
++  const UniqueString* reg3 = toUniqueString("pubvexingfjordschmaltzy");
++  const UniqueString* reg4 = toUniqueString("uncopyrightables");
 +
 +  cfi.SetRegisterRule(reg1, Module::Expr(".cfa 54370437 *"));
 +  cfi.SetRegisterRule(reg2, Module::Expr("24076308 .cfa +"));
 +  cfi.SetRegisterRule(reg3, Module::Expr(".cfa 29801007 -"));
 +  cfi.SetRegisterRule(reg4, Module::Expr("92642917 .cfa /"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(6U, caller_registers.size());
@@ -1857,111 +1674,120 @@ diff --git a/src/processor/cfi_frame_inf
 -  ASSERT_EQ(-22136316ULL,       caller_registers["pubvexingfjordschmaltzy"]);
 -  ASSERT_EQ(12U,                caller_registers["uncopyrightables"]);
 +  ASSERT_EQ(7664691U,           caller_registers[ustr__ZDcfa()]);
 +  ASSERT_EQ(107469446U,         caller_registers[ustr__ZDra()]);
 +  ASSERT_EQ(416732599139967ULL, caller_registers[reg1]);
 +  ASSERT_EQ(31740999U,          caller_registers[reg2]);
 +  ASSERT_EQ(-22136316ULL,       caller_registers[reg3]);
 +  ASSERT_EQ(12U,                caller_registers[reg4]);
++  /*TODO: fix this test, Serialize no longer serializes alphabetically
    ASSERT_EQ(".cfa: $temp1 68737028 = $temp2 61072337 = $temp1 $temp2 - "
              ".ra: .cfa 99804755 + "
              "pubvexingfjordschmaltzy: .cfa 29801007 - "
-@@ -155,8 +166,8 @@
+@@ -144,6 +151,7 @@
+             "uncopyrightables: 92642917 .cfa / "
+             "vodkathumbscrewingly: 24076308 .cfa +",
+             cfi.Serialize());
++  */
+ }
+ 
+ TEST_F(Simple, RulesOverride) {
+@@ -155,8 +163,8 @@
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
 -  ASSERT_EQ(2828089117179001ULL, caller_registers[".cfa"]);
 -  ASSERT_EQ(5870666104170902211ULL, caller_registers[".ra"]);
 +  ASSERT_EQ(2828089117179001ULL, caller_registers[ustr__ZDcfa()]);
 +  ASSERT_EQ(5870666104170902211ULL, caller_registers[ustr__ZDra()]);
    ASSERT_EQ(".cfa: 2828089117179001 .ra: 5870666104170902211",
              cfi.Serialize());
  }
-@@ -188,15 +199,17 @@
+@@ -188,15 +196,17 @@
  TEST_F(Scope, CFASeesCurrentRegs) {
    ExpectNoMemoryReferences();
  
 -  registers[".baraminology"] = 0x06a7bc63e4f13893ULL;
 -  registers[".ornithorhynchus"] = 0x5e0bf850bafce9d2ULL;
-+  const UniqueString* reg1 = ToUniqueString(".baraminology");
-+  const UniqueString* reg2 = ToUniqueString(".ornithorhynchus");
++  const UniqueString* reg1 = toUniqueString(".baraminology");
++  const UniqueString* reg2 = toUniqueString(".ornithorhynchus");
 +  registers[reg1] = 0x06a7bc63e4f13893ULL;
 +  registers[reg2] = 0x5e0bf850bafce9d2ULL;
    cfi.SetCFARule(Module::Expr(".baraminology .ornithorhynchus +"));
    cfi.SetRARule(Module::Expr("0"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
    ASSERT_EQ(0x06a7bc63e4f13893ULL + 0x5e0bf850bafce9d2ULL,
 -            caller_registers[".cfa"]);
 +            caller_registers[ustr__ZDcfa()]);
  }
  
  // .cfa should be in scope in the return address expression.
-@@ -208,7 +221,7 @@
+@@ -208,7 +218,7 @@
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
 -  ASSERT_EQ(48364076U, caller_registers[".ra"]);
 +  ASSERT_EQ(48364076U, caller_registers[ustr__ZDra()]);
  }
  
  // There should be no value for .ra in scope when evaluating the CFA rule.
-@@ -226,13 +239,14 @@
+@@ -226,13 +236,14 @@
  TEST_F(Scope, RASeesCurrentRegs) {
    ExpectNoMemoryReferences();
  
 -  registers["noachian"] = 0x54dc4a5d8e5eb503ULL;
    cfi.SetCFARule(Module::Expr("10359370"));
 -  cfi.SetRARule(Module::Expr("noachian"));
-+  const UniqueString* reg1 = ToUniqueString("noachian");
++  const UniqueString* reg1 = toUniqueString("noachian");
 +  registers[reg1] = 0x54dc4a5d8e5eb503ULL;
 +  cfi.SetRARule(Module::Expr(reg1, 0, false));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(2U, caller_registers.size());
 -  ASSERT_EQ(0x54dc4a5d8e5eb503ULL, caller_registers[".ra"]);
 +  ASSERT_EQ(0x54dc4a5d8e5eb503ULL, caller_registers[ustr__ZDra()]);
  }
  
  // .cfa should be in scope for register rules.
-@@ -241,11 +255,12 @@
+@@ -241,11 +252,12 @@
  
    cfi.SetCFARule(Module::Expr("6515179"));
    cfi.SetRARule(Module::Expr(".cfa"));
 -  cfi.SetRegisterRule("rogerian", Module::Expr(".cfa"));
-+  const UniqueString* reg1 = ToUniqueString("rogerian");
++  const UniqueString* reg1 = toUniqueString("rogerian");
 +  cfi.SetRegisterRule(reg1, Module::Expr(".cfa"));
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
    ASSERT_EQ(3U, caller_registers.size());
 -  ASSERT_EQ(6515179U, caller_registers["rogerian"]);
 +  ASSERT_EQ(6515179U, caller_registers[reg1]);
  }
  
  // The return address should not be in scope for register rules.
-@@ -254,7 +269,8 @@
+@@ -254,7 +266,8 @@
  
    cfi.SetCFARule(Module::Expr("42740329"));
    cfi.SetRARule(Module::Expr("27045204"));
 -  cfi.SetRegisterRule("$r1", Module::Expr(".ra"));
-+  const UniqueString* reg1 = ToUniqueString("$r1");
++  const UniqueString* reg1 = toUniqueString("$r1");
 +  cfi.SetRegisterRule(reg1, Module::Expr(".ra"));
    ASSERT_FALSE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                               &caller_registers));
  }
-@@ -263,17 +279,19 @@
+@@ -263,17 +276,19 @@
  TEST_F(Scope, RegsSeeRegs) {
    ExpectNoMemoryReferences();
  
 -  registers["$r1"] = 0x6ed3582c4bedb9adULL;
 -  registers["$r2"] = 0xd27d9e742b8df6d0ULL;
-+  const UniqueString* reg1 = ToUniqueString("$r1");
-+  const UniqueString* reg2 = ToUniqueString("$r2");
++  const UniqueString* reg1 = toUniqueString("$r1");
++  const UniqueString* reg2 = toUniqueString("$r2");
 +  registers[reg1] = 0x6ed3582c4bedb9adULL;
 +  registers[reg2] = 0xd27d9e742b8df6d0ULL;
    cfi.SetCFARule(Module::Expr("88239303"));
    cfi.SetRARule(Module::Expr("30503835"));
 -  cfi.SetRegisterRule("$r1", Module::Expr("$r1 42175211 = $r2"));
 -  cfi.SetRegisterRule("$r2", Module::Expr("$r2 21357221 = $r1"));
 +  cfi.SetRegisterRule(reg1, Module::Expr("$r1 42175211 = $r2"));
 +  cfi.SetRegisterRule(reg2, Module::Expr("$r2 21357221 = $r1"));
@@ -1970,90 +1796,90 @@ diff --git a/src/processor/cfi_frame_inf
    ASSERT_EQ(4U, caller_registers.size());
 -  ASSERT_EQ(0xd27d9e742b8df6d0ULL, caller_registers["$r1"]);
 -  ASSERT_EQ(0x6ed3582c4bedb9adULL, caller_registers["$r2"]);
 +  ASSERT_EQ(0xd27d9e742b8df6d0ULL, caller_registers[reg1]);
 +  ASSERT_EQ(0x6ed3582c4bedb9adULL, caller_registers[reg2]);
  }
  
  // Each rule's temporaries are separate.
-@@ -295,7 +313,7 @@
+@@ -295,7 +310,7 @@
   public:
    MOCK_METHOD1(CFARule, void(const string &));
    MOCK_METHOD1(RARule,  void(const string &));
 -  MOCK_METHOD2(RegisterRule, void(const string &, const string &));
 +  MOCK_METHOD2(RegisterRule, void(const UniqueString*, const string &));
  };
  
  // A fixture class for testing CFIRuleParser.
-@@ -366,7 +384,7 @@
+@@ -366,7 +381,7 @@
  }
  
  TEST_F(Parser, Reg) {
 -  EXPECT_CALL(mock_handler, RegisterRule("nemo", "mellifluous"))
-+  EXPECT_CALL(mock_handler, RegisterRule(ToUniqueString("nemo"), "mellifluous"))
++  EXPECT_CALL(mock_handler, RegisterRule(toUniqueString("nemo"), "mellifluous"))
        .WillOnce(Return());
    EXPECT_TRUE(parser.Parse("nemo: mellifluous"));
  }
-@@ -374,18 +392,18 @@
+@@ -374,18 +389,18 @@
  TEST_F(Parser, CFARARegs) {
    EXPECT_CALL(mock_handler, CFARule("cfa expression")).WillOnce(Return());
    EXPECT_CALL(mock_handler, RARule("ra expression")).WillOnce(Return());
 -  EXPECT_CALL(mock_handler, RegisterRule("galba", "praetorian"))
-+  EXPECT_CALL(mock_handler, RegisterRule(ToUniqueString("galba"), "praetorian"))
++  EXPECT_CALL(mock_handler, RegisterRule(toUniqueString("galba"), "praetorian"))
        .WillOnce(Return());
 -  EXPECT_CALL(mock_handler, RegisterRule("otho", "vitellius"))
-+  EXPECT_CALL(mock_handler, RegisterRule(ToUniqueString("otho"), "vitellius"))
++  EXPECT_CALL(mock_handler, RegisterRule(toUniqueString("otho"), "vitellius"))
        .WillOnce(Return());
    EXPECT_TRUE(parser.Parse(".cfa: cfa expression .ra: ra expression "
                      "galba: praetorian otho: vitellius"));
  }
  
  TEST_F(Parser, Whitespace) {
 -  EXPECT_CALL(mock_handler, RegisterRule("r1", "r1 expression"))
-+  EXPECT_CALL(mock_handler, RegisterRule(ToUniqueString("r1"), "r1 expression"))
++  EXPECT_CALL(mock_handler, RegisterRule(toUniqueString("r1"), "r1 expression"))
        .WillOnce(Return());
 -  EXPECT_CALL(mock_handler, RegisterRule("r2", "r2 expression"))
-+  EXPECT_CALL(mock_handler, RegisterRule(ToUniqueString("r2"), "r2 expression"))
++  EXPECT_CALL(mock_handler, RegisterRule(toUniqueString("r2"), "r2 expression"))
        .WillOnce(Return());
    EXPECT_TRUE(parser.Parse(" r1:\tr1\nexpression \tr2:\t\rr2\r\n "
                             "expression  \n"));
-@@ -396,21 +414,21 @@
+@@ -396,21 +411,21 @@
  }
  
  TEST_F(Parser, EmptyName) {
 -  EXPECT_CALL(mock_handler, RegisterRule("reg", _))
-+  EXPECT_CALL(mock_handler, RegisterRule(ToUniqueString("reg"), _))
++  EXPECT_CALL(mock_handler, RegisterRule(toUniqueString("reg"), _))
        .Times(AtMost(1))
        .WillRepeatedly(Return());
    EXPECT_FALSE(parser.Parse("reg: expr1 : expr2"));
  }
  
  TEST_F(Parser, RuleLoneColon) {
 -  EXPECT_CALL(mock_handler, RegisterRule("r1", "expr"))
-+  EXPECT_CALL(mock_handler, RegisterRule(ToUniqueString("r1"), "expr"))
++  EXPECT_CALL(mock_handler, RegisterRule(toUniqueString("r1"), "expr"))
        .Times(AtMost(1))
        .WillRepeatedly(Return());
    EXPECT_FALSE(parser.Parse(" r1:   expr   :"));
  }
  
  TEST_F(Parser, RegNoExprRule) {
 -  EXPECT_CALL(mock_handler, RegisterRule("r1", "expr"))
-+  EXPECT_CALL(mock_handler, RegisterRule(ToUniqueString("r1"), "expr"))
++  EXPECT_CALL(mock_handler, RegisterRule(toUniqueString("r1"), "expr"))
        .Times(AtMost(1))
        .WillRepeatedly(Return());
    EXPECT_FALSE(parser.Parse("r0: r1:   expr"));
-@@ -427,29 +445,29 @@
+@@ -427,29 +442,29 @@
  TEST_F(ParseHandler, CFARARule) {
    handler.CFARule("reg-for-cfa");
    handler.RARule("reg-for-ra");
 -  registers["reg-for-cfa"] = 0x268a9a4a3821a797ULL;
 -  registers["reg-for-ra"] = 0x6301b475b8b91c02ULL;
-+  registers[ToUniqueString("reg-for-cfa")] = 0x268a9a4a3821a797ULL;
-+  registers[ToUniqueString("reg-for-ra")] = 0x6301b475b8b91c02ULL;
++  registers[toUniqueString("reg-for-cfa")] = 0x268a9a4a3821a797ULL;
++  registers[toUniqueString("reg-for-ra")] = 0x6301b475b8b91c02ULL;
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
 -  ASSERT_EQ(0x268a9a4a3821a797ULL, caller_registers[".cfa"]);
 -  ASSERT_EQ(0x6301b475b8b91c02ULL, caller_registers[".ra"]);
 +  ASSERT_EQ(0x268a9a4a3821a797ULL, caller_registers[ustr__ZDcfa()]);
 +  ASSERT_EQ(0x6301b475b8b91c02ULL, caller_registers[ustr__ZDra()]);
  }
  
@@ -2061,127 +1887,102 @@ diff --git a/src/processor/cfi_frame_inf
    handler.CFARule("reg-for-cfa");
    handler.RARule("reg-for-ra");
 -  handler.RegisterRule("reg1", "reg-for-reg1");
 -  handler.RegisterRule("reg2", "reg-for-reg2");
 -  registers["reg-for-cfa"] = 0x268a9a4a3821a797ULL;
 -  registers["reg-for-ra"] = 0x6301b475b8b91c02ULL;
 -  registers["reg-for-reg1"] = 0x06cde8e2ff062481ULL;
 -  registers["reg-for-reg2"] = 0xff0c4f76403173e2ULL;
-+  handler.RegisterRule(ToUniqueString("reg1"), "reg-for-reg1");
-+  handler.RegisterRule(ToUniqueString("reg2"), "reg-for-reg2");
-+  registers[ToUniqueString("reg-for-cfa")] = 0x268a9a4a3821a797ULL;
-+  registers[ToUniqueString("reg-for-ra")] = 0x6301b475b8b91c02ULL;
-+  registers[ToUniqueString("reg-for-reg1")] = 0x06cde8e2ff062481ULL;
-+  registers[ToUniqueString("reg-for-reg2")] = 0xff0c4f76403173e2ULL;
++  handler.RegisterRule(toUniqueString("reg1"), "reg-for-reg1");
++  handler.RegisterRule(toUniqueString("reg2"), "reg-for-reg2");
++  registers[toUniqueString("reg-for-cfa")] = 0x268a9a4a3821a797ULL;
++  registers[toUniqueString("reg-for-ra")] = 0x6301b475b8b91c02ULL;
++  registers[toUniqueString("reg-for-reg1")] = 0x06cde8e2ff062481ULL;
++  registers[toUniqueString("reg-for-reg2")] = 0xff0c4f76403173e2ULL;
    ASSERT_TRUE(cfi.FindCallerRegs<u_int64_t>(registers, memory,
                                              &caller_registers));
 -  ASSERT_EQ(0x268a9a4a3821a797ULL, caller_registers[".cfa"]);
 -  ASSERT_EQ(0x6301b475b8b91c02ULL, caller_registers[".ra"]);
 -  ASSERT_EQ(0x06cde8e2ff062481ULL, caller_registers["reg1"]);
 -  ASSERT_EQ(0xff0c4f76403173e2ULL, caller_registers["reg2"]);
 +  ASSERT_EQ(0x268a9a4a3821a797ULL, caller_registers[ustr__ZDcfa()]);
 +  ASSERT_EQ(0x6301b475b8b91c02ULL, caller_registers[ustr__ZDra()]);
-+  ASSERT_EQ(0x06cde8e2ff062481ULL, caller_registers[ToUniqueString("reg1")]);
-+  ASSERT_EQ(0xff0c4f76403173e2ULL, caller_registers[ToUniqueString("reg2")]);
++  ASSERT_EQ(0x06cde8e2ff062481ULL, caller_registers[toUniqueString("reg1")]);
++  ASSERT_EQ(0xff0c4f76403173e2ULL, caller_registers[toUniqueString("reg2")]);
  }
  
  struct SimpleCFIWalkerFixture {
-@@ -480,13 +498,13 @@
+@@ -480,13 +495,13 @@
  
  SimpleCFIWalkerFixture::CFIWalker::RegisterSet
  SimpleCFIWalkerFixture::register_map[7] = {
 -  { "r0", NULL,   true,  R0_VALID, &RawContext::r0 },
 -  { "r1", NULL,   true,  R1_VALID, &RawContext::r1 },
 -  { "r2", NULL,   false, R2_VALID, &RawContext::r2 },
 -  { "r3", NULL,   false, R3_VALID, &RawContext::r3 },
 -  { "r4", NULL,   true,  R4_VALID, &RawContext::r4 },
 -  { "sp", ".cfa", true,  SP_VALID, &RawContext::sp },
 -  { "pc", ".ra",  true,  PC_VALID, &RawContext::pc },
-+  { ToUniqueString("r0"), NULL,   true,  R0_VALID, &RawContext::r0 },
-+  { ToUniqueString("r1"), NULL,   true,  R1_VALID, &RawContext::r1 },
-+  { ToUniqueString("r2"), NULL,   false, R2_VALID, &RawContext::r2 },
-+  { ToUniqueString("r3"), NULL,   false, R3_VALID, &RawContext::r3 },
-+  { ToUniqueString("r4"), NULL,   true,  R4_VALID, &RawContext::r4 },
-+  { ToUniqueString("sp"), ustr__ZDcfa(), true,  SP_VALID, &RawContext::sp },
-+  { ToUniqueString("pc"), ustr__ZDra(),  true,  PC_VALID, &RawContext::pc },
++  { toUniqueString("r0"), NULL,   true,  R0_VALID, &RawContext::r0 },
++  { toUniqueString("r1"), NULL,   true,  R1_VALID, &RawContext::r1 },
++  { toUniqueString("r2"), NULL,   false, R2_VALID, &RawContext::r2 },
++  { toUniqueString("r3"), NULL,   false, R3_VALID, &RawContext::r3 },
++  { toUniqueString("r4"), NULL,   true,  R4_VALID, &RawContext::r4 },
++  { toUniqueString("sp"), ustr__ZDcfa(), true,  SP_VALID, &RawContext::sp },
++  { toUniqueString("pc"), ustr__ZDra(),  true,  PC_VALID, &RawContext::pc },
  };
  
  class SimpleWalker: public SimpleCFIWalkerFixture, public Test { };
-@@ -521,8 +539,10 @@
+@@ -521,8 +536,10 @@
  
    call_frame_info.SetCFARule(Module::Expr("sp 24 +"));
    call_frame_info.SetRARule(Module::Expr(".cfa 8 - ^"));
 -  call_frame_info.SetRegisterRule("r0", Module::Expr(".cfa 24 - ^"));
 -  call_frame_info.SetRegisterRule("r1", Module::Expr("r2"));
-+  call_frame_info.SetRegisterRule(ToUniqueString("r0"),
++  call_frame_info.SetRegisterRule(toUniqueString("r0"),
 +                                  Module::Expr(".cfa 24 - ^"));
-+  call_frame_info.SetRegisterRule(ToUniqueString("r1"),
++  call_frame_info.SetRegisterRule(toUniqueString("r1"),
 +                                  Module::Expr("r2"));
  
    callee_context.r0 = 0x94e030ca79edd119ULL;
    callee_context.r1 = 0x937b4d7e95ce52d9ULL;
 diff --git a/src/processor/fast_source_line_resolver_unittest.cc b/src/processor/fast_source_line_resolver_unittest.cc
 --- a/src/processor/fast_source_line_resolver_unittest.cc
 +++ b/src/processor/fast_source_line_resolver_unittest.cc
-@@ -56,15 +56,24 @@
- using google_breakpad::SourceLineResolverBase;
- using google_breakpad::BasicSourceLineResolver;
- using google_breakpad::FastSourceLineResolver;
-+using google_breakpad::FromUniqueString;
- using google_breakpad::ModuleSerializer;
- using google_breakpad::ModuleComparer;
- using google_breakpad::CFIFrameInfo;
- using google_breakpad::CodeModule;
- using google_breakpad::MemoryRegion;
- using google_breakpad::StackFrame;
-+using google_breakpad::ToUniqueString;
- using google_breakpad::WindowsFrameInfo;
- using google_breakpad::linked_ptr;
- using google_breakpad::scoped_ptr;
-+using google_breakpad::ustr__ZDcfa;
-+using google_breakpad::ustr__ZDra;
-+using google_breakpad::ustr__ZSebx;
-+using google_breakpad::ustr__ZSebp;
-+using google_breakpad::ustr__ZSedi;
-+using google_breakpad::ustr__ZSesi;
-+using google_breakpad::ustr__ZSesp;
- 
- class TestCodeModule : public CodeModule {
-  public:
-@@ -124,10 +133,10 @@
+@@ -124,10 +124,10 @@
      const CFIFrameInfo::RegisterValueMap<u_int32_t> &expected,
      const CFIFrameInfo::RegisterValueMap<u_int32_t> &actual) {
    CFIFrameInfo::RegisterValueMap<u_int32_t>::const_iterator a;
 -  a = actual.find(".cfa");
 +  a = actual.find(ustr__ZDcfa());
    if (a == actual.end())
      return false;
 -  a = actual.find(".ra");
 +  a = actual.find(ustr__ZDra());
    if (a == actual.end())
      return false;
    for (a = actual.begin(); a != actual.end(); a++) {
-@@ -135,13 +144,13 @@
+@@ -135,13 +135,13 @@
        expected.find(a->first);
      if (e == expected.end()) {
        fprintf(stderr, "%s:%d: unexpected register '%s' recovered, value 0x%x\n",
 -              file, line, a->first.c_str(), a->second);
-+              file, line, FromUniqueString(a->first), a->second);
++              file, line, fromUniqueString(a->first), a->second);
        return false;
      }
      if (e->second != a->second) {
        fprintf(stderr,
                "%s:%d: register '%s' recovered value was 0x%x, expected 0x%x\n",
 -              file, line, a->first.c_str(), a->second, e->second);
-+              file, line, FromUniqueString(a->first), a->second, e->second);
++              file, line, fromUniqueString(a->first), a->second, e->second);
        return false;
      }
      // Don't complain if this doesn't recover all registers. Although
-@@ -287,21 +296,21 @@
+@@ -287,21 +287,21 @@
  
    // Regardless of which instruction evaluation takes place at, it
    // should produce the same values for the caller's registers.
 -  expected_caller_registers[".cfa"] = 0x1001c;
 -  expected_caller_registers[".ra"]  = 0xf6438648;
 -  expected_caller_registers["$ebp"] = 0x10038;
 -  expected_caller_registers["$ebx"] = 0x98ecadc3;
 -  expected_caller_registers["$esi"] = 0x878f7524;
@@ -2204,53 +2005,53 @@ diff --git a/src/processor/fast_source_l
 +  current_registers[ustr__ZSesp()] = 0x10018;
 +  current_registers[ustr__ZSebp()] = 0x10038;
 +  current_registers[ustr__ZSebx()] = 0x98ecadc3;
 +  current_registers[ustr__ZSesi()] = 0x878f7524;
 +  current_registers[ustr__ZSedi()] = 0x6312f9a5;
    cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -311,7 +320,7 @@
+@@ -311,7 +311,7 @@
                                expected_caller_registers, caller_registers));
  
    frame.instruction = 0x3d41;
 -  current_registers["$esp"] = 0x10014;
 +  current_registers[ustr__ZSesp()] = 0x10014;
    cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -321,7 +330,7 @@
+@@ -321,7 +321,7 @@
                                expected_caller_registers, caller_registers));
  
    frame.instruction = 0x3d43;
 -  current_registers["$ebp"] = 0x10014;
 +  current_registers[ustr__ZSebp()] = 0x10014;
    cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -331,7 +340,7 @@
+@@ -331,7 +331,7 @@
                    expected_caller_registers, caller_registers);
  
    frame.instruction = 0x3d54;
 -  current_registers["$ebx"] = 0x6864f054U;
 +  current_registers[ustr__ZSebx()] = 0x6864f054U;
    cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -341,7 +350,7 @@
+@@ -341,7 +341,7 @@
                    expected_caller_registers, caller_registers);
  
    frame.instruction = 0x3d5a;
 -  current_registers["$esi"] = 0x6285f79aU;
 +  current_registers[ustr__ZSesi()] = 0x6285f79aU;
    cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
-@@ -351,7 +360,7 @@
+@@ -351,7 +351,7 @@
                    expected_caller_registers, caller_registers);
  
    frame.instruction = 0x3d84;
 -  current_registers["$edi"] = 0x64061449U;
 +  current_registers[ustr__ZSedi()] = 0x64061449U;
    cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame));
    ASSERT_TRUE(cfi_frame_info.get());
    ASSERT_TRUE(cfi_frame_info.get()
@@ -2283,30 +2084,30 @@ diff --git a/src/processor/postfix_evalu
 +    const UniqueString* identifier;
      if (PopValueOrIdentifier(NULL, &identifier) != POP_RESULT_IDENTIFIER) {
        BPLOG(ERROR) << "PopValueOrIdentifier returned a value, but an "
                        "identifier is needed to assign " <<
                        HexString(value) << ": " << expression;
        return false;
      }
 -    if (identifier.empty() || identifier[0] != '$') {
-+    if (identifier == ustr__empty() || Index(identifier,0) != '$') {
++    if (identifier == ustr__empty() || index(identifier,0) != '$') {
        BPLOG(ERROR) << "Can't assign " << HexString(value) << " to " <<
                        identifier << ": " << expression;
        return false;
 @@ -192,11 +194,30 @@
      if (assigned)
        (*assigned)[identifier] = true;
    } else {
 -    // The token is not an operator, it's a literal value or an identifier.
 -    // Push it onto the stack as-is.  Use push_back instead of PushValue
 -    // because PushValue pushes ValueType as a string, but token is already
 -    // a string.
 -    stack_.push_back(token);
-+    // Push it onto the stack as-is, but first convert it either to a
++    // Push it onto the stack as-is, but first convert it either to a 
 +    // ValueType (if a literal) or to a UniqueString* (if an identifier).
 +    //
 +    // First, try to treat the value as a literal. Literals may have leading
 +    // '-' sign, and the entire remaining string must be parseable as
 +    // ValueType. If this isn't possible, it can't be a literal, so treat it
 +    // as an identifier instead.
 +    //
 +    // Some versions of the libstdc++, the GNU standard C++ library, have
@@ -2318,17 +2119,17 @@ diff --git a/src/processor/postfix_evalu
 +    bool negative = false;
 +    if (token_stream.peek() == '-') {
 +      negative = true;
 +      token_stream.get();
 +    }
 +    if (token_stream >> literal && token_stream.peek() == EOF) {
 +      PushValue(negative ? (-literal) : literal);
 +    } else {
-+      PushIdentifier(ToUniqueString(token));
++      PushIdentifier(toUniqueString(token));
 +    }
    }
    return true;
  }
 @@ -241,7 +262,7 @@
    }
  
    // Ensure that the stack is cleared before returning.
@@ -2406,17 +2207,17 @@ diff --git a/src/processor/postfix_evalu
    PopResult result;
    if ((result = PopValueOrIdentifier(&literal, &token)) == POP_RESULT_FAIL) {
      return false;
 @@ -379,7 +378,8 @@
      if (iterator == dictionary_->end()) {
        // The identifier wasn't found in the dictionary.  Don't imply any
        // default value, just fail.
 -      BPLOG(INFO) << "Identifier " << token << " not in dictionary";
-+      BPLOG(INFO) << "Identifier " << FromUniqueString(token)
++      BPLOG(INFO) << "Identifier " << fromUniqueString(token)
 +                  << " not in dictionary";
        return false;
      }
  
 @@ -399,9 +399,14 @@
  
  template<typename ValueType>
  void PostfixEvaluator<ValueType>::PushValue(const ValueType &value) {
@@ -2496,74 +2297,51 @@ diff --git a/src/processor/postfix_evalu
 -  vector<string> stack_;
 +  vector<StackElem<ValueType> > stack_;
  };
  
  }  // namespace google_breakpad
 diff --git a/src/processor/postfix_evaluator_unittest.cc b/src/processor/postfix_evaluator_unittest.cc
 --- a/src/processor/postfix_evaluator_unittest.cc
 +++ b/src/processor/postfix_evaluator_unittest.cc
-@@ -48,8 +48,22 @@
- 
- 
- using std::map;
-+using google_breakpad::FromUniqueString;
- using google_breakpad::MemoryRegion;
- using google_breakpad::PostfixEvaluator;
-+using google_breakpad::ToUniqueString;
-+using google_breakpad::UniqueString;
-+using google_breakpad::ustr__ZDcbParams;
-+using google_breakpad::ustr__ZDcbSavedRegs;
-+using google_breakpad::ustr__ZDcfa;
-+using google_breakpad::ustr__ZDra;
-+using google_breakpad::ustr__ZDraSearchStart;
-+using google_breakpad::ustr__ZSebx;
-+using google_breakpad::ustr__ZSebp;
-+using google_breakpad::ustr__ZSedi;
-+using google_breakpad::ustr__ZSeip;
-+using google_breakpad::ustr__ZSesi;
-+using google_breakpad::ustr__ZSesp;
- 
- 
- // FakeMemoryRegion is used to test PostfixEvaluator's dereference (^)
-@@ -100,7 +114,7 @@
+@@ -100,7 +100,7 @@
  
    // Identifiers and their expected values upon completion of the Evaluate
    // tests in the set.
 -  map<string, unsigned int> *validate_data;
 +  map<const UniqueString*, unsigned int> *validate_data;
  };
  
  
-@@ -152,29 +166,29 @@
+@@ -152,29 +152,29 @@
      { "$rAlign 36 8 @ =",  true },   // $rAlign = 36 @ 8
      { "$rAdd3 2 2 + =$rMul2 9 6 * =", true } // smashed-equals tokenization
    };
 -  map<string, unsigned int> validate_data_0;
 -  validate_data_0["$rAdd"]   = 8;
 -  validate_data_0["$rAdd2"]  = 4;
 -  validate_data_0["$rSub"]   = 3;
 -  validate_data_0["$rMul"]   = 54;
 -  validate_data_0["$rDivQ"]  = 1;
 -  validate_data_0["$rDivM"]  = 3;
 -  validate_data_0["$rDeref"] = 10;
 -  validate_data_0["$rAlign"] = 32;
 -  validate_data_0["$rAdd3"]  = 4;
 -  validate_data_0["$rMul2"]  = 54;
 +  map<const UniqueString*, unsigned int> validate_data_0;
-+  validate_data_0[ToUniqueString("$rAdd")]   = 8;
-+  validate_data_0[ToUniqueString("$rAdd2")]  = 4;
-+  validate_data_0[ToUniqueString("$rSub")]   = 3;
-+  validate_data_0[ToUniqueString("$rMul")]   = 54;
-+  validate_data_0[ToUniqueString("$rDivQ")]  = 1;
-+  validate_data_0[ToUniqueString("$rDivM")]  = 3;
-+  validate_data_0[ToUniqueString("$rDeref")] = 10;
-+  validate_data_0[ToUniqueString("$rAlign")] = 32;
-+  validate_data_0[ToUniqueString("$rAdd3")]  = 4;
-+  validate_data_0[ToUniqueString("$rMul2")]  = 54;
++  validate_data_0[toUniqueString("$rAdd")]   = 8;
++  validate_data_0[toUniqueString("$rAdd2")]  = 4;
++  validate_data_0[toUniqueString("$rSub")]   = 3;
++  validate_data_0[toUniqueString("$rMul")]   = 54;
++  validate_data_0[toUniqueString("$rDivQ")]  = 1;
++  validate_data_0[toUniqueString("$rDivM")]  = 3;
++  validate_data_0[toUniqueString("$rDeref")] = 10;
++  validate_data_0[toUniqueString("$rAlign")] = 32;
++  validate_data_0[toUniqueString("$rAdd3")]  = 4;
++  validate_data_0[toUniqueString("$rMul2")]  = 54;
  
    // The second test set simulates a couple of MSVC program strings.
    // The data is fudged a little bit because the tests use FakeMemoryRegion
    // instead of a real stack snapshot, but the program strings are real and
    // the implementation doesn't know or care that the data is not real.
    PostfixEvaluator<unsigned int>::DictionaryType dictionary_1;
 -  dictionary_1["$ebp"] = 0xbfff0010;
 -  dictionary_1["$eip"] = 0x10000000;
@@ -2575,48 +2353,48 @@ diff --git a/src/processor/postfix_evalu
 +  dictionary_1[ustr__ZSeip()] = 0x10000000;
 +  dictionary_1[ustr__ZSesp()] = 0xbfff0000;
 +  dictionary_1[ustr__ZDcbSavedRegs()] = 4;
 +  dictionary_1[ustr__ZDcbParams()] = 4;
 +  dictionary_1[ustr__ZDraSearchStart()] = 0xbfff0020;
    const EvaluateTest evaluate_tests_1[] = {
      { "$T0 $ebp = $eip $T0 4 + ^ = $ebp $T0 ^ = $esp $T0 8 + = "
        "$L $T0 .cbSavedRegs - = $P $T0 8 + .cbParams + =", true },
-@@ -193,18 +207,18 @@
+@@ -193,18 +193,18 @@
        "$ebx $T0 28 - ^ =",
        true }
    };
 -  map<string, unsigned int> validate_data_1;
 -  validate_data_1["$T0"]  = 0xbfff0012;
 -  validate_data_1["$T1"]  = 0xbfff0020;
 -  validate_data_1["$T2"]  = 0xbfff0019;
 -  validate_data_1["$eip"] = 0xbfff0021;
 -  validate_data_1["$ebp"] = 0xbfff0012;
 -  validate_data_1["$esp"] = 0xbfff0024;
 -  validate_data_1["$L"]   = 0xbfff000e;
 -  validate_data_1["$P"]   = 0xbfff0028;
 -  validate_data_1["$ebx"] = 0xbffefff7;
 -  validate_data_1[".cbSavedRegs"] = 4;
 -  validate_data_1[".cbParams"] = 4;
 +  map<const UniqueString*, unsigned int> validate_data_1;
-+  validate_data_1[ToUniqueString("$T0")]  = 0xbfff0012;
-+  validate_data_1[ToUniqueString("$T1")]  = 0xbfff0020;
-+  validate_data_1[ToUniqueString("$T2")]  = 0xbfff0019;
++  validate_data_1[toUniqueString("$T0")]  = 0xbfff0012;
++  validate_data_1[toUniqueString("$T1")]  = 0xbfff0020;
++  validate_data_1[toUniqueString("$T2")]  = 0xbfff0019;
 +  validate_data_1[ustr__ZSeip()] = 0xbfff0021;
 +  validate_data_1[ustr__ZSebp()] = 0xbfff0012;
 +  validate_data_1[ustr__ZSesp()] = 0xbfff0024;
-+  validate_data_1[ToUniqueString("$L")]   = 0xbfff000e;
-+  validate_data_1[ToUniqueString("$P")]   = 0xbfff0028;
++  validate_data_1[toUniqueString("$L")]   = 0xbfff000e;
++  validate_data_1[toUniqueString("$P")]   = 0xbfff0028;
 +  validate_data_1[ustr__ZSebx()] = 0xbffefff7;
 +  validate_data_1[ustr__ZDcbSavedRegs()] = 4;
 +  validate_data_1[ustr__ZDcbParams()] = 4;
  
    EvaluateTestSet evaluate_test_sets[] = {
      { &dictionary_0, evaluate_tests_0,
-@@ -256,14 +270,16 @@
+@@ -256,14 +256,16 @@
      }
  
      // Validate the results.
 -    for (map<string, unsigned int>::const_iterator validate_iterator =
 +    for (map<const UniqueString*, unsigned int>::const_iterator
 +            validate_iterator =
              evaluate_test_set->validate_data->begin();
          validate_iterator != evaluate_test_set->validate_data->end();
@@ -2626,52 +2404,52 @@ diff --git a/src/processor/postfix_evalu
        unsigned int expected_value = validate_iterator->second;
  
 -      map<string, unsigned int>::const_iterator dictionary_iterator =
 +      map<const UniqueString*, unsigned int>::const_iterator
 +          dictionary_iterator =
            evaluate_test_set->dictionary->find(identifier);
  
        // The identifier must exist in the dictionary.
-@@ -272,7 +288,7 @@
+@@ -272,7 +274,7 @@
                          "validate identifier \"%s\", "
                          "expected %d, observed not found\n",
                  evaluate_test_set_index, evaluate_test_set_count,
 -                identifier.c_str(), expected_value);
-+                FromUniqueString(identifier), expected_value);
++                fromUniqueString(identifier), expected_value);
          return false;
        }
  
-@@ -283,13 +299,13 @@
+@@ -283,13 +285,13 @@
                          "validate identifier \"%s\", "
                          "expected %d, observed %d\n",
                  evaluate_test_set_index, evaluate_test_set_count,
 -                identifier.c_str(), expected_value, observed_value);
-+                FromUniqueString(identifier), expected_value, observed_value);
++                fromUniqueString(identifier), expected_value, observed_value);
          return false;
        }
  
        // The value must be set in the "assigned" dictionary if it was a
        // variable.  It must not have been assigned if it was a constant.
 -      bool expected_assigned = identifier[0] == '$';
-+      bool expected_assigned = FromUniqueString(identifier)[0] == '$';
++      bool expected_assigned = fromUniqueString(identifier)[0] == '$';
        bool observed_assigned = false;
        PostfixEvaluator<unsigned int>::DictionaryValidityType::const_iterator
            iterator_assigned = assigned.find(identifier);
-@@ -301,7 +317,8 @@
+@@ -301,7 +303,8 @@
                          "validate assignment of \"%s\", "
                          "expected %d, observed %d\n",
                  evaluate_test_set_index, evaluate_test_set_count,
 -                identifier.c_str(), expected_assigned, observed_assigned);
-+                FromUniqueString(identifier), expected_assigned,
++                fromUniqueString(identifier), expected_assigned,
 +                observed_assigned);
          return false;
        }
      }
-@@ -309,12 +326,12 @@
+@@ -309,12 +312,12 @@
  
    // EvaluateForValue tests.
    PostfixEvaluator<unsigned int>::DictionaryType dictionary_2;
 -  dictionary_2["$ebp"] = 0xbfff0010;
 -  dictionary_2["$eip"] = 0x10000000;
 -  dictionary_2["$esp"] = 0xbfff0000;
 -  dictionary_2[".cbSavedRegs"] = 4;
 -  dictionary_2[".cbParams"] = 4;
@@ -2680,165 +2458,165 @@ diff --git a/src/processor/postfix_evalu
 +  dictionary_2[ustr__ZSeip()] = 0x10000000;
 +  dictionary_2[ustr__ZSesp()] = 0xbfff0000;
 +  dictionary_2[ustr__ZDcbSavedRegs()] = 4;
 +  dictionary_2[ustr__ZDcbParams()] = 4;
 +  dictionary_2[ustr__ZDraSearchStart()] = 0xbfff0020;
    const EvaluateForValueTest evaluate_for_value_tests_2[] = {
      { "28907223",               true,  28907223 },      // simple constant
      { "89854293 40010015 +",    true,  89854293 + 40010015 }, // arithmetic
-@@ -329,14 +346,14 @@
+@@ -329,14 +332,14 @@
    const int evaluate_for_value_tests_2_size
        = (sizeof (evaluate_for_value_tests_2)
           / sizeof (evaluate_for_value_tests_2[0]));
 -  map<string, unsigned int> validate_data_2;
 -  validate_data_2["$eip"] = 0x10000000;
 -  validate_data_2["$ebp"] = 0xbfff000c;
 -  validate_data_2["$esp"] = 0xbfff0000;
 -  validate_data_2["$new"] = 0x10000000;
 -  validate_data_2[".cbSavedRegs"] = 4;
 -  validate_data_2[".cbParams"] = 4;
 -  validate_data_2[".raSearchStart"] = 0xbfff0020;
 +  map<const UniqueString*, unsigned int> validate_data_2;
 +  validate_data_2[ustr__ZSeip()] = 0x10000000;
 +  validate_data_2[ustr__ZSebp()] = 0xbfff000c;
 +  validate_data_2[ustr__ZSesp()] = 0xbfff0000;
-+  validate_data_2[ToUniqueString("$new")] = 0x10000000;
++  validate_data_2[toUniqueString("$new")] = 0x10000000;
 +  validate_data_2[ustr__ZDcbSavedRegs()] = 4;
 +  validate_data_2[ustr__ZDcbParams()] = 4;
 +  validate_data_2[ustr__ZDraSearchStart()] = 0xbfff0020;
  
    postfix_evaluator.set_dictionary(&dictionary_2);
    for (int i = 0; i < evaluate_for_value_tests_2_size; i++) {
-@@ -358,30 +375,33 @@
+@@ -358,30 +361,33 @@
      }
    }
  
 -  for (map<string, unsigned int>::iterator v = validate_data_2.begin();
 +  for (map<const UniqueString*, unsigned int>::iterator v =
 +         validate_data_2.begin();
         v != validate_data_2.end(); v++) {
 -    map<string, unsigned int>::iterator a = dictionary_2.find(v->first);
 +    map<const UniqueString*, unsigned int>::iterator a =
 +        dictionary_2.find(v->first);
      if (a == dictionary_2.end()) {
        fprintf(stderr, "FAIL: evaluate for value dictionary check: "
                "expected dict[\"%s\"] to be 0x%x, but it was unset\n",
 -              v->first.c_str(), v->second);
-+              FromUniqueString(v->first), v->second);
++              fromUniqueString(v->first), v->second);
        return false;
      } else if (a->second != v->second) {
        fprintf(stderr, "FAIL: evaluate for value dictionary check: "
                "expected dict[\"%s\"] to be 0x%x, but it was 0x%x\n",
 -              v->first.c_str(), v->second, a->second);
-+              FromUniqueString(v->first), v->second, a->second);
++              fromUniqueString(v->first), v->second, a->second);
        return false;
      } 
      dictionary_2.erase(a);
    }
    
 -  map<string, unsigned int>::iterator remaining = dictionary_2.begin();
 +  map<const UniqueString*, unsigned int>::iterator remaining =
 +      dictionary_2.begin();
    if (remaining != dictionary_2.end()) {
      fprintf(stderr, "FAIL: evaluation of test expressions put unexpected "
              "values in dictionary:\n");
      for (; remaining != dictionary_2.end(); remaining++)
        fprintf(stderr, "    dict[\"%s\"] == 0x%x\n",
 -              remaining->first.c_str(), remaining->second);
-+              FromUniqueString(remaining->first), remaining->second);
++              fromUniqueString(remaining->first), remaining->second);
      return false;
    }
  
 diff --git a/src/processor/stackwalker_amd64.cc b/src/processor/stackwalker_amd64.cc
 --- a/src/processor/stackwalker_amd64.cc
 +++ b/src/processor/stackwalker_amd64.cc
 @@ -54,39 +54,39 @@
    // flags here really means that the walker should assume they're
    // unchanged if the CFI doesn't mention them --- clearly wrong for $rip
    // and $rsp.
 -  { "$rax", NULL, false,
-+  { ToUniqueString("$rax"), NULL, false,
++  { toUniqueString("$rax"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_RAX, &MDRawContextAMD64::rax },
 -  { "$rdx", NULL, false,
-+  { ToUniqueString("$rdx"), NULL, false,
++  { toUniqueString("$rdx"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_RDX, &MDRawContextAMD64::rdx },
 -  { "$rcx", NULL, false,
-+  { ToUniqueString("$rcx"), NULL, false,
++  { toUniqueString("$rcx"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_RCX, &MDRawContextAMD64::rcx },
 -  { "$rbx", NULL, true,
-+  { ToUniqueString("$rbx"), NULL, true,
++  { toUniqueString("$rbx"), NULL, true,
      StackFrameAMD64::CONTEXT_VALID_RBX, &MDRawContextAMD64::rbx },
 -  { "$rsi", NULL, false,
-+  { ToUniqueString("$rsi"), NULL, false,
++  { toUniqueString("$rsi"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_RSI, &MDRawContextAMD64::rsi },
 -  { "$rdi", NULL, false,
-+  { ToUniqueString("$rdi"), NULL, false,
++  { toUniqueString("$rdi"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_RDI, &MDRawContextAMD64::rdi },
 -  { "$rbp", NULL, true,
-+  { ToUniqueString("$rbp"), NULL, true,
++  { toUniqueString("$rbp"), NULL, true,
      StackFrameAMD64::CONTEXT_VALID_RBP, &MDRawContextAMD64::rbp },
 -  { "$rsp", ".cfa", false,
-+  { ToUniqueString("$rsp"), ToUniqueString(".cfa"), false,
++  { toUniqueString("$rsp"), toUniqueString(".cfa"), false,
      StackFrameAMD64::CONTEXT_VALID_RSP, &MDRawContextAMD64::rsp },
 -  { "$r8", NULL, false,
-+  { ToUniqueString("$r8"), NULL, false,
++  { toUniqueString("$r8"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_R8,  &MDRawContextAMD64::r8 },
 -  { "$r9", NULL, false,
-+  { ToUniqueString("$r9"), NULL, false,
++  { toUniqueString("$r9"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_R9,  &MDRawContextAMD64::r9 },
 -  { "$r10", NULL, false,
-+  { ToUniqueString("$r10"), NULL, false,
++  { toUniqueString("$r10"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_R10, &MDRawContextAMD64::r10 },
 -  { "$r11", NULL, false,
-+  { ToUniqueString("$r11"), NULL, false,
++  { toUniqueString("$r11"), NULL, false,
      StackFrameAMD64::CONTEXT_VALID_R11, &MDRawContextAMD64::r11 },
 -  { "$r12", NULL, true,
-+  { ToUniqueString("$r12"), NULL, true,
++  { toUniqueString("$r12"), NULL, true,
      StackFrameAMD64::CONTEXT_VALID_R12, &MDRawContextAMD64::r12 },
 -  { "$r13", NULL, true,
-+  { ToUniqueString("$r13"), NULL, true,
++  { toUniqueString("$r13"), NULL, true,
      StackFrameAMD64::CONTEXT_VALID_R13, &MDRawContextAMD64::r13 },
 -  { "$r14", NULL, true,
-+  { ToUniqueString("$r14"), NULL, true,
++  { toUniqueString("$r14"), NULL, true,
      StackFrameAMD64::CONTEXT_VALID_R14, &MDRawContextAMD64::r14 },
 -  { "$r15", NULL, true,
-+  { ToUniqueString("$r15"), NULL, true,
++  { toUniqueString("$r15"), NULL, true,
      StackFrameAMD64::CONTEXT_VALID_R15, &MDRawContextAMD64::r15 },
 -  { "$rip", ".ra", false,
-+  { ToUniqueString("$rip"), ToUniqueString(".ra"), false,
++  { toUniqueString("$rip"), toUniqueString(".ra"), false,
      StackFrameAMD64::CONTEXT_VALID_RIP, &MDRawContextAMD64::rip },
  };
  
 diff --git a/src/processor/stackwalker_arm.cc b/src/processor/stackwalker_arm.cc
 --- a/src/processor/stackwalker_arm.cc
 +++ b/src/processor/stackwalker_arm.cc
 @@ -81,11 +81,20 @@
      CFIFrameInfo* cfi_frame_info) {
    StackFrameARM* last_frame = static_cast<StackFrameARM*>(frames.back());
  
 -  static const char* register_names[] = {
 -    "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",
 -    "r8",  "r9",  "r10", "r11", "r12", "sp",  "lr",  "pc",
 -    "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
 -    "fps", "cpsr",
 +  static const UniqueString *register_names[] = {
-+    ToUniqueString("r0"),  ToUniqueString("r1"),
-+    ToUniqueString("r2"),  ToUniqueString("r3"),
-+    ToUniqueString("r4"),  ToUniqueString("r5"),
-+    ToUniqueString("r6"),  ToUniqueString("r7"),
-+    ToUniqueString("r8"),  ToUniqueString("r9"),
-+    ToUniqueString("r10"), ToUniqueString("r11"),
-+    ToUniqueString("r12"), ToUniqueString("sp"),
-+    ToUniqueString("lr"),  ToUniqueString("pc"),
-+    ToUniqueString("f0"),  ToUniqueString("f1"),
-+    ToUniqueString("f2"),  ToUniqueString("f3"),
-+    ToUniqueString("f4"),  ToUniqueString("f5"),
-+    ToUniqueString("f6"),  ToUniqueString("f7"),
-+    ToUniqueString("fps"), ToUniqueString("cpsr"),
++    toUniqueString("r0"),  toUniqueString("r1"),
++    toUniqueString("r2"),  toUniqueString("r3"),
++    toUniqueString("r4"),  toUniqueString("r5"),
++    toUniqueString("r6"),  toUniqueString("r7"),
++    toUniqueString("r8"),  toUniqueString("r9"),
++    toUniqueString("r10"), toUniqueString("r11"),
++    toUniqueString("r12"), toUniqueString("sp"),
++    toUniqueString("lr"),  toUniqueString("pc"),
++    toUniqueString("f0"),  toUniqueString("f1"),
++    toUniqueString("f2"),  toUniqueString("f3"),
++    toUniqueString("f4"),  toUniqueString("f5"),
++    toUniqueString("f6"),  toUniqueString("f7"),
++    toUniqueString("fps"), toUniqueString("cpsr"),
      NULL
    };
  
 @@ -124,7 +133,7 @@
    // If the CFI doesn't recover the PC explicitly, then use .ra.
    if (!(frame->context_validity & StackFrameARM::CONTEXT_VALID_PC)) {
      CFIFrameInfo::RegisterValueMap<u_int32_t>::iterator entry =
 -      caller_registers.find(".ra");
@@ -2858,41 +2636,41 @@ diff --git a/src/processor/stackwalker_a
 diff --git a/src/processor/stackwalker_x86.cc b/src/processor/stackwalker_x86.cc
 --- a/src/processor/stackwalker_x86.cc
 +++ b/src/processor/stackwalker_x86.cc
 @@ -58,23 +58,23 @@
    // restored upon return. But the callee_saves flags here really means
    // that the walker should assume they're unchanged if the CFI doesn't
    // mention them, which is clearly wrong for $eip and $esp.
 -  { "$eip", ".ra",  false,
-+  { ToUniqueString("$eip"), ToUniqueString(".ra"),  false,
++  { toUniqueString("$eip"), toUniqueString(".ra"),  false,
      StackFrameX86::CONTEXT_VALID_EIP, &MDRawContextX86::eip },
 -  { "$esp", ".cfa", false,
-+  { ToUniqueString("$esp"), ToUniqueString(".cfa"), false,
++  { toUniqueString("$esp"), toUniqueString(".cfa"), false,
      StackFrameX86::CONTEXT_VALID_ESP, &MDRawContextX86::esp },
 -  { "$ebp", NULL,   true,
-+  { ToUniqueString("$ebp"), NULL,   true,
++  { toUniqueString("$ebp"), NULL,   true,
      StackFrameX86::CONTEXT_VALID_EBP, &MDRawContextX86::ebp },
 -  { "$eax", NULL,   false,
-+  { ToUniqueString("$eax"), NULL,   false,
++  { toUniqueString("$eax"), NULL,   false,
      StackFrameX86::CONTEXT_VALID_EAX, &MDRawContextX86::eax },
 -  { "$ebx", NULL,   true,
-+  { ToUniqueString("$ebx"), NULL,   true,
++  { toUniqueString("$ebx"), NULL,   true,
      StackFrameX86::CONTEXT_VALID_EBX, &MDRawContextX86::ebx },
 -  { "$ecx", NULL,   false,
-+  { ToUniqueString("$ecx"), NULL,   false,
++  { toUniqueString("$ecx"), NULL,   false,
      StackFrameX86::CONTEXT_VALID_ECX, &MDRawContextX86::ecx },
 -  { "$edx", NULL,   false,
-+  { ToUniqueString("$edx"), NULL,   false,
++  { toUniqueString("$edx"), NULL,   false,
      StackFrameX86::CONTEXT_VALID_EDX, &MDRawContextX86::edx },
 -  { "$esi", NULL,   true,
-+  { ToUniqueString("$esi"), NULL,   true,
++  { toUniqueString("$esi"), NULL,   true,
      StackFrameX86::CONTEXT_VALID_ESI, &MDRawContextX86::esi },
 -  { "$edi", NULL,   true,
-+  { ToUniqueString("$edi"), NULL,   true,
++  { toUniqueString("$edi"), NULL,   true,
      StackFrameX86::CONTEXT_VALID_EDI, &MDRawContextX86::edi },
  };
  
 @@ -199,16 +199,16 @@
    // here.
    PostfixEvaluator<u_int32_t>::DictionaryType dictionary;
    // Provide the current register values.
 -  dictionary["$ebp"] = last_frame->context.ebp;
@@ -3032,87 +2810,60 @@ diff --git a/src/processor/stackwalker_x
 +  if (dictionary_validity.find(ustr__ZSedi()) != dictionary_validity.end()) {
 +    frame->context.edi = dictionary[ustr__ZSedi()];
      frame->context_validity |= StackFrameX86::CONTEXT_VALID_EDI;
    }
  
 diff --git a/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj b/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
 --- a/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
 +++ b/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
-@@ -103,6 +103,12 @@
+@@ -103,6 +103,9 @@
  		D21F97D711CBA12300239E38 /* test_assembler_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D9116CEC0600407530 /* test_assembler_unittest.cc */; };
  		D21F97D811CBA13D00239E38 /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; };
  		D21F97E911CBA1FF00239E38 /* test_assembler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE0911665B5700407530 /* test_assembler.cc */; };
 +		D24997CC16B6C16800E588C5 /* unique_string.cc in Sources */ = {isa = PBXBuildFile; fileRef = D24997CA16B6C16800E588C5 /* unique_string.cc */; };
 +		D24997CD16B6C16800E588C5 /* unique_string.cc in Sources */ = {isa = PBXBuildFile; fileRef = D24997CA16B6C16800E588C5 /* unique_string.cc */; };
 +		D24997CE16B6C16800E588C5 /* unique_string.cc in Sources */ = {isa = PBXBuildFile; fileRef = D24997CA16B6C16800E588C5 /* unique_string.cc */; };
-+		D2499A0016B9BA6A00E588C5 /* unique_string.cc in Sources */ = {isa = PBXBuildFile; fileRef = D24997CA16B6C16800E588C5 /* unique_string.cc */; };
-+		D2499A0216B9BA9600E588C5 /* unique_string.cc in Sources */ = {isa = PBXBuildFile; fileRef = D24997CA16B6C16800E588C5 /* unique_string.cc */; };
-+		D2499A0316B9BA9D00E588C5 /* unique_string.cc in Sources */ = {isa = PBXBuildFile; fileRef = D24997CA16B6C16800E588C5 /* unique_string.cc */; };
  /* End PBXBuildFile section */
  
  /* Begin PBXContainerItemProxy section */
-@@ -343,6 +349,8 @@
+@@ -343,6 +346,8 @@
  		B8C5B5111166531A00D34F4E /* dump_syms */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dump_syms; sourceTree = BUILT_PRODUCTS_DIR; };
  		B8E8CA0C1156C854009E61B2 /* byteswap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = byteswap.h; path = ../../../common/mac/byteswap.h; sourceTree = SOURCE_ROOT; };
  		D21F97D211CBA0F200239E38 /* test_assembler_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = test_assembler_unittest; sourceTree = BUILT_PRODUCTS_DIR; };
 +		D24997CA16B6C16800E588C5 /* unique_string.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = unique_string.cc; path = ../../../common/unique_string.cc; sourceTree = "<group>"; };
 +		D24997CB16B6C16800E588C5 /* unique_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = unique_string.h; path = ../../../common/unique_string.h; sourceTree = "<group>"; };
  		F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "bytereader-inl.h"; path = "../../../common/dwarf/bytereader-inl.h"; sourceTree = SOURCE_ROOT; };
  		F95B422C0E0E22D100DBDE83 /* bytereader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = bytereader.cc; path = ../../../common/dwarf/bytereader.cc; sourceTree = SOURCE_ROOT; };
  		F95B422D0E0E22D100DBDE83 /* bytereader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bytereader.h; path = ../../../common/dwarf/bytereader.h; sourceTree = SOURCE_ROOT; };
-@@ -536,6 +544,8 @@
+@@ -536,6 +541,8 @@
  		B88FAE1C11665FFD00407530 /* MODULE */ = {
  			isa = PBXGroup;
  			children = (
 +				D24997CA16B6C16800E588C5 /* unique_string.cc */,
 +				D24997CB16B6C16800E588C5 /* unique_string.h */,
  				B88FAE1E1166603300407530 /* dwarf_cu_to_module.cc */,
  				B88FAE1F1166603300407530 /* dwarf_cu_to_module.h */,
  				B88FB0D6116CEC0600407530 /* dwarf_cu_to_module_unittest.cc */,
-@@ -945,6 +955,7 @@
- 			isa = PBXSourcesBuildPhase;
- 			buildActionMask = 2147483647;
- 			files = (
-+				D2499A0216B9BA9600E588C5 /* unique_string.cc in Sources */,
- 				B84A91FB116CF7AF006C210E /* module.cc in Sources */,
- 				B84A91FC116CF7AF006C210E /* stabs_to_module.cc in Sources */,
- 				B84A91FD116CF7AF006C210E /* stabs_to_module_unittest.cc in Sources */,
-@@ -988,6 +999,7 @@
+@@ -988,6 +995,7 @@
  			files = (
  				B88FB0BD116CEAE000407530 /* module_unittest.cc in Sources */,
  				B88FB0C4116CEB4100407530 /* module.cc in Sources */,
 +				D24997CE16B6C16800E588C5 /* unique_string.cc in Sources */,
  			);
  			runOnlyForDeploymentPostprocessing = 0;
  		};
-@@ -1004,6 +1016,7 @@
- 			isa = PBXSourcesBuildPhase;
- 			buildActionMask = 2147483647;
- 			files = (
-+				D2499A0316B9BA9D00E588C5 /* unique_string.cc in Sources */,
- 				B88FB0FA116CF00E00407530 /* dwarf_line_to_module.cc in Sources */,
- 				B88FB0FE116CF02400407530 /* module.cc in Sources */,
- 				B88FB0FB116CF00E00407530 /* dwarf_line_to_module_unittest.cc in Sources */,
-@@ -1014,6 +1027,7 @@
- 			isa = PBXSourcesBuildPhase;
- 			buildActionMask = 2147483647;
- 			files = (
-+				D2499A0016B9BA6A00E588C5 /* unique_string.cc in Sources */,
- 				B88FB112116CF1F000407530 /* dwarf_cu_to_module.cc in Sources */,
- 				B88FB113116CF1F000407530 /* dwarf_cu_to_module_unittest.cc in Sources */,
- 				B88FB114116CF1F000407530 /* language.cc in Sources */,
-@@ -1028,6 +1042,7 @@
+@@ -1028,6 +1036,7 @@
  				B88FB129116CF2DD00407530 /* module.cc in Sources */,
  				B88FB12A116CF2DD00407530 /* dwarf_cfi_to_module.cc in Sources */,
  				B88FB12B116CF2DD00407530 /* dwarf_cfi_to_module_unittest.cc in Sources */,
 +				D24997CD16B6C16800E588C5 /* unique_string.cc in Sources */,
  			);
  			runOnlyForDeploymentPostprocessing = 0;
  		};
-@@ -1091,6 +1106,7 @@
+@@ -1091,6 +1100,7 @@
  				B88FAE3B11666C6F00407530 /* stabs_reader.cc in Sources */,
  				B88FAE3E11666C8900407530 /* stabs_to_module.cc in Sources */,
  				4D72CAF513DFBAC2006CABE3 /* md5.cc in Sources */,
 +				D24997CC16B6C16800E588C5 /* unique_string.cc in Sources */,
  			);
  			runOnlyForDeploymentPostprocessing = 0;
  		};