diff options
author | kvbhat <kvbhat> | 2012-12-04 07:43:19 +0000 |
---|---|---|
committer | kvbhat <kvbhat> | 2012-12-04 07:43:19 +0000 |
commit | 5475d3e4cc7666146ee3af19a21270910c1f167f (patch) | |
tree | d6a4424806ea3ebc34eb5d4b9daaaf55b872b3dc | |
parent | ff6541e5e2c73a8606198b0290bfc1764d287e30 (diff) | |
download | gdb-5475d3e4cc7666146ee3af19a21270910c1f167f.tar.gz |
Fix for incorrect breakpoint set in case of clang compiled binary
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/amd64-tdep.c | 16 | ||||
-rw-r--r-- | gdb/i386-tdep.c | 16 |
3 files changed, 39 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ae82862f511..41d9891ab3d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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> * dwarf2read.c (struct dwarf2_per_objfile): Clarify comment. diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 2edaecf1427..fec74d53f1b 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -2252,6 +2252,22 @@ amd64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) { struct amd64_frame_cache cache; 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); pc = amd64_analyze_prologue (gdbarch, start_pc, 0xffffffffffffffffLL, diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index f0056bea56f..52b5c7004ff 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -1582,7 +1582,23 @@ i386_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc) CORE_ADDR pc; gdb_byte op; 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; pc = i386_analyze_prologue (gdbarch, start_pc, 0xffffffff, &cache); if (cache.locals < 0) |