Re: [PATCH v3] Merge nodes with local target label references

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



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


[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux