From: Catherine Moore Date: Tue, 19 May 1998 13:03:09 +0000 (+0000) Subject: Use number_to_chars_bigendian and number_to_chars_littleendian to X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a5002978e02876e17539e69308713ddbd6d91d91;p=binutils-gdb.git Use number_to_chars_bigendian and number_to_chars_littleendian to write data in sparc_handle_align. --- diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index 48864be4a74..a7df86cbed3 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -2517,6 +2517,21 @@ md_apply_fix3 (fixP, value, segment) && ! S_IS_COMMON (fixP->fx_addsy) && (fixP->fx_addsy->bsym->flags & BSF_SECTION_SYM) == 0) fixP->fx_addnumber -= 2 * S_GET_VALUE (fixP->fx_addsy); + + /* When generating PIC code, we need to fiddle to get + bfd_install_relocation to do the right thing for a PC relative + reloc against a local symbol which we are going to keep. */ + if (sparc_pic_code + && fixP->fx_r_type == BFD_RELOC_32_PCREL_S2 + && fixP->fx_addsy != NULL + && (S_IS_EXTERNAL (fixP->fx_addsy) + || S_IS_WEAK (fixP->fx_addsy)) + && S_IS_DEFINED (fixP->fx_addsy) + && ! S_IS_COMMON (fixP->fx_addsy)) + { + val = 0; + fixP->fx_addnumber -= 2 * S_GET_VALUE (fixP->fx_addsy); + } #endif /* If this is a data relocation, just output VAL. */ @@ -2830,6 +2845,14 @@ tc_gen_reloc (section, fixp) || code == BFD_RELOC_SPARC_PC10 || code == BFD_RELOC_SPARC_PC22) reloc->addend = fixp->fx_addnumber; + else if (sparc_pic_code + && fixp->fx_r_type == BFD_RELOC_32_PCREL_S2 + && fixp->fx_addsy != NULL + && (S_IS_EXTERNAL (fixp->fx_addsy) + || S_IS_WEAK (fixp->fx_addsy)) + && S_IS_DEFINED (fixp->fx_addsy) + && ! S_IS_COMMON (fixp->fx_addsy)) + reloc->addend = fixp->fx_addnumber; else reloc->addend = fixp->fx_offset - reloc->address; @@ -3353,11 +3376,21 @@ sparc_handle_align (fragp) unsigned *p = (unsigned *)(fragp->fr_literal + fragp->fr_fix); int i; - for (i = 0; i < count; i += 4) - *p++ = 0x01000000; /* nop */ + for (i = 0; i < count; i += 4, p++) + if (INSN_BIG_ENDIAN) + number_to_chars_bigendian ((char *)p, 0x01000000, 4); /* emit nops */ + else + number_to_chars_littleendian ((char *)p, 0x10000000, 4); + if (SPARC_OPCODE_ARCH_V9_P (max_architecture) && count > 8) - *(unsigned *)(fragp->fr_literal + fragp->fr_fix) = - 0x30680000 | (count >> 2); /* ba,a,pt %xcc, 1f */ + { + char *waddr = &fragp->fr_literal + fragp->fr_fix; + unsigned wval = (0x30680000 | count >> 2); /* ba,a,pt %xcc, 1f */ + if (INSN_BIG_ENDIAN) + number_to_chars_bigendian (waddr, wval, 4); + else + number_to_chars_littleendian (waddr, wval, 4); + } fragp->fr_var = count; } }