blob: a4e5ee8a43e9a3d4da2699b8df1af4bb4d7fddee [file] [log] [blame]
Serban Constantinescue6622be2014-02-27 15:36:47 +00001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_DISASSEMBLER_DISASSEMBLER_ARM64_H_
18#define ART_DISASSEMBLER_DISASSEMBLER_ARM64_H_
19
20#include "disassembler.h"
21
Andreas Gampe277ccbd2014-11-03 21:36:10 -080022#pragma GCC diagnostic push
23#pragma GCC diagnostic ignored "-Wshadow"
Serban Constantinescu82e52ce2015-03-26 16:50:57 +000024#include "vixl/a64/decoder-a64.h"
25#include "vixl/a64/disasm-a64.h"
Andreas Gampe277ccbd2014-11-03 21:36:10 -080026#pragma GCC diagnostic pop
Serban Constantinescue6622be2014-02-27 15:36:47 +000027
28namespace art {
29namespace arm64 {
30
Alexandre Ramesa37d9252014-10-27 11:28:14 +000031class CustomDisassembler FINAL : public vixl::Disassembler {
32 public:
Aart Bika6e95b32016-05-11 10:30:47 -070033 explicit CustomDisassembler(DisassemblerOptions* options)
34 : vixl::Disassembler(),
35 read_literals_(options->can_read_literals_),
36 base_address_(options->base_address_),
37 end_address_(options->end_address_) {
Alexandre Ramesd737ab32015-03-06 09:11:12 +000038 if (!options->absolute_addresses_) {
39 MapCodeAddress(0, reinterpret_cast<const vixl::Instruction*>(options->base_address_));
40 }
41 }
Alexandre Ramesa37d9252014-10-27 11:28:14 +000042
43 // Use register aliases in the disassembly.
Zheng Xua34e7602015-02-03 12:03:15 +080044 void AppendRegisterNameToOutput(const vixl::Instruction* instr,
45 const vixl::CPURegister& reg) OVERRIDE;
Alexandre Ramesa37d9252014-10-27 11:28:14 +000046
47 // Improve the disassembly of literal load instructions.
Zheng Xua34e7602015-02-03 12:03:15 +080048 void VisitLoadLiteral(const vixl::Instruction* instr) OVERRIDE;
49
50 // Improve the disassembly of thread offset.
51 void VisitLoadStoreUnsignedOffset(const vixl::Instruction* instr) OVERRIDE;
Alexandre Ramesa37d9252014-10-27 11:28:14 +000052
53 private:
54 // Indicate if the disassembler should read data loaded from literal pools.
55 // This should only be enabled if reading the target of literal loads is safe.
56 // Here are possible outputs when the option is on or off:
57 // read_literals_ | disassembly
58 // true | 0x72681558: 1c000acb ldr s11, pc+344 (addr 0x726816b0)
59 // false | 0x72681558: 1c000acb ldr s11, pc+344 (addr 0x726816b0) (3.40282e+38)
60 const bool read_literals_;
Aart Bika6e95b32016-05-11 10:30:47 -070061
62 // Valid address range: [base_address_, end_address_)
63 const void* const base_address_;
64 const void* const end_address_;
Alexandre Ramesa37d9252014-10-27 11:28:14 +000065};
66
Ian Rogers38e12032014-03-14 14:06:14 -070067class DisassemblerArm64 FINAL : public Disassembler {
Serban Constantinescue6622be2014-02-27 15:36:47 +000068 public:
Alexandre Ramesa37d9252014-10-27 11:28:14 +000069 explicit DisassemblerArm64(DisassemblerOptions* options) :
Alexandre Ramesd737ab32015-03-06 09:11:12 +000070 Disassembler(options), disasm(options) {
Serban Constantinescue6622be2014-02-27 15:36:47 +000071 decoder.AppendVisitor(&disasm);
72 }
73
Ian Rogers38e12032014-03-14 14:06:14 -070074 size_t Dump(std::ostream& os, const uint8_t* begin) OVERRIDE;
75 void Dump(std::ostream& os, const uint8_t* begin, const uint8_t* end) OVERRIDE;
Serban Constantinescue6622be2014-02-27 15:36:47 +000076
77 private:
78 vixl::Decoder decoder;
Alexandre Ramesa37d9252014-10-27 11:28:14 +000079 CustomDisassembler disasm;
Serban Constantinescue6622be2014-02-27 15:36:47 +000080
81 DISALLOW_COPY_AND_ASSIGN(DisassemblerArm64);
82};
83
84} // namespace arm64
85} // namespace art
86
87#endif // ART_DISASSEMBLER_DISASSEMBLER_ARM64_H_