This is the mail archive of the binutils@sources.redhat.com 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]

powerpc64-linux infrastructure 6 of 6


Make use of the opcode table relocs.

gas/ChangeLog
	From 1999-10-25  Torbjorn Granlund  <tege@swox.com>
	* config/tc-ppc.c (md_apply_fix3): Replace haphazard code for
	determining reloc type with code reading operands->reloc field.

Applying to mainline.

-- 
Alan Modra

Index: gas/config/tc-ppc.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-ppc.c,v
retrieving revision 1.27
diff -u -p -r1.27 tc-ppc.c
--- tc-ppc.c	2001/07/31 19:24:57	1.27
+++ tc-ppc.c	2001/08/08 08:46:49
@@ -4945,43 +4945,14 @@ md_apply_fix3 (fixp, valuep, seg)
       /* Determine a BFD reloc value based on the operand information.
 	 We are only prepared to turn a few of the operands into
 	 relocs.
-	 FIXME: We need to handle the DS field at the very least.
-	 FIXME: Selecting the reloc type is a bit haphazard; perhaps
-	 there should be a new field in the operand table.  */
-      if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
-	  && operand->bits == 26
-	  && operand->shift == 0)
-	fixp->fx_r_type = BFD_RELOC_PPC_B26;
-      else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
-	  && operand->bits == 16
-	  && operand->shift == 0)
-	fixp->fx_r_type = BFD_RELOC_PPC_B16;
-      else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
-	       && operand->bits == 26
-	       && operand->shift == 0)
-	fixp->fx_r_type = BFD_RELOC_PPC_BA26;
-      else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
-	       && operand->bits == 16
-	       && operand->shift == 0)
-	fixp->fx_r_type = BFD_RELOC_PPC_BA16;
-      else if ((operand->flags & PPC_OPERAND_PARENS) != 0
-	       && operand->bits == 16
-	       && operand->shift == 0
-	       && fixp->fx_addsy != NULL
-	       && ppc_is_toc_sym (fixp->fx_addsy))
+	 For other operand types, give an error.  */
+      if (operand->reloc == 0)
 	{
-	  fixp->fx_size = 2;
-	  if (target_big_endian)
-	    fixp->fx_where += 2;
-	  fixp->fx_r_type = BFD_RELOC_PPC_TOC16;
-	}
-      else
-	{
 	  char *sfile;
 	  unsigned int sline;
 
 	  /* Use expr_symbol_where to see if this is an expression
-             symbol.  */
+	     symbol.  */
 	  if (expr_symbol_where (fixp->fx_addsy, &sfile, &sline))
 	    as_bad_where (fixp->fx_file, fixp->fx_line,
 			  _("unresolved expression that must be resolved"));
@@ -4991,6 +4962,28 @@ md_apply_fix3 (fixp, valuep, seg)
 	  fixp->fx_done = 1;
 	  return 1;
 	}
+
+      fixp->fx_r_type = operand->reloc;
+
+      if ((operand->flags & PPC_OPERAND_PARENS) != 0 && fixp->fx_addsy != NULL)
+	{
+	  /* For ld/st/la reloc types (`la' == load address).
+	     Instruction with D or DS field.  */
+	  if (ppc_is_toc_sym (fixp->fx_addsy))
+	    {
+	      fixp->fx_size = 2;
+	      if (target_big_endian)
+		fixp->fx_where += 2;
+	    }
+	  else
+	    {
+	      as_bad_where (fixp->fx_file, fixp->fx_line,
+			    _("unsupported relocation against %s"),
+			    S_GET_NAME (fixp->fx_addsy));
+	      fixp->fx_done = 1;
+	      return 1;
+	    }
+	}
     }
   else
     {


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