gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / bfd / coff-tic30.c
CommitLineData
252b5132 1/* BFD back-end for TMS320C30 coff binaries.
b3adc24a 2 Copyright (C) 1998-2020 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
d00dd7dc
AM
186 (HAS_RELOC | EXEC_P /* object flags */
187 | HAS_LINENO | HAS_DEBUG
188 | HAS_SYMS | HAS_LOCALS | WP_TEXT),
252b5132
RH
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
d00dd7dc
AM
202 { /* bfd_check_format */
203 _bfd_dummy_target,
204 coff_object_p,
205 bfd_generic_archive_p,
206 _bfd_dummy_target
207 },
208 { /* bfd_set_format */
209 _bfd_bool_bfd_false_error,
210 coff_mkobject,
211 _bfd_generic_mkarchive,
212 _bfd_bool_bfd_false_error
213 },
214 { /* bfd_write_contents */
215 _bfd_bool_bfd_false_error,
216 coff_write_object_contents,
217 _bfd_write_archive_contents,
218 _bfd_bool_bfd_false_error
219 },
252b5132
RH
220
221 BFD_JUMP_TABLE_GENERIC (coff),
222 BFD_JUMP_TABLE_COPY (coff),
223 BFD_JUMP_TABLE_CORE (_bfd_nocore),
224 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
225 BFD_JUMP_TABLE_SYMBOLS (coff),
226 BFD_JUMP_TABLE_RELOCS (coff),
227 BFD_JUMP_TABLE_WRITE (coff),
228 BFD_JUMP_TABLE_LINK (coff),
229 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
230
c3c89269 231 NULL,
cbfe05c4 232
252b5132
RH
233 COFF_SWAP_TABLE
234};
This page took 0.901083 seconds and 4 git commands to generate.