Fix for incorrect breakpoint set in case of clang compiled binary
authorKarthik Bhat <kvbhat@sourceware.org>
Wed, 21 Nov 2012 07:39:02 +0000 (07:39 +0000)
committerKarthik Bhat <kvbhat@sourceware.org>
Wed, 21 Nov 2012 07:39:02 +0000 (07:39 +0000)
gdb/i386-tdep.c

index f0056bea56f7d9abc1b86d6aab255479a9542128..5e12cb53b171440bb378e048c3c623217af59d74 100644 (file)
@@ -1582,8 +1582,30 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
   CORE_ADDR pc;
   gdb_byte op;
   int i;
-
   cache.locals = -1;
+  CORE_ADDR func_addr;
+  struct symtab *s = find_pc_symtab (func_addr);
+
+  if (find_pc_partial_function (start_pc, NULL, &func_addr, NULL))
+  {
+    CORE_ADDR post_prologue_pc
+      = skip_prologue_using_sal (gdbarch, func_addr);
+    
+    /* GCC always emits a line note before the prologue and another
+        one after, even if the two are at the same address or on the
+        same line.  Take advantage of this so that we do not need to
+        know every instruction that might appear in the prologue.  We
+        will have producer information for most binaries; if it is
+        missing (e.g. for -gstabs), assuming the GNU tools.  */
+    if (post_prologue_pc
+         && (s == NULL
+             || s->producer == NULL
+             || strncmp (s->producer, "GNU ", sizeof ("GNU ") - 1) == 0
+             || strncmp (s->producer, "clang ", sizeof ("clang ") - 1) == 0))
+         return  max (start_pc, post_prologue_pc);
+  }
+
+
   pc = i386_analyze_prologue (gdbarch, start_pc, 0xffffffff, &cache);
   if (cache.locals < 0)
     return start_pc;