diff options
Diffstat (limited to 'lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.h')
| -rw-r--r-- | lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.h | 60 |
1 files changed, 7 insertions, 53 deletions
diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.h b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.h index 26bed7ee0d7..b7e9ccb3470 100644 --- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.h +++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.h @@ -16,62 +16,14 @@ #include <mutex> #include <string> -// Other libraries and framework includes -#include "llvm-c/Disassembler.h" - // Project includes #include "lldb/Core/Address.h" #include "lldb/Core/Disassembler.h" #include "lldb/Core/PluginManager.h" -// Opaque references to C++ Objects in LLVM's MC. -namespace llvm { -class MCContext; -class MCInst; -class MCInstrInfo; -class MCRegisterInfo; -class MCDisassembler; -class MCInstPrinter; -class MCAsmInfo; -class MCSubtargetInfo; -} // namespace llvm - class InstructionLLVMC; class DisassemblerLLVMC : public lldb_private::Disassembler { - // 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 - // in the MC disassembler world, I added this class to manage the actual - // disassemblers. - class LLVMCDisassembler { - public: - LLVMCDisassembler(const char *triple, const char *cpu, - const char *features_str, unsigned flavor, - DisassemblerLLVMC &owner); - - ~LLVMCDisassembler(); - - uint64_t GetMCInst(const uint8_t *opcode_data, size_t opcode_data_len, - lldb::addr_t pc, llvm::MCInst &mc_inst); - void PrintMCInst(llvm::MCInst &mc_inst, std::string &inst_string, - std::string &comments_string); - void SetStyle(bool use_hex_immed, HexImmediateStyle hex_style); - bool CanBranch(llvm::MCInst &mc_inst); - bool HasDelaySlot(llvm::MCInst &mc_inst); - bool IsCall(llvm::MCInst &mc_inst); - bool IsValid() { return m_is_valid; } - - private: - bool m_is_valid; - std::unique_ptr<llvm::MCContext> m_context_ap; - std::unique_ptr<llvm::MCAsmInfo> m_asm_info_ap; - std::unique_ptr<llvm::MCSubtargetInfo> m_subtarget_info_ap; - std::unique_ptr<llvm::MCInstrInfo> m_instr_info_ap; - std::unique_ptr<llvm::MCRegisterInfo> m_reg_info_ap; - std::unique_ptr<llvm::MCInstPrinter> m_instr_printer_ap; - std::unique_ptr<llvm::MCDisassembler> m_disasm_ap; - }; - public: DisassemblerLLVMC(const lldb_private::ArchSpec &arch, const char *flavor /* = NULL */); @@ -108,9 +60,7 @@ protected: bool FlavorValidForArchSpec(const lldb_private::ArchSpec &arch, const char *flavor) override; - bool IsValid() { - return (m_disasm_ap.get() != NULL && m_disasm_ap->IsValid()); - } + bool IsValid() const; int OpInfo(uint64_t PC, uint64_t Offset, uint64_t Size, int TagType, void *TagBug); @@ -145,8 +95,12 @@ protected: std::mutex m_mutex; bool m_data_from_file; - std::unique_ptr<LLVMCDisassembler> m_disasm_ap; - std::unique_ptr<LLVMCDisassembler> m_alternate_disasm_ap; + // 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 in the MC disassembler world, + // this class was added to manage the actual disassemblers. + class MCDisasmInstance; + std::unique_ptr<MCDisasmInstance> m_disasm_up; + std::unique_ptr<MCDisasmInstance> m_alternate_disasm_up; }; #endif // liblldb_DisassemblerLLVM_h_ |

