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