2007-10-09 Pierre Muller <muller@ics.u-strasbg.fr>
authorPierre Muller <muller@sourceware.org>
Tue, 9 Oct 2007 06:59:27 +0000 (06:59 +0000)
committerPierre Muller <muller@sourceware.org>
Tue, 9 Oct 2007 06:59:27 +0000 (06:59 +0000)
        * 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.

gdb/ChangeLog
gdb/Makefile.in
gdb/p-lang.c
gdb/p-lang.h
gdb/symtab.c

index 05d9688196894580f38b51881982bd4c9840da4f..d909550151ea631f193e9fcd4f58e19f4fb644a3 100644 (file)
@@ -1,3 +1,13 @@
+2007-10-09  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.
+
 2007-10-09  Pedro Alves  <pedro_alves@portugalmail.pt>
 
        * stabsread.c (read_huge_number): Fix handling of octal
index 863b2004cbba41360b99535d9c869613b18b1871..30905587e80020c606418f856ca316cd00359083 100644 (file)
@@ -2751,7 +2751,7 @@ symtab.o: symtab.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(gdbcore_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) \
index ab204a118b92a5ecdbaa0a67a17ed259397739b0..4b187201bc96cda32da91091e46d7db1c237a58a 100644 (file)
 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 d6fe9b202a3f7e7ab3cafed4cc62c511a4b8fbb3..994d9ad45568b0f5f81edb7a7c161bb53944d310 100644 (file)
@@ -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 c2726d4666b7ddcded0edf16f70764aa4ef7fa03..eeddddd89d2312d87af11e1b7fb6448b2026086a 100644 (file)
@@ -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");