| OLD | NEW |
| 1 /* Partial symbol tables. | 1 /* Partial symbol tables. |
| 2 | 2 |
| 3 Copyright (C) 2009-2012 Free Software Foundation, Inc. | 3 Copyright (C) 2009-2012 Free Software Foundation, Inc. |
| 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. |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 | 38 |
| 39 #ifndef DEV_TTY | 39 #ifndef DEV_TTY |
| 40 #define DEV_TTY "/dev/tty" | 40 #define DEV_TTY "/dev/tty" |
| 41 #endif | 41 #endif |
| 42 | 42 |
| 43 struct psymbol_bcache | 43 struct psymbol_bcache |
| 44 { | 44 { |
| 45 struct bcache *bcache; | 45 struct bcache *bcache; |
| 46 }; | 46 }; |
| 47 | 47 |
| 48 /* A fast way to get from a psymtab to its symtab (after the first time). */ | |
| 49 #define PSYMTAB_TO_SYMTAB(pst) \ | |
| 50 ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst)) | |
| 51 | |
| 52 static struct partial_symbol *match_partial_symbol (struct partial_symtab *, | 48 static struct partial_symbol *match_partial_symbol (struct partial_symtab *, |
| 53 int, | 49 int, |
| 54 const char *, domain_enum, | 50 const char *, domain_enum, |
| 55 symbol_compare_ftype *, | 51 symbol_compare_ftype *, |
| 56 symbol_compare_ftype *); | 52 symbol_compare_ftype *); |
| 57 | 53 |
| 58 static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *, | 54 static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *, |
| 59 const char *, int, | 55 const char *, int, |
| 60 domain_enum); | 56 domain_enum); |
| 61 | 57 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 partial_map_expand_apply (struct objfile *objfile, | 128 partial_map_expand_apply (struct objfile *objfile, |
| 133 const char *name, | 129 const char *name, |
| 134 const char *full_path, | 130 const char *full_path, |
| 135 const char *real_path, | 131 const char *real_path, |
| 136 struct partial_symtab *pst, | 132 struct partial_symtab *pst, |
| 137 int (*callback) (struct symtab *, void *), | 133 int (*callback) (struct symtab *, void *), |
| 138 void *data) | 134 void *data) |
| 139 { | 135 { |
| 140 struct symtab *last_made = objfile->symtabs; | 136 struct symtab *last_made = objfile->symtabs; |
| 141 | 137 |
| 138 /* Shared psymtabs should never be seen here. Instead they should |
| 139 be handled properly by the caller. */ |
| 140 gdb_assert (pst->user == NULL); |
| 141 |
| 142 /* Don't visit already-expanded psymtabs. */ | 142 /* Don't visit already-expanded psymtabs. */ |
| 143 if (pst->readin) | 143 if (pst->readin) |
| 144 return 0; | 144 return 0; |
| 145 | 145 |
| 146 /* This may expand more than one symtab, and we want to iterate over | 146 /* This may expand more than one symtab, and we want to iterate over |
| 147 all of them. */ | 147 all of them. */ |
| 148 psymtab_to_symtab (pst); | 148 psymtab_to_symtab (pst); |
| 149 | 149 |
| 150 return iterate_over_some_symtabs (name, full_path, real_path, callback, data, | 150 return iterate_over_some_symtabs (name, full_path, real_path, callback, data, |
| 151 objfile->symtabs, last_made); | 151 objfile->symtabs, last_made); |
| 152 } | 152 } |
| 153 | 153 |
| 154 /* Implementation of the map_symtabs_matching_filename method. */ | 154 /* Implementation of the map_symtabs_matching_filename method. */ |
| 155 | 155 |
| 156 static int | 156 static int |
| 157 partial_map_symtabs_matching_filename (struct objfile *objfile, | 157 partial_map_symtabs_matching_filename (struct objfile *objfile, |
| 158 const char *name, | 158 const char *name, |
| 159 const char *full_path, | 159 const char *full_path, |
| 160 const char *real_path, | 160 const char *real_path, |
| 161 int (*callback) (struct symtab *, | 161 int (*callback) (struct symtab *, |
| 162 void *), | 162 void *), |
| 163 void *data) | 163 void *data) |
| 164 { | 164 { |
| 165 struct partial_symtab *pst; | 165 struct partial_symtab *pst; |
| 166 const char *name_basename = lbasename (name); | 166 const char *name_basename = lbasename (name); |
| 167 int name_len = strlen (name); |
| 168 int is_abs = IS_ABSOLUTE_PATH (name); |
| 167 | 169 |
| 168 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) | 170 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) |
| 169 { | 171 { |
| 170 if (FILENAME_CMP (name, pst->filename) == 0) | 172 /* We can skip shared psymtabs here, because any file name will be |
| 173 attached to the unshared psymtab. */ |
| 174 if (pst->user != NULL) |
| 175 continue; |
| 176 |
| 177 /* Anonymous psymtabs don't have a file name. */ |
| 178 if (pst->anonymous) |
| 179 continue; |
| 180 |
| 181 if (FILENAME_CMP (name, pst->filename) == 0 |
| 182 » || (!is_abs && compare_filenames_for_search (pst->filename, |
| 183 » » » » » » name, name_len))) |
| 171 { | 184 { |
| 172 if (partial_map_expand_apply (objfile, name, full_path, real_path, | 185 if (partial_map_expand_apply (objfile, name, full_path, real_path, |
| 173 pst, callback, data)) | 186 pst, callback, data)) |
| 174 return 1; | 187 return 1; |
| 175 } | 188 } |
| 176 | 189 |
| 177 /* Before we invoke realpath, which can get expensive when many | 190 /* Before we invoke realpath, which can get expensive when many |
| 178 files are involved, do a quick comparison of the basenames. */ | 191 files are involved, do a quick comparison of the basenames. */ |
| 179 if (! basenames_may_differ | 192 if (! basenames_may_differ |
| 180 && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0) | 193 && FILENAME_CMP (name_basename, lbasename (pst->filename)) != 0) |
| 181 continue; | 194 continue; |
| 182 | 195 |
| 183 /* If the user gave us an absolute path, try to find the file in | 196 /* If the user gave us an absolute path, try to find the file in |
| 184 this symtab and use its absolute path. */ | 197 this symtab and use its absolute path. */ |
| 185 if (full_path != NULL) | 198 if (full_path != NULL) |
| 186 { | 199 { |
| 187 psymtab_to_fullname (pst); | 200 psymtab_to_fullname (pst); |
| 188 if (pst->fullname != NULL | 201 if (pst->fullname != NULL |
| 189 » && FILENAME_CMP (full_path, pst->fullname) == 0) | 202 » && (FILENAME_CMP (full_path, pst->fullname) == 0 |
| 203 » » || (!is_abs && compare_filenames_for_search (pst->fullname, |
| 204 » » » » » » » name, name_len)))) |
| 190 { | 205 { |
| 191 if (partial_map_expand_apply (objfile, name, full_path, real_path, | 206 if (partial_map_expand_apply (objfile, name, full_path, real_path, |
| 192 pst, callback, data)) | 207 pst, callback, data)) |
| 193 return 1; | 208 return 1; |
| 194 } | 209 } |
| 195 } | 210 } |
| 196 | 211 |
| 197 if (real_path != NULL) | 212 if (real_path != NULL) |
| 198 { | 213 { |
| 199 char *rp = NULL; | 214 char *rp = NULL; |
| 200 psymtab_to_fullname (pst); | 215 psymtab_to_fullname (pst); |
| 201 if (pst->fullname != NULL) | 216 if (pst->fullname != NULL) |
| 202 { | 217 { |
| 203 rp = gdb_realpath (pst->fullname); | 218 rp = gdb_realpath (pst->fullname); |
| 204 make_cleanup (xfree, rp); | 219 make_cleanup (xfree, rp); |
| 205 } | 220 } |
| 206 » if (rp != NULL && FILENAME_CMP (real_path, rp) == 0) | 221 » if (rp != NULL |
| 222 » && (FILENAME_CMP (real_path, rp) == 0 |
| 223 » » || (!is_abs && compare_filenames_for_search (real_path, |
| 224 » » » » » » » name, name_len)))) |
| 207 { | 225 { |
| 208 if (partial_map_expand_apply (objfile, name, full_path, real_path, | 226 if (partial_map_expand_apply (objfile, name, full_path, real_path, |
| 209 pst, callback, data)) | 227 pst, callback, data)) |
| 210 return 1; | 228 return 1; |
| 211 } | 229 } |
| 212 } | 230 } |
| 213 } | 231 } |
| 214 | 232 |
| 215 /* Now, search for a matching tail (only if name doesn't have any dirs). */ | |
| 216 | |
| 217 if (name_basename == name) | |
| 218 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) | |
| 219 { | |
| 220 if (FILENAME_CMP (lbasename (pst->filename), name) == 0) | |
| 221 if (partial_map_expand_apply (objfile, name, full_path, real_path, pst, | |
| 222 callback, data)) | |
| 223 return 1; | |
| 224 } | |
| 225 | |
| 226 return 0; | 233 return 0; |
| 227 } | 234 } |
| 228 | 235 |
| 229 /* Find which partial symtab contains PC and SECTION starting at psymtab PST. | 236 /* Find which partial symtab contains PC and SECTION starting at psymtab PST. |
| 230 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */ | 237 We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */ |
| 231 | 238 |
| 232 static struct partial_symtab * | 239 static struct partial_symtab * |
| 233 find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section, | 240 find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section, |
| 234 struct partial_symtab *pst, | 241 struct partial_symtab *pst, |
| 235 struct minimal_symbol *msymbol) | 242 struct minimal_symbol *msymbol) |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 387 msymbol); | 394 msymbol); |
| 388 if (ps) | 395 if (ps) |
| 389 { | 396 { |
| 390 if (warn_if_readin && ps->readin) | 397 if (warn_if_readin && ps->readin) |
| 391 /* Might want to error() here (in case symtab is corrupt and | 398 /* Might want to error() here (in case symtab is corrupt and |
| 392 will cause a core dump), but maybe we can successfully | 399 will cause a core dump), but maybe we can successfully |
| 393 continue, so let's not. */ | 400 continue, so let's not. */ |
| 394 warning (_("\ | 401 warning (_("\ |
| 395 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"), | 402 (Internal error: pc %s in read in psymtab, but not in symtab.)\n"), |
| 396 paddress (get_objfile_arch (ps->objfile), pc)); | 403 paddress (get_objfile_arch (ps->objfile), pc)); |
| 397 return PSYMTAB_TO_SYMTAB (ps); | 404 psymtab_to_symtab (ps); |
| 405 return ps->symtab; |
| 398 } | 406 } |
| 399 return NULL; | 407 return NULL; |
| 400 } | 408 } |
| 401 | 409 |
| 402 /* Find which partial symbol within a psymtab matches PC and SECTION. | 410 /* Find which partial symbol within a psymtab matches PC and SECTION. |
| 403 Return 0 if none. */ | 411 Return 0 if none. */ |
| 404 | 412 |
| 405 static struct partial_symbol * | 413 static struct partial_symbol * |
| 406 find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc, | 414 find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc, |
| 407 struct obj_section *section) | 415 struct obj_section *section) |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 return psym; | 507 return psym; |
| 500 } | 508 } |
| 501 | 509 |
| 502 static struct symtab * | 510 static struct symtab * |
| 503 lookup_symbol_aux_psymtabs (struct objfile *objfile, | 511 lookup_symbol_aux_psymtabs (struct objfile *objfile, |
| 504 int block_index, const char *name, | 512 int block_index, const char *name, |
| 505 const domain_enum domain) | 513 const domain_enum domain) |
| 506 { | 514 { |
| 507 struct partial_symtab *ps; | 515 struct partial_symtab *ps; |
| 508 const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0); | 516 const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0); |
| 517 struct symtab *stab_best = NULL; |
| 509 | 518 |
| 510 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) | 519 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) |
| 511 { | 520 { |
| 512 if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain)) | 521 if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain)) |
| 513 { | 522 { |
| 514 struct symbol *sym = NULL; | 523 struct symbol *sym = NULL; |
| 515 » struct symtab *stab = PSYMTAB_TO_SYMTAB (ps); | 524 » struct symtab *stab = psymtab_to_symtab (ps); |
| 516 | 525 |
| 517 /* Some caution must be observed with overloaded functions | 526 /* Some caution must be observed with overloaded functions |
| 518 and methods, since the psymtab will not contain any overload | 527 and methods, since the psymtab will not contain any overload |
| 519 information (but NAME might contain it). */ | 528 information (but NAME might contain it). */ |
| 520 if (stab->primary) | 529 if (stab->primary) |
| 521 { | 530 { |
| 522 struct blockvector *bv = BLOCKVECTOR (stab); | 531 struct blockvector *bv = BLOCKVECTOR (stab); |
| 523 struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); | 532 struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); |
| 524 | 533 |
| 525 sym = lookup_block_symbol (block, name, domain); | 534 sym = lookup_block_symbol (block, name, domain); |
| 526 } | 535 } |
| 527 | 536 |
| 528 if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) | 537 if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) |
| 529 » return stab; | 538 » { |
| 539 » if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) |
| 540 » return stab; |
| 541 |
| 542 » stab_best = stab; |
| 543 » } |
| 530 | 544 |
| 531 /* Keep looking through other psymtabs. */ | 545 /* Keep looking through other psymtabs. */ |
| 532 } | 546 } |
| 533 } | 547 } |
| 534 | 548 |
| 535 return NULL; | 549 return stab_best; |
| 536 } | 550 } |
| 537 | 551 |
| 538 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search | 552 /* Look in PST for a symbol in DOMAIN whose name matches NAME. Search |
| 539 the global block of PST if GLOBAL, and otherwise the static block. | 553 the global block of PST if GLOBAL, and otherwise the static block. |
| 540 MATCH is the comparison operation that returns true iff MATCH (s, | 554 MATCH is the comparison operation that returns true iff MATCH (s, |
| 541 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is | 555 NAME), where s is a SYMBOL_SEARCH_NAME. If ORDERED_COMPARE is |
| 542 non-null, the symbols in the block are assumed to be ordered | 556 non-null, the symbols in the block are assumed to be ordered |
| 543 according to it (allowing binary search). It must be compatible | 557 according to it (allowing binary search). It must be compatible |
| 544 with MATCH. Returns the symbol, if found, and otherwise NULL. */ | 558 with MATCH. Returns the symbol, if found, and otherwise NULL. */ |
| 545 | 559 |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 return (*psym); | 768 return (*psym); |
| 755 } | 769 } |
| 756 } | 770 } |
| 757 } | 771 } |
| 758 | 772 |
| 759 do_cleanups (cleanup); | 773 do_cleanups (cleanup); |
| 760 return (NULL); | 774 return (NULL); |
| 761 } | 775 } |
| 762 | 776 |
| 763 /* Get the symbol table that corresponds to a partial_symtab. | 777 /* Get the symbol table that corresponds to a partial_symtab. |
| 764 This is fast after the first time you do it. In fact, there | 778 This is fast after the first time you do it. */ |
| 765 is an even faster macro PSYMTAB_TO_SYMTAB that does the fast | |
| 766 case inline. */ | |
| 767 | 779 |
| 768 static struct symtab * | 780 static struct symtab * |
| 769 psymtab_to_symtab (struct partial_symtab *pst) | 781 psymtab_to_symtab (struct partial_symtab *pst) |
| 770 { | 782 { |
| 783 /* If it is a shared psymtab, find an unshared psymtab that includes |
| 784 it. Any such psymtab will do. */ |
| 785 while (pst->user != NULL) |
| 786 pst = pst->user; |
| 787 |
| 771 /* If it's been looked up before, return it. */ | 788 /* If it's been looked up before, return it. */ |
| 772 if (pst->symtab) | 789 if (pst->symtab) |
| 773 return pst->symtab; | 790 return pst->symtab; |
| 774 | 791 |
| 775 /* If it has not yet been read in, read it. */ | 792 /* If it has not yet been read in, read it. */ |
| 776 if (!pst->readin) | 793 if (!pst->readin) |
| 777 { | 794 { |
| 778 struct cleanup *back_to = increment_reading_symtab (); | 795 struct cleanup *back_to = increment_reading_symtab (); |
| 779 | 796 |
| 780 (*pst->read_symtab) (pst); | 797 (*pst->read_symtab) (pst); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 836 | 853 |
| 837 if (cs_pst) | 854 if (cs_pst) |
| 838 { | 855 { |
| 839 if (cs_pst->readin) | 856 if (cs_pst->readin) |
| 840 { | 857 { |
| 841 internal_error (__FILE__, __LINE__, | 858 internal_error (__FILE__, __LINE__, |
| 842 _("select_source_symtab: " | 859 _("select_source_symtab: " |
| 843 "readin pst found and no symtabs.")); | 860 "readin pst found and no symtabs.")); |
| 844 } | 861 } |
| 845 else | 862 else |
| 846 » return PSYMTAB_TO_SYMTAB (cs_pst); | 863 » return psymtab_to_symtab (cs_pst); |
| 847 } | 864 } |
| 848 return NULL; | 865 return NULL; |
| 849 } | 866 } |
| 850 | 867 |
| 851 static void | 868 static void |
| 852 forget_cached_source_info_partial (struct objfile *objfile) | 869 forget_cached_source_info_partial (struct objfile *objfile) |
| 853 { | 870 { |
| 854 struct partial_symtab *pst; | 871 struct partial_symtab *pst; |
| 855 | 872 |
| 856 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) | 873 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst) |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 953 } | 970 } |
| 954 } | 971 } |
| 955 | 972 |
| 956 static void | 973 static void |
| 957 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, | 974 dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, |
| 958 struct ui_file *outfile) | 975 struct ui_file *outfile) |
| 959 { | 976 { |
| 960 struct gdbarch *gdbarch = get_objfile_arch (objfile); | 977 struct gdbarch *gdbarch = get_objfile_arch (objfile); |
| 961 int i; | 978 int i; |
| 962 | 979 |
| 963 fprintf_filtered (outfile, "\nPartial symtab for source file %s ", | 980 if (psymtab->anonymous) |
| 964 » » psymtab->filename); | 981 { |
| 982 fprintf_filtered (outfile, "\nAnonymous partial symtab (%s) ", |
| 983 » » » psymtab->filename); |
| 984 } |
| 985 else |
| 986 { |
| 987 fprintf_filtered (outfile, "\nPartial symtab for source file %s ", |
| 988 » » » psymtab->filename); |
| 989 } |
| 965 fprintf_filtered (outfile, "(object "); | 990 fprintf_filtered (outfile, "(object "); |
| 966 gdb_print_host_address (psymtab, outfile); | 991 gdb_print_host_address (psymtab, outfile); |
| 967 fprintf_filtered (outfile, ")\n\n"); | 992 fprintf_filtered (outfile, ")\n\n"); |
| 968 fprintf_unfiltered (outfile, " Read from object file %s (", | 993 fprintf_unfiltered (outfile, " Read from object file %s (", |
| 969 objfile->name); | 994 objfile->name); |
| 970 gdb_print_host_address (objfile, outfile); | 995 gdb_print_host_address (objfile, outfile); |
| 971 fprintf_unfiltered (outfile, ")\n"); | 996 fprintf_unfiltered (outfile, ")\n"); |
| 972 | 997 |
| 973 if (psymtab->readin) | 998 if (psymtab->readin) |
| 974 { | 999 { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 1001 psymtab->psymtabs_addrmap_supported ? "yes" : "no"); | 1026 psymtab->psymtabs_addrmap_supported ? "yes" : "no"); |
| 1002 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n", | 1027 fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n", |
| 1003 psymtab->number_of_dependencies); | 1028 psymtab->number_of_dependencies); |
| 1004 for (i = 0; i < psymtab->number_of_dependencies; i++) | 1029 for (i = 0; i < psymtab->number_of_dependencies; i++) |
| 1005 { | 1030 { |
| 1006 fprintf_filtered (outfile, " %d ", i); | 1031 fprintf_filtered (outfile, " %d ", i); |
| 1007 gdb_print_host_address (psymtab->dependencies[i], outfile); | 1032 gdb_print_host_address (psymtab->dependencies[i], outfile); |
| 1008 fprintf_filtered (outfile, " %s\n", | 1033 fprintf_filtered (outfile, " %s\n", |
| 1009 psymtab->dependencies[i]->filename); | 1034 psymtab->dependencies[i]->filename); |
| 1010 } | 1035 } |
| 1036 if (psymtab->user != NULL) |
| 1037 { |
| 1038 fprintf_filtered (outfile, " Shared partial symtab with user "); |
| 1039 gdb_print_host_address (psymtab->user, outfile); |
| 1040 fprintf_filtered (outfile, "\n"); |
| 1041 } |
| 1011 if (psymtab->n_global_syms > 0) | 1042 if (psymtab->n_global_syms > 0) |
| 1012 { | 1043 { |
| 1013 print_partial_symbols (gdbarch, | 1044 print_partial_symbols (gdbarch, |
| 1014 objfile->global_psymbols.list | 1045 objfile->global_psymbols.list |
| 1015 + psymtab->globals_offset, | 1046 + psymtab->globals_offset, |
| 1016 psymtab->n_global_syms, "Global", outfile); | 1047 psymtab->n_global_syms, "Global", outfile); |
| 1017 } | 1048 } |
| 1018 if (psymtab->n_static_syms > 0) | 1049 if (psymtab->n_static_syms > 0) |
| 1019 { | 1050 { |
| 1020 print_partial_symbols (gdbarch, | 1051 print_partial_symbols (gdbarch, |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1098 } | 1129 } |
| 1099 } | 1130 } |
| 1100 | 1131 |
| 1101 static void | 1132 static void |
| 1102 read_psymtabs_with_filename (struct objfile *objfile, const char *filename) | 1133 read_psymtabs_with_filename (struct objfile *objfile, const char *filename) |
| 1103 { | 1134 { |
| 1104 struct partial_symtab *p; | 1135 struct partial_symtab *p; |
| 1105 | 1136 |
| 1106 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p) | 1137 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p) |
| 1107 { | 1138 { |
| 1139 /* Anonymous psymtabs don't have a name of a source file. */ |
| 1140 if (p->anonymous) |
| 1141 continue; |
| 1142 |
| 1108 if (filename_cmp (filename, p->filename) == 0) | 1143 if (filename_cmp (filename, p->filename) == 0) |
| 1109 » PSYMTAB_TO_SYMTAB (p); | 1144 » psymtab_to_symtab (p); |
| 1110 } | 1145 } |
| 1111 } | 1146 } |
| 1112 | 1147 |
| 1113 static void | 1148 static void |
| 1114 map_symbol_filenames_psymtab (struct objfile *objfile, | 1149 map_symbol_filenames_psymtab (struct objfile *objfile, |
| 1115 symbol_filename_ftype *fun, void *data, | 1150 symbol_filename_ftype *fun, void *data, |
| 1116 int need_fullname) | 1151 int need_fullname) |
| 1117 { | 1152 { |
| 1118 struct partial_symtab *ps; | 1153 struct partial_symtab *ps; |
| 1119 | 1154 |
| 1120 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) | 1155 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) |
| 1121 { | 1156 { |
| 1122 const char *fullname; | 1157 const char *fullname; |
| 1123 | 1158 |
| 1124 if (ps->readin) | 1159 if (ps->readin) |
| 1125 continue; | 1160 continue; |
| 1126 | 1161 |
| 1162 /* We can skip shared psymtabs here, because any file name will be |
| 1163 attached to the unshared psymtab. */ |
| 1164 if (ps->user != NULL) |
| 1165 continue; |
| 1166 |
| 1167 /* Anonymous psymtabs don't have a file name. */ |
| 1168 if (ps->anonymous) |
| 1169 continue; |
| 1170 |
| 1127 QUIT; | 1171 QUIT; |
| 1128 if (need_fullname) | 1172 if (need_fullname) |
| 1129 fullname = psymtab_to_fullname (ps); | 1173 fullname = psymtab_to_fullname (ps); |
| 1130 else | 1174 else |
| 1131 fullname = NULL; | 1175 fullname = NULL; |
| 1132 (*fun) (ps->filename, fullname, data); | 1176 (*fun) (ps->filename, fullname, data); |
| 1133 } | 1177 } |
| 1134 } | 1178 } |
| 1135 | 1179 |
| 1136 int find_and_open_source (const char *filename, | |
| 1137 const char *dirname, | |
| 1138 char **fullname); | |
| 1139 | |
| 1140 /* Finds the fullname that a partial_symtab represents. | 1180 /* Finds the fullname that a partial_symtab represents. |
| 1141 | 1181 |
| 1142 If this functions finds the fullname, it will save it in ps->fullname | 1182 If this functions finds the fullname, it will save it in ps->fullname |
| 1143 and it will also return the value. | 1183 and it will also return the value. |
| 1144 | 1184 |
| 1145 If this function fails to find the file that this partial_symtab represents, | 1185 If this function fails to find the file that this partial_symtab represents, |
| 1146 NULL will be returned and ps->fullname will be set to NULL. */ | 1186 NULL will be returned and ps->fullname will be set to NULL. */ |
| 1147 | 1187 |
| 1148 static char * | 1188 static char * |
| 1149 psymtab_to_fullname (struct partial_symtab *ps) | 1189 psymtab_to_fullname (struct partial_symtab *ps) |
| 1150 { | 1190 { |
| 1151 int r; | 1191 int r; |
| 1152 | 1192 |
| 1153 if (!ps) | 1193 if (!ps) |
| 1154 return NULL; | 1194 return NULL; |
| 1195 if (ps->anonymous) |
| 1196 return NULL; |
| 1155 | 1197 |
| 1156 /* Use cached copy if we have it. | 1198 /* Use cached copy if we have it. |
| 1157 We rely on forget_cached_source_info being called appropriately | 1199 We rely on forget_cached_source_info being called appropriately |
| 1158 to handle cases like the file being moved. */ | 1200 to handle cases like the file being moved. */ |
| 1159 if (ps->fullname) | 1201 if (ps->fullname) |
| 1160 return ps->fullname; | 1202 return ps->fullname; |
| 1161 | 1203 |
| 1162 r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname); | 1204 r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname); |
| 1163 | 1205 |
| 1164 if (r >= 0) | 1206 if (r >= 0) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 1187 according to the function MATCH, call CALLBACK(BLOCK, s, DATA). | 1229 according to the function MATCH, call CALLBACK(BLOCK, s, DATA). |
| 1188 BLOCK is assumed to come from OBJFILE. Returns 1 iff CALLBACK | 1230 BLOCK is assumed to come from OBJFILE. Returns 1 iff CALLBACK |
| 1189 ever returns non-zero, and otherwise returns 0. */ | 1231 ever returns non-zero, and otherwise returns 0. */ |
| 1190 | 1232 |
| 1191 static int | 1233 static int |
| 1192 map_block (const char *name, domain_enum namespace, struct objfile *objfile, | 1234 map_block (const char *name, domain_enum namespace, struct objfile *objfile, |
| 1193 struct block *block, | 1235 struct block *block, |
| 1194 int (*callback) (struct block *, struct symbol *, void *), | 1236 int (*callback) (struct block *, struct symbol *, void *), |
| 1195 void *data, symbol_compare_ftype *match) | 1237 void *data, symbol_compare_ftype *match) |
| 1196 { | 1238 { |
| 1197 struct dict_iterator iter; | 1239 struct block_iterator iter; |
| 1198 struct symbol *sym; | 1240 struct symbol *sym; |
| 1199 | 1241 |
| 1200 for (sym = dict_iter_match_first (BLOCK_DICT (block), name, match, &iter); | 1242 for (sym = block_iter_match_first (block, name, match, &iter); |
| 1201 sym != NULL; sym = dict_iter_match_next (name, match, &iter)) | 1243 sym != NULL; sym = block_iter_match_next (name, match, &iter)) |
| 1202 { | 1244 { |
| 1203 if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), | 1245 if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), |
| 1204 SYMBOL_DOMAIN (sym), namespace)) | 1246 SYMBOL_DOMAIN (sym), namespace)) |
| 1205 { | 1247 { |
| 1206 if (callback (block, sym, data)) | 1248 if (callback (block, sym, data)) |
| 1207 return 1; | 1249 return 1; |
| 1208 } | 1250 } |
| 1209 } | 1251 } |
| 1210 | 1252 |
| 1211 return 0; | 1253 return 0; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1226 const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK; | 1268 const int block_kind = global ? GLOBAL_BLOCK : STATIC_BLOCK; |
| 1227 struct partial_symtab *ps; | 1269 struct partial_symtab *ps; |
| 1228 | 1270 |
| 1229 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) | 1271 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) |
| 1230 { | 1272 { |
| 1231 QUIT; | 1273 QUIT; |
| 1232 if (ps->readin | 1274 if (ps->readin |
| 1233 || match_partial_symbol (ps, global, name, namespace, match, | 1275 || match_partial_symbol (ps, global, name, namespace, match, |
| 1234 ordered_compare)) | 1276 ordered_compare)) |
| 1235 { | 1277 { |
| 1236 » struct symtab *s = PSYMTAB_TO_SYMTAB (ps); | 1278 » struct symtab *s = psymtab_to_symtab (ps); |
| 1237 struct block *block; | 1279 struct block *block; |
| 1238 | 1280 |
| 1239 if (s == NULL || !s->primary) | 1281 if (s == NULL || !s->primary) |
| 1240 continue; | 1282 continue; |
| 1241 block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), block_kind); | 1283 block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), block_kind); |
| 1242 if (map_block (name, namespace, objfile, block, | 1284 if (map_block (name, namespace, objfile, block, |
| 1243 callback, data, match)) | 1285 callback, data, match)) |
| 1244 return; | 1286 return; |
| 1245 if (callback (block, NULL, data)) | 1287 if (callback (block, NULL, data)) |
| 1246 return; | 1288 return; |
| 1247 } | 1289 } |
| 1248 } | 1290 } |
| 1249 } | 1291 } |
| 1250 | 1292 |
| 1293 /* A helper for expand_symtabs_matching_via_partial that handles |
| 1294 searching included psymtabs. This returns 1 if a symbol is found, |
| 1295 and zero otherwise. It also updates the 'searched_flag' on the |
| 1296 various psymtabs that it searches. */ |
| 1297 |
| 1298 static int |
| 1299 recursively_search_psymtabs (struct partial_symtab *ps, |
| 1300 struct objfile *objfile, |
| 1301 enum search_domain kind, |
| 1302 int (*name_matcher) (const char *, void *), |
| 1303 void *data) |
| 1304 { |
| 1305 struct partial_symbol **psym; |
| 1306 struct partial_symbol **bound, **gbound, **sbound; |
| 1307 int keep_going = 1; |
| 1308 int result = PST_SEARCHED_AND_NOT_FOUND; |
| 1309 int i; |
| 1310 |
| 1311 if (ps->searched_flag != PST_NOT_SEARCHED) |
| 1312 return ps->searched_flag == PST_SEARCHED_AND_FOUND; |
| 1313 |
| 1314 /* Recurse into shared psymtabs first, because they may have already |
| 1315 been searched, and this could save some time. */ |
| 1316 for (i = 0; i < ps->number_of_dependencies; ++i) |
| 1317 { |
| 1318 int r; |
| 1319 |
| 1320 /* Skip non-shared dependencies, these are handled elsewhere. */ |
| 1321 if (ps->dependencies[i]->user == NULL) |
| 1322 continue; |
| 1323 |
| 1324 r = recursively_search_psymtabs (ps->dependencies[i], |
| 1325 objfile, kind, name_matcher, data); |
| 1326 if (r != 0) |
| 1327 { |
| 1328 ps->searched_flag = PST_SEARCHED_AND_FOUND; |
| 1329 return 1; |
| 1330 } |
| 1331 } |
| 1332 |
| 1333 gbound = (objfile->global_psymbols.list |
| 1334 + ps->globals_offset + ps->n_global_syms); |
| 1335 sbound = (objfile->static_psymbols.list |
| 1336 + ps->statics_offset + ps->n_static_syms); |
| 1337 bound = gbound; |
| 1338 |
| 1339 /* Go through all of the symbols stored in a partial |
| 1340 symtab in one loop. */ |
| 1341 psym = objfile->global_psymbols.list + ps->globals_offset; |
| 1342 while (keep_going) |
| 1343 { |
| 1344 if (psym >= bound) |
| 1345 { |
| 1346 if (bound == gbound && ps->n_static_syms != 0) |
| 1347 { |
| 1348 psym = objfile->static_psymbols.list + ps->statics_offset; |
| 1349 bound = sbound; |
| 1350 } |
| 1351 else |
| 1352 keep_going = 0; |
| 1353 continue; |
| 1354 } |
| 1355 else |
| 1356 { |
| 1357 QUIT; |
| 1358 |
| 1359 if ((kind == ALL_DOMAIN |
| 1360 || (kind == VARIABLES_DOMAIN |
| 1361 && SYMBOL_CLASS (*psym) != LOC_TYPEDEF |
| 1362 && SYMBOL_CLASS (*psym) != LOC_BLOCK) |
| 1363 || (kind == FUNCTIONS_DOMAIN |
| 1364 && SYMBOL_CLASS (*psym) == LOC_BLOCK) |
| 1365 || (kind == TYPES_DOMAIN |
| 1366 && SYMBOL_CLASS (*psym) == LOC_TYPEDEF)) |
| 1367 && (*name_matcher) (SYMBOL_SEARCH_NAME (*psym), data)) |
| 1368 { |
| 1369 /* Found a match, so notify our caller. */ |
| 1370 result = PST_SEARCHED_AND_FOUND; |
| 1371 keep_going = 0; |
| 1372 } |
| 1373 } |
| 1374 psym++; |
| 1375 } |
| 1376 |
| 1377 ps->searched_flag = result; |
| 1378 return result == PST_SEARCHED_AND_FOUND; |
| 1379 } |
| 1380 |
| 1251 static void | 1381 static void |
| 1252 expand_symtabs_matching_via_partial | 1382 expand_symtabs_matching_via_partial |
| 1253 (struct objfile *objfile, | 1383 (struct objfile *objfile, |
| 1254 int (*file_matcher) (const char *, void *), | 1384 int (*file_matcher) (const char *, void *), |
| 1255 int (*name_matcher) (const struct language_defn *, const char *, void *), | 1385 int (*name_matcher) (const char *, void *), |
| 1256 enum search_domain kind, | 1386 enum search_domain kind, |
| 1257 void *data) | 1387 void *data) |
| 1258 { | 1388 { |
| 1259 struct partial_symtab *ps; | 1389 struct partial_symtab *ps; |
| 1260 | 1390 |
| 1391 /* Clear the search flags. */ |
| 1261 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) | 1392 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) |
| 1262 { | 1393 { |
| 1263 struct partial_symbol **psym; | 1394 ps->searched_flag = PST_NOT_SEARCHED; |
| 1264 struct partial_symbol **bound, **gbound, **sbound; | 1395 } |
| 1265 int keep_going = 1; | |
| 1266 | 1396 |
| 1397 ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, ps) |
| 1398 { |
| 1267 if (ps->readin) | 1399 if (ps->readin) |
| 1268 continue; | 1400 continue; |
| 1269 | 1401 |
| 1270 if (file_matcher && ! (*file_matcher) (ps->filename, data)) | 1402 /* We skip shared psymtabs because file-matching doesn't apply |
| 1403 » to them; but we search them later in the loop. */ |
| 1404 if (ps->user != NULL) |
| 1271 continue; | 1405 continue; |
| 1272 | 1406 |
| 1273 gbound = objfile->global_psymbols.list | 1407 if (file_matcher) |
| 1274 » + ps->globals_offset + ps->n_global_syms; | 1408 » { |
| 1275 sbound = objfile->static_psymbols.list | 1409 » if (ps->anonymous) |
| 1276 » + ps->statics_offset + ps->n_static_syms; | 1410 » continue; |
| 1277 bound = gbound; | 1411 » if (! (*file_matcher) (ps->filename, data)) |
| 1412 » continue; |
| 1413 » } |
| 1278 | 1414 |
| 1279 /* Go through all of the symbols stored in a partial | 1415 if (recursively_search_psymtabs (ps, objfile, kind, name_matcher, data)) |
| 1280 » symtab in one loop. */ | 1416 » psymtab_to_symtab (ps); |
| 1281 psym = objfile->global_psymbols.list + ps->globals_offset; | |
| 1282 while (keep_going) | |
| 1283 » { | |
| 1284 » if (psym >= bound) | |
| 1285 » { | |
| 1286 » if (bound == gbound && ps->n_static_syms != 0) | |
| 1287 » » { | |
| 1288 » » psym = objfile->static_psymbols.list + ps->statics_offset; | |
| 1289 » » bound = sbound; | |
| 1290 » » } | |
| 1291 » else | |
| 1292 » » keep_going = 0; | |
| 1293 » continue; | |
| 1294 » } | |
| 1295 » else | |
| 1296 » { | |
| 1297 » QUIT; | |
| 1298 | |
| 1299 » if ((kind == ALL_DOMAIN | |
| 1300 » » || (kind == VARIABLES_DOMAIN | |
| 1301 » » && SYMBOL_CLASS (*psym) != LOC_TYPEDEF | |
| 1302 » » && SYMBOL_CLASS (*psym) != LOC_BLOCK) | |
| 1303 » » || (kind == FUNCTIONS_DOMAIN | |
| 1304 » » && SYMBOL_CLASS (*psym) == LOC_BLOCK) | |
| 1305 » » || (kind == TYPES_DOMAIN | |
| 1306 » » && SYMBOL_CLASS (*psym) == LOC_TYPEDEF)) | |
| 1307 » » && (*name_matcher) (current_language, | |
| 1308 » » » » SYMBOL_NATURAL_NAME (*psym), data)) | |
| 1309 » » { | |
| 1310 » » PSYMTAB_TO_SYMTAB (ps); | |
| 1311 » » keep_going = 0; | |
| 1312 » » } | |
| 1313 » } | |
| 1314 » psym++; | |
| 1315 » } | |
| 1316 } | 1417 } |
| 1317 } | 1418 } |
| 1318 | 1419 |
| 1319 static int | 1420 static int |
| 1320 objfile_has_psyms (struct objfile *objfile) | 1421 objfile_has_psyms (struct objfile *objfile) |
| 1321 { | 1422 { |
| 1322 return objfile->psymtabs != NULL; | 1423 return objfile->psymtabs != NULL; |
| 1323 } | 1424 } |
| 1324 | 1425 |
| 1325 const struct quick_symbol_functions psym_functions = | 1426 const struct quick_symbol_functions psym_functions = |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1559 append_psymbol_to_list (struct psymbol_allocation_list *list, | 1660 append_psymbol_to_list (struct psymbol_allocation_list *list, |
| 1560 const struct partial_symbol *psym, | 1661 const struct partial_symbol *psym, |
| 1561 struct objfile *objfile) | 1662 struct objfile *objfile) |
| 1562 { | 1663 { |
| 1563 if (list->next >= list->list + list->size) | 1664 if (list->next >= list->list + list->size) |
| 1564 extend_psymbol_list (list, objfile); | 1665 extend_psymbol_list (list, objfile); |
| 1565 *list->next++ = (struct partial_symbol *) psym; | 1666 *list->next++ = (struct partial_symbol *) psym; |
| 1566 OBJSTAT (objfile, n_psyms++); | 1667 OBJSTAT (objfile, n_psyms++); |
| 1567 } | 1668 } |
| 1568 | 1669 |
error: old chunk mismatch |
None
| OLD | NEW |