diff options
Diffstat (limited to 'scripts/interface/SBModule.i')
| -rw-r--r-- | scripts/interface/SBModule.i | 530 | 
1 files changed, 530 insertions, 0 deletions
| diff --git a/scripts/interface/SBModule.i b/scripts/interface/SBModule.i new file mode 100644 index 000000000000..b1b6d2a7ca3d --- /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 | 
