edtlib: always insert root node to the graph
When we have an empty Devicetree, ie,
```
/dts-v1/;
/ {
};
```
The node's dep_ordinal is never initialized because the node graph is
empty. This ends up with invalid ordinal tokens (-1) in
devicetree_generated.h which in turn produce some cryptic compiler
errors, see e.g.
```
error: pasting "dts_ord_" and "-" does not give a valid preprocessing
token
95 | #define Z_DEVICE_DT_DEV_ID(node_id) _CONCAT(dts_ord_,
DT_DEP_ORD(node_id))
...
include/zephyr/devicetree.h:2498:41:
note: in expansion of macro 'DT_FOREACH_OKAY_HELPER'
2498 | #define DT_FOREACH_STATUS_OKAY_NODE(fn)
DT_FOREACH_OKAY_HELPER(fn)
|
^~~~~~~~~~~~~~~~~~~~~~
include/zephyr/device.h:1022:1:
note: in expansion of macro 'DT_FOREACH_STATUS_OKAY_NODE'
1022 |
DT_FOREACH_STATUS_OKAY_NODE(Z_MAYBE_DEVICE_DECLARE_INTERNAL)
```
(devicetree_generated.h)
```
...
#define DT_N_ORD -1
#define DT_N_ORD_STR_SORTABLE 000-1
...
```
This patch makes sure root node is always inserted (without any target)
so that it gets initialized later.
Discovered as part of
https://github.com/zephyrproject-rtos/zephyr/pull/63696
Signed-off-by: Gerard Marull-Paretas <gerard@teslabs.com>
diff --git a/scripts/dts/python-devicetree/src/devicetree/edtlib.py b/scripts/dts/python-devicetree/src/devicetree/edtlib.py
index b52a516..0eb8dd8 100644
--- a/scripts/dts/python-devicetree/src/devicetree/edtlib.py
+++ b/scripts/dts/python-devicetree/src/devicetree/edtlib.py
@@ -2061,6 +2061,10 @@
# first time the scc_order property is read.
for node in self.nodes:
+ # Always insert root node
+ if not node.parent:
+ self._graph.add_node(node)
+
# A Node always depends on its parent.
for child in node.children.values():
self._graph.add_edge(child, node)
diff --git a/scripts/dts/python-devicetree/src/devicetree/grutils.py b/scripts/dts/python-devicetree/src/devicetree/grutils.py
index c3ce825..452ee4a 100644
--- a/scripts/dts/python-devicetree/src/devicetree/grutils.py
+++ b/scripts/dts/python-devicetree/src/devicetree/grutils.py
@@ -26,6 +26,12 @@
self.__reverse_map = collections.defaultdict(set)
self.__nodes = set()
+ def add_node(self, node):
+ """
+ Add a node without any target to the graph.
+ """
+ self.__nodes.add(node)
+
def add_edge(self, source, target):
"""
Add a directed edge from the C{source} to the C{target}.