+
+/* given the start and end addresses of a compilation unit (or a csect, at times)
+ process its lines and create appropriate line vectors. */
+
+static void
+process_linenos (start, end)
+ CORE_ADDR start, end;
+{
+ char *pp;
+ int offset, ii;
+
+ struct subfile main_subfile; /* subfile structure for the main
+ compilation unit. */
+
+ /* in the main source file, any time we see a function entry, we reset
+ this variable to function's absolute starting line number. All the
+ following line numbers in the function are relative to this, and
+ we record absolute line numbers in record_line(). */
+
+ int main_source_baseline = 0;
+
+
+ unsigned *firstLine;
+ CORE_ADDR addr;
+
+ if (!(offset = first_fun_line_offset))
+ goto return_after_cleanup;
+
+ bzero (&main_subfile, sizeof (main_subfile));
+ first_fun_line_offset = 0;
+
+ if (inclIndx == 0)
+ /* All source lines were in the main source file. None in include files. */
+
+ enter_line_range (&main_subfile, offset, 0, start, end,
+ &main_source_baseline);
+
+ /* else, there was source with line numbers in include files */
+ else {
+
+ main_source_baseline = 0;
+ for (ii=0; ii < inclIndx; ++ii) {
+
+ struct subfile *tmpSubfile;
+
+ /* if there is main file source before include file, enter it. */
+ if (offset < inclTable[ii].begin) {
+ enter_line_range
+ (&main_subfile, offset, inclTable[ii].begin - LINESZ, start, 0,
+ &main_source_baseline);
+ }
+
+ /* Have a new subfile for the include file */
+
+ tmpSubfile = inclTable[ii].subfile = (struct subfile*)
+ xmalloc (sizeof (struct subfile));
+
+ bzero (tmpSubfile, sizeof (struct subfile));
+ firstLine = &(inclTable[ii].funStartLine);
+
+ /* enter include file's lines now. */
+ enter_line_range (tmpSubfile, inclTable[ii].begin,
+ inclTable[ii].end, start, 0, firstLine);
+
+ offset = inclTable[ii].end + LINESZ;
+ }
+
+ /* all the include files' line have been processed at this point. Now,
+ enter remaining lines of the main file, if any left. */
+ if (offset < (linetab_offset + linetab_size + 1 - LINESZ)) {
+ enter_line_range (&main_subfile, offset, 0, start, end,
+ &main_source_baseline);
+ }
+ }
+
+ /* Process main file's line numbers. */
+ if (main_subfile.line_vector) {
+ struct linetable *lineTb, *lv;
+
+ lv = main_subfile.line_vector;
+
+ /* Line numbers are not necessarily ordered. xlc compilation will
+ put static function to the end. */
+
+ lineTb = arrange_linetable (lv);
+ if (lv == lineTb) {
+ current_subfile->line_vector = (struct linetable *)
+ xrealloc (lv, (sizeof (struct linetable)
+ + lv->nitems * sizeof (struct linetable_entry)));
+
+ }
+ else {
+ free (lv);
+ current_subfile->line_vector = lineTb;
+ }
+
+ current_subfile->line_vector_length =
+ current_subfile->line_vector->nitems;
+ }
+
+ /* Now, process included files' line numbers. */
+
+ for (ii=0; ii < inclIndx; ++ii) {
+
+ if ( (inclTable[ii].subfile)->line_vector) { /* Useless if!!! FIXMEmgo */
+ struct linetable *lineTb, *lv;
+
+ lv = (inclTable[ii].subfile)->line_vector;
+
+ /* Line numbers are not necessarily ordered. xlc compilation will
+ put static function to the end. */
+
+ lineTb = arrange_linetable (lv);
+
+ push_subfile ();
+
+ /* For the same include file, we might want to have more than one subfile.
+ This happens if we have something like:
+
+ ......
+ #include "foo.h"
+ ......
+ #include "foo.h"
+ ......
+
+ while foo.h including code in it. (stupid but possible)
+ Since start_subfile() looks at the name and uses an existing one if finds,
+ we need to provide a fake name and fool it. */
+
+/* start_subfile (inclTable[ii].name, (char*)0); */
+ start_subfile (" ?", (char*)0);
+ current_subfile->name =
+ obsavestring (inclTable[ii].name, strlen (inclTable[ii].name),
+ ¤t_objfile->symbol_obstack);
+
+ if (lv == lineTb) {
+ current_subfile->line_vector = (struct linetable *)
+ xrealloc (lv, (sizeof (struct linetable)
+ + lv->nitems * sizeof (struct linetable_entry)));
+
+ }
+ else {
+ free (lv);
+ current_subfile->line_vector = lineTb;
+ }
+
+ current_subfile->line_vector_length =
+ current_subfile->line_vector->nitems;
+ start_subfile (pop_subfile (), (char*)0);
+ }
+ }
+
+return_after_cleanup:
+
+ /* We don't want to keep alloc/free'ing the global include file table. */
+ inclIndx = 0;
+
+ /* start with a fresh subfile structure for the next file. */
+ bzero (&main_subfile, sizeof (struct subfile));
+}
+
+void
+aix_process_linenos ()
+{
+ /* process line numbers and enter them into line vector */
+ process_linenos (last_source_start_addr, cur_src_end_addr);
+}
+
+