* ldexp.h (etree_value_type): Use "asection *" in place of
authorAlan Modra <amodra@gmail.com>
Thu, 2 Jun 2005 03:08:41 +0000 (03:08 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 2 Jun 2005 03:08:41 +0000 (03:08 +0000)
"struct lang_output_section_statement_struct *" for "section".
(exp_fold_tree): Likewise.
(exp_mark_used_section): Likewise.
* ldexp.c (new_rel, new_rel_from_section, fold_unary, fold_binary,
fold_trinary, fold_name, exp_fold_tree_1, exp_fold_tree,
exp_mark_used_section): Likewise for "current_section" param.
(make_abs, new_abs, exp_binop, exp_unop, exp_get_vma, exp_get_fill,
exp_get_abs_int): Adjust for above changes.
* ldlang.c (lang_mark_used_section_1, print_assignment,
lang_size_sections_1, lang_do_assignments_1): Likewise.
* ldexp.c (fold_name): Init entire result struct.

ld/ChangeLog
ld/ldexp.c
ld/ldexp.h
ld/ldlang.c

index 984a3857ffb970aff89090b175230317be5235c6..f940d2cf169ef66176ade443ceb730295e6a27ec 100644 (file)
@@ -1,3 +1,18 @@
+2005-06-02  Alan Modra  <amodra@bigpond.net.au>
+
+       * ldexp.h (etree_value_type): Use "asection *" in place of
+       "struct lang_output_section_statement_struct *" for "section".
+       (exp_fold_tree): Likewise.
+       (exp_mark_used_section): Likewise.
+       * ldexp.c (new_rel, new_rel_from_section, fold_unary, fold_binary,
+       fold_trinary, fold_name, exp_fold_tree_1, exp_fold_tree,
+       exp_mark_used_section): Likewise for "current_section" param.
+       (make_abs, new_abs, exp_binop, exp_unop, exp_get_vma, exp_get_fill,
+       exp_get_abs_int): Adjust for above changes.
+       * ldlang.c (lang_mark_used_section_1, print_assignment,
+       lang_size_sections_1, lang_do_assignments_1): Likewise.
+       * ldexp.c (fold_name): Init entire result struct.
+
 2005-06-01  Maciej W. Rozycki  <macro@linux-mips.org>
 
        * emulparams/elf32btsmip.sh: Unset DATA_ADDR.
index 558d475cb397a26d0c08d26ce2a7ac395d1a38bb..1790e8c2a32d57b017bb2fcedb69c94262981baf 100644 (file)
 #include "safe-ctype.h"
 
 static etree_value_type exp_fold_tree_1
-  (etree_type *, lang_output_section_statement_type *,
-   lang_phase_type, bfd_vma, bfd_vma *, bfd_boolean);
+  (etree_type *, asection *, lang_phase_type, bfd_vma, bfd_vma *, bfd_boolean);
 static etree_value_type exp_fold_tree_no_dot
-  (etree_type *, lang_output_section_statement_type *, lang_phase_type,
-   bfd_boolean);
+  (etree_type *, asection *, lang_phase_type, bfd_boolean);
 static bfd_vma align_n
   (bfd_vma, bfd_vma);
 
@@ -139,9 +137,8 @@ exp_print_token (token_code_type code, int infix_p)
 static void
 make_abs (etree_value_type *ptr)
 {
-  asection *s = ptr->section->bfd_section;
-  ptr->value += s->vma;
-  ptr->section = abs_output_section;
+  ptr->value += ptr->section->vma;
+  ptr->section = bfd_abs_section_ptr;
 }
 
 static etree_value_type
@@ -149,7 +146,7 @@ new_abs (bfd_vma value)
 {
   etree_value_type new;
   new.valid_p = TRUE;
-  new.section = abs_output_section;
+  new.section = bfd_abs_section_ptr;
   new.value = value;
   new.str = NULL;
   return new;
@@ -193,7 +190,7 @@ exp_relop (asection *section, bfd_vma value)
 static etree_value_type
 new_rel (bfd_vma value,
         char *str,
-        lang_output_section_statement_type *section)
+        asection *section)
 {
   etree_value_type new;
   new.valid_p = TRUE;
@@ -204,8 +201,7 @@ new_rel (bfd_vma value,
 }
 
 static etree_value_type
-new_rel_from_section (bfd_vma value,
-                     lang_output_section_statement_type *section)
+new_rel_from_section (bfd_vma value, asection *section)
 {
   etree_value_type new;
   new.valid_p = TRUE;
@@ -213,14 +209,14 @@ new_rel_from_section (bfd_vma value,
   new.str = NULL;
   new.section = section;
 
-  new.value -= section->bfd_section->vma;
+  new.value -= section->vma;
 
   return new;
 }
 
 static etree_value_type
 fold_unary (etree_type *tree,
-           lang_output_section_statement_type *current_section,
+           asection *current_section,
            lang_phase_type allocation_done,
            bfd_vma dot,
            bfd_vma *dotp,
@@ -246,8 +242,8 @@ fold_unary (etree_type *tree,
        case ABSOLUTE:
          if (allocation_done != lang_first_phase_enum)
            {
-             result.value += result.section->bfd_section->vma;
-             result.section = abs_output_section;
+             result.value += result.section->vma;
+             result.section = bfd_abs_section_ptr;
            }
          else
            result.valid_p = FALSE;
@@ -281,7 +277,7 @@ fold_unary (etree_type *tree,
 
        case DATA_SEGMENT_END:
          if (allocation_done != lang_first_phase_enum
-             && current_section == abs_output_section
+             && current_section == bfd_abs_section_ptr
              && (exp_data_seg.phase == exp_dataseg_align_seen
                  || exp_data_seg.phase == exp_dataseg_relro_seen
                  || exp_data_seg.phase == exp_dataseg_adjust
@@ -310,7 +306,7 @@ fold_unary (etree_type *tree,
 
 static etree_value_type
 fold_binary (etree_type *tree,
-            lang_output_section_statement_type *current_section,
+            asection *current_section,
             lang_phase_type allocation_done,
             bfd_vma dot,
             bfd_vma *dotp,
@@ -355,14 +351,14 @@ fold_binary (etree_type *tree,
             absolute.  However, adding or subtracting an absolute
             value from a relative value is meaningful, and is an
             exception.  */
-         if (current_section != abs_output_section
-             && (other.section == abs_output_section
-                 || (result.section == abs_output_section
+         if (current_section != bfd_abs_section_ptr
+             && (other.section == bfd_abs_section_ptr
+                 || (result.section == bfd_abs_section_ptr
                      && tree->type.node_code == '+'))
              && (tree->type.node_code == '+'
                  || tree->type.node_code == '-'))
            {
-             if (other.section != abs_output_section)
+             if (other.section != bfd_abs_section_ptr)
                {
                  /* Keep the section of the other term.  */
                  if (tree->type.node_code == '+')
@@ -373,7 +369,7 @@ fold_binary (etree_type *tree,
                }
            }
          else if (result.section != other.section
-                  || current_section == abs_output_section)
+                  || current_section == bfd_abs_section_ptr)
            {
              make_abs (&result);
              make_abs (&other);
@@ -429,7 +425,7 @@ fold_binary (etree_type *tree,
 
            case DATA_SEGMENT_ALIGN:
              if (allocation_done != lang_first_phase_enum
-                 && current_section == abs_output_section
+                 && current_section == bfd_abs_section_ptr
                  && (exp_data_seg.phase == exp_dataseg_none
                      || exp_data_seg.phase == exp_dataseg_adjust
                      || exp_data_seg.phase == exp_dataseg_relro_adjust
@@ -502,7 +498,7 @@ fold_binary (etree_type *tree,
 
 static etree_value_type
 fold_trinary (etree_type *tree,
-             lang_output_section_statement_type *current_section,
+             asection *current_section,
              lang_phase_type allocation_done,
              bfd_vma dot,
              bfd_vma *dotp,
@@ -525,14 +521,14 @@ fold_trinary (etree_type *tree,
 
 static etree_value_type
 fold_name (etree_type *tree,
-          lang_output_section_statement_type *current_section,
+          asection *current_section,
           lang_phase_type allocation_done,
           bfd_vma dot,
           bfd_boolean mark_used)
 {
   etree_value_type result;
 
-  result.valid_p = FALSE;
+  memset (&result, 0, sizeof (result));
 
   switch (tree->type.node_code)
     {
@@ -559,7 +555,7 @@ fold_name (etree_type *tree,
                              || h->type == bfd_link_hash_common)
                          && (def_iteration == lang_statement_iteration
                              || def_iteration == -1));
-         result.section = abs_output_section;
+         result.section = bfd_abs_section_ptr;
          result.valid_p = TRUE;
        }
       break;
@@ -594,19 +590,13 @@ fold_name (etree_type *tree,
                           tree->name.name);
                  else
                    {
-                     lang_output_section_statement_type *os;
-
-                     os = (lang_output_section_statement_lookup
-                           (bfd_get_section_name (output_bfd,
-                                                  output_section)));
-
                      /* FIXME: Is this correct if this section is
                         being linked with -R?  */
                      result = new_rel ((h->u.def.value
                                         + h->u.def.section->output_offset),
                                        NULL,
-                                       os);
-                     os->bfd_section->flags |= SEC_KEEP;
+                                       output_section);
+                     output_section->flags |= SEC_KEEP;
                    }
                }
            }
@@ -634,7 +624,7 @@ fold_name (etree_type *tree,
            {
              os->bfd_section->flags |= SEC_KEEP;
              if (os->processed > 0)
-               result = new_rel (0, NULL, os);
+               result = new_rel (0, NULL, os->bfd_section);
            }
        }
       break;
@@ -651,10 +641,10 @@ fold_name (etree_type *tree,
              if (os->processed != 0)
                {
                  if (os->load_base == NULL)
-                   result = new_rel (0, NULL, os);
+                   result = new_rel (0, NULL, os->bfd_section);
                  else
                    result = exp_fold_tree_no_dot (os->load_base,
-                                                  abs_output_section,
+                                                  bfd_abs_section_ptr,
                                                   allocation_done,
                                                   mark_used);
                }
@@ -714,7 +704,7 @@ fold_name (etree_type *tree,
 
 static etree_value_type
 exp_fold_tree_1 (etree_type *tree,
-                lang_output_section_statement_type *current_section,
+                asection *current_section,
                 lang_phase_type allocation_done,
                 bfd_vma dot,
                 bfd_vma *dotp,
@@ -786,7 +776,7 @@ exp_fold_tree_1 (etree_type *tree,
            einfo (_("%F%S can not PROVIDE assignment to location counter\n"));
          if (allocation_done == lang_allocating_phase_enum
              || (allocation_done == lang_final_phase_enum
-                 && current_section == abs_output_section))
+                 && current_section == bfd_abs_section_ptr))
            {
              /* Notify the folder that this is an assignment to dot.  */
              assigning_to_dot = TRUE;
@@ -806,10 +796,9 @@ exp_fold_tree_1 (etree_type *tree,
                    {
                      bfd_vma nextdot;
 
-                     nextdot = (result.value
-                                + current_section->bfd_section->vma);
+                     nextdot = result.value + current_section->vma;
                      if (nextdot < dot
-                         && current_section != abs_output_section)
+                         && current_section != bfd_abs_section_ptr)
                        einfo (_("%F%S cannot move location counter backwards (from %V to %V)\n"),
                               dot, nextdot);
                      else
@@ -857,7 +846,7 @@ exp_fold_tree_1 (etree_type *tree,
                  lang_update_definedness (tree->assign.dst, h);
                  h->type = bfd_link_hash_defined;
                  h->u.def.value = result.value;
-                 h->u.def.section = result.section->bfd_section;
+                 h->u.def.section = result.section;
                  if (tree->type.node_class == etree_provide)
                    tree->type.node_class = etree_provided;
                }
@@ -881,7 +870,7 @@ exp_fold_tree_1 (etree_type *tree,
 
 etree_value_type
 exp_fold_tree (etree_type *tree,
-              lang_output_section_statement_type *current_section,
+              asection *current_section,
               lang_phase_type allocation_done,
               bfd_vma dot,
               bfd_vma *dotp)
@@ -892,7 +881,7 @@ exp_fold_tree (etree_type *tree,
 
 static etree_value_type
 exp_fold_tree_no_dot (etree_type *tree,
-                     lang_output_section_statement_type *current_section,
+                     asection *current_section,
                      lang_phase_type allocation_done,
                      bfd_boolean mark_used)
 {
@@ -911,7 +900,7 @@ exp_binop (int code, etree_type *lhs, etree_type *rhs)
   value.binary.rhs = rhs;
   value.type.node_class = etree_binary;
   r = exp_fold_tree_no_dot (&value,
-                           abs_output_section,
+                           bfd_abs_section_ptr,
                            lang_first_phase_enum, FALSE);
   if (r.valid_p)
     {
@@ -950,7 +939,7 @@ exp_unop (int code, etree_type *child)
   value.unary.type.node_code = code;
   value.unary.child = child;
   value.unary.type.node_class = etree_unary;
-  r = exp_fold_tree_no_dot (&value, abs_output_section,
+  r = exp_fold_tree_no_dot (&value, bfd_abs_section_ptr,
                            lang_first_phase_enum, FALSE);
   if (r.valid_p)
     return exp_intop (r.value);
@@ -1119,7 +1108,7 @@ exp_get_vma (etree_type *tree,
 
   if (tree != NULL)
     {
-      r = exp_fold_tree_no_dot (tree, abs_output_section,
+      r = exp_fold_tree_no_dot (tree, bfd_abs_section_ptr,
                                allocation_done, FALSE);
       if (! r.valid_p && name != NULL)
        einfo (_("%F%S nonconstant expression for %s\n"), name);
@@ -1152,7 +1141,7 @@ exp_get_fill (etree_type *tree,
   if (tree == NULL)
     return def;
 
-  r = exp_fold_tree_no_dot (tree, abs_output_section, allocation_done,
+  r = exp_fold_tree_no_dot (tree, bfd_abs_section_ptr, allocation_done,
                            FALSE);
   if (! r.valid_p && name != NULL)
     einfo (_("%F%S nonconstant expression for %s\n"), name);
@@ -1204,11 +1193,11 @@ exp_get_abs_int (etree_type *tree,
                 lang_phase_type allocation_done)
 {
   etree_value_type res;
-  res = exp_fold_tree_no_dot (tree, abs_output_section, allocation_done,
+  res = exp_fold_tree_no_dot (tree, bfd_abs_section_ptr, allocation_done,
                              FALSE);
 
   if (res.valid_p)
-    res.value += res.section->bfd_section->vma;
+    res.value += res.section->vma;
   else
     einfo (_("%F%S non constant expression for %s\n"), name);
 
@@ -1226,9 +1215,7 @@ align_n (bfd_vma value, bfd_vma align)
 }
 
 void
-exp_mark_used_section
-  (etree_type *tree,
-   lang_output_section_statement_type *current_section)
+exp_mark_used_section (etree_type *tree, asection *current_section)
 {
   switch (tree->type.node_class)
     {
@@ -1294,7 +1281,7 @@ exp_mark_used_section
                  lang_update_definedness (tree->assign.dst, h);
                  h->type = bfd_link_hash_defined;
                  h->u.def.value = result.value;
-                 h->u.def.section = result.section->bfd_section;
+                 h->u.def.section = result.section;
                  if (tree->type.node_class == etree_provide)
                    tree->type.node_class = etree_provided;
                }
index 5a48f1d04a6251b7d2b9514f42b8c6b9ad076d9a..ae6b87408ccaa5214d545a06266e454cfbeff19f 100644 (file)
@@ -1,6 +1,6 @@
 /* ldexp.h -
    Copyright 1991, 1992, 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002,
-   2003, 2004 Free Software Foundation, Inc.
+   2003, 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of GLD, the Gnu Linker.
 
@@ -26,7 +26,7 @@
 typedef struct {
   bfd_vma value;
   char *str;
-  struct lang_output_section_statement_struct *section;
+  asection *section;
   bfd_boolean valid_p;
 } etree_value_type;
 
@@ -130,8 +130,7 @@ etree_type *exp_relop
 etree_value_type invalid
   (void);
 etree_value_type exp_fold_tree
-  (etree_type *, struct lang_output_section_statement_struct *,
-   lang_phase_type, bfd_vma, bfd_vma *);
+  (etree_type *, asection *, lang_phase_type, bfd_vma, bfd_vma *);
 etree_type *exp_binop
   (int, etree_type *, etree_type *);
 etree_type *exp_trinop
@@ -157,6 +156,6 @@ fill_type *exp_get_fill
 bfd_vma exp_get_abs_int
   (etree_type *, int, char *, lang_phase_type);
 void exp_mark_used_section
-  (etree_type *, struct lang_output_section_statement_struct *);
+  (etree_type *, asection *);
 
 #endif
index 25374cc34cb02c0987e02560a4ea8b3d43657288..b4f767d6e89b687b88f68be7f2d5770ab896fa06 100644 (file)
@@ -3080,7 +3080,7 @@ lang_mark_used_section_1
          break;
        case lang_data_statement_enum:
          exp_mark_used_section (s->data_statement.exp,
-                                abs_output_section);
+                                bfd_abs_section_ptr);
          break;
 
        case lang_reloc_statement_enum:
@@ -3095,7 +3095,7 @@ lang_mark_used_section_1
          break;
        case lang_assignment_statement_enum:
          exp_mark_used_section (s->assignment_statement.exp,
-                                output_section_statement);
+                                output_section_statement->bfd_section);
          break;
        case lang_padding_statement_enum:
          break;
@@ -3319,8 +3319,8 @@ print_assignment (lang_assignment_statement_type *assignment,
       computation_is_valid = is_dot || (scan_for_self_assignment (dst, tree) == FALSE);
     }
 
-  result = exp_fold_tree (tree, output_section, lang_final_phase_enum,
-                         print_dot, &print_dot);
+  result = exp_fold_tree (tree, output_section->bfd_section,
+                         lang_final_phase_enum, print_dot, &print_dot);
   if (result.valid_p)
     {
       bfd_vma value;
@@ -3330,7 +3330,7 @@ print_assignment (lang_assignment_statement_type *assignment,
          value = result.value;
 
          if (result.section)
-           value += result.section->bfd_section->vma;
+           value += result.section->vma;
 
          minfo ("0x%V", value);
          if (is_dot)
@@ -3347,7 +3347,7 @@ print_assignment (lang_assignment_statement_type *assignment,
              value = h->u.def.value;
 
              if (result.section)
-             value += result.section->bfd_section->vma;
+             value += result.section->vma;
 
              minfo ("[0x%V]", value);
            }
@@ -4149,7 +4149,7 @@ lang_size_sections_1
 
                    os->processed = -1;
                    r = exp_fold_tree (os->addr_tree,
-                                      abs_output_section,
+                                      bfd_abs_section_ptr,
                                       lang_allocating_phase_enum,
                                       dot, &dot);
                    os->processed = 0;
@@ -4159,7 +4159,7 @@ lang_size_sections_1
                               " address expression for section %s\n"),
                             os->name);
 
-                   dot = r.value + r.section->bfd_section->vma;
+                   dot = r.value + r.section->vma;
                  }
 
                /* The section starts here.
@@ -4199,7 +4199,7 @@ lang_size_sections_1
            os->processed = 1;
 
            if (os->update_dot_tree != 0)
-             exp_fold_tree (os->update_dot_tree, abs_output_section,
+             exp_fold_tree (os->update_dot_tree, bfd_abs_section_ptr,
                             lang_allocating_phase_enum, dot, &dot);
 
            /* Update dot in the region ?
@@ -4258,7 +4258,7 @@ lang_size_sections_1
 
            /* We might refer to provided symbols in the expression, and
               need to mark them as needed.  */
-           exp_fold_tree (s->data_statement.exp, abs_output_section,
+           exp_fold_tree (s->data_statement.exp, bfd_abs_section_ptr,
                           lang_allocating_phase_enum, dot, &dot);
 
            switch (s->data_statement.type)
@@ -4347,7 +4347,7 @@ lang_size_sections_1
            bfd_vma newdot = dot;
 
            exp_fold_tree (s->assignment_statement.exp,
-                          output_section_statement,
+                          output_section_statement->bfd_section,
                           lang_allocating_phase_enum,
                           dot,
                           &newdot);
@@ -4580,12 +4580,12 @@ lang_do_assignments_1
            etree_value_type value;
 
            value = exp_fold_tree (s->data_statement.exp,
-                                  abs_output_section,
+                                  bfd_abs_section_ptr,
                                   lang_final_phase_enum, dot, &dot);
            if (!value.valid_p)
              einfo (_("%F%P: invalid data statement\n"));
            s->data_statement.value
-             = value.value + value.section->bfd_section->vma;
+             = value.value + value.section->vma;
          }
          {
            unsigned int size;
@@ -4618,7 +4618,7 @@ lang_do_assignments_1
            etree_value_type value;
 
            value = exp_fold_tree (s->reloc_statement.addend_exp,
-                                  abs_output_section,
+                                  bfd_abs_section_ptr,
                                   lang_final_phase_enum, dot, &dot);
            s->reloc_statement.addend_value = value.value;
            if (!value.valid_p)
@@ -4644,7 +4644,7 @@ lang_do_assignments_1
        case lang_assignment_statement_enum:
          {
            exp_fold_tree (s->assignment_statement.exp,
-                          output_section_statement,
+                          output_section_statement->bfd_section,
                           lang_final_phase_enum,
                           dot,
                           &dot);