1 /* 32-bit ELF support for TI C6X 2 Copyright 2010 3 Free Software Foundation, Inc. 4 Contributed by Joseph Myers <joseph@codesourcery.com> 5 Bernd Schmidt <bernds@codesourcery.com> 6 7 This file is part of BFD, the Binary File Descriptor library. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program; if not, write to the Free Software 21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 22 MA 02110-1301, USA. */ 23 24 #include "sysdep.h" 25 #include "bfd.h" 26 #include "libbfd.h" 27 #include "libiberty.h" 28 #include "elf-bfd.h" 29 #include "elf/tic6x.h" 30 #include "elf32-tic6x.h" 31 32 struct elf32_tic6x_obj_tdata 33 { 34 struct elf_obj_tdata root; 35 36 /* Whether to use RELA relocations when generating relocations. 37 This is a per-object flag to allow the assembler to generate REL 38 relocations for use in linker testcases. */ 39 bfd_boolean use_rela_p; 40 }; 41 42 #define elf32_tic6x_tdata(abfd) \ 43 ((struct elf32_tic6x_obj_tdata *) (abfd)->tdata.any) 44 45 static reloc_howto_type elf32_tic6x_howto_table[] = 46 { 47 HOWTO (R_C6000_NONE, /* type */ 48 0, /* rightshift */ 49 0, /* size (0 = byte, 1 = short, 2 = long) */ 50 0, /* bitsize */ 51 FALSE, /* pc_relative */ 52 0, /* bitpos */ 53 complain_overflow_dont,/* complain_on_overflow */ 54 bfd_elf_generic_reloc, /* special_function */ 55 "R_C6000_NONE", /* name */ 56 FALSE, /* partial_inplace */ 57 0, /* src_mask */ 58 0, /* dst_mask */ 59 FALSE), /* pcrel_offset */ 60 HOWTO (R_C6000_ABS32, /* type */ 61 0, /* rightshift */ 62 2, /* size (0 = byte, 1 = short, 2 = long) */ 63 32, /* bitsize */ 64 FALSE, /* pc_relative */ 65 0, /* bitpos */ 66 complain_overflow_dont,/* complain_on_overflow */ 67 bfd_elf_generic_reloc, /* special_function */ 68 "R_C6000_ABS32", /* name */ 69 FALSE, /* partial_inplace */ 70 0, /* src_mask */ 71 0xffffffff, /* dst_mask */ 72 FALSE), /* pcrel_offset */ 73 HOWTO (R_C6000_ABS16, /* type */ 74 0, /* rightshift */ 75 1, /* size (0 = byte, 1 = short, 2 = long) */ 76 16, /* bitsize */ 77 FALSE, /* pc_relative */ 78 0, /* bitpos */ 79 complain_overflow_bitfield,/* complain_on_overflow */ 80 bfd_elf_generic_reloc, /* special_function */ 81 "R_C6000_ABS16", /* name */ 82 FALSE, /* partial_inplace */ 83 0, /* src_mask */ 84 0x0000ffff, /* dst_mask */ 85 FALSE), /* pcrel_offset */ 86 HOWTO (R_C6000_ABS8, /* type */ 87 0, /* rightshift */ 88 0, /* size (0 = byte, 1 = short, 2 = long) */ 89 8, /* bitsize */ 90 FALSE, /* pc_relative */ 91 0, /* bitpos */ 92 complain_overflow_bitfield,/* complain_on_overflow */ 93 bfd_elf_generic_reloc, /* special_function */ 94 "R_C6000_ABS8", /* name */ 95 FALSE, /* partial_inplace */ 96 0, /* src_mask */ 97 0x000000ff, /* dst_mask */ 98 FALSE), /* pcrel_offset */ 99 HOWTO (R_C6000_PCR_S21, /* type */ 100 2, /* rightshift */ 101 2, /* size (0 = byte, 1 = short, 2 = long) */ 102 21, /* bitsize */ 103 TRUE, /* pc_relative */ 104 7, /* bitpos */ 105 complain_overflow_signed,/* complain_on_overflow */ 106 bfd_elf_generic_reloc, /* special_function */ 107 "R_C6000_PCR_S21", /* name */ 108 FALSE, /* partial_inplace */ 109 0, /* src_mask */ 110 0x0fffff80, /* dst_mask */ 111 TRUE), /* pcrel_offset */ 112 HOWTO (R_C6000_PCR_S12, /* type */ 113 2, /* rightshift */ 114 2, /* size (0 = byte, 1 = short, 2 = long) */ 115 12, /* bitsize */ 116 TRUE, /* pc_relative */ 117 16, /* bitpos */ 118 complain_overflow_signed,/* complain_on_overflow */ 119 bfd_elf_generic_reloc, /* special_function */ 120 "R_C6000_PCR_S12", /* name */ 121 FALSE, /* partial_inplace */ 122 0, /* src_mask */ 123 0x0fff0000, /* dst_mask */ 124 TRUE), /* pcrel_offset */ 125 HOWTO (R_C6000_PCR_S10, /* type */ 126 2, /* rightshift */ 127 2, /* size (0 = byte, 1 = short, 2 = long) */ 128 10, /* bitsize */ 129 TRUE, /* pc_relative */ 130 13, /* bitpos */ 131 complain_overflow_signed,/* complain_on_overflow */ 132 bfd_elf_generic_reloc, /* special_function */ 133 "R_C6000_PCR_S10", /* name */ 134 FALSE, /* partial_inplace */ 135 0, /* src_mask */ 136 0x007fe000, /* dst_mask */ 137 TRUE), /* pcrel_offset */ 138 HOWTO (R_C6000_PCR_S7, /* type */ 139 2, /* rightshift */ 140 2, /* size (0 = byte, 1 = short, 2 = long) */ 141 7, /* bitsize */ 142 TRUE, /* pc_relative */ 143 16, /* bitpos */ 144 complain_overflow_signed,/* complain_on_overflow */ 145 bfd_elf_generic_reloc, /* special_function */ 146 "R_C6000_PCR_S7", /* name */ 147 FALSE, /* partial_inplace */ 148 0, /* src_mask */ 149 0x007f0000, /* dst_mask */ 150 TRUE), /* pcrel_offset */ 151 HOWTO (R_C6000_ABS_S16, /* type */ 152 0, /* rightshift */ 153 2, /* size (0 = byte, 1 = short, 2 = long) */ 154 16, /* bitsize */ 155 FALSE, /* pc_relative */ 156 7, /* bitpos */ 157 complain_overflow_signed,/* complain_on_overflow */ 158 bfd_elf_generic_reloc, /* special_function */ 159 "R_C6000_ABS_S16", /* name */ 160 FALSE, /* partial_inplace */ 161 0, /* src_mask */ 162 0x007fff80, /* dst_mask */ 163 FALSE), /* pcrel_offset */ 164 HOWTO (R_C6000_ABS_L16, /* type */ 165 0, /* rightshift */ 166 2, /* size (0 = byte, 1 = short, 2 = long) */ 167 16, /* bitsize */ 168 FALSE, /* pc_relative */ 169 7, /* bitpos */ 170 complain_overflow_dont,/* complain_on_overflow */ 171 bfd_elf_generic_reloc, /* special_function */ 172 "R_C6000_ABS_L16", /* name */ 173 FALSE, /* partial_inplace */ 174 0, /* src_mask */ 175 0x007fff80, /* dst_mask */ 176 FALSE), /* pcrel_offset */ 177 HOWTO (R_C6000_ABS_H16, /* type */ 178 16, /* rightshift */ 179 2, /* size (0 = byte, 1 = short, 2 = long) */ 180 16, /* bitsize */ 181 FALSE, /* pc_relative */ 182 7, /* bitpos */ 183 complain_overflow_dont,/* complain_on_overflow */ 184 bfd_elf_generic_reloc, /* special_function */ 185 "R_C6000_ABS_H16", /* name */ 186 FALSE, /* partial_inplace */ 187 0, /* src_mask */ 188 0x007fff80, /* dst_mask */ 189 FALSE), /* pcrel_offset */ 190 HOWTO (R_C6000_SBR_U15_B, /* type */ 191 0, /* rightshift */ 192 2, /* size (0 = byte, 1 = short, 2 = long) */ 193 15, /* bitsize */ 194 FALSE, /* pc_relative */ 195 8, /* bitpos */ 196 complain_overflow_unsigned,/* complain_on_overflow */ 197 bfd_elf_generic_reloc, /* special_function */ 198 "R_C6000_SBR_U15_B", /* name */ 199 FALSE, /* partial_inplace */ 200 0, /* src_mask */ 201 0x007fff00, /* dst_mask */ 202 FALSE), /* pcrel_offset */ 203 HOWTO (R_C6000_SBR_U15_H, /* type */ 204 1, /* rightshift */ 205 2, /* size (0 = byte, 1 = short, 2 = long) */ 206 15, /* bitsize */ 207 FALSE, /* pc_relative */ 208 8, /* bitpos */ 209 complain_overflow_unsigned,/* complain_on_overflow */ 210 bfd_elf_generic_reloc, /* special_function */ 211 "R_C6000_SBR_U15_H", /* name */ 212 FALSE, /* partial_inplace */ 213 0, /* src_mask */ 214 0x007fff00, /* dst_mask */ 215 FALSE), /* pcrel_offset */ 216 HOWTO (R_C6000_SBR_U15_W, /* type */ 217 2, /* rightshift */ 218 2, /* size (0 = byte, 1 = short, 2 = long) */ 219 15, /* bitsize */ 220 FALSE, /* pc_relative */ 221 8, /* bitpos */ 222 complain_overflow_unsigned,/* complain_on_overflow */ 223 bfd_elf_generic_reloc, /* special_function */ 224 "R_C6000_SBR_U15_W", /* name */ 225 FALSE, /* partial_inplace */ 226 0, /* src_mask */ 227 0x007fff00, /* dst_mask */ 228 FALSE), /* pcrel_offset */ 229 HOWTO (R_C6000_SBR_S16, /* type */ 230 0, /* rightshift */ 231 2, /* size (0 = byte, 1 = short, 2 = long) */ 232 16, /* bitsize */ 233 FALSE, /* pc_relative */ 234 7, /* bitpos */ 235 complain_overflow_signed,/* complain_on_overflow */ 236 bfd_elf_generic_reloc, /* special_function */ 237 "R_C6000_SBR_S16", /* name */ 238 FALSE, /* partial_inplace */ 239 0, /* src_mask */ 240 0x007fff80, /* dst_mask */ 241 FALSE), /* pcrel_offset */ 242 HOWTO (R_C6000_SBR_L16_B, /* type */ 243 0, /* rightshift */ 244 2, /* size (0 = byte, 1 = short, 2 = long) */ 245 16, /* bitsize */ 246 FALSE, /* pc_relative */ 247 7, /* bitpos */ 248 complain_overflow_dont,/* complain_on_overflow */ 249 bfd_elf_generic_reloc, /* special_function */ 250 "R_C6000_SBR_L16_B", /* name */ 251 FALSE, /* partial_inplace */ 252 0, /* src_mask */ 253 0x007fff80, /* dst_mask */ 254 FALSE), /* pcrel_offset */ 255 HOWTO (R_C6000_SBR_L16_H, /* type */ 256 1, /* rightshift */ 257 2, /* size (0 = byte, 1 = short, 2 = long) */ 258 16, /* bitsize */ 259 FALSE, /* pc_relative */ 260 7, /* bitpos */ 261 complain_overflow_dont,/* complain_on_overflow */ 262 bfd_elf_generic_reloc, /* special_function */ 263 "R_C6000_SBR_L16_H", /* name */ 264 FALSE, /* partial_inplace */ 265 0, /* src_mask */ 266 0x007fff80, /* dst_mask */ 267 FALSE), /* pcrel_offset */ 268 HOWTO (R_C6000_SBR_L16_W, /* type */ 269 2, /* rightshift */ 270 2, /* size (0 = byte, 1 = short, 2 = long) */ 271 16, /* bitsize */ 272 FALSE, /* pc_relative */ 273 7, /* bitpos */ 274 complain_overflow_dont,/* complain_on_overflow */ 275 bfd_elf_generic_reloc, /* special_function */ 276 "R_C6000_SBR_L16_W", /* name */ 277 FALSE, /* partial_inplace */ 278 0, /* src_mask */ 279 0x007fff80, /* dst_mask */ 280 FALSE), /* pcrel_offset */ 281 HOWTO (R_C6000_SBR_H16_B, /* type */ 282 16, /* rightshift */ 283 2, /* size (0 = byte, 1 = short, 2 = long) */ 284 16, /* bitsize */ 285 FALSE, /* pc_relative */ 286 7, /* bitpos */ 287 complain_overflow_dont,/* complain_on_overflow */ 288 bfd_elf_generic_reloc, /* special_function */ 289 "R_C6000_SBR_H16_B", /* name */ 290 FALSE, /* partial_inplace */ 291 0, /* src_mask */ 292 0x007fff80, /* dst_mask */ 293 FALSE), /* pcrel_offset */ 294 HOWTO (R_C6000_SBR_H16_H, /* type */ 295 17, /* rightshift */ 296 2, /* size (0 = byte, 1 = short, 2 = long) */ 297 16, /* bitsize */ 298 FALSE, /* pc_relative */ 299 7, /* bitpos */ 300 complain_overflow_dont,/* complain_on_overflow */ 301 bfd_elf_generic_reloc, /* special_function */ 302 "R_C6000_SBR_H16_H", /* name */ 303 FALSE, /* partial_inplace */ 304 0, /* src_mask */ 305 0x007fff80, /* dst_mask */ 306 FALSE), /* pcrel_offset */ 307 HOWTO (R_C6000_SBR_H16_W, /* type */ 308 18, /* rightshift */ 309 2, /* size (0 = byte, 1 = short, 2 = long) */ 310 16, /* bitsize */ 311 FALSE, /* pc_relative */ 312 7, /* bitpos */ 313 complain_overflow_dont,/* complain_on_overflow */ 314 bfd_elf_generic_reloc, /* special_function */ 315 "R_C6000_SBR_H16_W", /* name */ 316 FALSE, /* partial_inplace */ 317 0, /* src_mask */ 318 0x007fff80, /* dst_mask */ 319 FALSE), /* pcrel_offset */ 320 HOWTO (R_C6000_SBR_GOT_U15_W, /* type */ 321 2, /* rightshift */ 322 2, /* size (0 = byte, 1 = short, 2 = long) */ 323 15, /* bitsize */ 324 FALSE, /* pc_relative */ 325 8, /* bitpos */ 326 complain_overflow_unsigned,/* complain_on_overflow */ 327 bfd_elf_generic_reloc, /* special_function */ 328 "R_C6000_SBR_GOT_U15_W",/* name */ 329 FALSE, /* partial_inplace */ 330 0, /* src_mask */ 331 0x007fff00, /* dst_mask */ 332 FALSE), /* pcrel_offset */ 333 HOWTO (R_C6000_SBR_GOT_L16_W, /* type */ 334 2, /* rightshift */ 335 2, /* size (0 = byte, 1 = short, 2 = long) */ 336 16, /* bitsize */ 337 FALSE, /* pc_relative */ 338 7, /* bitpos */ 339 complain_overflow_dont,/* complain_on_overflow */ 340 bfd_elf_generic_reloc, /* special_function */ 341 "R_C6000_SBR_GOT_L16_W",/* name */ 342 FALSE, /* partial_inplace */ 343 0, /* src_mask */ 344 0x007fff80, /* dst_mask */ 345 FALSE), /* pcrel_offset */ 346 HOWTO (R_C6000_SBR_GOT_H16_W, /* type */ 347 18, /* rightshift */ 348 2, /* size (0 = byte, 1 = short, 2 = long) */ 349 16, /* bitsize */ 350 FALSE, /* pc_relative */ 351 7, /* bitpos */ 352 complain_overflow_dont,/* complain_on_overflow */ 353 bfd_elf_generic_reloc, /* special_function */ 354 "R_C6000_SBR_GOT_H16_W",/* name */ 355 FALSE, /* partial_inplace */ 356 0, /* src_mask */ 357 0x007fff80, /* dst_mask */ 358 FALSE), /* pcrel_offset */ 359 HOWTO (R_C6000_DSBT_INDEX, /* type */ 360 0, /* rightshift */ 361 2, /* size (0 = byte, 1 = short, 2 = long) */ 362 15, /* bitsize */ 363 FALSE, /* pc_relative */ 364 8, /* bitpos */ 365 complain_overflow_unsigned,/* complain_on_overflow */ 366 bfd_elf_generic_reloc, /* special_function */ 367 "R_C6000_DSBT_INDEX", /* name */ 368 FALSE, /* partial_inplace */ 369 0, /* src_mask */ 370 0x007fff00, /* dst_mask */ 371 FALSE), /* pcrel_offset */ 372 HOWTO (R_C6000_PREL31, /* type */ 373 1, /* rightshift */ 374 2, /* size (0 = byte, 1 = short, 2 = long) */ 375 31, /* bitsize */ 376 FALSE, /* pc_relative */ 377 0, /* bitpos */ 378 complain_overflow_dont,/* complain_on_overflow */ 379 bfd_elf_generic_reloc, /* special_function */ 380 "R_C6000_PREL31", /* name */ 381 FALSE, /* partial_inplace */ 382 0, /* src_mask */ 383 0x7fffffff, /* dst_mask */ 384 FALSE), /* pcrel_offset */ 385 HOWTO (R_C6000_COPY, /* type */ 386 0, /* rightshift */ 387 2, /* size (0 = byte, 1 = short, 2 = long) */ 388 32, /* bitsize */ 389 FALSE, /* pc_relative */ 390 0, /* bitpos */ 391 complain_overflow_dont,/* complain_on_overflow */ 392 bfd_elf_generic_reloc, /* special_function */ 393 "R_C6000_COPY", /* name */ 394 FALSE, /* partial_inplace */ 395 0, /* src_mask */ 396 0xffffffff, /* dst_mask */ 397 FALSE), /* pcrel_offset */ 398 EMPTY_HOWTO (27), 399 EMPTY_HOWTO (28), 400 EMPTY_HOWTO (29), 401 EMPTY_HOWTO (30), 402 EMPTY_HOWTO (31), 403 EMPTY_HOWTO (32), 404 EMPTY_HOWTO (33), 405 EMPTY_HOWTO (34), 406 EMPTY_HOWTO (35), 407 EMPTY_HOWTO (36), 408 EMPTY_HOWTO (37), 409 EMPTY_HOWTO (38), 410 EMPTY_HOWTO (39), 411 EMPTY_HOWTO (40), 412 EMPTY_HOWTO (41), 413 EMPTY_HOWTO (42), 414 EMPTY_HOWTO (43), 415 EMPTY_HOWTO (44), 416 EMPTY_HOWTO (45), 417 EMPTY_HOWTO (46), 418 EMPTY_HOWTO (47), 419 EMPTY_HOWTO (48), 420 EMPTY_HOWTO (49), 421 EMPTY_HOWTO (50), 422 EMPTY_HOWTO (51), 423 EMPTY_HOWTO (52), 424 EMPTY_HOWTO (53), 425 EMPTY_HOWTO (54), 426 EMPTY_HOWTO (55), 427 EMPTY_HOWTO (56), 428 EMPTY_HOWTO (57), 429 EMPTY_HOWTO (58), 430 EMPTY_HOWTO (59), 431 EMPTY_HOWTO (60), 432 EMPTY_HOWTO (61), 433 EMPTY_HOWTO (62), 434 EMPTY_HOWTO (63), 435 EMPTY_HOWTO (64), 436 EMPTY_HOWTO (65), 437 EMPTY_HOWTO (66), 438 EMPTY_HOWTO (67), 439 EMPTY_HOWTO (68), 440 EMPTY_HOWTO (69), 441 EMPTY_HOWTO (70), 442 EMPTY_HOWTO (71), 443 EMPTY_HOWTO (72), 444 EMPTY_HOWTO (73), 445 EMPTY_HOWTO (74), 446 EMPTY_HOWTO (75), 447 EMPTY_HOWTO (76), 448 EMPTY_HOWTO (77), 449 EMPTY_HOWTO (78), 450 EMPTY_HOWTO (79), 451 EMPTY_HOWTO (80), 452 EMPTY_HOWTO (81), 453 EMPTY_HOWTO (82), 454 EMPTY_HOWTO (83), 455 EMPTY_HOWTO (84), 456 EMPTY_HOWTO (85), 457 EMPTY_HOWTO (86), 458 EMPTY_HOWTO (87), 459 EMPTY_HOWTO (88), 460 EMPTY_HOWTO (89), 461 EMPTY_HOWTO (90), 462 EMPTY_HOWTO (91), 463 EMPTY_HOWTO (92), 464 EMPTY_HOWTO (93), 465 EMPTY_HOWTO (94), 466 EMPTY_HOWTO (95), 467 EMPTY_HOWTO (96), 468 EMPTY_HOWTO (97), 469 EMPTY_HOWTO (98), 470 EMPTY_HOWTO (99), 471 EMPTY_HOWTO (100), 472 EMPTY_HOWTO (101), 473 EMPTY_HOWTO (102), 474 EMPTY_HOWTO (103), 475 EMPTY_HOWTO (104), 476 EMPTY_HOWTO (105), 477 EMPTY_HOWTO (106), 478 EMPTY_HOWTO (107), 479 EMPTY_HOWTO (108), 480 EMPTY_HOWTO (109), 481 EMPTY_HOWTO (110), 482 EMPTY_HOWTO (111), 483 EMPTY_HOWTO (112), 484 EMPTY_HOWTO (113), 485 EMPTY_HOWTO (114), 486 EMPTY_HOWTO (115), 487 EMPTY_HOWTO (116), 488 EMPTY_HOWTO (117), 489 EMPTY_HOWTO (118), 490 EMPTY_HOWTO (119), 491 EMPTY_HOWTO (120), 492 EMPTY_HOWTO (121), 493 EMPTY_HOWTO (122), 494 EMPTY_HOWTO (123), 495 EMPTY_HOWTO (124), 496 EMPTY_HOWTO (125), 497 EMPTY_HOWTO (126), 498 EMPTY_HOWTO (127), 499 EMPTY_HOWTO (128), 500 EMPTY_HOWTO (129), 501 EMPTY_HOWTO (130), 502 EMPTY_HOWTO (131), 503 EMPTY_HOWTO (132), 504 EMPTY_HOWTO (133), 505 EMPTY_HOWTO (134), 506 EMPTY_HOWTO (135), 507 EMPTY_HOWTO (136), 508 EMPTY_HOWTO (137), 509 EMPTY_HOWTO (138), 510 EMPTY_HOWTO (139), 511 EMPTY_HOWTO (140), 512 EMPTY_HOWTO (141), 513 EMPTY_HOWTO (142), 514 EMPTY_HOWTO (143), 515 EMPTY_HOWTO (144), 516 EMPTY_HOWTO (145), 517 EMPTY_HOWTO (146), 518 EMPTY_HOWTO (147), 519 EMPTY_HOWTO (148), 520 EMPTY_HOWTO (149), 521 EMPTY_HOWTO (150), 522 EMPTY_HOWTO (151), 523 EMPTY_HOWTO (152), 524 EMPTY_HOWTO (153), 525 EMPTY_HOWTO (154), 526 EMPTY_HOWTO (155), 527 EMPTY_HOWTO (156), 528 EMPTY_HOWTO (157), 529 EMPTY_HOWTO (158), 530 EMPTY_HOWTO (159), 531 EMPTY_HOWTO (160), 532 EMPTY_HOWTO (161), 533 EMPTY_HOWTO (162), 534 EMPTY_HOWTO (163), 535 EMPTY_HOWTO (164), 536 EMPTY_HOWTO (165), 537 EMPTY_HOWTO (166), 538 EMPTY_HOWTO (167), 539 EMPTY_HOWTO (168), 540 EMPTY_HOWTO (169), 541 EMPTY_HOWTO (170), 542 EMPTY_HOWTO (171), 543 EMPTY_HOWTO (172), 544 EMPTY_HOWTO (173), 545 EMPTY_HOWTO (174), 546 EMPTY_HOWTO (175), 547 EMPTY_HOWTO (176), 548 EMPTY_HOWTO (177), 549 EMPTY_HOWTO (178), 550 EMPTY_HOWTO (179), 551 EMPTY_HOWTO (180), 552 EMPTY_HOWTO (181), 553 EMPTY_HOWTO (182), 554 EMPTY_HOWTO (183), 555 EMPTY_HOWTO (184), 556 EMPTY_HOWTO (185), 557 EMPTY_HOWTO (186), 558 EMPTY_HOWTO (187), 559 EMPTY_HOWTO (188), 560 EMPTY_HOWTO (189), 561 EMPTY_HOWTO (190), 562 EMPTY_HOWTO (191), 563 EMPTY_HOWTO (192), 564 EMPTY_HOWTO (193), 565 EMPTY_HOWTO (194), 566 EMPTY_HOWTO (195), 567 EMPTY_HOWTO (196), 568 EMPTY_HOWTO (197), 569 EMPTY_HOWTO (198), 570 EMPTY_HOWTO (199), 571 EMPTY_HOWTO (200), 572 EMPTY_HOWTO (201), 573 EMPTY_HOWTO (202), 574 EMPTY_HOWTO (203), 575 EMPTY_HOWTO (204), 576 EMPTY_HOWTO (205), 577 EMPTY_HOWTO (206), 578 EMPTY_HOWTO (207), 579 EMPTY_HOWTO (208), 580 EMPTY_HOWTO (209), 581 EMPTY_HOWTO (210), 582 EMPTY_HOWTO (211), 583 EMPTY_HOWTO (212), 584 EMPTY_HOWTO (213), 585 EMPTY_HOWTO (214), 586 EMPTY_HOWTO (215), 587 EMPTY_HOWTO (216), 588 EMPTY_HOWTO (217), 589 EMPTY_HOWTO (218), 590 EMPTY_HOWTO (219), 591 EMPTY_HOWTO (220), 592 EMPTY_HOWTO (221), 593 EMPTY_HOWTO (222), 594 EMPTY_HOWTO (223), 595 EMPTY_HOWTO (224), 596 EMPTY_HOWTO (225), 597 EMPTY_HOWTO (226), 598 EMPTY_HOWTO (227), 599 EMPTY_HOWTO (228), 600 EMPTY_HOWTO (229), 601 EMPTY_HOWTO (230), 602 EMPTY_HOWTO (231), 603 EMPTY_HOWTO (232), 604 EMPTY_HOWTO (233), 605 EMPTY_HOWTO (234), 606 EMPTY_HOWTO (235), 607 EMPTY_HOWTO (236), 608 EMPTY_HOWTO (237), 609 EMPTY_HOWTO (238), 610 EMPTY_HOWTO (239), 611 EMPTY_HOWTO (240), 612 EMPTY_HOWTO (241), 613 EMPTY_HOWTO (242), 614 EMPTY_HOWTO (243), 615 EMPTY_HOWTO (244), 616 EMPTY_HOWTO (245), 617 EMPTY_HOWTO (246), 618 EMPTY_HOWTO (247), 619 EMPTY_HOWTO (248), 620 EMPTY_HOWTO (249), 621 EMPTY_HOWTO (250), 622 EMPTY_HOWTO (251), 623 EMPTY_HOWTO (252), 624 HOWTO (R_C6000_ALIGN, /* type */ 625 0, /* rightshift */ 626 0, /* size (0 = byte, 1 = short, 2 = long) */ 627 0, /* bitsize */ 628 FALSE, /* pc_relative */ 629 0, /* bitpos */ 630 complain_overflow_dont,/* complain_on_overflow */ 631 bfd_elf_generic_reloc, /* special_function */ 632 "R_C6000_ALIGN", /* name */ 633 FALSE, /* partial_inplace */ 634 0, /* src_mask */ 635 0, /* dst_mask */ 636 FALSE), /* pcrel_offset */ 637 HOWTO (R_C6000_FPHEAD, /* type */ 638 0, /* rightshift */ 639 0, /* size (0 = byte, 1 = short, 2 = long) */ 640 0, /* bitsize */ 641 FALSE, /* pc_relative */ 642 0, /* bitpos */ 643 complain_overflow_dont,/* complain_on_overflow */ 644 bfd_elf_generic_reloc, /* special_function */ 645 "R_C6000_FPHEAD", /* name */ 646 FALSE, /* partial_inplace */ 647 0, /* src_mask */ 648 0, /* dst_mask */ 649 FALSE), /* pcrel_offset */ 650 HOWTO (R_C6000_NOCMP, /* type */ 651 0, /* rightshift */ 652 0, /* size (0 = byte, 1 = short, 2 = long) */ 653 0, /* bitsize */ 654 FALSE, /* pc_relative */ 655 0, /* bitpos */ 656 complain_overflow_dont,/* complain_on_overflow */ 657 bfd_elf_generic_reloc, /* special_function */ 658 "R_C6000_NOCMP", /* name */ 659 FALSE, /* partial_inplace */ 660 0, /* src_mask */ 661 0, /* dst_mask */ 662 FALSE) /* pcrel_offset */ 663 }; 664 665 static reloc_howto_type elf32_tic6x_howto_table_rel[] = 666 { 667 HOWTO (R_C6000_NONE, /* type */ 668 0, /* rightshift */ 669 0, /* size (0 = byte, 1 = short, 2 = long) */ 670 0, /* bitsize */ 671 FALSE, /* pc_relative */ 672 0, /* bitpos */ 673 complain_overflow_dont,/* complain_on_overflow */ 674 bfd_elf_generic_reloc, /* special_function */ 675 "R_C6000_NONE", /* name */ 676 TRUE, /* partial_inplace */ 677 0, /* src_mask */ 678 0, /* dst_mask */ 679 FALSE), /* pcrel_offset */ 680 HOWTO (R_C6000_ABS32, /* type */ 681 0, /* rightshift */ 682 2, /* size (0 = byte, 1 = short, 2 = long) */ 683 32, /* bitsize */ 684 FALSE, /* pc_relative */ 685 0, /* bitpos */ 686 complain_overflow_dont,/* complain_on_overflow */ 687 bfd_elf_generic_reloc, /* special_function */ 688 "R_C6000_ABS32", /* name */ 689 TRUE, /* partial_inplace */ 690 0xffffffff, /* src_mask */ 691 0xffffffff, /* dst_mask */ 692 FALSE), /* pcrel_offset */ 693 HOWTO (R_C6000_ABS16, /* type */ 694 0, /* rightshift */ 695 1, /* size (0 = byte, 1 = short, 2 = long) */ 696 16, /* bitsize */ 697 FALSE, /* pc_relative */ 698 0, /* bitpos */ 699 complain_overflow_bitfield,/* complain_on_overflow */ 700 bfd_elf_generic_reloc, /* special_function */ 701 "R_C6000_ABS16", /* name */ 702 TRUE, /* partial_inplace */ 703 0x0000ffff, /* src_mask */ 704 0x0000ffff, /* dst_mask */ 705 FALSE), /* pcrel_offset */ 706 HOWTO (R_C6000_ABS8, /* type */ 707 0, /* rightshift */ 708 0, /* size (0 = byte, 1 = short, 2 = long) */ 709 8, /* bitsize */ 710 FALSE, /* pc_relative */ 711 0, /* bitpos */ 712 complain_overflow_bitfield,/* complain_on_overflow */ 713 bfd_elf_generic_reloc, /* special_function */ 714 "R_C6000_ABS8", /* name */ 715 TRUE, /* partial_inplace */ 716 0x000000ff, /* src_mask */ 717 0x000000ff, /* dst_mask */ 718 FALSE), /* pcrel_offset */ 719 HOWTO (R_C6000_PCR_S21, /* type */ 720 2, /* rightshift */ 721 2, /* size (0 = byte, 1 = short, 2 = long) */ 722 21, /* bitsize */ 723 TRUE, /* pc_relative */ 724 7, /* bitpos */ 725 complain_overflow_signed,/* complain_on_overflow */ 726 bfd_elf_generic_reloc, /* special_function */ 727 "R_C6000_PCR_S21", /* name */ 728 TRUE, /* partial_inplace */ 729 0x0fffff80, /* src_mask */ 730 0x0fffff80, /* dst_mask */ 731 TRUE), /* pcrel_offset */ 732 HOWTO (R_C6000_PCR_S12, /* type */ 733 2, /* rightshift */ 734 2, /* size (0 = byte, 1 = short, 2 = long) */ 735 12, /* bitsize */ 736 TRUE, /* pc_relative */ 737 16, /* bitpos */ 738 complain_overflow_signed,/* complain_on_overflow */ 739 bfd_elf_generic_reloc, /* special_function */ 740 "R_C6000_PCR_S12", /* name */ 741 TRUE, /* partial_inplace */ 742 0x0fff0000, /* src_mask */ 743 0x0fff0000, /* dst_mask */ 744 TRUE), /* pcrel_offset */ 745 HOWTO (R_C6000_PCR_S10, /* type */ 746 2, /* rightshift */ 747 2, /* size (0 = byte, 1 = short, 2 = long) */ 748 10, /* bitsize */ 749 TRUE, /* pc_relative */ 750 13, /* bitpos */ 751 complain_overflow_signed,/* complain_on_overflow */ 752 bfd_elf_generic_reloc, /* special_function */ 753 "R_C6000_PCR_S10", /* name */ 754 TRUE, /* partial_inplace */ 755 0x007fe000, /* src_mask */ 756 0x007fe000, /* dst_mask */ 757 TRUE), /* pcrel_offset */ 758 HOWTO (R_C6000_PCR_S7, /* type */ 759 2, /* rightshift */ 760 2, /* size (0 = byte, 1 = short, 2 = long) */ 761 7, /* bitsize */ 762 TRUE, /* pc_relative */ 763 16, /* bitpos */ 764 complain_overflow_signed,/* complain_on_overflow */ 765 bfd_elf_generic_reloc, /* special_function */ 766 "R_C6000_PCR_S7", /* name */ 767 TRUE, /* partial_inplace */ 768 0x007f0000, /* src_mask */ 769 0x007f0000, /* dst_mask */ 770 TRUE), /* pcrel_offset */ 771 HOWTO (R_C6000_ABS_S16, /* type */ 772 0, /* rightshift */ 773 2, /* size (0 = byte, 1 = short, 2 = long) */ 774 16, /* bitsize */ 775 FALSE, /* pc_relative */ 776 7, /* bitpos */ 777 complain_overflow_signed,/* complain_on_overflow */ 778 bfd_elf_generic_reloc, /* special_function */ 779 "R_C6000_ABS_S16", /* name */ 780 TRUE, /* partial_inplace */ 781 0x007fff80, /* src_mask */ 782 0x007fff80, /* dst_mask */ 783 FALSE), /* pcrel_offset */ 784 HOWTO (R_C6000_ABS_L16, /* type */ 785 0, /* rightshift */ 786 2, /* size (0 = byte, 1 = short, 2 = long) */ 787 16, /* bitsize */ 788 FALSE, /* pc_relative */ 789 7, /* bitpos */ 790 complain_overflow_dont,/* complain_on_overflow */ 791 bfd_elf_generic_reloc, /* special_function */ 792 "R_C6000_ABS_L16", /* name */ 793 TRUE, /* partial_inplace */ 794 0x007fff80, /* src_mask */ 795 0x007fff80, /* dst_mask */ 796 FALSE), /* pcrel_offset */ 797 EMPTY_HOWTO (R_C6000_ABS_H16), 798 HOWTO (R_C6000_SBR_U15_B, /* type */ 799 0, /* rightshift */ 800 2, /* size (0 = byte, 1 = short, 2 = long) */ 801 15, /* bitsize */ 802 FALSE, /* pc_relative */ 803 8, /* bitpos */ 804 complain_overflow_unsigned,/* complain_on_overflow */ 805 bfd_elf_generic_reloc, /* special_function */ 806 "R_C6000_SBR_U15_B", /* name */ 807 TRUE, /* partial_inplace */ 808 0x007fff00, /* src_mask */ 809 0x007fff00, /* dst_mask */ 810 FALSE), /* pcrel_offset */ 811 HOWTO (R_C6000_SBR_U15_H, /* type */ 812 1, /* rightshift */ 813 2, /* size (0 = byte, 1 = short, 2 = long) */ 814 15, /* bitsize */ 815 FALSE, /* pc_relative */ 816 8, /* bitpos */ 817 complain_overflow_unsigned,/* complain_on_overflow */ 818 bfd_elf_generic_reloc, /* special_function */ 819 "R_C6000_SBR_U15_H", /* name */ 820 TRUE, /* partial_inplace */ 821 0x007fff00, /* src_mask */ 822 0x007fff00, /* dst_mask */ 823 FALSE), /* pcrel_offset */ 824 HOWTO (R_C6000_SBR_U15_W, /* type */ 825 2, /* rightshift */ 826 2, /* size (0 = byte, 1 = short, 2 = long) */ 827 15, /* bitsize */ 828 FALSE, /* pc_relative */ 829 8, /* bitpos */ 830 complain_overflow_unsigned,/* complain_on_overflow */ 831 bfd_elf_generic_reloc, /* special_function */ 832 "R_C6000_SBR_U15_W", /* name */ 833 TRUE, /* partial_inplace */ 834 0x007fff00, /* src_mask */ 835 0x007fff00, /* dst_mask */ 836 FALSE), /* pcrel_offset */ 837 HOWTO (R_C6000_SBR_S16, /* type */ 838 0, /* rightshift */ 839 2, /* size (0 = byte, 1 = short, 2 = long) */ 840 16, /* bitsize */ 841 FALSE, /* pc_relative */ 842 7, /* bitpos */ 843 complain_overflow_signed,/* complain_on_overflow */ 844 bfd_elf_generic_reloc, /* special_function */ 845 "R_C6000_SBR_S16", /* name */ 846 TRUE, /* partial_inplace */ 847 0x007fff80, /* src_mask */ 848 0x007fff80, /* dst_mask */ 849 FALSE), /* pcrel_offset */ 850 HOWTO (R_C6000_SBR_L16_B, /* type */ 851 0, /* rightshift */ 852 2, /* size (0 = byte, 1 = short, 2 = long) */ 853 16, /* bitsize */ 854 FALSE, /* pc_relative */ 855 7, /* bitpos */ 856 complain_overflow_dont,/* complain_on_overflow */ 857 bfd_elf_generic_reloc, /* special_function */ 858 "R_C6000_SBR_L16_B", /* name */ 859 TRUE, /* partial_inplace */ 860 0x007fff80, /* src_mask */ 861 0x007fff80, /* dst_mask */ 862 FALSE), /* pcrel_offset */ 863 HOWTO (R_C6000_SBR_L16_H, /* type */ 864 1, /* rightshift */ 865 2, /* size (0 = byte, 1 = short, 2 = long) */ 866 16, /* bitsize */ 867 FALSE, /* pc_relative */ 868 7, /* bitpos */ 869 complain_overflow_dont,/* complain_on_overflow */ 870 bfd_elf_generic_reloc, /* special_function */ 871 "R_C6000_SBR_L16_H", /* name */ 872 TRUE, /* partial_inplace */ 873 0x007fff80, /* src_mask */ 874 0x007fff80, /* dst_mask */ 875 FALSE), /* pcrel_offset */ 876 HOWTO (R_C6000_SBR_L16_W, /* type */ 877 2, /* rightshift */ 878 2, /* size (0 = byte, 1 = short, 2 = long) */ 879 16, /* bitsize */ 880 FALSE, /* pc_relative */ 881 7, /* bitpos */ 882 complain_overflow_dont,/* complain_on_overflow */ 883 bfd_elf_generic_reloc, /* special_function */ 884 "R_C6000_SBR_L16_W", /* name */ 885 TRUE, /* partial_inplace */ 886 0x007fff80, /* src_mask */ 887 0x007fff80, /* dst_mask */ 888 FALSE), /* pcrel_offset */ 889 EMPTY_HOWTO (R_C6000_SBR_H16_B), 890 EMPTY_HOWTO (R_C6000_SBR_H16_H), 891 EMPTY_HOWTO (R_C6000_SBR_H16_W), 892 HOWTO (R_C6000_SBR_GOT_U15_W, /* type */ 893 2, /* rightshift */ 894 2, /* size (0 = byte, 1 = short, 2 = long) */ 895 15, /* bitsize */ 896 FALSE, /* pc_relative */ 897 8, /* bitpos */ 898 complain_overflow_unsigned,/* complain_on_overflow */ 899 bfd_elf_generic_reloc, /* special_function */ 900 "R_C6000_SBR_GOT_U15_W",/* name */ 901 TRUE, /* partial_inplace */ 902 0x007fff00, /* src_mask */ 903 0x007fff00, /* dst_mask */ 904 FALSE), /* pcrel_offset */ 905 HOWTO (R_C6000_SBR_GOT_L16_W, /* type */ 906 2, /* rightshift */ 907 2, /* size (0 = byte, 1 = short, 2 = long) */ 908 16, /* bitsize */ 909 FALSE, /* pc_relative */ 910 7, /* bitpos */ 911 complain_overflow_dont,/* complain_on_overflow */ 912 bfd_elf_generic_reloc, /* special_function */ 913 "R_C6000_SBR_GOT_L16_W",/* name */ 914 TRUE, /* partial_inplace */ 915 0x007fff80, /* src_mask */ 916 0x007fff80, /* dst_mask */ 917 FALSE), /* pcrel_offset */ 918 EMPTY_HOWTO (R_C6000_SBR_GOT_H16_W), 919 HOWTO (R_C6000_DSBT_INDEX, /* type */ 920 0, /* rightshift */ 921 2, /* size (0 = byte, 1 = short, 2 = long) */ 922 15, /* bitsize */ 923 FALSE, /* pc_relative */ 924 8, /* bitpos */ 925 complain_overflow_unsigned,/* complain_on_overflow */ 926 bfd_elf_generic_reloc, /* special_function */ 927 "R_C6000_DSBT_INDEX", /* name */ 928 TRUE, /* partial_inplace */ 929 0, /* src_mask */ 930 0x007fff00, /* dst_mask */ 931 FALSE), /* pcrel_offset */ 932 HOWTO (R_C6000_PREL31, /* type */ 933 1, /* rightshift */ 934 2, /* size (0 = byte, 1 = short, 2 = long) */ 935 31, /* bitsize */ 936 FALSE, /* pc_relative */ 937 0, /* bitpos */ 938 complain_overflow_dont,/* complain_on_overflow */ 939 bfd_elf_generic_reloc, /* special_function */ 940 "R_C6000_PREL31", /* name */ 941 TRUE, /* partial_inplace */ 942 0, /* src_mask */ 943 0x7fffffff, /* dst_mask */ 944 FALSE), /* pcrel_offset */ 945 HOWTO (R_C6000_COPY, /* type */ 946 0, /* rightshift */ 947 2, /* size (0 = byte, 1 = short, 2 = long) */ 948 32, /* bitsize */ 949 FALSE, /* pc_relative */ 950 0, /* bitpos */ 951 complain_overflow_dont,/* complain_on_overflow */ 952 bfd_elf_generic_reloc, /* special_function */ 953 "R_C6000_COPY", /* name */ 954 TRUE, /* partial_inplace */ 955 0, /* src_mask */ 956 0xffffffff, /* dst_mask */ 957 FALSE), /* pcrel_offset */ 958 EMPTY_HOWTO (27), 959 EMPTY_HOWTO (28), 960 EMPTY_HOWTO (29), 961 EMPTY_HOWTO (30), 962 EMPTY_HOWTO (31), 963 EMPTY_HOWTO (32), 964 EMPTY_HOWTO (33), 965 EMPTY_HOWTO (34), 966 EMPTY_HOWTO (35), 967 EMPTY_HOWTO (36), 968 EMPTY_HOWTO (37), 969 EMPTY_HOWTO (38), 970 EMPTY_HOWTO (39), 971 EMPTY_HOWTO (40), 972 EMPTY_HOWTO (41), 973 EMPTY_HOWTO (42), 974 EMPTY_HOWTO (43), 975 EMPTY_HOWTO (44), 976 EMPTY_HOWTO (45), 977 EMPTY_HOWTO (46), 978 EMPTY_HOWTO (47), 979 EMPTY_HOWTO (48), 980 EMPTY_HOWTO (49), 981 EMPTY_HOWTO (50), 982 EMPTY_HOWTO (51), 983 EMPTY_HOWTO (52), 984 EMPTY_HOWTO (53), 985 EMPTY_HOWTO (54), 986 EMPTY_HOWTO (55), 987 EMPTY_HOWTO (56), 988 EMPTY_HOWTO (57), 989 EMPTY_HOWTO (58), 990 EMPTY_HOWTO (59), 991 EMPTY_HOWTO (60), 992 EMPTY_HOWTO (61), 993 EMPTY_HOWTO (62), 994 EMPTY_HOWTO (63), 995 EMPTY_HOWTO (64), 996 EMPTY_HOWTO (65), 997 EMPTY_HOWTO (66), 998 EMPTY_HOWTO (67), 999 EMPTY_HOWTO (68), 1000 EMPTY_HOWTO (69), 1001 EMPTY_HOWTO (70), 1002 EMPTY_HOWTO (71), 1003 EMPTY_HOWTO (72), 1004 EMPTY_HOWTO (73), 1005 EMPTY_HOWTO (74), 1006 EMPTY_HOWTO (75), 1007 EMPTY_HOWTO (76), 1008 EMPTY_HOWTO (77), 1009 EMPTY_HOWTO (78), 1010 EMPTY_HOWTO (79), 1011 EMPTY_HOWTO (80), 1012 EMPTY_HOWTO (81), 1013 EMPTY_HOWTO (82), 1014 EMPTY_HOWTO (83), 1015 EMPTY_HOWTO (84), 1016 EMPTY_HOWTO (85), 1017 EMPTY_HOWTO (86), 1018 EMPTY_HOWTO (87), 1019 EMPTY_HOWTO (88), 1020 EMPTY_HOWTO (89), 1021 EMPTY_HOWTO (90), 1022 EMPTY_HOWTO (91), 1023 EMPTY_HOWTO (92), 1024 EMPTY_HOWTO (93), 1025 EMPTY_HOWTO (94), 1026 EMPTY_HOWTO (95), 1027 EMPTY_HOWTO (96), 1028 EMPTY_HOWTO (97), 1029 EMPTY_HOWTO (98), 1030 EMPTY_HOWTO (99), 1031 EMPTY_HOWTO (100), 1032 EMPTY_HOWTO (101), 1033 EMPTY_HOWTO (102), 1034 EMPTY_HOWTO (103), 1035 EMPTY_HOWTO (104), 1036 EMPTY_HOWTO (105), 1037 EMPTY_HOWTO (106), 1038 EMPTY_HOWTO (107), 1039 EMPTY_HOWTO (108), 1040 EMPTY_HOWTO (109), 1041 EMPTY_HOWTO (110), 1042 EMPTY_HOWTO (111), 1043 EMPTY_HOWTO (112), 1044 EMPTY_HOWTO (113), 1045 EMPTY_HOWTO (114), 1046 EMPTY_HOWTO (115), 1047 EMPTY_HOWTO (116), 1048 EMPTY_HOWTO (117), 1049 EMPTY_HOWTO (118), 1050 EMPTY_HOWTO (119), 1051 EMPTY_HOWTO (120), 1052 EMPTY_HOWTO (121), 1053 EMPTY_HOWTO (122), 1054 EMPTY_HOWTO (123), 1055 EMPTY_HOWTO (124), 1056 EMPTY_HOWTO (125), 1057 EMPTY_HOWTO (126), 1058 EMPTY_HOWTO (127), 1059 EMPTY_HOWTO (128), 1060 EMPTY_HOWTO (129), 1061 EMPTY_HOWTO (130), 1062 EMPTY_HOWTO (131), 1063 EMPTY_HOWTO (132), 1064 EMPTY_HOWTO (133), 1065 EMPTY_HOWTO (134), 1066 EMPTY_HOWTO (135), 1067 EMPTY_HOWTO (136), 1068 EMPTY_HOWTO (137), 1069 EMPTY_HOWTO (138), 1070 EMPTY_HOWTO (139), 1071 EMPTY_HOWTO (140), 1072 EMPTY_HOWTO (141), 1073 EMPTY_HOWTO (142), 1074 EMPTY_HOWTO (143), 1075 EMPTY_HOWTO (144), 1076 EMPTY_HOWTO (145), 1077 EMPTY_HOWTO (146), 1078 EMPTY_HOWTO (147), 1079 EMPTY_HOWTO (148), 1080 EMPTY_HOWTO (149), 1081 EMPTY_HOWTO (150), 1082 EMPTY_HOWTO (151), 1083 EMPTY_HOWTO (152), 1084 EMPTY_HOWTO (153), 1085 EMPTY_HOWTO (154), 1086 EMPTY_HOWTO (155), 1087 EMPTY_HOWTO (156), 1088 EMPTY_HOWTO (157), 1089 EMPTY_HOWTO (158), 1090 EMPTY_HOWTO (159), 1091 EMPTY_HOWTO (160), 1092 EMPTY_HOWTO (161), 1093 EMPTY_HOWTO (162), 1094 EMPTY_HOWTO (163), 1095 EMPTY_HOWTO (164), 1096 EMPTY_HOWTO (165), 1097 EMPTY_HOWTO (166), 1098 EMPTY_HOWTO (167), 1099 EMPTY_HOWTO (168), 1100 EMPTY_HOWTO (169), 1101 EMPTY_HOWTO (170), 1102 EMPTY_HOWTO (171), 1103 EMPTY_HOWTO (172), 1104 EMPTY_HOWTO (173), 1105 EMPTY_HOWTO (174), 1106 EMPTY_HOWTO (175), 1107 EMPTY_HOWTO (176), 1108 EMPTY_HOWTO (177), 1109 EMPTY_HOWTO (178), 1110 EMPTY_HOWTO (179), 1111 EMPTY_HOWTO (180), 1112 EMPTY_HOWTO (181), 1113 EMPTY_HOWTO (182), 1114 EMPTY_HOWTO (183), 1115 EMPTY_HOWTO (184), 1116 EMPTY_HOWTO (185), 1117 EMPTY_HOWTO (186), 1118 EMPTY_HOWTO (187), 1119 EMPTY_HOWTO (188), 1120 EMPTY_HOWTO (189), 1121 EMPTY_HOWTO (190), 1122 EMPTY_HOWTO (191), 1123 EMPTY_HOWTO (192), 1124 EMPTY_HOWTO (193), 1125 EMPTY_HOWTO (194), 1126 EMPTY_HOWTO (195), 1127 EMPTY_HOWTO (196), 1128 EMPTY_HOWTO (197), 1129 EMPTY_HOWTO (198), 1130 EMPTY_HOWTO (199), 1131 EMPTY_HOWTO (200), 1132 EMPTY_HOWTO (201), 1133 EMPTY_HOWTO (202), 1134 EMPTY_HOWTO (203), 1135 EMPTY_HOWTO (204), 1136 EMPTY_HOWTO (205), 1137 EMPTY_HOWTO (206), 1138 EMPTY_HOWTO (207), 1139 EMPTY_HOWTO (208), 1140 EMPTY_HOWTO (209), 1141 EMPTY_HOWTO (210), 1142 EMPTY_HOWTO (211), 1143 EMPTY_HOWTO (212), 1144 EMPTY_HOWTO (213), 1145 EMPTY_HOWTO (214), 1146 EMPTY_HOWTO (215), 1147 EMPTY_HOWTO (216), 1148 EMPTY_HOWTO (217), 1149 EMPTY_HOWTO (218), 1150 EMPTY_HOWTO (219), 1151 EMPTY_HOWTO (220), 1152 EMPTY_HOWTO (221), 1153 EMPTY_HOWTO (222), 1154 EMPTY_HOWTO (223), 1155 EMPTY_HOWTO (224), 1156 EMPTY_HOWTO (225), 1157 EMPTY_HOWTO (226), 1158 EMPTY_HOWTO (227), 1159 EMPTY_HOWTO (228), 1160 EMPTY_HOWTO (229), 1161 EMPTY_HOWTO (230), 1162 EMPTY_HOWTO (231), 1163 EMPTY_HOWTO (232), 1164 EMPTY_HOWTO (233), 1165 EMPTY_HOWTO (234), 1166 EMPTY_HOWTO (235), 1167 EMPTY_HOWTO (236), 1168 EMPTY_HOWTO (237), 1169 EMPTY_HOWTO (238), 1170 EMPTY_HOWTO (239), 1171 EMPTY_HOWTO (240), 1172 EMPTY_HOWTO (241), 1173 EMPTY_HOWTO (242), 1174 EMPTY_HOWTO (243), 1175 EMPTY_HOWTO (244), 1176 EMPTY_HOWTO (245), 1177 EMPTY_HOWTO (246), 1178 EMPTY_HOWTO (247), 1179 EMPTY_HOWTO (248), 1180 EMPTY_HOWTO (249), 1181 EMPTY_HOWTO (250), 1182 EMPTY_HOWTO (251), 1183 EMPTY_HOWTO (252), 1184 HOWTO (R_C6000_ALIGN, /* type */ 1185 0, /* rightshift */ 1186 0, /* size (0 = byte, 1 = short, 2 = long) */ 1187 0, /* bitsize */ 1188 FALSE, /* pc_relative */ 1189 0, /* bitpos */ 1190 complain_overflow_dont,/* complain_on_overflow */ 1191 bfd_elf_generic_reloc, /* special_function */ 1192 "R_C6000_ALIGN", /* name */ 1193 TRUE, /* partial_inplace */ 1194 0, /* src_mask */ 1195 0, /* dst_mask */ 1196 FALSE), /* pcrel_offset */ 1197 HOWTO (R_C6000_FPHEAD, /* type */ 1198 0, /* rightshift */ 1199 0, /* size (0 = byte, 1 = short, 2 = long) */ 1200 0, /* bitsize */ 1201 FALSE, /* pc_relative */ 1202 0, /* bitpos */ 1203 complain_overflow_dont,/* complain_on_overflow */ 1204 bfd_elf_generic_reloc, /* special_function */ 1205 "R_C6000_FPHEAD", /* name */ 1206 TRUE, /* partial_inplace */ 1207 0, /* src_mask */ 1208 0, /* dst_mask */ 1209 FALSE), /* pcrel_offset */ 1210 HOWTO (R_C6000_NOCMP, /* type */ 1211 0, /* rightshift */ 1212 0, /* size (0 = byte, 1 = short, 2 = long) */ 1213 0, /* bitsize */ 1214 FALSE, /* pc_relative */ 1215 0, /* bitpos */ 1216 complain_overflow_dont,/* complain_on_overflow */ 1217 bfd_elf_generic_reloc, /* special_function */ 1218 "R_C6000_NOCMP", /* name */ 1219 TRUE, /* partial_inplace */ 1220 0, /* src_mask */ 1221 0, /* dst_mask */ 1222 FALSE) /* pcrel_offset */ 1223 }; 1224 1225 /* Map BFD relocations to ELF relocations. */ 1226 1227 typedef struct 1228 { 1229 bfd_reloc_code_real_type bfd_reloc_val; 1230 enum elf_tic6x_reloc_type elf_reloc_val; 1231 } tic6x_reloc_map; 1232 1233 static const tic6x_reloc_map elf32_tic6x_reloc_map[] = 1234 { 1235 { BFD_RELOC_NONE, R_C6000_NONE }, 1236 { BFD_RELOC_32, R_C6000_ABS32 }, 1237 { BFD_RELOC_16, R_C6000_ABS16 }, 1238 { BFD_RELOC_8, R_C6000_ABS8 }, 1239 { BFD_RELOC_C6000_PCR_S21, R_C6000_PCR_S21 }, 1240 { BFD_RELOC_C6000_PCR_S12, R_C6000_PCR_S12 }, 1241 { BFD_RELOC_C6000_PCR_S10, R_C6000_PCR_S10 }, 1242 { BFD_RELOC_C6000_PCR_S7, R_C6000_PCR_S7 }, 1243 { BFD_RELOC_C6000_ABS_S16, R_C6000_ABS_S16 }, 1244 { BFD_RELOC_C6000_ABS_L16, R_C6000_ABS_L16 }, 1245 { BFD_RELOC_C6000_ABS_H16, R_C6000_ABS_H16 }, 1246 { BFD_RELOC_C6000_SBR_U15_B, R_C6000_SBR_U15_B }, 1247 { BFD_RELOC_C6000_SBR_U15_H, R_C6000_SBR_U15_H }, 1248 { BFD_RELOC_C6000_SBR_U15_W, R_C6000_SBR_U15_W }, 1249 { BFD_RELOC_C6000_SBR_S16, R_C6000_SBR_S16 }, 1250 { BFD_RELOC_C6000_SBR_L16_B, R_C6000_SBR_L16_B }, 1251 { BFD_RELOC_C6000_SBR_L16_H, R_C6000_SBR_L16_H }, 1252 { BFD_RELOC_C6000_SBR_L16_W, R_C6000_SBR_L16_W }, 1253 { BFD_RELOC_C6000_SBR_H16_B, R_C6000_SBR_H16_B }, 1254 { BFD_RELOC_C6000_SBR_H16_H, R_C6000_SBR_H16_H }, 1255 { BFD_RELOC_C6000_SBR_H16_W, R_C6000_SBR_H16_W }, 1256 { BFD_RELOC_C6000_SBR_GOT_U15_W, R_C6000_SBR_GOT_U15_W }, 1257 { BFD_RELOC_C6000_SBR_GOT_L16_W, R_C6000_SBR_GOT_L16_W }, 1258 { BFD_RELOC_C6000_SBR_GOT_H16_W, R_C6000_SBR_GOT_H16_W }, 1259 { BFD_RELOC_C6000_DSBT_INDEX, R_C6000_DSBT_INDEX }, 1260 { BFD_RELOC_C6000_PREL31, R_C6000_PREL31 }, 1261 { BFD_RELOC_C6000_COPY, R_C6000_COPY }, 1262 { BFD_RELOC_C6000_ALIGN, R_C6000_ALIGN }, 1263 { BFD_RELOC_C6000_FPHEAD, R_C6000_FPHEAD }, 1264 { BFD_RELOC_C6000_NOCMP, R_C6000_NOCMP } 1265 }; 1266 1267 static reloc_howto_type * 1268 elf32_tic6x_reloc_type_lookup (bfd *abfd, bfd_reloc_code_real_type code) 1269 { 1270 unsigned int i; 1271 1272 for (i = 0; i < ARRAY_SIZE (elf32_tic6x_reloc_map); i++) 1273 if (elf32_tic6x_reloc_map[i].bfd_reloc_val == code) 1274 { 1275 enum elf_tic6x_reloc_type elf_reloc_val; 1276 reloc_howto_type *howto; 1277 1278 elf_reloc_val = elf32_tic6x_reloc_map[i].elf_reloc_val; 1279 if (elf32_tic6x_tdata (abfd)->use_rela_p) 1280 howto = &elf32_tic6x_howto_table[elf_reloc_val]; 1281 else 1282 howto = &elf32_tic6x_howto_table_rel[elf_reloc_val]; 1283 1284 /* Some relocations are RELA-only; do not return them for 1285 REL. */ 1286 if (howto->name == NULL) 1287 howto = NULL; 1288 1289 return howto; 1290 } 1291 1292 return NULL; 1293 } 1294 1295 static reloc_howto_type * 1296 elf32_tic6x_reloc_name_lookup (bfd *abfd, const char *r_name) 1297 { 1298 if (elf32_tic6x_tdata (abfd)->use_rela_p) 1299 { 1300 unsigned int i; 1301 1302 for (i = 0; i < ARRAY_SIZE (elf32_tic6x_howto_table); i++) 1303 if (elf32_tic6x_howto_table[i].name != NULL 1304 && strcasecmp (elf32_tic6x_howto_table[i].name, r_name) == 0) 1305 return &elf32_tic6x_howto_table[i]; 1306 } 1307 else 1308 { 1309 unsigned int i; 1310 1311 for (i = 0; i < ARRAY_SIZE (elf32_tic6x_howto_table_rel); i++) 1312 if (elf32_tic6x_howto_table_rel[i].name != NULL 1313 && strcasecmp (elf32_tic6x_howto_table_rel[i].name, r_name) == 0) 1314 return &elf32_tic6x_howto_table_rel[i]; 1315 } 1316 1317 return NULL; 1318 } 1319 1320 static void 1321 elf32_tic6x_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc, 1322 Elf_Internal_Rela *elf_reloc) 1323 { 1324 unsigned int r_type; 1325 1326 r_type = ELF32_R_TYPE (elf_reloc->r_info); 1327 if (r_type >= ARRAY_SIZE (elf32_tic6x_howto_table)) 1328 bfd_reloc->howto = NULL; 1329 else 1330 bfd_reloc->howto = &elf32_tic6x_howto_table[r_type]; 1331 } 1332 1333 static void 1334 elf32_tic6x_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED, arelent *bfd_reloc, 1335 Elf_Internal_Rela *elf_reloc) 1336 { 1337 unsigned int r_type; 1338 1339 r_type = ELF32_R_TYPE (elf_reloc->r_info); 1340 if (r_type >= ARRAY_SIZE (elf32_tic6x_howto_table_rel)) 1341 bfd_reloc->howto = NULL; 1342 else 1343 bfd_reloc->howto = &elf32_tic6x_howto_table_rel[r_type]; 1344 } 1345 1346 void 1347 elf32_tic6x_set_use_rela_p (bfd *abfd, bfd_boolean use_rela_p) 1348 { 1349 elf32_tic6x_tdata (abfd)->use_rela_p = use_rela_p; 1350 } 1351 1352 static bfd_boolean 1353 elf32_tic6x_mkobject (bfd *abfd) 1354 { 1355 bfd_boolean ret; 1356 1357 ret = bfd_elf_allocate_object (abfd, sizeof (struct elf32_tic6x_obj_tdata), 1358 TIC6X_ELF_DATA); 1359 if (ret) 1360 elf32_tic6x_set_use_rela_p (abfd, TRUE); 1361 return ret; 1362 } 1363 1364 static bfd_boolean 1365 elf32_tic6x_new_section_hook (bfd *abfd, asection *sec) 1366 { 1367 bfd_boolean ret; 1368 1369 ret = _bfd_elf_new_section_hook (abfd, sec); 1370 sec->use_rela_p = elf32_tic6x_tdata (abfd)->use_rela_p; 1371 1372 return ret; 1373 } 1374 1375 /* Return true if relocation REL against section SEC is a REL rather 1376 than RELA relocation. RELOCS is the first relocation in the 1377 section and ABFD is the bfd that contains SEC. */ 1378 1379 static bfd_boolean 1380 elf32_tic6x_rel_relocation_p (bfd *abfd, asection *sec, 1381 const Elf_Internal_Rela *relocs, 1382 const Elf_Internal_Rela *rel) 1383 { 1384 Elf_Internal_Shdr *rel_hdr; 1385 const struct elf_backend_data *bed; 1386 1387 /* To determine which flavor of relocation this is, we depend on the 1388 fact that the INPUT_SECTION's REL_HDR is read before RELA_HDR. */ 1389 rel_hdr = elf_section_data (sec)->rel.hdr; 1390 if (rel_hdr == NULL) 1391 return FALSE; 1392 bed = get_elf_backend_data (abfd); 1393 return ((size_t) (rel - relocs) 1394 < NUM_SHDR_ENTRIES (rel_hdr) * bed->s->int_rels_per_ext_rel); 1395 } 1396 1397 static bfd_boolean 1398 elf32_tic6x_relocate_section (bfd *output_bfd, 1399 struct bfd_link_info *info, 1400 bfd *input_bfd, 1401 asection *input_section, 1402 bfd_byte *contents, 1403 Elf_Internal_Rela *relocs, 1404 Elf_Internal_Sym *local_syms, 1405 asection **local_sections) 1406 { 1407 Elf_Internal_Shdr *symtab_hdr; 1408 struct elf_link_hash_entry **sym_hashes; 1409 Elf_Internal_Rela *rel; 1410 Elf_Internal_Rela *relend; 1411 bfd_boolean ok = TRUE; 1412 1413 symtab_hdr = & elf_symtab_hdr (input_bfd); 1414 sym_hashes = elf_sym_hashes (input_bfd); 1415 1416 relend = relocs + input_section->reloc_count; 1417 1418 for (rel = relocs; rel < relend; rel ++) 1419 { 1420 int r_type; 1421 unsigned long r_symndx; 1422 arelent bfd_reloc; 1423 reloc_howto_type *howto; 1424 Elf_Internal_Sym *sym; 1425 asection *sec; 1426 struct elf_link_hash_entry *h; 1427 bfd_vma relocation; 1428 bfd_boolean unresolved_reloc; 1429 bfd_reloc_status_type r; 1430 struct bfd_link_hash_entry *sbh; 1431 bfd_boolean is_rel; 1432 1433 r_type = ELF32_R_TYPE (rel->r_info); 1434 r_symndx = ELF32_R_SYM (rel->r_info); 1435 1436 is_rel = elf32_tic6x_rel_relocation_p (input_bfd, input_section, 1437 relocs, rel); 1438 1439 if (is_rel) 1440 elf32_tic6x_info_to_howto_rel (input_bfd, &bfd_reloc, rel); 1441 else 1442 elf32_tic6x_info_to_howto (input_bfd, &bfd_reloc, rel); 1443 howto = bfd_reloc.howto; 1444 if (howto == NULL) 1445 { 1446 bfd_set_error (bfd_error_bad_value); 1447 return FALSE; 1448 } 1449 1450 h = NULL; 1451 sym = NULL; 1452 sec = NULL; 1453 unresolved_reloc = FALSE; 1454 1455 if (r_symndx < symtab_hdr->sh_info) 1456 { 1457 sym = local_syms + r_symndx; 1458 sec = local_sections[r_symndx]; 1459 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 1460 } 1461 else 1462 { 1463 bfd_boolean warned; 1464 1465 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 1466 r_symndx, symtab_hdr, sym_hashes, 1467 h, sec, relocation, 1468 unresolved_reloc, warned); 1469 } 1470 1471 if (sec != NULL && elf_discarded_section (sec)) 1472 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 1473 rel, relend, howto, contents); 1474 1475 if (info->relocatable) 1476 { 1477 if (is_rel 1478 && sym != NULL 1479 && ELF_ST_TYPE (sym->st_info) == STT_SECTION) 1480 { 1481 rel->r_addend = 0; 1482 relocation = sec->output_offset + sym->st_value; 1483 r = _bfd_relocate_contents (howto, input_bfd, relocation, 1484 contents + rel->r_offset); 1485 goto done_reloc; 1486 } 1487 continue; 1488 } 1489 1490 switch (r_type) 1491 { 1492 case R_C6000_NONE: 1493 case R_C6000_ALIGN: 1494 case R_C6000_FPHEAD: 1495 case R_C6000_NOCMP: 1496 /* No action needed. */ 1497 continue; 1498 1499 case R_C6000_PCR_S21: 1500 case R_C6000_PCR_S12: 1501 case R_C6000_PCR_S10: 1502 case R_C6000_PCR_S7: 1503 /* Generic PC-relative handling produces a value relative to 1504 the exact location of the relocation. Adjust it to be 1505 relative to the start of the fetch packet instead. */ 1506 relocation += (input_section->output_section->vma 1507 + input_section->output_offset 1508 + rel->r_offset) & 0x1f; 1509 /* Fall through. */ 1510 case R_C6000_ABS32: 1511 case R_C6000_ABS16: 1512 case R_C6000_ABS8: 1513 case R_C6000_ABS_S16: 1514 case R_C6000_ABS_L16: 1515 case R_C6000_ABS_H16: 1516 /* Generic logic OK. */ 1517 break; 1518 1519 case R_C6000_SBR_U15_B: 1520 case R_C6000_SBR_U15_H: 1521 case R_C6000_SBR_U15_W: 1522 case R_C6000_SBR_S16: 1523 case R_C6000_SBR_L16_B: 1524 case R_C6000_SBR_L16_H: 1525 case R_C6000_SBR_L16_W: 1526 case R_C6000_SBR_H16_B: 1527 case R_C6000_SBR_H16_H: 1528 case R_C6000_SBR_H16_W: 1529 sbh = bfd_link_hash_lookup (info->hash, "__c6xabi_DSBT_BASE", 1530 FALSE, FALSE, TRUE); 1531 if (sbh != NULL 1532 && (sbh->type == bfd_link_hash_defined 1533 || sbh->type == bfd_link_hash_defweak)) 1534 relocation -= (sbh->u.def.value 1535 + sbh->u.def.section->output_section->vma 1536 + sbh->u.def.section->output_offset); 1537 else 1538 { 1539 (*_bfd_error_handler) (_("%B: SB-relative relocation but " 1540 "__c6xabi_DSBT_BASE not defined"), 1541 input_bfd); 1542 ok = FALSE; 1543 continue; 1544 } 1545 break; 1546 1547 case R_C6000_SBR_GOT_U15_W: 1548 case R_C6000_SBR_GOT_L16_W: 1549 case R_C6000_SBR_GOT_H16_W: 1550 case R_C6000_DSBT_INDEX: 1551 case R_C6000_PREL31: 1552 /* Shared libraries and exception handling support not 1553 implemented. */ 1554 (*_bfd_error_handler) (_("%B: relocation type %d not implemented"), 1555 input_bfd, r_type); 1556 ok = FALSE; 1557 continue; 1558 1559 case R_C6000_COPY: 1560 /* Invalid in relocatable object. */ 1561 default: 1562 /* Unknown relocation. */ 1563 (*_bfd_error_handler) (_("%B: invalid relocation type %d"), 1564 input_bfd, r_type); 1565 ok = FALSE; 1566 continue; 1567 } 1568 1569 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 1570 contents, rel->r_offset, 1571 relocation, rel->r_addend); 1572 1573 done_reloc: 1574 if (r == bfd_reloc_ok 1575 && howto->complain_on_overflow == complain_overflow_bitfield) 1576 { 1577 /* Generic overflow handling accepts cases the ABI says 1578 should be rejected for R_C6000_ABS16 and 1579 R_C6000_ABS8. */ 1580 bfd_vma value = (relocation + rel->r_addend) & 0xffffffff; 1581 bfd_vma sbit = 1 << (howto->bitsize - 1); 1582 bfd_vma sbits = (-(bfd_vma) sbit) & 0xffffffff; 1583 bfd_vma value_sbits = value & sbits; 1584 1585 if (value_sbits != 0 1586 && value_sbits != sbit 1587 && value_sbits != sbits) 1588 r = bfd_reloc_overflow; 1589 } 1590 1591 if (r != bfd_reloc_ok) 1592 { 1593 const char *name; 1594 const char *error_message; 1595 1596 if (h != NULL) 1597 name = h->root.root.string; 1598 else 1599 { 1600 name = bfd_elf_string_from_elf_section (input_bfd, 1601 symtab_hdr->sh_link, 1602 sym->st_name); 1603 if (name == NULL) 1604 return FALSE; 1605 if (*name == '\0') 1606 name = bfd_section_name (input_bfd, sec); 1607 } 1608 1609 switch (r) 1610 { 1611 case bfd_reloc_overflow: 1612 /* If the overflowing reloc was to an undefined symbol, 1613 we have already printed one error message and there 1614 is no point complaining again. */ 1615 if ((! h || 1616 h->root.type != bfd_link_hash_undefined) 1617 && (!((*info->callbacks->reloc_overflow) 1618 (info, (h ? &h->root : NULL), name, howto->name, 1619 (bfd_vma) 0, input_bfd, input_section, 1620 rel->r_offset)))) 1621 return FALSE; 1622 break; 1623 1624 case bfd_reloc_undefined: 1625 if (!((*info->callbacks->undefined_symbol) 1626 (info, name, input_bfd, input_section, 1627 rel->r_offset, TRUE))) 1628 return FALSE; 1629 break; 1630 1631 case bfd_reloc_outofrange: 1632 error_message = _("out of range"); 1633 goto common_error; 1634 1635 case bfd_reloc_notsupported: 1636 error_message = _("unsupported relocation"); 1637 goto common_error; 1638 1639 case bfd_reloc_dangerous: 1640 error_message = _("dangerous relocation"); 1641 goto common_error; 1642 1643 default: 1644 error_message = _("unknown error"); 1645 /* Fall through. */ 1646 1647 common_error: 1648 BFD_ASSERT (error_message != NULL); 1649 if (!((*info->callbacks->reloc_dangerous) 1650 (info, error_message, input_bfd, input_section, 1651 rel->r_offset))) 1652 return FALSE; 1653 break; 1654 } 1655 } 1656 } 1657 1658 return ok; 1659 } 1660 1661 static int 1662 elf32_tic6x_obj_attrs_arg_type (int tag) 1663 { 1664 if (tag == Tag_ABI_compatibility) 1665 return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL; 1666 else if (tag & 1) 1667 return ATTR_TYPE_FLAG_STR_VAL; 1668 else 1669 return ATTR_TYPE_FLAG_INT_VAL; 1670 } 1671 1672 static int 1673 elf32_tic6x_obj_attrs_order (int num) 1674 { 1675 if (num == LEAST_KNOWN_OBJ_ATTRIBUTE) 1676 return Tag_ABI_conformance; 1677 if ((num - 1) < Tag_ABI_conformance) 1678 return num - 1; 1679 return num; 1680 } 1681 1682 /* Merge the Tag_ISA attribute values ARCH1 and ARCH2 1683 and return the merged value. At present, all merges succeed, so no 1684 return value for errors is defined. */ 1685 1686 int 1687 elf32_tic6x_merge_arch_attributes (int arch1, int arch2) 1688 { 1689 int min_arch, max_arch; 1690 1691 min_arch = (arch1 < arch2 ? arch1 : arch2); 1692 max_arch = (arch1 > arch2 ? arch1 : arch2); 1693 1694 /* In most cases, the numerically greatest value is the correct 1695 merged value, but merging C64 and C67 results in C674X. */ 1696 if ((min_arch == C6XABI_Tag_ISA_C67X 1697 || min_arch == C6XABI_Tag_ISA_C67XP) 1698 && (max_arch == C6XABI_Tag_ISA_C64X 1699 || max_arch == C6XABI_Tag_ISA_C64XP)) 1700 return C6XABI_Tag_ISA_C674X; 1701 1702 return max_arch; 1703 } 1704 1705 /* Convert a Tag_ABI_array_object_alignment or 1706 Tag_ABI_array_object_align_expected tag value TAG to a 1707 corresponding alignment value; return the alignment, or -1 for an 1708 unknown tag value. */ 1709 1710 static int 1711 elf32_tic6x_tag_to_array_alignment (int tag) 1712 { 1713 switch (tag) 1714 { 1715 case 0: 1716 return 8; 1717 1718 case 1: 1719 return 4; 1720 1721 case 2: 1722 return 16; 1723 1724 default: 1725 return -1; 1726 } 1727 } 1728 1729 /* Convert a Tag_ABI_array_object_alignment or 1730 Tag_ABI_array_object_align_expected alignment ALIGN to a 1731 corresponding tag value; return the tag value. */ 1732 1733 static int 1734 elf32_tic6x_array_alignment_to_tag (int align) 1735 { 1736 switch (align) 1737 { 1738 case 8: 1739 return 0; 1740 1741 case 4: 1742 return 1; 1743 1744 case 16: 1745 return 2; 1746 1747 default: 1748 abort (); 1749 } 1750 } 1751 1752 /* Merge attributes from IBFD and OBFD, returning TRUE if the merge 1753 succeeded, FALSE otherwise. */ 1754 1755 static bfd_boolean 1756 elf32_tic6x_merge_attributes (bfd *ibfd, bfd *obfd) 1757 { 1758 bfd_boolean result = TRUE; 1759 obj_attribute *in_attr; 1760 obj_attribute *out_attr; 1761 int i; 1762 int array_align_in, array_align_out, array_expect_in, array_expect_out; 1763 1764 if (!elf_known_obj_attributes_proc (obfd)[0].i) 1765 { 1766 /* This is the first object. Copy the attributes. */ 1767 _bfd_elf_copy_obj_attributes (ibfd, obfd); 1768 1769 out_attr = elf_known_obj_attributes_proc (obfd); 1770 1771 /* Use the Tag_null value to indicate the attributes have been 1772 initialized. */ 1773 out_attr[0].i = 1; 1774 1775 return TRUE; 1776 } 1777 1778 in_attr = elf_known_obj_attributes_proc (ibfd); 1779 out_attr = elf_known_obj_attributes_proc (obfd); 1780 1781 /* No specification yet for handling of unknown attributes, so just 1782 ignore them and handle known ones. */ 1783 1784 if (out_attr[Tag_ABI_stack_align_preserved].i 1785 < in_attr[Tag_ABI_stack_align_needed].i) 1786 { 1787 _bfd_error_handler 1788 (_("error: %B requires more stack alignment than %B preserves"), 1789 ibfd, obfd); 1790 result = FALSE; 1791 } 1792 if (in_attr[Tag_ABI_stack_align_preserved].i 1793 < out_attr[Tag_ABI_stack_align_needed].i) 1794 { 1795 _bfd_error_handler 1796 (_("error: %B requires more stack alignment than %B preserves"), 1797 obfd, ibfd); 1798 result = FALSE; 1799 } 1800 1801 array_align_in = elf32_tic6x_tag_to_array_alignment 1802 (in_attr[Tag_ABI_array_object_alignment].i); 1803 if (array_align_in == -1) 1804 { 1805 _bfd_error_handler 1806 (_("error: unknown Tag_ABI_array_object_alignment value in %B"), 1807 ibfd); 1808 result = FALSE; 1809 } 1810 array_align_out = elf32_tic6x_tag_to_array_alignment 1811 (out_attr[Tag_ABI_array_object_alignment].i); 1812 if (array_align_out == -1) 1813 { 1814 _bfd_error_handler 1815 (_("error: unknown Tag_ABI_array_object_alignment value in %B"), 1816 obfd); 1817 result = FALSE; 1818 } 1819 array_expect_in = elf32_tic6x_tag_to_array_alignment 1820 (in_attr[Tag_ABI_array_object_align_expected].i); 1821 if (array_expect_in == -1) 1822 { 1823 _bfd_error_handler 1824 (_("error: unknown Tag_ABI_array_object_align_expected value in %B"), 1825 ibfd); 1826 result = FALSE; 1827 } 1828 array_expect_out = elf32_tic6x_tag_to_array_alignment 1829 (out_attr[Tag_ABI_array_object_align_expected].i); 1830 if (array_expect_out == -1) 1831 { 1832 _bfd_error_handler 1833 (_("error: unknown Tag_ABI_array_object_align_expected value in %B"), 1834 obfd); 1835 result = FALSE; 1836 } 1837 1838 if (array_align_out < array_expect_in) 1839 { 1840 _bfd_error_handler 1841 (_("error: %B requires more array alignment than %B preserves"), 1842 ibfd, obfd); 1843 result = FALSE; 1844 } 1845 if (array_align_in < array_expect_out) 1846 { 1847 _bfd_error_handler 1848 (_("error: %B requires more array alignment than %B preserves"), 1849 obfd, ibfd); 1850 result = FALSE; 1851 } 1852 1853 for (i = LEAST_KNOWN_OBJ_ATTRIBUTE; i < NUM_KNOWN_OBJ_ATTRIBUTES; i++) 1854 { 1855 switch (i) 1856 { 1857 case Tag_ISA: 1858 out_attr[i].i = elf32_tic6x_merge_arch_attributes (in_attr[i].i, 1859 out_attr[i].i); 1860 break; 1861 1862 case Tag_ABI_wchar_t: 1863 if (out_attr[i].i == 0) 1864 out_attr[i].i = in_attr[i].i; 1865 if (out_attr[i].i != 0 1866 && in_attr[i].i != 0 1867 && out_attr[i].i != in_attr[i].i) 1868 { 1869 _bfd_error_handler 1870 (_("warning: %B and %B differ in wchar_t size"), obfd, ibfd); 1871 } 1872 break; 1873 1874 case Tag_ABI_stack_align_needed: 1875 if (out_attr[i].i < in_attr[i].i) 1876 out_attr[i].i = in_attr[i].i; 1877 break; 1878 1879 case Tag_ABI_stack_align_preserved: 1880 if (out_attr[i].i > in_attr[i].i) 1881 out_attr[i].i = in_attr[i].i; 1882 break; 1883 1884 case Tag_ABI_DSBT: 1885 if (out_attr[i].i != in_attr[i].i) 1886 { 1887 _bfd_error_handler 1888 (_("warning: %B and %B differ in whether code is " 1889 "compiled for DSBT"), 1890 obfd, ibfd); 1891 } 1892 break; 1893 1894 case Tag_ABI_PID: 1895 if (out_attr[i].i != in_attr[i].i) 1896 { 1897 _bfd_error_handler 1898 (_("warning: %B and %B differ in position-dependence of " 1899 "data addressing"), 1900 obfd, ibfd); 1901 } 1902 break; 1903 1904 case Tag_ABI_PIC: 1905 if (out_attr[i].i != in_attr[i].i) 1906 { 1907 _bfd_error_handler 1908 (_("warning: %B and %B differ in position-dependence of " 1909 "code addressing"), 1910 obfd, ibfd); 1911 } 1912 break; 1913 1914 case Tag_ABI_array_object_alignment: 1915 if (array_align_out != -1 1916 && array_align_in != -1 1917 && array_align_out > array_align_in) 1918 out_attr[i].i 1919 = elf32_tic6x_array_alignment_to_tag (array_align_in); 1920 break; 1921 1922 case Tag_ABI_array_object_align_expected: 1923 if (array_expect_out != -1 1924 && array_expect_in != -1 1925 && array_expect_out < array_expect_in) 1926 out_attr[i].i 1927 = elf32_tic6x_array_alignment_to_tag (array_expect_in); 1928 break; 1929 1930 case Tag_ABI_conformance: 1931 /* Merging for this attribute is not specified. As on ARM, 1932 treat a missing attribute as no claim to conform and only 1933 merge identical values. */ 1934 if (out_attr[i].s == NULL 1935 || in_attr[i].s == NULL 1936 || strcmp (out_attr[i].s, 1937 in_attr[i].s) != 0) 1938 out_attr[i].s = NULL; 1939 break; 1940 1941 default: 1942 break; 1943 } 1944 1945 if (in_attr[i].type && !out_attr[i].type) 1946 out_attr[i].type = in_attr[i].type; 1947 } 1948 1949 /* Merge Tag_ABI_compatibility attributes and any common GNU ones. */ 1950 if (!_bfd_elf_merge_object_attributes (ibfd, obfd)) 1951 return FALSE; 1952 1953 return result; 1954 } 1955 1956 static bfd_boolean 1957 elf32_tic6x_merge_private_bfd_data (bfd *ibfd, bfd *obfd) 1958 { 1959 if (!_bfd_generic_verify_endian_match (ibfd, obfd)) 1960 return FALSE; 1961 1962 if (!elf32_tic6x_merge_attributes (ibfd, obfd)) 1963 return FALSE; 1964 1965 return TRUE; 1966 } 1967 1968 1969 #define TARGET_LITTLE_SYM bfd_elf32_tic6x_le_vec 1970 #define TARGET_LITTLE_NAME "elf32-tic6x-le" 1971 #define TARGET_BIG_SYM bfd_elf32_tic6x_be_vec 1972 #define TARGET_BIG_NAME "elf32-tic6x-be" 1973 #define ELF_ARCH bfd_arch_tic6x 1974 #define ELF_TARGET_ID TIC6X_ELF_DATA 1975 #define ELF_MACHINE_CODE EM_TI_C6000 1976 #define ELF_MAXPAGESIZE 1 1977 #define bfd_elf32_bfd_reloc_type_lookup elf32_tic6x_reloc_type_lookup 1978 #define bfd_elf32_bfd_reloc_name_lookup elf32_tic6x_reloc_name_lookup 1979 #define bfd_elf32_bfd_merge_private_bfd_data elf32_tic6x_merge_private_bfd_data 1980 #define bfd_elf32_mkobject elf32_tic6x_mkobject 1981 #define bfd_elf32_new_section_hook elf32_tic6x_new_section_hook 1982 #define elf_backend_can_gc_sections 1 1983 #define elf_backend_default_use_rela_p 1 1984 #define elf_backend_may_use_rel_p 1 1985 #define elf_backend_may_use_rela_p 1 1986 #define elf_backend_obj_attrs_arg_type elf32_tic6x_obj_attrs_arg_type 1987 #define elf_backend_obj_attrs_order elf32_tic6x_obj_attrs_order 1988 #define elf_backend_obj_attrs_section ".c6xabi.attributes" 1989 #define elf_backend_obj_attrs_section_type SHT_C6000_ATTRIBUTES 1990 #define elf_backend_obj_attrs_vendor "c6xabi" 1991 #define elf_backend_rela_normal 1 1992 #define elf_backend_relocate_section elf32_tic6x_relocate_section 1993 #define elf_info_to_howto elf32_tic6x_info_to_howto 1994 #define elf_info_to_howto_rel elf32_tic6x_info_to_howto_rel 1995 1996 #include "elf32-target.h" 1997