• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef COURGETTE_DISASSEMBLER_ELF_32_ARM_H_
6 #define COURGETTE_DISASSEMBLER_ELF_32_ARM_H_
7 
8 #include "base/basictypes.h"
9 #include "courgette/disassembler_elf_32.h"
10 #include "courgette/memory_allocator.h"
11 #include "courgette/types_elf.h"
12 
13 namespace courgette {
14 
15 class AssemblyProgram;
16 
17 enum ARM_RVA {
18   ARM_OFF8,
19   ARM_OFF11,
20   ARM_OFF24,
21   ARM_OFF25,
22   ARM_OFF21,
23 };
24 
25 class DisassemblerElf32ARM : public DisassemblerElf32 {
26  public:
27   class TypedRVAARM : public TypedRVA {
28    public:
TypedRVAARM(ARM_RVA type,RVA rva)29     TypedRVAARM(ARM_RVA type, RVA rva) : TypedRVA(rva), type_(type) { }
30 
c_op()31     uint16 c_op() const {
32       return c_op_;
33     }
34 
35     virtual CheckBool ComputeRelativeTarget(const uint8* op_pointer);
36 
37     virtual CheckBool EmitInstruction(AssemblyProgram* program,
38                                       RVA target_rva);
39 
40     virtual uint16 op_size() const;
41 
42    private:
43     ARM_RVA type_;
44 
45     uint16 c_op_;  // set by ComputeRelativeTarget()
46     const uint8* arm_op_;
47   };
48 
49   explicit DisassemblerElf32ARM(const void* start, size_t length);
50 
kind()51   virtual ExecutableType kind() { return EXE_ELF_32_ARM; }
52 
ElfEM()53   virtual e_machine_values ElfEM() { return EM_ARM; }
54 
55   static CheckBool Compress(ARM_RVA type, uint32 arm_op, RVA rva,
56                             uint16* c_op /* out */, uint32* addr /* out */);
57 
58   static CheckBool Decompress(ARM_RVA type, uint16 c_op, uint32 addr,
59                               uint32* arm_op /* out */);
60 
61  protected:
62 
63   virtual CheckBool RelToRVA(Elf32_Rel rel, RVA* result)
64     const WARN_UNUSED_RESULT;
65 
66   virtual CheckBool ParseRelocationSection(
67       const Elf32_Shdr *section_header,
68         AssemblyProgram* program) WARN_UNUSED_RESULT;
69 
70   virtual CheckBool ParseRel32RelocsFromSection(
71       const Elf32_Shdr* section) WARN_UNUSED_RESULT;
72 
73 #if COURGETTE_HISTOGRAM_TARGETS
74   std::map<RVA, int> rel32_target_rvas_;
75 #endif
76 
77   DISALLOW_COPY_AND_ASSIGN(DisassemblerElf32ARM);
78 };
79 
80 }  // namespace courgette
81 
82 #endif  // COURGETTE_DISASSEMBLER_ELF_32_ARM_H_
83