[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260112142009.1006236-33-herve.codina@bootlin.com>
Date: Mon, 12 Jan 2026 15:19:22 +0100
From: Herve Codina <herve.codina@...tlin.com>
To: David Gibson <david@...son.dropbear.id.au>,
Rob Herring <robh@...nel.org>,
Krzysztof Kozlowski <krzk@...nel.org>,
Conor Dooley <conor+dt@...nel.org>
Cc: Ayush Singh <ayush@...gleboard.org>,
Geert Uytterhoeven <geert@...ux-m68k.org>,
devicetree-compiler@...r.kernel.org,
devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org,
devicetree-spec@...r.kernel.org,
Hui Pu <hui.pu@...ealthcare.com>,
Ian Ray <ian.ray@...ealthcare.com>,
Luca Ceresoli <luca.ceresoli@...tlin.com>,
Thomas Petazzoni <thomas.petazzoni@...tlin.com>,
Herve Codina <herve.codina@...tlin.com>
Subject: [RFC PATCH 32/77] dtc-parser: Introduce last_header_flags
The parser needs to get header flags value in different places.
It relies on the fact that the rule used to parse the dts file is always
headers memreserves devicetree
With that only rule to parse the file, it uses '$<flags>-1' construct to
get the flags value.
With the future introduction of import symbols parsing, this rule will
change and the parser couldn't rely anymore on '$<flags>-1' to get flags
value. Indeed, import symbols parsing will add a new optional symbol in
this rule leading to two possible rules (with and without the new
symbol) to parse the source file.
Introduce the last_header_flags variable to explicitly keep track of
flags while also being agnostic of the rule structure and use this new
variable instead of '$<flags>-1'.
Signed-off-by: Herve Codina <herve.codina@...tlin.com>
---
dtc-parser.y | 28 +++++++++-------------------
1 file changed, 9 insertions(+), 19 deletions(-)
diff --git a/dtc-parser.y b/dtc-parser.y
index 4e46e9d..48c40e8 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -24,6 +24,8 @@ extern void yyerror(char const *s);
extern struct dt_info *parser_output;
extern bool treesource_error;
+unsigned int last_header_flags;
+
static bool is_ref_relative(const char *ref)
{
return ref[0] != '/' && strchr(&ref[1], '/');
@@ -122,14 +124,17 @@ header:
DT_V1 ';'
{
$$ = DTSF_V1;
+ last_header_flags = $$;
}
| DT_V1 ';' DT_PLUGIN ';'
{
$$ = DTSF_V1 | DTSF_PLUGIN;
+ last_header_flags = $$;
}
| DT_V1 ';' DT_ADDON ';'
{
$$ = DTSF_V1 | DTSF_ADDON;
+ last_header_flags = $$;
}
;
@@ -179,12 +184,7 @@ devicetree:
}
| dt_ref nodedef
{
- /*
- * We rely on the rule being always:
- * versioninfo plugindecl memreserves devicetree
- * so $-1 is what we want (plugindecl)
- */
- if (!($<flags>-1 & DTSF_PLUGIN))
+ if (!(last_header_flags & DTSF_PLUGIN))
ERROR(&@2, "Label or path %s not found", $1);
else if (is_ref_relative($1))
ERROR(&@2, "Label-relative reference %s not supported in plugin", $1);
@@ -197,7 +197,7 @@ devicetree:
{
struct node *target = get_node_by_ref($1, $3);
- if (($<flags>-1 & DTSF_PLUGIN) && is_ref_relative($3))
+ if ((last_header_flags & DTSF_PLUGIN) && is_ref_relative($3))
ERROR(&@2, "Label-relative reference %s not supported in plugin", $3);
if (target) {
@@ -209,12 +209,7 @@ devicetree:
}
| devicetree DT_PATH_REF nodedef
{
- /*
- * We rely on the rule being always:
- * versioninfo plugindecl memreserves devicetree
- * so $-1 is what we want (plugindecl)
- */
- if ($<flags>-1 & DTSF_PLUGIN) {
+ if (last_header_flags & DTSF_PLUGIN) {
if (is_ref_relative($2))
ERROR(&@2, "Label-relative reference %s not supported in plugin", $2);
add_orphan_node($1, $3, $2);
@@ -235,12 +230,7 @@ devicetree:
if (target) {
merge_nodes(target, $3);
} else {
- /*
- * We rely on the rule being always:
- * versioninfo plugindecl memreserves devicetree
- * so $-1 is what we want (plugindecl)
- */
- if ($<flags>-1 & DTSF_PLUGIN)
+ if (last_header_flags & DTSF_PLUGIN)
add_orphan_node($1, $3, $2);
else
ERROR(&@2, "Label or path %s not found", $2);
--
2.52.0
Powered by blists - more mailing lists