| OLD | NEW |
| 1 /* GDB routines for manipulating the minimal symbol tables. | 1 /* GDB routines for manipulating the minimal symbol tables. |
| 2 Copyright (C) 1992-2004, 2007-2012 Free Software Foundation, Inc. | 2 Copyright (C) 1992-2013 Free Software Foundation, Inc. |
| 3 Contributed by Cygnus Support, using pieces from other GDB modules. | 3 Contributed by Cygnus Support, using pieces from other GDB modules. |
| 4 | 4 |
| 5 This file is part of GDB. | 5 This file is part of GDB. |
| 6 | 6 |
| 7 This program is free software; you can redistribute it and/or modify | 7 This program is free software; you can redistribute it and/or modify |
| 8 it under the terms of the GNU General Public License as published by | 8 it under the terms of the GNU General Public License as published by |
| 9 the Free Software Foundation; either version 3 of the License, or | 9 the Free Software Foundation; either version 3 of the License, or |
| 10 (at your option) any later version. | 10 (at your option) any later version. |
| 11 | 11 |
| 12 This program is distributed in the hope that it will be useful, | 12 This program is distributed in the hope that it will be useful, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 31 information to build useful minimal symbol tables using this structure. | 31 information to build useful minimal symbol tables using this structure. |
| 32 | 32 |
| 33 Even when a file contains enough debugging information to build a full | 33 Even when a file contains enough debugging information to build a full |
| 34 symbol table, these minimal symbols are still useful for quickly mapping | 34 symbol table, these minimal symbols are still useful for quickly mapping |
| 35 between names and addresses, and vice versa. They are also sometimes used | 35 between names and addresses, and vice versa. They are also sometimes used |
| 36 to figure out what full symbol table entries need to be read in. */ | 36 to figure out what full symbol table entries need to be read in. */ |
| 37 | 37 |
| 38 | 38 |
| 39 #include "defs.h" | 39 #include "defs.h" |
| 40 #include <ctype.h> | 40 #include <ctype.h> |
| 41 #include "gdb_string.h" | 41 #include <string.h> |
| 42 #include "symtab.h" | 42 #include "symtab.h" |
| 43 #include "bfd.h" | 43 #include "bfd.h" |
| 44 #include "filenames.h" | 44 #include "filenames.h" |
| 45 #include "symfile.h" | 45 #include "symfile.h" |
| 46 #include "objfiles.h" | 46 #include "objfiles.h" |
| 47 #include "demangle.h" | 47 #include "demangle.h" |
| 48 #include "value.h" | 48 #include "value.h" |
| 49 #include "cp-abi.h" | 49 #include "cp-abi.h" |
| 50 #include "target.h" | 50 #include "target.h" |
| 51 #include "cp-support.h" | 51 #include "cp-support.h" |
| 52 #include "language.h" | 52 #include "language.h" |
| 53 #include "cli/cli-utils.h" |
| 53 | 54 |
| 54 /* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE. | 55 /* Accumulate the minimal symbols for each objfile in bunches of BUNCH_SIZE. |
| 55 At the end, copy them all into one newly allocated location on an objfile's | 56 At the end, copy them all into one newly allocated location on an objfile's |
| 56 symbol obstack. */ | 57 symbol obstack. */ |
| 57 | 58 |
| 58 #define BUNCH_SIZE 127 | 59 #define BUNCH_SIZE 127 |
| 59 | 60 |
| 60 struct msym_bunch | 61 struct msym_bunch |
| 61 { | 62 { |
| 62 struct msym_bunch *next; | 63 struct msym_bunch *next; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 78 | 79 |
| 79 /* See minsyms.h. */ | 80 /* See minsyms.h. */ |
| 80 | 81 |
| 81 unsigned int | 82 unsigned int |
| 82 msymbol_hash_iw (const char *string) | 83 msymbol_hash_iw (const char *string) |
| 83 { | 84 { |
| 84 unsigned int hash = 0; | 85 unsigned int hash = 0; |
| 85 | 86 |
| 86 while (*string && *string != '(') | 87 while (*string && *string != '(') |
| 87 { | 88 { |
| 88 while (isspace (*string)) | 89 string = skip_spaces_const (string); |
| 89 » ++string; | |
| 90 if (*string && *string != '(') | 90 if (*string && *string != '(') |
| 91 { | 91 { |
| 92 hash = SYMBOL_HASH_NEXT (hash, *string); | 92 hash = SYMBOL_HASH_NEXT (hash, *string); |
| 93 ++string; | 93 ++string; |
| 94 } | 94 } |
| 95 } | 95 } |
| 96 return hash; | 96 return hash; |
| 97 } | 97 } |
| 98 | 98 |
| 99 /* See minsyms.h. */ | 99 /* See minsyms.h. */ |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 if (sym->demangled_hash_next == NULL) | 132 if (sym->demangled_hash_next == NULL) |
| 133 { | 133 { |
| 134 unsigned int hash = msymbol_hash_iw (SYMBOL_SEARCH_NAME (sym)) | 134 unsigned int hash = msymbol_hash_iw (SYMBOL_SEARCH_NAME (sym)) |
| 135 % MINIMAL_SYMBOL_HASH_SIZE; | 135 % MINIMAL_SYMBOL_HASH_SIZE; |
| 136 | 136 |
| 137 sym->demangled_hash_next = table[hash]; | 137 sym->demangled_hash_next = table[hash]; |
| 138 table[hash] = sym; | 138 table[hash] = sym; |
| 139 } | 139 } |
| 140 } | 140 } |
| 141 | 141 |
| 142 /* See minsyms.h. */ | |
| 143 | |
| 144 struct objfile * | |
| 145 msymbol_objfile (struct minimal_symbol *sym) | |
| 146 { | |
| 147 struct objfile *objf; | |
| 148 struct minimal_symbol *tsym; | |
| 149 | |
| 150 unsigned int hash | |
| 151 = msymbol_hash (SYMBOL_LINKAGE_NAME (sym)) % MINIMAL_SYMBOL_HASH_SIZE; | |
| 152 | |
| 153 for (objf = object_files; objf; objf = objf->next) | |
| 154 for (tsym = objf->msymbol_hash[hash]; tsym; tsym = tsym->hash_next) | |
| 155 if (tsym == sym) | |
| 156 return objf; | |
| 157 | |
| 158 /* We should always be able to find the objfile ... */ | |
| 159 internal_error (__FILE__, __LINE__, _("failed internal consistency check")); | |
| 160 } | |
| 161 | |
| 162 | |
| 163 /* Look through all the current minimal symbol tables and find the | 142 /* Look through all the current minimal symbol tables and find the |
| 164 first minimal symbol that matches NAME. If OBJF is non-NULL, limit | 143 first minimal symbol that matches NAME. If OBJF is non-NULL, limit |
| 165 the search to that objfile. If SFILE is non-NULL, the only file-scope | 144 the search to that objfile. If SFILE is non-NULL, the only file-scope |
| 166 symbols considered will be from that source file (global symbols are | 145 symbols considered will be from that source file (global symbols are |
| 167 still preferred). Returns a pointer to the minimal symbol that | 146 still preferred). Returns a pointer to the minimal symbol that |
| 168 matches, or NULL if no match is found. | 147 matches, or NULL if no match is found. |
| 169 | 148 |
| 170 Note: One instance where there may be duplicate minimal symbols with | 149 Note: One instance where there may be duplicate minimal symbols with |
| 171 the same name is when the symbol tables for a shared library and the | 150 the same name is when the symbol tables for a shared library and the |
| 172 symbol tables for an executable contain global symbols with the same | 151 symbol tables for an executable contain global symbols with the same |
| 173 names (the dynamic linker deals with the duplication). | 152 names (the dynamic linker deals with the duplication). |
| 174 | 153 |
| 175 It's also possible to have minimal symbols with different mangled | 154 It's also possible to have minimal symbols with different mangled |
| 176 names, but identical demangled names. For example, the GNU C++ v3 | 155 names, but identical demangled names. For example, the GNU C++ v3 |
| 177 ABI requires the generation of two (or perhaps three) copies of | 156 ABI requires the generation of two (or perhaps three) copies of |
| 178 constructor functions --- "in-charge", "not-in-charge", and | 157 constructor functions --- "in-charge", "not-in-charge", and |
| 179 "allocate" copies; destructors may be duplicated as well. | 158 "allocate" copies; destructors may be duplicated as well. |
| 180 Obviously, there must be distinct mangled names for each of these, | 159 Obviously, there must be distinct mangled names for each of these, |
| 181 but the demangled names are all the same: S::S or S::~S. */ | 160 but the demangled names are all the same: S::S or S::~S. */ |
| 182 | 161 |
| 183 struct minimal_symbol * | 162 static struct bound_minimal_symbol |
| 184 lookup_minimal_symbol (const char *name, const char *sfile, | 163 lookup_minimal_symbol_internal (const char *name, const char *sfile, |
| 185 » » struct objfile *objf) | 164 » » » » struct objfile *objf) |
| 186 { | 165 { |
| 187 struct objfile *objfile; | 166 struct objfile *objfile; |
| 188 struct minimal_symbol *msymbol; | 167 struct bound_minimal_symbol found_symbol = { NULL, NULL }; |
| 189 struct minimal_symbol *found_symbol = NULL; | 168 struct bound_minimal_symbol found_file_symbol = { NULL, NULL }; |
| 190 struct minimal_symbol *found_file_symbol = NULL; | 169 struct bound_minimal_symbol trampoline_symbol = { NULL, NULL }; |
| 191 struct minimal_symbol *trampoline_symbol = NULL; | |
| 192 | 170 |
| 193 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE; | 171 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE; |
| 194 unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE; | 172 unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE; |
| 195 | 173 |
| 196 int needtofreename = 0; | 174 int needtofreename = 0; |
| 197 const char *modified_name; | 175 const char *modified_name; |
| 198 | 176 |
| 199 if (sfile != NULL) | 177 if (sfile != NULL) |
| 200 sfile = lbasename (sfile); | 178 sfile = lbasename (sfile); |
| 201 | 179 |
| 202 /* For C++, canonicalize the input name. */ | 180 /* For C++, canonicalize the input name. */ |
| 203 modified_name = name; | 181 modified_name = name; |
| 204 if (current_language->la_language == language_cplus) | 182 if (current_language->la_language == language_cplus) |
| 205 { | 183 { |
| 206 char *cname = cp_canonicalize_string (name); | 184 char *cname = cp_canonicalize_string (name); |
| 207 | 185 |
| 208 if (cname) | 186 if (cname) |
| 209 { | 187 { |
| 210 modified_name = cname; | 188 modified_name = cname; |
| 211 needtofreename = 1; | 189 needtofreename = 1; |
| 212 } | 190 } |
| 213 } | 191 } |
| 214 | 192 |
| 215 for (objfile = object_files; | 193 for (objfile = object_files; |
| 216 objfile != NULL && found_symbol == NULL; | 194 objfile != NULL && found_symbol.minsym == NULL; |
| 217 objfile = objfile->next) | 195 objfile = objfile->next) |
| 218 { | 196 { |
| 197 struct minimal_symbol *msymbol; |
| 198 |
| 219 if (objf == NULL || objf == objfile | 199 if (objf == NULL || objf == objfile |
| 220 || objf == objfile->separate_debug_objfile_backlink) | 200 || objf == objfile->separate_debug_objfile_backlink) |
| 221 { | 201 { |
| 222 /* Do two passes: the first over the ordinary hash table, | 202 /* Do two passes: the first over the ordinary hash table, |
| 223 and the second over the demangled hash table. */ | 203 and the second over the demangled hash table. */ |
| 224 int pass; | 204 int pass; |
| 225 | 205 |
| 226 for (pass = 1; pass <= 2 && found_symbol == NULL; pass++) | 206 for (pass = 1; pass <= 2 && found_symbol.minsym == NULL; pass++) |
| 227 { | 207 { |
| 228 /* Select hash list according to pass. */ | 208 /* Select hash list according to pass. */ |
| 229 if (pass == 1) | 209 if (pass == 1) |
| 230 msymbol = objfile->msymbol_hash[hash]; | 210 msymbol = objfile->msymbol_hash[hash]; |
| 231 else | 211 else |
| 232 msymbol = objfile->msymbol_demangled_hash[dem_hash]; | 212 msymbol = objfile->msymbol_demangled_hash[dem_hash]; |
| 233 | 213 |
| 234 while (msymbol != NULL && found_symbol == NULL) | 214 while (msymbol != NULL && found_symbol.minsym == NULL) |
| 235 { | 215 { |
| 236 int match; | 216 int match; |
| 237 | 217 |
| 238 if (pass == 1) | 218 if (pass == 1) |
| 239 { | 219 { |
| 240 int (*cmp) (const char *, const char *); | 220 int (*cmp) (const char *, const char *); |
| 241 | 221 |
| 242 cmp = (case_sensitivity == case_sensitive_on | 222 cmp = (case_sensitivity == case_sensitive_on |
| 243 ? strcmp : strcasecmp); | 223 ? strcmp : strcasecmp); |
| 244 match = cmp (SYMBOL_LINKAGE_NAME (msymbol), | 224 match = cmp (SYMBOL_LINKAGE_NAME (msymbol), |
| 245 modified_name) == 0; | 225 modified_name) == 0; |
| 246 } | 226 } |
| 247 else | 227 else |
| 248 { | 228 { |
| 249 /* The function respects CASE_SENSITIVITY. */ | 229 /* The function respects CASE_SENSITIVITY. */ |
| 250 match = SYMBOL_MATCHES_SEARCH_NAME (msymbol, | 230 match = SYMBOL_MATCHES_SEARCH_NAME (msymbol, |
| 251 modified_name); | 231 modified_name); |
| 252 } | 232 } |
| 253 | 233 |
| 254 if (match) | 234 if (match) |
| 255 { | 235 { |
| 256 switch (MSYMBOL_TYPE (msymbol)) | 236 switch (MSYMBOL_TYPE (msymbol)) |
| 257 { | 237 { |
| 258 case mst_file_text: | 238 case mst_file_text: |
| 259 case mst_file_data: | 239 case mst_file_data: |
| 260 case mst_file_bss: | 240 case mst_file_bss: |
| 261 if (sfile == NULL | 241 if (sfile == NULL |
| 262 || filename_cmp (msymbol->filename, sfile) == 0) | 242 || filename_cmp (msymbol->filename, sfile) == 0) |
| 263 found_file_symbol = msymbol; | 243 » » » { |
| 244 » » » found_file_symbol.minsym = msymbol; |
| 245 » » » found_file_symbol.objfile = objfile; |
| 246 » » » } |
| 264 break; | 247 break; |
| 265 | 248 |
| 266 case mst_solib_trampoline: | 249 case mst_solib_trampoline: |
| 267 | 250 |
| 268 /* If a trampoline symbol is found, we prefer to | 251 /* If a trampoline symbol is found, we prefer to |
| 269 keep looking for the *real* symbol. If the | 252 keep looking for the *real* symbol. If the |
| 270 actual symbol is not found, then we'll use the | 253 actual symbol is not found, then we'll use the |
| 271 trampoline entry. */ | 254 trampoline entry. */ |
| 272 if (trampoline_symbol == NULL) | 255 if (trampoline_symbol.minsym == NULL) |
| 273 trampoline_symbol = msymbol; | 256 » » » { |
| 257 » » » trampoline_symbol.minsym = msymbol; |
| 258 » » » trampoline_symbol.objfile = objfile; |
| 259 » » » } |
| 274 break; | 260 break; |
| 275 | 261 |
| 276 case mst_unknown: | 262 case mst_unknown: |
| 277 default: | 263 default: |
| 278 found_symbol = msymbol; | 264 found_symbol.minsym = msymbol; |
| 265 » » » found_symbol.objfile = objfile; |
| 279 break; | 266 break; |
| 280 } | 267 } |
| 281 } | 268 } |
| 282 | 269 |
| 283 /* Find the next symbol on the hash chain. */ | 270 /* Find the next symbol on the hash chain. */ |
| 284 if (pass == 1) | 271 if (pass == 1) |
| 285 msymbol = msymbol->hash_next; | 272 msymbol = msymbol->hash_next; |
| 286 else | 273 else |
| 287 msymbol = msymbol->demangled_hash_next; | 274 msymbol = msymbol->demangled_hash_next; |
| 288 } | 275 } |
| 289 } | 276 } |
| 290 } | 277 } |
| 291 } | 278 } |
| 292 | 279 |
| 293 if (needtofreename) | 280 if (needtofreename) |
| 294 xfree ((void *) modified_name); | 281 xfree ((void *) modified_name); |
| 295 | 282 |
| 296 /* External symbols are best. */ | 283 /* External symbols are best. */ |
| 297 if (found_symbol) | 284 if (found_symbol.minsym != NULL) |
| 298 return found_symbol; | 285 return found_symbol; |
| 299 | 286 |
| 300 /* File-local symbols are next best. */ | 287 /* File-local symbols are next best. */ |
| 301 if (found_file_symbol) | 288 if (found_file_symbol.minsym != NULL) |
| 302 return found_file_symbol; | 289 return found_file_symbol; |
| 303 | 290 |
| 304 /* Symbols for shared library trampolines are next best. */ | 291 /* Symbols for shared library trampolines are next best. */ |
| 305 if (trampoline_symbol) | 292 return trampoline_symbol; |
| 306 return trampoline_symbol; | |
| 307 | |
| 308 return NULL; | |
| 309 } | 293 } |
| 310 | 294 |
| 311 /* See minsyms.h. */ | 295 /* See minsyms.h. */ |
| 296 |
| 297 struct minimal_symbol * |
| 298 lookup_minimal_symbol (const char *name, const char *sfile, |
| 299 struct objfile *objf) |
| 300 { |
| 301 struct bound_minimal_symbol bms = lookup_minimal_symbol_internal (name, |
| 302 sfile, |
| 303 objf); |
| 304 |
| 305 return bms.minsym; |
| 306 } |
| 307 |
| 308 /* See minsyms.h. */ |
| 309 |
| 310 struct bound_minimal_symbol |
| 311 lookup_bound_minimal_symbol (const char *name) |
| 312 { |
| 313 return lookup_minimal_symbol_internal (name, NULL, NULL); |
| 314 } |
| 315 |
| 316 /* See minsyms.h. */ |
| 312 | 317 |
| 313 void | 318 void |
| 314 iterate_over_minimal_symbols (struct objfile *objf, const char *name, | 319 iterate_over_minimal_symbols (struct objfile *objf, const char *name, |
| 315 void (*callback) (struct minimal_symbol *, | 320 void (*callback) (struct minimal_symbol *, |
| 316 void *), | 321 void *), |
| 317 void *user_data) | 322 void *user_data) |
| 318 { | 323 { |
| 319 unsigned int hash; | 324 unsigned int hash; |
| 320 struct minimal_symbol *iter; | 325 struct minimal_symbol *iter; |
| 321 int (*cmp) (const char *, const char *); | 326 int (*cmp) (const char *, const char *); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 Note that we need to look through ALL the minimal symbol tables | 472 Note that we need to look through ALL the minimal symbol tables |
| 468 before deciding on the symbol that comes closest to the specified PC. | 473 before deciding on the symbol that comes closest to the specified PC. |
| 469 This is because objfiles can overlap, for example objfile A has .text | 474 This is because objfiles can overlap, for example objfile A has .text |
| 470 at 0x100 and .data at 0x40000 and objfile B has .text at 0x234 and | 475 at 0x100 and .data at 0x40000 and objfile B has .text at 0x234 and |
| 471 .data at 0x40048. | 476 .data at 0x40048. |
| 472 | 477 |
| 473 If WANT_TRAMPOLINE is set, prefer mst_solib_trampoline symbols when | 478 If WANT_TRAMPOLINE is set, prefer mst_solib_trampoline symbols when |
| 474 there are text and trampoline symbols at the same address. | 479 there are text and trampoline symbols at the same address. |
| 475 Otherwise prefer mst_text symbols. */ | 480 Otherwise prefer mst_text symbols. */ |
| 476 | 481 |
| 477 static struct minimal_symbol * | 482 static struct bound_minimal_symbol |
| 478 lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, | 483 lookup_minimal_symbol_by_pc_section_1 (CORE_ADDR pc, |
| 479 struct obj_section *section, | 484 struct obj_section *section, |
| 480 int want_trampoline) | 485 int want_trampoline) |
| 481 { | 486 { |
| 482 int lo; | 487 int lo; |
| 483 int hi; | 488 int hi; |
| 484 int new; | 489 int new; |
| 485 struct objfile *objfile; | 490 struct objfile *objfile; |
| 486 struct minimal_symbol *msymbol; | 491 struct minimal_symbol *msymbol; |
| 487 struct minimal_symbol *best_symbol = NULL; | 492 struct minimal_symbol *best_symbol = NULL; |
| 493 struct objfile *best_objfile = NULL; |
| 494 struct bound_minimal_symbol result; |
| 488 enum minimal_symbol_type want_type, other_type; | 495 enum minimal_symbol_type want_type, other_type; |
| 489 | 496 |
| 490 want_type = want_trampoline ? mst_solib_trampoline : mst_text; | 497 want_type = want_trampoline ? mst_solib_trampoline : mst_text; |
| 491 other_type = want_trampoline ? mst_text : mst_solib_trampoline; | 498 other_type = want_trampoline ? mst_text : mst_solib_trampoline; |
| 492 | 499 |
| 493 /* We can not require the symbol found to be in section, because | 500 /* We can not require the symbol found to be in section, because |
| 494 e.g. IRIX 6.5 mdebug relies on this code returning an absolute | 501 e.g. IRIX 6.5 mdebug relies on this code returning an absolute |
| 495 symbol - but find_pc_section won't return an absolute section and | 502 symbol - but find_pc_section won't return an absolute section and |
| 496 hence the code below would skip over absolute symbols. We can | 503 hence the code below would skip over absolute symbols. We can |
| 497 still take advantage of the call to find_pc_section, though - the | 504 still take advantage of the call to find_pc_section, though - the |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 584 hi--; | 591 hi--; |
| 585 continue; | 592 continue; |
| 586 } | 593 } |
| 587 | 594 |
| 588 /* If SECTION was specified, skip any symbol from | 595 /* If SECTION was specified, skip any symbol from |
| 589 wrong section. */ | 596 wrong section. */ |
| 590 if (section | 597 if (section |
| 591 /* Some types of debug info, such as COFF, | 598 /* Some types of debug info, such as COFF, |
| 592 don't fill the bfd_section member, so don't | 599 don't fill the bfd_section member, so don't |
| 593 throw away symbols on those platforms. */ | 600 throw away symbols on those platforms. */ |
| 594 » » && SYMBOL_OBJ_SECTION (&msymbol[hi]) != NULL | 601 » » && SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) != NULL |
| 595 && (!matching_obj_sections | 602 && (!matching_obj_sections |
| 596 » » » (SYMBOL_OBJ_SECTION (&msymbol[hi]), section))) | 603 » » » (SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]), |
| 604 » » » section))) |
| 597 { | 605 { |
| 598 hi--; | 606 hi--; |
| 599 continue; | 607 continue; |
| 600 } | 608 } |
| 601 | 609 |
| 602 /* If we are looking for a trampoline and this is a | 610 /* If we are looking for a trampoline and this is a |
| 603 text symbol, or the other way around, check the | 611 text symbol, or the other way around, check the |
| 604 preceding symbol too. If they are otherwise | 612 preceding symbol too. If they are otherwise |
| 605 identical prefer that one. */ | 613 identical prefer that one. */ |
| 606 if (hi > 0 | 614 if (hi > 0 |
| 607 && MSYMBOL_TYPE (&msymbol[hi]) == other_type | 615 && MSYMBOL_TYPE (&msymbol[hi]) == other_type |
| 608 && MSYMBOL_TYPE (&msymbol[hi - 1]) == want_type | 616 && MSYMBOL_TYPE (&msymbol[hi - 1]) == want_type |
| 609 && (MSYMBOL_SIZE (&msymbol[hi]) | 617 && (MSYMBOL_SIZE (&msymbol[hi]) |
| 610 == MSYMBOL_SIZE (&msymbol[hi - 1])) | 618 == MSYMBOL_SIZE (&msymbol[hi - 1])) |
| 611 && (SYMBOL_VALUE_ADDRESS (&msymbol[hi]) | 619 && (SYMBOL_VALUE_ADDRESS (&msymbol[hi]) |
| 612 == SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1])) | 620 == SYMBOL_VALUE_ADDRESS (&msymbol[hi - 1])) |
| 613 » » && (SYMBOL_OBJ_SECTION (&msymbol[hi]) | 621 » » && (SYMBOL_OBJ_SECTION (objfile, &msymbol[hi]) |
| 614 » » » == SYMBOL_OBJ_SECTION (&msymbol[hi - 1]))) | 622 » » » == SYMBOL_OBJ_SECTION (objfile, &msymbol[hi - 1]))) |
| 615 { | 623 { |
| 616 hi--; | 624 hi--; |
| 617 continue; | 625 continue; |
| 618 } | 626 } |
| 619 | 627 |
| 620 /* If the minimal symbol has a zero size, save it | 628 /* If the minimal symbol has a zero size, save it |
| 621 but keep scanning backwards looking for one with | 629 but keep scanning backwards looking for one with |
| 622 a non-zero size. A zero size may mean that the | 630 a non-zero size. A zero size may mean that the |
| 623 symbol isn't an object or function (e.g. a | 631 symbol isn't an object or function (e.g. a |
| 624 label), or it may just mean that the size was not | 632 label), or it may just mean that the size was not |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 683 /* The minimal symbol indexed by hi now is the best one in this | 691 /* The minimal symbol indexed by hi now is the best one in this |
| 684 objfile's minimal symbol table. See if it is the best one | 692 objfile's minimal symbol table. See if it is the best one |
| 685 overall. */ | 693 overall. */ |
| 686 | 694 |
| 687 if (hi >= 0 | 695 if (hi >= 0 |
| 688 && ((best_symbol == NULL) || | 696 && ((best_symbol == NULL) || |
| 689 (SYMBOL_VALUE_ADDRESS (best_symbol) < | 697 (SYMBOL_VALUE_ADDRESS (best_symbol) < |
| 690 SYMBOL_VALUE_ADDRESS (&msymbol[hi])))) | 698 SYMBOL_VALUE_ADDRESS (&msymbol[hi])))) |
| 691 { | 699 { |
| 692 best_symbol = &msymbol[hi]; | 700 best_symbol = &msymbol[hi]; |
| 701 best_objfile = objfile; |
| 693 } | 702 } |
| 694 } | 703 } |
| 695 } | 704 } |
| 696 } | 705 } |
| 697 return (best_symbol); | 706 |
| 707 result.minsym = best_symbol; |
| 708 result.objfile = best_objfile; |
| 709 return result; |
| 698 } | 710 } |
| 699 | 711 |
| 700 struct minimal_symbol * | 712 struct bound_minimal_symbol |
| 701 lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, struct obj_section *section) | 713 lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, struct obj_section *section) |
| 702 { | 714 { |
| 703 if (section == NULL) | 715 if (section == NULL) |
| 704 { | 716 { |
| 705 /* NOTE: cagney/2004-01-27: This was using find_pc_mapped_section to | 717 /* NOTE: cagney/2004-01-27: This was using find_pc_mapped_section to |
| 706 force the section but that (well unless you're doing overlay | 718 force the section but that (well unless you're doing overlay |
| 707 debugging) always returns NULL making the call somewhat useless. */ | 719 debugging) always returns NULL making the call somewhat useless. */ |
| 708 section = find_pc_section (pc); | 720 section = find_pc_section (pc); |
| 709 if (section == NULL) | 721 if (section == NULL) |
| 710 » return NULL; | 722 » { |
| 723 » struct bound_minimal_symbol result; |
| 724 |
| 725 » memset (&result, 0, sizeof (result)); |
| 726 » return result; |
| 727 » } |
| 711 } | 728 } |
| 712 return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0); | 729 return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0); |
| 713 } | 730 } |
| 714 | 731 |
| 715 /* See minsyms.h. */ | 732 /* See minsyms.h. */ |
| 716 | 733 |
| 717 struct minimal_symbol * | 734 struct bound_minimal_symbol |
| 718 lookup_minimal_symbol_by_pc (CORE_ADDR pc) | 735 lookup_minimal_symbol_by_pc (CORE_ADDR pc) |
| 719 { | 736 { |
| 720 return lookup_minimal_symbol_by_pc_section (pc, NULL); | 737 struct obj_section *section = find_pc_section (pc); |
| 738 |
| 739 if (section == NULL) |
| 740 { |
| 741 struct bound_minimal_symbol result; |
| 742 |
| 743 memset (&result, 0, sizeof (result)); |
| 744 return result; |
| 745 } |
| 746 return lookup_minimal_symbol_by_pc_section_1 (pc, section, 0); |
| 721 } | 747 } |
| 722 | 748 |
| 723 /* Return non-zero iff PC is in an STT_GNU_IFUNC function resolver. */ | 749 /* Return non-zero iff PC is in an STT_GNU_IFUNC function resolver. */ |
| 724 | 750 |
| 725 int | 751 int |
| 726 in_gnu_ifunc_stub (CORE_ADDR pc) | 752 in_gnu_ifunc_stub (CORE_ADDR pc) |
| 727 { | 753 { |
| 728 struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (pc); | 754 struct bound_minimal_symbol msymbol = lookup_minimal_symbol_by_pc (pc); |
| 729 | 755 |
| 730 return msymbol && MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc; | 756 return msymbol.minsym && MSYMBOL_TYPE (msymbol.minsym) == mst_text_gnu_ifunc; |
| 731 } | 757 } |
| 732 | 758 |
| 733 /* See elf_gnu_ifunc_resolve_addr for its real implementation. */ | 759 /* See elf_gnu_ifunc_resolve_addr for its real implementation. */ |
| 734 | 760 |
| 735 static CORE_ADDR | 761 static CORE_ADDR |
| 736 stub_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc) | 762 stub_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc) |
| 737 { | 763 { |
| 738 error (_("GDB cannot resolve STT_GNU_IFUNC symbol at address %s without " | 764 error (_("GDB cannot resolve STT_GNU_IFUNC symbol at address %s without " |
| 739 "the ELF support compiled in."), | 765 "the ELF support compiled in."), |
| 740 paddress (gdbarch, pc)); | 766 paddress (gdbarch, pc)); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 stub_gnu_ifunc_resolver_stop, | 804 stub_gnu_ifunc_resolver_stop, |
| 779 stub_gnu_ifunc_resolver_return_stop, | 805 stub_gnu_ifunc_resolver_return_stop, |
| 780 }; | 806 }; |
| 781 | 807 |
| 782 /* A placeholder for &elf_gnu_ifunc_fns. */ | 808 /* A placeholder for &elf_gnu_ifunc_fns. */ |
| 783 | 809 |
| 784 const struct gnu_ifunc_fns *gnu_ifunc_fns_p = &stub_gnu_ifunc_fns; | 810 const struct gnu_ifunc_fns *gnu_ifunc_fns_p = &stub_gnu_ifunc_fns; |
| 785 | 811 |
| 786 /* See minsyms.h. */ | 812 /* See minsyms.h. */ |
| 787 | 813 |
| 788 struct minimal_symbol * | 814 struct bound_minimal_symbol |
| 789 lookup_minimal_symbol_and_objfile (const char *name, | 815 lookup_minimal_symbol_and_objfile (const char *name) |
| 790 » » » » struct objfile **objfile_p) | |
| 791 { | 816 { |
| 817 struct bound_minimal_symbol result; |
| 792 struct objfile *objfile; | 818 struct objfile *objfile; |
| 793 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE; | 819 unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE; |
| 794 | 820 |
| 795 ALL_OBJFILES (objfile) | 821 ALL_OBJFILES (objfile) |
| 796 { | 822 { |
| 797 struct minimal_symbol *msym; | 823 struct minimal_symbol *msym; |
| 798 | 824 |
| 799 for (msym = objfile->msymbol_hash[hash]; | 825 for (msym = objfile->msymbol_hash[hash]; |
| 800 msym != NULL; | 826 msym != NULL; |
| 801 msym = msym->hash_next) | 827 msym = msym->hash_next) |
error: old chunk mismatch |
None
| OLD | NEW |