Take into account MEMORY regions when creating a segment map.
[deliverable/binutils-gdb.git] / ld / ldexp.c
index 6c3c717eb882ad8a3b65052777f3b97086c192f9..7ac0032627a37466c10bee1f9a04f80c1a818253 100644 (file)
@@ -1,6 +1,6 @@
 /* This module handles expression trees.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005
+   2001, 2002, 2003, 2004, 2005, 2006, 2007
    Free Software Foundation, Inc.
    Written by Steve Chamberlain of Cygnus Support <sac@cygnus.com>.
 
@@ -99,6 +99,7 @@ exp_print_token (token_code_type code, int infix_p)
     { SIZEOF, "SIZEOF" },
     { ADDR, "ADDR" },
     { LOADADDR, "LOADADDR" },
+    { CONSTANT, "CONSTANT" },
     { MAX_K, "MAX_K" },
     { REL, "relocatable" },
     { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" },
@@ -480,10 +481,11 @@ fold_name (etree_type *tree)
          /* Don't find the real header size if only marking sections;
             The bfd function may cache incorrect data.  */
          if (expld.phase != lang_mark_phase_enum)
-           hdr_size = bfd_sizeof_headers (output_bfd, link_info.relocatable);
+           hdr_size = bfd_sizeof_headers (output_bfd, &link_info);
          new_abs (hdr_size);
        }
       break;
+
     case DEFINED:
       if (expld.phase == lang_first_phase_enum)
        lang_track_definedness (tree->name.name);
@@ -506,6 +508,7 @@ fold_name (etree_type *tree)
          expld.result.valid_p = TRUE;
        }
       break;
+
     case NAME:
       if (expld.phase == lang_first_phase_enum)
        ;
@@ -562,7 +565,13 @@ fold_name (etree_type *tree)
          lang_output_section_statement_type *os;
 
          os = lang_output_section_find (tree->name.name);
-         if (os != NULL && os->processed > 0)
+         if (os == NULL)
+           {
+             if (expld.phase == lang_final_phase_enum)
+               einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
+                      tree->name.name);
+           }
+         else if (os->processed_vma)
            new_rel (0, NULL, os->bfd_section);
        }
       break;
@@ -573,12 +582,21 @@ fold_name (etree_type *tree)
          lang_output_section_statement_type *os;
 
          os = lang_output_section_find (tree->name.name);
-         if (os != NULL && os->processed > 0)
+         if (os == NULL)
+           {
+             if (expld.phase == lang_final_phase_enum)
+               einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
+                      tree->name.name);
+           }
+         else if (os->processed_lma)
            {
              if (os->load_base == NULL)
-               new_rel (0, NULL, os->bfd_section);
+               new_abs (os->bfd_section->lma);
              else
-               exp_fold_tree_1 (os->load_base);
+               {
+                 exp_fold_tree_1 (os->load_base);
+                 make_abs ();
+               }
            }
        }
       break;
@@ -590,7 +608,14 @@ fold_name (etree_type *tree)
          lang_output_section_statement_type *os;
 
          os = lang_output_section_find (tree->name.name);
-         if (os != NULL && os->processed > 0)
+         if (os == NULL)
+           {
+             if (expld.phase == lang_final_phase_enum)
+               einfo (_("%F%S: undefined section `%s' referenced in expression\n"),
+                      tree->name.name);
+             new_abs (0);
+           }
+         else if (os->processed_vma)
            new_abs (os->bfd_section->size / opb);
        }
       break;
@@ -621,6 +646,16 @@ fold_name (etree_type *tree)
       }
       break;
 
+    case CONSTANT:
+      if (strcmp (tree->name.name, "MAXPAGESIZE") == 0)
+       new_abs (bfd_emul_get_maxpagesize (default_target));
+      else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0)
+       new_abs (bfd_emul_get_commonpagesize (default_target));
+      else
+       einfo (_("%F%S: unknown constant `%s' referenced in expression\n"),
+              tree->name.name);
+      break;
+
     default:
       FAIL ();
       break;
@@ -655,15 +690,8 @@ exp_fold_tree_1 (etree_type *tree)
 
     case etree_assert:
       exp_fold_tree_1 (tree->assert_s.child);
-      if (expld.result.valid_p)
-       {
-         if (expld.phase == lang_mark_phase_enum)
-           /* We don't care if assert fails or not when we are just
-              marking if a section is used or not.  */
-           expld.result.value = 1;
-         else if (!expld.result.value)
-           einfo ("%X%P: %s\n", tree->assert_s.message);
-       }
+      if (expld.phase == lang_final_phase_enum && !expld.result.value)
+       einfo ("%X%P: %s\n", tree->assert_s.message);
       break;
 
     case etree_unary:
@@ -884,7 +912,7 @@ exp_assop (int code, const char *dst, etree_type *src)
 /* Handle PROVIDE.  */
 
 etree_type *
-exp_provide (const char *dst, etree_type *src)
+exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
 {
   etree_type *n;
 
@@ -893,6 +921,7 @@ exp_provide (const char *dst, etree_type *src)
   n->assign.type.node_class = etree_provide;
   n->assign.src = src;
   n->assign.dst = dst;
+  n->assign.hidden = hidden;
   return n;
 }
 
@@ -1083,7 +1112,7 @@ exp_get_abs_int (etree_type *tree, int def, char *name)
          return expld.result.value;
        }
       else if (name != NULL && expld.phase != lang_mark_phase_enum)
-       einfo (_("%F%S non constant expression for %s\n"), name);
+       einfo (_("%F%S nonconstant expression for %s\n"), name);
     }
   return def;
 }
This page took 0.024456 seconds and 4 git commands to generate.