* objfiles.h (ALL_PRIMARY_SYMTABS): Define.
[deliverable/binutils-gdb.git] / gdb / symtab.c
index 7c90c50d9f82e3ced9deb138e4022c1675dbab47..f12834dd1cd12131643613855484f9b9147eeee7 100644 (file)
@@ -1,7 +1,7 @@
 /* Symbol table lookup for the GNU debugger, GDB.
 
-   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
-   1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -18,8 +18,8 @@
 
    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., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "symtab.h"
@@ -55,6 +55,8 @@
 #include "gdb_stat.h"
 #include <ctype.h>
 #include "cp-abi.h"
+#include "observer.h"
+#include "gdb_assert.h"
 
 /* Prototypes for local functions */
 
@@ -221,7 +223,7 @@ got_symtab:
     return (NULL);
 
   if (ps->readin)
-    error ("Internal: readin %s pst for `%s' found when no symtab found.",
+    error (_("Internal: readin %s pst for `%s' found when no symtab found."),
           ps->filename, name);
 
   s = PSYMTAB_TO_SYMTAB (ps);
@@ -705,6 +707,67 @@ init_sal (struct symtab_and_line *sal)
 }
 \f
 
+/* Return 1 if the two sections are the same, or if they could
+   plausibly be copies of each other, one in an original object
+   file and another in a separated debug file.  */
+
+int
+matching_bfd_sections (asection *first, asection *second)
+{
+  struct objfile *obj;
+
+  /* If they're the same section, then they match.  */
+  if (first == second)
+    return 1;
+
+  /* If either is NULL, give up.  */
+  if (first == NULL || second == NULL)
+    return 0;
+
+  /* This doesn't apply to absolute symbols.  */
+  if (first->owner == NULL || second->owner == NULL)
+    return 0;
+
+  /* If they're in the same object file, they must be different sections.  */
+  if (first->owner == second->owner)
+    return 0;
+
+  /* Check whether the two sections are potentially corresponding.  They must
+     have the same size, address, and name.  We can't compare section indexes,
+     which would be more reliable, because some sections may have been
+     stripped.  */
+  if (bfd_get_section_size (first) != bfd_get_section_size (second))
+    return 0;
+
+  /* In-memory addresses may start at a different offset, relativize them.  */
+  if (bfd_get_section_vma (first->owner, first)
+      - bfd_get_start_address (first->owner)
+      != bfd_get_section_vma (second->owner, second)
+        - bfd_get_start_address (second->owner))
+    return 0;
+
+  if (bfd_get_section_name (first->owner, first) == NULL
+      || bfd_get_section_name (second->owner, second) == NULL
+      || strcmp (bfd_get_section_name (first->owner, first),
+                bfd_get_section_name (second->owner, second)) != 0)
+    return 0;
+
+  /* Otherwise check that they are in corresponding objfiles.  */
+
+  ALL_OBJFILES (obj)
+    if (obj->obfd == first->owner)
+      break;
+  gdb_assert (obj != NULL);
+
+  if (obj->separate_debug_objfile != NULL
+      && obj->separate_debug_objfile->obfd == second->owner)
+    return 1;
+  if (obj->separate_debug_objfile_backlink != NULL
+      && obj->separate_debug_objfile_backlink->obfd == second->owner)
+    return 1;
+
+  return 0;
+}
 
 /* Find which partial symtab contains PC and SECTION.  Return 0 if
    none.  We return the psymtab that contains a symbol whose address
@@ -735,7 +798,7 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section)
       {
        struct partial_symtab *tpst;
        struct partial_symtab *best_pst = pst;
-       struct partial_symbol *best_psym = NULL;
+       CORE_ADDR best_addr = pst->textlow;
 
        /* An objfile that has its functions reordered might have
           many partial symbol tables containing the PC, but
@@ -760,36 +823,42 @@ find_pc_sect_psymtab (CORE_ADDR pc, asection *section)
            if (pc >= tpst->textlow && pc < tpst->texthigh)
              {
                struct partial_symbol *p;
+               CORE_ADDR this_addr;
 
+               /* NOTE: This assumes that every psymbol has a
+                  corresponding msymbol, which is not necessarily
+                  true; the debug info might be much richer than the
+                  object's symbol table.  */
                p = find_pc_sect_psymbol (tpst, pc, section);
                if (p != NULL
                    && SYMBOL_VALUE_ADDRESS (p)
                    == SYMBOL_VALUE_ADDRESS (msymbol))
                  return (tpst);
