This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

AVR, PR14255


PR14255 has had a proposed fix attached for over 6 months without any
comment from the AVR maintainers, or from the submitter.  I guess the
bug isn't that important..  In looking at it again, I decided on this
better fix which gets rid of a horrible call to md_apply_fix in
tc_get_reloc.  Applied.

	PR gas/14255
	* config/tc-avr.h (TC_VALIDATE_FIX): Mark symbol used by reloc.
	Don't skip fixups with fx_subsy non-NULL.
	* config/tc-avr.c (tc_gen_reloc): Don't specially handle fixups
	with fx_subsy non-NULL.

Index: gas/config/tc-avr.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-avr.h,v
retrieving revision 1.19
diff -u -p -r1.19 tc-avr.h
--- gas/config/tc-avr.h	11 Sep 2012 17:01:00 -0000	1.19
+++ gas/config/tc-avr.h	5 Feb 2013 10:18:20 -0000
@@ -125,9 +125,9 @@ extern long md_pcrel_from_section (struc
 /* We don't want gas to fixup the following program memory related relocations.
    We will need them in case that we want to do linker relaxation.
    We could in principle keep these fixups in gas when not relaxing.
-   However, there is no serious performance penilty when making the linker
+   However, there is no serious performance penalty when making the linker
    make the fixup work.  Check also that fx_addsy is not NULL, in order to make
-   sure that the fixup refers to some sort of lable.  */
+   sure that the fixup refers to some sort of label.  */
 #define TC_VALIDATE_FIX(FIXP,SEG,SKIP)                       \
   if (   (FIXP->fx_r_type == BFD_RELOC_AVR_7_PCREL           \
        || FIXP->fx_r_type == BFD_RELOC_AVR_13_PCREL          \
@@ -143,9 +143,11 @@ extern long md_pcrel_from_section (struc
        || FIXP->fx_r_type == BFD_RELOC_AVR_8_HI              \
        || FIXP->fx_r_type == BFD_RELOC_AVR_8_HLO             \
        || FIXP->fx_r_type == BFD_RELOC_AVR_16_PM)            \
-      && (FIXP->fx_addsy))			             \
-    {                                                        \
-      goto SKIP;                                             \
+      && FIXP->fx_addsy != NULL				     \
+      && FIXP->fx_subsy == NULL)			     \
+    {							     \
+      symbol_mark_used_in_reloc (FIXP->fx_addsy);	     \
+      goto SKIP;					     \
     }
 
 /* This target is buggy, and sets fix size too large.  */
Index: gas/config/tc-avr.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-avr.c,v
retrieving revision 1.84
diff -u -p -r1.84 tc-avr.c
--- gas/config/tc-avr.c	23 Jan 2013 12:01:12 -0000	1.84
+++ gas/config/tc-avr.c	5 Feb 2013 10:18:20 -0000
@@ -1386,29 +1386,9 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UN
 {
   arelent *reloc;
 
-  if (fixp->fx_addsy && fixp->fx_subsy)
+  if (fixp->fx_subsy != NULL)
     {
-      long value = 0;
-
-      if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
-          || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
-        {
-          as_bad_where (fixp->fx_file, fixp->fx_line,
-              "Difference of symbols in different sections is not supported");
-          return NULL;
-        }
-
-      /* We are dealing with two symbols defined in the same section.
-         Let us fix-up them here.  */
-      value += S_GET_VALUE (fixp->fx_addsy);
-      value -= S_GET_VALUE (fixp->fx_subsy);
-
-      /* When fx_addsy and fx_subsy both are zero, md_apply_fix
-         only takes it's second operands for the fixup value.  */
-      fixp->fx_addsy = NULL;
-      fixp->fx_subsy = NULL;
-      md_apply_fix (fixp, (valueT *) &value, NULL);
-
+      as_bad_where (fixp->fx_file, fixp->fx_line, _("expression too complex"));
       return NULL;
     }
 

-- 
Alan Modra
Australia Development Lab, IBM


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]