1 //===-- DisassemblerLLVMC.h -------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_DisassemblerLLVMC_h_
11 #define liblldb_DisassemblerLLVMC_h_
15 #include "llvm-c/Disassembler.h"
17 // Opaque references to C++ Objects in LLVM's MC.
27 class MCSubtargetInfo;
30 #include "lldb/Core/Address.h"
31 #include "lldb/Core/Disassembler.h"
32 #include "lldb/Core/PluginManager.h"
33 #include "lldb/Host/Mutex.h"
35 class InstructionLLVMC;
37 class DisassemblerLLVMC : public lldb_private::Disassembler
39 // Since we need to make two actual MC Disassemblers for ARM (ARM & THUMB), and there's a bit of goo to set up and own
40 // in the MC disassembler world, I added this class to manage the actual disassemblers.
41 class LLVMCDisassembler
44 LLVMCDisassembler (const char *triple, unsigned flavor, DisassemblerLLVMC &owner);
48 uint64_t GetMCInst (const uint8_t *opcode_data, size_t opcode_data_len, lldb::addr_t pc, llvm::MCInst &mc_inst);
49 uint64_t PrintMCInst (llvm::MCInst &mc_inst, char *output_buffer, size_t out_buffer_len);
50 void SetStyle (bool use_hex_immed, HexImmediateStyle hex_style);
51 bool CanBranch (llvm::MCInst &mc_inst);
59 std::unique_ptr<llvm::MCContext> m_context_ap;
60 std::unique_ptr<llvm::MCAsmInfo> m_asm_info_ap;
61 std::unique_ptr<llvm::MCSubtargetInfo> m_subtarget_info_ap;
62 std::unique_ptr<llvm::MCInstrInfo> m_instr_info_ap;
63 std::unique_ptr<llvm::MCRegisterInfo> m_reg_info_ap;
64 std::unique_ptr<llvm::MCInstPrinter> m_instr_printer_ap;
65 std::unique_ptr<llvm::MCDisassembler> m_disasm_ap;
69 //------------------------------------------------------------------
71 //------------------------------------------------------------------
78 static lldb_private::ConstString
79 GetPluginNameStatic();
81 static lldb_private::Disassembler *
82 CreateInstance(const lldb_private::ArchSpec &arch, const char *flavor);
84 DisassemblerLLVMC(const lldb_private::ArchSpec &arch, const char *flavor /* = NULL */);
90 DecodeInstructions (const lldb_private::Address &base_addr,
91 const lldb_private::DataExtractor& data,
92 lldb::offset_t data_offset,
93 size_t num_instructions,
97 //------------------------------------------------------------------
98 // PluginInterface protocol
99 //------------------------------------------------------------------
100 virtual lldb_private::ConstString
107 friend class InstructionLLVMC;
110 FlavorValidForArchSpec (const lldb_private::ArchSpec &arch, const char *flavor);
115 return (m_disasm_ap.get() != NULL && m_disasm_ap->IsValid());
118 int OpInfo(uint64_t PC,
124 const char *SymbolLookup (uint64_t ReferenceValue,
125 uint64_t *ReferenceType,
126 uint64_t ReferencePC,
127 const char **ReferenceName);
129 static int OpInfoCallback (void *DisInfo,
136 static const char *SymbolLookupCallback(void *DisInfo,
137 uint64_t ReferenceValue,
138 uint64_t *ReferenceType,
139 uint64_t ReferencePC,
140 const char **ReferenceName);
142 void Lock(InstructionLLVMC *inst,
143 const lldb_private::ExecutionContext *exe_ctx)
157 const lldb_private::ExecutionContext *m_exe_ctx;
158 InstructionLLVMC *m_inst;
159 lldb_private::Mutex m_mutex;
160 bool m_data_from_file;
162 std::unique_ptr<LLVMCDisassembler> m_disasm_ap;
163 std::unique_ptr<LLVMCDisassembler> m_alternate_disasm_ap;
166 #endif // liblldb_DisassemblerLLVM_h_