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