This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
powerpc64-linux infrastructure 6 of 6
- To: binutils at sourceware dot cygnus dot com
- Subject: powerpc64-linux infrastructure 6 of 6
- From: Alan Modra <amodra at bigpond dot net dot au>
- Date: Wed, 8 Aug 2001 22:52:21 +0930
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
{