1/* 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 22#pragma GCC diagnostic push 23#pragma GCC diagnostic ignored "-Wshadow" 24#include "vixl/a64/decoder-a64.h" 25#include "vixl/a64/disasm-a64.h" 26#pragma GCC diagnostic pop 27 28namespace art { 29namespace arm64 { 30 31class CustomDisassembler FINAL : public vixl::Disassembler { 32 public: 33 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_) { 38 if (!options->absolute_addresses_) { 39 MapCodeAddress(0, reinterpret_cast<const vixl::Instruction*>(options->base_address_)); 40 } 41 } 42 43 // Use register aliases in the disassembly. 44 void AppendRegisterNameToOutput(const vixl::Instruction* instr, 45 const vixl::CPURegister& reg) OVERRIDE; 46 47 // Improve the disassembly of literal load instructions. 48 void VisitLoadLiteral(const vixl::Instruction* instr) OVERRIDE; 49 50 // Improve the disassembly of thread offset. 51 void VisitLoadStoreUnsignedOffset(const vixl::Instruction* instr) OVERRIDE; 52 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_; 61 62 // Valid address range: [base_address_, end_address_) 63 const void* const base_address_; 64 const void* const end_address_; 65}; 66 67class DisassemblerArm64 FINAL : public Disassembler { 68 public: 69 explicit DisassemblerArm64(DisassemblerOptions* options) : 70 Disassembler(options), disasm(options) { 71 decoder.AppendVisitor(&disasm); 72 } 73 74 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; 76 77 private: 78 vixl::Decoder decoder; 79 CustomDisassembler disasm; 80 81 DISALLOW_COPY_AND_ASSIGN(DisassemblerArm64); 82}; 83 84} // namespace arm64 85} // namespace art 86 87#endif // ART_DISASSEMBLER_DISASSEMBLER_ARM64_H_ 88