+
+               /* Also accept the textlow value of a psymtab as a
+                  "symbol", to provide some support for partial
+                  symbol tables with line information but no debug
+                  symbols (e.g. those produced by an assembler).  */
                if (p != NULL)
+                 this_addr = SYMBOL_VALUE_ADDRESS (p);
+               else
+                 this_addr = tpst->textlow;
+
+               /* Check whether it is closer than our current
+                  BEST_ADDR.  Since this symbol address is
+                  necessarily lower or equal to PC, the symbol closer
+                  to PC is the symbol which address is the highest.
+                  This way we return the psymtab which contains such
+                  best match symbol. This can help in cases where the
+                  symbol information/debuginfo is not complete, like
+                  for instance on IRIX6 with gcc, where no debug info
+                  is emitted for statics. (See also the nodebug.exp
+                  testcase.) */
+               if (this_addr > best_addr)
                  {
-                   /* We found a symbol in this partial symtab which
-                      matches (or is closest to) PC, check whether it
-                      is closer than our current BEST_PSYM.  Since
-                      this symbol address is necessarily lower or
-                      equal to PC, the symbol closer to PC is the
-                      symbol which address is the highest.  */
-                   /* This way we return the psymtab which contains
-                      such best match symbol. This can help in cases
-                      where the symbol information/debuginfo is not
-                      complete, like for instance on IRIX6 with gcc,
-                      where no debug info is emitted for
-                      statics. (See also the nodebug.exp
-                      testcase.)  */
-                   if (best_psym == NULL
-                       || SYMBOL_VALUE_ADDRESS (p)
-                       > SYMBOL_VALUE_ADDRESS (best_psym))
-                     {
-                       best_psym = p;
-                       best_pst = tpst;
-                     }
+                   best_addr = this_addr;
+                   best_pst = tpst;
                  }
-
              }
          }
        return (best_pst);
@@ -844,7 +913,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
          if (section)          /* match on a specific section */
            {
              fixup_psymbol_section (p, psymtab->objfile);
-             if (SYMBOL_BFD_SECTION (p) != section)
+             if (!matching_bfd_sections (SYMBOL_BFD_SECTION (p), section))
                continue;
            }
          best_pc = SYMBOL_VALUE_ADDRESS (p);
@@ -868,7 +937,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
          if (section)          /* match on a specific section */
            {
              fixup_psymbol_section (p, psymtab->objfile);
-             if (SYMBOL_BFD_SECTION (p) != section)
+             if (!matching_bfd_sections (SYMBOL_BFD_SECTION (p), section))
                continue;
            }
          best_pc = SYMBOL_VALUE_ADDRESS (p);
@@ -1064,6 +1133,10 @@ lookup_symbol (const char *name, const struct block *block,
   if (needtofreename)
     xfree (demangled_name);
 
+  /* Override the returned symtab with the symbol's specific one.  */
+  if (returnval != NULL && symtab != NULL)
+    *symtab = SYMBOL_SYMTAB (returnval);
+
   return returnval;     
 }
 
