[RFC PATCH 32/77] dtc-parser: Introduce last_header_flags
Herve Codina <[email protected]> Mon, 12 Jan 2026 15:19:22 +0100
| Newsgroups | org.kernel.vger.devicetree-spec,org.kernel.vger.devicetree-compiler,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> --- 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