Skip to content

Commit 9b5083b

Browse files
gmarullhenrikbrixandersen
authored andcommitted
init: drop anonymous union
It just complicates things. It is not C99 strandard, and since C11 is not mandatory, it is better to play safe here. Signed-off-by: Gerard Marull-Paretas <[email protected]>
1 parent 1cfec8c commit 9b5083b

File tree

4 files changed

+26
-36
lines changed

4 files changed

+26
-36
lines changed

include/zephyr/device.h

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,33 +1152,23 @@ device_get_dt_nodelabels(const struct device *dev)
11521152
static const Z_DECL_ALIGN(struct init_entry) __used __noasan Z_INIT_ENTRY_SECTION( \
11531153
level, prio, Z_DEVICE_INIT_SUB_PRIO(node_id)) \
11541154
Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = { \
1155-
.init_fn = {COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (.dev_rw), (.dev)) = \
1156-
(init_fn_)}, \
1157-
Z_DEVICE_INIT_ENTRY_DEV(node_id, dev_id), \
1158-
}
1155+
COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), \
1156+
(.init_fn = { .dev_rw = init_fn_ }, \
1157+
.dev = { .dev_rw = &DEVICE_NAME_GET(dev_id)}), \
1158+
(.init_fn = { .dev = init_fn_ }, \
1159+
.dev = { .dev = &DEVICE_NAME_GET(dev_id)})) \
1160+
}
11591161

11601162
#define Z_DEFER_DEVICE_INIT_ENTRY_DEFINE(node_id, dev_id, init_fn_) \
11611163
static const Z_DECL_ALIGN(struct init_entry) __used __noasan \
11621164
__attribute__((__section__(".z_deferred_init"))) \
11631165
Z_INIT_ENTRY_NAME(DEVICE_NAME_GET(dev_id)) = { \
1164-
.init_fn = {COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (.dev_rw), (.dev)) = \
1165-
(init_fn_)}, \
1166-
Z_DEVICE_INIT_ENTRY_DEV(node_id, dev_id), \
1167-
}
1168-
1169-
/*
1170-
* Anonymous unions require C11. Some pre-C11 gcc versions have early support for anonymous
1171-
* unions but they require these braces when combined with C99 designated initializers. For
1172-
* more details see https://docs.zephyrproject.org/latest/develop/languages/cpp/
1173-
*/
1174-
#if defined(__STDC_VERSION__) && (__STDC_VERSION__) < 201100
1175-
# define Z_DEVICE_INIT_ENTRY_DEV(node_id, dev_id) { Z_DEV_ENTRY_DEV(node_id, dev_id) }
1176-
#else
1177-
# define Z_DEVICE_INIT_ENTRY_DEV(node_id, dev_id) Z_DEV_ENTRY_DEV(node_id, dev_id)
1178-
#endif
1179-
1180-
#define Z_DEV_ENTRY_DEV(node_id, dev_id) \
1181-
COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), (.dev_rw), (.dev)) = &DEVICE_NAME_GET(dev_id)
1166+
COND_CODE_1(Z_DEVICE_IS_MUTABLE(node_id), \
1167+
(.init_fn = { .dev_rw = init_fn_ }, \
1168+
.dev = { .dev_rw = &DEVICE_NAME_GET(dev_id)}), \
1169+
(.init_fn = { .dev = init_fn_ }, \
1170+
.dev = { .dev = &DEVICE_NAME_GET(dev_id)})) \
1171+
}
11821172

11831173
/**
11841174
* @brief Define a @ref device and all other required objects.

include/zephyr/init.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ struct init_entry {
112112
#ifdef CONFIG_DEVICE_MUTABLE
113113
struct device *dev_rw;
114114
#endif
115-
};
115+
} dev;
116116
};
117117

118118
/** @cond INTERNAL_HIDDEN */

kernel/init.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ bool z_sys_post_kernel;
304304

305305
static int do_device_init(const struct init_entry *entry)
306306
{
307-
const struct device *dev = entry->dev;
307+
const struct device *dev = entry->dev.dev;
308308
int rc = 0;
309309

310310
if (entry->init_fn.dev != NULL) {
@@ -361,7 +361,7 @@ static void z_sys_init_run_level(enum init_level level)
361361
const struct init_entry *entry;
362362

363363
for (entry = levels[level]; entry < levels[level+1]; entry++) {
364-
const struct device *dev = entry->dev;
364+
const struct device *dev = entry->dev.dev;
365365
int result;
366366

367367
sys_trace_sys_init_enter(entry, level);
@@ -382,7 +382,7 @@ int z_impl_device_init(const struct device *dev)
382382
}
383383

384384
STRUCT_SECTION_FOREACH_ALTERNATE(_deferred_init, init_entry, entry) {
385-
if (entry->dev == dev) {
385+
if (entry->dev.dev == dev) {
386386
return do_device_init(entry);
387387
}
388388
}

tests/lib/devicetree/devices/src/main.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,25 +64,25 @@ DEVICE_DT_DEFINE(TEST_NOLABEL, dev_init, NULL,
6464
ZTEST(devicetree_devices, test_init_get)
6565
{
6666
/* Check device pointers */
67-
zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIO)->dev,
67+
zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIO)->dev.dev,
6868
DEVICE_DT_GET(TEST_GPIO), NULL);
69-
zassert_equal(DEVICE_INIT_DT_GET(TEST_I2C)->dev,
69+
zassert_equal(DEVICE_INIT_DT_GET(TEST_I2C)->dev.dev,
7070
DEVICE_DT_GET(TEST_I2C), NULL);
71-
zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVA)->dev,
71+
zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVA)->dev.dev,
7272
DEVICE_DT_GET(TEST_DEVA), NULL);
73-
zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVB)->dev,
73+
zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVB)->dev.dev,
7474
DEVICE_DT_GET(TEST_DEVB), NULL);
75-
zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIOX)->dev,
75+
zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIOX)->dev.dev,
7676
DEVICE_DT_GET(TEST_GPIOX), NULL);
77-
zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVC)->dev,
77+
zassert_equal(DEVICE_INIT_DT_GET(TEST_DEVC)->dev.dev,
7878
DEVICE_DT_GET(TEST_DEVC), NULL);
79-
zassert_equal(DEVICE_INIT_DT_GET(TEST_PARTITION)->dev,
79+
zassert_equal(DEVICE_INIT_DT_GET(TEST_PARTITION)->dev.dev,
8080
DEVICE_DT_GET(TEST_PARTITION), NULL);
81-
zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIO_INJECTED)->dev,
81+
zassert_equal(DEVICE_INIT_DT_GET(TEST_GPIO_INJECTED)->dev.dev,
8282
DEVICE_DT_GET(TEST_GPIO_INJECTED), NULL);
83-
zassert_equal(DEVICE_INIT_GET(manual_dev)->dev,
83+
zassert_equal(DEVICE_INIT_GET(manual_dev)->dev.dev,
8484
DEVICE_GET(manual_dev), NULL);
85-
zassert_equal(DEVICE_INIT_DT_GET(TEST_NOLABEL)->dev,
85+
zassert_equal(DEVICE_INIT_DT_GET(TEST_NOLABEL)->dev.dev,
8686
DEVICE_DT_GET(TEST_NOLABEL), NULL);
8787

8888
/* Check init functions */

0 commit comments

Comments
 (0)