libstdc++: Fix std::any pretty printer [PR 68735]
This fixes errors seen on powerpc64 (big endian only) due to the printers for std::any and std::experimental::any being unable to find the manager function. libstdc++-v3/ChangeLog: PR libstdc++/65480 PR libstdc++/68735 * python/libstdcxx/v6/printers.py (function_pointer_to_name): New helper function to get the name of a function from its address. (StdExpAnyPrinter.__init__): Use it.
This commit is contained in:
parent
2847d7d28e
commit
dc2b372ed1
1 changed files with 26 additions and 3 deletions
|
@ -1126,6 +1126,29 @@ class SingleObjContainerPrinter(object):
|
|||
return self.visualizer.display_hint ()
|
||||
return self.hint
|
||||
|
||||
def function_pointer_to_name(f):
|
||||
"Find the name of the function referred to by the gdb.Value f, "
|
||||
" which should contain a function pointer from the program."
|
||||
|
||||
# Turn the function pointer into an actual address.
|
||||
# This is needed to unpack ppc64 function descriptors.
|
||||
f = f.dereference().address
|
||||
|
||||
if sys.version_info[0] == 2:
|
||||
# Older versions of GDB need to use long for Python 2,
|
||||
# because int(f) on 64-bit big-endian values raises a
|
||||
# gdb.error saying "Cannot convert value to int."
|
||||
f = long(f)
|
||||
else:
|
||||
f = int(f)
|
||||
|
||||
try:
|
||||
# If the function can't be found older versions of GDB raise a
|
||||
# RuntimeError saying "Cannot locate object file for block."
|
||||
return gdb.block_for_pc(f).function.name
|
||||
except:
|
||||
return None
|
||||
|
||||
class StdExpAnyPrinter(SingleObjContainerPrinter):
|
||||
"Print a std::any or std::experimental::any"
|
||||
|
||||
|
@ -1138,11 +1161,11 @@ class StdExpAnyPrinter(SingleObjContainerPrinter):
|
|||
visualizer = None
|
||||
mgr = self.val['_M_manager']
|
||||
if mgr != 0:
|
||||
func = gdb.block_for_pc(int(mgr.cast(gdb.lookup_type('intptr_t'))))
|
||||
func = function_pointer_to_name(mgr)
|
||||
if not func:
|
||||
raise ValueError("Invalid function pointer in %s" % self.typename)
|
||||
raise ValueError("Invalid function pointer in %s" % (self.typename))
|
||||
rx = r"""({0}::_Manager_\w+<.*>)::_S_manage\((enum )?{0}::_Op, (const {0}|{0} const) ?\*, (union )?{0}::_Arg ?\*\)""".format(typename)
|
||||
m = re.match(rx, func.function.name)
|
||||
m = re.match(rx, func)
|
||||
if not m:
|
||||
raise ValueError("Unknown manager function in %s" % self.typename)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue