On Mon, Sep 24, 2018 at 01:27:27PM +0200, Fredrik Markstrom wrote: > This change makes sure that nodes with target label references doesn't > create additional fragments if the label can been resolved > locally. Target path references are not resolved locally and will > generate a fragment. > > Previously the dts below would generate two fragments: > > /dts-v1/; > /plugin/; > &x { a: a@0 {};}; > &a { b {}; }; > > This commit essentially reverts part of the commit "Correct overlay > syntactic sugar for generating target-path fragments". The main reason > we want to do this is that it breaks consumers of dtbo:s that can't > resolve references between fragments in the same dtbo (like the linux > 4.1 kernel). In addition creating a fragment for each label reference > substantially increases the size of the resulting dtbo for some use > cases. > > Signed-off-by: Fredrik Markstrom <fredrik.markstrom@xxxxxxxxx> > --- > > Version 1 and 2 of this patch was known as "dtc: Merge nodes with > label references if possible in plugins" v3 has updates requested by > David Gibson and a more elaborate commit message. Applied. It would be nice to have a testcase to check this behaviour as a follow up, of course. > > dtc-lexer.l | 4 ++-- > dtc-parser.y | 39 +++++++++++++++++++++++++++++++-------- > 2 files changed, 33 insertions(+), 10 deletions(-) > > diff --git a/dtc-lexer.l b/dtc-lexer.l > index 615b7ec..06c0409 100644 > --- a/dtc-lexer.l > +++ b/dtc-lexer.l > @@ -213,14 +213,14 @@ static void PRINTF(1, 2) lexical_error(const char *fmt, ...); > <*>\&{LABEL} { /* label reference */ > DPRINT("Ref: %s\n", yytext+1); > yylval.labelref = xstrdup(yytext+1); > - return DT_REF; > + return DT_LABEL_REF; > } > > <*>"&{/"{PATHCHAR}*\} { /* new-style path reference */ > yytext[yyleng-1] = '\0'; > DPRINT("Ref: %s\n", yytext+2); > yylval.labelref = xstrdup(yytext+2); > - return DT_REF; > + return DT_PATH_REF; > } > > <BYTESTRING>[0-9a-fA-F]{2} { > diff --git a/dtc-parser.y b/dtc-parser.y > index dd70ebf..deda663 100644 > --- a/dtc-parser.y > +++ b/dtc-parser.y > @@ -70,7 +70,8 @@ extern bool treesource_error; > %token <byte> DT_BYTE > %token <data> DT_STRING > %token <labelref> DT_LABEL > -%token <labelref> DT_REF > +%token <labelref> DT_LABEL_REF > +%token <labelref> DT_PATH_REF > %token DT_INCBIN > > %type <data> propdata > @@ -83,6 +84,7 @@ extern bool treesource_error; > %type <data> bytestring > %type <prop> propdef > %type <proplist> proplist > +%type <labelref> dt_ref > > %type <node> devicetree > %type <node> nodedef > @@ -158,6 +160,8 @@ memreserve: > } > ; > > +dt_ref: DT_LABEL_REF | DT_PATH_REF; > + > devicetree: > '/' nodedef > { > @@ -167,7 +171,7 @@ devicetree: > { > $$ = merge_nodes($1, $3); > } > - | DT_REF nodedef > + | dt_ref nodedef > { > /* > * We rely on the rule being always: > @@ -178,7 +182,7 @@ devicetree: > ERROR(&@2, "Label or path %s not found", $1); > $$ = add_orphan_node(name_node(build_node(NULL, NULL), ""), $2, $1); > } > - | devicetree DT_LABEL DT_REF nodedef > + | devicetree DT_LABEL dt_ref nodedef > { > struct node *target = get_node_by_ref($1, $3); > > @@ -189,7 +193,7 @@ devicetree: > ERROR(&@3, "Label or path %s not found", $3); > $$ = $1; > } > - | devicetree DT_REF nodedef > + | devicetree DT_PATH_REF nodedef > { > /* > * We rely on the rule being always: > @@ -208,7 +212,26 @@ devicetree: > } > $$ = $1; > } > - | devicetree DT_DEL_NODE DT_REF ';' > + | devicetree DT_LABEL_REF nodedef > + { > + struct node *target = get_node_by_ref($1, $2); > + > + 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) > + add_orphan_node($1, $3, $2); > + else > + ERROR(&@2, "Label or path %s not found", $2); > + } > + $$ = $1; > + } > + | devicetree DT_DEL_NODE dt_ref ';' > { > struct node *target = get_node_by_ref($1, $3); > > @@ -220,7 +243,7 @@ devicetree: > > $$ = $1; > } > - | devicetree DT_OMIT_NO_REF DT_REF ';' > + | devicetree DT_OMIT_NO_REF dt_ref ';' > { > struct node *target = get_node_by_ref($1, $3); > > @@ -285,7 +308,7 @@ propdata: > { > $$ = data_merge($1, $3); > } > - | propdataprefix DT_REF > + | propdataprefix dt_ref > { > $1 = data_add_marker($1, TYPE_STRING, $2); > $$ = data_add_marker($1, REF_PATH, $2); > @@ -383,7 +406,7 @@ arrayprefix: > > $$.data = data_append_integer($1.data, $2, $1.bits); > } > - | arrayprefix DT_REF > + | arrayprefix dt_ref > { > uint64_t val = ~0ULL >> (64 - $1.bits); > -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature