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