Commit 1f96a712 by Jakub Jelinek Committed by Jakub Jelinek

backtrace.h (backtrace_syminfo_callback): Add symsize argument.

	* 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.

From-SVN: r205028
parent e4effef7
2013-11-19 Jakub Jelinek <jakub@redhat.com> 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. * atomic.c: Include sys/types.h.
2013-11-18 Ian Lance Taylor <iant@google.com> 2013-11-18 Ian Lance Taylor <iant@google.com>
......
...@@ -169,12 +169,13 @@ extern int backtrace_pcinfo (struct backtrace_state *state, uintptr_t pc, ...@@ -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 /* The type of the callback argument to backtrace_syminfo. DATA and
PC are the arguments passed to backtrace_syminfo. SYMNAME is the PC are the arguments passed to backtrace_syminfo. SYMNAME is the
name of the symbol for the corresponding code. SYMVAL 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 value and SYMSIZE is the size of the symbol. SYMNAME will be NULL
could not be found. */ if no error occurred but the symbol could not be found. */
typedef void (*backtrace_syminfo_callback) (void *data, uintptr_t pc, typedef void (*backtrace_syminfo_callback) (void *data, uintptr_t pc,
const char *symname, const char *symname,
uintptr_t symval); uintptr_t symval,
uintptr_t symsize);
/* Given ADDR, an address or program counter in the current program, /* Given ADDR, an address or program counter in the current program,
call the callback information with the symbol name and value call the callback information with the symbol name and value
......
...@@ -92,7 +92,7 @@ struct sdata ...@@ -92,7 +92,7 @@ struct sdata
struct symdata struct symdata
{ {
const char *name; const char *name;
uintptr_t val; uintptr_t val, size;
int failed; int failed;
}; };
...@@ -238,7 +238,8 @@ error_callback_two (void *vdata, const char *msg, int errnum) ...@@ -238,7 +238,8 @@ error_callback_two (void *vdata, const char *msg, int errnum)
static void static void
callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED, 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; struct symdata *data = (struct symdata *) vdata;
...@@ -250,6 +251,7 @@ callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED, ...@@ -250,6 +251,7 @@ callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
assert (data->name != NULL); assert (data->name != NULL);
} }
data->val = symval; data->val = symval;
data->size = symsize;
} }
/* The backtrace_syminfo error callback function. */ /* The backtrace_syminfo error callback function. */
...@@ -458,6 +460,7 @@ f23 (int f1line, int f2line) ...@@ -458,6 +460,7 @@ f23 (int f1line, int f2line)
symdata.name = NULL; symdata.name = NULL;
symdata.val = 0; symdata.val = 0;
symdata.size = 0;
symdata.failed = 0; symdata.failed = 0;
i = backtrace_syminfo (state, addrs[j], callback_three, i = backtrace_syminfo (state, addrs[j], callback_three,
...@@ -605,12 +608,17 @@ test5 (void) ...@@ -605,12 +608,17 @@ test5 (void)
{ {
struct symdata symdata; struct symdata symdata;
int i; int i;
uintptr_t addr = (uintptr_t) &global;
if (sizeof (global) > 1)
addr += 1;
symdata.name = NULL; symdata.name = NULL;
symdata.val = 0; symdata.val = 0;
symdata.size = 0;
symdata.failed = 0; symdata.failed = 0;
i = backtrace_syminfo (state, (uintptr_t) &global, callback_three, i = backtrace_syminfo (state, addr, callback_three,
error_callback_three, &symdata); error_callback_three, &symdata);
if (i == 0) if (i == 0)
{ {
...@@ -634,6 +642,22 @@ test5 (void) ...@@ -634,6 +642,22 @@ test5 (void)
symdata.name, "global"); symdata.name, "global");
symdata.failed = 1; 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", printf ("%s: backtrace_syminfo variable\n",
......
...@@ -502,9 +502,9 @@ elf_syminfo (struct backtrace_state *state, uintptr_t addr, ...@@ -502,9 +502,9 @@ elf_syminfo (struct backtrace_state *state, uintptr_t addr,
} }
if (sym == NULL) if (sym == NULL)
callback (data, addr, NULL, 0); callback (data, addr, NULL, 0, 0);
else 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. */ /* Add the backtrace data for one ELF file. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment