* ltconfig, ltmain.sh: Upgrade to libtool 1.4a 1.641.2.256.
[deliverable/binutils-gdb.git] / gdb / xcoffread.c
index 47d44a5261613b3a4a1d1a5c041aca4150fcb067..6e52710d4722b10a370c6a5dfe37741c317af15b 100644 (file)
@@ -1,5 +1,6 @@
 /* Read AIX xcoff symbol tables and convert to internal format, for GDB.
-   Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 1997
+   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000
    Free Software Foundation, Inc.
    Derived from coffread.c, dbxread.c, and a lot of hacking.
    Contributed by IBM Corporation.
@@ -408,8 +409,7 @@ compare_lte (const void *lte1p, const void *lte2p)
    sort_linevec = 1 to end_symtab.  */
 
 static struct linetable *
-arrange_linetable (oldLineTb)
-     struct linetable *oldLineTb;      /* old linetable */
+arrange_linetable (struct linetable *oldLineTb)
 {
   int ii, jj, newline,         /* new line count */
     function_count;            /* # of functions */
@@ -444,7 +444,7 @@ arrange_linetable (oldLineTb)
 
   if (function_count == 0)
     {
-      free (fentry);
+      xfree (fentry);
       return oldLineTb;
     }
   else if (function_count > 1)
@@ -474,7 +474,7 @@ arrange_linetable (oldLineTb)
           ++jj, ++newline)
        newLineTb->item[newline] = oldLineTb->item[jj];
     }
-  free (fentry);
+  xfree (fentry);
   newLineTb->nitems = oldLineTb->nitems - function_count;
   return newLineTb;
 }
@@ -676,7 +676,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
        }
       else
        {
-         free (lv);
+         xfree (lv);
          current_subfile->line_vector = lineTb;
        }
 
@@ -726,7 +726,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
            if (fakename == NULL)
              fakename = " ?";
            start_subfile (fakename, (char *) 0);
-           free (current_subfile->name);
+           xfree (current_subfile->name);
          }
          current_subfile->name = xstrdup (inclTable[ii].name);
 #endif
@@ -741,7 +741,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
            }
          else
            {
-             free (lv);
+             xfree (lv);
              current_subfile->line_vector = lineTb;
            }
 
@@ -1081,14 +1081,6 @@ read_xcoff_symtab (struct partial_symtab *pst)
          /* done with all files, everything from here on is globals */
        }
 
-      /* if explicitly specified as a function, treat is as one. */
-      if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
-       {
-         bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
-                               0, cs->c_naux, &main_aux);
-         goto function_entry_point;
-       }
-
       if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT)
          && cs->c_naux == 1)
        {
@@ -1158,7 +1150,8 @@ read_xcoff_symtab (struct partial_symtab *pst)
                                                SECT_OFF_TEXT (objfile));
                      file_end_addr = file_start_addr + CSECT_LEN (&main_aux);
 
-                     if (cs->c_name && cs->c_name[0] == '.')
+                     if (cs->c_name && (cs->c_name[0] == '.'
+                                        || cs->c_name[0] == '@'))
                        {
                          last_csect_name = cs->c_name;
                          last_csect_val = cs->c_value;
@@ -1232,6 +1225,16 @@ read_xcoff_symtab (struct partial_symtab *pst)
            }
        }
 
+      /* If explicitly specified as a function, treat is as one.  This check
+        evaluates to true for @FIX* bigtoc CSECT symbols, so it must occur
+        after the above CSECT check.  */
+      if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
+       {
+         bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
+                               0, cs->c_naux, &main_aux);
+         goto function_entry_point;
+       }
+
       switch (cs->c_sclass)
        {
 
@@ -1899,7 +1902,7 @@ xcoff_symfile_finish (struct objfile *objfile)
   /* Start with a fresh include table for the next objfile.  */
   if (inclTable)
     {
-      free (inclTable);
+      xfree (inclTable);
       inclTable = NULL;
     }
   inclIndx = inclLength = inclDepth = 0;
@@ -2290,7 +2293,11 @@ scan_xcoff_symtab (struct objfile *objfile)
                               objfile->static_psymbols.next);
                          }
                      }
-                   if (namestring && namestring[0] == '.')
+                   /* Activate the misc_func_recorded mechanism for
+                      compiler- and linker-generated CSECTs like ".strcmp"
+                      and "@FIX1".  */ 
+                   if (namestring && (namestring[0] == '.'
+                                      || namestring[0] == '@'))
                      {
                        last_csect_name = namestring;
                        last_csect_val = symbol.n_value;
@@ -2600,9 +2607,7 @@ get_toc_offset (struct objfile *objfile)
    table (as opposed to a shared lib or dynamically loaded file).  */
 
 static void
-xcoff_initial_scan (objfile, mainline)
-     struct objfile *objfile;
-     int mainline;             /* FIXME comments above */
+xcoff_initial_scan (struct objfile *objfile, int mainline)
 {
   bfd *abfd;
   int val;
@@ -2744,7 +2749,7 @@ xcoff_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
         sensibly), so just ignore the addr parameter and use 0.
         rs6000-nat.c will set the correct section offsets via
         objfile_relocate.  */
-       ANOFFSET (objfile->section_offsets, i) = 0;
+       (objfile->section_offsets)->offsets[i] = 0;
     }
 }
 
This page took 0.026193 seconds and 4 git commands to generate.