summaryrefslogtreecommitdiff
path: root/scripts/interface/SBModule.i
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/interface/SBModule.i')
-rw-r--r--scripts/interface/SBModule.i530
1 files changed, 530 insertions, 0 deletions
diff --git a/scripts/interface/SBModule.i b/scripts/interface/SBModule.i
new file mode 100644
index 0000000000000..b1b6d2a7ca3d6
--- /dev/null
+++ b/scripts/interface/SBModule.i
@@ -0,0 +1,530 @@
+//===-- SWIG Interface for SBModule -----------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+namespace lldb {
+
+%feature("docstring",
+"Represents an executable image and its associated object and symbol files.
+
+The module is designed to be able to select a single slice of an
+executable image as it would appear on disk and during program
+execution.
+
+You can retrieve SBModule from SBSymbolContext, which in turn is available
+from SBFrame.
+
+SBModule supports symbol iteration, for example,
+
+ for symbol in module:
+ name = symbol.GetName()
+ saddr = symbol.GetStartAddress()
+ eaddr = symbol.GetEndAddress()
+
+and rich comparion methods which allow the API program to use,
+
+ if thisModule == thatModule:
+ print('This module is the same as that module')
+
+to test module equality. A module also contains object file sections, namely
+SBSection. SBModule supports section iteration through section_iter(), for
+example,
+
+ print('Number of sections: %d' % module.GetNumSections())
+ for sec in module.section_iter():
+ print(sec)
+
+And to iterate the symbols within a SBSection, use symbol_in_section_iter(),
+
+ # Iterates the text section and prints each symbols within each sub-section.
+ for subsec in text_sec:
+ print(INDENT + repr(subsec))
+ for sym in exe_module.symbol_in_section_iter(subsec):
+ print(INDENT2 + repr(sym))
+ print(INDENT2 + 'symbol type: %s' % symbol_type_to_str(sym.GetType()))
+
+produces this following output:
+
+ [0x0000000100001780-0x0000000100001d5c) a.out.__TEXT.__text
+ id = {0x00000004}, name = 'mask_access(MaskAction, unsigned int)', range = [0x00000001000017c0-0x0000000100001870)
+ symbol type: code
+ id = {0x00000008}, name = 'thread_func(void*)', range = [0x0000000100001870-0x00000001000019b0)
+ symbol type: code
+ id = {0x0000000c}, name = 'main', range = [0x00000001000019b0-0x0000000100001d5c)
+ symbol type: code
+ id = {0x00000023}, name = 'start', address = 0x0000000100001780
+ symbol type: code
+ [0x0000000100001d5c-0x0000000100001da4) a.out.__TEXT.__stubs
+ id = {0x00000024}, name = '__stack_chk_fail', range = [0x0000000100001d5c-0x0000000100001d62)
+ symbol type: trampoline
+ id = {0x00000028}, name = 'exit', range = [0x0000000100001d62-0x0000000100001d68)
+ symbol type: trampoline
+ id = {0x00000029}, name = 'fflush', range = [0x0000000100001d68-0x0000000100001d6e)
+ symbol type: trampoline
+ id = {0x0000002a}, name = 'fgets', range = [0x0000000100001d6e-0x0000000100001d74)
+ symbol type: trampoline
+ id = {0x0000002b}, name = 'printf', range = [0x0000000100001d74-0x0000000100001d7a)
+ symbol type: trampoline
+ id = {0x0000002c}, name = 'pthread_create', range = [0x0000000100001d7a-0x0000000100001d80)
+ symbol type: trampoline
+ id = {0x0000002d}, name = 'pthread_join', range = [0x0000000100001d80-0x0000000100001d86)
+ symbol type: trampoline
+ id = {0x0000002e}, name = 'pthread_mutex_lock', range = [0x0000000100001d86-0x0000000100001d8c)
+ symbol type: trampoline
+ id = {0x0000002f}, name = 'pthread_mutex_unlock', range = [0x0000000100001d8c-0x0000000100001d92)
+ symbol type: trampoline
+ id = {0x00000030}, name = 'rand', range = [0x0000000100001d92-0x0000000100001d98)
+ symbol type: trampoline
+ id = {0x00000031}, name = 'strtoul', range = [0x0000000100001d98-0x0000000100001d9e)
+ symbol type: trampoline
+ id = {0x00000032}, name = 'usleep', range = [0x0000000100001d9e-0x0000000100001da4)
+ symbol type: trampoline
+ [0x0000000100001da4-0x0000000100001e2c) a.out.__TEXT.__stub_helper
+ [0x0000000100001e2c-0x0000000100001f10) a.out.__TEXT.__cstring
+ [0x0000000100001f10-0x0000000100001f68) a.out.__TEXT.__unwind_info
+ [0x0000000100001f68-0x0000000100001ff8) a.out.__TEXT.__eh_frame
+"
+) SBModule;
+class SBModule
+{
+public:
+
+ SBModule ();
+
+ SBModule (const lldb::SBModule &rhs);
+
+ SBModule (const lldb::SBModuleSpec &module_spec);
+
+ SBModule (lldb::SBProcess &process,
+ lldb::addr_t header_addr);
+
+ ~SBModule ();
+
+ bool
+ IsValid () const;
+
+ void
+ Clear();
+
+ %feature("docstring", "
+ //------------------------------------------------------------------
+ /// Get const accessor for the module file specification.
+ ///
+ /// This function returns the file for the module on the host system
+ /// that is running LLDB. This can differ from the path on the
+ /// platform since we might be doing remote debugging.
+ ///
+ /// @return
+ /// A const reference to the file specification object.
+ //------------------------------------------------------------------
+ ") GetFileSpec;
+ lldb::SBFileSpec
+ GetFileSpec () const;
+
+ %feature("docstring", "
+ //------------------------------------------------------------------
+ /// Get accessor for the module platform file specification.
+ ///
+ /// Platform file refers to the path of the module as it is known on
+ /// the remote system on which it is being debugged. For local
+ /// debugging this is always the same as Module::GetFileSpec(). But
+ /// remote debugging might mention a file '/usr/lib/liba.dylib'
+ /// which might be locally downloaded and cached. In this case the
+ /// platform file could be something like:
+ /// '/tmp/lldb/platform-cache/remote.host.computer/usr/lib/liba.dylib'
+ /// The file could also be cached in a local developer kit directory.
+ ///
+ /// @return
+ /// A const reference to the file specification object.
+ //------------------------------------------------------------------
+ ") GetPlatformFileSpec;
+ lldb::SBFileSpec
+ GetPlatformFileSpec () const;
+
+ bool
+ SetPlatformFileSpec (const lldb::SBFileSpec &platform_file);
+
+ lldb::SBFileSpec
+ GetRemoteInstallFileSpec ();
+
+ bool
+ SetRemoteInstallFileSpec (lldb::SBFileSpec &file);
+
+ %feature("docstring", "Returns the UUID of the module as a Python string."
+ ) GetUUIDString;
+ const char *
+ GetUUIDString () const;
+
+ lldb::SBSection
+ FindSection (const char *sect_name);
+
+ lldb::SBAddress
+ ResolveFileAddress (lldb::addr_t vm_addr);
+
+ lldb::SBSymbolContext
+ ResolveSymbolContextForAddress (const lldb::SBAddress& addr,
+ uint32_t resolve_scope);
+
+ bool
+ GetDescription (lldb::SBStream &description);
+
+ uint32_t
+ GetNumCompileUnits();
+
+ lldb::SBCompileUnit
+ GetCompileUnitAtIndex (uint32_t);
+
+ size_t
+ GetNumSymbols ();
+
+ lldb::SBSymbol
+ GetSymbolAtIndex (size_t idx);
+
+ lldb::SBSymbol
+ FindSymbol (const char *name,
+ lldb::SymbolType type = eSymbolTypeAny);
+
+ lldb::SBSymbolContextList
+ FindSymbols (const char *name,
+ lldb::SymbolType type = eSymbolTypeAny);
+
+
+ size_t
+ GetNumSections ();
+
+ lldb::SBSection
+ GetSectionAtIndex (size_t idx);
+
+
+ %feature("docstring", "
+ //------------------------------------------------------------------
+ /// Find functions by name.
+ ///
+ /// @param[in] name
+ /// The name of the function we are looking for.
+ ///
+ /// @param[in] name_type_mask
+ /// A logical OR of one or more FunctionNameType enum bits that
+ /// indicate what kind of names should be used when doing the
+ /// lookup. Bits include fully qualified names, base names,
+ /// C++ methods, or ObjC selectors.
+ /// See FunctionNameType for more details.
+ ///
+ /// @return
+ /// A symbol context list that gets filled in with all of the
+ /// matches.
+ //------------------------------------------------------------------
+ ") FindFunctions;
+ lldb::SBSymbolContextList
+ FindFunctions (const char *name,
+ uint32_t name_type_mask = lldb::eFunctionNameTypeAny);
+
+ lldb::SBType
+ FindFirstType (const char* name);
+
+ lldb::SBTypeList
+ FindTypes (const char* type);
+
+ lldb::SBType
+ GetTypeByID (lldb::user_id_t uid);
+
+ lldb::SBType
+ GetBasicType(lldb::BasicType type);
+
+ %feature("docstring", "
+ //------------------------------------------------------------------
+ /// Get all types matching \a type_mask from debug info in this
+ /// module.
+ ///
+ /// @param[in] type_mask
+ /// A bitfield that consists of one or more bits logically OR'ed
+ /// together from the lldb::TypeClass enumeration. This allows
+ /// you to request only structure types, or only class, struct
+ /// and union types. Passing in lldb::eTypeClassAny will return
+ /// all types found in the debug information for this module.
+ ///
+ /// @return
+ /// A list of types in this module that match \a type_mask
+ //------------------------------------------------------------------
+ ") GetTypes;
+ lldb::SBTypeList
+ GetTypes (uint32_t type_mask = lldb::eTypeClassAny);
+
+ %feature("docstring", "
+ //------------------------------------------------------------------
+ /// Find global and static variables by name.
+ ///
+ /// @param[in] target
+ /// A valid SBTarget instance representing the debuggee.
+ ///
+ /// @param[in] name
+ /// The name of the global or static variable we are looking
+ /// for.
+ ///
+ /// @param[in] max_matches
+ /// Allow the number of matches to be limited to \a max_matches.
+ ///
+ /// @return
+ /// A list of matched variables in an SBValueList.
+ //------------------------------------------------------------------
+ ") FindGlobalVariables;
+ lldb::SBValueList
+ FindGlobalVariables (lldb::SBTarget &target,
+ const char *name,
+ uint32_t max_matches);
+
+ %feature("docstring", "
+ //------------------------------------------------------------------
+ /// Find the first global (or static) variable by name.
+ ///
+ /// @param[in] target
+ /// A valid SBTarget instance representing the debuggee.
+ ///
+ /// @param[in] name
+ /// The name of the global or static variable we are looking
+ /// for.
+ ///
+ /// @return
+ /// An SBValue that gets filled in with the found variable (if any).
+ //------------------------------------------------------------------
+ ") FindFirstGlobalVariable;
+ lldb::SBValue
+ FindFirstGlobalVariable (lldb::SBTarget &target, const char *name);
+
+ lldb::ByteOrder
+ GetByteOrder ();
+
+ uint32_t
+ GetAddressByteSize();
+
+ const char *
+ GetTriple ();
+
+ uint32_t
+ GetVersion (uint32_t *versions,
+ uint32_t num_versions);
+
+ lldb::SBFileSpec
+ GetSymbolFileSpec() const;
+
+ lldb::SBAddress
+ GetObjectFileHeaderAddress() const;
+
+ bool
+ operator == (const lldb::SBModule &rhs) const;
+
+ bool
+ operator != (const lldb::SBModule &rhs) const;
+
+ %pythoncode %{
+ class symbols_access(object):
+ re_compile_type = type(re.compile('.'))
+ '''A helper object that will lazily hand out lldb.SBSymbol objects for a module when supplied an index, name, or regular expression.'''
+ def __init__(self, sbmodule):
+ self.sbmodule = sbmodule
+
+ def __len__(self):
+ if self.sbmodule:
+ return int(self.sbmodule.GetNumSymbols())
+ return 0
+
+ def __getitem__(self, key):
+ count = len(self)
+ if type(key) is int:
+ if key < count:
+ return self.sbmodule.GetSymbolAtIndex(key)
+ elif type(key) is str:
+ matches = []
+ sc_list = self.sbmodule.FindSymbols(key)
+ for sc in sc_list:
+ symbol = sc.symbol
+ if symbol:
+ matches.append(symbol)
+ return matches
+ elif isinstance(key, self.re_compile_type):
+ matches = []
+ for idx in range(count):
+ symbol = self.sbmodule.GetSymbolAtIndex(idx)
+ added = False
+ name = symbol.name
+ if name:
+ re_match = key.search(name)
+ if re_match:
+ matches.append(symbol)
+ added = True
+ if not added:
+ mangled = symbol.mangled
+ if mangled:
+ re_match = key.search(mangled)
+ if re_match:
+ matches.append(symbol)
+ return matches
+ else:
+ print("error: unsupported item type: %s" % type(key))
+ return None
+
+ def get_symbols_access_object(self):
+ '''An accessor function that returns a symbols_access() object which allows lazy symbol access from a lldb.SBModule object.'''
+ return self.symbols_access (self)
+
+ def get_compile_units_access_object (self):
+ '''An accessor function that returns a compile_units_access() object which allows lazy compile unit access from a lldb.SBModule object.'''
+ return self.compile_units_access (self)
+
+ def get_symbols_array(self):
+ '''An accessor function that returns a list() that contains all symbols in a lldb.SBModule object.'''
+ symbols = []
+ for idx in range(self.num_symbols):
+ symbols.append(self.GetSymbolAtIndex(idx))
+ return symbols
+
+ class sections_access(object):
+ re_compile_type = type(re.compile('.'))
+ '''A helper object that will lazily hand out lldb.SBSection objects for a module when supplied an index, name, or regular expression.'''
+ def __init__(self, sbmodule):
+ self.sbmodule = sbmodule
+
+ def __len__(self):
+ if self.sbmodule:
+ return int(self.sbmodule.GetNumSections())
+ return 0
+
+ def __getitem__(self, key):
+ count = len(self)
+ if type(key) is int:
+ if key < count:
+ return self.sbmodule.GetSectionAtIndex(key)
+ elif type(key) is str:
+ for idx in range(count):
+ section = self.sbmodule.GetSectionAtIndex(idx)
+ if section.name == key:
+ return section
+ elif isinstance(key, self.re_compile_type):
+ matches = []
+ for idx in range(count):
+ section = self.sbmodule.GetSectionAtIndex(idx)
+ name = section.name
+ if name:
+ re_match = key.search(name)
+ if re_match:
+ matches.append(section)
+ return matches
+ else:
+ print("error: unsupported item type: %s" % type(key))
+ return None
+
+ class compile_units_access(object):
+ re_compile_type = type(re.compile('.'))
+ '''A helper object that will lazily hand out lldb.SBCompileUnit objects for a module when supplied an index, full or partial path, or regular expression.'''
+ def __init__(self, sbmodule):
+ self.sbmodule = sbmodule
+
+ def __len__(self):
+ if self.sbmodule:
+ return int(self.sbmodule.GetNumCompileUnits())
+ return 0
+
+ def __getitem__(self, key):
+ count = len(self)
+ if type(key) is int:
+ if key < count:
+ return self.sbmodule.GetCompileUnitAtIndex(key)
+ elif type(key) is str:
+ is_full_path = key[0] == '/'
+ for idx in range(count):
+ comp_unit = self.sbmodule.GetCompileUnitAtIndex(idx)
+ if is_full_path:
+ if comp_unit.file.fullpath == key:
+ return comp_unit
+ else:
+ if comp_unit.file.basename == key:
+ return comp_unit
+ elif isinstance(key, self.re_compile_type):
+ matches = []
+ for idx in range(count):
+ comp_unit = self.sbmodule.GetCompileUnitAtIndex(idx)
+ fullpath = comp_unit.file.fullpath
+ if fullpath:
+ re_match = key.search(fullpath)
+ if re_match:
+ matches.append(comp_unit)
+ return matches
+ else:
+ print("error: unsupported item type: %s" % type(key))
+ return None
+
+ def get_sections_access_object(self):
+ '''An accessor function that returns a sections_access() object which allows lazy section array access.'''
+ return self.sections_access (self)
+
+ def get_sections_array(self):
+ '''An accessor function that returns an array object that contains all sections in this module object.'''
+ if not hasattr(self, 'sections_array'):
+ self.sections_array = []
+ for idx in range(self.num_sections):
+ self.sections_array.append(self.GetSectionAtIndex(idx))
+ return self.sections_array
+
+ def get_compile_units_array(self):
+ '''An accessor function that returns an array object that contains all compile_units in this module object.'''
+ if not hasattr(self, 'compile_units_array'):
+ self.compile_units_array = []
+ for idx in range(self.GetNumCompileUnits()):
+ self.compile_units_array.append(self.GetCompileUnitAtIndex(idx))
+ return self.compile_units_array
+
+ __swig_getmethods__["symbols"] = get_symbols_array
+ if _newclass: symbols = property(get_symbols_array, None, doc='''A read only property that returns a list() of lldb.SBSymbol objects contained in this module.''')
+
+ __swig_getmethods__["symbol"] = get_symbols_access_object
+ if _newclass: symbol = property(get_symbols_access_object, None, doc='''A read only property that can be used to access symbols by index ("symbol = module.symbol[0]"), name ("symbols = module.symbol['main']"), or using a regular expression ("symbols = module.symbol[re.compile(...)]"). The return value is a single lldb.SBSymbol object for array access, and a list() of lldb.SBSymbol objects for name and regular expression access''')
+
+ __swig_getmethods__["sections"] = get_sections_array
+ if _newclass: sections = property(get_sections_array, None, doc='''A read only property that returns a list() of lldb.SBSection objects contained in this module.''')
+
+ __swig_getmethods__["compile_units"] = get_compile_units_array
+ if _newclass: compile_units = property(get_compile_units_array, None, doc='''A read only property that returns a list() of lldb.SBCompileUnit objects contained in this module.''')
+
+ __swig_getmethods__["section"] = get_sections_access_object
+ if _newclass: section = property(get_sections_access_object, None, doc='''A read only property that can be used to access symbols by index ("section = module.section[0]"), name ("sections = module.section[\'main\']"), or using a regular expression ("sections = module.section[re.compile(...)]"). The return value is a single lldb.SBSection object for array access, and a list() of lldb.SBSection objects for name and regular expression access''')
+
+ __swig_getmethods__["compile_unit"] = get_compile_units_access_object
+ if _newclass: section = property(get_sections_access_object, None, doc='''A read only property that can be used to access compile units by index ("compile_unit = module.compile_unit[0]"), name ("compile_unit = module.compile_unit[\'main.cpp\']"), or using a regular expression ("compile_unit = module.compile_unit[re.compile(...)]"). The return value is a single lldb.SBCompileUnit object for array access or by full or partial path, and a list() of lldb.SBCompileUnit objects regular expressions.''')
+
+ def get_uuid(self):
+ return uuid.UUID (self.GetUUIDString())
+
+ __swig_getmethods__["uuid"] = get_uuid
+ if _newclass: uuid = property(get_uuid, None, doc='''A read only property that returns a standard python uuid.UUID object that represents the UUID of this module.''')
+
+ __swig_getmethods__["file"] = GetFileSpec
+ if _newclass: file = property(GetFileSpec, None, doc='''A read only property that returns an lldb object that represents the file (lldb.SBFileSpec) for this object file for this module as it is represented where it is being debugged.''')
+
+ __swig_getmethods__["platform_file"] = GetPlatformFileSpec
+ if _newclass: platform_file = property(GetPlatformFileSpec, None, doc='''A read only property that returns an lldb object that represents the file (lldb.SBFileSpec) for this object file for this module as it is represented on the current host system.''')
+
+ __swig_getmethods__["byte_order"] = GetByteOrder
+ if _newclass: byte_order = property(GetByteOrder, None, doc='''A read only property that returns an lldb enumeration value (lldb.eByteOrderLittle, lldb.eByteOrderBig, lldb.eByteOrderInvalid) that represents the byte order for this module.''')
+
+ __swig_getmethods__["addr_size"] = GetAddressByteSize
+ if _newclass: addr_size = property(GetAddressByteSize, None, doc='''A read only property that returns the size in bytes of an address for this module.''')
+
+ __swig_getmethods__["triple"] = GetTriple
+ if _newclass: triple = property(GetTriple, None, doc='''A read only property that returns the target triple (arch-vendor-os) for this module.''')
+
+ __swig_getmethods__["num_symbols"] = GetNumSymbols
+ if _newclass: num_symbols = property(GetNumSymbols, None, doc='''A read only property that returns number of symbols in the module symbol table as an integer.''')
+
+ __swig_getmethods__["num_sections"] = GetNumSections
+ if _newclass: num_sections = property(GetNumSections, None, doc='''A read only property that returns number of sections in the module as an integer.''')
+
+ %}
+
+};
+
+} // namespace lldb