From 0f4161ddd0308c2b277d8f634aeb22149171bf9d Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 6 Mar 1995 17:00:18 +0000 Subject: [PATCH] * cpu-hppa.c (arch_info_struct): Support both PA1.0 and PA1.1 machine types. (bfd_hppa_arch): Link in both PA1.0 and PA1.1 architecture info structures. * libhppa.h (enum pa_arch): New enumeration to describe the different variants of the PA architecture. * som.c (som_object_setup): Use new enumeration to set machine type. (som_finish_writing): If the machine type is PA1.1, then use the PA1.1 machine identifier in the output file. --- bfd/ChangeLog | 18 ++++++++++++++++ bfd/som.c | 60 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 67 insertions(+), 11 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 944da98f229..541611d884b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,23 @@ +Mon Mar 6 09:53:08 1995 Jeff Law (law@snake.cs.utah.edu) + + * cpu-hppa.c (arch_info_struct): Support both PA1.0 and PA1.1 + machine types. + (bfd_hppa_arch): Link in both PA1.0 and PA1.1 architecture info + structures. + * libhppa.h (enum pa_arch): New enumeration to describe the + different variants of the PA architecture. + * som.c (som_object_setup): Use new enumeration to set machine + type. + (som_finish_writing): If the machine type is PA1.1, then use the + PA1.1 machine identifier in the output file. + Thu Mar 2 15:58:24 1995 Ian Lance Taylor + * aoutx.h (NAME(aout,swap_ext_reloc_in)): Treat the index of a + base relative reloc as an index into the symbol table, regardless + of the setting of r_extern. + (NAME(aout,swap_std_reloc_in)): Likewise. + * aoutx.h (NAME(aout,set_section_contents)): Double check that the caller is writing to a valid section. diff --git a/bfd/som.c b/bfd/som.c index f6e9c6a1be2..9f5be87e25a 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -1653,7 +1653,7 @@ som_object_setup (abfd, file_hdrp, aux_hdrp) obj_som_exec_data (abfd)->exec_flags = aux_hdrp->exec_flags; } - bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 0); + bfd_default_set_arch_mach (abfd, bfd_arch_hppa, pa10); bfd_get_symcount (abfd) = file_hdrp->symbol_total; /* Initialize the saved symbol table and string table to NULL. @@ -2607,8 +2607,9 @@ som_write_fixups (abfd, current_offset, total_reloc_sizep) case R_DATA_PLABEL: case R_CODE_PLABEL: case R_DLT_REL: - /* Account for any addend. */ - if (bfd_reloc->addend) + /* Account for any addend using R_DATA_OVERRIDE. */ + if (bfd_reloc->howto->type != R_DATA_ONE_SYMBOL + && bfd_reloc->addend) p = som_reloc_addend (abfd, bfd_reloc->addend, p, &subspace_reloc_size, reloc_queue); @@ -3442,13 +3443,12 @@ som_finish_writing (abfd) section = section->next; } - /* FIXME. This should really be conditional based on whether or not - PA1.1 instructions/registers have been used. - - Setting of the system_id has to happen very late now that copying of + /* Setting of the system_id has to happen very late now that copying of BFD private data happens *after* section contents are set. */ if (abfd->flags & (EXEC_P | DYNAMIC)) obj_som_file_hdr(abfd)->system_id = obj_som_exec_data (abfd)->system_id; + else if (bfd_get_mach (abfd) == pa11) + obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC1_1; else obj_som_file_hdr(abfd)->system_id = CPU_PA_RISC1_0; @@ -4092,7 +4092,7 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count) asymbol **symbols; boolean just_count; { - unsigned int op, varname; + unsigned int op, varname, deallocate_contents = 0; unsigned char *end_fixups = &fixup[end]; const struct fixup_format *fp; char *cp; @@ -4368,6 +4368,37 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count) else if (som_hppa_howto_table[op].type == R_PCREL_CALL || som_hppa_howto_table[op].type == R_ABS_CALL) ; + else if (som_hppa_howto_table[op].type == R_DATA_ONE_SYMBOL) + { + unsigned addend = var ('V'); + + /* Try what was specified in R_DATA_OVERRIDE first + (if anything). Then the hard way using the + section contents. */ + rptr->addend = var ('V'); + + if (rptr->addend == 0 && !section->contents) + { + /* Got to read the damn contents first. We don't + bother saving the contents (yet). Add it one + day if the need arises. */ + section->contents = malloc (section->_raw_size); + if (section->contents == NULL) + return -1; + + deallocate_contents = 1; + bfd_get_section_contents (section->owner, + section, + section->contents, + 0, + section->_raw_size); + } + else if (rptr->addend == 0) + rptr->addend = bfd_get_32 (section->owner, + (section->contents + + offset - var ('L'))); + + } else rptr->addend = var ('V'); rptr++; @@ -4379,6 +4410,9 @@ som_set_reloc_info (fixup, end, internal_relocs, section, symbols, just_count) memset (stack, 0, sizeof (stack)); } } + if (deallocate_contents) + free (section->contents); + return count; #undef var @@ -4807,9 +4841,6 @@ som_find_nearest_line (abfd, section, symbols, offset, filename_ptr, CONST char **functionname_ptr; unsigned int *line_ptr; { - fprintf (stderr, "som_find_nearest_line unimplemented\n"); - fflush (stderr); - abort (); return (false); } @@ -5551,6 +5582,11 @@ som_bfd_ar_write_symbol_stuff (abfd, nsyms, string_size, lst) /* Keep track of where each SOM will finally reside; then look at the next BFD. */ curr_som_offset += arelt_size (curr_bfd) + sizeof (struct ar_hdr); + + /* A particular object in the archive may have an odd length; the + linker requires objects begin on an even boundary. So round + up the current offset as necessary. */ + curr_som_offset = (curr_som_offset + 0x1) & ~0x1; curr_bfd = curr_bfd->next; som_index++; } @@ -5649,6 +5685,8 @@ som_write_armap (abfd, elength, map, orl_count, stridx) lst_size = sizeof (struct lst_header); /* Start building the LST header. */ + /* FIXME: Do we need to examine each element to determine the + largest id number? */ lst.system_id = CPU_PA_RISC1_0; lst.a_magic = LIBMAGIC; lst.version_id = VERSION_ID; -- 2.30.2