From f7a951d79bc895eb2171c2570add9f4899794a10 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 4 May 2024 19:55:52 +0200 Subject: Adding upstream version 0.15. Signed-off-by: Daniel Baumann --- iterators.h | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 iterators.h (limited to 'iterators.h') diff --git a/iterators.h b/iterators.h new file mode 100644 index 0000000..8672ccf --- /dev/null +++ b/iterators.h @@ -0,0 +1,126 @@ +/* Various iterators. + + Copyright (C) 2019 SUSE LLC. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, 51 Franklin Street - Fifth Floor, + Boston, MA 02110-1301, USA. */ + + +/* CU iterators. */ + +#define FOREACH_CU(CU) \ + for (CU = first_cu; CU; CU = CU->cu_next) + +#define FOREACH_CU_PU(CU) \ + for (CU = first_cu; CU && CU->cu_kind == CU_PU; CU = CU->cu_next) + +#define FOREACH_CU_NORMAL(CU) \ + for (CU = first_cu; CU && CU->cu_kind != CU_TYPES; CU = CU->cu_next) \ + if (CU->cu_kind == CU_NORMAL) + +#define FOREACH_CU_TYPES(CU) \ + for (CU = first_cu; CU; CU = CU->cu_next) \ + if (CU->cu_kind == CU_TYPES) \ + +/* Function that describes a depth-first traversal path visiting all dies. */ + +static inline dw_die_ref FORCE_INLINE +next_die (dw_die_ref die) +{ + if (die->die_child != NULL) + return die->die_child; + + while (1) + { + if (die->die_sib != NULL) + return die->die_sib; + + if (die->die_root) + return NULL; + + die = die->die_parent; + } +} + +/* Function that describes a depth-first traversal path visiting all toplevel + dies. */ + +static inline dw_die_ref FORCE_INLINE +next_toplevel_die (dw_die_ref die) +{ + if (die->die_child != NULL && die->die_child->die_toplevel) + return die->die_child; + + while (1) + { + if (die->die_sib != NULL && die->die_sib->die_toplevel) + return die->die_sib; + + if (die->die_root) + return NULL; + + die = die->die_parent; + } +} + +/* DIE_IN_CU iterators. */ + +#define FOREACH_DIE_IN_CU(DIE, CU) \ + for (DIE = CU->cu_die; DIE; DIE = next_die (DIE)) + +#define FOREACH_TOPLEVEL_DIE_IN_CU(DIE, CU) \ + for (DIE = CU->cu_die; DIE; DIE = next_toplevel_die (DIE)) + +#define FOREACH_LOW_TOPLEVEL_DIE_IN_CU(DIE, CU) \ + FOREACH_TOPLEVEL_DIE_IN_CU (DIE, CU) \ + if (!(die->die_root || die->die_named_namespace)) + +/* DIE iterators. */ + +#define FOREACH_DIE(CU, DIE) \ + FOREACH_CU (CU) \ + FOREACH_DIE_IN_CU (DIE, CU) + +#define FOREACH_TOPLEVEL_DIE(CU, DIE) \ + FOREACH_CU (CU) \ + FOREACH_TOPLEVEL_DIE_IN_CU (DIE, CU) + +#define FOREACH_LOW_TOPLEVEL_DIE(CU, DIE) \ + FOREACH_CU (CU) \ + FOREACH_LOW_TOPLEVEL_DIE_IN_CU (DIE, CU) + +#define FOREACH_CU_PU_TOPLEVEL_DIE(CU, DIE) \ + FOREACH_CU_PU (CU) \ + FOREACH_TOPLEVEL_DIE_IN_CU (DIE, CU) + +#define FOREACH_CU_NORMAL_TOPLEVEL_DIE(CU, DIE) \ + FOREACH_CU_NORMAL (CU) \ + FOREACH_TOPLEVEL_DIE_IN_CU (DIE, CU) + +#define FOREACH_CU_TYPES_TOPLEVEL_DIE(CU, DIE) \ + FOREACH_CU_TYPES (CU) \ + FOREACH_TOPLEVEL_DIE_IN_CU (DIE, CU) + +#define FOREACH_CU_PU_LOW_TOPLEVEL_DIE(CU, DIE) \ + FOREACH_CU_PU (CU) \ + FOREACH_LOW_TOPLEVEL_DIE_IN_CU (DIE, CU) + +#define FOREACH_CU_NORMAL_LOW_TOPLEVEL_DIE(CU, DIE) \ + FOREACH_CU_NORMAL (CU) \ + FOREACH_LOW_TOPLEVEL_DIE_IN_CU (DIE, CU) + +#define FOREACH_CU_TYPES_LOW_TOPLEVEL_DIE(CU, DIE) \ + FOREACH_CU_TYPES (CU) \ + FOREACH_LOW_TOPLEVEL_DIE_IN_CU (DIE, CU) -- cgit v1.2.3