This patch looks up for GPC specific minimal symbols and assumes that if they are present, the executable was compiled by GPC. GPC used 'pascal_main_program' and now uses '_p__M0_main_program'.
Is there some other way to check that the program was really compiled by GPC? (Any C compiled program could have a 'pascal_main_program' function...)
Maybe by looking up some other symbol? I found 'GPC_init' as a possible candidate, but I am not sure that this symbol is defined for all versions of GPC, so I did not include it in the present RFC.
I tested the patch on Cygwin and it allows to use 'start' command and get directly at the right location.
This will also help to reduce the gap between GPC and FreePascal for the (not yet committed) gdb.pascal testsuite directory.
Any feedback from GPC users would be most helpful here.
Pierre Muller Pascal language maintainer.
ChangeLog entry:
2007-09-26 Pierre Muller muller@ics.u-strasbg.fr * p-lang.h (pascal_main_name): New function. p-lang.c (GPC_MAIN_PROGRAM_NAME_1, GPC_MAIN_PROGRAM_NAME_2): New char array constants corresponding to the two minimal symbols used by GPC compiler. (pascal_main_name): Try to find minimal symbol corresponding to the entry of GPC compiled programs. symtab.c (find_main_name): Try to find pascal specific main name by calling pascal_main_name.
$ cvs diff -up p-lang.h p-lang.c symtab.c 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 26 Sep 2007 14:26:08 -0000 @@ -21,6 +21,8 @@
struct value;
+extern char *pascal_main_name (void); + extern int pascal_parse (void); /* 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 26 Sep 2007 14:26:09 -0000 @@ -35,6 +35,43 @@ extern void _initialize_pascal_language (void);
+/* The name of the symbol used by GPC compiler. */ + +static const char GPC_MAIN_PROGRAM_NAME_1[] + = "pascal_main_program"; +static const char GPC_MAIN_PROGRAM_NAME_2[] + = "_p__M0_main_program"; + +char * +pascal_main_name (void) +{ + struct minimal_symbol *msym; + CORE_ADDR main_program_name_addr; + static char main_program_name[1024]; + + /* For GPC, main procedure s a special name. + . */ + + + msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_1, NULL, NULL); + + if (msym != NULL) + { + return (char *)GPC_MAIN_PROGRAM_NAME_1; + } + + msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_2, NULL, NULL); + + if (msym != NULL) + { + return (char *)GPC_MAIN_PROGRAM_NAME_2; + } + + /* The main procedure doesn't seem to be in GPC. + Thus default "main" should work. */ + 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 26 Sep 2007 14:26:10 -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"
@@ -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");
Pierre Muller wrote:
This patch looks up for GPC specific minimal symbols and assumes that if they are present, the executable was compiled by GPC. GPC used 'pascal_main_program' and now uses '_p__M0_main_program'.
Is there some other way to check that the program was really compiled by GPC? (Any C compiled program could have a 'pascal_main_program' function...)
Maybe by looking up some other symbol? I found 'GPC_init' as a possible candidate, but I am not sure that this symbol is defined for all versions of GPC, so I did not include it in the present RFC.
I doubt that any simple method will work for "all versions of GPC". According to change log 'pascal_main_program' was introduced 24 Jun 2000, earler GPC used 'program_Foo' where 'Foo' is program name. '_p__M0_main_program' appeared in gpc-20050217 (however, there for a few month the change was available as a patch, so '_p__M0_main_program' may appear also in earlier versions).
I would say that the most reliable indication that the program is GPC compiled is if debug info indicate that language is Pascal and there are signs that the file is gcc compiled (otherwise the file is compiled by some other Pascal compiler). If debug info indicate other language file is not GPC compiled.
Concerning 'GPC_init': it is probably present in all currently used versions. It is absent in ancient versions like gpc-1.2-2.7.2. 'GPC_init' may vanish from future versions -- it is one of few names in GPC runtime which do not use '_p_' prefix. Also, while I know of no way to omit 'GPC_init' when using standard runtime it is possible to use alternative runtime which does not contain 'GPC_init.
When checking if program is GPC compiled one may look at '_p_initialize' -- it is present at least from 1993 up to now. Also current GPC versions use a special symbol to check for matched runtiome. This symbol looks like '_p_GPC_RTS_VERSION_20060215' (where to last part encodes version of the runtime). Versions before 2004-02-04 used GPC_RTS_VERSION_YYYYMMDD. I do not know when this symbol was introduced -- it is absent in gpc-1.2-2.7.2 but present in gpc-20020510. Both '_p_initialize' and '_p_GPC_RTS_VERSION_20060215' are referenced from 'main', so they must appear even if alternate runtime is in use.
GPC emits '_p__M0_main_program' (or 'pascal_main_program') in the same file as 'main', and '_p__M0_main_program' is called from 'main' -- I am not sure if gdb can check this.
Let me remark that it is possible to have '_p__M0_main_program' without having 'main'. Namely, GPC allows to compile Pascal source like normal program, but replacing main by a differently named function. One use of such possibility is when making shared libraries. Another is when the main program is not a Pascal program.