From 8e723a10451c6a7abadb6146fa62bbc0ab376f0b Mon Sep 17 00:00:00 2001 From: Chung-Lin Tang Date: Fri, 8 Mar 2013 10:17:00 +0000 Subject: 2013-03-08 Chung-Lin Tang * write.h (struct fix): Add fx_dot_frag field. (dot_frag): Declare. * write.c (dot_frag): New variable. (fix_new_internal): Set fx_dot_frag field with dot_frag. (fixup_segment): Base calculation of fx_offset with fx_dot_frag. * expr.c (expr): Save value of frag_now in dot_frag when setting dot_value. * read.c (emit_expr): Likewise. Delete comments. --- gas/ChangeLog | 11 +++++++++++ gas/expr.c | 5 ++++- gas/read.c | 3 +-- gas/write.c | 6 +++++- gas/write.h | 4 ++++ 5 files changed, 25 insertions(+), 4 deletions(-) (limited to 'gas') diff --git a/gas/ChangeLog b/gas/ChangeLog index 40276f4..ce3be4b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2013-03-08 Chung-Lin Tang + + * write.h (struct fix): Add fx_dot_frag field. + (dot_frag): Declare. + * write.c (dot_frag): New variable. + (fix_new_internal): Set fx_dot_frag field with dot_frag. + (fixup_segment): Base calculation of fx_offset with fx_dot_frag. + * expr.c (expr): Save value of frag_now in dot_frag when setting + dot_value. + * read.c (emit_expr): Likewise. Delete comments. + 2013-03-07 H.J. Lu * config/tc-i386.c (flag_code_names): Removed. diff --git a/gas/expr.c b/gas/expr.c index 105153e..500f938 100644 --- a/gas/expr.c +++ b/gas/expr.c @@ -1735,7 +1735,10 @@ expr (int rankarg, /* Larger # is higher rank. */ /* Save the value of dot for the fixup code. */ if (rank == 0) - dot_value = frag_now_fix (); + { + dot_value = frag_now_fix (); + dot_frag = frag_now; + } retval = operand (resultP, mode); diff --git a/gas/read.c b/gas/read.c index d65971c..2df748a 100644 --- a/gas/read.c +++ b/gas/read.c @@ -4087,10 +4087,9 @@ emit_expr (expressionS *exp, unsigned int nbytes) if (need_pass_2) return; - /* Grow the current frag now so that dot_value does not get invalidated - if the frag were to fill up in the frag_more() call below. */ frag_grow (nbytes); dot_value = frag_now_fix (); + dot_frag = frag_now; #ifndef NO_LISTING #ifdef OBJ_ELF diff --git a/gas/write.c b/gas/write.c index 1d27db7..22e68c5 100644 --- a/gas/write.c +++ b/gas/write.c @@ -122,6 +122,9 @@ symbolS *abs_section_sym; /* Remember the value of dot when parsing expressions. */ addressT dot_value; +/* The frag that dot_value is based from. */ +fragS *dot_frag; + /* Relocs generated by ".reloc" pseudo. */ struct reloc_list* reloc_list; @@ -169,6 +172,7 @@ fix_new_internal (fragS *frag, /* Which frag? */ fixP->fx_subsy = sub_symbol; fixP->fx_offset = offset; fixP->fx_dot_value = dot_value; + fixP->fx_dot_frag = dot_frag; fixP->fx_pcrel = pcrel; fixP->fx_r_type = r_type; fixP->fx_im_disp = 0; @@ -977,7 +981,7 @@ fixup_segment (fixS *fixP, segT this_segment) { add_number -= S_GET_VALUE (fixP->fx_subsy); fixP->fx_offset = (add_number + fixP->fx_dot_value - + fixP->fx_frag->fr_address); + + fixP->fx_dot_frag->fr_address); /* Make it pc-relative. If the back-end code has not selected a pc-relative reloc, cancel the adjustment diff --git a/gas/write.h b/gas/write.h index d721581..36de533 100644 --- a/gas/write.h +++ b/gas/write.h @@ -88,6 +88,9 @@ struct fix /* The value of dot when the fixup expression was parsed. */ addressT fx_dot_value; + /* The frag fx_dot_value is based on. */ + fragS *fx_dot_frag; + /* Next fixS in linked list, or NULL. */ struct fix *fx_next; @@ -162,6 +165,7 @@ struct reloc_list extern int finalize_syms; extern symbolS *abs_section_sym; extern addressT dot_value; +extern fragS *dot_frag; extern struct reloc_list* reloc_list; extern void append (char **charPP, char *fromP, unsigned long length); -- cgit v1.1