diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-19 14:46:03 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-11-19 14:46:03 +0000 |
commit | 32ccb4380da70ad3f450f08a7cdde0852b8cd7a0 (patch) | |
tree | a719603a47f4d7b58bb0a1113198349a988a2ba4 /libbacktrace | |
parent | 3ebca59c707fedef4f73a76bf01691cfa7c99ccf (diff) | |
download | gcc-32ccb4380da70ad3f450f08a7cdde0852b8cd7a0.tar.gz |
* backtrace.h (backtrace_syminfo_callback): Add symsize argument.
* elf.c (elf_syminfo): Pass 0 or sym->size to the callback as
last argument.
* btest.c (struct symdata): Add size field.
(callback_three): Add symsize argument. Copy it to the data->size
field.
(f23): Set symdata.size to 0.
(test5): Likewise. If sizeof (int) > 1, lookup address of
((uintptr_t) &global) + 1. Verify symdata.val and symdata.size
values.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@205028 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libbacktrace')
-rw-r--r-- | libbacktrace/ChangeLog | 11 | ||||
-rw-r--r-- | libbacktrace/backtrace.h | 7 | ||||
-rw-r--r-- | libbacktrace/btest.c | 30 | ||||
-rw-r--r-- | libbacktrace/elf.c | 4 |
4 files changed, 44 insertions, 8 deletions
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog index 97abf7a3d9b..79ac1178f80 100644 --- a/libbacktrace/ChangeLog +++ b/libbacktrace/ChangeLog @@ -1,5 +1,16 @@ 2013-11-19 Jakub Jelinek <jakub@redhat.com> + * backtrace.h (backtrace_syminfo_callback): Add symsize argument. + * elf.c (elf_syminfo): Pass 0 or sym->size to the callback as + last argument. + * btest.c (struct symdata): Add size field. + (callback_three): Add symsize argument. Copy it to the data->size + field. + (f23): Set symdata.size to 0. + (test5): Likewise. If sizeof (int) > 1, lookup address of + ((uintptr_t) &global) + 1. Verify symdata.val and symdata.size + values. + * atomic.c: Include sys/types.h. 2013-11-18 Ian Lance Taylor <iant@google.com> diff --git a/libbacktrace/backtrace.h b/libbacktrace/backtrace.h index 3be400737c1..33595cf5139 100644 --- a/libbacktrace/backtrace.h +++ b/libbacktrace/backtrace.h @@ -169,12 +169,13 @@ extern int backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc, /* The type of the callback argument to backtrace_syminfo. DATA and PC are the arguments passed to backtrace_syminfo. SYMNAME is the name of the symbol for the corresponding code. SYMVAL is the - value. SYMNAME will be NULL if no error occurred but the symbol - could not be found. */ + value and SYMSIZE is the size of the symbol. SYMNAME will be NULL + if no error occurred but the symbol could not be found. */ typedef void (*backtrace_syminfo_callback) (void *data, uintptr_t pc, const char *symname, - uintptr_t symval); + uintptr_t symval, + uintptr_t symsize); /* Given ADDR, an address or program counter in the current program, call the callback information with the symbol name and value diff --git a/libbacktrace/btest.c b/libbacktrace/btest.c index c06493f341e..22b08e05030 100644 --- a/libbacktrace/btest.c +++ b/libbacktrace/btest.c @@ -92,7 +92,7 @@ struct sdata struct symdata { const char *name; - uintptr_t val; + uintptr_t val, size; int failed; }; @@ -238,7 +238,8 @@ error_callback_two (void *vdata, const char *msg, int errnum) static void callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED, - const char *symname, uintptr_t symval) + const char *symname, uintptr_t symval, + uintptr_t symsize) { struct symdata *data = (struct symdata *) vdata; @@ -250,6 +251,7 @@ callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED, assert (data->name != NULL); } data->val = symval; + data->size = symsize; } /* The backtrace_syminfo error callback function. */ @@ -458,6 +460,7 @@ f23 (int f1line, int f2line) symdata.name = NULL; symdata.val = 0; + symdata.size = 0; symdata.failed = 0; i = backtrace_syminfo (state, addrs[j], callback_three, @@ -605,12 +608,17 @@ test5 (void) { struct symdata symdata; int i; + uintptr_t addr = (uintptr_t) &global; + + if (sizeof (global) > 1) + addr += 1; symdata.name = NULL; symdata.val = 0; + symdata.size = 0; symdata.failed = 0; - i = backtrace_syminfo (state, (uintptr_t) &global, callback_three, + i = backtrace_syminfo (state, addr, callback_three, error_callback_three, &symdata); if (i == 0) { @@ -634,6 +642,22 @@ test5 (void) symdata.name, "global"); symdata.failed = 1; } + else if (symdata.val != (uintptr_t) &global) + { + fprintf (stderr, + "test5: unexpected syminfo value got %lx expected %lx\n", + (unsigned long) symdata.val, + (unsigned long) (uintptr_t) &global); + symdata.failed = 1; + } + else if (symdata.size != sizeof (global)) + { + fprintf (stderr, + "test5: unexpected syminfo size got %lx expected %lx\n", + (unsigned long) symdata.size, + (unsigned long) sizeof (global)); + symdata.failed = 1; + } } printf ("%s: backtrace_syminfo variable\n", diff --git a/libbacktrace/elf.c b/libbacktrace/elf.c index 981ce7f831c..3747c03079c 100644 --- a/libbacktrace/elf.c +++ b/libbacktrace/elf.c @@ -502,9 +502,9 @@ elf_syminfo (struct backtrace_state *state, uintptr_t addr, } if (sym == NULL) - callback (data, addr, NULL, 0); + callback (data, addr, NULL, 0, 0); else - callback (data, addr, sym->name, sym->address); + callback (data, addr, sym->name, sym->address, sym->size); } /* Add the backtrace data for one ELF file. */ |