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