All the code required to generate the language bindings for Python and Lua lives under scripts, even though the majority of this code aren't scripts at all, and surrounded by scripts that are totally unrelated. I've reorganized these files and moved everything related to the language bindings into a new top-level directory named bindings. This makes the corresponding files self contained and much more discoverable. Differential revision: https://reviews.llvm.org/D72437
108 lines
3.1 KiB
C++
108 lines
3.1 KiB
C++
//===-- SWIG Interface for SBInstructionList --------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include <stdio.h>
|
|
|
|
namespace lldb {
|
|
|
|
%feature("docstring",
|
|
"Represents a list of machine instructions. SBFunction and SBSymbol have
|
|
GetInstructions() methods which return SBInstructionList instances.
|
|
|
|
SBInstructionList supports instruction (SBInstruction instance) iteration.
|
|
For example (see also SBDebugger for a more complete example),
|
|
|
|
def disassemble_instructions (insts):
|
|
for i in insts:
|
|
print i
|
|
|
|
defines a function which takes an SBInstructionList instance and prints out
|
|
the machine instructions in assembly format."
|
|
) SBInstructionList;
|
|
class SBInstructionList
|
|
{
|
|
public:
|
|
|
|
SBInstructionList ();
|
|
|
|
SBInstructionList (const SBInstructionList &rhs);
|
|
|
|
~SBInstructionList ();
|
|
|
|
bool
|
|
IsValid () const;
|
|
|
|
explicit operator bool() const;
|
|
|
|
size_t
|
|
GetSize ();
|
|
|
|
lldb::SBInstruction
|
|
GetInstructionAtIndex (uint32_t idx);
|
|
|
|
size_t GetInstructionsCount(const SBAddress &start, const SBAddress &end,
|
|
bool canSetBreakpoint);
|
|
|
|
void
|
|
Clear ();
|
|
|
|
void
|
|
AppendInstruction (lldb::SBInstruction inst);
|
|
|
|
void
|
|
Print (lldb::SBFile out);
|
|
|
|
void
|
|
Print (lldb::FileSP BORROWED);
|
|
|
|
bool
|
|
GetDescription (lldb::SBStream &description);
|
|
|
|
bool
|
|
DumpEmulationForAllInstructions (const char *triple);
|
|
|
|
STRING_EXTENSION(SBInstructionList)
|
|
|
|
#ifdef SWIGPYTHON
|
|
%pythoncode %{
|
|
def __iter__(self):
|
|
'''Iterate over all instructions in a lldb.SBInstructionList
|
|
object.'''
|
|
return lldb_iter(self, 'GetSize', 'GetInstructionAtIndex')
|
|
|
|
def __len__(self):
|
|
'''Access len of the instruction list.'''
|
|
return int(self.GetSize())
|
|
|
|
def __getitem__(self, key):
|
|
'''Access instructions by integer index for array access or by lldb.SBAddress to find an instruction that matches a section offset address object.'''
|
|
if type(key) is int:
|
|
# Find an instruction by index
|
|
if key < len(self):
|
|
return self.GetInstructionAtIndex(key)
|
|
elif type(key) is SBAddress:
|
|
# Find an instruction using a lldb.SBAddress object
|
|
lookup_file_addr = key.file_addr
|
|
closest_inst = None
|
|
for idx in range(self.GetSize()):
|
|
inst = self.GetInstructionAtIndex(idx)
|
|
inst_file_addr = inst.addr.file_addr
|
|
if inst_file_addr == lookup_file_addr:
|
|
return inst
|
|
elif inst_file_addr > lookup_file_addr:
|
|
return closest_inst
|
|
else:
|
|
closest_inst = inst
|
|
return None
|
|
%}
|
|
#endif
|
|
|
|
};
|
|
|
|
} // namespace lldb
|