RE: [RFA-2] Handle GPC specific name for main function

Pierre Muller
2007-10-08T15:45:55Z

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)
> \
>