mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-02-26 19:56:05 +08:00
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:
parent
e4effef72d
commit
1f96a712d1
@ -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>
|
||||
|
@ -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
|
||||
|
@ -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",
|
||||
|
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user