fast_source_line_resolver_unittest.cc revision 41f998fe5a0630506d6d2a1bae78b1be179fe850
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 4041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include <stdio.h> 4141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 4241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include <sstream> 4341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include <string> 4441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 4541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "breakpad_googletest_includes.h" 4641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "google_breakpad/processor/code_module.h" 4741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "google_breakpad/processor/stack_frame.h" 4841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "google_breakpad/processor/memory_region.h" 4941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/logging.h" 5041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/module_serializer.h" 5141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com#include "processor/module_comparer.h" 5241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 5341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comnamespace { 5441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 5541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing std::string; 5641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::SourceLineResolverBase; 5741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::BasicSourceLineResolver; 5841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::FastSourceLineResolver; 5941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::ModuleSerializer; 6041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::ModuleComparer; 6141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::CFIFrameInfo; 6241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::CodeModule; 6341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::MemoryRegion; 6441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::StackFrame; 6541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::WindowsFrameInfo; 6641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::linked_ptr; 6741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comusing google_breakpad::scoped_ptr; 6841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 6941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comclass TestCodeModule : public CodeModule { 7041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com public: 7141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com explicit TestCodeModule(string code_file) : code_file_(code_file) {} 7241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual ~TestCodeModule() {} 7341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 7441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual u_int64_t base_address() const { return 0; } 7541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual u_int64_t size() const { return 0xb000; } 7641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string code_file() const { return code_file_; } 7741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string code_identifier() const { return ""; } 7841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string debug_file() const { return ""; } 7941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string debug_identifier() const { return ""; } 8041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual string version() const { return ""; } 8141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com virtual const CodeModule* Copy() const { 8241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return new TestCodeModule(code_file_); 8341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 8441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 8541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com private: 8641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string code_file_; 8741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}; 8841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 8941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// A mock memory region object, for use by the STACK CFI tests. 9041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comclass MockMemoryRegion: public MemoryRegion { 9141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com u_int64_t GetBase() const { return 0x10000; } 9241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com u_int32_t GetSize() const { return 0x01000; } 9341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com bool GetMemoryAtAddress(u_int64_t address, u_int8_t *value) const { 9441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com *value = address & 0xff; 9541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 9641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 9741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com bool GetMemoryAtAddress(u_int64_t address, u_int16_t *value) const { 9841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com *value = address & 0xffff; 9941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 10041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 10141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com bool GetMemoryAtAddress(u_int64_t address, u_int32_t *value) const { 10241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com switch (address) { 10341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x10008: *value = 0x98ecadc3; break; // saved %ebx 10441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x1000c: *value = 0x878f7524; break; // saved %esi 10541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x10010: *value = 0x6312f9a5; break; // saved %edi 10641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x10014: *value = 0x10038; break; // caller's %ebp 10741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com case 0x10018: *value = 0xf6438648; break; // return address 10841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com default: *value = 0xdeadbeef; break; // junk 10941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 11041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 11141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 11241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com bool GetMemoryAtAddress(u_int64_t address, u_int64_t *value) const { 11341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com *value = address; 11441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 11541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 11641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}; 11741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 11841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Verify that, for every association in ACTUAL, EXPECTED has the same 11941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// association. (That is, ACTUAL's associations should be a subset of 12041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// EXPECTED's.) Also verify that ACTUAL has associations for ".ra" and 12141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// ".cfa". 12241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comstatic bool VerifyRegisters( 12341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com const char *file, int line, 12441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com const CFIFrameInfo::RegisterValueMap<u_int32_t> &expected, 12541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com const CFIFrameInfo::RegisterValueMap<u_int32_t> &actual) { 12641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com CFIFrameInfo::RegisterValueMap<u_int32_t>::const_iterator a; 12741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com a = actual.find(".cfa"); 12841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (a == actual.end()) 12941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 13041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com a = actual.find(".ra"); 13141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (a == actual.end()) 13241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 13341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com for (a = actual.begin(); a != actual.end(); a++) { 13441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com CFIFrameInfo::RegisterValueMap<u_int32_t>::const_iterator e = 13541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected.find(a->first); 13641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (e == expected.end()) { 13741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fprintf(stderr, "%s:%d: unexpected register '%s' recovered, value 0x%x\n", 13841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com file, line, a->first.c_str(), a->second); 13941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 14041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 14141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (e->second != a->second) { 14241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fprintf(stderr, 14341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com "%s:%d: register '%s' recovered value was 0x%x, expected 0x%x\n", 14441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com file, line, a->first.c_str(), a->second, e->second); 14541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 14641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 14741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Don't complain if this doesn't recover all registers. Although 14841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // the DWARF spec says that unmentioned registers are undefined, 14941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // GCC uses omission to mean that they are unchanged. 15041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 15141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 15241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 15341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 15441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comstatic bool VerifyEmpty(const StackFrame &frame) { 15541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com if (frame.function_name.empty() && 15641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.source_file_name.empty() && 15741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.source_line == 0) 15841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return true; 15941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return false; 16041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 16141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 16241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comstatic void ClearSourceLineInfo(StackFrame *frame) { 16341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame->function_name.clear(); 16441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame->module = NULL; 16541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame->source_file_name.clear(); 16641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame->source_line = 0; 16741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 16841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 16941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comclass TestFastSourceLineResolver : public ::testing::Test { 17041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com public: 17141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com void SetUp() { 17241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com testdata_dir = string(getenv("srcdir") ? getenv("srcdir") : ".") + 17341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com "/src/processor/testdata"; 17441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 17541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 17641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string symbol_file(int file_index) { 17741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com std::stringstream ss; 17841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ss << testdata_dir << "/module" << file_index << ".out"; 17941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return ss.str(); 18041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 18141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 18241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ModuleSerializer serializer; 18341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com BasicSourceLineResolver basic_resolver; 18441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com FastSourceLineResolver fast_resolver; 18541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ModuleComparer module_comparer; 18641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 18741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string testdata_dir; 18841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com}; 18941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 19041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com// Test adapted from basic_source_line_resolver_unittest. 19141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comTEST_F(TestFastSourceLineResolver, TestLoadAndResolve) { 19241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module1("module1"); 19341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1))); 19441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module1)); 19541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module1 to fast_module: 19641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(serializer.ConvertOneModule( 19741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com module1.code_file(), &basic_resolver, &fast_resolver)); 19841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module1)); 19941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 20041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module2("module2"); 20141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module2, symbol_file(2))); 20241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module2)); 20341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module2 to fast_module: 20441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(serializer.ConvertOneModule( 20541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com module2.code_file(), &basic_resolver, &fast_resolver)); 20641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module2)); 20741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 20841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com StackFrame frame; 20941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com scoped_ptr<WindowsFrameInfo> windows_frame_info; 21041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com scoped_ptr<CFIFrameInfo> cfi_frame_info; 21141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x1000; 21241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = NULL; 21341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 21441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(frame.module); 21541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.function_name.empty()); 21641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_base, 0); 21741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.source_file_name.empty()); 21841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 0); 21941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line_base, 0); 22041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 22141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 22241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 22341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Function1_1"); 22441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.module); 22541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.module->code_file(), "module1"); 22641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_base, 0x1000); 22741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_file_name, "file1_1.cc"); 22841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 44); 22941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line_base, 0x1000); 23041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 23141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info.get()); 23241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info->allocates_base_pointer); 23341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(windows_frame_info->program_string, 23441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com "$eip 4 + ^ = $esp $ebp 8 + = $ebp $ebp ^ ="); 23541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 23641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ClearSourceLineInfo(&frame); 23741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x800; 23841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 23941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 24041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(VerifyEmpty(frame)); 24141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 24241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info.get()); 24341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 24441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x1280; 24541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 24641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Function1_3"); 24741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.source_file_name.empty()); 24841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 0); 24941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 25041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info.get()); 25141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info->allocates_base_pointer); 25241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info->program_string.empty()); 25341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 25441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x1380; 25541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 25641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Function1_4"); 25741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.source_file_name.empty()); 25841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 0); 25941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 26041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info.get()); 26141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info->allocates_base_pointer); 26241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info->program_string.empty()); 26341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 26441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x2000; 26541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 26641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(windows_frame_info.get()); 26741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 26841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // module1 has STACK CFI records covering 3d40..3def; 26941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // module2 has STACK CFI records covering 3df0..3e9f; 27041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // check that FindCFIFrameInfo doesn't claim to find any outside those ranges. 27141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d3f; 27241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 27341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 27441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(cfi_frame_info.get()); 27541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 27641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3e9f; 27741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 27841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 27941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(cfi_frame_info.get()); 28041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 28141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com CFIFrameInfo::RegisterValueMap<u_int32_t> current_registers; 28241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com CFIFrameInfo::RegisterValueMap<u_int32_t> caller_registers; 28341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com CFIFrameInfo::RegisterValueMap<u_int32_t> expected_caller_registers; 28441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com MockMemoryRegion memory; 28541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 28641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Regardless of which instruction evaluation takes place at, it 28741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // should produce the same values for the caller's registers. 28841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers[".cfa"] = 0x1001c; 28941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers[".ra"] = 0xf6438648; 29041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers["$ebp"] = 0x10038; 29141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers["$ebx"] = 0x98ecadc3; 29241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers["$esi"] = 0x878f7524; 29341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers["$edi"] = 0x6312f9a5; 29441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 29541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d40; 29641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 29741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers.clear(); 29841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$esp"] = 0x10018; 29941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$ebp"] = 0x10038; 30041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$ebx"] = 0x98ecadc3; 30141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$esi"] = 0x878f7524; 30241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$edi"] = 0x6312f9a5; 30341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 30441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 30541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 30641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ->FindCallerRegs<u_int32_t>(current_registers, memory, 30741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 30841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__, 30941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers)); 31041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 31141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d41; 31241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$esp"] = 0x10014; 31341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 31441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 31541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 31641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ->FindCallerRegs<u_int32_t>(current_registers, memory, 31741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 31841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(VerifyRegisters(__FILE__, __LINE__, 31941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers)); 32041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 32141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d43; 32241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$ebp"] = 0x10014; 32341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 32441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 32541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 32641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ->FindCallerRegs<u_int32_t>(current_registers, memory, 32741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 32841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com VerifyRegisters(__FILE__, __LINE__, 32941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers); 33041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 33141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d54; 33241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$ebx"] = 0x6864f054U; 33341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 33441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 33541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 33641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ->FindCallerRegs<u_int32_t>(current_registers, memory, 33741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 33841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com VerifyRegisters(__FILE__, __LINE__, 33941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers); 34041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 34141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d5a; 34241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$esi"] = 0x6285f79aU; 34341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 34441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 34541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 34641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ->FindCallerRegs<u_int32_t>(current_registers, memory, 34741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 34841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com VerifyRegisters(__FILE__, __LINE__, 34941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers); 35041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 35141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x3d84; 35241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com current_registers["$edi"] = 0x64061449U; 35341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com cfi_frame_info.reset(fast_resolver.FindCFIFrameInfo(&frame)); 35441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get()); 35541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(cfi_frame_info.get() 35641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ->FindCallerRegs<u_int32_t>(current_registers, memory, 35741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &caller_registers)); 35841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com VerifyRegisters(__FILE__, __LINE__, 35941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com expected_caller_registers, caller_registers); 36041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 36141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x2900; 36241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 36341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 36441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, string("PublicSymbol")); 36541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 36641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x4000; 36741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module1; 36841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 36941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, string("LargeFunction")); 37041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 37141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x2181; 37241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module2; 37341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 37441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Function2_2"); 37541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_base, 0x2170); 37641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.module); 37741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.module->code_file(), "module2"); 37841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_file_name, "file2_2.cc"); 37941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line, 21); 38041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.source_line_base, 0x2180); 38141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com windows_frame_info.reset(fast_resolver.FindWindowsFrameInfo(&frame)); 38241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(windows_frame_info.get()); 38341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(windows_frame_info->prolog_size, 1); 38441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 38541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x216f; 38641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 38741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Public2_1"); 38841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 38941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ClearSourceLineInfo(&frame); 39041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x219f; 39141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module2; 39241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 39341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(frame.function_name.empty()); 39441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 39541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.instruction = 0x21a0; 39641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com frame.module = &module2; 39741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.FillSourceLineInfo(&frame); 39841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_EQ(frame.function_name, "Public2_2"); 39941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 40041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 40141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comTEST_F(TestFastSourceLineResolver, TestInvalidLoads) { 40241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module3("module3"); 40341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(basic_resolver.LoadModule(&module3, 40441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com testdata_dir + "/module3_bad.out")); 40541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(basic_resolver.HasModule(&module3)); 40641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module3 to fast_module: 40741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(serializer.ConvertOneModule(module3.code_file(), 40841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &basic_resolver, 40941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &fast_resolver)); 41041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.HasModule(&module3)); 41141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 41241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module4("module4"); 41341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(basic_resolver.LoadModule(&module4, 41441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com testdata_dir + "/module4_bad.out")); 41541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(basic_resolver.HasModule(&module4)); 41641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module4 to fast_module: 41741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(serializer.ConvertOneModule(module4.code_file(), 41841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &basic_resolver, 41941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &fast_resolver)); 42041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.HasModule(&module4)); 42141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 42241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module5("module5"); 42341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.LoadModule(&module5, 42441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com testdata_dir + "/invalid-filename")); 42541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.HasModule(&module5)); 42641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 42741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule invalidmodule("invalid-module"); 42841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_resolver.HasModule(&invalidmodule)); 42941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 43041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 43141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comTEST_F(TestFastSourceLineResolver, TestUnload) { 43241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com TestCodeModule module1("module1"); 43341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(basic_resolver.HasModule(&module1)); 43441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 43541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.LoadModule(&module1, symbol_file(1))); 43641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(basic_resolver.HasModule(&module1)); 43741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com // Convert module1 to fast_module. 43841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(serializer.ConvertOneModule(module1.code_file(), 43941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &basic_resolver, 44041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &fast_resolver)); 44141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(fast_resolver.HasModule(&module1)); 44241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com basic_resolver.UnloadModule(&module1); 44341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com fast_resolver.UnloadModule(&module1); 44441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_FALSE(fast_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} 45441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 45541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comTEST_F(TestFastSourceLineResolver, CompareModule) { 45641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com char *symbol_data; 45741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string symbol_data_string; 45841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com string filename; 45941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 46041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com for (int module_index = 0; module_index < 3; ++module_index) { 46141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com std::stringstream ss; 46241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ss << testdata_dir << "/module" << module_index << ".out"; 46341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com filename = ss.str(); 46441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(SourceLineResolverBase::ReadSymbolFile( 46541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com &symbol_data, symbol_file(module_index))); 46641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com symbol_data_string = symbol_data; 46741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com delete symbol_data; 46841f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ASSERT_TRUE(module_comparer.Compare(symbol_data_string)); 46941f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com } 47041f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 47141f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 47241f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} // namespace 47341f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com 47441f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.comint main(int argc, char *argv[]) { 47541f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com ::testing::InitGoogleTest(&argc, argv); 47641f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com return RUN_ALL_TESTS(); 47741f998fe5a0630506d6d2a1bae78b1be179fe850SiyangXie@gmail.com} 478