diff options
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | HACKING.md | 5 | ||||
-rw-r--r-- | build-aux/measurestack/app_main.py | 9 | ||||
-rw-r--r-- | build-aux/measurestack/app_plugins.py | 70 | ||||
-rw-r--r-- | lib9p/core_gen/c.py | 4 | ||||
-rw-r--r-- | lib9p/core_generated.c | 2 | ||||
-rw-r--r-- | lib9p/srv_include/lib9p/srv.h | 2 | ||||
-rw-r--r-- | libfmt/CMakeLists.txt | 2 | ||||
-rw-r--r-- | libfmt/include/libfmt/fmt.h | 2 | ||||
-rw-r--r-- | libfmt/libmisc.c | 10 | ||||
-rw-r--r-- | libfmt/libobj.c | 17 | ||||
-rw-r--r-- | libhw_cr/host_net.c | 2 | ||||
-rw-r--r-- | libhw_cr/w5500.c | 2 | ||||
-rw-r--r-- | libhw_generic/CMakeLists.txt | 1 | ||||
-rw-r--r-- | libhw_generic/include/libhw/generic/alarmclock.h | 2 | ||||
-rw-r--r-- | libhw_generic/include/libhw/generic/io.h | 2 | ||||
-rw-r--r-- | libmisc/CMakeLists.txt | 2 | ||||
-rw-r--r-- | libmisc/include/libmisc/obj.h (renamed from libobj/include/libobj/obj.h) | 12 | ||||
-rw-r--r-- | libmisc/tests/test_obj.c (renamed from libobj/tests/test_obj.c) | 4 | ||||
-rw-r--r-- | libmisc/tests/test_obj_nest.c (renamed from libobj/tests/test_nest.c) | 4 | ||||
-rw-r--r-- | libobj/CMakeLists.txt | 13 | ||||
l--------- | libobj/tests/test.h | 1 |
22 files changed, 60 insertions, 109 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c5251d..659f530 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,7 +124,6 @@ function(add_lib_test arg_libname arg_testname) endfunction() add_subdirectory(libmisc) -add_subdirectory(libobj) add_subdirectory(libfmt) add_subdirectory(libcr) add_subdirectory(libcr_ipc) @@ -9,9 +9,8 @@ Our own "flavor" of C: GNU C, plus making use of: - - `libobj/`: For Go-like object-oriented programming - - `libmisc/`: Low-level C programming utilities; sort of an augmented - "libc" + - `libmisc/`: Low-level C programming utilities (including Go-like + object-oriented programming); sort of an augmented "libc" Our own tiny cooperative-multitasking OS: diff --git a/build-aux/measurestack/app_main.py b/build-aux/measurestack/app_main.py index 7573146..c670325 100644 --- a/build-aux/measurestack/app_main.py +++ b/build-aux/measurestack/app_main.py @@ -27,8 +27,8 @@ def main( # sbc-harness #################################################### - libobj_plugin = app_plugins.LibObjPlugin(arg_c_fnames) - lib9p_plugin = app_plugins.Lib9PPlugin(arg_base_dir, arg_c_fnames, libobj_plugin) + libmisc_plugin = app_plugins.LibMiscPlugin(arg_c_fnames) + lib9p_plugin = app_plugins.Lib9PPlugin(arg_base_dir, arg_c_fnames, libmisc_plugin) def sbc_is_thread(name: QName) -> int: if str(name).endswith("_cr") and name.base() != BaseName("lib9p_srv_read_cr"): @@ -47,13 +47,12 @@ def main( plugins += [ app_plugins.CmdPlugin(), - libobj_plugin, + libmisc_plugin, app_plugins.PicoFmtPlugin(arg_pico_platform), - app_plugins.LibHWPlugin(arg_pico_platform, libobj_plugin), + app_plugins.LibHWPlugin(arg_pico_platform, libmisc_plugin), app_plugins.LibCRPlugin(), app_plugins.LibCRIPCPlugin(), lib9p_plugin, - app_plugins.LibMiscPlugin(), ] # pico-sdk ####################################################### 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] diff --git a/lib9p/core_gen/c.py b/lib9p/core_gen/c.py index c05e457..393766b 100644 --- a/lib9p/core_gen/c.py +++ b/lib9p/core_gen/c.py @@ -35,9 +35,9 @@ def gen_c(versions: set[str], typs: list[idl.UserType]) -> str: #include "core_tables.h" #include "core_utf8.h" """ - # libobj vtables ########################################################### + # libmisc/obj.h vtables #################################################### ret += """ -/* libobj vtables *************************************************************/ +/* libmisc/obj.h vtables ******************************************************/ """ for typ in typs: ret += cutil.ifdef_push(1, c9util.ver_ifdef(typ.in_versions)) diff --git a/lib9p/core_generated.c b/lib9p/core_generated.c index 3c2ee28..2532d12 100644 --- a/lib9p/core_generated.c +++ b/lib9p/core_generated.c @@ -12,7 +12,7 @@ #include "core_tables.h" #include "core_utf8.h" -/* libobj vtables *************************************************************/ +/* libmisc/obj.h vtables ******************************************************/ #if CONFIG_9P_ENABLE_9P2000 || CONFIG_9P_ENABLE_9P2000_L || CONFIG_9P_ENABLE_9P2000_e || CONFIG_9P_ENABLE_9P2000_p9p || CONFIG_9P_ENABLE_9P2000_u || CONFIG_9P_ENABLE_uninitialized LO_IMPLEMENTATION_C(fmt_formatter, lib9p_tag_t, lib9p_tag, static); LO_IMPLEMENTATION_C(fmt_formatter, lib9p_fid_t, lib9p_fid, static); diff --git a/lib9p/srv_include/lib9p/srv.h b/lib9p/srv_include/lib9p/srv.h index ca80e7b..c40c85a 100644 --- a/lib9p/srv_include/lib9p/srv.h +++ b/lib9p/srv_include/lib9p/srv.h @@ -12,8 +12,8 @@ #include <libcr_ipc/rpc.h> #include <libhw/generic/net.h> #include <libmisc/assert.h> +#include <libmisc/obj.h> #include <libmisc/private.h> -#include <libobj/obj.h> #include <lib9p/core.h> diff --git a/libfmt/CMakeLists.txt b/libfmt/CMakeLists.txt index f65d462..dc626f7 100644 --- a/libfmt/CMakeLists.txt +++ b/libfmt/CMakeLists.txt @@ -7,11 +7,9 @@ add_library(libfmt INTERFACE) target_include_directories(libfmt PUBLIC INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) target_sources(libfmt INTERFACE libmisc.c - libobj.c quote.c ) target_link_libraries(libfmt INTERFACE pico_fmt libmisc - libobj ) diff --git a/libfmt/include/libfmt/fmt.h b/libfmt/include/libfmt/fmt.h index 1b5bde1..692abf2 100644 --- a/libfmt/include/libfmt/fmt.h +++ b/libfmt/include/libfmt/fmt.h @@ -10,7 +10,7 @@ #include <pico/fmt_printf.h> #include <pico/fmt_install.h> -#include <libobj/obj.h> +#include <libmisc/obj.h> /** * An object that implements fmt_formatter can be printed using diff --git a/libfmt/libmisc.c b/libfmt/libmisc.c index 803b281..134b9f0 100644 --- a/libfmt/libmisc.c +++ b/libfmt/libmisc.c @@ -61,3 +61,13 @@ int __lm_light_printf(const char *format, ...) { va_end(va); return ret; } + +static void libfmt_conv_formatter(struct fmt_state *state) { + lo_interface fmt_formatter obj = va_arg(*state->args, lo_interface fmt_formatter); + LO_CALL(obj, format, state); +} + +[[gnu::constructor]] +static void libfmt_install_formatter(void) { + fmt_install('v', libfmt_conv_formatter); +} diff --git a/libfmt/libobj.c b/libfmt/libobj.c deleted file mode 100644 index e4b833b..0000000 --- a/libfmt/libobj.c +++ /dev/null @@ -1,17 +0,0 @@ -/* libfmt/libobj.c - Integrate pico-fmt with libobj - * - * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com> - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -#include <libfmt/fmt.h> - -static void libfmt_conv_formatter(struct fmt_state *state) { - lo_interface fmt_formatter obj = va_arg(*state->args, lo_interface fmt_formatter); - LO_CALL(obj, format, state); -} - -[[gnu::constructor]] -static void libfmt_install_formatter(void) { - fmt_install('v', libfmt_conv_formatter); -} diff --git a/libhw_cr/host_net.c b/libhw_cr/host_net.c index 03cf7db..01f4370 100644 --- a/libhw_cr/host_net.c +++ b/libhw_cr/host_net.c @@ -22,7 +22,7 @@ #include <libmisc/alloc.h> #include <libmisc/assert.h> #include <libmisc/macro.h> -#include <libobj/obj.h> +#include <libmisc/obj.h> #include <libhw/generic/alarmclock.h> diff --git a/libhw_cr/w5500.c b/libhw_cr/w5500.c index 2d6ac48..e676364 100644 --- a/libhw_cr/w5500.c +++ b/libhw_cr/w5500.c @@ -124,7 +124,7 @@ static const char *w5500_state_str(uint8_t state) { } } -/* libobj *********************************************************************/ +/* libmisc/obj.h **************************************************************/ LO_IMPLEMENTATION_C(io_closer, struct _w5500_socket, w5500_tcplist, static); LO_IMPLEMENTATION_C(net_stream_listener, struct _w5500_socket, w5500_tcplist, static); diff --git a/libhw_generic/CMakeLists.txt b/libhw_generic/CMakeLists.txt index 603f30b..602168b 100644 --- a/libhw_generic/CMakeLists.txt +++ b/libhw_generic/CMakeLists.txt @@ -7,7 +7,6 @@ add_library(libhw_generic INTERFACE) target_include_directories(libhw_generic PUBLIC INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) target_link_libraries(libhw_generic INTERFACE libmisc - libobj ) target_sources(libhw_generic INTERFACE diff --git a/libhw_generic/include/libhw/generic/alarmclock.h b/libhw_generic/include/libhw/generic/alarmclock.h index 39050c9..6ce2513 100644 --- a/libhw_generic/include/libhw/generic/alarmclock.h +++ b/libhw_generic/include/libhw/generic/alarmclock.h @@ -9,8 +9,8 @@ #include <stdint.h> /* for uint{n}_t and UINT{n}_C */ +#include <libmisc/obj.h> #include <libmisc/private.h> -#include <libobj/obj.h> /* Useful constants ***********************************************************/ diff --git a/libhw_generic/include/libhw/generic/io.h b/libhw_generic/include/libhw/generic/io.h index 62ddbb3..6adce8c 100644 --- a/libhw_generic/include/libhw/generic/io.h +++ b/libhw_generic/include/libhw/generic/io.h @@ -11,7 +11,7 @@ #include <stdint.h> /* for uintptr_t */ #include <sys/types.h> /* for ssize_t */ -#include <libobj/obj.h> +#include <libmisc/obj.h> /* structs ********************************************************************/ diff --git a/libmisc/CMakeLists.txt b/libmisc/CMakeLists.txt index 1bce759..8c9fa57 100644 --- a/libmisc/CMakeLists.txt +++ b/libmisc/CMakeLists.txt @@ -20,5 +20,7 @@ add_lib_test(libmisc test_hash) add_lib_test(libmisc test_log) add_lib_test(libmisc test_macro) add_lib_test(libmisc test_map) +add_lib_test(libmisc test_obj) +add_lib_test(libmisc test_obj_nest) add_lib_test(libmisc test_private) add_lib_test(libmisc test_rand) diff --git a/libobj/include/libobj/obj.h b/libmisc/include/libmisc/obj.h index 06b7298..76dde91 100644 --- a/libobj/include/libobj/obj.h +++ b/libmisc/include/libmisc/obj.h @@ -1,11 +1,11 @@ -/* libobj/obj.h - A simple Go-ish object system +/* libmisc/obj.h - A simple Go-ish object system * * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com> * SPDX-License-Identifier: AGPL-3.0-or-later */ -#ifndef _LIBOBJ_OBJ_H_ -#define _LIBOBJ_OBJ_H_ +#ifndef _LIBMISC_OBJ_H_ +#define _LIBMISC_OBJ_H_ #include <libmisc/macro.h> @@ -65,7 +65,7 @@ #define _LO_IFACE_VTABLE3_lo_func(_ARG_ret_type, _ARG_func_name, ...) _ARG_ret_type (*_ARG_func_name)(void * __VA_OPT__(,) __VA_ARGS__); #define _LO_IFACE_VTABLE4(_tuple_typ, ...) _LO_IFACE_VTABLE4_##_tuple_typ(__VA_ARGS__) -#define _LO_IFACE_VTABLE4_lo_nest(_ARG_child_iface_name) static_assert(0, "BUG: libobj cannot nest interfaces more than 4 deep"); +#define _LO_IFACE_VTABLE4_lo_nest(_ARG_child_iface_name) static_assert(0, "BUG: libmisc/obj.h cannot nest interfaces more than 4 deep"); #define _LO_IFACE_VTABLE4_lo_func(_ARG_ret_type, _ARG_func_name, ...) _ARG_ret_type (*_ARG_func_name)(void * __VA_OPT__(,) __VA_ARGS__); #define _LO_IFACE_PROTO(_ARG_iface_name, _tuple_typ, ...) _LO_IFACE_PROTO_##_tuple_typ(_ARG_iface_name, __VA_ARGS__) @@ -166,8 +166,8 @@ #define _LO_IMPL_VTABLE3_lo_func(_ARG_impl_name, _ARG_ret_type, _ARG_func_name, ...) ._ARG_func_name = (void*)_ARG_impl_name##_##_ARG_func_name, #define _LO_IMPL_VTABLE4(_ARG_impl_name, _tuple_typ, ...) _LO_IMPL_VTABLE4_##_tuple_typ(_ARG_impl_name, __VA_ARGS__) -#define _LO_IMPL_VTABLE4_lo_nest(_ARG_impl_name, _ARG_child_iface_name) static_assert(0, "BUG: libobj cannot nest interfaces more than 4 deep"); +#define _LO_IMPL_VTABLE4_lo_nest(_ARG_impl_name, _ARG_child_iface_name) static_assert(0, "BUG: libmisc/obj.h cannot nest interfaces more than 4 deep"); #define _LO_IMPL_VTABLE4_lo_func(_ARG_impl_name, _ARG_ret_type, _ARG_func_name, ...) ._ARG_func_name = (void*)_ARG_impl_name##_##_ARG_func_name, -#endif /* _LIBOBJ_OBJ_H_ */ +#endif /* _LIBMISC_OBJ_H_ */ diff --git a/libobj/tests/test_obj.c b/libmisc/tests/test_obj.c index d6861dc..687ad4e 100644 --- a/libobj/tests/test_obj.c +++ b/libmisc/tests/test_obj.c @@ -1,10 +1,10 @@ -/* libobj/tests/test_obj.c - Tests for <libobj/obj.h> +/* libmisc/tests/test_obj.c - Tests for <libmisc/obj.h> * * Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com> * SPDX-License-Identifier: AGPL-3.0-or-later */ -#include <libobj/obj.h> +#include <libmisc/obj.h> #include "test.h" diff --git a/libobj/tests/test_nest.c b/libmisc/tests/test_obj_nest.c index f18b018..bb9d6de 100644 --- a/libobj/tests/test_nest.c +++ b/libmisc/tests/test_obj_nest.c @@ -1,4 +1,4 @@ -/* libobj/tests/test_nest.c - Tests for <libobj/obj.h> +/* libmisc/tests/test_obj_nest.c - Tests for <libmisc/obj.h> nesting * * Copyright (C) 2025 Luke T. Shumaker <lukeshu@lukeshu.com> * SPDX-License-Identifier: AGPL-3.0-or-later @@ -6,7 +6,7 @@ #include <string.h> /* for memcpy() */ -#include <libobj/obj.h> +#include <libmisc/obj.h> #include "test.h" diff --git a/libobj/CMakeLists.txt b/libobj/CMakeLists.txt deleted file mode 100644 index f452e8a..0000000 --- a/libobj/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -# libobj/CMakeLists.txt - A simple Go-ish object system built on GCC -fplan9-extensions -# -# Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com> -# SPDX-License-Identifier: AGPL-3.0-or-later - -add_library(libobj INTERFACE) -target_include_directories(libobj PUBLIC INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_link_libraries(libobj INTERFACE - libmisc -) - -add_lib_test(libobj test_obj) -add_lib_test(libobj test_nest) diff --git a/libobj/tests/test.h b/libobj/tests/test.h deleted file mode 120000 index 2fb1bd5..0000000 --- a/libobj/tests/test.h +++ /dev/null @@ -1 +0,0 @@ -../../libmisc/tests/test.h
\ No newline at end of file |