brcm2708: remove linux 4.1 support
[openwrt/svn-archive/archive.git] / target / linux / brcm2708 / patches-4.1 / 0022-scripts-dtc-Update-to-upstream-version-with-overlay-.patch
diff --git a/target/linux/brcm2708/patches-4.1/0022-scripts-dtc-Update-to-upstream-version-with-overlay-.patch b/target/linux/brcm2708/patches-4.1/0022-scripts-dtc-Update-to-upstream-version-with-overlay-.patch
deleted file mode 100644 (file)
index 61d5337..0000000
+++ /dev/null
@@ -1,5175 +0,0 @@
-From 728d6710d7260f450e28fcab81c2eb075b8b0c33 Mon Sep 17 00:00:00 2001
-From: Phil Elwell <phil@raspberrypi.org>
-Date: Fri, 23 Jan 2015 14:48:55 +0000
-Subject: [PATCH 022/222] scripts/dtc: Update to upstream version with overlay
- patches
-
----
- scripts/dtc/checks.c                 |  151 ++-
- scripts/dtc/data.c                   |   12 +-
- scripts/dtc/dtc-lexer.l              |   70 +-
- scripts/dtc/dtc-lexer.lex.c_shipped  |  540 +++++-----
- scripts/dtc/dtc-parser.tab.c_shipped | 1783 ++++++++++++++++------------------
- scripts/dtc/dtc-parser.tab.h_shipped |  116 ++-
- scripts/dtc/dtc-parser.y             |  158 +--
- scripts/dtc/dtc.c                    |   23 +-
- scripts/dtc/dtc.h                    |   56 +-
- scripts/dtc/flattree.c               |  145 ++-
- scripts/dtc/fstree.c                 |   16 +-
- scripts/dtc/livetree.c               |    4 +-
- scripts/dtc/srcpos.c                 |   49 +-
- scripts/dtc/srcpos.h                 |   15 +-
- scripts/dtc/treesource.c             |   14 +-
- scripts/dtc/util.c                   |   18 +-
- scripts/dtc/util.h                   |    4 +-
- scripts/dtc/version_gen.h            |    2 +-
- 18 files changed, 1697 insertions(+), 1479 deletions(-)
-
---- a/scripts/dtc/checks.c
-+++ b/scripts/dtc/checks.c
-@@ -53,7 +53,7 @@ struct check {
-       void *data;
-       bool warn, error;
-       enum checkstatus status;
--      int inprogress;
-+      bool inprogress;
-       int num_prereqs;
-       struct check **prereq;
- };
-@@ -113,6 +113,7 @@ static inline void check_msg(struct chec
-               vfprintf(stderr, fmt, ap);
-               fprintf(stderr, "\n");
-       }
-+      va_end(ap);
- }
- #define FAIL(c, ...) \
-@@ -141,9 +142,9 @@ static void check_nodes_props(struct che
-               check_nodes_props(c, dt, child);
- }
--static int run_check(struct check *c, struct node *dt)
-+static bool run_check(struct check *c, struct node *dt)
- {
--      int error = 0;
-+      bool error = false;
-       int i;
-       assert(!c->inprogress);
-@@ -151,11 +152,11 @@ static int run_check(struct check *c, st
-       if (c->status != UNCHECKED)
-               goto out;
--      c->inprogress = 1;
-+      c->inprogress = true;
-       for (i = 0; i < c->num_prereqs; i++) {
-               struct check *prq = c->prereq[i];
--              error |= run_check(prq, dt);
-+              error = error || run_check(prq, dt);
-               if (prq->status != PASSED) {
-                       c->status = PREREQ;
-                       check_msg(c, "Failed prerequisite '%s'",
-@@ -177,9 +178,9 @@ static int run_check(struct check *c, st
-       TRACE(c, "\tCompleted, status %d", c->status);
- out:
--      c->inprogress = 0;
-+      c->inprogress = false;
-       if ((c->status != PASSED) && (c->error))
--              error = 1;
-+              error = true;
-       return error;
- }
-@@ -457,22 +458,93 @@ static void fixup_phandle_references(str
-                                    struct node *node, struct property *prop)
- {
-       struct marker *m = prop->val.markers;
-+      struct fixup *f, **fp;
-+      struct fixup_entry *fe, **fep;
-       struct node *refnode;
-       cell_t phandle;
-+      int has_phandle_refs;
-+
-+      has_phandle_refs = 0;
-+      for_each_marker_of_type(m, REF_PHANDLE) {
-+              has_phandle_refs = 1;
-+              break;
-+      }
-+
-+      if (!has_phandle_refs)
-+              return;
-       for_each_marker_of_type(m, REF_PHANDLE) {
-               assert(m->offset + sizeof(cell_t) <= prop->val.len);
-               refnode = get_node_by_ref(dt, m->ref);
--              if (! refnode) {
-+              if (!refnode && !symbol_fixup_support) {
-                       FAIL(c, "Reference to non-existent node or label \"%s\"\n",
--                           m->ref);
-+                              m->ref);
-                       continue;
-               }
--              phandle = get_node_phandle(dt, refnode);
--              *((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
-+              if (!refnode) {
-+                      /* allocate fixup entry */
-+                      fe = xmalloc(sizeof(*fe));
-+
-+                      fe->node = node;
-+                      fe->prop = prop;
-+                      fe->offset = m->offset;
-+                      fe->next = NULL;
-+
-+                      /* search for an already existing fixup */
-+                      for_each_fixup(dt, f)
-+                              if (strcmp(f->ref, m->ref) == 0)
-+                                      break;
-+
-+                      /* no fixup found, add new */
-+                      if (f == NULL) {
-+                              f = xmalloc(sizeof(*f));
-+                              f->ref = m->ref;
-+                              f->entries = NULL;
-+                              f->next = NULL;
-+
-+                              /* add it to the tree */
-+                              fp = &dt->fixups;
-+                              while (*fp)
-+                                      fp = &(*fp)->next;
-+                              *fp = f;
-+                      }
-+
-+                      /* and now append fixup entry */
-+                      fep = &f->entries;
-+                      while (*fep)
-+                              fep = &(*fep)->next;
-+                      *fep = fe;
-+
-+                      /* mark the entry as unresolved */
-+                      phandle = 0xdeadbeef;
-+              } else {
-+                      phandle = get_node_phandle(dt, refnode);
-+
-+                      /* if it's a plugin, we need to record it */
-+                      if (symbol_fixup_support && dt->is_plugin) {
-+
-+                              /* allocate a new local fixup entry */
-+                              fe = xmalloc(sizeof(*fe));
-+
-+                              fe->node = node;
-+                              fe->prop = prop;
-+                              fe->offset = m->offset;
-+                              fe->next = NULL;
-+
-+                              /* append it to the local fixups */
-+                              fep = &dt->local_fixups;
-+                              while (*fep)
-+                                      fep = &(*fep)->next;
-+                              *fep = fe;
-+                      }
-+              }
-+
-+              *((cell_t *)(prop->val.val + m->offset)) =
-+                      cpu_to_fdt32(phandle);
-       }
-+
- }
- ERROR(phandle_references, NULL, NULL, fixup_phandle_references, NULL,
-       &duplicate_node_names, &explicit_phandles);
-@@ -624,11 +696,11 @@ static void check_avoid_default_addr_siz
-       if (!reg && !ranges)
-               return;
--      if ((node->parent->addr_cells == -1))
-+      if (node->parent->addr_cells == -1)
-               FAIL(c, "Relying on default #address-cells value for %s",
-                    node->fullpath);
--      if ((node->parent->size_cells == -1))
-+      if (node->parent->size_cells == -1)
-               FAIL(c, "Relying on default #size-cells value for %s",
-                    node->fullpath);
- }
-@@ -651,6 +723,45 @@ static void check_obsolete_chosen_interr
- }
- TREE_WARNING(obsolete_chosen_interrupt_controller, NULL);
-+static void check_auto_label_phandles(struct check *c, struct node *dt,
-+                                     struct node *node)
-+{
-+      struct label *l;
-+      struct symbol *s, **sp;
-+      int has_label;
-+
-+      if (!symbol_fixup_support)
-+              return;
-+
-+      has_label = 0;
-+      for_each_label(node->labels, l) {
-+              has_label = 1;
-+              break;
-+      }
-+
-+      if (!has_label)
-+              return;
-+
-+      /* force allocation of a phandle for this node */
-+      (void)get_node_phandle(dt, node);
-+
-+      /* add the symbol */
-+      for_each_label(node->labels, l) {
-+
-+              s = xmalloc(sizeof(*s));
-+              s->label = l;
-+              s->node = node;
-+              s->next = NULL;
-+
-+              /* add it to the symbols list */
-+              sp = &dt->symbols;
-+              while (*sp)
-+                      sp = &((*sp)->next);
-+              *sp = s;
-+      }
-+}
-+NODE_WARNING(auto_label_phandles, NULL);
-+
- static struct check *check_table[] = {
-       &duplicate_node_names, &duplicate_property_names,
-       &node_name_chars, &node_name_format, &property_name_chars,
-@@ -669,6 +780,8 @@ static struct check *check_table[] = {
-       &avoid_default_addr_size,
-       &obsolete_chosen_interrupt_controller,
-+      &auto_label_phandles,
-+
-       &always_fail,
- };
-@@ -706,15 +819,15 @@ static void disable_warning_error(struct
-       c->error = c->error && !error;
- }
--void parse_checks_option(bool warn, bool error, const char *optarg)
-+void parse_checks_option(bool warn, bool error, const char *arg)
- {
-       int i;
--      const char *name = optarg;
-+      const char *name = arg;
-       bool enable = true;
--      if ((strncmp(optarg, "no-", 3) == 0)
--          || (strncmp(optarg, "no_", 3) == 0)) {
--              name = optarg + 3;
-+      if ((strncmp(arg, "no-", 3) == 0)
-+          || (strncmp(arg, "no_", 3) == 0)) {
-+              name = arg + 3;
-               enable = false;
-       }
-@@ -733,7 +846,7 @@ void parse_checks_option(bool warn, bool
-       die("Unrecognized check name \"%s\"\n", name);
- }
--void process_checks(int force, struct boot_info *bi)
-+void process_checks(bool force, struct boot_info *bi)
- {
-       struct node *dt = bi->dt;
-       int i;
---- a/scripts/dtc/data.c
-+++ b/scripts/dtc/data.c
-@@ -74,7 +74,7 @@ struct data data_copy_escape_string(cons
-       struct data d;
-       char *q;
--      d = data_grow_for(empty_data, strlen(s)+1);
-+      d = data_grow_for(empty_data, len + 1);
-       q = d.val;
-       while (i < len) {
-@@ -250,20 +250,20 @@ struct data data_add_marker(struct data
-       return data_append_markers(d, m);
- }
--int data_is_one_string(struct data d)
-+bool data_is_one_string(struct data d)
- {
-       int i;
-       int len = d.len;
-       if (len == 0)
--              return 0;
-+              return false;
-       for (i = 0; i < len-1; i++)
-               if (d.val[i] == '\0')
--                      return 0;
-+                      return false;
-       if (d.val[len-1] != '\0')
--              return 0;
-+              return false;
--      return 1;
-+      return true;
- }
---- a/scripts/dtc/dtc-lexer.l
-+++ b/scripts/dtc/dtc-lexer.l
-@@ -20,7 +20,6 @@
- %option noyywrap nounput noinput never-interactive
--%x INCLUDE
- %x BYTESTRING
- %x PROPNODENAME
- %s V1
-@@ -40,6 +39,7 @@ LINECOMMENT  "//".*\n
- #include "dtc-parser.tab.h"
- YYLTYPE yylloc;
-+extern bool treesource_error;
- /* CAUTION: this will stop working if we ever use yyless() or yyunput() */
- #define       YY_USER_ACTION \
-@@ -61,7 +61,8 @@ static int dts_version = 1;
-                               BEGIN(V1); \
- static void push_input_file(const char *filename);
--static int pop_input_file(void);
-+static bool pop_input_file(void);
-+static void lexical_error(const char *fmt, ...);
- %}
- %%
-@@ -75,11 +76,11 @@ static int pop_input_file(void);
-                       char *line, *tmp, *fn;
-                       /* skip text before line # */
-                       line = yytext;
--                      while (!isdigit(*line))
-+                      while (!isdigit((unsigned char)*line))
-                               line++;
-                       /* skip digits in line # */
-                       tmp = line;
--                      while (!isspace(*tmp))
-+                      while (!isspace((unsigned char)*tmp))
-                               tmp++;
-                       /* "NULL"-terminate line # */
-                       *tmp = '\0';
-@@ -112,6 +113,11 @@ static int pop_input_file(void);
-                       return DT_V1;
-               }
-+<*>"/plugin/" {
-+                      DPRINT("Keyword: /plugin/\n");
-+                      return DT_PLUGIN;
-+              }
-+
- <*>"/memreserve/"     {
-                       DPRINT("Keyword: /memreserve/\n");
-                       BEGIN_DEFAULT();
-@@ -146,15 +152,42 @@ static int pop_input_file(void);
-               }
- <V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? {
--                      yylval.literal = xstrdup(yytext);
--                      DPRINT("Literal: '%s'\n", yylval.literal);
-+                      char *e;
-+                      DPRINT("Integer Literal: '%s'\n", yytext);
-+
-+                      errno = 0;
-+                      yylval.integer = strtoull(yytext, &e, 0);
-+
-+                      assert(!(*e) || !e[strspn(e, "UL")]);
-+
-+                      if (errno == ERANGE)
-+                              lexical_error("Integer literal '%s' out of range",
-+                                            yytext);
-+                      else
-+                              /* ERANGE is the only strtoull error triggerable
-+                               *  by strings matching the pattern */
-+                              assert(errno == 0);
-                       return DT_LITERAL;
-               }
- <*>{CHAR_LITERAL}     {
--                      yytext[yyleng-1] = '\0';
--                      yylval.literal = xstrdup(yytext+1);
--                      DPRINT("Character literal: %s\n", yylval.literal);
-+                      struct data d;
-+                      DPRINT("Character literal: %s\n", yytext);
-+
-+                      d = data_copy_escape_string(yytext+1, yyleng-2);
-+                      if (d.len == 1) {
-+                              lexical_error("Empty character literal");
-+                              yylval.integer = 0;
-+                              return DT_CHAR_LITERAL;
-+                      }
-+
-+                      yylval.integer = (unsigned char)d.val[0];
-+
-+                      if (d.len > 2)
-+                              lexical_error("Character literal has %d"
-+                                            " characters instead of 1",
-+                                            d.len - 1);
-+
-                       return DT_CHAR_LITERAL;
-               }
-@@ -164,7 +197,7 @@ static int pop_input_file(void);
-                       return DT_REF;
-               }
--<*>"&{/"{PATHCHAR}+\} {       /* new-style path reference */
-+<*>"&{/"{PATHCHAR}*\} {       /* new-style path reference */
-                       yytext[yyleng-1] = '\0';
-                       DPRINT("Ref: %s\n", yytext+2);
-                       yylval.labelref = xstrdup(yytext+2);
-@@ -238,13 +271,24 @@ static void push_input_file(const char *
- }
--static int pop_input_file(void)
-+static bool pop_input_file(void)
- {
-       if (srcfile_pop() == 0)
--              return 0;
-+              return false;
-       yypop_buffer_state();
-       yyin = current_srcfile->f;
--      return 1;
-+      return true;
-+}
-+
-+static void lexical_error(const char *fmt, ...)
-+{
-+      va_list ap;
-+
-+      va_start(ap, fmt);
-+      srcpos_verror(&yylloc, "Lexical error", fmt, ap);
-+      va_end(ap);
-+
-+      treesource_error = true;
- }
---- a/scripts/dtc/dtc-lexer.lex.c_shipped
-+++ b/scripts/dtc/dtc-lexer.lex.c_shipped
-@@ -372,8 +372,8 @@ static void yy_fatal_error (yyconst char
-       *yy_cp = '\0'; \
-       (yy_c_buf_p) = yy_cp;
--#define YY_NUM_RULES 30
--#define YY_END_OF_BUFFER 31
-+#define YY_NUM_RULES 31
-+#define YY_END_OF_BUFFER 32
- /* This struct is not used in this scanner,
-    but its presence is necessary. */
- struct yy_trans_info
-@@ -381,25 +381,26 @@ struct yy_trans_info
-       flex_int32_t yy_verify;
-       flex_int32_t yy_nxt;
-       };
--static yyconst flex_int16_t yy_accept[161] =
-+static yyconst flex_int16_t yy_accept[166] =
-     {   0,
-+        0,    0,    0,    0,    0,    0,    0,    0,   32,   30,
-+       19,   19,   30,   30,   30,   30,   30,   30,   30,   30,
-+       30,   30,   30,   30,   30,   30,   16,   17,   17,   30,
-+       17,   11,   11,   19,   27,    0,    3,    0,   28,   13,
-+        0,    0,   12,    0,    0,    0,    0,    0,    0,    0,
-+        0,   22,   24,   26,   25,   23,    0,   10,   29,    0,
-+        0,    0,   15,   15,   17,   17,   17,   11,   11,   11,
-+        0,   13,    0,   12,    0,    0,    0,   21,    0,    0,
-+        0,    0,    0,    0,    0,    0,    0,   17,   11,   11,
-+       11,    0,   14,   20,    0,    0,    0,    0,    0,    0,
-+
-+        0,    0,    0,    0,   17,    0,    0,    0,    0,    0,
-+        0,    0,    0,    0,    0,   17,    7,    0,    0,    0,
-+        0,    0,    0,    0,    2,    0,    0,    0,    0,    0,
-+        0,    0,    0,    0,    4,   18,    0,    0,    5,    2,
-         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
--       31,   29,   18,   18,   29,   29,   29,   29,   29,   29,
--       29,   29,   29,   29,   29,   29,   29,   29,   15,   16,
--       16,   29,   16,   10,   10,   18,   26,    0,    3,    0,
--       27,   12,    0,    0,   11,    0,    0,    0,    0,    0,
--        0,    0,   21,   23,   25,   24,   22,    0,    9,   28,
--        0,    0,    0,   14,   14,   16,   16,   16,   10,   10,
--       10,    0,   12,    0,   11,    0,    0,    0,   20,    0,
--        0,    0,    0,    0,    0,    0,    0,   16,   10,   10,
--       10,    0,   19,    0,    0,    0,    0,    0,    0,    0,
--
--        0,    0,   16,   13,    0,    0,    0,    0,    0,    0,
--        0,    0,    0,   16,    6,    0,    0,    0,    0,    0,
--        0,    2,    0,    0,    0,    0,    0,    0,    0,    0,
--        4,   17,    0,    0,    2,    0,    0,    0,    0,    0,
--        0,    0,    0,    0,    0,    0,    0,    1,    0,    0,
--        0,    0,    5,    8,    0,    0,    0,    0,    7,    0
-+        0,    0,    1,    0,    0,    0,    0,    6,    9,    0,
-+        0,    0,    0,    8,    0
-     } ;
- static yyconst flex_int32_t yy_ec[256] =
-@@ -415,9 +416,9 @@ static yyconst flex_int32_t yy_ec[256] =
-        22,   22,   22,   22,   24,   22,   22,   25,   22,   22,
-         1,   26,   27,    1,   22,    1,   21,   28,   29,   30,
--       31,   21,   22,   22,   32,   22,   22,   33,   34,   35,
--       36,   37,   22,   38,   39,   40,   41,   42,   22,   25,
--       43,   22,   44,   45,   46,    1,    1,    1,    1,    1,
-+       31,   21,   32,   22,   33,   22,   22,   34,   35,   36,
-+       37,   38,   22,   39,   40,   41,   42,   43,   22,   25,
-+       44,   22,   45,   46,   47,    1,    1,    1,    1,    1,
-         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-@@ -434,163 +435,165 @@ static yyconst flex_int32_t yy_ec[256] =
-         1,    1,    1,    1,    1
-     } ;
--static yyconst flex_int32_t yy_meta[47] =
-+static yyconst flex_int32_t yy_meta[48] =
-     {   0,
-         1,    1,    1,    1,    1,    1,    2,    3,    1,    2,
-         2,    2,    4,    5,    5,    5,    6,    1,    1,    1,
-         7,    8,    8,    8,    8,    1,    1,    7,    7,    7,
-         7,    8,    8,    8,    8,    8,    8,    8,    8,    8,
--        8,    8,    8,    3,    1,    1
-+        8,    8,    8,    8,    3,    1,    4
-     } ;
--static yyconst flex_int16_t yy_base[175] =
-+static yyconst flex_int16_t yy_base[180] =
-     {   0,
--        0,  385,  378,   40,   41,  383,   72,  382,   34,   44,
--      388,  393,   61,  117,  368,  116,  115,  115,  115,   48,
--      367,  107,  368,  339,  127,  120,    0,  147,  393,    0,
--      127,    0,  133,  156,  168,  153,  393,  125,  393,  380,
--      393,    0,  369,  127,  393,  160,  371,  377,  347,   21,
--      343,  346,  393,  393,  393,  393,  393,  359,  393,  393,
--      183,  343,  339,  393,  356,    0,  183,  340,  187,  348,
--      347,    0,    0,    0,  178,  359,  195,  365,  354,  326,
--      332,  325,  334,  328,  204,  326,  331,  324,  393,  335,
--      150,  311,  343,  342,  315,  322,  340,  179,  313,  207,
--
--      319,  316,  317,  393,  337,  333,  305,  302,  311,  301,
--      310,  190,  338,  337,  393,  307,  322,  301,  305,  277,
--      208,  311,  307,  278,  271,  270,  248,  246,  213,  130,
--      393,  393,  263,  235,  207,  221,  218,  229,  213,  213,
--      206,  234,  218,  210,  208,  193,  219,  393,  223,  204,
--      176,  157,  393,  393,  120,  106,   97,  119,  393,  393,
--      245,  251,  259,  263,  267,  273,  280,  284,  292,  300,
--      304,  310,  318,  326
-+        0,  393,   35,  392,   66,  391,   38,  107,  397,  401,
-+       55,  113,  377,  112,  111,  111,  114,   42,  376,  106,
-+      377,  347,  126,  120,    0,  147,  401,    0,  124,    0,
-+      137,  158,  170,  163,  401,  153,  401,  389,  401,    0,
-+      378,  120,  401,  131,  380,  386,  355,  139,  351,  355,
-+      351,  401,  401,  401,  401,  401,  367,  401,  401,  185,
-+      350,  346,  401,  364,    0,  185,  347,  189,  356,  355,
-+        0,    0,  330,  180,  366,  141,  372,  361,  332,  338,
-+      331,  341,  334,  326,  205,  331,  337,  329,  401,  341,
-+      167,  316,  401,  349,  348,  320,  328,  346,  180,  318,
-+
-+      324,  209,  324,  320,  322,  342,  338,  309,  306,  315,
-+      305,  315,  312,  192,  342,  341,  401,  293,  306,  282,
-+      268,  252,  255,  203,  285,  282,  272,  268,  252,  233,
-+      232,  239,  208,  107,  401,  401,  238,  211,  401,  211,
-+      212,  208,  228,  203,  215,  207,  233,  222,  212,  211,
-+      203,  227,  401,  237,  225,  204,  185,  401,  401,  149,
-+      128,   88,   42,  401,  401,  253,  259,  267,  271,  275,
-+      281,  288,  292,  300,  308,  312,  318,  326,  334
-     } ;
--static yyconst flex_int16_t yy_def[175] =
-+static yyconst flex_int16_t yy_def[180] =
-     {   0,
--      160,    1,    1,    1,    1,    5,  160,    7,    1,    1,
--      160,  160,  160,  160,  160,  161,  162,  163,  160,  160,
--      160,  160,  164,  160,  160,  160,  165,  164,  160,  166,
--      167,  166,  166,  160,  160,  160,  160,  161,  160,  161,
--      160,  168,  160,  163,  160,  163,  169,  170,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  164,  160,  160,
--      160,  160,  160,  160,  164,  166,  167,  166,  160,  160,
--      160,  171,  168,  172,  163,  169,  169,  170,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  166,  160,  160,
--      171,  172,  160,  160,  160,  160,  160,  160,  160,  160,
--
--      160,  160,  166,  160,  160,  160,  160,  160,  160,  160,
--      160,  173,  160,  166,  160,  160,  160,  160,  160,  160,
--      173,  160,  173,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  174,  160,  160,  160,  174,  160,  174,  160,
--      160,  160,  160,  160,  160,  160,  160,  160,  160,    0,
--      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  160,  160
-+      165,    1,    1,    3,  165,    5,    1,    1,  165,  165,
-+      165,  165,  165,  166,  167,  168,  165,  165,  165,  165,
-+      169,  165,  165,  165,  170,  169,  165,  171,  172,  171,
-+      171,  165,  165,  165,  165,  166,  165,  166,  165,  173,
-+      165,  168,  165,  168,  174,  175,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  169,  165,  165,  165,
-+      165,  165,  165,  169,  171,  172,  171,  165,  165,  165,
-+      176,  173,  177,  168,  174,  174,  175,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  171,  165,  165,
-+      176,  177,  165,  165,  165,  165,  165,  165,  165,  165,
-+
-+      165,  165,  165,  165,  171,  165,  165,  165,  165,  165,
-+      165,  165,  165,  178,  165,  171,  165,  165,  165,  165,
-+      165,  165,  165,  178,  165,  178,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  179,  165,  165,
-+      165,  179,  165,  179,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,    0,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165,  165
-     } ;
--static yyconst flex_int16_t yy_nxt[440] =
-+static yyconst flex_int16_t yy_nxt[449] =
-     {   0,
--       12,   13,   14,   13,   15,   16,   12,   17,   18,   12,
--       12,   12,   19,   12,   12,   12,   12,   20,   21,   22,
--       23,   23,   23,   23,   23,   12,   12,   23,   23,   23,
--       23,   23,   23,   23,   23,   23,   23,   23,   23,   23,
--       23,   23,   23,   12,   24,   12,   25,   34,   35,   35,
--       25,   81,   26,   26,   27,   27,   27,   34,   35,   35,
--       82,   28,   36,   36,   36,   53,   54,   29,   28,   28,
--       28,   28,   12,   13,   14,   13,   15,   16,   30,   17,
--       18,   30,   30,   30,   26,   30,   30,   30,   12,   20,
--       21,   22,   31,   31,   31,   31,   31,   32,   12,   31,
--
--       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
--       31,   31,   31,   31,   31,   12,   24,   12,   36,   36,
--       36,   39,   41,   45,   47,   56,   57,   48,   61,   47,
--       39,  159,   48,   66,   61,   45,   66,   66,   66,  158,
--       46,   40,   49,   59,   50,  157,   51,   49,   52,   50,
--       40,   63,   46,   52,   36,   36,   36,  156,   43,   62,
--       65,   65,   65,   59,  136,   68,  137,   65,   75,   69,
--       69,   69,   70,   71,   65,   65,   65,   65,   70,   71,
--       72,   69,   69,   69,   61,   46,   45,  155,  154,   66,
--       70,   71,   66,   66,   66,  122,   85,   85,   85,   59,
--
--       69,   69,   69,   46,   77,  100,  109,   93,  100,   70,
--       71,  110,  112,  122,  129,  123,  153,   85,   85,   85,
--      135,  135,  135,  148,  148,  160,  135,  135,  135,  152,
--      142,  142,  142,  123,  143,  142,  142,  142,  151,  143,
--      150,  146,  145,  149,  149,   38,   38,   38,   38,   38,
--       38,   38,   38,   42,  144,  141,  140,   42,   42,   44,
--       44,   44,   44,   44,   44,   44,   44,   58,   58,   58,
--       58,   64,  139,   64,   66,  138,  134,   66,  133,   66,
--       66,   67,  132,  131,   67,   67,   67,   67,   73,  130,
--       73,   73,   76,   76,   76,   76,   76,   76,   76,   76,
--
--       78,   78,   78,   78,   78,   78,   78,   78,   91,  160,
--       91,   92,  129,   92,   92,  128,   92,   92,  121,  121,
--      121,  121,  121,  121,  121,  121,  147,  147,  147,  147,
--      147,  147,  147,  147,  127,  126,  125,  124,   61,   61,
--      120,  119,  118,  117,  116,  115,   47,  114,  110,  113,
--      111,  108,  107,  106,   48,  105,  104,   89,  103,  102,
--      101,   99,   98,   97,   96,   95,   94,   79,   77,   90,
--       89,   88,   59,   87,   86,   59,   84,   83,   80,   79,
--       77,   74,  160,   60,   59,   55,   37,  160,   33,   25,
--       26,   25,   11,  160,  160,  160,  160,  160,  160,  160,
--
--      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  160,  160
-+       10,   11,   12,   11,   13,   14,   10,   15,   16,   10,
-+       10,   10,   17,   10,   10,   10,   10,   18,   19,   20,
-+       21,   21,   21,   21,   21,   10,   10,   21,   21,   21,
-+       21,   21,   21,   21,   21,   21,   21,   21,   21,   21,
-+       21,   21,   21,   21,   10,   22,   10,   24,   25,   25,
-+       25,   32,   33,   33,  164,   26,   34,   34,   34,   52,
-+       53,   27,   26,   26,   26,   26,   10,   11,   12,   11,
-+       13,   14,   28,   15,   16,   28,   28,   28,   24,   28,
-+       28,   28,   10,   18,   19,   20,   29,   29,   29,   29,
-+       29,   30,   10,   29,   29,   29,   29,   29,   29,   29,
-+
-+       29,   29,   29,   29,   29,   29,   29,   29,   29,   29,
-+       10,   22,   10,   23,   34,   34,   34,   37,   39,   43,
-+       32,   33,   33,   45,   55,   56,   46,   60,   43,   45,
-+       65,  163,   46,   65,   65,   65,   44,   38,   60,   74,
-+       58,   47,  141,   48,  142,   44,   49,   47,   50,   48,
-+       76,   51,   62,   94,   50,   41,   44,   51,   37,   61,
-+       64,   64,   64,   58,   34,   34,   34,   64,  162,   80,
-+       67,   68,   68,   68,   64,   64,   64,   64,   38,   81,
-+       69,   70,   71,   68,   68,   68,   60,  161,   43,   69,
-+       70,   65,   69,   70,   65,   65,   65,  125,   85,   85,
-+
-+       85,   58,   68,   68,   68,   44,  102,  110,  125,  133,
-+      102,   69,   70,  111,  114,  160,  159,  126,   85,   85,
-+       85,  140,  140,  140,  140,  140,  140,  153,  126,  147,
-+      147,  147,  153,  148,  147,  147,  147,  158,  148,  165,
-+      157,  156,  155,  151,  150,  149,  146,  154,  145,  144,
-+      143,  139,  154,   36,   36,   36,   36,   36,   36,   36,
-+       36,   40,  138,  137,  136,   40,   40,   42,   42,   42,
-+       42,   42,   42,   42,   42,   57,   57,   57,   57,   63,
-+      135,   63,   65,  134,  165,   65,  133,   65,   65,   66,
-+      132,  131,   66,   66,   66,   66,   72,  130,   72,   72,
-+
-+       75,   75,   75,   75,   75,   75,   75,   75,   77,   77,
-+       77,   77,   77,   77,   77,   77,   91,  129,   91,   92,
-+      128,   92,   92,  127,   92,   92,  124,  124,  124,  124,
-+      124,  124,  124,  124,  152,  152,  152,  152,  152,  152,
-+      152,  152,   60,   60,  123,  122,  121,  120,  119,  118,
-+      117,   45,  116,  111,  115,  113,  112,  109,  108,  107,
-+       46,  106,   93,   89,  105,  104,  103,  101,  100,   99,
-+       98,   97,   96,   95,   78,   76,   93,   90,   89,   88,
-+       58,   87,   86,   58,   84,   83,   82,   79,   78,   76,
-+       73,  165,   59,   58,   54,   35,  165,   31,   23,   23,
-+
-+        9,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165
-     } ;
--static yyconst flex_int16_t yy_chk[440] =
-+static yyconst flex_int16_t yy_chk[449] =
-     {   0,
-         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-         1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
--        1,    1,    1,    1,    1,    1,    4,    9,    9,    9,
--       10,   50,    4,    5,    5,    5,    5,   10,   10,   10,
--       50,    5,   13,   13,   13,   20,   20,    5,    5,    5,
--        5,    5,    7,    7,    7,    7,    7,    7,    7,    7,
--        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
--        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
--
--        7,    7,    7,    7,    7,    7,    7,    7,    7,    7,
--        7,    7,    7,    7,    7,    7,    7,    7,   14,   14,
--       14,   16,   17,   18,   19,   22,   22,   19,   25,   26,
--       38,  158,   26,   31,   33,   44,   31,   31,   31,  157,
--       18,   16,   19,   31,   19,  156,   19,   26,   19,   26,
--       38,   26,   44,   26,   36,   36,   36,  155,   17,   25,
--       28,   28,   28,   28,  130,   33,  130,   28,   46,   34,
--       34,   34,   91,   91,   28,   28,   28,   28,   34,   34,
--       34,   35,   35,   35,   61,   46,   75,  152,  151,   67,
--       35,   35,   67,   67,   67,  112,   61,   61,   61,   67,
--
--       69,   69,   69,   75,   77,   85,   98,   77,  100,   69,
--       69,   98,  100,  121,  129,  112,  150,   85,   85,   85,
--      135,  135,  135,  143,  147,  149,  129,  129,  129,  146,
--      138,  138,  138,  121,  138,  142,  142,  142,  145,  142,
--      144,  141,  140,  143,  147,  161,  161,  161,  161,  161,
--      161,  161,  161,  162,  139,  137,  136,  162,  162,  163,
--      163,  163,  163,  163,  163,  163,  163,  164,  164,  164,
--      164,  165,  134,  165,  166,  133,  128,  166,  127,  166,
--      166,  167,  126,  125,  167,  167,  167,  167,  168,  124,
--      168,  168,  169,  169,  169,  169,  169,  169,  169,  169,
--
--      170,  170,  170,  170,  170,  170,  170,  170,  171,  123,
--      171,  172,  122,  172,  172,  120,  172,  172,  173,  173,
--      173,  173,  173,  173,  173,  173,  174,  174,  174,  174,
--      174,  174,  174,  174,  119,  118,  117,  116,  114,  113,
--      111,  110,  109,  108,  107,  106,  105,  103,  102,  101,
--       99,   97,   96,   95,   94,   93,   92,   90,   88,   87,
--       86,   84,   83,   82,   81,   80,   79,   78,   76,   71,
--       70,   68,   65,   63,   62,   58,   52,   51,   49,   48,
--       47,   43,   40,   24,   23,   21,   15,   11,    8,    6,
--        3,    2,  160,  160,  160,  160,  160,  160,  160,  160,
--
--      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  160,  160,  160,
--      160,  160,  160,  160,  160,  160,  160,  160,  160
-+        1,    1,    1,    1,    1,    1,    1,    3,    3,    3,
-+        3,    7,    7,    7,  163,    3,   11,   11,   11,   18,
-+       18,    3,    3,    3,    3,    3,    5,    5,    5,    5,
-+        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-+        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-+        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-+
-+        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,
-+        5,    5,    5,    8,   12,   12,   12,   14,   15,   16,
-+        8,    8,    8,   17,   20,   20,   17,   23,   42,   24,
-+       29,  162,   24,   29,   29,   29,   16,   14,   31,   44,
-+       29,   17,  134,   17,  134,   42,   17,   24,   17,   24,
-+       76,   17,   24,   76,   24,   15,   44,   24,   36,   23,
-+       26,   26,   26,   26,   34,   34,   34,   26,  161,   48,
-+       31,   32,   32,   32,   26,   26,   26,   26,   36,   48,
-+       32,   32,   32,   33,   33,   33,   60,  160,   74,   91,
-+       91,   66,   33,   33,   66,   66,   66,  114,   60,   60,
-+
-+       60,   66,   68,   68,   68,   74,   85,   99,  124,  133,
-+      102,   68,   68,   99,  102,  157,  156,  114,   85,   85,
-+       85,  133,  133,  133,  140,  140,  140,  148,  124,  143,
-+      143,  143,  152,  143,  147,  147,  147,  155,  147,  154,
-+      151,  150,  149,  146,  145,  144,  142,  148,  141,  138,
-+      137,  132,  152,  166,  166,  166,  166,  166,  166,  166,
-+      166,  167,  131,  130,  129,  167,  167,  168,  168,  168,
-+      168,  168,  168,  168,  168,  169,  169,  169,  169,  170,
-+      128,  170,  171,  127,  126,  171,  125,  171,  171,  172,
-+      123,  122,  172,  172,  172,  172,  173,  121,  173,  173,
-+
-+      174,  174,  174,  174,  174,  174,  174,  174,  175,  175,
-+      175,  175,  175,  175,  175,  175,  176,  120,  176,  177,
-+      119,  177,  177,  118,  177,  177,  178,  178,  178,  178,
-+      178,  178,  178,  178,  179,  179,  179,  179,  179,  179,
-+      179,  179,  116,  115,  113,  112,  111,  110,  109,  108,
-+      107,  106,  105,  104,  103,  101,  100,   98,   97,   96,
-+       95,   94,   92,   90,   88,   87,   86,   84,   83,   82,
-+       81,   80,   79,   78,   77,   75,   73,   70,   69,   67,
-+       64,   62,   61,   57,   51,   50,   49,   47,   46,   45,
-+       41,   38,   22,   21,   19,   13,    9,    6,    4,    2,
-+
-+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165,  165,  165,
-+      165,  165,  165,  165,  165,  165,  165,  165
-     } ;
- static yy_state_type yy_last_accepting_state;
-@@ -631,13 +634,13 @@ char *yytext;
--
--#line 38 "dtc-lexer.l"
-+#line 37 "dtc-lexer.l"
- #include "dtc.h"
- #include "srcpos.h"
- #include "dtc-parser.tab.h"
- YYLTYPE yylloc;
-+extern bool treesource_error;
- /* CAUTION: this will stop working if we ever use yyless() or yyunput() */
- #define       YY_USER_ACTION \
-@@ -659,14 +662,14 @@ static int dts_version = 1;
-                               BEGIN(V1); \
- static void push_input_file(const char *filename);
--static int pop_input_file(void);
--#line 664 "dtc-lexer.lex.c"
-+static bool pop_input_file(void);
-+static void lexical_error(const char *fmt, ...);
-+#line 668 "dtc-lexer.lex.c"
- #define INITIAL 0
--#define INCLUDE 1
--#define BYTESTRING 2
--#define PROPNODENAME 3
--#define V1 4
-+#define BYTESTRING 1
-+#define PROPNODENAME 2
-+#define V1 3
- #ifndef YY_NO_UNISTD_H
- /* Special case for "unistd.h", since it is non-ANSI. We include it way
-@@ -852,9 +855,9 @@ YY_DECL
-       register char *yy_cp, *yy_bp;
-       register int yy_act;
-     
--#line 67 "dtc-lexer.l"
-+#line 68 "dtc-lexer.l"
--#line 858 "dtc-lexer.lex.c"
-+#line 861 "dtc-lexer.lex.c"
-       if ( !(yy_init) )
-               {
-@@ -908,13 +911,13 @@ yy_match:
-                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-                               {
-                               yy_current_state = (int) yy_def[yy_current_state];
--                              if ( yy_current_state >= 161 )
-+                              if ( yy_current_state >= 166 )
-                                       yy_c = yy_meta[(unsigned int) yy_c];
-                               }
-                       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-                       ++yy_cp;
-                       }
--              while ( yy_current_state != 160 );
-+              while ( yy_current_state != 165 );
-               yy_cp = (yy_last_accepting_cpos);
-               yy_current_state = (yy_last_accepting_state);
-@@ -937,7 +940,7 @@ do_action: /* This label is used only to
- case 1:
- /* rule 1 can match eol */
- YY_RULE_SETUP
--#line 68 "dtc-lexer.l"
-+#line 69 "dtc-lexer.l"
- {
-                       char *name = strchr(yytext, '\"') + 1;
-                       yytext[yyleng-1] = '\0';
-@@ -947,16 +950,16 @@ YY_RULE_SETUP
- case 2:
- /* rule 2 can match eol */
- YY_RULE_SETUP
--#line 74 "dtc-lexer.l"
-+#line 75 "dtc-lexer.l"
- {
-                       char *line, *tmp, *fn;
-                       /* skip text before line # */
-                       line = yytext;
--                      while (!isdigit(*line))
-+                      while (!isdigit((unsigned char)*line))
-                               line++;
-                       /* skip digits in line # */
-                       tmp = line;
--                      while (!isspace(*tmp))
-+                      while (!isspace((unsigned char)*tmp))
-                               tmp++;
-                       /* "NULL"-terminate line # */
-                       *tmp = '\0';
-@@ -970,11 +973,10 @@ YY_RULE_SETUP
-               }
-       YY_BREAK
- case YY_STATE_EOF(INITIAL):
--case YY_STATE_EOF(INCLUDE):
- case YY_STATE_EOF(BYTESTRING):
- case YY_STATE_EOF(PROPNODENAME):
- case YY_STATE_EOF(V1):
--#line 95 "dtc-lexer.l"
-+#line 96 "dtc-lexer.l"
- {
-                       if (!pop_input_file()) {
-                               yyterminate();
-@@ -984,7 +986,7 @@ case YY_STATE_EOF(V1):
- case 3:
- /* rule 3 can match eol */
- YY_RULE_SETUP
--#line 101 "dtc-lexer.l"
-+#line 102 "dtc-lexer.l"
- {
-                       DPRINT("String: %s\n", yytext);
-                       yylval.data = data_copy_escape_string(yytext+1,
-@@ -994,7 +996,7 @@ YY_RULE_SETUP
-       YY_BREAK
- case 4:
- YY_RULE_SETUP
--#line 108 "dtc-lexer.l"
-+#line 109 "dtc-lexer.l"
- {
-                       DPRINT("Keyword: /dts-v1/\n");
-                       dts_version = 1;
-@@ -1004,25 +1006,33 @@ YY_RULE_SETUP
-       YY_BREAK
- case 5:
- YY_RULE_SETUP
--#line 115 "dtc-lexer.l"
-+#line 116 "dtc-lexer.l"
-+{
-+                      DPRINT("Keyword: /plugin/\n");
-+                      return DT_PLUGIN;
-+              }
-+      YY_BREAK
-+case 6:
-+YY_RULE_SETUP
-+#line 121 "dtc-lexer.l"
- {
-                       DPRINT("Keyword: /memreserve/\n");
-                       BEGIN_DEFAULT();
-                       return DT_MEMRESERVE;
-               }
-       YY_BREAK
--case 6:
-+case 7:
- YY_RULE_SETUP
--#line 121 "dtc-lexer.l"
-+#line 127 "dtc-lexer.l"
- {
-                       DPRINT("Keyword: /bits/\n");
-                       BEGIN_DEFAULT();
-                       return DT_BITS;
-               }
-       YY_BREAK
--case 7:
-+case 8:
- YY_RULE_SETUP
--#line 127 "dtc-lexer.l"
-+#line 133 "dtc-lexer.l"
- {
-                       DPRINT("Keyword: /delete-property/\n");
-                       DPRINT("<PROPNODENAME>\n");
-@@ -1030,9 +1040,9 @@ YY_RULE_SETUP
-                       return DT_DEL_PROP;
-               }
-       YY_BREAK
--case 8:
-+case 9:
- YY_RULE_SETUP
--#line 134 "dtc-lexer.l"
-+#line 140 "dtc-lexer.l"
- {
-                       DPRINT("Keyword: /delete-node/\n");
-                       DPRINT("<PROPNODENAME>\n");
-@@ -1040,9 +1050,9 @@ YY_RULE_SETUP
-                       return DT_DEL_NODE;
-               }
-       YY_BREAK
--case 9:
-+case 10:
- YY_RULE_SETUP
--#line 141 "dtc-lexer.l"
-+#line 147 "dtc-lexer.l"
- {
-                       DPRINT("Label: %s\n", yytext);
-                       yylval.labelref = xstrdup(yytext);
-@@ -1050,38 +1060,65 @@ YY_RULE_SETUP
-                       return DT_LABEL;
-               }
-       YY_BREAK
--case 10:
-+case 11:
- YY_RULE_SETUP
--#line 148 "dtc-lexer.l"
-+#line 154 "dtc-lexer.l"
- {
--                      yylval.literal = xstrdup(yytext);
--                      DPRINT("Literal: '%s'\n", yylval.literal);
-+                      char *e;
-+                      DPRINT("Integer Literal: '%s'\n", yytext);
-+
-+                      errno = 0;
-+                      yylval.integer = strtoull(yytext, &e, 0);
-+
-+                      assert(!(*e) || !e[strspn(e, "UL")]);
-+
-+                      if (errno == ERANGE)
-+                              lexical_error("Integer literal '%s' out of range",
-+                                            yytext);
-+                      else
-+                              /* ERANGE is the only strtoull error triggerable
-+                               *  by strings matching the pattern */
-+                              assert(errno == 0);
-                       return DT_LITERAL;
-               }
-       YY_BREAK
--case 11:
--/* rule 11 can match eol */
-+case 12:
-+/* rule 12 can match eol */
- YY_RULE_SETUP
--#line 154 "dtc-lexer.l"
-+#line 173 "dtc-lexer.l"
- {
--                      yytext[yyleng-1] = '\0';
--                      yylval.literal = xstrdup(yytext+1);
--                      DPRINT("Character literal: %s\n", yylval.literal);
-+                      struct data d;
-+                      DPRINT("Character literal: %s\n", yytext);
-+
-+                      d = data_copy_escape_string(yytext+1, yyleng-2);
-+                      if (d.len == 1) {
-+                              lexical_error("Empty character literal");
-+                              yylval.integer = 0;
-+                              return DT_CHAR_LITERAL;
-+                      }
-+
-+                      yylval.integer = (unsigned char)d.val[0];
-+
-+                      if (d.len > 2)
-+                              lexical_error("Character literal has %d"
-+                                            " characters instead of 1",
-+                                            d.len - 1);
-+
-                       return DT_CHAR_LITERAL;
-               }
-       YY_BREAK
--case 12:
-+case 13:
- YY_RULE_SETUP
--#line 161 "dtc-lexer.l"
-+#line 194 "dtc-lexer.l"
- {     /* label reference */
-                       DPRINT("Ref: %s\n", yytext+1);
-                       yylval.labelref = xstrdup(yytext+1);
-                       return DT_REF;
-               }
-       YY_BREAK
--case 13:
-+case 14:
- YY_RULE_SETUP
--#line 167 "dtc-lexer.l"
-+#line 200 "dtc-lexer.l"
- {     /* new-style path reference */
-                       yytext[yyleng-1] = '\0';
-                       DPRINT("Ref: %s\n", yytext+2);
-@@ -1089,27 +1126,27 @@ YY_RULE_SETUP
-                       return DT_REF;
-               }
-       YY_BREAK
--case 14:
-+case 15:
- YY_RULE_SETUP
--#line 174 "dtc-lexer.l"
-+#line 207 "dtc-lexer.l"
- {
-                       yylval.byte = strtol(yytext, NULL, 16);
-                       DPRINT("Byte: %02x\n", (int)yylval.byte);
-                       return DT_BYTE;
-               }
-       YY_BREAK
--case 15:
-+case 16:
- YY_RULE_SETUP
--#line 180 "dtc-lexer.l"
-+#line 213 "dtc-lexer.l"
- {
-                       DPRINT("/BYTESTRING\n");
-                       BEGIN_DEFAULT();
-                       return ']';
-               }
-       YY_BREAK
--case 16:
-+case 17:
- YY_RULE_SETUP
--#line 186 "dtc-lexer.l"
-+#line 219 "dtc-lexer.l"
- {
-                       DPRINT("PropNodeName: %s\n", yytext);
-                       yylval.propnodename = xstrdup((yytext[0] == '\\') ?
-@@ -1118,75 +1155,75 @@ YY_RULE_SETUP
-                       return DT_PROPNODENAME;
-               }
-       YY_BREAK
--case 17:
-+case 18:
- YY_RULE_SETUP
--#line 194 "dtc-lexer.l"
-+#line 227 "dtc-lexer.l"
- {
-                       DPRINT("Binary Include\n");
-                       return DT_INCBIN;
-               }
-       YY_BREAK
--case 18:
--/* rule 18 can match eol */
--YY_RULE_SETUP
--#line 199 "dtc-lexer.l"
--/* eat whitespace */
--      YY_BREAK
- case 19:
- /* rule 19 can match eol */
- YY_RULE_SETUP
--#line 200 "dtc-lexer.l"
--/* eat C-style comments */
-+#line 232 "dtc-lexer.l"
-+/* eat whitespace */
-       YY_BREAK
- case 20:
- /* rule 20 can match eol */
- YY_RULE_SETUP
--#line 201 "dtc-lexer.l"
--/* eat C++-style comments */
-+#line 233 "dtc-lexer.l"
-+/* eat C-style comments */
-       YY_BREAK
- case 21:
-+/* rule 21 can match eol */
- YY_RULE_SETUP
--#line 203 "dtc-lexer.l"
--{ return DT_LSHIFT; };
-+#line 234 "dtc-lexer.l"
-+/* eat C++-style comments */
-       YY_BREAK
- case 22:
- YY_RULE_SETUP
--#line 204 "dtc-lexer.l"
--{ return DT_RSHIFT; };
-+#line 236 "dtc-lexer.l"
-+{ return DT_LSHIFT; };
-       YY_BREAK
- case 23:
- YY_RULE_SETUP
--#line 205 "dtc-lexer.l"
--{ return DT_LE; };
-+#line 237 "dtc-lexer.l"
-+{ return DT_RSHIFT; };
-       YY_BREAK
- case 24:
- YY_RULE_SETUP
--#line 206 "dtc-lexer.l"
--{ return DT_GE; };
-+#line 238 "dtc-lexer.l"
-+{ return DT_LE; };
-       YY_BREAK
- case 25:
- YY_RULE_SETUP
--#line 207 "dtc-lexer.l"
--{ return DT_EQ; };
-+#line 239 "dtc-lexer.l"
-+{ return DT_GE; };
-       YY_BREAK
- case 26:
- YY_RULE_SETUP
--#line 208 "dtc-lexer.l"
--{ return DT_NE; };
-+#line 240 "dtc-lexer.l"
-+{ return DT_EQ; };
-       YY_BREAK
- case 27:
- YY_RULE_SETUP
--#line 209 "dtc-lexer.l"
--{ return DT_AND; };
-+#line 241 "dtc-lexer.l"
-+{ return DT_NE; };
-       YY_BREAK
- case 28:
- YY_RULE_SETUP
--#line 210 "dtc-lexer.l"
--{ return DT_OR; };
-+#line 242 "dtc-lexer.l"
-+{ return DT_AND; };
-       YY_BREAK
- case 29:
- YY_RULE_SETUP
--#line 212 "dtc-lexer.l"
-+#line 243 "dtc-lexer.l"
-+{ return DT_OR; };
-+      YY_BREAK
-+case 30:
-+YY_RULE_SETUP
-+#line 245 "dtc-lexer.l"
- {
-                       DPRINT("Char: %c (\\x%02x)\n", yytext[0],
-                               (unsigned)yytext[0]);
-@@ -1202,12 +1239,12 @@ YY_RULE_SETUP
-                       return yytext[0];
-               }
-       YY_BREAK
--case 30:
-+case 31:
- YY_RULE_SETUP
--#line 227 "dtc-lexer.l"
-+#line 260 "dtc-lexer.l"
- ECHO;
-       YY_BREAK
--#line 1211 "dtc-lexer.lex.c"
-+#line 1248 "dtc-lexer.lex.c"
-       case YY_END_OF_BUFFER:
-               {
-@@ -1499,7 +1536,7 @@ static int yy_get_next_buffer (void)
-               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-                       {
-                       yy_current_state = (int) yy_def[yy_current_state];
--                      if ( yy_current_state >= 161 )
-+                      if ( yy_current_state >= 166 )
-                               yy_c = yy_meta[(unsigned int) yy_c];
-                       }
-               yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
-@@ -1527,11 +1564,11 @@ static int yy_get_next_buffer (void)
-       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
-               {
-               yy_current_state = (int) yy_def[yy_current_state];
--              if ( yy_current_state >= 161 )
-+              if ( yy_current_state >= 166 )
-                       yy_c = yy_meta[(unsigned int) yy_c];
-               }
-       yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
--      yy_is_jam = (yy_current_state == 160);
-+      yy_is_jam = (yy_current_state == 165);
-       return yy_is_jam ? 0 : yy_current_state;
- }
-@@ -2166,7 +2203,7 @@ void yyfree (void * ptr )
- #define YYTABLES_NAME "yytables"
--#line 227 "dtc-lexer.l"
-+#line 260 "dtc-lexer.l"
-@@ -2182,14 +2219,25 @@ static void push_input_file(const char *
- }
--static int pop_input_file(void)
-+static bool pop_input_file(void)
- {
-       if (srcfile_pop() == 0)
--              return 0;
-+              return false;
-       yypop_buffer_state();
-       yyin = current_srcfile->f;
--      return 1;
-+      return true;
-+}
-+
-+static void lexical_error(const char *fmt, ...)
-+{
-+      va_list ap;
-+
-+      va_start(ap, fmt);
-+      srcpos_verror(&yylloc, "Lexical error", fmt, ap);
-+      va_end(ap);
-+
-+      treesource_error = true;
- }
---- a/scripts/dtc/dtc-parser.tab.c_shipped
-+++ b/scripts/dtc/dtc-parser.tab.c_shipped
-@@ -1,19 +1,19 @@
--/* A Bison parser, made by GNU Bison 2.7.12-4996.  */
-+/* A Bison parser, made by GNU Bison 3.0.2.  */
- /* Bison implementation for Yacc-like parsers in C
--   
--      Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
--   
-+
-+   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-+
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
--   
-+
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
--   
-+
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-@@ -26,7 +26,7 @@
-    special exception, which will cause the skeleton and the resulting
-    Bison output files to be licensed under the GNU General Public
-    License without this special exception.
--   
-+
-    This special exception was added by the Free Software Foundation in
-    version 2.2 of Bison.  */
-@@ -44,7 +44,7 @@
- #define YYBISON 1
- /* Bison version.  */
--#define YYBISON_VERSION "2.7.12-4996"
-+#define YYBISON_VERSION "3.0.2"
- /* Skeleton name.  */
- #define YYSKELETON_NAME "yacc.c"
-@@ -62,34 +62,32 @@
- /* Copy the first part of user declarations.  */
--/* Line 371 of yacc.c  */
--#line 21 "dtc-parser.y"
-+#line 20 "dtc-parser.y" /* yacc.c:339  */
- #include <stdio.h>
-+#include <inttypes.h>
- #include "dtc.h"
- #include "srcpos.h"
--YYLTYPE yylloc;
--
- extern int yylex(void);
--extern void print_error(char const *fmt, ...);
- extern void yyerror(char const *s);
-+#define ERROR(loc, ...) \
-+      do { \
-+              srcpos_error((loc), "Error", __VA_ARGS__); \
-+              treesource_error = true; \
-+      } while (0)
- extern struct boot_info *the_boot_info;
--extern int treesource_error;
--
--static unsigned long long eval_literal(const char *s, int base, int bits);
--static unsigned char eval_char_literal(const char *s);
-+extern bool treesource_error;
--/* Line 371 of yacc.c  */
--#line 87 "dtc-parser.tab.c"
-+#line 85 "dtc-parser.tab.c" /* yacc.c:339  */
--# ifndef YY_NULL
-+# ifndef YY_NULLPTR
- #  if defined __cplusplus && 201103L <= __cplusplus
--#   define YY_NULL nullptr
-+#   define YY_NULLPTR nullptr
- #  else
--#   define YY_NULL 0
-+#   define YY_NULLPTR 0
- #  endif
- # endif
-@@ -105,7 +103,7 @@ static unsigned char eval_char_literal(c
-    by #include "dtc-parser.tab.h".  */
- #ifndef YY_YY_DTC_PARSER_TAB_H_INCLUDED
- # define YY_YY_DTC_PARSER_TAB_H_INCLUDED
--/* Enabling traces.  */
-+/* Debug traces.  */
- #ifndef YYDEBUG
- # define YYDEBUG 0
- #endif
-@@ -113,48 +111,45 @@ static unsigned char eval_char_literal(c
- extern int yydebug;
- #endif
--/* Tokens.  */
-+/* Token type.  */
- #ifndef YYTOKENTYPE
- # define YYTOKENTYPE
--   /* Put the tokens into the symbol table, so that GDB and other debuggers
--      know about them.  */
--   enum yytokentype {
--     DT_V1 = 258,
--     DT_MEMRESERVE = 259,
--     DT_LSHIFT = 260,
--     DT_RSHIFT = 261,
--     DT_LE = 262,
--     DT_GE = 263,
--     DT_EQ = 264,
--     DT_NE = 265,
--     DT_AND = 266,
--     DT_OR = 267,
--     DT_BITS = 268,
--     DT_DEL_PROP = 269,
--     DT_DEL_NODE = 270,
--     DT_PROPNODENAME = 271,
--     DT_LITERAL = 272,
--     DT_CHAR_LITERAL = 273,
--     DT_BASE = 274,
--     DT_BYTE = 275,
--     DT_STRING = 276,
--     DT_LABEL = 277,
--     DT_REF = 278,
--     DT_INCBIN = 279
--   };
-+  enum yytokentype
-+  {
-+    DT_V1 = 258,
-+    DT_PLUGIN = 259,
-+    DT_MEMRESERVE = 260,
-+    DT_LSHIFT = 261,
-+    DT_RSHIFT = 262,
-+    DT_LE = 263,
-+    DT_GE = 264,
-+    DT_EQ = 265,
-+    DT_NE = 266,
-+    DT_AND = 267,
-+    DT_OR = 268,
-+    DT_BITS = 269,
-+    DT_DEL_PROP = 270,
-+    DT_DEL_NODE = 271,
-+    DT_PROPNODENAME = 272,
-+    DT_LITERAL = 273,
-+    DT_CHAR_LITERAL = 274,
-+    DT_BYTE = 275,
-+    DT_STRING = 276,
-+    DT_LABEL = 277,
-+    DT_REF = 278,
-+    DT_INCBIN = 279
-+  };
- #endif
--
-+/* Value type.  */
- #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
--typedef union YYSTYPE
-+typedef union YYSTYPE YYSTYPE;
-+union YYSTYPE
- {
--/* Line 387 of yacc.c  */
--#line 40 "dtc-parser.y"
-+#line 39 "dtc-parser.y" /* yacc.c:355  */
-       char *propnodename;
--      char *literal;
-       char *labelref;
--      unsigned int cbase;
-       uint8_t byte;
-       struct data data;
-@@ -169,38 +164,38 @@ typedef union YYSTYPE
-       struct node *nodelist;
-       struct reserve_info *re;
-       uint64_t integer;
-+      int is_plugin;
--
--/* Line 387 of yacc.c  */
--#line 176 "dtc-parser.tab.c"
--} YYSTYPE;
-+#line 170 "dtc-parser.tab.c" /* yacc.c:355  */
-+};
- # define YYSTYPE_IS_TRIVIAL 1
--# define yystype YYSTYPE /* obsolescent; will be withdrawn */
- # define YYSTYPE_IS_DECLARED 1
- #endif
--extern YYSTYPE yylval;
--
--#ifdef YYPARSE_PARAM
--#if defined __STDC__ || defined __cplusplus
--int yyparse (void *YYPARSE_PARAM);
--#else
--int yyparse ();
-+/* Location type.  */
-+#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-+typedef struct YYLTYPE YYLTYPE;
-+struct YYLTYPE
-+{
-+  int first_line;
-+  int first_column;
-+  int last_line;
-+  int last_column;
-+};
-+# define YYLTYPE_IS_DECLARED 1
-+# define YYLTYPE_IS_TRIVIAL 1
- #endif
--#else /* ! YYPARSE_PARAM */
--#if defined __STDC__ || defined __cplusplus
-+
-+
-+extern YYSTYPE yylval;
-+extern YYLTYPE yylloc;
- int yyparse (void);
--#else
--int yyparse ();
--#endif
--#endif /* ! YYPARSE_PARAM */
- #endif /* !YY_YY_DTC_PARSER_TAB_H_INCLUDED  */
- /* Copy the second part of user declarations.  */
--/* Line 390 of yacc.c  */
--#line 204 "dtc-parser.tab.c"
-+#line 199 "dtc-parser.tab.c" /* yacc.c:358  */
- #ifdef short
- # undef short
-@@ -214,11 +209,8 @@ typedef unsigned char yytype_uint8;
- #ifdef YYTYPE_INT8
- typedef YYTYPE_INT8 yytype_int8;
--#elif (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
--typedef signed char yytype_int8;
- #else
--typedef short int yytype_int8;
-+typedef signed char yytype_int8;
- #endif
- #ifdef YYTYPE_UINT16
-@@ -238,8 +230,7 @@ typedef short int yytype_int16;
- #  define YYSIZE_T __SIZE_TYPE__
- # elif defined size_t
- #  define YYSIZE_T size_t
--# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
-+# elif ! defined YYSIZE_T
- #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
- #  define YYSIZE_T size_t
- # else
-@@ -261,11 +252,30 @@ typedef short int yytype_int16;
- # endif
- #endif
--#ifndef __attribute__
--/* This feature is available in gcc versions 2.5 and later.  */
--# if (! defined __GNUC__ || __GNUC__ < 2 \
--      || (__GNUC__ == 2 && __GNUC_MINOR__ < 5))
--#  define __attribute__(Spec) /* empty */
-+#ifndef YY_ATTRIBUTE
-+# if (defined __GNUC__                                               \
-+      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
-+     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
-+#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
-+# else
-+#  define YY_ATTRIBUTE(Spec) /* empty */
-+# endif
-+#endif
-+
-+#ifndef YY_ATTRIBUTE_PURE
-+# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
-+#endif
-+
-+#ifndef YY_ATTRIBUTE_UNUSED
-+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
-+#endif
-+
-+#if !defined _Noreturn \
-+     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
-+# if defined _MSC_VER && 1200 <= _MSC_VER
-+#  define _Noreturn __declspec (noreturn)
-+# else
-+#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
- # endif
- #endif
-@@ -276,24 +286,25 @@ typedef short int yytype_int16;
- # define YYUSE(E) /* empty */
- #endif
--
--/* Identity function, used to suppress warnings about constant conditions.  */
--#ifndef lint
--# define YYID(N) (N)
--#else
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
--static int
--YYID (int yyi)
-+#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
-+/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
-+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
-+    _Pragma ("GCC diagnostic push") \
-+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
-+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
-+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
-+    _Pragma ("GCC diagnostic pop")
- #else
--static int
--YYID (yyi)
--    int yyi;
-+# define YY_INITIAL_VALUE(Value) Value
- #endif
--{
--  return yyi;
--}
-+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
- #endif
-+#ifndef YY_INITIAL_VALUE
-+# define YY_INITIAL_VALUE(Value) /* Nothing. */
-+#endif
-+
- #if ! defined yyoverflow || YYERROR_VERBOSE
-@@ -312,8 +323,7 @@ YYID (yyi)
- #    define alloca _alloca
- #   else
- #    define YYSTACK_ALLOC alloca
--#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
-+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
- #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
-       /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
- #     ifndef EXIT_SUCCESS
-@@ -325,8 +335,8 @@ YYID (yyi)
- # endif
- # ifdef YYSTACK_ALLOC
--   /* Pacify GCC's `empty if-body' warning.  */
--#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
-+   /* Pacify GCC's 'empty if-body' warning.  */
-+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
- #  ifndef YYSTACK_ALLOC_MAXIMUM
-     /* The OS might guarantee only one guard page at the bottom of the stack,
-        and a page size can be as small as 4096 bytes.  So we cannot safely
-@@ -342,7 +352,7 @@ YYID (yyi)
- #  endif
- #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
-        && ! ((defined YYMALLOC || defined malloc) \
--           && (defined YYFREE || defined free)))
-+             && (defined YYFREE || defined free)))
- #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
- #   ifndef EXIT_SUCCESS
- #    define EXIT_SUCCESS 0
-@@ -350,15 +360,13 @@ YYID (yyi)
- #  endif
- #  ifndef YYMALLOC
- #   define YYMALLOC malloc
--#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
-+#   if ! defined malloc && ! defined EXIT_SUCCESS
- void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
- #   endif
- #  endif
- #  ifndef YYFREE
- #   define YYFREE free
--#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
-+#   if ! defined free && ! defined EXIT_SUCCESS
- void free (void *); /* INFRINGES ON USER NAME SPACE */
- #   endif
- #  endif
-@@ -368,13 +376,15 @@ void free (void *); /* INFRINGES ON USER
- #if (! defined yyoverflow \
-      && (! defined __cplusplus \
--       || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
-+         || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
-+             && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
- /* A type that is properly aligned for any stack member.  */
- union yyalloc
- {
-   yytype_int16 yyss_alloc;
-   YYSTYPE yyvs_alloc;
-+  YYLTYPE yyls_alloc;
- };
- /* The size of the maximum gap between one aligned stack and the next.  */
-@@ -383,8 +393,8 @@ union yyalloc
- /* The size of an array large to enough to hold all stacks, each with
-    N elements.  */
- # define YYSTACK_BYTES(N) \
--     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
--      + YYSTACK_GAP_MAXIMUM)
-+     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
-+      + 2 * YYSTACK_GAP_MAXIMUM)
- # define YYCOPY_NEEDED 1
-@@ -393,16 +403,16 @@ union yyalloc
-    elements in the stack, and YYPTR gives the new location of the
-    stack.  Advance YYPTR to a properly aligned location for the next
-    stack.  */
--# define YYSTACK_RELOCATE(Stack_alloc, Stack)                         \
--    do                                                                        \
--      {                                                                       \
--      YYSIZE_T yynewbytes;                                            \
--      YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
--      Stack = &yyptr->Stack_alloc;                                    \
--      yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
--      yyptr += yynewbytes / sizeof (*yyptr);                          \
--      }                                                                       \
--    while (YYID (0))
-+# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
-+    do                                                                  \
-+      {                                                                 \
-+        YYSIZE_T yynewbytes;                                            \
-+        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
-+        Stack = &yyptr->Stack_alloc;                                    \
-+        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-+        yyptr += yynewbytes / sizeof (*yyptr);                          \
-+      }                                                                 \
-+    while (0)
- #endif
-@@ -421,7 +431,7 @@ union yyalloc
-           for (yyi = 0; yyi < (Count); yyi++)   \
-             (Dst)[yyi] = (Src)[yyi];            \
-         }                                       \
--      while (YYID (0))
-+      while (0)
- #  endif
- # endif
- #endif /* !YYCOPY_NEEDED */
-@@ -429,25 +439,27 @@ union yyalloc
- /* YYFINAL -- State number of the termination state.  */
- #define YYFINAL  4
- /* YYLAST -- Last index in YYTABLE.  */
--#define YYLAST   133
-+#define YYLAST   135
- /* YYNTOKENS -- Number of terminals.  */
- #define YYNTOKENS  48
- /* YYNNTS -- Number of nonterminals.  */
--#define YYNNTS  28
-+#define YYNNTS  29
- /* YYNRULES -- Number of rules.  */
--#define YYNRULES  79
--/* YYNRULES -- Number of states.  */
--#define YYNSTATES  141
-+#define YYNRULES  81
-+/* YYNSTATES -- Number of states.  */
-+#define YYNSTATES  144
--/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
-+/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
-+   by yylex, with out-of-bounds checking.  */
- #define YYUNDEFTOK  2
- #define YYMAXUTOK   279
--#define YYTRANSLATE(YYX)                                              \
-+#define YYTRANSLATE(YYX)                                                \
-   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
--/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
-+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
-+   as returned by yylex, without out-of-bounds checking.  */
- static const yytype_uint8 yytranslate[] =
- {
-        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-@@ -481,63 +493,18 @@ static const yytype_uint8 yytranslate[]
- };
- #if YYDEBUG
--/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
--   YYRHS.  */
--static const yytype_uint16 yyprhs[] =
--{
--       0,     0,     3,     8,     9,    12,    17,    20,    23,    27,
--      31,    36,    42,    43,    46,    51,    54,    58,    61,    64,
--      68,    73,    76,    86,    92,    95,    96,    99,   102,   106,
--     108,   111,   114,   117,   119,   121,   125,   127,   129,   135,
--     137,   141,   143,   147,   149,   153,   155,   159,   161,   165,
--     167,   171,   175,   177,   181,   185,   189,   193,   197,   201,
--     203,   207,   211,   213,   217,   221,   225,   227,   229,   232,
--     235,   238,   239,   242,   245,   246,   249,   252,   255,   259
--};
--
--/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
--static const yytype_int8 yyrhs[] =
--{
--      49,     0,    -1,     3,    25,    50,    52,    -1,    -1,    51,
--      50,    -1,     4,    59,    59,    25,    -1,    22,    51,    -1,
--      26,    53,    -1,    52,    26,    53,    -1,    52,    23,    53,
--      -1,    52,    15,    23,    25,    -1,    27,    54,    74,    28,
--      25,    -1,    -1,    54,    55,    -1,    16,    29,    56,    25,
--      -1,    16,    25,    -1,    14,    16,    25,    -1,    22,    55,
--      -1,    57,    21,    -1,    57,    58,    30,    -1,    57,    31,
--      73,    32,    -1,    57,    23,    -1,    57,    24,    33,    21,
--      34,    59,    34,    59,    35,    -1,    57,    24,    33,    21,
--      35,    -1,    56,    22,    -1,    -1,    56,    34,    -1,    57,
--      22,    -1,    13,    17,    36,    -1,    36,    -1,    58,    59,
--      -1,    58,    23,    -1,    58,    22,    -1,    17,    -1,    18,
--      -1,    33,    60,    35,    -1,    61,    -1,    62,    -1,    62,
--      37,    60,    38,    61,    -1,    63,    -1,    62,    12,    63,
--      -1,    64,    -1,    63,    11,    64,    -1,    65,    -1,    64,
--      39,    65,    -1,    66,    -1,    65,    40,    66,    -1,    67,
--      -1,    66,    41,    67,    -1,    68,    -1,    67,     9,    68,
--      -1,    67,    10,    68,    -1,    69,    -1,    68,    36,    69,
--      -1,    68,    30,    69,    -1,    68,     7,    69,    -1,    68,
--       8,    69,    -1,    69,     5,    70,    -1,    69,     6,    70,
--      -1,    70,    -1,    70,    42,    71,    -1,    70,    43,    71,
--      -1,    71,    -1,    71,    44,    72,    -1,    71,    26,    72,
--      -1,    71,    45,    72,    -1,    72,    -1,    59,    -1,    43,
--      72,    -1,    46,    72,    -1,    47,    72,    -1,    -1,    73,
--      20,    -1,    73,    22,    -1,    -1,    75,    74,    -1,    75,
--      55,    -1,    16,    53,    -1,    15,    16,    25,    -1,    22,
--      75,    -1
--};
--
--/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-+  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
- static const yytype_uint16 yyrline[] =
- {
--       0,   109,   109,   118,   121,   128,   132,   140,   144,   148,
--     158,   172,   180,   183,   190,   194,   198,   202,   210,   214,
--     218,   222,   226,   243,   253,   261,   264,   268,   275,   290,
--     295,   315,   329,   336,   340,   344,   351,   355,   356,   360,
--     361,   365,   366,   370,   371,   375,   376,   380,   381,   385,
--     386,   387,   391,   392,   393,   394,   395,   399,   400,   401,
--     405,   406,   407,   411,   412,   413,   414,   418,   419,   420,
--     421,   426,   429,   433,   441,   444,   448,   456,   460,   464
-+       0,   108,   108,   119,   122,   130,   133,   140,   144,   152,
-+     156,   160,   170,   185,   193,   196,   203,   207,   211,   215,
-+     223,   227,   231,   235,   239,   255,   265,   273,   276,   280,
-+     287,   303,   308,   327,   341,   348,   349,   350,   357,   361,
-+     362,   366,   367,   371,   372,   376,   377,   381,   382,   386,
-+     387,   391,   392,   393,   397,   398,   399,   400,   401,   405,
-+     406,   407,   411,   412,   413,   417,   418,   419,   420,   424,
-+     425,   426,   427,   432,   435,   439,   447,   450,   454,   462,
-+     466,   470
- };
- #endif
-@@ -546,25 +513,25 @@ static const yytype_uint16 yyrline[] =
-    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
- static const char *const yytname[] =
- {
--  "$end", "error", "$undefined", "DT_V1", "DT_MEMRESERVE", "DT_LSHIFT",
--  "DT_RSHIFT", "DT_LE", "DT_GE", "DT_EQ", "DT_NE", "DT_AND", "DT_OR",
--  "DT_BITS", "DT_DEL_PROP", "DT_DEL_NODE", "DT_PROPNODENAME", "DT_LITERAL",
--  "DT_CHAR_LITERAL", "DT_BASE", "DT_BYTE", "DT_STRING", "DT_LABEL",
-+  "$end", "error", "$undefined", "DT_V1", "DT_PLUGIN", "DT_MEMRESERVE",
-+  "DT_LSHIFT", "DT_RSHIFT", "DT_LE", "DT_GE", "DT_EQ", "DT_NE", "DT_AND",
-+  "DT_OR", "DT_BITS", "DT_DEL_PROP", "DT_DEL_NODE", "DT_PROPNODENAME",
-+  "DT_LITERAL", "DT_CHAR_LITERAL", "DT_BYTE", "DT_STRING", "DT_LABEL",
-   "DT_REF", "DT_INCBIN", "';'", "'/'", "'{'", "'}'", "'='", "'>'", "'['",
-   "']'", "'('", "','", "')'", "'<'", "'?'", "':'", "'|'", "'^'", "'&'",
-   "'+'", "'-'", "'*'", "'%'", "'~'", "'!'", "$accept", "sourcefile",
--  "memreserves", "memreserve", "devicetree", "nodedef", "proplist",
--  "propdef", "propdata", "propdataprefix", "arrayprefix", "integer_prim",
--  "integer_expr", "integer_trinary", "integer_or", "integer_and",
--  "integer_bitor", "integer_bitxor", "integer_bitand", "integer_eq",
--  "integer_rela", "integer_shift", "integer_add", "integer_mul",
--  "integer_unary", "bytestring", "subnodes", "subnode", YY_NULL
-+  "plugindecl", "memreserves", "memreserve", "devicetree", "nodedef",
-+  "proplist", "propdef", "propdata", "propdataprefix", "arrayprefix",
-+  "integer_prim", "integer_expr", "integer_trinary", "integer_or",
-+  "integer_and", "integer_bitor", "integer_bitxor", "integer_bitand",
-+  "integer_eq", "integer_rela", "integer_shift", "integer_add",
-+  "integer_mul", "integer_unary", "bytestring", "subnodes", "subnode", YY_NULLPTR
- };
- #endif
- # ifdef YYPRINT
--/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
--   token YYLEX-NUM.  */
-+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
-+   (internal) symbol number NUM (which must be that of a token).  */
- static const yytype_uint16 yytoknum[] =
- {
-        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
-@@ -575,183 +542,173 @@ static const yytype_uint16 yytoknum[] =
- };
- # endif
--/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
--static const yytype_uint8 yyr1[] =
--{
--       0,    48,    49,    50,    50,    51,    51,    52,    52,    52,
--      52,    53,    54,    54,    55,    55,    55,    55,    56,    56,
--      56,    56,    56,    56,    56,    57,    57,    57,    58,    58,
--      58,    58,    58,    59,    59,    59,    60,    61,    61,    62,
--      62,    63,    63,    64,    64,    65,    65,    66,    66,    67,
--      67,    67,    68,    68,    68,    68,    68,    69,    69,    69,
--      70,    70,    70,    71,    71,    71,    71,    72,    72,    72,
--      72,    73,    73,    73,    74,    74,    74,    75,    75,    75
--};
-+#define YYPACT_NINF -41
--/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
--static const yytype_uint8 yyr2[] =
-+#define yypact_value_is_default(Yystate) \
-+  (!!((Yystate) == (-41)))
-+
-+#define YYTABLE_NINF -1
-+
-+#define yytable_value_is_error(Yytable_value) \
-+  0
-+
-+  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-+     STATE-NUM.  */
-+static const yytype_int8 yypact[] =
- {
--       0,     2,     4,     0,     2,     4,     2,     2,     3,     3,
--       4,     5,     0,     2,     4,     2,     3,     2,     2,     3,
--       4,     2,     9,     5,     2,     0,     2,     2,     3,     1,
--       2,     2,     2,     1,     1,     3,     1,     1,     5,     1,
--       3,     1,     3,     1,     3,     1,     3,     1,     3,     1,
--       3,     3,     1,     3,     3,     3,     3,     3,     3,     1,
--       3,     3,     1,     3,     3,     3,     1,     1,     2,     2,
--       2,     0,     2,     2,     0,     2,     2,     2,     3,     2
-+      37,    10,    24,    78,   -41,    20,     9,   -41,     8,     9,
-+      59,     9,   -41,   -41,   -10,     8,   -41,    60,    39,   -41,
-+     -10,   -10,   -10,   -41,    51,   -41,    -7,    76,    50,    52,
-+      53,    49,     2,    65,    32,    -1,   -41,    66,   -41,   -41,
-+      67,    60,    60,   -41,   -41,   -41,   -41,   -10,   -10,   -10,
-+     -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,   -10,
-+     -10,   -10,   -10,   -10,   -10,   -10,   -41,    41,    68,   -41,
-+     -41,    76,    57,    50,    52,    53,    49,     2,     2,    65,
-+      65,    65,    65,    32,    32,    -1,    -1,   -41,   -41,   -41,
-+      79,    80,   -12,    41,   -41,    70,    41,   -41,   -10,    74,
-+      75,   -41,   -41,   -41,   -41,   -41,    77,   -41,   -41,   -41,
-+     -41,   -41,    17,    -2,   -41,   -41,   -41,   -41,    83,   -41,
-+     -41,   -41,    71,   -41,   -41,    31,    69,    82,    -4,   -41,
-+     -41,   -41,   -41,   -41,    42,   -41,   -41,   -41,     8,   -41,
-+      72,     8,    73,   -41
- };
--/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
--   Performed when YYTABLE doesn't specify something else to do.  Zero
--   means the default is an error.  */
-+  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
-+     Performed when YYTABLE does not specify something else to do.  Zero
-+     means the default is an error.  */
- static const yytype_uint8 yydefact[] =
- {
--       0,     0,     0,     3,     1,     0,     0,     0,     3,    33,
--      34,     0,     0,     6,     0,     2,     4,     0,     0,     0,
--      67,     0,    36,    37,    39,    41,    43,    45,    47,    49,
--      52,    59,    62,    66,     0,    12,     7,     0,     0,     0,
--      68,    69,    70,    35,     0,     0,     0,     0,     0,     0,
-+       0,     0,     0,     3,     1,     0,     5,     4,     0,     0,
-+       0,     5,    35,    36,     0,     0,     8,     0,     2,     6,
-+       0,     0,     0,    69,     0,    38,    39,    41,    43,    45,
-+      47,    49,    51,    54,    61,    64,    68,     0,    14,     9,
-+       0,     0,     0,    70,    71,    72,    37,     0,     0,     0,
-        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
--       0,     0,     0,     5,    74,     0,     9,     8,    40,     0,
--      42,    44,    46,    48,    50,    51,    55,    56,    54,    53,
--      57,    58,    60,    61,    64,    63,    65,     0,     0,     0,
--       0,    13,     0,    74,    10,     0,     0,     0,    15,    25,
--      77,    17,    79,     0,    76,    75,    38,    16,    78,     0,
--       0,    11,    24,    14,    26,     0,    18,    27,    21,     0,
--      71,    29,     0,     0,     0,     0,    32,    31,    19,    30,
--      28,     0,    72,    73,    20,     0,    23,     0,     0,     0,
--      22
-+       0,     0,     0,     0,     0,     0,     7,    76,     0,    11,
-+      10,    42,     0,    44,    46,    48,    50,    52,    53,    57,
-+      58,    56,    55,    59,    60,    62,    63,    66,    65,    67,
-+       0,     0,     0,     0,    15,     0,    76,    12,     0,     0,
-+       0,    17,    27,    79,    19,    81,     0,    78,    77,    40,
-+      18,    80,     0,     0,    13,    26,    16,    28,     0,    20,
-+      29,    23,     0,    73,    31,     0,     0,     0,     0,    34,
-+      33,    21,    32,    30,     0,    74,    75,    22,     0,    25,
-+       0,     0,     0,    24
- };
--/* YYDEFGOTO[NTERM-NUM].  */
--static const yytype_int8 yydefgoto[] =
-+  /* YYPGOTO[NTERM-NUM].  */
-+static const yytype_int8 yypgoto[] =
- {
--      -1,     2,     7,     8,    15,    36,    64,    91,   109,   110,
--     122,    20,    21,    22,    23,    24,    25,    26,    27,    28,
--      29,    30,    31,    32,    33,   125,    92,    93
-+     -41,   -41,   -41,    96,   100,   -41,   -40,   -41,   -23,   -41,
-+     -41,   -41,    -8,    62,    13,   -41,    81,    63,    64,    84,
-+      61,    25,    11,    21,    22,   -17,   -41,    19,    23
- };
--/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
--   STATE-NUM.  */
--#define YYPACT_NINF -78
--static const yytype_int8 yypact[] =
-+  /* YYDEFGOTO[NTERM-NUM].  */
-+static const yytype_int16 yydefgoto[] =
- {
--      22,    11,    51,    10,   -78,    23,    10,     2,    10,   -78,
--     -78,    -9,    23,   -78,    30,    38,   -78,    -9,    -9,    -9,
--     -78,    35,   -78,    -6,    52,    29,    48,    49,    33,     3,
--      71,    36,     0,   -78,    64,   -78,   -78,    68,    30,    30,
--     -78,   -78,   -78,   -78,    -9,    -9,    -9,    -9,    -9,    -9,
--      -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,    -9,
--      -9,    -9,    -9,   -78,    44,    67,   -78,   -78,    52,    55,
--      29,    48,    49,    33,     3,     3,    71,    71,    71,    71,
--      36,    36,     0,     0,   -78,   -78,   -78,    78,    79,    42,
--      44,   -78,    69,    44,   -78,    -9,    73,    74,   -78,   -78,
--     -78,   -78,   -78,    75,   -78,   -78,   -78,   -78,   -78,    -7,
--      -1,   -78,   -78,   -78,   -78,    84,   -78,   -78,   -78,    63,
--     -78,   -78,    32,    66,    82,    -3,   -78,   -78,   -78,   -78,
--     -78,    46,   -78,   -78,   -78,    23,   -78,    70,    23,    72,
--     -78
-+      -1,     2,     6,    10,    11,    18,    39,    67,    94,   112,
-+     113,   125,    23,    24,    25,    26,    27,    28,    29,    30,
-+      31,    32,    33,    34,    35,    36,   128,    95,    96
- };
--/* YYPGOTO[NTERM-NUM].  */
--static const yytype_int8 yypgoto[] =
-+  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
-+     positive, shift that token.  If negative, reduce the rule whose
-+     number is the opposite.  If YYTABLE_NINF, syntax error.  */
-+static const yytype_uint8 yytable[] =
- {
--     -78,   -78,    97,   100,   -78,   -37,   -78,   -77,   -78,   -78,
--     -78,    -5,    65,    13,   -78,    76,    77,    62,    80,    83,
--      34,    20,    26,    28,   -14,   -78,    18,    24
-+      15,    69,    70,    43,    44,    45,    47,    37,    12,    13,
-+      55,    56,   118,   101,     8,    38,   135,   102,   136,   119,
-+     120,   121,   122,    14,     4,    63,    12,    13,   137,   123,
-+      48,     9,    57,    20,   124,     3,    21,    22,    58,   115,
-+       1,    14,   116,    64,    65,     7,    87,    88,    89,    12,
-+      13,   117,   103,   129,   130,    40,    90,    91,    92,    53,
-+      54,   131,    41,    93,    14,    42,    79,    80,    81,    82,
-+     104,    59,    60,   107,    61,    62,   138,   139,    77,    78,
-+      83,    84,     5,    85,    86,    17,    46,    38,    49,    50,
-+      68,    66,    51,    97,    52,    98,    99,   100,   106,   110,
-+     111,   126,   114,   134,   127,   133,   141,    19,   143,    16,
-+      72,   109,    73,    76,    74,   108,   105,   132,     0,     0,
-+       0,     0,     0,     0,     0,     0,     0,     0,    71,     0,
-+     140,     0,     0,   142,     0,    75
- };
--/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
--   positive, shift that token.  If negative, reduce the rule which
--   number is the opposite.  If YYTABLE_NINF, syntax error.  */
--#define YYTABLE_NINF -1
--static const yytype_uint8 yytable[] =
-+static const yytype_int16 yycheck[] =
- {
--      12,    66,    67,    40,    41,    42,    44,    34,     9,    10,
--      52,    53,   115,   101,     5,   112,   104,   132,   113,   133,
--     116,   117,   118,   119,    11,     1,    60,   114,    14,   134,
--     120,    45,     6,    54,    17,   121,     3,    18,    19,    55,
--       9,    10,    50,    51,    61,    62,    84,    85,    86,     9,
--      10,     4,   100,    37,   126,   127,    11,    35,    87,    88,
--      89,    38,   128,    46,    39,    11,    90,    98,    47,    35,
--      43,    99,    76,    77,    78,    79,    56,    57,    58,    59,
--     135,   136,    80,    81,    74,    75,    82,    83,    48,    63,
--      49,    65,    94,    95,    96,    97,   124,   103,   107,   108,
--     111,   123,   130,   131,   138,    16,    13,   140,   106,    71,
--      69,   105,     0,     0,   102,     0,     0,   129,     0,     0,
--      68,     0,     0,    70,     0,     0,     0,     0,    72,     0,
--     137,     0,    73,   139
-+       8,    41,    42,    20,    21,    22,    13,    15,    18,    19,
-+       8,     9,    14,    25,     5,    27,    20,    29,    22,    21,
-+      22,    23,    24,    33,     0,    26,    18,    19,    32,    31,
-+      37,    22,    30,    43,    36,    25,    46,    47,    36,    22,
-+       3,    33,    25,    44,    45,    25,    63,    64,    65,    18,
-+      19,    34,    92,    22,    23,    16,    15,    16,    17,    10,
-+      11,    30,    23,    22,    33,    26,    55,    56,    57,    58,
-+      93,     6,     7,    96,    42,    43,    34,    35,    53,    54,
-+      59,    60,     4,    61,    62,    26,    35,    27,    12,    39,
-+      23,    25,    40,    25,    41,    38,    17,    17,    28,    25,
-+      25,    18,    25,    21,    33,    36,    34,    11,    35,     9,
-+      48,    98,    49,    52,    50,    96,    93,   125,    -1,    -1,
-+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    47,    -1,
-+     138,    -1,    -1,   141,    -1,    51
- };
--#define yypact_value_is_default(Yystate) \
--  (!!((Yystate) == (-78)))
--
--#define yytable_value_is_error(Yytable_value) \
--  YYID (0)
-+  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-+     symbol of state STATE-NUM.  */
-+static const yytype_uint8 yystos[] =
-+{
-+       0,     3,    49,    25,     0,     4,    50,    25,     5,    22,
-+      51,    52,    18,    19,    33,    60,    52,    26,    53,    51,
-+      43,    46,    47,    60,    61,    62,    63,    64,    65,    66,
-+      67,    68,    69,    70,    71,    72,    73,    60,    27,    54,
-+      16,    23,    26,    73,    73,    73,    35,    13,    37,    12,
-+      39,    40,    41,    10,    11,     8,     9,    30,    36,     6,
-+       7,    42,    43,    26,    44,    45,    25,    55,    23,    54,
-+      54,    64,    61,    65,    66,    67,    68,    69,    69,    70,
-+      70,    70,    70,    71,    71,    72,    72,    73,    73,    73,
-+      15,    16,    17,    22,    56,    75,    76,    25,    38,    17,
-+      17,    25,    29,    54,    56,    76,    28,    56,    75,    62,
-+      25,    25,    57,    58,    25,    22,    25,    34,    14,    21,
-+      22,    23,    24,    31,    36,    59,    18,    33,    74,    22,
-+      23,    30,    60,    36,    21,    20,    22,    32,    34,    35,
-+      60,    34,    60,    35
-+};
--static const yytype_int16 yycheck[] =
-+  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-+static const yytype_uint8 yyr1[] =
- {
--       5,    38,    39,    17,    18,    19,    12,    12,    17,    18,
--       7,     8,    13,    90,     4,    22,    93,    20,    25,    22,
--      21,    22,    23,    24,    33,     3,    26,    34,    26,    32,
--      31,    37,    22,    30,    43,    36,    25,    46,    47,    36,
--      17,    18,     9,    10,    44,    45,    60,    61,    62,    17,
--      18,     0,    89,    15,    22,    23,    33,    27,    14,    15,
--      16,    23,    30,    11,    26,    33,    22,    25,    39,    27,
--      35,    29,    52,    53,    54,    55,     5,     6,    42,    43,
--      34,    35,    56,    57,    50,    51,    58,    59,    40,    25,
--      41,    23,    25,    38,    16,    16,    33,    28,    25,    25,
--      25,    17,    36,    21,    34,     8,     6,    35,    95,    47,
--      45,    93,    -1,    -1,    90,    -1,    -1,   122,    -1,    -1,
--      44,    -1,    -1,    46,    -1,    -1,    -1,    -1,    48,    -1,
--     135,    -1,    49,   138
-+       0,    48,    49,    50,    50,    51,    51,    52,    52,    53,
-+      53,    53,    53,    54,    55,    55,    56,    56,    56,    56,
-+      57,    57,    57,    57,    57,    57,    57,    58,    58,    58,
-+      59,    59,    59,    59,    59,    60,    60,    60,    61,    62,
-+      62,    63,    63,    64,    64,    65,    65,    66,    66,    67,
-+      67,    68,    68,    68,    69,    69,    69,    69,    69,    70,
-+      70,    70,    71,    71,    71,    72,    72,    72,    72,    73,
-+      73,    73,    73,    74,    74,    74,    75,    75,    75,    76,
-+      76,    76
- };
--/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
--   symbol of state STATE-NUM.  */
--static const yytype_uint8 yystos[] =
-+  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
-+static const yytype_uint8 yyr2[] =
- {
--       0,     3,    49,    25,     0,     4,    22,    50,    51,    17,
--      18,    33,    59,    51,    26,    52,    50,    43,    46,    47,
--      59,    60,    61,    62,    63,    64,    65,    66,    67,    68,
--      69,    70,    71,    72,    59,    27,    53,    15,    23,    26,
--      72,    72,    72,    35,    12,    37,    11,    39,    40,    41,
--       9,    10,     7,     8,    30,    36,     5,     6,    42,    43,
--      26,    44,    45,    25,    54,    23,    53,    53,    63,    60,
--      64,    65,    66,    67,    68,    68,    69,    69,    69,    69,
--      70,    70,    71,    71,    72,    72,    72,    14,    15,    16,
--      22,    55,    74,    75,    25,    38,    16,    16,    25,    29,
--      53,    55,    75,    28,    55,    74,    61,    25,    25,    56,
--      57,    25,    22,    25,    34,    13,    21,    22,    23,    24,
--      31,    36,    58,    17,    33,    73,    22,    23,    30,    59,
--      36,    21,    20,    22,    32,    34,    35,    59,    34,    59,
--      35
-+       0,     2,     5,     0,     2,     0,     2,     4,     2,     2,
-+       3,     3,     4,     5,     0,     2,     4,     2,     3,     2,
-+       2,     3,     4,     2,     9,     5,     2,     0,     2,     2,
-+       3,     1,     2,     2,     2,     1,     1,     3,     1,     1,
-+       5,     1,     3,     1,     3,     1,     3,     1,     3,     1,
-+       3,     1,     3,     3,     1,     3,     3,     3,     3,     3,
-+       3,     1,     3,     3,     1,     3,     3,     3,     1,     1,
-+       2,     2,     2,     0,     2,     2,     0,     2,     2,     2,
-+       3,     2
- };
--#define yyerrok               (yyerrstatus = 0)
--#define yyclearin     (yychar = YYEMPTY)
--#define YYEMPTY               (-2)
--#define YYEOF         0
--
--#define YYACCEPT      goto yyacceptlab
--#define YYABORT               goto yyabortlab
--#define YYERROR               goto yyerrorlab
--
--
--/* Like YYERROR except do call yyerror.  This remains here temporarily
--   to ease the transition to the new meaning of YYERROR, for GCC.
--   Once GCC version 2 has supplanted version 1, this can go.  However,
--   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
--   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
--   discussed.  */
--
--#define YYFAIL                goto yyerrlab
--#if defined YYFAIL
--  /* This is here to suppress warnings from the GCC cpp's
--     -Wunused-macros.  Normally we don't worry about that warning, but
--     some users do, and we want to make it easy for users to remove
--     YYFAIL uses, which will produce warnings from Bison 2.5.  */
--#endif
-+
-+#define yyerrok         (yyerrstatus = 0)
-+#define yyclearin       (yychar = YYEMPTY)
-+#define YYEMPTY         (-2)
-+#define YYEOF           0
-+
-+#define YYACCEPT        goto yyacceptlab
-+#define YYABORT         goto yyabortlab
-+#define YYERROR         goto yyerrorlab
-+
- #define YYRECOVERING()  (!!yyerrstatus)
-@@ -768,27 +725,41 @@ do
-   else                                                          \
-     {                                                           \
-       yyerror (YY_("syntax error: cannot back up")); \
--      YYERROR;                                                        \
--    }                                                         \
--while (YYID (0))
-+      YYERROR;                                                  \
-+    }                                                           \
-+while (0)
- /* Error token number */
--#define YYTERROR      1
--#define YYERRCODE     256
-+#define YYTERROR        1
-+#define YYERRCODE       256
--/* This macro is provided for backward compatibility. */
--#ifndef YY_LOCATION_PRINT
--# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-+   If N is 0, then set CURRENT to the empty location which ends
-+   the previous symbol: RHS[0] (always defined).  */
-+
-+#ifndef YYLLOC_DEFAULT
-+# define YYLLOC_DEFAULT(Current, Rhs, N)                                \
-+    do                                                                  \
-+      if (N)                                                            \
-+        {                                                               \
-+          (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
-+          (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
-+          (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
-+          (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
-+        }                                                               \
-+      else                                                              \
-+        {                                                               \
-+          (Current).first_line   = (Current).last_line   =              \
-+            YYRHSLOC (Rhs, 0).last_line;                                \
-+          (Current).first_column = (Current).last_column =              \
-+            YYRHSLOC (Rhs, 0).last_column;                              \
-+        }                                                               \
-+    while (0)
- #endif
-+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
--/* YYLEX -- calling `yylex' with the right arguments.  */
--#ifdef YYLEX_PARAM
--# define YYLEX yylex (YYLEX_PARAM)
--#else
--# define YYLEX yylex ()
--#endif
- /* Enable debugging if requested.  */
- #if YYDEBUG
-@@ -798,50 +769,84 @@ while (YYID (0))
- #  define YYFPRINTF fprintf
- # endif
--# define YYDPRINTF(Args)                      \
--do {                                          \
--  if (yydebug)                                        \
--    YYFPRINTF Args;                           \
--} while (YYID (0))
--
--# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                          \
--do {                                                                    \
--  if (yydebug)                                                                  \
--    {                                                                   \
--      YYFPRINTF (stderr, "%s ", Title);                                         \
--      yy_symbol_print (stderr,                                                  \
--                Type, Value); \
--      YYFPRINTF (stderr, "\n");                                                 \
--    }                                                                   \
--} while (YYID (0))
-+# define YYDPRINTF(Args)                        \
-+do {                                            \
-+  if (yydebug)                                  \
-+    YYFPRINTF Args;                             \
-+} while (0)
--/*--------------------------------.
--| Print this symbol on YYOUTPUT.  |
--`--------------------------------*/
-+/* YY_LOCATION_PRINT -- Print the location on the stream.
-+   This macro was not mandated originally: define only if we know
-+   we won't break user code: when these are the locations we know.  */
--/*ARGSUSED*/
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
--static void
--yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
--#else
--static void
--yy_symbol_value_print (yyoutput, yytype, yyvaluep)
--    FILE *yyoutput;
--    int yytype;
--    YYSTYPE const * const yyvaluep;
-+#ifndef YY_LOCATION_PRINT
-+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-+
-+/* Print *YYLOCP on YYO.  Private, do not rely on its existence. */
-+
-+YY_ATTRIBUTE_UNUSED
-+static unsigned
-+yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp)
-+{
-+  unsigned res = 0;
-+  int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
-+  if (0 <= yylocp->first_line)
-+    {
-+      res += YYFPRINTF (yyo, "%d", yylocp->first_line);
-+      if (0 <= yylocp->first_column)
-+        res += YYFPRINTF (yyo, ".%d", yylocp->first_column);
-+    }
-+  if (0 <= yylocp->last_line)
-+    {
-+      if (yylocp->first_line < yylocp->last_line)
-+        {
-+          res += YYFPRINTF (yyo, "-%d", yylocp->last_line);
-+          if (0 <= end_col)
-+            res += YYFPRINTF (yyo, ".%d", end_col);
-+        }
-+      else if (0 <= end_col && yylocp->first_column < end_col)
-+        res += YYFPRINTF (yyo, "-%d", end_col);
-+    }
-+  return res;
-+ }
-+
-+#  define YY_LOCATION_PRINT(File, Loc)          \
-+  yy_location_print_ (File, &(Loc))
-+
-+# else
-+#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-+# endif
- #endif
-+
-+
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
-+do {                                                                      \
-+  if (yydebug)                                                            \
-+    {                                                                     \
-+      YYFPRINTF (stderr, "%s ", Title);                                   \
-+      yy_symbol_print (stderr,                                            \
-+                  Type, Value, Location); \
-+      YYFPRINTF (stderr, "\n");                                           \
-+    }                                                                     \
-+} while (0)
-+
-+
-+/*----------------------------------------.
-+| Print this symbol's value on YYOUTPUT.  |
-+`----------------------------------------*/
-+
-+static void
-+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
- {
-   FILE *yyo = yyoutput;
-   YYUSE (yyo);
-+  YYUSE (yylocationp);
-   if (!yyvaluep)
-     return;
- # ifdef YYPRINT
-   if (yytype < YYNTOKENS)
-     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
--# else
--  YYUSE (yyoutput);
- # endif
-   YYUSE (yytype);
- }
-@@ -851,24 +856,15 @@ yy_symbol_value_print (yyoutput, yytype,
- | Print this symbol on YYOUTPUT.  |
- `--------------------------------*/
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
--static void
--yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
--#else
- static void
--yy_symbol_print (yyoutput, yytype, yyvaluep)
--    FILE *yyoutput;
--    int yytype;
--    YYSTYPE const * const yyvaluep;
--#endif
-+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)
- {
--  if (yytype < YYNTOKENS)
--    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
--  else
--    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-+  YYFPRINTF (yyoutput, "%s %s (",
-+             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
--  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
-+  YY_LOCATION_PRINT (yyoutput, *yylocationp);
-+  YYFPRINTF (yyoutput, ": ");
-+  yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);
-   YYFPRINTF (yyoutput, ")");
- }
-@@ -877,16 +873,8 @@ yy_symbol_print (yyoutput, yytype, yyval
- | TOP (included).                                                   |
- `------------------------------------------------------------------*/
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
- static void
- yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
--#else
--static void
--yy_stack_print (yybottom, yytop)
--    yytype_int16 *yybottom;
--    yytype_int16 *yytop;
--#endif
- {
-   YYFPRINTF (stderr, "Stack now");
-   for (; yybottom <= yytop; yybottom++)
-@@ -897,49 +885,42 @@ yy_stack_print (yybottom, yytop)
-   YYFPRINTF (stderr, "\n");
- }
--# define YY_STACK_PRINT(Bottom, Top)                          \
--do {                                                          \
--  if (yydebug)                                                        \
--    yy_stack_print ((Bottom), (Top));                         \
--} while (YYID (0))
-+# define YY_STACK_PRINT(Bottom, Top)                            \
-+do {                                                            \
-+  if (yydebug)                                                  \
-+    yy_stack_print ((Bottom), (Top));                           \
-+} while (0)
- /*------------------------------------------------.
- | Report that the YYRULE is going to be reduced.  |
- `------------------------------------------------*/
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
--static void
--yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
--#else
- static void
--yy_reduce_print (yyvsp, yyrule)
--    YYSTYPE *yyvsp;
--    int yyrule;
--#endif
-+yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)
- {
-+  unsigned long int yylno = yyrline[yyrule];
-   int yynrhs = yyr2[yyrule];
-   int yyi;
--  unsigned long int yylno = yyrline[yyrule];
-   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
--           yyrule - 1, yylno);
-+             yyrule - 1, yylno);
-   /* The symbols being reduced.  */
-   for (yyi = 0; yyi < yynrhs; yyi++)
-     {
-       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
--      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
--                     &(yyvsp[(yyi + 1) - (yynrhs)])
--                                     );
-+      yy_symbol_print (stderr,
-+                       yystos[yyssp[yyi + 1 - yynrhs]],
-+                       &(yyvsp[(yyi + 1) - (yynrhs)])
-+                       , &(yylsp[(yyi + 1) - (yynrhs)])                       );
-       YYFPRINTF (stderr, "\n");
-     }
- }
--# define YY_REDUCE_PRINT(Rule)                \
--do {                                  \
--  if (yydebug)                                \
--    yy_reduce_print (yyvsp, Rule); \
--} while (YYID (0))
-+# define YY_REDUCE_PRINT(Rule)          \
-+do {                                    \
-+  if (yydebug)                          \
-+    yy_reduce_print (yyssp, yyvsp, yylsp, Rule); \
-+} while (0)
- /* Nonzero means print parse trace.  It is left uninitialized so that
-    multiple parsers can coexist.  */
-@@ -953,7 +934,7 @@ int yydebug;
- /* YYINITDEPTH -- initial size of the parser's stacks.  */
--#ifndef       YYINITDEPTH
-+#ifndef YYINITDEPTH
- # define YYINITDEPTH 200
- #endif
-@@ -976,15 +957,8 @@ int yydebug;
- #   define yystrlen strlen
- #  else
- /* Return the length of YYSTR.  */
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
- static YYSIZE_T
- yystrlen (const char *yystr)
--#else
--static YYSIZE_T
--yystrlen (yystr)
--    const char *yystr;
--#endif
- {
-   YYSIZE_T yylen;
-   for (yylen = 0; yystr[yylen]; yylen++)
-@@ -1000,16 +974,8 @@ yystrlen (yystr)
- #  else
- /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-    YYDEST.  */
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
- static char *
- yystpcpy (char *yydest, const char *yysrc)
--#else
--static char *
--yystpcpy (yydest, yysrc)
--    char *yydest;
--    const char *yysrc;
--#endif
- {
-   char *yyd = yydest;
-   const char *yys = yysrc;
-@@ -1039,27 +1005,27 @@ yytnamerr (char *yyres, const char *yyst
-       char const *yyp = yystr;
-       for (;;)
--      switch (*++yyp)
--        {
--        case '\'':
--        case ',':
--          goto do_not_strip_quotes;
--
--        case '\\':
--          if (*++yyp != '\\')
--            goto do_not_strip_quotes;
--          /* Fall through.  */
--        default:
--          if (yyres)
--            yyres[yyn] = *yyp;
--          yyn++;
--          break;
--
--        case '"':
--          if (yyres)
--            yyres[yyn] = '\0';
--          return yyn;
--        }
-+        switch (*++yyp)
-+          {
-+          case '\'':
-+          case ',':
-+            goto do_not_strip_quotes;
-+
-+          case '\\':
-+            if (*++yyp != '\\')
-+              goto do_not_strip_quotes;
-+            /* Fall through.  */
-+          default:
-+            if (yyres)
-+              yyres[yyn] = *yyp;
-+            yyn++;
-+            break;
-+
-+          case '"':
-+            if (yyres)
-+              yyres[yyn] = '\0';
-+            return yyn;
-+          }
-     do_not_strip_quotes: ;
-     }
-@@ -1082,11 +1048,11 @@ static int
- yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
-                 yytype_int16 *yyssp, int yytoken)
- {
--  YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
-+  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
-   YYSIZE_T yysize = yysize0;
-   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
-   /* Internationalized format string. */
--  const char *yyformat = YY_NULL;
-+  const char *yyformat = YY_NULLPTR;
-   /* Arguments of yyformat. */
-   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-   /* Number of reported tokens (one for the "unexpected", one per
-@@ -1094,10 +1060,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
-   int yycount = 0;
-   /* There are many possibilities here to consider:
--     - Assume YYFAIL is not used.  It's too flawed to consider.  See
--       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
--       for details.  YYERROR is fine as it does not invoke this
--       function.
-      - If this state is a consistent state with a default action, then
-        the only way this function was invoked is if the default action
-        is an error action.  In that case, don't check for expected
-@@ -1147,7 +1109,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
-                   }
-                 yyarg[yycount++] = yytname[yyx];
-                 {
--                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
-+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
-                   if (! (yysize <= yysize1
-                          && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                     return 2;
-@@ -1214,26 +1176,18 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, c
- | Release the memory associated to this symbol.  |
- `-----------------------------------------------*/
--/*ARGSUSED*/
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
--static void
--yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
--#else
- static void
--yydestruct (yymsg, yytype, yyvaluep)
--    const char *yymsg;
--    int yytype;
--    YYSTYPE *yyvaluep;
--#endif
-+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)
- {
-   YYUSE (yyvaluep);
--
-+  YYUSE (yylocationp);
-   if (!yymsg)
-     yymsg = "Deleting";
-   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-   YYUSE (yytype);
-+  YY_IGNORE_MAYBE_UNINITIALIZED_END
- }
-@@ -1242,18 +1196,14 @@ yydestruct (yymsg, yytype, yyvaluep)
- /* The lookahead symbol.  */
- int yychar;
--
--#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
--# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
--# define YY_IGNORE_MAYBE_UNINITIALIZED_END
--#endif
--#ifndef YY_INITIAL_VALUE
--# define YY_INITIAL_VALUE(Value) /* Nothing. */
--#endif
--
- /* The semantic value of the lookahead symbol.  */
--YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
--
-+YYSTYPE yylval;
-+/* Location data for the lookahead symbol.  */
-+YYLTYPE yylloc
-+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
-+  = { 1, 1, 1, 1 }
-+# endif
-+;
- /* Number of syntax errors so far.  */
- int yynerrs;
-@@ -1262,35 +1212,17 @@ int yynerrs;
- | yyparse.  |
- `----------*/
--#ifdef YYPARSE_PARAM
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
--int
--yyparse (void *YYPARSE_PARAM)
--#else
--int
--yyparse (YYPARSE_PARAM)
--    void *YYPARSE_PARAM;
--#endif
--#else /* ! YYPARSE_PARAM */
--#if (defined __STDC__ || defined __C99__FUNC__ \
--     || defined __cplusplus || defined _MSC_VER)
- int
- yyparse (void)
--#else
--int
--yyparse ()
--
--#endif
--#endif
- {
-     int yystate;
-     /* Number of tokens to shift before error messages enabled.  */
-     int yyerrstatus;
-     /* The stacks and their tools:
--       `yyss': related to states.
--       `yyvs': related to semantic values.
-+       'yyss': related to states.
-+       'yyvs': related to semantic values.
-+       'yyls': related to locations.
-        Refer to the stacks through separate pointers, to allow yyoverflow
-        to reallocate them elsewhere.  */
-@@ -1305,6 +1237,14 @@ yyparse ()
-     YYSTYPE *yyvs;
-     YYSTYPE *yyvsp;
-+    /* The location stack.  */
-+    YYLTYPE yylsa[YYINITDEPTH];
-+    YYLTYPE *yyls;
-+    YYLTYPE *yylsp;
-+
-+    /* The locations where the error started and ended.  */
-+    YYLTYPE yyerror_range[3];
-+
-     YYSIZE_T yystacksize;
-   int yyn;
-@@ -1314,6 +1254,7 @@ yyparse ()
-   /* The variables used to return semantic value and location from the
-      action routines.  */
-   YYSTYPE yyval;
-+  YYLTYPE yyloc;
- #if YYERROR_VERBOSE
-   /* Buffer for error messages, and its allocated size.  */
-@@ -1322,7 +1263,7 @@ yyparse ()
-   YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
- #endif
--#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
-+#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
-   /* The number of symbols on the RHS of the reduced rule.
-      Keep to zero when no symbol should be popped.  */
-@@ -1330,6 +1271,7 @@ yyparse ()
-   yyssp = yyss = yyssa;
-   yyvsp = yyvs = yyvsa;
-+  yylsp = yyls = yylsa;
-   yystacksize = YYINITDEPTH;
-   YYDPRINTF ((stderr, "Starting parse\n"));
-@@ -1338,6 +1280,7 @@ yyparse ()
-   yyerrstatus = 0;
-   yynerrs = 0;
-   yychar = YYEMPTY; /* Cause a token to be read.  */
-+  yylsp[0] = yylloc;
-   goto yysetstate;
- /*------------------------------------------------------------.
-@@ -1358,23 +1301,26 @@ yyparse ()
- #ifdef yyoverflow
-       {
--      /* Give user a chance to reallocate the stack.  Use copies of
--         these so that the &'s don't force the real ones into
--         memory.  */
--      YYSTYPE *yyvs1 = yyvs;
--      yytype_int16 *yyss1 = yyss;
--
--      /* Each stack pointer address is followed by the size of the
--         data in use in that stack, in bytes.  This used to be a
--         conditional around just the two extra args, but that might
--         be undefined if yyoverflow is a macro.  */
--      yyoverflow (YY_("memory exhausted"),
--                  &yyss1, yysize * sizeof (*yyssp),
--                  &yyvs1, yysize * sizeof (*yyvsp),
--                  &yystacksize);
--
--      yyss = yyss1;
--      yyvs = yyvs1;
-+        /* Give user a chance to reallocate the stack.  Use copies of
-+           these so that the &'s don't force the real ones into
-+           memory.  */
-+        YYSTYPE *yyvs1 = yyvs;
-+        yytype_int16 *yyss1 = yyss;
-+        YYLTYPE *yyls1 = yyls;
-+
-+        /* Each stack pointer address is followed by the size of the
-+           data in use in that stack, in bytes.  This used to be a
-+           conditional around just the two extra args, but that might
-+           be undefined if yyoverflow is a macro.  */
-+        yyoverflow (YY_("memory exhausted"),
-+                    &yyss1, yysize * sizeof (*yyssp),
-+                    &yyvs1, yysize * sizeof (*yyvsp),
-+                    &yyls1, yysize * sizeof (*yylsp),
-+                    &yystacksize);
-+
-+        yyls = yyls1;
-+        yyss = yyss1;
-+        yyvs = yyvs1;
-       }
- #else /* no yyoverflow */
- # ifndef YYSTACK_RELOCATE
-@@ -1382,34 +1328,36 @@ yyparse ()
- # else
-       /* Extend the stack our own way.  */
-       if (YYMAXDEPTH <= yystacksize)
--      goto yyexhaustedlab;
-+        goto yyexhaustedlab;
-       yystacksize *= 2;
-       if (YYMAXDEPTH < yystacksize)
--      yystacksize = YYMAXDEPTH;
-+        yystacksize = YYMAXDEPTH;
-       {
--      yytype_int16 *yyss1 = yyss;
--      union yyalloc *yyptr =
--        (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
--      if (! yyptr)
--        goto yyexhaustedlab;
--      YYSTACK_RELOCATE (yyss_alloc, yyss);
--      YYSTACK_RELOCATE (yyvs_alloc, yyvs);
-+        yytype_int16 *yyss1 = yyss;
-+        union yyalloc *yyptr =
-+          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-+        if (! yyptr)
-+          goto yyexhaustedlab;
-+        YYSTACK_RELOCATE (yyss_alloc, yyss);
-+        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
-+        YYSTACK_RELOCATE (yyls_alloc, yyls);
- #  undef YYSTACK_RELOCATE
--      if (yyss1 != yyssa)
--        YYSTACK_FREE (yyss1);
-+        if (yyss1 != yyssa)
-+          YYSTACK_FREE (yyss1);
-       }
- # endif
- #endif /* no yyoverflow */
-       yyssp = yyss + yysize - 1;
-       yyvsp = yyvs + yysize - 1;
-+      yylsp = yyls + yysize - 1;
-       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
--                (unsigned long int) yystacksize));
-+                  (unsigned long int) yystacksize));
-       if (yyss + yystacksize - 1 <= yyssp)
--      YYABORT;
-+        YYABORT;
-     }
-   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-@@ -1438,7 +1386,7 @@ yybackup:
-   if (yychar == YYEMPTY)
-     {
-       YYDPRINTF ((stderr, "Reading a token: "));
--      yychar = YYLEX;
-+      yychar = yylex ();
-     }
-   if (yychar <= YYEOF)
-@@ -1481,7 +1429,7 @@ yybackup:
-   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-   *++yyvsp = yylval;
-   YY_IGNORE_MAYBE_UNINITIALIZED_END
--
-+  *++yylsp = yylloc;
-   goto yynewstate;
-@@ -1503,7 +1451,7 @@ yyreduce:
-   yylen = yyr2[yyn];
-   /* If YYLEN is nonzero, implement the default value of the action:
--     `$$ = $1'.
-+     '$$ = $1'.
-      Otherwise, the following line sets YYVAL to garbage.
-      This behavior is undocumented and Bison
-@@ -1512,287 +1460,306 @@ yyreduce:
-      GCC warning that YYVAL may be used uninitialized.  */
-   yyval = yyvsp[1-yylen];
--
-+  /* Default location.  */
-+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
-   YY_REDUCE_PRINT (yyn);
-   switch (yyn)
-     {
-         case 2:
--/* Line 1787 of yacc.c  */
--#line 110 "dtc-parser.y"
-+#line 109 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node),
--                                                      guess_boot_cpuid((yyvsp[(4) - (4)].node)));
-+                      (yyvsp[0].node)->is_plugin = (yyvsp[-2].is_plugin);
-+                      (yyvsp[0].node)->is_root = 1;
-+                      the_boot_info = build_boot_info((yyvsp[-1].re), (yyvsp[0].node),
-+                                                      guess_boot_cpuid((yyvsp[0].node)));
-               }
-+#line 1477 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 3:
--/* Line 1787 of yacc.c  */
--#line 118 "dtc-parser.y"
-+#line 119 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.re) = NULL;
-+                      (yyval.is_plugin) = 0;
-               }
-+#line 1485 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 4:
--/* Line 1787 of yacc.c  */
--#line 122 "dtc-parser.y"
-+#line 123 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re));
-+                      (yyval.is_plugin) = 1;
-               }
-+#line 1493 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 5:
--/* Line 1787 of yacc.c  */
--#line 129 "dtc-parser.y"
-+#line 130 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.re) = build_reserve_entry((yyvsp[(2) - (4)].integer), (yyvsp[(3) - (4)].integer));
-+                      (yyval.re) = NULL;
-               }
-+#line 1501 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 6:
--/* Line 1787 of yacc.c  */
--#line 133 "dtc-parser.y"
-+#line 134 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      add_label(&(yyvsp[(2) - (2)].re)->labels, (yyvsp[(1) - (2)].labelref));
--                      (yyval.re) = (yyvsp[(2) - (2)].re);
-+                      (yyval.re) = chain_reserve_entry((yyvsp[-1].re), (yyvsp[0].re));
-               }
-+#line 1509 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 7:
--/* Line 1787 of yacc.c  */
--#line 141 "dtc-parser.y"
-+#line 141 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.node) = name_node((yyvsp[(2) - (2)].node), "");
-+                      (yyval.re) = build_reserve_entry((yyvsp[-2].integer), (yyvsp[-1].integer));
-               }
-+#line 1517 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 8:
--/* Line 1787 of yacc.c  */
--#line 145 "dtc-parser.y"
-+#line 145 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.node) = merge_nodes((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node));
-+                      add_label(&(yyvsp[0].re)->labels, (yyvsp[-1].labelref));
-+                      (yyval.re) = (yyvsp[0].re);
-               }
-+#line 1526 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 9:
--/* Line 1787 of yacc.c  */
--#line 149 "dtc-parser.y"
-+#line 153 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      struct node *target = get_node_by_ref((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].labelref));
--
--                      if (target)
--                              merge_nodes(target, (yyvsp[(3) - (3)].node));
--                      else
--                              print_error("label or path, '%s', not found", (yyvsp[(2) - (3)].labelref));
--                      (yyval.node) = (yyvsp[(1) - (3)].node);
-+                      (yyval.node) = name_node((yyvsp[0].node), "");
-               }
-+#line 1534 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 10:
--/* Line 1787 of yacc.c  */
--#line 159 "dtc-parser.y"
-+#line 157 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      struct node *target = get_node_by_ref((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].labelref));
--
--                      if (!target)
--                              print_error("label or path, '%s', not found", (yyvsp[(3) - (4)].labelref));
--                      else
--                              delete_node(target);
--
--                      (yyval.node) = (yyvsp[(1) - (4)].node);
-+                      (yyval.node) = merge_nodes((yyvsp[-2].node), (yyvsp[0].node));
-               }
-+#line 1542 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 11:
--/* Line 1787 of yacc.c  */
--#line 173 "dtc-parser.y"
-+#line 161 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist));
-+                      struct node *target = get_node_by_ref((yyvsp[-2].node), (yyvsp[-1].labelref));
-+
-+                      if (target)
-+                              merge_nodes(target, (yyvsp[0].node));
-+                      else
-+                              ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
-+                      (yyval.node) = (yyvsp[-2].node);
-               }
-+#line 1556 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 12:
--/* Line 1787 of yacc.c  */
--#line 180 "dtc-parser.y"
-+#line 171 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.proplist) = NULL;
-+                      struct node *target = get_node_by_ref((yyvsp[-3].node), (yyvsp[-1].labelref));
-+
-+                      if (target)
-+                              delete_node(target);
-+                      else
-+                              ERROR(&(yylsp[-1]), "Label or path %s not found", (yyvsp[-1].labelref));
-+
-+
-+                      (yyval.node) = (yyvsp[-3].node);
-               }
-+#line 1572 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 13:
--/* Line 1787 of yacc.c  */
--#line 184 "dtc-parser.y"
-+#line 186 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist));
-+                      (yyval.node) = build_node((yyvsp[-3].proplist), (yyvsp[-2].nodelist));
-               }
-+#line 1580 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 14:
--/* Line 1787 of yacc.c  */
--#line 191 "dtc-parser.y"
-+#line 193 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.prop) = build_property((yyvsp[(1) - (4)].propnodename), (yyvsp[(3) - (4)].data));
-+                      (yyval.proplist) = NULL;
-               }
-+#line 1588 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 15:
--/* Line 1787 of yacc.c  */
--#line 195 "dtc-parser.y"
-+#line 197 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.prop) = build_property((yyvsp[(1) - (2)].propnodename), empty_data);
-+                      (yyval.proplist) = chain_property((yyvsp[0].prop), (yyvsp[-1].proplist));
-               }
-+#line 1596 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 16:
--/* Line 1787 of yacc.c  */
--#line 199 "dtc-parser.y"
-+#line 204 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.prop) = build_property_delete((yyvsp[(2) - (3)].propnodename));
-+                      (yyval.prop) = build_property((yyvsp[-3].propnodename), (yyvsp[-1].data));
-               }
-+#line 1604 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 17:
--/* Line 1787 of yacc.c  */
--#line 203 "dtc-parser.y"
-+#line 208 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      add_label(&(yyvsp[(2) - (2)].prop)->labels, (yyvsp[(1) - (2)].labelref));
--                      (yyval.prop) = (yyvsp[(2) - (2)].prop);
-+                      (yyval.prop) = build_property((yyvsp[-1].propnodename), empty_data);
-               }
-+#line 1612 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 18:
--/* Line 1787 of yacc.c  */
--#line 211 "dtc-parser.y"
-+#line 212 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data));
-+                      (yyval.prop) = build_property_delete((yyvsp[-1].propnodename));
-               }
-+#line 1620 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 19:
--/* Line 1787 of yacc.c  */
--#line 215 "dtc-parser.y"
-+#line 216 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.data) = data_merge((yyvsp[(1) - (3)].data), (yyvsp[(2) - (3)].array).data);
-+                      add_label(&(yyvsp[0].prop)->labels, (yyvsp[-1].labelref));
-+                      (yyval.prop) = (yyvsp[0].prop);
-               }
-+#line 1629 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 20:
--/* Line 1787 of yacc.c  */
--#line 219 "dtc-parser.y"
-+#line 224 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data));
-+                      (yyval.data) = data_merge((yyvsp[-1].data), (yyvsp[0].data));
-               }
-+#line 1637 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 21:
--/* Line 1787 of yacc.c  */
--#line 223 "dtc-parser.y"
-+#line 228 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref));
-+                      (yyval.data) = data_merge((yyvsp[-2].data), (yyvsp[-1].array).data);
-               }
-+#line 1645 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 22:
--/* Line 1787 of yacc.c  */
--#line 227 "dtc-parser.y"
-+#line 232 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      FILE *f = srcfile_relative_open((yyvsp[(4) - (9)].data).val, NULL);
-+                      (yyval.data) = data_merge((yyvsp[-3].data), (yyvsp[-1].data));
-+              }
-+#line 1653 "dtc-parser.tab.c" /* yacc.c:1646  */
-+    break;
-+
-+  case 23:
-+#line 236 "dtc-parser.y" /* yacc.c:1646  */
-+    {
-+                      (yyval.data) = data_add_marker((yyvsp[-1].data), REF_PATH, (yyvsp[0].labelref));
-+              }
-+#line 1661 "dtc-parser.tab.c" /* yacc.c:1646  */
-+    break;
-+
-+  case 24:
-+#line 240 "dtc-parser.y" /* yacc.c:1646  */
-+    {
-+                      FILE *f = srcfile_relative_open((yyvsp[-5].data).val, NULL);
-                       struct data d;
--                      if ((yyvsp[(6) - (9)].integer) != 0)
--                              if (fseek(f, (yyvsp[(6) - (9)].integer), SEEK_SET) != 0)
--                                      print_error("Couldn't seek to offset %llu in \"%s\": %s",
--                                                   (unsigned long long)(yyvsp[(6) - (9)].integer),
--                                                   (yyvsp[(4) - (9)].data).val,
--                                                   strerror(errno));
-+                      if ((yyvsp[-3].integer) != 0)
-+                              if (fseek(f, (yyvsp[-3].integer), SEEK_SET) != 0)
-+                                      die("Couldn't seek to offset %llu in \"%s\": %s",
-+                                          (unsigned long long)(yyvsp[-3].integer), (yyvsp[-5].data).val,
-+                                          strerror(errno));
--                      d = data_copy_file(f, (yyvsp[(8) - (9)].integer));
-+                      d = data_copy_file(f, (yyvsp[-1].integer));
--                      (yyval.data) = data_merge((yyvsp[(1) - (9)].data), d);
-+                      (yyval.data) = data_merge((yyvsp[-8].data), d);
-                       fclose(f);
-               }
-+#line 1681 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 23:
--/* Line 1787 of yacc.c  */
--#line 244 "dtc-parser.y"
-+  case 25:
-+#line 256 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      FILE *f = srcfile_relative_open((yyvsp[(4) - (5)].data).val, NULL);
-+                      FILE *f = srcfile_relative_open((yyvsp[-1].data).val, NULL);
-                       struct data d = empty_data;
-                       d = data_copy_file(f, -1);
--                      (yyval.data) = data_merge((yyvsp[(1) - (5)].data), d);
-+                      (yyval.data) = data_merge((yyvsp[-4].data), d);
-                       fclose(f);
-               }
-+#line 1695 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 24:
--/* Line 1787 of yacc.c  */
--#line 254 "dtc-parser.y"
-+  case 26:
-+#line 266 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+                      (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
-               }
-+#line 1703 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 25:
--/* Line 1787 of yacc.c  */
--#line 261 "dtc-parser.y"
-+  case 27:
-+#line 273 "dtc-parser.y" /* yacc.c:1646  */
-     {
-                       (yyval.data) = empty_data;
-               }
-+#line 1711 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 26:
--/* Line 1787 of yacc.c  */
--#line 265 "dtc-parser.y"
-+  case 28:
-+#line 277 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.data) = (yyvsp[(1) - (2)].data);
-+                      (yyval.data) = (yyvsp[-1].data);
-               }
-+#line 1719 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 27:
--/* Line 1787 of yacc.c  */
--#line 269 "dtc-parser.y"
-+  case 29:
-+#line 281 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+                      (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
-               }
-+#line 1727 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 28:
--/* Line 1787 of yacc.c  */
--#line 276 "dtc-parser.y"
-+  case 30:
-+#line 288 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.array).data = empty_data;
--                      (yyval.array).bits = eval_literal((yyvsp[(2) - (3)].literal), 0, 7);
-+                      unsigned long long bits;
--                      if (((yyval.array).bits !=  8) &&
--                          ((yyval.array).bits != 16) &&
--                          ((yyval.array).bits != 32) &&
--                          ((yyval.array).bits != 64))
--                      {
--                              print_error("Only 8, 16, 32 and 64-bit elements"
--                                          " are currently supported");
--                              (yyval.array).bits = 32;
-+                      bits = (yyvsp[-1].integer);
-+
-+                      if ((bits !=  8) && (bits != 16) &&
-+                          (bits != 32) && (bits != 64)) {
-+                              ERROR(&(yylsp[-1]), "Array elements must be"
-+                                    " 8, 16, 32 or 64-bits");
-+                              bits = 32;
-                       }
-+
-+                      (yyval.array).data = empty_data;
-+                      (yyval.array).bits = bits;
-               }
-+#line 1747 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 29:
--/* Line 1787 of yacc.c  */
--#line 291 "dtc-parser.y"
-+  case 31:
-+#line 304 "dtc-parser.y" /* yacc.c:1646  */
-     {
-                       (yyval.array).data = empty_data;
-                       (yyval.array).bits = 32;
-               }
-+#line 1756 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 30:
--/* Line 1787 of yacc.c  */
--#line 296 "dtc-parser.y"
-+  case 32:
-+#line 309 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      if ((yyvsp[(1) - (2)].array).bits < 64) {
--                              uint64_t mask = (1ULL << (yyvsp[(1) - (2)].array).bits) - 1;
-+                      if ((yyvsp[-1].array).bits < 64) {
-+                              uint64_t mask = (1ULL << (yyvsp[-1].array).bits) - 1;
-                               /*
-                                * Bits above mask must either be all zero
-                                * (positive within range of mask) or all one
-@@ -1801,275 +1768,258 @@ yyreduce:
-                                * within the mask to one (i.e. | in the
-                                * mask), all bits are one.
-                                */
--                              if (((yyvsp[(2) - (2)].integer) > mask) && (((yyvsp[(2) - (2)].integer) | mask) != -1ULL))
--                                      print_error(
--                                              "integer value out of range "
--                                              "%016lx (%d bits)", (yyvsp[(1) - (2)].array).bits);
-+                              if (((yyvsp[0].integer) > mask) && (((yyvsp[0].integer) | mask) != -1ULL))
-+                                      ERROR(&(yylsp[0]), "Value out of range for"
-+                                            " %d-bit array element", (yyvsp[-1].array).bits);
-                       }
--                      (yyval.array).data = data_append_integer((yyvsp[(1) - (2)].array).data, (yyvsp[(2) - (2)].integer), (yyvsp[(1) - (2)].array).bits);
-+                      (yyval.array).data = data_append_integer((yyvsp[-1].array).data, (yyvsp[0].integer), (yyvsp[-1].array).bits);
-               }
-+#line 1779 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 31:
--/* Line 1787 of yacc.c  */
--#line 316 "dtc-parser.y"
-+  case 33:
-+#line 328 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      uint64_t val = ~0ULL >> (64 - (yyvsp[(1) - (2)].array).bits);
-+                      uint64_t val = ~0ULL >> (64 - (yyvsp[-1].array).bits);
--                      if ((yyvsp[(1) - (2)].array).bits == 32)
--                              (yyvsp[(1) - (2)].array).data = data_add_marker((yyvsp[(1) - (2)].array).data,
-+                      if ((yyvsp[-1].array).bits == 32)
-+                              (yyvsp[-1].array).data = data_add_marker((yyvsp[-1].array).data,
-                                                         REF_PHANDLE,
--                                                        (yyvsp[(2) - (2)].labelref));
-+                                                        (yyvsp[0].labelref));
-                       else
--                              print_error("References are only allowed in "
-+                              ERROR(&(yylsp[0]), "References are only allowed in "
-                                           "arrays with 32-bit elements.");
--                      (yyval.array).data = data_append_integer((yyvsp[(1) - (2)].array).data, val, (yyvsp[(1) - (2)].array).bits);
--              }
--    break;
--
--  case 32:
--/* Line 1787 of yacc.c  */
--#line 330 "dtc-parser.y"
--    {
--                      (yyval.array).data = data_add_marker((yyvsp[(1) - (2)].array).data, LABEL, (yyvsp[(2) - (2)].labelref));
--              }
--    break;
--
--  case 33:
--/* Line 1787 of yacc.c  */
--#line 337 "dtc-parser.y"
--    {
--                      (yyval.integer) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64);
-+                      (yyval.array).data = data_append_integer((yyvsp[-1].array).data, val, (yyvsp[-1].array).bits);
-               }
-+#line 1797 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 34:
--/* Line 1787 of yacc.c  */
--#line 341 "dtc-parser.y"
-+#line 342 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.integer) = eval_char_literal((yyvsp[(1) - (1)].literal));
-+                      (yyval.array).data = data_add_marker((yyvsp[-1].array).data, LABEL, (yyvsp[0].labelref));
-               }
-+#line 1805 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 35:
--/* Line 1787 of yacc.c  */
--#line 345 "dtc-parser.y"
-+  case 37:
-+#line 351 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.integer) = (yyvsp[(2) - (3)].integer);
-+                      (yyval.integer) = (yyvsp[-1].integer);
-               }
--    break;
--
--  case 38:
--/* Line 1787 of yacc.c  */
--#line 356 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (5)].integer) ? (yyvsp[(3) - (5)].integer) : (yyvsp[(5) - (5)].integer); }
-+#line 1813 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 40:
--/* Line 1787 of yacc.c  */
--#line 361 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) || (yyvsp[(3) - (3)].integer); }
-+#line 362 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-4].integer) ? (yyvsp[-2].integer) : (yyvsp[0].integer); }
-+#line 1819 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 42:
--/* Line 1787 of yacc.c  */
--#line 366 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) && (yyvsp[(3) - (3)].integer); }
-+#line 367 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) || (yyvsp[0].integer); }
-+#line 1825 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 44:
--/* Line 1787 of yacc.c  */
--#line 371 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) | (yyvsp[(3) - (3)].integer); }
-+#line 372 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) && (yyvsp[0].integer); }
-+#line 1831 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 46:
--/* Line 1787 of yacc.c  */
--#line 376 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) ^ (yyvsp[(3) - (3)].integer); }
-+#line 377 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) | (yyvsp[0].integer); }
-+#line 1837 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 48:
--/* Line 1787 of yacc.c  */
--#line 381 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) & (yyvsp[(3) - (3)].integer); }
-+#line 382 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) ^ (yyvsp[0].integer); }
-+#line 1843 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 50:
--/* Line 1787 of yacc.c  */
--#line 386 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) == (yyvsp[(3) - (3)].integer); }
-+#line 387 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) & (yyvsp[0].integer); }
-+#line 1849 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 51:
--/* Line 1787 of yacc.c  */
--#line 387 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) != (yyvsp[(3) - (3)].integer); }
-+  case 52:
-+#line 392 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) == (yyvsp[0].integer); }
-+#line 1855 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 53:
--/* Line 1787 of yacc.c  */
--#line 392 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) < (yyvsp[(3) - (3)].integer); }
--    break;
--
--  case 54:
--/* Line 1787 of yacc.c  */
--#line 393 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) > (yyvsp[(3) - (3)].integer); }
-+#line 393 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) != (yyvsp[0].integer); }
-+#line 1861 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 55:
--/* Line 1787 of yacc.c  */
--#line 394 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) <= (yyvsp[(3) - (3)].integer); }
-+#line 398 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) < (yyvsp[0].integer); }
-+#line 1867 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 56:
--/* Line 1787 of yacc.c  */
--#line 395 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) >= (yyvsp[(3) - (3)].integer); }
-+#line 399 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) > (yyvsp[0].integer); }
-+#line 1873 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 57:
--/* Line 1787 of yacc.c  */
--#line 399 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) << (yyvsp[(3) - (3)].integer); }
-+#line 400 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) <= (yyvsp[0].integer); }
-+#line 1879 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 58:
--/* Line 1787 of yacc.c  */
--#line 400 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) >> (yyvsp[(3) - (3)].integer); }
-+#line 401 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) >= (yyvsp[0].integer); }
-+#line 1885 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 60:
--/* Line 1787 of yacc.c  */
--#line 405 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) + (yyvsp[(3) - (3)].integer); }
-+  case 59:
-+#line 405 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) << (yyvsp[0].integer); }
-+#line 1891 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 61:
--/* Line 1787 of yacc.c  */
--#line 406 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) - (yyvsp[(3) - (3)].integer); }
-+  case 60:
-+#line 406 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) >> (yyvsp[0].integer); }
-+#line 1897 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 63:
--/* Line 1787 of yacc.c  */
--#line 411 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) * (yyvsp[(3) - (3)].integer); }
-+  case 62:
-+#line 411 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) + (yyvsp[0].integer); }
-+#line 1903 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 64:
--/* Line 1787 of yacc.c  */
--#line 412 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) / (yyvsp[(3) - (3)].integer); }
-+  case 63:
-+#line 412 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) - (yyvsp[0].integer); }
-+#line 1909 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 65:
--/* Line 1787 of yacc.c  */
--#line 413 "dtc-parser.y"
--    { (yyval.integer) = (yyvsp[(1) - (3)].integer) % (yyvsp[(3) - (3)].integer); }
-+#line 417 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) * (yyvsp[0].integer); }
-+#line 1915 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 68:
--/* Line 1787 of yacc.c  */
--#line 419 "dtc-parser.y"
--    { (yyval.integer) = -(yyvsp[(2) - (2)].integer); }
-+  case 66:
-+#line 418 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) / (yyvsp[0].integer); }
-+#line 1921 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
--  case 69:
--/* Line 1787 of yacc.c  */
--#line 420 "dtc-parser.y"
--    { (yyval.integer) = ~(yyvsp[(2) - (2)].integer); }
-+  case 67:
-+#line 419 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = (yyvsp[-2].integer) % (yyvsp[0].integer); }
-+#line 1927 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 70:
--/* Line 1787 of yacc.c  */
--#line 421 "dtc-parser.y"
--    { (yyval.integer) = !(yyvsp[(2) - (2)].integer); }
-+#line 425 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = -(yyvsp[0].integer); }
-+#line 1933 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 71:
--/* Line 1787 of yacc.c  */
--#line 426 "dtc-parser.y"
--    {
--                      (yyval.data) = empty_data;
--              }
-+#line 426 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = ~(yyvsp[0].integer); }
-+#line 1939 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 72:
--/* Line 1787 of yacc.c  */
--#line 430 "dtc-parser.y"
--    {
--                      (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte));
--              }
-+#line 427 "dtc-parser.y" /* yacc.c:1646  */
-+    { (yyval.integer) = !(yyvsp[0].integer); }
-+#line 1945 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 73:
--/* Line 1787 of yacc.c  */
--#line 434 "dtc-parser.y"
-+#line 432 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref));
-+                      (yyval.data) = empty_data;
-               }
-+#line 1953 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 74:
--/* Line 1787 of yacc.c  */
--#line 441 "dtc-parser.y"
-+#line 436 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.nodelist) = NULL;
-+                      (yyval.data) = data_append_byte((yyvsp[-1].data), (yyvsp[0].byte));
-               }
-+#line 1961 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 75:
--/* Line 1787 of yacc.c  */
--#line 445 "dtc-parser.y"
-+#line 440 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist));
-+                      (yyval.data) = data_add_marker((yyvsp[-1].data), LABEL, (yyvsp[0].labelref));
-               }
-+#line 1969 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 76:
--/* Line 1787 of yacc.c  */
--#line 449 "dtc-parser.y"
-+#line 447 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      print_error("syntax error: properties must precede subnodes");
--                      YYERROR;
-+                      (yyval.nodelist) = NULL;
-               }
-+#line 1977 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 77:
--/* Line 1787 of yacc.c  */
--#line 457 "dtc-parser.y"
-+#line 451 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.node) = name_node((yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].propnodename));
-+                      (yyval.nodelist) = chain_node((yyvsp[-1].node), (yyvsp[0].nodelist));
-               }
-+#line 1985 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 78:
--/* Line 1787 of yacc.c  */
--#line 461 "dtc-parser.y"
-+#line 455 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      (yyval.node) = name_node(build_node_delete(), (yyvsp[(2) - (3)].propnodename));
-+                      ERROR(&(yylsp[0]), "Properties must precede subnodes");
-+                      YYERROR;
-               }
-+#line 1994 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-   case 79:
--/* Line 1787 of yacc.c  */
--#line 465 "dtc-parser.y"
-+#line 463 "dtc-parser.y" /* yacc.c:1646  */
-     {
--                      add_label(&(yyvsp[(2) - (2)].node)->labels, (yyvsp[(1) - (2)].labelref));
--                      (yyval.node) = (yyvsp[(2) - (2)].node);
-+                      (yyval.node) = name_node((yyvsp[0].node), (yyvsp[-1].propnodename));
-               }
-+#line 2002 "dtc-parser.tab.c" /* yacc.c:1646  */
-     break;
-+  case 80:
-+#line 467 "dtc-parser.y" /* yacc.c:1646  */
-+    {
-+                      (yyval.node) = name_node(build_node_delete(), (yyvsp[-1].propnodename));
-+              }
-+#line 2010 "dtc-parser.tab.c" /* yacc.c:1646  */
-+    break;
-+
-+  case 81:
-+#line 471 "dtc-parser.y" /* yacc.c:1646  */
-+    {
-+                      add_label(&(yyvsp[0].node)->labels, (yyvsp[-1].labelref));
-+                      (yyval.node) = (yyvsp[0].node);
-+              }
-+#line 2019 "dtc-parser.tab.c" /* yacc.c:1646  */
-+    break;
--/* Line 1787 of yacc.c  */
--#line 2073 "dtc-parser.tab.c"
-+
-+#line 2023 "dtc-parser.tab.c" /* yacc.c:1646  */
-       default: break;
-     }
-   /* User semantic actions sometimes alter yychar, and that requires
-@@ -2090,8 +2040,9 @@ yyreduce:
-   YY_STACK_PRINT (yyss, yyssp);
-   *++yyvsp = yyval;
-+  *++yylsp = yyloc;
--  /* Now `shift' the result of the reduction.  Determine what state
-+  /* Now 'shift' the result of the reduction.  Determine what state
-      that goes to, based on the state we popped back to and the rule
-      number reduced by.  */
-@@ -2106,9 +2057,9 @@ yyreduce:
-   goto yynewstate;
--/*------------------------------------.
--| yyerrlab -- here on detecting error |
--`------------------------------------*/
-+/*--------------------------------------.
-+| yyerrlab -- here on detecting error.  |
-+`--------------------------------------*/
- yyerrlab:
-   /* Make sure we have latest lookahead translation.  See comments at
-      user semantic actions for why this is necessary.  */
-@@ -2154,25 +2105,25 @@ yyerrlab:
- #endif
-     }
--
-+  yyerror_range[1] = yylloc;
-   if (yyerrstatus == 3)
-     {
-       /* If just tried and failed to reuse lookahead token after an
--       error, discard it.  */
-+         error, discard it.  */
-       if (yychar <= YYEOF)
--      {
--        /* Return failure if at end of input.  */
--        if (yychar == YYEOF)
--          YYABORT;
--      }
-+        {
-+          /* Return failure if at end of input.  */
-+          if (yychar == YYEOF)
-+            YYABORT;
-+        }
-       else
--      {
--        yydestruct ("Error: discarding",
--                    yytoken, &yylval);
--        yychar = YYEMPTY;
--      }
-+        {
-+          yydestruct ("Error: discarding",
-+                      yytoken, &yylval, &yylloc);
-+          yychar = YYEMPTY;
-+        }
-     }
-   /* Else will try to reuse lookahead token after shifting the error
-@@ -2191,7 +2142,8 @@ yyerrorlab:
-   if (/*CONSTCOND*/ 0)
-      goto yyerrorlab;
--  /* Do not reclaim the symbols of the rule which action triggered
-+  yyerror_range[1] = yylsp[1-yylen];
-+  /* Do not reclaim the symbols of the rule whose action triggered
-      this YYERROR.  */
-   YYPOPSTACK (yylen);
-   yylen = 0;
-@@ -2204,29 +2156,29 @@ yyerrorlab:
- | yyerrlab1 -- common code for both syntax error and YYERROR.  |
- `-------------------------------------------------------------*/
- yyerrlab1:
--  yyerrstatus = 3;    /* Each real token shifted decrements this.  */
-+  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
-   for (;;)
-     {
-       yyn = yypact[yystate];
-       if (!yypact_value_is_default (yyn))
--      {
--        yyn += YYTERROR;
--        if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
--          {
--            yyn = yytable[yyn];
--            if (0 < yyn)
--              break;
--          }
--      }
-+        {
-+          yyn += YYTERROR;
-+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-+            {
-+              yyn = yytable[yyn];
-+              if (0 < yyn)
-+                break;
-+            }
-+        }
-       /* Pop the current state because it cannot handle the error token.  */
-       if (yyssp == yyss)
--      YYABORT;
--
-+        YYABORT;
-+      yyerror_range[1] = *yylsp;
-       yydestruct ("Error: popping",
--                yystos[yystate], yyvsp);
-+                  yystos[yystate], yyvsp, yylsp);
-       YYPOPSTACK (1);
-       yystate = *yyssp;
-       YY_STACK_PRINT (yyss, yyssp);
-@@ -2236,6 +2188,11 @@ yyerrlab1:
-   *++yyvsp = yylval;
-   YY_IGNORE_MAYBE_UNINITIALIZED_END
-+  yyerror_range[2] = yylloc;
-+  /* Using YYLLOC is tempting, but would change the location of
-+     the lookahead.  YYLOC is available though.  */
-+  YYLLOC_DEFAULT (yyloc, yyerror_range, 2);
-+  *++yylsp = yyloc;
-   /* Shift the error token.  */
-   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-@@ -2275,16 +2232,16 @@ yyreturn:
-          user semantic actions for why this is necessary.  */
-       yytoken = YYTRANSLATE (yychar);
-       yydestruct ("Cleanup: discarding lookahead",
--                  yytoken, &yylval);
-+                  yytoken, &yylval, &yylloc);
-     }
--  /* Do not reclaim the symbols of the rule which action triggered
-+  /* Do not reclaim the symbols of the rule whose action triggered
-      this YYABORT or YYACCEPT.  */
-   YYPOPSTACK (yylen);
-   YY_STACK_PRINT (yyss, yyssp);
-   while (yyssp != yyss)
-     {
-       yydestruct ("Cleanup: popping",
--                yystos[*yyssp], yyvsp);
-+                  yystos[*yyssp], yyvsp, yylsp);
-       YYPOPSTACK (1);
-     }
- #ifndef yyoverflow
-@@ -2295,72 +2252,12 @@ yyreturn:
-   if (yymsg != yymsgbuf)
-     YYSTACK_FREE (yymsg);
- #endif
--  /* Make sure YYID is used.  */
--  return YYID (yyresult);
-+  return yyresult;
- }
-+#line 477 "dtc-parser.y" /* yacc.c:1906  */
--/* Line 2050 of yacc.c  */
--#line 471 "dtc-parser.y"
--
--
--void print_error(char const *fmt, ...)
-+void yyerror(char const *s)
- {
--      va_list va;
--
--      va_start(va, fmt);
--      srcpos_verror(&yylloc, fmt, va);
--      va_end(va);
--
--      treesource_error = 1;
--}
--
--void yyerror(char const *s) {
--      print_error("%s", s);
--}
--
--static unsigned long long eval_literal(const char *s, int base, int bits)
--{
--      unsigned long long val;
--      char *e;
--
--      errno = 0;
--      val = strtoull(s, &e, base);
--      if (*e) {
--              size_t uls = strspn(e, "UL");
--              if (e[uls])
--                      print_error("bad characters in literal");
--      }
--      if ((errno == ERANGE)
--               || ((bits < 64) && (val >= (1ULL << bits))))
--              print_error("literal out of range");
--      else if (errno != 0)
--              print_error("bad literal");
--      return val;
--}
--
--static unsigned char eval_char_literal(const char *s)
--{
--      int i = 1;
--      char c = s[0];
--
--      if (c == '\0')
--      {
--              print_error("empty character literal");
--              return 0;
--      }
--
--      /*
--       * If the first character in the character literal is a \ then process
--       * the remaining characters as an escape encoding. If the first
--       * character is neither an escape or a terminator it should be the only
--       * character in the literal and will be returned.
--       */
--      if (c == '\\')
--              c = get_escape_char(s, &i);
--
--      if (s[i] != '\0')
--              print_error("malformed character literal");
--
--      return c;
-+      ERROR(&yylloc, "%s", s);
- }
---- a/scripts/dtc/dtc-parser.tab.h_shipped
-+++ b/scripts/dtc/dtc-parser.tab.h_shipped
-@@ -1,19 +1,19 @@
--/* A Bison parser, made by GNU Bison 2.7.12-4996.  */
-+/* A Bison parser, made by GNU Bison 3.0.2.  */
- /* Bison interface for Yacc-like parsers in C
--   
--      Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
--   
-+
-+   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
-+
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
--   
-+
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
--   
-+
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-@@ -26,13 +26,13 @@
-    special exception, which will cause the skeleton and the resulting
-    Bison output files to be licensed under the GNU General Public
-    License without this special exception.
--   
-+
-    This special exception was added by the Free Software Foundation in
-    version 2.2 of Bison.  */
- #ifndef YY_YY_DTC_PARSER_TAB_H_INCLUDED
- # define YY_YY_DTC_PARSER_TAB_H_INCLUDED
--/* Enabling traces.  */
-+/* Debug traces.  */
- #ifndef YYDEBUG
- # define YYDEBUG 0
- #endif
-@@ -40,48 +40,45 @@
- extern int yydebug;
- #endif
--/* Tokens.  */
-+/* Token type.  */
- #ifndef YYTOKENTYPE
- # define YYTOKENTYPE
--   /* Put the tokens into the symbol table, so that GDB and other debuggers
--      know about them.  */
--   enum yytokentype {
--     DT_V1 = 258,
--     DT_MEMRESERVE = 259,
--     DT_LSHIFT = 260,
--     DT_RSHIFT = 261,
--     DT_LE = 262,
--     DT_GE = 263,
--     DT_EQ = 264,
--     DT_NE = 265,
--     DT_AND = 266,
--     DT_OR = 267,
--     DT_BITS = 268,
--     DT_DEL_PROP = 269,
--     DT_DEL_NODE = 270,
--     DT_PROPNODENAME = 271,
--     DT_LITERAL = 272,
--     DT_CHAR_LITERAL = 273,
--     DT_BASE = 274,
--     DT_BYTE = 275,
--     DT_STRING = 276,
--     DT_LABEL = 277,
--     DT_REF = 278,
--     DT_INCBIN = 279
--   };
-+  enum yytokentype
-+  {
-+    DT_V1 = 258,
-+    DT_PLUGIN = 259,
-+    DT_MEMRESERVE = 260,
-+    DT_LSHIFT = 261,
-+    DT_RSHIFT = 262,
-+    DT_LE = 263,
-+    DT_GE = 264,
-+    DT_EQ = 265,
-+    DT_NE = 266,
-+    DT_AND = 267,
-+    DT_OR = 268,
-+    DT_BITS = 269,
-+    DT_DEL_PROP = 270,
-+    DT_DEL_NODE = 271,
-+    DT_PROPNODENAME = 272,
-+    DT_LITERAL = 273,
-+    DT_CHAR_LITERAL = 274,
-+    DT_BYTE = 275,
-+    DT_STRING = 276,
-+    DT_LABEL = 277,
-+    DT_REF = 278,
-+    DT_INCBIN = 279
-+  };
- #endif
--
-+/* Value type.  */
- #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
--typedef union YYSTYPE
-+typedef union YYSTYPE YYSTYPE;
-+union YYSTYPE
- {
--/* Line 2053 of yacc.c  */
--#line 40 "dtc-parser.y"
-+#line 39 "dtc-parser.y" /* yacc.c:1909  */
-       char *propnodename;
--      char *literal;
-       char *labelref;
--      unsigned int cbase;
-       uint8_t byte;
-       struct data data;
-@@ -96,30 +93,31 @@ typedef union YYSTYPE
-       struct node *nodelist;
-       struct reserve_info *re;
-       uint64_t integer;
-+      int is_plugin;
--
--/* Line 2053 of yacc.c  */
--#line 103 "dtc-parser.tab.h"
--} YYSTYPE;
-+#line 99 "dtc-parser.tab.h" /* yacc.c:1909  */
-+};
- # define YYSTYPE_IS_TRIVIAL 1
--# define yystype YYSTYPE /* obsolescent; will be withdrawn */
- # define YYSTYPE_IS_DECLARED 1
- #endif
--extern YYSTYPE yylval;
--
--#ifdef YYPARSE_PARAM
--#if defined __STDC__ || defined __cplusplus
--int yyparse (void *YYPARSE_PARAM);
--#else
--int yyparse ();
-+/* Location type.  */
-+#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-+typedef struct YYLTYPE YYLTYPE;
-+struct YYLTYPE
-+{
-+  int first_line;
-+  int first_column;
-+  int last_line;
-+  int last_column;
-+};
-+# define YYLTYPE_IS_DECLARED 1
-+# define YYLTYPE_IS_TRIVIAL 1
- #endif
--#else /* ! YYPARSE_PARAM */
--#if defined __STDC__ || defined __cplusplus
-+
-+
-+extern YYSTYPE yylval;
-+extern YYLTYPE yylloc;
- int yyparse (void);
--#else
--int yyparse ();
--#endif
--#endif /* ! YYPARSE_PARAM */
- #endif /* !YY_YY_DTC_PARSER_TAB_H_INCLUDED  */
---- a/scripts/dtc/dtc-parser.y
-+++ b/scripts/dtc/dtc-parser.y
-@@ -17,31 +17,28 @@
-  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
-  *                                                                   USA
-  */
--
- %{
- #include <stdio.h>
-+#include <inttypes.h>
- #include "dtc.h"
- #include "srcpos.h"
--YYLTYPE yylloc;
--
- extern int yylex(void);
--extern void print_error(char const *fmt, ...);
- extern void yyerror(char const *s);
-+#define ERROR(loc, ...) \
-+      do { \
-+              srcpos_error((loc), "Error", __VA_ARGS__); \
-+              treesource_error = true; \
-+      } while (0)
- extern struct boot_info *the_boot_info;
--extern int treesource_error;
--
--static unsigned long long eval_literal(const char *s, int base, int bits);
--static unsigned char eval_char_literal(const char *s);
-+extern bool treesource_error;
- %}
- %union {
-       char *propnodename;
--      char *literal;
-       char *labelref;
--      unsigned int cbase;
-       uint8_t byte;
-       struct data data;
-@@ -56,18 +53,19 @@ static unsigned char eval_char_literal(c
-       struct node *nodelist;
-       struct reserve_info *re;
-       uint64_t integer;
-+      int is_plugin;
- }
- %token DT_V1
-+%token DT_PLUGIN
- %token DT_MEMRESERVE
- %token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR
- %token DT_BITS
- %token DT_DEL_PROP
- %token DT_DEL_NODE
- %token <propnodename> DT_PROPNODENAME
--%token <literal> DT_LITERAL
--%token <literal> DT_CHAR_LITERAL
--%token <cbase> DT_BASE
-+%token <integer> DT_LITERAL
-+%token <integer> DT_CHAR_LITERAL
- %token <byte> DT_BYTE
- %token <data> DT_STRING
- %token <labelref> DT_LABEL
-@@ -76,6 +74,7 @@ static unsigned char eval_char_literal(c
- %type <data> propdata
- %type <data> propdataprefix
-+%type <is_plugin> plugindecl
- %type <re> memreserve
- %type <re> memreserves
- %type <array> arrayprefix
-@@ -106,10 +105,23 @@ static unsigned char eval_char_literal(c
- %%
- sourcefile:
--        DT_V1 ';' memreserves devicetree
-+        DT_V1 ';' plugindecl memreserves devicetree
-+              {
-+                      $5->is_plugin = $3;
-+                      $5->is_root = 1;
-+                      the_boot_info = build_boot_info($4, $5,
-+                                                      guess_boot_cpuid($5));
-+              }
-+      ;
-+
-+plugindecl:
-+      /* empty */
-+              {
-+                      $$ = 0;
-+              }
-+      | DT_PLUGIN ';'
-               {
--                      the_boot_info = build_boot_info($3, $4,
--                                                      guess_boot_cpuid($4));
-+                      $$ = 1;
-               }
-       ;
-@@ -152,17 +164,18 @@ devicetree:
-                       if (target)
-                               merge_nodes(target, $3);
-                       else
--                              print_error("label or path, '%s', not found", $2);
-+                              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);
--                      if (!target)
--                              print_error("label or path, '%s', not found", $3);
--                      else
-+                      if (target)
-                               delete_node(target);
-+                      else
-+                              ERROR(&@3, "Label or path %s not found", $3);
-+
-                       $$ = $1;
-               }
-@@ -230,10 +243,9 @@ propdata:
-                       if ($6 != 0)
-                               if (fseek(f, $6, SEEK_SET) != 0)
--                                      print_error("Couldn't seek to offset %llu in \"%s\": %s",
--                                                   (unsigned long long)$6,
--                                                   $4.val,
--                                                   strerror(errno));
-+                                      die("Couldn't seek to offset %llu in \"%s\": %s",
-+                                          (unsigned long long)$6, $4.val,
-+                                          strerror(errno));
-                       d = data_copy_file(f, $8);
-@@ -274,18 +286,19 @@ propdataprefix:
- arrayprefix:
-       DT_BITS DT_LITERAL '<'
-               {
--                      $$.data = empty_data;
--                      $$.bits = eval_literal($2, 0, 7);
-+                      unsigned long long bits;
--                      if (($$.bits !=  8) &&
--                          ($$.bits != 16) &&
--                          ($$.bits != 32) &&
--                          ($$.bits != 64))
--                      {
--                              print_error("Only 8, 16, 32 and 64-bit elements"
--                                          " are currently supported");
--                              $$.bits = 32;
-+                      bits = $2;
-+
-+                      if ((bits !=  8) && (bits != 16) &&
-+                          (bits != 32) && (bits != 64)) {
-+                              ERROR(&@2, "Array elements must be"
-+                                    " 8, 16, 32 or 64-bits");
-+                              bits = 32;
-                       }
-+
-+                      $$.data = empty_data;
-+                      $$.bits = bits;
-               }
-       | '<'
-               {
-@@ -305,9 +318,8 @@ arrayprefix:
-                                * mask), all bits are one.
-                                */
-                               if (($2 > mask) && (($2 | mask) != -1ULL))
--                                      print_error(
--                                              "integer value out of range "
--                                              "%016lx (%d bits)", $1.bits);
-+                                      ERROR(&@2, "Value out of range for"
-+                                            " %d-bit array element", $1.bits);
-                       }
-                       $$.data = data_append_integer($1.data, $2, $1.bits);
-@@ -321,7 +333,7 @@ arrayprefix:
-                                                         REF_PHANDLE,
-                                                         $2);
-                       else
--                              print_error("References are only allowed in "
-+                              ERROR(&@2, "References are only allowed in "
-                                           "arrays with 32-bit elements.");
-                       $$.data = data_append_integer($1.data, val, $1.bits);
-@@ -334,13 +346,7 @@ arrayprefix:
- integer_prim:
-         DT_LITERAL
--              {
--                      $$ = eval_literal($1, 0, 64);
--              }
-       | DT_CHAR_LITERAL
--              {
--                      $$ = eval_char_literal($1);
--              }
-       | '(' integer_expr ')'
-               {
-                       $$ = $2;
-@@ -447,7 +453,7 @@ subnodes:
-               }
-       | subnode propdef
-               {
--                      print_error("syntax error: properties must precede subnodes");
-+                      ERROR(&@2, "Properties must precede subnodes");
-                       YYERROR;
-               }
-       ;
-@@ -470,63 +476,7 @@ subnode:
- %%
--void print_error(char const *fmt, ...)
-+void yyerror(char const *s)
- {
--      va_list va;
--
--      va_start(va, fmt);
--      srcpos_verror(&yylloc, fmt, va);
--      va_end(va);
--
--      treesource_error = 1;
--}
--
--void yyerror(char const *s) {
--      print_error("%s", s);
--}
--
--static unsigned long long eval_literal(const char *s, int base, int bits)
--{
--      unsigned long long val;
--      char *e;
--
--      errno = 0;
--      val = strtoull(s, &e, base);
--      if (*e) {
--              size_t uls = strspn(e, "UL");
--              if (e[uls])
--                      print_error("bad characters in literal");
--      }
--      if ((errno == ERANGE)
--               || ((bits < 64) && (val >= (1ULL << bits))))
--              print_error("literal out of range");
--      else if (errno != 0)
--              print_error("bad literal");
--      return val;
--}
--
--static unsigned char eval_char_literal(const char *s)
--{
--      int i = 1;
--      char c = s[0];
--
--      if (c == '\0')
--      {
--              print_error("empty character literal");
--              return 0;
--      }
--
--      /*
--       * If the first character in the character literal is a \ then process
--       * the remaining characters as an escape encoding. If the first
--       * character is neither an escape or a terminator it should be the only
--       * character in the literal and will be returned.
--       */
--      if (c == '\\')
--              c = get_escape_char(s, &i);
--
--      if (s[i] != '\0')
--              print_error("malformed character literal");
--
--      return c;
-+      ERROR(&yylloc, "%s", s);
- }
---- a/scripts/dtc/dtc.c
-+++ b/scripts/dtc/dtc.c
-@@ -29,6 +29,7 @@ int reservenum;              /* Number of memory res
- int minsize;          /* Minimum blob size */
- int padsize;          /* Additional padding to blob */
- int phandle_format = PHANDLE_BOTH;    /* Use linux,phandle or phandle properties */
-+int symbol_fixup_support = 0;
- static void fill_fullpaths(struct node *tree, const char *prefix)
- {
-@@ -48,8 +49,10 @@ static void fill_fullpaths(struct node *
- }
- /* Usage related data. */
-+#define FDT_VERSION(version)  _FDT_VERSION(version)
-+#define _FDT_VERSION(version) #version
- static const char usage_synopsis[] = "dtc [options] <input file>";
--static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv";
-+static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv@";
- static struct option const usage_long_opts[] = {
-       {"quiet",            no_argument, NULL, 'q'},
-       {"in-format",         a_argument, NULL, 'I'},
-@@ -67,6 +70,7 @@ static struct option const usage_long_op
-       {"phandle",           a_argument, NULL, 'H'},
-       {"warning",           a_argument, NULL, 'W'},
-       {"error",             a_argument, NULL, 'E'},
-+      {"symbols",           a_argument, NULL, '@'},
-       {"help",             no_argument, NULL, 'h'},
-       {"version",          no_argument, NULL, 'v'},
-       {NULL,               no_argument, NULL, 0x0},
-@@ -82,9 +86,9 @@ static const char * const usage_opts_hel
-        "\t\tdts - device tree source text\n"
-        "\t\tdtb - device tree blob\n"
-        "\t\tasm - assembler source",
--      "\n\tBlob version to produce, defaults to %d (for dtb and asm output)", //, DEFAULT_FDT_VERSION);
-+      "\n\tBlob version to produce, defaults to "FDT_VERSION(DEFAULT_FDT_VERSION)" (for dtb and asm output)",
-       "\n\tOutput dependency file",
--      "\n\ttMake space for <number> reserve map entries (for dtb and asm output)",
-+      "\n\tMake space for <number> reserve map entries (for dtb and asm output)",
-       "\n\tMake the blob at least <bytes> long (extra space)",
-       "\n\tAdd padding to the blob of <bytes> long (extra space)",
-       "\n\tSet the physical boot cpu",
-@@ -97,6 +101,7 @@ static const char * const usage_opts_hel
-        "\t\tboth   - Both \"linux,phandle\" and \"phandle\" properties",
-       "\n\tEnable/disable warnings (prefix with \"no-\")",
-       "\n\tEnable/disable errors (prefix with \"no-\")",
-+      "\n\tSymbols and Fixups support",
-       "\n\tPrint this help and exit",
-       "\n\tPrint version and exit",
-       NULL,
-@@ -109,7 +114,7 @@ int main(int argc, char *argv[])
-       const char *outform = "dts";
-       const char *outname = "-";
-       const char *depname = NULL;
--      int force = 0, sort = 0;
-+      bool force = false, sort = false;
-       const char *arg;
-       int opt;
-       FILE *outf = NULL;
-@@ -148,7 +153,7 @@ int main(int argc, char *argv[])
-                       padsize = strtol(optarg, NULL, 0);
-                       break;
-               case 'f':
--                      force = 1;
-+                      force = true;
-                       break;
-               case 'q':
-                       quiet++;
-@@ -174,7 +179,7 @@ int main(int argc, char *argv[])
-                       break;
-               case 's':
--                      sort = 1;
-+                      sort = true;
-                       break;
-               case 'W':
-@@ -184,7 +189,9 @@ int main(int argc, char *argv[])
-               case 'E':
-                       parse_checks_option(false, true, optarg);
-                       break;
--
-+              case '@':
-+                      symbol_fixup_support = 1;
-+                      break;
-               case 'h':
-                       usage(NULL);
-               default:
-@@ -237,7 +244,7 @@ int main(int argc, char *argv[])
-       if (streq(outname, "-")) {
-               outf = stdout;
-       } else {
--              outf = fopen(outname, "w");
-+              outf = fopen(outname, "wb");
-               if (! outf)
-                       die("Couldn't open output file %s: %s\n",
-                           outname, strerror(errno));
---- a/scripts/dtc/dtc.h
-+++ b/scripts/dtc/dtc.h
-@@ -38,9 +38,9 @@
- #include "util.h"
- #ifdef DEBUG
--#define debug(fmt,args...)    printf(fmt, ##args)
-+#define debug(...)    printf(__VA_ARGS__)
- #else
--#define debug(fmt,args...)
-+#define debug(...)
- #endif
-@@ -54,6 +54,7 @@ extern int reservenum;               /* Number of mem
- extern int minsize;           /* Minimum blob size */
- extern int padsize;           /* Additional padding to blob */
- extern int phandle_format;    /* Use linux,phandle or phandle properties */
-+extern int symbol_fixup_support;/* enable symbols & fixup support */
- #define PHANDLE_LEGACY        0x1
- #define PHANDLE_EPAPR 0x2
-@@ -88,7 +89,7 @@ struct data {
- };
--#define empty_data ((struct data){ /* all .members = 0 or NULL */ })
-+#define empty_data ((struct data){ 0 /* all .members = 0 or NULL */ })
- #define for_each_marker(m) \
-       for (; (m); (m) = (m)->next)
-@@ -118,7 +119,7 @@ struct data data_append_align(struct dat
- struct data data_add_marker(struct data d, enum markertype type, char *ref);
--int data_is_one_string(struct data d);
-+bool data_is_one_string(struct data d);
- /* DT constraints */
-@@ -127,13 +128,32 @@ int data_is_one_string(struct data d);
- /* Live trees */
- struct label {
--      int deleted;
-+      bool deleted;
-       char *label;
-       struct label *next;
- };
-+struct fixup_entry {
-+      int offset;
-+      struct node *node;
-+      struct property *prop;
-+      struct fixup_entry *next;
-+};
-+
-+struct fixup {
-+      char *ref;
-+      struct fixup_entry *entries;
-+      struct fixup *next;
-+};
-+
-+struct symbol {
-+      struct label *label;
-+      struct node *node;
-+      struct symbol *next;
-+};
-+
- struct property {
--      int deleted;
-+      bool deleted;
-       char *name;
-       struct data val;
-@@ -143,7 +163,7 @@ struct property {
- };
- struct node {
--      int deleted;
-+      bool deleted;
-       char *name;
-       struct property *proplist;
-       struct node *children;
-@@ -158,6 +178,12 @@ struct node {
-       int addr_cells, size_cells;
-       struct label *labels;
-+
-+      int is_root;
-+      int is_plugin;
-+      struct fixup *fixups;
-+      struct symbol *symbols;
-+      struct fixup_entry *local_fixups;
- };
- #define for_each_label_withdel(l0, l) \
-@@ -181,6 +207,18 @@ struct node {
-       for_each_child_withdel(n, c) \
-               if (!(c)->deleted)
-+#define for_each_fixup(n, f) \
-+      for ((f) = (n)->fixups; (f); (f) = (f)->next)
-+
-+#define for_each_fixup_entry(f, fe) \
-+      for ((fe) = (f)->entries; (fe); (fe) = (fe)->next)
-+
-+#define for_each_symbol(n, s) \
-+      for ((s) = (n)->symbols; (s); (s) = (s)->next)
-+
-+#define for_each_local_fixup_entry(n, fe) \
-+      for ((fe) = (n)->local_fixups; (fe); (fe) = (fe)->next)
-+
- void add_label(struct label **labels, char *label);
- void delete_labels(struct label **labels);
-@@ -247,8 +285,8 @@ void sort_tree(struct boot_info *bi);
- /* Checks */
--void parse_checks_option(bool warn, bool error, const char *optarg);
--void process_checks(int force, struct boot_info *bi);
-+void parse_checks_option(bool warn, bool error, const char *arg);
-+void process_checks(bool force, struct boot_info *bi);
- /* Flattened trees */
---- a/scripts/dtc/flattree.c
-+++ b/scripts/dtc/flattree.c
-@@ -261,7 +261,13 @@ static void flatten_tree(struct node *tr
- {
-       struct property *prop;
-       struct node *child;
--      int seen_name_prop = 0;
-+      bool seen_name_prop = false;
-+      struct symbol *sym;
-+      struct fixup *f;
-+      struct fixup_entry *fe;
-+      char *name, *s;
-+      const char *fullpath;
-+      int namesz, nameoff, vallen;
-       if (tree->deleted)
-               return;
-@@ -276,10 +282,8 @@ static void flatten_tree(struct node *tr
-       emit->align(etarget, sizeof(cell_t));
-       for_each_property(tree, prop) {
--              int nameoff;
--
-               if (streq(prop->name, "name"))
--                      seen_name_prop = 1;
-+                      seen_name_prop = true;
-               nameoff = stringtable_insert(strbuf, prop->name);
-@@ -310,6 +314,139 @@ static void flatten_tree(struct node *tr
-               flatten_tree(child, emit, etarget, strbuf, vi);
-       }
-+      if (!symbol_fixup_support)
-+              goto no_symbols;
-+
-+      /* add the symbol nodes (if any) */
-+      if (tree->symbols) {
-+
-+              emit->beginnode(etarget, NULL);
-+              emit->string(etarget, "__symbols__", 0);
-+              emit->align(etarget, sizeof(cell_t));
-+
-+              for_each_symbol(tree, sym) {
-+
-+                      vallen = strlen(sym->node->fullpath);
-+
-+                      nameoff = stringtable_insert(strbuf, sym->label->label);
-+
-+                      emit->property(etarget, NULL);
-+                      emit->cell(etarget, vallen + 1);
-+                      emit->cell(etarget, nameoff);
-+
-+                      if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
-+                              emit->align(etarget, 8);
-+
-+                      emit->string(etarget, sym->node->fullpath,
-+                                      strlen(sym->node->fullpath));
-+                      emit->align(etarget, sizeof(cell_t));
-+              }
-+
-+              emit->endnode(etarget, NULL);
-+      }
-+
-+      /* add the fixup nodes */
-+      if (tree->fixups) {
-+
-+              /* emit the external fixups */
-+              emit->beginnode(etarget, NULL);
-+              emit->string(etarget, "__fixups__", 0);
-+              emit->align(etarget, sizeof(cell_t));
-+
-+              for_each_fixup(tree, f) {
-+
-+                      namesz = 0;
-+                      for_each_fixup_entry(f, fe) {
-+                              fullpath = fe->node->fullpath;
-+                              if (fullpath[0] == '\0')
-+                                      fullpath = "/";
-+                              namesz += strlen(fullpath) + 1;
-+                              namesz += strlen(fe->prop->name) + 1;
-+                              namesz += 32;   /* space for :<number> + '\0' */
-+                      }
-+
-+                      name = xmalloc(namesz);
-+
-+                      s = name;
-+                      for_each_fixup_entry(f, fe) {
-+                              fullpath = fe->node->fullpath;
-+                              if (fullpath[0] == '\0')
-+                                      fullpath = "/";
-+                              snprintf(s, name + namesz - s, "%s:%s:%d",
-+                                              fullpath,
-+                                              fe->prop->name, fe->offset);
-+                              s += strlen(s) + 1;
-+                      }
-+
-+                      nameoff = stringtable_insert(strbuf, f->ref);
-+                      vallen = s - name - 1;
-+
-+                      emit->property(etarget, NULL);
-+                      emit->cell(etarget, vallen + 1);
-+                      emit->cell(etarget, nameoff);
-+
-+                      if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
-+                              emit->align(etarget, 8);
-+
-+                      emit->string(etarget, name, vallen);
-+                      emit->align(etarget, sizeof(cell_t));
-+
-+                      free(name);
-+              }
-+
-+              emit->endnode(etarget, tree->labels);
-+      }
-+
-+      /* add the local fixup property */
-+      if (tree->local_fixups) {
-+
-+              /* emit the external fixups */
-+              emit->beginnode(etarget, NULL);
-+              emit->string(etarget, "__local_fixups__", 0);
-+              emit->align(etarget, sizeof(cell_t));
-+
-+              namesz = 0;
-+              for_each_local_fixup_entry(tree, fe) {
-+                      fullpath = fe->node->fullpath;
-+                      if (fullpath[0] == '\0')
-+                              fullpath = "/";
-+                      namesz += strlen(fullpath) + 1;
-+                      namesz += strlen(fe->prop->name) + 1;
-+                      namesz += 32;   /* space for :<number> + '\0' */
-+              }
-+
-+              name = xmalloc(namesz);
-+
-+              s = name;
-+              for_each_local_fixup_entry(tree, fe) {
-+                      fullpath = fe->node->fullpath;
-+                      if (fullpath[0] == '\0')
-+                              fullpath = "/";
-+                      snprintf(s, name + namesz - s, "%s:%s:%d",
-+                                      fullpath, fe->prop->name,
-+                                      fe->offset);
-+                      s += strlen(s) + 1;
-+              }
-+
-+              nameoff = stringtable_insert(strbuf, "fixup");
-+              vallen = s - name - 1;
-+
-+              emit->property(etarget, NULL);
-+              emit->cell(etarget, vallen + 1);
-+              emit->cell(etarget, nameoff);
-+
-+              if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
-+                      emit->align(etarget, 8);
-+
-+              emit->string(etarget, name, vallen);
-+              emit->align(etarget, sizeof(cell_t));
-+
-+              free(name);
-+
-+              emit->endnode(etarget, tree->labels);
-+      }
-+
-+no_symbols:
-       emit->endnode(etarget, tree->labels);
- }
---- a/scripts/dtc/fstree.c
-+++ b/scripts/dtc/fstree.c
-@@ -37,26 +37,26 @@ static struct node *read_fstree(const ch
-       tree = build_node(NULL, NULL);
-       while ((de = readdir(d)) != NULL) {
--              char *tmpnam;
-+              char *tmpname;
-               if (streq(de->d_name, ".")
-                   || streq(de->d_name, ".."))
-                       continue;
--              tmpnam = join_path(dirname, de->d_name);
-+              tmpname = join_path(dirname, de->d_name);
--              if (lstat(tmpnam, &st) < 0)
--                      die("stat(%s): %s\n", tmpnam, strerror(errno));
-+              if (lstat(tmpname, &st) < 0)
-+                      die("stat(%s): %s\n", tmpname, strerror(errno));
-               if (S_ISREG(st.st_mode)) {
-                       struct property *prop;
-                       FILE *pfile;
--                      pfile = fopen(tmpnam, "r");
-+                      pfile = fopen(tmpname, "rb");
-                       if (! pfile) {
-                               fprintf(stderr,
-                                       "WARNING: Cannot open %s: %s\n",
--                                      tmpnam, strerror(errno));
-+                                      tmpname, strerror(errno));
-                       } else {
-                               prop = build_property(xstrdup(de->d_name),
-                                                     data_copy_file(pfile,
-@@ -67,12 +67,12 @@ static struct node *read_fstree(const ch
-               } else if (S_ISDIR(st.st_mode)) {
-                       struct node *newchild;
--                      newchild = read_fstree(tmpnam);
-+                      newchild = read_fstree(tmpname);
-                       newchild = name_node(newchild, xstrdup(de->d_name));
-                       add_child(tree, newchild);
-               }
--              free(tmpnam);
-+              free(tmpname);
-       }
-       closedir(d);
---- a/scripts/dtc/livetree.c
-+++ b/scripts/dtc/livetree.c
-@@ -511,7 +511,9 @@ struct node *get_node_by_phandle(struct
- struct node *get_node_by_ref(struct node *tree, const char *ref)
- {
--      if (ref[0] == '/')
-+      if (streq(ref, "/"))
-+              return tree;
-+      else if (ref[0] == '/')
-               return get_node_by_path(tree, ref);
-       else
-               return get_node_by_label(tree, ref);
---- a/scripts/dtc/srcpos.c
-+++ b/scripts/dtc/srcpos.c
-@@ -34,7 +34,7 @@ struct search_path {
- static struct search_path *search_path_head, **search_path_tail;
--static char *dirname(const char *path)
-+static char *get_dirname(const char *path)
- {
-       const char *slash = strrchr(path, '/');
-@@ -77,7 +77,7 @@ static char *try_open(const char *dirnam
-       else
-               fullname = join_path(dirname, fname);
--      *fp = fopen(fullname, "r");
-+      *fp = fopen(fullname, "rb");
-       if (!*fp) {
-               free(fullname);
-               fullname = NULL;
-@@ -150,7 +150,7 @@ void srcfile_push(const char *fname)
-       srcfile = xmalloc(sizeof(*srcfile));
-       srcfile->f = srcfile_relative_open(fname, &srcfile->name);
--      srcfile->dir = dirname(srcfile->name);
-+      srcfile->dir = get_dirname(srcfile->name);
-       srcfile->prev = current_srcfile;
-       srcfile->lineno = 1;
-@@ -159,7 +159,7 @@ void srcfile_push(const char *fname)
-       current_srcfile = srcfile;
- }
--int srcfile_pop(void)
-+bool srcfile_pop(void)
- {
-       struct srcfile_state *srcfile = current_srcfile;
-@@ -177,7 +177,7 @@ int srcfile_pop(void)
-        * fix this we could either allocate all the files from a
-        * table, or use a pool allocator. */
--      return current_srcfile ? 1 : 0;
-+      return current_srcfile ? true : false;
- }
- void srcfile_add_search_path(const char *dirname)
-@@ -290,42 +290,27 @@ srcpos_string(struct srcpos *pos)
-       return pos_str;
- }
--void
--srcpos_verror(struct srcpos *pos, char const *fmt, va_list va)
-+void srcpos_verror(struct srcpos *pos, const char *prefix,
-+                 const char *fmt, va_list va)
- {
--       const char *srcstr;
--
--       srcstr = srcpos_string(pos);
-+      char *srcstr;
--       fprintf(stderr, "Error: %s ", srcstr);
--       vfprintf(stderr, fmt, va);
--       fprintf(stderr, "\n");
--}
-+      srcstr = srcpos_string(pos);
--void
--srcpos_error(struct srcpos *pos, char const *fmt, ...)
--{
--      va_list va;
-+      fprintf(stderr, "%s: %s ", prefix, srcstr);
-+      vfprintf(stderr, fmt, va);
-+      fprintf(stderr, "\n");
--      va_start(va, fmt);
--      srcpos_verror(pos, fmt, va);
--      va_end(va);
-+      free(srcstr);
- }
--
--void
--srcpos_warn(struct srcpos *pos, char const *fmt, ...)
-+void srcpos_error(struct srcpos *pos, const char *prefix,
-+                const char *fmt, ...)
- {
--      const char *srcstr;
-       va_list va;
--      va_start(va, fmt);
--
--      srcstr = srcpos_string(pos);
--
--      fprintf(stderr, "Warning: %s ", srcstr);
--      vfprintf(stderr, fmt, va);
--      fprintf(stderr, "\n");
-+      va_start(va, fmt);
-+      srcpos_verror(pos, prefix, fmt, va);
-       va_end(va);
- }
---- a/scripts/dtc/srcpos.h
-+++ b/scripts/dtc/srcpos.h
-@@ -21,6 +21,7 @@
- #define _SRCPOS_H_
- #include <stdio.h>
-+#include <stdbool.h>
- struct srcfile_state {
-       FILE *f;
-@@ -55,7 +56,7 @@ extern struct srcfile_state *current_src
- FILE *srcfile_relative_open(const char *fname, char **fullnamep);
- void srcfile_push(const char *fname);
--int srcfile_pop(void);
-+bool srcfile_pop(void);
- /**
-  * Add a new directory to the search path for input files
-@@ -106,12 +107,12 @@ extern struct srcpos *srcpos_copy(struct
- extern char *srcpos_string(struct srcpos *pos);
- extern void srcpos_dump(struct srcpos *pos);
--extern void srcpos_verror(struct srcpos *pos, char const *, va_list va)
--     __attribute__((format(printf, 2, 0)));
--extern void srcpos_error(struct srcpos *pos, char const *, ...)
--     __attribute__((format(printf, 2, 3)));
--extern void srcpos_warn(struct srcpos *pos, char const *, ...)
--     __attribute__((format(printf, 2, 3)));
-+extern void srcpos_verror(struct srcpos *pos, const char *prefix,
-+                        const char *fmt, va_list va)
-+      __attribute__((format(printf, 3, 0)));
-+extern void srcpos_error(struct srcpos *pos, const char *prefix,
-+                       const char *fmt, ...)
-+      __attribute__((format(printf, 3, 4)));
- extern void srcpos_set_line(char *f, int l);
---- a/scripts/dtc/treesource.c
-+++ b/scripts/dtc/treesource.c
-@@ -26,12 +26,12 @@ extern int yyparse(void);
- extern YYLTYPE yylloc;
- struct boot_info *the_boot_info;
--int treesource_error;
-+bool treesource_error;
- struct boot_info *dt_from_source(const char *fname)
- {
-       the_boot_info = NULL;
--      treesource_error = 0;
-+      treesource_error = false;
-       srcfile_push(fname);
-       yyin = current_srcfile->f;
-@@ -54,9 +54,9 @@ static void write_prefix(FILE *f, int le
-               fputc('\t', f);
- }
--static int isstring(char c)
-+static bool isstring(char c)
- {
--      return (isprint(c)
-+      return (isprint((unsigned char)c)
-               || (c == '\0')
-               || strchr("\a\b\t\n\v\f\r", c));
- }
-@@ -109,7 +109,7 @@ static void write_propval_string(FILE *f
-                       break;
-               case '\0':
-                       fprintf(f, "\", ");
--                      while (m && (m->offset < i)) {
-+                      while (m && (m->offset <= (i + 1))) {
-                               if (m->type == LABEL) {
-                                       assert(m->offset == (i+1));
-                                       fprintf(f, "%s: ", m->ref);
-@@ -119,7 +119,7 @@ static void write_propval_string(FILE *f
-                       fprintf(f, "\"");
-                       break;
-               default:
--                      if (isprint(c))
-+                      if (isprint((unsigned char)c))
-                               fprintf(f, "%c", c);
-                       else
-                               fprintf(f, "\\x%02hhx", c);
-@@ -178,7 +178,7 @@ static void write_propval_bytes(FILE *f,
-                       m = m->next;
-               }
--              fprintf(f, "%02hhx", *bp++);
-+              fprintf(f, "%02hhx", (unsigned char)(*bp++));
-               if ((const void *)bp >= propend)
-                       break;
-               fprintf(f, " ");
---- a/scripts/dtc/util.c
-+++ b/scripts/dtc/util.c
-@@ -39,11 +39,11 @@
- char *xstrdup(const char *s)
- {
-       int len = strlen(s) + 1;
--      char *dup = xmalloc(len);
-+      char *d = xmalloc(len);
--      memcpy(dup, s, len);
-+      memcpy(d, s, len);
--      return dup;
-+      return d;
- }
- char *join_path(const char *path, const char *name)
-@@ -70,7 +70,7 @@ char *join_path(const char *path, const
-       return str;
- }
--int util_is_printable_string(const void *data, int len)
-+bool util_is_printable_string(const void *data, int len)
- {
-       const char *s = data;
-       const char *ss, *se;
-@@ -87,7 +87,7 @@ int util_is_printable_string(const void
-       while (s < se) {
-               ss = s;
--              while (s < se && *s && isprint(*s))
-+              while (s < se && *s && isprint((unsigned char)*s))
-                       s++;
-               /* not zero, or not done yet */
-@@ -219,10 +219,6 @@ int utilfdt_read_err_len(const char *fil
-               if (offset == bufsize) {
-                       bufsize *= 2;
-                       buf = xrealloc(buf, bufsize);
--                      if (!buf) {
--                              ret = ENOMEM;
--                              break;
--                      }
-               }
-               ret = read(fd, &buf[offset], bufsize - offset);
-@@ -375,9 +371,9 @@ void utilfdt_print_data(const char *data
-               const uint32_t *cell = (const uint32_t *)data;
-               printf(" = <");
--              for (i = 0; i < len; i += 4)
-+              for (i = 0, len /= 4; i < len; i++)
-                       printf("0x%08x%s", fdt32_to_cpu(cell[i]),
--                             i < (len - 4) ? " " : "");
-+                             i < (len - 1) ? " " : "");
-               printf(">");
-       } else {
-               printf(" = [");
---- a/scripts/dtc/util.h
-+++ b/scripts/dtc/util.h
-@@ -2,6 +2,7 @@
- #define _UTIL_H
- #include <stdarg.h>
-+#include <stdbool.h>
- #include <getopt.h>
- /*
-@@ -33,6 +34,7 @@ static inline void __attribute__((noretu
-       va_start(ap, str);
-       fprintf(stderr, "FATAL ERROR: ");
-       vfprintf(stderr, str, ap);
-+      va_end(ap);
-       exit(1);
- }
-@@ -68,7 +70,7 @@ extern char *join_path(const char *path,
-  * @param len The string length including terminator
-  * @return 1 if a valid printable string, 0 if not
-  */
--int util_is_printable_string(const void *data, int len);
-+bool util_is_printable_string(const void *data, int len);
- /*
-  * Parse an escaped character starting at index i in string s.  The resulting
---- a/scripts/dtc/version_gen.h
-+++ b/scripts/dtc/version_gen.h
-@@ -1 +1 @@
--#define DTC_VERSION "DTC 1.4.0-dirty"
-+#define DTC_VERSION "DTC 1.4.1-g36c70742"