From 272fb07ceb873b500b50f295325fda3f2106fb98 Mon Sep 17 00:00:00 2001 From: Mikhail Elhimov Date: Wed, 7 Aug 2024 11:48:11 +0300 Subject: [PATCH] gdb: display fast function name along with ffid Part of tarantool/tarantool#4808 --- src/luajit-gdb.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/luajit-gdb.py b/src/luajit-gdb.py index d2070e9bfa..16aae4c6b0 100644 --- a/src/luajit-gdb.py +++ b/src/luajit-gdb.py @@ -4,6 +4,7 @@ import re import gdb import sys +import itertools # make script compatible with the ancient Python {{{ @@ -14,6 +15,7 @@ CONNECTED = False int = long range = xrange + filter = itertools.ifilter # }}} @@ -74,6 +76,20 @@ def strx64(val): hex(int(cast('uint64_t', val) & 0xFFFFFFFFFFFFFFFF))) +def find(predicate, iterable, default=None): + return next(filter(predicate, iterable), default) + + +def enumval_name(type, val, default): + assert type.code == gdb.TYPE_CODE_ENUM, "enumval_name expects enum type \ + but type of code {} was given".format(type.code) + enumval_attr = 'enumval' + if not hasattr(type.fields()[0], 'enumval'): + enumval_attr = 'bitpos' + field = find(lambda x: getattr(x, enumval_attr) == val, type.fields()) + return default if field is None else field.name + + # Types {{{ @@ -426,7 +442,7 @@ def dump_lj_tproto(tv): def dump_lj_tfunc(tv): func = cast('struct GCfuncC *', gcval(tv['gcr'])) - ffid = func['ffid'] + ffid = int(func['ffid']) if ffid == 0: pt = funcproto(func) @@ -439,7 +455,9 @@ def dump_lj_tfunc(tv): elif ffid == 1: return 'C function @ {}'.format(strx64(func['f'])) else: - return 'fast function #{}'.format(int(ffid)) + ffid_enum = gdb.parse_and_eval('FF__MAX').type + ffid_name = enumval_name(ffid_enum, ffid, 'UNKNOWN') + return 'fast function #{}({})'.format(ffid, ffid_name) def dump_lj_ttrace(tv):