141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Copyright (c) 2010, Google Inc.
241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// All rights reserved.
341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com//
441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Redistribution and use in source and binary forms, with or without
541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// modification, are permitted provided that the following conditions are
641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// met:
741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com//
841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com//     * Redistributions of source code must retain the above copyright
941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// notice, this list of conditions and the following disclaimer.
1041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com//     * Redistributions in binary form must reproduce the above
1141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// copyright notice, this list of conditions and the following disclaimer
1241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// in the documentation and/or other materials provided with the
1341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// distribution.
1441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com//     * Neither the name of Google Inc. nor the names of its
1541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// contributors may be used to endorse or promote products derived from
1641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// this software without specific prior written permission.
1741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com//
1841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com//
3041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// module_comparer.cc: ModuleComparer implementation.
3141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// See module_comparer.h for documentation.
3241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com//
3341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Author: lambxsy@google.com (Siyang Xie)
3441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
3541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/module_comparer.h"
3641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
3741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include <map>
3841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include <string>
3941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
402cc15ba4327831f917ff55b87e6d5fc3c7750085ted.mielczarek@gmail.com#include "common/scoped_ptr.h"
4141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/basic_code_module.h"
4241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/logging.h"
4341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
4441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#define ASSERT_TRUE(condition) \
4541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  if (!(condition)) { \
4641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    BPLOG(ERROR) << "FAIL: " << #condition << " @ " \
4741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com                 << __FILE__ << ":" << __LINE__; \
4841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    return false; \
4941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
5041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
5141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#define ASSERT_FALSE(condition) ASSERT_TRUE(!(condition))
5241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
5341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comnamespace google_breakpad {
5441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
5541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.combool ModuleComparer::Compare(const string &symbol_data) {
56bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com  scoped_ptr<BasicModule> basic_module(new BasicModule("test_module"));
57bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com  scoped_ptr<FastModule> fast_module(new FastModule("test_module"));
5841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
59bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com  // Load symbol data into basic_module
60bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com  scoped_array<char> buffer(new char[symbol_data.size() + 1]);
612d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  memcpy(buffer.get(), symbol_data.c_str(), symbol_data.size());
622d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  buffer.get()[symbol_data.size()] = '\0';
632d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  ASSERT_TRUE(basic_module->LoadMapFromMemory(buffer.get(),
642d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com                                              symbol_data.size() + 1));
65bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com  buffer.reset();
6641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
6741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Serialize BasicSourceLineResolver::Module.
6841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  unsigned int serialized_size = 0;
69bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com  scoped_array<char> serialized_data(
70bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com      serializer_.Serialize(*(basic_module.get()), &serialized_size));
71bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com  ASSERT_TRUE(serialized_data.get());
7241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  BPLOG(INFO) << "Serialized size = " << serialized_size << " Bytes";
7341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
7441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Load FastSourceLineResolver::Module using serialized data.
752d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  ASSERT_TRUE(fast_module->LoadMapFromMemory(serialized_data.get(),
762d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com                                             serialized_size));
772d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com  ASSERT_TRUE(fast_module->IsCorrupt() == basic_module->IsCorrupt());
7841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
7941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Compare FastSourceLineResolver::Module with
8041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // BasicSourceLineResolver::Module.
81bbd8e82a7fa12d8c56882ec6a9d6d42bebd7983cSiyangXie@gmail.com  ASSERT_TRUE(CompareModule(basic_module.get(), fast_module.get()));
8241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
8341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  return true;
8441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}
8541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
8641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Traversal the content of module and do comparison
8741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.combool ModuleComparer::CompareModule(const BasicModule *basic_module,
8841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com                                  const FastModule *fast_module) const {
8941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Compare name_.
9041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_module->name_ == fast_module->name_);
9141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
9241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Compare files_:
9341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  {
9441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    BasicModule::FileMap::const_iterator iter1 = basic_module->files_.begin();
9541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    FastModule::FileMap::iterator iter2 = fast_module->files_.begin();
9641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    while (iter1 != basic_module->files_.end()
9741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com        && iter2 != fast_module->files_.end()) {
9841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->first == iter2.GetKey());
9941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      string tmp(iter2.GetValuePtr());
10041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->second == tmp);
10141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter1;
10241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter2;
10341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    }
10441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter1 == basic_module->files_.end());
10541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter2 == fast_module->files_.end());
10641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
10741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
10841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Compare functions_:
10941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  {
11041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    RangeMap<MemAddr, linked_ptr<BasicFunc> >::MapConstIterator iter1;
11141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    StaticRangeMap<MemAddr, FastFunc>::MapConstIterator iter2;
11241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter1 = basic_module->functions_.map_.begin();
11341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter2 = fast_module->functions_.map_.begin();
11441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    while (iter1 != basic_module->functions_.map_.end()
11541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com        && iter2 != fast_module->functions_.map_.end()) {
11641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->first == iter2.GetKey());
11741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base());
11841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(CompareFunction(
11941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com          iter1->second.entry().get(), iter2.GetValuePtr()->entryptr()));
12041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter1;
12141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter2;
12241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    }
12341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter1 == basic_module->functions_.map_.end());
12441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter2 == fast_module->functions_.map_.end());
12541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
12641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
12741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Compare public_symbols_:
12841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  {
12941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    AddressMap<MemAddr, linked_ptr<BasicPubSymbol> >::MapConstIterator iter1;
13041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    StaticAddressMap<MemAddr, FastPubSymbol>::MapConstIterator iter2;
13141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter1 = basic_module->public_symbols_.map_.begin();
13241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter2 = fast_module->public_symbols_.map_.begin();
13341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    while (iter1 != basic_module->public_symbols_.map_.end()
13441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com          && iter2 != fast_module->public_symbols_.map_.end()) {
13541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->first == iter2.GetKey());
13641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(ComparePubSymbol(
13741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com          iter1->second.get(), iter2.GetValuePtr()));
13841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter1;
13941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter2;
14041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    }
14141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter1 == basic_module->public_symbols_.map_.end());
14241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter2 == fast_module->public_symbols_.map_.end());
14341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
14441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
14541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Compare windows_frame_info_[]:
14641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  for (int i = 0; i < WindowsFrameInfo::STACK_INFO_LAST; ++i) {
14741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(CompareCRM(&(basic_module->windows_frame_info_[i]),
14841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com                           &(fast_module->windows_frame_info_[i])));
14941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
15041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
15141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Compare cfi_initial_rules_:
15241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  {
15341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    RangeMap<MemAddr, string>::MapConstIterator iter1;
15441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    StaticRangeMap<MemAddr, char>::MapConstIterator iter2;
15541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter1 = basic_module->cfi_initial_rules_.map_.begin();
15641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter2 = fast_module->cfi_initial_rules_.map_.begin();
15741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    while (iter1 != basic_module->cfi_initial_rules_.map_.end()
15841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com        && iter2 != fast_module->cfi_initial_rules_.map_.end()) {
15941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->first == iter2.GetKey());
16041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base());
16141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      string tmp(iter2.GetValuePtr()->entryptr());
16241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->second.entry() == tmp);
16341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter1;
16441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter2;
16541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    }
16641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter1 == basic_module->cfi_initial_rules_.map_.end());
16741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter2 == fast_module->cfi_initial_rules_.map_.end());
16841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
16941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
17041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // Compare cfi_delta_rules_:
17141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  {
17241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    map<MemAddr, string>::const_iterator iter1;
17341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    StaticMap<MemAddr, char>::iterator iter2;
17441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter1 = basic_module->cfi_delta_rules_.begin();
17541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter2 = fast_module->cfi_delta_rules_.begin();
17641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    while (iter1 != basic_module->cfi_delta_rules_.end()
17741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com        && iter2 != fast_module->cfi_delta_rules_.end()) {
17841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->first == iter2.GetKey());
17941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      string tmp(iter2.GetValuePtr());
18041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->second == tmp);
18141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter1;
18241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter2;
18341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    }
18441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter1 == basic_module->cfi_delta_rules_.end());
18541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter2 == fast_module->cfi_delta_rules_.end());
18641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
18741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
18841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  return true;
18941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}
19041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
19141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.combool ModuleComparer::CompareFunction(const BasicFunc *basic_func,
19241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com                                    const FastFunc *fast_func_raw) const {
19341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  FastFunc* fast_func = new FastFunc();
19441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  fast_func->CopyFrom(fast_func_raw);
19541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_func->name == fast_func->name);
19641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_func->address == fast_func->address);
19741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_func->size == fast_func->size);
19841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
19941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  // compare range map of lines:
20041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  RangeMap<MemAddr, linked_ptr<BasicLine> >::MapConstIterator iter1;
20141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  StaticRangeMap<MemAddr, FastLine>::MapConstIterator iter2;
20241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  iter1 = basic_func->lines.map_.begin();
20341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  iter2 = fast_func->lines.map_.begin();
20441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  while (iter1 != basic_func->lines.map_.end()
20541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      && iter2 != fast_func->lines.map_.end()) {
20641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter1->first == iter2.GetKey());
20741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter1->second.base() == iter2.GetValuePtr()->base());
20841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(CompareLine(iter1->second.entry().get(),
20941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com                            iter2.GetValuePtr()->entryptr()));
21041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ++iter1;
21141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ++iter2;
21241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
21341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(iter1 == basic_func->lines.map_.end());
21441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(iter2 == fast_func->lines.map_.end());
21541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
21641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  delete fast_func;
21741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  return true;
21841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}
21941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
22041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.combool ModuleComparer::CompareLine(const BasicLine *basic_line,
22141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com                                const FastLine *fast_line_raw) const {
22241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  FastLine *fast_line = new FastLine;
22341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  fast_line->CopyFrom(fast_line_raw);
22441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
22541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_line->address == fast_line->address);
22641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_line->size == fast_line->size);
22741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_line->source_file_id == fast_line->source_file_id);
22841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_line->line == fast_line->line);
22941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
23041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  delete fast_line;
23141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  return true;
23241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}
23341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
23441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.combool ModuleComparer::ComparePubSymbol(const BasicPubSymbol* basic_ps,
23541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com                                     const FastPubSymbol* fastps_raw) const {
23641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  FastPubSymbol *fast_ps = new FastPubSymbol;
23741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  fast_ps->CopyFrom(fastps_raw);
23841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_ps->name == fast_ps->name);
23941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_ps->address == fast_ps->address);
24041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_ps->parameter_size == fast_ps->parameter_size);
24141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  delete fast_ps;
24241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  return true;
24341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}
24441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
24541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.combool ModuleComparer::CompareWFI(const WindowsFrameInfo& wfi1,
24641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com                               const WindowsFrameInfo& wfi2) const {
2472660caa1ad5b57ffa763a68c3b96abc10e7f16feivan.penkov@gmail.com  ASSERT_TRUE(wfi1.type_ == wfi2.type_);
24841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.valid == wfi2.valid);
24941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.prolog_size == wfi2.prolog_size);
25041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.epilog_size == wfi2.epilog_size);
25141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.parameter_size == wfi2.parameter_size);
25241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.saved_register_size == wfi2.saved_register_size);
25341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.local_size == wfi2.local_size);
25441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.max_stack_size == wfi2.max_stack_size);
25541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.allocates_base_pointer == wfi2.allocates_base_pointer);
25641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(wfi1.program_string == wfi2.program_string);
25741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  return true;
25841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}
25941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
26041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Compare ContainedRangeMap
26141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.combool ModuleComparer::CompareCRM(
26241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    const ContainedRangeMap<MemAddr, linked_ptr<WFI> >* basic_crm,
26341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    const StaticContainedRangeMap<MemAddr, char>* fast_crm) const {
26441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  ASSERT_TRUE(basic_crm->base_ == fast_crm->base_);
26541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
26641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  if (!basic_crm->entry_.get() || !fast_crm->entry_ptr_) {
26741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    // empty entry:
26841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(!basic_crm->entry_.get() && !fast_crm->entry_ptr_);
26941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  } else {
27041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    WFI newwfi;
27141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    newwfi.CopyFrom(fast_resolver_->CopyWFI(fast_crm->entry_ptr_));
27241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(CompareWFI(*(basic_crm->entry_.get()), newwfi));
27341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
27441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
27541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  if ((!basic_crm->map_ || basic_crm->map_->empty())
27641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      || fast_crm->map_.empty()) {
27741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE((!basic_crm->map_ || basic_crm->map_->empty())
27841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com               && fast_crm->map_.empty());
27941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  } else {
28041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ContainedRangeMap<MemAddr, linked_ptr<WFI> >::MapConstIterator iter1;
28141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    StaticContainedRangeMap<MemAddr, char>::MapConstIterator iter2;
28241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter1 = basic_crm->map_->begin();
28341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    iter2 = fast_crm->map_.begin();
28441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    while (iter1 != basic_crm->map_->end()
28541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com        && iter2 != fast_crm->map_.end()) {
28641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(iter1->first == iter2.GetKey());
28741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      StaticContainedRangeMap<MemAddr, char> *child =
28841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com          new StaticContainedRangeMap<MemAddr, char>(
28941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com              reinterpret_cast<const char*>(iter2.GetValuePtr()));
29041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ASSERT_TRUE(CompareCRM(iter1->second, child));
29141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      delete child;
29241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter1;
29341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com      ++iter2;
29441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    }
29541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter1 == basic_crm->map_->end());
29641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com    ASSERT_TRUE(iter2 == fast_crm->map_.end());
29741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  }
29841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
29941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com  return true;
30041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}
30141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com
30241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}  // namespace google_breakpad
303