2002-08-13 H.J. Lu <hjl@gnu.org>
[deliverable/binutils-gdb.git] / ld / ldexp.c
index c4876a877e30f2d2032b0e85be1eca4974e326b0..8e3ea6308e86ebb5ad8d221a4b738f65fcfef62c 100644 (file)
@@ -41,7 +41,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "libiberty.h"
 #include "safe-ctype.h"
 
-static void exp_print_token PARAMS ((token_code_type code));
+static void exp_print_token PARAMS ((token_code_type code, int infix_p));
 static void make_abs PARAMS ((etree_value_type *ptr));
 static etree_value_type new_abs PARAMS ((bfd_vma value));
 static void check PARAMS ((lang_output_section_statement_type *os,
@@ -67,11 +67,15 @@ static etree_value_type exp_fold_tree_no_dot
 
 struct exp_data_seg exp_data_seg;
 
+/* Print the string representation of the given token.  Surround it
+   with spaces if INFIX_P is true.  */
+
 static void
-exp_print_token (code)
+exp_print_token (code, infix_p)
      token_code_type code;
+     int infix_p;
 {
-  static CONST struct
+  static const struct
   {
     token_code_type code;
     char * name;
@@ -122,20 +126,22 @@ exp_print_token (code)
   };
   unsigned int idx;
 
-  for (idx = ARRAY_SIZE (table); idx--;)
-    {
-      if (table[idx].code == code)
-       {
-         fprintf (config.map_file, " %s ", table[idx].name);
-         return;
-       }
-    }
+  for (idx = 0; idx < ARRAY_SIZE (table); idx++)
+    if (table[idx].code == code)
+      break;
+
+  if (infix_p)
+    fputc (' ', config.map_file);
 
-  /* Not in table, just print it alone.  */
-  if (code < 127)
-    fprintf (config.map_file, " %c ", code);
+  if (idx < ARRAY_SIZE (table))
+    fputs (table[idx].name, config.map_file);
+  else if (code < 127)
+    fputc (code, config.map_file);
   else
-    fprintf (config.map_file, " <code %d> ", code);
+    fprintf (config.map_file, "<code %d>", code);
+
+  if (infix_p)
+    fputc (' ', config.map_file);
 }
 
 static void
@@ -344,7 +350,7 @@ fold_binary (tree, current_section, allocation_done, dot, dotp)
                {
                  bfd_vma maxpage = result.value;
 
-                 result.value = ALIGN_N (dot, maxpage);
+                 result.value = align_n (dot, maxpage);
                  if (exp_data_seg.phase != exp_dataseg_adjust)
                    {
                      result.value += dot & (maxpage - 1);
@@ -587,14 +593,14 @@ exp_fold_tree (tree, current_section, allocation_done, dot, dotp)
            {
            case ALIGN_K:
              if (allocation_done != lang_first_phase_enum)
-               result = new_rel_from_section (ALIGN_N (dot, result.value),
+               result = new_rel_from_section (align_n (dot, result.value),
                                               current_section);
              else
                result.valid_p = false;
              break;
 
            case ABSOLUTE:
-             if (allocation_done != lang_first_phase_enum && result.valid_p)
+             if (allocation_done != lang_first_phase_enum)
                {
                  result.value += result.section->bfd_section->vma;
                  result.section = abs_output_section;
@@ -623,7 +629,7 @@ exp_fold_tree (tree, current_section, allocation_done, dot, dotp)
              if (allocation_done == lang_allocating_phase_enum)
                {
                  make_abs (&result);
-                 result.value = ALIGN_N (dot, result.value);
+                 result.value = align_n (dot, result.value);
                }
              else
                result.valid_p = false;
@@ -846,7 +852,7 @@ exp_unop (code, child)
 etree_type *
 exp_nameop (code, name)
      int code;
-     CONST char *name;
+     const char *name;
 {
   etree_type value, *new;
   etree_value_type r;
@@ -869,7 +875,7 @@ exp_nameop (code, name)
 etree_type *
 exp_assop (code, dst, src)
      int code;
-     CONST char *dst;
+     const char *dst;
      etree_type *src;
 {
   etree_type value, *new;
@@ -929,13 +935,13 @@ exp_print_tree (tree)
 {
   if (config.map_file == NULL)
     config.map_file = stderr;
-  
+
   if (tree == NULL)
     {
       minfo ("NULL TREE\n");
       return;
     }
-  
+
   switch (tree->type.node_class)
     {
     case etree_value:
@@ -955,7 +961,7 @@ exp_print_tree (tree)
        fprintf (config.map_file, "%s (UNDEFINED)", tree->assign.dst->name);
 #endif
       fprintf (config.map_file, "%s", tree->assign.dst);
-      exp_print_token (tree->type.node_code);
+      exp_print_token (tree->type.node_code, true);
       exp_print_tree (tree->assign.src);
       break;
     case etree_provide:
@@ -967,7 +973,7 @@ exp_print_tree (tree)
     case etree_binary:
       fprintf (config.map_file, "(");
       exp_print_tree (tree->binary.lhs);
-      exp_print_token (tree->type.node_code);
+      exp_print_token (tree->type.node_code, true);
       exp_print_tree (tree->binary.rhs);
       fprintf (config.map_file, ")");
       break;
@@ -979,10 +985,10 @@ exp_print_tree (tree)
       exp_print_tree (tree->trinary.rhs);
       break;
     case etree_unary:
-      exp_print_token (tree->unary.type.node_code);
+      exp_print_token (tree->unary.type.node_code, false);
       if (tree->unary.child)
        {
-         fprintf (config.map_file, "(");
+         fprintf (config.map_file, " (");
          exp_print_tree (tree->unary.child);
          fprintf (config.map_file, ")");
        }
@@ -1004,9 +1010,9 @@ exp_print_tree (tree)
        }
       else
        {
-         exp_print_token (tree->type.node_code);
+         exp_print_token (tree->type.node_code, false);
          if (tree->name.name)
-           fprintf (config.map_file, "(%s)", tree->name.name);
+           fprintf (config.map_file, " (%s)", tree->name.name);
        }
       break;
     default:
@@ -1121,3 +1127,14 @@ exp_get_abs_int (tree, def, name, allocation_done)
 
   return res.value;
 }
+
+bfd_vma align_n (value, align)
+     bfd_vma value;
+     bfd_vma align;
+{
+  if (align <= 1)
+    return value;
+
+  value = (value + align - 1) / align;
+  return value * align;
+}
This page took 0.025289 seconds and 4 git commands to generate.