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