aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-11-19 14:46:03 +0000
committerJakub Jelinek <jakub@redhat.com>2013-11-19 14:46:03 +0000
commit854f0ec82ccd1f2caa41f32c3659e21d8d06b66d (patch)
treea719603a47f4d7b58bb0a1113198349a988a2ba4
parent7ac5c3b2bfbbf873a30301377b9b5e5f230af82b (diff)
* 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: https://gcc.gnu.org/svn/gcc/trunk@205028 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libbacktrace/ChangeLog11
-rw-r--r--libbacktrace/backtrace.h7
-rw-r--r--libbacktrace/btest.c30
-rw-r--r--libbacktrace/elf.c4
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. */