1*cf7f2e2dSJohn Marino /* Partial symbol tables. 2*cf7f2e2dSJohn Marino 3*cf7f2e2dSJohn Marino Copyright (C) 2009, 2010 Free Software Foundation, Inc. 4*cf7f2e2dSJohn Marino 5*cf7f2e2dSJohn Marino This file is part of GDB. 6*cf7f2e2dSJohn Marino 7*cf7f2e2dSJohn Marino This program is free software; you can redistribute it and/or modify 8*cf7f2e2dSJohn Marino it under the terms of the GNU General Public License as published by 9*cf7f2e2dSJohn Marino the Free Software Foundation; either version 3 of the License, or 10*cf7f2e2dSJohn Marino (at your option) any later version. 11*cf7f2e2dSJohn Marino 12*cf7f2e2dSJohn Marino This program is distributed in the hope that it will be useful, 13*cf7f2e2dSJohn Marino but WITHOUT ANY WARRANTY; without even the implied warranty of 14*cf7f2e2dSJohn Marino MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*cf7f2e2dSJohn Marino GNU General Public License for more details. 16*cf7f2e2dSJohn Marino 17*cf7f2e2dSJohn Marino You should have received a copy of the GNU General Public License 18*cf7f2e2dSJohn Marino along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19*cf7f2e2dSJohn Marino 20*cf7f2e2dSJohn Marino #include "defs.h" 21*cf7f2e2dSJohn Marino #include "symtab.h" 22*cf7f2e2dSJohn Marino #include "psympriv.h" 23*cf7f2e2dSJohn Marino #include "objfiles.h" 24*cf7f2e2dSJohn Marino #include "gdb_assert.h" 25*cf7f2e2dSJohn Marino #include "block.h" 26*cf7f2e2dSJohn Marino #include "filenames.h" 27*cf7f2e2dSJohn Marino #include "source.h" 28*cf7f2e2dSJohn Marino #include "addrmap.h" 29*cf7f2e2dSJohn Marino #include "gdbtypes.h" 30*cf7f2e2dSJohn Marino #include "bcache.h" 31*cf7f2e2dSJohn Marino #include "ui-out.h" 32*cf7f2e2dSJohn Marino #include "command.h" 33*cf7f2e2dSJohn Marino #include "readline/readline.h" 34*cf7f2e2dSJohn Marino #include "gdb_regex.h" 35*cf7f2e2dSJohn Marino 36*cf7f2e2dSJohn Marino #ifndef DEV_TTY 37*cf7f2e2dSJohn Marino #define DEV_TTY "/dev/tty" 38*cf7f2e2dSJohn Marino #endif 39*cf7f2e2dSJohn Marino 40*cf7f2e2dSJohn Marino /* A fast way to get from a psymtab to its symtab (after the first time). */ 41*cf7f2e2dSJohn Marino #define PSYMTAB_TO_SYMTAB(pst) \ 42*cf7f2e2dSJohn Marino ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst)) 43*cf7f2e2dSJohn Marino 44*cf7f2e2dSJohn Marino /* Lookup a partial symbol. */ 45*cf7f2e2dSJohn Marino static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *, 46*cf7f2e2dSJohn Marino const char *, int, 47*cf7f2e2dSJohn Marino domain_enum); 48*cf7f2e2dSJohn Marino 49*cf7f2e2dSJohn Marino static char *psymtab_to_fullname (struct partial_symtab *ps); 50*cf7f2e2dSJohn Marino 51*cf7f2e2dSJohn Marino static struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *, 52*cf7f2e2dSJohn Marino CORE_ADDR, 53*cf7f2e2dSJohn Marino struct obj_section *); 54*cf7f2e2dSJohn Marino 55*cf7f2e2dSJohn Marino static struct partial_symbol *fixup_psymbol_section (struct partial_symbol 56*cf7f2e2dSJohn Marino *psym, 57*cf7f2e2dSJohn Marino struct objfile *objfile); 58*cf7f2e2dSJohn Marino 59*cf7f2e2dSJohn Marino static struct symtab *psymtab_to_symtab (struct partial_symtab *pst); 60*cf7f2e2dSJohn Marino 61*cf7f2e2dSJohn Marino /* Lookup the partial symbol table of a source file named NAME. 62*cf7f2e2dSJohn Marino *If* there is no '/' in the name, a match after a '/' 63*cf7f2e2dSJohn Marino in the psymtab filename will also work. */ 64*cf7f2e2dSJohn Marino 65*cf7f2e2dSJohn Marino static struct partial_symtab * 66*cf7f2e2dSJohn Marino lookup_partial_symtab (struct objfile *objfile, const char *name, 67*cf7f2e2dSJohn Marino const char *full_path, const char *real_path) 68*cf7f2e2dSJohn Marino { 69*cf7f2e2dSJohn Marino struct partial_symtab *pst; 70*cf7f2e2dSJohn Marino 71*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, pst) 72*cf7f2e2dSJohn Marino { 73*cf7f2e2dSJohn Marino if (FILENAME_CMP (name, pst->filename) == 0) 74*cf7f2e2dSJohn Marino { 75*cf7f2e2dSJohn Marino return (pst); 76*cf7f2e2dSJohn Marino } 77*cf7f2e2dSJohn Marino 78*cf7f2e2dSJohn Marino /* If the user gave us an absolute path, try to find the file in 79*cf7f2e2dSJohn Marino this symtab and use its absolute path. */ 80*cf7f2e2dSJohn Marino if (full_path != NULL) 81*cf7f2e2dSJohn Marino { 82*cf7f2e2dSJohn Marino psymtab_to_fullname (pst); 83*cf7f2e2dSJohn Marino if (pst->fullname != NULL 84*cf7f2e2dSJohn Marino && FILENAME_CMP (full_path, pst->fullname) == 0) 85*cf7f2e2dSJohn Marino { 86*cf7f2e2dSJohn Marino return pst; 87*cf7f2e2dSJohn Marino } 88*cf7f2e2dSJohn Marino } 89*cf7f2e2dSJohn Marino 90*cf7f2e2dSJohn Marino if (real_path != NULL) 91*cf7f2e2dSJohn Marino { 92*cf7f2e2dSJohn Marino char *rp = NULL; 93*cf7f2e2dSJohn Marino psymtab_to_fullname (pst); 94*cf7f2e2dSJohn Marino if (pst->fullname != NULL) 95*cf7f2e2dSJohn Marino { 96*cf7f2e2dSJohn Marino rp = gdb_realpath (pst->fullname); 97*cf7f2e2dSJohn Marino make_cleanup (xfree, rp); 98*cf7f2e2dSJohn Marino } 99*cf7f2e2dSJohn Marino if (rp != NULL && FILENAME_CMP (real_path, rp) == 0) 100*cf7f2e2dSJohn Marino { 101*cf7f2e2dSJohn Marino return pst; 102*cf7f2e2dSJohn Marino } 103*cf7f2e2dSJohn Marino } 104*cf7f2e2dSJohn Marino } 105*cf7f2e2dSJohn Marino 106*cf7f2e2dSJohn Marino /* Now, search for a matching tail (only if name doesn't have any dirs) */ 107*cf7f2e2dSJohn Marino 108*cf7f2e2dSJohn Marino if (lbasename (name) == name) 109*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, pst) 110*cf7f2e2dSJohn Marino { 111*cf7f2e2dSJohn Marino if (FILENAME_CMP (lbasename (pst->filename), name) == 0) 112*cf7f2e2dSJohn Marino return (pst); 113*cf7f2e2dSJohn Marino } 114*cf7f2e2dSJohn Marino 115*cf7f2e2dSJohn Marino return (NULL); 116*cf7f2e2dSJohn Marino } 117*cf7f2e2dSJohn Marino 118*cf7f2e2dSJohn Marino static int 119*cf7f2e2dSJohn Marino lookup_symtab_via_partial_symtab (struct objfile *objfile, const char *name, 120*cf7f2e2dSJohn Marino const char *full_path, const char *real_path, 121*cf7f2e2dSJohn Marino struct symtab **result) 122*cf7f2e2dSJohn Marino { 123*cf7f2e2dSJohn Marino struct partial_symtab *ps; 124*cf7f2e2dSJohn Marino 125*cf7f2e2dSJohn Marino ps = lookup_partial_symtab (objfile, name, full_path, real_path); 126*cf7f2e2dSJohn Marino if (!ps) 127*cf7f2e2dSJohn Marino return 0; 128*cf7f2e2dSJohn Marino 129*cf7f2e2dSJohn Marino if (ps->readin) 130*cf7f2e2dSJohn Marino error (_("Internal: readin %s pst for `%s' found when no symtab found."), 131*cf7f2e2dSJohn Marino ps->filename, name); 132*cf7f2e2dSJohn Marino 133*cf7f2e2dSJohn Marino *result = PSYMTAB_TO_SYMTAB (ps); 134*cf7f2e2dSJohn Marino return 1; 135*cf7f2e2dSJohn Marino } 136*cf7f2e2dSJohn Marino 137*cf7f2e2dSJohn Marino /* Find which partial symtab contains PC and SECTION starting at psymtab PST. 138*cf7f2e2dSJohn Marino We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */ 139*cf7f2e2dSJohn Marino 140*cf7f2e2dSJohn Marino static struct partial_symtab * 141*cf7f2e2dSJohn Marino find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section, 142*cf7f2e2dSJohn Marino struct partial_symtab *pst, 143*cf7f2e2dSJohn Marino struct minimal_symbol *msymbol) 144*cf7f2e2dSJohn Marino { 145*cf7f2e2dSJohn Marino struct objfile *objfile = pst->objfile; 146*cf7f2e2dSJohn Marino struct partial_symtab *tpst; 147*cf7f2e2dSJohn Marino struct partial_symtab *best_pst = pst; 148*cf7f2e2dSJohn Marino CORE_ADDR best_addr = pst->textlow; 149*cf7f2e2dSJohn Marino 150*cf7f2e2dSJohn Marino /* An objfile that has its functions reordered might have 151*cf7f2e2dSJohn Marino many partial symbol tables containing the PC, but 152*cf7f2e2dSJohn Marino we want the partial symbol table that contains the 153*cf7f2e2dSJohn Marino function containing the PC. */ 154*cf7f2e2dSJohn Marino if (!(objfile->flags & OBJF_REORDERED) && 155*cf7f2e2dSJohn Marino section == 0) /* can't validate section this way */ 156*cf7f2e2dSJohn Marino return pst; 157*cf7f2e2dSJohn Marino 158*cf7f2e2dSJohn Marino if (msymbol == NULL) 159*cf7f2e2dSJohn Marino return (pst); 160*cf7f2e2dSJohn Marino 161*cf7f2e2dSJohn Marino /* The code range of partial symtabs sometimes overlap, so, in 162*cf7f2e2dSJohn Marino the loop below, we need to check all partial symtabs and 163*cf7f2e2dSJohn Marino find the one that fits better for the given PC address. We 164*cf7f2e2dSJohn Marino select the partial symtab that contains a symbol whose 165*cf7f2e2dSJohn Marino address is closest to the PC address. By closest we mean 166*cf7f2e2dSJohn Marino that find_pc_sect_symbol returns the symbol with address 167*cf7f2e2dSJohn Marino that is closest and still less than the given PC. */ 168*cf7f2e2dSJohn Marino for (tpst = pst; tpst != NULL; tpst = tpst->next) 169*cf7f2e2dSJohn Marino { 170*cf7f2e2dSJohn Marino if (pc >= tpst->textlow && pc < tpst->texthigh) 171*cf7f2e2dSJohn Marino { 172*cf7f2e2dSJohn Marino struct partial_symbol *p; 173*cf7f2e2dSJohn Marino CORE_ADDR this_addr; 174*cf7f2e2dSJohn Marino 175*cf7f2e2dSJohn Marino /* NOTE: This assumes that every psymbol has a 176*cf7f2e2dSJohn Marino corresponding msymbol, which is not necessarily 177*cf7f2e2dSJohn Marino true; the debug info might be much richer than the 178*cf7f2e2dSJohn Marino object's symbol table. */ 179*cf7f2e2dSJohn Marino p = find_pc_sect_psymbol (tpst, pc, section); 180*cf7f2e2dSJohn Marino if (p != NULL 181*cf7f2e2dSJohn Marino && SYMBOL_VALUE_ADDRESS (p) 182*cf7f2e2dSJohn Marino == SYMBOL_VALUE_ADDRESS (msymbol)) 183*cf7f2e2dSJohn Marino return tpst; 184*cf7f2e2dSJohn Marino 185*cf7f2e2dSJohn Marino /* Also accept the textlow value of a psymtab as a 186*cf7f2e2dSJohn Marino "symbol", to provide some support for partial 187*cf7f2e2dSJohn Marino symbol tables with line information but no debug 188*cf7f2e2dSJohn Marino symbols (e.g. those produced by an assembler). */ 189*cf7f2e2dSJohn Marino if (p != NULL) 190*cf7f2e2dSJohn Marino this_addr = SYMBOL_VALUE_ADDRESS (p); 191*cf7f2e2dSJohn Marino else 192*cf7f2e2dSJohn Marino this_addr = tpst->textlow; 193*cf7f2e2dSJohn Marino 194*cf7f2e2dSJohn Marino /* Check whether it is closer than our current 195*cf7f2e2dSJohn Marino BEST_ADDR. Since this symbol address is 196*cf7f2e2dSJohn Marino necessarily lower or equal to PC, the symbol closer 197*cf7f2e2dSJohn Marino to PC is the symbol which address is the highest. 198*cf7f2e2dSJohn Marino This way we return the psymtab which contains such 199*cf7f2e2dSJohn Marino best match symbol. This can help in cases where the 200*cf7f2e2dSJohn Marino symbol information/debuginfo is not complete, like 201*cf7f2e2dSJohn Marino for instance on IRIX6 with gcc, where no debug info 202*cf7f2e2dSJohn Marino is emitted for statics. (See also the nodebug.exp 203*cf7f2e2dSJohn Marino testcase.) */ 204*cf7f2e2dSJohn Marino if (this_addr > best_addr) 205*cf7f2e2dSJohn Marino { 206*cf7f2e2dSJohn Marino best_addr = this_addr; 207*cf7f2e2dSJohn Marino best_pst = tpst; 208*cf7f2e2dSJohn Marino } 209*cf7f2e2dSJohn Marino } 210*cf7f2e2dSJohn Marino } 211*cf7f2e2dSJohn Marino return best_pst; 212*cf7f2e2dSJohn Marino } 213*cf7f2e2dSJohn Marino 214*cf7f2e2dSJohn Marino /* Find which partial symtab contains PC and SECTION. Return 0 if 215*cf7f2e2dSJohn Marino none. We return the psymtab that contains a symbol whose address 216*cf7f2e2dSJohn Marino exactly matches PC, or, if we cannot find an exact match, the 217*cf7f2e2dSJohn Marino psymtab that contains a symbol whose address is closest to PC. */ 218*cf7f2e2dSJohn Marino static struct partial_symtab * 219*cf7f2e2dSJohn Marino find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc, 220*cf7f2e2dSJohn Marino struct obj_section *section, 221*cf7f2e2dSJohn Marino struct minimal_symbol *msymbol) 222*cf7f2e2dSJohn Marino { 223*cf7f2e2dSJohn Marino struct partial_symtab *pst; 224*cf7f2e2dSJohn Marino 225*cf7f2e2dSJohn Marino /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity 226*cf7f2e2dSJohn Marino than the later used TEXTLOW/TEXTHIGH one. */ 227*cf7f2e2dSJohn Marino 228*cf7f2e2dSJohn Marino if (objfile->psymtabs_addrmap != NULL) 229*cf7f2e2dSJohn Marino { 230*cf7f2e2dSJohn Marino pst = addrmap_find (objfile->psymtabs_addrmap, pc); 231*cf7f2e2dSJohn Marino if (pst != NULL) 232*cf7f2e2dSJohn Marino { 233*cf7f2e2dSJohn Marino /* FIXME: addrmaps currently do not handle overlayed sections, 234*cf7f2e2dSJohn Marino so fall back to the non-addrmap case if we're debugging 235*cf7f2e2dSJohn Marino overlays and the addrmap returned the wrong section. */ 236*cf7f2e2dSJohn Marino if (overlay_debugging && msymbol && section) 237*cf7f2e2dSJohn Marino { 238*cf7f2e2dSJohn Marino struct partial_symbol *p; 239*cf7f2e2dSJohn Marino 240*cf7f2e2dSJohn Marino /* NOTE: This assumes that every psymbol has a 241*cf7f2e2dSJohn Marino corresponding msymbol, which is not necessarily 242*cf7f2e2dSJohn Marino true; the debug info might be much richer than the 243*cf7f2e2dSJohn Marino object's symbol table. */ 244*cf7f2e2dSJohn Marino p = find_pc_sect_psymbol (pst, pc, section); 245*cf7f2e2dSJohn Marino if (!p 246*cf7f2e2dSJohn Marino || SYMBOL_VALUE_ADDRESS (p) 247*cf7f2e2dSJohn Marino != SYMBOL_VALUE_ADDRESS (msymbol)) 248*cf7f2e2dSJohn Marino goto next; 249*cf7f2e2dSJohn Marino } 250*cf7f2e2dSJohn Marino 251*cf7f2e2dSJohn Marino /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as 252*cf7f2e2dSJohn Marino PSYMTABS_ADDRMAP we used has already the best 1-byte 253*cf7f2e2dSJohn Marino granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into 254*cf7f2e2dSJohn Marino a worse chosen section due to the TEXTLOW/TEXTHIGH ranges 255*cf7f2e2dSJohn Marino overlap. */ 256*cf7f2e2dSJohn Marino 257*cf7f2e2dSJohn Marino return pst; 258*cf7f2e2dSJohn Marino } 259*cf7f2e2dSJohn Marino } 260*cf7f2e2dSJohn Marino 261*cf7f2e2dSJohn Marino next: 262*cf7f2e2dSJohn Marino 263*cf7f2e2dSJohn Marino /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs 264*cf7f2e2dSJohn Marino which still have no corresponding full SYMTABs read. But it is not 265*cf7f2e2dSJohn Marino present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB 266*cf7f2e2dSJohn Marino so far. */ 267*cf7f2e2dSJohn Marino 268*cf7f2e2dSJohn Marino /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of 269*cf7f2e2dSJohn Marino its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying 270*cf7f2e2dSJohn Marino debug info type in single OBJFILE. */ 271*cf7f2e2dSJohn Marino 272*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, pst) 273*cf7f2e2dSJohn Marino if (pc >= pst->textlow && pc < pst->texthigh) 274*cf7f2e2dSJohn Marino { 275*cf7f2e2dSJohn Marino struct partial_symtab *best_pst; 276*cf7f2e2dSJohn Marino 277*cf7f2e2dSJohn Marino best_pst = find_pc_sect_psymtab_closer (pc, section, pst, msymbol); 278*cf7f2e2dSJohn Marino if (best_pst != NULL) 279*cf7f2e2dSJohn Marino return best_pst; 280*cf7f2e2dSJohn Marino } 281*cf7f2e2dSJohn Marino 282*cf7f2e2dSJohn Marino return NULL; 283*cf7f2e2dSJohn Marino } 284*cf7f2e2dSJohn Marino 285*cf7f2e2dSJohn Marino static struct symtab * 286*cf7f2e2dSJohn Marino find_pc_sect_symtab_from_partial (struct objfile *objfile, 287*cf7f2e2dSJohn Marino struct minimal_symbol *msymbol, 288*cf7f2e2dSJohn Marino CORE_ADDR pc, struct obj_section *section, 289*cf7f2e2dSJohn Marino int warn_if_readin) 290*cf7f2e2dSJohn Marino { 291*cf7f2e2dSJohn Marino struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section, 292*cf7f2e2dSJohn Marino msymbol); 293*cf7f2e2dSJohn Marino if (ps) 294*cf7f2e2dSJohn Marino { 295*cf7f2e2dSJohn Marino if (warn_if_readin && ps->readin) 296*cf7f2e2dSJohn Marino /* Might want to error() here (in case symtab is corrupt and 297*cf7f2e2dSJohn Marino will cause a core dump), but maybe we can successfully 298*cf7f2e2dSJohn Marino continue, so let's not. */ 299*cf7f2e2dSJohn Marino warning (_("\ 300*cf7f2e2dSJohn Marino (Internal error: pc %s in read in psymtab, but not in symtab.)\n"), 301*cf7f2e2dSJohn Marino paddress (get_objfile_arch (ps->objfile), pc)); 302*cf7f2e2dSJohn Marino return PSYMTAB_TO_SYMTAB (ps); 303*cf7f2e2dSJohn Marino } 304*cf7f2e2dSJohn Marino return NULL; 305*cf7f2e2dSJohn Marino } 306*cf7f2e2dSJohn Marino 307*cf7f2e2dSJohn Marino /* Find which partial symbol within a psymtab matches PC and SECTION. 308*cf7f2e2dSJohn Marino Return 0 if none. */ 309*cf7f2e2dSJohn Marino 310*cf7f2e2dSJohn Marino static struct partial_symbol * 311*cf7f2e2dSJohn Marino find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc, 312*cf7f2e2dSJohn Marino struct obj_section *section) 313*cf7f2e2dSJohn Marino { 314*cf7f2e2dSJohn Marino struct partial_symbol *best = NULL, *p, **pp; 315*cf7f2e2dSJohn Marino CORE_ADDR best_pc; 316*cf7f2e2dSJohn Marino 317*cf7f2e2dSJohn Marino gdb_assert (psymtab != NULL); 318*cf7f2e2dSJohn Marino 319*cf7f2e2dSJohn Marino /* Cope with programs that start at address 0 */ 320*cf7f2e2dSJohn Marino best_pc = (psymtab->textlow != 0) ? psymtab->textlow - 1 : 0; 321*cf7f2e2dSJohn Marino 322*cf7f2e2dSJohn Marino /* Search the global symbols as well as the static symbols, so that 323*cf7f2e2dSJohn Marino find_pc_partial_function doesn't use a minimal symbol and thus 324*cf7f2e2dSJohn Marino cache a bad endaddr. */ 325*cf7f2e2dSJohn Marino for (pp = psymtab->objfile->global_psymbols.list + psymtab->globals_offset; 326*cf7f2e2dSJohn Marino (pp - (psymtab->objfile->global_psymbols.list + psymtab->globals_offset) 327*cf7f2e2dSJohn Marino < psymtab->n_global_syms); 328*cf7f2e2dSJohn Marino pp++) 329*cf7f2e2dSJohn Marino { 330*cf7f2e2dSJohn Marino p = *pp; 331*cf7f2e2dSJohn Marino if (SYMBOL_DOMAIN (p) == VAR_DOMAIN 332*cf7f2e2dSJohn Marino && SYMBOL_CLASS (p) == LOC_BLOCK 333*cf7f2e2dSJohn Marino && pc >= SYMBOL_VALUE_ADDRESS (p) 334*cf7f2e2dSJohn Marino && (SYMBOL_VALUE_ADDRESS (p) > best_pc 335*cf7f2e2dSJohn Marino || (psymtab->textlow == 0 336*cf7f2e2dSJohn Marino && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0))) 337*cf7f2e2dSJohn Marino { 338*cf7f2e2dSJohn Marino if (section) /* match on a specific section */ 339*cf7f2e2dSJohn Marino { 340*cf7f2e2dSJohn Marino fixup_psymbol_section (p, psymtab->objfile); 341*cf7f2e2dSJohn Marino if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section)) 342*cf7f2e2dSJohn Marino continue; 343*cf7f2e2dSJohn Marino } 344*cf7f2e2dSJohn Marino best_pc = SYMBOL_VALUE_ADDRESS (p); 345*cf7f2e2dSJohn Marino best = p; 346*cf7f2e2dSJohn Marino } 347*cf7f2e2dSJohn Marino } 348*cf7f2e2dSJohn Marino 349*cf7f2e2dSJohn Marino for (pp = psymtab->objfile->static_psymbols.list + psymtab->statics_offset; 350*cf7f2e2dSJohn Marino (pp - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset) 351*cf7f2e2dSJohn Marino < psymtab->n_static_syms); 352*cf7f2e2dSJohn Marino pp++) 353*cf7f2e2dSJohn Marino { 354*cf7f2e2dSJohn Marino p = *pp; 355*cf7f2e2dSJohn Marino if (SYMBOL_DOMAIN (p) == VAR_DOMAIN 356*cf7f2e2dSJohn Marino && SYMBOL_CLASS (p) == LOC_BLOCK 357*cf7f2e2dSJohn Marino && pc >= SYMBOL_VALUE_ADDRESS (p) 358*cf7f2e2dSJohn Marino && (SYMBOL_VALUE_ADDRESS (p) > best_pc 359*cf7f2e2dSJohn Marino || (psymtab->textlow == 0 360*cf7f2e2dSJohn Marino && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0))) 361*cf7f2e2dSJohn Marino { 362*cf7f2e2dSJohn Marino if (section) /* match on a specific section */ 363*cf7f2e2dSJohn Marino { 364*cf7f2e2dSJohn Marino fixup_psymbol_section (p, psymtab->objfile); 365*cf7f2e2dSJohn Marino if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section)) 366*cf7f2e2dSJohn Marino continue; 367*cf7f2e2dSJohn Marino } 368*cf7f2e2dSJohn Marino best_pc = SYMBOL_VALUE_ADDRESS (p); 369*cf7f2e2dSJohn Marino best = p; 370*cf7f2e2dSJohn Marino } 371*cf7f2e2dSJohn Marino } 372*cf7f2e2dSJohn Marino 373*cf7f2e2dSJohn Marino return best; 374*cf7f2e2dSJohn Marino } 375*cf7f2e2dSJohn Marino 376*cf7f2e2dSJohn Marino static struct partial_symbol * 377*cf7f2e2dSJohn Marino fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile) 378*cf7f2e2dSJohn Marino { 379*cf7f2e2dSJohn Marino CORE_ADDR addr; 380*cf7f2e2dSJohn Marino 381*cf7f2e2dSJohn Marino if (!psym) 382*cf7f2e2dSJohn Marino return NULL; 383*cf7f2e2dSJohn Marino 384*cf7f2e2dSJohn Marino if (SYMBOL_OBJ_SECTION (psym)) 385*cf7f2e2dSJohn Marino return psym; 386*cf7f2e2dSJohn Marino 387*cf7f2e2dSJohn Marino gdb_assert (objfile); 388*cf7f2e2dSJohn Marino 389*cf7f2e2dSJohn Marino switch (SYMBOL_CLASS (psym)) 390*cf7f2e2dSJohn Marino { 391*cf7f2e2dSJohn Marino case LOC_STATIC: 392*cf7f2e2dSJohn Marino case LOC_LABEL: 393*cf7f2e2dSJohn Marino case LOC_BLOCK: 394*cf7f2e2dSJohn Marino addr = SYMBOL_VALUE_ADDRESS (psym); 395*cf7f2e2dSJohn Marino break; 396*cf7f2e2dSJohn Marino default: 397*cf7f2e2dSJohn Marino /* Nothing else will be listed in the minsyms -- no use looking 398*cf7f2e2dSJohn Marino it up. */ 399*cf7f2e2dSJohn Marino return psym; 400*cf7f2e2dSJohn Marino } 401*cf7f2e2dSJohn Marino 402*cf7f2e2dSJohn Marino fixup_section (&psym->ginfo, addr, objfile); 403*cf7f2e2dSJohn Marino 404*cf7f2e2dSJohn Marino return psym; 405*cf7f2e2dSJohn Marino } 406*cf7f2e2dSJohn Marino 407*cf7f2e2dSJohn Marino static struct symtab * 408*cf7f2e2dSJohn Marino lookup_symbol_aux_psymtabs (struct objfile *objfile, 409*cf7f2e2dSJohn Marino int block_index, const char *name, 410*cf7f2e2dSJohn Marino const domain_enum domain) 411*cf7f2e2dSJohn Marino { 412*cf7f2e2dSJohn Marino struct partial_symtab *ps; 413*cf7f2e2dSJohn Marino const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0); 414*cf7f2e2dSJohn Marino 415*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, ps) 416*cf7f2e2dSJohn Marino { 417*cf7f2e2dSJohn Marino if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain)) 418*cf7f2e2dSJohn Marino return PSYMTAB_TO_SYMTAB (ps); 419*cf7f2e2dSJohn Marino } 420*cf7f2e2dSJohn Marino 421*cf7f2e2dSJohn Marino return NULL; 422*cf7f2e2dSJohn Marino } 423*cf7f2e2dSJohn Marino 424*cf7f2e2dSJohn Marino /* Look, in partial_symtab PST, for symbol whose natural name is NAME. 425*cf7f2e2dSJohn Marino Check the global symbols if GLOBAL, the static symbols if not. */ 426*cf7f2e2dSJohn Marino 427*cf7f2e2dSJohn Marino static struct partial_symbol * 428*cf7f2e2dSJohn Marino lookup_partial_symbol (struct partial_symtab *pst, const char *name, 429*cf7f2e2dSJohn Marino int global, domain_enum domain) 430*cf7f2e2dSJohn Marino { 431*cf7f2e2dSJohn Marino struct partial_symbol **start, **psym; 432*cf7f2e2dSJohn Marino struct partial_symbol **top, **real_top, **bottom, **center; 433*cf7f2e2dSJohn Marino int length = (global ? pst->n_global_syms : pst->n_static_syms); 434*cf7f2e2dSJohn Marino int do_linear_search = 1; 435*cf7f2e2dSJohn Marino 436*cf7f2e2dSJohn Marino if (length == 0) 437*cf7f2e2dSJohn Marino { 438*cf7f2e2dSJohn Marino return (NULL); 439*cf7f2e2dSJohn Marino } 440*cf7f2e2dSJohn Marino start = (global ? 441*cf7f2e2dSJohn Marino pst->objfile->global_psymbols.list + pst->globals_offset : 442*cf7f2e2dSJohn Marino pst->objfile->static_psymbols.list + pst->statics_offset); 443*cf7f2e2dSJohn Marino 444*cf7f2e2dSJohn Marino if (global) /* This means we can use a binary search. */ 445*cf7f2e2dSJohn Marino { 446*cf7f2e2dSJohn Marino do_linear_search = 0; 447*cf7f2e2dSJohn Marino 448*cf7f2e2dSJohn Marino /* Binary search. This search is guaranteed to end with center 449*cf7f2e2dSJohn Marino pointing at the earliest partial symbol whose name might be 450*cf7f2e2dSJohn Marino correct. At that point *all* partial symbols with an 451*cf7f2e2dSJohn Marino appropriate name will be checked against the correct 452*cf7f2e2dSJohn Marino domain. */ 453*cf7f2e2dSJohn Marino 454*cf7f2e2dSJohn Marino bottom = start; 455*cf7f2e2dSJohn Marino top = start + length - 1; 456*cf7f2e2dSJohn Marino real_top = top; 457*cf7f2e2dSJohn Marino while (top > bottom) 458*cf7f2e2dSJohn Marino { 459*cf7f2e2dSJohn Marino center = bottom + (top - bottom) / 2; 460*cf7f2e2dSJohn Marino if (!(center < top)) 461*cf7f2e2dSJohn Marino internal_error (__FILE__, __LINE__, _("failed internal consistency check")); 462*cf7f2e2dSJohn Marino if (!do_linear_search 463*cf7f2e2dSJohn Marino && (SYMBOL_LANGUAGE (*center) == language_java)) 464*cf7f2e2dSJohn Marino { 465*cf7f2e2dSJohn Marino do_linear_search = 1; 466*cf7f2e2dSJohn Marino } 467*cf7f2e2dSJohn Marino if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center), name) >= 0) 468*cf7f2e2dSJohn Marino { 469*cf7f2e2dSJohn Marino top = center; 470*cf7f2e2dSJohn Marino } 471*cf7f2e2dSJohn Marino else 472*cf7f2e2dSJohn Marino { 473*cf7f2e2dSJohn Marino bottom = center + 1; 474*cf7f2e2dSJohn Marino } 475*cf7f2e2dSJohn Marino } 476*cf7f2e2dSJohn Marino if (!(top == bottom)) 477*cf7f2e2dSJohn Marino internal_error (__FILE__, __LINE__, _("failed internal consistency check")); 478*cf7f2e2dSJohn Marino 479*cf7f2e2dSJohn Marino while (top <= real_top 480*cf7f2e2dSJohn Marino && SYMBOL_MATCHES_SEARCH_NAME (*top, name)) 481*cf7f2e2dSJohn Marino { 482*cf7f2e2dSJohn Marino if (symbol_matches_domain (SYMBOL_LANGUAGE (*top), 483*cf7f2e2dSJohn Marino SYMBOL_DOMAIN (*top), domain)) 484*cf7f2e2dSJohn Marino return (*top); 485*cf7f2e2dSJohn Marino top++; 486*cf7f2e2dSJohn Marino } 487*cf7f2e2dSJohn Marino } 488*cf7f2e2dSJohn Marino 489*cf7f2e2dSJohn Marino /* Can't use a binary search or else we found during the binary search that 490*cf7f2e2dSJohn Marino we should also do a linear search. */ 491*cf7f2e2dSJohn Marino 492*cf7f2e2dSJohn Marino if (do_linear_search) 493*cf7f2e2dSJohn Marino { 494*cf7f2e2dSJohn Marino for (psym = start; psym < start + length; psym++) 495*cf7f2e2dSJohn Marino { 496*cf7f2e2dSJohn Marino if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym), 497*cf7f2e2dSJohn Marino SYMBOL_DOMAIN (*psym), domain) 498*cf7f2e2dSJohn Marino && SYMBOL_MATCHES_SEARCH_NAME (*psym, name)) 499*cf7f2e2dSJohn Marino return (*psym); 500*cf7f2e2dSJohn Marino } 501*cf7f2e2dSJohn Marino } 502*cf7f2e2dSJohn Marino 503*cf7f2e2dSJohn Marino return (NULL); 504*cf7f2e2dSJohn Marino } 505*cf7f2e2dSJohn Marino 506*cf7f2e2dSJohn Marino /* Get the symbol table that corresponds to a partial_symtab. 507*cf7f2e2dSJohn Marino This is fast after the first time you do it. In fact, there 508*cf7f2e2dSJohn Marino is an even faster macro PSYMTAB_TO_SYMTAB that does the fast 509*cf7f2e2dSJohn Marino case inline. */ 510*cf7f2e2dSJohn Marino 511*cf7f2e2dSJohn Marino static struct symtab * 512*cf7f2e2dSJohn Marino psymtab_to_symtab (struct partial_symtab *pst) 513*cf7f2e2dSJohn Marino { 514*cf7f2e2dSJohn Marino /* If it's been looked up before, return it. */ 515*cf7f2e2dSJohn Marino if (pst->symtab) 516*cf7f2e2dSJohn Marino return pst->symtab; 517*cf7f2e2dSJohn Marino 518*cf7f2e2dSJohn Marino /* If it has not yet been read in, read it. */ 519*cf7f2e2dSJohn Marino if (!pst->readin) 520*cf7f2e2dSJohn Marino { 521*cf7f2e2dSJohn Marino struct cleanup *back_to = increment_reading_symtab (); 522*cf7f2e2dSJohn Marino 523*cf7f2e2dSJohn Marino (*pst->read_symtab) (pst); 524*cf7f2e2dSJohn Marino do_cleanups (back_to); 525*cf7f2e2dSJohn Marino } 526*cf7f2e2dSJohn Marino 527*cf7f2e2dSJohn Marino return pst->symtab; 528*cf7f2e2dSJohn Marino } 529*cf7f2e2dSJohn Marino 530*cf7f2e2dSJohn Marino static void 531*cf7f2e2dSJohn Marino relocate_psymtabs (struct objfile *objfile, 532*cf7f2e2dSJohn Marino struct section_offsets *new_offsets, 533*cf7f2e2dSJohn Marino struct section_offsets *delta) 534*cf7f2e2dSJohn Marino { 535*cf7f2e2dSJohn Marino struct partial_symbol **psym; 536*cf7f2e2dSJohn Marino struct partial_symtab *p; 537*cf7f2e2dSJohn Marino 538*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, p) 539*cf7f2e2dSJohn Marino { 540*cf7f2e2dSJohn Marino p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile)); 541*cf7f2e2dSJohn Marino p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile)); 542*cf7f2e2dSJohn Marino } 543*cf7f2e2dSJohn Marino 544*cf7f2e2dSJohn Marino for (psym = objfile->global_psymbols.list; 545*cf7f2e2dSJohn Marino psym < objfile->global_psymbols.next; 546*cf7f2e2dSJohn Marino psym++) 547*cf7f2e2dSJohn Marino { 548*cf7f2e2dSJohn Marino fixup_psymbol_section (*psym, objfile); 549*cf7f2e2dSJohn Marino if (SYMBOL_SECTION (*psym) >= 0) 550*cf7f2e2dSJohn Marino SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta, 551*cf7f2e2dSJohn Marino SYMBOL_SECTION (*psym)); 552*cf7f2e2dSJohn Marino } 553*cf7f2e2dSJohn Marino for (psym = objfile->static_psymbols.list; 554*cf7f2e2dSJohn Marino psym < objfile->static_psymbols.next; 555*cf7f2e2dSJohn Marino psym++) 556*cf7f2e2dSJohn Marino { 557*cf7f2e2dSJohn Marino fixup_psymbol_section (*psym, objfile); 558*cf7f2e2dSJohn Marino if (SYMBOL_SECTION (*psym) >= 0) 559*cf7f2e2dSJohn Marino SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta, 560*cf7f2e2dSJohn Marino SYMBOL_SECTION (*psym)); 561*cf7f2e2dSJohn Marino } 562*cf7f2e2dSJohn Marino } 563*cf7f2e2dSJohn Marino 564*cf7f2e2dSJohn Marino static struct symtab * 565*cf7f2e2dSJohn Marino find_last_source_symtab_from_partial (struct objfile *ofp) 566*cf7f2e2dSJohn Marino { 567*cf7f2e2dSJohn Marino struct partial_symtab *ps; 568*cf7f2e2dSJohn Marino struct partial_symtab *cs_pst = 0; 569*cf7f2e2dSJohn Marino 570*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (ofp, ps) 571*cf7f2e2dSJohn Marino { 572*cf7f2e2dSJohn Marino const char *name = ps->filename; 573*cf7f2e2dSJohn Marino int len = strlen (name); 574*cf7f2e2dSJohn Marino 575*cf7f2e2dSJohn Marino if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0 576*cf7f2e2dSJohn Marino || strcmp (name, "<<C++-namespaces>>") == 0))) 577*cf7f2e2dSJohn Marino cs_pst = ps; 578*cf7f2e2dSJohn Marino } 579*cf7f2e2dSJohn Marino 580*cf7f2e2dSJohn Marino if (cs_pst) 581*cf7f2e2dSJohn Marino { 582*cf7f2e2dSJohn Marino if (cs_pst->readin) 583*cf7f2e2dSJohn Marino { 584*cf7f2e2dSJohn Marino internal_error (__FILE__, __LINE__, 585*cf7f2e2dSJohn Marino _("select_source_symtab: " 586*cf7f2e2dSJohn Marino "readin pst found and no symtabs.")); 587*cf7f2e2dSJohn Marino } 588*cf7f2e2dSJohn Marino else 589*cf7f2e2dSJohn Marino return PSYMTAB_TO_SYMTAB (cs_pst); 590*cf7f2e2dSJohn Marino } 591*cf7f2e2dSJohn Marino return NULL; 592*cf7f2e2dSJohn Marino } 593*cf7f2e2dSJohn Marino 594*cf7f2e2dSJohn Marino static void 595*cf7f2e2dSJohn Marino forget_cached_source_info_partial (struct objfile *objfile) 596*cf7f2e2dSJohn Marino { 597*cf7f2e2dSJohn Marino struct partial_symtab *pst; 598*cf7f2e2dSJohn Marino 599*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, pst) 600*cf7f2e2dSJohn Marino { 601*cf7f2e2dSJohn Marino if (pst->fullname != NULL) 602*cf7f2e2dSJohn Marino { 603*cf7f2e2dSJohn Marino xfree (pst->fullname); 604*cf7f2e2dSJohn Marino pst->fullname = NULL; 605*cf7f2e2dSJohn Marino } 606*cf7f2e2dSJohn Marino } 607*cf7f2e2dSJohn Marino } 608*cf7f2e2dSJohn Marino 609*cf7f2e2dSJohn Marino static void 610*cf7f2e2dSJohn Marino print_partial_symbols (struct gdbarch *gdbarch, 611*cf7f2e2dSJohn Marino struct partial_symbol **p, int count, char *what, 612*cf7f2e2dSJohn Marino struct ui_file *outfile) 613*cf7f2e2dSJohn Marino { 614*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " %s partial symbols:\n", what); 615*cf7f2e2dSJohn Marino while (count-- > 0) 616*cf7f2e2dSJohn Marino { 617*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " `%s'", SYMBOL_LINKAGE_NAME (*p)); 618*cf7f2e2dSJohn Marino if (SYMBOL_DEMANGLED_NAME (*p) != NULL) 619*cf7f2e2dSJohn Marino { 620*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " `%s'", SYMBOL_DEMANGLED_NAME (*p)); 621*cf7f2e2dSJohn Marino } 622*cf7f2e2dSJohn Marino fputs_filtered (", ", outfile); 623*cf7f2e2dSJohn Marino switch (SYMBOL_DOMAIN (*p)) 624*cf7f2e2dSJohn Marino { 625*cf7f2e2dSJohn Marino case UNDEF_DOMAIN: 626*cf7f2e2dSJohn Marino fputs_filtered ("undefined domain, ", outfile); 627*cf7f2e2dSJohn Marino break; 628*cf7f2e2dSJohn Marino case VAR_DOMAIN: 629*cf7f2e2dSJohn Marino /* This is the usual thing -- don't print it */ 630*cf7f2e2dSJohn Marino break; 631*cf7f2e2dSJohn Marino case STRUCT_DOMAIN: 632*cf7f2e2dSJohn Marino fputs_filtered ("struct domain, ", outfile); 633*cf7f2e2dSJohn Marino break; 634*cf7f2e2dSJohn Marino case LABEL_DOMAIN: 635*cf7f2e2dSJohn Marino fputs_filtered ("label domain, ", outfile); 636*cf7f2e2dSJohn Marino break; 637*cf7f2e2dSJohn Marino default: 638*cf7f2e2dSJohn Marino fputs_filtered ("<invalid domain>, ", outfile); 639*cf7f2e2dSJohn Marino break; 640*cf7f2e2dSJohn Marino } 641*cf7f2e2dSJohn Marino switch (SYMBOL_CLASS (*p)) 642*cf7f2e2dSJohn Marino { 643*cf7f2e2dSJohn Marino case LOC_UNDEF: 644*cf7f2e2dSJohn Marino fputs_filtered ("undefined", outfile); 645*cf7f2e2dSJohn Marino break; 646*cf7f2e2dSJohn Marino case LOC_CONST: 647*cf7f2e2dSJohn Marino fputs_filtered ("constant int", outfile); 648*cf7f2e2dSJohn Marino break; 649*cf7f2e2dSJohn Marino case LOC_STATIC: 650*cf7f2e2dSJohn Marino fputs_filtered ("static", outfile); 651*cf7f2e2dSJohn Marino break; 652*cf7f2e2dSJohn Marino case LOC_REGISTER: 653*cf7f2e2dSJohn Marino fputs_filtered ("register", outfile); 654*cf7f2e2dSJohn Marino break; 655*cf7f2e2dSJohn Marino case LOC_ARG: 656*cf7f2e2dSJohn Marino fputs_filtered ("pass by value", outfile); 657*cf7f2e2dSJohn Marino break; 658*cf7f2e2dSJohn Marino case LOC_REF_ARG: 659*cf7f2e2dSJohn Marino fputs_filtered ("pass by reference", outfile); 660*cf7f2e2dSJohn Marino break; 661*cf7f2e2dSJohn Marino case LOC_REGPARM_ADDR: 662*cf7f2e2dSJohn Marino fputs_filtered ("register address parameter", outfile); 663*cf7f2e2dSJohn Marino break; 664*cf7f2e2dSJohn Marino case LOC_LOCAL: 665*cf7f2e2dSJohn Marino fputs_filtered ("stack parameter", outfile); 666*cf7f2e2dSJohn Marino break; 667*cf7f2e2dSJohn Marino case LOC_TYPEDEF: 668*cf7f2e2dSJohn Marino fputs_filtered ("type", outfile); 669*cf7f2e2dSJohn Marino break; 670*cf7f2e2dSJohn Marino case LOC_LABEL: 671*cf7f2e2dSJohn Marino fputs_filtered ("label", outfile); 672*cf7f2e2dSJohn Marino break; 673*cf7f2e2dSJohn Marino case LOC_BLOCK: 674*cf7f2e2dSJohn Marino fputs_filtered ("function", outfile); 675*cf7f2e2dSJohn Marino break; 676*cf7f2e2dSJohn Marino case LOC_CONST_BYTES: 677*cf7f2e2dSJohn Marino fputs_filtered ("constant bytes", outfile); 678*cf7f2e2dSJohn Marino break; 679*cf7f2e2dSJohn Marino case LOC_UNRESOLVED: 680*cf7f2e2dSJohn Marino fputs_filtered ("unresolved", outfile); 681*cf7f2e2dSJohn Marino break; 682*cf7f2e2dSJohn Marino case LOC_OPTIMIZED_OUT: 683*cf7f2e2dSJohn Marino fputs_filtered ("optimized out", outfile); 684*cf7f2e2dSJohn Marino break; 685*cf7f2e2dSJohn Marino case LOC_COMPUTED: 686*cf7f2e2dSJohn Marino fputs_filtered ("computed at runtime", outfile); 687*cf7f2e2dSJohn Marino break; 688*cf7f2e2dSJohn Marino default: 689*cf7f2e2dSJohn Marino fputs_filtered ("<invalid location>", outfile); 690*cf7f2e2dSJohn Marino break; 691*cf7f2e2dSJohn Marino } 692*cf7f2e2dSJohn Marino fputs_filtered (", ", outfile); 693*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile); 694*cf7f2e2dSJohn Marino fprintf_filtered (outfile, "\n"); 695*cf7f2e2dSJohn Marino p++; 696*cf7f2e2dSJohn Marino } 697*cf7f2e2dSJohn Marino } 698*cf7f2e2dSJohn Marino 699*cf7f2e2dSJohn Marino static void 700*cf7f2e2dSJohn Marino dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab, 701*cf7f2e2dSJohn Marino struct ui_file *outfile) 702*cf7f2e2dSJohn Marino { 703*cf7f2e2dSJohn Marino struct gdbarch *gdbarch = get_objfile_arch (objfile); 704*cf7f2e2dSJohn Marino int i; 705*cf7f2e2dSJohn Marino 706*cf7f2e2dSJohn Marino fprintf_filtered (outfile, "\nPartial symtab for source file %s ", 707*cf7f2e2dSJohn Marino psymtab->filename); 708*cf7f2e2dSJohn Marino fprintf_filtered (outfile, "(object "); 709*cf7f2e2dSJohn Marino gdb_print_host_address (psymtab, outfile); 710*cf7f2e2dSJohn Marino fprintf_filtered (outfile, ")\n\n"); 711*cf7f2e2dSJohn Marino fprintf_unfiltered (outfile, " Read from object file %s (", 712*cf7f2e2dSJohn Marino objfile->name); 713*cf7f2e2dSJohn Marino gdb_print_host_address (objfile, outfile); 714*cf7f2e2dSJohn Marino fprintf_unfiltered (outfile, ")\n"); 715*cf7f2e2dSJohn Marino 716*cf7f2e2dSJohn Marino if (psymtab->readin) 717*cf7f2e2dSJohn Marino { 718*cf7f2e2dSJohn Marino fprintf_filtered (outfile, 719*cf7f2e2dSJohn Marino " Full symtab was read (at "); 720*cf7f2e2dSJohn Marino gdb_print_host_address (psymtab->symtab, outfile); 721*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " by function at "); 722*cf7f2e2dSJohn Marino gdb_print_host_address (psymtab->read_symtab, outfile); 723*cf7f2e2dSJohn Marino fprintf_filtered (outfile, ")\n"); 724*cf7f2e2dSJohn Marino } 725*cf7f2e2dSJohn Marino 726*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " Relocate symbols by "); 727*cf7f2e2dSJohn Marino for (i = 0; i < psymtab->objfile->num_sections; ++i) 728*cf7f2e2dSJohn Marino { 729*cf7f2e2dSJohn Marino if (i != 0) 730*cf7f2e2dSJohn Marino fprintf_filtered (outfile, ", "); 731*cf7f2e2dSJohn Marino wrap_here (" "); 732*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, 733*cf7f2e2dSJohn Marino ANOFFSET (psymtab->section_offsets, i)), 734*cf7f2e2dSJohn Marino outfile); 735*cf7f2e2dSJohn Marino } 736*cf7f2e2dSJohn Marino fprintf_filtered (outfile, "\n"); 737*cf7f2e2dSJohn Marino 738*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " Symbols cover text addresses "); 739*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile); 740*cf7f2e2dSJohn Marino fprintf_filtered (outfile, "-"); 741*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile); 742*cf7f2e2dSJohn Marino fprintf_filtered (outfile, "\n"); 743*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " Depends on %d other partial symtabs.\n", 744*cf7f2e2dSJohn Marino psymtab->number_of_dependencies); 745*cf7f2e2dSJohn Marino for (i = 0; i < psymtab->number_of_dependencies; i++) 746*cf7f2e2dSJohn Marino { 747*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " %d ", i); 748*cf7f2e2dSJohn Marino gdb_print_host_address (psymtab->dependencies[i], outfile); 749*cf7f2e2dSJohn Marino fprintf_filtered (outfile, " %s\n", 750*cf7f2e2dSJohn Marino psymtab->dependencies[i]->filename); 751*cf7f2e2dSJohn Marino } 752*cf7f2e2dSJohn Marino if (psymtab->n_global_syms > 0) 753*cf7f2e2dSJohn Marino { 754*cf7f2e2dSJohn Marino print_partial_symbols (gdbarch, 755*cf7f2e2dSJohn Marino objfile->global_psymbols.list 756*cf7f2e2dSJohn Marino + psymtab->globals_offset, 757*cf7f2e2dSJohn Marino psymtab->n_global_syms, "Global", outfile); 758*cf7f2e2dSJohn Marino } 759*cf7f2e2dSJohn Marino if (psymtab->n_static_syms > 0) 760*cf7f2e2dSJohn Marino { 761*cf7f2e2dSJohn Marino print_partial_symbols (gdbarch, 762*cf7f2e2dSJohn Marino objfile->static_psymbols.list 763*cf7f2e2dSJohn Marino + psymtab->statics_offset, 764*cf7f2e2dSJohn Marino psymtab->n_static_syms, "Static", outfile); 765*cf7f2e2dSJohn Marino } 766*cf7f2e2dSJohn Marino fprintf_filtered (outfile, "\n"); 767*cf7f2e2dSJohn Marino } 768*cf7f2e2dSJohn Marino 769*cf7f2e2dSJohn Marino static void 770*cf7f2e2dSJohn Marino print_psymtab_stats_for_objfile (struct objfile *objfile) 771*cf7f2e2dSJohn Marino { 772*cf7f2e2dSJohn Marino int i; 773*cf7f2e2dSJohn Marino struct partial_symtab *ps; 774*cf7f2e2dSJohn Marino 775*cf7f2e2dSJohn Marino i = 0; 776*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, ps) 777*cf7f2e2dSJohn Marino { 778*cf7f2e2dSJohn Marino if (ps->readin == 0) 779*cf7f2e2dSJohn Marino i++; 780*cf7f2e2dSJohn Marino } 781*cf7f2e2dSJohn Marino printf_filtered (_(" Number of psym tables (not yet expanded): %d\n"), i); 782*cf7f2e2dSJohn Marino } 783*cf7f2e2dSJohn Marino 784*cf7f2e2dSJohn Marino static void 785*cf7f2e2dSJohn Marino dump_psymtabs_for_objfile (struct objfile *objfile) 786*cf7f2e2dSJohn Marino { 787*cf7f2e2dSJohn Marino struct partial_symtab *psymtab; 788*cf7f2e2dSJohn Marino 789*cf7f2e2dSJohn Marino if (objfile->psymtabs) 790*cf7f2e2dSJohn Marino { 791*cf7f2e2dSJohn Marino printf_filtered ("Psymtabs:\n"); 792*cf7f2e2dSJohn Marino for (psymtab = objfile->psymtabs; 793*cf7f2e2dSJohn Marino psymtab != NULL; 794*cf7f2e2dSJohn Marino psymtab = psymtab->next) 795*cf7f2e2dSJohn Marino { 796*cf7f2e2dSJohn Marino printf_filtered ("%s at ", 797*cf7f2e2dSJohn Marino psymtab->filename); 798*cf7f2e2dSJohn Marino gdb_print_host_address (psymtab, gdb_stdout); 799*cf7f2e2dSJohn Marino printf_filtered (", "); 800*cf7f2e2dSJohn Marino if (psymtab->objfile != objfile) 801*cf7f2e2dSJohn Marino { 802*cf7f2e2dSJohn Marino printf_filtered ("NOT ON CHAIN! "); 803*cf7f2e2dSJohn Marino } 804*cf7f2e2dSJohn Marino wrap_here (" "); 805*cf7f2e2dSJohn Marino } 806*cf7f2e2dSJohn Marino printf_filtered ("\n\n"); 807*cf7f2e2dSJohn Marino } 808*cf7f2e2dSJohn Marino } 809*cf7f2e2dSJohn Marino 810*cf7f2e2dSJohn Marino /* Look through the partial symtabs for all symbols which begin 811*cf7f2e2dSJohn Marino by matching FUNC_NAME. Make sure we read that symbol table in. */ 812*cf7f2e2dSJohn Marino 813*cf7f2e2dSJohn Marino static void 814*cf7f2e2dSJohn Marino read_symtabs_for_function (struct objfile *objfile, const char *func_name) 815*cf7f2e2dSJohn Marino { 816*cf7f2e2dSJohn Marino struct partial_symtab *ps; 817*cf7f2e2dSJohn Marino 818*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, ps) 819*cf7f2e2dSJohn Marino { 820*cf7f2e2dSJohn Marino if (ps->readin) 821*cf7f2e2dSJohn Marino continue; 822*cf7f2e2dSJohn Marino 823*cf7f2e2dSJohn Marino if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN) 824*cf7f2e2dSJohn Marino != NULL) 825*cf7f2e2dSJohn Marino || (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN) 826*cf7f2e2dSJohn Marino != NULL)) 827*cf7f2e2dSJohn Marino psymtab_to_symtab (ps); 828*cf7f2e2dSJohn Marino } 829*cf7f2e2dSJohn Marino } 830*cf7f2e2dSJohn Marino 831*cf7f2e2dSJohn Marino static void 832*cf7f2e2dSJohn Marino expand_partial_symbol_tables (struct objfile *objfile) 833*cf7f2e2dSJohn Marino { 834*cf7f2e2dSJohn Marino struct partial_symtab *psymtab; 835*cf7f2e2dSJohn Marino 836*cf7f2e2dSJohn Marino for (psymtab = objfile->psymtabs; 837*cf7f2e2dSJohn Marino psymtab != NULL; 838*cf7f2e2dSJohn Marino psymtab = psymtab->next) 839*cf7f2e2dSJohn Marino { 840*cf7f2e2dSJohn Marino psymtab_to_symtab (psymtab); 841*cf7f2e2dSJohn Marino } 842*cf7f2e2dSJohn Marino } 843*cf7f2e2dSJohn Marino 844*cf7f2e2dSJohn Marino static void 845*cf7f2e2dSJohn Marino read_psymtabs_with_filename (struct objfile *objfile, const char *filename) 846*cf7f2e2dSJohn Marino { 847*cf7f2e2dSJohn Marino struct partial_symtab *p; 848*cf7f2e2dSJohn Marino 849*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, p) 850*cf7f2e2dSJohn Marino { 851*cf7f2e2dSJohn Marino if (strcmp (filename, p->filename) == 0) 852*cf7f2e2dSJohn Marino PSYMTAB_TO_SYMTAB (p); 853*cf7f2e2dSJohn Marino } 854*cf7f2e2dSJohn Marino } 855*cf7f2e2dSJohn Marino 856*cf7f2e2dSJohn Marino static void 857*cf7f2e2dSJohn Marino map_symbol_names_psymtab (struct objfile *objfile, 858*cf7f2e2dSJohn Marino void (*fun) (const char *, void *), void *data) 859*cf7f2e2dSJohn Marino { 860*cf7f2e2dSJohn Marino struct partial_symtab *ps; 861*cf7f2e2dSJohn Marino 862*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, ps) 863*cf7f2e2dSJohn Marino { 864*cf7f2e2dSJohn Marino struct partial_symbol **psym; 865*cf7f2e2dSJohn Marino 866*cf7f2e2dSJohn Marino /* If the psymtab's been read in we'll get it when we search 867*cf7f2e2dSJohn Marino through the blockvector. */ 868*cf7f2e2dSJohn Marino if (ps->readin) 869*cf7f2e2dSJohn Marino continue; 870*cf7f2e2dSJohn Marino 871*cf7f2e2dSJohn Marino for (psym = objfile->global_psymbols.list + ps->globals_offset; 872*cf7f2e2dSJohn Marino psym < (objfile->global_psymbols.list + ps->globals_offset 873*cf7f2e2dSJohn Marino + ps->n_global_syms); 874*cf7f2e2dSJohn Marino psym++) 875*cf7f2e2dSJohn Marino { 876*cf7f2e2dSJohn Marino /* If interrupted, then quit. */ 877*cf7f2e2dSJohn Marino QUIT; 878*cf7f2e2dSJohn Marino (*fun) (SYMBOL_NATURAL_NAME (*psym), data); 879*cf7f2e2dSJohn Marino } 880*cf7f2e2dSJohn Marino 881*cf7f2e2dSJohn Marino for (psym = objfile->static_psymbols.list + ps->statics_offset; 882*cf7f2e2dSJohn Marino psym < (objfile->static_psymbols.list + ps->statics_offset 883*cf7f2e2dSJohn Marino + ps->n_static_syms); 884*cf7f2e2dSJohn Marino psym++) 885*cf7f2e2dSJohn Marino { 886*cf7f2e2dSJohn Marino QUIT; 887*cf7f2e2dSJohn Marino (*fun) (SYMBOL_NATURAL_NAME (*psym), data); 888*cf7f2e2dSJohn Marino } 889*cf7f2e2dSJohn Marino } 890*cf7f2e2dSJohn Marino } 891*cf7f2e2dSJohn Marino 892*cf7f2e2dSJohn Marino static void 893*cf7f2e2dSJohn Marino map_symbol_filenames_psymtab (struct objfile *objfile, 894*cf7f2e2dSJohn Marino void (*fun) (const char *, const char *, 895*cf7f2e2dSJohn Marino void *), 896*cf7f2e2dSJohn Marino void *data) 897*cf7f2e2dSJohn Marino { 898*cf7f2e2dSJohn Marino struct partial_symtab *ps; 899*cf7f2e2dSJohn Marino 900*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, ps) 901*cf7f2e2dSJohn Marino { 902*cf7f2e2dSJohn Marino const char *fullname; 903*cf7f2e2dSJohn Marino 904*cf7f2e2dSJohn Marino if (ps->readin) 905*cf7f2e2dSJohn Marino continue; 906*cf7f2e2dSJohn Marino 907*cf7f2e2dSJohn Marino fullname = psymtab_to_fullname (ps); 908*cf7f2e2dSJohn Marino (*fun) (ps->filename, fullname, data); 909*cf7f2e2dSJohn Marino } 910*cf7f2e2dSJohn Marino } 911*cf7f2e2dSJohn Marino 912*cf7f2e2dSJohn Marino int find_and_open_source (const char *filename, 913*cf7f2e2dSJohn Marino const char *dirname, 914*cf7f2e2dSJohn Marino char **fullname); 915*cf7f2e2dSJohn Marino 916*cf7f2e2dSJohn Marino /* Finds the fullname that a partial_symtab represents. 917*cf7f2e2dSJohn Marino 918*cf7f2e2dSJohn Marino If this functions finds the fullname, it will save it in ps->fullname 919*cf7f2e2dSJohn Marino and it will also return the value. 920*cf7f2e2dSJohn Marino 921*cf7f2e2dSJohn Marino If this function fails to find the file that this partial_symtab represents, 922*cf7f2e2dSJohn Marino NULL will be returned and ps->fullname will be set to NULL. */ 923*cf7f2e2dSJohn Marino static char * 924*cf7f2e2dSJohn Marino psymtab_to_fullname (struct partial_symtab *ps) 925*cf7f2e2dSJohn Marino { 926*cf7f2e2dSJohn Marino int r; 927*cf7f2e2dSJohn Marino 928*cf7f2e2dSJohn Marino if (!ps) 929*cf7f2e2dSJohn Marino return NULL; 930*cf7f2e2dSJohn Marino 931*cf7f2e2dSJohn Marino /* Don't check ps->fullname here, the file could have been 932*cf7f2e2dSJohn Marino deleted/moved/..., look for it again */ 933*cf7f2e2dSJohn Marino r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname); 934*cf7f2e2dSJohn Marino 935*cf7f2e2dSJohn Marino if (r >= 0) 936*cf7f2e2dSJohn Marino { 937*cf7f2e2dSJohn Marino close (r); 938*cf7f2e2dSJohn Marino return ps->fullname; 939*cf7f2e2dSJohn Marino } 940*cf7f2e2dSJohn Marino 941*cf7f2e2dSJohn Marino return NULL; 942*cf7f2e2dSJohn Marino } 943*cf7f2e2dSJohn Marino 944*cf7f2e2dSJohn Marino static char * 945*cf7f2e2dSJohn Marino find_symbol_file_from_partial (struct objfile *objfile, const char *name) 946*cf7f2e2dSJohn Marino { 947*cf7f2e2dSJohn Marino struct partial_symtab *pst; 948*cf7f2e2dSJohn Marino 949*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, pst) 950*cf7f2e2dSJohn Marino { 951*cf7f2e2dSJohn Marino if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN)) 952*cf7f2e2dSJohn Marino return pst->filename; 953*cf7f2e2dSJohn Marino } 954*cf7f2e2dSJohn Marino return NULL; 955*cf7f2e2dSJohn Marino } 956*cf7f2e2dSJohn Marino 957*cf7f2e2dSJohn Marino /* Look, in partial_symtab PST, for symbol NAME in given namespace. 958*cf7f2e2dSJohn Marino Check the global symbols if GLOBAL, the static symbols if not. 959*cf7f2e2dSJohn Marino Do wild-card match if WILD. */ 960*cf7f2e2dSJohn Marino 961*cf7f2e2dSJohn Marino static struct partial_symbol * 962*cf7f2e2dSJohn Marino ada_lookup_partial_symbol (struct partial_symtab *pst, const char *name, 963*cf7f2e2dSJohn Marino int global, domain_enum namespace, int wild, 964*cf7f2e2dSJohn Marino int (*wild_match) (const char *, int, const char *), 965*cf7f2e2dSJohn Marino int (*is_name_suffix) (const char *)) 966*cf7f2e2dSJohn Marino { 967*cf7f2e2dSJohn Marino struct partial_symbol **start; 968*cf7f2e2dSJohn Marino int name_len = strlen (name); 969*cf7f2e2dSJohn Marino int length = (global ? pst->n_global_syms : pst->n_static_syms); 970*cf7f2e2dSJohn Marino int i; 971*cf7f2e2dSJohn Marino 972*cf7f2e2dSJohn Marino if (length == 0) 973*cf7f2e2dSJohn Marino { 974*cf7f2e2dSJohn Marino return (NULL); 975*cf7f2e2dSJohn Marino } 976*cf7f2e2dSJohn Marino 977*cf7f2e2dSJohn Marino start = (global ? 978*cf7f2e2dSJohn Marino pst->objfile->global_psymbols.list + pst->globals_offset : 979*cf7f2e2dSJohn Marino pst->objfile->static_psymbols.list + pst->statics_offset); 980*cf7f2e2dSJohn Marino 981*cf7f2e2dSJohn Marino if (wild) 982*cf7f2e2dSJohn Marino { 983*cf7f2e2dSJohn Marino for (i = 0; i < length; i += 1) 984*cf7f2e2dSJohn Marino { 985*cf7f2e2dSJohn Marino struct partial_symbol *psym = start[i]; 986*cf7f2e2dSJohn Marino 987*cf7f2e2dSJohn Marino if (symbol_matches_domain (SYMBOL_LANGUAGE (psym), 988*cf7f2e2dSJohn Marino SYMBOL_DOMAIN (psym), namespace) 989*cf7f2e2dSJohn Marino && (*wild_match) (name, name_len, SYMBOL_LINKAGE_NAME (psym))) 990*cf7f2e2dSJohn Marino return psym; 991*cf7f2e2dSJohn Marino } 992*cf7f2e2dSJohn Marino return NULL; 993*cf7f2e2dSJohn Marino } 994*cf7f2e2dSJohn Marino else 995*cf7f2e2dSJohn Marino { 996*cf7f2e2dSJohn Marino if (global) 997*cf7f2e2dSJohn Marino { 998*cf7f2e2dSJohn Marino int U; 999*cf7f2e2dSJohn Marino 1000*cf7f2e2dSJohn Marino i = 0; 1001*cf7f2e2dSJohn Marino U = length - 1; 1002*cf7f2e2dSJohn Marino while (U - i > 4) 1003*cf7f2e2dSJohn Marino { 1004*cf7f2e2dSJohn Marino int M = (U + i) >> 1; 1005*cf7f2e2dSJohn Marino struct partial_symbol *psym = start[M]; 1006*cf7f2e2dSJohn Marino 1007*cf7f2e2dSJohn Marino if (SYMBOL_LINKAGE_NAME (psym)[0] < name[0]) 1008*cf7f2e2dSJohn Marino i = M + 1; 1009*cf7f2e2dSJohn Marino else if (SYMBOL_LINKAGE_NAME (psym)[0] > name[0]) 1010*cf7f2e2dSJohn Marino U = M - 1; 1011*cf7f2e2dSJohn Marino else if (strcmp (SYMBOL_LINKAGE_NAME (psym), name) < 0) 1012*cf7f2e2dSJohn Marino i = M + 1; 1013*cf7f2e2dSJohn Marino else 1014*cf7f2e2dSJohn Marino U = M; 1015*cf7f2e2dSJohn Marino } 1016*cf7f2e2dSJohn Marino } 1017*cf7f2e2dSJohn Marino else 1018*cf7f2e2dSJohn Marino i = 0; 1019*cf7f2e2dSJohn Marino 1020*cf7f2e2dSJohn Marino while (i < length) 1021*cf7f2e2dSJohn Marino { 1022*cf7f2e2dSJohn Marino struct partial_symbol *psym = start[i]; 1023*cf7f2e2dSJohn Marino 1024*cf7f2e2dSJohn Marino if (symbol_matches_domain (SYMBOL_LANGUAGE (psym), 1025*cf7f2e2dSJohn Marino SYMBOL_DOMAIN (psym), namespace)) 1026*cf7f2e2dSJohn Marino { 1027*cf7f2e2dSJohn Marino int cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym), name_len); 1028*cf7f2e2dSJohn Marino 1029*cf7f2e2dSJohn Marino if (cmp < 0) 1030*cf7f2e2dSJohn Marino { 1031*cf7f2e2dSJohn Marino if (global) 1032*cf7f2e2dSJohn Marino break; 1033*cf7f2e2dSJohn Marino } 1034*cf7f2e2dSJohn Marino else if (cmp == 0 1035*cf7f2e2dSJohn Marino && (*is_name_suffix) (SYMBOL_LINKAGE_NAME (psym) 1036*cf7f2e2dSJohn Marino + name_len)) 1037*cf7f2e2dSJohn Marino return psym; 1038*cf7f2e2dSJohn Marino } 1039*cf7f2e2dSJohn Marino i += 1; 1040*cf7f2e2dSJohn Marino } 1041*cf7f2e2dSJohn Marino 1042*cf7f2e2dSJohn Marino if (global) 1043*cf7f2e2dSJohn Marino { 1044*cf7f2e2dSJohn Marino int U; 1045*cf7f2e2dSJohn Marino 1046*cf7f2e2dSJohn Marino i = 0; 1047*cf7f2e2dSJohn Marino U = length - 1; 1048*cf7f2e2dSJohn Marino while (U - i > 4) 1049*cf7f2e2dSJohn Marino { 1050*cf7f2e2dSJohn Marino int M = (U + i) >> 1; 1051*cf7f2e2dSJohn Marino struct partial_symbol *psym = start[M]; 1052*cf7f2e2dSJohn Marino 1053*cf7f2e2dSJohn Marino if (SYMBOL_LINKAGE_NAME (psym)[0] < '_') 1054*cf7f2e2dSJohn Marino i = M + 1; 1055*cf7f2e2dSJohn Marino else if (SYMBOL_LINKAGE_NAME (psym)[0] > '_') 1056*cf7f2e2dSJohn Marino U = M - 1; 1057*cf7f2e2dSJohn Marino else if (strcmp (SYMBOL_LINKAGE_NAME (psym), "_ada_") < 0) 1058*cf7f2e2dSJohn Marino i = M + 1; 1059*cf7f2e2dSJohn Marino else 1060*cf7f2e2dSJohn Marino U = M; 1061*cf7f2e2dSJohn Marino } 1062*cf7f2e2dSJohn Marino } 1063*cf7f2e2dSJohn Marino else 1064*cf7f2e2dSJohn Marino i = 0; 1065*cf7f2e2dSJohn Marino 1066*cf7f2e2dSJohn Marino while (i < length) 1067*cf7f2e2dSJohn Marino { 1068*cf7f2e2dSJohn Marino struct partial_symbol *psym = start[i]; 1069*cf7f2e2dSJohn Marino 1070*cf7f2e2dSJohn Marino if (symbol_matches_domain (SYMBOL_LANGUAGE (psym), 1071*cf7f2e2dSJohn Marino SYMBOL_DOMAIN (psym), namespace)) 1072*cf7f2e2dSJohn Marino { 1073*cf7f2e2dSJohn Marino int cmp; 1074*cf7f2e2dSJohn Marino 1075*cf7f2e2dSJohn Marino cmp = (int) '_' - (int) SYMBOL_LINKAGE_NAME (psym)[0]; 1076*cf7f2e2dSJohn Marino if (cmp == 0) 1077*cf7f2e2dSJohn Marino { 1078*cf7f2e2dSJohn Marino cmp = strncmp ("_ada_", SYMBOL_LINKAGE_NAME (psym), 5); 1079*cf7f2e2dSJohn Marino if (cmp == 0) 1080*cf7f2e2dSJohn Marino cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym) + 5, 1081*cf7f2e2dSJohn Marino name_len); 1082*cf7f2e2dSJohn Marino } 1083*cf7f2e2dSJohn Marino 1084*cf7f2e2dSJohn Marino if (cmp < 0) 1085*cf7f2e2dSJohn Marino { 1086*cf7f2e2dSJohn Marino if (global) 1087*cf7f2e2dSJohn Marino break; 1088*cf7f2e2dSJohn Marino } 1089*cf7f2e2dSJohn Marino else if (cmp == 0 1090*cf7f2e2dSJohn Marino && (*is_name_suffix) (SYMBOL_LINKAGE_NAME (psym) 1091*cf7f2e2dSJohn Marino + name_len + 5)) 1092*cf7f2e2dSJohn Marino return psym; 1093*cf7f2e2dSJohn Marino } 1094*cf7f2e2dSJohn Marino i += 1; 1095*cf7f2e2dSJohn Marino } 1096*cf7f2e2dSJohn Marino } 1097*cf7f2e2dSJohn Marino return NULL; 1098*cf7f2e2dSJohn Marino } 1099*cf7f2e2dSJohn Marino 1100*cf7f2e2dSJohn Marino static void 1101*cf7f2e2dSJohn Marino map_ada_symtabs (struct objfile *objfile, 1102*cf7f2e2dSJohn Marino int (*wild_match) (const char *, int, const char *), 1103*cf7f2e2dSJohn Marino int (*is_name_suffix) (const char *), 1104*cf7f2e2dSJohn Marino void (*callback) (struct objfile *, struct symtab *, void *), 1105*cf7f2e2dSJohn Marino const char *name, int global, domain_enum namespace, int wild, 1106*cf7f2e2dSJohn Marino void *data) 1107*cf7f2e2dSJohn Marino { 1108*cf7f2e2dSJohn Marino struct partial_symtab *ps; 1109*cf7f2e2dSJohn Marino 1110*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, ps) 1111*cf7f2e2dSJohn Marino { 1112*cf7f2e2dSJohn Marino QUIT; 1113*cf7f2e2dSJohn Marino if (ps->readin 1114*cf7f2e2dSJohn Marino || ada_lookup_partial_symbol (ps, name, global, namespace, wild, 1115*cf7f2e2dSJohn Marino wild_match, is_name_suffix)) 1116*cf7f2e2dSJohn Marino { 1117*cf7f2e2dSJohn Marino struct symtab *s = PSYMTAB_TO_SYMTAB (ps); 1118*cf7f2e2dSJohn Marino 1119*cf7f2e2dSJohn Marino if (s == NULL || !s->primary) 1120*cf7f2e2dSJohn Marino continue; 1121*cf7f2e2dSJohn Marino (*callback) (objfile, s, data); 1122*cf7f2e2dSJohn Marino } 1123*cf7f2e2dSJohn Marino } 1124*cf7f2e2dSJohn Marino } 1125*cf7f2e2dSJohn Marino 1126*cf7f2e2dSJohn Marino static void 1127*cf7f2e2dSJohn Marino expand_symtabs_matching_via_partial (struct objfile *objfile, 1128*cf7f2e2dSJohn Marino int (*file_matcher) (const char *, void *), 1129*cf7f2e2dSJohn Marino int (*name_matcher) (const char *, void *), 1130*cf7f2e2dSJohn Marino domain_enum kind, 1131*cf7f2e2dSJohn Marino void *data) 1132*cf7f2e2dSJohn Marino { 1133*cf7f2e2dSJohn Marino struct partial_symtab *ps; 1134*cf7f2e2dSJohn Marino 1135*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, ps) 1136*cf7f2e2dSJohn Marino { 1137*cf7f2e2dSJohn Marino struct partial_symbol **psym; 1138*cf7f2e2dSJohn Marino struct partial_symbol **bound, **gbound, **sbound; 1139*cf7f2e2dSJohn Marino int keep_going = 1; 1140*cf7f2e2dSJohn Marino 1141*cf7f2e2dSJohn Marino if (ps->readin) 1142*cf7f2e2dSJohn Marino continue; 1143*cf7f2e2dSJohn Marino 1144*cf7f2e2dSJohn Marino if (! (*file_matcher) (ps->filename, data)) 1145*cf7f2e2dSJohn Marino continue; 1146*cf7f2e2dSJohn Marino 1147*cf7f2e2dSJohn Marino gbound = objfile->global_psymbols.list + ps->globals_offset + ps->n_global_syms; 1148*cf7f2e2dSJohn Marino sbound = objfile->static_psymbols.list + ps->statics_offset + ps->n_static_syms; 1149*cf7f2e2dSJohn Marino bound = gbound; 1150*cf7f2e2dSJohn Marino 1151*cf7f2e2dSJohn Marino /* Go through all of the symbols stored in a partial 1152*cf7f2e2dSJohn Marino symtab in one loop. */ 1153*cf7f2e2dSJohn Marino psym = objfile->global_psymbols.list + ps->globals_offset; 1154*cf7f2e2dSJohn Marino while (keep_going) 1155*cf7f2e2dSJohn Marino { 1156*cf7f2e2dSJohn Marino if (psym >= bound) 1157*cf7f2e2dSJohn Marino { 1158*cf7f2e2dSJohn Marino if (bound == gbound && ps->n_static_syms != 0) 1159*cf7f2e2dSJohn Marino { 1160*cf7f2e2dSJohn Marino psym = objfile->static_psymbols.list + ps->statics_offset; 1161*cf7f2e2dSJohn Marino bound = sbound; 1162*cf7f2e2dSJohn Marino } 1163*cf7f2e2dSJohn Marino else 1164*cf7f2e2dSJohn Marino keep_going = 0; 1165*cf7f2e2dSJohn Marino continue; 1166*cf7f2e2dSJohn Marino } 1167*cf7f2e2dSJohn Marino else 1168*cf7f2e2dSJohn Marino { 1169*cf7f2e2dSJohn Marino QUIT; 1170*cf7f2e2dSJohn Marino 1171*cf7f2e2dSJohn Marino if ((*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data) 1172*cf7f2e2dSJohn Marino && ((kind == VARIABLES_DOMAIN 1173*cf7f2e2dSJohn Marino && SYMBOL_CLASS (*psym) != LOC_TYPEDEF 1174*cf7f2e2dSJohn Marino && SYMBOL_CLASS (*psym) != LOC_BLOCK) 1175*cf7f2e2dSJohn Marino || (kind == FUNCTIONS_DOMAIN 1176*cf7f2e2dSJohn Marino && SYMBOL_CLASS (*psym) == LOC_BLOCK) 1177*cf7f2e2dSJohn Marino || (kind == TYPES_DOMAIN 1178*cf7f2e2dSJohn Marino && SYMBOL_CLASS (*psym) == LOC_TYPEDEF))) 1179*cf7f2e2dSJohn Marino { 1180*cf7f2e2dSJohn Marino PSYMTAB_TO_SYMTAB (ps); 1181*cf7f2e2dSJohn Marino keep_going = 0; 1182*cf7f2e2dSJohn Marino } 1183*cf7f2e2dSJohn Marino } 1184*cf7f2e2dSJohn Marino psym++; 1185*cf7f2e2dSJohn Marino } 1186*cf7f2e2dSJohn Marino } 1187*cf7f2e2dSJohn Marino } 1188*cf7f2e2dSJohn Marino 1189*cf7f2e2dSJohn Marino static int 1190*cf7f2e2dSJohn Marino objfile_has_psyms (struct objfile *objfile) 1191*cf7f2e2dSJohn Marino { 1192*cf7f2e2dSJohn Marino return objfile->psymtabs != NULL; 1193*cf7f2e2dSJohn Marino } 1194*cf7f2e2dSJohn Marino 1195*cf7f2e2dSJohn Marino const struct quick_symbol_functions psym_functions = 1196*cf7f2e2dSJohn Marino { 1197*cf7f2e2dSJohn Marino objfile_has_psyms, 1198*cf7f2e2dSJohn Marino find_last_source_symtab_from_partial, 1199*cf7f2e2dSJohn Marino forget_cached_source_info_partial, 1200*cf7f2e2dSJohn Marino lookup_symtab_via_partial_symtab, 1201*cf7f2e2dSJohn Marino lookup_symbol_aux_psymtabs, 1202*cf7f2e2dSJohn Marino print_psymtab_stats_for_objfile, 1203*cf7f2e2dSJohn Marino dump_psymtabs_for_objfile, 1204*cf7f2e2dSJohn Marino relocate_psymtabs, 1205*cf7f2e2dSJohn Marino read_symtabs_for_function, 1206*cf7f2e2dSJohn Marino expand_partial_symbol_tables, 1207*cf7f2e2dSJohn Marino read_psymtabs_with_filename, 1208*cf7f2e2dSJohn Marino find_symbol_file_from_partial, 1209*cf7f2e2dSJohn Marino map_ada_symtabs, 1210*cf7f2e2dSJohn Marino expand_symtabs_matching_via_partial, 1211*cf7f2e2dSJohn Marino find_pc_sect_symtab_from_partial, 1212*cf7f2e2dSJohn Marino map_symbol_names_psymtab, 1213*cf7f2e2dSJohn Marino map_symbol_filenames_psymtab 1214*cf7f2e2dSJohn Marino }; 1215*cf7f2e2dSJohn Marino 1216*cf7f2e2dSJohn Marino 1217*cf7f2e2dSJohn Marino 1218*cf7f2e2dSJohn Marino /* This compares two partial symbols by names, using strcmp_iw_ordered 1219*cf7f2e2dSJohn Marino for the comparison. */ 1220*cf7f2e2dSJohn Marino 1221*cf7f2e2dSJohn Marino static int 1222*cf7f2e2dSJohn Marino compare_psymbols (const void *s1p, const void *s2p) 1223*cf7f2e2dSJohn Marino { 1224*cf7f2e2dSJohn Marino struct partial_symbol *const *s1 = s1p; 1225*cf7f2e2dSJohn Marino struct partial_symbol *const *s2 = s2p; 1226*cf7f2e2dSJohn Marino 1227*cf7f2e2dSJohn Marino return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1), 1228*cf7f2e2dSJohn Marino SYMBOL_SEARCH_NAME (*s2)); 1229*cf7f2e2dSJohn Marino } 1230*cf7f2e2dSJohn Marino 1231*cf7f2e2dSJohn Marino void 1232*cf7f2e2dSJohn Marino sort_pst_symbols (struct partial_symtab *pst) 1233*cf7f2e2dSJohn Marino { 1234*cf7f2e2dSJohn Marino /* Sort the global list; don't sort the static list */ 1235*cf7f2e2dSJohn Marino 1236*cf7f2e2dSJohn Marino qsort (pst->objfile->global_psymbols.list + pst->globals_offset, 1237*cf7f2e2dSJohn Marino pst->n_global_syms, sizeof (struct partial_symbol *), 1238*cf7f2e2dSJohn Marino compare_psymbols); 1239*cf7f2e2dSJohn Marino } 1240*cf7f2e2dSJohn Marino 1241*cf7f2e2dSJohn Marino /* Allocate and partially fill a partial symtab. It will be 1242*cf7f2e2dSJohn Marino completely filled at the end of the symbol list. 1243*cf7f2e2dSJohn Marino 1244*cf7f2e2dSJohn Marino FILENAME is the name of the symbol-file we are reading from. */ 1245*cf7f2e2dSJohn Marino 1246*cf7f2e2dSJohn Marino struct partial_symtab * 1247*cf7f2e2dSJohn Marino start_psymtab_common (struct objfile *objfile, 1248*cf7f2e2dSJohn Marino struct section_offsets *section_offsets, 1249*cf7f2e2dSJohn Marino const char *filename, 1250*cf7f2e2dSJohn Marino CORE_ADDR textlow, struct partial_symbol **global_syms, 1251*cf7f2e2dSJohn Marino struct partial_symbol **static_syms) 1252*cf7f2e2dSJohn Marino { 1253*cf7f2e2dSJohn Marino struct partial_symtab *psymtab; 1254*cf7f2e2dSJohn Marino 1255*cf7f2e2dSJohn Marino psymtab = allocate_psymtab (filename, objfile); 1256*cf7f2e2dSJohn Marino psymtab->section_offsets = section_offsets; 1257*cf7f2e2dSJohn Marino psymtab->textlow = textlow; 1258*cf7f2e2dSJohn Marino psymtab->texthigh = psymtab->textlow; /* default */ 1259*cf7f2e2dSJohn Marino psymtab->globals_offset = global_syms - objfile->global_psymbols.list; 1260*cf7f2e2dSJohn Marino psymtab->statics_offset = static_syms - objfile->static_psymbols.list; 1261*cf7f2e2dSJohn Marino return (psymtab); 1262*cf7f2e2dSJohn Marino } 1263*cf7f2e2dSJohn Marino 1264*cf7f2e2dSJohn Marino /* Helper function, initialises partial symbol structure and stashes 1265*cf7f2e2dSJohn Marino it into objfile's bcache. Note that our caching mechanism will 1266*cf7f2e2dSJohn Marino use all fields of struct partial_symbol to determine hash value of the 1267*cf7f2e2dSJohn Marino structure. In other words, having two symbols with the same name but 1268*cf7f2e2dSJohn Marino different domain (or address) is possible and correct. */ 1269*cf7f2e2dSJohn Marino 1270*cf7f2e2dSJohn Marino static const struct partial_symbol * 1271*cf7f2e2dSJohn Marino add_psymbol_to_bcache (char *name, int namelength, int copy_name, 1272*cf7f2e2dSJohn Marino domain_enum domain, 1273*cf7f2e2dSJohn Marino enum address_class class, 1274*cf7f2e2dSJohn Marino long val, /* Value as a long */ 1275*cf7f2e2dSJohn Marino CORE_ADDR coreaddr, /* Value as a CORE_ADDR */ 1276*cf7f2e2dSJohn Marino enum language language, struct objfile *objfile, 1277*cf7f2e2dSJohn Marino int *added) 1278*cf7f2e2dSJohn Marino { 1279*cf7f2e2dSJohn Marino /* psymbol is static so that there will be no uninitialized gaps in the 1280*cf7f2e2dSJohn Marino structure which might contain random data, causing cache misses in 1281*cf7f2e2dSJohn Marino bcache. */ 1282*cf7f2e2dSJohn Marino static struct partial_symbol psymbol; 1283*cf7f2e2dSJohn Marino 1284*cf7f2e2dSJohn Marino /* However, we must ensure that the entire 'value' field has been 1285*cf7f2e2dSJohn Marino zeroed before assigning to it, because an assignment may not 1286*cf7f2e2dSJohn Marino write the entire field. */ 1287*cf7f2e2dSJohn Marino memset (&psymbol.ginfo.value, 0, sizeof (psymbol.ginfo.value)); 1288*cf7f2e2dSJohn Marino /* val and coreaddr are mutually exclusive, one of them *will* be zero */ 1289*cf7f2e2dSJohn Marino if (val != 0) 1290*cf7f2e2dSJohn Marino { 1291*cf7f2e2dSJohn Marino SYMBOL_VALUE (&psymbol) = val; 1292*cf7f2e2dSJohn Marino } 1293*cf7f2e2dSJohn Marino else 1294*cf7f2e2dSJohn Marino { 1295*cf7f2e2dSJohn Marino SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr; 1296*cf7f2e2dSJohn Marino } 1297*cf7f2e2dSJohn Marino SYMBOL_SECTION (&psymbol) = 0; 1298*cf7f2e2dSJohn Marino SYMBOL_LANGUAGE (&psymbol) = language; 1299*cf7f2e2dSJohn Marino PSYMBOL_DOMAIN (&psymbol) = domain; 1300*cf7f2e2dSJohn Marino PSYMBOL_CLASS (&psymbol) = class; 1301*cf7f2e2dSJohn Marino 1302*cf7f2e2dSJohn Marino SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile); 1303*cf7f2e2dSJohn Marino 1304*cf7f2e2dSJohn Marino /* Stash the partial symbol away in the cache */ 1305*cf7f2e2dSJohn Marino return bcache_full (&psymbol, sizeof (struct partial_symbol), 1306*cf7f2e2dSJohn Marino objfile->psymbol_cache, added); 1307*cf7f2e2dSJohn Marino } 1308*cf7f2e2dSJohn Marino 1309*cf7f2e2dSJohn Marino /* Helper function, adds partial symbol to the given partial symbol 1310*cf7f2e2dSJohn Marino list. */ 1311*cf7f2e2dSJohn Marino 1312*cf7f2e2dSJohn Marino static void 1313*cf7f2e2dSJohn Marino append_psymbol_to_list (struct psymbol_allocation_list *list, 1314*cf7f2e2dSJohn Marino const struct partial_symbol *psym, 1315*cf7f2e2dSJohn Marino struct objfile *objfile) 1316*cf7f2e2dSJohn Marino { 1317*cf7f2e2dSJohn Marino if (list->next >= list->list + list->size) 1318*cf7f2e2dSJohn Marino extend_psymbol_list (list, objfile); 1319*cf7f2e2dSJohn Marino *list->next++ = (struct partial_symbol *) psym; 1320*cf7f2e2dSJohn Marino OBJSTAT (objfile, n_psyms++); 1321*cf7f2e2dSJohn Marino } 1322*cf7f2e2dSJohn Marino 1323*cf7f2e2dSJohn Marino /* Add a symbol with a long value to a psymtab. 1324*cf7f2e2dSJohn Marino Since one arg is a struct, we pass in a ptr and deref it (sigh). 1325*cf7f2e2dSJohn Marino Return the partial symbol that has been added. */ 1326*cf7f2e2dSJohn Marino 1327*cf7f2e2dSJohn Marino /* NOTE: carlton/2003-09-11: The reason why we return the partial 1328*cf7f2e2dSJohn Marino symbol is so that callers can get access to the symbol's demangled 1329*cf7f2e2dSJohn Marino name, which they don't have any cheap way to determine otherwise. 1330*cf7f2e2dSJohn Marino (Currenly, dwarf2read.c is the only file who uses that information, 1331*cf7f2e2dSJohn Marino though it's possible that other readers might in the future.) 1332*cf7f2e2dSJohn Marino Elena wasn't thrilled about that, and I don't blame her, but we 1333*cf7f2e2dSJohn Marino couldn't come up with a better way to get that information. If 1334*cf7f2e2dSJohn Marino it's needed in other situations, we could consider breaking up 1335*cf7f2e2dSJohn Marino SYMBOL_SET_NAMES to provide access to the demangled name lookup 1336*cf7f2e2dSJohn Marino cache. */ 1337*cf7f2e2dSJohn Marino 1338*cf7f2e2dSJohn Marino const struct partial_symbol * 1339*cf7f2e2dSJohn Marino add_psymbol_to_list (char *name, int namelength, int copy_name, 1340*cf7f2e2dSJohn Marino domain_enum domain, 1341*cf7f2e2dSJohn Marino enum address_class class, 1342*cf7f2e2dSJohn Marino struct psymbol_allocation_list *list, 1343*cf7f2e2dSJohn Marino long val, /* Value as a long */ 1344*cf7f2e2dSJohn Marino CORE_ADDR coreaddr, /* Value as a CORE_ADDR */ 1345*cf7f2e2dSJohn Marino enum language language, struct objfile *objfile) 1346*cf7f2e2dSJohn Marino { 1347*cf7f2e2dSJohn Marino const struct partial_symbol *psym; 1348*cf7f2e2dSJohn Marino 1349*cf7f2e2dSJohn Marino int added; 1350*cf7f2e2dSJohn Marino 1351*cf7f2e2dSJohn Marino /* Stash the partial symbol away in the cache */ 1352*cf7f2e2dSJohn Marino psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class, 1353*cf7f2e2dSJohn Marino val, coreaddr, language, objfile, &added); 1354*cf7f2e2dSJohn Marino 1355*cf7f2e2dSJohn Marino /* Do not duplicate global partial symbols. */ 1356*cf7f2e2dSJohn Marino if (list == &objfile->global_psymbols 1357*cf7f2e2dSJohn Marino && !added) 1358*cf7f2e2dSJohn Marino return psym; 1359*cf7f2e2dSJohn Marino 1360*cf7f2e2dSJohn Marino /* Save pointer to partial symbol in psymtab, growing symtab if needed. */ 1361*cf7f2e2dSJohn Marino append_psymbol_to_list (list, psym, objfile); 1362*cf7f2e2dSJohn Marino return psym; 1363*cf7f2e2dSJohn Marino } 1364*cf7f2e2dSJohn Marino 1365*cf7f2e2dSJohn Marino /* Initialize storage for partial symbols. */ 1366*cf7f2e2dSJohn Marino 1367*cf7f2e2dSJohn Marino void 1368*cf7f2e2dSJohn Marino init_psymbol_list (struct objfile *objfile, int total_symbols) 1369*cf7f2e2dSJohn Marino { 1370*cf7f2e2dSJohn Marino /* Free any previously allocated psymbol lists. */ 1371*cf7f2e2dSJohn Marino 1372*cf7f2e2dSJohn Marino if (objfile->global_psymbols.list) 1373*cf7f2e2dSJohn Marino { 1374*cf7f2e2dSJohn Marino xfree (objfile->global_psymbols.list); 1375*cf7f2e2dSJohn Marino } 1376*cf7f2e2dSJohn Marino if (objfile->static_psymbols.list) 1377*cf7f2e2dSJohn Marino { 1378*cf7f2e2dSJohn Marino xfree (objfile->static_psymbols.list); 1379*cf7f2e2dSJohn Marino } 1380*cf7f2e2dSJohn Marino 1381*cf7f2e2dSJohn Marino /* Current best guess is that approximately a twentieth 1382*cf7f2e2dSJohn Marino of the total symbols (in a debugging file) are global or static 1383*cf7f2e2dSJohn Marino oriented symbols */ 1384*cf7f2e2dSJohn Marino 1385*cf7f2e2dSJohn Marino objfile->global_psymbols.size = total_symbols / 10; 1386*cf7f2e2dSJohn Marino objfile->static_psymbols.size = total_symbols / 10; 1387*cf7f2e2dSJohn Marino 1388*cf7f2e2dSJohn Marino if (objfile->global_psymbols.size > 0) 1389*cf7f2e2dSJohn Marino { 1390*cf7f2e2dSJohn Marino objfile->global_psymbols.next = 1391*cf7f2e2dSJohn Marino objfile->global_psymbols.list = (struct partial_symbol **) 1392*cf7f2e2dSJohn Marino xmalloc ((objfile->global_psymbols.size 1393*cf7f2e2dSJohn Marino * sizeof (struct partial_symbol *))); 1394*cf7f2e2dSJohn Marino } 1395*cf7f2e2dSJohn Marino if (objfile->static_psymbols.size > 0) 1396*cf7f2e2dSJohn Marino { 1397*cf7f2e2dSJohn Marino objfile->static_psymbols.next = 1398*cf7f2e2dSJohn Marino objfile->static_psymbols.list = (struct partial_symbol **) 1399*cf7f2e2dSJohn Marino xmalloc ((objfile->static_psymbols.size 1400*cf7f2e2dSJohn Marino * sizeof (struct partial_symbol *))); 1401*cf7f2e2dSJohn Marino } 1402*cf7f2e2dSJohn Marino } 1403*cf7f2e2dSJohn Marino 1404*cf7f2e2dSJohn Marino struct partial_symtab * 1405*cf7f2e2dSJohn Marino allocate_psymtab (const char *filename, struct objfile *objfile) 1406*cf7f2e2dSJohn Marino { 1407*cf7f2e2dSJohn Marino struct partial_symtab *psymtab; 1408*cf7f2e2dSJohn Marino 1409*cf7f2e2dSJohn Marino if (objfile->free_psymtabs) 1410*cf7f2e2dSJohn Marino { 1411*cf7f2e2dSJohn Marino psymtab = objfile->free_psymtabs; 1412*cf7f2e2dSJohn Marino objfile->free_psymtabs = psymtab->next; 1413*cf7f2e2dSJohn Marino } 1414*cf7f2e2dSJohn Marino else 1415*cf7f2e2dSJohn Marino psymtab = (struct partial_symtab *) 1416*cf7f2e2dSJohn Marino obstack_alloc (&objfile->objfile_obstack, 1417*cf7f2e2dSJohn Marino sizeof (struct partial_symtab)); 1418*cf7f2e2dSJohn Marino 1419*cf7f2e2dSJohn Marino memset (psymtab, 0, sizeof (struct partial_symtab)); 1420*cf7f2e2dSJohn Marino psymtab->filename = obsavestring (filename, strlen (filename), 1421*cf7f2e2dSJohn Marino &objfile->objfile_obstack); 1422*cf7f2e2dSJohn Marino psymtab->symtab = NULL; 1423*cf7f2e2dSJohn Marino 1424*cf7f2e2dSJohn Marino /* Prepend it to the psymtab list for the objfile it belongs to. 1425*cf7f2e2dSJohn Marino Psymtabs are searched in most recent inserted -> least recent 1426*cf7f2e2dSJohn Marino inserted order. */ 1427*cf7f2e2dSJohn Marino 1428*cf7f2e2dSJohn Marino psymtab->objfile = objfile; 1429*cf7f2e2dSJohn Marino psymtab->next = objfile->psymtabs; 1430*cf7f2e2dSJohn Marino objfile->psymtabs = psymtab; 1431*cf7f2e2dSJohn Marino 1432*cf7f2e2dSJohn Marino return (psymtab); 1433*cf7f2e2dSJohn Marino } 1434*cf7f2e2dSJohn Marino 1435*cf7f2e2dSJohn Marino void 1436*cf7f2e2dSJohn Marino discard_psymtab (struct partial_symtab *pst) 1437*cf7f2e2dSJohn Marino { 1438*cf7f2e2dSJohn Marino struct partial_symtab **prev_pst; 1439*cf7f2e2dSJohn Marino 1440*cf7f2e2dSJohn Marino /* From dbxread.c: 1441*cf7f2e2dSJohn Marino Empty psymtabs happen as a result of header files which don't 1442*cf7f2e2dSJohn Marino have any symbols in them. There can be a lot of them. But this 1443*cf7f2e2dSJohn Marino check is wrong, in that a psymtab with N_SLINE entries but 1444*cf7f2e2dSJohn Marino nothing else is not empty, but we don't realize that. Fixing 1445*cf7f2e2dSJohn Marino that without slowing things down might be tricky. */ 1446*cf7f2e2dSJohn Marino 1447*cf7f2e2dSJohn Marino /* First, snip it out of the psymtab chain */ 1448*cf7f2e2dSJohn Marino 1449*cf7f2e2dSJohn Marino prev_pst = &(pst->objfile->psymtabs); 1450*cf7f2e2dSJohn Marino while ((*prev_pst) != pst) 1451*cf7f2e2dSJohn Marino prev_pst = &((*prev_pst)->next); 1452*cf7f2e2dSJohn Marino (*prev_pst) = pst->next; 1453*cf7f2e2dSJohn Marino 1454*cf7f2e2dSJohn Marino /* Next, put it on a free list for recycling */ 1455*cf7f2e2dSJohn Marino 1456*cf7f2e2dSJohn Marino pst->next = pst->objfile->free_psymtabs; 1457*cf7f2e2dSJohn Marino pst->objfile->free_psymtabs = pst; 1458*cf7f2e2dSJohn Marino } 1459*cf7f2e2dSJohn Marino 1460*cf7f2e2dSJohn Marino /* Increase the space allocated for LISTP, which is probably 1461*cf7f2e2dSJohn Marino global_psymbols or static_psymbols. This space will eventually 1462*cf7f2e2dSJohn Marino be freed in free_objfile(). */ 1463*cf7f2e2dSJohn Marino 1464*cf7f2e2dSJohn Marino void 1465*cf7f2e2dSJohn Marino extend_psymbol_list (struct psymbol_allocation_list *listp, 1466*cf7f2e2dSJohn Marino struct objfile *objfile) 1467*cf7f2e2dSJohn Marino { 1468*cf7f2e2dSJohn Marino int new_size; 1469*cf7f2e2dSJohn Marino 1470*cf7f2e2dSJohn Marino if (listp->size == 0) 1471*cf7f2e2dSJohn Marino { 1472*cf7f2e2dSJohn Marino new_size = 255; 1473*cf7f2e2dSJohn Marino listp->list = (struct partial_symbol **) 1474*cf7f2e2dSJohn Marino xmalloc (new_size * sizeof (struct partial_symbol *)); 1475*cf7f2e2dSJohn Marino } 1476*cf7f2e2dSJohn Marino else 1477*cf7f2e2dSJohn Marino { 1478*cf7f2e2dSJohn Marino new_size = listp->size * 2; 1479*cf7f2e2dSJohn Marino listp->list = (struct partial_symbol **) 1480*cf7f2e2dSJohn Marino xrealloc ((char *) listp->list, 1481*cf7f2e2dSJohn Marino new_size * sizeof (struct partial_symbol *)); 1482*cf7f2e2dSJohn Marino } 1483*cf7f2e2dSJohn Marino /* Next assumes we only went one over. Should be good if 1484*cf7f2e2dSJohn Marino program works correctly */ 1485*cf7f2e2dSJohn Marino listp->next = listp->list + listp->size; 1486*cf7f2e2dSJohn Marino listp->size = new_size; 1487*cf7f2e2dSJohn Marino } 1488*cf7f2e2dSJohn Marino 1489*cf7f2e2dSJohn Marino 1490*cf7f2e2dSJohn Marino 1491*cf7f2e2dSJohn Marino void 1492*cf7f2e2dSJohn Marino maintenance_print_psymbols (char *args, int from_tty) 1493*cf7f2e2dSJohn Marino { 1494*cf7f2e2dSJohn Marino char **argv; 1495*cf7f2e2dSJohn Marino struct ui_file *outfile; 1496*cf7f2e2dSJohn Marino struct cleanup *cleanups; 1497*cf7f2e2dSJohn Marino char *symname = NULL; 1498*cf7f2e2dSJohn Marino char *filename = DEV_TTY; 1499*cf7f2e2dSJohn Marino struct objfile *objfile; 1500*cf7f2e2dSJohn Marino struct partial_symtab *ps; 1501*cf7f2e2dSJohn Marino 1502*cf7f2e2dSJohn Marino dont_repeat (); 1503*cf7f2e2dSJohn Marino 1504*cf7f2e2dSJohn Marino if (args == NULL) 1505*cf7f2e2dSJohn Marino { 1506*cf7f2e2dSJohn Marino error (_("print-psymbols takes an output file name and optional symbol file name")); 1507*cf7f2e2dSJohn Marino } 1508*cf7f2e2dSJohn Marino argv = gdb_buildargv (args); 1509*cf7f2e2dSJohn Marino cleanups = make_cleanup_freeargv (argv); 1510*cf7f2e2dSJohn Marino 1511*cf7f2e2dSJohn Marino if (argv[0] != NULL) 1512*cf7f2e2dSJohn Marino { 1513*cf7f2e2dSJohn Marino filename = argv[0]; 1514*cf7f2e2dSJohn Marino /* If a second arg is supplied, it is a source file name to match on */ 1515*cf7f2e2dSJohn Marino if (argv[1] != NULL) 1516*cf7f2e2dSJohn Marino { 1517*cf7f2e2dSJohn Marino symname = argv[1]; 1518*cf7f2e2dSJohn Marino } 1519*cf7f2e2dSJohn Marino } 1520*cf7f2e2dSJohn Marino 1521*cf7f2e2dSJohn Marino filename = tilde_expand (filename); 1522*cf7f2e2dSJohn Marino make_cleanup (xfree, filename); 1523*cf7f2e2dSJohn Marino 1524*cf7f2e2dSJohn Marino outfile = gdb_fopen (filename, FOPEN_WT); 1525*cf7f2e2dSJohn Marino if (outfile == 0) 1526*cf7f2e2dSJohn Marino perror_with_name (filename); 1527*cf7f2e2dSJohn Marino make_cleanup_ui_file_delete (outfile); 1528*cf7f2e2dSJohn Marino 1529*cf7f2e2dSJohn Marino immediate_quit++; 1530*cf7f2e2dSJohn Marino ALL_PSYMTABS (objfile, ps) 1531*cf7f2e2dSJohn Marino if (symname == NULL || strcmp (symname, ps->filename) == 0) 1532*cf7f2e2dSJohn Marino dump_psymtab (objfile, ps, outfile); 1533*cf7f2e2dSJohn Marino immediate_quit--; 1534*cf7f2e2dSJohn Marino do_cleanups (cleanups); 1535*cf7f2e2dSJohn Marino } 1536*cf7f2e2dSJohn Marino 1537*cf7f2e2dSJohn Marino /* List all the partial symbol tables whose names match REGEXP (optional). */ 1538*cf7f2e2dSJohn Marino void 1539*cf7f2e2dSJohn Marino maintenance_info_psymtabs (char *regexp, int from_tty) 1540*cf7f2e2dSJohn Marino { 1541*cf7f2e2dSJohn Marino struct program_space *pspace; 1542*cf7f2e2dSJohn Marino struct objfile *objfile; 1543*cf7f2e2dSJohn Marino 1544*cf7f2e2dSJohn Marino if (regexp) 1545*cf7f2e2dSJohn Marino re_comp (regexp); 1546*cf7f2e2dSJohn Marino 1547*cf7f2e2dSJohn Marino ALL_PSPACES (pspace) 1548*cf7f2e2dSJohn Marino ALL_PSPACE_OBJFILES (pspace, objfile) 1549*cf7f2e2dSJohn Marino { 1550*cf7f2e2dSJohn Marino struct gdbarch *gdbarch = get_objfile_arch (objfile); 1551*cf7f2e2dSJohn Marino struct partial_symtab *psymtab; 1552*cf7f2e2dSJohn Marino 1553*cf7f2e2dSJohn Marino /* We don't want to print anything for this objfile until we 1554*cf7f2e2dSJohn Marino actually find a symtab whose name matches. */ 1555*cf7f2e2dSJohn Marino int printed_objfile_start = 0; 1556*cf7f2e2dSJohn Marino 1557*cf7f2e2dSJohn Marino ALL_OBJFILE_PSYMTABS (objfile, psymtab) 1558*cf7f2e2dSJohn Marino { 1559*cf7f2e2dSJohn Marino QUIT; 1560*cf7f2e2dSJohn Marino 1561*cf7f2e2dSJohn Marino if (! regexp 1562*cf7f2e2dSJohn Marino || re_exec (psymtab->filename)) 1563*cf7f2e2dSJohn Marino { 1564*cf7f2e2dSJohn Marino if (! printed_objfile_start) 1565*cf7f2e2dSJohn Marino { 1566*cf7f2e2dSJohn Marino printf_filtered ("{ objfile %s ", objfile->name); 1567*cf7f2e2dSJohn Marino wrap_here (" "); 1568*cf7f2e2dSJohn Marino printf_filtered ("((struct objfile *) %s)\n", 1569*cf7f2e2dSJohn Marino host_address_to_string (objfile)); 1570*cf7f2e2dSJohn Marino printed_objfile_start = 1; 1571*cf7f2e2dSJohn Marino } 1572*cf7f2e2dSJohn Marino 1573*cf7f2e2dSJohn Marino printf_filtered (" { psymtab %s ", psymtab->filename); 1574*cf7f2e2dSJohn Marino wrap_here (" "); 1575*cf7f2e2dSJohn Marino printf_filtered ("((struct partial_symtab *) %s)\n", 1576*cf7f2e2dSJohn Marino host_address_to_string (psymtab)); 1577*cf7f2e2dSJohn Marino 1578*cf7f2e2dSJohn Marino printf_filtered (" readin %s\n", 1579*cf7f2e2dSJohn Marino psymtab->readin ? "yes" : "no"); 1580*cf7f2e2dSJohn Marino printf_filtered (" fullname %s\n", 1581*cf7f2e2dSJohn Marino psymtab->fullname ? psymtab->fullname : "(null)"); 1582*cf7f2e2dSJohn Marino printf_filtered (" text addresses "); 1583*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, psymtab->textlow), 1584*cf7f2e2dSJohn Marino gdb_stdout); 1585*cf7f2e2dSJohn Marino printf_filtered (" -- "); 1586*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, psymtab->texthigh), 1587*cf7f2e2dSJohn Marino gdb_stdout); 1588*cf7f2e2dSJohn Marino printf_filtered ("\n"); 1589*cf7f2e2dSJohn Marino printf_filtered (" globals "); 1590*cf7f2e2dSJohn Marino if (psymtab->n_global_syms) 1591*cf7f2e2dSJohn Marino { 1592*cf7f2e2dSJohn Marino printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n", 1593*cf7f2e2dSJohn Marino host_address_to_string (psymtab->objfile->global_psymbols.list 1594*cf7f2e2dSJohn Marino + psymtab->globals_offset), 1595*cf7f2e2dSJohn Marino psymtab->n_global_syms); 1596*cf7f2e2dSJohn Marino } 1597*cf7f2e2dSJohn Marino else 1598*cf7f2e2dSJohn Marino printf_filtered ("(none)\n"); 1599*cf7f2e2dSJohn Marino printf_filtered (" statics "); 1600*cf7f2e2dSJohn Marino if (psymtab->n_static_syms) 1601*cf7f2e2dSJohn Marino { 1602*cf7f2e2dSJohn Marino printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n", 1603*cf7f2e2dSJohn Marino host_address_to_string (psymtab->objfile->static_psymbols.list 1604*cf7f2e2dSJohn Marino + psymtab->statics_offset), 1605*cf7f2e2dSJohn Marino psymtab->n_static_syms); 1606*cf7f2e2dSJohn Marino } 1607*cf7f2e2dSJohn Marino else 1608*cf7f2e2dSJohn Marino printf_filtered ("(none)\n"); 1609*cf7f2e2dSJohn Marino printf_filtered (" dependencies "); 1610*cf7f2e2dSJohn Marino if (psymtab->number_of_dependencies) 1611*cf7f2e2dSJohn Marino { 1612*cf7f2e2dSJohn Marino int i; 1613*cf7f2e2dSJohn Marino 1614*cf7f2e2dSJohn Marino printf_filtered ("{\n"); 1615*cf7f2e2dSJohn Marino for (i = 0; i < psymtab->number_of_dependencies; i++) 1616*cf7f2e2dSJohn Marino { 1617*cf7f2e2dSJohn Marino struct partial_symtab *dep = psymtab->dependencies[i]; 1618*cf7f2e2dSJohn Marino 1619*cf7f2e2dSJohn Marino /* Note the string concatenation there --- no comma. */ 1620*cf7f2e2dSJohn Marino printf_filtered (" psymtab %s " 1621*cf7f2e2dSJohn Marino "((struct partial_symtab *) %s)\n", 1622*cf7f2e2dSJohn Marino dep->filename, 1623*cf7f2e2dSJohn Marino host_address_to_string (dep)); 1624*cf7f2e2dSJohn Marino } 1625*cf7f2e2dSJohn Marino printf_filtered (" }\n"); 1626*cf7f2e2dSJohn Marino } 1627*cf7f2e2dSJohn Marino else 1628*cf7f2e2dSJohn Marino printf_filtered ("(none)\n"); 1629*cf7f2e2dSJohn Marino printf_filtered (" }\n"); 1630*cf7f2e2dSJohn Marino } 1631*cf7f2e2dSJohn Marino } 1632*cf7f2e2dSJohn Marino 1633*cf7f2e2dSJohn Marino if (printed_objfile_start) 1634*cf7f2e2dSJohn Marino printf_filtered ("}\n"); 1635*cf7f2e2dSJohn Marino } 1636*cf7f2e2dSJohn Marino } 1637*cf7f2e2dSJohn Marino 1638*cf7f2e2dSJohn Marino /* Check consistency of psymtabs and symtabs. */ 1639*cf7f2e2dSJohn Marino 1640*cf7f2e2dSJohn Marino void 1641*cf7f2e2dSJohn Marino maintenance_check_symtabs (char *ignore, int from_tty) 1642*cf7f2e2dSJohn Marino { 1643*cf7f2e2dSJohn Marino struct symbol *sym; 1644*cf7f2e2dSJohn Marino struct partial_symbol **psym; 1645*cf7f2e2dSJohn Marino struct symtab *s = NULL; 1646*cf7f2e2dSJohn Marino struct partial_symtab *ps; 1647*cf7f2e2dSJohn Marino struct blockvector *bv; 1648*cf7f2e2dSJohn Marino struct objfile *objfile; 1649*cf7f2e2dSJohn Marino struct block *b; 1650*cf7f2e2dSJohn Marino int length; 1651*cf7f2e2dSJohn Marino 1652*cf7f2e2dSJohn Marino ALL_PSYMTABS (objfile, ps) 1653*cf7f2e2dSJohn Marino { 1654*cf7f2e2dSJohn Marino struct gdbarch *gdbarch = get_objfile_arch (objfile); 1655*cf7f2e2dSJohn Marino 1656*cf7f2e2dSJohn Marino s = PSYMTAB_TO_SYMTAB (ps); 1657*cf7f2e2dSJohn Marino if (s == NULL) 1658*cf7f2e2dSJohn Marino continue; 1659*cf7f2e2dSJohn Marino bv = BLOCKVECTOR (s); 1660*cf7f2e2dSJohn Marino b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); 1661*cf7f2e2dSJohn Marino psym = ps->objfile->static_psymbols.list + ps->statics_offset; 1662*cf7f2e2dSJohn Marino length = ps->n_static_syms; 1663*cf7f2e2dSJohn Marino while (length--) 1664*cf7f2e2dSJohn Marino { 1665*cf7f2e2dSJohn Marino sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym), 1666*cf7f2e2dSJohn Marino SYMBOL_DOMAIN (*psym)); 1667*cf7f2e2dSJohn Marino if (!sym) 1668*cf7f2e2dSJohn Marino { 1669*cf7f2e2dSJohn Marino printf_filtered ("Static symbol `"); 1670*cf7f2e2dSJohn Marino puts_filtered (SYMBOL_LINKAGE_NAME (*psym)); 1671*cf7f2e2dSJohn Marino printf_filtered ("' only found in "); 1672*cf7f2e2dSJohn Marino puts_filtered (ps->filename); 1673*cf7f2e2dSJohn Marino printf_filtered (" psymtab\n"); 1674*cf7f2e2dSJohn Marino } 1675*cf7f2e2dSJohn Marino psym++; 1676*cf7f2e2dSJohn Marino } 1677*cf7f2e2dSJohn Marino b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); 1678*cf7f2e2dSJohn Marino psym = ps->objfile->global_psymbols.list + ps->globals_offset; 1679*cf7f2e2dSJohn Marino length = ps->n_global_syms; 1680*cf7f2e2dSJohn Marino while (length--) 1681*cf7f2e2dSJohn Marino { 1682*cf7f2e2dSJohn Marino sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym), 1683*cf7f2e2dSJohn Marino SYMBOL_DOMAIN (*psym)); 1684*cf7f2e2dSJohn Marino if (!sym) 1685*cf7f2e2dSJohn Marino { 1686*cf7f2e2dSJohn Marino printf_filtered ("Global symbol `"); 1687*cf7f2e2dSJohn Marino puts_filtered (SYMBOL_LINKAGE_NAME (*psym)); 1688*cf7f2e2dSJohn Marino printf_filtered ("' only found in "); 1689*cf7f2e2dSJohn Marino puts_filtered (ps->filename); 1690*cf7f2e2dSJohn Marino printf_filtered (" psymtab\n"); 1691*cf7f2e2dSJohn Marino } 1692*cf7f2e2dSJohn Marino psym++; 1693*cf7f2e2dSJohn Marino } 1694*cf7f2e2dSJohn Marino if (ps->texthigh < ps->textlow) 1695*cf7f2e2dSJohn Marino { 1696*cf7f2e2dSJohn Marino printf_filtered ("Psymtab "); 1697*cf7f2e2dSJohn Marino puts_filtered (ps->filename); 1698*cf7f2e2dSJohn Marino printf_filtered (" covers bad range "); 1699*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout); 1700*cf7f2e2dSJohn Marino printf_filtered (" - "); 1701*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout); 1702*cf7f2e2dSJohn Marino printf_filtered ("\n"); 1703*cf7f2e2dSJohn Marino continue; 1704*cf7f2e2dSJohn Marino } 1705*cf7f2e2dSJohn Marino if (ps->texthigh == 0) 1706*cf7f2e2dSJohn Marino continue; 1707*cf7f2e2dSJohn Marino if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b)) 1708*cf7f2e2dSJohn Marino { 1709*cf7f2e2dSJohn Marino printf_filtered ("Psymtab "); 1710*cf7f2e2dSJohn Marino puts_filtered (ps->filename); 1711*cf7f2e2dSJohn Marino printf_filtered (" covers "); 1712*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout); 1713*cf7f2e2dSJohn Marino printf_filtered (" - "); 1714*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout); 1715*cf7f2e2dSJohn Marino printf_filtered (" but symtab covers only "); 1716*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout); 1717*cf7f2e2dSJohn Marino printf_filtered (" - "); 1718*cf7f2e2dSJohn Marino fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout); 1719*cf7f2e2dSJohn Marino printf_filtered ("\n"); 1720*cf7f2e2dSJohn Marino } 1721*cf7f2e2dSJohn Marino } 1722*cf7f2e2dSJohn Marino } 1723*cf7f2e2dSJohn Marino 1724*cf7f2e2dSJohn Marino 1725*cf7f2e2dSJohn Marino 1726*cf7f2e2dSJohn Marino void 1727*cf7f2e2dSJohn Marino map_partial_symbol_names (void (*fun) (const char *, void *), void *data) 1728*cf7f2e2dSJohn Marino { 1729*cf7f2e2dSJohn Marino struct objfile *objfile; 1730*cf7f2e2dSJohn Marino 1731*cf7f2e2dSJohn Marino ALL_OBJFILES (objfile) 1732*cf7f2e2dSJohn Marino { 1733*cf7f2e2dSJohn Marino if (objfile->sf) 1734*cf7f2e2dSJohn Marino objfile->sf->qf->map_symbol_names (objfile, fun, data); 1735*cf7f2e2dSJohn Marino } 1736*cf7f2e2dSJohn Marino } 1737*cf7f2e2dSJohn Marino 1738*cf7f2e2dSJohn Marino void 1739*cf7f2e2dSJohn Marino map_partial_symbol_filenames (void (*fun) (const char *, const char *, 1740*cf7f2e2dSJohn Marino void *), 1741*cf7f2e2dSJohn Marino void *data) 1742*cf7f2e2dSJohn Marino { 1743*cf7f2e2dSJohn Marino struct objfile *objfile; 1744*cf7f2e2dSJohn Marino 1745*cf7f2e2dSJohn Marino ALL_OBJFILES (objfile) 1746*cf7f2e2dSJohn Marino { 1747*cf7f2e2dSJohn Marino if (objfile->sf) 1748*cf7f2e2dSJohn Marino objfile->sf->qf->map_symbol_filenames (objfile, fun, data); 1749*cf7f2e2dSJohn Marino } 1750*cf7f2e2dSJohn Marino } 1751