diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e13519c22f..0085624c29 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,24 @@ +Wed Jan 19 17:28:59 1994 Ken Raeburn (raeburn@cujo.cygnus.com) + + * config/alphaosf.mh (HDEFINES): Don't define HOST_64_BIT here; + that's dealt with elsewhere. + * hosts/alphaosf.h (sprintf_vma, fprintf_vma): New macros. + (uint64_typeHIGH, uint64_typeLOW): Comment with HOST_64_BIT so + they get copied to bfd.h. + + * reloc.c (enum bfd_reloc_code_real): Add some Alpha relocation + types. Reorganized some of the existing ones. + * coff-alpha.c (alpha_howto_table): Construct 64-bit negative one + values in case of compilation on a 32-bit machine. Fix pcrel + fields of some reloc types. + (alpha_bfd_reloc_type_lookup): Handle more relocation types. + + * bfd-in.h (uint64_typeHIGH, uint64_typeLOW): Supply default + definitions when not defined, regardless of whether uint64_type is + a defined macro or not. + (fprintf_vma, sprintf_vma): Define only if fprintf_vma is not + already defined. + Wed Jan 19 00:02:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) * aoutx.h (translate_to_native_sym_flags): Set the type of a diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 7bad1b1859..06de0c6dd5 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -120,6 +120,8 @@ typedef unsigned HOST_64_BIT uint64_type; #if !defined (uint64_type) && defined (__GNUC__) #define uint64_type unsigned long long #define int64_type long long +#endif +#ifndef uint64_typeLOW #define uint64_typeLOW(x) ((unsigned long)(((x) & 0xffffffff))) #define uint64_typeHIGH(x) ((unsigned long)(((x) >> 32) & 0xffffffff)) #endif @@ -128,10 +130,12 @@ typedef unsigned HOST_64_BIT bfd_vma; typedef HOST_64_BIT bfd_signed_vma; typedef unsigned HOST_64_BIT bfd_size_type; typedef unsigned HOST_64_BIT symvalue; +#ifndef fprintf_vma #define fprintf_vma(s,x) \ fprintf(s,"%08lx%08lx", uint64_typeHIGH(x), uint64_typeLOW(x)) #define sprintf_vma(s,x) \ sprintf(s,"%08lx%08lx", uint64_typeHIGH(x), uint64_typeLOW(x)) +#endif #else /* not BFD64 */ /* Represent a target address. Also used as a generic unsigned type @@ -547,16 +551,26 @@ struct ecoff_debug_info; struct ecoff_debug_swap; struct ecoff_extr; struct symbol_cache_entry; +struct bfd_link_info; #endif -extern boolean bfd_ecoff_debug_accumulate +extern PTR bfd_ecoff_debug_init PARAMS ((bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, + struct bfd_link_info *)); +extern void bfd_ecoff_debug_free + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, + struct bfd_link_info *)); +extern boolean bfd_ecoff_debug_accumulate + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, const struct ecoff_debug_swap *output_swap, bfd *input_bfd, struct ecoff_debug_info *input_debug, const struct ecoff_debug_swap *input_swap, - boolean relocateable)); -extern boolean bfd_ecoff_debug_link_other - PARAMS ((bfd *output_bfd, struct ecoff_debug_info *output_debug, - const struct ecoff_debug_swap *output_swap, bfd *input_bfd)); + struct bfd_link_info *)); +extern boolean bfd_ecoff_debug_accumulate_other + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, bfd *input_bfd, + struct bfd_link_info *)); extern boolean bfd_ecoff_debug_externals PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, const struct ecoff_debug_swap *swap, @@ -575,6 +589,10 @@ extern bfd_size_type bfd_ecoff_debug_size extern boolean bfd_ecoff_write_debug PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, const struct ecoff_debug_swap *swap, file_ptr where)); +extern boolean bfd_ecoff_write_accumulated_debug + PARAMS ((PTR handle, bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, + struct bfd_link_info *info, file_ptr where)); /* And more from the source. */ void @@ -1259,6 +1277,7 @@ typedef enum bfd_reloc_code_real BFD_RELOC_64, BFD_RELOC_32, BFD_RELOC_16, + BFD_RELOC_14, BFD_RELOC_8, /* PC-relative relocations */ @@ -1283,6 +1302,10 @@ typedef enum bfd_reloc_code_real /* 32-bit pc-relative, shifted right 2 bits (i.e., 30-bit word displacement, e.g. for SPARC) */ BFD_RELOC_32_PCREL_S2, + /* signed 16-bit pc-relative, shifted right 2 bits (e.g. for MIPS) */ + BFD_RELOC_16_PCREL_S2, + /* this is used on the Alpha */ + BFD_RELOC_23_PCREL_S2, /* High 22 bits of 32-bit value, placed into lower 22 bits of target word; simple reloc. */ @@ -1290,6 +1313,13 @@ typedef enum bfd_reloc_code_real /* Low 10 bits. */ BFD_RELOC_LO10, + /* For systems that allocate a Global Pointer register, these are + displacements off that register. These relocation types are + handled specially, because the value the register will have is + decided relatively late. */ + BFD_RELOC_GPREL16, + BFD_RELOC_GPREL32, + /* Reloc types used for i960/b.out. */ BFD_RELOC_I960_CALLJ, @@ -1331,13 +1361,50 @@ typedef enum bfd_reloc_code_real BFD_RELOC_SPARC_LO7, /* end-sanitize-v9 */ + /* Alpha ECOFF relocations. Some of these treat the symbol or "addend" + in some special way. */ + /* For GPDISP_HI16 ("gpdisp") relocations, the symbol is ignored when + writing; when reading, it will be the absolute section symbol. The + addend is the displacement in bytes of the "lda" instruction from + the "ldah" instruction (which is at the address of this reloc). */ + BFD_RELOC_ALPHA_GPDISP_HI16, + /* For GPDISP_LO16 ("ignore") relocations, the symbol is handled as + with GPDISP_HI16 relocs. The addend is ignored when writing the + relocations out, and is filled in with the file's GP value on + reading, for convenience. */ + BFD_RELOC_ALPHA_GPDISP_LO16, + + /* The Alpha LITERAL/LITUSE relocs are produced by a symbol reference; + the assembler turns it into a LDQ instruction to load the address of + the symbol, and then fills in a register in the real instruction. + + The LITERAL reloc, at the LDQ instruction, refers to the .lita + section symbol. The addend is ignored when writing, but is filled + in with the file's GP value on reading, for convenience, as with the + GPDISP_LO16 reloc. + + The LITUSE reloc, on the instruction using the loaded address, gives + information to the linker that it might be able to use to optimize + away some literal section references. The symbol is ignored (read + as the absolute section symbol), and the "addend" indicates the type + of instruction using the register: + 1 - "memory" fmt insn + 2 - byte-manipulation (byte offset reg) + 3 - jsr (target of branch) + + The GNU linker currently doesn't do any of this optimizing. */ + BFD_RELOC_ALPHA_LITERAL, + BFD_RELOC_ALPHA_LITUSE, + + /* The HINT relocation indicates a value that should be filled into the + "hint" field of a jmp/jsr/ret instruction, for possible branch- + prediction logic which may be provided on some processors. */ + BFD_RELOC_ALPHA_HINT, + /* Bits 27..2 of the relocation address shifted right 2 bits; simple reloc otherwise. */ BFD_RELOC_MIPS_JMP, - /* signed 16-bit pc-relative, shifted right 2 bits (e.g. for MIPS) */ - BFD_RELOC_16_PCREL_S2, - /* High 16 bits of 32-bit value; simple reloc. */ BFD_RELOC_HI16, /* High 16 bits of 32-bit value but the low 16 bits will be sign @@ -1348,8 +1415,8 @@ typedef enum bfd_reloc_code_real /* Low 16 bits. */ BFD_RELOC_LO16, - /* 16 bit relocation relative to the global pointer. */ - BFD_RELOC_MIPS_GPREL, + /* relocation relative to the global pointer. */ +#define BFD_RELOC_MIPS_GPREL BFD_RELOC_GPREL16 /* Relocation against a MIPS literal section. */ BFD_RELOC_MIPS_LITERAL, @@ -1357,7 +1424,7 @@ typedef enum bfd_reloc_code_real /* MIPS ELF relocations. */ BFD_RELOC_MIPS_GOT16, BFD_RELOC_MIPS_CALL16, - BFD_RELOC_MIPS_GPREL32, +#define BFD_RELOC_MIPS_GPREL32 BFD_RELOC_GPREL32 /* These are, so far, specific to HPPA processors. I'm not sure that some don't duplicate other reloc types, such as BFD_RELOC_32 and _32_PCREL.