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