* expr.c (expr): Set return value to absolute_section for
authorAlan Modra <amodra@gmail.com>
Fri, 25 May 2001 00:01:30 +0000 (00:01 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 25 May 2001 00:01:30 +0000 (00:01 +0000)
subtractive operations on symbols within a segment.
* read.c (pseudo_set): Set segment for complex expressions.

gas/ChangeLog
gas/expr.c
gas/read.c

index 6f5b600418cd67f05fbf356cc94be7ac383df16c..6abbd8ec7d5a3fe4697c1fbbc98083e3d6b277f4 100644 (file)
@@ -1,5 +1,9 @@
 2001-05-25  Alan Modra  <amodra@one.net.au>
 
+       * expr.c (expr): Set return value to absolute_section for
+       subtractive operations on symbols within a segment.
+       * read.c (pseudo_set): Set segment for complex expressions.
+
        From 2.11 branch 2001-03-30  Richard Henderson  <rth@redhat.com>
        * config/tc-i386.c (md_convert_frag): Don't die on local symbols
        that have been finalized.
index f79e31cbe3aff6c8360a9483e899ebdd1b7c6675..7e6ad90337372364ca62e6992bce9abad288e2cb 100644 (file)
@@ -1862,6 +1862,19 @@ expr (rankarg, resultP)
            resultP->X_add_number += right.X_add_number;
          else if (op_left == O_subtract)
            resultP->X_add_number -= right.X_add_number;
+         if (retval == rightseg
+             && (op_left == O_subtract
+                 || op_left == O_eq
+                 || op_left == O_ne
+                 || op_left == O_lt
+                 || op_left == O_le
+                 || op_left == O_ge
+                 || op_left == O_gt))
+           {
+             /* For subtractive operations on symbols within a
+                segment, the result will absolute.  */
+             retval = absolute_section;
+           }
        }
       else
        {
index 209ab6ad08aa1cad465aa1c7549d982658aace0b..c14d2c0028f6a54ed54e390d7b4ba18dcf7c8f56 100644 (file)
@@ -3151,6 +3151,7 @@ pseudo_set (symbolP)
      symbolS *symbolP;
 {
   expressionS exp;
+  segT seg;
 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
   int ext;
 #endif /* OBJ_AOUT or OBJ_BOUT */
@@ -3160,7 +3161,7 @@ pseudo_set (symbolP)
   ext = S_IS_EXTERNAL (symbolP);
 #endif /* OBJ_AOUT or OBJ_BOUT */
 
-  (void) expression (&exp);
+  seg = expression (&exp);
 
   if (exp.X_op == O_illegal)
     as_bad (_("illegal expression; zero assumed"));
@@ -3236,9 +3237,9 @@ pseudo_set (symbolP)
       break;
 
     default:
-      /* The value is some complex expression.
-        FIXME: Should we set the segment to anything?  */
+      /* The value is some complex expression.  */
       symbol_set_value_expression (symbolP, &exp);
+      S_SET_SEGMENT (symbolP, seg);
       break;
     }
 }