This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* This module provides subroutines used for creating and adding to
the symbol table. These routines are called from various symbol-
* sizeof (struct linetable_entry))));
}
+ pc = gdbarch_addr_bits_remove (current_gdbarch, pc);
+
+ /* Normally, we treat lines as unsorted. But the end of sequence
+ marker is special. We sort line markers at the same PC by line
+ number, so end of sequence markers (which have line == 0) appear
+ first. This is right if the marker ends the previous function,
+ and there is no padding before the next function. But it is
+ wrong if the previous line was empty and we are now marking a
+ switch to a different subfile. We must leave the end of sequence
+ marker at the end of this group of lines, not sort the empty line
+ to after the marker. The easiest way to accomplish this is to
+ delete any empty lines from our table, if they are followed by
+ end of sequence markers. All we lose is the ability to set
+ breakpoints at some lines which contain no instructions
+ anyway. */
+ if (line == 0 && subfile->line_vector->nitems > 0)
+ {
+ e = subfile->line_vector->item + subfile->line_vector->nitems - 1;
+ while (subfile->line_vector->nitems > 0 && e->pc == pc)
+ {
+ e--;
+ subfile->line_vector->nitems--;
+ }
+ }
+
e = subfile->line_vector->item + subfile->line_vector->nitems++;
e->line = line;
- e->pc = ADDR_BITS_REMOVE(pc);
+ e->pc = pc;
}
/* Needed in order to sort line tables from IBM xcoff files. Sigh! */
&objfile->objfile_obstack);
}
-#ifndef PROCESS_LINENUMBER_HOOK
-#define PROCESS_LINENUMBER_HOOK()
-#endif
- PROCESS_LINENUMBER_HOOK (); /* Needed for xcoff. */
+ /* Read the line table if it has to be read separately. */
+ if (objfile->sf->sym_read_linetable != NULL)
+ objfile->sf->sym_read_linetable ();
/* Now create the symtab objects proper, one for each subfile. */
/* (The main file is the last one on the chain.) */