X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fsymtab.c;h=2832dd15fdb0ea4e73f87d5e524225eeb0e7e0cd;hb=cd5ff84afdf0c24c2b3f732d994ea4f43cd1bf31;hp=e2f457af411a7fab823fbb47c8dbe318b60bd1cb;hpb=1bedd215175652ad3e82d2fb731f1d62dd44acf8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symtab.c b/gdb/symtab.c index e2f457af41..2832dd15fd 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -1,6 +1,6 @@ /* Symbol table lookup for the GNU debugger, GDB. - Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. @@ -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,7 @@ #include "gdb_stat.h" #include #include "cp-abi.h" +#include "observer.h" /* Prototypes for local functions */ @@ -4029,6 +4030,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; @@ -4092,15 +4098,59 @@ 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) @@ -4143,4 +4193,6 @@ 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, "", (struct objfile *) NULL); + + observer_attach_executable_changed (symtab_observer_executable_changed); }