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
This commit is contained in:
Jakub Jelinek 2013-11-19 15:46:03 +01:00 committed by Jakub Jelinek
parent e4effef72d
commit 1f96a712d1
4 changed files with 44 additions and 8 deletions

View File

@ -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>

View File

@ -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

View File

@ -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",

View File

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