1b78f13911bfe6eda303e91ef215c87a165aae8aeAlexandre Rames// Copyright 2014, VIXL authors
2c68cb64496485710cdb5b8480f8fee287058c93farmvixl// All rights reserved.
3c68cb64496485710cdb5b8480f8fee287058c93farmvixl//
4c68cb64496485710cdb5b8480f8fee287058c93farmvixl// Redistribution and use in source and binary forms, with or without
5c68cb64496485710cdb5b8480f8fee287058c93farmvixl// modification, are permitted provided that the following conditions are met:
6c68cb64496485710cdb5b8480f8fee287058c93farmvixl//
7c68cb64496485710cdb5b8480f8fee287058c93farmvixl//   * Redistributions of source code must retain the above copyright notice,
8c68cb64496485710cdb5b8480f8fee287058c93farmvixl//     this list of conditions and the following disclaimer.
9c68cb64496485710cdb5b8480f8fee287058c93farmvixl//   * Redistributions in binary form must reproduce the above copyright notice,
10c68cb64496485710cdb5b8480f8fee287058c93farmvixl//     this list of conditions and the following disclaimer in the documentation
11c68cb64496485710cdb5b8480f8fee287058c93farmvixl//     and/or other materials provided with the distribution.
12c68cb64496485710cdb5b8480f8fee287058c93farmvixl//   * Neither the name of ARM Limited nor the names of its contributors may be
13c68cb64496485710cdb5b8480f8fee287058c93farmvixl//     used to endorse or promote products derived from this software without
14c68cb64496485710cdb5b8480f8fee287058c93farmvixl//     specific prior written permission.
15c68cb64496485710cdb5b8480f8fee287058c93farmvixl//
16c68cb64496485710cdb5b8480f8fee287058c93farmvixl// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17c68cb64496485710cdb5b8480f8fee287058c93farmvixl// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18c68cb64496485710cdb5b8480f8fee287058c93farmvixl// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19c68cb64496485710cdb5b8480f8fee287058c93farmvixl// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20c68cb64496485710cdb5b8480f8fee287058c93farmvixl// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21c68cb64496485710cdb5b8480f8fee287058c93farmvixl// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22c68cb64496485710cdb5b8480f8fee287058c93farmvixl// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23c68cb64496485710cdb5b8480f8fee287058c93farmvixl// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24c68cb64496485710cdb5b8480f8fee287058c93farmvixl// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25c68cb64496485710cdb5b8480f8fee287058c93farmvixl// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26c68cb64496485710cdb5b8480f8fee287058c93farmvixl
27c68cb64496485710cdb5b8480f8fee287058c93farmvixl#ifndef VIXL_EXAMPLES_CUSTOM_DISASSEMBLER_H_
28c68cb64496485710cdb5b8480f8fee287058c93farmvixl#define VIXL_EXAMPLES_CUSTOM_DISASSEMBLER_H_
29c68cb64496485710cdb5b8480f8fee287058c93farmvixl
30d3832965c62a8ad461b9ea9eb0994ca6b0a3da2cAlexandre Rames#include "aarch64/disasm-aarch64.h"
31c68cb64496485710cdb5b8480f8fee287058c93farmvixl
3288c46b84df005638546de5e4e965bdcc31352f48Pierre Langloisusing namespace vixl::aarch64;
33c68cb64496485710cdb5b8480f8fee287058c93farmvixl
34c68cb64496485710cdb5b8480f8fee287058c93farmvixlvoid TestCustomDisassembler();
35c68cb64496485710cdb5b8480f8fee287058c93farmvixl
36330dc7153e671968beb67f09ed2cb7b5bda334dbarmvixl// We want to change three things in the disassembly:
37330dc7153e671968beb67f09ed2cb7b5bda334dbarmvixl// - Add comments to some add/sub instructions.
38330dc7153e671968beb67f09ed2cb7b5bda334dbarmvixl// - Use aliases for register names.
39330dc7153e671968beb67f09ed2cb7b5bda334dbarmvixl// - Add descriptions for code addresses.
400f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixlclass CustomDisassembler : public Disassembler {
41c68cb64496485710cdb5b8480f8fee287058c93farmvixl public:
420f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl  CustomDisassembler() : Disassembler() {}
430f35e36b7f5d1d2f4d95989b418447e1a4bcc8cdarmvixl  virtual ~CustomDisassembler() {}
44c68cb64496485710cdb5b8480f8fee287058c93farmvixl
453fac43c1a101f98f116e752b80abc122d32b83acPierre Langlois  virtual void VisitAddSubShifted(const Instruction* instr) VIXL_OVERRIDE;
46c68cb64496485710cdb5b8480f8fee287058c93farmvixl
47c68cb64496485710cdb5b8480f8fee287058c93farmvixl protected:
48c68cb64496485710cdb5b8480f8fee287058c93farmvixl  virtual void AppendRegisterNameToOutput(const Instruction* instr,
493fac43c1a101f98f116e752b80abc122d32b83acPierre Langlois                                          const CPURegister& reg) VIXL_OVERRIDE;
50c68cb64496485710cdb5b8480f8fee287058c93farmvixl
513fac43c1a101f98f116e752b80abc122d32b83acPierre Langlois  virtual void AppendCodeRelativeCodeAddressToOutput(
523fac43c1a101f98f116e752b80abc122d32b83acPierre Langlois      const Instruction* instr, const void* addr) VIXL_OVERRIDE;
53c68cb64496485710cdb5b8480f8fee287058c93farmvixl};
54c68cb64496485710cdb5b8480f8fee287058c93farmvixl
55c68cb64496485710cdb5b8480f8fee287058c93farmvixl
56c68cb64496485710cdb5b8480f8fee287058c93farmvixl#endif
57