brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.5 KiB · ded1ada Raw
240 lines · plain
1#ifdef SWIGPYTHON2%pythoncode%{3# ==================================4# Helper function for SBModule class5# ==================================6def in_range(symbol, section):7    """Test whether a symbol is within the range of a section."""8    symSA = symbol.GetStartAddress().GetFileAddress()9    symEA = symbol.GetEndAddress().GetFileAddress()10    secSA = section.GetFileAddress()11    secEA = secSA + section.GetByteSize()12 13    if symEA != LLDB_INVALID_ADDRESS:14        if secSA <= symSA and symEA <= secEA:15            return True16        else:17            return False18    else:19        if secSA <= symSA and symSA < secEA:20            return True21        else:22            return False23%}24#endif25 26STRING_EXTENSION_OUTSIDE(SBModule)27 28%extend lldb::SBModule {29#ifdef SWIGPYTHON30    %pythoncode %{31        # operator== is a free function, which swig does not handle, so we inject32        # our own equality operator here33        def __eq__(self, other):34            return not self.__ne__(other)35 36        def __len__(self):37            '''Return the number of symbols in a lldb.SBModule object.'''38            return self.GetNumSymbols()39 40        def __iter__(self):41            '''Iterate over all symbols in a lldb.SBModule object.'''42            return lldb_iter(self, 'GetNumSymbols', 'GetSymbolAtIndex')43 44        def section_iter(self):45            '''Iterate over all sections in a lldb.SBModule object.'''46            return lldb_iter(self, 'GetNumSections', 'GetSectionAtIndex')47 48        def compile_unit_iter(self):49            '''Iterate over all compile units in a lldb.SBModule object.'''50            return lldb_iter(self, 'GetNumCompileUnits', 'GetCompileUnitAtIndex')51 52        def symbol_in_section_iter(self, section):53            '''Given a module and its contained section, returns an iterator on the54            symbols within the section.'''55            for sym in self:56                if in_range(sym, section):57                    yield sym58 59        class symbols_access(object):60            re_compile_type = type(re.compile('.'))61            '''A helper object that will lazily hand out lldb.SBSymbol objects for a module when supplied an index, name, or regular expression.'''62            def __init__(self, sbmodule):63                self.sbmodule = sbmodule64 65            def __len__(self):66                if self.sbmodule:67                    return int(self.sbmodule.GetNumSymbols())68                return 069 70            def __getitem__(self, key):71                count = len(self)72                if type(key) is int:73                    if -count <= key < count:74                        key %= count75                        return self.sbmodule.GetSymbolAtIndex(key)76                elif type(key) is str:77                    matches = []78                    sc_list = self.sbmodule.FindSymbols(key)79                    for sc in sc_list:80                        symbol = sc.symbol81                        if symbol:82                            matches.append(symbol)83                    return matches84                elif isinstance(key, self.re_compile_type):85                    matches = []86                    for idx in range(count):87                        symbol = self.sbmodule.GetSymbolAtIndex(idx)88                        added = False89                        name = symbol.name90                        if name:91                            re_match = key.search(name)92                            if re_match:93                                matches.append(symbol)94                                added = True95                        if not added:96                            mangled = symbol.mangled97                            if mangled:98                                re_match = key.search(mangled)99                                if re_match:100                                    matches.append(symbol)101                    return matches102                else:103                    print("error: unsupported item type: %s" % type(key))104                return None105 106        def get_symbols_access_object(self):107            '''An accessor function that returns a symbols_access() object which allows lazy symbol access from a lldb.SBModule object.'''108            return self.symbols_access (self)109 110        def get_compile_units_access_object (self):111            '''An accessor function that returns a compile_units_access() object which allows lazy compile unit access from a lldb.SBModule object.'''112            return self.compile_units_access (self)113 114        def get_symbols_array(self):115            '''An accessor function that returns a list() that contains all symbols in a lldb.SBModule object.'''116            symbols = []117            for idx in range(self.num_symbols):118                symbols.append(self.GetSymbolAtIndex(idx))119            return symbols120 121        class sections_access(object):122            re_compile_type = type(re.compile('.'))123            '''A helper object that will lazily hand out lldb.SBSection objects for a module when supplied an index, name, or regular expression.'''124            def __init__(self, sbmodule):125                self.sbmodule = sbmodule126 127            def __len__(self):128                if self.sbmodule:129                    return int(self.sbmodule.GetNumSections())130                return 0131 132            def __getitem__(self, key):133                count = len(self)134                if type(key) is int:135                    if -count <= key < count:136                        key %= count137                        return self.sbmodule.GetSectionAtIndex(key)138                elif type(key) is str:139                    for idx in range(count):140                        section = self.sbmodule.GetSectionAtIndex(idx)141                        if section.name == key:142                            return section143                elif isinstance(key, self.re_compile_type):144                    matches = []145                    for idx in range(count):146                        section = self.sbmodule.GetSectionAtIndex(idx)147                        name = section.name148                        if name:149                            re_match = key.search(name)150                            if re_match:151                                matches.append(section)152                    return matches153                else:154                    print("error: unsupported item type: %s" % type(key))155                return None156 157        class compile_units_access(object):158            re_compile_type = type(re.compile('.'))159            '''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.'''160            def __init__(self, sbmodule):161                self.sbmodule = sbmodule162 163            def __len__(self):164                if self.sbmodule:165                    return int(self.sbmodule.GetNumCompileUnits())166                return 0167 168            def __getitem__(self, key):169                count = len(self)170                if type(key) is int:171                    if -count <= key < count:172                        key %= count173                        return self.sbmodule.GetCompileUnitAtIndex(key)174                elif type(key) is str:175                    is_full_path = key[0] == '/'176                    for idx in range(count):177                        comp_unit = self.sbmodule.GetCompileUnitAtIndex(idx)178                        if is_full_path:179                            if comp_unit.file.fullpath == key:180                                return comp_unit181                        else:182                            if comp_unit.file.basename == key:183                                return comp_unit184                elif isinstance(key, self.re_compile_type):185                    matches = []186                    for idx in range(count):187                        comp_unit = self.sbmodule.GetCompileUnitAtIndex(idx)188                        fullpath = comp_unit.file.fullpath189                        if fullpath:190                            re_match = key.search(fullpath)191                            if re_match:192                                matches.append(comp_unit)193                    return matches194                else:195                    print("error: unsupported item type: %s" % type(key))196                return None197 198        def get_sections_access_object(self):199            '''An accessor function that returns a sections_access() object which allows lazy section array access.'''200            return self.sections_access (self)201 202        def get_sections_array(self):203            '''An accessor function that returns an array object that contains all sections in this module object.'''204            if not hasattr(self, 'sections_array'):205                self.sections_array = []206                for idx in range(self.num_sections):207                    self.sections_array.append(self.GetSectionAtIndex(idx))208            return self.sections_array209 210        def get_compile_units_array(self):211            '''An accessor function that returns an array object that contains all compile_units in this module object.'''212            if not hasattr(self, 'compile_units_array'):213                self.compile_units_array = []214                for idx in range(self.GetNumCompileUnits()):215                    self.compile_units_array.append(self.GetCompileUnitAtIndex(idx))216            return self.compile_units_array217 218        symbols = property(get_symbols_array, None, doc='''A read only property that returns a list() of lldb.SBSymbol objects contained in this module.''')219        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''')220        sections = property(get_sections_array, None, doc='''A read only property that returns a list() of lldb.SBSection objects contained in this module.''')221        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.''')222        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''')223        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.''')224 225        def get_uuid(self):226            return uuid.UUID (self.GetUUIDString())227 228        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.''')229        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.''')230        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.''')231        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.''')232        addr_size = property(GetAddressByteSize, None, doc='''A read only property that returns the size in bytes of an address for this module.''')233        triple = property(GetTriple, None, doc='''A read only property that returns the target triple (arch-vendor-os) for this module.''')234        num_symbols = property(GetNumSymbols, None, doc='''A read only property that returns number of symbols in the module symbol table as an integer.''')235        num_sections = property(GetNumSections, None, doc='''A read only property that returns number of sections in the module as an integer.''')236 237    %}238#endif239}240