Home | History | Annotate | Download | only in gold
      1 // script.cc -- handle linker scripts for gold.
      2 
      3 // Copyright (C) 2006-2014 Free Software Foundation, Inc.
      4 // Written by Ian Lance Taylor <iant (at) google.com>.
      5 
      6 // This file is part of gold.
      7 
      8 // This program is free software; you can redistribute it and/or modify
      9 // it under the terms of the GNU General Public License as published by
     10 // the Free Software Foundation; either version 3 of the License, or
     11 // (at your option) any later version.
     12 
     13 // This program is distributed in the hope that it will be useful,
     14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 // GNU General Public License for more details.
     17 
     18 // You should have received a copy of the GNU General Public License
     19 // along with this program; if not, write to the Free Software
     20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21 // MA 02110-1301, USA.
     22 
     23 #include "gold.h"
     24 
     25 #include <cstdio>
     26 #include <cstdlib>
     27 #include <cstring>
     28 #include <fnmatch.h>
     29 #include <string>
     30 #include <vector>
     31 #include "filenames.h"
     32 
     33 #include "elfcpp.h"
     34 #include "demangle.h"
     35 #include "dirsearch.h"
     36 #include "options.h"
     37 #include "fileread.h"
     38 #include "workqueue.h"
     39 #include "readsyms.h"
     40 #include "parameters.h"
     41 #include "layout.h"
     42 #include "symtab.h"
     43 #include "target-select.h"
     44 #include "script.h"
     45 #include "script-c.h"
     46 #include "incremental.h"
     47 
     48 namespace gold
     49 {
     50 
     51 // A token read from a script file.  We don't implement keywords here;
     52 // all keywords are simply represented as a string.
     53 
     54 class Token
     55 {
     56  public:
     57   // Token classification.
     58   enum Classification
     59   {
     60     // Token is invalid.
     61     TOKEN_INVALID,
     62     // Token indicates end of input.
     63     TOKEN_EOF,
     64     // Token is a string of characters.
     65     TOKEN_STRING,
     66     // Token is a quoted string of characters.
     67     TOKEN_QUOTED_STRING,
     68     // Token is an operator.
     69     TOKEN_OPERATOR,
     70     // Token is a number (an integer).
     71     TOKEN_INTEGER
     72   };
     73 
     74   // We need an empty constructor so that we can put this STL objects.
     75   Token()
     76     : classification_(TOKEN_INVALID), value_(NULL), value_length_(0),
     77       opcode_(0), lineno_(0), charpos_(0)
     78   { }
     79 
     80   // A general token with no value.
     81   Token(Classification classification, int lineno, int charpos)
     82     : classification_(classification), value_(NULL), value_length_(0),
     83       opcode_(0), lineno_(lineno), charpos_(charpos)
     84   {
     85     gold_assert(classification == TOKEN_INVALID
     86 		|| classification == TOKEN_EOF);
     87   }
     88 
     89   // A general token with a value.
     90   Token(Classification classification, const char* value, size_t length,
     91 	int lineno, int charpos)
     92     : classification_(classification), value_(value), value_length_(length),
     93       opcode_(0), lineno_(lineno), charpos_(charpos)
     94   {
     95     gold_assert(classification != TOKEN_INVALID
     96 		&& classification != TOKEN_EOF);
     97   }
     98 
     99   // A token representing an operator.
    100   Token(int opcode, int lineno, int charpos)
    101     : classification_(TOKEN_OPERATOR), value_(NULL), value_length_(0),
    102       opcode_(opcode), lineno_(lineno), charpos_(charpos)
    103   { }
    104 
    105   // Return whether the token is invalid.
    106   bool
    107   is_invalid() const
    108   { return this->classification_ == TOKEN_INVALID; }
    109 
    110   // Return whether this is an EOF token.
    111   bool
    112   is_eof() const
    113   { return this->classification_ == TOKEN_EOF; }
    114 
    115   // Return the token classification.
    116   Classification
    117   classification() const
    118   { return this->classification_; }
    119 
    120   // Return the line number at which the token starts.
    121   int
    122   lineno() const
    123   { return this->lineno_; }
    124 
    125   // Return the character position at this the token starts.
    126   int
    127   charpos() const
    128   { return this->charpos_; }
    129 
    130   // Get the value of a token.
    131 
    132   const char*
    133   string_value(size_t* length) const
    134   {
    135     gold_assert(this->classification_ == TOKEN_STRING
    136 		|| this->classification_ == TOKEN_QUOTED_STRING);
    137     *length = this->value_length_;
    138     return this->value_;
    139   }
    140 
    141   int
    142   operator_value() const
    143   {
    144     gold_assert(this->classification_ == TOKEN_OPERATOR);
    145     return this->opcode_;
    146   }
    147 
    148   uint64_t
    149   integer_value() const;
    150 
    151  private:
    152   // The token classification.
    153   Classification classification_;
    154   // The token value, for TOKEN_STRING or TOKEN_QUOTED_STRING or
    155   // TOKEN_INTEGER.
    156   const char* value_;
    157   // The length of the token value.
    158   size_t value_length_;
    159   // The token value, for TOKEN_OPERATOR.
    160   int opcode_;
    161   // The line number where this token started (one based).
    162   int lineno_;
    163   // The character position within the line where this token started
    164   // (one based).
    165   int charpos_;
    166 };
    167 
    168 // Return the value of a TOKEN_INTEGER.
    169 
    170 uint64_t
    171 Token::integer_value() const
    172 {
    173   gold_assert(this->classification_ == TOKEN_INTEGER);
    174 
    175   size_t len = this->value_length_;
    176 
    177   uint64_t multiplier = 1;
    178   char last = this->value_[len - 1];
    179   if (last == 'm' || last == 'M')
    180     {
    181       multiplier = 1024 * 1024;
    182       --len;
    183     }
    184   else if (last == 'k' || last == 'K')
    185     {
    186       multiplier = 1024;
    187       --len;
    188     }
    189 
    190   char *end;
    191   uint64_t ret = strtoull(this->value_, &end, 0);
    192   gold_assert(static_cast<size_t>(end - this->value_) == len);
    193 
    194   return ret * multiplier;
    195 }
    196 
    197 // This class handles lexing a file into a sequence of tokens.
    198 
    199 class Lex
    200 {
    201  public:
    202   // We unfortunately have to support different lexing modes, because
    203   // when reading different parts of a linker script we need to parse
    204   // things differently.
    205   enum Mode
    206   {
    207     // Reading an ordinary linker script.
    208     LINKER_SCRIPT,
    209     // Reading an expression in a linker script.
    210     EXPRESSION,
    211     // Reading a version script.
    212     VERSION_SCRIPT,
    213     // Reading a --dynamic-list file.
    214     DYNAMIC_LIST
    215   };
    216 
    217   Lex(const char* input_string, size_t input_length, int parsing_token)
    218     : input_string_(input_string), input_length_(input_length),
    219       current_(input_string), mode_(LINKER_SCRIPT),
    220       first_token_(parsing_token), token_(),
    221       lineno_(1), linestart_(input_string)
    222   { }
    223 
    224   // Read a file into a string.
    225   static void
    226   read_file(Input_file*, std::string*);
    227 
    228   // Return the next token.
    229   const Token*
    230   next_token();
    231 
    232   // Return the current lexing mode.
    233   Lex::Mode
    234   mode() const
    235   { return this->mode_; }
    236 
    237   // Set the lexing mode.
    238   void
    239   set_mode(Mode mode)
    240   { this->mode_ = mode; }
    241 
    242  private:
    243   Lex(const Lex&);
    244   Lex& operator=(const Lex&);
    245 
    246   // Make a general token with no value at the current location.
    247   Token
    248   make_token(Token::Classification c, const char* start) const
    249   { return Token(c, this->lineno_, start - this->linestart_ + 1); }
    250 
    251   // Make a general token with a value at the current location.
    252   Token
    253   make_token(Token::Classification c, const char* v, size_t len,
    254 	     const char* start)
    255     const
    256   { return Token(c, v, len, this->lineno_, start - this->linestart_ + 1); }
    257 
    258   // Make an operator token at the current location.
    259   Token
    260   make_token(int opcode, const char* start) const
    261   { return Token(opcode, this->lineno_, start - this->linestart_ + 1); }
    262 
    263   // Make an invalid token at the current location.
    264   Token
    265   make_invalid_token(const char* start)
    266   { return this->make_token(Token::TOKEN_INVALID, start); }
    267 
    268   // Make an EOF token at the current location.
    269   Token
    270   make_eof_token(const char* start)
    271   { return this->make_token(Token::TOKEN_EOF, start); }
    272 
    273   // Return whether C can be the first character in a name.  C2 is the
    274   // next character, since we sometimes need that.
    275   inline bool
    276   can_start_name(char c, char c2);
    277 
    278   // If C can appear in a name which has already started, return a
    279   // pointer to a character later in the token or just past
    280   // it. Otherwise, return NULL.
    281   inline const char*
    282   can_continue_name(const char* c);
    283 
    284   // Return whether C, C2, C3 can start a hex number.
    285   inline bool
    286   can_start_hex(char c, char c2, char c3);
    287 
    288   // If C can appear in a hex number which has already started, return
    289   // a pointer to a character later in the token or just past
    290   // it. Otherwise, return NULL.
    291   inline const char*
    292   can_continue_hex(const char* c);
    293 
    294   // Return whether C can start a non-hex number.
    295   static inline bool
    296   can_start_number(char c);
    297 
    298   // If C can appear in a decimal number which has already started,
    299   // return a pointer to a character later in the token or just past
    300   // it. Otherwise, return NULL.
    301   inline const char*
    302   can_continue_number(const char* c)
    303   { return Lex::can_start_number(*c) ? c + 1 : NULL; }
    304 
    305   // If C1 C2 C3 form a valid three character operator, return the
    306   // opcode.  Otherwise return 0.
    307   static inline int
    308   three_char_operator(char c1, char c2, char c3);
    309 
    310   // If C1 C2 form a valid two character operator, return the opcode.
    311   // Otherwise return 0.
    312   static inline int
    313   two_char_operator(char c1, char c2);
    314 
    315   // If C1 is a valid one character operator, return the opcode.
    316   // Otherwise return 0.
    317   static inline int
    318   one_char_operator(char c1);
    319 
    320   // Read the next token.
    321   Token
    322   get_token(const char**);
    323 
    324   // Skip a C style /* */ comment.  Return false if the comment did
    325   // not end.
    326   bool
    327   skip_c_comment(const char**);
    328 
    329   // Skip a line # comment.  Return false if there was no newline.
    330   bool
    331   skip_line_comment(const char**);
    332 
    333   // Build a token CLASSIFICATION from all characters that match
    334   // CAN_CONTINUE_FN.  The token starts at START.  Start matching from
    335   // MATCH.  Set *PP to the character following the token.
    336   inline Token
    337   gather_token(Token::Classification,
    338 	       const char* (Lex::*can_continue_fn)(const char*),
    339 	       const char* start, const char* match, const char** pp);
    340 
    341   // Build a token from a quoted string.
    342   Token
    343   gather_quoted_string(const char** pp);
    344 
    345   // The string we are tokenizing.
    346   const char* input_string_;
    347   // The length of the string.
    348   size_t input_length_;
    349   // The current offset into the string.
    350   const char* current_;
    351   // The current lexing mode.
    352   Mode mode_;
    353   // The code to use for the first token.  This is set to 0 after it
    354   // is used.
    355   int first_token_;
    356   // The current token.
    357   Token token_;
    358   // The current line number.
    359   int lineno_;
    360   // The start of the current line in the string.
    361   const char* linestart_;
    362 };
    363 
    364 // Read the whole file into memory.  We don't expect linker scripts to
    365 // be large, so we just use a std::string as a buffer.  We ignore the
    366 // data we've already read, so that we read aligned buffers.
    367 
    368 void
    369 Lex::read_file(Input_file* input_file, std::string* contents)
    370 {
    371   off_t filesize = input_file->file().filesize();
    372   contents->clear();
    373   contents->reserve(filesize);
    374 
    375   off_t off = 0;
    376   unsigned char buf[BUFSIZ];
    377   while (off < filesize)
    378     {
    379       off_t get = BUFSIZ;
    380       if (get > filesize - off)
    381 	get = filesize - off;
    382       input_file->file().read(off, get, buf);
    383       contents->append(reinterpret_cast<char*>(&buf[0]), get);
    384       off += get;
    385     }
    386 }
    387 
    388 // Return whether C can be the start of a name, if the next character
    389 // is C2.  A name can being with a letter, underscore, period, or
    390 // dollar sign.  Because a name can be a file name, we also permit
    391 // forward slash, backslash, and tilde.  Tilde is the tricky case
    392 // here; GNU ld also uses it as a bitwise not operator.  It is only
    393 // recognized as the operator if it is not immediately followed by
    394 // some character which can appear in a symbol.  That is, when we
    395 // don't know that we are looking at an expression, "~0" is a file
    396 // name, and "~ 0" is an expression using bitwise not.  We are
    397 // compatible.
    398 
    399 inline bool
    400 Lex::can_start_name(char c, char c2)
    401 {
    402   switch (c)
    403     {
    404     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
    405     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
    406     case 'M': case 'N': case 'O': case 'Q': case 'P': case 'R':
    407     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
    408     case 'Y': case 'Z':
    409     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
    410     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
    411     case 'm': case 'n': case 'o': case 'q': case 'p': case 'r':
    412     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
    413     case 'y': case 'z':
    414     case '_': case '.': case '$':
    415       return true;
    416 
    417     case '/': case '\\':
    418       return this->mode_ == LINKER_SCRIPT;
    419 
    420     case '~':
    421       return this->mode_ == LINKER_SCRIPT && can_continue_name(&c2);
    422 
    423     case '*': case '[':
    424       return (this->mode_ == VERSION_SCRIPT
    425               || this->mode_ == DYNAMIC_LIST
    426 	      || (this->mode_ == LINKER_SCRIPT
    427 		  && can_continue_name(&c2)));
    428 
    429     default:
    430       return false;
    431     }
    432 }
    433 
    434 // Return whether C can continue a name which has already started.
    435 // Subsequent characters in a name are the same as the leading
    436 // characters, plus digits and "=+-:[],?*".  So in general the linker
    437 // script language requires spaces around operators, unless we know
    438 // that we are parsing an expression.
    439 
    440 inline const char*
    441 Lex::can_continue_name(const char* c)
    442 {
    443   switch (*c)
    444     {
    445     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
    446     case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
    447     case 'M': case 'N': case 'O': case 'Q': case 'P': case 'R':
    448     case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
    449     case 'Y': case 'Z':
    450     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
    451     case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
    452     case 'm': case 'n': case 'o': case 'q': case 'p': case 'r':
    453     case 's': case 't': case 'u': case 'v': case 'w': case 'x':
    454     case 'y': case 'z':
    455     case '_': case '.': case '$':
    456     case '0': case '1': case '2': case '3': case '4':
    457     case '5': case '6': case '7': case '8': case '9':
    458       return c + 1;
    459 
    460     // TODO(csilvers): why not allow ~ in names for version-scripts?
    461     case '/': case '\\': case '~':
    462     case '=': case '+':
    463     case ',':
    464       if (this->mode_ == LINKER_SCRIPT)
    465         return c + 1;
    466       return NULL;
    467 
    468     case '[': case ']': case '*': case '?': case '-':
    469       if (this->mode_ == LINKER_SCRIPT || this->mode_ == VERSION_SCRIPT
    470           || this->mode_ == DYNAMIC_LIST)
    471         return c + 1;
    472       return NULL;
    473 
    474     // TODO(csilvers): why allow this?  ^ is meaningless in version scripts.
    475     case '^':
    476       if (this->mode_ == VERSION_SCRIPT || this->mode_ == DYNAMIC_LIST)
    477         return c + 1;
    478       return NULL;
    479 
    480     case ':':
    481       if (this->mode_ == LINKER_SCRIPT)
    482         return c + 1;
    483       else if ((this->mode_ == VERSION_SCRIPT || this->mode_ == DYNAMIC_LIST)
    484                && (c[1] == ':'))
    485         {
    486           // A name can have '::' in it, as that's a c++ namespace
    487           // separator. But a single colon is not part of a name.
    488           return c + 2;
    489         }
    490       return NULL;
    491 
    492     default:
    493       return NULL;
    494     }
    495 }
    496 
    497 // For a number we accept 0x followed by hex digits, or any sequence
    498 // of digits.  The old linker accepts leading '$' for hex, and
    499 // trailing HXBOD.  Those are for MRI compatibility and we don't
    500 // accept them.
    501 
    502 // Return whether C1 C2 C3 can start a hex number.
    503 
    504 inline bool
    505 Lex::can_start_hex(char c1, char c2, char c3)
    506 {
    507   if (c1 == '0' && (c2 == 'x' || c2 == 'X'))
    508     return this->can_continue_hex(&c3);
    509   return false;
    510 }
    511 
    512 // Return whether C can appear in a hex number.
    513 
    514 inline const char*
    515 Lex::can_continue_hex(const char* c)
    516 {
    517   switch (*c)
    518     {
    519     case '0': case '1': case '2': case '3': case '4':
    520     case '5': case '6': case '7': case '8': case '9':
    521     case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
    522     case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
    523       return c + 1;
    524 
    525     default:
    526       return NULL;
    527     }
    528 }
    529 
    530 // Return whether C can start a non-hex number.
    531 
    532 inline bool
    533 Lex::can_start_number(char c)
    534 {
    535   switch (c)
    536     {
    537     case '0': case '1': case '2': case '3': case '4':
    538     case '5': case '6': case '7': case '8': case '9':
    539       return true;
    540 
    541     default:
    542       return false;
    543     }
    544 }
    545 
    546 // If C1 C2 C3 form a valid three character operator, return the
    547 // opcode (defined in the yyscript.h file generated from yyscript.y).
    548 // Otherwise return 0.
    549 
    550 inline int
    551 Lex::three_char_operator(char c1, char c2, char c3)
    552 {
    553   switch (c1)
    554     {
    555     case '<':
    556       if (c2 == '<' && c3 == '=')
    557 	return LSHIFTEQ;
    558       break;
    559     case '>':
    560       if (c2 == '>' && c3 == '=')
    561 	return RSHIFTEQ;
    562       break;
    563     default:
    564       break;
    565     }
    566   return 0;
    567 }
    568 
    569 // If C1 C2 form a valid two character operator, return the opcode
    570 // (defined in the yyscript.h file generated from yyscript.y).
    571 // Otherwise return 0.
    572 
    573 inline int
    574 Lex::two_char_operator(char c1, char c2)
    575 {
    576   switch (c1)
    577     {
    578     case '=':
    579       if (c2 == '=')
    580 	return EQ;
    581       break;
    582     case '!':
    583       if (c2 == '=')
    584 	return NE;
    585       break;
    586     case '+':
    587       if (c2 == '=')
    588 	return PLUSEQ;
    589       break;
    590     case '-':
    591       if (c2 == '=')
    592 	return MINUSEQ;
    593       break;
    594     case '*':
    595       if (c2 == '=')
    596 	return MULTEQ;
    597       break;
    598     case '/':
    599       if (c2 == '=')
    600 	return DIVEQ;
    601       break;
    602     case '|':
    603       if (c2 == '=')
    604 	return OREQ;
    605       if (c2 == '|')
    606 	return OROR;
    607       break;
    608     case '&':
    609       if (c2 == '=')
    610 	return ANDEQ;
    611       if (c2 == '&')
    612 	return ANDAND;
    613       break;
    614     case '>':
    615       if (c2 == '=')
    616 	return GE;
    617       if (c2 == '>')
    618 	return RSHIFT;
    619       break;
    620     case '<':
    621       if (c2 == '=')
    622 	return LE;
    623       if (c2 == '<')
    624 	return LSHIFT;
    625       break;
    626     default:
    627       break;
    628     }
    629   return 0;
    630 }
    631 
    632 // If C1 is a valid operator, return the opcode.  Otherwise return 0.
    633 
    634 inline int
    635 Lex::one_char_operator(char c1)
    636 {
    637   switch (c1)
    638     {
    639     case '+':
    640     case '-':
    641     case '*':
    642     case '/':
    643     case '%':
    644     case '!':
    645     case '&':
    646     case '|':
    647     case '^':
    648     case '~':
    649     case '<':
    650     case '>':
    651     case '=':
    652     case '?':
    653     case ',':
    654     case '(':
    655     case ')':
    656     case '{':
    657     case '}':
    658     case '[':
    659     case ']':
    660     case ':':
    661     case ';':
    662       return c1;
    663     default:
    664       return 0;
    665     }
    666 }
    667 
    668 // Skip a C style comment.  *PP points to just after the "/*".  Return
    669 // false if the comment did not end.
    670 
    671 bool
    672 Lex::skip_c_comment(const char** pp)
    673 {
    674   const char* p = *pp;
    675   while (p[0] != '*' || p[1] != '/')
    676     {
    677       if (*p == '\0')
    678 	{
    679 	  *pp = p;
    680 	  return false;
    681 	}
    682 
    683       if (*p == '\n')
    684 	{
    685 	  ++this->lineno_;
    686 	  this->linestart_ = p + 1;
    687 	}
    688       ++p;
    689     }
    690 
    691   *pp = p + 2;
    692   return true;
    693 }
    694 
    695 // Skip a line # comment.  Return false if there was no newline.
    696 
    697 bool
    698 Lex::skip_line_comment(const char** pp)
    699 {
    700   const char* p = *pp;
    701   size_t skip = strcspn(p, "\n");
    702   if (p[skip] == '\0')
    703     {
    704       *pp = p + skip;
    705       return false;
    706     }
    707 
    708   p += skip + 1;
    709   ++this->lineno_;
    710   this->linestart_ = p;
    711   *pp = p;
    712 
    713   return true;
    714 }
    715 
    716 // Build a token CLASSIFICATION from all characters that match
    717 // CAN_CONTINUE_FN.  Update *PP.
    718 
    719 inline Token
    720 Lex::gather_token(Token::Classification classification,
    721 		  const char* (Lex::*can_continue_fn)(const char*),
    722 		  const char* start,
    723 		  const char* match,
    724 		  const char** pp)
    725 {
    726   const char* new_match = NULL;
    727   while ((new_match = (this->*can_continue_fn)(match)) != NULL)
    728     match = new_match;
    729 
    730   // A special case: integers may be followed by a single M or K,
    731   // case-insensitive.
    732   if (classification == Token::TOKEN_INTEGER
    733       && (*match == 'm' || *match == 'M' || *match == 'k' || *match == 'K'))
    734     ++match;
    735 
    736   *pp = match;
    737   return this->make_token(classification, start, match - start, start);
    738 }
    739 
    740 // Build a token from a quoted string.
    741 
    742 Token
    743 Lex::gather_quoted_string(const char** pp)
    744 {
    745   const char* start = *pp;
    746   const char* p = start;
    747   ++p;
    748   size_t skip = strcspn(p, "\"\n");
    749   if (p[skip] != '"')
    750     return this->make_invalid_token(start);
    751   *pp = p + skip + 1;
    752   return this->make_token(Token::TOKEN_QUOTED_STRING, p, skip, start);
    753 }
    754 
    755 // Return the next token at *PP.  Update *PP.  General guideline: we
    756 // require linker scripts to be simple ASCII.  No unicode linker
    757 // scripts.  In particular we can assume that any '\0' is the end of
    758 // the input.
    759 
    760 Token
    761 Lex::get_token(const char** pp)
    762 {
    763   const char* p = *pp;
    764 
    765   while (true)
    766     {
    767       if (*p == '\0')
    768 	{
    769 	  *pp = p;
    770 	  return this->make_eof_token(p);
    771 	}
    772 
    773       // Skip whitespace quickly.
    774       while (*p == ' ' || *p == '\t' || *p == '\r')
    775 	++p;
    776 
    777       if (*p == '\n')
    778 	{
    779 	  ++p;
    780 	  ++this->lineno_;
    781 	  this->linestart_ = p;
    782 	  continue;
    783 	}
    784 
    785       // Skip C style comments.
    786       if (p[0] == '/' && p[1] == '*')
    787 	{
    788 	  int lineno = this->lineno_;
    789 	  int charpos = p - this->linestart_ + 1;
    790 
    791 	  *pp = p + 2;
    792 	  if (!this->skip_c_comment(pp))
    793 	    return Token(Token::TOKEN_INVALID, lineno, charpos);
    794 	  p = *pp;
    795 
    796 	  continue;
    797 	}
    798 
    799       // Skip line comments.
    800       if (*p == '#')
    801 	{
    802 	  *pp = p + 1;
    803 	  if (!this->skip_line_comment(pp))
    804 	    return this->make_eof_token(p);
    805 	  p = *pp;
    806 	  continue;
    807 	}
    808 
    809       // Check for a name.
    810       if (this->can_start_name(p[0], p[1]))
    811 	return this->gather_token(Token::TOKEN_STRING,
    812 				  &Lex::can_continue_name,
    813 				  p, p + 1, pp);
    814 
    815       // We accept any arbitrary name in double quotes, as long as it
    816       // does not cross a line boundary.
    817       if (*p == '"')
    818 	{
    819 	  *pp = p;
    820 	  return this->gather_quoted_string(pp);
    821 	}
    822 
    823       // Check for a number.
    824 
    825       if (this->can_start_hex(p[0], p[1], p[2]))
    826 	return this->gather_token(Token::TOKEN_INTEGER,
    827 				  &Lex::can_continue_hex,
    828 				  p, p + 3, pp);
    829 
    830       if (Lex::can_start_number(p[0]))
    831 	return this->gather_token(Token::TOKEN_INTEGER,
    832 				  &Lex::can_continue_number,
    833 				  p, p + 1, pp);
    834 
    835       // Check for operators.
    836 
    837       int opcode = Lex::three_char_operator(p[0], p[1], p[2]);
    838       if (opcode != 0)
    839 	{
    840 	  *pp = p + 3;
    841 	  return this->make_token(opcode, p);
    842 	}
    843 
    844       opcode = Lex::two_char_operator(p[0], p[1]);
    845       if (opcode != 0)
    846 	{
    847 	  *pp = p + 2;
    848 	  return this->make_token(opcode, p);
    849 	}
    850 
    851       opcode = Lex::one_char_operator(p[0]);
    852       if (opcode != 0)
    853 	{
    854 	  *pp = p + 1;
    855 	  return this->make_token(opcode, p);
    856 	}
    857 
    858       return this->make_token(Token::TOKEN_INVALID, p);
    859     }
    860 }
    861 
    862 // Return the next token.
    863 
    864 const Token*
    865 Lex::next_token()
    866 {
    867   // The first token is special.
    868   if (this->first_token_ != 0)
    869     {
    870       this->token_ = Token(this->first_token_, 0, 0);
    871       this->first_token_ = 0;
    872       return &this->token_;
    873     }
    874 
    875   this->token_ = this->get_token(&this->current_);
    876 
    877   // Don't let an early null byte fool us into thinking that we've
    878   // reached the end of the file.
    879   if (this->token_.is_eof()
    880       && (static_cast<size_t>(this->current_ - this->input_string_)
    881 	  < this->input_length_))
    882     this->token_ = this->make_invalid_token(this->current_);
    883 
    884   return &this->token_;
    885 }
    886 
    887 // class Symbol_assignment.
    888 
    889 // Add the symbol to the symbol table.  This makes sure the symbol is
    890 // there and defined.  The actual value is stored later.  We can't
    891 // determine the actual value at this point, because we can't
    892 // necessarily evaluate the expression until all ordinary symbols have
    893 // been finalized.
    894 
    895 // The GNU linker lets symbol assignments in the linker script
    896 // silently override defined symbols in object files.  We are
    897 // compatible.  FIXME: Should we issue a warning?
    898 
    899 void
    900 Symbol_assignment::add_to_table(Symbol_table* symtab)
    901 {
    902   elfcpp::STV vis = this->hidden_ ? elfcpp::STV_HIDDEN : elfcpp::STV_DEFAULT;
    903   this->sym_ = symtab->define_as_constant(this->name_.c_str(),
    904 					  NULL, // version
    905 					  (this->is_defsym_
    906 					   ? Symbol_table::DEFSYM
    907 					   : Symbol_table::SCRIPT),
    908 					  0, // value
    909 					  0, // size
    910 					  elfcpp::STT_NOTYPE,
    911 					  elfcpp::STB_GLOBAL,
    912 					  vis,
    913 					  0, // nonvis
    914 					  this->provide_,
    915                                           true); // force_override
    916 }
    917 
    918 // Finalize a symbol value.
    919 
    920 void
    921 Symbol_assignment::finalize(Symbol_table* symtab, const Layout* layout)
    922 {
    923   this->finalize_maybe_dot(symtab, layout, false, 0, NULL);
    924 }
    925 
    926 // Finalize a symbol value which can refer to the dot symbol.
    927 
    928 void
    929 Symbol_assignment::finalize_with_dot(Symbol_table* symtab,
    930 				     const Layout* layout,
    931 				     uint64_t dot_value,
    932 				     Output_section* dot_section)
    933 {
    934   this->finalize_maybe_dot(symtab, layout, true, dot_value, dot_section);
    935 }
    936 
    937 // Finalize a symbol value, internal version.
    938 
    939 void
    940 Symbol_assignment::finalize_maybe_dot(Symbol_table* symtab,
    941 				      const Layout* layout,
    942 				      bool is_dot_available,
    943 				      uint64_t dot_value,
    944 				      Output_section* dot_section)
    945 {
    946   // If we were only supposed to provide this symbol, the sym_ field
    947   // will be NULL if the symbol was not referenced.
    948   if (this->sym_ == NULL)
    949     {
    950       gold_assert(this->provide_);
    951       return;
    952     }
    953 
    954   if (parameters->target().get_size() == 32)
    955     {
    956 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
    957       this->sized_finalize<32>(symtab, layout, is_dot_available, dot_value,
    958 			       dot_section);
    959 #else
    960       gold_unreachable();
    961 #endif
    962     }
    963   else if (parameters->target().get_size() == 64)
    964     {
    965 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
    966       this->sized_finalize<64>(symtab, layout, is_dot_available, dot_value,
    967 			       dot_section);
    968 #else
    969       gold_unreachable();
    970 #endif
    971     }
    972   else
    973     gold_unreachable();
    974 }
    975 
    976 template<int size>
    977 void
    978 Symbol_assignment::sized_finalize(Symbol_table* symtab, const Layout* layout,
    979 				  bool is_dot_available, uint64_t dot_value,
    980 				  Output_section* dot_section)
    981 {
    982   Output_section* section;
    983   elfcpp::STT type = elfcpp::STT_NOTYPE;
    984   elfcpp::STV vis = elfcpp::STV_DEFAULT;
    985   unsigned char nonvis = 0;
    986   uint64_t final_val = this->val_->eval_maybe_dot(symtab, layout, true,
    987 						  is_dot_available,
    988 						  dot_value, dot_section,
    989 						  &section, NULL, &type,
    990 						  &vis, &nonvis, false);
    991   Sized_symbol<size>* ssym = symtab->get_sized_symbol<size>(this->sym_);
    992   ssym->set_value(final_val);
    993   ssym->set_type(type);
    994   ssym->set_visibility(vis);
    995   ssym->set_nonvis(nonvis);
    996   if (section != NULL)
    997     ssym->set_output_section(section);
    998 }
    999 
   1000 // Set the symbol value if the expression yields an absolute value or
   1001 // a value relative to DOT_SECTION.
   1002 
   1003 void
   1004 Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
   1005 				   bool is_dot_available, uint64_t dot_value,
   1006 				   Output_section* dot_section)
   1007 {
   1008   if (this->sym_ == NULL)
   1009     return;
   1010 
   1011   Output_section* val_section;
   1012   uint64_t val = this->val_->eval_maybe_dot(symtab, layout, false,
   1013 					    is_dot_available, dot_value,
   1014 					    dot_section, &val_section, NULL,
   1015 					    NULL, NULL, NULL, false);
   1016   if (val_section != NULL && val_section != dot_section)
   1017     return;
   1018 
   1019   if (parameters->target().get_size() == 32)
   1020     {
   1021 #if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
   1022       Sized_symbol<32>* ssym = symtab->get_sized_symbol<32>(this->sym_);
   1023       ssym->set_value(val);
   1024 #else
   1025       gold_unreachable();
   1026 #endif
   1027     }
   1028   else if (parameters->target().get_size() == 64)
   1029     {
   1030 #if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
   1031       Sized_symbol<64>* ssym = symtab->get_sized_symbol<64>(this->sym_);
   1032       ssym->set_value(val);
   1033 #else
   1034       gold_unreachable();
   1035 #endif
   1036     }
   1037   else
   1038     gold_unreachable();
   1039   if (val_section != NULL)
   1040     this->sym_->set_output_section(val_section);
   1041 }
   1042 
   1043 // Print for debugging.
   1044 
   1045 void
   1046 Symbol_assignment::print(FILE* f) const
   1047 {
   1048   if (this->provide_ && this->hidden_)
   1049     fprintf(f, "PROVIDE_HIDDEN(");
   1050   else if (this->provide_)
   1051     fprintf(f, "PROVIDE(");
   1052   else if (this->hidden_)
   1053     gold_unreachable();
   1054 
   1055   fprintf(f, "%s = ", this->name_.c_str());
   1056   this->val_->print(f);
   1057 
   1058   if (this->provide_ || this->hidden_)
   1059     fprintf(f, ")");
   1060 
   1061   fprintf(f, "\n");
   1062 }
   1063 
   1064 // Class Script_assertion.
   1065 
   1066 // Check the assertion.
   1067 
   1068 void
   1069 Script_assertion::check(const Symbol_table* symtab, const Layout* layout)
   1070 {
   1071   if (!this->check_->eval(symtab, layout, true))
   1072     gold_error("%s", this->message_.c_str());
   1073 }
   1074 
   1075 // Print for debugging.
   1076 
   1077 void
   1078 Script_assertion::print(FILE* f) const
   1079 {
   1080   fprintf(f, "ASSERT(");
   1081   this->check_->print(f);
   1082   fprintf(f, ", \"%s\")\n", this->message_.c_str());
   1083 }
   1084 
   1085 // Class Script_options.
   1086 
   1087 Script_options::Script_options()
   1088   : entry_(), symbol_assignments_(), symbol_definitions_(),
   1089     symbol_references_(), version_script_info_(), script_sections_()
   1090 {
   1091 }
   1092 
   1093 // Returns true if NAME is on the list of symbol assignments waiting
   1094 // to be processed.
   1095 
   1096 bool
   1097 Script_options::is_pending_assignment(const char* name)
   1098 {
   1099   for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
   1100        p != this->symbol_assignments_.end();
   1101        ++p)
   1102     if ((*p)->name() == name)
   1103       return true;
   1104   return false;
   1105 }
   1106 
   1107 // Add a symbol to be defined.
   1108 
   1109 void
   1110 Script_options::add_symbol_assignment(const char* name, size_t length,
   1111 				      bool is_defsym, Expression* value,
   1112 				      bool provide, bool hidden)
   1113 {
   1114   if (length != 1 || name[0] != '.')
   1115     {
   1116       if (this->script_sections_.in_sections_clause())
   1117 	{
   1118 	  gold_assert(!is_defsym);
   1119 	  this->script_sections_.add_symbol_assignment(name, length, value,
   1120 						       provide, hidden);
   1121 	}
   1122       else
   1123 	{
   1124 	  Symbol_assignment* p = new Symbol_assignment(name, length, is_defsym,
   1125 						       value, provide, hidden);
   1126 	  this->symbol_assignments_.push_back(p);
   1127 	}
   1128 
   1129       if (!provide)
   1130 	{
   1131 	  std::string n(name, length);
   1132 	  this->symbol_definitions_.insert(n);
   1133 	  this->symbol_references_.erase(n);
   1134 	}
   1135     }
   1136   else
   1137     {
   1138       if (provide || hidden)
   1139 	gold_error(_("invalid use of PROVIDE for dot symbol"));
   1140 
   1141       // The GNU linker permits assignments to dot outside of SECTIONS
   1142       // clauses and treats them as occurring inside, so we don't
   1143       // check in_sections_clause here.
   1144       this->script_sections_.add_dot_assignment(value);
   1145     }
   1146 }
   1147 
   1148 // Add a reference to a symbol.
   1149 
   1150 void
   1151 Script_options::add_symbol_reference(const char* name, size_t length)
   1152 {
   1153   if (length != 1 || name[0] != '.')
   1154     {
   1155       std::string n(name, length);
   1156       if (this->symbol_definitions_.find(n) == this->symbol_definitions_.end())
   1157 	this->symbol_references_.insert(n);
   1158     }
   1159 }
   1160 
   1161 // Add an assertion.
   1162 
   1163 void
   1164 Script_options::add_assertion(Expression* check, const char* message,
   1165 			      size_t messagelen)
   1166 {
   1167   if (this->script_sections_.in_sections_clause())
   1168     this->script_sections_.add_assertion(check, message, messagelen);
   1169   else
   1170     {
   1171       Script_assertion* p = new Script_assertion(check, message, messagelen);
   1172       this->assertions_.push_back(p);
   1173     }
   1174 }
   1175 
   1176 // Create sections required by any linker scripts.
   1177 
   1178 void
   1179 Script_options::create_script_sections(Layout* layout)
   1180 {
   1181   if (this->saw_sections_clause())
   1182     this->script_sections_.create_sections(layout);
   1183 }
   1184 
   1185 // Add any symbols we are defining to the symbol table.
   1186 
   1187 void
   1188 Script_options::add_symbols_to_table(Symbol_table* symtab)
   1189 {
   1190   for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
   1191        p != this->symbol_assignments_.end();
   1192        ++p)
   1193     (*p)->add_to_table(symtab);
   1194   this->script_sections_.add_symbols_to_table(symtab);
   1195 }
   1196 
   1197 // Finalize symbol values.  Also check assertions.
   1198 
   1199 void
   1200 Script_options::finalize_symbols(Symbol_table* symtab, const Layout* layout)
   1201 {
   1202   // We finalize the symbols defined in SECTIONS first, because they
   1203   // are the ones which may have changed.  This way if symbol outside
   1204   // SECTIONS are defined in terms of symbols inside SECTIONS, they
   1205   // will get the right value.
   1206   this->script_sections_.finalize_symbols(symtab, layout);
   1207 
   1208   for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
   1209        p != this->symbol_assignments_.end();
   1210        ++p)
   1211     (*p)->finalize(symtab, layout);
   1212 
   1213   for (Assertions::iterator p = this->assertions_.begin();
   1214        p != this->assertions_.end();
   1215        ++p)
   1216     (*p)->check(symtab, layout);
   1217 }
   1218 
   1219 // Set section addresses.  We set all the symbols which have absolute
   1220 // values.  Then we let the SECTIONS clause do its thing.  This
   1221 // returns the segment which holds the file header and segment
   1222 // headers, if any.
   1223 
   1224 Output_segment*
   1225 Script_options::set_section_addresses(Symbol_table* symtab, Layout* layout)
   1226 {
   1227   for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
   1228        p != this->symbol_assignments_.end();
   1229        ++p)
   1230     (*p)->set_if_absolute(symtab, layout, false, 0, NULL);
   1231 
   1232   return this->script_sections_.set_section_addresses(symtab, layout);
   1233 }
   1234 
   1235 // This class holds data passed through the parser to the lexer and to
   1236 // the parser support functions.  This avoids global variables.  We
   1237 // can't use global variables because we need not be called by a
   1238 // singleton thread.
   1239 
   1240 class Parser_closure
   1241 {
   1242  public:
   1243   Parser_closure(const char* filename,
   1244 		 const Position_dependent_options& posdep_options,
   1245 		 bool parsing_defsym, bool in_group, bool is_in_sysroot,
   1246                  Command_line* command_line,
   1247 		 Script_options* script_options,
   1248 		 Lex* lex,
   1249 		 bool skip_on_incompatible_target,
   1250 		 Script_info* script_info)
   1251     : filename_(filename), posdep_options_(posdep_options),
   1252       parsing_defsym_(parsing_defsym), in_group_(in_group),
   1253       is_in_sysroot_(is_in_sysroot),
   1254       skip_on_incompatible_target_(skip_on_incompatible_target),
   1255       found_incompatible_target_(false),
   1256       command_line_(command_line), script_options_(script_options),
   1257       version_script_info_(script_options->version_script_info()),
   1258       lex_(lex), lineno_(0), charpos_(0), lex_mode_stack_(), inputs_(NULL),
   1259       script_info_(script_info)
   1260   {
   1261     // We start out processing C symbols in the default lex mode.
   1262     this->language_stack_.push_back(Version_script_info::LANGUAGE_C);
   1263     this->lex_mode_stack_.push_back(lex->mode());
   1264   }
   1265 
   1266   // Return the file name.
   1267   const char*
   1268   filename() const
   1269   { return this->filename_; }
   1270 
   1271   // Return the position dependent options.  The caller may modify
   1272   // this.
   1273   Position_dependent_options&
   1274   position_dependent_options()
   1275   { return this->posdep_options_; }
   1276 
   1277   // Whether we are parsing a --defsym.
   1278   bool
   1279   parsing_defsym() const
   1280   { return this->parsing_defsym_; }
   1281 
   1282   // Return whether this script is being run in a group.
   1283   bool
   1284   in_group() const
   1285   { return this->in_group_; }
   1286 
   1287   // Return whether this script was found using a directory in the
   1288   // sysroot.
   1289   bool
   1290   is_in_sysroot() const
   1291   { return this->is_in_sysroot_; }
   1292 
   1293   // Whether to skip to the next file with the same name if we find an
   1294   // incompatible target in an OUTPUT_FORMAT statement.
   1295   bool
   1296   skip_on_incompatible_target() const
   1297   { return this->skip_on_incompatible_target_; }
   1298 
   1299   // Stop skipping to the next file on an incompatible target.  This
   1300   // is called when we make some unrevocable change to the data
   1301   // structures.
   1302   void
   1303   clear_skip_on_incompatible_target()
   1304   { this->skip_on_incompatible_target_ = false; }
   1305 
   1306   // Whether we found an incompatible target in an OUTPUT_FORMAT
   1307   // statement.
   1308   bool
   1309   found_incompatible_target() const
   1310   { return this->found_incompatible_target_; }
   1311 
   1312   // Note that we found an incompatible target.
   1313   void
   1314   set_found_incompatible_target()
   1315   { this->found_incompatible_target_ = true; }
   1316 
   1317   // Returns the Command_line structure passed in at constructor time.
   1318   // This value may be NULL.  The caller may modify this, which modifies
   1319   // the passed-in Command_line object (not a copy).
   1320   Command_line*
   1321   command_line()
   1322   { return this->command_line_; }
   1323 
   1324   // Return the options which may be set by a script.
   1325   Script_options*
   1326   script_options()
   1327   { return this->script_options_; }
   1328 
   1329   // Return the object in which version script information should be stored.
   1330   Version_script_info*
   1331   version_script()
   1332   { return this->version_script_info_; }
   1333 
   1334   // Return the next token, and advance.
   1335   const Token*
   1336   next_token()
   1337   {
   1338     const Token* token = this->lex_->next_token();
   1339     this->lineno_ = token->lineno();
   1340     this->charpos_ = token->charpos();
   1341     return token;
   1342   }
   1343 
   1344   // Set a new lexer mode, pushing the current one.
   1345   void
   1346   push_lex_mode(Lex::Mode mode)
   1347   {
   1348     this->lex_mode_stack_.push_back(this->lex_->mode());
   1349     this->lex_->set_mode(mode);
   1350   }
   1351 
   1352   // Pop the lexer mode.
   1353   void
   1354   pop_lex_mode()
   1355   {
   1356     gold_assert(!this->lex_mode_stack_.empty());
   1357     this->lex_->set_mode(this->lex_mode_stack_.back());
   1358     this->lex_mode_stack_.pop_back();
   1359   }
   1360 
   1361   // Return the current lexer mode.
   1362   Lex::Mode
   1363   lex_mode() const
   1364   { return this->lex_mode_stack_.back(); }
   1365 
   1366   // Return the line number of the last token.
   1367   int
   1368   lineno() const
   1369   { return this->lineno_; }
   1370 
   1371   // Return the character position in the line of the last token.
   1372   int
   1373   charpos() const
   1374   { return this->charpos_; }
   1375 
   1376   // Return the list of input files, creating it if necessary.  This
   1377   // is a space leak--we never free the INPUTS_ pointer.
   1378   Input_arguments*
   1379   inputs()
   1380   {
   1381     if (this->inputs_ == NULL)
   1382       this->inputs_ = new Input_arguments();
   1383     return this->inputs_;
   1384   }
   1385 
   1386   // Return whether we saw any input files.
   1387   bool
   1388   saw_inputs() const
   1389   { return this->inputs_ != NULL && !this->inputs_->empty(); }
   1390 
   1391   // Return the current language being processed in a version script
   1392   // (eg, "C++").  The empty string represents unmangled C names.
   1393   Version_script_info::Language
   1394   get_current_language() const
   1395   { return this->language_stack_.back(); }
   1396 
   1397   // Push a language onto the stack when entering an extern block.
   1398   void
   1399   push_language(Version_script_info::Language lang)
   1400   { this->language_stack_.push_back(lang); }
   1401 
   1402   // Pop a language off of the stack when exiting an extern block.
   1403   void
   1404   pop_language()
   1405   {
   1406     gold_assert(!this->language_stack_.empty());
   1407     this->language_stack_.pop_back();
   1408   }
   1409 
   1410   // Return a pointer to the incremental info.
   1411   Script_info*
   1412   script_info()
   1413   { return this->script_info_; }
   1414 
   1415  private:
   1416   // The name of the file we are reading.
   1417   const char* filename_;
   1418   // The position dependent options.
   1419   Position_dependent_options posdep_options_;
   1420   // True if we are parsing a --defsym.
   1421   bool parsing_defsym_;
   1422   // Whether we are currently in a --start-group/--end-group.
   1423   bool in_group_;
   1424   // Whether the script was found in a sysrooted directory.
   1425   bool is_in_sysroot_;
   1426   // If this is true, then if we find an OUTPUT_FORMAT with an
   1427   // incompatible target, then we tell the parser to abort so that we
   1428   // can search for the next file with the same name.
   1429   bool skip_on_incompatible_target_;
   1430   // True if we found an OUTPUT_FORMAT with an incompatible target.
   1431   bool found_incompatible_target_;
   1432   // May be NULL if the user chooses not to pass one in.
   1433   Command_line* command_line_;
   1434   // Options which may be set from any linker script.
   1435   Script_options* script_options_;
   1436   // Information parsed from a version script.
   1437   Version_script_info* version_script_info_;
   1438   // The lexer.
   1439   Lex* lex_;
   1440   // The line number of the last token returned by next_token.
   1441   int lineno_;
   1442   // The column number of the last token returned by next_token.
   1443   int charpos_;
   1444   // A stack of lexer modes.
   1445   std::vector<Lex::Mode> lex_mode_stack_;
   1446   // A stack of which extern/language block we're inside. Can be C++,
   1447   // java, or empty for C.
   1448   std::vector<Version_script_info::Language> language_stack_;
   1449   // New input files found to add to the link.
   1450   Input_arguments* inputs_;
   1451   // Pointer to incremental linking info.
   1452   Script_info* script_info_;
   1453 };
   1454 
   1455 // FILE was found as an argument on the command line.  Try to read it
   1456 // as a script.  Return true if the file was handled.
   1457 
   1458 bool
   1459 read_input_script(Workqueue* workqueue, Symbol_table* symtab, Layout* layout,
   1460 		  Dirsearch* dirsearch, int dirindex,
   1461 		  Input_objects* input_objects, Mapfile* mapfile,
   1462 		  Input_group* input_group,
   1463 		  const Input_argument* input_argument,
   1464 		  Input_file* input_file, Task_token* next_blocker,
   1465 		  bool* used_next_blocker)
   1466 {
   1467   *used_next_blocker = false;
   1468 
   1469   std::string input_string;
   1470   Lex::read_file(input_file, &input_string);
   1471 
   1472   Lex lex(input_string.c_str(), input_string.length(), PARSING_LINKER_SCRIPT);
   1473 
   1474   Script_info* script_info = NULL;
   1475   if (layout->incremental_inputs() != NULL)
   1476     {
   1477       const std::string& filename = input_file->filename();
   1478       Timespec mtime = input_file->file().get_mtime();
   1479       unsigned int arg_serial = input_argument->file().arg_serial();
   1480       script_info = new Script_info(filename);
   1481       layout->incremental_inputs()->report_script(script_info, arg_serial,
   1482 						  mtime);
   1483     }
   1484 
   1485   Parser_closure closure(input_file->filename().c_str(),
   1486 			 input_argument->file().options(),
   1487 			 false,
   1488 			 input_group != NULL,
   1489 			 input_file->is_in_sysroot(),
   1490                          NULL,
   1491 			 layout->script_options(),
   1492 			 &lex,
   1493 			 input_file->will_search_for(),
   1494 			 script_info);
   1495 
   1496   bool old_saw_sections_clause =
   1497     layout->script_options()->saw_sections_clause();
   1498 
   1499   if (yyparse(&closure) != 0)
   1500     {
   1501       if (closure.found_incompatible_target())
   1502 	{
   1503 	  Read_symbols::incompatible_warning(input_argument, input_file);
   1504 	  Read_symbols::requeue(workqueue, input_objects, symtab, layout,
   1505 				dirsearch, dirindex, mapfile, input_argument,
   1506 				input_group, next_blocker);
   1507 	  return true;
   1508 	}
   1509       return false;
   1510     }
   1511 
   1512   if (!old_saw_sections_clause
   1513       && layout->script_options()->saw_sections_clause()
   1514       && layout->have_added_input_section())
   1515     gold_error(_("%s: SECTIONS seen after other input files; try -T/--script"),
   1516 	       input_file->filename().c_str());
   1517 
   1518   if (!closure.saw_inputs())
   1519     return true;
   1520 
   1521   Task_token* this_blocker = NULL;
   1522   for (Input_arguments::const_iterator p = closure.inputs()->begin();
   1523        p != closure.inputs()->end();
   1524        ++p)
   1525     {
   1526       Task_token* nb;
   1527       if (p + 1 == closure.inputs()->end())
   1528 	nb = next_blocker;
   1529       else
   1530 	{
   1531 	  nb = new Task_token(true);
   1532 	  nb->add_blocker();
   1533 	}
   1534       workqueue->queue_soon(new Read_symbols(input_objects, symtab,
   1535 					     layout, dirsearch, 0, mapfile, &*p,
   1536 					     input_group, NULL, this_blocker, nb));
   1537       this_blocker = nb;
   1538     }
   1539 
   1540   *used_next_blocker = true;
   1541 
   1542   return true;
   1543 }
   1544 
   1545 // Helper function for read_version_script(), read_commandline_script() and
   1546 // script_include_directive().  Processes the given file in the mode indicated
   1547 // by first_token and lex_mode.
   1548 
   1549 static bool
   1550 read_script_file(const char* filename, Command_line* cmdline,
   1551                  Script_options* script_options,
   1552                  int first_token, Lex::Mode lex_mode)
   1553 {
   1554   Dirsearch dirsearch;
   1555   std::string name = filename;
   1556 
   1557   // If filename is a relative filename, search for it manually using "." +
   1558   // cmdline->options()->library_path() -- not dirsearch.
   1559   if (!IS_ABSOLUTE_PATH(filename))
   1560     {
   1561       const General_options::Dir_list& search_path =
   1562           cmdline->options().library_path();
   1563       name = Dirsearch::find_file_in_dir_list(name, search_path, ".");
   1564     }
   1565 
   1566   // The file locking code wants to record a Task, but we haven't
   1567   // started the workqueue yet.  This is only for debugging purposes,
   1568   // so we invent a fake value.
   1569   const Task* task = reinterpret_cast<const Task*>(-1);
   1570 
   1571   // We don't want this file to be opened in binary mode.
   1572   Position_dependent_options posdep = cmdline->position_dependent_options();
   1573   if (posdep.format_enum() == General_options::OBJECT_FORMAT_BINARY)
   1574     posdep.set_format_enum(General_options::OBJECT_FORMAT_ELF);
   1575   Input_file_argument input_argument(name.c_str(),
   1576 				     Input_file_argument::INPUT_FILE_TYPE_FILE,
   1577 				     "", false, posdep);
   1578   Input_file input_file(&input_argument);
   1579   int dummy = 0;
   1580   if (!input_file.open(dirsearch, task, &dummy))
   1581     return false;
   1582 
   1583   std::string input_string;
   1584   Lex::read_file(&input_file, &input_string);
   1585 
   1586   Lex lex(input_string.c_str(), input_string.length(), first_token);
   1587   lex.set_mode(lex_mode);
   1588 
   1589   Parser_closure closure(filename,
   1590 			 cmdline->position_dependent_options(),
   1591 			 first_token == Lex::DYNAMIC_LIST,
   1592 			 false,
   1593 			 input_file.is_in_sysroot(),
   1594                          cmdline,
   1595 			 script_options,
   1596 			 &lex,
   1597 			 false,
   1598 			 NULL);
   1599   if (yyparse(&closure) != 0)
   1600     {
   1601       input_file.file().unlock(task);
   1602       return false;
   1603     }
   1604 
   1605   input_file.file().unlock(task);
   1606 
   1607   gold_assert(!closure.saw_inputs());
   1608 
   1609   return true;
   1610 }
   1611 
   1612 // FILENAME was found as an argument to --script (-T).
   1613 // Read it as a script, and execute its contents immediately.
   1614 
   1615 bool
   1616 read_commandline_script(const char* filename, Command_line* cmdline)
   1617 {
   1618   return read_script_file(filename, cmdline, &cmdline->script_options(),
   1619                           PARSING_LINKER_SCRIPT, Lex::LINKER_SCRIPT);
   1620 }
   1621 
   1622 // FILENAME was found as an argument to --version-script.  Read it as
   1623 // a version script, and store its contents in
   1624 // cmdline->script_options()->version_script_info().
   1625 
   1626 bool
   1627 read_version_script(const char* filename, Command_line* cmdline)
   1628 {
   1629   return read_script_file(filename, cmdline, &cmdline->script_options(),
   1630                           PARSING_VERSION_SCRIPT, Lex::VERSION_SCRIPT);
   1631 }
   1632 
   1633 // FILENAME was found as an argument to --dynamic-list.  Read it as a
   1634 // list of symbols, and store its contents in DYNAMIC_LIST.
   1635 
   1636 bool
   1637 read_dynamic_list(const char* filename, Command_line* cmdline,
   1638                   Script_options* dynamic_list)
   1639 {
   1640   return read_script_file(filename, cmdline, dynamic_list,
   1641                           PARSING_DYNAMIC_LIST, Lex::DYNAMIC_LIST);
   1642 }
   1643 
   1644 // Implement the --defsym option on the command line.  Return true if
   1645 // all is well.
   1646 
   1647 bool
   1648 Script_options::define_symbol(const char* definition)
   1649 {
   1650   Lex lex(definition, strlen(definition), PARSING_DEFSYM);
   1651   lex.set_mode(Lex::EXPRESSION);
   1652 
   1653   // Dummy value.
   1654   Position_dependent_options posdep_options;
   1655 
   1656   Parser_closure closure("command line", posdep_options, true,
   1657 			 false, false, NULL, this, &lex, false, NULL);
   1658 
   1659   if (yyparse(&closure) != 0)
   1660     return false;
   1661 
   1662   gold_assert(!closure.saw_inputs());
   1663 
   1664   return true;
   1665 }
   1666 
   1667 // Print the script to F for debugging.
   1668 
   1669 void
   1670 Script_options::print(FILE* f) const
   1671 {
   1672   fprintf(f, "%s: Dumping linker script\n", program_name);
   1673 
   1674   if (!this->entry_.empty())
   1675     fprintf(f, "ENTRY(%s)\n", this->entry_.c_str());
   1676 
   1677   for (Symbol_assignments::const_iterator p =
   1678 	 this->symbol_assignments_.begin();
   1679        p != this->symbol_assignments_.end();
   1680        ++p)
   1681     (*p)->print(f);
   1682 
   1683   for (Assertions::const_iterator p = this->assertions_.begin();
   1684        p != this->assertions_.end();
   1685        ++p)
   1686     (*p)->print(f);
   1687 
   1688   this->script_sections_.print(f);
   1689 
   1690   this->version_script_info_.print(f);
   1691 }
   1692 
   1693 // Manage mapping from keywords to the codes expected by the bison
   1694 // parser.  We construct one global object for each lex mode with
   1695 // keywords.
   1696 
   1697 class Keyword_to_parsecode
   1698 {
   1699  public:
   1700   // The structure which maps keywords to parsecodes.
   1701   struct Keyword_parsecode
   1702   {
   1703     // Keyword.
   1704     const char* keyword;
   1705     // Corresponding parsecode.
   1706     int parsecode;
   1707   };
   1708 
   1709   Keyword_to_parsecode(const Keyword_parsecode* keywords,
   1710                        int keyword_count)
   1711       : keyword_parsecodes_(keywords), keyword_count_(keyword_count)
   1712   { }
   1713 
   1714   // Return the parsecode corresponding KEYWORD, or 0 if it is not a
   1715   // keyword.
   1716   int
   1717   keyword_to_parsecode(const char* keyword, size_t len) const;
   1718 
   1719  private:
   1720   const Keyword_parsecode* keyword_parsecodes_;
   1721   const int keyword_count_;
   1722 };
   1723 
   1724 // Mapping from keyword string to keyword parsecode.  This array must
   1725 // be kept in sorted order.  Parsecodes are looked up using bsearch.
   1726 // This array must correspond to the list of parsecodes in yyscript.y.
   1727 
   1728 static const Keyword_to_parsecode::Keyword_parsecode
   1729 script_keyword_parsecodes[] =
   1730 {
   1731   { "ABSOLUTE", ABSOLUTE },
   1732   { "ADDR", ADDR },
   1733   { "ALIGN", ALIGN_K },
   1734   { "ALIGNOF", ALIGNOF },
   1735   { "ASSERT", ASSERT_K },
   1736   { "AS_NEEDED", AS_NEEDED },
   1737   { "AT", AT },
   1738   { "BIND", BIND },
   1739   { "BLOCK", BLOCK },
   1740   { "BYTE", BYTE },
   1741   { "CONSTANT", CONSTANT },
   1742   { "CONSTRUCTORS", CONSTRUCTORS },
   1743   { "COPY", COPY },
   1744   { "CREATE_OBJECT_SYMBOLS", CREATE_OBJECT_SYMBOLS },
   1745   { "DATA_SEGMENT_ALIGN", DATA_SEGMENT_ALIGN },
   1746   { "DATA_SEGMENT_END", DATA_SEGMENT_END },
   1747   { "DATA_SEGMENT_RELRO_END", DATA_SEGMENT_RELRO_END },
   1748   { "DEFINED", DEFINED },
   1749   { "DSECT", DSECT },
   1750   { "ENTRY", ENTRY },
   1751   { "EXCLUDE_FILE", EXCLUDE_FILE },
   1752   { "EXTERN", EXTERN },
   1753   { "FILL", FILL },
   1754   { "FLOAT", FLOAT },
   1755   { "FORCE_COMMON_ALLOCATION", FORCE_COMMON_ALLOCATION },
   1756   { "GROUP", GROUP },
   1757   { "HLL", HLL },
   1758   { "INCLUDE", INCLUDE },
   1759   { "INFO", INFO },
   1760   { "INHIBIT_COMMON_ALLOCATION", INHIBIT_COMMON_ALLOCATION },
   1761   { "INPUT", INPUT },
   1762   { "KEEP", KEEP },
   1763   { "LENGTH", LENGTH },
   1764   { "LOADADDR", LOADADDR },
   1765   { "LONG", LONG },
   1766   { "MAP", MAP },
   1767   { "MAX", MAX_K },
   1768   { "MEMORY", MEMORY },
   1769   { "MIN", MIN_K },
   1770   { "NEXT", NEXT },
   1771   { "NOCROSSREFS", NOCROSSREFS },
   1772   { "NOFLOAT", NOFLOAT },
   1773   { "NOLOAD", NOLOAD },
   1774   { "ONLY_IF_RO", ONLY_IF_RO },
   1775   { "ONLY_IF_RW", ONLY_IF_RW },
   1776   { "OPTION", OPTION },
   1777   { "ORIGIN", ORIGIN },
   1778   { "OUTPUT", OUTPUT },
   1779   { "OUTPUT_ARCH", OUTPUT_ARCH },
   1780   { "OUTPUT_FORMAT", OUTPUT_FORMAT },
   1781   { "OVERLAY", OVERLAY },
   1782   { "PHDRS", PHDRS },
   1783   { "PROVIDE", PROVIDE },
   1784   { "PROVIDE_HIDDEN", PROVIDE_HIDDEN },
   1785   { "QUAD", QUAD },
   1786   { "SEARCH_DIR", SEARCH_DIR },
   1787   { "SECTIONS", SECTIONS },
   1788   { "SEGMENT_START", SEGMENT_START },
   1789   { "SHORT", SHORT },
   1790   { "SIZEOF", SIZEOF },
   1791   { "SIZEOF_HEADERS", SIZEOF_HEADERS },
   1792   { "SORT", SORT_BY_NAME },
   1793   { "SORT_BY_ALIGNMENT", SORT_BY_ALIGNMENT },
   1794   { "SORT_BY_NAME", SORT_BY_NAME },
   1795   { "SPECIAL", SPECIAL },
   1796   { "SQUAD", SQUAD },
   1797   { "STARTUP", STARTUP },
   1798   { "SUBALIGN", SUBALIGN },
   1799   { "SYSLIB", SYSLIB },
   1800   { "TARGET", TARGET_K },
   1801   { "TRUNCATE", TRUNCATE },
   1802   { "VERSION", VERSIONK },
   1803   { "global", GLOBAL },
   1804   { "l", LENGTH },
   1805   { "len", LENGTH },
   1806   { "local", LOCAL },
   1807   { "o", ORIGIN },
   1808   { "org", ORIGIN },
   1809   { "sizeof_headers", SIZEOF_HEADERS },
   1810 };
   1811 
   1812 static const Keyword_to_parsecode
   1813 script_keywords(&script_keyword_parsecodes[0],
   1814                 (sizeof(script_keyword_parsecodes)
   1815                  / sizeof(script_keyword_parsecodes[0])));
   1816 
   1817 static const Keyword_to_parsecode::Keyword_parsecode
   1818 version_script_keyword_parsecodes[] =
   1819 {
   1820   { "extern", EXTERN },
   1821   { "global", GLOBAL },
   1822   { "local", LOCAL },
   1823 };
   1824 
   1825 static const Keyword_to_parsecode
   1826 version_script_keywords(&version_script_keyword_parsecodes[0],
   1827                         (sizeof(version_script_keyword_parsecodes)
   1828                          / sizeof(version_script_keyword_parsecodes[0])));
   1829 
   1830 static const Keyword_to_parsecode::Keyword_parsecode
   1831 dynamic_list_keyword_parsecodes[] =
   1832 {
   1833   { "extern", EXTERN },
   1834 };
   1835 
   1836 static const Keyword_to_parsecode
   1837 dynamic_list_keywords(&dynamic_list_keyword_parsecodes[0],
   1838                       (sizeof(dynamic_list_keyword_parsecodes)
   1839                        / sizeof(dynamic_list_keyword_parsecodes[0])));
   1840 
   1841 
   1842 
   1843 // Comparison function passed to bsearch.
   1844 
   1845 extern "C"
   1846 {
   1847 
   1848 struct Ktt_key
   1849 {
   1850   const char* str;
   1851   size_t len;
   1852 };
   1853 
   1854 static int
   1855 ktt_compare(const void* keyv, const void* kttv)
   1856 {
   1857   const Ktt_key* key = static_cast<const Ktt_key*>(keyv);
   1858   const Keyword_to_parsecode::Keyword_parsecode* ktt =
   1859     static_cast<const Keyword_to_parsecode::Keyword_parsecode*>(kttv);
   1860   int i = strncmp(key->str, ktt->keyword, key->len);
   1861   if (i != 0)
   1862     return i;
   1863   if (ktt->keyword[key->len] != '\0')
   1864     return -1;
   1865   return 0;
   1866 }
   1867 
   1868 } // End extern "C".
   1869 
   1870 int
   1871 Keyword_to_parsecode::keyword_to_parsecode(const char* keyword,
   1872                                            size_t len) const
   1873 {
   1874   Ktt_key key;
   1875   key.str = keyword;
   1876   key.len = len;
   1877   void* kttv = bsearch(&key,
   1878                        this->keyword_parsecodes_,
   1879                        this->keyword_count_,
   1880                        sizeof(this->keyword_parsecodes_[0]),
   1881                        ktt_compare);
   1882   if (kttv == NULL)
   1883     return 0;
   1884   Keyword_parsecode* ktt = static_cast<Keyword_parsecode*>(kttv);
   1885   return ktt->parsecode;
   1886 }
   1887 
   1888 // The following structs are used within the VersionInfo class as well
   1889 // as in the bison helper functions.  They store the information
   1890 // parsed from the version script.
   1891 
   1892 // A single version expression.
   1893 // For example, pattern="std::map*" and language="C++".
   1894 struct Version_expression
   1895 {
   1896   Version_expression(const std::string& a_pattern,
   1897 		     Version_script_info::Language a_language,
   1898                      bool a_exact_match)
   1899     : pattern(a_pattern), language(a_language), exact_match(a_exact_match),
   1900       was_matched_by_symbol(false)
   1901   { }
   1902 
   1903   std::string pattern;
   1904   Version_script_info::Language language;
   1905   // If false, we use glob() to match pattern.  If true, we use strcmp().
   1906   bool exact_match;
   1907   // True if --no-undefined-version is in effect and we found this
   1908   // version in get_symbol_version.  We use mutable because this
   1909   // struct is generally not modifiable after it has been created.
   1910   mutable bool was_matched_by_symbol;
   1911 };
   1912 
   1913 // A list of expressions.
   1914 struct Version_expression_list
   1915 {
   1916   std::vector<struct Version_expression> expressions;
   1917 };
   1918 
   1919 // A list of which versions upon which another version depends.
   1920 // Strings should be from the Stringpool.
   1921 struct Version_dependency_list
   1922 {
   1923   std::vector<std::string> dependencies;
   1924 };
   1925 
   1926 // The total definition of a version.  It includes the tag for the
   1927 // version, its global and local expressions, and any dependencies.
   1928 struct Version_tree
   1929 {
   1930   Version_tree()
   1931       : tag(), global(NULL), local(NULL), dependencies(NULL)
   1932   { }
   1933 
   1934   std::string tag;
   1935   const struct Version_expression_list* global;
   1936   const struct Version_expression_list* local;
   1937   const struct Version_dependency_list* dependencies;
   1938 };
   1939 
   1940 // Helper class that calls cplus_demangle when needed and takes care of freeing
   1941 // the result.
   1942 
   1943 class Lazy_demangler
   1944 {
   1945  public:
   1946   Lazy_demangler(const char* symbol, int options)
   1947     : symbol_(symbol), options_(options), demangled_(NULL), did_demangle_(false)
   1948   { }
   1949 
   1950   ~Lazy_demangler()
   1951   { free(this->demangled_); }
   1952 
   1953   // Return the demangled name. The actual demangling happens on the first call,
   1954   // and the result is later cached.
   1955   inline char*
   1956   get();
   1957 
   1958  private:
   1959   // The symbol to demangle.
   1960   const char* symbol_;
   1961   // Option flags to pass to cplus_demagle.
   1962   const int options_;
   1963   // The cached demangled value, or NULL if demangling didn't happen yet or
   1964   // failed.
   1965   char* demangled_;
   1966   // Whether we already called cplus_demangle
   1967   bool did_demangle_;
   1968 };
   1969 
   1970 // Return the demangled name. The actual demangling happens on the first call,
   1971 // and the result is later cached. Returns NULL if the symbol cannot be
   1972 // demangled.
   1973 
   1974 inline char*
   1975 Lazy_demangler::get()
   1976 {
   1977   if (!this->did_demangle_)
   1978     {
   1979       this->demangled_ = cplus_demangle(this->symbol_, this->options_);
   1980       this->did_demangle_ = true;
   1981     }
   1982   return this->demangled_;
   1983 }
   1984 
   1985 // Class Version_script_info.
   1986 
   1987 Version_script_info::Version_script_info()
   1988   : dependency_lists_(), expression_lists_(), version_trees_(), globs_(),
   1989     default_version_(NULL), default_is_global_(false), is_finalized_(false)
   1990 {
   1991   for (int i = 0; i < LANGUAGE_COUNT; ++i)
   1992     this->exact_[i] = NULL;
   1993 }
   1994 
   1995 Version_script_info::~Version_script_info()
   1996 {
   1997 }
   1998 
   1999 // Forget all the known version script information.
   2000 
   2001 void
   2002 Version_script_info::clear()
   2003 {
   2004   for (size_t k = 0; k < this->dependency_lists_.size(); ++k)
   2005     delete this->dependency_lists_[k];
   2006   this->dependency_lists_.clear();
   2007   for (size_t k = 0; k < this->version_trees_.size(); ++k)
   2008     delete this->version_trees_[k];
   2009   this->version_trees_.clear();
   2010   for (size_t k = 0; k < this->expression_lists_.size(); ++k)
   2011     delete this->expression_lists_[k];
   2012   this->expression_lists_.clear();
   2013 }
   2014 
   2015 // Finalize the version script information.
   2016 
   2017 void
   2018 Version_script_info::finalize()
   2019 {
   2020   if (!this->is_finalized_)
   2021     {
   2022       this->build_lookup_tables();
   2023       this->is_finalized_ = true;
   2024     }
   2025 }
   2026 
   2027 // Return all the versions.
   2028 
   2029 std::vector<std::string>
   2030 Version_script_info::get_versions() const
   2031 {
   2032   std::vector<std::string> ret;
   2033   for (size_t j = 0; j < this->version_trees_.size(); ++j)
   2034     if (!this->version_trees_[j]->tag.empty())
   2035       ret.push_back(this->version_trees_[j]->tag);
   2036   return ret;
   2037 }
   2038 
   2039 // Return the dependencies of VERSION.
   2040 
   2041 std::vector<std::string>
   2042 Version_script_info::get_dependencies(const char* version) const
   2043 {
   2044   std::vector<std::string> ret;
   2045   for (size_t j = 0; j < this->version_trees_.size(); ++j)
   2046     if (this->version_trees_[j]->tag == version)
   2047       {
   2048         const struct Version_dependency_list* deps =
   2049           this->version_trees_[j]->dependencies;
   2050         if (deps != NULL)
   2051           for (size_t k = 0; k < deps->dependencies.size(); ++k)
   2052             ret.push_back(deps->dependencies[k]);
   2053         return ret;
   2054       }
   2055   return ret;
   2056 }
   2057 
   2058 // A version script essentially maps a symbol name to a version tag
   2059 // and an indication of whether symbol is global or local within that
   2060 // version tag.  Each symbol maps to at most one version tag.
   2061 // Unfortunately, in practice, version scripts are ambiguous, and list
   2062 // symbols multiple times.  Thus, we have to document the matching
   2063 // process.
   2064 
   2065 // This is a description of what the GNU linker does as of 2010-01-11.
   2066 // It walks through the version tags in the order in which they appear
   2067 // in the version script.  For each tag, it first walks through the
   2068 // global patterns for that tag, then the local patterns.  When
   2069 // looking at a single pattern, it first applies any language specific
   2070 // demangling as specified for the pattern, and then matches the
   2071 // resulting symbol name to the pattern.  If it finds an exact match
   2072 // for a literal pattern (a pattern enclosed in quotes or with no
   2073 // wildcard characters), then that is the match that it uses.  If
   2074 // finds a match with a wildcard pattern, then it saves it and
   2075 // continues searching.  Wildcard patterns that are exactly "*" are
   2076 // saved separately.
   2077 
   2078 // If no exact match with a literal pattern is ever found, then if a
   2079 // wildcard match with a global pattern was found it is used,
   2080 // otherwise if a wildcard match with a local pattern was found it is
   2081 // used.
   2082 
   2083 // This is the result:
   2084 //   * If there is an exact match, then we use the first tag in the
   2085 //     version script where it matches.
   2086 //     + If the exact match in that tag is global, it is used.
   2087 //     + Otherwise the exact match in that tag is local, and is used.
   2088 //   * Otherwise, if there is any match with a global wildcard pattern:
   2089 //     + If there is any match with a wildcard pattern which is not
   2090 //       "*", then we use the tag in which the *last* such pattern
   2091 //       appears.
   2092 //     + Otherwise, we matched "*".  If there is no match with a local
   2093 //       wildcard pattern which is not "*", then we use the *last*
   2094 //       match with a global "*".  Otherwise, continue.
   2095 //   * Otherwise, if there is any match with a local wildcard pattern:
   2096 //     + If there is any match with a wildcard pattern which is not
   2097 //       "*", then we use the tag in which the *last* such pattern
   2098 //       appears.
   2099 //     + Otherwise, we matched "*", and we use the tag in which the
   2100 //       *last* such match occurred.
   2101 
   2102 // There is an additional wrinkle.  When the GNU linker finds a symbol
   2103 // with a version defined in an object file due to a .symver
   2104 // directive, it looks up that symbol name in that version tag.  If it
   2105 // finds it, it matches the symbol name against the patterns for that
   2106 // version.  If there is no match with a global pattern, but there is
   2107 // a match with a local pattern, then the GNU linker marks the symbol
   2108 // as local.
   2109 
   2110 // We want gold to be generally compatible, but we also want gold to
   2111 // be fast.  These are the rules that gold implements:
   2112 //   * If there is an exact match for the mangled name, we use it.
   2113 //     + If there is more than one exact match, we give a warning, and
   2114 //       we use the first tag in the script which matches.
   2115 //     + If a symbol has an exact match as both global and local for
   2116 //       the same version tag, we give an error.
   2117 //   * Otherwise, we look for an extern C++ or an extern Java exact
   2118 //     match.  If we find an exact match, we use it.
   2119 //     + If there is more than one exact match, we give a warning, and
   2120 //       we use the first tag in the script which matches.
   2121 //     + If a symbol has an exact match as both global and local for
   2122 //       the same version tag, we give an error.
   2123 //   * Otherwise, we look through the wildcard patterns, ignoring "*"
   2124 //     patterns.  We look through the version tags in reverse order.
   2125 //     For each version tag, we look through the global patterns and
   2126 //     then the local patterns.  We use the first match we find (i.e.,
   2127 //     the last matching version tag in the file).
   2128 //   * Otherwise, we use the "*" pattern if there is one.  We give an
   2129 //     error if there are multiple "*" patterns.
   2130 
   2131 // At least for now, gold does not look up the version tag for a
   2132 // symbol version found in an object file to see if it should be
   2133 // forced local.  There are other ways to force a symbol to be local,
   2134 // and I don't understand why this one is useful.
   2135 
   2136 // Build a set of fast lookup tables for a version script.
   2137 
   2138 void
   2139 Version_script_info::build_lookup_tables()
   2140 {
   2141   size_t size = this->version_trees_.size();
   2142   for (size_t j = 0; j < size; ++j)
   2143     {
   2144       const Version_tree* v = this->version_trees_[j];
   2145       this->build_expression_list_lookup(v->local, v, false);
   2146       this->build_expression_list_lookup(v->global, v, true);
   2147     }
   2148 }
   2149 
   2150 // If a pattern has backlashes but no unquoted wildcard characters,
   2151 // then we apply backslash unquoting and look for an exact match.
   2152 // Otherwise we treat it as a wildcard pattern.  This function returns
   2153 // true for a wildcard pattern.  Otherwise, it does backslash
   2154 // unquoting on *PATTERN and returns false.  If this returns true,
   2155 // *PATTERN may have been partially unquoted.
   2156 
   2157 bool
   2158 Version_script_info::unquote(std::string* pattern) const
   2159 {
   2160   bool saw_backslash = false;
   2161   size_t len = pattern->length();
   2162   size_t j = 0;
   2163   for (size_t i = 0; i < len; ++i)
   2164     {
   2165       if (saw_backslash)
   2166 	saw_backslash = false;
   2167       else
   2168 	{
   2169 	  switch ((*pattern)[i])
   2170 	    {
   2171 	    case '?': case '[': case '*':
   2172 	      return true;
   2173 	    case '\\':
   2174 	      saw_backslash = true;
   2175 	      continue;
   2176 	    default:
   2177 	      break;
   2178 	    }
   2179 	}
   2180 
   2181       if (i != j)
   2182 	(*pattern)[j] = (*pattern)[i];
   2183       ++j;
   2184     }
   2185   return false;
   2186 }
   2187 
   2188 // Add an exact match for MATCH to *PE.  The result of the match is
   2189 // V/IS_GLOBAL.
   2190 
   2191 void
   2192 Version_script_info::add_exact_match(const std::string& match,
   2193 				     const Version_tree* v, bool is_global,
   2194 				     const Version_expression* ve,
   2195 				     Exact* pe)
   2196 {
   2197   std::pair<Exact::iterator, bool> ins =
   2198     pe->insert(std::make_pair(match, Version_tree_match(v, is_global, ve)));
   2199   if (ins.second)
   2200     {
   2201       // This is the first time we have seen this match.
   2202       return;
   2203     }
   2204 
   2205   Version_tree_match& vtm(ins.first->second);
   2206   if (vtm.real->tag != v->tag)
   2207     {
   2208       // This is an ambiguous match.  We still return the
   2209       // first version that we found in the script, but we
   2210       // record the new version to issue a warning if we
   2211       // wind up looking up this symbol.
   2212       if (vtm.ambiguous == NULL)
   2213 	vtm.ambiguous = v;
   2214     }
   2215   else if (is_global != vtm.is_global)
   2216     {
   2217       // We have a match for both the global and local entries for a
   2218       // version tag.  That's got to be wrong.
   2219       gold_error(_("'%s' appears as both a global and a local symbol "
   2220 		   "for version '%s' in script"),
   2221 		 match.c_str(), v->tag.c_str());
   2222     }
   2223 }
   2224 
   2225 // Build fast lookup information for EXPLIST and store it in LOOKUP.
   2226 // All matches go to V, and IS_GLOBAL is true if they are global
   2227 // matches.
   2228 
   2229 void
   2230 Version_script_info::build_expression_list_lookup(
   2231     const Version_expression_list* explist,
   2232     const Version_tree* v,
   2233     bool is_global)
   2234 {
   2235   if (explist == NULL)
   2236     return;
   2237   size_t size = explist->expressions.size();
   2238   for (size_t i = 0; i < size; ++i)
   2239     {
   2240       const Version_expression& exp(explist->expressions[i]);
   2241 
   2242       if (exp.pattern.length() == 1 && exp.pattern[0] == '*')
   2243 	{
   2244 	  if (this->default_version_ != NULL
   2245 	      && this->default_version_->tag != v->tag)
   2246 	    gold_warning(_("wildcard match appears in both version '%s' "
   2247 			   "and '%s' in script"),
   2248 			 this->default_version_->tag.c_str(), v->tag.c_str());
   2249 	  else if (this->default_version_ != NULL
   2250 		   && this->default_is_global_ != is_global)
   2251 	    gold_error(_("wildcard match appears as both global and local "
   2252 			 "in version '%s' in script"),
   2253 		       v->tag.c_str());
   2254 	  this->default_version_ = v;
   2255 	  this->default_is_global_ = is_global;
   2256 	  continue;
   2257 	}
   2258 
   2259       std::string pattern = exp.pattern;
   2260       if (!exp.exact_match)
   2261 	{
   2262 	  if (this->unquote(&pattern))
   2263 	    {
   2264 	      this->globs_.push_back(Glob(&exp, v, is_global));
   2265 	      continue;
   2266 	    }
   2267 	}
   2268 
   2269       if (this->exact_[exp.language] == NULL)
   2270 	this->exact_[exp.language] = new Exact();
   2271       this->add_exact_match(pattern, v, is_global, &exp,
   2272 			    this->exact_[exp.language]);
   2273     }
   2274 }
   2275 
   2276 // Return the name to match given a name, a language code, and two
   2277 // lazy demanglers.
   2278 
   2279 const char*
   2280 Version_script_info::get_name_to_match(const char* name,
   2281 				       int language,
   2282 				       Lazy_demangler* cpp_demangler,
   2283 				       Lazy_demangler* java_demangler) const
   2284 {
   2285   switch (language)
   2286     {
   2287     case LANGUAGE_C:
   2288       return name;
   2289     case LANGUAGE_CXX:
   2290       return cpp_demangler->get();
   2291     case LANGUAGE_JAVA:
   2292       return java_demangler->get();
   2293     default:
   2294       gold_unreachable();
   2295     }
   2296 }
   2297 
   2298 // Look up SYMBOL_NAME in the list of versions.  Return true if the
   2299 // symbol is found, false if not.  If the symbol is found, then if
   2300 // PVERSION is not NULL, set *PVERSION to the version tag, and if
   2301 // P_IS_GLOBAL is not NULL, set *P_IS_GLOBAL according to whether the
   2302 // symbol is global or not.
   2303 
   2304 bool
   2305 Version_script_info::get_symbol_version(const char* symbol_name,
   2306 					std::string* pversion,
   2307 					bool* p_is_global) const
   2308 {
   2309   Lazy_demangler cpp_demangled_name(symbol_name, DMGL_ANSI | DMGL_PARAMS);
   2310   Lazy_demangler java_demangled_name(symbol_name,
   2311 				     DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
   2312 
   2313   gold_assert(this->is_finalized_);
   2314   for (int i = 0; i < LANGUAGE_COUNT; ++i)
   2315     {
   2316       Exact* exact = this->exact_[i];
   2317       if (exact == NULL)
   2318 	continue;
   2319 
   2320       const char* name_to_match = this->get_name_to_match(symbol_name, i,
   2321 							  &cpp_demangled_name,
   2322 							  &java_demangled_name);
   2323       if (name_to_match == NULL)
   2324 	{
   2325 	  // If the name can not be demangled, the GNU linker goes
   2326 	  // ahead and tries to match it anyhow.  That does not
   2327 	  // make sense to me and I have not implemented it.
   2328 	  continue;
   2329 	}
   2330 
   2331       Exact::const_iterator pe = exact->find(name_to_match);
   2332       if (pe != exact->end())
   2333 	{
   2334 	  const Version_tree_match& vtm(pe->second);
   2335 	  if (vtm.ambiguous != NULL)
   2336 	    gold_warning(_("using '%s' as version for '%s' which is also "
   2337 			   "named in version '%s' in script"),
   2338 			 vtm.real->tag.c_str(), name_to_match,
   2339 			 vtm.ambiguous->tag.c_str());
   2340 
   2341 	  if (pversion != NULL)
   2342 	    *pversion = vtm.real->tag;
   2343 	  if (p_is_global != NULL)
   2344 	    *p_is_global = vtm.is_global;
   2345 
   2346 	  // If we are using --no-undefined-version, and this is a
   2347 	  // global symbol, we have to record that we have found this
   2348 	  // symbol, so that we don't warn about it.  We have to do
   2349 	  // this now, because otherwise we have no way to get from a
   2350 	  // non-C language back to the demangled name that we
   2351 	  // matched.
   2352 	  if (p_is_global != NULL && vtm.is_global)
   2353 	    vtm.expression->was_matched_by_symbol = true;
   2354 
   2355 	  return true;
   2356 	}
   2357     }
   2358 
   2359   // Look through the glob patterns in reverse order.
   2360 
   2361   for (Globs::const_reverse_iterator p = this->globs_.rbegin();
   2362        p != this->globs_.rend();
   2363        ++p)
   2364     {
   2365       int language = p->expression->language;
   2366       const char* name_to_match = this->get_name_to_match(symbol_name,
   2367 							  language,
   2368 							  &cpp_demangled_name,
   2369 							  &java_demangled_name);
   2370       if (name_to_match == NULL)
   2371 	continue;
   2372 
   2373       if (fnmatch(p->expression->pattern.c_str(), name_to_match,
   2374 		  FNM_NOESCAPE) == 0)
   2375 	{
   2376 	  if (pversion != NULL)
   2377 	    *pversion = p->version->tag;
   2378 	  if (p_is_global != NULL)
   2379 	    *p_is_global = p->is_global;
   2380 	  return true;
   2381 	}
   2382     }
   2383 
   2384   // Finally, there may be a wildcard.
   2385   if (this->default_version_ != NULL)
   2386     {
   2387       if (pversion != NULL)
   2388 	*pversion = this->default_version_->tag;
   2389       if (p_is_global != NULL)
   2390 	*p_is_global = this->default_is_global_;
   2391       return true;
   2392     }
   2393 
   2394   return false;
   2395 }
   2396 
   2397 // Give an error if any exact symbol names (not wildcards) appear in a
   2398 // version script, but there is no such symbol.
   2399 
   2400 void
   2401 Version_script_info::check_unmatched_names(const Symbol_table* symtab) const
   2402 {
   2403   for (size_t i = 0; i < this->version_trees_.size(); ++i)
   2404     {
   2405       const Version_tree* vt = this->version_trees_[i];
   2406       if (vt->global == NULL)
   2407 	continue;
   2408       for (size_t j = 0; j < vt->global->expressions.size(); ++j)
   2409 	{
   2410 	  const Version_expression& expression(vt->global->expressions[j]);
   2411 
   2412 	  // Ignore cases where we used the version because we saw a
   2413 	  // symbol that we looked up.  Note that
   2414 	  // WAS_MATCHED_BY_SYMBOL will be true even if the symbol was
   2415 	  // not a definition.  That's OK as in that case we most
   2416 	  // likely gave an undefined symbol error anyhow.
   2417 	  if (expression.was_matched_by_symbol)
   2418 	    continue;
   2419 
   2420 	  // Just ignore names which are in languages other than C.
   2421 	  // We have no way to look them up in the symbol table.
   2422 	  if (expression.language != LANGUAGE_C)
   2423 	    continue;
   2424 
   2425 	  // Remove backslash quoting, and ignore wildcard patterns.
   2426 	  std::string pattern = expression.pattern;
   2427 	  if (!expression.exact_match)
   2428 	    {
   2429 	      if (this->unquote(&pattern))
   2430 		continue;
   2431 	    }
   2432 
   2433 	  if (symtab->lookup(pattern.c_str(), vt->tag.c_str()) == NULL)
   2434 	    gold_error(_("version script assignment of %s to symbol %s "
   2435 			 "failed: symbol not defined"),
   2436 		       vt->tag.c_str(), pattern.c_str());
   2437 	}
   2438     }
   2439 }
   2440 
   2441 struct Version_dependency_list*
   2442 Version_script_info::allocate_dependency_list()
   2443 {
   2444   dependency_lists_.push_back(new Version_dependency_list);
   2445   return dependency_lists_.back();
   2446 }
   2447 
   2448 struct Version_expression_list*
   2449 Version_script_info::allocate_expression_list()
   2450 {
   2451   expression_lists_.push_back(new Version_expression_list);
   2452   return expression_lists_.back();
   2453 }
   2454 
   2455 struct Version_tree*
   2456 Version_script_info::allocate_version_tree()
   2457 {
   2458   version_trees_.push_back(new Version_tree);
   2459   return version_trees_.back();
   2460 }
   2461 
   2462 // Print for debugging.
   2463 
   2464 void
   2465 Version_script_info::print(FILE* f) const
   2466 {
   2467   if (this->empty())
   2468     return;
   2469 
   2470   fprintf(f, "VERSION {");
   2471 
   2472   for (size_t i = 0; i < this->version_trees_.size(); ++i)
   2473     {
   2474       const Version_tree* vt = this->version_trees_[i];
   2475 
   2476       if (vt->tag.empty())
   2477 	fprintf(f, "  {\n");
   2478       else
   2479 	fprintf(f, "  %s {\n", vt->tag.c_str());
   2480 
   2481       if (vt->global != NULL)
   2482 	{
   2483 	  fprintf(f, "    global :\n");
   2484 	  this->print_expression_list(f, vt->global);
   2485 	}
   2486 
   2487       if (vt->local != NULL)
   2488 	{
   2489 	  fprintf(f, "    local :\n");
   2490 	  this->print_expression_list(f, vt->local);
   2491 	}
   2492 
   2493       fprintf(f, "  }");
   2494       if (vt->dependencies != NULL)
   2495 	{
   2496 	  const Version_dependency_list* deps = vt->dependencies;
   2497 	  for (size_t j = 0; j < deps->dependencies.size(); ++j)
   2498 	    {
   2499 	      if (j < deps->dependencies.size() - 1)
   2500 		fprintf(f, "\n");
   2501 	      fprintf(f, "    %s", deps->dependencies[j].c_str());
   2502 	    }
   2503 	}
   2504       fprintf(f, ";\n");
   2505     }
   2506 
   2507   fprintf(f, "}\n");
   2508 }
   2509 
   2510 void
   2511 Version_script_info::print_expression_list(
   2512     FILE* f,
   2513     const Version_expression_list* vel) const
   2514 {
   2515   Version_script_info::Language current_language = LANGUAGE_C;
   2516   for (size_t i = 0; i < vel->expressions.size(); ++i)
   2517     {
   2518       const Version_expression& ve(vel->expressions[i]);
   2519 
   2520       if (ve.language != current_language)
   2521 	{
   2522 	  if (current_language != LANGUAGE_C)
   2523 	    fprintf(f, "      }\n");
   2524 	  switch (ve.language)
   2525 	    {
   2526 	    case LANGUAGE_C:
   2527 	      break;
   2528 	    case LANGUAGE_CXX:
   2529 	      fprintf(f, "      extern \"C++\" {\n");
   2530 	      break;
   2531 	    case LANGUAGE_JAVA:
   2532 	      fprintf(f, "      extern \"Java\" {\n");
   2533 	      break;
   2534 	    default:
   2535 	      gold_unreachable();
   2536 	    }
   2537 	  current_language = ve.language;
   2538 	}
   2539 
   2540       fprintf(f, "      ");
   2541       if (current_language != LANGUAGE_C)
   2542 	fprintf(f, "  ");
   2543 
   2544       if (ve.exact_match)
   2545 	fprintf(f, "\"");
   2546       fprintf(f, "%s", ve.pattern.c_str());
   2547       if (ve.exact_match)
   2548 	fprintf(f, "\"");
   2549 
   2550       fprintf(f, "\n");
   2551     }
   2552 
   2553   if (current_language != LANGUAGE_C)
   2554     fprintf(f, "      }\n");
   2555 }
   2556 
   2557 } // End namespace gold.
   2558 
   2559 // The remaining functions are extern "C", so it's clearer to not put
   2560 // them in namespace gold.
   2561 
   2562 using namespace gold;
   2563 
   2564 // This function is called by the bison parser to return the next
   2565 // token.
   2566 
   2567 extern "C" int
   2568 yylex(YYSTYPE* lvalp, void* closurev)
   2569 {
   2570   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2571   const Token* token = closure->next_token();
   2572   switch (token->classification())
   2573     {
   2574     default:
   2575       gold_unreachable();
   2576 
   2577     case Token::TOKEN_INVALID:
   2578       yyerror(closurev, "invalid character");
   2579       return 0;
   2580 
   2581     case Token::TOKEN_EOF:
   2582       return 0;
   2583 
   2584     case Token::TOKEN_STRING:
   2585       {
   2586 	// This is either a keyword or a STRING.
   2587 	size_t len;
   2588 	const char* str = token->string_value(&len);
   2589 	int parsecode = 0;
   2590         switch (closure->lex_mode())
   2591           {
   2592           case Lex::LINKER_SCRIPT:
   2593             parsecode = script_keywords.keyword_to_parsecode(str, len);
   2594             break;
   2595           case Lex::VERSION_SCRIPT:
   2596             parsecode = version_script_keywords.keyword_to_parsecode(str, len);
   2597             break;
   2598           case Lex::DYNAMIC_LIST:
   2599             parsecode = dynamic_list_keywords.keyword_to_parsecode(str, len);
   2600             break;
   2601           default:
   2602             break;
   2603           }
   2604 	if (parsecode != 0)
   2605 	  return parsecode;
   2606 	lvalp->string.value = str;
   2607 	lvalp->string.length = len;
   2608 	return STRING;
   2609       }
   2610 
   2611     case Token::TOKEN_QUOTED_STRING:
   2612       lvalp->string.value = token->string_value(&lvalp->string.length);
   2613       return QUOTED_STRING;
   2614 
   2615     case Token::TOKEN_OPERATOR:
   2616       return token->operator_value();
   2617 
   2618     case Token::TOKEN_INTEGER:
   2619       lvalp->integer = token->integer_value();
   2620       return INTEGER;
   2621     }
   2622 }
   2623 
   2624 // This function is called by the bison parser to report an error.
   2625 
   2626 extern "C" void
   2627 yyerror(void* closurev, const char* message)
   2628 {
   2629   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2630   gold_error(_("%s:%d:%d: %s"), closure->filename(), closure->lineno(),
   2631 	     closure->charpos(), message);
   2632 }
   2633 
   2634 // Called by the bison parser to add an external symbol to the link.
   2635 
   2636 extern "C" void
   2637 script_add_extern(void* closurev, const char* name, size_t length)
   2638 {
   2639   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2640   closure->script_options()->add_symbol_reference(name, length);
   2641 }
   2642 
   2643 // Called by the bison parser to add a file to the link.
   2644 
   2645 extern "C" void
   2646 script_add_file(void* closurev, const char* name, size_t length)
   2647 {
   2648   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2649 
   2650   // If this is an absolute path, and we found the script in the
   2651   // sysroot, then we want to prepend the sysroot to the file name.
   2652   // For example, this is how we handle a cross link to the x86_64
   2653   // libc.so, which refers to /lib/libc.so.6.
   2654   std::string name_string(name, length);
   2655   const char* extra_search_path = ".";
   2656   std::string script_directory;
   2657   if (IS_ABSOLUTE_PATH(name_string.c_str()))
   2658     {
   2659       if (closure->is_in_sysroot())
   2660 	{
   2661 	  const std::string& sysroot(parameters->options().sysroot());
   2662 	  gold_assert(!sysroot.empty());
   2663 	  name_string = sysroot + name_string;
   2664 	}
   2665     }
   2666   else
   2667     {
   2668       // In addition to checking the normal library search path, we
   2669       // also want to check in the script-directory.
   2670       const char* slash = strrchr(closure->filename(), '/');
   2671       if (slash != NULL)
   2672 	{
   2673 	  script_directory.assign(closure->filename(),
   2674 				  slash - closure->filename() + 1);
   2675 	  extra_search_path = script_directory.c_str();
   2676 	}
   2677     }
   2678 
   2679   Input_file_argument file(name_string.c_str(),
   2680 			   Input_file_argument::INPUT_FILE_TYPE_FILE,
   2681 			   extra_search_path, false,
   2682 			   closure->position_dependent_options());
   2683   Input_argument& arg = closure->inputs()->add_file(file);
   2684   arg.set_script_info(closure->script_info());
   2685 }
   2686 
   2687 // Called by the bison parser to add a library to the link.
   2688 
   2689 extern "C" void
   2690 script_add_library(void* closurev, const char* name, size_t length)
   2691 {
   2692   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2693   std::string name_string(name, length);
   2694 
   2695   if (name_string[0] != 'l')
   2696     gold_error(_("library name must be prefixed with -l"));
   2697 
   2698   Input_file_argument file(name_string.c_str() + 1,
   2699 			   Input_file_argument::INPUT_FILE_TYPE_LIBRARY,
   2700 			   "", false,
   2701 			   closure->position_dependent_options());
   2702   Input_argument& arg = closure->inputs()->add_file(file);
   2703   arg.set_script_info(closure->script_info());
   2704 }
   2705 
   2706 // Called by the bison parser to start a group.  If we are already in
   2707 // a group, that means that this script was invoked within a
   2708 // --start-group --end-group sequence on the command line, or that
   2709 // this script was found in a GROUP of another script.  In that case,
   2710 // we simply continue the existing group, rather than starting a new
   2711 // one.  It is possible to construct a case in which this will do
   2712 // something other than what would happen if we did a recursive group,
   2713 // but it's hard to imagine why the different behaviour would be
   2714 // useful for a real program.  Avoiding recursive groups is simpler
   2715 // and more efficient.
   2716 
   2717 extern "C" void
   2718 script_start_group(void* closurev)
   2719 {
   2720   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2721   if (!closure->in_group())
   2722     closure->inputs()->start_group();
   2723 }
   2724 
   2725 // Called by the bison parser at the end of a group.
   2726 
   2727 extern "C" void
   2728 script_end_group(void* closurev)
   2729 {
   2730   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2731   if (!closure->in_group())
   2732     closure->inputs()->end_group();
   2733 }
   2734 
   2735 // Called by the bison parser to start an AS_NEEDED list.
   2736 
   2737 extern "C" void
   2738 script_start_as_needed(void* closurev)
   2739 {
   2740   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2741   closure->position_dependent_options().set_as_needed(true);
   2742 }
   2743 
   2744 // Called by the bison parser at the end of an AS_NEEDED list.
   2745 
   2746 extern "C" void
   2747 script_end_as_needed(void* closurev)
   2748 {
   2749   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2750   closure->position_dependent_options().set_as_needed(false);
   2751 }
   2752 
   2753 // Called by the bison parser to set the entry symbol.
   2754 
   2755 extern "C" void
   2756 script_set_entry(void* closurev, const char* entry, size_t length)
   2757 {
   2758   // We'll parse this exactly the same as --entry=ENTRY on the commandline
   2759   // TODO(csilvers): FIXME -- call set_entry directly.
   2760   std::string arg("--entry=");
   2761   arg.append(entry, length);
   2762   script_parse_option(closurev, arg.c_str(), arg.size());
   2763 }
   2764 
   2765 // Called by the bison parser to set whether to define common symbols.
   2766 
   2767 extern "C" void
   2768 script_set_common_allocation(void* closurev, int set)
   2769 {
   2770   const char* arg = set != 0 ? "--define-common" : "--no-define-common";
   2771   script_parse_option(closurev, arg, strlen(arg));
   2772 }
   2773 
   2774 // Called by the bison parser to refer to a symbol.
   2775 
   2776 extern "C" Expression*
   2777 script_symbol(void* closurev, const char* name, size_t length)
   2778 {
   2779   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2780   if (length != 1 || name[0] != '.')
   2781     closure->script_options()->add_symbol_reference(name, length);
   2782   return script_exp_string(name, length);
   2783 }
   2784 
   2785 // Called by the bison parser to define a symbol.
   2786 
   2787 extern "C" void
   2788 script_set_symbol(void* closurev, const char* name, size_t length,
   2789 		  Expression* value, int providei, int hiddeni)
   2790 {
   2791   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2792   const bool provide = providei != 0;
   2793   const bool hidden = hiddeni != 0;
   2794   closure->script_options()->add_symbol_assignment(name, length,
   2795 						   closure->parsing_defsym(),
   2796 						   value, provide, hidden);
   2797   closure->clear_skip_on_incompatible_target();
   2798 }
   2799 
   2800 // Called by the bison parser to add an assertion.
   2801 
   2802 extern "C" void
   2803 script_add_assertion(void* closurev, Expression* check, const char* message,
   2804 		     size_t messagelen)
   2805 {
   2806   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2807   closure->script_options()->add_assertion(check, message, messagelen);
   2808   closure->clear_skip_on_incompatible_target();
   2809 }
   2810 
   2811 // Called by the bison parser to parse an OPTION.
   2812 
   2813 extern "C" void
   2814 script_parse_option(void* closurev, const char* option, size_t length)
   2815 {
   2816   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2817   // We treat the option as a single command-line option, even if
   2818   // it has internal whitespace.
   2819   if (closure->command_line() == NULL)
   2820     {
   2821       // There are some options that we could handle here--e.g.,
   2822       // -lLIBRARY.  Should we bother?
   2823       gold_warning(_("%s:%d:%d: ignoring command OPTION; OPTION is only valid"
   2824 		     " for scripts specified via -T/--script"),
   2825 		   closure->filename(), closure->lineno(), closure->charpos());
   2826     }
   2827   else
   2828     {
   2829       bool past_a_double_dash_option = false;
   2830       const char* mutable_option = strndup(option, length);
   2831       gold_assert(mutable_option != NULL);
   2832       closure->command_line()->process_one_option(1, &mutable_option, 0,
   2833                                                   &past_a_double_dash_option);
   2834       // The General_options class will quite possibly store a pointer
   2835       // into mutable_option, so we can't free it.  In cases the class
   2836       // does not store such a pointer, this is a memory leak.  Alas. :(
   2837     }
   2838   closure->clear_skip_on_incompatible_target();
   2839 }
   2840 
   2841 // Called by the bison parser to handle OUTPUT_FORMAT.  OUTPUT_FORMAT
   2842 // takes either one or three arguments.  In the three argument case,
   2843 // the format depends on the endianness option, which we don't
   2844 // currently support (FIXME).  If we see an OUTPUT_FORMAT for the
   2845 // wrong format, then we want to search for a new file.  Returning 0
   2846 // here will cause the parser to immediately abort.
   2847 
   2848 extern "C" int
   2849 script_check_output_format(void* closurev,
   2850 			   const char* default_name, size_t default_length,
   2851 			   const char*, size_t, const char*, size_t)
   2852 {
   2853   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2854   std::string name(default_name, default_length);
   2855   Target* target = select_target_by_bfd_name(name.c_str());
   2856   if (target == NULL || !parameters->is_compatible_target(target))
   2857     {
   2858       if (closure->skip_on_incompatible_target())
   2859 	{
   2860 	  closure->set_found_incompatible_target();
   2861 	  return 0;
   2862 	}
   2863       // FIXME: Should we warn about the unknown target?
   2864     }
   2865   return 1;
   2866 }
   2867 
   2868 // Called by the bison parser to handle TARGET.
   2869 
   2870 extern "C" void
   2871 script_set_target(void* closurev, const char* target, size_t len)
   2872 {
   2873   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2874   std::string s(target, len);
   2875   General_options::Object_format format_enum;
   2876   format_enum = General_options::string_to_object_format(s.c_str());
   2877   closure->position_dependent_options().set_format_enum(format_enum);
   2878 }
   2879 
   2880 // Called by the bison parser to handle SEARCH_DIR.  This is handled
   2881 // exactly like a -L option.
   2882 
   2883 extern "C" void
   2884 script_add_search_dir(void* closurev, const char* option, size_t length)
   2885 {
   2886   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2887   if (closure->command_line() == NULL)
   2888     gold_warning(_("%s:%d:%d: ignoring SEARCH_DIR; SEARCH_DIR is only valid"
   2889 		   " for scripts specified via -T/--script"),
   2890 		 closure->filename(), closure->lineno(), closure->charpos());
   2891   else if (!closure->command_line()->options().nostdlib())
   2892     {
   2893       std::string s = "-L" + std::string(option, length);
   2894       script_parse_option(closurev, s.c_str(), s.size());
   2895     }
   2896 }
   2897 
   2898 /* Called by the bison parser to push the lexer into expression
   2899    mode.  */
   2900 
   2901 extern "C" void
   2902 script_push_lex_into_expression_mode(void* closurev)
   2903 {
   2904   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2905   closure->push_lex_mode(Lex::EXPRESSION);
   2906 }
   2907 
   2908 /* Called by the bison parser to push the lexer into version
   2909    mode.  */
   2910 
   2911 extern "C" void
   2912 script_push_lex_into_version_mode(void* closurev)
   2913 {
   2914   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2915   if (closure->version_script()->is_finalized())
   2916     gold_error(_("%s:%d:%d: invalid use of VERSION in input file"),
   2917 	       closure->filename(), closure->lineno(), closure->charpos());
   2918   closure->push_lex_mode(Lex::VERSION_SCRIPT);
   2919 }
   2920 
   2921 /* Called by the bison parser to pop the lexer mode.  */
   2922 
   2923 extern "C" void
   2924 script_pop_lex_mode(void* closurev)
   2925 {
   2926   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2927   closure->pop_lex_mode();
   2928 }
   2929 
   2930 // Register an entire version node. For example:
   2931 //
   2932 // GLIBC_2.1 {
   2933 //   global: foo;
   2934 // } GLIBC_2.0;
   2935 //
   2936 // - tag is "GLIBC_2.1"
   2937 // - tree contains the information "global: foo"
   2938 // - deps contains "GLIBC_2.0"
   2939 
   2940 extern "C" void
   2941 script_register_vers_node(void*,
   2942 			  const char* tag,
   2943 			  int taglen,
   2944 			  struct Version_tree* tree,
   2945 			  struct Version_dependency_list* deps)
   2946 {
   2947   gold_assert(tree != NULL);
   2948   tree->dependencies = deps;
   2949   if (tag != NULL)
   2950     tree->tag = std::string(tag, taglen);
   2951 }
   2952 
   2953 // Add a dependencies to the list of existing dependencies, if any,
   2954 // and return the expanded list.
   2955 
   2956 extern "C" struct Version_dependency_list*
   2957 script_add_vers_depend(void* closurev,
   2958 		       struct Version_dependency_list* all_deps,
   2959 		       const char* depend_to_add, int deplen)
   2960 {
   2961   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2962   if (all_deps == NULL)
   2963     all_deps = closure->version_script()->allocate_dependency_list();
   2964   all_deps->dependencies.push_back(std::string(depend_to_add, deplen));
   2965   return all_deps;
   2966 }
   2967 
   2968 // Add a pattern expression to an existing list of expressions, if any.
   2969 
   2970 extern "C" struct Version_expression_list*
   2971 script_new_vers_pattern(void* closurev,
   2972 			struct Version_expression_list* expressions,
   2973 			const char* pattern, int patlen, int exact_match)
   2974 {
   2975   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   2976   if (expressions == NULL)
   2977     expressions = closure->version_script()->allocate_expression_list();
   2978   expressions->expressions.push_back(
   2979       Version_expression(std::string(pattern, patlen),
   2980                          closure->get_current_language(),
   2981                          static_cast<bool>(exact_match)));
   2982   return expressions;
   2983 }
   2984 
   2985 // Attaches b to the end of a, and clears b.  So a = a + b and b = {}.
   2986 
   2987 extern "C" struct Version_expression_list*
   2988 script_merge_expressions(struct Version_expression_list* a,
   2989                          struct Version_expression_list* b)
   2990 {
   2991   a->expressions.insert(a->expressions.end(),
   2992                         b->expressions.begin(), b->expressions.end());
   2993   // We could delete b and remove it from expressions_lists_, but
   2994   // that's a lot of work.  This works just as well.
   2995   b->expressions.clear();
   2996   return a;
   2997 }
   2998 
   2999 // Combine the global and local expressions into a a Version_tree.
   3000 
   3001 extern "C" struct Version_tree*
   3002 script_new_vers_node(void* closurev,
   3003 		     struct Version_expression_list* global,
   3004 		     struct Version_expression_list* local)
   3005 {
   3006   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3007   Version_tree* tree = closure->version_script()->allocate_version_tree();
   3008   tree->global = global;
   3009   tree->local = local;
   3010   return tree;
   3011 }
   3012 
   3013 // Handle a transition in language, such as at the
   3014 // start or end of 'extern "C++"'
   3015 
   3016 extern "C" void
   3017 version_script_push_lang(void* closurev, const char* lang, int langlen)
   3018 {
   3019   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3020   std::string language(lang, langlen);
   3021   Version_script_info::Language code;
   3022   if (language.empty() || language == "C")
   3023     code = Version_script_info::LANGUAGE_C;
   3024   else if (language == "C++")
   3025     code = Version_script_info::LANGUAGE_CXX;
   3026   else if (language == "Java")
   3027     code = Version_script_info::LANGUAGE_JAVA;
   3028   else
   3029     {
   3030       char* buf = new char[langlen + 100];
   3031       snprintf(buf, langlen + 100,
   3032 	       _("unrecognized version script language '%s'"),
   3033 	       language.c_str());
   3034       yyerror(closurev, buf);
   3035       delete[] buf;
   3036       code = Version_script_info::LANGUAGE_C;
   3037     }
   3038   closure->push_language(code);
   3039 }
   3040 
   3041 extern "C" void
   3042 version_script_pop_lang(void* closurev)
   3043 {
   3044   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3045   closure->pop_language();
   3046 }
   3047 
   3048 // Called by the bison parser to start a SECTIONS clause.
   3049 
   3050 extern "C" void
   3051 script_start_sections(void* closurev)
   3052 {
   3053   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3054   closure->script_options()->script_sections()->start_sections();
   3055   closure->clear_skip_on_incompatible_target();
   3056 }
   3057 
   3058 // Called by the bison parser to finish a SECTIONS clause.
   3059 
   3060 extern "C" void
   3061 script_finish_sections(void* closurev)
   3062 {
   3063   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3064   closure->script_options()->script_sections()->finish_sections();
   3065 }
   3066 
   3067 // Start processing entries for an output section.
   3068 
   3069 extern "C" void
   3070 script_start_output_section(void* closurev, const char* name, size_t namelen,
   3071 			    const struct Parser_output_section_header* header)
   3072 {
   3073   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3074   closure->script_options()->script_sections()->start_output_section(name,
   3075 								     namelen,
   3076 								     header);
   3077 }
   3078 
   3079 // Finish processing entries for an output section.
   3080 
   3081 extern "C" void
   3082 script_finish_output_section(void* closurev,
   3083 			     const struct Parser_output_section_trailer* trail)
   3084 {
   3085   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3086   closure->script_options()->script_sections()->finish_output_section(trail);
   3087 }
   3088 
   3089 // Add a data item (e.g., "WORD (0)") to the current output section.
   3090 
   3091 extern "C" void
   3092 script_add_data(void* closurev, int data_token, Expression* val)
   3093 {
   3094   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3095   int size;
   3096   bool is_signed = true;
   3097   switch (data_token)
   3098     {
   3099     case QUAD:
   3100       size = 8;
   3101       is_signed = false;
   3102       break;
   3103     case SQUAD:
   3104       size = 8;
   3105       break;
   3106     case LONG:
   3107       size = 4;
   3108       break;
   3109     case SHORT:
   3110       size = 2;
   3111       break;
   3112     case BYTE:
   3113       size = 1;
   3114       break;
   3115     default:
   3116       gold_unreachable();
   3117     }
   3118   closure->script_options()->script_sections()->add_data(size, is_signed, val);
   3119 }
   3120 
   3121 // Add a clause setting the fill value to the current output section.
   3122 
   3123 extern "C" void
   3124 script_add_fill(void* closurev, Expression* val)
   3125 {
   3126   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3127   closure->script_options()->script_sections()->add_fill(val);
   3128 }
   3129 
   3130 // Add a new input section specification to the current output
   3131 // section.
   3132 
   3133 extern "C" void
   3134 script_add_input_section(void* closurev,
   3135 			 const struct Input_section_spec* spec,
   3136 			 int keepi)
   3137 {
   3138   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3139   bool keep = keepi != 0;
   3140   closure->script_options()->script_sections()->add_input_section(spec, keep);
   3141 }
   3142 
   3143 // When we see DATA_SEGMENT_ALIGN we record that following output
   3144 // sections may be relro.
   3145 
   3146 extern "C" void
   3147 script_data_segment_align(void* closurev)
   3148 {
   3149   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3150   if (!closure->script_options()->saw_sections_clause())
   3151     gold_error(_("%s:%d:%d: DATA_SEGMENT_ALIGN not in SECTIONS clause"),
   3152 	       closure->filename(), closure->lineno(), closure->charpos());
   3153   else
   3154     closure->script_options()->script_sections()->data_segment_align();
   3155 }
   3156 
   3157 // When we see DATA_SEGMENT_RELRO_END we know that all output sections
   3158 // since DATA_SEGMENT_ALIGN should be relro.
   3159 
   3160 extern "C" void
   3161 script_data_segment_relro_end(void* closurev)
   3162 {
   3163   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3164   if (!closure->script_options()->saw_sections_clause())
   3165     gold_error(_("%s:%d:%d: DATA_SEGMENT_ALIGN not in SECTIONS clause"),
   3166 	       closure->filename(), closure->lineno(), closure->charpos());
   3167   else
   3168     closure->script_options()->script_sections()->data_segment_relro_end();
   3169 }
   3170 
   3171 // Create a new list of string/sort pairs.
   3172 
   3173 extern "C" String_sort_list_ptr
   3174 script_new_string_sort_list(const struct Wildcard_section* string_sort)
   3175 {
   3176   return new String_sort_list(1, *string_sort);
   3177 }
   3178 
   3179 // Add an entry to a list of string/sort pairs.  The way the parser
   3180 // works permits us to simply modify the first parameter, rather than
   3181 // copy the vector.
   3182 
   3183 extern "C" String_sort_list_ptr
   3184 script_string_sort_list_add(String_sort_list_ptr pv,
   3185 			    const struct Wildcard_section* string_sort)
   3186 {
   3187   if (pv == NULL)
   3188     return script_new_string_sort_list(string_sort);
   3189   else
   3190     {
   3191       pv->push_back(*string_sort);
   3192       return pv;
   3193     }
   3194 }
   3195 
   3196 // Create a new list of strings.
   3197 
   3198 extern "C" String_list_ptr
   3199 script_new_string_list(const char* str, size_t len)
   3200 {
   3201   return new String_list(1, std::string(str, len));
   3202 }
   3203 
   3204 // Add an element to a list of strings.  The way the parser works
   3205 // permits us to simply modify the first parameter, rather than copy
   3206 // the vector.
   3207 
   3208 extern "C" String_list_ptr
   3209 script_string_list_push_back(String_list_ptr pv, const char* str, size_t len)
   3210 {
   3211   if (pv == NULL)
   3212     return script_new_string_list(str, len);
   3213   else
   3214     {
   3215       pv->push_back(std::string(str, len));
   3216       return pv;
   3217     }
   3218 }
   3219 
   3220 // Concatenate two string lists.  Either or both may be NULL.  The way
   3221 // the parser works permits us to modify the parameters, rather than
   3222 // copy the vector.
   3223 
   3224 extern "C" String_list_ptr
   3225 script_string_list_append(String_list_ptr pv1, String_list_ptr pv2)
   3226 {
   3227   if (pv1 == NULL)
   3228     return pv2;
   3229   if (pv2 == NULL)
   3230     return pv1;
   3231   pv1->insert(pv1->end(), pv2->begin(), pv2->end());
   3232   return pv1;
   3233 }
   3234 
   3235 // Add a new program header.
   3236 
   3237 extern "C" void
   3238 script_add_phdr(void* closurev, const char* name, size_t namelen,
   3239 		unsigned int type, const Phdr_info* info)
   3240 {
   3241   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3242   bool includes_filehdr = info->includes_filehdr != 0;
   3243   bool includes_phdrs = info->includes_phdrs != 0;
   3244   bool is_flags_valid = info->is_flags_valid != 0;
   3245   Script_sections* ss = closure->script_options()->script_sections();
   3246   ss->add_phdr(name, namelen, type, includes_filehdr, includes_phdrs,
   3247 	       is_flags_valid, info->flags, info->load_address);
   3248   closure->clear_skip_on_incompatible_target();
   3249 }
   3250 
   3251 // Convert a program header string to a type.
   3252 
   3253 #define PHDR_TYPE(NAME) { #NAME, sizeof(#NAME) - 1, elfcpp::NAME }
   3254 
   3255 static struct
   3256 {
   3257   const char* name;
   3258   size_t namelen;
   3259   unsigned int val;
   3260 } phdr_type_names[] =
   3261 {
   3262   PHDR_TYPE(PT_NULL),
   3263   PHDR_TYPE(PT_LOAD),
   3264   PHDR_TYPE(PT_DYNAMIC),
   3265   PHDR_TYPE(PT_INTERP),
   3266   PHDR_TYPE(PT_NOTE),
   3267   PHDR_TYPE(PT_SHLIB),
   3268   PHDR_TYPE(PT_PHDR),
   3269   PHDR_TYPE(PT_TLS),
   3270   PHDR_TYPE(PT_GNU_EH_FRAME),
   3271   PHDR_TYPE(PT_GNU_STACK),
   3272   PHDR_TYPE(PT_GNU_RELRO)
   3273 };
   3274 
   3275 extern "C" unsigned int
   3276 script_phdr_string_to_type(void* closurev, const char* name, size_t namelen)
   3277 {
   3278   for (unsigned int i = 0;
   3279        i < sizeof(phdr_type_names) / sizeof(phdr_type_names[0]);
   3280        ++i)
   3281     if (namelen == phdr_type_names[i].namelen
   3282 	&& strncmp(name, phdr_type_names[i].name, namelen) == 0)
   3283       return phdr_type_names[i].val;
   3284   yyerror(closurev, _("unknown PHDR type (try integer)"));
   3285   return elfcpp::PT_NULL;
   3286 }
   3287 
   3288 extern "C" void
   3289 script_saw_segment_start_expression(void* closurev)
   3290 {
   3291   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3292   Script_sections* ss = closure->script_options()->script_sections();
   3293   ss->set_saw_segment_start_expression(true);
   3294 }
   3295 
   3296 extern "C" void
   3297 script_set_section_region(void* closurev, const char* name, size_t namelen,
   3298 			  int set_vma)
   3299 {
   3300   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3301   if (!closure->script_options()->saw_sections_clause())
   3302     {
   3303       gold_error(_("%s:%d:%d: MEMORY region '%.*s' referred to outside of "
   3304 		   "SECTIONS clause"),
   3305 		 closure->filename(), closure->lineno(), closure->charpos(),
   3306 		 static_cast<int>(namelen), name);
   3307       return;
   3308     }
   3309 
   3310   Script_sections* ss = closure->script_options()->script_sections();
   3311   Memory_region* mr = ss->find_memory_region(name, namelen);
   3312   if (mr == NULL)
   3313     {
   3314       gold_error(_("%s:%d:%d: MEMORY region '%.*s' not declared"),
   3315 		 closure->filename(), closure->lineno(), closure->charpos(),
   3316 		 static_cast<int>(namelen), name);
   3317       return;
   3318     }
   3319 
   3320   ss->set_memory_region(mr, set_vma);
   3321 }
   3322 
   3323 extern "C" void
   3324 script_add_memory(void* closurev, const char* name, size_t namelen,
   3325 		  unsigned int attrs, Expression* origin, Expression* length)
   3326 {
   3327   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3328   Script_sections* ss = closure->script_options()->script_sections();
   3329   ss->add_memory_region(name, namelen, attrs, origin, length);
   3330 }
   3331 
   3332 extern "C" unsigned int
   3333 script_parse_memory_attr(void* closurev, const char* attrs, size_t attrlen,
   3334 			 int invert)
   3335 {
   3336   int attributes = 0;
   3337 
   3338   while (attrlen--)
   3339     switch (*attrs++)
   3340       {
   3341       case 'R':
   3342       case 'r':
   3343 	attributes |= MEM_READABLE; break;
   3344       case 'W':
   3345       case 'w':
   3346 	attributes |= MEM_READABLE | MEM_WRITEABLE; break;
   3347       case 'X':
   3348       case 'x':
   3349 	attributes |= MEM_EXECUTABLE; break;
   3350       case 'A':
   3351       case 'a':
   3352 	attributes |= MEM_ALLOCATABLE; break;
   3353       case 'I':
   3354       case 'i':
   3355       case 'L':
   3356       case 'l':
   3357 	attributes |= MEM_INITIALIZED; break;
   3358       default:
   3359 	yyerror(closurev, _("unknown MEMORY attribute"));
   3360       }
   3361 
   3362   if (invert)
   3363     attributes = (~ attributes) & MEM_ATTR_MASK;
   3364 
   3365   return attributes;
   3366 }
   3367 
   3368 extern "C" void
   3369 script_include_directive(int first_token, void* closurev,
   3370 			 const char* filename, size_t length)
   3371 {
   3372   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3373   std::string name(filename, length);
   3374   Command_line* cmdline = closure->command_line();
   3375   read_script_file(name.c_str(), cmdline, &cmdline->script_options(),
   3376                    first_token, Lex::LINKER_SCRIPT);
   3377 }
   3378 
   3379 // Functions for memory regions.
   3380 
   3381 extern "C" Expression*
   3382 script_exp_function_origin(void* closurev, const char* name, size_t namelen)
   3383 {
   3384   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3385   Script_sections* ss = closure->script_options()->script_sections();
   3386   Expression* origin = ss->find_memory_region_origin(name, namelen);
   3387 
   3388   if (origin == NULL)
   3389     {
   3390       gold_error(_("undefined memory region '%s' referenced "
   3391 		   "in ORIGIN expression"),
   3392 		 name);
   3393       // Create a dummy expression to prevent crashes later on.
   3394       origin = script_exp_integer(0);
   3395     }
   3396 
   3397   return origin;
   3398 }
   3399 
   3400 extern "C" Expression*
   3401 script_exp_function_length(void* closurev, const char* name, size_t namelen)
   3402 {
   3403   Parser_closure* closure = static_cast<Parser_closure*>(closurev);
   3404   Script_sections* ss = closure->script_options()->script_sections();
   3405   Expression* length = ss->find_memory_region_length(name, namelen);
   3406 
   3407   if (length == NULL)
   3408     {
   3409       gold_error(_("undefined memory region '%s' referenced "
   3410 		   "in LENGTH expression"),
   3411 		 name);
   3412       // Create a dummy expression to prevent crashes later on.
   3413       length = script_exp_integer(0);
   3414     }
   3415 
   3416   return length;
   3417 }
   3418