1 //===-- SBInstructionList.cpp -----------------------------------*- 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 #include "lldb/API/SBInstructionList.h" 11 #include "lldb/API/SBInstruction.h" 12 #include "lldb/API/SBStream.h" 13 #include "lldb/Core/Disassembler.h" 14 #include "lldb/Core/Stream.h" 15 16 using namespace lldb; 17 using namespace lldb_private; 18 19 SBInstructionList()20SBInstructionList::SBInstructionList () : 21 m_opaque_sp() 22 { 23 } 24 SBInstructionList(const SBInstructionList & rhs)25SBInstructionList::SBInstructionList(const SBInstructionList &rhs) : 26 m_opaque_sp (rhs.m_opaque_sp) 27 { 28 } 29 30 const SBInstructionList & operator =(const SBInstructionList & rhs)31SBInstructionList::operator = (const SBInstructionList &rhs) 32 { 33 if (this != &rhs) 34 m_opaque_sp = rhs.m_opaque_sp; 35 return *this; 36 } 37 38 ~SBInstructionList()39SBInstructionList::~SBInstructionList () 40 { 41 } 42 43 bool IsValid() const44SBInstructionList::IsValid () const 45 { 46 return m_opaque_sp.get() != NULL; 47 } 48 49 size_t GetSize()50SBInstructionList::GetSize () 51 { 52 if (m_opaque_sp) 53 return m_opaque_sp->GetInstructionList().GetSize(); 54 return 0; 55 } 56 57 SBInstruction GetInstructionAtIndex(uint32_t idx)58SBInstructionList::GetInstructionAtIndex (uint32_t idx) 59 { 60 SBInstruction inst; 61 if (m_opaque_sp && idx < m_opaque_sp->GetInstructionList().GetSize()) 62 inst.SetOpaque (m_opaque_sp->GetInstructionList().GetInstructionAtIndex (idx)); 63 return inst; 64 } 65 66 void Clear()67SBInstructionList::Clear () 68 { 69 m_opaque_sp.reset(); 70 } 71 72 void AppendInstruction(SBInstruction insn)73SBInstructionList::AppendInstruction (SBInstruction insn) 74 { 75 } 76 77 void SetDisassembler(const lldb::DisassemblerSP & opaque_sp)78SBInstructionList::SetDisassembler (const lldb::DisassemblerSP &opaque_sp) 79 { 80 m_opaque_sp = opaque_sp; 81 } 82 83 void Print(FILE * out)84SBInstructionList::Print (FILE *out) 85 { 86 if (out == NULL) 87 return; 88 } 89 90 91 bool GetDescription(lldb::SBStream & description)92SBInstructionList::GetDescription (lldb::SBStream &description) 93 { 94 if (m_opaque_sp) 95 { 96 size_t num_instructions = GetSize (); 97 if (num_instructions) 98 { 99 // Call the ref() to make sure a stream is created if one deesn't 100 // exist already inside description... 101 Stream &sref = description.ref(); 102 const uint32_t max_opcode_byte_size = m_opaque_sp->GetInstructionList().GetMaxOpcocdeByteSize(); 103 for (size_t i=0; i<num_instructions; ++i) 104 { 105 Instruction *inst = m_opaque_sp->GetInstructionList().GetInstructionAtIndex (i).get(); 106 if (inst == NULL) 107 break; 108 inst->Dump (&sref, max_opcode_byte_size, true, false, NULL); 109 sref.EOL(); 110 } 111 return true; 112 } 113 } 114 return false; 115 } 116 117 118 bool DumpEmulationForAllInstructions(const char * triple)119SBInstructionList::DumpEmulationForAllInstructions (const char *triple) 120 { 121 if (m_opaque_sp) 122 { 123 size_t len = GetSize(); 124 for (size_t i = 0; i < len; ++i) 125 { 126 if (!GetInstructionAtIndex((uint32_t) i).DumpEmulation (triple)) 127 return false; 128 } 129 } 130 return true; 131 } 132 133