OSDN Git Service

* write.h (struct fix): Add fx_dot_value.
authoramodra <amodra>
Thu, 19 Sep 2002 23:51:35 +0000 (23:51 +0000)
committeramodra <amodra>
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 17a9ce0..7a23407 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 64c92ca..b8e49f5 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 17c3232..4ee6a7d 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 3a3b585..962ccd0 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;