* mips-tdep.c (mips16_scan_prologue): Handle the MIPS16e SAVE
[deliverable/binutils-gdb.git] / ld / ldexp.c
index 1e0969c482af7d270595cc59bdd855de2409c885..5e2812d5baf039be0874f00dad2fc841d857156a 100644 (file)
@@ -4,22 +4,23 @@
    Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
 
-   This file is part of GLD, the Gnu Linker.
+   This file is part of the GNU Binutils.
 
-   GLD is free software; you can redistribute it and/or modify
+   This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
-   GLD is distributed in the hope that it will be useful,
+   This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with GLD; see the file COPYING.  If not, write to the Free
-   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
-   02110-1301, USA.  */
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
 
 /* This module is in charge of working out the contents of expressions.
 
@@ -28,8 +29,8 @@
    which contains a value, a section to which it is relative and a
    valid bit.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "bfdlink.h"
 
 #include "ld.h"
@@ -97,6 +98,7 @@ exp_print_token (token_code_type code, int infix_p)
     { MAP, "MAP" },
     { ENTRY, "ENTRY" },
     { NEXT, "NEXT" },
+    { ALIGNOF, "ALIGNOF" },
     { SIZEOF, "SIZEOF" },
     { ADDR, "ADDR" },
     { LOADADDR, "LOADADDR" },
@@ -388,6 +390,7 @@ fold_binary (etree_type *tree)
              break;
 
            case DATA_SEGMENT_ALIGN:
+             expld.dataseg.relro = exp_dataseg_relro_start;
              if (expld.phase != lang_first_phase_enum
                  && expld.section == bfd_abs_section_ptr
                  && (expld.dataseg.phase == exp_dataseg_none
@@ -423,6 +426,7 @@ fold_binary (etree_type *tree)
              break;
 
            case DATA_SEGMENT_RELRO_END:
+             expld.dataseg.relro = exp_dataseg_relro_end;
              if (expld.phase != lang_first_phase_enum
                  && (expld.dataseg.phase == exp_dataseg_align_seen
                      || expld.dataseg.phase == exp_dataseg_adjust
@@ -606,9 +610,9 @@ fold_name (etree_type *tree)
       break;
 
     case SIZEOF:
+    case ALIGNOF:
       if (expld.phase != lang_first_phase_enum)
        {
-         int opb = bfd_octets_per_byte (output_bfd);
          lang_output_section_statement_type *os;
 
          os = lang_output_section_find (tree->name.name);
@@ -620,7 +624,16 @@ fold_name (etree_type *tree)
              new_abs (0);
            }
          else if (os->processed_vma)
-           new_abs (os->bfd_section->size / opb);
+           {
+             bfd_vma val;
+
+             if (tree->type.node_code == SIZEOF)
+               val = os->bfd_section->size / bfd_octets_per_byte (output_bfd);
+             else
+               val = (bfd_vma)1 << os->bfd_section->alignment_power;
+             
+             new_abs (val);
+           }
        }
       break;
 
@@ -1041,7 +1054,7 @@ exp_get_vma (etree_type *tree, bfd_vma def, char *name)
       if (expld.result.valid_p)
        return expld.result.value;
       else if (name != NULL && expld.phase != lang_mark_phase_enum)
-       einfo (_("%F%S nonconstant expression for %s\n"), name);
+       einfo (_("%F%S: nonconstant expression for %s\n"), name);
     }
   return def;
 }
@@ -1066,7 +1079,7 @@ exp_get_fill (etree_type *tree, fill_type *def, char *name)
   if (!expld.result.valid_p)
     {
       if (name != NULL && expld.phase != lang_mark_phase_enum)
-       einfo (_("%F%S nonconstant expression for %s\n"), name);
+       einfo (_("%F%S: nonconstant expression for %s\n"), name);
       return def;
     }
 
This page took 0.024712 seconds and 4 git commands to generate.