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 id22617
push useremorley@mozilla.com
push dateThu, 07 Feb 2013 18:14:19 +0000
treeherdermozilla-inbound@c4b69b5d4189 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs839126
milestone21.0a1
backs outcd02e40945d646631060324b0d6aa64d3cfd6066
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
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 */,