This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[committed] Fix PR gas/1804
- From: "John David Anglin" <dave at hiauly1 dot hia dot nrc dot ca>
- To: binutils at sources dot redhat dot com
- Date: Mon, 7 Nov 2005 13:57:26 -0500 (EST)
- Subject: [committed] Fix PR gas/1804
The following patch fixes the handling of double word label differences
on hppa64. Tested on hppa64-hp-hpux11.11 and hpux2.0w-hp-hpux11.11.
Dave
--
J. David Anglin dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada (613) 990-0752 (FAX: 952-6602)
2005-11-07 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR gas/1804
* config/tc-hppa.c (md_apply_fix): Use number_to_chars_bigendian to
output constant data.
Index: config/tc-hppa.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-hppa.c,v
retrieving revision 1.126
diff -u -3 -p -r1.126 tc-hppa.c
--- config/tc-hppa.c 13 Oct 2005 01:06:01 -0000 1.126
+++ config/tc-hppa.c 7 Nov 2005 18:30:29 -0000
@@ -4436,7 +4436,7 @@ md_apply_fix (fixP, valP, seg)
valueT *valP;
segT seg ATTRIBUTE_UNUSED;
{
- unsigned char *buf;
+ char *fixpos;
struct hppa_fix_struct *hppa_fixP;
offsetT new_val;
int insn, val, fmt;
@@ -4470,8 +4470,7 @@ md_apply_fix (fixP, valP, seg)
if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
fixP->fx_done = 1;
- /* There should have been an HPPA specific fixup associated
- with the GAS fixup. */
+ /* There should be a HPPA specific fixup associated with the GAS fixup. */
hppa_fixP = (struct hppa_fix_struct *) fixP->tc_fix_data;
if (hppa_fixP == NULL)
{
@@ -4481,8 +4480,16 @@ md_apply_fix (fixP, valP, seg)
return;
}
- buf = (unsigned char *) (fixP->fx_frag->fr_literal + fixP->fx_where);
- insn = bfd_get_32 (stdoutput, buf);
+ fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
+
+ if (fixP->fx_size != 4 || hppa_fixP->fx_r_format == 32)
+ {
+ /* Handle constant output. */
+ number_to_chars_bigendian (fixpos, *valP, fixP->fx_size);
+ return;
+ }
+
+ insn = bfd_get_32 (stdoutput, fixpos);
fmt = bfd_hppa_insn2fmt (stdoutput, insn);
/* If there is a symbol associated with this fixup, then it's something
@@ -4652,7 +4659,7 @@ md_apply_fix (fixP, valP, seg)
}
/* Insert the relocation. */
- bfd_put_32 (stdoutput, insn, buf);
+ bfd_put_32 (stdoutput, insn, fixpos);
}
/* Exactly what point is a PC-relative offset relative TO?