linker generated list: provide an iterator to simplify list access

Given that the section name and boundary simbols can be inferred from
the struct object name, it makes sense to create an iterator that
abstracts away the access details and reduce the possibility for
mistakes.

Signed-off-by: Nicolas Pitre <npitre@baylibre.com>
diff --git a/kernel/mailbox.c b/kernel/mailbox.c
index 3668025..22190f8 100644
--- a/kernel/mailbox.c
+++ b/kernel/mailbox.c
@@ -43,9 +43,6 @@
 
 #endif /* CONFIG_NUM_MBOX_ASYNC_MSGS > 0 */
 
-extern struct k_mbox _k_mbox_list_start[];
-extern struct k_mbox _k_mbox_list_end[];
-
 #ifdef CONFIG_OBJECT_TRACING
 struct k_mbox *_trace_list_k_mbox;
 #endif	/* CONFIG_OBJECT_TRACING */
@@ -87,9 +84,7 @@
 	/* Complete initialization of statically defined mailboxes. */
 
 #ifdef CONFIG_OBJECT_TRACING
-	struct k_mbox *mbox;
-
-	for (mbox = _k_mbox_list_start; mbox < _k_mbox_list_end; mbox++) {
+	Z_STRUCT_SECTION_FOREACH(k_mbox, mbox) {
 		SYS_TRACING_OBJ_INIT(k_mbox, mbox);
 	}
 #endif /* CONFIG_OBJECT_TRACING */
diff --git a/kernel/mem_slab.c b/kernel/mem_slab.c
index b78aef0..8efcd15 100644
--- a/kernel/mem_slab.c
+++ b/kernel/mem_slab.c
@@ -14,9 +14,6 @@
 #include <ksched.h>
 #include <init.h>
 
-extern struct k_mem_slab _k_mem_slab_list_start[];
-extern struct k_mem_slab _k_mem_slab_list_end[];
-
 static struct k_spinlock lock;
 
 #ifdef CONFIG_OBJECT_TRACING
@@ -57,11 +54,7 @@
 {
 	ARG_UNUSED(dev);
 
-	struct k_mem_slab *slab;
-
-	for (slab = _k_mem_slab_list_start;
-	     slab < _k_mem_slab_list_end;
-	     slab++) {
+	Z_STRUCT_SECTION_FOREACH(k_mem_slab, slab) {
 		create_free_list(slab);
 		SYS_TRACING_OBJ_INIT(k_mem_slab, slab);
 		z_object_init(slab);
diff --git a/kernel/mempool.c b/kernel/mempool.c
index f124447..83ac347 100644
--- a/kernel/mempool.c
+++ b/kernel/mempool.c
@@ -13,19 +13,17 @@
 #include <misc/math_extras.h>
 #include <stdbool.h>
 
-/* Linker-defined symbols bound the static pool structs */
-extern struct k_mem_pool _k_mem_pool_list_start[];
-extern struct k_mem_pool _k_mem_pool_list_end[];
-
 static struct k_spinlock lock;
 
 static struct k_mem_pool *get_pool(int id)
 {
+	extern struct k_mem_pool _k_mem_pool_list_start[];
 	return &_k_mem_pool_list_start[id];
 }
 
 static int pool_id(struct k_mem_pool *pool)
 {
+	extern struct k_mem_pool _k_mem_pool_list_start[];
 	return pool - &_k_mem_pool_list_start[0];
 }
 
@@ -38,9 +36,8 @@
 int init_static_pools(struct device *unused)
 {
 	ARG_UNUSED(unused);
-	struct k_mem_pool *p;
 
-	for (p = _k_mem_pool_list_start; p < _k_mem_pool_list_end; p++) {
+	Z_STRUCT_SECTION_FOREACH(k_mem_pool, p) {
 		k_mem_pool_init(p);
 	}
 
diff --git a/kernel/msg_q.c b/kernel/msg_q.c
index 1ab3fdc..adf7dac 100644
--- a/kernel/msg_q.c
+++ b/kernel/msg_q.c
@@ -23,9 +23,6 @@
 #include <syscall_handler.h>
 #include <kernel_internal.h>
 
-extern struct k_msgq _k_msgq_list_start[];
-extern struct k_msgq _k_msgq_list_end[];
-
 #ifdef CONFIG_OBJECT_TRACING
 
 struct k_msgq *_trace_list_k_msgq;
@@ -37,9 +34,7 @@
 {
 	ARG_UNUSED(dev);
 
-	struct k_msgq *msgq;
-
-	for (msgq = _k_msgq_list_start; msgq < _k_msgq_list_end; msgq++) {
+	Z_STRUCT_SECTION_FOREACH(k_msgq, msgq) {
 		SYS_TRACING_OBJ_INIT(k_msgq, msgq);
 	}
 	return 0;
diff --git a/kernel/mutex.c b/kernel/mutex.c
index c6225b6..d514215 100644
--- a/kernel/mutex.c
+++ b/kernel/mutex.c
@@ -38,9 +38,6 @@
 #include <syscall_handler.h>
 #include <tracing.h>
 
-extern struct k_mutex _k_mutex_list_start[];
-extern struct k_mutex _k_mutex_list_end[];
-
 /* We use a global spinlock here because some of the synchronization
  * is protecting things like owner thread priorities which aren't
  * "part of" a single k_mutex.  Should move those bits of the API
@@ -59,9 +56,7 @@
 {
 	ARG_UNUSED(dev);
 
-	struct k_mutex *mutex;
-
-	for (mutex = _k_mutex_list_start; mutex < _k_mutex_list_end; mutex++) {
+	Z_STRUCT_SECTION_FOREACH(k_mutex, mutex) {
 		SYS_TRACING_OBJ_INIT(k_mutex, mutex);
 	}
 	return 0;
diff --git a/kernel/pipes.c b/kernel/pipes.c
index e882fdc..b61d61e 100644
--- a/kernel/pipes.c
+++ b/kernel/pipes.c
@@ -37,9 +37,6 @@
 	struct k_pipe_desc  desc;     /* Pipe message descriptor */
 };
 
-extern struct k_pipe _k_pipe_list_start[];
-extern struct k_pipe _k_pipe_list_end[];
-
 #ifdef CONFIG_OBJECT_TRACING
 struct k_pipe *_trace_list_k_pipe;
 #endif	/* CONFIG_OBJECT_TRACING */
@@ -118,9 +115,7 @@
 	/* Complete initialization of statically defined mailboxes. */
 
 #ifdef CONFIG_OBJECT_TRACING
-	struct k_pipe *pipe;
-
-	for (pipe = _k_pipe_list_start; pipe < _k_pipe_list_end; pipe++) {
+	Z_STRUCT_SECTION_FOREACH(k_pipe, pipe) {
 		SYS_TRACING_OBJ_INIT(k_pipe, pipe);
 	}
 #endif /* CONFIG_OBJECT_TRACING */
diff --git a/kernel/queue.c b/kernel/queue.c
index 77262f3..0288081 100644
--- a/kernel/queue.c
+++ b/kernel/queue.c
@@ -23,9 +23,6 @@
 #include <syscall_handler.h>
 #include <kernel_internal.h>
 
-extern struct k_queue _k_queue_list_start[];
-extern struct k_queue _k_queue_list_end[];
-
 struct alloc_node {
 	sys_sfnode_t node;
 	void *data;
@@ -70,9 +67,7 @@
 {
 	ARG_UNUSED(dev);
 
-	struct k_queue *queue;
-
-	for (queue = _k_queue_list_start; queue < _k_queue_list_end; queue++) {
+	Z_STRUCT_SECTION_FOREACH(k_queue, queue) {
 		SYS_TRACING_OBJ_INIT(k_queue, queue);
 	}
 	return 0;
diff --git a/kernel/sem.c b/kernel/sem.c
index e06d4ef..f6f5bb9 100644
--- a/kernel/sem.c
+++ b/kernel/sem.c
@@ -29,9 +29,6 @@
 #include <syscall_handler.h>
 #include <tracing.h>
 
-extern struct k_sem _k_sem_list_start[];
-extern struct k_sem _k_sem_list_end[];
-
 /* We use a system-wide lock to synchronize semaphores, which has
  * unfortunate performance impact vs. using a per-object lock
  * (semaphores are *very* widely used).  But per-object locks require
@@ -52,9 +49,7 @@
 {
 	ARG_UNUSED(dev);
 
-	struct k_sem *sem;
-
-	for (sem = _k_sem_list_start; sem < _k_sem_list_end; sem++) {
+	Z_STRUCT_SECTION_FOREACH(k_sem, sem) {
 		SYS_TRACING_OBJ_INIT(k_sem, sem);
 	}
 	return 0;
diff --git a/kernel/stack.c b/kernel/stack.c
index dea08ba..9050eaf 100644
--- a/kernel/stack.c
+++ b/kernel/stack.c
@@ -20,9 +20,6 @@
 #include <syscall_handler.h>
 #include <kernel_internal.h>
 
-extern struct k_stack _k_stack_list_start[];
-extern struct k_stack _k_stack_list_end[];
-
 #ifdef CONFIG_OBJECT_TRACING
 
 struct k_stack *_trace_list_k_stack;
@@ -34,9 +31,7 @@
 {
 	ARG_UNUSED(dev);
 
-	struct k_stack *stack;
-
-	for (stack = _k_stack_list_start; stack < _k_stack_list_end; stack++) {
+	Z_STRUCT_SECTION_FOREACH(k_stack, stack) {
 		SYS_TRACING_OBJ_INIT(k_stack, stack);
 	}
 	return 0;
diff --git a/kernel/thread.c b/kernel/thread.c
index 9a0ac2e..de40fa7 100644
--- a/kernel/thread.c
+++ b/kernel/thread.c
@@ -32,16 +32,10 @@
 #include <tracing.h>
 #include <stdbool.h>
 
-extern struct _static_thread_data _static_thread_data_list_start[];
-extern struct _static_thread_data _static_thread_data_list_end[];
-
 static struct k_spinlock lock;
 
 #define _FOREACH_STATIC_THREAD(thread_data)              \
-	for (struct _static_thread_data *thread_data =   \
-	     _static_thread_data_list_start;             \
-	     thread_data < _static_thread_data_list_end; \
-	     thread_data++)
+	Z_STRUCT_SECTION_FOREACH(_static_thread_data, thread_data)
 
 void k_thread_foreach(k_thread_user_cb_t user_cb, void *user_data)
 {
@@ -614,16 +608,10 @@
 
 #ifdef CONFIG_MULTITHREADING
 #ifdef CONFIG_USERSPACE
-extern char __object_access_start[];
-extern char __object_access_end[];
 
 static void grant_static_access(void)
 {
-	struct _k_object_assignment *pos;
-
-	for (pos = (struct _k_object_assignment *)__object_access_start;
-	     pos < (struct _k_object_assignment *)__object_access_end;
-	     pos++) {
+	Z_STRUCT_SECTION_FOREACH(_k_object_assignment, pos) {
 		for (int i = 0; pos->objects[i] != NULL; i++) {
 			k_object_access_grant(pos->objects[i],
 					      pos->thread);
diff --git a/kernel/timer.c b/kernel/timer.c
index 6bf8a54..cbb7968 100644
--- a/kernel/timer.c
+++ b/kernel/timer.c
@@ -12,9 +12,6 @@
 #include <stdbool.h>
 #include <spinlock.h>
 
-extern struct k_timer _k_timer_list_start[];
-extern struct k_timer _k_timer_list_end[];
-
 static struct k_spinlock lock;
 
 #ifdef CONFIG_OBJECT_TRACING
@@ -28,9 +25,7 @@
 {
 	ARG_UNUSED(dev);
 
-	struct k_timer *timer;
-
-	for (timer = _k_timer_list_start; timer < _k_timer_list_end; timer++) {
+	Z_STRUCT_SECTION_FOREACH(k_timer, timer) {
 		SYS_TRACING_OBJ_INIT(k_timer, timer);
 	}
 	return 0;