source: trunk/src/binutils/bfd/coff-tic80.c@ 610

Last change on this file since 610 was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 20.5 KB
Line 
1/* BFD back-end for Texas Instruments TMS320C80 Multimedia Video Processor (MVP).
2 Copyright 1996, 1997, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3
4 Written by Fred Fish (fnf@cygnus.com)
5
6 There is nothing new under the sun. This file draws a lot on other
7 coff files.
8
9This file is part of BFD, the Binary File Descriptor library.
10
11This program is free software; you can redistribute it and/or modify
12it under the terms of the GNU General Public License as published by
13the Free Software Foundation; either version 2 of the License, or
14(at your option) any later version.
15
16This program is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19GNU General Public License for more details.
20
21You should have received a copy of the GNU General Public License
22along with this program; if not, write to the Free Software
23Foundation, 59 Temple Place - Suite 330,
24Boston, MA 02111-1307, USA. */
25
26#include "bfd.h"
27#include "bfdlink.h"
28#include "sysdep.h"
29#include "libbfd.h"
30#include "coff/tic80.h"
31#include "coff/internal.h"
32#include "libcoff.h"
33
34#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
35#define COFF_ALIGN_IN_SECTION_HEADER 1
36#define COFF_ALIGN_IN_SFLAGS 1
37
38#define GET_SCNHDR_FLAGS H_GET_16
39#define PUT_SCNHDR_FLAGS H_PUT_16
40
41static void rtype2howto
42 PARAMS ((arelent *cache_ptr, struct internal_reloc *dst));
43static bfd_reloc_status_type ppbase_reloc
44 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
45static bfd_reloc_status_type glob15_reloc
46 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
47static bfd_reloc_status_type glob16_reloc
48 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
49static bfd_reloc_status_type local16_reloc
50 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
51static bfd_boolean coff_tic80_relocate_section
52 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
53 struct internal_reloc *, struct internal_syment *, asection **));
54static reloc_howto_type * coff_tic80_rtype_to_howto
55 PARAMS ((bfd *, asection *, struct internal_reloc *,
56 struct coff_link_hash_entry *, struct internal_syment *,
57 bfd_vma *));
58
59static reloc_howto_type tic80_howto_table[] =
60{
61
62 HOWTO (R_RELLONG, /* type */
63 0, /* rightshift */
64 2, /* size (0 = byte, 1 = short, 2 = long) */
65 32, /* bitsize */
66 FALSE, /* pc_relative */
67 0, /* bitpos */
68 complain_overflow_bitfield, /* complain_on_overflow */
69 NULL, /* special_function */
70 "RELLONG", /* name */
71 TRUE, /* partial_inplace */
72 0xffffffff, /* src_mask */
73 0xffffffff, /* dst_mask */
74 FALSE), /* pcrel_offset */
75
76 HOWTO (R_MPPCR, /* type */
77 2, /* rightshift */
78 2, /* size (0 = byte, 1 = short, 2 = long) */
79 32, /* bitsize */
80 TRUE, /* pc_relative */
81 0, /* bitpos */
82 complain_overflow_signed, /* complain_on_overflow */
83 NULL, /* special_function */
84 "MPPCR", /* name */
85 TRUE, /* partial_inplace */
86 0xffffffff, /* src_mask */
87 0xffffffff, /* dst_mask */
88 TRUE), /* pcrel_offset */
89
90 HOWTO (R_ABS, /* type */
91 0, /* rightshift */
92 2, /* size (0 = byte, 1 = short, 2 = long) */
93 32, /* bitsize */
94 FALSE, /* pc_relative */
95 0, /* bitpos */
96 complain_overflow_bitfield, /* complain_on_overflow */
97 NULL, /* special_function */
98 "ABS", /* name */
99 TRUE, /* partial_inplace */
100 0xffffffff, /* src_mask */
101 0xffffffff, /* dst_mask */
102 FALSE), /* pcrel_offset */
103
104 HOWTO (R_PPBASE, /* type */
105 0, /* rightshift */
106 2, /* size (0 = byte, 1 = short, 2 = long) */
107 32, /* bitsize */
108 FALSE, /* pc_relative */
109 0, /* bitpos */
110 complain_overflow_dont, /* complain_on_overflow */
111 ppbase_reloc, /* special_function */
112 "PPBASE", /* name */
113 TRUE, /* partial_inplace */
114 0xffffffff, /* src_mask */
115 0xffffffff, /* dst_mask */
116 FALSE), /* pcrel_offset */
117
118 HOWTO (R_PPLBASE, /* type */
119 0, /* rightshift */
120 2, /* size (0 = byte, 1 = short, 2 = long) */
121 32, /* bitsize */
122 FALSE, /* pc_relative */
123 0, /* bitpos */
124 complain_overflow_dont, /* complain_on_overflow */
125 ppbase_reloc, /* special_function */
126 "PPLBASE", /* name */
127 TRUE, /* partial_inplace */
128 0xffffffff, /* src_mask */
129 0xffffffff, /* dst_mask */
130 FALSE), /* pcrel_offset */
131
132 HOWTO (R_PP15, /* type */
133 0, /* rightshift */
134 2, /* size (0 = byte, 1 = short, 2 = long) */
135 15, /* bitsize */
136 FALSE, /* pc_relative */
137 6, /* bitpos */
138 complain_overflow_dont, /* complain_on_overflow */
139 glob15_reloc, /* special_function */
140 "PP15", /* name */
141 TRUE, /* partial_inplace */
142 0x1ffc0, /* src_mask */
143 0x1ffc0, /* dst_mask */
144 FALSE), /* pcrel_offset */
145
146 HOWTO (R_PP15W, /* type */
147 2, /* rightshift */
148 2, /* size (0 = byte, 1 = short, 2 = long) */
149 15, /* bitsize */
150 FALSE, /* pc_relative */
151 6, /* bitpos */
152 complain_overflow_dont, /* complain_on_overflow */
153 glob15_reloc, /* special_function */
154 "PP15W", /* name */
155 TRUE, /* partial_inplace */
156 0x1ffc0, /* src_mask */
157 0x1ffc0, /* dst_mask */
158 FALSE), /* pcrel_offset */
159
160 HOWTO (R_PP15H, /* type */
161 1, /* rightshift */
162 2, /* size (0 = byte, 1 = short, 2 = long) */
163 15, /* bitsize */
164 FALSE, /* pc_relative */
165 6, /* bitpos */
166 complain_overflow_dont, /* complain_on_overflow */
167 glob15_reloc, /* special_function */
168 "PP15H", /* name */
169 TRUE, /* partial_inplace */
170 0x1ffc0, /* src_mask */
171 0x1ffc0, /* dst_mask */
172 FALSE), /* pcrel_offset */
173
174 HOWTO (R_PP16B, /* type */
175 0, /* rightshift */
176 2, /* size (0 = byte, 1 = short, 2 = long) */
177 16, /* bitsize */
178 FALSE, /* pc_relative */
179 6, /* bitpos */
180 complain_overflow_dont, /* complain_on_overflow */
181 glob16_reloc, /* special_function */
182 "PP16B", /* name */
183 TRUE, /* partial_inplace */
184 0x3ffc0, /* src_mask */
185 0x3ffc0, /* dst_mask */
186 FALSE), /* pcrel_offset */
187
188 HOWTO (R_PPL15, /* type */
189 0, /* rightshift */
190 2, /* size (0 = byte, 1 = short, 2 = long) */
191 15, /* bitsize */
192 FALSE, /* pc_relative */
193 0, /* bitpos */
194 complain_overflow_dont, /* complain_on_overflow */
195 NULL, /* special_function */
196 "PPL15", /* name */
197 TRUE, /* partial_inplace */
198 0x7fff, /* src_mask */
199 0x7fff, /* dst_mask */
200 FALSE), /* pcrel_offset */
201
202 HOWTO (R_PPL15W, /* type */
203 2, /* rightshift */
204 2, /* size (0 = byte, 1 = short, 2 = long) */
205 15, /* bitsize */
206 FALSE, /* pc_relative */
207 0, /* bitpos */
208 complain_overflow_dont, /* complain_on_overflow */
209 NULL, /* special_function */
210 "PPL15W", /* name */
211 TRUE, /* partial_inplace */
212 0x7fff, /* src_mask */
213 0x7fff, /* dst_mask */
214 FALSE), /* pcrel_offset */
215
216 HOWTO (R_PPL15H, /* type */
217 1, /* rightshift */
218 2, /* size (0 = byte, 1 = short, 2 = long) */
219 15, /* bitsize */
220 FALSE, /* pc_relative */
221 0, /* bitpos */
222 complain_overflow_dont, /* complain_on_overflow */
223 NULL, /* special_function */
224 "PPL15H", /* name */
225 TRUE, /* partial_inplace */
226 0x7fff, /* src_mask */
227 0x7fff, /* dst_mask */
228 FALSE), /* pcrel_offset */
229
230 HOWTO (R_PPL16B, /* type */
231 0, /* rightshift */
232 2, /* size (0 = byte, 1 = short, 2 = long) */
233 16, /* bitsize */
234 FALSE, /* pc_relative */
235 0, /* bitpos */
236 complain_overflow_dont, /* complain_on_overflow */
237 local16_reloc, /* special_function */
238 "PPL16B", /* name */
239 TRUE, /* partial_inplace */
240 0xffff, /* src_mask */
241 0xffff, /* dst_mask */
242 FALSE), /* pcrel_offset */
243
244 HOWTO (R_PPN15, /* type */
245 0, /* rightshift */
246 -2, /* size (0 = byte, 1 = short, 2 = long) */
247 15, /* bitsize */
248 FALSE, /* pc_relative */
249 6, /* bitpos */
250 complain_overflow_dont, /* complain_on_overflow */
251 glob15_reloc, /* special_function */
252 "PPN15", /* name */
253 TRUE, /* partial_inplace */
254 0x1ffc0, /* src_mask */
255 0x1ffc0, /* dst_mask */
256 FALSE), /* pcrel_offset */
257
258 HOWTO (R_PPN15W, /* type */
259 2, /* rightshift */
260 -2, /* size (0 = byte, 1 = short, 2 = long) */
261 15, /* bitsize */
262 FALSE, /* pc_relative */
263 6, /* bitpos */
264 complain_overflow_dont, /* complain_on_overflow */
265 glob15_reloc, /* special_function */
266 "PPN15W", /* name */
267 TRUE, /* partial_inplace */
268 0x1ffc0, /* src_mask */
269 0x1ffc0, /* dst_mask */
270 FALSE), /* pcrel_offset */
271
272 HOWTO (R_PPN15H, /* type */
273 1, /* rightshift */
274 -2, /* size (0 = byte, 1 = short, 2 = long) */
275 15, /* bitsize */
276 FALSE, /* pc_relative */
277 6, /* bitpos */
278 complain_overflow_dont, /* complain_on_overflow */
279 glob15_reloc, /* special_function */
280 "PPN15H", /* name */
281 TRUE, /* partial_inplace */
282 0x1ffc0, /* src_mask */
283 0x1ffc0, /* dst_mask */
284 FALSE), /* pcrel_offset */
285
286 HOWTO (R_PPN16B, /* type */
287 0, /* rightshift */
288 -2, /* size (0 = byte, 1 = short, 2 = long) */
289 16, /* bitsize */
290 FALSE, /* pc_relative */
291 6, /* bitpos */
292 complain_overflow_dont, /* complain_on_overflow */
293 glob16_reloc, /* special_function */
294 "PPN16B", /* name */
295 TRUE, /* partial_inplace */
296 0x3ffc0, /* src_mask */
297 0x3ffc0, /* dst_mask */
298 FALSE), /* pcrel_offset */
299
300 HOWTO (R_PPLN15, /* type */
301 0, /* rightshift */
302 -2, /* size (0 = byte, 1 = short, 2 = long) */
303 15, /* bitsize */
304 FALSE, /* pc_relative */
305 0, /* bitpos */
306 complain_overflow_dont, /* complain_on_overflow */
307 NULL, /* special_function */
308 "PPLN15", /* name */
309 TRUE, /* partial_inplace */
310 0x7fff, /* src_mask */
311 0x7fff, /* dst_mask */
312 FALSE), /* pcrel_offset */
313
314 HOWTO (R_PPLN15W, /* type */
315 2, /* rightshift */
316 -2, /* size (0 = byte, 1 = short, 2 = long) */
317 15, /* bitsize */
318 FALSE, /* pc_relative */
319 0, /* bitpos */
320 complain_overflow_dont, /* complain_on_overflow */
321 NULL, /* special_function */
322 "PPLN15W", /* name */
323 TRUE, /* partial_inplace */
324 0x7fff, /* src_mask */
325 0x7fff, /* dst_mask */
326 FALSE), /* pcrel_offset */
327
328 HOWTO (R_PPLN15H, /* type */
329 1, /* rightshift */
330 -2, /* size (0 = byte, 1 = short, 2 = long) */
331 15, /* bitsize */
332 FALSE, /* pc_relative */
333 0, /* bitpos */
334 complain_overflow_dont, /* complain_on_overflow */
335 NULL, /* special_function */
336 "PPLN15H", /* name */
337 TRUE, /* partial_inplace */
338 0x7fff, /* src_mask */
339 0x7fff, /* dst_mask */
340 FALSE), /* pcrel_offset */
341
342 HOWTO (R_PPLN16B, /* type */
343 0, /* rightshift */
344 -2, /* size (0 = byte, 1 = short, 2 = long) */
345 15, /* bitsize */
346 FALSE, /* pc_relative */
347 0, /* bitpos */
348 complain_overflow_dont, /* complain_on_overflow */
349 local16_reloc, /* special_function */
350 "PPLN16B", /* name */
351 TRUE, /* partial_inplace */
352 0xffff, /* src_mask */
353 0xffff, /* dst_mask */
354 FALSE) /* pcrel_offset */
355};
356
357
358/* Special relocation functions, used when the output file is not
359 itself a COFF TIc80 file. */
360
361/* This special function is used for the base address type
362 relocations. */
363
364static bfd_reloc_status_type
365ppbase_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
366 error_message)
367 bfd *abfd ATTRIBUTE_UNUSED;
368 arelent *reloc_entry ATTRIBUTE_UNUSED;
369 asymbol *symbol_in ATTRIBUTE_UNUSED;
370 PTR data ATTRIBUTE_UNUSED;
371 asection *input_section ATTRIBUTE_UNUSED;
372 bfd *output_bfd ATTRIBUTE_UNUSED;
373 char **error_message ATTRIBUTE_UNUSED;
374{
375 /* FIXME. */
376 abort ();
377}
378
379/* This special function is used for the global 15 bit relocations. */
380
381static bfd_reloc_status_type
382glob15_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
383 error_message)
384 bfd *abfd ATTRIBUTE_UNUSED;
385 arelent *reloc_entry ATTRIBUTE_UNUSED;
386 asymbol *symbol_in ATTRIBUTE_UNUSED;
387 PTR data ATTRIBUTE_UNUSED;
388 asection *input_section ATTRIBUTE_UNUSED;
389 bfd *output_bfd ATTRIBUTE_UNUSED;
390 char **error_message ATTRIBUTE_UNUSED;
391{
392 /* FIXME. */
393 abort ();
394}
395
396/* This special function is used for the global 16 bit relocations. */
397
398static bfd_reloc_status_type
399glob16_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
400 error_message)
401 bfd *abfd ATTRIBUTE_UNUSED;
402 arelent *reloc_entry ATTRIBUTE_UNUSED;
403 asymbol *symbol_in ATTRIBUTE_UNUSED;
404 PTR data ATTRIBUTE_UNUSED;
405 asection *input_section ATTRIBUTE_UNUSED;
406 bfd *output_bfd ATTRIBUTE_UNUSED;
407 char **error_message ATTRIBUTE_UNUSED;
408{
409 /* FIXME. */
410 abort ();
411}
412
413/* This special function is used for the local 16 bit relocations. */
414
415static bfd_reloc_status_type
416local16_reloc (abfd, reloc_entry, symbol_in, data, input_section, output_bfd,
417 error_message)
418 bfd *abfd ATTRIBUTE_UNUSED;
419 arelent *reloc_entry ATTRIBUTE_UNUSED;
420 asymbol *symbol_in ATTRIBUTE_UNUSED;
421 PTR data ATTRIBUTE_UNUSED;
422 asection *input_section ATTRIBUTE_UNUSED;
423 bfd *output_bfd ATTRIBUTE_UNUSED;
424 char **error_message ATTRIBUTE_UNUSED;
425{
426 /* FIXME. */
427 abort ();
428}
429
430
431/* Code to turn an external r_type into a pointer to an entry in the howto_table.
432 If passed an r_type we don't recognize the abort rather than silently failing
433 to generate an output file. */
434
435static void
436rtype2howto (cache_ptr, dst)
437 arelent *cache_ptr;
438 struct internal_reloc *dst;
439{
440 unsigned int i;
441
442 for (i = 0; i < sizeof tic80_howto_table / sizeof tic80_howto_table[0]; i++)
443 {
444 if (tic80_howto_table[i].type == dst->r_type)
445 {
446 cache_ptr->howto = tic80_howto_table + i;
447 return;
448 }
449 }
450
451 (*_bfd_error_handler) (_("Unrecognized reloc type 0x%x"),
452 (unsigned int) dst->r_type);
453 cache_ptr->howto = tic80_howto_table + 0;
454}
455
456#define RTYPE2HOWTO(cache_ptr, dst) rtype2howto (cache_ptr, dst)
457#define coff_rtype_to_howto coff_tic80_rtype_to_howto
458
459static reloc_howto_type *
460coff_tic80_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
461 bfd *abfd ATTRIBUTE_UNUSED;
462 asection *sec;
463 struct internal_reloc *rel;
464 struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
465 struct internal_syment *sym ATTRIBUTE_UNUSED;
466 bfd_vma *addendp;
467{
468 arelent genrel;
469
470 if (rel -> r_symndx == -1 && addendp != NULL)
471 {
472 /* This is a TI "internal relocation", which means that the relocation
473 amount is the amount by which the current section is being relocated
474 in the output section. */
475 *addendp = (sec -> output_section -> vma + sec -> output_offset) - sec -> vma;
476 }
477 RTYPE2HOWTO (&genrel, rel);
478 return genrel.howto;
479}
480
481#ifndef BADMAG
482#define BADMAG(x) TIC80BADMAG(x)
483#endif
484
485
486#define coff_relocate_section coff_tic80_relocate_section
487
488/* We need a special relocation routine to handle the PP relocs. Most
489 of this is a copy of _bfd_coff_generic_relocate_section. */
490
491static bfd_boolean
492coff_tic80_relocate_section (output_bfd, info, input_bfd,
493 input_section, contents, relocs, syms,
494 sections)
495 bfd *output_bfd;
496 struct bfd_link_info *info;
497 bfd *input_bfd;
498 asection *input_section;
499 bfd_byte *contents;
500 struct internal_reloc *relocs;
501 struct internal_syment *syms;
502 asection **sections;
503{
504 struct internal_reloc *rel;
505 struct internal_reloc *relend;
506
507 rel = relocs;
508 relend = rel + input_section->reloc_count;
509 for (; rel < relend; rel++)
510 {
511 long symndx;
512 struct coff_link_hash_entry *h;
513 struct internal_syment *sym;
514 bfd_vma addend;
515 bfd_vma val;
516 reloc_howto_type *howto;
517 bfd_reloc_status_type rstat;
518 bfd_vma addr;
519
520 symndx = rel->r_symndx;
521
522 if (symndx == -1)
523 {
524 h = NULL;
525 sym = NULL;
526 }
527 else
528 {
529 h = obj_coff_sym_hashes (input_bfd)[symndx];
530 sym = syms + symndx;
531 }
532
533 /* COFF treats common symbols in one of two ways. Either the
534 size of the symbol is included in the section contents, or it
535 is not. We assume that the size is not included, and force
536 the rtype_to_howto function to adjust the addend as needed. */
537
538 if (sym != NULL && sym->n_scnum != 0)
539 addend = - sym->n_value;
540 else
541 addend = 0;
542
543 howto = bfd_coff_rtype_to_howto (input_bfd, input_section, rel, h,
544 sym, &addend);
545 if (howto == NULL)
546 return FALSE;
547
548 val = 0;
549
550 if (h == NULL)
551 {
552 asection *sec;
553
554 if (symndx == -1)
555 {
556 sec = bfd_abs_section_ptr;
557 val = 0;
558 }
559 else
560 {
561 sec = sections[symndx];
562 val = (sec->output_section->vma
563 + sec->output_offset
564 + sym->n_value);
565 if (! obj_pe (output_bfd))
566 val -= sec->vma;
567 }
568 }
569 else
570 {
571 if (h->root.type == bfd_link_hash_defined
572 || h->root.type == bfd_link_hash_defweak)
573 {
574 asection *sec;
575
576 sec = h->root.u.def.section;
577 val = (h->root.u.def.value
578 + sec->output_section->vma
579 + sec->output_offset);
580 }
581
582 else if (! info->relocateable)
583 {
584 if (! ((*info->callbacks->undefined_symbol)
585 (info, h->root.root.string, input_bfd, input_section,
586 rel->r_vaddr - input_section->vma, TRUE)))
587 return FALSE;
588 }
589 }
590
591 addr = rel->r_vaddr - input_section->vma;
592
593 /* FIXME: This code assumes little endian, but the PP can
594 apparently be bi-endian. I don't know if the bi-endianness
595 applies to the instruction set or just to the data. */
596 switch (howto->type)
597 {
598 default:
599 case R_ABS:
600 case R_RELLONGX:
601 case R_PPL15:
602 case R_PPL15W:
603 case R_PPL15H:
604 case R_PPLN15:
605 case R_PPLN15W:
606 case R_PPLN15H:
607 rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
608 contents, addr, val, addend);
609 break;
610
611 case R_PP15:
612 case R_PP15W:
613 case R_PP15H:
614 case R_PPN15:
615 case R_PPN15W:
616 case R_PPN15H:
617 /* Offset the address so that we can use 4 byte relocations. */
618 rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
619 contents + 2, addr, val, addend);
620 break;
621
622 case R_PP16B:
623 case R_PPN16B:
624 {
625 /* The most significant bit is stored in bit 6. */
626 bfd_byte hold;
627
628 hold = contents[addr + 4];
629 contents[addr + 4] &=~ 0x20;
630 contents[addr + 4] |= (contents[addr] >> 1) & 0x20;
631 rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
632 contents + 2, addr,
633 val, addend);
634 contents[addr] &=~ 0x40;
635 contents[addr] |= (contents[addr + 4] << 1) & 0x40;
636 contents[addr + 4] &=~ 0x20;
637 contents[addr + 4] |= hold & 0x20;
638 break;
639 }
640
641 case R_PPL16B:
642 case R_PPLN16B:
643 {
644 /* The most significant bit is stored in bit 28. */
645 bfd_byte hold;
646
647 hold = contents[addr + 1];
648 contents[addr + 1] &=~ 0x80;
649 contents[addr + 1] |= (contents[addr + 3] << 3) & 0x80;
650 rstat = _bfd_final_link_relocate (howto, input_bfd, input_section,
651 contents, addr,
652 val, addend);
653 contents[addr + 3] &= ~0x10;
654 contents[addr + 3] |= (contents[addr + 1] >> 3) & 0x10;
655 contents[addr + 1] &=~ 0x80;
656 contents[addr + 1] |= hold & 0x80;
657 break;
658 }
659
660 case R_PPBASE:
661 /* Parameter RAM is from 0x1000000 to 0x1000800. */
662 contents[addr] &=~ 0x3;
663 if (val >= 0x1000000 && val < 0x1000800)
664 contents[addr] |= 0x3;
665 else
666 contents[addr] |= 0x2;
667 rstat = bfd_reloc_ok;
668 break;
669
670 case R_PPLBASE:
671 /* Parameter RAM is from 0x1000000 to 0x1000800. */
672 contents[addr + 2] &= ~0xc0;
673 if (val >= 0x1000000 && val < 0x1000800)
674 contents[addr + 2] |= 0xc0;
675 else
676 contents[addr + 2] |= 0x80;
677 rstat = bfd_reloc_ok;
678 break;
679 }
680
681 switch (rstat)
682 {
683 default:
684 abort ();
685 case bfd_reloc_ok:
686 break;
687 case bfd_reloc_outofrange:
688 (*_bfd_error_handler)
689 (_("%s: bad reloc address 0x%lx in section `%s'"),
690 bfd_archive_filename (input_bfd),
691 (unsigned long) rel->r_vaddr,
692 bfd_get_section_name (input_bfd, input_section));
693 return FALSE;
694 case bfd_reloc_overflow:
695 {
696 const char *name;
697 char buf[SYMNMLEN + 1];
698
699 if (symndx == -1)
700 name = "*ABS*";
701 else if (h != NULL)
702 name = h->root.root.string;
703 else
704 {
705 name = _bfd_coff_internal_syment_name (input_bfd, sym, buf);
706 if (name == NULL)
707 return FALSE;
708 }
709
710 if (! ((*info->callbacks->reloc_overflow)
711 (info, name, howto->name, (bfd_vma) 0, input_bfd,
712 input_section, rel->r_vaddr - input_section->vma)))
713 return FALSE;
714 }
715 }
716 }
717 return TRUE;
718}
719
720
721#define TIC80COFF 1 /* Customize coffcode.h */
722#undef C_AUTOARG /* Clashes with TIc80's C_UEXT */
723#undef C_LASTENT /* Clashes with TIc80's C_STATLAB */
724#include "coffcode.h"
725
726CREATE_LITTLE_COFF_TARGET_VEC (tic80coff_vec, "coff-tic80", D_PAGED, 0, '_', NULL)
Note: See TracBrowser for help on using the repository browser.