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