diff options
author | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-04-23 08:01:36 -0600 |
---|---|---|
committer | Luke T. Shumaker <lukeshu@lukeshu.com> | 2025-05-06 11:50:46 -0600 |
commit | a83c95e9f46ef695a55fc7a6911e11846da9903c (patch) | |
tree | 42abde5f3b34b239bb95e84200ea16ad4a4c562d /build-aux/measurestack/app_plugins.py | |
parent | b3ee525e9e0d49485714770d898cf9c28769313a (diff) |
Merge libobj into libmisc
Diffstat (limited to 'build-aux/measurestack/app_plugins.py')
-rw-r--r-- | build-aux/measurestack/app_plugins.py | 70 |
1 files changed, 23 insertions, 47 deletions
diff --git a/build-aux/measurestack/app_plugins.py b/build-aux/measurestack/app_plugins.py index bbb0eae..ae2dba9 100644 --- a/build-aux/measurestack/app_plugins.py +++ b/build-aux/measurestack/app_plugins.py @@ -14,7 +14,6 @@ from .util import synthetic_node # pylint: disable=unused-variable __all__ = [ "CmdPlugin", - "LibObjPlugin", "LibHWPlugin", "LibCRPlugin", "LibCRIPCPlugin", @@ -66,7 +65,7 @@ re_lo_implementation = re.compile( re_call_objcall = re.compile(r"LO_CALL\((?P<obj>[^,]+), (?P<meth>[^,)]+)[,)].*") -class LibObjPlugin: +class LibMiscPlugin: objcalls: dict[str, set[QName]] # method_name => {method_impls} def __init__(self, arg_c_fnames: typing.Collection[str]) -> None: @@ -120,7 +119,6 @@ class LibObjPlugin: def indirect_callees( self, loc: str, line: str ) -> tuple[typing.Collection[QName], bool] | None: - if "/3rd-party/" in loc: return None if m := re_call_objcall.fullmatch(line): @@ -132,16 +130,29 @@ class LibObjPlugin: return None def skipmodels(self) -> dict[BaseName, analyze.SkipModel]: - return {} + return { + BaseName("__assert_msg_fail"): analyze.SkipModel( + {BaseName("__assert_msg_fail")}, self._skipmodel___assert_msg_fail + ), + } + + def _skipmodel___assert_msg_fail( + self, chain: typing.Sequence[QName], call: QName + ) -> bool: + if call.base() in [BaseName("__lm_printf"), BaseName("__lm_light_printf")]: + return any( + c.base() == BaseName("__assert_msg_fail") for c in reversed(chain[:-1]) + ) + return False class LibHWPlugin: pico_platform: str - libobj: LibObjPlugin + libmisc: LibMiscPlugin - def __init__(self, arg_pico_platform: str, libobj: LibObjPlugin) -> None: + def __init__(self, arg_pico_platform: str, libmisc: LibMiscPlugin) -> None: self.pico_platform = arg_pico_platform - self.libobj = libobj + self.libmisc = libmisc def is_intrhandler(self, name: QName) -> bool: return name.base() in [ @@ -175,11 +186,11 @@ class LibHWPlugin: "io_readwritev", ]: if f"{fn}(" in line: - return self.libobj.indirect_callees(loc, f"LO_CALL(x, {fn[3:]})") + return self.libmisc.indirect_callees(loc, f"LO_CALL(x, {fn[3:]})") if "io_read(" in line: - return self.libobj.indirect_callees(loc, "LO_CALL(x, readv)") + return self.libmisc.indirect_callees(loc, "LO_CALL(x, readv)") if "io_writev(" in line: - return self.libobj.indirect_callees(loc, "LO_CALL(x, writev)") + return self.libmisc.indirect_callees(loc, "LO_CALL(x, writev)") if "trigger->cb(trigger->cb_arg)" in line: ret = [ QName("alarmclock_sleep_intrhandler"), @@ -280,11 +291,11 @@ class Lib9PPlugin: self, arg_base_dir: str, arg_c_fnames: typing.Collection[str], - libobj_plugin: LibObjPlugin, + libmisc_plugin: LibMiscPlugin, ) -> None: self.formatters = { x.base() - for x in libobj_plugin.objcalls["format"] + for x in libmisc_plugin.objcalls["format"] if str(x.base()).startswith("lib9p_") } @@ -426,41 +437,6 @@ class Lib9PPlugin: return False -class LibMiscPlugin: - def is_intrhandler(self, name: QName) -> bool: - return False - - def init_array(self) -> typing.Collection[QName]: - return [] - - def extra_includes(self) -> typing.Collection[BaseName]: - return [] - - def extra_nodes(self) -> typing.Collection[Node]: - return [] - - def indirect_callees( - self, loc: str, line: str - ) -> tuple[typing.Collection[QName], bool] | None: - return None - - def skipmodels(self) -> dict[BaseName, analyze.SkipModel]: - return { - BaseName("__assert_msg_fail"): analyze.SkipModel( - {BaseName("__assert_msg_fail")}, self._skipmodel___assert_msg_fail - ), - } - - def _skipmodel___assert_msg_fail( - self, chain: typing.Sequence[QName], call: QName - ) -> bool: - if call.base() in [BaseName("__lm_printf"), BaseName("__lm_light_printf")]: - return any( - c.base() == BaseName("__assert_msg_fail") for c in reversed(chain[:-1]) - ) - return False - - class PicoFmtPlugin: known_fct: dict[BaseName, BaseName] |