1 //===-- SWIG Interface for SBInstructionList --------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include <stdio.h>
10 
11 namespace lldb {
12 
13 %feature("docstring",
14 "Represents a list of machine instructions.  SBFunction and SBSymbol have
15 GetInstructions() methods which return SBInstructionList instances.
16 
17 SBInstructionList supports instruction (:py:class:`SBInstruction` instance) iteration.
18 For example (see also :py:class:`SBDebugger` for a more complete example), ::
19 
20     def disassemble_instructions (insts):
21         for i in insts:
22             print i
23 
24 defines a function which takes an SBInstructionList instance and prints out
25 the machine instructions in assembly format."
26 ) SBInstructionList;
27 class SBInstructionList
28 {
29 public:
30 
31     SBInstructionList ();
32 
33     SBInstructionList (const SBInstructionList &rhs);
34 
35     ~SBInstructionList ();
36 
37     bool
38     IsValid () const;
39 
40     explicit operator bool() const;
41 
42     size_t
43     GetSize ();
44 
45     lldb::SBInstruction
46     GetInstructionAtIndex (uint32_t idx);
47 
48     size_t GetInstructionsCount(const SBAddress &start, const SBAddress &end,
49                                 bool canSetBreakpoint);
50 
51     void
52     Clear ();
53 
54     void
55     AppendInstruction (lldb::SBInstruction inst);
56 
57     void
58     Print (lldb::SBFile out);
59 
60     void
61     Print (lldb::FileSP BORROWED);
62 
63     bool
64     GetDescription (lldb::SBStream &description);
65 
66     bool
67     DumpEmulationForAllInstructions (const char *triple);
68 
69     STRING_EXTENSION(SBInstructionList)
70 
71 #ifdef SWIGPYTHON
72     %pythoncode %{
73         def __iter__(self):
74             '''Iterate over all instructions in a lldb.SBInstructionList
75             object.'''
76             return lldb_iter(self, 'GetSize', 'GetInstructionAtIndex')
77 
78         def __len__(self):
79             '''Access len of the instruction list.'''
80             return int(self.GetSize())
81 
82         def __getitem__(self, key):
83             '''Access instructions by integer index for array access or by lldb.SBAddress to find an instruction that matches a section offset address object.'''
84             if type(key) is int:
85                 # Find an instruction by index
86                 if key < len(self):
87                     return self.GetInstructionAtIndex(key)
88             elif type(key) is SBAddress:
89                 # Find an instruction using a lldb.SBAddress object
90                 lookup_file_addr = key.file_addr
91                 closest_inst = None
92                 for idx in range(self.GetSize()):
93                     inst = self.GetInstructionAtIndex(idx)
94                     inst_file_addr = inst.addr.file_addr
95                     if inst_file_addr == lookup_file_addr:
96                         return inst
97                     elif inst_file_addr > lookup_file_addr:
98                         return closest_inst
99                     else:
100                         closest_inst = inst
101             return None
102     %}
103 #endif
104 
105 };
106 
107 } // namespace lldb
108