Thanks to Joel for all his contribution, I resubmit a modified version, which is the same as Joel proposed, to the exception that I used "const char *" instead of "const char const *" that I did not find anywhere else in the GDB sources and seems really strange to me... I also modified the final comment inside pascal_main_name.
ChangeLog entry:
2007-10-08 Pierre Muller muller@ics.u-strasbg.fr
* p-lang.h (pascal_main_name): Add declaration. * p-lang.c (GPC_P_INITIALIZE, GPC_MAIN_PROGRAM_NAME_1) (GPC_MAIN_PROGRAM_NAME_2): New constants. (pascal_main_name): New function. * symtab.c: Include p-lang.h. (find_main_name): Add call to pascal_main_name. * Makefile.in (symtab.o): Add dependency on p-lang.h.
Index: p-lang.h =================================================================== RCS file: /cvs/src/src/gdb/p-lang.h,v retrieving revision 1.12 diff -u -p -r1.12 p-lang.h --- p-lang.h 23 Aug 2007 18:08:36 -0000 1.12 +++ p-lang.h 8 Oct 2007 15:41:43 -0000 @@ -21,6 +21,9 @@
struct value;
+/* Defined in p-lang.c */ +extern const char *pascal_main_name (void); + extern int pascal_parse (void); /* Defined in p-exp.y */
extern void pascal_error (char *); /* Defined in p-exp.y */ Index: p-lang.c =================================================================== RCS file: /cvs/src/src/gdb/p-lang.c,v retrieving revision 1.33 diff -u -p -r1.33 p-lang.c --- p-lang.c 23 Sep 2007 16:25:05 -0000 1.33 +++ p-lang.c 8 Oct 2007 15:41:43 -0000 @@ -35,6 +35,56 @@ extern void _initialize_pascal_language (void);
+/* All GPC versions until now (2007-09-27) also define a symbol called + '_p_initialize'. Check for the presence of this symbol first. */ +static const char GPC_P_INITIALIZE[] = "_p_initialize"; + +/* The name of the symbol that GPC uses as the name of the main + procedure (since version 20050212). */ +static const char GPC_MAIN_PROGRAM_NAME_1[] = "_p__M0_main_program"; + +/* Older versions of GPC (versions older than 20050212) were using + a different name for the main procedure. */ +static const char GPC_MAIN_PROGRAM_NAME_2[] = "pascal_main_program"; + +/* Function returning the special symbol name used + by GPC for the main procedure in the main program + if it is found in minimal symbol list. + This function tries to find minimal symbols generated by GPC + so that it finds the even if the program was compiled + without debugging information. + According to information supplied by Waldeck Hebisch, + this should work for all versions posterior to June 2000. */ + +const char * +pascal_main_name (void) +{ + struct minimal_symbol *msym; + + msym = lookup_minimal_symbol (GPC_P_INITIALIZE, NULL, NULL); + + /* If '_p_initialize' was not found, the main program is likely not + written in Pascal. */ + if (msym == NULL) + return NULL; + + msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_1, NULL, NULL); + if (msym != NULL) + { + return GPC_MAIN_PROGRAM_NAME_1; + } + + msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_2, NULL, NULL); + if (msym != NULL) + { + return GPC_MAIN_PROGRAM_NAME_2; + } + + /* No known entry procedure found, the main program is probably + not compiled with GPC. */ + return NULL; +} + /* Determines if type TYPE is a pascal string type. Returns 1 if the type is a known pascal type This function is used by p-valprint.c code to allow better string display. Index: symtab.c =================================================================== RCS file: /cvs/src/src/gdb/symtab.c,v retrieving revision 1.165 diff -u -p -r1.165 symtab.c --- symtab.c 24 Sep 2007 07:40:32 -0000 1.165 +++ symtab.c 8 Oct 2007 15:41:44 -0000 @@ -40,6 +40,7 @@ #include "filenames.h" /* for FILENAME_CMP */ #include "objc-lang.h" #include "ada-lang.h" +#include "p-lang.h"
#include "hashtab.h"
@@ -4126,7 +4127,7 @@ set_main_name (const char *name) static void find_main_name (void) { - char *new_main_name; + const 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 @@ -4151,6 +4152,13 @@ find_main_name (void) return; }
+ new_main_name = pascal_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"); Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.941 diff -u -p -r1.941 Makefile.in --- Makefile.in 8 Oct 2007 15:09:04 -0000 1.941 +++ Makefile.in 8 Oct 2007 15:41:45 -0000 @@ -2751,7 +2751,7 @@ symtab.o: symtab.c $(defs_h) $(symtab_h) $(filenames_h) $(objc_lang_h) $(ada_lang_h) $(hashtab_h) \ $(gdb_obstack_h) $(block_h) $(dictionary_h) $(gdb_string_h) \ $(gdb_stat_h) $(cp_abi_h) $(observer_h) $(gdb_assert_h) \ - $(solist_h) $(ada_lang_h) + $(solist_h) $(p_lang_h) target.o: target.c $(defs_h) $(gdb_string_h) $(target_h) $(gdbcmd_h) \ $(symtab_h) $(inferior_h) $(bfd_h) $(symfile_h) $(objfiles_h) \ $(gdb_wait_h) $(dcache_h) $(regcache_h) $(gdb_assert_h) $(gdbcore_h) \
Whoops, I forgot to tell you that this patch does reduce the number of failures for GNU pascal compiler on the newly added gdb.pascal directory in the testsuite.
I will try to run a complete testsuite,
Pierre
-----Original Message----- From: gdb-patches-owner@sourceware.org [mailto:gdb-patches- owner@sourceware.org] On Behalf Of Pierre Muller Sent: Monday, October 08, 2007 5:43 PM To: 'Joel Brobecker' Cc: 'Eli Zaretskii'; gdb-patches@sourceware.org; gpc@gnu.de Subject: [RFA-2] Handle GPC specific name for main function
Thanks to Joel for all his contribution, I resubmit a modified version, which is the same as Joel proposed, to the exception that I used "const char *" instead of "const char const *" that I did not find anywhere else in the GDB sources and seems really strange to me... I also modified the final comment inside pascal_main_name.
ChangeLog entry:
2007-10-08 Pierre Muller muller@ics.u-strasbg.fr
* p-lang.h (pascal_main_name): Add declaration. * p-lang.c (GPC_P_INITIALIZE, GPC_MAIN_PROGRAM_NAME_1) (GPC_MAIN_PROGRAM_NAME_2): New constants. (pascal_main_name): New function. * symtab.c: Include p-lang.h. (find_main_name): Add call to pascal_main_name. * Makefile.in (symtab.o): Add dependency on p-lang.h.
Index: p-lang.h
RCS file: /cvs/src/src/gdb/p-lang.h,v retrieving revision 1.12 diff -u -p -r1.12 p-lang.h --- p-lang.h 23 Aug 2007 18:08:36 -0000 1.12 +++ p-lang.h 8 Oct 2007 15:41:43 -0000 @@ -21,6 +21,9 @@
struct value;
+/* Defined in p-lang.c */ +extern const char *pascal_main_name (void);
extern int pascal_parse (void); /* Defined in p-exp.y */
extern void pascal_error (char *); /* Defined in p-exp.y */ Index: p-lang.c =================================================================== RCS file: /cvs/src/src/gdb/p-lang.c,v retrieving revision 1.33 diff -u -p -r1.33 p-lang.c --- p-lang.c 23 Sep 2007 16:25:05 -0000 1.33 +++ p-lang.c 8 Oct 2007 15:41:43 -0000 @@ -35,6 +35,56 @@ extern void _initialize_pascal_language (void);
+/* All GPC versions until now (2007-09-27) also define a symbol called
- '_p_initialize'. Check for the presence of this symbol first. */
+static const char GPC_P_INITIALIZE[] = "_p_initialize";
+/* The name of the symbol that GPC uses as the name of the main
- procedure (since version 20050212). */
+static const char GPC_MAIN_PROGRAM_NAME_1[] = "_p__M0_main_program";
+/* Older versions of GPC (versions older than 20050212) were using
- a different name for the main procedure. */
+static const char GPC_MAIN_PROGRAM_NAME_2[] = "pascal_main_program";
+/* Function returning the special symbol name used
- by GPC for the main procedure in the main program
- if it is found in minimal symbol list.
- This function tries to find minimal symbols generated by GPC
- so that it finds the even if the program was compiled
- without debugging information.
- According to information supplied by Waldeck Hebisch,
- this should work for all versions posterior to June 2000. */
+const char * +pascal_main_name (void) +{
- struct minimal_symbol *msym;
- msym = lookup_minimal_symbol (GPC_P_INITIALIZE, NULL, NULL);
- /* If '_p_initialize' was not found, the main program is likely not
written in Pascal. */
- if (msym == NULL)
- return NULL;
- msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_1, NULL, NULL);
- if (msym != NULL)
- {
return GPC_MAIN_PROGRAM_NAME_1;
- }
- msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_2, NULL, NULL);
- if (msym != NULL)
- {
return GPC_MAIN_PROGRAM_NAME_2;
- }
- /* No known entry procedure found, the main program is probably
not compiled with GPC. */
- return NULL;
+}
/* Determines if type TYPE is a pascal string type. Returns 1 if the type is a known pascal type This function is used by p-valprint.c code to allow better string display. Index: symtab.c =================================================================== RCS file: /cvs/src/src/gdb/symtab.c,v retrieving revision 1.165 diff -u -p -r1.165 symtab.c --- symtab.c 24 Sep 2007 07:40:32 -0000 1.165 +++ symtab.c 8 Oct 2007 15:41:44 -0000 @@ -40,6 +40,7 @@ #include "filenames.h" /* for FILENAME_CMP */ #include "objc-lang.h" #include "ada-lang.h" +#include "p-lang.h"
#include "hashtab.h"
@@ -4126,7 +4127,7 @@ set_main_name (const char *name) static void find_main_name (void) {
- char *new_main_name;
const 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
@@ -4151,6 +4152,13 @@ find_main_name (void) return; }
- new_main_name = pascal_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"); Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.941 diff -u -p -r1.941 Makefile.in --- Makefile.in 8 Oct 2007 15:09:04 -0000 1.941 +++ Makefile.in 8 Oct 2007 15:41:45 -0000 @@ -2751,7 +2751,7 @@ symtab.o: symtab.c $(defs_h) $(symtab_h) $(filenames_h) $(objc_lang_h) $(ada_lang_h) $(hashtab_h) \ $(gdb_obstack_h) $(block_h) $(dictionary_h) $(gdb_string_h) \ $(gdb_stat_h) $(cp_abi_h) $(observer_h) $(gdb_assert_h) \
$(solist_h) $(ada_lang_h)
$(solist_h) $(p_lang_h)
target.o: target.c $(defs_h) $(gdb_string_h) $(target_h) $(gdbcmd_h) \ $(symtab_h) $(inferior_h) $(bfd_h) $(symfile_h) $(objfiles_h) \ $(gdb_wait_h) $(dcache_h) $(regcache_h) $(gdb_assert_h) $(gdbcore_h) \