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 §ion) 513e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy : Reporter(file, section) { } 523e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy MOCK_METHOD2(UnnamedRegister, void(size_t offset, int reg)); 533e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy MOCK_METHOD2(UndefinedNotSupported, void(size_t offset, const string ®)); 543e768ed9c01a244cdb1bc0d6aec34fb25821fbccjimblandy MOCK_METHOD2(ExpressionsNotSupported, void(size_t offset, const string ®)); 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