Home | History | Annotate | Download | only in gold
      1 // expression.cc -- expressions in linker scripts for gold
      2 
      3 // Copyright (C) 2006-2016 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 <string>
     26 
     27 #include "elfcpp.h"
     28 #include "parameters.h"
     29 #include "symtab.h"
     30 #include "layout.h"
     31 #include "output.h"
     32 #include "script.h"
     33 #include "script-c.h"
     34 
     35 namespace gold
     36 {
     37 
     38 // This file holds the code which handles linker expressions.
     39 
     40 // The dot symbol, which linker scripts refer to simply as ".",
     41 // requires special treatment.  The dot symbol is set several times,
     42 // section addresses will refer to it, output sections will change it,
     43 // and it can be set based on the value of other symbols.  We simplify
     44 // the handling by prohibiting setting the dot symbol to the value of
     45 // a non-absolute symbol.
     46 
     47 // When evaluating the value of an expression, we pass in a pointer to
     48 // this struct, so that the expression evaluation can find the
     49 // information it needs.
     50 
     51 struct Expression::Expression_eval_info
     52 {
     53   // The symbol table.
     54   const Symbol_table* symtab;
     55   // The layout--we use this to get section information.
     56   const Layout* layout;
     57   // Whether to check assertions.
     58   bool check_assertions;
     59   // Whether expressions can refer to the dot symbol.  The dot symbol
     60   // is only available within a SECTIONS clause.
     61   bool is_dot_available;
     62   // The current value of the dot symbol.
     63   uint64_t dot_value;
     64   // The section in which the dot symbol is defined; this is NULL if
     65   // it is absolute.
     66   Output_section* dot_section;
     67   // Points to where the section of the result should be stored.
     68   Output_section** result_section_pointer;
     69   // Pointer to where the alignment of the result should be stored.
     70   uint64_t* result_alignment_pointer;
     71   // Pointer to where the type of the symbol on the RHS should be stored.
     72   elfcpp::STT* type_pointer;
     73   // Pointer to where the visibility of the symbol on the RHS should be stored.
     74   elfcpp::STV* vis_pointer;
     75   // Pointer to where the rest of the symbol's st_other field should be stored.
     76   unsigned char* nonvis_pointer;
     77   // Whether the value is valid.  In Symbol_assignment::set_if_absolute, we
     78   // may be trying to evaluate the address of a section whose address is not
     79   // yet finalized, and we need to fail the evaluation gracefully.
     80   bool *is_valid_pointer;
     81 };
     82 
     83 // Evaluate an expression.
     84 
     85 uint64_t
     86 Expression::eval(const Symbol_table* symtab, const Layout* layout,
     87 		 bool check_assertions)
     88 {
     89   return this->eval_maybe_dot(symtab, layout, check_assertions, false, 0,
     90 			      NULL, NULL, NULL, NULL, NULL, NULL, false, NULL);
     91 }
     92 
     93 // Evaluate an expression which may refer to the dot symbol.
     94 
     95 uint64_t
     96 Expression::eval_with_dot(const Symbol_table* symtab, const Layout* layout,
     97 			  bool check_assertions, uint64_t dot_value,
     98 			  Output_section* dot_section,
     99 			  Output_section** result_section_pointer,
    100 			  uint64_t* result_alignment_pointer,
    101 			  bool is_section_dot_assignment)
    102 {
    103   return this->eval_maybe_dot(symtab, layout, check_assertions, true,
    104 			      dot_value, dot_section, result_section_pointer,
    105 			      result_alignment_pointer, NULL, NULL, NULL,
    106 			      is_section_dot_assignment, NULL);
    107 }
    108 
    109 // Evaluate an expression which may or may not refer to the dot
    110 // symbol.
    111 
    112 uint64_t
    113 Expression::eval_maybe_dot(const Symbol_table* symtab, const Layout* layout,
    114 			   bool check_assertions, bool is_dot_available,
    115 			   uint64_t dot_value, Output_section* dot_section,
    116 			   Output_section** result_section_pointer,
    117 			   uint64_t* result_alignment_pointer,
    118 			   elfcpp::STT* type_pointer,
    119 			   elfcpp::STV* vis_pointer,
    120 			   unsigned char* nonvis_pointer,
    121 			   bool is_section_dot_assignment,
    122 			   bool* is_valid_pointer)
    123 {
    124   Expression_eval_info eei;
    125   eei.symtab = symtab;
    126   eei.layout = layout;
    127   eei.check_assertions = check_assertions;
    128   eei.is_dot_available = is_dot_available;
    129   eei.dot_value = dot_value;
    130   eei.dot_section = dot_section;
    131 
    132   // We assume the value is absolute, and only set this to a section
    133   // if we find a section-relative reference.
    134   if (result_section_pointer != NULL)
    135     *result_section_pointer = NULL;
    136   eei.result_section_pointer = result_section_pointer;
    137 
    138   // For symbol=symbol assignments, we need to track the type, visibility,
    139   // and remaining st_other bits.
    140   eei.type_pointer = type_pointer;
    141   eei.vis_pointer = vis_pointer;
    142   eei.nonvis_pointer = nonvis_pointer;
    143 
    144   eei.result_alignment_pointer = result_alignment_pointer;
    145 
    146   // Assume the value is valid until we try to evaluate an expression
    147   // that can't be evaluated yet.
    148   bool is_valid = true;
    149   eei.is_valid_pointer = &is_valid;
    150 
    151   uint64_t val = this->value(&eei);
    152 
    153   if (is_valid_pointer != NULL)
    154     *is_valid_pointer = is_valid;
    155   else
    156     gold_assert(is_valid);
    157 
    158   // If this is an assignment to dot within a section, and the value
    159   // is absolute, treat it as a section-relative offset.
    160   if (is_section_dot_assignment && *result_section_pointer == NULL)
    161     {
    162       gold_assert(dot_section != NULL);
    163       val += dot_section->address();
    164       *result_section_pointer = dot_section;
    165     }
    166   return val;
    167 }
    168 
    169 // A number.
    170 
    171 class Integer_expression : public Expression
    172 {
    173  public:
    174   Integer_expression(uint64_t val)
    175     : val_(val)
    176   { }
    177 
    178   uint64_t
    179   value(const Expression_eval_info*)
    180   { return this->val_; }
    181 
    182   void
    183   print(FILE* f) const
    184   { fprintf(f, "0x%llx", static_cast<unsigned long long>(this->val_)); }
    185 
    186  private:
    187   uint64_t val_;
    188 };
    189 
    190 extern "C" Expression*
    191 script_exp_integer(uint64_t val)
    192 {
    193   return new Integer_expression(val);
    194 }
    195 
    196 // An expression whose value is the value of a symbol.
    197 
    198 class Symbol_expression : public Expression
    199 {
    200  public:
    201   Symbol_expression(const char* name, size_t length)
    202     : name_(name, length)
    203   { }
    204 
    205   uint64_t
    206   value(const Expression_eval_info*);
    207 
    208   void
    209   print(FILE* f) const
    210   { fprintf(f, "%s", this->name_.c_str()); }
    211 
    212  private:
    213   std::string name_;
    214 };
    215 
    216 uint64_t
    217 Symbol_expression::value(const Expression_eval_info* eei)
    218 {
    219   Symbol* sym = eei->symtab->lookup(this->name_.c_str());
    220   if (sym == NULL || !sym->is_defined())
    221     {
    222       gold_error(_("undefined symbol '%s' referenced in expression"),
    223 		 this->name_.c_str());
    224       return 0;
    225     }
    226 
    227   if (eei->result_section_pointer != NULL)
    228     *eei->result_section_pointer = sym->output_section();
    229   if (eei->type_pointer != NULL)
    230     *eei->type_pointer = sym->type();
    231   if (eei->vis_pointer != NULL)
    232     *eei->vis_pointer = sym->visibility();
    233   if (eei->nonvis_pointer != NULL)
    234     *eei->nonvis_pointer = sym->nonvis();
    235 
    236   if (parameters->target().get_size() == 32)
    237     return eei->symtab->get_sized_symbol<32>(sym)->value();
    238   else if (parameters->target().get_size() == 64)
    239     return eei->symtab->get_sized_symbol<64>(sym)->value();
    240   else
    241     gold_unreachable();
    242 }
    243 
    244 // An expression whose value is the value of the special symbol ".".
    245 // This is only valid within a SECTIONS clause.
    246 
    247 class Dot_expression : public Expression
    248 {
    249  public:
    250   Dot_expression()
    251   { }
    252 
    253   uint64_t
    254   value(const Expression_eval_info*);
    255 
    256   void
    257   print(FILE* f) const
    258   { fprintf(f, "."); }
    259 };
    260 
    261 uint64_t
    262 Dot_expression::value(const Expression_eval_info* eei)
    263 {
    264   if (!eei->is_dot_available)
    265     {
    266       gold_error(_("invalid reference to dot symbol outside of "
    267 		   "SECTIONS clause"));
    268       return 0;
    269     }
    270   if (eei->result_section_pointer != NULL)
    271     *eei->result_section_pointer = eei->dot_section;
    272   return eei->dot_value;
    273 }
    274 
    275 // A string.  This is either the name of a symbol, or ".".
    276 
    277 extern "C" Expression*
    278 script_exp_string(const char* name, size_t length)
    279 {
    280   if (length == 1 && name[0] == '.')
    281     return new Dot_expression();
    282   else
    283     return new Symbol_expression(name, length);
    284 }
    285 
    286 // A unary expression.
    287 
    288 class Unary_expression : public Expression
    289 {
    290  public:
    291   Unary_expression(Expression* arg)
    292     : arg_(arg)
    293   { }
    294 
    295   ~Unary_expression()
    296   { delete this->arg_; }
    297 
    298  protected:
    299   uint64_t
    300   arg_value(const Expression_eval_info* eei,
    301 	    Output_section** arg_section_pointer) const
    302   {
    303     return this->arg_->eval_maybe_dot(eei->symtab, eei->layout,
    304 				      eei->check_assertions,
    305 				      eei->is_dot_available,
    306 				      eei->dot_value,
    307 				      eei->dot_section,
    308 				      arg_section_pointer,
    309 				      eei->result_alignment_pointer,
    310 				      NULL,
    311 				      NULL,
    312 				      NULL,
    313 				      false,
    314 				      eei->is_valid_pointer);
    315   }
    316 
    317   void
    318   arg_print(FILE* f) const
    319   { this->arg_->print(f); }
    320 
    321  private:
    322   Expression* arg_;
    323 };
    324 
    325 // Handle unary operators.  We use a preprocessor macro as a hack to
    326 // capture the C operator.
    327 
    328 #define UNARY_EXPRESSION(NAME, OPERATOR)				\
    329   class Unary_ ## NAME : public Unary_expression			\
    330   {									\
    331   public:								\
    332     Unary_ ## NAME(Expression* arg)					\
    333       : Unary_expression(arg)						\
    334     { }									\
    335     									\
    336     uint64_t								\
    337     value(const Expression_eval_info* eei)				\
    338     {									\
    339       Output_section* arg_section;					\
    340       uint64_t ret = OPERATOR this->arg_value(eei, &arg_section);	\
    341       if (arg_section != NULL && parameters->options().relocatable())	\
    342 	gold_warning(_("unary " #NAME " applied to section "		\
    343 		       "relative value"));				\
    344       return ret;							\
    345     }									\
    346 									\
    347     void								\
    348     print(FILE* f) const						\
    349     {									\
    350       fprintf(f, "(%s ", #OPERATOR);					\
    351       this->arg_print(f);						\
    352       fprintf(f, ")");							\
    353     }									\
    354   };									\
    355 									\
    356   extern "C" Expression*						\
    357   script_exp_unary_ ## NAME(Expression* arg)				\
    358   {									\
    359       return new Unary_ ## NAME(arg);					\
    360   }
    361 
    362 UNARY_EXPRESSION(minus, -)
    363 UNARY_EXPRESSION(logical_not, !)
    364 UNARY_EXPRESSION(bitwise_not, ~)
    365 
    366 // A binary expression.
    367 
    368 class Binary_expression : public Expression
    369 {
    370  public:
    371   Binary_expression(Expression* left, Expression* right)
    372     : left_(left), right_(right)
    373   { }
    374 
    375   ~Binary_expression()
    376   {
    377     delete this->left_;
    378     delete this->right_;
    379   }
    380 
    381  protected:
    382   uint64_t
    383   left_value(const Expression_eval_info* eei,
    384 	     Output_section** section_pointer,
    385 	     uint64_t* alignment_pointer) const
    386   {
    387     return this->left_->eval_maybe_dot(eei->symtab, eei->layout,
    388 				       eei->check_assertions,
    389 				       eei->is_dot_available,
    390 				       eei->dot_value,
    391 				       eei->dot_section,
    392 				       section_pointer,
    393 				       alignment_pointer,
    394 				       NULL,
    395 				       NULL,
    396 				       NULL,
    397 				       false,
    398 				       eei->is_valid_pointer);
    399   }
    400 
    401   uint64_t
    402   right_value(const Expression_eval_info* eei,
    403 	      Output_section** section_pointer,
    404 	      uint64_t* alignment_pointer) const
    405   {
    406     return this->right_->eval_maybe_dot(eei->symtab, eei->layout,
    407 					eei->check_assertions,
    408 					eei->is_dot_available,
    409 					eei->dot_value,
    410 					eei->dot_section,
    411 					section_pointer,
    412 					alignment_pointer,
    413 					NULL,
    414 					NULL,
    415 					NULL,
    416 					false,
    417 					eei->is_valid_pointer);
    418   }
    419 
    420   void
    421   left_print(FILE* f) const
    422   { this->left_->print(f); }
    423 
    424   void
    425   right_print(FILE* f) const
    426   { this->right_->print(f); }
    427 
    428   // This is a call to function FUNCTION_NAME.  Print it.  This is for
    429   // debugging.
    430   void
    431   print_function(FILE* f, const char* function_name) const
    432   {
    433     fprintf(f, "%s(", function_name);
    434     this->left_print(f);
    435     fprintf(f, ", ");
    436     this->right_print(f);
    437     fprintf(f, ")");
    438   }
    439 
    440  private:
    441   Expression* left_;
    442   Expression* right_;
    443 };
    444 
    445 // Handle binary operators.  We use a preprocessor macro as a hack to
    446 // capture the C operator.  KEEP_LEFT means that if the left operand
    447 // is section relative and the right operand is not, the result uses
    448 // the same section as the left operand.  KEEP_RIGHT is the same with
    449 // left and right swapped.  IS_DIV means that we need to give an error
    450 // if the right operand is zero.  WARN means that we should warn if
    451 // used on section relative values in a relocatable link.  We always
    452 // warn if used on values in different sections in a relocatable link.
    453 
    454 #define BINARY_EXPRESSION(NAME, OPERATOR, KEEP_LEFT, KEEP_RIGHT, IS_DIV, WARN) \
    455   class Binary_ ## NAME : public Binary_expression			\
    456   {									\
    457   public:								\
    458     Binary_ ## NAME(Expression* left, Expression* right)		\
    459       : Binary_expression(left, right)					\
    460     { }									\
    461 									\
    462     uint64_t								\
    463     value(const Expression_eval_info* eei)				\
    464     {									\
    465       Output_section* left_section;					\
    466       uint64_t left_alignment = 0;					\
    467       uint64_t left = this->left_value(eei, &left_section,		\
    468 				       &left_alignment);		\
    469       Output_section* right_section;					\
    470       uint64_t right_alignment = 0;					\
    471       uint64_t right = this->right_value(eei, &right_section,		\
    472 					 &right_alignment);		\
    473       if (KEEP_RIGHT && left_section == NULL && right_section != NULL)	\
    474 	{								\
    475 	  if (eei->result_section_pointer != NULL)			\
    476 	    *eei->result_section_pointer = right_section;		\
    477 	  if (eei->result_alignment_pointer != NULL			\
    478 	      && right_alignment > *eei->result_alignment_pointer)	\
    479 	    *eei->result_alignment_pointer = right_alignment;		\
    480 	}								\
    481       else if (KEEP_LEFT						\
    482 	       && left_section != NULL					\
    483 	       && right_section == NULL)				\
    484 	{								\
    485 	  if (eei->result_section_pointer != NULL)			\
    486 	    *eei->result_section_pointer = left_section;		\
    487 	  if (eei->result_alignment_pointer != NULL			\
    488 	      && left_alignment > *eei->result_alignment_pointer)	\
    489 	    *eei->result_alignment_pointer = left_alignment;		\
    490 	}								\
    491       else if ((WARN || left_section != right_section)			\
    492 	       && (left_section != NULL || right_section != NULL)	\
    493 	       && parameters->options().relocatable())			\
    494 	gold_warning(_("binary " #NAME " applied to section "		\
    495 		       "relative value"));				\
    496       if (IS_DIV && right == 0)						\
    497 	{								\
    498 	  gold_error(_(#NAME " by zero"));				\
    499 	  return 0;							\
    500 	}								\
    501       return left OPERATOR right;					\
    502     }									\
    503 									\
    504     void								\
    505     print(FILE* f) const						\
    506     {									\
    507       fprintf(f, "(");							\
    508       this->left_print(f);						\
    509       fprintf(f, " %s ", #OPERATOR);					\
    510       this->right_print(f);						\
    511       fprintf(f, ")");							\
    512     }									\
    513   };									\
    514 									\
    515   extern "C" Expression*						\
    516   script_exp_binary_ ## NAME(Expression* left, Expression* right)	\
    517   {									\
    518     return new Binary_ ## NAME(left, right);				\
    519   }
    520 
    521 BINARY_EXPRESSION(mult, *, false, false, false, true)
    522 BINARY_EXPRESSION(div, /, false, false, true, true)
    523 BINARY_EXPRESSION(mod, %, false, false, true, true)
    524 BINARY_EXPRESSION(add, +, true, true, false, true)
    525 BINARY_EXPRESSION(sub, -, true, false, false, false)
    526 BINARY_EXPRESSION(lshift, <<, false, false, false, true)
    527 BINARY_EXPRESSION(rshift, >>, false, false, false, true)
    528 BINARY_EXPRESSION(eq, ==, false, false, false, false)
    529 BINARY_EXPRESSION(ne, !=, false, false, false, false)
    530 BINARY_EXPRESSION(le, <=, false, false, false, false)
    531 BINARY_EXPRESSION(ge, >=, false, false, false, false)
    532 BINARY_EXPRESSION(lt, <, false, false, false, false)
    533 BINARY_EXPRESSION(gt, >, false, false, false, false)
    534 BINARY_EXPRESSION(bitwise_and, &, true, true, false, true)
    535 BINARY_EXPRESSION(bitwise_xor, ^, true, true, false, true)
    536 BINARY_EXPRESSION(bitwise_or, |, true, true, false, true)
    537 BINARY_EXPRESSION(logical_and, &&, false, false, false, true)
    538 BINARY_EXPRESSION(logical_or, ||, false, false, false, true)
    539 
    540 // A trinary expression.
    541 
    542 class Trinary_expression : public Expression
    543 {
    544  public:
    545   Trinary_expression(Expression* arg1, Expression* arg2, Expression* arg3)
    546     : arg1_(arg1), arg2_(arg2), arg3_(arg3)
    547   { }
    548 
    549   ~Trinary_expression()
    550   {
    551     delete this->arg1_;
    552     delete this->arg2_;
    553     delete this->arg3_;
    554   }
    555 
    556  protected:
    557   uint64_t
    558   arg1_value(const Expression_eval_info* eei,
    559 	     Output_section** section_pointer) const
    560   {
    561     return this->arg1_->eval_maybe_dot(eei->symtab, eei->layout,
    562 				       eei->check_assertions,
    563 				       eei->is_dot_available,
    564 				       eei->dot_value,
    565 				       eei->dot_section,
    566 				       section_pointer,
    567 				       NULL,
    568 				       NULL,
    569 				       NULL,
    570 				       NULL,
    571 				       false,
    572 				       eei->is_valid_pointer);
    573   }
    574 
    575   uint64_t
    576   arg2_value(const Expression_eval_info* eei,
    577 	     Output_section** section_pointer,
    578 	     uint64_t* alignment_pointer) const
    579   {
    580     return this->arg1_->eval_maybe_dot(eei->symtab, eei->layout,
    581 				       eei->check_assertions,
    582 				       eei->is_dot_available,
    583 				       eei->dot_value,
    584 				       eei->dot_section,
    585 				       section_pointer,
    586 				       alignment_pointer,
    587 				       NULL,
    588 				       NULL,
    589 				       NULL,
    590 				       false,
    591 				       eei->is_valid_pointer);
    592   }
    593 
    594   uint64_t
    595   arg3_value(const Expression_eval_info* eei,
    596 	     Output_section** section_pointer,
    597 	     uint64_t* alignment_pointer) const
    598   {
    599     return this->arg1_->eval_maybe_dot(eei->symtab, eei->layout,
    600 				       eei->check_assertions,
    601 				       eei->is_dot_available,
    602 				       eei->dot_value,
    603 				       eei->dot_section,
    604 				       section_pointer,
    605 				       alignment_pointer,
    606 				       NULL,
    607 				       NULL,
    608 				       NULL,
    609 				       false,
    610 				       eei->is_valid_pointer);
    611   }
    612 
    613   void
    614   arg1_print(FILE* f) const
    615   { this->arg1_->print(f); }
    616 
    617   void
    618   arg2_print(FILE* f) const
    619   { this->arg2_->print(f); }
    620 
    621   void
    622   arg3_print(FILE* f) const
    623   { this->arg3_->print(f); }
    624 
    625  private:
    626   Expression* arg1_;
    627   Expression* arg2_;
    628   Expression* arg3_;
    629 };
    630 
    631 // The conditional operator.
    632 
    633 class Trinary_cond : public Trinary_expression
    634 {
    635  public:
    636   Trinary_cond(Expression* arg1, Expression* arg2, Expression* arg3)
    637     : Trinary_expression(arg1, arg2, arg3)
    638   { }
    639 
    640   uint64_t
    641   value(const Expression_eval_info* eei)
    642   {
    643     Output_section* arg1_section;
    644     uint64_t arg1 = this->arg1_value(eei, &arg1_section);
    645     return (arg1
    646 	    ? this->arg2_value(eei, eei->result_section_pointer,
    647 			       eei->result_alignment_pointer)
    648 	    : this->arg3_value(eei, eei->result_section_pointer,
    649 			       eei->result_alignment_pointer));
    650   }
    651 
    652   void
    653   print(FILE* f) const
    654   {
    655     fprintf(f, "(");
    656     this->arg1_print(f);
    657     fprintf(f, " ? ");
    658     this->arg2_print(f);
    659     fprintf(f, " : ");
    660     this->arg3_print(f);
    661     fprintf(f, ")");
    662   }
    663 };
    664 
    665 extern "C" Expression*
    666 script_exp_trinary_cond(Expression* arg1, Expression* arg2, Expression* arg3)
    667 {
    668   return new Trinary_cond(arg1, arg2, arg3);
    669 }
    670 
    671 // Max function.
    672 
    673 class Max_expression : public Binary_expression
    674 {
    675  public:
    676   Max_expression(Expression* left, Expression* right)
    677     : Binary_expression(left, right)
    678   { }
    679 
    680   uint64_t
    681   value(const Expression_eval_info* eei)
    682   {
    683     Output_section* left_section;
    684     uint64_t left_alignment;
    685     uint64_t left = this->left_value(eei, &left_section, &left_alignment);
    686     Output_section* right_section;
    687     uint64_t right_alignment;
    688     uint64_t right = this->right_value(eei, &right_section, &right_alignment);
    689     if (left_section == right_section)
    690       {
    691 	if (eei->result_section_pointer != NULL)
    692 	  *eei->result_section_pointer = left_section;
    693       }
    694     else if ((left_section != NULL || right_section != NULL)
    695 	     && parameters->options().relocatable())
    696       gold_warning(_("max applied to section relative value"));
    697     if (eei->result_alignment_pointer != NULL)
    698       {
    699 	uint64_t ra = *eei->result_alignment_pointer;
    700 	if (left > right)
    701 	  ra = std::max(ra, left_alignment);
    702 	else if (right > left)
    703 	  ra = std::max(ra, right_alignment);
    704 	else
    705 	  ra = std::max(ra, std::max(left_alignment, right_alignment));
    706 	*eei->result_alignment_pointer = ra;
    707       }
    708     return std::max(left, right);
    709   }
    710 
    711   void
    712   print(FILE* f) const
    713   { this->print_function(f, "MAX"); }
    714 };
    715 
    716 extern "C" Expression*
    717 script_exp_function_max(Expression* left, Expression* right)
    718 {
    719   return new Max_expression(left, right);
    720 }
    721 
    722 // Min function.
    723 
    724 class Min_expression : public Binary_expression
    725 {
    726  public:
    727   Min_expression(Expression* left, Expression* right)
    728     : Binary_expression(left, right)
    729   { }
    730 
    731   uint64_t
    732   value(const Expression_eval_info* eei)
    733   {
    734     Output_section* left_section;
    735     uint64_t left_alignment;
    736     uint64_t left = this->left_value(eei, &left_section, &left_alignment);
    737     Output_section* right_section;
    738     uint64_t right_alignment;
    739     uint64_t right = this->right_value(eei, &right_section, &right_alignment);
    740     if (left_section == right_section)
    741       {
    742 	if (eei->result_section_pointer != NULL)
    743 	  *eei->result_section_pointer = left_section;
    744       }
    745     else if ((left_section != NULL || right_section != NULL)
    746 	     && parameters->options().relocatable())
    747       gold_warning(_("min applied to section relative value"));
    748     if (eei->result_alignment_pointer != NULL)
    749       {
    750 	uint64_t ra = *eei->result_alignment_pointer;
    751 	if (left < right)
    752 	  ra = std::max(ra, left_alignment);
    753 	else if (right < left)
    754 	  ra = std::max(ra, right_alignment);
    755 	else
    756 	  ra = std::max(ra, std::max(left_alignment, right_alignment));
    757 	*eei->result_alignment_pointer = ra;
    758       }
    759     return std::min(left, right);
    760   }
    761 
    762   void
    763   print(FILE* f) const
    764   { this->print_function(f, "MIN"); }
    765 };
    766 
    767 extern "C" Expression*
    768 script_exp_function_min(Expression* left, Expression* right)
    769 {
    770   return new Min_expression(left, right);
    771 }
    772 
    773 // Class Section_expression.  This is a parent class used for
    774 // functions which take the name of an output section.
    775 
    776 class Section_expression : public Expression
    777 {
    778  public:
    779   Section_expression(const char* section_name, size_t section_name_len)
    780     : section_name_(section_name, section_name_len)
    781   { }
    782 
    783   uint64_t
    784   value(const Expression_eval_info*);
    785 
    786   void
    787   print(FILE* f) const
    788   { fprintf(f, "%s(%s)", this->function_name(), this->section_name_.c_str()); }
    789 
    790  protected:
    791   // The child class must implement this.
    792   virtual uint64_t
    793   value_from_output_section(const Expression_eval_info*,
    794 			    Output_section*) = 0;
    795 
    796   // The child class must implement this.
    797   virtual uint64_t
    798   value_from_script_output_section(uint64_t address, uint64_t load_address,
    799                                    uint64_t addralign, uint64_t size) = 0;
    800 
    801   // The child class must implement this.
    802   virtual const char*
    803   function_name() const = 0;
    804 
    805  private:
    806   std::string section_name_;
    807 };
    808 
    809 uint64_t
    810 Section_expression::value(const Expression_eval_info* eei)
    811 {
    812   const char* section_name = this->section_name_.c_str();
    813   Output_section* os = eei->layout->find_output_section(section_name);
    814   if (os != NULL)
    815     return this->value_from_output_section(eei, os);
    816 
    817   uint64_t address;
    818   uint64_t load_address;
    819   uint64_t addralign;
    820   uint64_t size;
    821   const Script_options* ss = eei->layout->script_options();
    822   if (ss->saw_sections_clause())
    823     {
    824       if (ss->script_sections()->get_output_section_info(section_name,
    825                                                          &address,
    826                                                          &load_address,
    827                                                          &addralign,
    828                                                          &size))
    829         return this->value_from_script_output_section(address, load_address,
    830                                                       addralign, size);
    831     }
    832 
    833   gold_error("%s called on nonexistent output section '%s'",
    834              this->function_name(), section_name);
    835   return 0;
    836 }
    837 
    838 // ABSOLUTE function.
    839 
    840 class Absolute_expression : public Unary_expression
    841 {
    842  public:
    843   Absolute_expression(Expression* arg)
    844     : Unary_expression(arg)
    845   { }
    846 
    847   uint64_t
    848   value(const Expression_eval_info* eei)
    849   {
    850     uint64_t ret = this->arg_value(eei, NULL);
    851     // Force the value to be absolute.
    852     if (eei->result_section_pointer != NULL)
    853       *eei->result_section_pointer = NULL;
    854     return ret;
    855   }
    856 
    857   void
    858   print(FILE* f) const
    859   {
    860     fprintf(f, "ABSOLUTE(");
    861     this->arg_print(f);
    862     fprintf(f, ")");
    863   }
    864 };
    865 
    866 extern "C" Expression*
    867 script_exp_function_absolute(Expression* arg)
    868 {
    869   return new Absolute_expression(arg);
    870 }
    871 
    872 // ALIGN function.
    873 
    874 class Align_expression : public Binary_expression
    875 {
    876  public:
    877   Align_expression(Expression* left, Expression* right)
    878     : Binary_expression(left, right)
    879   { }
    880 
    881   uint64_t
    882   value(const Expression_eval_info* eei)
    883   {
    884     Output_section* align_section;
    885     uint64_t align = this->right_value(eei, &align_section, NULL);
    886     if (align_section != NULL
    887 	&& parameters->options().relocatable())
    888       gold_warning(_("aligning to section relative value"));
    889 
    890     if (eei->result_alignment_pointer != NULL
    891 	&& align > *eei->result_alignment_pointer)
    892       {
    893 	uint64_t a = align;
    894 	while ((a & (a - 1)) != 0)
    895 	  a &= a - 1;
    896 	*eei->result_alignment_pointer = a;
    897       }
    898 
    899     uint64_t value = this->left_value(eei, eei->result_section_pointer, NULL);
    900     if (align <= 1)
    901       return value;
    902     return ((value + align - 1) / align) * align;
    903   }
    904 
    905   void
    906   print(FILE* f) const
    907   { this->print_function(f, "ALIGN"); }
    908 };
    909 
    910 extern "C" Expression*
    911 script_exp_function_align(Expression* left, Expression* right)
    912 {
    913   return new Align_expression(left, right);
    914 }
    915 
    916 // ASSERT function.
    917 
    918 class Assert_expression : public Unary_expression
    919 {
    920  public:
    921   Assert_expression(Expression* arg, const char* message, size_t length)
    922     : Unary_expression(arg), message_(message, length)
    923   { }
    924 
    925   uint64_t
    926   value(const Expression_eval_info* eei)
    927   {
    928     uint64_t value = this->arg_value(eei, eei->result_section_pointer);
    929     if (!value && eei->check_assertions)
    930       gold_error("%s", this->message_.c_str());
    931     return value;
    932   }
    933 
    934   void
    935   print(FILE* f) const
    936   {
    937     fprintf(f, "ASSERT(");
    938     this->arg_print(f);
    939     fprintf(f, ", %s)", this->message_.c_str());
    940   }
    941 
    942  private:
    943   std::string message_;
    944 };
    945 
    946 extern "C" Expression*
    947 script_exp_function_assert(Expression* expr, const char* message,
    948 			   size_t length)
    949 {
    950   return new Assert_expression(expr, message, length);
    951 }
    952 
    953 // ADDR function.
    954 
    955 class Addr_expression : public Section_expression
    956 {
    957  public:
    958   Addr_expression(const char* section_name, size_t section_name_len)
    959     : Section_expression(section_name, section_name_len)
    960   { }
    961 
    962  protected:
    963   uint64_t
    964   value_from_output_section(const Expression_eval_info* eei,
    965 			    Output_section* os)
    966   {
    967     if (eei->result_section_pointer != NULL)
    968       *eei->result_section_pointer = os;
    969     if (os->is_address_valid())
    970       return os->address();
    971     *eei->is_valid_pointer = false;
    972     return 0;
    973   }
    974 
    975   uint64_t
    976   value_from_script_output_section(uint64_t address, uint64_t, uint64_t,
    977                                    uint64_t)
    978   { return address; }
    979 
    980   const char*
    981   function_name() const
    982   { return "ADDR"; }
    983 };
    984 
    985 extern "C" Expression*
    986 script_exp_function_addr(const char* section_name, size_t section_name_len)
    987 {
    988   return new Addr_expression(section_name, section_name_len);
    989 }
    990 
    991 // ALIGNOF.
    992 
    993 class Alignof_expression : public Section_expression
    994 {
    995  public:
    996   Alignof_expression(const char* section_name, size_t section_name_len)
    997     : Section_expression(section_name, section_name_len)
    998   { }
    999 
   1000  protected:
   1001   uint64_t
   1002   value_from_output_section(const Expression_eval_info*,
   1003 			    Output_section* os)
   1004   { return os->addralign(); }
   1005 
   1006   uint64_t
   1007   value_from_script_output_section(uint64_t, uint64_t, uint64_t addralign,
   1008                                    uint64_t)
   1009   { return addralign; }
   1010 
   1011   const char*
   1012   function_name() const
   1013   { return "ALIGNOF"; }
   1014 };
   1015 
   1016 extern "C" Expression*
   1017 script_exp_function_alignof(const char* section_name, size_t section_name_len)
   1018 {
   1019   return new Alignof_expression(section_name, section_name_len);
   1020 }
   1021 
   1022 // CONSTANT.  It would be nice if we could simply evaluate this
   1023 // immediately and return an Integer_expression, but unfortunately we
   1024 // don't know the target.
   1025 
   1026 class Constant_expression : public Expression
   1027 {
   1028  public:
   1029   Constant_expression(const char* name, size_t length);
   1030 
   1031   uint64_t
   1032   value(const Expression_eval_info*);
   1033 
   1034   void
   1035   print(FILE* f) const;
   1036 
   1037  private:
   1038   enum Constant_function
   1039   {
   1040     CONSTANT_MAXPAGESIZE,
   1041     CONSTANT_COMMONPAGESIZE
   1042   };
   1043 
   1044   Constant_function function_;
   1045 };
   1046 
   1047 Constant_expression::Constant_expression(const char* name, size_t length)
   1048 {
   1049   if (length == 11 && strncmp(name, "MAXPAGESIZE", length) == 0)
   1050     this->function_ = CONSTANT_MAXPAGESIZE;
   1051   else if (length == 14 && strncmp(name, "COMMONPAGESIZE", length) == 0)
   1052     this->function_ = CONSTANT_COMMONPAGESIZE;
   1053   else
   1054     {
   1055       std::string s(name, length);
   1056       gold_error(_("unknown constant %s"), s.c_str());
   1057       this->function_ = CONSTANT_MAXPAGESIZE;
   1058     }
   1059 }
   1060 
   1061 uint64_t
   1062 Constant_expression::value(const Expression_eval_info*)
   1063 {
   1064   switch (this->function_)
   1065     {
   1066     case CONSTANT_MAXPAGESIZE:
   1067       return parameters->target().abi_pagesize();
   1068     case CONSTANT_COMMONPAGESIZE:
   1069       return parameters->target().common_pagesize();
   1070     default:
   1071       gold_unreachable();
   1072     }
   1073 }
   1074 
   1075 void
   1076 Constant_expression::print(FILE* f) const
   1077 {
   1078   const char* name;
   1079   switch (this->function_)
   1080     {
   1081     case CONSTANT_MAXPAGESIZE:
   1082       name = "MAXPAGESIZE";
   1083       break;
   1084     case CONSTANT_COMMONPAGESIZE:
   1085       name = "COMMONPAGESIZE";
   1086       break;
   1087     default:
   1088       gold_unreachable();
   1089     }
   1090   fprintf(f, "CONSTANT(%s)", name);
   1091 }
   1092 
   1093 extern "C" Expression*
   1094 script_exp_function_constant(const char* name, size_t length)
   1095 {
   1096   return new Constant_expression(name, length);
   1097 }
   1098 
   1099 // DATA_SEGMENT_ALIGN.  FIXME: we don't implement this; we always fall
   1100 // back to the general case.
   1101 
   1102 extern "C" Expression*
   1103 script_exp_function_data_segment_align(Expression* left, Expression*)
   1104 {
   1105   Expression* e1 = script_exp_function_align(script_exp_string(".", 1), left);
   1106   Expression* e2 = script_exp_binary_sub(left, script_exp_integer(1));
   1107   Expression* e3 = script_exp_binary_bitwise_and(script_exp_string(".", 1),
   1108 						 e2);
   1109   return script_exp_binary_add(e1, e3);
   1110 }
   1111 
   1112 // DATA_SEGMENT_RELRO.  FIXME: This is not implemented.
   1113 
   1114 extern "C" Expression*
   1115 script_exp_function_data_segment_relro_end(Expression*, Expression* right)
   1116 {
   1117   return right;
   1118 }
   1119 
   1120 // DATA_SEGMENT_END.  FIXME: This is not implemented.
   1121 
   1122 extern "C" Expression*
   1123 script_exp_function_data_segment_end(Expression* val)
   1124 {
   1125   return val;
   1126 }
   1127 
   1128 // DEFINED function.
   1129 
   1130 class Defined_expression : public Expression
   1131 {
   1132  public:
   1133   Defined_expression(const char* symbol_name, size_t symbol_name_len)
   1134     : symbol_name_(symbol_name, symbol_name_len)
   1135   { }
   1136 
   1137   uint64_t
   1138   value(const Expression_eval_info* eei)
   1139   {
   1140     Symbol* sym = eei->symtab->lookup(this->symbol_name_.c_str());
   1141     return sym != NULL && sym->is_defined();
   1142   }
   1143 
   1144   void
   1145   print(FILE* f) const
   1146   { fprintf(f, "DEFINED(%s)", this->symbol_name_.c_str()); }
   1147 
   1148  private:
   1149   std::string symbol_name_;
   1150 };
   1151 
   1152 extern "C" Expression*
   1153 script_exp_function_defined(const char* symbol_name, size_t symbol_name_len)
   1154 {
   1155   return new Defined_expression(symbol_name, symbol_name_len);
   1156 }
   1157 
   1158 // LOADADDR function
   1159 
   1160 class Loadaddr_expression : public Section_expression
   1161 {
   1162  public:
   1163   Loadaddr_expression(const char* section_name, size_t section_name_len)
   1164     : Section_expression(section_name, section_name_len)
   1165   { }
   1166 
   1167  protected:
   1168   uint64_t
   1169   value_from_output_section(const Expression_eval_info* eei,
   1170 			    Output_section* os)
   1171   {
   1172     if (os->has_load_address())
   1173       return os->load_address();
   1174     else
   1175       {
   1176 	if (eei->result_section_pointer != NULL)
   1177 	  *eei->result_section_pointer = os;
   1178 	return os->address();
   1179       }
   1180   }
   1181 
   1182   uint64_t
   1183   value_from_script_output_section(uint64_t, uint64_t load_address, uint64_t,
   1184                                    uint64_t)
   1185   { return load_address; }
   1186 
   1187   const char*
   1188   function_name() const
   1189   { return "LOADADDR"; }
   1190 };
   1191 
   1192 extern "C" Expression*
   1193 script_exp_function_loadaddr(const char* section_name, size_t section_name_len)
   1194 {
   1195   return new Loadaddr_expression(section_name, section_name_len);
   1196 }
   1197 
   1198 // SIZEOF function
   1199 
   1200 class Sizeof_expression : public Section_expression
   1201 {
   1202  public:
   1203   Sizeof_expression(const char* section_name, size_t section_name_len)
   1204     : Section_expression(section_name, section_name_len)
   1205   { }
   1206 
   1207  protected:
   1208   uint64_t
   1209   value_from_output_section(const Expression_eval_info*,
   1210 			    Output_section* os)
   1211   {
   1212     // We can not use data_size here, as the size of the section may
   1213     // not have been finalized.  Instead we get whatever the current
   1214     // size is.  This will work correctly for backward references in
   1215     // linker scripts.
   1216     return os->current_data_size();
   1217   }
   1218 
   1219   uint64_t
   1220   value_from_script_output_section(uint64_t, uint64_t, uint64_t,
   1221                                    uint64_t size)
   1222   { return size; }
   1223 
   1224   const char*
   1225   function_name() const
   1226   { return "SIZEOF"; }
   1227 };
   1228 
   1229 extern "C" Expression*
   1230 script_exp_function_sizeof(const char* section_name, size_t section_name_len)
   1231 {
   1232   return new Sizeof_expression(section_name, section_name_len);
   1233 }
   1234 
   1235 // SIZEOF_HEADERS.
   1236 
   1237 class Sizeof_headers_expression : public Expression
   1238 {
   1239  public:
   1240   Sizeof_headers_expression()
   1241   { }
   1242 
   1243   uint64_t
   1244   value(const Expression_eval_info*);
   1245 
   1246   void
   1247   print(FILE* f) const
   1248   { fprintf(f, "SIZEOF_HEADERS"); }
   1249 };
   1250 
   1251 uint64_t
   1252 Sizeof_headers_expression::value(const Expression_eval_info* eei)
   1253 {
   1254   unsigned int ehdr_size;
   1255   unsigned int phdr_size;
   1256   if (parameters->target().get_size() == 32)
   1257     {
   1258       ehdr_size = elfcpp::Elf_sizes<32>::ehdr_size;
   1259       phdr_size = elfcpp::Elf_sizes<32>::phdr_size;
   1260     }
   1261   else if (parameters->target().get_size() == 64)
   1262     {
   1263       ehdr_size = elfcpp::Elf_sizes<64>::ehdr_size;
   1264       phdr_size = elfcpp::Elf_sizes<64>::phdr_size;
   1265     }
   1266   else
   1267     gold_unreachable();
   1268 
   1269   return ehdr_size + phdr_size * eei->layout->expected_segment_count();
   1270 }
   1271 
   1272 extern "C" Expression*
   1273 script_exp_function_sizeof_headers()
   1274 {
   1275   return new Sizeof_headers_expression();
   1276 }
   1277 
   1278 // SEGMENT_START.
   1279 
   1280 class Segment_start_expression : public Unary_expression
   1281 {
   1282  public:
   1283   Segment_start_expression(const char* segment_name, size_t segment_name_len,
   1284 			   Expression* default_value)
   1285     : Unary_expression(default_value),
   1286       segment_name_(segment_name, segment_name_len)
   1287   { }
   1288 
   1289   uint64_t
   1290   value(const Expression_eval_info*);
   1291 
   1292   void
   1293   print(FILE* f) const
   1294   {
   1295     fprintf(f, "SEGMENT_START(\"%s\", ", this->segment_name_.c_str());
   1296     this->arg_print(f);
   1297     fprintf(f, ")");
   1298   }
   1299 
   1300  private:
   1301   std::string segment_name_;
   1302 };
   1303 
   1304 uint64_t
   1305 Segment_start_expression::value(const Expression_eval_info* eei)
   1306 {
   1307   // Check for command line overrides.
   1308   if (parameters->options().user_set_Ttext()
   1309       && this->segment_name_ == ".text")
   1310     return parameters->options().Ttext();
   1311   else if (parameters->options().user_set_Tdata()
   1312 	   && this->segment_name_ == ".data")
   1313     return parameters->options().Tdata();
   1314   else if (parameters->options().user_set_Tbss()
   1315 	   && this->segment_name_ == ".bss")
   1316     return parameters->options().Tbss();
   1317   else
   1318     {
   1319       uint64_t ret = this->arg_value(eei, NULL);
   1320       // Force the value to be absolute.
   1321       if (eei->result_section_pointer != NULL)
   1322         *eei->result_section_pointer = NULL;
   1323       return ret;
   1324     }
   1325 }
   1326 
   1327 extern "C" Expression*
   1328 script_exp_function_segment_start(const char* segment_name,
   1329 				  size_t segment_name_len,
   1330 				  Expression* default_value)
   1331 {
   1332   return new Segment_start_expression(segment_name, segment_name_len,
   1333 				      default_value);
   1334 }
   1335 
   1336 } // End namespace gold.
   1337