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

Last change on this file since 947 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 ([email protected])
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}