diff options
author | Karthik Bhat <kvbhat@sourceware.org> | 2012-12-04 07:43:19 +0000 |
---|---|---|
committer | Karthik Bhat <kvbhat@sourceware.org> | 2012-12-04 07:43:19 +0000 |
commit | 56bf0743058aa1fff07b32ba50c1e9bfaf9e2bcc (patch) | |
tree | dd8402e7de50e55b64fd6e3c6df76ee1a48994f6 /gdb/amd64-tdep.c | |
parent | e9eb0d14a798062137f3e8d436adf7bff079ce6e (diff) | |
download | gdb-56bf0743058aa1fff07b32ba50c1e9bfaf9e2bcc.zip gdb-56bf0743058aa1fff07b32ba50c1e9bfaf9e2bcc.tar.gz gdb-56bf0743058aa1fff07b32ba50c1e9bfaf9e2bcc.tar.bz2 |
Fix for incorrect breakpoint set in case of clang compiled binary
Diffstat (limited to 'gdb/amd64-tdep.c')
-rw-r--r-- | gdb/amd64-tdep.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 2edaecf..fec74d5 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, |