* write.h (struct fix): Add fx_dot_value.
authorAlan Modra <amodra@gmail.com>
Thu, 19 Sep 2002 23:51:35 +0000 (23:51 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 19 Sep 2002 23:51:35 +0000 (23:51 +0000)
(dot_value): Declare.
* write.c (dot_value): New var.
(fix_new_internal): Save dot_value as fx_dot_value.
* expr.c (expr): Update dot_value.

gas/ChangeLog
gas/expr.c
gas/write.c
gas/write.h

index 17a9ce0f9878c0054a12d1d1f124a7224671e15c..7a2340704c71dc19dc690cac3c86a45de023ba5a 100644 (file)
@@ -1,3 +1,11 @@
+2002-09-20  Alan Modra  <amodra@bigpond.net.au>
+
+       * write.h (struct fix): Add fx_dot_value.
+       (dot_value): Declare.
+       * write.c (dot_value): New var.
+       (fix_new_internal): Save dot_value as fx_dot_value.
+       * expr.c (expr): Update dot_value.
+
 2002-09-19  Jakub Jelinek  <jakub@redhat.com>
 
        * config/tc-i386.c (tc_i386_fix_adjustable): Handle
index 64c92cae34929524e1a4879fa27886abf0bbb806..b8e49f515659c6cd93323fbdc167e8efbb4d9d5f 100644 (file)
@@ -1657,6 +1657,10 @@ expr (rankarg, resultP)
 
   know (rank >= 0);
 
+  /* Save the value of dot for the fixup code.  */
+  if (rank == 0)
+    dot_value = frag_now_fix ();
+
   retval = operand (resultP);
 
   /* operand () gobbles spaces.  */
index 17c323209fe52ac8d61439ab84701540384b96a1..4ee6a7d6a0fca39222d71794252f77fb200eeb23 100644 (file)
@@ -111,6 +111,9 @@ int symbol_table_frozen;
 
 symbolS *abs_section_sym;
 
+/* Remember the value of dot when parsing expressions.  */
+addressT dot_value;
+
 void print_fixup PARAMS ((fixS *));
 
 #ifdef BFD_ASSEMBLER
@@ -220,6 +223,7 @@ fix_new_internal (frag, where, size, add_symbol, sub_symbol, offset, pcrel,
   fixP->fx_addsy = add_symbol;
   fixP->fx_subsy = sub_symbol;
   fixP->fx_offset = offset;
+  fixP->fx_dot_value = dot_value;
   fixP->fx_pcrel = pcrel;
   fixP->fx_plt = 0;
 #if defined(NEED_FX_R_TYPE) || defined (BFD_ASSEMBLER)
@@ -2656,7 +2660,8 @@ fixup_segment (fixP, this_segment)
                   && !TC_FORCE_RELOCATION_SUB_LOCAL (fixP))
            {
              add_number -= S_GET_VALUE (fixP->fx_subsy);
-             fixP->fx_offset = add_number;
+             fixP->fx_offset = (add_number + fixP->fx_dot_value
+                                + fixP->fx_frag->fr_address);
 
              /* Make it pc-relative.  If the back-end code has not
                 selected a pc-relative reloc, cancel the adjustment
index 3a3b5856530b281a2090473babcc06ace824d56b..962ccd0fb10bc939c6ff53fbdafcafe406cec846 100644 (file)
@@ -105,6 +105,9 @@ struct fix
   /* Absolute number we add in.  */
   valueT fx_offset;
 
+  /* The value of dot when the fixup expression was parsed.  */
+  addressT fx_dot_value;
+
   /* Next fixS in linked list, or NULL.  */
   struct fix *fx_next;
 
@@ -159,6 +162,7 @@ typedef struct fix fixS;
 
 extern int finalize_syms;
 extern symbolS *abs_section_sym;
+extern addressT dot_value;
 
 #ifndef BFD_ASSEMBLER
 extern char *next_object_file_charP;