bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gas: undetected undefined symbol with .space


From: Alan Modra
Subject: Re: gas: undetected undefined symbol with .space
Date: Wed, 3 Apr 2002 13:39:33 +0930
User-agent: Mutt/1.3.25i

On Mon, Apr 01, 2002 at 02:49:20PM -0700, Greg McGary wrote:
> undef: .space UNDEF
> undefx4: .space UNDEF * 4
> 
> With latest gas in CVS, the `UNDEF * 4' passes without an error:

This should fix it.

        * symbols.c (resolve_symbol_value <O_uminus, O_bit_not,
        O_logical_not>): Derive final_seg from add_symbol.
        <O_multiply..O_logical_or>: More final_seg twiddles.

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre

Index: gas/symbols.c
===================================================================
RCS file: /cvs/src/src/gas/symbols.c,v
retrieving revision 1.31
diff -u -p -r1.31 symbols.c
--- symbols.c   2001/09/19 05:33:20     1.31
+++ symbols.c   2002/04/03 03:27:51
@@ -986,6 +986,7 @@ resolve_symbol_value (symp)
        case O_bit_not:
        case O_logical_not:
          left = resolve_symbol_value (add_symbol);
+         seg_left = S_GET_SEGMENT (add_symbol);
 
          if (op == O_uminus)
            left = -left;
@@ -996,7 +997,7 @@ resolve_symbol_value (symp)
 
          final_val += left + symp->sy_frag->fr_address;
          if (final_seg == expr_section || final_seg == undefined_section)
-           final_seg = absolute_section;
+           final_seg = seg_left;
 
          resolved = symbol_resolved_p (add_symbol);
          break;
@@ -1062,15 +1063,19 @@ resolve_symbol_value (symp)
 
             Don't emit messages unless we're finalizing the symbol value,
             otherwise we may get the same message multiple times.  */
-         if (op != O_eq && op != O_ne
-             && (seg_left != absolute_section
-                 || seg_right != absolute_section)
-             && ((op != O_subtract
-                  && op != O_lt && op != O_le && op != O_ge && op != O_gt)
-                 || seg_left != seg_right
-                 || (seg_left == undefined_section
-                     && add_symbol != op_symbol))
-             && finalize_syms)
+         if ((op == O_eq || op == O_ne)
+             || ((op == O_subtract
+                  || op == O_lt || op == O_le || op == O_ge || op == O_gt)
+                 && seg_left == seg_right
+                 && (seg_left != undefined_section
+                     || add_symbol == op_symbol))
+             || (seg_left == absolute_section
+                 && seg_right == absolute_section))
+           {
+             if (final_seg == expr_section || final_seg == undefined_section)
+               final_seg = absolute_section;
+           }
+         else if (finalize_syms)
            {
              char *file;
              unsigned int line;
@@ -1105,6 +1110,9 @@ resolve_symbol_value (symp)
                    as_bad (_("invalid section for operation setting `%s'"),
                            S_GET_NAME (symp));
                }
+             /* Prevent the error propagating.  */
+             if (final_seg == expr_section || final_seg == undefined_section)
+               final_seg = absolute_section;
            }
 
          /* Check for division by zero.  */
@@ -1160,7 +1168,15 @@ resolve_symbol_value (symp)
 
          final_val += symp->sy_frag->fr_address + left;
          if (final_seg == expr_section || final_seg == undefined_section)
-           final_seg = absolute_section;
+           {
+             if (seg_left == undefined_section
+                 || seg_right == undefined_section)
+               final_seg = undefined_section;
+             else if (seg_left == absolute_section)
+               final_seg = seg_right;
+             else
+               final_seg = seg_left;
+           }
          resolved = (symbol_resolved_p (add_symbol)
                      && symbol_resolved_p (op_symbol));
          break;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]