[PATCH v2 11/59] dyndbg: macrofy a 2-index for-loop pattern
Louis Chauvet
louis.chauvet at bootlin.com
Mon Mar 24 15:10:27 UTC 2025
Le 20/03/2025 à 19:51, Jim Cromie a écrit :
> dynamic-debug has several __sections, each with <vecname>,
> num_<vecname>, and it iterates over these with a 2-index for-loop.
> These loops are fiddly with the 2 names.
>
> We have only 2 such loops now, but are getting more soon; lets
> embed/abstract the fiddlyness in the for_subvec() macro, and avoid
> repeating it going forward.
>
> Signed-off-by: Jim Cromie <jim.cromie at gmail.com>
> ---
> lib/dynamic_debug.c | 20 +++++++++++++++++---
> 1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
> index d5572712ce55..94f6c8fd787b 100644
> --- a/lib/dynamic_debug.c
> +++ b/lib/dynamic_debug.c
> @@ -128,6 +128,21 @@ do { \
> #define v3pr_info(fmt, ...) vnpr_info(3, fmt, ##__VA_ARGS__)
> #define v4pr_info(fmt, ...) vnpr_info(4, fmt, ##__VA_ARGS__)
>
> +
> +/*
> + * simplify a repeated for-loop pattern walking N steps in a T _vec
> + * member inside a struct _box. It expects int i and T *_sp to be
> + * declared in the caller.
> + * @_i: caller provided counter.
> + * @_sp: cursor into _vec, to examine each item.
> + * @_box: ptr to a struct containing @_vec member
> + * @_vec: name of a sub-struct member in _box, with array-ref and length
> + */
Nice macro to make the code easier to read!
Reviewed-by: Louis Chauvet <louis.chauvet at bootlin.com>
> +#define for_subvec(_i, _sp, _box, _vec) \
> + for ((_i) = 0, (_sp) = (_box)->_vec; \
> + (_i) < (_box)->num_##_vec; \
> + (_i)++, (_sp)++)
> +
> static void vpr_info_dq(const struct ddebug_query *query, const char *msg)
> {
> /* trim any trailing newlines */
> @@ -156,7 +171,7 @@ static struct ddebug_class_map *ddebug_find_valid_class(struct ddebug_table cons
> struct ddebug_class_map *map;
> int i, idx;
>
> - for (map = dt->classes, i = 0; i < dt->num_classes; i++, map++) {
> + for_subvec(i, map, dt, classes) {
> idx = match_string(map->class_names, map->length, class_string);
> if (idx >= 0) {
> *class_id = idx + map->base;
> @@ -1221,8 +1236,7 @@ static void ddebug_attach_module_classes(struct ddebug_table *dt, struct _ddebug
> * the builtin/modular classmap vector/section. Save the start
> * and length of the subrange at its edges.
> */
> - for (cm = di->classes, i = 0; i < di->num_classes; i++, cm++) {
> -
> + for_subvec(i, cm, di, classes) {
> if (!strcmp(cm->mod_name, dt->mod_name)) {
> if (!nc) {
> v2pr_info("start subrange, class[%d]: module:%s base:%d len:%d ty:%d\n",
--
Louis Chauvet, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
More information about the Intel-gfx-trybot
mailing list