1dda28197Spatrick //===-- DisassemblerLLVMC.h -------------------------------------*- C++ -*-===// 2dda28197Spatrick // 3dda28197Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4dda28197Spatrick // See https://llvm.org/LICENSE.txt for license information. 5dda28197Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dda28197Spatrick // 7dda28197Spatrick //===----------------------------------------------------------------------===// 8dda28197Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_DISASSEMBLER_LLVMC_DISASSEMBLERLLVMC_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_DISASSEMBLER_LLVMC_DISASSEMBLERLLVMC_H 11dda28197Spatrick 12dda28197Spatrick #include <memory> 13dda28197Spatrick #include <mutex> 14*f6aab3d8Srobert #include <optional> 15dda28197Spatrick #include <string> 16dda28197Spatrick 17dda28197Spatrick #include "lldb/Core/Address.h" 18dda28197Spatrick #include "lldb/Core/Disassembler.h" 19dda28197Spatrick #include "lldb/Core/PluginManager.h" 20dda28197Spatrick 21dda28197Spatrick class InstructionLLVMC; 22dda28197Spatrick 23dda28197Spatrick class DisassemblerLLVMC : public lldb_private::Disassembler { 24dda28197Spatrick public: 25dda28197Spatrick DisassemblerLLVMC(const lldb_private::ArchSpec &arch, 26dda28197Spatrick const char *flavor /* = NULL */); 27dda28197Spatrick 28dda28197Spatrick ~DisassemblerLLVMC() override; 29dda28197Spatrick 30dda28197Spatrick // Static Functions 31dda28197Spatrick static void Initialize(); 32dda28197Spatrick 33dda28197Spatrick static void Terminate(); 34dda28197Spatrick GetPluginNameStatic()35*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "llvm-mc"; } 36dda28197Spatrick 37dda28197Spatrick static lldb_private::Disassembler * 38dda28197Spatrick CreateInstance(const lldb_private::ArchSpec &arch, const char *flavor); 39dda28197Spatrick 40dda28197Spatrick size_t DecodeInstructions(const lldb_private::Address &base_addr, 41dda28197Spatrick const lldb_private::DataExtractor &data, 42dda28197Spatrick lldb::offset_t data_offset, size_t num_instructions, 43dda28197Spatrick bool append, bool data_from_file) override; 44dda28197Spatrick 45dda28197Spatrick // PluginInterface protocol GetPluginName()46*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 47dda28197Spatrick 48dda28197Spatrick protected: 49dda28197Spatrick friend class InstructionLLVMC; 50dda28197Spatrick 51dda28197Spatrick bool FlavorValidForArchSpec(const lldb_private::ArchSpec &arch, 52dda28197Spatrick const char *flavor) override; 53dda28197Spatrick 54dda28197Spatrick bool IsValid() const; 55dda28197Spatrick 56dda28197Spatrick int OpInfo(uint64_t PC, uint64_t Offset, uint64_t Size, int TagType, 57dda28197Spatrick void *TagBug); 58dda28197Spatrick 59dda28197Spatrick const char *SymbolLookup(uint64_t ReferenceValue, uint64_t *ReferenceType, 60dda28197Spatrick uint64_t ReferencePC, const char **ReferenceName); 61dda28197Spatrick 62dda28197Spatrick static int OpInfoCallback(void *DisInfo, uint64_t PC, uint64_t Offset, 63dda28197Spatrick uint64_t Size, int TagType, void *TagBug); 64dda28197Spatrick 65dda28197Spatrick static const char *SymbolLookupCallback(void *DisInfo, 66dda28197Spatrick uint64_t ReferenceValue, 67dda28197Spatrick uint64_t *ReferenceType, 68dda28197Spatrick uint64_t ReferencePC, 69dda28197Spatrick const char **ReferenceName); 70dda28197Spatrick 71dda28197Spatrick const lldb_private::ExecutionContext *m_exe_ctx; 72dda28197Spatrick InstructionLLVMC *m_inst; 73dda28197Spatrick std::mutex m_mutex; 74dda28197Spatrick bool m_data_from_file; 75*f6aab3d8Srobert // Save the AArch64 ADRP instruction word and address it was at, 76*f6aab3d8Srobert // in case the next instruction is an ADD to the same register; 77*f6aab3d8Srobert // this is a pc-relative address calculation and we need both 78*f6aab3d8Srobert // parts to calculate the symbolication. 79*f6aab3d8Srobert lldb::addr_t m_adrp_address; 80*f6aab3d8Srobert std::optional<uint32_t> m_adrp_insn; 81dda28197Spatrick 82dda28197Spatrick // Since we need to make two actual MC Disassemblers for ARM (ARM & THUMB), 83dda28197Spatrick // and there's a bit of goo to set up and own in the MC disassembler world, 84dda28197Spatrick // this class was added to manage the actual disassemblers. 85dda28197Spatrick class MCDisasmInstance; 86dda28197Spatrick std::unique_ptr<MCDisasmInstance> m_disasm_up; 87dda28197Spatrick std::unique_ptr<MCDisasmInstance> m_alternate_disasm_up; 88dda28197Spatrick }; 89dda28197Spatrick 90dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_DISASSEMBLER_LLVMC_DISASSEMBLERLLVMC_H 91