* x86-64-tdep.c (x86_64_skip_prologue): Print note when debugging
authorAndrew Cagney <cagney@redhat.com>
Sat, 27 Apr 2002 00:12:54 +0000 (00:12 +0000)
committerAndrew Cagney <cagney@redhat.com>
Sat, 27 Apr 2002 00:12:54 +0000 (00:12 +0000)
code without frame pointers.

gdb/ChangeLog
gdb/x86-64-tdep.c

index 99733a9e82a3fe45cb4961c77218ef150265e83d..41c04ea943e1dfcfce72e54310a5677601bca3b7 100644 (file)
@@ -1,3 +1,8 @@
+2002-04-26  Michal Ludvig  <mludvig@suse.cz>
+
+       * x86-64-tdep.c (x86_64_skip_prologue): Print note when debugging
+       code without frame pointers.
+
 2002-04-26  Andrew Cagney  <ac131313@redhat.com>
 
        * sparc-tdep.c (sparc_gdbarch_init): Add comment explaining why
index cbca04eee743259459e9bb08c416625d0b87061b..f30b85e618252e628e1fd9a2e847be220638430a 100644 (file)
@@ -116,6 +116,9 @@ static struct register_info x86_64_register_info_table[] = {
 int x86_64_num_regs = X86_64_NUM_REGS;
 int x86_64_num_gregs = X86_64_NUM_GREGS;
 
+/* Did we already print a note about frame pointer?  */
+int omit_fp_note_printed = 0;
+
 /* Number of bytes of storage in the actual machine representation for
    register REGNO.  */
 int
@@ -811,10 +814,23 @@ x86_64_skip_prologue (CORE_ADDR pc)
 
   read_memory (pc, (char *) prolog_buf, PROLOG_BUFSIZE);
 
-  /* First check, whether pc points to pushq %rbp, movq %rsp,%rbp.  */
-  for (i = 0; i < PROLOG_BUFSIZE; i++)
-    if (prolog_expect[i] != prolog_buf[i])
+  /* First check, whether pc points to pushq %rbp. If not, 
+   * print a recommendation to enable frame pointer.  */
+  if (prolog_expect[0] != prolog_buf[0])
+    {
+      if (!omit_fp_note_printed)
+       {
+         printf_filtered
+           ("NOTE: This function doesn't seem to have a valid prologue.\n"
+            "      Try to add -fno-omit-frame-pointer tou your gcc's CFLAGS.\n");
+         omit_fp_note_printed++;
+       }
       return pc;
+    }
+  /* Valid prolog continues with movq %rsp,%rbp.  */
+  for (i = 1; i < PROLOG_BUFSIZE; i++)
+    if (prolog_expect[i] != prolog_buf[i])
+      return pc + 1;           /* First instruction after pushq %rbp.  */
 
   v_function = find_pc_function (pc);
   v_sal = find_pc_line (pc, 0);