typedrva_unittest.cc revision a3f7b4e666c476898878fa745f637129375cd889
1a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// found in the LICENSE file. 4a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "courgette/base_test_unittest.h" 6a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "courgette/disassembler_elf_32_arm.h" 7a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "courgette/disassembler_elf_32_x86.h" 8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 9a3f7b4e666c476898878fa745f637129375cd889Ben Murdochclass TypedRVATest : public BaseTest { 10a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch public: 11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch void TestRelativeTargetX86(courgette::RVA word, courgette::RVA expected) 12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const; 13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch void TestRelativeTargetARM(courgette::ARM_RVA arm_rva, 15a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch courgette::RVA rva, 16a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch uint32 op, 17a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch courgette::RVA expected) const; 18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}; 19a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 20a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid TypedRVATest::TestRelativeTargetX86(courgette::RVA word, 21a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch courgette::RVA expected) const { 22a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch courgette::DisassemblerElf32X86::TypedRVAX86* typed_rva 23a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch = new courgette::DisassemblerElf32X86::TypedRVAX86(0); 24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const uint8* op_pointer = reinterpret_cast<const uint8*>(&word); 25a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 26a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_TRUE(typed_rva->ComputeRelativeTarget(op_pointer)); 27a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(typed_rva->relative_target(), expected); 28a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 29a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 30a3f7b4e666c476898878fa745f637129375cd889Ben Murdochuint32 Read32LittleEndian(const void* address) { 31a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return *reinterpret_cast<const uint32*>(address); 32a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 33a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 34a3f7b4e666c476898878fa745f637129375cd889Ben Murdochvoid TypedRVATest::TestRelativeTargetARM(courgette::ARM_RVA arm_rva, 35a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch courgette::RVA rva, 36a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch uint32 op, 37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch courgette::RVA expected) const { 38a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch courgette::DisassemblerElf32ARM::TypedRVAARM* typed_rva 39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch = new courgette::DisassemblerElf32ARM::TypedRVAARM(arm_rva, 0); 40a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch uint8* op_pointer = reinterpret_cast<uint8*>(&op); 41a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 42a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_TRUE(typed_rva->ComputeRelativeTarget(op_pointer)); 43a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EXPECT_EQ(rva + typed_rva->relative_target(), expected); 44a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 45a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 46a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestX86) { 47a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetX86(0x0, 0x4); 48a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 50a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// ARM opcodes taken from and tested against the output of 51a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// "arm-linux-gnueabi-objdump -d daisy_3701.98.0/bin/ls" 52a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 53a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF8_PREFETCH) { 54a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF8, 0x0, 0x0, 0x4); 55a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 56a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 57a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF8_FORWARDS) { 58a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF8, 0x2bcc, 0xd00e, 0x2bec); 59a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF8, 0x3752, 0xd910, 0x3776); 60a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 61a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 62a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF8_BACKWARDS) { 63a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF8, 0x3774, 0xd1f6, 0x3764); 64a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 65a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 66a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF11_PREFETCH) { 67a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF11, 0x0, 0x0, 0x4); 68a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 69a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 70a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF11_FORWARDS) { 71a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF11, 0x2bea, 0xe005, 0x2bf8); 72a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 73a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 74a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF11_BACKWARDS) { 75a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF11, 0x2f80, 0xe6cd, 0x2d1e); 76a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF11, 0x3610, 0xe56a, 0x30e8); 77a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 78a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 79a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF24_PREFETCH) { 80a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF24, 0x0, 0x0, 0x8); 81a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 82a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 83a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF24_FORWARDS) { 84a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF24, 0x2384, 0x4af3613a, 0xffcda874); 85a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF24, 0x23bc, 0x6af961b9, 0xffe5aaa8); 86a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch TestRelativeTargetARM(courgette::ARM_OFF24, 0x23d4, 0x2b006823, 0x1c468); 87a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 88a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 89a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(TypedRVATest, TestARM_OFF24_BACKWARDS) { 90a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // TODO(paulgazz): find a real-world example of an ARM branch op 91a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // that jumps backwards. 92a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 93