[gdb/testsuite] Fix gdb.ada/mi_task_arg.exp
[deliverable/binutils-gdb.git] / gas / symbols.c
index d8a9c9244c00776796e67d7837cbf528dedb8abf..34ec145ad0426c0deacf9b06079516a07778bd31 100644 (file)
@@ -1097,19 +1097,6 @@ use_complex_relocs_for (symbolS * symp)
     case O_constant:
       return 0;
 
-    case O_symbol:
-    case O_symbol_rva:
-    case O_uminus:
-    case O_bit_not:
-    case O_logical_not:
-      if (  (S_IS_COMMON (symp->sy_value.X_add_symbol)
-          || S_IS_LOCAL (symp->sy_value.X_add_symbol))
-         &&
-             (S_IS_DEFINED (symp->sy_value.X_add_symbol)
-          && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section))
-       return 0;
-      break;
-
     case O_multiply:
     case O_divide:
     case O_modulus:
@@ -1129,18 +1116,22 @@ use_complex_relocs_for (symbolS * symp)
     case O_gt:
     case O_logical_and:
     case O_logical_or:
-
-      if (  (S_IS_COMMON (symp->sy_value.X_add_symbol)
-          || S_IS_LOCAL (symp->sy_value.X_add_symbol))
-         &&
-           (S_IS_COMMON (symp->sy_value.X_op_symbol)
+      if ((S_IS_COMMON (symp->sy_value.X_op_symbol)
           || S_IS_LOCAL (symp->sy_value.X_op_symbol))
-
-         && S_IS_DEFINED (symp->sy_value.X_add_symbol)
          && S_IS_DEFINED (symp->sy_value.X_op_symbol)
-         && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section
          && S_GET_SEGMENT (symp->sy_value.X_op_symbol) != expr_section)
-       return 0;
+       {
+       case O_symbol:
+       case O_symbol_rva:
+       case O_uminus:
+       case O_bit_not:
+       case O_logical_not:
+         if ((S_IS_COMMON (symp->sy_value.X_add_symbol)
+              || S_IS_LOCAL (symp->sy_value.X_add_symbol))
+             && S_IS_DEFINED (symp->sy_value.X_add_symbol)
+             && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section)
+           return 0;
+       }
       break;
 
     default:
@@ -1221,7 +1212,7 @@ valueT
 resolve_symbol_value (symbolS *symp)
 {
   int resolved;
-  valueT final_val = 0;
+  valueT final_val;
   segT final_seg;
 
   if (LOCAL_SYMBOL_CHECK (symp))
@@ -1245,10 +1236,18 @@ resolve_symbol_value (symbolS *symp)
 
   if (symp->sy_flags.sy_resolved)
     {
+      final_val = 0;
+      while (symp->sy_value.X_op == O_symbol
+            && symp->sy_value.X_add_symbol->sy_flags.sy_resolved)
+       {
+         final_val += symp->sy_value.X_add_number;
+         symp = symp->sy_value.X_add_symbol;
+       }
       if (symp->sy_value.X_op == O_constant)
-       return (valueT) symp->sy_value.X_add_number;
+       final_val += symp->sy_value.X_add_number;
       else
-       return 0;
+       final_val = 0;
+      return final_val;
     }
 
   resolved = 0;
@@ -1305,6 +1304,7 @@ resolve_symbol_value (symbolS *symp)
          resolved = 1;
        }
 
+      final_val = 0;
       final_seg = undefined_section;
       goto exit_dont_set_value;
     }
@@ -1392,11 +1392,16 @@ resolve_symbol_value (symbolS *symp)
             relocation to detect this case, and convert the
             relocation to be against the symbol to which this symbol
             is equated.  */
-         if (! S_IS_DEFINED (add_symbol)
+         if (seg_left == undefined_section
+             || bfd_is_com_section (seg_left)
 #if defined (OBJ_COFF) && defined (TE_PE)
              || S_IS_WEAK (add_symbol)
 #endif
-             || S_IS_COMMON (add_symbol))
+             || (finalize_syms
+                 && ((final_seg == expr_section
+                      && seg_left != expr_section
+                      && seg_left != absolute_section)
+                     || symbol_shadow_p (symp))))
            {
              if (finalize_syms)
                {
@@ -1407,25 +1412,6 @@ resolve_symbol_value (symbolS *symp)
                  symp->sy_value.X_op_symbol = add_symbol;
                }
              final_seg = seg_left;
-             final_val = 0;
-             resolved = symbol_resolved_p (add_symbol);
-             symp->sy_flags.sy_resolving = 0;
-             goto exit_dont_set_value;
-           }
-         else if (finalize_syms
-                  && ((final_seg == expr_section && seg_left != expr_section)
-                      || symbol_shadow_p (symp)))
-           {
-             /* If the symbol is an expression symbol, do similarly
-                as for undefined and common syms above.  Handles
-                "sym +/- expr" where "expr" cannot be evaluated
-                immediately, and we want relocations to be against
-                "sym", eg. because it is weak.  */
-             symp->sy_value.X_op = O_symbol;
-             symp->sy_value.X_add_symbol = add_symbol;
-             symp->sy_value.X_add_number = final_val;
-             symp->sy_value.X_op_symbol = add_symbol;
-             final_seg = seg_left;
              final_val += symp->sy_frag->fr_address + left;
              resolved = symbol_resolved_p (add_symbol);
              symp->sy_flags.sy_resolving = 0;
@@ -2324,14 +2310,14 @@ S_IS_LOCAL (symbolS *s)
   if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
     abort ();
 
-  if (bfd_get_section (s->bsym) == reg_section)
+  if (bfd_asymbol_section (s->bsym) == reg_section)
     return 1;
 
   if (flag_strip_local_absolute
       /* Keep BSF_FILE symbols in order to allow debuggers to identify
         the source file even when the object file is stripped.  */
       && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
-      && bfd_get_section (s->bsym) == absolute_section)
+      && bfd_asymbol_section (s->bsym) == absolute_section)
     return 1;
 
   name = S_GET_NAME (s);
@@ -3293,7 +3279,7 @@ symbol_relc_make_sym (symbolS * sym)
      is defined as an expression or a plain value.  */
   if (   S_GET_SEGMENT (sym) == expr_section
       || S_GET_SEGMENT (sym) == absolute_section)
-    return symbol_relc_make_expr (& sym->sy_value);
+    return symbol_relc_make_expr (symbol_get_value_expression (sym));
 
   /* This may be a "fake symbol", referring to ".".
      Write out a special null symbol to refer to this position.  */
This page took 0.032022 seconds and 4 git commands to generate.