/* tc-hppa.c -- Assemble for the PA
- Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
- Free Software Foundation, Inc.
+ Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
+ 2002 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
#if TARGET_ARCH_SIZE == 64
/* How to generate a relocation. */
#define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
+#define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
#else
#define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
+#define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
#endif
/* ELF objects can have versions, but apparently do not have anywhere
{
if (1
#ifdef OBJ_SOM
- && current_space == label_chain->lss_space && label_chain->lss_label
+ && current_space == label_chain->lss_space && label_chain->lss_label
#endif
#ifdef OBJ_ELF
- && now_seg == label_chain->lss_segment && label_chain->lss_label
+ && now_seg == label_chain->lss_segment && label_chain->lss_label
#endif
)
{
{
/* Handle a completer for an indexing load or store. */
+ case 'X':
case 'x':
{
int uu = 0;
}
/* Handle a short load/store completer. */
+ case 'M':
case 'm':
case 'q':
case 'J':
else if (*args == 'e')
break;
- /* 'J', 'm' and 'q' are the same, except for where they
+ /* 'J', 'm', 'M' and 'q' are the same, except for where they
encode the before/after field. */
- if (*args == 'm')
+ if (*args == 'm' || *args == 'M')
{
opcode |= m << 5;
INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
}
/* Handle a stbys completer. */
+ case 'A':
case 's':
{
int a = 0;
args++;
switch (*args)
{
- /* Handle FP compare conditions. */
- case 'f':
- cond = pa_parse_fp_cmp_cond (&s);
- INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
+ /* Handle FP compare conditions. */
+ case 'f':
+ cond = pa_parse_fp_cmp_cond (&s);
+ INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
/* Handle an add condition. */
case 'A':
case 'a':
- cmpltr = 0;
- flag = 0;
+ cmpltr = 0;
+ flag = 0;
if (*s == ',')
{
s++;
case R_N0SEL:
case R_N1SEL:
/* There is no symbol or addend associated with these fixups. */
- relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
- *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
+ relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+ *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
relocs[i]->addend = 0;
break;
case R_ENTRY:
case R_EXIT:
/* There is no symbol associated with these fixups. */
- relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
- *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
+ relocs[i]->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+ *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
relocs[i]->addend = fixp->fx_offset;
break;
void
md_apply_fix3 (fixP, valP, seg)
fixS *fixP;
- valueT *valp;
+ valueT *valP;
segT seg ATTRIBUTE_UNUSED;
{
unsigned char *buf;
return;
}
- buf = fixP->fx_frag->fr_literal + fixP->fx_where;
+ buf = (unsigned char *) (fixP->fx_frag->fr_literal + fixP->fx_where);
insn = bfd_get_32 (stdoutput, buf);
fmt = bfd_hppa_insn2fmt (stdoutput, insn);
input_line_pointer = *strp;
s = *strp;
while (*s != ',' && *s != ' ' && *s != '\t')
- s++;
+ s++;
c = *s;
*s = 0;
hppa_fix_adjustable (fixp)
fixS *fixp;
{
+ reloc_type code;
struct hppa_fix_struct *hppa_fix;
hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
#endif
#ifdef OBJ_ELF
- if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT
- || fixp->fx_r_type == (int) R_PARISC_GNU_VTENTRY)
- return 0;
+ /* 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)
+ even if they occur with a different selector. */
+ code = elf_hppa_reloc_final_type (stdoutput, fixp->fx_r_type,
+ hppa_fix->fx_r_format,
+ hppa_fix->fx_r_field);
+
+ switch (code)
+ {
+ /* Relocation types which use e_lrsel. */
+ case R_PARISC_DIR21L:
+ case R_PARISC_DLTREL21L:
+ case R_PARISC_DPREL21L:
+ case R_PARISC_PLTOFF21L:
+
+ /* Relocation types which use e_rrsel. */
+ case R_PARISC_DIR14R:
+ case R_PARISC_DIR14DR:
+ case R_PARISC_DIR14WR:
+ case R_PARISC_DIR17R:
+ case R_PARISC_DLTREL14R:
+ case R_PARISC_DLTREL14DR:
+ case R_PARISC_DLTREL14WR:
+ case R_PARISC_DPREL14R:
+ case R_PARISC_DPREL14DR:
+ case R_PARISC_DPREL14WR:
+ case R_PARISC_PLTOFF14R:
+ case R_PARISC_PLTOFF14DR:
+ case R_PARISC_PLTOFF14WR:
+
+ /* Other types that we reject for reduction. */
+ case R_PARISC_GNU_VTENTRY:
+ case R_PARISC_GNU_VTINHERIT:
+ return 0;
+ default:
+ break;
+ }
#endif
if (fixp->fx_addsy && (S_IS_EXTERNAL (fixp->fx_addsy)