summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFredrik Markstrom <fredrik.markstrom@gmail.com>2018-09-24 13:27:27 +0200
committerDavid Gibson <david@gibson.dropbear.id.au>2018-09-25 12:40:43 +1000
commit0fcffda15e9f4510aa8cd2a495bec66242d1898f (patch)
treea3e2c9b60af927ba8880b38835a21cc3dfc22cc7
parent1e4a0928f3b3b827824222572e551a60935607e3 (diff)
downloaddevice-tree-compiler-0fcffda15e9f4510aa8cd2a495bec66242d1898f.tar.gz
Merge nodes with local target label references
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@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
-rw-r--r--dtc-lexer.l4
-rw-r--r--dtc-parser.y39
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);