]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - bfd/coff-tic30.c
Use bool in gprof
[thirdparty/binutils-gdb.git] / bfd / coff-tic30.c
CommitLineData
252b5132 1/* BFD back-end for TMS320C30 coff binaries.
250d07de 2 Copyright (C) 1998-2021 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. */
d1bcae83 195 TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols. */
252b5132
RH
196 bfd_getb64, bfd_getb_signed_64, bfd_putb64,
197 bfd_getb32, bfd_getb_signed_32, bfd_putb32,
198 bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
199 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
200 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
201 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
202
d00dd7dc
AM
203 { /* bfd_check_format */
204 _bfd_dummy_target,
205 coff_object_p,
206 bfd_generic_archive_p,
207 _bfd_dummy_target
208 },
209 { /* bfd_set_format */
210 _bfd_bool_bfd_false_error,
211 coff_mkobject,
212 _bfd_generic_mkarchive,
213 _bfd_bool_bfd_false_error
214 },
215 { /* bfd_write_contents */
216 _bfd_bool_bfd_false_error,
217 coff_write_object_contents,
218 _bfd_write_archive_contents,
219 _bfd_bool_bfd_false_error
220 },
252b5132
RH
221
222 BFD_JUMP_TABLE_GENERIC (coff),
223 BFD_JUMP_TABLE_COPY (coff),
224 BFD_JUMP_TABLE_CORE (_bfd_nocore),
225 BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
226 BFD_JUMP_TABLE_SYMBOLS (coff),
227 BFD_JUMP_TABLE_RELOCS (coff),
228 BFD_JUMP_TABLE_WRITE (coff),
229 BFD_JUMP_TABLE_LINK (coff),
230 BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
231
c3c89269 232 NULL,
cbfe05c4 233
252b5132
RH
234 COFF_SWAP_TABLE
235};