[gdb/f14/master] [ifunc] Fix ppc64 function descriptors compatibility.

Jan Kratochvil jankratochvil at fedoraproject.org
Wed Mar 23 07:11:05 UTC 2011


commit be6e797e00d727a28a14548ef2762905f673a545
Author: Jan Kratochvil <jan.kratochvil at redhat.com>
Date:   Wed Mar 23 08:10:34 2011 +0100

    [ifunc] Fix ppc64 function descriptors compatibility.

 gdb-ifunc-ppc64.patch |  100 +++++++++++++++++++++++++++++++++++++++++++++++++
 gdb.spec              |    9 ++++-
 2 files changed, 108 insertions(+), 1 deletions(-)
---
diff --git a/gdb-ifunc-ppc64.patch b/gdb-ifunc-ppc64.patch
new file mode 100644
index 0000000..5158dee
--- /dev/null
+++ b/gdb-ifunc-ppc64.patch
@@ -0,0 +1,100 @@
+--- ./gdb/elfread.c	2011-03-22 19:49:38.000000000 +0100
++++ ./gdb/elfread.c	2011-03-22 19:46:01.000000000 +0100
+@@ -718,6 +718,9 @@ gnu_ifunc_record_cache_unchecked (const 
+   return msym_new;
+ }
+ 
++static struct minimal_symbol *
++  resolve_gnu_ifunc_by_cache (const char *function_name);
++
+ /* Check first the cache if it - unlikely - has not been populated since
+    bp_gnu_ifunc_resolver has been created.  gnu_ifunc_record_cache_unchecked
+    could create a duplicate symbol otherwise.  */
+@@ -731,7 +734,10 @@ gnu_ifunc_record_cache (struct gdbarch *
+   msym = resolve_gnu_ifunc_by_cache (function_name);
+   if (msym == NULL)
+     gnu_ifunc_record_cache_unchecked (function_name, function_address);
+-  else if (SYMBOL_VALUE_ADDRESS (msym) != function_address)
++  else
++    {
++      CORE_ADDR msym_address = gdbarch_convert_from_func_ptr_addr (gdbarch, SYMBOL_VALUE_ADDRESS (msym), &current_target);
++if (msym_address != function_address)
+     {
+       /* This case indicates buggy inferior program.  GDB would need to update
+ 	 its MSYM cache symbol for function_address.  Anyway FUNCTION_NAME is
+@@ -740,9 +746,10 @@ gnu_ifunc_record_cache (struct gdbarch *
+ 
+       warning (_("gnu-indirect-function \"%s\" has changed its resolved "
+ 		 "function_address from %s to %s; GDB is using the former one"),
+-	       function_name, paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)),
++	       function_name, paddress (gdbarch, msym_address),
+ 	       paddress (gdbarch, function_address));
+     }
++    }
+ }
+ 
+ static struct minimal_symbol *
+@@ -782,6 +789,7 @@ resolve_gnu_ifunc_by_got (const char *fu
+       if (target_read_memory (pointer_address, buf, ptr_size) != 0)
+ 	continue;
+       function_address = extract_typed_address (buf, ptr_type);
++      function_address = gdbarch_convert_from_func_ptr_addr (gdbarch, function_address, &current_target);
+ 
+       msym = gnu_ifunc_record_cache_unchecked (function_name, function_address);
+       if (msym == NULL)
+@@ -792,7 +800,7 @@ resolve_gnu_ifunc_by_got (const char *fu
+   return NULL;
+ }
+ 
+-struct minimal_symbol *
++static struct minimal_symbol *
+ resolve_gnu_ifunc_by_cache (const char *function_name)
+ {
+   char *function_name_gnu_ifunc_tgt;
+--- ./gdb/infcall.c	2011-03-22 19:49:38.000000000 +0100
++++ ./gdb/infcall.c	2011-03-22 19:42:52.000000000 +0100
+@@ -256,11 +256,12 @@ gnu_ifunc_resolve (struct gdbarch *gdbar
+      while ADDRESS is a possible function descriptor..  */
+   address_val = call_function_by_hand (function, 0, NULL);
+   address = value_as_address (address_val);
++  address = gdbarch_convert_from_func_ptr_addr (gdbarch, address, &current_target);
+ 
+   if (name_at_pc)
+     gnu_ifunc_record_cache (gdbarch, name_at_pc, address);
+ 
+-  return gdbarch_convert_from_func_ptr_addr (gdbarch, address, &current_target);
++  return address;
+ }
+ 
+ static struct type *
+--- ./gdb/symtab.h	2011-03-22 19:49:38.000000000 +0100
++++ ./gdb/symtab.h	2011-03-22 19:41:27.000000000 +0100
+@@ -960,9 +960,6 @@ extern void clear_pc_function_cache (voi
+ extern int resolve_gnu_ifunc (const char *function_name,
+ 			      CORE_ADDR *function_addressp);
+ 
+-extern struct minimal_symbol *resolve_gnu_ifunc_by_cache
+-  (const char *function_name);
+-
+ extern void gnu_ifunc_record_cache (struct gdbarch *gdbarch,
+ 				    const char *function_name,
+ 				    CORE_ADDR function_address);
+--- ./gdb/testsuite/gdb.base/gnu-ifunc.exp	2011-03-22 19:49:38.000000000 +0100
++++ ./gdb/testsuite/gdb.base/gnu-ifunc.exp	2011-03-22 20:04:17.000000000 +0100
+@@ -105,7 +105,15 @@ gdb_test "frame" "#0 +(0x\[0-9a-f\]+ in 
+ # Check any commands not doing an inferior call still compute with address of
+ # the gnu-ifunc resolver.
+ 
+-gdb_test "p gnu_ifunc" " = {<text gnu-indirect-function variable, no debug info>} 0x\[0-9a-f\]+ <gnu_ifunc>" "p gnu_ifunc executing"
++if {[istarget powerpc64-*] && [is_lp64_target]} {
++    # With only minimal symbols GDB provides the function descriptors.  With
++    # full debug info the function code would be displayed.
++    set func_prefix {\.}
++} else {
++    set func_prefix {}
++}
++
++gdb_test "p gnu_ifunc" " = {<text gnu-indirect-function variable, no debug info>} 0x\[0-9a-f\]+ <${func_prefix}gnu_ifunc>" "p gnu_ifunc executing"
+ gdb_test "info sym gnu_ifunc" "gnu_ifunc in section .*" "info sym gnu_ifunc executing"
+ 
+ set test "info addr gnu_ifunc"
diff --git a/gdb.spec b/gdb.spec
index 2ce4ca3..2f46694 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -27,7 +27,7 @@ Version: 7.2
 
 # The release always contains a leading reserved number, start it at 1.
 # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
-Release: 48%{?_with_upstream:.upstream}%{dist}
+Release: 49%{?_with_upstream:.upstream}%{dist}
 
 License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain
 Group: Development/Debuggers
@@ -747,6 +747,9 @@ Patch574: gdb-core-thread-internalerr-3of3.patch
 # [vla] New testcase for the unfinished types garbage collector (for BZ 682286).
 Patch575: gdb-vla-gc-disable.patch
 
+# [ifunc] Fix ppc64 function descriptors compatibility.
+Patch578: gdb-ifunc-ppc64.patch
+
 BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa}
 Requires: readline%{?_isa}
 BuildRequires: readline-devel%{?_isa}
@@ -1067,6 +1070,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c
 %patch573 -p1
 %patch574 -p1
 %patch575 -p1
+%patch578 -p1
 
 %patch390 -p1
 %patch393 -p1
@@ -1464,6 +1468,9 @@ fi
 %endif
 
 %changelog
+* Wed Mar 23 2011 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.2-49.fc14
+- [ifunc] Fix ppc64 function descriptors compatibility.
+
 * Fri Mar 18 2011 Jan Kratochvil <jan.kratochvil at redhat.com> - 7.2-48.fc14
 - Fix i386 rwatch+awatch before run (BZ 688788, on top of BZ 541866).
 


More information about the scm-commits mailing list