]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backtrace.h (backtrace_syminfo_callback): Add symsize argument.
authorJakub Jelinek <jakub@redhat.com>
Tue, 19 Nov 2013 14:46:03 +0000 (15:46 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 19 Nov 2013 14:46:03 +0000 (15:46 +0100)
* 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

libbacktrace/ChangeLog
libbacktrace/backtrace.h
libbacktrace/btest.c
libbacktrace/elf.c

index 97abf7a3d9bc14d2e28fa316dc9c7e0f2fe3a22b..79ac1178f80ece6553a51a0c06e00efa892dad58 100644 (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>
index 3be400737c165ae307603abee2b15d5c7ce02d0b..33595cf5139f88c003c9f894a55eab3797480522 100644 (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
index c06493f341e8b2b85ec7c2b5ccbf1d59479848e1..22b08e05030be028c69a3bed38644c60d6e4d9c8 100644 (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",
index 981ce7f831c48e156f7fba1281351e273cb48b21..3747c03079c59998faa3adc5409a37b7ca7e7805 100644 (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.  */