diff --git a/dtc-lexer.l b/dtc-lexer.l index eec6527..109661d 100644 --- a/dtc-lexer.l +++ b/dtc-lexer.l @@ -25,12 +25,12 @@ %x PROPNODENAME %s V1 -PROPCHAR [a-zA-Z0-9,._+*#?-] -UNITCHAR [0-9a-f,] +PROPNODECHAR [a-zA-Z0-9,._+*#?@-] +PATHCHAR ({PROPNODECHAR}|[/]) +LEGACYPATHCHAR [a-zA-Z0-9_@/] +LABEL [a-zA-Z_][a-zA-Z0-9_]* WS [[:space:]] -REFCHAR ({PROPCHAR}|{UNITCHAR}|[/@]) - %{ #include "dtc.h" #include "srcpos.h" @@ -102,7 +102,7 @@ static int dts_version; /* = 0 */ return DT_MEMRESERVE; } -<*>[a-zA-Z_][a-zA-Z0-9_]*: { +<*>{LABEL}: { yylloc.filenum = srcpos_filenum; yylloc.first_line = yylineno; DPRINT("Label: %s\n", yytext); @@ -142,7 +142,24 @@ static int dts_version; /* = 0 */ return DT_LITERAL; } -\&{REFCHAR}* { +\&{LABEL} { /* label reference */ + yylloc.filenum = srcpos_filenum; + yylloc.first_line = yylineno; + DPRINT("Ref: %s\n", yytext+1); + yylval.labelref = strdup(yytext+1); + return DT_REF; + } + +"&{/"{PATHCHAR}+\} { /* new-style path reference */ + yylloc.filenum = srcpos_filenum; + yylloc.first_line = yylineno; + yytext[yyleng-1] = '\0'; + DPRINT("Ref: %s\n", yytext+2); + yylval.labelref = strdup(yytext+2); + return DT_REF; + } + +"&/"{LEGACYPATHCHAR}+ { /* old-style path reference */ yylloc.filenum = srcpos_filenum; yylloc.first_line = yylineno; DPRINT("Ref: %s\n", yytext+1); @@ -166,7 +183,7 @@ static int dts_version; /* = 0 */ return ']'; } -{PROPCHAR}+(@{UNITCHAR}+)? { +{PROPNODECHAR}+ { yylloc.filenum = srcpos_filenum; yylloc.first_line = yylineno; DPRINT("PropNodeName: %s\n", yytext); diff --git a/tests/nonexist-node-ref.dts b/tests/nonexist-node-ref.dts index fa35891..efd4140 100644 --- a/tests/nonexist-node-ref.dts +++ b/tests/nonexist-node-ref.dts @@ -1,8 +1,8 @@ /dts-v1/; / { - ref = < &/node >; - badref = < &/nosuchnode >; + ref = < &{/node} >; + badref = < &{/nosuchnode} >; label: node { }; }; diff --git a/tests/references.dts b/tests/references.dts index fc032f8..36b6f51 100644 --- a/tests/references.dts +++ b/tests/references.dts @@ -4,18 +4,18 @@ /* Explicit phandles */ n1: node1 { linux,phandle = <0x2000>; - ref = <&/node2>; /* reference precedes target */ + ref = <&{/node2}>; /* reference precedes target */ lref = <&n2>; }; n2: node2 { linux,phandle = <0x1>; - ref = <&/node1>; /* reference after target */ + ref = <&{/node1}>; /* reference after target */ lref = <&n1>; }; /* Implicit phandles */ n3: node3 { - ref = <&/node4>; + ref = <&{/node4}>; lref = <&n4>; }; n4: node4 { diff --git a/tests/references_dts0.dts b/tests/references_dts0.dts new file mode 100644 index 0000000..df82c23 --- /dev/null +++ b/tests/references_dts0.dts @@ -0,0 +1,21 @@ +/ { + /* Explicit phandles */ + n1: node1 { + linux,phandle = <2000>; + ref = <&/node2>; /* reference precedes target */ + lref = <&n2>; + }; + n2: node2 { + linux,phandle = <1>; + ref = <&/node1>; /* reference after target */ + lref = <&n1>; + }; + + /* Implicit phandles */ + n3: node3 { + ref = <&/node4>; + lref = <&n4>; + }; + n4: node4 { + }; +}; diff --git a/tests/run_tests.sh b/tests/run_tests.sh index a8f6e10..d8bedca 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -144,6 +144,9 @@ dtc_tests () { run_test dtc.sh -I dts -O dtb -o dtc_references.test.dtb references.dts run_test references dtc_references.test.dtb + run_test dtc.sh -I dts -O dtb -o dtc_references_dts0.test.dtb references_dts0.dts + run_test references dtc_references_dts0.test.dtb + # Check -Odts mode preserve all dtb information for tree in test_tree1.dtb dtc_tree1.test.dtb dtc_escapes.test.dtb ; do run_test dtc.sh -I dtb -O dts -o odts_$tree.test.dts $tree