summaryrefslogtreecommitdiff
path: root/build-aux/measurestack/app_plugins.py
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-04-23 08:01:36 -0600
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-05-06 11:50:46 -0600
commita83c95e9f46ef695a55fc7a6911e11846da9903c (patch)
tree42abde5f3b34b239bb95e84200ea16ad4a4c562d /build-aux/measurestack/app_plugins.py
parentb3ee525e9e0d49485714770d898cf9c28769313a (diff)
Merge libobj into libmisc
Diffstat (limited to 'build-aux/measurestack/app_plugins.py')
-rw-r--r--build-aux/measurestack/app_plugins.py70
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]