1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23: #include "sysdep.h"
24: #include "bfd.h"
25: #include "libbfd.h"
26: #include "bfdlink.h"
27: #include "coff/tic30.h"
28: #include "coff/internal.h"
29: #include "libcoff.h"
30:
31: static int coff_tic30_select_reloc PARAMS ((reloc_howto_type *));
32: static void rtype2howto PARAMS ((arelent *, struct internal_reloc *));
33: static void reloc_processing PARAMS ((arelent *, struct internal_reloc *, asymbol **, bfd *, asection *));
34:
35: reloc_howto_type * tic30_coff_reloc_type_lookup PARAMS ((bfd *, bfd_reloc_code_real_type));
36:
37: #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1)
38:
39: reloc_howto_type tic30_coff_howto_table[] =
40: {
41: HOWTO (R_TIC30_ABS16, 2, 1, 16, FALSE, 0, 0, NULL,
42: "16", FALSE, 0x0000FFFF, 0x0000FFFF, FALSE),
43: HOWTO (R_TIC30_ABS24, 2, 2, 24, FALSE, 8, complain_overflow_bitfield, NULL,
44: "24", FALSE, 0xFFFFFF00, 0xFFFFFF00, FALSE),
45: HOWTO (R_TIC30_LDP, 18, 0, 24, FALSE, 0, complain_overflow_bitfield, NULL,
46: "LDP", FALSE, 0x00FF0000, 0x000000FF, FALSE),
47: HOWTO (R_TIC30_ABS32, 2, 2, 32, FALSE, 0, complain_overflow_bitfield, NULL,
48: "32", FALSE, 0xFFFFFFFF, 0xFFFFFFFF, FALSE),
49: HOWTO (R_TIC30_PC16, 2, 1, 16, TRUE, 0, complain_overflow_signed, NULL,
50: "PCREL", FALSE, 0x0000FFFF, 0x0000FFFF, FALSE),
51: EMPTY_HOWTO (-1)
52: };
53:
54: #ifndef coff_bfd_reloc_type_lookup
55: #define coff_bfd_reloc_type_lookup tic30_coff_reloc_type_lookup
56: #define coff_bfd_reloc_name_lookup tic30_coff_reloc_name_lookup
57:
58:
59:
60:
61:
62: reloc_howto_type *
63: tic30_coff_reloc_type_lookup (abfd, code)
64: bfd *abfd ATTRIBUTE_UNUSED;
65: bfd_reloc_code_real_type code;
66: {
67: switch (code)
68: {
69: case BFD_RELOC_8:
70: case BFD_RELOC_TIC30_LDP:
71: return &tic30_coff_howto_table[2];
72: case BFD_RELOC_16:
73: return &tic30_coff_howto_table[0];
74: case BFD_RELOC_24:
75: return &tic30_coff_howto_table[1];
76: case BFD_RELOC_16_PCREL:
77: return &tic30_coff_howto_table[4];
78: case BFD_RELOC_32:
79: return &tic30_coff_howto_table[3];
80: default:
81: return (reloc_howto_type *) NULL;
82: }
83: }
84:
85: static reloc_howto_type *
86: tic30_coff_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
87: const char *r_name)
88: {
89: unsigned int i;
90:
91: for (i = 0;
92: i < (sizeof (tic30_coff_howto_table)
93: / sizeof (tic30_coff_howto_table[0]));
94: i++)
95: if (tic30_coff_howto_table[i].name != NULL
96: && strcasecmp (tic30_coff_howto_table[i].name, r_name) == 0)
97: return &tic30_coff_howto_table[i];
98:
99: return NULL;
100: }
101:
102: #endif
103:
104:
105:
106: static int
107: coff_tic30_select_reloc (howto)
108: reloc_howto_type *howto;
109: {
110: return howto->type;
111: }
112:
113: #define SELECT_RELOC(x,howto) x.r_type = coff_tic30_select_reloc(howto)
114:
115: #define BADMAG(x) TIC30BADMAG(x)
116: #define TIC30 1
117: #define __A_MAGIC_SET__
118:
119:
120: #define SWAP_IN_RELOC_OFFSET H_GET_32
121: #define SWAP_OUT_RELOC_OFFSET H_PUT_32
122: #define SWAP_OUT_RELOC_EXTRA(abfd, src, dst) dst->r_stuff[0] = 'S'; \
123: dst->r_stuff[1] = 'C';
124:
125:
126:
127: static void
128: rtype2howto (internal, dst)
129: arelent *internal;
130: struct internal_reloc *dst;
131: {
132: switch (dst->r_type)
133: {
134: case R_TIC30_ABS16:
135: internal->howto = &tic30_coff_howto_table[0];
136: break;
137: case R_TIC30_ABS24:
138: internal->howto = &tic30_coff_howto_table[1];
139: break;
140: case R_TIC30_ABS32:
141: internal->howto = &tic30_coff_howto_table[3];
142: break;
143: case R_TIC30_LDP:
144: internal->howto = &tic30_coff_howto_table[2];
145: break;
146: case R_TIC30_PC16:
147: internal->howto = &tic30_coff_howto_table[4];
148: break;
149: default:
150: abort ();
151: break;
152: }
153: }
154:
155: #define RTYPE2HOWTO(internal, relocentry) rtype2howto (internal, relocentry)
156:
157:
158:
159: #define CALC_ADDEND(abfd, symbol, ext_reloc, cache_ptr) \
160: cache_ptr->addend = ext_reloc.r_offset;
161:
162: #define RELOC_PROCESSING(relent,reloc,symbols,abfd,section) \
163: reloc_processing(relent, reloc, symbols, abfd, section)
164:
165: static void
166: reloc_processing (relent, reloc, symbols, abfd, section)
167: arelent *relent;
168: struct internal_reloc *reloc;
169: asymbol **symbols;
170: bfd *abfd;
171: asection *section;
172: {
173: relent->address = reloc->r_vaddr;
174: rtype2howto (relent, reloc);
175:
176: if (reloc->r_symndx > 0)
177: relent->sym_ptr_ptr = symbols + obj_convert (abfd)[reloc->r_symndx];
178: else
179: relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
180:
181: relent->addend = reloc->r_offset;
182: relent->address -= section->vma;
183: }
184:
185: #include "coffcode.h"
186:
187: const bfd_target tic30_coff_vec =
188: {
189: "coff-tic30",
190: bfd_target_coff_flavour,
191: BFD_ENDIAN_BIG,
192: BFD_ENDIAN_LITTLE,
193:
194: (HAS_RELOC | EXEC_P |
195: HAS_LINENO | HAS_DEBUG |
196: HAS_SYMS | HAS_LOCALS | WP_TEXT),
197:
198: (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC),
199: '_',
200: '/',
201: 15,
202: bfd_getb64, bfd_getb_signed_64, bfd_putb64,
203: bfd_getb32, bfd_getb_signed_32, bfd_putb32,
204: bfd_getb16, bfd_getb_signed_16, bfd_putb16,
205: bfd_getl64, bfd_getl_signed_64, bfd_putl64,
206: bfd_getl32, bfd_getl_signed_32, bfd_putl32,
207: bfd_getl16, bfd_getl_signed_16, bfd_putl16,
208:
209: {_bfd_dummy_target, coff_object_p,
210: bfd_generic_archive_p, _bfd_dummy_target},
211: {bfd_false, coff_mkobject, _bfd_generic_mkarchive,
212: bfd_false},
213: {bfd_false, coff_write_object_contents,
214: _bfd_write_archive_contents, bfd_false},
215:
216: BFD_JUMP_TABLE_GENERIC (coff),
217: BFD_JUMP_TABLE_COPY (coff),
218: BFD_JUMP_TABLE_CORE (_bfd_nocore),
219: BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
220: BFD_JUMP_TABLE_SYMBOLS (coff),
221: BFD_JUMP_TABLE_RELOCS (coff),
222: BFD_JUMP_TABLE_WRITE (coff),
223: BFD_JUMP_TABLE_LINK (coff),
224: BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
225:
226: NULL,
227:
228: COFF_SWAP_TABLE
229: };