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 11namespace lldb { 12 13%feature("docstring", 14"Represents a list of machine instructions. SBFunction and SBSymbol have 15GetInstructions() methods which return SBInstructionList instances. 16 17SBInstructionList supports instruction (SBInstruction instance) iteration. 18For example (see also SBDebugger for a more complete example), 19 20def disassemble_instructions (insts): 21 for i in insts: 22 print i 23 24defines a function which takes an SBInstructionList instance and prints out 25the machine instructions in assembly format." 26) SBInstructionList; 27class SBInstructionList 28{ 29public: 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