From: gingold Date: Fri, 6 May 2011 10:41:11 +0000 (+0000) Subject: 2011-05-06 Tristan Gingold X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=358c7158220b9c7dd59ea41cff178bdd903ce121;p=pf3gnuchains%2Fpf3gnuchains4x.git 2011-05-06 Tristan Gingold * vms-alpha.c (evax_section_flags): Remove SEC_IN_MEMORY. (_bfd_vms_slurp_egsd): Rename old_flags to vms_flags. Handle any code section. Add comments. (alpha_vms_object_p): Use void * instead of PTR. (alpha_vms_create_eisd_for_section): Fix test for setting DZRO. (build_module_list): Guard against no DST section. Add comments. (alpha_vms_link_output_symbol): Discard undefined symbols. (alpha_vms_get_section_contents): Simply memcpy if the section was already loaded. Fix typo. (vms_new_section_hook): Use void * instead of PTR. (vms_alpha_vec): Ditto. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e673ede8e2..ee2bfb4d04 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2011-05-06 Tristan Gingold + + * vms-alpha.c (evax_section_flags): Remove SEC_IN_MEMORY. + (_bfd_vms_slurp_egsd): Rename old_flags to vms_flags. Handle + any code section. Add comments. + (alpha_vms_object_p): Use void * instead of PTR. + (alpha_vms_create_eisd_for_section): Fix test for setting DZRO. + (build_module_list): Guard against no DST section. Add comments. + (alpha_vms_link_output_symbol): Discard undefined symbols. + (alpha_vms_get_section_contents): Simply memcpy if the section was + already loaded. Fix typo. + (vms_new_section_hook): Use void * instead of PTR. + (vms_alpha_vec): Ditto. + 2011-05-06 Richard Sandiford * elf32-arm.c (cortex_a8_erratum_scan): If the stub is a Thumb diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c index 53d0f153f9..3adc00fe36 100644 --- a/bfd/vms-alpha.c +++ b/bfd/vms-alpha.c @@ -304,6 +304,7 @@ struct vms_private_data_struct struct module *modules; /* list of all compilation units */ + /* The DST section. */ asection *dst_section; unsigned int dst_ptr_offsets_count; /* # of offsets in following array */ @@ -992,7 +993,7 @@ static const struct sec_flags_struct evax_section_flags[] = EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT, SEC_DATA, EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT, - SEC_IN_MEMORY | SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD } + SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD } }; /* Retrieve BFD section flags by name and size. */ @@ -1129,14 +1130,15 @@ _bfd_vms_slurp_egsd (bfd *abfd) /* Program section definition. */ { struct vms_egps *egps = (struct vms_egps *)vms_rec; - flagword new_flags, old_flags; + flagword new_flags, vms_flags; asection *section; - old_flags = bfd_getl16 (egps->flags); + vms_flags = bfd_getl16 (egps->flags); - if ((old_flags & EGPS__V_REL) == 0) + if ((vms_flags & EGPS__V_REL) == 0) { - /* Use the global absolute section for all absolute sections. */ + /* Use the global absolute section for all + absolute sections. */ section = bfd_abs_section_ptr; } else @@ -1154,17 +1156,27 @@ _bfd_vms_slurp_egsd (bfd *abfd) section->size = bfd_getl32 (egps->alloc); section->alignment_power = egps->align; - vms_section_data (section)->flags = old_flags; + vms_section_data (section)->flags = vms_flags; vms_section_data (section)->no_flags = 0; new_flags = vms_secflag_by_name (evax_section_flags, name, section->size > 0); - if (!(old_flags & EGPS__V_NOMOD) && section->size > 0) + if (section->size > 0) + new_flags |= SEC_LOAD; + if (!(vms_flags & EGPS__V_NOMOD) && section->size > 0) { + /* Set RELOC and HAS_CONTENTS if the section is not + demand-zero and not empty. */ new_flags |= SEC_HAS_CONTENTS; - if (old_flags & EGPS__V_REL) + if (vms_flags & EGPS__V_REL) new_flags |= SEC_RELOC; } + if (vms_flags & EGPS__V_EXE) + { + /* Set CODE if section is executable. */ + new_flags |= SEC_CODE; + new_flags &= ~SEC_DATA; + } if (!bfd_set_section_flags (abfd, section, new_flags)) return FALSE; @@ -2425,7 +2437,7 @@ vms_initialize (bfd * abfd) static const struct bfd_target * alpha_vms_object_p (bfd *abfd) { - PTR tdata_save = abfd->tdata.any; + void *tdata_save = abfd->tdata.any; unsigned int test_len; unsigned char *buf; @@ -2908,7 +2920,7 @@ alpha_vms_create_eisd_for_section (bfd *abfd, asection *sec) if (sec->flags & SEC_RELOC) eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF; - if (!(sec->flags & SEC_LOAD)) + if (!(sec->flags & SEC_HAS_CONTENTS)) { eisd->u.eisd.flags |= EISD__M_DZRO; eisd->u.eisd.flags &= ~EISD__M_CRF; @@ -4617,6 +4629,11 @@ build_module_list (bfd *abfd) /* We don't have a DMT section so this must be an object. Parse the module right now in order to compute its start address and end address. */ + void *dst = PRIV (dst_section)->contents; + + if (dst == NULL) + return NULL; + module = new_module (abfd); parse_module (abfd, module, PRIV (dst_section)->contents, -1); list = module; @@ -4710,9 +4727,11 @@ _bfd_vms_find_nearest_dst_line (bfd *abfd, asection *section, *func = NULL; *line = 0; + /* We can't do anything if there is no DST (debug symbol table). */ if (PRIV (dst_section) == NULL) return FALSE; + /* Create the module list - if not already done. */ if (PRIV (modules) == NULL) { PRIV (modules) = build_module_list (abfd); @@ -8593,8 +8612,9 @@ alpha_vms_link_output_symbol (struct bfd_link_hash_entry *hc, void *infov) switch (h->root.type) { - case bfd_link_hash_new: case bfd_link_hash_undefined: + return TRUE; + case bfd_link_hash_new: abort (); case bfd_link_hash_undefweak: return TRUE; @@ -8972,9 +8992,17 @@ alpha_vms_get_section_contents (bfd *abfd, asection *section, return FALSE; } - /* Alloc in memory and read ETIRs. */ - BFD_ASSERT (section->contents == NULL); + /* If the section is already in memory, just copy it. */ + if (section->flags & SEC_IN_MEMORY) + { + BFD_ASSERT (section->contents != NULL); + memcpy (buf, section->contents + offset, count); + return TRUE; + } + if (section->size == 0) + return TRUE; + /* Alloc in memory and read ETIRs. */ for (sec = abfd->sections; sec; sec = sec->next) { BFD_ASSERT (sec->contents == NULL); @@ -8989,8 +9017,8 @@ alpha_vms_get_section_contents (bfd *abfd, asection *section, if (!alpha_vms_read_sections_content (abfd, NULL)) return FALSE; for (sec = abfd->sections; sec; sec = sec->next) - if (section->contents) - section->flags |= SEC_IN_MEMORY; + if (sec->contents) + sec->flags |= SEC_IN_MEMORY; memcpy (buf, section->contents + offset, count); return TRUE; } @@ -9083,7 +9111,7 @@ vms_new_section_hook (bfd * abfd, asection *section) vms_debug2 ((7, "%d: %s\n", section->index, section->name)); amt = sizeof (struct vms_section_data_struct); - section->used_by_bfd = (PTR) bfd_zalloc (abfd, amt); + section->used_by_bfd = bfd_zalloc (abfd, amt); if (section->used_by_bfd == NULL) return FALSE; @@ -9360,5 +9388,5 @@ const bfd_target vms_alpha_vec = NULL, - (PTR) 0 + NULL };