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// fast_source_line_resolver_unittest.cc: Unit tests for FastSourceLineResolver. 3141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Two different approaches for testing fast source line resolver: 3241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// First, use the same unit test data for basic source line resolver. 3341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Second, read data from symbol files, load them as basic modules, and then 3441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// serialize them and load the serialized data as fast modules. Then compare 3541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// modules to assure the fast module contains exactly the same data as 3641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// basic module. 3741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// 3841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Author: Siyang Xie (lambxsy@google.com) 3941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 40c5e242b8cd4280db5162e5a3084f2dc9e16e8ffbmmandlis@chromium.org#include <assert.h> 4141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include <stdio.h> 4241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 4341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include <sstream> 4441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include <string> 4541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 4641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "breakpad_googletest_includes.h" 474e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h" 4841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "google_breakpad/processor/code_module.h" 4941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "google_breakpad/processor/stack_frame.h" 5041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "google_breakpad/processor/memory_region.h" 5141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/logging.h" 5241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/module_serializer.h" 5341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/module_comparer.h" 5441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 5541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comnamespace { 5641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 5741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::SourceLineResolverBase; 5841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::BasicSourceLineResolver; 5941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::FastSourceLineResolver; 6041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::ModuleSerializer; 6141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::ModuleComparer; 6241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::CFIFrameInfo; 6341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::CodeModule; 6441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::MemoryRegion; 6541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::StackFrame; 6641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::WindowsFrameInfo; 6741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::linked_ptr; 6841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::scoped_ptr; 6941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 7041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comclass TestCodeModule : public CodeModule { 7141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com public: 7241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com explicit TestCodeModule(string code_file) : code_file_(code_file) {} 7341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual ~TestCodeModule() {} 7441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 756162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com virtual uint64_t base_address() const { return 0; } 766162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com virtual uint64_t size() const { return 0xb000; } 7741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string code_file() const { return code_file_; } 7841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string code_identifier() const { return ""; } 7941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string debug_file() const { return ""; } 8041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string debug_identifier() const { return ""; } 8141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string version() const { return ""; } 8241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual const CodeModule* Copy() const { 8341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return new TestCodeModule(code_file_); 8441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 8541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 8641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com private: 8741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string code_file_; 8841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}; 8941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 9041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// A mock memory region object, for use by the STACK CFI tests. 9141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comclass MockMemoryRegion: public MemoryRegion { 926162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint64_t GetBase() const { return 0x10000; } 936162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com uint32_t GetSize() const { return 0x01000; } 946162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com bool GetMemoryAtAddress(uint64_t address, uint8_t *value) const { 9541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com *value = address & 0xff; 9641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 9741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 986162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com bool GetMemoryAtAddress(uint64_t address, uint16_t *value) const { 9941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com *value = address & 0xffff; 10041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 10141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 1026162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com bool GetMemoryAtAddress(uint64_t address, uint32_t *value) const { 10341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com switch (address) { 10441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x10008: *value = 0x98ecadc3; break; // saved %ebx 10541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x1000c: *value = 0x878f7524; break; // saved %esi 10641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x10010: *value = 0x6312f9a5; break; // saved %edi 10741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x10014: *value = 0x10038; break; // caller's %ebp 10841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x10018: *value = 0xf6438648; break; // return address 10941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com default: *value = 0xdeadbeef; break; // junk 11041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 11141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 11241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 1136162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com bool GetMemoryAtAddress(uint64_t address, uint64_t *value) const { 11441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com *value = address; 11541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 11641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 117c5e242b8cd4280db5162e5a3084f2dc9e16e8ffbmmandlis@chromium.org void Print() const { 118c5e242b8cd4280db5162e5a3084f2dc9e16e8ffbmmandlis@chromium.org assert(false); 119c5e242b8cd4280db5162e5a3084f2dc9e16e8ffbmmandlis@chromium.org } 12041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}; 12141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 12241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Verify that, for every association in ACTUAL, EXPECTED has the same 12341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// association. (That is, ACTUAL's associations should be a subset of 12441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// EXPECTED's.) Also verify that ACTUAL has associations for ".ra" and 12541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// ".cfa". 12641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comstatic bool VerifyRegisters( 12741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com const char *file, int line, 1286162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const CFIFrameInfo::RegisterValueMap<uint32_t> &expected, 1296162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com const CFIFrameInfo::RegisterValueMap<uint32_t> &actual) { 1306162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com CFIFrameInfo::RegisterValueMap<uint32_t>::const_iterator a; 13141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com a = actual.find(".cfa"); 13241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (a == actual.end()) 13341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 13441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com a = actual.find(".ra"); 13541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (a == actual.end()) 13641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 13741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com for (a = actual.begin(); a != actual.end(); a++) { 1386162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com CFIFrameInfo::RegisterValueMap<uint32_t>::const_iterator e = 13941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected.find(a->first); 14041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (e == expected.end()) { 14141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fprintf(stderr, "%s:%d: unexpected register '%s' recovered, value 0x%x\n", 14241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com file, line, a->first.c_str(), a->second); 14341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 14441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 14541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (e->second != a->second) { 14641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fprintf(stderr, 14741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com "%s:%d: register '%s' recovered value was 0x%x, expected 0x%x\n", 14841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com file, line, a->first.c_str(), a->second, e->second); 14941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 15041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 15141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Don't complain if this doesn't recover all registers. Although 15241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // the DWARF spec says that unmentioned registers are undefined, 15341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // GCC uses omission to mean that they are unchanged. 15441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 15541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 15641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 15741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 15841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comstatic bool VerifyEmpty(const StackFrame &frame) { 15941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (frame.function_name.empty() && 16041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.source_file_name.empty() && 16141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.source_line == 0) 16241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 16341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 16441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 16541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 16641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comstatic void ClearSourceLineInfo(StackFrame *frame) { 16741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame->function_name.clear(); 16841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame->module = NULL; 16941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame->source_file_name.clear(); 17041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame->source_line = 0; 17141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 17241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 17341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comclass TestFastSourceLineResolver : public ::testing::Test { 17441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com public: 17541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com void SetUp() { 17641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com testdata_dir = string(getenv("srcdir") ? getenv("srcdir") : ".") + 17741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com "/src/processor/testdata"; 17841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 17941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 18041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string symbol_file(int file_index) { 18141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com std::stringstream ss; 18241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ss << testdata_dir << "/module" << file_index << ".out"; 18341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return ss.str(); 18441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 18541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 18641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ModuleSerializer serializer; 18741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com BasicSourceLineResolver basic_resolver; 18841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com FastSourceLineResolver fast_resolver; 18941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ModuleComparer module_comparer; 19041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 19141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string testdata_dir; 19241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}; 19341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 19441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Test adapted from basic_source_line_resolver_unittest. 19541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comTEST_F(TestFastSourceLineResolver, TestLoadAndResolve) { 19641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module1("module1"); 19741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1))); 19841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module1)); 19941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module1 to fast_module: 20041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(serializer.ConvertOneModule( 20141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com module1.code_file(), &basic_resolver, &fast_resolver)); 20241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module1)); 20341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 20441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module2("module2"); 20541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module2, symbol_file(2))); 20641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module2)); 20741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module2 to fast_module: 20841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(serializer.ConvertOneModule( 20941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com module2.code_file(), &basic_resolver, &fast_resolver)); 21041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module2)); 21141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 21241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com StackFrame frame; 21341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com scoped_ptr<WindowsFrameInfo> windows_frame_info; 21441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com scoped_ptr<CFIFrameInfo> cfi_frame_info; 21541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x1000; 21641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = NULL; 21741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 21841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(frame.module); 21941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.function_name.empty()); 2202971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(frame.function_base, 0U); 22141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.source_file_name.empty()); 22241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 0); 2232971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(frame.source_line_base, 0U); 22441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 22541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 22641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 22741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Function1_1"); 22841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.module); 22941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.module->code_file(), "module1"); 2302971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(frame.function_base, 0x1000U); 23141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_file_name, "file1_1.cc"); 23241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 44); 2332971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(frame.source_line_base, 0x1000U); 23441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 23541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info.get()); 23641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info->allocates_base_pointer); 23741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(windows_frame_info->program_string, 23841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com "$eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ ="); 23941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 24041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ClearSourceLineInfo(&frame); 24141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x800; 24241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 24341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 24441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(VerifyEmpty(frame)); 24541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 24641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info.get()); 24741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 24841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x1280; 24941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 25041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Function1_3"); 25141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.source_file_name.empty()); 25241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 0); 25341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 25441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info.get()); 2552660caa1ad5b57ffa763a68c3b96abc10e7f16feivan.penkov@gmail.com ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_UNKNOWN); 25641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info->allocates_base_pointer); 25741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info->program_string.empty()); 25841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 25941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x1380; 26041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 26141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Function1_4"); 26241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.source_file_name.empty()); 26341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 0); 26441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 26541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info.get()); 2662660caa1ad5b57ffa763a68c3b96abc10e7f16feivan.penkov@gmail.com ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA); 26741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info->allocates_base_pointer); 26841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info->program_string.empty()); 26941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 27041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x2000; 27141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 27241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info.get()); 27341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 27441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // module1 has STACK CFI records covering 3d40..3def; 27541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // module2 has STACK CFI records covering 3df0..3e9f; 27641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // check that FindCFIFrameInfo doesn't claim to find any outside those ranges. 27741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d3f; 27841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 27941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 28041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(cfi_frame_info.get()); 28141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 28241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3e9f; 28341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 28441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 28541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(cfi_frame_info.get()); 28641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 2876162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com CFIFrameInfo::RegisterValueMap<uint32_t> current_registers; 2886162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com CFIFrameInfo::RegisterValueMap<uint32_t> caller_registers; 2896162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com CFIFrameInfo::RegisterValueMap<uint32_t> expected_caller_registers; 29041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com MockMemoryRegion memory; 29141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 29241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Regardless of which instruction evaluation takes place at, it 29341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // should produce the same values for the caller's registers. 29441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers[".cfa"] = 0x1001c; 29541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers[".ra"] = 0xf6438648; 29641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers["$ebp"] = 0x10038; 29741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers["$ebx"] = 0x98ecadc3; 29841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers["$esi"] = 0x878f7524; 29941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers["$edi"] = 0x6312f9a5; 30041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 30141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d40; 30241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 30341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers.clear(); 30441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$esp"] = 0x10018; 30541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$ebp"] = 0x10038; 30641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$ebx"] = 0x98ecadc3; 30741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$esi"] = 0x878f7524; 30841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$edi"] = 0x6312f9a5; 30941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 31041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 31141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 3126162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ->FindCallerRegs<uint32_t>(current_registers, memory, 31341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 31441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__, 31541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers)); 31641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 31741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d41; 31841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$esp"] = 0x10014; 31941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 32041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 32141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 3226162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ->FindCallerRegs<uint32_t>(current_registers, memory, 32341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 32441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__, 32541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers)); 32641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 32741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d43; 32841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$ebp"] = 0x10014; 32941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 33041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 33141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 3326162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ->FindCallerRegs<uint32_t>(current_registers, memory, 33341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 33441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com VerifyRegisters(__FILE__, __LINE__, 33541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers); 33641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 33741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d54; 33841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$ebx"] = 0x6864f054U; 33941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 34041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 34141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 3426162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ->FindCallerRegs<uint32_t>(current_registers, memory, 34341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 34441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com VerifyRegisters(__FILE__, __LINE__, 34541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers); 34641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 34741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d5a; 34841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$esi"] = 0x6285f79aU; 34941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 35041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 35141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 3526162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ->FindCallerRegs<uint32_t>(current_registers, memory, 35341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 35441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com VerifyRegisters(__FILE__, __LINE__, 35541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers); 35641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 35741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d84; 35841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$edi"] = 0x64061449U; 35941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 36041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 36141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 3626162aed3c3fcfc53373c963ac375d39a5dfa5a25ted.mielczarek@gmail.com ->FindCallerRegs<uint32_t>(current_registers, memory, 36341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 36441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com VerifyRegisters(__FILE__, __LINE__, 36541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers); 36641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 36741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x2900; 36841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 36941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 37041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, string("PublicSymbol")); 37141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 37241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x4000; 37341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 37441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 37541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, string("LargeFunction")); 37641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 37741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x2181; 37841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module2; 37941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 38041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Function2_2"); 3812971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(frame.function_base, 0x2170U); 38241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.module); 38341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.module->code_file(), "module2"); 38441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_file_name, "file2_2.cc"); 38541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 21); 3862971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(frame.source_line_base, 0x2180U); 38741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 38841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info.get()); 3892660caa1ad5b57ffa763a68c3b96abc10e7f16feivan.penkov@gmail.com ASSERT_EQ(windows_frame_info->type_, WindowsFrameInfo::STACK_INFO_FRAME_DATA); 3902971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com ASSERT_EQ(windows_frame_info->prolog_size, 1U); 39141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 39241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x216f; 39341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 39441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Public2_1"); 39541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 39641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ClearSourceLineInfo(&frame); 39741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x219f; 39841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module2; 39941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 40041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.function_name.empty()); 40141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 40241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x21a0; 40341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module2; 40441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 40541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Public2_2"); 40641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 40741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 40841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comTEST_F(TestFastSourceLineResolver, TestInvalidLoads) { 40941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module3("module3"); 4102d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module3, 4112d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com testdata_dir + "/module3_bad.out")); 4122d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module3)); 4132d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(basic_resolver.IsModuleCorrupt(&module3)); 41441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module3 to fast_module: 4152d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(serializer.ConvertOneModule(module3.code_file(), 4162d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com &basic_resolver, 4172d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com &fast_resolver)); 4182d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module3)); 4192d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(fast_resolver.IsModuleCorrupt(&module3)); 42041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 42141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module4("module4"); 4222d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module4, 4232d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com testdata_dir + "/module4_bad.out")); 4242d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module4)); 4252d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(basic_resolver.IsModuleCorrupt(&module4)); 42641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module4 to fast_module: 4272d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(serializer.ConvertOneModule(module4.code_file(), 4282d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com &basic_resolver, 4292d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com &fast_resolver)); 4302d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module4)); 4312d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com ASSERT_TRUE(fast_resolver.IsModuleCorrupt(&module4)); 43241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 43341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module5("module5"); 43441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.LoadModule(&module5, 4352d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com testdata_dir + "/invalid-filename")); 43641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.HasModule(&module5)); 43741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 43841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule invalidmodule("invalid-module"); 43941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.HasModule(&invalidmodule)); 44041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 44141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 44241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comTEST_F(TestFastSourceLineResolver, TestUnload) { 44341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module1("module1"); 44441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(basic_resolver.HasModule(&module1)); 44541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 44641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1))); 44741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module1)); 44841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module1 to fast_module. 44941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(serializer.ConvertOneModule(module1.code_file(), 45041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &basic_resolver, 45141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &fast_resolver)); 45241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module1)); 45341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com basic_resolver.UnloadModule(&module1); 45441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.UnloadModule(&module1); 45541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.HasModule(&module1)); 45641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 45741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1))); 45841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module1)); 45941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module1 to fast_module. 46041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(serializer.ConvertOneModule(module1.code_file(), 46141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &basic_resolver, 46241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &fast_resolver)); 46341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module1)); 46441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 46541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 46641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comTEST_F(TestFastSourceLineResolver, CompareModule) { 46741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com char *symbol_data; 4682d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com size_t symbol_data_size; 46941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string symbol_data_string; 47041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string filename; 47141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 47241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com for (int module_index = 0; module_index < 3; ++module_index) { 47341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com std::stringstream ss; 47441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ss << testdata_dir << "/module" << module_index << ".out"; 47541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com filename = ss.str(); 47641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(SourceLineResolverBase::ReadSymbolFile( 4772d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com symbol_file(module_index), &symbol_data, &symbol_data_size)); 4782d460c37d16a99fd4bcdac045298e87b6b5735b0ivan.penkov@gmail.com symbol_data_string.assign(symbol_data, symbol_data_size); 4793382d1e0a6ed8f34ff20777475aea6624c463667SiyangXie@gmail.com delete [] symbol_data; 48041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(module_comparer.Compare(symbol_data_string)); 48141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 48241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 48341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 48441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} // namespace 48541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 48641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comint main(int argc, char *argv[]) { 48741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ::testing::InitGoogleTest(&argc, argv); 48841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return RUN_ALL_TESTS(); 48941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 490