1 /* Ubicom IP2xxx specific support for 32-bit ELF 2 Copyright (C) 2000-2014 Free Software Foundation, Inc. 3 4 This file is part of BFD, the Binary File Descriptor library. 5 6 This program is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 #include "sysdep.h" 22 #include "bfd.h" 23 #include "libbfd.h" 24 #include "elf-bfd.h" 25 #include "elf/ip2k.h" 26 27 /* Struct used to pass miscellaneous paramaters which 28 helps to avoid overly long parameter lists. */ 29 struct misc 30 { 31 Elf_Internal_Shdr * symtab_hdr; 32 Elf_Internal_Rela * irelbase; 33 bfd_byte * contents; 34 Elf_Internal_Sym * isymbuf; 35 }; 36 37 struct ip2k_opcode 38 { 39 unsigned short opcode; 40 unsigned short mask; 41 }; 42 43 static bfd_boolean ip2k_relaxed = FALSE; 44 45 static const struct ip2k_opcode ip2k_page_opcode[] = 46 { 47 {0x0010, 0xFFF8}, /* Page. */ 48 {0x0000, 0x0000}, 49 }; 50 51 #define IS_PAGE_OPCODE(code) \ 52 ip2k_is_opcode (code, ip2k_page_opcode) 53 54 static const struct ip2k_opcode ip2k_jmp_opcode[] = 55 { 56 {0xE000, 0xE000}, /* Jmp. */ 57 {0x0000, 0x0000}, 58 }; 59 60 #define IS_JMP_OPCODE(code) \ 61 ip2k_is_opcode (code, ip2k_jmp_opcode) 62 63 static const struct ip2k_opcode ip2k_snc_opcode[] = 64 { 65 {0xA00B, 0xFFFF}, /* Snc. */ 66 {0x0000, 0x0000}, 67 }; 68 69 #define IS_SNC_OPCODE(code) \ 70 ip2k_is_opcode (code, ip2k_snc_opcode) 71 72 static const struct ip2k_opcode ip2k_inc_1sp_opcode[] = 73 { 74 {0x2B81, 0xFFFF}, /* Inc 1(SP). */ 75 {0x0000, 0x0000}, 76 }; 77 78 #define IS_INC_1SP_OPCODE(code) \ 79 ip2k_is_opcode (code, ip2k_inc_1sp_opcode) 80 81 static const struct ip2k_opcode ip2k_add_2sp_w_opcode[] = 82 { 83 {0x1F82, 0xFFFF}, /* Add 2(SP),w. */ 84 {0x0000, 0x0000}, 85 }; 86 87 #define IS_ADD_2SP_W_OPCODE(code) \ 88 ip2k_is_opcode (code, ip2k_add_2sp_w_opcode) 89 90 static const struct ip2k_opcode ip2k_add_w_wreg_opcode[] = 91 { 92 {0x1C0A, 0xFFFF}, /* Add w,wreg. */ 93 {0x1E0A, 0xFFFF}, /* Add wreg,w. */ 94 {0x0000, 0x0000}, 95 }; 96 97 #define IS_ADD_W_WREG_OPCODE(code) \ 98 ip2k_is_opcode (code, ip2k_add_w_wreg_opcode) 99 100 static const struct ip2k_opcode ip2k_add_pcl_w_opcode[] = 101 { 102 {0x1E09, 0xFFFF}, /* Add pcl,w. */ 103 {0x0000, 0x0000}, 104 }; 105 106 #define IS_ADD_PCL_W_OPCODE(code) \ 107 ip2k_is_opcode (code, ip2k_add_pcl_w_opcode) 108 109 static const struct ip2k_opcode ip2k_skip_opcodes[] = 110 { 111 {0xB000, 0xF000}, /* sb */ 112 {0xA000, 0xF000}, /* snb */ 113 {0x7600, 0xFE00}, /* cse/csne #lit */ 114 {0x5800, 0xFC00}, /* incsnz */ 115 {0x4C00, 0xFC00}, /* decsnz */ 116 {0x4000, 0xFC00}, /* cse/csne */ 117 {0x3C00, 0xFC00}, /* incsz */ 118 {0x2C00, 0xFC00}, /* decsz */ 119 {0x0000, 0x0000}, 120 }; 121 122 #define IS_SKIP_OPCODE(code) \ 123 ip2k_is_opcode (code, ip2k_skip_opcodes) 124 125 /* Relocation tables. */ 126 static reloc_howto_type ip2k_elf_howto_table [] = 127 { 128 #define IP2K_HOWTO(t,rs,s,bs,pr,bp,name,sm,dm) \ 129 HOWTO(t, /* type */ \ 130 rs, /* rightshift */ \ 131 s, /* size (0 = byte, 1 = short, 2 = long) */ \ 132 bs, /* bitsize */ \ 133 pr, /* pc_relative */ \ 134 bp, /* bitpos */ \ 135 complain_overflow_dont,/* complain_on_overflow */ \ 136 bfd_elf_generic_reloc,/* special_function */ \ 137 name, /* name */ \ 138 FALSE, /* partial_inplace */ \ 139 sm, /* src_mask */ \ 140 dm, /* dst_mask */ \ 141 pr) /* pcrel_offset */ 142 143 /* This reloc does nothing. */ 144 IP2K_HOWTO (R_IP2K_NONE, 0,2,32, FALSE, 0, "R_IP2K_NONE", 0, 0), 145 /* A 16 bit absolute relocation. */ 146 IP2K_HOWTO (R_IP2K_16, 0,1,16, FALSE, 0, "R_IP2K_16", 0, 0xffff), 147 /* A 32 bit absolute relocation. */ 148 IP2K_HOWTO (R_IP2K_32, 0,2,32, FALSE, 0, "R_IP2K_32", 0, 0xffffffff), 149 /* A 8-bit data relocation for the FR9 field. Ninth bit is computed specially. */ 150 IP2K_HOWTO (R_IP2K_FR9, 0,1,9, FALSE, 0, "R_IP2K_FR9", 0, 0x00ff), 151 /* A 4-bit data relocation. */ 152 IP2K_HOWTO (R_IP2K_BANK, 8,1,4, FALSE, 0, "R_IP2K_BANK", 0, 0x000f), 153 /* A 13-bit insn relocation - word address => right-shift 1 bit extra. */ 154 IP2K_HOWTO (R_IP2K_ADDR16CJP, 1,1,13, FALSE, 0, "R_IP2K_ADDR16CJP", 0, 0x1fff), 155 /* A 3-bit insn relocation - word address => right-shift 1 bit extra. */ 156 IP2K_HOWTO (R_IP2K_PAGE3, 14,1,3, FALSE, 0, "R_IP2K_PAGE3", 0, 0x0007), 157 /* Two 8-bit data relocations. */ 158 IP2K_HOWTO (R_IP2K_LO8DATA, 0,1,8, FALSE, 0, "R_IP2K_LO8DATA", 0, 0x00ff), 159 IP2K_HOWTO (R_IP2K_HI8DATA, 8,1,8, FALSE, 0, "R_IP2K_HI8DATA", 0, 0x00ff), 160 /* Two 8-bit insn relocations. word address => right-shift 1 bit extra. */ 161 IP2K_HOWTO (R_IP2K_LO8INSN, 1,1,8, FALSE, 0, "R_IP2K_LO8INSN", 0, 0x00ff), 162 IP2K_HOWTO (R_IP2K_HI8INSN, 9,1,8, FALSE, 0, "R_IP2K_HI8INSN", 0, 0x00ff), 163 164 /* Special 1 bit relocation for SKIP instructions. */ 165 IP2K_HOWTO (R_IP2K_PC_SKIP, 1,1,1, FALSE, 12, "R_IP2K_PC_SKIP", 0xfffe, 0x1000), 166 /* 16 bit word address. */ 167 IP2K_HOWTO (R_IP2K_TEXT, 1,1,16, FALSE, 0, "R_IP2K_TEXT", 0, 0xffff), 168 /* A 7-bit offset relocation for the FR9 field. Eigth and ninth bit comes from insn. */ 169 IP2K_HOWTO (R_IP2K_FR_OFFSET, 0,1,9, FALSE, 0, "R_IP2K_FR_OFFSET", 0x180, 0x007f), 170 /* Bits 23:16 of an address. */ 171 IP2K_HOWTO (R_IP2K_EX8DATA, 16,1,8, FALSE, 0, "R_IP2K_EX8DATA", 0, 0x00ff), 172 }; 173 174 175 /* Map BFD reloc types to IP2K ELF reloc types. */ 176 177 static reloc_howto_type * 178 ip2k_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, 179 bfd_reloc_code_real_type code) 180 { 181 /* Note that the ip2k_elf_howto_table is indxed by the R_ 182 constants. Thus, the order that the howto records appear in the 183 table *must* match the order of the relocation types defined in 184 include/elf/ip2k.h. */ 185 186 switch (code) 187 { 188 case BFD_RELOC_NONE: 189 return &ip2k_elf_howto_table[ (int) R_IP2K_NONE]; 190 case BFD_RELOC_16: 191 return &ip2k_elf_howto_table[ (int) R_IP2K_16]; 192 case BFD_RELOC_32: 193 return &ip2k_elf_howto_table[ (int) R_IP2K_32]; 194 case BFD_RELOC_IP2K_FR9: 195 return &ip2k_elf_howto_table[ (int) R_IP2K_FR9]; 196 case BFD_RELOC_IP2K_BANK: 197 return &ip2k_elf_howto_table[ (int) R_IP2K_BANK]; 198 case BFD_RELOC_IP2K_ADDR16CJP: 199 return &ip2k_elf_howto_table[ (int) R_IP2K_ADDR16CJP]; 200 case BFD_RELOC_IP2K_PAGE3: 201 return &ip2k_elf_howto_table[ (int) R_IP2K_PAGE3]; 202 case BFD_RELOC_IP2K_LO8DATA: 203 return &ip2k_elf_howto_table[ (int) R_IP2K_LO8DATA]; 204 case BFD_RELOC_IP2K_HI8DATA: 205 return &ip2k_elf_howto_table[ (int) R_IP2K_HI8DATA]; 206 case BFD_RELOC_IP2K_LO8INSN: 207 return &ip2k_elf_howto_table[ (int) R_IP2K_LO8INSN]; 208 case BFD_RELOC_IP2K_HI8INSN: 209 return &ip2k_elf_howto_table[ (int) R_IP2K_HI8INSN]; 210 case BFD_RELOC_IP2K_PC_SKIP: 211 return &ip2k_elf_howto_table[ (int) R_IP2K_PC_SKIP]; 212 case BFD_RELOC_IP2K_TEXT: 213 return &ip2k_elf_howto_table[ (int) R_IP2K_TEXT]; 214 case BFD_RELOC_IP2K_FR_OFFSET: 215 return &ip2k_elf_howto_table[ (int) R_IP2K_FR_OFFSET]; 216 case BFD_RELOC_IP2K_EX8DATA: 217 return &ip2k_elf_howto_table[ (int) R_IP2K_EX8DATA]; 218 default: 219 /* Pacify gcc -Wall. */ 220 return NULL; 221 } 222 return NULL; 223 } 224 225 static reloc_howto_type * 226 ip2k_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, const char *r_name) 227 { 228 unsigned int i; 229 230 for (i = 0; 231 i < sizeof (ip2k_elf_howto_table) / sizeof (ip2k_elf_howto_table[0]); 232 i++) 233 if (ip2k_elf_howto_table[i].name != NULL 234 && strcasecmp (ip2k_elf_howto_table[i].name, r_name) == 0) 235 return &ip2k_elf_howto_table[i]; 236 237 return NULL; 238 } 239 240 static void 241 ip2k_get_mem (bfd *abfd ATTRIBUTE_UNUSED, 242 bfd_byte *addr, 243 int length, 244 bfd_byte *ptr) 245 { 246 while (length --) 247 * ptr ++ = bfd_get_8 (abfd, addr ++); 248 } 249 250 static bfd_boolean 251 ip2k_is_opcode (bfd_byte *code, const struct ip2k_opcode *opcodes) 252 { 253 unsigned short insn = (code[0] << 8) | code[1]; 254 255 while (opcodes->mask != 0) 256 { 257 if ((insn & opcodes->mask) == opcodes->opcode) 258 return TRUE; 259 260 opcodes ++; 261 } 262 263 return FALSE; 264 } 265 266 #define PAGENO(ABSADDR) ((ABSADDR) & 0xFFFFC000) 267 #define BASEADDR(SEC) ((SEC)->output_section->vma + (SEC)->output_offset) 268 269 #define UNDEFINED_SYMBOL (~(bfd_vma)0) 270 271 /* Return the value of the symbol associated with the relocation IREL. */ 272 273 static bfd_vma 274 symbol_value (bfd *abfd, 275 Elf_Internal_Shdr *symtab_hdr, 276 Elf_Internal_Sym *isymbuf, 277 Elf_Internal_Rela *irel) 278 { 279 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) 280 { 281 Elf_Internal_Sym *isym; 282 asection *sym_sec; 283 284 isym = isymbuf + ELF32_R_SYM (irel->r_info); 285 if (isym->st_shndx == SHN_UNDEF) 286 sym_sec = bfd_und_section_ptr; 287 else if (isym->st_shndx == SHN_ABS) 288 sym_sec = bfd_abs_section_ptr; 289 else if (isym->st_shndx == SHN_COMMON) 290 sym_sec = bfd_com_section_ptr; 291 else 292 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); 293 294 return isym->st_value + BASEADDR (sym_sec); 295 } 296 else 297 { 298 unsigned long indx; 299 struct elf_link_hash_entry *h; 300 301 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; 302 h = elf_sym_hashes (abfd)[indx]; 303 BFD_ASSERT (h != NULL); 304 305 if (h->root.type != bfd_link_hash_defined 306 && h->root.type != bfd_link_hash_defweak) 307 return UNDEFINED_SYMBOL; 308 309 return (h->root.u.def.value + BASEADDR (h->root.u.def.section)); 310 } 311 } 312 313 /* Determine if the instruction sequence matches that for 314 the prologue of a switch dispatch table with fewer than 315 128 entries. 316 317 sc 318 page $nnn0 319 jmp $nnn0 320 add w,wreg 321 add pcl,w 322 addr=> 323 page $nnn1 324 jmp $nnn1 325 page $nnn2 326 jmp $nnn2 327 ... 328 page $nnnN 329 jmp $nnnN 330 331 After relaxation. 332 sc 333 page $nnn0 334 jmp $nnn0 335 add pcl,w 336 addr=> 337 jmp $nnn1 338 jmp $nnn2 339 ... 340 jmp $nnnN */ 341 342 static int 343 ip2k_is_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED, 344 asection *sec, 345 bfd_vma addr, 346 bfd_byte *contents) 347 { 348 bfd_byte code[4]; 349 int table_index = 0; 350 351 /* Check current page-jmp. */ 352 if (addr + 4 > sec->size) 353 return -1; 354 355 ip2k_get_mem (abfd, contents + addr, 4, code); 356 357 if ((! IS_PAGE_OPCODE (code + 0)) 358 || (! IS_JMP_OPCODE (code + 2))) 359 return -1; 360 361 /* Search back. */ 362 while (1) 363 { 364 if (addr < 4) 365 return -1; 366 367 /* Check previous 2 instructions. */ 368 ip2k_get_mem (abfd, contents + addr - 4, 4, code); 369 if ((IS_ADD_W_WREG_OPCODE (code + 0)) 370 && (IS_ADD_PCL_W_OPCODE (code + 2))) 371 return table_index; 372 373 if ((! IS_PAGE_OPCODE (code + 0)) 374 || (! IS_JMP_OPCODE (code + 2))) 375 return -1; 376 377 table_index++; 378 addr -= 4; 379 } 380 } 381 382 /* Determine if the instruction sequence matches that for 383 the prologue switch dispatch table with fewer than 384 256 entries but more than 127. 385 386 Before relaxation. 387 push %lo8insn(label) ; Push address of table 388 push %hi8insn(label) 389 add w,wreg ; index*2 => offset 390 snc ; CARRY SET? 391 inc 1(sp) ; Propagate MSB into table address 392 add 2(sp),w ; Add low bits of offset to table address 393 snc ; and handle any carry-out 394 inc 1(sp) 395 addr=> 396 page __indjmp ; Do an indirect jump to that location 397 jmp __indjmp 398 label: ; case dispatch table starts here 399 page $nnn1 400 jmp $nnn1 401 page $nnn2 402 jmp $nnn2 403 ... 404 page $nnnN 405 jmp $nnnN 406 407 After relaxation. 408 push %lo8insn(label) ; Push address of table 409 push %hi8insn(label) 410 add 2(sp),w ; Add low bits of offset to table address 411 snc ; and handle any carry-out 412 inc 1(sp) 413 addr=> 414 page __indjmp ; Do an indirect jump to that location 415 jmp __indjmp 416 label: ; case dispatch table starts here 417 jmp $nnn1 418 jmp $nnn2 419 ... 420 jmp $nnnN */ 421 422 static int 423 ip2k_is_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED, 424 asection *sec, 425 bfd_vma addr, 426 bfd_byte *contents) 427 { 428 bfd_byte code[16]; 429 int table_index = 0; 430 431 /* Check current page-jmp. */ 432 if (addr + 4 > sec->size) 433 return -1; 434 435 ip2k_get_mem (abfd, contents + addr, 4, code); 436 if ((! IS_PAGE_OPCODE (code + 0)) 437 || (! IS_JMP_OPCODE (code + 2))) 438 return -1; 439 440 /* Search back. */ 441 while (1) 442 { 443 if (addr < 16) 444 return -1; 445 446 /* Check previous 8 instructions. */ 447 ip2k_get_mem (abfd, contents + addr - 16, 16, code); 448 if ((IS_ADD_W_WREG_OPCODE (code + 0)) 449 && (IS_SNC_OPCODE (code + 2)) 450 && (IS_INC_1SP_OPCODE (code + 4)) 451 && (IS_ADD_2SP_W_OPCODE (code + 6)) 452 && (IS_SNC_OPCODE (code + 8)) 453 && (IS_INC_1SP_OPCODE (code + 10)) 454 && (IS_PAGE_OPCODE (code + 12)) 455 && (IS_JMP_OPCODE (code + 14))) 456 return table_index; 457 458 if ((IS_ADD_W_WREG_OPCODE (code + 2)) 459 && (IS_SNC_OPCODE (code + 4)) 460 && (IS_INC_1SP_OPCODE (code + 6)) 461 && (IS_ADD_2SP_W_OPCODE (code + 8)) 462 && (IS_SNC_OPCODE (code + 10)) 463 && (IS_INC_1SP_OPCODE (code + 12)) 464 && (IS_JMP_OPCODE (code + 14))) 465 return table_index; 466 467 if ((! IS_PAGE_OPCODE (code + 0)) 468 || (! IS_JMP_OPCODE (code + 2))) 469 return -1; 470 471 table_index++; 472 addr -= 4; 473 } 474 } 475 476 /* Returns the expected page state for the given instruction not including 477 the effect of page instructions. */ 478 479 static bfd_vma 480 ip2k_nominal_page_bits (bfd *abfd ATTRIBUTE_UNUSED, 481 asection *sec, 482 bfd_vma addr, 483 bfd_byte *contents) 484 { 485 bfd_vma page = PAGENO (BASEADDR (sec) + addr); 486 487 /* Check if section flows into this page. If not then the page 488 bits are assumed to match the PC. This will be true unless 489 the user has a page instruction without a call/jump, in which 490 case they are on their own. */ 491 if (PAGENO (BASEADDR (sec)) == page) 492 return page; 493 494 /* Section flows across page boundary. The page bits should match 495 the PC unless there is a possible flow from the previous page, 496 in which case it is not possible to determine the value of the 497 page bits. */ 498 while (PAGENO (BASEADDR (sec) + addr - 2) == page) 499 { 500 bfd_byte code[2]; 501 502 addr -= 2; 503 ip2k_get_mem (abfd, contents + addr, 2, code); 504 if (!IS_PAGE_OPCODE (code)) 505 continue; 506 507 /* Found a page instruction, check if jump table. */ 508 if (ip2k_is_switch_table_128 (abfd, sec, addr, contents) != -1) 509 /* Jump table => page is conditional. */ 510 continue; 511 512 if (ip2k_is_switch_table_256 (abfd, sec, addr, contents) != -1) 513 /* Jump table => page is conditional. */ 514 continue; 515 516 /* Found a page instruction, check if conditional. */ 517 if (addr >= 2) 518 { 519 ip2k_get_mem (abfd, contents + addr - 2, 2, code); 520 if (IS_SKIP_OPCODE (code)) 521 /* Page is conditional. */ 522 continue; 523 } 524 525 /* Unconditional page instruction => page bits should be correct. */ 526 return page; 527 } 528 529 /* Flow from previous page => page bits are impossible to determine. */ 530 return 0; 531 } 532 533 static bfd_boolean 534 ip2k_test_page_insn (bfd *abfd ATTRIBUTE_UNUSED, 535 asection *sec, 536 Elf_Internal_Rela *irel, 537 struct misc *misc) 538 { 539 bfd_vma symval; 540 541 /* Get the value of the symbol referred to by the reloc. */ 542 symval = symbol_value (abfd, misc->symtab_hdr, misc->isymbuf, irel); 543 if (symval == UNDEFINED_SYMBOL) 544 /* This appears to be a reference to an undefined 545 symbol. Just ignore it--it will be caught by the 546 regular reloc processing. */ 547 return FALSE; 548 549 /* Test if we can delete this page instruction. */ 550 if (PAGENO (symval + irel->r_addend) != 551 ip2k_nominal_page_bits (abfd, sec, irel->r_offset, misc->contents)) 552 return FALSE; 553 554 return TRUE; 555 } 556 557 /* Parts of a Stabs entry. */ 558 559 #define STRDXOFF 0 560 #define TYPEOFF 4 561 #define OTHEROFF 5 562 #define DESCOFF 6 563 #define VALOFF 8 564 #define STABSIZE 12 565 566 /* Adjust all the relocations entries after adding or inserting instructions. */ 567 568 static void 569 adjust_all_relocations (bfd *abfd, 570 asection *sec, 571 bfd_vma addr, 572 bfd_vma endaddr, 573 int count, 574 int noadj) 575 { 576 Elf_Internal_Shdr *symtab_hdr; 577 Elf_Internal_Sym *isymbuf, *isym, *isymend; 578 unsigned int shndx; 579 Elf_Internal_Rela *irel, *irelend, *irelbase; 580 struct elf_link_hash_entry **sym_hashes; 581 struct elf_link_hash_entry **end_hashes; 582 unsigned int symcount; 583 asection *stab; 584 585 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 586 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 587 588 shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 589 590 irelbase = elf_section_data (sec)->relocs; 591 irelend = irelbase + sec->reloc_count; 592 593 for (irel = irelbase; irel < irelend; irel++) 594 { 595 if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE) 596 { 597 /* Get the value of the symbol referred to by the reloc. */ 598 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) 599 { 600 asection *sym_sec; 601 602 /* A local symbol. */ 603 isym = isymbuf + ELF32_R_SYM (irel->r_info); 604 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); 605 606 if (isym->st_shndx == shndx) 607 { 608 bfd_vma baseaddr = BASEADDR (sec); 609 bfd_vma symval = BASEADDR (sym_sec) + isym->st_value 610 + irel->r_addend; 611 612 if ((baseaddr + addr + noadj) <= symval 613 && symval < (baseaddr + endaddr)) 614 irel->r_addend += count; 615 } 616 } 617 } 618 619 /* Do this only for PC space relocations. */ 620 if (addr <= irel->r_offset && irel->r_offset < endaddr) 621 irel->r_offset += count; 622 } 623 624 /* Now fix the stab relocations. */ 625 stab = bfd_get_section_by_name (abfd, ".stab"); 626 if (stab) 627 { 628 bfd_byte *stabcontents, *stabend, *stabp; 629 bfd_size_type stab_size = stab->rawsize ? stab->rawsize : stab->size; 630 631 irelbase = elf_section_data (stab)->relocs; 632 irelend = irelbase + stab->reloc_count; 633 634 /* Pull out the contents of the stab section. */ 635 if (elf_section_data (stab)->this_hdr.contents != NULL) 636 stabcontents = elf_section_data (stab)->this_hdr.contents; 637 else 638 { 639 if (!bfd_malloc_and_get_section (abfd, stab, &stabcontents)) 640 { 641 if (stabcontents != NULL) 642 free (stabcontents); 643 return; 644 } 645 646 /* We need to remember this. */ 647 elf_section_data (stab)->this_hdr.contents = stabcontents; 648 } 649 650 stabend = stabcontents + stab_size; 651 652 for (irel = irelbase; irel < irelend; irel++) 653 { 654 if (ELF32_R_TYPE (irel->r_info) != R_IP2K_NONE) 655 { 656 /* Get the value of the symbol referred to by the reloc. */ 657 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) 658 { 659 asection *sym_sec; 660 661 /* A local symbol. */ 662 isym = isymbuf + ELF32_R_SYM (irel->r_info); 663 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); 664 665 if (sym_sec == sec) 666 { 667 const char *name; 668 unsigned char type; 669 bfd_vma value; 670 bfd_vma baseaddr = BASEADDR (sec); 671 bfd_vma symval = BASEADDR (sym_sec) + isym->st_value 672 + irel->r_addend; 673 674 if ((baseaddr + addr) <= symval 675 && symval <= (baseaddr + endaddr)) 676 irel->r_addend += count; 677 678 /* Go hunt up a function and fix its line info if needed. */ 679 stabp = stabcontents + irel->r_offset - 8; 680 681 /* Go pullout the stab entry. */ 682 type = bfd_h_get_8 (abfd, stabp + TYPEOFF); 683 value = bfd_h_get_32 (abfd, stabp + VALOFF); 684 685 name = bfd_get_stab_name (type); 686 687 if (strcmp (name, "FUN") == 0) 688 { 689 int function_adjusted = 0; 690 691 if (symval > (baseaddr + addr)) 692 /* Not in this function. */ 693 continue; 694 695 /* Hey we got a function hit. */ 696 stabp += STABSIZE; 697 for (;stabp < stabend; stabp += STABSIZE) 698 { 699 /* Go pullout the stab entry. */ 700 type = bfd_h_get_8 (abfd, stabp + TYPEOFF); 701 value = bfd_h_get_32 (abfd, stabp + VALOFF); 702 703 name = bfd_get_stab_name (type); 704 705 if (strcmp (name, "FUN") == 0) 706 { 707 /* Hit another function entry. */ 708 if (function_adjusted) 709 { 710 /* Adjust the value. */ 711 value += count; 712 713 /* We need to put it back. */ 714 bfd_h_put_32 (abfd, value,stabp + VALOFF); 715 } 716 717 /* And then bale out. */ 718 break; 719 } 720 721 if (strcmp (name, "SLINE") == 0) 722 { 723 /* Got a line entry. */ 724 if ((baseaddr + addr) <= (symval + value)) 725 { 726 /* Adjust the line entry. */ 727 value += count; 728 729 /* We need to put it back. */ 730 bfd_h_put_32 (abfd, value,stabp + VALOFF); 731 function_adjusted = 1; 732 } 733 } 734 } 735 } 736 } 737 } 738 } 739 } 740 } 741 742 /* When adding an instruction back it is sometimes necessary to move any 743 global or local symbol that was referencing the first instruction of 744 the moved block to refer to the first instruction of the inserted block. 745 746 For example adding a PAGE instruction before a CALL or JMP requires 747 that any label on the CALL or JMP is moved to the PAGE insn. */ 748 addr += noadj; 749 750 /* Adjust the local symbols defined in this section. */ 751 isymend = isymbuf + symtab_hdr->sh_info; 752 for (isym = isymbuf; isym < isymend; isym++) 753 { 754 if (isym->st_shndx == shndx 755 && addr <= isym->st_value 756 && isym->st_value < endaddr) 757 isym->st_value += count; 758 } 759 760 /* Now adjust the global symbols defined in this section. */ 761 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 762 - symtab_hdr->sh_info); 763 sym_hashes = elf_sym_hashes (abfd); 764 end_hashes = sym_hashes + symcount; 765 for (; sym_hashes < end_hashes; sym_hashes++) 766 { 767 struct elf_link_hash_entry *sym_hash = *sym_hashes; 768 769 if ((sym_hash->root.type == bfd_link_hash_defined 770 || sym_hash->root.type == bfd_link_hash_defweak) 771 && sym_hash->root.u.def.section == sec) 772 { 773 if (addr <= sym_hash->root.u.def.value 774 && sym_hash->root.u.def.value < endaddr) 775 sym_hash->root.u.def.value += count; 776 } 777 } 778 779 return; 780 } 781 782 /* Delete some bytes from a section while relaxing. */ 783 784 static bfd_boolean 785 ip2k_elf_relax_delete_bytes (bfd *abfd, 786 asection *sec, 787 bfd_vma addr, 788 int count) 789 { 790 bfd_byte *contents = elf_section_data (sec)->this_hdr.contents; 791 bfd_vma endaddr = sec->size; 792 793 /* Actually delete the bytes. */ 794 memmove (contents + addr, contents + addr + count, 795 endaddr - addr - count); 796 797 sec->size -= count; 798 799 adjust_all_relocations (abfd, sec, addr + count, endaddr, -count, 0); 800 return TRUE; 801 } 802 803 static bfd_boolean 804 ip2k_delete_page_insn (bfd *abfd ATTRIBUTE_UNUSED, 805 asection *sec, 806 Elf_Internal_Rela *irel, 807 bfd_boolean *again, 808 struct misc *misc) 809 { 810 /* Note that we've changed the relocs, section contents, etc. */ 811 elf_section_data (sec)->relocs = misc->irelbase; 812 elf_section_data (sec)->this_hdr.contents = misc->contents; 813 misc->symtab_hdr->contents = (bfd_byte *) misc->isymbuf; 814 815 /* Fix the relocation's type. */ 816 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), R_IP2K_NONE); 817 818 /* Delete the PAGE insn. */ 819 if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset, 2)) 820 return FALSE; 821 822 /* Modified => will need to iterate relaxation again. */ 823 *again = TRUE; 824 825 return TRUE; 826 } 827 828 static bfd_boolean 829 ip2k_relax_switch_table_128 (bfd *abfd ATTRIBUTE_UNUSED, 830 asection *sec, 831 Elf_Internal_Rela *irel, 832 bfd_boolean *again, 833 struct misc *misc) 834 { 835 Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count; 836 Elf_Internal_Rela *ireltest = irel; 837 bfd_byte code[4]; 838 bfd_vma addr; 839 840 /* Test all page instructions. */ 841 addr = irel->r_offset; 842 while (1) 843 { 844 if (addr + 4 > sec->size) 845 break; 846 847 ip2k_get_mem (abfd, misc->contents + addr, 4, code); 848 if ((! IS_PAGE_OPCODE (code + 0)) 849 || (! IS_JMP_OPCODE (code + 2))) 850 break; 851 852 /* Validate relocation entry (every entry should have a matching 853 relocation entry). */ 854 if (ireltest >= irelend) 855 { 856 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information.")); 857 return FALSE; 858 } 859 860 if (ireltest->r_offset != addr) 861 { 862 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information.")); 863 return FALSE; 864 } 865 866 if (! ip2k_test_page_insn (abfd, sec, ireltest, misc)) 867 /* Un-removable page insn => nothing can be done. */ 868 return TRUE; 869 870 addr += 4; 871 ireltest += 2; 872 } 873 874 /* Relaxable. Adjust table header. */ 875 ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 4, code); 876 if ((! IS_ADD_W_WREG_OPCODE (code + 0)) 877 || (! IS_ADD_PCL_W_OPCODE (code + 2))) 878 { 879 _bfd_error_handler (_("ip2k relaxer: switch table header corrupt.")); 880 return FALSE; 881 } 882 883 if (!ip2k_elf_relax_delete_bytes (abfd, sec, irel->r_offset - 4, 2)) 884 return FALSE; 885 886 *again = TRUE; 887 888 /* Delete all page instructions in table. */ 889 while (irel < ireltest) 890 { 891 if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc)) 892 return FALSE; 893 irel += 2; 894 } 895 896 return TRUE; 897 } 898 899 static bfd_boolean 900 ip2k_relax_switch_table_256 (bfd *abfd ATTRIBUTE_UNUSED, 901 asection *sec, 902 Elf_Internal_Rela *irel, 903 bfd_boolean *again, 904 struct misc *misc) 905 { 906 Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count; 907 Elf_Internal_Rela *ireltest = irel; 908 bfd_byte code[12]; 909 bfd_vma addr; 910 911 /* Test all page instructions. */ 912 addr = irel->r_offset; 913 914 while (1) 915 { 916 if (addr + 4 > sec->size) 917 break; 918 919 ip2k_get_mem (abfd, misc->contents + addr, 4, code); 920 921 if ((! IS_PAGE_OPCODE (code + 0)) 922 || (! IS_JMP_OPCODE (code + 2))) 923 break; 924 925 /* Validate relocation entry (every entry should have a matching 926 relocation entry). */ 927 if (ireltest >= irelend) 928 { 929 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information.")); 930 return FALSE; 931 } 932 933 if (ireltest->r_offset != addr) 934 { 935 _bfd_error_handler (_("ip2k relaxer: switch table without complete matching relocation information.")); 936 return FALSE; 937 } 938 939 if (!ip2k_test_page_insn (abfd, sec, ireltest, misc)) 940 /* Un-removable page insn => nothing can be done. */ 941 return TRUE; 942 943 addr += 4; 944 ireltest += 2; 945 } 946 947 /* Relaxable. Adjust table header. */ 948 ip2k_get_mem (abfd, misc->contents + irel->r_offset - 4, 2, code); 949 if (IS_PAGE_OPCODE (code)) 950 addr = irel->r_offset - 16; 951 else 952 addr = irel->r_offset - 14; 953 954 ip2k_get_mem (abfd, misc->contents + addr, 12, code); 955 if ((!IS_ADD_W_WREG_OPCODE (code + 0)) 956 || (!IS_SNC_OPCODE (code + 2)) 957 || (!IS_INC_1SP_OPCODE (code + 4)) 958 || (!IS_ADD_2SP_W_OPCODE (code + 6)) 959 || (!IS_SNC_OPCODE (code + 8)) 960 || (!IS_INC_1SP_OPCODE (code + 10))) 961 { 962 _bfd_error_handler (_("ip2k relaxer: switch table header corrupt.")); 963 return FALSE; 964 } 965 966 /* Delete first 3 opcodes. */ 967 if (!ip2k_elf_relax_delete_bytes (abfd, sec, addr + 0, 6)) 968 return FALSE; 969 970 *again = TRUE; 971 972 /* Delete all page instructions in table. */ 973 while (irel < ireltest) 974 { 975 if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc)) 976 return FALSE; 977 irel += 2; 978 } 979 980 return TRUE; 981 } 982 983 /* This function handles relaxation of a section in a specific page. */ 984 985 static bfd_boolean 986 ip2k_elf_relax_section_page (bfd *abfd, 987 asection *sec, 988 bfd_boolean *again, 989 struct misc *misc, 990 unsigned long page_start, 991 unsigned long page_end) 992 { 993 Elf_Internal_Rela *irelend = misc->irelbase + sec->reloc_count; 994 Elf_Internal_Rela *irel; 995 int switch_table_128; 996 int switch_table_256; 997 998 /* Walk thru the section looking for relaxation opportunities. */ 999 for (irel = misc->irelbase; irel < irelend; irel++) 1000 { 1001 if (ELF32_R_TYPE (irel->r_info) != (int) R_IP2K_PAGE3) 1002 /* Ignore non page instructions. */ 1003 continue; 1004 1005 if (BASEADDR (sec) + irel->r_offset < page_start) 1006 /* Ignore page instructions on earlier page - they have 1007 already been processed. Remember that there is code flow 1008 that crosses a page boundary. */ 1009 continue; 1010 1011 if (BASEADDR (sec) + irel->r_offset > page_end) 1012 /* Flow beyond end of page => nothing more to do for this page. */ 1013 return TRUE; 1014 1015 /* Detect switch tables. */ 1016 switch_table_128 = ip2k_is_switch_table_128 (abfd, sec, irel->r_offset, misc->contents); 1017 switch_table_256 = ip2k_is_switch_table_256 (abfd, sec, irel->r_offset, misc->contents); 1018 1019 if ((switch_table_128 > 0) || (switch_table_256 > 0)) 1020 /* If the index is greater than 0 then it has already been processed. */ 1021 continue; 1022 1023 if (switch_table_128 == 0) 1024 { 1025 if (!ip2k_relax_switch_table_128 (abfd, sec, irel, again, misc)) 1026 return FALSE; 1027 1028 continue; 1029 } 1030 1031 if (switch_table_256 == 0) 1032 { 1033 if (!ip2k_relax_switch_table_256 (abfd, sec, irel, again, misc)) 1034 return FALSE; 1035 1036 continue; 1037 } 1038 1039 /* Simple relax. */ 1040 if (ip2k_test_page_insn (abfd, sec, irel, misc)) 1041 { 1042 if (!ip2k_delete_page_insn (abfd, sec, irel, again, misc)) 1043 return FALSE; 1044 1045 continue; 1046 } 1047 } 1048 1049 return TRUE; 1050 } 1051 1052 /* This function handles relaxing for the ip2k. 1053 1054 Principle: Start with the first page and remove page instructions that 1055 are not require on this first page. By removing page instructions more 1056 code will fit into this page - repeat until nothing more can be achieved 1057 for this page. Move on to the next page. 1058 1059 Processing the pages one at a time from the lowest page allows a removal 1060 only policy to be used - pages can be removed but are never reinserted. */ 1061 1062 static bfd_boolean 1063 ip2k_elf_relax_section (bfd *abfd, 1064 asection *sec, 1065 struct bfd_link_info *link_info, 1066 bfd_boolean *again) 1067 { 1068 Elf_Internal_Shdr *symtab_hdr; 1069 Elf_Internal_Rela *internal_relocs; 1070 bfd_byte *contents = NULL; 1071 Elf_Internal_Sym *isymbuf = NULL; 1072 static asection * first_section = NULL; 1073 static unsigned long search_addr; 1074 static unsigned long page_start = 0; 1075 static unsigned long page_end = 0; 1076 static unsigned int pass = 0; 1077 static bfd_boolean new_pass = FALSE; 1078 static bfd_boolean changed = FALSE; 1079 struct misc misc; 1080 1081 /* Assume nothing changes. */ 1082 *again = FALSE; 1083 1084 if (first_section == NULL) 1085 { 1086 ip2k_relaxed = TRUE; 1087 first_section = sec; 1088 } 1089 1090 if (first_section == sec) 1091 { 1092 pass++; 1093 new_pass = TRUE; 1094 } 1095 1096 /* We don't have to do anything for a relocatable link, 1097 if this section does not have relocs, or if this is 1098 not a code section. */ 1099 if (link_info->relocatable 1100 || (sec->flags & SEC_RELOC) == 0 1101 || sec->reloc_count == 0 1102 || (sec->flags & SEC_CODE) == 0) 1103 return TRUE; 1104 1105 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1106 1107 internal_relocs = _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, 1108 link_info->keep_memory); 1109 if (internal_relocs == NULL) 1110 goto error_return; 1111 1112 /* Get section contents cached copy if it exists. */ 1113 if (contents == NULL) 1114 { 1115 /* Get cached copy if it exists. */ 1116 if (elf_section_data (sec)->this_hdr.contents != NULL) 1117 contents = elf_section_data (sec)->this_hdr.contents; 1118 else 1119 { 1120 /* Go get them off disk. */ 1121 if (!bfd_malloc_and_get_section (abfd, sec, &contents)) 1122 goto error_return; 1123 } 1124 } 1125 1126 /* Read this BFD's symbols cached copy if it exists. */ 1127 if (isymbuf == NULL && symtab_hdr->sh_info != 0) 1128 { 1129 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 1130 if (isymbuf == NULL) 1131 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, 1132 symtab_hdr->sh_info, 0, 1133 NULL, NULL, NULL); 1134 if (isymbuf == NULL) 1135 goto error_return; 1136 } 1137 1138 misc.symtab_hdr = symtab_hdr; 1139 misc.isymbuf = isymbuf; 1140 misc.irelbase = internal_relocs; 1141 misc.contents = contents; 1142 1143 /* This is where all the relaxation actually get done. */ 1144 if ((pass == 1) || (new_pass && !changed)) 1145 { 1146 /* On the first pass we simply search for the lowest page that 1147 we havn't relaxed yet. Note that the pass count is reset 1148 each time a page is complete in order to move on to the next page. 1149 If we can't find any more pages then we are finished. */ 1150 if (new_pass) 1151 { 1152 pass = 1; 1153 new_pass = FALSE; 1154 changed = TRUE; /* Pre-initialize to break out of pass 1. */ 1155 search_addr = 0xFFFFFFFF; 1156 } 1157 1158 if ((BASEADDR (sec) + sec->size < search_addr) 1159 && (BASEADDR (sec) + sec->size > page_end)) 1160 { 1161 if (BASEADDR (sec) <= page_end) 1162 search_addr = page_end + 1; 1163 else 1164 search_addr = BASEADDR (sec); 1165 1166 /* Found a page => more work to do. */ 1167 *again = TRUE; 1168 } 1169 } 1170 else 1171 { 1172 if (new_pass) 1173 { 1174 new_pass = FALSE; 1175 changed = FALSE; 1176 page_start = PAGENO (search_addr); 1177 page_end = page_start | 0x00003FFF; 1178 } 1179 1180 /* Only process sections in range. */ 1181 if ((BASEADDR (sec) + sec->size >= page_start) 1182 && (BASEADDR (sec) <= page_end)) 1183 { 1184 if (!ip2k_elf_relax_section_page (abfd, sec, &changed, &misc, page_start, page_end)) 1185 return FALSE; 1186 } 1187 *again = TRUE; 1188 } 1189 1190 /* Perform some house keeping after relaxing the section. */ 1191 1192 if (isymbuf != NULL 1193 && symtab_hdr->contents != (unsigned char *) isymbuf) 1194 { 1195 if (! link_info->keep_memory) 1196 free (isymbuf); 1197 else 1198 symtab_hdr->contents = (unsigned char *) isymbuf; 1199 } 1200 1201 if (contents != NULL 1202 && elf_section_data (sec)->this_hdr.contents != contents) 1203 { 1204 if (! link_info->keep_memory) 1205 free (contents); 1206 else 1207 { 1208 /* Cache the section contents for elf_link_input_bfd. */ 1209 elf_section_data (sec)->this_hdr.contents = contents; 1210 } 1211 } 1212 1213 if (internal_relocs != NULL 1214 && elf_section_data (sec)->relocs != internal_relocs) 1215 free (internal_relocs); 1216 1217 return TRUE; 1218 1219 error_return: 1220 if (isymbuf != NULL 1221 && symtab_hdr->contents != (unsigned char *) isymbuf) 1222 free (isymbuf); 1223 if (contents != NULL 1224 && elf_section_data (sec)->this_hdr.contents != contents) 1225 free (contents); 1226 if (internal_relocs != NULL 1227 && elf_section_data (sec)->relocs != internal_relocs) 1228 free (internal_relocs); 1229 return FALSE; 1230 } 1231 1232 /* Set the howto pointer for a IP2K ELF reloc. */ 1233 1234 static void 1235 ip2k_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED, 1236 arelent * cache_ptr, 1237 Elf_Internal_Rela * dst) 1238 { 1239 unsigned int r_type; 1240 1241 r_type = ELF32_R_TYPE (dst->r_info); 1242 cache_ptr->howto = & ip2k_elf_howto_table [r_type]; 1243 } 1244 1245 /* Perform a single relocation. 1246 By default we use the standard BFD routines. */ 1247 1248 static bfd_reloc_status_type 1249 ip2k_final_link_relocate (reloc_howto_type * howto, 1250 bfd * input_bfd, 1251 asection * input_section, 1252 bfd_byte * contents, 1253 Elf_Internal_Rela * rel, 1254 bfd_vma relocation) 1255 { 1256 static bfd_vma page_addr = 0; 1257 1258 bfd_reloc_status_type r = bfd_reloc_ok; 1259 switch (howto->type) 1260 { 1261 /* Handle data space relocations. */ 1262 case R_IP2K_FR9: 1263 case R_IP2K_BANK: 1264 if ((relocation & IP2K_DATA_MASK) == IP2K_DATA_VALUE) 1265 relocation &= ~IP2K_DATA_MASK; 1266 else 1267 r = bfd_reloc_notsupported; 1268 break; 1269 1270 case R_IP2K_LO8DATA: 1271 case R_IP2K_HI8DATA: 1272 case R_IP2K_EX8DATA: 1273 break; 1274 1275 /* Handle insn space relocations. */ 1276 case R_IP2K_PAGE3: 1277 page_addr = BASEADDR (input_section) + rel->r_offset; 1278 if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE) 1279 relocation &= ~IP2K_INSN_MASK; 1280 else 1281 r = bfd_reloc_notsupported; 1282 break; 1283 1284 case R_IP2K_ADDR16CJP: 1285 if (BASEADDR (input_section) + rel->r_offset != page_addr + 2) 1286 { 1287 /* No preceding page instruction, verify that it isn't needed. */ 1288 if (PAGENO (relocation + rel->r_addend) != 1289 ip2k_nominal_page_bits (input_bfd, input_section, 1290 rel->r_offset, contents)) 1291 _bfd_error_handler (_("ip2k linker: missing page instruction at 0x%08lx (dest = 0x%08lx)."), 1292 BASEADDR (input_section) + rel->r_offset, 1293 relocation + rel->r_addend); 1294 } 1295 else if (ip2k_relaxed) 1296 { 1297 /* Preceding page instruction. Verify that the page instruction is 1298 really needed. One reason for the relaxation to miss a page is if 1299 the section is not marked as executable. */ 1300 if (!ip2k_is_switch_table_128 (input_bfd, input_section, 1301 rel->r_offset - 2, contents) 1302 && !ip2k_is_switch_table_256 (input_bfd, input_section, 1303 rel->r_offset - 2, contents) 1304 && (PAGENO (relocation + rel->r_addend) == 1305 ip2k_nominal_page_bits (input_bfd, input_section, 1306 rel->r_offset - 2, contents))) 1307 _bfd_error_handler (_("ip2k linker: redundant page instruction at 0x%08lx (dest = 0x%08lx)."), 1308 page_addr, 1309 relocation + rel->r_addend); 1310 } 1311 if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE) 1312 relocation &= ~IP2K_INSN_MASK; 1313 else 1314 r = bfd_reloc_notsupported; 1315 break; 1316 1317 case R_IP2K_LO8INSN: 1318 case R_IP2K_HI8INSN: 1319 case R_IP2K_PC_SKIP: 1320 if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE) 1321 relocation &= ~IP2K_INSN_MASK; 1322 else 1323 r = bfd_reloc_notsupported; 1324 break; 1325 1326 case R_IP2K_16: 1327 /* If this is a relocation involving a TEXT 1328 symbol, reduce it to a word address. */ 1329 if ((relocation & IP2K_INSN_MASK) == IP2K_INSN_VALUE) 1330 howto = &ip2k_elf_howto_table[ (int) R_IP2K_TEXT]; 1331 break; 1332 1333 /* Pass others through. */ 1334 default: 1335 break; 1336 } 1337 1338 /* Only install relocation if above tests did not disqualify it. */ 1339 if (r == bfd_reloc_ok) 1340 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 1341 contents, rel->r_offset, 1342 relocation, rel->r_addend); 1343 1344 return r; 1345 } 1346 1347 /* Relocate a IP2K ELF section. 1348 1349 The RELOCATE_SECTION function is called by the new ELF backend linker 1350 to handle the relocations for a section. 1351 1352 The relocs are always passed as Rela structures; if the section 1353 actually uses Rel structures, the r_addend field will always be 1354 zero. 1355 1356 This function is responsible for adjusting the section contents as 1357 necessary, and (if using Rela relocs and generating a relocatable 1358 output file) adjusting the reloc addend as necessary. 1359 1360 This function does not have to worry about setting the reloc 1361 address or the reloc symbol index. 1362 1363 LOCAL_SYMS is a pointer to the swapped in local symbols. 1364 1365 LOCAL_SECTIONS is an array giving the section in the input file 1366 corresponding to the st_shndx field of each local symbol. 1367 1368 The global hash table entry for the global symbols can be found 1369 via elf_sym_hashes (input_bfd). 1370 1371 When generating relocatable output, this function must handle 1372 STB_LOCAL/STT_SECTION symbols specially. The output symbol is 1373 going to be the section symbol corresponding to the output 1374 section, which means that the addend must be adjusted 1375 accordingly. */ 1376 1377 static bfd_boolean 1378 ip2k_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, 1379 struct bfd_link_info *info, 1380 bfd *input_bfd, 1381 asection *input_section, 1382 bfd_byte *contents, 1383 Elf_Internal_Rela *relocs, 1384 Elf_Internal_Sym *local_syms, 1385 asection **local_sections) 1386 { 1387 Elf_Internal_Shdr *symtab_hdr; 1388 struct elf_link_hash_entry **sym_hashes; 1389 Elf_Internal_Rela *rel; 1390 Elf_Internal_Rela *relend; 1391 1392 symtab_hdr = & elf_tdata (input_bfd)->symtab_hdr; 1393 sym_hashes = elf_sym_hashes (input_bfd); 1394 relend = relocs + input_section->reloc_count; 1395 1396 for (rel = relocs; rel < relend; rel ++) 1397 { 1398 reloc_howto_type * howto; 1399 unsigned long r_symndx; 1400 Elf_Internal_Sym * sym; 1401 asection * sec; 1402 struct elf_link_hash_entry * h; 1403 bfd_vma relocation; 1404 bfd_reloc_status_type r; 1405 const char * name = NULL; 1406 int r_type; 1407 1408 r_type = ELF32_R_TYPE (rel->r_info); 1409 r_symndx = ELF32_R_SYM (rel->r_info); 1410 howto = ip2k_elf_howto_table + r_type; 1411 h = NULL; 1412 sym = NULL; 1413 sec = NULL; 1414 1415 if (r_symndx < symtab_hdr->sh_info) 1416 { 1417 sym = local_syms + r_symndx; 1418 sec = local_sections [r_symndx]; 1419 relocation = BASEADDR (sec) + sym->st_value; 1420 1421 name = bfd_elf_string_from_elf_section 1422 (input_bfd, symtab_hdr->sh_link, sym->st_name); 1423 name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name; 1424 } 1425 else 1426 { 1427 bfd_boolean warned, ignored; 1428 bfd_boolean unresolved_reloc; 1429 1430 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 1431 r_symndx, symtab_hdr, sym_hashes, 1432 h, sec, relocation, 1433 unresolved_reloc, warned, ignored); 1434 1435 name = h->root.root.string; 1436 } 1437 1438 if (sec != NULL && discarded_section (sec)) 1439 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 1440 rel, 1, relend, howto, 0, contents); 1441 1442 if (info->relocatable) 1443 continue; 1444 1445 /* Finally, the sole IP2K-specific part. */ 1446 r = ip2k_final_link_relocate (howto, input_bfd, input_section, 1447 contents, rel, relocation); 1448 1449 if (r != bfd_reloc_ok) 1450 { 1451 const char * msg = NULL; 1452 1453 switch (r) 1454 { 1455 case bfd_reloc_overflow: 1456 r = info->callbacks->reloc_overflow 1457 (info, (h ? &h->root : NULL), name, howto->name, 1458 (bfd_vma) 0, input_bfd, input_section, rel->r_offset); 1459 break; 1460 1461 case bfd_reloc_undefined: 1462 r = info->callbacks->undefined_symbol 1463 (info, name, input_bfd, input_section, rel->r_offset, TRUE); 1464 break; 1465 1466 case bfd_reloc_outofrange: 1467 msg = _("internal error: out of range error"); 1468 break; 1469 1470 /* This is how ip2k_final_link_relocate tells us of a non-kosher 1471 reference between insn & data address spaces. */ 1472 case bfd_reloc_notsupported: 1473 if (sym != NULL) /* Only if it's not an unresolved symbol. */ 1474 msg = _("unsupported relocation between data/insn address spaces"); 1475 break; 1476 1477 case bfd_reloc_dangerous: 1478 msg = _("internal error: dangerous relocation"); 1479 break; 1480 1481 default: 1482 msg = _("internal error: unknown error"); 1483 break; 1484 } 1485 1486 if (msg) 1487 r = info->callbacks->warning 1488 (info, msg, name, input_bfd, input_section, rel->r_offset); 1489 1490 if (! r) 1491 return FALSE; 1492 } 1493 } 1494 1495 return TRUE; 1496 } 1497 1498 #define TARGET_BIG_SYM ip2k_elf32_vec 1499 #define TARGET_BIG_NAME "elf32-ip2k" 1500 1501 #define ELF_ARCH bfd_arch_ip2k 1502 #define ELF_MACHINE_CODE EM_IP2K 1503 #define ELF_MACHINE_ALT1 EM_IP2K_OLD 1504 #define ELF_MAXPAGESIZE 1 /* No pages on the IP2K. */ 1505 1506 #define elf_info_to_howto_rel NULL 1507 #define elf_info_to_howto ip2k_info_to_howto_rela 1508 1509 #define elf_backend_can_gc_sections 1 1510 #define elf_backend_rela_normal 1 1511 #define elf_backend_relocate_section ip2k_elf_relocate_section 1512 1513 #define elf_symbol_leading_char '_' 1514 #define bfd_elf32_bfd_reloc_type_lookup ip2k_reloc_type_lookup 1515 #define bfd_elf32_bfd_reloc_name_lookup ip2k_reloc_name_lookup 1516 #define bfd_elf32_bfd_relax_section ip2k_elf_relax_section 1517 1518 #include "elf32-target.h" 1519