summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorChung-Lin Tang <cltang@codesourcery.com>2013-03-08 10:17:00 +0000
committerChung-Lin Tang <cltang@codesourcery.com>2013-03-08 10:17:00 +0000
commit4b728c64ce45b931b10bf83dcecb49e43bff5e87 (patch)
treef153e37bcc7163eb8144a1e85818107d1980bc13 /gas
parent4a8ac447d8600f9a1d659ef651fdf45b3d971fe6 (diff)
downloadbinutils-redhat-4b728c64ce45b931b10bf83dcecb49e43bff5e87.tar.gz
2013-03-08 Chung-Lin Tang <cltang@codesourcery.com>
* 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.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog11
-rw-r--r--gas/expr.c5
-rw-r--r--gas/read.c3
-rw-r--r--gas/write.c6
-rw-r--r--gas/write.h4
5 files changed, 25 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 40276f4046..ce3be4b53f 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,14 @@
+2013-03-08 Chung-Lin Tang <cltang@codesourcery.com>
+
+ * 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 <hongjiu.lu@intel.com>
* config/tc-i386.c (flag_code_names): Removed.
diff --git a/gas/expr.c b/gas/expr.c
index 105153ede3..500f93840b 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 d65971cfbe..2df748a9ad 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 1d27db782e..22e68c5ec8 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 d7215816da..36de533b32 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);