1e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu/*
2e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * Copyright (C) 2014 The Android Open Source Project
3e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu *
4e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * Licensed under the Apache License, Version 2.0 (the "License");
5e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * you may not use this file except in compliance with the License.
6e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * You may obtain a copy of the License at
7e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu *
8e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu *      http://www.apache.org/licenses/LICENSE-2.0
9e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu *
10e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * Unless required by applicable law or agreed to in writing, software
11e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * distributed under the License is distributed on an "AS IS" BASIS,
12e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * See the License for the specific language governing permissions and
14e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu * limitations under the License.
15e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu */
16e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
17e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include "disassembler_arm64.h"
18e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
19e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include <inttypes.h>
20e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
21e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include <iostream>
22e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
23e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include "base/logging.h"
24e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include "base/stringprintf.h"
25e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu#include "thread.h"
26e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
27e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescunamespace art {
28e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescunamespace arm64 {
29e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
30e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescustatic uint32_t ReadU32(const uint8_t* ptr) {
31e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu  return *((const uint32_t*)ptr);
32e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu}
33e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
34e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescusize_t DisassemblerArm64::Dump(std::ostream& os, const uint8_t* begin) {
35e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu  uint32_t instruction = ReadU32(begin);
36e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu  decoder.Decode(reinterpret_cast<vixl::Instruction*>(&instruction));
3734fa79ece5b3a1940d412cd94dbdcc4225aae72fBrian Carlstrom  os << FormatInstructionPointer(begin)
3834fa79ece5b3a1940d412cd94dbdcc4225aae72fBrian Carlstrom     << StringPrintf(": %08x\t%s\n", instruction, disasm.GetOutput());
39e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu  return vixl::kInstructionSize;
40e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu}
41e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
42e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescuvoid DisassemblerArm64::Dump(std::ostream& os, const uint8_t* begin, const uint8_t* end) {
43e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu  for (const uint8_t* cur = begin; cur < end; cur += vixl::kInstructionSize) {
44e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu    Dump(os, cur);
45e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu  }
46e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu}
47e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu
48e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu}  // namespace arm64
49e6622be6c353c7178f34adf814c58370a51c5ed7Serban Constantinescu}  // namespace art
50