Changeset 0c8e692 in mainline for generic/src/debug/symtab.c
- Timestamp:
- 2005-12-11T19:55:56Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3550c393
- Parents:
- 54aff98
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
generic/src/debug/symtab.c
r54aff98 r0c8e692 56 56 } 57 57 58 /** Find symbols that match the parameter forward and print them 59 * 60 * @param name - search string 61 * @param startpos - starting position, changes to found position 62 * @return Pointer to the part of string that should be completed or NULL 63 */ 64 static char * symtab_search_one(const char *name, int *startpos) 65 { 66 int namelen = strlen(name); 67 char *curname; 68 int i,j; 69 char *foundsym = NULL; 70 int foundpos = 0; 71 int colonoffset = -1; 72 73 for (i=0;name[i];i++) 74 if (name[i] == ':') { 75 colonoffset = i; 76 break; 77 } 78 79 for (i=*startpos;symbol_table[i].address_le;++i) { 80 /* Find a ':' in name */ 81 curname = symbol_table[i].symbol_name; 82 for (j=0; curname[j] && curname[j] != ':'; j++) 83 ; 84 if (!curname[j]) 85 continue; 86 j -= colonoffset; 87 curname += j; 88 if (strlen(curname) < namelen) 89 continue; 90 if (strncmp(curname, name, namelen) == 0) { 91 *startpos = i; 92 return curname+namelen; 93 } 94 } 95 return NULL; 96 } 97 58 98 /** Return address that corresponds to the entry 59 99 * 60 * Search symbol table, and if the address ENDS with 61 * the parameter, return value 100 * Search symbol table, and if there is one match, return it 62 101 * 63 102 * @param name Name of the symbol … … 66 105 __address get_symbol_addr(const char *name) 67 106 { 68 count_t i;69 107 count_t found = 0; 70 count_t found_pos; 108 __address addr = NULL; 109 char *hint; 110 int i; 71 111 72 count_t nmlen = strlen(name); 73 count_t slen; 74 75 for (i=0;symbol_table[i].address_le;++i) { 76 slen = strlen(symbol_table[i].symbol_name); 77 if (slen < nmlen) 78 continue; 79 if (strncmp(name, symbol_table[i].symbol_name + (slen-nmlen), 80 nmlen) == 0) { 112 i = 0; 113 while ((hint=symtab_search_one(name, &i))) { 114 if (!strlen(hint)) { 115 addr = __u64_le2host(symbol_table[i].address_le); 81 116 found++; 82 found_pos = i;83 117 } 118 i++; 84 119 } 85 if (found == 0) 86 return NULL; 87 if (found == 1) 88 return __u64_le2host(symbol_table[found_pos].address_le); 89 return ((__address) -1); 120 if (found > 1) 121 return ((__address) -1); 122 return addr; 90 123 } 91 124 125 /** Find symbols that match parameter and prints them */ 92 126 void symtab_print_search(const char *name) 93 127 { 94 128 int i; 95 count_t nmlen = strlen(name);96 count_t slen;97 129 __address addr; 98 130 char *realname; 99 131 100 for (i=0;symbol_table[i].address_le;++i) { 101 slen = strlen(symbol_table[i].symbol_name); 102 if (slen < nmlen) 103 continue; 104 if (strncmp(name, symbol_table[i].symbol_name + (slen-nmlen), 105 nmlen) == 0) { 106 addr = __u64_le2host(symbol_table[i].address_le); 107 realname = symbol_table[i].symbol_name; 108 printf("0x%p: %s\n", addr, realname); 132 133 i = 0; 134 while (symtab_search_one(name, &i)) { 135 addr = __u64_le2host(symbol_table[i].address_le); 136 realname = symbol_table[i].symbol_name; 137 printf("0x%p: %s\n", addr, realname); 138 i++; 139 } 140 } 141 142 /** Symtab completion 143 * 144 * @param name - Search string, completes to symbol name 145 * @returns - 0 - nothing found, 1 - success, >1 print duplicates 146 */ 147 int symtab_compl(char *name) 148 { 149 char output[MAX_SYMBOL_NAME+1]; 150 int startpos = 0; 151 char *foundtxt; 152 int found = 0; 153 int i; 154 155 /* Do not print everything */ 156 if (!strlen(name)) 157 return 0; 158 159 output[0] = '\0'; 160 161 while ((foundtxt = symtab_search_one(name, &startpos))) { 162 startpos++; 163 if (!found) 164 strncpy(output, foundtxt, strlen(foundtxt)+1); 165 else { 166 for (i=0; output[i] && foundtxt[i] && output[i]==foundtxt[i]; i++) 167 ; 168 output[i] = '\0'; 169 } 170 found++; 171 } 172 if (!found) 173 return 0; 174 175 if (found > 1) { 176 printf("\n"); 177 startpos = 0; 178 while ((foundtxt = symtab_search_one(name, &startpos))) { 179 printf("%s\n", symbol_table[startpos].symbol_name); 180 startpos++; 109 181 } 110 182 } 183 strncpy(name, output, MAX_SYMBOL_NAME); 184 return found; 185 111 186 }
Note:
See TracChangeset
for help on using the changeset viewer.