1*cd60bc56SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*cd60bc56SAndroid Build Coastguard Worker /* 3*cd60bc56SAndroid Build Coastguard Worker * (C) Copyright David Gibson <[email protected]>, IBM Corporation. 2005. 4*cd60bc56SAndroid Build Coastguard Worker */ 5*cd60bc56SAndroid Build Coastguard Worker 6*cd60bc56SAndroid Build Coastguard Worker %option noyywrap nounput noinput never-interactive 7*cd60bc56SAndroid Build Coastguard Worker 8*cd60bc56SAndroid Build Coastguard Worker %x BYTESTRING 9*cd60bc56SAndroid Build Coastguard Worker %x PROPNODENAME 10*cd60bc56SAndroid Build Coastguard Worker %s V1 11*cd60bc56SAndroid Build Coastguard Worker 12*cd60bc56SAndroid Build Coastguard Worker PROPNODECHAR [a-zA-Z0-9,._+*#?@-] 13*cd60bc56SAndroid Build Coastguard Worker PATHCHAR ({PROPNODECHAR}|[/]) 14*cd60bc56SAndroid Build Coastguard Worker LABEL [a-zA-Z_][a-zA-Z0-9_]* 15*cd60bc56SAndroid Build Coastguard Worker STRING \"([^\\"]|\\.)*\" 16*cd60bc56SAndroid Build Coastguard Worker CHAR_LITERAL '([^']|\\')*' 17*cd60bc56SAndroid Build Coastguard Worker WS [[:space:]] 18*cd60bc56SAndroid Build Coastguard Worker COMMENT "/*"([^*]|\*+[^*/])*\*+"/" 19*cd60bc56SAndroid Build Coastguard Worker LINECOMMENT "//".*\n 20*cd60bc56SAndroid Build Coastguard Worker 21*cd60bc56SAndroid Build Coastguard Worker %{ 22*cd60bc56SAndroid Build Coastguard Worker #include "dtc.h" 23*cd60bc56SAndroid Build Coastguard Worker #include "srcpos.h" 24*cd60bc56SAndroid Build Coastguard Worker #include "dtc-parser.h" 25*cd60bc56SAndroid Build Coastguard Worker 26*cd60bc56SAndroid Build Coastguard Worker extern bool treesource_error; 27*cd60bc56SAndroid Build Coastguard Worker 28*cd60bc56SAndroid Build Coastguard Worker /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ 29*cd60bc56SAndroid Build Coastguard Worker #define YY_USER_ACTION \ 30*cd60bc56SAndroid Build Coastguard Worker { \ 31*cd60bc56SAndroid Build Coastguard Worker srcpos_update(&yylloc, yytext, yyleng); \ 32*cd60bc56SAndroid Build Coastguard Worker } 33*cd60bc56SAndroid Build Coastguard Worker 34*cd60bc56SAndroid Build Coastguard Worker /*#define LEXDEBUG 1*/ 35*cd60bc56SAndroid Build Coastguard Worker 36*cd60bc56SAndroid Build Coastguard Worker #ifdef LEXDEBUG 37*cd60bc56SAndroid Build Coastguard Worker #define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__) 38*cd60bc56SAndroid Build Coastguard Worker #else 39*cd60bc56SAndroid Build Coastguard Worker #define DPRINT(fmt, ...) do { } while (0) 40*cd60bc56SAndroid Build Coastguard Worker #endif 41*cd60bc56SAndroid Build Coastguard Worker 42*cd60bc56SAndroid Build Coastguard Worker static int dts_version = 1; 43*cd60bc56SAndroid Build Coastguard Worker 44*cd60bc56SAndroid Build Coastguard Worker #define BEGIN_DEFAULT() DPRINT("<V1>\n"); \ 45*cd60bc56SAndroid Build Coastguard Worker BEGIN(V1); \ 46*cd60bc56SAndroid Build Coastguard Worker 47*cd60bc56SAndroid Build Coastguard Worker static void push_input_file(const char *filename); 48*cd60bc56SAndroid Build Coastguard Worker static bool pop_input_file(void); 49*cd60bc56SAndroid Build Coastguard Worker static void PRINTF(1, 2) lexical_error(const char *fmt, ...); 50*cd60bc56SAndroid Build Coastguard Worker 51*cd60bc56SAndroid Build Coastguard Worker %} 52*cd60bc56SAndroid Build Coastguard Worker 53*cd60bc56SAndroid Build Coastguard Worker %% 54*cd60bc56SAndroid Build Coastguard Worker <*>"/include/"{WS}*{STRING} { 55*cd60bc56SAndroid Build Coastguard Worker char *name = strchr(yytext, '\"') + 1; 56*cd60bc56SAndroid Build Coastguard Worker yytext[yyleng-1] = '\0'; 57*cd60bc56SAndroid Build Coastguard Worker push_input_file(name); 58*cd60bc56SAndroid Build Coastguard Worker } 59*cd60bc56SAndroid Build Coastguard Worker 60*cd60bc56SAndroid Build Coastguard Worker <*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)* { 61*cd60bc56SAndroid Build Coastguard Worker char *line, *fnstart, *fnend; 62*cd60bc56SAndroid Build Coastguard Worker struct data fn; 63*cd60bc56SAndroid Build Coastguard Worker /* skip text before line # */ 64*cd60bc56SAndroid Build Coastguard Worker line = yytext; 65*cd60bc56SAndroid Build Coastguard Worker while (!isdigit((unsigned char)*line)) 66*cd60bc56SAndroid Build Coastguard Worker line++; 67*cd60bc56SAndroid Build Coastguard Worker 68*cd60bc56SAndroid Build Coastguard Worker /* regexp ensures that first and list " 69*cd60bc56SAndroid Build Coastguard Worker * in the whole yytext are those at 70*cd60bc56SAndroid Build Coastguard Worker * beginning and end of the filename string */ 71*cd60bc56SAndroid Build Coastguard Worker fnstart = memchr(yytext, '"', yyleng); 72*cd60bc56SAndroid Build Coastguard Worker for (fnend = yytext + yyleng - 1; 73*cd60bc56SAndroid Build Coastguard Worker *fnend != '"'; fnend--) 74*cd60bc56SAndroid Build Coastguard Worker ; 75*cd60bc56SAndroid Build Coastguard Worker assert(fnstart && fnend && (fnend > fnstart)); 76*cd60bc56SAndroid Build Coastguard Worker 77*cd60bc56SAndroid Build Coastguard Worker fn = data_copy_escape_string(fnstart + 1, 78*cd60bc56SAndroid Build Coastguard Worker fnend - fnstart - 1); 79*cd60bc56SAndroid Build Coastguard Worker 80*cd60bc56SAndroid Build Coastguard Worker /* Don't allow nuls in filenames */ 81*cd60bc56SAndroid Build Coastguard Worker if (memchr(fn.val, '\0', fn.len - 1)) 82*cd60bc56SAndroid Build Coastguard Worker lexical_error("nul in line number directive"); 83*cd60bc56SAndroid Build Coastguard Worker 84*cd60bc56SAndroid Build Coastguard Worker /* -1 since #line is the number of the next line */ 85*cd60bc56SAndroid Build Coastguard Worker srcpos_set_line(xstrdup(fn.val), atoi(line) - 1); 86*cd60bc56SAndroid Build Coastguard Worker data_free(fn); 87*cd60bc56SAndroid Build Coastguard Worker } 88*cd60bc56SAndroid Build Coastguard Worker 89*cd60bc56SAndroid Build Coastguard Worker <*><<EOF>> { 90*cd60bc56SAndroid Build Coastguard Worker if (!pop_input_file()) { 91*cd60bc56SAndroid Build Coastguard Worker yyterminate(); 92*cd60bc56SAndroid Build Coastguard Worker } 93*cd60bc56SAndroid Build Coastguard Worker } 94*cd60bc56SAndroid Build Coastguard Worker 95*cd60bc56SAndroid Build Coastguard Worker <*>{STRING} { 96*cd60bc56SAndroid Build Coastguard Worker DPRINT("String: %s\n", yytext); 97*cd60bc56SAndroid Build Coastguard Worker yylval.data = data_copy_escape_string(yytext+1, 98*cd60bc56SAndroid Build Coastguard Worker yyleng-2); 99*cd60bc56SAndroid Build Coastguard Worker return DT_STRING; 100*cd60bc56SAndroid Build Coastguard Worker } 101*cd60bc56SAndroid Build Coastguard Worker 102*cd60bc56SAndroid Build Coastguard Worker <*>"/dts-v1/" { 103*cd60bc56SAndroid Build Coastguard Worker DPRINT("Keyword: /dts-v1/\n"); 104*cd60bc56SAndroid Build Coastguard Worker dts_version = 1; 105*cd60bc56SAndroid Build Coastguard Worker BEGIN_DEFAULT(); 106*cd60bc56SAndroid Build Coastguard Worker return DT_V1; 107*cd60bc56SAndroid Build Coastguard Worker } 108*cd60bc56SAndroid Build Coastguard Worker 109*cd60bc56SAndroid Build Coastguard Worker <*>"/plugin/" { 110*cd60bc56SAndroid Build Coastguard Worker DPRINT("Keyword: /plugin/\n"); 111*cd60bc56SAndroid Build Coastguard Worker return DT_PLUGIN; 112*cd60bc56SAndroid Build Coastguard Worker } 113*cd60bc56SAndroid Build Coastguard Worker 114*cd60bc56SAndroid Build Coastguard Worker <*>"/memreserve/" { 115*cd60bc56SAndroid Build Coastguard Worker DPRINT("Keyword: /memreserve/\n"); 116*cd60bc56SAndroid Build Coastguard Worker BEGIN_DEFAULT(); 117*cd60bc56SAndroid Build Coastguard Worker return DT_MEMRESERVE; 118*cd60bc56SAndroid Build Coastguard Worker } 119*cd60bc56SAndroid Build Coastguard Worker 120*cd60bc56SAndroid Build Coastguard Worker <*>"/bits/" { 121*cd60bc56SAndroid Build Coastguard Worker DPRINT("Keyword: /bits/\n"); 122*cd60bc56SAndroid Build Coastguard Worker BEGIN_DEFAULT(); 123*cd60bc56SAndroid Build Coastguard Worker return DT_BITS; 124*cd60bc56SAndroid Build Coastguard Worker } 125*cd60bc56SAndroid Build Coastguard Worker 126*cd60bc56SAndroid Build Coastguard Worker <*>"/delete-property/" { 127*cd60bc56SAndroid Build Coastguard Worker DPRINT("Keyword: /delete-property/\n"); 128*cd60bc56SAndroid Build Coastguard Worker DPRINT("<PROPNODENAME>\n"); 129*cd60bc56SAndroid Build Coastguard Worker BEGIN(PROPNODENAME); 130*cd60bc56SAndroid Build Coastguard Worker return DT_DEL_PROP; 131*cd60bc56SAndroid Build Coastguard Worker } 132*cd60bc56SAndroid Build Coastguard Worker 133*cd60bc56SAndroid Build Coastguard Worker <*>"/delete-node/" { 134*cd60bc56SAndroid Build Coastguard Worker DPRINT("Keyword: /delete-node/\n"); 135*cd60bc56SAndroid Build Coastguard Worker DPRINT("<PROPNODENAME>\n"); 136*cd60bc56SAndroid Build Coastguard Worker BEGIN(PROPNODENAME); 137*cd60bc56SAndroid Build Coastguard Worker return DT_DEL_NODE; 138*cd60bc56SAndroid Build Coastguard Worker } 139*cd60bc56SAndroid Build Coastguard Worker 140*cd60bc56SAndroid Build Coastguard Worker <*>"/omit-if-no-ref/" { 141*cd60bc56SAndroid Build Coastguard Worker DPRINT("Keyword: /omit-if-no-ref/\n"); 142*cd60bc56SAndroid Build Coastguard Worker DPRINT("<PROPNODENAME>\n"); 143*cd60bc56SAndroid Build Coastguard Worker BEGIN(PROPNODENAME); 144*cd60bc56SAndroid Build Coastguard Worker return DT_OMIT_NO_REF; 145*cd60bc56SAndroid Build Coastguard Worker } 146*cd60bc56SAndroid Build Coastguard Worker 147*cd60bc56SAndroid Build Coastguard Worker <*>{LABEL}: { 148*cd60bc56SAndroid Build Coastguard Worker DPRINT("Label: %s\n", yytext); 149*cd60bc56SAndroid Build Coastguard Worker yylval.labelref = xstrdup(yytext); 150*cd60bc56SAndroid Build Coastguard Worker yylval.labelref[yyleng-1] = '\0'; 151*cd60bc56SAndroid Build Coastguard Worker return DT_LABEL; 152*cd60bc56SAndroid Build Coastguard Worker } 153*cd60bc56SAndroid Build Coastguard Worker 154*cd60bc56SAndroid Build Coastguard Worker <V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? { 155*cd60bc56SAndroid Build Coastguard Worker char *e; 156*cd60bc56SAndroid Build Coastguard Worker DPRINT("Integer Literal: '%s'\n", yytext); 157*cd60bc56SAndroid Build Coastguard Worker 158*cd60bc56SAndroid Build Coastguard Worker errno = 0; 159*cd60bc56SAndroid Build Coastguard Worker yylval.integer = strtoull(yytext, &e, 0); 160*cd60bc56SAndroid Build Coastguard Worker 161*cd60bc56SAndroid Build Coastguard Worker if (*e && e[strspn(e, "UL")]) { 162*cd60bc56SAndroid Build Coastguard Worker lexical_error("Bad integer literal '%s'", 163*cd60bc56SAndroid Build Coastguard Worker yytext); 164*cd60bc56SAndroid Build Coastguard Worker } 165*cd60bc56SAndroid Build Coastguard Worker 166*cd60bc56SAndroid Build Coastguard Worker if (errno == ERANGE) 167*cd60bc56SAndroid Build Coastguard Worker lexical_error("Integer literal '%s' out of range", 168*cd60bc56SAndroid Build Coastguard Worker yytext); 169*cd60bc56SAndroid Build Coastguard Worker else 170*cd60bc56SAndroid Build Coastguard Worker /* ERANGE is the only strtoull error triggerable 171*cd60bc56SAndroid Build Coastguard Worker * by strings matching the pattern */ 172*cd60bc56SAndroid Build Coastguard Worker assert(errno == 0); 173*cd60bc56SAndroid Build Coastguard Worker return DT_LITERAL; 174*cd60bc56SAndroid Build Coastguard Worker } 175*cd60bc56SAndroid Build Coastguard Worker 176*cd60bc56SAndroid Build Coastguard Worker <*>{CHAR_LITERAL} { 177*cd60bc56SAndroid Build Coastguard Worker struct data d; 178*cd60bc56SAndroid Build Coastguard Worker DPRINT("Character literal: %s\n", yytext); 179*cd60bc56SAndroid Build Coastguard Worker 180*cd60bc56SAndroid Build Coastguard Worker d = data_copy_escape_string(yytext+1, yyleng-2); 181*cd60bc56SAndroid Build Coastguard Worker if (d.len == 1) { 182*cd60bc56SAndroid Build Coastguard Worker lexical_error("Empty character literal"); 183*cd60bc56SAndroid Build Coastguard Worker yylval.integer = 0; 184*cd60bc56SAndroid Build Coastguard Worker } else { 185*cd60bc56SAndroid Build Coastguard Worker yylval.integer = (unsigned char)d.val[0]; 186*cd60bc56SAndroid Build Coastguard Worker 187*cd60bc56SAndroid Build Coastguard Worker if (d.len > 2) 188*cd60bc56SAndroid Build Coastguard Worker lexical_error("Character literal has %d" 189*cd60bc56SAndroid Build Coastguard Worker " characters instead of 1", 190*cd60bc56SAndroid Build Coastguard Worker d.len - 1); 191*cd60bc56SAndroid Build Coastguard Worker } 192*cd60bc56SAndroid Build Coastguard Worker 193*cd60bc56SAndroid Build Coastguard Worker data_free(d); 194*cd60bc56SAndroid Build Coastguard Worker return DT_CHAR_LITERAL; 195*cd60bc56SAndroid Build Coastguard Worker } 196*cd60bc56SAndroid Build Coastguard Worker 197*cd60bc56SAndroid Build Coastguard Worker <*>\&{LABEL} { /* label reference */ 198*cd60bc56SAndroid Build Coastguard Worker DPRINT("Ref: %s\n", yytext+1); 199*cd60bc56SAndroid Build Coastguard Worker yylval.labelref = xstrdup(yytext+1); 200*cd60bc56SAndroid Build Coastguard Worker return DT_LABEL_REF; 201*cd60bc56SAndroid Build Coastguard Worker } 202*cd60bc56SAndroid Build Coastguard Worker 203*cd60bc56SAndroid Build Coastguard Worker <*>"&{"{PATHCHAR}*\} { /* new-style path reference */ 204*cd60bc56SAndroid Build Coastguard Worker yytext[yyleng-1] = '\0'; 205*cd60bc56SAndroid Build Coastguard Worker DPRINT("Ref: %s\n", yytext+2); 206*cd60bc56SAndroid Build Coastguard Worker yylval.labelref = xstrdup(yytext+2); 207*cd60bc56SAndroid Build Coastguard Worker return DT_PATH_REF; 208*cd60bc56SAndroid Build Coastguard Worker } 209*cd60bc56SAndroid Build Coastguard Worker 210*cd60bc56SAndroid Build Coastguard Worker <BYTESTRING>[0-9a-fA-F]{2} { 211*cd60bc56SAndroid Build Coastguard Worker yylval.byte = strtol(yytext, NULL, 16); 212*cd60bc56SAndroid Build Coastguard Worker DPRINT("Byte: %02x\n", (int)yylval.byte); 213*cd60bc56SAndroid Build Coastguard Worker return DT_BYTE; 214*cd60bc56SAndroid Build Coastguard Worker } 215*cd60bc56SAndroid Build Coastguard Worker 216*cd60bc56SAndroid Build Coastguard Worker <BYTESTRING>"]" { 217*cd60bc56SAndroid Build Coastguard Worker DPRINT("/BYTESTRING\n"); 218*cd60bc56SAndroid Build Coastguard Worker BEGIN_DEFAULT(); 219*cd60bc56SAndroid Build Coastguard Worker return ']'; 220*cd60bc56SAndroid Build Coastguard Worker } 221*cd60bc56SAndroid Build Coastguard Worker 222*cd60bc56SAndroid Build Coastguard Worker <PROPNODENAME>\\?{PROPNODECHAR}+ { 223*cd60bc56SAndroid Build Coastguard Worker DPRINT("PropNodeName: %s\n", yytext); 224*cd60bc56SAndroid Build Coastguard Worker yylval.propnodename = xstrdup((yytext[0] == '\\') ? 225*cd60bc56SAndroid Build Coastguard Worker yytext + 1 : yytext); 226*cd60bc56SAndroid Build Coastguard Worker BEGIN_DEFAULT(); 227*cd60bc56SAndroid Build Coastguard Worker return DT_PROPNODENAME; 228*cd60bc56SAndroid Build Coastguard Worker } 229*cd60bc56SAndroid Build Coastguard Worker 230*cd60bc56SAndroid Build Coastguard Worker "/incbin/" { 231*cd60bc56SAndroid Build Coastguard Worker DPRINT("Binary Include\n"); 232*cd60bc56SAndroid Build Coastguard Worker return DT_INCBIN; 233*cd60bc56SAndroid Build Coastguard Worker } 234*cd60bc56SAndroid Build Coastguard Worker 235*cd60bc56SAndroid Build Coastguard Worker <*>{WS}+ /* eat whitespace */ 236*cd60bc56SAndroid Build Coastguard Worker <*>{COMMENT}+ /* eat C-style comments */ 237*cd60bc56SAndroid Build Coastguard Worker <*>{LINECOMMENT}+ /* eat C++-style comments */ 238*cd60bc56SAndroid Build Coastguard Worker 239*cd60bc56SAndroid Build Coastguard Worker <*>"<<" { return DT_LSHIFT; }; 240*cd60bc56SAndroid Build Coastguard Worker <*>">>" { return DT_RSHIFT; }; 241*cd60bc56SAndroid Build Coastguard Worker <*>"<=" { return DT_LE; }; 242*cd60bc56SAndroid Build Coastguard Worker <*>">=" { return DT_GE; }; 243*cd60bc56SAndroid Build Coastguard Worker <*>"==" { return DT_EQ; }; 244*cd60bc56SAndroid Build Coastguard Worker <*>"!=" { return DT_NE; }; 245*cd60bc56SAndroid Build Coastguard Worker <*>"&&" { return DT_AND; }; 246*cd60bc56SAndroid Build Coastguard Worker <*>"||" { return DT_OR; }; 247*cd60bc56SAndroid Build Coastguard Worker 248*cd60bc56SAndroid Build Coastguard Worker <*>. { 249*cd60bc56SAndroid Build Coastguard Worker DPRINT("Char: %c (\\x%02x)\n", yytext[0], 250*cd60bc56SAndroid Build Coastguard Worker (unsigned)yytext[0]); 251*cd60bc56SAndroid Build Coastguard Worker if (yytext[0] == '[') { 252*cd60bc56SAndroid Build Coastguard Worker DPRINT("<BYTESTRING>\n"); 253*cd60bc56SAndroid Build Coastguard Worker BEGIN(BYTESTRING); 254*cd60bc56SAndroid Build Coastguard Worker } 255*cd60bc56SAndroid Build Coastguard Worker if ((yytext[0] == '{') 256*cd60bc56SAndroid Build Coastguard Worker || (yytext[0] == ';')) { 257*cd60bc56SAndroid Build Coastguard Worker DPRINT("<PROPNODENAME>\n"); 258*cd60bc56SAndroid Build Coastguard Worker BEGIN(PROPNODENAME); 259*cd60bc56SAndroid Build Coastguard Worker } 260*cd60bc56SAndroid Build Coastguard Worker return yytext[0]; 261*cd60bc56SAndroid Build Coastguard Worker } 262*cd60bc56SAndroid Build Coastguard Worker 263*cd60bc56SAndroid Build Coastguard Worker %% 264*cd60bc56SAndroid Build Coastguard Worker 265*cd60bc56SAndroid Build Coastguard Worker static void push_input_file(const char *filename) 266*cd60bc56SAndroid Build Coastguard Worker { 267*cd60bc56SAndroid Build Coastguard Worker assert(filename); 268*cd60bc56SAndroid Build Coastguard Worker 269*cd60bc56SAndroid Build Coastguard Worker srcfile_push(filename); 270*cd60bc56SAndroid Build Coastguard Worker 271*cd60bc56SAndroid Build Coastguard Worker yyin = current_srcfile->f; 272*cd60bc56SAndroid Build Coastguard Worker 273*cd60bc56SAndroid Build Coastguard Worker yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE)); 274*cd60bc56SAndroid Build Coastguard Worker } 275*cd60bc56SAndroid Build Coastguard Worker 276*cd60bc56SAndroid Build Coastguard Worker 277*cd60bc56SAndroid Build Coastguard Worker static bool pop_input_file(void) 278*cd60bc56SAndroid Build Coastguard Worker { 279*cd60bc56SAndroid Build Coastguard Worker if (srcfile_pop() == 0) 280*cd60bc56SAndroid Build Coastguard Worker return false; 281*cd60bc56SAndroid Build Coastguard Worker 282*cd60bc56SAndroid Build Coastguard Worker yypop_buffer_state(); 283*cd60bc56SAndroid Build Coastguard Worker yyin = current_srcfile->f; 284*cd60bc56SAndroid Build Coastguard Worker 285*cd60bc56SAndroid Build Coastguard Worker return true; 286*cd60bc56SAndroid Build Coastguard Worker } 287*cd60bc56SAndroid Build Coastguard Worker 288*cd60bc56SAndroid Build Coastguard Worker static void lexical_error(const char *fmt, ...) 289*cd60bc56SAndroid Build Coastguard Worker { 290*cd60bc56SAndroid Build Coastguard Worker va_list ap; 291*cd60bc56SAndroid Build Coastguard Worker 292*cd60bc56SAndroid Build Coastguard Worker va_start(ap, fmt); 293*cd60bc56SAndroid Build Coastguard Worker srcpos_verror(&yylloc, "Lexical error", fmt, ap); 294*cd60bc56SAndroid Build Coastguard Worker va_end(ap); 295*cd60bc56SAndroid Build Coastguard Worker 296*cd60bc56SAndroid Build Coastguard Worker treesource_error = true; 297*cd60bc56SAndroid Build Coastguard Worker } 298