break;
default:
- as_fatal (_("Unknown opcode: `%s'"), str);
+ as_bad (_("Unknown opcode: `%s'"), str);
+ return;
}
/* Look up the opcode in the has table. */
valueT *valP;
segT seg ATTRIBUTE_UNUSED;
{
- unsigned char *buf;
+ char *fixpos;
struct hppa_fix_struct *hppa_fixP;
offsetT new_val;
int insn, val, fmt;
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)
{
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
}
/* 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?
{
symbol_get_bfdsym (symbol)->flags |= BSF_OBJECT;
S_SET_VALUE (symbol, size);
- S_SET_SEGMENT (symbol, bfd_und_section_ptr);
+ S_SET_SEGMENT (symbol, bfd_com_section_ptr);
S_SET_EXTERNAL (symbol);
/* colon() has already set the frag to the current location in the
any fixup which creates entries in the DLT (eg they use "T" field
selectors).
- Reject reductions involving symbols with external scope; such
- reductions make life a living hell for object file editors.
-
- FIXME. Also reject R_HPPA relocations which are 32bits wide in
- the code space. The SOM BFD backend doesn't know how to pull the
- right bits out of an instruction. */
+ ??? Reject reductions involving symbols with external scope; such
+ reductions make life a living hell for object file editors. */
int
hppa_fix_adjustable (fixp)
hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
-#ifdef OBJ_SOM
- /* Reject reductions of symbols in 32bit relocs unless they
- are fake labels. */
- if (fixp->fx_r_type == R_HPPA
- && hppa_fix->fx_r_format == 32
- && strncmp (S_GET_NAME (fixp->fx_addsy),
- FAKE_LABEL_NAME,
- strlen (FAKE_LABEL_NAME)))
- return 0;
-#endif
-
#ifdef OBJ_ELF
/* LR/RR selectors are implicitly used for a number of different relocation
types. We must ensure that none of these types are adjusted (see below)