@@ -1196,7 +1269,7 @@ lookup_symbol_aux_block (const char *name, const char *linkage_name,
        {
          /* Search the list of symtabs for one which contains the
             address of the start of this block.  */
-         ALL_SYMTABS (objfile, s)
+         ALL_PRIMARY_SYMTABS (objfile, s)
            {
              bv = BLOCKVECTOR (s);
              b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
@@ -1231,7 +1304,7 @@ lookup_symbol_aux_symtabs (int block_index,
   const struct block *block;
   struct symtab *s;
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, block_index);
@@ -1295,7 +1368,7 @@ lookup_symbol_aux_psymtabs (int block_index, const char *name,
                                       STATIC_BLOCK : GLOBAL_BLOCK);
            sym = lookup_block_symbol (block, name, linkage_name, domain);
            if (!sym)
-             error ("Internal: %s symbol `%s' found in %s psymtab but not in symtab.\n%s may be an inlined function, or may be a template function\n(if a template, try specifying an instantiation: %s<type>).",
+             error (_("Internal: %s symbol `%s' found in %s psymtab but not in symtab.\n%s may be an inlined function, or may be a template function\n(if a template, try specifying an instantiation: %s<type>)."),
                     block_index == GLOBAL_BLOCK ? "global" : "static",
                     name, ps->filename, name, name);
          }
@@ -1562,7 +1635,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
        {
          center = bottom + (top - bottom) / 2;
          if (!(center < top))
-           internal_error (__FILE__, __LINE__, "failed internal consistency check");
+           internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
          if (!do_linear_search
              && (SYMBOL_LANGUAGE (*center) == language_java))
            {
@@ -1578,7 +1651,7 @@ lookup_partial_symbol (struct partial_symtab *pst, const char *name,
            }
        }
       if (!(top == bottom))
-       internal_error (__FILE__, __LINE__, "failed internal consistency check");
+       internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
 
       while (top <= real_top
             && (linkage_name != NULL
@@ -1646,7 +1719,7 @@ basic_lookup_transparent_type (const char *name)
      of the desired name as a global, then do psymtab-to-symtab
      conversion on the fly and return the found symbol.  */
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
@@ -1676,9 +1749,9 @@ basic_lookup_transparent_type (const char *name)
            block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
            sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
            if (!sym)
-             error ("Internal: global symbol `%s' found in %s psymtab but not in symtab.\n\
+             error (_("Internal: global symbol `%s' found in %s psymtab but not in symtab.\n\
 %s may be an inlined function, or may be a template function\n\
-(if a template, try specifying an instantiation: %s<type>).",
+(if a template, try specifying an instantiation: %s<type>)."),
                     name, ps->filename, name, name);
          }
        if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
@@ -1694,7 +1767,7 @@ basic_lookup_transparent_type (const char *name)
      conversion on the fly and return the found symbol.
    */
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
     block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
@@ -1723,9 +1796,9 @@ basic_lookup_transparent_type (const char *name)
            block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
            sym = lookup_block_symbol (block, name, NULL, STRUCT_DOMAIN);
            if (!sym)
-             error ("Internal: static symbol `%s' found in %s psymtab but not in symtab.\n\
+             error (_("Internal: static symbol `%s' found in %s psymtab but not in symtab.\n\
 %s may be an inlined function, or may be a template function\n\
-(if a template, try specifying an instantiation: %s<type>).",
+(if a template, try specifying an instantiation: %s<type>)."),
                     name, ps->filename, name, name);
          }
        if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
@@ -1871,7 +1944,7 @@ find_pc_sect_symtab (CORE_ADDR pc, asection *section)
      It also happens for objfiles that have their functions reordered.
      For these, the symtab we are looking for is not necessarily read in.  */
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
@@ -1901,7 +1974,7 @@ find_pc_sect_symtab (CORE_ADDR pc, asection *section)
            ALL_BLOCK_SYMBOLS (b, iter, sym)
              {
                fixup_symbol_section (sym, objfile);
-               if (section == SYMBOL_BFD_SECTION (sym))
+               if (matching_bfd_sections (SYMBOL_BFD_SECTION (sym), section))
                  break;
              }
            if (sym == NULL)
@@ -1923,8 +1996,8 @@ find_pc_sect_symtab (CORE_ADDR pc, asection *section)
        /* Might want to error() here (in case symtab is corrupt and
           will cause a core dump), but maybe we can successfully
           continue, so let's not.  */
-       warning ("\
-(Internal error: pc 0x%s in read in psymtab, but not in symtab.)\n",
+       warning (_("\
+(Internal error: pc 0x%s in read in psymtab, but not in symtab.)\n"),
                 paddr_nz (pc));
       s = PSYMTAB_TO_SYMTAB (ps);
     }
@@ -2162,23 +2235,11 @@ find_pc_sect_line (CORE_ADDR pc, struct bfd_section *section, int notcurrent)
 
   if (!best_symtab)
     {
-      if (!alt_symtab)
-       {                       /* If we didn't find any line # info, just
-                                  return zeros.  */
-         val.pc = pc;
-       }
-      else
-       {
-         val.symtab = alt_symtab;
-         val.line = alt->line - 1;
-
-         /* Don't return line 0, that means that we didn't find the line.  */
-         if (val.line == 0)
-           ++val.line;
-
-         val.pc = BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
-         val.end = alt->pc;
-       }
+      /* If we didn't find any line number info, just return zeros.
+        We used to return alt->line - 1 here, but that could be
+        anywhere; if we don't have line number info for this PC,
+        don't make some up.  */
+      val.pc = pc;
     }
   else if (best->line == 0)
     {
@@ -2521,14 +2582,14 @@ operator_chars (char *p, char **end)
        else if (p[1] == '[')
          {
            if (p[2] == ']')
-             error ("mismatched quoting on brackets, try 'operator\\[\\]'");
+             error (_("mismatched quoting on brackets, try 'operator\\[\\]'"));
            else if (p[2] == '\\' && p[3] == ']')
              {
                *end = p + 4;   /* 'operator\[\]' */
                return p;
              }
            else
-             error ("nothing is allowed between '[' and ']'");
+             error (_("nothing is allowed between '[' and ']'"));
          }
        else 
          {
@@ -2584,21 +2645,21 @@ operator_chars (char *p, char **end)
        return p;
       case '(':
        if (p[1] != ')')
-         error ("`operator ()' must be specified without whitespace in `()'");
+         error (_("`operator ()' must be specified without whitespace in `()'"));
        *end = p + 2;
        return p;
       case '?':
        if (p[1] != ':')
-         error ("`operator ?:' must be specified without whitespace in `?:'");
+         error (_("`operator ?:' must be specified without whitespace in `?:'"));
        *end = p + 2;
        return p;
       case '[':
        if (p[1] != ']')
-         error ("`operator []' must be specified without whitespace in `[]'");
+         error (_("`operator []' must be specified without whitespace in `[]'"));
        *end = p + 2;
        return p;
       default:
-       error ("`operator %s' not supported", p);
+       error (_("`operator %s' not supported"), p);
        break;
       }
 
@@ -2696,7 +2757,7 @@ sources_info (char *ignore, int from_tty)
 
   if (!have_full_symbols () && !have_partial_symbols ())
     {
-      error ("No symbol table is loaded.  Use the \"file\" command.");
+      error (_("No symbol table is loaded.  Use the \"file\" command."));
     }
 
   printf_filtered ("Source files for which symbols have been read in:\n\n");
@@ -2836,7 +2897,6 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
   struct symtab *s;
   struct partial_symtab *ps;
   struct blockvector *bv;
-  struct blockvector *prev_bv = 0;
   struct block *b;
   int i = 0;
   struct dict_iterator iter;
@@ -2868,7 +2928,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
   struct cleanup *old_chain = NULL;
 
   if (kind < VARIABLES_DOMAIN)
-    error ("must search on specific domain");
+    error (_("must search on specific domain"));
 
   ourtype = types[(int) (kind - VARIABLES_DOMAIN)];
   ourtype2 = types2[(int) (kind - VARIABLES_DOMAIN)];
@@ -2911,7 +2971,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
        }
 
       if (0 != (val = re_comp (regexp)))
-       error ("Invalid regexp (%s): %s", val, regexp);
+       error (_("Invalid regexp (%s): %s"), val, regexp);
     }
 
   /* Search through the partial symtabs *first* for all symbols
@@ -2951,7 +3011,11 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
            QUIT;
 
            /* If it would match (logic taken from loop below)
-              load the file and go on to the next one */
+              load the file and go on to the next one.  We check the
+              filename here, but that's a bit bogus: we don't know
+              what file it really comes from until we have full
+              symtabs.  The symbol might be in a header file included by
+              this psymtab.  This only affects Insight.  */
            if (file_matches (ps->filename, files, nfiles)
                && ((regexp == NULL
                     || re_exec (SYMBOL_NATURAL_NAME (*psym)) != 0)
@@ -3014,15 +3078,9 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
       }
     }
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     bv = BLOCKVECTOR (s);
-    /* Often many files share a blockvector.
-       Scan each blockvector only once so that
-       we don't get every symbol many times.
-       It happens that the first symtab in the list
-       for any given blockvector is the main file.  */
-    if (bv != prev_bv)
       for (i = GLOBAL_BLOCK; i <= STATIC_BLOCK; i++)
        {
          struct symbol_search *prevtail = tail;
@@ -3030,8 +3088,10 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
          b = BLOCKVECTOR_BLOCK (bv, i);
          ALL_BLOCK_SYMBOLS (b, iter, sym)
            {
+             struct symtab *real_symtab = SYMBOL_SYMTAB (sym);
              QUIT;
-             if (file_matches (s->filename, files, nfiles)
+
+             if (file_matches (real_symtab->filename, files, nfiles)
                  && ((regexp == NULL
                       || re_exec (SYMBOL_NATURAL_NAME (sym)) != 0)
                      && ((kind == VARIABLES_DOMAIN && SYMBOL_CLASS (sym) != LOC_TYPEDEF
@@ -3044,7 +3104,7 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
                  /* match */
                  psr = (struct symbol_search *) xmalloc (sizeof (struct symbol_search));
                  psr->block = i;
-                 psr->symtab = s;
+                 psr->symtab = real_symtab;
                  psr->symbol = sym;
                  psr->msymbol = NULL;
                  psr->next = NULL;
@@ -3072,7 +3132,6 @@ search_symbols (char *regexp, domain_enum kind, int nfiles, char *files[],
                tail = sort_search_symbols (prevtail, nfound);
            }
        }
-    prev_bv = bv;
   }
 
   /* If there are no eyes, avoid all contact.  I mean, if there are
@@ -3637,7 +3696,7 @@ make_symbol_completion_list (char *text, char *word)
   /* Go through the symtabs and check the externs and statics for
      symbols which match.  */
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     QUIT;
     b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
@@ -3647,7 +3706,7 @@ make_symbol_completion_list (char *text, char *word)
       }
   }
 
-  ALL_SYMTABS (objfile, s)
+  ALL_PRIMARY_SYMTABS (objfile, s)
   {
     QUIT;
     b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
@@ -4029,6 +4088,11 @@ skip_prologue_using_sal (CORE_ADDR func_addr)
   prologue_sal = find_pc_line (start_pc, 0);
   if (prologue_sal.line != 0)
     {
+      /* If there is only one sal that covers the entire function,
+        then it is probably a single line function, like
+        "foo(){}". */
+      if (prologue_sal.end == end_pc)
+       return start_pc;
       while (prologue_sal.end < end_pc)
        {
          struct symtab_and_line sal;
@@ -4060,7 +4124,7 @@ decode_line_spec (char *string, int funfirstline)
   struct symtab_and_line cursal;
   
   if (string == 0)
-    error ("Empty line specification.");
+    error (_("Empty line specification."));
     
   /* We use whatever is set as the current source line. We do not try
      and get a default  or it will recursively call us! */  
@@ -4071,7 +4135,7 @@ decode_line_spec (char *string, int funfirstline)
                        (char ***) NULL, NULL);
 
   if (*string)
-    error ("Junk at end of line specification: %s", string);
+    error (_("Junk at end of line specification: %s"), string);
   return sals;
 }
 
@@ -4092,27 +4156,71 @@ set_main_name (const char *name)
     }
 }
 
+/* Deduce the name of the main procedure, and set NAME_OF_MAIN
+   accordingly.  */
+
+static void
+find_main_name (void)
+{
+  char *new_main_name;
+
+  /* Try to see if the main procedure is in Ada.  */
+  /* FIXME: brobecker/2005-03-07: Another way of doing this would
+     be to add a new method in the language vector, and call this
+     method for each language until one of them returns a non-empty
+     name.  This would allow us to remove this hard-coded call to
+     an Ada function.  It is not clear that this is a better approach
+     at this point, because all methods need to be written in a way
+     such that false positives never be returned. For instance, it is
+     important that a method does not return a wrong name for the main
+     procedure if the main procedure is actually written in a different
+     language.  It is easy to guaranty this with Ada, since we use a
+     special symbol generated only when the main in Ada to find the name
+     of the main procedure. It is difficult however to see how this can
+     be guarantied for languages such as C, for instance.  This suggests
+     that order of call for these methods becomes important, which means
+     a more complicated approach.  */
+  new_main_name = ada_main_name ();
+  if (new_main_name != NULL)
+    { 
+      set_main_name (new_main_name);
+      return;
+    }
+
+  /* The languages above didn't identify the name of the main procedure.
+     Fallback to "main".  */
+  set_main_name ("main");
+}
+
 char *
 main_name (void)
 {
-  if (name_of_main != NULL)
-    return name_of_main;
-  else
-    return "main";
+  if (name_of_main == NULL)
+    find_main_name ();
+
+  return name_of_main;
 }
 
+/* Handle ``executable_changed'' events for the symtab module.  */
+
+static void
+symtab_observer_executable_changed (void *unused)
+{
+  /* NAME_OF_MAIN may no longer be the same, so reset it for now.  */
+  set_main_name (NULL);
+}
 
 void
 _initialize_symtab (void)
 {
-  add_info ("variables", variables_info,
-        "All global and static variable names, or those matching REGEXP.");
+  add_info ("variables", variables_info, _("\
+All global and static variable names, or those matching REGEXP."));
   if (dbx_commands)
-    add_com ("whereis", class_info, variables_info,
-        "All global and static variable names, or those matching REGEXP.");
+    add_com ("whereis", class_info, variables_info, _("\
+All global and static variable names, or those matching REGEXP."));
 
   add_info ("functions", functions_info,
-           "All function names, or those matching REGEXP.");
+           _("All function names, or those matching REGEXP."));
 
   
   /* FIXME:  This command has at least the following problems:
@@ -4124,22 +4232,25 @@ _initialize_symtab (void)
      I also think "ptype" or "whatis" is more likely to be useful (but if
      there is much disagreement "info types" can be fixed).  */
   add_info ("types", types_info,
-           "All type names, or those matching REGEXP.");
+           _("All type names, or those matching REGEXP."));
 
   add_info ("sources", sources_info,
-           "Source files in the program.");
+           _("Source files in the program."));
 
   add_com ("rbreak", class_breakpoint, rbreak_command,
-          "Set a breakpoint for all functions matching REGEXP.");
+          _("Set a breakpoint for all functions matching REGEXP."));
 
   if (xdb_commands)
     {
-      add_com ("lf", class_info, sources_info, "Source files in the program");
-      add_com ("lg", class_info, variables_info,
-        "All global and static variable names, or those matching REGEXP.");
+      add_com ("lf", class_info, sources_info,
+              _("Source files in the program"));
+      add_com ("lg", class_info, variables_info, _("\
+All global and static variable names, or those matching REGEXP."));
     }
 
   /* Initialize the one built-in type that isn't language dependent... */
   builtin_type_error = init_type (TYPE_CODE_ERROR, 0, 0,
                                  "<unknown type>", (struct objfile *) NULL);
+
+  observer_attach_executable_changed (symtab_observer_executable_changed);
 }
This page took 0.034139 seconds and 4 git commands to generate.