13e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// Copyright (c) 2010, Google Inc.
23e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// All rights reserved.
33e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy//
43e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// Redistribution and use in source and binary forms, with or without
53e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// modification, are permitted provided that the following conditions are
63e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// met:
73e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy//
83e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy//     * Redistributions of source code must retain the above copyright
93e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// notice, this list of conditions and the following disclaimer.
103e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy//     * Redistributions in binary form must reproduce the above
113e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// copyright notice, this list of conditions and the following disclaimer
123e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// in the documentation and/or other materials provided with the
133e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// distribution.
143e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy//     * Neither the name of Google Inc. nor the names of its
153e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// contributors may be used to endorse or promote products derived from
163e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// this software without specific prior written permission.
173e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy//
183e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
193e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
203e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
213e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
223e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
233e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
243e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
253e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
263e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
273e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
283e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
293e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
303e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// Original author: Jim Blandy <jimb@mozilla.com> <jimb@red-bean.com>
313e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
323e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy// dwarf_cfi_to_module_unittest.cc: Tests for google_breakpad::DwarfCFIToModule.
333e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
345c8a2f446347d9791b21883b4e5439728d0e48dajessicag.feedback@gmail.com#include <string>
355c8a2f446347d9791b21883b4e5439728d0e48dajessicag.feedback@gmail.com#include <vector>
365c8a2f446347d9791b21883b4e5439728d0e48dajessicag.feedback@gmail.com
373e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy#include "breakpad_googletest_includes.h"
3887855248f1fab83caf002418196a34051d359f2cjimblandy#include "common/dwarf_cfi_to_module.h"
394e518a4357a2d1c379d4a91df6d4e153ee791101ivan.penkov@gmail.com#include "common/using_std_string.h"
403e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
415c8a2f446347d9791b21883b4e5439728d0e48dajessicag.feedback@gmail.comusing std::vector;
425c8a2f446347d9791b21883b4e5439728d0e48dajessicag.feedback@gmail.com
433e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyusing google_breakpad::Module;
443e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyusing google_breakpad::DwarfCFIToModule;
453e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyusing testing::ContainerEq;
463e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyusing testing::Test;
473e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyusing testing::_;
483e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
493e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandystruct MockCFIReporter: public DwarfCFIToModule::Reporter {
503e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  MockCFIReporter(const string &file, const string &section)
513e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy      : Reporter(file, section) { }
523e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  MOCK_METHOD2(UnnamedRegister, void(size_t offset, int reg));
533e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  MOCK_METHOD2(UndefinedNotSupported, void(size_t offset, const string &reg));
543e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  MOCK_METHOD2(ExpressionsNotSupported, void(size_t offset, const string &reg));
553e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy};
563e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
573e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandystruct DwarfCFIToModuleFixture {
583e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  DwarfCFIToModuleFixture()
593e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy      : module("module name", "module os", "module arch", "module id"),
603e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy        reporter("reporter file", "reporter section"),
613e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy        handler(&module, register_names, &reporter) {
623e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("reg0");
633e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("reg1");
643e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("reg2");
653e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("reg3");
663e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("reg4");
673e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("reg5");
683e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("reg6");
693e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("reg7");
703e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("sp");
713e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    register_names.push_back("pc");
72396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek    register_names.push_back("");
733e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
743e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    EXPECT_CALL(reporter, UnnamedRegister(_, _)).Times(0);
753e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    EXPECT_CALL(reporter, UndefinedNotSupported(_, _)).Times(0);
763e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    EXPECT_CALL(reporter, ExpressionsNotSupported(_, _)).Times(0);
773e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  }
783e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
793e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module module;
803e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  vector<string> register_names;
813e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  MockCFIReporter reporter;
823e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  DwarfCFIToModule handler;
833e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  vector<Module::StackFrameEntry *> entries;
843e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy};
853e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
863e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyclass Entry: public DwarfCFIToModuleFixture, public Test { };
873e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
883e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Entry, Accept) {
893e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.Entry(0x3b8961b8, 0xa21069698096fc98ULL,
903e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                            0xb440ce248169c8d6ULL, 3, "", 0xea93c106));
913e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
923e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  module.GetStackFrameEntries(&entries);
933e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(1U, entries.size());
943e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0xa21069698096fc98ULL, entries[0]->address);
953e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0xb440ce248169c8d6ULL, entries[0]->size);
963e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->initial_rules.size());
973e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
983e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
993e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
1003e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Entry, AcceptOldVersion) {
1013e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.Entry(0xeb60e0fc, 0x75b8806bb09eab78ULL,
1023e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                            0xc771f44958d40bbcULL, 1, "", 0x093c945e));
1033e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
1043e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  module.GetStackFrameEntries(&entries);
1053e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(1U, entries.size());
1063e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0x75b8806bb09eab78ULL, entries[0]->address);
1073e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0xc771f44958d40bbcULL, entries[0]->size);
1083e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->initial_rules.size());
1093e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
1103e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
1113e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
1123e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandystruct RuleFixture: public DwarfCFIToModuleFixture {
1133e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  RuleFixture() : DwarfCFIToModuleFixture() {
1143e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    entry_address = 0x89327ebf86b47492ULL;
1153e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    entry_size    = 0x2f8cd573072fe02aULL;
1163e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    return_reg    = 0x7886a346;
1173e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  }
1183e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  void StartEntry() {
1193e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    ASSERT_TRUE(handler.Entry(0x4445c05c, entry_address, entry_size,
1203e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                              3, "", return_reg));
1213e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  }
1223e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  void CheckEntry() {
1233e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    module.GetStackFrameEntries(&entries);
1243e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    EXPECT_EQ(1U, entries.size());
1253e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    EXPECT_EQ(entry_address, entries[0]->address);
1263e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy    EXPECT_EQ(entry_size, entries[0]->size);
1273e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  }
1283e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  uint64 entry_address, entry_size;
1293e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  unsigned return_reg;
1303e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy};
1313e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
1323e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyclass Rule: public RuleFixture, public Test { };
1333e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
1343e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, UndefinedRule) {
1353e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_CALL(reporter, UndefinedNotSupported(_, "reg7"));
1363e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
1373e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.UndefinedRule(entry_address, 7));
1383e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
1393e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
1403e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->initial_rules.size());
1413e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
1423e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
1433e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
144396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarekTEST_F(Rule, RegisterWithEmptyName) {
145396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  EXPECT_CALL(reporter, UnnamedRegister(_, 10));
146396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  EXPECT_CALL(reporter, UndefinedNotSupported(_, "unnamed_register10"));
147396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  StartEntry();
148396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  ASSERT_TRUE(handler.UndefinedRule(entry_address, 10));
149396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  ASSERT_TRUE(handler.End());
150396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  CheckEntry();
151396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  EXPECT_EQ(0U, entries[0]->initial_rules.size());
152396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  EXPECT_EQ(0U, entries[0]->rule_changes.size());
153396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek}
154396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek
1553e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, SameValueRule) {
1563e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
1573e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.SameValueRule(entry_address, 6));
1583e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
1593e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
1603e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleMap expected_initial;
1613e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_initial["reg6"] = "reg6";
1623e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
1633e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
1643e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
1653e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
1663e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, OffsetRule) {
1673e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
1683e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.OffsetRule(entry_address + 1, return_reg,
1693e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                                 DwarfCFIToModule::kCFARegister,
1703e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                                 16927065));
1713e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
1723e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
1733e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->initial_rules.size());
1743e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleChangeMap expected_changes;
1753e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_changes[entry_address + 1][".ra"] = ".cfa 16927065 + ^";
1763e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
1773e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
1783e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
1793e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, OffsetRuleNegative) {
1803e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
1813e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.OffsetRule(entry_address + 1,
1823e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                                 DwarfCFIToModule::kCFARegister, 4, -34530721));
1833e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
1843e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
1853e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->initial_rules.size());
1863e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleChangeMap expected_changes;
1873e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_changes[entry_address + 1][".cfa"] = "reg4 -34530721 + ^";
1883e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
1893e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
1903e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
1913e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, ValOffsetRule) {
1923e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  // Use an unnamed register number, to exercise that branch of RegisterName.
193396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek  EXPECT_CALL(reporter, UnnamedRegister(_, 11));
1943e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
1953e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.ValOffsetRule(entry_address + 0x5ab7,
1963e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                                    DwarfCFIToModule::kCFARegister,
197396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek                                    11, 61812979));
1983e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
1993e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
2003e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->initial_rules.size());
2013e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleChangeMap expected_changes;
2023e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_changes[entry_address + 0x5ab7][".cfa"] =
203396816c906754562b2fc14e92798fd2bc8d2de15ted.mielczarek      "unnamed_register11 61812979 +";
2043e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
2053e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
2063e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
2073e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, RegisterRule) {
2083e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
2093e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 3));
2103e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
2113e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
2123e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleMap expected_initial;
2133e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_initial[".ra"] = "reg3";
2143e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
2153e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
2163e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
2173e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
2183e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, ExpressionRule) {
2193e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg2"));
2203e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
2213e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.ExpressionRule(entry_address + 0xf326, 2,
2223e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                                     "it takes two to tango"));
2233e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
2243e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
2253e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->initial_rules.size());
2263e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
2273e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
2283e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
2293e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, ValExpressionRule) {
2303e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_CALL(reporter, ExpressionsNotSupported(_, "reg0"));
2313e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
2323e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.ValExpressionRule(entry_address + 0x6367, 0,
2333e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy                                        "bit off more than he could chew"));
2343e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
2353e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
2363e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->initial_rules.size());
2373e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
2383e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
2393e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
2403e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, DefaultReturnAddressRule) {
2413e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  return_reg = 2;
2423e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
2433e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.RegisterRule(entry_address, 0, 1));
2443e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
2453e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
2463e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleMap expected_initial;
2473e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_initial[".ra"] = "reg2";
2483e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_initial["reg0"] = "reg1";
2493e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
2503e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
2513e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
2523e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
2533e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, DefaultReturnAddressRuleOverride) {
2543e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  return_reg = 2;
2553e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
2563e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.RegisterRule(entry_address, return_reg, 1));
2573e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
2583e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
2593e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleMap expected_initial;
2603e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_initial[".ra"] = "reg1";
2613e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
2623e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_EQ(0U, entries[0]->rule_changes.size());
2633e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
2643e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
2653e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandyTEST_F(Rule, DefaultReturnAddressRuleLater) {
2663e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  return_reg = 2;
2673e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  StartEntry();
2683e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.RegisterRule(entry_address + 1, return_reg, 1));
2693e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  ASSERT_TRUE(handler.End());
2703e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  CheckEntry();
2713e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleMap expected_initial;
2723e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_initial[".ra"] = "reg2";
2733e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->initial_rules, ContainerEq(expected_initial));
2743e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  Module::RuleChangeMap expected_changes;
2753e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  expected_changes[entry_address + 1][".ra"] = "reg1";
2763e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy  EXPECT_THAT(entries[0]->rule_changes, ContainerEq(expected_changes));
2773e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy}
2783e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy
279504280af60e3052d2ecaa9e003818886e651310fjimblandyTEST(RegisterNames, I386) {
280504280af60e3052d2ecaa9e003818886e651310fjimblandy  vector<string> names = DwarfCFIToModule::RegisterNames::I386();
281504280af60e3052d2ecaa9e003818886e651310fjimblandy
282504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$eax", names[0]);
283504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$ecx", names[1]);
284504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$esp", names[4]);
285504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$eip", names[8]);
286504280af60e3052d2ecaa9e003818886e651310fjimblandy}
287504280af60e3052d2ecaa9e003818886e651310fjimblandy
288504280af60e3052d2ecaa9e003818886e651310fjimblandyTEST(RegisterNames, ARM) {
289504280af60e3052d2ecaa9e003818886e651310fjimblandy  vector<string> names = DwarfCFIToModule::RegisterNames::ARM();
290504280af60e3052d2ecaa9e003818886e651310fjimblandy
291504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("r0", names[0]);
292504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("r10", names[10]);
293504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("sp", names[13]);
294504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("lr", names[14]);
295504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("pc", names[15]);
296504280af60e3052d2ecaa9e003818886e651310fjimblandy}
297504280af60e3052d2ecaa9e003818886e651310fjimblandy
298504280af60e3052d2ecaa9e003818886e651310fjimblandyTEST(RegisterNames, X86_64) {
299504280af60e3052d2ecaa9e003818886e651310fjimblandy  vector<string> names = DwarfCFIToModule::RegisterNames::X86_64();
300504280af60e3052d2ecaa9e003818886e651310fjimblandy
301504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$rax", names[0]);
302504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$rdx", names[1]);
303504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$rbp", names[6]);
304504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$rsp", names[7]);
305504280af60e3052d2ecaa9e003818886e651310fjimblandy  EXPECT_EQ("$rip", names[16]);
306504280af60e3052d2ecaa9e003818886e651310fjimblandy}
307