Fix for incorrect breakpoint set in case of clang compiled binary
This commit is contained in:
parent
e9eb0d14a7
commit
56bf074305
3 changed files with 39 additions and 0 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2012-12-04 Karthik Bhat <kv.bhat@samsung.com>
|
||||||
|
|
||||||
|
* i386-tdep.c (i386_skip_prologue): Using symbol table
|
||||||
|
to find the end of prologue for clang compiled binaries.
|
||||||
|
* amd64-tdep.c (amd64_skip_prologue): Using symbol table
|
||||||
|
to find the end of prologue for clang compiled binaries.
|
||||||
|
|
||||||
2012-12-03 Doug Evans <dje@google.com>
|
2012-12-03 Doug Evans <dje@google.com>
|
||||||
|
|
||||||
* dwarf2read.c (struct dwarf2_per_objfile): Clarify comment.
|
* dwarf2read.c (struct dwarf2_per_objfile): Clarify comment.
|
||||||
|
|
|
@ -2252,6 +2252,22 @@ amd64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
|
||||||
{
|
{
|
||||||
struct amd64_frame_cache cache;
|
struct amd64_frame_cache cache;
|
||||||
CORE_ADDR pc;
|
CORE_ADDR pc;
|
||||||
|
CORE_ADDR 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);
|
||||||
|
struct symtab *s = find_pc_symtab (func_addr);
|
||||||
|
|
||||||
|
/* Clang always emits a line note before the prologue and another
|
||||||
|
one after. We trust clang to emit usable line notes. */
|
||||||
|
if (post_prologue_pc
|
||||||
|
&& (s != NULL
|
||||||
|
&& s->producer != NULL
|
||||||
|
&& strncmp (s->producer, "clang ", sizeof ("clang ") - 1) == 0))
|
||||||
|
return max (start_pc, post_prologue_pc);
|
||||||
|
}
|
||||||
|
|
||||||
amd64_init_frame_cache (&cache);
|
amd64_init_frame_cache (&cache);
|
||||||
pc = amd64_analyze_prologue (gdbarch, start_pc, 0xffffffffffffffffLL,
|
pc = amd64_analyze_prologue (gdbarch, start_pc, 0xffffffffffffffffLL,
|
||||||
|
|
|
@ -1582,7 +1582,23 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
|
||||||
CORE_ADDR pc;
|
CORE_ADDR pc;
|
||||||
gdb_byte op;
|
gdb_byte op;
|
||||||
int i;
|
int i;
|
||||||
|
CORE_ADDR 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);
|
||||||
|
struct symtab *s = find_pc_symtab (func_addr);
|
||||||
|
|
||||||
|
/* Clang always emits a line note before the prologue and another
|
||||||
|
one after. We trust clang to emit usable line notes. */
|
||||||
|
if (post_prologue_pc
|
||||||
|
&& (s != NULL
|
||||||
|
&& s->producer != NULL
|
||||||
|
&& strncmp (s->producer, "clang ", sizeof ("clang ") - 1) == 0))
|
||||||
|
return max (start_pc, post_prologue_pc);
|
||||||
|
}
|
||||||
|
|
||||||
cache.locals = -1;
|
cache.locals = -1;
|
||||||
pc = i386_analyze_prologue (gdbarch, start_pc, 0xffffffff, &cache);
|
pc = i386_analyze_prologue (gdbarch, start_pc, 0xffffffff, &cache);
|
||||||
if (cache.locals < 0)
|
if (cache.locals < 0)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue