[PATCH] Fix for incorect breakpoint set in case of clang compiled binary

KARTHIKVENKATESH BHAT
2012-11-19T08:07:01Z

Dear All,
I wanted to add a patch in i386-tdep.c . Similar to what is done in other architectures such as ARM,
instead of actually going through the complete prologue if we can use the symbol table information to resolve prologue end.

Index: gdb/i386-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-tdep.c,v
retrieving revision 1.362
diff -u -p -r1.362 i386-tdep.c
--- gdb/i386-tdep.c 12 Nov 2012 21:59:06 -0000 1.362
+++ gdb/i386-tdep.c 19 Nov 2012 07:56:45 -0000
@@ -1582,8 +1582,30 @@ i386_skip_prologue (struct gdbarch *gdba
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);
+ }
+

Please let me know your i/p if we can push this onto mainstream.

Thanks
Karthik