]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/coff-tic30.c
Include <array> to declare std::array<>.
[thirdparty/binutils-gdb.git] / bfd / coff-tic30.c
CommitLineData
252b5132 1/* BFD back-end for TMS320C30 coff binaries.
2571583a 2 Copyright (C) 1998-2017 Free Software Foundation, Inc.
252b5132
RH
3 Contributed by Steven Haworth (steve@pm.cse.rmit.edu.au)
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
3e110533 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
53e09e0a 20 02110-1301, USA. */
252b5132 21
252b5132 22#include "sysdep.h"
3db64b00 23#include "bfd.h"
252b5132
RH
24#include "libbfd.h"
25#include "bfdlink.h"
26#include "coff/tic30.h"
27#include "coff/internal.h"
28#include "libcoff.h"
29
30#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1)
31
32reloc_howto_type tic30_coff_howto_table[] =
f4ffd778 33 {
b34976b6
AM
34 HOWTO (R_TIC30_ABS16, 2, 1, 16, FALSE, 0, 0, NULL,
35 "16", FALSE, 0x0000FFFF, 0x0000FFFF, FALSE),
36 HOWTO (R_TIC30_ABS24, 2, 2, 24, FALSE, 8, complain_overflow_bitfield, NULL,
37 "24", FALSE, 0xFFFFFF00, 0xFFFFFF00, FALSE),
38 HOWTO (R_TIC30_LDP, 18, 0, 24, FALSE, 0, complain_overflow_bitfield, NULL,
39 "LDP", FALSE, 0x00FF0000, 0x000000FF, FALSE),
40 HOWTO (R_TIC30_ABS32, 2, 2, 32, FALSE, 0, complain_overflow_bitfield, NULL,
41 "32", FALSE, 0xFFFFFFFF, 0xFFFFFFFF, FALSE),
42 HOWTO (R_TIC30_PC16, 2, 1, 16, TRUE, 0, complain_overflow_signed, NULL,
43 "PCREL", FALSE, 0x0000FFFF, 0x0000FFFF, FALSE),
f4ffd778
NC
44 EMPTY_HOWTO (-1)
45 };
252b5132
RH
46
47#ifndef coff_bfd_reloc_type_lookup
48#define coff_bfd_reloc_type_lookup tic30_coff_reloc_type_lookup
157090f7 49#define coff_bfd_reloc_name_lookup tic30_coff_reloc_name_lookup
252b5132
RH
50
51/* For the case statement use the code values used in tc_gen_reloc to
52 map to the howto table entries that match those in both the aout
cbfe05c4 53 and coff implementations. */
f4ffd778 54
2c3fc389
NC
55static reloc_howto_type *
56tic30_coff_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
57 bfd_reloc_code_real_type code)
252b5132
RH
58{
59 switch (code)
60 {
61 case BFD_RELOC_8:
62 case BFD_RELOC_TIC30_LDP:
63 return &tic30_coff_howto_table[2];
64 case BFD_RELOC_16:
65 return &tic30_coff_howto_table[0];
66 case BFD_RELOC_24:
67 return &tic30_coff_howto_table[1];
68 case BFD_RELOC_16_PCREL:
69 return &tic30_coff_howto_table[4];
70 case BFD_RELOC_32:
71 return &tic30_coff_howto_table[3];
72 default:
73 return (reloc_howto_type *) NULL;
74 }
75}
76
157090f7
AM
77static reloc_howto_type *
78tic30_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
79 const char *r_name)
80{
81 unsigned int i;
82
83 for (i = 0;
84 i < (sizeof (tic30_coff_howto_table)
85 / sizeof (tic30_coff_howto_table[0]));
86 i++)
87 if (tic30_coff_howto_table[i].name != NULL
88 && strcasecmp (tic30_coff_howto_table[i].name, r_name) == 0)
89 return &tic30_coff_howto_table[i];
90
91 return NULL;
92}
93
252b5132
RH
94#endif
95
f4ffd778 96/* Turn a howto into a reloc number. */
252b5132
RH
97
98static int
2c3fc389 99coff_tic30_select_reloc (reloc_howto_type *howto)
252b5132
RH
100{
101 return howto->type;
102}
103
104#define SELECT_RELOC(x,howto) x.r_type = coff_tic30_select_reloc(howto)
105
252b5132
RH
106#define BADMAG(x) TIC30BADMAG(x)
107#define TIC30 1 /* Customize coffcode.h */
108#define __A_MAGIC_SET__
109
110/* Code to swap in the reloc */
dc810e39
AM
111#define SWAP_IN_RELOC_OFFSET H_GET_32
112#define SWAP_OUT_RELOC_OFFSET H_PUT_32
252b5132
RH
113#define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) dst->r_stuff[0] = 'S'; \
114dst->r_stuff[1] = 'C';
115
cbfe05c4 116/* Code to turn a r_type into a howto ptr, uses the above howto table. */
252b5132
RH
117
118static void
2c3fc389 119rtype2howto (arelent *internal, struct internal_reloc *dst)
252b5132
RH
120{
121 switch (dst->r_type)
122 {
123 case R_TIC30_ABS16:
124 internal->howto = &tic30_coff_howto_table[0];
125 break;
126 case R_TIC30_ABS24:
127 internal->howto = &tic30_coff_howto_table[1];
128 break;
129 case R_TIC30_ABS32:
130 internal->howto = &tic30_coff_howto_table[3];
131 break;
132 case R_TIC30_LDP:
133 internal->howto = &tic30_coff_howto_table[2];
134 break;
135 case R_TIC30_PC16:
136 internal->howto = &tic30_coff_howto_table[4];
137 break;
138 default:
a1165289 139 internal->howto = NULL;
252b5132
RH
140 break;
141 }
142}
143
f4ffd778 144#define RTYPE2HOWTO(internal, relocentry) rtype2howto (internal, relocentry)
252b5132
RH
145
146/* Perform any necessary magic to the addend in a reloc entry */
147
148#define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
149 cache_ptr->addend = ext_reloc.r_offset;
150
252b5132
RH
151#define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \
152 reloc_processing(relent, reloc, symbols, abfd, section)
153
154static void
2c3fc389
NC
155reloc_processing (arelent *relent,
156 struct internal_reloc *reloc,
157 asymbol **symbols,
158 bfd *abfd,
159 asection *section)
252b5132
RH
160{
161 relent->address = reloc->r_vaddr;
162 rtype2howto (relent, reloc);
163
164 if (reloc->r_symndx > 0)
f4ffd778 165 relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
252b5132 166 else
f4ffd778
NC
167 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
168
252b5132
RH
169 relent->addend = reloc->r_offset;
170 relent->address -= section->vma;
171}
172
2b5c217d
NC
173#ifndef bfd_pe_print_pdata
174#define bfd_pe_print_pdata NULL
175#endif
176
252b5132
RH
177#include "coffcode.h"
178
179const bfd_target tic30_coff_vec =
180{
181 "coff-tic30", /* name */
182 bfd_target_coff_flavour,
183 BFD_ENDIAN_BIG, /* data byte order is big */
184 BFD_ENDIAN_LITTLE, /* header byte order is little */
185
186 (HAS_RELOC | EXEC_P | /* object flags */
187 HAS_LINENO | HAS_DEBUG |
188 HAS_SYMS | HAS_LOCALS | WP_TEXT),
189
190 (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC), /* section flags */
191 '_', /* leading symbol underscore */
192 '/', /* ar_pad_char */
193 15, /* ar_max_namelen */
0aabe54e 194 0, /* match priority. */
252b5132
RH
195 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
196 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
197 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
198 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
199 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
200 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
201
202 {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
203 bfd_generic_archive_p, _bfd_dummy_target},
204 {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
205 bfd_false},
206 {bfd_false, coff_write_object_contents, /* bfd_write_contents */
207 _bfd_write_archive_contents, bfd_false},
208
209 BFD_JUMP_TABLE_GENERIC (coff),
210 BFD_JUMP_TABLE_COPY (coff),
211 BFD_JUMP_TABLE_CORE (_bfd_nocore),
212 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
213 BFD_JUMP_TABLE_SYMBOLS (coff),
214 BFD_JUMP_TABLE_RELOCS (coff),
215 BFD_JUMP_TABLE_WRITE (coff),
216 BFD_JUMP_TABLE_LINK (coff),
217 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
218
c3c89269 219 NULL,
cbfe05c4 220
252b5132
RH
221 COFF_SWAP_TABLE
222};