1 //===-- DisassemblerLLVMC.h -------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_DisassemblerLLVMC_h_ 11 #define liblldb_DisassemblerLLVMC_h_ 12 13 #include <memory> 14 #include <mutex> 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 //------------------------------------------------------------------ 31 // Static Functions 32 //------------------------------------------------------------------ 33 static void Initialize(); 34 35 static void Terminate(); 36 37 static lldb_private::ConstString GetPluginNameStatic(); 38 39 static lldb_private::Disassembler * 40 CreateInstance(const lldb_private::ArchSpec &arch, const char *flavor); 41 42 size_t DecodeInstructions(const lldb_private::Address &base_addr, 43 const lldb_private::DataExtractor &data, 44 lldb::offset_t data_offset, size_t num_instructions, 45 bool append, bool data_from_file) override; 46 47 //------------------------------------------------------------------ 48 // PluginInterface protocol 49 //------------------------------------------------------------------ 50 lldb_private::ConstString GetPluginName() override; 51 52 uint32_t GetPluginVersion() override; 53 54 protected: 55 friend class InstructionLLVMC; 56 57 bool FlavorValidForArchSpec(const lldb_private::ArchSpec &arch, 58 const char *flavor) override; 59 60 bool IsValid() const; 61 62 int OpInfo(uint64_t PC, uint64_t Offset, uint64_t Size, int TagType, 63 void *TagBug); 64 65 const char *SymbolLookup(uint64_t ReferenceValue, uint64_t *ReferenceType, 66 uint64_t ReferencePC, const char **ReferenceName); 67 68 static int OpInfoCallback(void *DisInfo, uint64_t PC, uint64_t Offset, 69 uint64_t Size, int TagType, void *TagBug); 70 71 static const char *SymbolLookupCallback(void *DisInfo, 72 uint64_t ReferenceValue, 73 uint64_t *ReferenceType, 74 uint64_t ReferencePC, 75 const char **ReferenceName); 76 77 const lldb_private::ExecutionContext *m_exe_ctx; 78 InstructionLLVMC *m_inst; 79 std::mutex m_mutex; 80 bool m_data_from_file; 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 // liblldb_DisassemblerLLVM_h_ 91