1 /* MSP430-specific support for 32-bit ELF 2 Copyright (C) 2002-2016 Free Software Foundation, Inc. 3 Contributed by Dmitry Diky <diwil@mail.ru> 4 5 This file is part of BFD, the Binary File Descriptor library. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 #include "sysdep.h" 23 #include "bfd.h" 24 #include "libiberty.h" 25 #include "libbfd.h" 26 #include "elf-bfd.h" 27 #include "elf/msp430.h" 28 29 static bfd_reloc_status_type 30 rl78_sym_diff_handler (bfd * abfd, 31 arelent * reloc, 32 asymbol * sym ATTRIBUTE_UNUSED, 33 void * addr ATTRIBUTE_UNUSED, 34 asection * input_sec, 35 bfd * out_bfd ATTRIBUTE_UNUSED, 36 char ** error_message ATTRIBUTE_UNUSED) 37 { 38 bfd_size_type octets; 39 octets = reloc->address * bfd_octets_per_byte (abfd); 40 41 /* Catch the case where bfd_install_relocation would return 42 bfd_reloc_outofrange because the SYM_DIFF reloc is being used in a very 43 small section. It does not actually matter if this happens because all 44 that SYM_DIFF does is compute a (4-byte) value. A second reloc then uses 45 this value, and it is that reloc that must fit into the section. 46 47 This happens in eg, gcc/testsuite/gcc.c-torture/compile/labels-3.c. */ 48 if ((octets + bfd_get_reloc_size (reloc->howto)) 49 > bfd_get_section_limit_octets (abfd, input_sec)) 50 return bfd_reloc_ok; 51 return bfd_reloc_continue; 52 } 53 54 static reloc_howto_type elf_msp430_howto_table[] = 55 { 56 HOWTO (R_MSP430_NONE, /* type */ 57 0, /* rightshift */ 58 3, /* size (0 = byte, 1 = short, 2 = long) */ 59 0, /* bitsize */ 60 FALSE, /* pc_relative */ 61 0, /* bitpos */ 62 complain_overflow_dont,/* complain_on_overflow */ 63 bfd_elf_generic_reloc, /* special_function */ 64 "R_MSP430_NONE", /* name */ 65 FALSE, /* partial_inplace */ 66 0, /* src_mask */ 67 0, /* dst_mask */ 68 FALSE), /* pcrel_offset */ 69 70 HOWTO (R_MSP430_32, /* type */ 71 0, /* rightshift */ 72 2, /* size (0 = byte, 1 = short, 2 = long) */ 73 32, /* bitsize */ 74 FALSE, /* pc_relative */ 75 0, /* bitpos */ 76 complain_overflow_bitfield,/* complain_on_overflow */ 77 bfd_elf_generic_reloc, /* special_function */ 78 "R_MSP430_32", /* name */ 79 FALSE, /* partial_inplace */ 80 0xffffffff, /* src_mask */ 81 0xffffffff, /* dst_mask */ 82 FALSE), /* pcrel_offset */ 83 84 /* A 10 bit PC relative relocation. */ 85 HOWTO (R_MSP430_10_PCREL, /* type */ 86 1, /* rightshift */ 87 1, /* size (0 = byte, 1 = short, 2 = long) */ 88 10, /* bitsize */ 89 TRUE, /* pc_relative */ 90 0, /* bitpos */ 91 complain_overflow_bitfield,/* complain_on_overflow */ 92 bfd_elf_generic_reloc, /* special_function */ 93 "R_MSP430_10_PCREL", /* name */ 94 FALSE, /* partial_inplace */ 95 0x3ff, /* src_mask */ 96 0x3ff, /* dst_mask */ 97 TRUE), /* pcrel_offset */ 98 99 /* A 16 bit absolute relocation. */ 100 HOWTO (R_MSP430_16, /* type */ 101 0, /* rightshift */ 102 1, /* size (0 = byte, 1 = short, 2 = long) */ 103 16, /* bitsize */ 104 FALSE, /* pc_relative */ 105 0, /* bitpos */ 106 complain_overflow_dont,/* complain_on_overflow */ 107 bfd_elf_generic_reloc, /* special_function */ 108 "R_MSP430_16", /* name */ 109 FALSE, /* partial_inplace */ 110 0, /* src_mask */ 111 0xffff, /* dst_mask */ 112 FALSE), /* pcrel_offset */ 113 114 /* A 16 bit PC relative relocation for command address. */ 115 HOWTO (R_MSP430_16_PCREL, /* type */ 116 1, /* rightshift */ 117 1, /* size (0 = byte, 1 = short, 2 = long) */ 118 16, /* bitsize */ 119 TRUE, /* pc_relative */ 120 0, /* bitpos */ 121 complain_overflow_dont,/* complain_on_overflow */ 122 bfd_elf_generic_reloc, /* special_function */ 123 "R_MSP430_16_PCREL", /* name */ 124 FALSE, /* partial_inplace */ 125 0, /* src_mask */ 126 0xffff, /* dst_mask */ 127 TRUE), /* pcrel_offset */ 128 129 /* A 16 bit absolute relocation, byte operations. */ 130 HOWTO (R_MSP430_16_BYTE, /* type */ 131 0, /* rightshift */ 132 1, /* size (0 = byte, 1 = short, 2 = long) */ 133 16, /* bitsize */ 134 FALSE, /* pc_relative */ 135 0, /* bitpos */ 136 complain_overflow_dont,/* complain_on_overflow */ 137 bfd_elf_generic_reloc, /* special_function */ 138 "R_MSP430_16_BYTE", /* name */ 139 FALSE, /* partial_inplace */ 140 0xffff, /* src_mask */ 141 0xffff, /* dst_mask */ 142 FALSE), /* pcrel_offset */ 143 144 /* A 16 bit absolute relocation for command address. */ 145 HOWTO (R_MSP430_16_PCREL_BYTE,/* type */ 146 1, /* rightshift */ 147 1, /* size (0 = byte, 1 = short, 2 = long) */ 148 16, /* bitsize */ 149 TRUE, /* pc_relative */ 150 0, /* bitpos */ 151 complain_overflow_dont,/* complain_on_overflow */ 152 bfd_elf_generic_reloc, /* special_function */ 153 "R_MSP430_16_PCREL_BYTE",/* name */ 154 FALSE, /* partial_inplace */ 155 0xffff, /* src_mask */ 156 0xffff, /* dst_mask */ 157 TRUE), /* pcrel_offset */ 158 159 /* A 10 bit PC relative relocation for complicated polymorphs. */ 160 HOWTO (R_MSP430_2X_PCREL, /* type */ 161 1, /* rightshift */ 162 2, /* size (0 = byte, 1 = short, 2 = long) */ 163 10, /* bitsize */ 164 TRUE, /* pc_relative */ 165 0, /* bitpos */ 166 complain_overflow_bitfield,/* complain_on_overflow */ 167 bfd_elf_generic_reloc, /* special_function */ 168 "R_MSP430_2X_PCREL", /* name */ 169 FALSE, /* partial_inplace */ 170 0x3ff, /* src_mask */ 171 0x3ff, /* dst_mask */ 172 TRUE), /* pcrel_offset */ 173 174 /* A 16 bit relaxable relocation for command address. */ 175 HOWTO (R_MSP430_RL_PCREL, /* type */ 176 1, /* rightshift */ 177 1, /* size (0 = byte, 1 = short, 2 = long) */ 178 16, /* bitsize */ 179 TRUE, /* pc_relative */ 180 0, /* bitpos */ 181 complain_overflow_dont,/* complain_on_overflow */ 182 bfd_elf_generic_reloc, /* special_function */ 183 "R_MSP430_RL_PCREL", /* name */ 184 FALSE, /* partial_inplace */ 185 0, /* src_mask */ 186 0xffff, /* dst_mask */ 187 TRUE) /* pcrel_offset */ 188 189 /* A 8-bit absolute relocation. */ 190 , HOWTO (R_MSP430_8, /* type */ 191 0, /* rightshift */ 192 0, /* size (0 = byte, 1 = short, 2 = long) */ 193 8, /* bitsize */ 194 FALSE, /* pc_relative */ 195 0, /* bitpos */ 196 complain_overflow_dont,/* complain_on_overflow */ 197 bfd_elf_generic_reloc, /* special_function */ 198 "R_MSP430_8", /* name */ 199 FALSE, /* partial_inplace */ 200 0, /* src_mask */ 201 0xffff, /* dst_mask */ 202 FALSE), /* pcrel_offset */ 203 204 /* Together with a following reloc, allows for the difference 205 between two symbols to be the real addend of the second reloc. */ 206 HOWTO (R_MSP430_SYM_DIFF, /* type */ 207 0, /* rightshift */ 208 2, /* size (0 = byte, 1 = short, 2 = long) */ 209 32, /* bitsize */ 210 FALSE, /* pc_relative */ 211 0, /* bitpos */ 212 complain_overflow_dont,/* complain_on_overflow */ 213 rl78_sym_diff_handler, /* special handler. */ 214 "R_MSP430_SYM_DIFF", /* name */ 215 FALSE, /* partial_inplace */ 216 0xffffffff, /* src_mask */ 217 0xffffffff, /* dst_mask */ 218 FALSE) /* pcrel_offset */ 219 }; 220 221 static reloc_howto_type elf_msp430x_howto_table[] = 222 { 223 HOWTO (R_MSP430_NONE, /* type */ 224 0, /* rightshift */ 225 3, /* size (0 = byte, 1 = short, 2 = long) */ 226 0, /* bitsize */ 227 FALSE, /* pc_relative */ 228 0, /* bitpos */ 229 complain_overflow_dont,/* complain_on_overflow */ 230 bfd_elf_generic_reloc, /* special_function */ 231 "R_MSP430_NONE", /* name */ 232 FALSE, /* partial_inplace */ 233 0, /* src_mask */ 234 0, /* dst_mask */ 235 FALSE), /* pcrel_offset */ 236 237 HOWTO (R_MSP430_ABS32, /* type */ 238 0, /* rightshift */ 239 2, /* size (0 = byte, 1 = short, 2 = long) */ 240 32, /* bitsize */ 241 FALSE, /* pc_relative */ 242 0, /* bitpos */ 243 complain_overflow_bitfield,/* complain_on_overflow */ 244 bfd_elf_generic_reloc, /* special_function */ 245 "R_MSP430_ABS32", /* name */ 246 FALSE, /* partial_inplace */ 247 0xffffffff, /* src_mask */ 248 0xffffffff, /* dst_mask */ 249 FALSE), /* pcrel_offset */ 250 251 HOWTO (R_MSP430_ABS16, /* type */ 252 0, /* rightshift */ 253 1, /* size (0 = byte, 1 = short, 2 = long) */ 254 16, /* bitsize */ 255 FALSE, /* pc_relative */ 256 0, /* bitpos */ 257 complain_overflow_dont,/* complain_on_overflow */ 258 bfd_elf_generic_reloc, /* special_function */ 259 "R_MSP430_ABS16", /* name */ 260 FALSE, /* partial_inplace */ 261 0, /* src_mask */ 262 0xffff, /* dst_mask */ 263 FALSE), /* pcrel_offset */ 264 265 HOWTO (R_MSP430_ABS8, /* type */ 266 0, /* rightshift */ 267 0, /* size (0 = byte, 1 = short, 2 = long) */ 268 8, /* bitsize */ 269 FALSE, /* pc_relative */ 270 0, /* bitpos */ 271 complain_overflow_bitfield,/* complain_on_overflow */ 272 bfd_elf_generic_reloc, /* special_function */ 273 "R_MSP430_ABS8", /* name */ 274 FALSE, /* partial_inplace */ 275 0xff, /* src_mask */ 276 0xff, /* dst_mask */ 277 FALSE), /* pcrel_offset */ 278 279 HOWTO (R_MSP430_PCR16, /* type */ 280 1, /* rightshift */ 281 1, /* size (0 = byte, 1 = short, 2 = long) */ 282 16, /* bitsize */ 283 TRUE, /* pc_relative */ 284 0, /* bitpos */ 285 complain_overflow_dont,/* complain_on_overflow */ 286 bfd_elf_generic_reloc, /* special_function */ 287 "R_MSP430_PCR16", /* name */ 288 FALSE, /* partial_inplace */ 289 0, /* src_mask */ 290 0xffff, /* dst_mask */ 291 TRUE), /* pcrel_offset */ 292 293 HOWTO (R_MSP430X_PCR20_EXT_SRC,/* type */ 294 0, /* rightshift */ 295 2, /* size (0 = byte, 1 = short, 2 = long) */ 296 32, /* bitsize */ 297 TRUE, /* pc_relative */ 298 0, /* bitpos */ 299 complain_overflow_dont,/* complain_on_overflow */ 300 bfd_elf_generic_reloc, /* special_function */ 301 "R_MSP430X_PCR20_EXT_SRC",/* name */ 302 FALSE, /* partial_inplace */ 303 0, /* src_mask */ 304 0xffff, /* dst_mask */ 305 TRUE), /* pcrel_offset */ 306 307 HOWTO (R_MSP430X_PCR20_EXT_DST,/* type */ 308 0, /* rightshift */ 309 2, /* size (0 = byte, 1 = short, 2 = long) */ 310 32, /* bitsize */ 311 TRUE, /* pc_relative */ 312 0, /* bitpos */ 313 complain_overflow_dont,/* complain_on_overflow */ 314 bfd_elf_generic_reloc, /* special_function */ 315 "R_MSP430X_PCR20_EXT_DST",/* name */ 316 FALSE, /* partial_inplace */ 317 0, /* src_mask */ 318 0xffff, /* dst_mask */ 319 TRUE), /* pcrel_offset */ 320 321 HOWTO (R_MSP430X_PCR20_EXT_ODST,/* type */ 322 0, /* rightshift */ 323 2, /* size (0 = byte, 1 = short, 2 = long) */ 324 32, /* bitsize */ 325 TRUE, /* pc_relative */ 326 0, /* bitpos */ 327 complain_overflow_dont,/* complain_on_overflow */ 328 bfd_elf_generic_reloc, /* special_function */ 329 "R_MSP430X_PCR20_EXT_ODST",/* name */ 330 FALSE, /* partial_inplace */ 331 0, /* src_mask */ 332 0xffff, /* dst_mask */ 333 TRUE), /* pcrel_offset */ 334 335 HOWTO (R_MSP430X_ABS20_EXT_SRC,/* type */ 336 0, /* rightshift */ 337 2, /* size (0 = byte, 1 = short, 2 = long) */ 338 32, /* bitsize */ 339 TRUE, /* pc_relative */ 340 0, /* bitpos */ 341 complain_overflow_dont,/* complain_on_overflow */ 342 bfd_elf_generic_reloc, /* special_function */ 343 "R_MSP430X_ABS20_EXT_SRC",/* name */ 344 FALSE, /* partial_inplace */ 345 0, /* src_mask */ 346 0xffff, /* dst_mask */ 347 TRUE), /* pcrel_offset */ 348 349 HOWTO (R_MSP430X_ABS20_EXT_DST,/* type */ 350 0, /* rightshift */ 351 2, /* size (0 = byte, 1 = short, 2 = long) */ 352 32, /* bitsize */ 353 TRUE, /* pc_relative */ 354 0, /* bitpos */ 355 complain_overflow_dont,/* complain_on_overflow */ 356 bfd_elf_generic_reloc, /* special_function */ 357 "R_MSP430X_ABS20_EXT_DST",/* name */ 358 FALSE, /* partial_inplace */ 359 0, /* src_mask */ 360 0xffff, /* dst_mask */ 361 TRUE), /* pcrel_offset */ 362 363 HOWTO (R_MSP430X_ABS20_EXT_ODST,/* type */ 364 0, /* rightshift */ 365 2, /* size (0 = byte, 1 = short, 2 = long) */ 366 32, /* bitsize */ 367 TRUE, /* pc_relative */ 368 0, /* bitpos */ 369 complain_overflow_dont,/* complain_on_overflow */ 370 bfd_elf_generic_reloc, /* special_function */ 371 "R_MSP430X_ABS20_EXT_ODST",/* name */ 372 FALSE, /* partial_inplace */ 373 0, /* src_mask */ 374 0xffff, /* dst_mask */ 375 TRUE), /* pcrel_offset */ 376 377 HOWTO (R_MSP430X_ABS20_ADR_SRC,/* type */ 378 0, /* rightshift */ 379 2, /* size (0 = byte, 1 = short, 2 = long) */ 380 32, /* bitsize */ 381 TRUE, /* pc_relative */ 382 0, /* bitpos */ 383 complain_overflow_dont,/* complain_on_overflow */ 384 bfd_elf_generic_reloc, /* special_function */ 385 "R_MSP430X_ABS20_ADR_SRC",/* name */ 386 FALSE, /* partial_inplace */ 387 0, /* src_mask */ 388 0xffff, /* dst_mask */ 389 TRUE), /* pcrel_offset */ 390 391 HOWTO (R_MSP430X_ABS20_ADR_DST,/* type */ 392 0, /* rightshift */ 393 2, /* size (0 = byte, 1 = short, 2 = long) */ 394 32, /* bitsize */ 395 TRUE, /* pc_relative */ 396 0, /* bitpos */ 397 complain_overflow_dont,/* complain_on_overflow */ 398 bfd_elf_generic_reloc, /* special_function */ 399 "R_MSP430X_ABS20_ADR_DST",/* name */ 400 FALSE, /* partial_inplace */ 401 0, /* src_mask */ 402 0xffff, /* dst_mask */ 403 TRUE), /* pcrel_offset */ 404 405 HOWTO (R_MSP430X_PCR16, /* type */ 406 0, /* rightshift */ 407 2, /* size (0 = byte, 1 = short, 2 = long) */ 408 32, /* bitsize */ 409 TRUE, /* pc_relative */ 410 0, /* bitpos */ 411 complain_overflow_dont,/* complain_on_overflow */ 412 bfd_elf_generic_reloc, /* special_function */ 413 "R_MSP430X_PCR16", /* name */ 414 FALSE, /* partial_inplace */ 415 0, /* src_mask */ 416 0xffff, /* dst_mask */ 417 TRUE), /* pcrel_offset */ 418 419 HOWTO (R_MSP430X_PCR20_CALL, /* type */ 420 0, /* rightshift */ 421 2, /* size (0 = byte, 1 = short, 2 = long) */ 422 32, /* bitsize */ 423 TRUE, /* pc_relative */ 424 0, /* bitpos */ 425 complain_overflow_dont,/* complain_on_overflow */ 426 bfd_elf_generic_reloc, /* special_function */ 427 "R_MSP430X_PCR20_CALL",/* name */ 428 FALSE, /* partial_inplace */ 429 0, /* src_mask */ 430 0xffff, /* dst_mask */ 431 TRUE), /* pcrel_offset */ 432 433 HOWTO (R_MSP430X_ABS16, /* type */ 434 0, /* rightshift */ 435 2, /* size (0 = byte, 1 = short, 2 = long) */ 436 32, /* bitsize */ 437 TRUE, /* pc_relative */ 438 0, /* bitpos */ 439 complain_overflow_dont,/* complain_on_overflow */ 440 bfd_elf_generic_reloc, /* special_function */ 441 "R_MSP430X_ABS16", /* name */ 442 FALSE, /* partial_inplace */ 443 0, /* src_mask */ 444 0xffff, /* dst_mask */ 445 TRUE), /* pcrel_offset */ 446 447 HOWTO (R_MSP430_ABS_HI16, /* type */ 448 0, /* rightshift */ 449 2, /* size (0 = byte, 1 = short, 2 = long) */ 450 32, /* bitsize */ 451 TRUE, /* pc_relative */ 452 0, /* bitpos */ 453 complain_overflow_dont,/* complain_on_overflow */ 454 bfd_elf_generic_reloc, /* special_function */ 455 "R_MSP430_ABS_HI16", /* name */ 456 FALSE, /* partial_inplace */ 457 0, /* src_mask */ 458 0xffff, /* dst_mask */ 459 TRUE), /* pcrel_offset */ 460 461 HOWTO (R_MSP430_PREL31, /* type */ 462 0, /* rightshift */ 463 2, /* size (0 = byte, 1 = short, 2 = long) */ 464 32, /* bitsize */ 465 TRUE, /* pc_relative */ 466 0, /* bitpos */ 467 complain_overflow_dont,/* complain_on_overflow */ 468 bfd_elf_generic_reloc, /* special_function */ 469 "R_MSP430_PREL31", /* name */ 470 FALSE, /* partial_inplace */ 471 0, /* src_mask */ 472 0xffff, /* dst_mask */ 473 TRUE), /* pcrel_offset */ 474 475 EMPTY_HOWTO (R_MSP430_EHTYPE), 476 477 /* A 10 bit PC relative relocation. */ 478 HOWTO (R_MSP430X_10_PCREL, /* type */ 479 1, /* rightshift */ 480 1, /* size (0 = byte, 1 = short, 2 = long) */ 481 10, /* bitsize */ 482 TRUE, /* pc_relative */ 483 0, /* bitpos */ 484 complain_overflow_bitfield,/* complain_on_overflow */ 485 bfd_elf_generic_reloc, /* special_function */ 486 "R_MSP430X_10_PCREL", /* name */ 487 FALSE, /* partial_inplace */ 488 0x3ff, /* src_mask */ 489 0x3ff, /* dst_mask */ 490 TRUE), /* pcrel_offset */ 491 492 /* A 10 bit PC relative relocation for complicated polymorphs. */ 493 HOWTO (R_MSP430X_2X_PCREL, /* type */ 494 1, /* rightshift */ 495 2, /* size (0 = byte, 1 = short, 2 = long) */ 496 10, /* bitsize */ 497 TRUE, /* pc_relative */ 498 0, /* bitpos */ 499 complain_overflow_bitfield,/* complain_on_overflow */ 500 bfd_elf_generic_reloc, /* special_function */ 501 "R_MSP430X_2X_PCREL", /* name */ 502 FALSE, /* partial_inplace */ 503 0x3ff, /* src_mask */ 504 0x3ff, /* dst_mask */ 505 TRUE), /* pcrel_offset */ 506 507 /* Together with a following reloc, allows for the difference 508 between two symbols to be the real addend of the second reloc. */ 509 HOWTO (R_MSP430X_SYM_DIFF, /* type */ 510 0, /* rightshift */ 511 2, /* size (0 = byte, 1 = short, 2 = long) */ 512 32, /* bitsize */ 513 FALSE, /* pc_relative */ 514 0, /* bitpos */ 515 complain_overflow_dont,/* complain_on_overflow */ 516 rl78_sym_diff_handler, /* special handler. */ 517 "R_MSP430X_SYM_DIFF", /* name */ 518 FALSE, /* partial_inplace */ 519 0xffffffff, /* src_mask */ 520 0xffffffff, /* dst_mask */ 521 FALSE) /* pcrel_offset */ 522 }; 523 524 /* Map BFD reloc types to MSP430 ELF reloc types. */ 525 526 struct msp430_reloc_map 527 { 528 bfd_reloc_code_real_type bfd_reloc_val; 529 unsigned int elf_reloc_val; 530 }; 531 532 static const struct msp430_reloc_map msp430_reloc_map[] = 533 { 534 {BFD_RELOC_NONE, R_MSP430_NONE}, 535 {BFD_RELOC_32, R_MSP430_32}, 536 {BFD_RELOC_MSP430_10_PCREL, R_MSP430_10_PCREL}, 537 {BFD_RELOC_16, R_MSP430_16_BYTE}, 538 {BFD_RELOC_MSP430_16_PCREL, R_MSP430_16_PCREL}, 539 {BFD_RELOC_MSP430_16, R_MSP430_16}, 540 {BFD_RELOC_MSP430_16_PCREL_BYTE, R_MSP430_16_PCREL_BYTE}, 541 {BFD_RELOC_MSP430_16_BYTE, R_MSP430_16_BYTE}, 542 {BFD_RELOC_MSP430_2X_PCREL, R_MSP430_2X_PCREL}, 543 {BFD_RELOC_MSP430_RL_PCREL, R_MSP430_RL_PCREL}, 544 {BFD_RELOC_8, R_MSP430_8}, 545 {BFD_RELOC_MSP430_SYM_DIFF, R_MSP430_SYM_DIFF} 546 }; 547 548 static const struct msp430_reloc_map msp430x_reloc_map[] = 549 { 550 {BFD_RELOC_NONE, R_MSP430_NONE}, 551 {BFD_RELOC_32, R_MSP430_ABS32}, 552 {BFD_RELOC_16, R_MSP430_ABS16}, 553 {BFD_RELOC_8, R_MSP430_ABS8}, 554 {BFD_RELOC_MSP430_ABS8, R_MSP430_ABS8}, 555 {BFD_RELOC_MSP430X_PCR20_EXT_SRC, R_MSP430X_PCR20_EXT_SRC}, 556 {BFD_RELOC_MSP430X_PCR20_EXT_DST, R_MSP430X_PCR20_EXT_DST}, 557 {BFD_RELOC_MSP430X_PCR20_EXT_ODST, R_MSP430X_PCR20_EXT_ODST}, 558 {BFD_RELOC_MSP430X_ABS20_EXT_SRC, R_MSP430X_ABS20_EXT_SRC}, 559 {BFD_RELOC_MSP430X_ABS20_EXT_DST, R_MSP430X_ABS20_EXT_DST}, 560 {BFD_RELOC_MSP430X_ABS20_EXT_ODST, R_MSP430X_ABS20_EXT_ODST}, 561 {BFD_RELOC_MSP430X_ABS20_ADR_SRC, R_MSP430X_ABS20_ADR_SRC}, 562 {BFD_RELOC_MSP430X_ABS20_ADR_DST, R_MSP430X_ABS20_ADR_DST}, 563 {BFD_RELOC_MSP430X_PCR16, R_MSP430X_PCR16}, 564 {BFD_RELOC_MSP430X_PCR20_CALL, R_MSP430X_PCR20_CALL}, 565 {BFD_RELOC_MSP430X_ABS16, R_MSP430X_ABS16}, 566 {BFD_RELOC_MSP430_ABS_HI16, R_MSP430_ABS_HI16}, 567 {BFD_RELOC_MSP430_PREL31, R_MSP430_PREL31}, 568 {BFD_RELOC_MSP430_10_PCREL, R_MSP430X_10_PCREL}, 569 {BFD_RELOC_MSP430_2X_PCREL, R_MSP430X_2X_PCREL}, 570 {BFD_RELOC_MSP430_RL_PCREL, R_MSP430X_PCR16}, 571 {BFD_RELOC_MSP430_SYM_DIFF, R_MSP430X_SYM_DIFF} 572 }; 573 574 static inline bfd_boolean 575 uses_msp430x_relocs (bfd * abfd) 576 { 577 extern const bfd_target msp430_elf32_ti_vec; 578 579 return bfd_get_mach (abfd) == bfd_mach_msp430x 580 || abfd->xvec == & msp430_elf32_ti_vec; 581 } 582 583 static reloc_howto_type * 584 bfd_elf32_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, 585 bfd_reloc_code_real_type code) 586 { 587 unsigned int i; 588 589 if (uses_msp430x_relocs (abfd)) 590 { 591 for (i = ARRAY_SIZE (msp430x_reloc_map); i--;) 592 if (msp430x_reloc_map[i].bfd_reloc_val == code) 593 return elf_msp430x_howto_table + msp430x_reloc_map[i].elf_reloc_val; 594 } 595 else 596 { 597 for (i = 0; i < ARRAY_SIZE (msp430_reloc_map); i++) 598 if (msp430_reloc_map[i].bfd_reloc_val == code) 599 return &elf_msp430_howto_table[msp430_reloc_map[i].elf_reloc_val]; 600 } 601 602 return NULL; 603 } 604 605 static reloc_howto_type * 606 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, 607 const char *r_name) 608 { 609 unsigned int i; 610 611 if (uses_msp430x_relocs (abfd)) 612 { 613 for (i = ARRAY_SIZE (elf_msp430x_howto_table); i--;) 614 if (elf_msp430x_howto_table[i].name != NULL 615 && strcasecmp (elf_msp430x_howto_table[i].name, r_name) == 0) 616 return elf_msp430x_howto_table + i; 617 } 618 else 619 { 620 for (i = 0; 621 i < (sizeof (elf_msp430_howto_table) 622 / sizeof (elf_msp430_howto_table[0])); 623 i++) 624 if (elf_msp430_howto_table[i].name != NULL 625 && strcasecmp (elf_msp430_howto_table[i].name, r_name) == 0) 626 return &elf_msp430_howto_table[i]; 627 } 628 629 return NULL; 630 } 631 632 /* Set the howto pointer for an MSP430 ELF reloc. */ 633 634 static void 635 msp430_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED, 636 arelent * cache_ptr, 637 Elf_Internal_Rela * dst) 638 { 639 unsigned int r_type; 640 641 r_type = ELF32_R_TYPE (dst->r_info); 642 643 if (uses_msp430x_relocs (abfd)) 644 { 645 if (r_type >= (unsigned int) R_MSP430x_max) 646 { 647 _bfd_error_handler (_("%B: invalid MSP430X reloc number: %d"), abfd, r_type); 648 r_type = 0; 649 } 650 cache_ptr->howto = elf_msp430x_howto_table + r_type; 651 return; 652 } 653 654 if (r_type >= (unsigned int) R_MSP430_max) 655 { 656 _bfd_error_handler (_("%B: invalid MSP430 reloc number: %d"), abfd, r_type); 657 r_type = 0; 658 } 659 cache_ptr->howto = &elf_msp430_howto_table[r_type]; 660 } 661 662 /* Look through the relocs for a section during the first phase. 663 Since we don't do .gots or .plts, we just need to consider the 664 virtual table relocs for gc. */ 665 666 static bfd_boolean 667 elf32_msp430_check_relocs (bfd * abfd, struct bfd_link_info * info, 668 asection * sec, const Elf_Internal_Rela * relocs) 669 { 670 Elf_Internal_Shdr *symtab_hdr; 671 struct elf_link_hash_entry **sym_hashes; 672 const Elf_Internal_Rela *rel; 673 const Elf_Internal_Rela *rel_end; 674 675 if (bfd_link_relocatable (info)) 676 return TRUE; 677 678 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 679 sym_hashes = elf_sym_hashes (abfd); 680 681 rel_end = relocs + sec->reloc_count; 682 for (rel = relocs; rel < rel_end; rel++) 683 { 684 struct elf_link_hash_entry *h; 685 unsigned long r_symndx; 686 687 r_symndx = ELF32_R_SYM (rel->r_info); 688 if (r_symndx < symtab_hdr->sh_info) 689 h = NULL; 690 else 691 { 692 h = sym_hashes[r_symndx - symtab_hdr->sh_info]; 693 while (h->root.type == bfd_link_hash_indirect 694 || h->root.type == bfd_link_hash_warning) 695 h = (struct elf_link_hash_entry *) h->root.u.i.link; 696 697 /* PR15323, ref flags aren't set for references in the same 698 object. */ 699 h->root.non_ir_ref = 1; 700 } 701 } 702 703 return TRUE; 704 } 705 706 /* Perform a single relocation. By default we use the standard BFD 707 routines, but a few relocs, we have to do them ourselves. */ 708 709 static bfd_reloc_status_type 710 msp430_final_link_relocate (reloc_howto_type * howto, 711 bfd * input_bfd, 712 asection * input_section, 713 bfd_byte * contents, 714 Elf_Internal_Rela * rel, 715 bfd_vma relocation, 716 struct bfd_link_info * info) 717 { 718 static asection * sym_diff_section; 719 static bfd_vma sym_diff_value; 720 721 struct bfd_elf_section_data * esd = elf_section_data (input_section); 722 bfd_reloc_status_type r = bfd_reloc_ok; 723 bfd_vma x; 724 bfd_signed_vma srel; 725 bfd_boolean is_rel_reloc = FALSE; 726 727 if (uses_msp430x_relocs (input_bfd)) 728 { 729 /* See if we have a REL type relocation. */ 730 is_rel_reloc = (esd->rel.hdr != NULL); 731 /* Sanity check - only one type of relocation per section. 732 FIXME: Theoretically it is possible to have both types, 733 but if that happens how can we distinguish between the two ? */ 734 BFD_ASSERT (! is_rel_reloc || ! esd->rela.hdr); 735 /* If we are using a REL relocation then the addend should be empty. */ 736 BFD_ASSERT (! is_rel_reloc || rel->r_addend == 0); 737 } 738 739 if (sym_diff_section != NULL) 740 { 741 BFD_ASSERT (sym_diff_section == input_section); 742 743 if (uses_msp430x_relocs (input_bfd)) 744 switch (howto->type) 745 { 746 case R_MSP430_ABS32: 747 /* If we are computing a 32-bit value for the location lists 748 and the result is 0 then we add one to the value. A zero 749 value can result because of linker relaxation deleteing 750 prologue instructions and using a value of 1 (for the begin 751 and end offsets in the location list entry) results in a 752 nul entry which does not prevent the following entries from 753 being parsed. */ 754 if (relocation == sym_diff_value 755 && strcmp (input_section->name, ".debug_loc") == 0) 756 ++ relocation; 757 /* Fall through. */ 758 case R_MSP430_ABS16: 759 case R_MSP430X_ABS16: 760 case R_MSP430_ABS8: 761 BFD_ASSERT (! is_rel_reloc); 762 relocation -= sym_diff_value; 763 break; 764 765 default: 766 return bfd_reloc_dangerous; 767 } 768 else 769 switch (howto->type) 770 { 771 case R_MSP430_32: 772 case R_MSP430_16: 773 case R_MSP430_16_BYTE: 774 case R_MSP430_8: 775 relocation -= sym_diff_value; 776 break; 777 778 default: 779 return bfd_reloc_dangerous; 780 } 781 782 sym_diff_section = NULL; 783 } 784 785 if (uses_msp430x_relocs (input_bfd)) 786 switch (howto->type) 787 { 788 case R_MSP430X_SYM_DIFF: 789 /* Cache the input section and value. 790 The offset is unreliable, since relaxation may 791 have reduced the following reloc's offset. */ 792 BFD_ASSERT (! is_rel_reloc); 793 sym_diff_section = input_section; 794 sym_diff_value = relocation; 795 return bfd_reloc_ok; 796 797 case R_MSP430_ABS16: 798 contents += rel->r_offset; 799 srel = (bfd_signed_vma) relocation; 800 if (is_rel_reloc) 801 srel += bfd_get_16 (input_bfd, contents); 802 else 803 srel += rel->r_addend; 804 bfd_put_16 (input_bfd, srel & 0xffff, contents); 805 break; 806 807 case R_MSP430X_10_PCREL: 808 contents += rel->r_offset; 809 srel = (bfd_signed_vma) relocation; 810 if (is_rel_reloc) 811 srel += bfd_get_16 (input_bfd, contents) & 0x3ff; 812 else 813 srel += rel->r_addend; 814 srel -= rel->r_offset; 815 srel -= 2; /* Branch instructions add 2 to the PC... */ 816 srel -= (input_section->output_section->vma + 817 input_section->output_offset); 818 if (srel & 1) 819 return bfd_reloc_outofrange; 820 821 /* MSP430 addresses commands as words. */ 822 srel >>= 1; 823 824 /* Check for an overflow. */ 825 if (srel < -512 || srel > 511) 826 { 827 if (info->disable_target_specific_optimizations < 0) 828 { 829 static bfd_boolean warned = FALSE; 830 if (! warned) 831 { 832 info->callbacks->warning 833 (info, 834 _("Try enabling relaxation to avoid relocation truncations"), 835 NULL, input_bfd, input_section, relocation); 836 warned = TRUE; 837 } 838 } 839 return bfd_reloc_overflow; 840 } 841 842 x = bfd_get_16 (input_bfd, contents); 843 x = (x & 0xfc00) | (srel & 0x3ff); 844 bfd_put_16 (input_bfd, x, contents); 845 break; 846 847 case R_MSP430X_PCR20_EXT_ODST: 848 /* [0,4]+[48,16] = ---F ---- ---- FFFF */ 849 contents += rel->r_offset; 850 srel = (bfd_signed_vma) relocation; 851 if (is_rel_reloc) 852 { 853 bfd_vma addend; 854 addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; 855 addend |= bfd_get_16 (input_bfd, contents + 6); 856 srel += addend; 857 858 } 859 else 860 srel += rel->r_addend; 861 srel -= rel->r_offset; 862 srel -= (input_section->output_section->vma + 863 input_section->output_offset); 864 bfd_put_16 (input_bfd, (srel & 0xffff), contents + 6); 865 x = bfd_get_16 (input_bfd, contents); 866 x = (x & 0xfff0) | ((srel >> 16) & 0xf); 867 bfd_put_16 (input_bfd, x, contents); 868 break; 869 870 case R_MSP430X_ABS20_EXT_SRC: 871 /* [7,4]+[32,16] = -78- ---- FFFF */ 872 contents += rel->r_offset; 873 srel = (bfd_signed_vma) relocation; 874 if (is_rel_reloc) 875 { 876 bfd_vma addend; 877 addend = (bfd_get_16 (input_bfd, contents) & 0x0780) << 9; 878 addend |= bfd_get_16 (input_bfd, contents + 4); 879 srel += addend; 880 } 881 else 882 srel += rel->r_addend; 883 bfd_put_16 (input_bfd, (srel & 0xffff), contents + 4); 884 srel >>= 16; 885 x = bfd_get_16 (input_bfd, contents); 886 x = (x & 0xf87f) | ((srel << 7) & 0x0780); 887 bfd_put_16 (input_bfd, x, contents); 888 break; 889 890 case R_MSP430_16_PCREL: 891 contents += rel->r_offset; 892 srel = (bfd_signed_vma) relocation; 893 if (is_rel_reloc) 894 srel += bfd_get_16 (input_bfd, contents); 895 else 896 srel += rel->r_addend; 897 srel -= rel->r_offset; 898 /* Only branch instructions add 2 to the PC... */ 899 srel -= (input_section->output_section->vma + 900 input_section->output_offset); 901 if (srel & 1) 902 return bfd_reloc_outofrange; 903 bfd_put_16 (input_bfd, srel & 0xffff, contents); 904 break; 905 906 case R_MSP430X_PCR20_EXT_DST: 907 /* [0,4]+[32,16] = ---F ---- FFFF */ 908 contents += rel->r_offset; 909 srel = (bfd_signed_vma) relocation; 910 if (is_rel_reloc) 911 { 912 bfd_vma addend; 913 addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; 914 addend |= bfd_get_16 (input_bfd, contents + 4); 915 srel += addend; 916 } 917 else 918 srel += rel->r_addend; 919 srel -= rel->r_offset; 920 srel -= (input_section->output_section->vma + 921 input_section->output_offset); 922 bfd_put_16 (input_bfd, (srel & 0xffff), contents + 4); 923 srel >>= 16; 924 x = bfd_get_16 (input_bfd, contents); 925 x = (x & 0xfff0) | (srel & 0xf); 926 bfd_put_16 (input_bfd, x, contents); 927 break; 928 929 case R_MSP430X_PCR20_EXT_SRC: 930 /* [7,4]+[32,16] = -78- ---- FFFF */ 931 contents += rel->r_offset; 932 srel = (bfd_signed_vma) relocation; 933 if (is_rel_reloc) 934 { 935 bfd_vma addend; 936 addend = ((bfd_get_16 (input_bfd, contents) & 0x0780) << 9); 937 addend |= bfd_get_16 (input_bfd, contents + 4); 938 srel += addend;; 939 } 940 else 941 srel += rel->r_addend; 942 srel -= rel->r_offset; 943 /* Only branch instructions add 2 to the PC... */ 944 srel -= (input_section->output_section->vma + 945 input_section->output_offset); 946 bfd_put_16 (input_bfd, (srel & 0xffff), contents + 4); 947 srel >>= 16; 948 x = bfd_get_16 (input_bfd, contents); 949 x = (x & 0xf87f) | ((srel << 7) & 0x0780); 950 bfd_put_16 (input_bfd, x, contents); 951 break; 952 953 case R_MSP430_ABS8: 954 contents += rel->r_offset; 955 srel = (bfd_signed_vma) relocation; 956 if (is_rel_reloc) 957 srel += bfd_get_8 (input_bfd, contents); 958 else 959 srel += rel->r_addend; 960 bfd_put_8 (input_bfd, srel & 0xff, contents); 961 break; 962 963 case R_MSP430X_ABS20_EXT_DST: 964 /* [0,4]+[32,16] = ---F ---- FFFF */ 965 contents += rel->r_offset; 966 srel = (bfd_signed_vma) relocation; 967 if (is_rel_reloc) 968 { 969 bfd_vma addend; 970 addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; 971 addend |= bfd_get_16 (input_bfd, contents + 4); 972 srel += addend; 973 } 974 else 975 srel += rel->r_addend; 976 bfd_put_16 (input_bfd, (srel & 0xffff), contents + 4); 977 srel >>= 16; 978 x = bfd_get_16 (input_bfd, contents); 979 x = (x & 0xfff0) | (srel & 0xf); 980 bfd_put_16 (input_bfd, x, contents); 981 break; 982 983 case R_MSP430X_ABS20_EXT_ODST: 984 /* [0,4]+[48,16] = ---F ---- ---- FFFF */ 985 contents += rel->r_offset; 986 srel = (bfd_signed_vma) relocation; 987 if (is_rel_reloc) 988 { 989 bfd_vma addend; 990 addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; 991 addend |= bfd_get_16 (input_bfd, contents + 6); 992 srel += addend; 993 } 994 else 995 srel += rel->r_addend; 996 bfd_put_16 (input_bfd, (srel & 0xffff), contents + 6); 997 srel >>= 16; 998 x = bfd_get_16 (input_bfd, contents); 999 x = (x & 0xfff0) | (srel & 0xf); 1000 bfd_put_16 (input_bfd, x, contents); 1001 break; 1002 1003 case R_MSP430X_ABS20_ADR_SRC: 1004 /* [8,4]+[16,16] = -F-- FFFF */ 1005 contents += rel->r_offset; 1006 srel = (bfd_signed_vma) relocation; 1007 if (is_rel_reloc) 1008 { 1009 bfd_vma addend; 1010 1011 addend = ((bfd_get_16 (input_bfd, contents) & 0xf00) << 8); 1012 addend |= bfd_get_16 (input_bfd, contents + 2); 1013 srel += addend; 1014 } 1015 else 1016 srel += rel->r_addend; 1017 bfd_put_16 (input_bfd, (srel & 0xffff), contents + 2); 1018 srel >>= 16; 1019 x = bfd_get_16 (input_bfd, contents); 1020 x = (x & 0xf0ff) | ((srel << 8) & 0x0f00); 1021 bfd_put_16 (input_bfd, x, contents); 1022 break; 1023 1024 case R_MSP430X_ABS20_ADR_DST: 1025 /* [0,4]+[16,16] = ---F FFFF */ 1026 contents += rel->r_offset; 1027 srel = (bfd_signed_vma) relocation; 1028 if (is_rel_reloc) 1029 { 1030 bfd_vma addend; 1031 addend = ((bfd_get_16 (input_bfd, contents) & 0xf) << 16); 1032 addend |= bfd_get_16 (input_bfd, contents + 2); 1033 srel += addend; 1034 } 1035 else 1036 srel += rel->r_addend; 1037 bfd_put_16 (input_bfd, (srel & 0xffff), contents + 2); 1038 srel >>= 16; 1039 x = bfd_get_16 (input_bfd, contents); 1040 x = (x & 0xfff0) | (srel & 0xf); 1041 bfd_put_16 (input_bfd, x, contents); 1042 break; 1043 1044 case R_MSP430X_ABS16: 1045 contents += rel->r_offset; 1046 srel = (bfd_signed_vma) relocation; 1047 if (is_rel_reloc) 1048 srel += bfd_get_16 (input_bfd, contents); 1049 else 1050 srel += rel->r_addend; 1051 x = srel; 1052 if (x > 0xffff) 1053 return bfd_reloc_overflow; 1054 bfd_put_16 (input_bfd, srel & 0xffff, contents); 1055 break; 1056 1057 case R_MSP430_ABS_HI16: 1058 /* The EABI specifies that this must be a RELA reloc. */ 1059 BFD_ASSERT (! is_rel_reloc); 1060 contents += rel->r_offset; 1061 srel = (bfd_signed_vma) relocation; 1062 srel += rel->r_addend; 1063 bfd_put_16 (input_bfd, (srel >> 16) & 0xffff, contents); 1064 break; 1065 1066 case R_MSP430X_PCR20_CALL: 1067 /* [0,4]+[16,16] = ---F FFFF*/ 1068 contents += rel->r_offset; 1069 srel = (bfd_signed_vma) relocation; 1070 if (is_rel_reloc) 1071 { 1072 bfd_vma addend; 1073 addend = (bfd_get_16 (input_bfd, contents) & 0xf) << 16; 1074 addend |= bfd_get_16 (input_bfd, contents + 2); 1075 srel += addend; 1076 } 1077 else 1078 srel += rel->r_addend; 1079 srel -= rel->r_offset; 1080 srel -= (input_section->output_section->vma + 1081 input_section->output_offset); 1082 bfd_put_16 (input_bfd, srel & 0xffff, contents + 2); 1083 srel >>= 16; 1084 x = bfd_get_16 (input_bfd, contents); 1085 x = (x & 0xfff0) | (srel & 0xf); 1086 bfd_put_16 (input_bfd, x, contents); 1087 break; 1088 1089 case R_MSP430X_PCR16: 1090 contents += rel->r_offset; 1091 srel = (bfd_signed_vma) relocation; 1092 if (is_rel_reloc) 1093 srel += bfd_get_16 (input_bfd, contents); 1094 else 1095 srel += rel->r_addend; 1096 srel -= rel->r_offset; 1097 srel -= (input_section->output_section->vma + 1098 input_section->output_offset); 1099 bfd_put_16 (input_bfd, srel & 0xffff, contents); 1100 break; 1101 1102 case R_MSP430_PREL31: 1103 contents += rel->r_offset; 1104 srel = (bfd_signed_vma) relocation; 1105 if (is_rel_reloc) 1106 srel += (bfd_get_32 (input_bfd, contents) & 0x7fffffff); 1107 else 1108 srel += rel->r_addend; 1109 srel += rel->r_addend; 1110 x = bfd_get_32 (input_bfd, contents); 1111 x = (x & 0x80000000) | ((srel >> 31) & 0x7fffffff); 1112 bfd_put_32 (input_bfd, x, contents); 1113 break; 1114 1115 default: 1116 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 1117 contents, rel->r_offset, 1118 relocation, rel->r_addend); 1119 } 1120 else 1121 switch (howto->type) 1122 { 1123 case R_MSP430_10_PCREL: 1124 contents += rel->r_offset; 1125 srel = (bfd_signed_vma) relocation; 1126 srel += rel->r_addend; 1127 srel -= rel->r_offset; 1128 srel -= 2; /* Branch instructions add 2 to the PC... */ 1129 srel -= (input_section->output_section->vma + 1130 input_section->output_offset); 1131 1132 if (srel & 1) 1133 return bfd_reloc_outofrange; 1134 1135 /* MSP430 addresses commands as words. */ 1136 srel >>= 1; 1137 1138 /* Check for an overflow. */ 1139 if (srel < -512 || srel > 511) 1140 { 1141 if (info->disable_target_specific_optimizations < 0) 1142 { 1143 static bfd_boolean warned = FALSE; 1144 if (! warned) 1145 { 1146 info->callbacks->warning 1147 (info, 1148 _("Try enabling relaxation to avoid relocation truncations"), 1149 NULL, input_bfd, input_section, relocation); 1150 warned = TRUE; 1151 } 1152 } 1153 return bfd_reloc_overflow; 1154 } 1155 1156 x = bfd_get_16 (input_bfd, contents); 1157 x = (x & 0xfc00) | (srel & 0x3ff); 1158 bfd_put_16 (input_bfd, x, contents); 1159 break; 1160 1161 case R_MSP430_2X_PCREL: 1162 contents += rel->r_offset; 1163 srel = (bfd_signed_vma) relocation; 1164 srel += rel->r_addend; 1165 srel -= rel->r_offset; 1166 srel -= 2; /* Branch instructions add 2 to the PC... */ 1167 srel -= (input_section->output_section->vma + 1168 input_section->output_offset); 1169 1170 if (srel & 1) 1171 return bfd_reloc_outofrange; 1172 1173 /* MSP430 addresses commands as words. */ 1174 srel >>= 1; 1175 1176 /* Check for an overflow. */ 1177 if (srel < -512 || srel > 511) 1178 return bfd_reloc_overflow; 1179 1180 x = bfd_get_16 (input_bfd, contents); 1181 x = (x & 0xfc00) | (srel & 0x3ff); 1182 bfd_put_16 (input_bfd, x, contents); 1183 /* Handle second jump instruction. */ 1184 x = bfd_get_16 (input_bfd, contents - 2); 1185 srel += 1; 1186 x = (x & 0xfc00) | (srel & 0x3ff); 1187 bfd_put_16 (input_bfd, x, contents - 2); 1188 break; 1189 1190 case R_MSP430_RL_PCREL: 1191 case R_MSP430_16_PCREL: 1192 contents += rel->r_offset; 1193 srel = (bfd_signed_vma) relocation; 1194 srel += rel->r_addend; 1195 srel -= rel->r_offset; 1196 /* Only branch instructions add 2 to the PC... */ 1197 srel -= (input_section->output_section->vma + 1198 input_section->output_offset); 1199 1200 if (srel & 1) 1201 return bfd_reloc_outofrange; 1202 1203 bfd_put_16 (input_bfd, srel & 0xffff, contents); 1204 break; 1205 1206 case R_MSP430_16_PCREL_BYTE: 1207 contents += rel->r_offset; 1208 srel = (bfd_signed_vma) relocation; 1209 srel += rel->r_addend; 1210 srel -= rel->r_offset; 1211 /* Only branch instructions add 2 to the PC... */ 1212 srel -= (input_section->output_section->vma + 1213 input_section->output_offset); 1214 1215 bfd_put_16 (input_bfd, srel & 0xffff, contents); 1216 break; 1217 1218 case R_MSP430_16_BYTE: 1219 contents += rel->r_offset; 1220 srel = (bfd_signed_vma) relocation; 1221 srel += rel->r_addend; 1222 bfd_put_16 (input_bfd, srel & 0xffff, contents); 1223 break; 1224 1225 case R_MSP430_16: 1226 contents += rel->r_offset; 1227 srel = (bfd_signed_vma) relocation; 1228 srel += rel->r_addend; 1229 1230 if (srel & 1) 1231 return bfd_reloc_notsupported; 1232 1233 bfd_put_16 (input_bfd, srel & 0xffff, contents); 1234 break; 1235 1236 case R_MSP430_8: 1237 contents += rel->r_offset; 1238 srel = (bfd_signed_vma) relocation; 1239 srel += rel->r_addend; 1240 1241 bfd_put_8 (input_bfd, srel & 0xff, contents); 1242 break; 1243 1244 case R_MSP430_SYM_DIFF: 1245 /* Cache the input section and value. 1246 The offset is unreliable, since relaxation may 1247 have reduced the following reloc's offset. */ 1248 sym_diff_section = input_section; 1249 sym_diff_value = relocation; 1250 return bfd_reloc_ok; 1251 1252 default: 1253 r = _bfd_final_link_relocate (howto, input_bfd, input_section, 1254 contents, rel->r_offset, 1255 relocation, rel->r_addend); 1256 } 1257 1258 return r; 1259 } 1260 1261 /* Relocate an MSP430 ELF section. */ 1262 1263 static bfd_boolean 1264 elf32_msp430_relocate_section (bfd * output_bfd ATTRIBUTE_UNUSED, 1265 struct bfd_link_info * info, 1266 bfd * input_bfd, 1267 asection * input_section, 1268 bfd_byte * contents, 1269 Elf_Internal_Rela * relocs, 1270 Elf_Internal_Sym * local_syms, 1271 asection ** local_sections) 1272 { 1273 Elf_Internal_Shdr *symtab_hdr; 1274 struct elf_link_hash_entry **sym_hashes; 1275 Elf_Internal_Rela *rel; 1276 Elf_Internal_Rela *relend; 1277 1278 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; 1279 sym_hashes = elf_sym_hashes (input_bfd); 1280 relend = relocs + input_section->reloc_count; 1281 1282 for (rel = relocs; rel < relend; rel++) 1283 { 1284 reloc_howto_type *howto; 1285 unsigned long r_symndx; 1286 Elf_Internal_Sym *sym; 1287 asection *sec; 1288 struct elf_link_hash_entry *h; 1289 bfd_vma relocation; 1290 bfd_reloc_status_type r; 1291 const char *name = NULL; 1292 int r_type; 1293 1294 r_type = ELF32_R_TYPE (rel->r_info); 1295 r_symndx = ELF32_R_SYM (rel->r_info); 1296 1297 if (uses_msp430x_relocs (input_bfd)) 1298 howto = elf_msp430x_howto_table + r_type; 1299 else 1300 howto = elf_msp430_howto_table + r_type; 1301 1302 h = NULL; 1303 sym = NULL; 1304 sec = NULL; 1305 1306 if (r_symndx < symtab_hdr->sh_info) 1307 { 1308 sym = local_syms + r_symndx; 1309 sec = local_sections[r_symndx]; 1310 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); 1311 1312 name = bfd_elf_string_from_elf_section 1313 (input_bfd, symtab_hdr->sh_link, sym->st_name); 1314 name = (name == NULL || * name == 0) ? bfd_section_name (input_bfd, sec) : name; 1315 } 1316 else 1317 { 1318 bfd_boolean unresolved_reloc, warned, ignored; 1319 1320 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, 1321 r_symndx, symtab_hdr, sym_hashes, 1322 h, sec, relocation, 1323 unresolved_reloc, warned, ignored); 1324 name = h->root.root.string; 1325 } 1326 1327 if (sec != NULL && discarded_section (sec)) 1328 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, 1329 rel, 1, relend, howto, 0, contents); 1330 1331 if (bfd_link_relocatable (info)) 1332 continue; 1333 1334 r = msp430_final_link_relocate (howto, input_bfd, input_section, 1335 contents, rel, relocation, info); 1336 1337 if (r != bfd_reloc_ok) 1338 { 1339 const char *msg = (const char *) NULL; 1340 1341 switch (r) 1342 { 1343 case bfd_reloc_overflow: 1344 (*info->callbacks->reloc_overflow) 1345 (info, (h ? &h->root : NULL), name, howto->name, 1346 (bfd_vma) 0, input_bfd, input_section, rel->r_offset); 1347 break; 1348 1349 case bfd_reloc_undefined: 1350 (*info->callbacks->undefined_symbol) 1351 (info, name, input_bfd, input_section, rel->r_offset, TRUE); 1352 break; 1353 1354 case bfd_reloc_outofrange: 1355 msg = _("internal error: branch/jump to an odd address detected"); 1356 break; 1357 1358 case bfd_reloc_notsupported: 1359 msg = _("internal error: unsupported relocation error"); 1360 break; 1361 1362 case bfd_reloc_dangerous: 1363 msg = _("internal error: dangerous relocation"); 1364 break; 1365 1366 default: 1367 msg = _("internal error: unknown error"); 1368 break; 1369 } 1370 1371 if (msg) 1372 (*info->callbacks->warning) (info, msg, name, input_bfd, 1373 input_section, rel->r_offset); 1374 } 1375 1376 } 1377 1378 return TRUE; 1379 } 1380 1381 /* The final processing done just before writing out a MSP430 ELF object 1382 file. This gets the MSP430 architecture right based on the machine 1383 number. */ 1384 1385 static void 1386 bfd_elf_msp430_final_write_processing (bfd * abfd, 1387 bfd_boolean linker ATTRIBUTE_UNUSED) 1388 { 1389 unsigned long val; 1390 1391 switch (bfd_get_mach (abfd)) 1392 { 1393 default: 1394 case bfd_mach_msp110: val = E_MSP430_MACH_MSP430x11x1; break; 1395 case bfd_mach_msp11: val = E_MSP430_MACH_MSP430x11; break; 1396 case bfd_mach_msp12: val = E_MSP430_MACH_MSP430x12; break; 1397 case bfd_mach_msp13: val = E_MSP430_MACH_MSP430x13; break; 1398 case bfd_mach_msp14: val = E_MSP430_MACH_MSP430x14; break; 1399 case bfd_mach_msp15: val = E_MSP430_MACH_MSP430x15; break; 1400 case bfd_mach_msp16: val = E_MSP430_MACH_MSP430x16; break; 1401 case bfd_mach_msp31: val = E_MSP430_MACH_MSP430x31; break; 1402 case bfd_mach_msp32: val = E_MSP430_MACH_MSP430x32; break; 1403 case bfd_mach_msp33: val = E_MSP430_MACH_MSP430x33; break; 1404 case bfd_mach_msp41: val = E_MSP430_MACH_MSP430x41; break; 1405 case bfd_mach_msp42: val = E_MSP430_MACH_MSP430x42; break; 1406 case bfd_mach_msp43: val = E_MSP430_MACH_MSP430x43; break; 1407 case bfd_mach_msp44: val = E_MSP430_MACH_MSP430x44; break; 1408 case bfd_mach_msp20: val = E_MSP430_MACH_MSP430x20; break; 1409 case bfd_mach_msp22: val = E_MSP430_MACH_MSP430x22; break; 1410 case bfd_mach_msp23: val = E_MSP430_MACH_MSP430x23; break; 1411 case bfd_mach_msp24: val = E_MSP430_MACH_MSP430x24; break; 1412 case bfd_mach_msp26: val = E_MSP430_MACH_MSP430x26; break; 1413 case bfd_mach_msp46: val = E_MSP430_MACH_MSP430x46; break; 1414 case bfd_mach_msp47: val = E_MSP430_MACH_MSP430x47; break; 1415 case bfd_mach_msp54: val = E_MSP430_MACH_MSP430x54; break; 1416 case bfd_mach_msp430x: val = E_MSP430_MACH_MSP430X; break; 1417 } 1418 1419 elf_elfheader (abfd)->e_machine = EM_MSP430; 1420 elf_elfheader (abfd)->e_flags &= ~EF_MSP430_MACH; 1421 elf_elfheader (abfd)->e_flags |= val; 1422 } 1423 1424 /* Set the right machine number. */ 1425 1426 static bfd_boolean 1427 elf32_msp430_object_p (bfd * abfd) 1428 { 1429 int e_set = bfd_mach_msp14; 1430 1431 if (elf_elfheader (abfd)->e_machine == EM_MSP430 1432 || elf_elfheader (abfd)->e_machine == EM_MSP430_OLD) 1433 { 1434 int e_mach = elf_elfheader (abfd)->e_flags & EF_MSP430_MACH; 1435 1436 switch (e_mach) 1437 { 1438 default: 1439 case E_MSP430_MACH_MSP430x11: e_set = bfd_mach_msp11; break; 1440 case E_MSP430_MACH_MSP430x11x1: e_set = bfd_mach_msp110; break; 1441 case E_MSP430_MACH_MSP430x12: e_set = bfd_mach_msp12; break; 1442 case E_MSP430_MACH_MSP430x13: e_set = bfd_mach_msp13; break; 1443 case E_MSP430_MACH_MSP430x14: e_set = bfd_mach_msp14; break; 1444 case E_MSP430_MACH_MSP430x15: e_set = bfd_mach_msp15; break; 1445 case E_MSP430_MACH_MSP430x16: e_set = bfd_mach_msp16; break; 1446 case E_MSP430_MACH_MSP430x31: e_set = bfd_mach_msp31; break; 1447 case E_MSP430_MACH_MSP430x32: e_set = bfd_mach_msp32; break; 1448 case E_MSP430_MACH_MSP430x33: e_set = bfd_mach_msp33; break; 1449 case E_MSP430_MACH_MSP430x41: e_set = bfd_mach_msp41; break; 1450 case E_MSP430_MACH_MSP430x42: e_set = bfd_mach_msp42; break; 1451 case E_MSP430_MACH_MSP430x43: e_set = bfd_mach_msp43; break; 1452 case E_MSP430_MACH_MSP430x44: e_set = bfd_mach_msp44; break; 1453 case E_MSP430_MACH_MSP430x20: e_set = bfd_mach_msp20; break; 1454 case E_MSP430_MACH_MSP430x22: e_set = bfd_mach_msp22; break; 1455 case E_MSP430_MACH_MSP430x23: e_set = bfd_mach_msp23; break; 1456 case E_MSP430_MACH_MSP430x24: e_set = bfd_mach_msp24; break; 1457 case E_MSP430_MACH_MSP430x26: e_set = bfd_mach_msp26; break; 1458 case E_MSP430_MACH_MSP430x46: e_set = bfd_mach_msp46; break; 1459 case E_MSP430_MACH_MSP430x47: e_set = bfd_mach_msp47; break; 1460 case E_MSP430_MACH_MSP430x54: e_set = bfd_mach_msp54; break; 1461 case E_MSP430_MACH_MSP430X: e_set = bfd_mach_msp430x; break; 1462 } 1463 } 1464 1465 return bfd_default_set_arch_mach (abfd, bfd_arch_msp430, e_set); 1466 } 1467 1468 /* These functions handle relaxing for the msp430. 1469 Relaxation required only in two cases: 1470 - Bad hand coding like jumps from one section to another or 1471 from file to file. 1472 - Sibling calls. This will affect only 'jump label' polymorph. Without 1473 relaxing this enlarges code by 2 bytes. Sibcalls implemented but 1474 do not work in gcc's port by the reason I do not know. 1475 - To convert out of range conditional jump instructions (found inside 1476 a function) into inverted jumps over an unconditional branch instruction. 1477 Anyway, if a relaxation required, user should pass -relax option to the 1478 linker. 1479 1480 There are quite a few relaxing opportunities available on the msp430: 1481 1482 ================================================================ 1483 1484 1. 3 words -> 1 word 1485 1486 eq == jeq label jne +4; br lab 1487 ne != jne label jeq +4; br lab 1488 lt < jl label jge +4; br lab 1489 ltu < jlo label lhs +4; br lab 1490 ge >= jge label jl +4; br lab 1491 geu >= jhs label jlo +4; br lab 1492 1493 2. 4 words -> 1 word 1494 1495 ltn < jn jn +2; jmp +4; br lab 1496 1497 3. 4 words -> 2 words 1498 1499 gt > jeq +2; jge label jeq +6; jl +4; br label 1500 gtu > jeq +2; jhs label jeq +6; jlo +4; br label 1501 1502 4. 4 words -> 2 words and 2 labels 1503 1504 leu <= jeq label; jlo label jeq +2; jhs +4; br label 1505 le <= jeq label; jl label jeq +2; jge +4; br label 1506 ================================================================= 1507 1508 codemap for first cases is (labels masked ): 1509 eq: 0x2002,0x4010,0x0000 -> 0x2400 1510 ne: 0x2402,0x4010,0x0000 -> 0x2000 1511 lt: 0x3402,0x4010,0x0000 -> 0x3800 1512 ltu: 0x2c02,0x4010,0x0000 -> 0x2800 1513 ge: 0x3802,0x4010,0x0000 -> 0x3400 1514 geu: 0x2802,0x4010,0x0000 -> 0x2c00 1515 1516 second case: 1517 ltn: 0x3001,0x3c02,0x4010,0x0000 -> 0x3000 1518 1519 third case: 1520 gt: 0x2403,0x3802,0x4010,0x0000 -> 0x2401,0x3400 1521 gtu: 0x2403,0x2802,0x4010,0x0000 -> 0x2401,0x2c00 1522 1523 fourth case: 1524 leu: 0x2401,0x2c02,0x4010,0x0000 -> 0x2400,0x2800 1525 le: 0x2401,0x3402,0x4010,0x0000 -> 0x2400,0x3800 1526 1527 Unspecified case :) 1528 jump: 0x4010,0x0000 -> 0x3c00. */ 1529 1530 #define NUMB_RELAX_CODES 12 1531 static struct rcodes_s 1532 { 1533 int f0, f1; /* From code. */ 1534 int t0, t1; /* To code. */ 1535 int labels; /* Position of labels: 1 - one label at first 1536 word, 2 - one at second word, 3 - two 1537 labels at both. */ 1538 int cdx; /* Words to match. */ 1539 int bs; /* Shrink bytes. */ 1540 int off; /* Offset from old label for new code. */ 1541 int ncl; /* New code length. */ 1542 } rcode[] = 1543 {/* lab,cdx,bs,off,ncl */ 1544 { 0x0000, 0x0000, 0x3c00, 0x0000, 1, 0, 2, 2, 2}, /* jump */ 1545 { 0x0000, 0x2002, 0x2400, 0x0000, 1, 1, 4, 4, 2}, /* eq */ 1546 { 0x0000, 0x2402, 0x2000, 0x0000, 1, 1, 4, 4, 2}, /* ne */ 1547 { 0x0000, 0x3402, 0x3800, 0x0000, 1, 1, 4, 4, 2}, /* lt */ 1548 { 0x0000, 0x2c02, 0x2800, 0x0000, 1, 1, 4, 4, 2}, /* ltu */ 1549 { 0x0000, 0x3802, 0x3400, 0x0000, 1, 1, 4, 4, 2}, /* ge */ 1550 { 0x0000, 0x2802, 0x2c00, 0x0000, 1, 1, 4, 4, 2}, /* geu */ 1551 { 0x3001, 0x3c02, 0x3000, 0x0000, 1, 2, 6, 6, 2}, /* ltn */ 1552 { 0x2403, 0x3802, 0x2401, 0x3400, 2, 2, 4, 6, 4}, /* gt */ 1553 { 0x2403, 0x2802, 0x2401, 0x2c00, 2, 2, 4, 6, 4}, /* gtu */ 1554 { 0x2401, 0x2c02, 0x2400, 0x2800, 3, 2, 4, 6, 4}, /* leu , 2 labels */ 1555 { 0x2401, 0x2c02, 0x2400, 0x2800, 3, 2, 4, 6, 4}, /* le , 2 labels */ 1556 { 0, 0, 0, 0, 0, 0, 0, 0, 0} 1557 }; 1558 1559 /* Return TRUE if a symbol exists at the given address. */ 1560 1561 static bfd_boolean 1562 msp430_elf_symbol_address_p (bfd * abfd, 1563 asection * sec, 1564 Elf_Internal_Sym * isym, 1565 bfd_vma addr) 1566 { 1567 Elf_Internal_Shdr *symtab_hdr; 1568 unsigned int sec_shndx; 1569 Elf_Internal_Sym *isymend; 1570 struct elf_link_hash_entry **sym_hashes; 1571 struct elf_link_hash_entry **end_hashes; 1572 unsigned int symcount; 1573 1574 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 1575 1576 /* Examine all the local symbols. */ 1577 symtab_hdr = &elf_tdata (abfd)->symtab_hdr; 1578 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++) 1579 if (isym->st_shndx == sec_shndx && isym->st_value == addr) 1580 return TRUE; 1581 1582 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 1583 - symtab_hdr->sh_info); 1584 sym_hashes = elf_sym_hashes (abfd); 1585 end_hashes = sym_hashes + symcount; 1586 for (; sym_hashes < end_hashes; sym_hashes++) 1587 { 1588 struct elf_link_hash_entry *sym_hash = *sym_hashes; 1589 1590 if ((sym_hash->root.type == bfd_link_hash_defined 1591 || sym_hash->root.type == bfd_link_hash_defweak) 1592 && sym_hash->root.u.def.section == sec 1593 && sym_hash->root.u.def.value == addr) 1594 return TRUE; 1595 } 1596 1597 return FALSE; 1598 } 1599 1600 /* Adjust all local symbols defined as '.section + 0xXXXX' (.section has 1601 sec_shndx) referenced from current and other sections. */ 1602 1603 static bfd_boolean 1604 msp430_elf_relax_adjust_locals (bfd * abfd, asection * sec, bfd_vma addr, 1605 int count, unsigned int sec_shndx, 1606 bfd_vma toaddr) 1607 { 1608 Elf_Internal_Shdr *symtab_hdr; 1609 Elf_Internal_Rela *irel; 1610 Elf_Internal_Rela *irelend; 1611 Elf_Internal_Sym *isym; 1612 1613 irel = elf_section_data (sec)->relocs; 1614 if (irel == NULL) 1615 return TRUE; 1616 1617 irelend = irel + sec->reloc_count; 1618 symtab_hdr = & elf_tdata (abfd)->symtab_hdr; 1619 isym = (Elf_Internal_Sym *) symtab_hdr->contents; 1620 1621 for (;irel < irelend; irel++) 1622 { 1623 unsigned int sidx = ELF32_R_SYM(irel->r_info); 1624 Elf_Internal_Sym *lsym = isym + sidx; 1625 1626 /* Adjust symbols referenced by .sec+0xXX. */ 1627 if (irel->r_addend > addr && irel->r_addend < toaddr 1628 && sidx < symtab_hdr->sh_info 1629 && lsym->st_shndx == sec_shndx) 1630 irel->r_addend -= count; 1631 } 1632 1633 return TRUE; 1634 } 1635 1636 /* Delete some bytes from a section while relaxing. */ 1637 1638 static bfd_boolean 1639 msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr, 1640 int count) 1641 { 1642 Elf_Internal_Shdr *symtab_hdr; 1643 unsigned int sec_shndx; 1644 bfd_byte *contents; 1645 Elf_Internal_Rela *irel; 1646 Elf_Internal_Rela *irelend; 1647 bfd_vma toaddr; 1648 Elf_Internal_Sym *isym; 1649 Elf_Internal_Sym *isymend; 1650 struct elf_link_hash_entry **sym_hashes; 1651 struct elf_link_hash_entry **end_hashes; 1652 unsigned int symcount; 1653 asection *p; 1654 1655 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 1656 1657 contents = elf_section_data (sec)->this_hdr.contents; 1658 1659 toaddr = sec->size; 1660 1661 irel = elf_section_data (sec)->relocs; 1662 irelend = irel + sec->reloc_count; 1663 1664 /* Actually delete the bytes. */ 1665 memmove (contents + addr, contents + addr + count, 1666 (size_t) (toaddr - addr - count)); 1667 sec->size -= count; 1668 1669 /* Adjust all the relocs. */ 1670 symtab_hdr = & elf_tdata (abfd)->symtab_hdr; 1671 isym = (Elf_Internal_Sym *) symtab_hdr->contents; 1672 for (; irel < irelend; irel++) 1673 { 1674 /* Get the new reloc address. */ 1675 if ((irel->r_offset > addr && irel->r_offset < toaddr)) 1676 irel->r_offset -= count; 1677 } 1678 1679 for (p = abfd->sections; p != NULL; p = p->next) 1680 msp430_elf_relax_adjust_locals (abfd,p,addr,count,sec_shndx,toaddr); 1681 1682 /* Adjust the local symbols defined in this section. */ 1683 symtab_hdr = & elf_tdata (abfd)->symtab_hdr; 1684 isym = (Elf_Internal_Sym *) symtab_hdr->contents; 1685 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++) 1686 { 1687 const char * name; 1688 1689 name = bfd_elf_string_from_elf_section 1690 (abfd, symtab_hdr->sh_link, isym->st_name); 1691 name = (name == NULL || * name == 0) ? bfd_section_name (abfd, sec) : name; 1692 1693 if (isym->st_shndx != sec_shndx) 1694 continue; 1695 1696 if (isym->st_value > addr 1697 && (isym->st_value < toaddr 1698 /* We also adjust a symbol at the end of the section if its name is 1699 on the list below. These symbols are used for debug info 1700 generation and they refer to the end of the current section, not 1701 the start of the next section. */ 1702 || (isym->st_value == toaddr 1703 && name != NULL 1704 && (CONST_STRNEQ (name, ".Letext") 1705 || CONST_STRNEQ (name, ".LFE"))))) 1706 { 1707 if (isym->st_value < addr + count) 1708 isym->st_value = addr; 1709 else 1710 isym->st_value -= count; 1711 } 1712 /* Adjust the function symbol's size as well. */ 1713 else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC 1714 && isym->st_value + isym->st_size > addr 1715 && isym->st_value + isym->st_size < toaddr) 1716 isym->st_size -= count; 1717 } 1718 1719 /* Now adjust the global symbols defined in this section. */ 1720 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 1721 - symtab_hdr->sh_info); 1722 sym_hashes = elf_sym_hashes (abfd); 1723 end_hashes = sym_hashes + symcount; 1724 for (; sym_hashes < end_hashes; sym_hashes++) 1725 { 1726 struct elf_link_hash_entry *sym_hash = *sym_hashes; 1727 1728 if ((sym_hash->root.type == bfd_link_hash_defined 1729 || sym_hash->root.type == bfd_link_hash_defweak) 1730 && sym_hash->root.u.def.section == sec 1731 && sym_hash->root.u.def.value > addr 1732 && sym_hash->root.u.def.value < toaddr) 1733 { 1734 if (sym_hash->root.u.def.value < addr + count) 1735 sym_hash->root.u.def.value = addr; 1736 else 1737 sym_hash->root.u.def.value -= count; 1738 } 1739 /* Adjust the function symbol's size as well. */ 1740 else if (sym_hash->root.type == bfd_link_hash_defined 1741 && sym_hash->root.u.def.section == sec 1742 && sym_hash->type == STT_FUNC 1743 && sym_hash->root.u.def.value + sym_hash->size > addr 1744 && sym_hash->root.u.def.value + sym_hash->size < toaddr) 1745 sym_hash->size -= count; 1746 } 1747 1748 return TRUE; 1749 } 1750 1751 /* Insert two words into a section whilst relaxing. */ 1752 1753 static bfd_byte * 1754 msp430_elf_relax_add_two_words (bfd * abfd, asection * sec, bfd_vma addr, 1755 int word1, int word2) 1756 { 1757 Elf_Internal_Shdr *symtab_hdr; 1758 unsigned int sec_shndx; 1759 bfd_byte *contents; 1760 Elf_Internal_Rela *irel; 1761 Elf_Internal_Rela *irelend; 1762 Elf_Internal_Sym *isym; 1763 Elf_Internal_Sym *isymend; 1764 struct elf_link_hash_entry **sym_hashes; 1765 struct elf_link_hash_entry **end_hashes; 1766 unsigned int symcount; 1767 bfd_vma sec_end; 1768 asection *p; 1769 1770 contents = elf_section_data (sec)->this_hdr.contents; 1771 sec_end = sec->size; 1772 1773 /* Make space for the new words. */ 1774 contents = bfd_realloc (contents, sec_end + 4); 1775 memmove (contents + addr + 4, contents + addr, sec_end - addr); 1776 1777 /* Insert the new words. */ 1778 bfd_put_16 (abfd, word1, contents + addr); 1779 bfd_put_16 (abfd, word2, contents + addr + 2); 1780 1781 /* Update the section information. */ 1782 sec->size += 4; 1783 elf_section_data (sec)->this_hdr.contents = contents; 1784 1785 /* Adjust all the relocs. */ 1786 irel = elf_section_data (sec)->relocs; 1787 irelend = irel + sec->reloc_count; 1788 1789 for (; irel < irelend; irel++) 1790 if ((irel->r_offset >= addr && irel->r_offset < sec_end)) 1791 irel->r_offset += 4; 1792 1793 /* Adjust the local symbols defined in this section. */ 1794 sec_shndx = _bfd_elf_section_from_bfd_section (abfd, sec); 1795 for (p = abfd->sections; p != NULL; p = p->next) 1796 msp430_elf_relax_adjust_locals (abfd, p, addr, -4, 1797 sec_shndx, sec_end); 1798 1799 /* Adjust the global symbols affected by the move. */ 1800 symtab_hdr = & elf_tdata (abfd)->symtab_hdr; 1801 isym = (Elf_Internal_Sym *) symtab_hdr->contents; 1802 for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++) 1803 if (isym->st_shndx == sec_shndx 1804 && isym->st_value >= addr && isym->st_value < sec_end) 1805 isym->st_value += 4; 1806 1807 /* Now adjust the global symbols defined in this section. */ 1808 symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym) 1809 - symtab_hdr->sh_info); 1810 sym_hashes = elf_sym_hashes (abfd); 1811 end_hashes = sym_hashes + symcount; 1812 for (; sym_hashes < end_hashes; sym_hashes++) 1813 { 1814 struct elf_link_hash_entry *sym_hash = *sym_hashes; 1815 1816 if ((sym_hash->root.type == bfd_link_hash_defined 1817 || sym_hash->root.type == bfd_link_hash_defweak) 1818 && sym_hash->root.u.def.section == sec 1819 && sym_hash->root.u.def.value >= addr 1820 && sym_hash->root.u.def.value < sec_end) 1821 sym_hash->root.u.def.value += 4; 1822 } 1823 1824 return contents; 1825 } 1826 1827 static bfd_boolean 1828 msp430_elf_relax_section (bfd * abfd, asection * sec, 1829 struct bfd_link_info * link_info, 1830 bfd_boolean * again) 1831 { 1832 Elf_Internal_Shdr * symtab_hdr; 1833 Elf_Internal_Rela * internal_relocs; 1834 Elf_Internal_Rela * irel; 1835 Elf_Internal_Rela * irelend; 1836 bfd_byte * contents = NULL; 1837 Elf_Internal_Sym * isymbuf = NULL; 1838 1839 /* Assume nothing changes. */ 1840 *again = FALSE; 1841 1842 /* We don't have to do anything for a relocatable link, if 1843 this section does not have relocs, or if this is not a 1844 code section. */ 1845 if (bfd_link_relocatable (link_info) 1846 || (sec->flags & SEC_RELOC) == 0 1847 || sec->reloc_count == 0 || (sec->flags & SEC_CODE) == 0) 1848 return TRUE; 1849 1850 symtab_hdr = & elf_tdata (abfd)->symtab_hdr; 1851 1852 /* Get a copy of the native relocations. */ 1853 internal_relocs = 1854 _bfd_elf_link_read_relocs (abfd, sec, NULL, NULL, link_info->keep_memory); 1855 if (internal_relocs == NULL) 1856 goto error_return; 1857 1858 /* Walk through them looking for relaxing opportunities. */ 1859 irelend = internal_relocs + sec->reloc_count; 1860 1861 /* Do code size growing relocs first. */ 1862 for (irel = internal_relocs; irel < irelend; irel++) 1863 { 1864 bfd_vma symval; 1865 1866 /* If this isn't something that can be relaxed, then ignore 1867 this reloc. */ 1868 if (uses_msp430x_relocs (abfd) 1869 && ELF32_R_TYPE (irel->r_info) == (int) R_MSP430X_10_PCREL) 1870 ; 1871 else if (! uses_msp430x_relocs (abfd) 1872 && ELF32_R_TYPE (irel->r_info) == (int) R_MSP430_10_PCREL) 1873 ; 1874 else 1875 continue; 1876 1877 /* Get the section contents if we haven't done so already. */ 1878 if (contents == NULL) 1879 { 1880 /* Get cached copy if it exists. */ 1881 if (elf_section_data (sec)->this_hdr.contents != NULL) 1882 contents = elf_section_data (sec)->this_hdr.contents; 1883 else if (! bfd_malloc_and_get_section (abfd, sec, &contents)) 1884 goto error_return; 1885 } 1886 1887 /* Read this BFD's local symbols if we haven't done so already. */ 1888 if (isymbuf == NULL && symtab_hdr->sh_info != 0) 1889 { 1890 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 1891 if (isymbuf == NULL) 1892 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, 1893 symtab_hdr->sh_info, 0, 1894 NULL, NULL, NULL); 1895 if (isymbuf == NULL) 1896 goto error_return; 1897 } 1898 1899 /* Get the value of the symbol referred to by the reloc. */ 1900 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) 1901 { 1902 /* A local symbol. */ 1903 Elf_Internal_Sym *isym; 1904 asection *sym_sec; 1905 1906 isym = isymbuf + ELF32_R_SYM (irel->r_info); 1907 if (isym->st_shndx == SHN_UNDEF) 1908 sym_sec = bfd_und_section_ptr; 1909 else if (isym->st_shndx == SHN_ABS) 1910 sym_sec = bfd_abs_section_ptr; 1911 else if (isym->st_shndx == SHN_COMMON) 1912 sym_sec = bfd_com_section_ptr; 1913 else 1914 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); 1915 symval = (isym->st_value 1916 + sym_sec->output_section->vma + sym_sec->output_offset); 1917 } 1918 else 1919 { 1920 unsigned long indx; 1921 struct elf_link_hash_entry *h; 1922 1923 /* An external symbol. */ 1924 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; 1925 h = elf_sym_hashes (abfd)[indx]; 1926 BFD_ASSERT (h != NULL); 1927 1928 if (h->root.type != bfd_link_hash_defined 1929 && h->root.type != bfd_link_hash_defweak) 1930 /* This appears to be a reference to an undefined 1931 symbol. Just ignore it--it will be caught by the 1932 regular reloc processing. */ 1933 continue; 1934 1935 symval = (h->root.u.def.value 1936 + h->root.u.def.section->output_section->vma 1937 + h->root.u.def.section->output_offset); 1938 } 1939 1940 /* For simplicity of coding, we are going to modify the section 1941 contents, the section relocs, and the BFD symbol table. We 1942 must tell the rest of the code not to free up this 1943 information. It would be possible to instead create a table 1944 of changes which have to be made, as is done in coff-mips.c; 1945 that would be more work, but would require less memory when 1946 the linker is run. */ 1947 1948 bfd_signed_vma value = symval; 1949 int opcode; 1950 1951 /* Compute the value that will be relocated. */ 1952 value += irel->r_addend; 1953 /* Convert to PC relative. */ 1954 value -= (sec->output_section->vma + sec->output_offset); 1955 value -= irel->r_offset; 1956 value -= 2; 1957 /* Scale. */ 1958 value >>= 1; 1959 1960 /* If it is in range then no modifications are needed. */ 1961 if (value >= -512 && value <= 511) 1962 continue; 1963 1964 /* Get the opcode. */ 1965 opcode = bfd_get_16 (abfd, contents + irel->r_offset); 1966 1967 /* Compute the new opcode. We are going to convert: 1968 J<cond> label 1969 into: 1970 J<inv-cond> 1f 1971 BR[A] #label 1972 1: */ 1973 switch (opcode & 0xfc00) 1974 { 1975 case 0x3800: opcode = 0x3402; break; /* Jl -> Jge +2 */ 1976 case 0x3400: opcode = 0x3802; break; /* Jge -> Jl +2 */ 1977 case 0x2c00: opcode = 0x2802; break; /* Jhs -> Jlo +2 */ 1978 case 0x2800: opcode = 0x2c02; break; /* Jlo -> Jhs +2 */ 1979 case 0x2400: opcode = 0x2002; break; /* Jeq -> Jne +2 */ 1980 case 0x2000: opcode = 0x2402; break; /* jne -> Jeq +2 */ 1981 case 0x3000: /* jn */ 1982 /* There is no direct inverse of the Jn insn. 1983 FIXME: we could do this as: 1984 Jn 1f 1985 br 2f 1986 1: br label 1987 2: */ 1988 continue; 1989 default: 1990 /* Not a conditional branch instruction. */ 1991 /* fprintf (stderr, "unrecog: %x\n", opcode); */ 1992 continue; 1993 } 1994 1995 /* Note that we've changed the relocs, section contents, etc. */ 1996 elf_section_data (sec)->relocs = internal_relocs; 1997 elf_section_data (sec)->this_hdr.contents = contents; 1998 symtab_hdr->contents = (unsigned char *) isymbuf; 1999 2000 /* Install the new opcode. */ 2001 bfd_put_16 (abfd, opcode, contents + irel->r_offset); 2002 2003 /* Insert the new branch instruction. */ 2004 if (uses_msp430x_relocs (abfd)) 2005 { 2006 /* Insert an absolute branch (aka MOVA) instruction. */ 2007 contents = msp430_elf_relax_add_two_words 2008 (abfd, sec, irel->r_offset + 2, 0x0080, 0x0000); 2009 2010 /* Update the relocation to point to the inserted branch 2011 instruction. Note - we are changing a PC-relative reloc 2012 into an absolute reloc, but this is OK because we have 2013 arranged with the assembler to have the reloc's value be 2014 a (local) symbol, not a section+offset value. */ 2015 irel->r_offset += 2; 2016 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 2017 R_MSP430X_ABS20_ADR_SRC); 2018 } 2019 else 2020 { 2021 contents = msp430_elf_relax_add_two_words 2022 (abfd, sec, irel->r_offset + 2, 0x4030, 0x0000); 2023 2024 /* See comment above about converting a 10-bit PC-rel 2025 relocation into a 16-bit absolute relocation. */ 2026 irel->r_offset += 4; 2027 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 2028 R_MSP430_16); 2029 } 2030 2031 /* Growing the section may mean that other 2032 conditional branches need to be fixed. */ 2033 *again = TRUE; 2034 } 2035 2036 for (irel = internal_relocs; irel < irelend; irel++) 2037 { 2038 bfd_vma symval; 2039 2040 /* Get the section contents if we haven't done so already. */ 2041 if (contents == NULL) 2042 { 2043 /* Get cached copy if it exists. */ 2044 if (elf_section_data (sec)->this_hdr.contents != NULL) 2045 contents = elf_section_data (sec)->this_hdr.contents; 2046 else if (! bfd_malloc_and_get_section (abfd, sec, &contents)) 2047 goto error_return; 2048 } 2049 2050 /* Read this BFD's local symbols if we haven't done so already. */ 2051 if (isymbuf == NULL && symtab_hdr->sh_info != 0) 2052 { 2053 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; 2054 if (isymbuf == NULL) 2055 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr, 2056 symtab_hdr->sh_info, 0, 2057 NULL, NULL, NULL); 2058 if (isymbuf == NULL) 2059 goto error_return; 2060 } 2061 2062 /* Get the value of the symbol referred to by the reloc. */ 2063 if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info) 2064 { 2065 /* A local symbol. */ 2066 Elf_Internal_Sym *isym; 2067 asection *sym_sec; 2068 2069 isym = isymbuf + ELF32_R_SYM (irel->r_info); 2070 if (isym->st_shndx == SHN_UNDEF) 2071 sym_sec = bfd_und_section_ptr; 2072 else if (isym->st_shndx == SHN_ABS) 2073 sym_sec = bfd_abs_section_ptr; 2074 else if (isym->st_shndx == SHN_COMMON) 2075 sym_sec = bfd_com_section_ptr; 2076 else 2077 sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx); 2078 symval = (isym->st_value 2079 + sym_sec->output_section->vma + sym_sec->output_offset); 2080 } 2081 else 2082 { 2083 unsigned long indx; 2084 struct elf_link_hash_entry *h; 2085 2086 /* An external symbol. */ 2087 indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info; 2088 h = elf_sym_hashes (abfd)[indx]; 2089 BFD_ASSERT (h != NULL); 2090 2091 if (h->root.type != bfd_link_hash_defined 2092 && h->root.type != bfd_link_hash_defweak) 2093 /* This appears to be a reference to an undefined 2094 symbol. Just ignore it--it will be caught by the 2095 regular reloc processing. */ 2096 continue; 2097 2098 symval = (h->root.u.def.value 2099 + h->root.u.def.section->output_section->vma 2100 + h->root.u.def.section->output_offset); 2101 } 2102 2103 /* For simplicity of coding, we are going to modify the section 2104 contents, the section relocs, and the BFD symbol table. We 2105 must tell the rest of the code not to free up this 2106 information. It would be possible to instead create a table 2107 of changes which have to be made, as is done in coff-mips.c; 2108 that would be more work, but would require less memory when 2109 the linker is run. */ 2110 2111 /* Try to turn a 16bit pc-relative branch into a 10bit pc-relative 2112 branch. */ 2113 /* Paranoia? paranoia... */ 2114 if (! uses_msp430x_relocs (abfd) 2115 && ELF32_R_TYPE (irel->r_info) == (int) R_MSP430_RL_PCREL) 2116 { 2117 bfd_vma value = symval; 2118 2119 /* Deal with pc-relative gunk. */ 2120 value -= (sec->output_section->vma + sec->output_offset); 2121 value -= irel->r_offset; 2122 value += irel->r_addend; 2123 2124 /* See if the value will fit in 10 bits, note the high value is 2125 1016 as the target will be two bytes closer if we are 2126 able to relax. */ 2127 if ((long) value < 1016 && (long) value > -1016) 2128 { 2129 int code0 = 0, code1 = 0, code2 = 0; 2130 int i; 2131 struct rcodes_s *rx; 2132 2133 /* Get the opcode. */ 2134 if (irel->r_offset >= 6) 2135 code0 = bfd_get_16 (abfd, contents + irel->r_offset - 6); 2136 2137 if (irel->r_offset >= 4) 2138 code1 = bfd_get_16 (abfd, contents + irel->r_offset - 4); 2139 2140 code2 = bfd_get_16 (abfd, contents + irel->r_offset - 2); 2141 2142 if (code2 != 0x4010) 2143 continue; 2144 2145 /* Check r4 and r3. */ 2146 for (i = NUMB_RELAX_CODES - 1; i >= 0; i--) 2147 { 2148 rx = &rcode[i]; 2149 if (rx->cdx == 2 && rx->f0 == code0 && rx->f1 == code1) 2150 break; 2151 else if (rx->cdx == 1 && rx->f1 == code1) 2152 break; 2153 else if (rx->cdx == 0) /* This is an unconditional jump. */ 2154 break; 2155 } 2156 2157 /* Check labels: 2158 .Label0: ; we do not care about this label 2159 jeq +6 2160 .Label1: ; make sure there is no label here 2161 jl +4 2162 .Label2: ; make sure there is no label here 2163 br .Label_dst 2164 2165 So, if there is .Label1 or .Label2 we cannot relax this code. 2166 This actually should not happen, cause for relaxable 2167 instructions we use RL_PCREL reloc instead of 16_PCREL. 2168 Will change this in the future. */ 2169 2170 if (rx->cdx > 0 2171 && msp430_elf_symbol_address_p (abfd, sec, isymbuf, 2172 irel->r_offset - 2)) 2173 continue; 2174 if (rx->cdx > 1 2175 && msp430_elf_symbol_address_p (abfd, sec, isymbuf, 2176 irel->r_offset - 4)) 2177 continue; 2178 2179 /* Note that we've changed the relocs, section contents, etc. */ 2180 elf_section_data (sec)->relocs = internal_relocs; 2181 elf_section_data (sec)->this_hdr.contents = contents; 2182 symtab_hdr->contents = (unsigned char *) isymbuf; 2183 2184 /* Fix the relocation's type. */ 2185 if (uses_msp430x_relocs (abfd)) 2186 { 2187 if (rx->labels == 3) /* Handle special cases. */ 2188 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 2189 R_MSP430X_2X_PCREL); 2190 else 2191 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 2192 R_MSP430X_10_PCREL); 2193 } 2194 else 2195 { 2196 if (rx->labels == 3) /* Handle special cases. */ 2197 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 2198 R_MSP430_2X_PCREL); 2199 else 2200 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 2201 R_MSP430_10_PCREL); 2202 } 2203 2204 /* Fix the opcode right way. */ 2205 bfd_put_16 (abfd, rx->t0, contents + irel->r_offset - rx->off); 2206 if (rx->t1) 2207 bfd_put_16 (abfd, rx->t1, 2208 contents + irel->r_offset - rx->off + 2); 2209 2210 /* Delete bytes. */ 2211 if (!msp430_elf_relax_delete_bytes (abfd, sec, 2212 irel->r_offset - rx->off + 2213 rx->ncl, rx->bs)) 2214 goto error_return; 2215 2216 /* Handle unconditional jumps. */ 2217 if (rx->cdx == 0) 2218 irel->r_offset -= 2; 2219 2220 /* That will change things, so, we should relax again. 2221 Note that this is not required, and it may be slow. */ 2222 *again = TRUE; 2223 } 2224 } 2225 2226 /* Try to turn a 16-bit absolute branch into a 10-bit pc-relative 2227 branch. */ 2228 if (uses_msp430x_relocs (abfd) 2229 && ELF32_R_TYPE (irel->r_info) == R_MSP430X_ABS16) 2230 { 2231 bfd_vma value = symval; 2232 2233 value -= (sec->output_section->vma + sec->output_offset); 2234 value -= irel->r_offset; 2235 value += irel->r_addend; 2236 2237 /* See if the value will fit in 10 bits, note the high value is 2238 1016 as the target will be two bytes closer if we are 2239 able to relax. */ 2240 if ((long) value < 1016 && (long) value > -1016) 2241 { 2242 int code2; 2243 2244 /* Get the opcode. */ 2245 code2 = bfd_get_16 (abfd, contents + irel->r_offset - 2); 2246 if (code2 != 0x4030) 2247 continue; 2248 /* FIXME: check r4 and r3 ? */ 2249 /* FIXME: Handle 0x4010 as well ? */ 2250 2251 /* Note that we've changed the relocs, section contents, etc. */ 2252 elf_section_data (sec)->relocs = internal_relocs; 2253 elf_section_data (sec)->this_hdr.contents = contents; 2254 symtab_hdr->contents = (unsigned char *) isymbuf; 2255 2256 /* Fix the relocation's type. */ 2257 if (uses_msp430x_relocs (abfd)) 2258 { 2259 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 2260 R_MSP430X_10_PCREL); 2261 } 2262 else 2263 { 2264 irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info), 2265 R_MSP430_10_PCREL); 2266 } 2267 2268 /* Fix the opcode right way. */ 2269 bfd_put_16 (abfd, 0x3c00, contents + irel->r_offset - 2); 2270 irel->r_offset -= 2; 2271 2272 /* Delete bytes. */ 2273 if (!msp430_elf_relax_delete_bytes (abfd, sec, 2274 irel->r_offset + 2, 2)) 2275 goto error_return; 2276 2277 /* That will change things, so, we should relax again. 2278 Note that this is not required, and it may be slow. */ 2279 *again = TRUE; 2280 } 2281 } 2282 } 2283 2284 if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf) 2285 { 2286 if (!link_info->keep_memory) 2287 free (isymbuf); 2288 else 2289 { 2290 /* Cache the symbols for elf_link_input_bfd. */ 2291 symtab_hdr->contents = (unsigned char *) isymbuf; 2292 } 2293 } 2294 2295 if (contents != NULL 2296 && elf_section_data (sec)->this_hdr.contents != contents) 2297 { 2298 if (!link_info->keep_memory) 2299 free (contents); 2300 else 2301 { 2302 /* Cache the section contents for elf_link_input_bfd. */ 2303 elf_section_data (sec)->this_hdr.contents = contents; 2304 } 2305 } 2306 2307 if (internal_relocs != NULL 2308 && elf_section_data (sec)->relocs != internal_relocs) 2309 free (internal_relocs); 2310 2311 return TRUE; 2312 2313 error_return: 2314 if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf) 2315 free (isymbuf); 2316 if (contents != NULL 2317 && elf_section_data (sec)->this_hdr.contents != contents) 2318 free (contents); 2319 if (internal_relocs != NULL 2320 && elf_section_data (sec)->relocs != internal_relocs) 2321 free (internal_relocs); 2322 2323 return FALSE; 2324 } 2325 2326 /* Handle an MSP430 specific section when reading an object file. 2327 This is called when bfd_section_from_shdr finds a section with 2328 an unknown type. */ 2329 2330 static bfd_boolean 2331 elf32_msp430_section_from_shdr (bfd *abfd, 2332 Elf_Internal_Shdr * hdr, 2333 const char *name, 2334 int shindex) 2335 { 2336 switch (hdr->sh_type) 2337 { 2338 case SHT_MSP430_SEC_FLAGS: 2339 case SHT_MSP430_SYM_ALIASES: 2340 case SHT_MSP430_ATTRIBUTES: 2341 return _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex); 2342 default: 2343 return FALSE; 2344 } 2345 } 2346 2347 static bfd_boolean 2348 elf32_msp430_obj_attrs_handle_unknown (bfd *abfd, int tag) 2349 { 2350 _bfd_error_handler 2351 (_("Warning: %B: Unknown MSPABI object attribute %d"), 2352 abfd, tag); 2353 return TRUE; 2354 } 2355 2356 /* Determine whether an object attribute tag takes an integer, a 2357 string or both. */ 2358 2359 static int 2360 elf32_msp430_obj_attrs_arg_type (int tag) 2361 { 2362 if (tag == Tag_compatibility) 2363 return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL; 2364 2365 if (tag < 32) 2366 return ATTR_TYPE_FLAG_INT_VAL; 2367 2368 return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL; 2369 } 2370 2371 static inline const char * 2372 isa_type (int isa) 2373 { 2374 switch (isa) 2375 { 2376 case 1: return "MSP430"; 2377 case 2: return "MSP430X"; 2378 default: return "unknown"; 2379 } 2380 } 2381 2382 static inline const char * 2383 code_model (int model) 2384 { 2385 switch (model) 2386 { 2387 case 1: return "small"; 2388 case 2: return "large"; 2389 default: return "unknown"; 2390 } 2391 } 2392 2393 static inline const char * 2394 data_model (int model) 2395 { 2396 switch (model) 2397 { 2398 case 1: return "small"; 2399 case 2: return "large"; 2400 case 3: return "restricted large"; 2401 default: return "unknown"; 2402 } 2403 } 2404 2405 /* Merge MSPABI object attributes from IBFD into OBFD. 2406 Raise an error if there are conflicting attributes. */ 2407 2408 static bfd_boolean 2409 elf32_msp430_merge_mspabi_attributes (bfd *ibfd, bfd *obfd) 2410 { 2411 obj_attribute *in_attr; 2412 obj_attribute *out_attr; 2413 bfd_boolean result = TRUE; 2414 static bfd * first_input_bfd = NULL; 2415 2416 /* Skip linker created files. */ 2417 if (ibfd->flags & BFD_LINKER_CREATED) 2418 return TRUE; 2419 2420 /* If this is the first real object just copy the attributes. */ 2421 if (!elf_known_obj_attributes_proc (obfd)[0].i) 2422 { 2423 _bfd_elf_copy_obj_attributes (ibfd, obfd); 2424 2425 out_attr = elf_known_obj_attributes_proc (obfd); 2426 2427 /* Use the Tag_null value to indicate that 2428 the attributes have been initialized. */ 2429 out_attr[0].i = 1; 2430 2431 first_input_bfd = ibfd; 2432 return TRUE; 2433 } 2434 2435 in_attr = elf_known_obj_attributes_proc (ibfd); 2436 out_attr = elf_known_obj_attributes_proc (obfd); 2437 2438 /* The ISAs must be the same. */ 2439 if (in_attr[OFBA_MSPABI_Tag_ISA].i != out_attr[OFBA_MSPABI_Tag_ISA].i) 2440 { 2441 _bfd_error_handler 2442 (_("error: %B uses %s instructions but %B uses %s"), 2443 ibfd, first_input_bfd, 2444 isa_type (in_attr[OFBA_MSPABI_Tag_ISA].i), 2445 isa_type (out_attr[OFBA_MSPABI_Tag_ISA].i)); 2446 result = FALSE; 2447 } 2448 2449 /* The code models must be the same. */ 2450 if (in_attr[OFBA_MSPABI_Tag_Code_Model].i != 2451 out_attr[OFBA_MSPABI_Tag_Code_Model].i) 2452 { 2453 _bfd_error_handler 2454 (_("error: %B uses the %s code model whereas %B uses the %s code model"), 2455 ibfd, first_input_bfd, 2456 code_model (in_attr[OFBA_MSPABI_Tag_Code_Model].i), 2457 code_model (out_attr[OFBA_MSPABI_Tag_Code_Model].i)); 2458 result = FALSE; 2459 } 2460 2461 /* The large code model is only supported by the MSP430X. */ 2462 if (in_attr[OFBA_MSPABI_Tag_Code_Model].i == 2 2463 && out_attr[OFBA_MSPABI_Tag_ISA].i != 2) 2464 { 2465 _bfd_error_handler 2466 (_("error: %B uses the large code model but %B uses MSP430 instructions"), 2467 ibfd, first_input_bfd); 2468 result = FALSE; 2469 } 2470 2471 /* The data models must be the same. */ 2472 if (in_attr[OFBA_MSPABI_Tag_Data_Model].i != 2473 out_attr[OFBA_MSPABI_Tag_Data_Model].i) 2474 { 2475 _bfd_error_handler 2476 (_("error: %B uses the %s data model whereas %B uses the %s data model"), 2477 ibfd, first_input_bfd, 2478 data_model (in_attr[OFBA_MSPABI_Tag_Data_Model].i), 2479 data_model (out_attr[OFBA_MSPABI_Tag_Data_Model].i)); 2480 result = FALSE; 2481 } 2482 2483 /* The small code model requires the use of the small data model. */ 2484 if (in_attr[OFBA_MSPABI_Tag_Code_Model].i == 1 2485 && out_attr[OFBA_MSPABI_Tag_Data_Model].i != 1) 2486 { 2487 _bfd_error_handler 2488 (_("error: %B uses the small code model but %B uses the %s data model"), 2489 ibfd, first_input_bfd, 2490 data_model (out_attr[OFBA_MSPABI_Tag_Data_Model].i)); 2491 result = FALSE; 2492 } 2493 2494 /* The large data models are only supported by the MSP430X. */ 2495 if (in_attr[OFBA_MSPABI_Tag_Data_Model].i > 1 2496 && out_attr[OFBA_MSPABI_Tag_ISA].i != 2) 2497 { 2498 _bfd_error_handler 2499 (_("error: %B uses the %s data model but %B only uses MSP430 instructions"), 2500 ibfd, first_input_bfd, 2501 data_model (in_attr[OFBA_MSPABI_Tag_Data_Model].i)); 2502 result = FALSE; 2503 } 2504 2505 return result; 2506 } 2507 2508 /* Merge backend specific data from an object file to the output 2509 object file when linking. */ 2510 2511 static bfd_boolean 2512 elf32_msp430_merge_private_bfd_data (bfd * ibfd, bfd * obfd) 2513 { 2514 /* Make sure that the machine number reflects the most 2515 advanced version of the MSP architecture required. */ 2516 #define max(a,b) ((a) > (b) ? (a) : (b)) 2517 if (bfd_get_mach (ibfd) != bfd_get_mach (obfd)) 2518 bfd_default_set_arch_mach (obfd, bfd_get_arch (obfd), 2519 max (bfd_get_mach (ibfd), bfd_get_mach (obfd))); 2520 #undef max 2521 2522 return elf32_msp430_merge_mspabi_attributes (ibfd, obfd); 2523 } 2524 2525 static bfd_boolean 2526 msp430_elf_is_target_special_symbol (bfd *abfd, asymbol *sym) 2527 { 2528 return _bfd_elf_is_local_label_name (abfd, sym->name); 2529 } 2530 2531 static bfd_boolean 2532 uses_large_model (bfd *abfd) 2533 { 2534 obj_attribute * attr; 2535 2536 if (abfd->flags & BFD_LINKER_CREATED) 2537 return FALSE; 2538 2539 attr = elf_known_obj_attributes_proc (abfd); 2540 if (attr == NULL) 2541 return FALSE; 2542 2543 return attr[OFBA_MSPABI_Tag_Code_Model].i == 2; 2544 } 2545 2546 static unsigned int 2547 elf32_msp430_eh_frame_address_size (bfd *abfd, asection *sec ATTRIBUTE_UNUSED) 2548 { 2549 return uses_large_model (abfd) ? 4 : 2; 2550 } 2551 2552 /* This is gross. The MSP430 EABI says that (sec 11.5): 2553 2554 "An implementation may choose to use Rel or Rela 2555 type relocations for other relocations." 2556 2557 But it also says that: 2558 2559 "Certain relocations are identified as Rela only. [snip] 2560 Where Rela is specified, an implementation must honor 2561 this requirement." 2562 2563 There is one relocation marked as requiring RELA - R_MSP430_ABS_HI16 - but 2564 to keep things simple we choose to use RELA relocations throughout. The 2565 problem is that the TI compiler generates REL relocations, so we have to 2566 be able to accept those as well. */ 2567 2568 #define elf_backend_may_use_rel_p 1 2569 #define elf_backend_may_use_rela_p 1 2570 #define elf_backend_default_use_rela_p 1 2571 2572 #undef elf_backend_obj_attrs_vendor 2573 #define elf_backend_obj_attrs_vendor "mspabi" 2574 #undef elf_backend_obj_attrs_section 2575 #define elf_backend_obj_attrs_section ".MSP430.attributes" 2576 #undef elf_backend_obj_attrs_section_type 2577 #define elf_backend_obj_attrs_section_type SHT_MSP430_ATTRIBUTES 2578 #define elf_backend_section_from_shdr elf32_msp430_section_from_shdr 2579 #define elf_backend_obj_attrs_handle_unknown elf32_msp430_obj_attrs_handle_unknown 2580 #undef elf_backend_obj_attrs_arg_type 2581 #define elf_backend_obj_attrs_arg_type elf32_msp430_obj_attrs_arg_type 2582 #define bfd_elf32_bfd_merge_private_bfd_data elf32_msp430_merge_private_bfd_data 2583 #define elf_backend_eh_frame_address_size elf32_msp430_eh_frame_address_size 2584 2585 #define ELF_ARCH bfd_arch_msp430 2586 #define ELF_MACHINE_CODE EM_MSP430 2587 #define ELF_MACHINE_ALT1 EM_MSP430_OLD 2588 #define ELF_MAXPAGESIZE 4 2589 #define ELF_OSABI ELFOSABI_STANDALONE 2590 2591 #define TARGET_LITTLE_SYM msp430_elf32_vec 2592 #define TARGET_LITTLE_NAME "elf32-msp430" 2593 2594 #define elf_info_to_howto msp430_info_to_howto_rela 2595 #define elf_info_to_howto_rel NULL 2596 #define elf_backend_relocate_section elf32_msp430_relocate_section 2597 #define elf_backend_check_relocs elf32_msp430_check_relocs 2598 #define elf_backend_can_gc_sections 1 2599 #define elf_backend_final_write_processing bfd_elf_msp430_final_write_processing 2600 #define elf_backend_object_p elf32_msp430_object_p 2601 #define bfd_elf32_bfd_relax_section msp430_elf_relax_section 2602 #define bfd_elf32_bfd_is_target_special_symbol msp430_elf_is_target_special_symbol 2603 2604 #undef elf32_bed 2605 #define elf32_bed elf32_msp430_bed 2606 2607 #include "elf32-target.h" 2608 2609 /* The TI compiler sets the OSABI field to ELFOSABI_NONE. */ 2610 #undef TARGET_LITTLE_SYM 2611 #define TARGET_LITTLE_SYM msp430_elf32_ti_vec 2612 2613 #undef elf32_bed 2614 #define elf32_bed elf32_msp430_ti_bed 2615 2616 #undef ELF_OSABI 2617 #define ELF_OSABI ELFOSABI_NONE 2618 2619 static const struct bfd_elf_special_section msp430_ti_elf_special_sections[] = 2620 { 2621 /* prefix, prefix_length, suffix_len, type, attributes. */ 2622 { STRING_COMMA_LEN (".TI.symbol.alias"), 0, SHT_MSP430_SYM_ALIASES, 0 }, 2623 { STRING_COMMA_LEN (".TI.section.flags"), 0, SHT_MSP430_SEC_FLAGS, 0 }, 2624 { STRING_COMMA_LEN ("_TI_build_attrib"), 0, SHT_MSP430_ATTRIBUTES, 0 }, 2625 { NULL, 0, 0, 0, 0 } 2626 }; 2627 2628 #undef elf_backend_special_sections 2629 #define elf_backend_special_sections msp430_ti_elf_special_sections 2630 2631 #include "elf32-target.h" 2632