X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=bfd%2Felf32-ip2k.c;h=79e1eccf38a1a069ea4c9a4ad089b6c01685269b;hb=d8e34cd3ac4303e82ff9de51b7909b6ffde5b9c6;hp=96d0cd5ba900e5514a7448c0565a8014d15cb8b1;hpb=cd123cb70c845b890eed231a84e6e84c92c2ef92;p=platform%2Fupstream%2Fbinutils.git diff --git a/bfd/elf32-ip2k.c b/bfd/elf32-ip2k.c index 96d0cd5..79e1ecc 100644 --- a/bfd/elf32-ip2k.c +++ b/bfd/elf32-ip2k.c @@ -1,6 +1,5 @@ /* Ubicom IP2xxx specific support for 32-bit ELF - Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 - Free Software Foundation, Inc. + Copyright (C) 2000-2014 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -347,8 +346,8 @@ ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents) { bfd_byte code[4]; - int index = 0; - + int table_index = 0; + /* Check current page-jmp. */ if (addr + 4 > sec->size) return -1; @@ -358,7 +357,7 @@ ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED, if ((! IS_PAGE_OPCODE (code + 0)) || (! IS_JMP_OPCODE (code + 2))) return -1; - + /* Search back. */ while (1) { @@ -369,13 +368,13 @@ ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED, ip2k_get_mem (abfd, contents + addr - 4, 4, code); if ((IS_ADD_W_WREG_OPCODE (code + 0)) && (IS_ADD_PCL_W_OPCODE (code + 2))) - return index; + return table_index; if ((! IS_PAGE_OPCODE (code + 0)) || (! IS_JMP_OPCODE (code + 2))) return -1; - index++; + table_index++; addr -= 4; } } @@ -427,8 +426,8 @@ ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED, bfd_byte *contents) { bfd_byte code[16]; - int index = 0; - + int table_index = 0; + /* Check current page-jmp. */ if (addr + 4 > sec->size) return -1; @@ -437,7 +436,7 @@ ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED, if ((! IS_PAGE_OPCODE (code + 0)) || (! IS_JMP_OPCODE (code + 2))) return -1; - + /* Search back. */ while (1) { @@ -454,7 +453,7 @@ ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED, && (IS_INC_1SP_OPCODE (code + 10)) && (IS_PAGE_OPCODE (code + 12)) && (IS_JMP_OPCODE (code + 14))) - return index; + return table_index; if ((IS_ADD_W_WREG_OPCODE (code + 2)) && (IS_SNC_OPCODE (code + 4)) @@ -463,13 +462,13 @@ ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED, && (IS_SNC_OPCODE (code + 10)) && (IS_INC_1SP_OPCODE (code + 12)) && (IS_JMP_OPCODE (code + 14))) - return index; - + return table_index; + if ((! IS_PAGE_OPCODE (code + 0)) || (! IS_JMP_OPCODE (code + 2))) return -1; - index++; + table_index++; addr -= 4; } } @@ -577,7 +576,6 @@ adjust_all_relocations (bfd *abfd, Elf_Internal_Shdr *symtab_hdr; Elf_Internal_Sym *isymbuf, *isym, *isymend; unsigned int shndx; - bfd_byte *contents; Elf_Internal_Rela *irel, *irelend, *irelbase; struct elf_link_hash_entry **sym_hashes; struct elf_link_hash_entry **end_hashes; @@ -589,8 +587,6 @@ adjust_all_relocations (bfd *abfd, shndx = _bfd_elf_section_from_bfd_section (abfd, sec); - contents = elf_section_data (sec)->this_hdr.contents; - irelbase = elf_section_data (sec)->relocs; irelend = irelbase + sec->reloc_count; @@ -661,38 +657,33 @@ adjust_all_relocations (bfd *abfd, if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) { asection *sym_sec; - + /* A local symbol. */ isym = isymbuf + ELF32_R_SYM (irel->r_info); sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); - + if (sym_sec == sec) { const char *name; - unsigned long strx; - unsigned char type, other; - unsigned short desc; + unsigned char type; bfd_vma value; bfd_vma baseaddr = BASEADDR (sec); bfd_vma symval = BASEADDR (sym_sec) + isym->st_value + irel->r_addend; - + if ((baseaddr + addr) <= symval && symval <= (baseaddr + endaddr)) irel->r_addend += count; /* Go hunt up a function and fix its line info if needed. */ - stabp = stabcontents + irel->r_offset - 8; + stabp = stabcontents + irel->r_offset - 8; /* Go pullout the stab entry. */ - strx = bfd_h_get_32 (abfd, stabp + STRDXOFF); type = bfd_h_get_8 (abfd, stabp + TYPEOFF); - other = bfd_h_get_8 (abfd, stabp + OTHEROFF); - desc = bfd_h_get_16 (abfd, stabp + DESCOFF); value = bfd_h_get_32 (abfd, stabp + VALOFF); - + name = bfd_get_stab_name (type); - + if (strcmp (name, "FUN") == 0) { int function_adjusted = 0; @@ -706,10 +697,7 @@ adjust_all_relocations (bfd *abfd, for (;stabp < stabend; stabp += STABSIZE) { /* Go pullout the stab entry. */ - strx = bfd_h_get_32 (abfd, stabp + STRDXOFF); type = bfd_h_get_8 (abfd, stabp + TYPEOFF); - other = bfd_h_get_8 (abfd, stabp + OTHEROFF); - desc = bfd_h_get_16 (abfd, stabp + DESCOFF); value = bfd_h_get_32 (abfd, stabp + VALOFF); name = bfd_get_stab_name (type); @@ -721,7 +709,7 @@ adjust_all_relocations (bfd *abfd, { /* Adjust the value. */ value += count; - + /* We need to put it back. */ bfd_h_put_32 (abfd, value,stabp + VALOFF); } @@ -830,10 +818,10 @@ ip2k_delete_page_insn (bfd *abfd ATTRIBUTE_UNUSED, /* Delete the PAGE insn. */ if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2)) return FALSE; - + /* Modified => will need to iterate relaxation again. */ *again = TRUE; - + return TRUE; } @@ -848,7 +836,7 @@ ip2k_relax_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED, Elf_Internal_Rela *ireltest = irel; bfd_byte code[4]; bfd_vma addr; - + /* Test all page instructions. */ addr = irel->r_offset; while (1) @@ -919,7 +907,7 @@ ip2k_relax_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED, Elf_Internal_Rela *ireltest = irel; bfd_byte code[12]; bfd_vma addr; - + /* Test all page instructions. */ addr = irel->r_offset; @@ -1006,7 +994,7 @@ ip2k_elf_relax_section_page (bfd *abfd, Elf_Internal_Rela *irel; int switch_table_128; int switch_table_256; - + /* Walk thru the section looking for relaxation opportunities. */ for (irel = misc->irelbase; irel < irelend; irel++) { @@ -1089,7 +1077,6 @@ ip2k_elf_relax_section (bfd *abfd, static bfd_boolean new_pass = FALSE; static bfd_boolean changed = FALSE; struct misc misc; - asection *stab; /* Assume nothing changes. */ *again = FALSE; @@ -1122,18 +1109,6 @@ ip2k_elf_relax_section (bfd *abfd, if (internal_relocs == NULL) goto error_return; - /* Make sure the stac.rela stuff gets read in. */ - stab = bfd_get_section_by_name (abfd, ".stab"); - - if (stab) - { - /* So stab does exits. */ - Elf_Internal_Rela * irelbase; - - irelbase = _bfd_elf_link_read_relocs (abfd, stab, NULL, NULL, - link_info->keep_memory); - } - /* Get section contents cached copy if it exists. */ if (contents == NULL) { @@ -1432,7 +1407,7 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, r_type = ELF32_R_TYPE (rel->r_info); r_symndx = ELF32_R_SYM (rel->r_info); - howto = ip2k_elf_howto_table + ELF32_R_TYPE (rel->r_info); + howto = ip2k_elf_howto_table + r_type; h = NULL; sym = NULL; sec = NULL; @@ -1449,27 +1424,20 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, } else { - bfd_boolean warned; + bfd_boolean warned, ignored; bfd_boolean unresolved_reloc; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, h, sec, relocation, - unresolved_reloc, warned); + unresolved_reloc, warned, ignored); name = h->root.root.string; } - if (sec != NULL && elf_discarded_section (sec)) - { - /* For relocs against symbols from removed linkonce sections, - or sections discarded by a linker script, we just want the - section contents zeroed. Avoid any special processing. */ - _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset); - rel->r_info = 0; - rel->r_addend = 0; - continue; - } + if (sec != NULL && discarded_section (sec)) + RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, + rel, 1, relend, howto, 0, contents); if (info->relocatable) continue; @@ -1527,7 +1495,7 @@ ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, return TRUE; } -#define TARGET_BIG_SYM bfd_elf32_ip2k_vec +#define TARGET_BIG_SYM ip2k_elf32_vec #define TARGET_BIG_NAME "elf32-ip2k" #define ELF_ARCH bfd_arch_ip2k