mirror of
https://github.com/ianlancetaylor/libbacktrace.git
synced 2026-09-08 04:36:52 +08:00
libbacktrace: support returning discriminator field
Based on patch from Andi Kleen. * backtrace.h (backtrace_create_state): Rewrite comment to change threaded parameter to flags. (backtrace_full_callback, backtrace_syminfo_callback): Document behavior change if moredata flag is set. (struct backtrace_moredata): Define. * backtrace-supported.h.in (BACKTRACE_SUPPORTS_MOREDATA): Define. * internal.h (struct backtrace_state): Add moredata field. (BACKTRACE_MOREDATA_VERSION): Define. * state.c (backtrace_create_state): Change threaded parameter to flags. Set state moredata field based on flags. * dwarf.c (struct line): Add disc field. (struct function): Add caller_disc field. (call_callback): New static function. (add_line): Add disc parameter. Change all callers. Store disc in new line value. (read_line_program): Track discriminator value. (read_line_info): Initialize disc field in final line entry. (read_function_entry): Handle DW_AT_GNU_discriminator. (report_inlined_functions): Add disc parameter. Change all callers. Call call_callback rather than calling callback directly. (dwarf_lookup_pc): Handle inlined discriminators. Call call_callback rather than calling callback directly. (dwarf_fileline): Call call_callback rather than calling callback directly. * elf.c (elf_syminfo): Pass moredata if requested. * macho.c (macho_syminfo): Likewise. * pecoff.c (coff_syminfo): Likewise. * xcoff.c (xcoff_syminfo): Likewise. (xcoff_lookup_pc): Likewise. * backtrace.c: #include <string.h>. (unwind): Pass moredata if requested. * unknown.c: #include <string.h>. (unknown_fileline): Pass moredata if requested. * fileline.c (backtrace_syminfo_to_full_callback): Add comment about moredata. * mdtest.c: New test file. * Makefile.am (mdtest_SOURCES): Define. (mdtest_CFLAGS, mdtest_LDFLAGS, mdtest_LDADD): Define. (BUILDTESTS): Add mdtest. * Makefile.in: Regenerate.
This commit is contained in:
@@ -32,6 +32,7 @@ POSSIBILITY OF SUCH DAMAGE. */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "backtrace.h"
|
||||
@@ -40,13 +41,23 @@ POSSIBILITY OF SUCH DAMAGE. */
|
||||
/* A trivial routine that always fails to find fileline data. */
|
||||
|
||||
static int
|
||||
unknown_fileline (struct backtrace_state *state ATTRIBUTE_UNUSED,
|
||||
uintptr_t pc, backtrace_full_callback callback,
|
||||
unknown_fileline (struct backtrace_state *state, uintptr_t pc,
|
||||
backtrace_full_callback callback,
|
||||
backtrace_error_callback error_callback ATTRIBUTE_UNUSED,
|
||||
void *data)
|
||||
|
||||
{
|
||||
return callback (data, pc, NULL, 0, NULL);
|
||||
if (!state->moredata)
|
||||
return callback (data, pc, NULL, 0, NULL);
|
||||
else
|
||||
{
|
||||
struct backtrace_moredata md;
|
||||
|
||||
memset (&md, 0, sizeof md);
|
||||
md.backtrace_version = 3;
|
||||
md.backtrace_data = data;
|
||||
return callback ((void *) &md, pc, NULL, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize the backtrace data when we don't know how to read the
|
||||
|
||||
Reference in New Issue
Block a user