gas: detect DCTI couples in sparc
[deliverable/binutils-gdb.git] / bfd / elf32-dlx.c
CommitLineData
d172d4ba 1/* DLX specific support for 32-bit ELF
6f2750fe 2 Copyright (C) 2002-2016 Free Software Foundation, Inc.
d172d4ba
NC
3
4 This file is part of BFD, the Binary File Descriptor library.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
cd123cb7 8 the Free Software Foundation; either version 3 of the License, or
d172d4ba
NC
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
47b0e7ad
NC
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
d172d4ba 20
d172d4ba 21#include "sysdep.h"
3db64b00 22#include "bfd.h"
d172d4ba
NC
23#include "libbfd.h"
24#include "elf-bfd.h"
25#include "elf/dlx.h"
48afb194 26#include "elf32-dlx.h"
d172d4ba 27
d172d4ba
NC
28#define USE_REL 1
29
30#define bfd_elf32_bfd_reloc_type_lookup elf32_dlx_reloc_type_lookup
157090f7 31#define bfd_elf32_bfd_reloc_name_lookup elf32_dlx_reloc_name_lookup
d172d4ba
NC
32#define elf_info_to_howto elf32_dlx_info_to_howto
33#define elf_info_to_howto_rel elf32_dlx_info_to_howto_rel
34#define elf_backend_check_relocs elf32_dlx_check_relocs
35
4cc11e76 36/* The gas default behavior is not to preform the %hi modifier so that the
d172d4ba
NC
37 GNU assembler can have the lower 16 bits offset placed in the insn, BUT
38 we do like the gas to indicate it is %hi reloc type so when we in the link
39 loader phase we can have the corrected hi16 vale replace the buggous lo16
40 value that was placed there by gas. */
41
42static int skip_dlx_elf_hi16_reloc = 0;
43
44int
47b0e7ad 45set_dlx_skip_hi16_flag (int flag)
d172d4ba
NC
46{
47 skip_dlx_elf_hi16_reloc = flag;
48 return flag;
49}
50
51static bfd_reloc_status_type
47b0e7ad
NC
52_bfd_dlx_elf_hi16_reloc (bfd *abfd,
53 arelent *reloc_entry,
54 asymbol *symbol,
55 void * data,
56 asection *input_section,
57 bfd *output_bfd,
58 char **error_message)
d172d4ba
NC
59{
60 bfd_reloc_status_type ret;
61 bfd_vma relocation;
62
63 /* If the skip flag is set then we simply do the generic relocating, this
64 is more of a hack for dlx gas/gld, so we do not need to do the %hi/%lo
65 fixup like mips gld did. */
d172d4ba
NC
66 if (skip_dlx_elf_hi16_reloc)
67 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
68 input_section, output_bfd, error_message);
69
70 /* If we're relocating, and this an external symbol, we don't want
71 to change anything. */
72 if (output_bfd != (bfd *) NULL
73 && (symbol->flags & BSF_SECTION_SYM) == 0
74 && reloc_entry->addend == 0)
75 {
76 reloc_entry->address += input_section->output_offset;
77 return bfd_reloc_ok;
78 }
79
80 ret = bfd_reloc_ok;
81
82 if (bfd_is_und_section (symbol->section)
83 && output_bfd == (bfd *) NULL)
84 ret = bfd_reloc_undefined;
85
d172d4ba
NC
86 relocation = (bfd_is_com_section (symbol->section)) ? 0 : symbol->value;
87 relocation += symbol->section->output_section->vma;
88 relocation += symbol->section->output_offset;
89 relocation += reloc_entry->addend;
90 relocation += bfd_get_16 (abfd, (bfd_byte *)data + reloc_entry->address);
91
07515404 92 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
d172d4ba
NC
93 return bfd_reloc_outofrange;
94
d172d4ba
NC
95 bfd_put_16 (abfd, (short)((relocation >> 16) & 0xFFFF),
96 (bfd_byte *)data + reloc_entry->address);
97
98 return ret;
99}
100
1049f94e 101/* ELF relocs are against symbols. If we are producing relocatable
d172d4ba
NC
102 output, and the reloc is against an external symbol, and nothing
103 has given us any additional addend, the resulting reloc will also
104 be against the same symbol. In such a case, we don't want to
105 change anything about the way the reloc is handled, since it will
106 all be done at final link time. Rather than put special case code
107 into bfd_perform_relocation, all the reloc types use this howto
108 function. It just short circuits the reloc if producing
1049f94e 109 relocatable output against an external symbol. */
d172d4ba
NC
110
111static bfd_reloc_status_type
47b0e7ad
NC
112elf32_dlx_relocate16 (bfd *abfd,
113 arelent *reloc_entry,
114 asymbol *symbol,
115 void * data,
116 asection *input_section,
117 bfd *output_bfd,
118 char **error_message ATTRIBUTE_UNUSED)
d172d4ba
NC
119{
120 unsigned long insn, vallo, allignment;
121 int val;
122
123 /* HACK: I think this first condition is necessary when producing
124 relocatable output. After the end of HACK, the code is identical
125 to bfd_elf_generic_reloc(). I would _guess_ the first change
126 belongs there rather than here. martindo 1998-10-23. */
127
128 if (skip_dlx_elf_hi16_reloc)
129 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
130 input_section, output_bfd, error_message);
131
47b0e7ad 132 /* Check undefined section and undefined symbols. */
d172d4ba
NC
133 if (bfd_is_und_section (symbol->section)
134 && output_bfd == (bfd *) NULL)
135 return bfd_reloc_undefined;
136
47b0e7ad 137 /* Can not support a long jump to sections other then .text. */
d172d4ba
NC
138 if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
139 {
4a97a0e5
AM
140 (*_bfd_error_handler) (_("BFD Link Error: branch (PC rel16) to section (%s) not supported"),
141 symbol->section->output_section->name);
d172d4ba
NC
142 return bfd_reloc_undefined;
143 }
144
145 insn = bfd_get_32 (abfd, (bfd_byte *)data + reloc_entry->address);
146 allignment = 1 << (input_section->output_section->alignment_power - 1);
147 vallo = insn & 0x0000FFFF;
148
149 if (vallo & 0x8000)
150 vallo = ~(vallo | 0xFFFF0000) + 1;
151
152 /* vallo points to the vma of next instruction. */
153 vallo += (((unsigned long)(input_section->output_section->vma +
154 input_section->output_offset) +
155 allignment) & ~allignment);
156
157 /* val is the displacement (PC relative to next instruction). */
158 val = (symbol->section->output_offset +
159 symbol->section->output_section->vma +
160 symbol->value) - vallo;
d172d4ba
NC
161
162 if (abs ((int) val) > 0x00007FFF)
163 return bfd_reloc_outofrange;
164
165 insn = (insn & 0xFFFF0000) | (val & 0x0000FFFF);
166
167 bfd_put_32 (abfd, insn,
168 (bfd_byte *) data + reloc_entry->address);
169
170 return bfd_reloc_ok;
171}
172
173static bfd_reloc_status_type
47b0e7ad
NC
174elf32_dlx_relocate26 (bfd *abfd,
175 arelent *reloc_entry,
176 asymbol *symbol,
177 void * data,
178 asection *input_section,
179 bfd *output_bfd,
180 char **error_message ATTRIBUTE_UNUSED)
d172d4ba
NC
181{
182 unsigned long insn, vallo, allignment;
183 int val;
184
185 /* HACK: I think this first condition is necessary when producing
186 relocatable output. After the end of HACK, the code is identical
187 to bfd_elf_generic_reloc(). I would _guess_ the first change
188 belongs there rather than here. martindo 1998-10-23. */
189
190 if (skip_dlx_elf_hi16_reloc)
191 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
192 input_section, output_bfd, error_message);
193
194 /* Check undefined section and undefined symbols. */
195 if (bfd_is_und_section (symbol->section)
196 && output_bfd == (bfd *) NULL)
197 return bfd_reloc_undefined;
198
199 /* Can not support a long jump to sections other then .text */
200 if (strcmp (input_section->name, symbol->section->output_section->name) != 0)
201 {
4a97a0e5
AM
202 (*_bfd_error_handler) (_("BFD Link Error: jump (PC rel26) to section (%s) not supported"),
203 symbol->section->output_section->name);
d172d4ba
NC
204 return bfd_reloc_undefined;
205 }
206
207 insn = bfd_get_32 (abfd, (bfd_byte *)data + reloc_entry->address);
208 allignment = 1 << (input_section->output_section->alignment_power - 1);
209 vallo = insn & 0x03FFFFFF;
210
211 if (vallo & 0x03000000)
212 vallo = ~(vallo | 0xFC000000) + 1;
213
214 /* vallo is the vma for the next instruction. */
215 vallo += (((unsigned long) (input_section->output_section->vma +
216 input_section->output_offset) +
217 allignment) & ~allignment);
218
219 /* val is the displacement (PC relative to next instruction). */
220 val = (symbol->section->output_offset +
221 symbol->section->output_section->vma + symbol->value)
222 - vallo;
d172d4ba
NC
223
224 if (abs ((int) val) > 0x01FFFFFF)
225 return bfd_reloc_outofrange;
226
227 insn = (insn & 0xFC000000) | (val & 0x03FFFFFF);
228 bfd_put_32 (abfd, insn,
229 (bfd_byte *) data + reloc_entry->address);
230
231 return bfd_reloc_ok;
232}
233
47b0e7ad
NC
234static reloc_howto_type dlx_elf_howto_table[]=
235{
236 /* No relocation. */
237 HOWTO (R_DLX_NONE, /* Type. */
238 0, /* Rightshift. */
6346d5ca 239 3, /* size (0 = byte, 1 = short, 2 = long). */
47b0e7ad
NC
240 0, /* Bitsize. */
241 FALSE, /* PC_relative. */
242 0, /* Bitpos. */
243 complain_overflow_dont,/* Complain_on_overflow. */
244 bfd_elf_generic_reloc, /* Special_function. */
245 "R_DLX_NONE", /* Name. */
246 FALSE, /* Partial_inplace. */
247 0, /* Src_mask. */
248 0, /* Dst_mask. */
249 FALSE), /* PCrel_offset. */
250
251 /* 8 bit relocation. */
252 HOWTO (R_DLX_RELOC_8, /* Type. */
253 0, /* Rightshift. */
254 0, /* Size (0 = byte, 1 = short, 2 = long). */
255 8, /* Bitsize. */
256 FALSE, /* PC_relative. */
257 0, /* Bitpos. */
258 complain_overflow_dont,/* Complain_on_overflow. */
259 bfd_elf_generic_reloc, /* Special_function. */
260 "R_DLX_RELOC_8", /* Name. */
261 TRUE, /* Partial_inplace. */
262 0xff, /* Src_mask. */
263 0xff, /* Dst_mask. */
264 FALSE), /* PCrel_offset. */
265
266 /* 16 bit relocation. */
267 HOWTO (R_DLX_RELOC_16, /* Type. */
268 0, /* Rightshift. */
269 1, /* Size (0 = byte, 1 = short, 2 = long). */
270 16, /* Bitsize. */
271 FALSE, /* PC_relative. */
272 0, /* Bitpos. */
273 complain_overflow_dont,/* Complain_on_overflow. */
274 bfd_elf_generic_reloc, /* Special_function. */
275 "R_DLX_RELOC_16", /* Name. */
276 TRUE, /* Partial_inplace. */
277 0xffff, /* Src_mask. */
278 0xffff, /* Dst_mask. */
279 FALSE), /* PCrel_offset. */
280
281 /* 32 bit relocation. */
282 HOWTO (R_DLX_RELOC_32, /* Type. */
283 0, /* Rightshift. */
284 2, /* Size (0 = byte, 1 = short, 2 = long). */
285 32, /* Bitsize. */
286 FALSE, /* PC_relative. */
287 0, /* Bitpos. */
288 complain_overflow_dont,/* Complain_on_overflow. */
289 bfd_elf_generic_reloc, /* Special_function. */
290 "R_DLX_RELOC_32", /* Name. */
291 TRUE, /* Partial_inplace. */
292 0xffffffff, /* Src_mask. */
293 0xffffffff, /* Dst_mask. */
294 FALSE), /* PCrel_offset. */
295
296 /* GNU extension to record C++ vtable hierarchy. */
297 HOWTO (R_DLX_GNU_VTINHERIT, /* Type. */
298 0, /* Rightshift. */
299 2, /* Size (0 = byte, 1 = short, 2 = long). */
300 0, /* Bitsize. */
301 FALSE, /* PC_relative. */
302 0, /* Bitpos. */
303 complain_overflow_dont,/* Complain_on_overflow. */
304 NULL, /* Special_function. */
305 "R_DLX_GNU_VTINHERIT", /* Name. */
306 FALSE, /* Partial_inplace. */
307 0, /* Src_mask. */
308 0, /* Dst_mask. */
309 FALSE), /* PCrel_offset. */
310
311 /* GNU extension to record C++ vtable member usage. */
312 HOWTO (R_DLX_GNU_VTENTRY, /* Type. */
313 0, /* Rightshift. */
314 2, /* Size (0 = byte, 1 = short, 2 = long). */
315 0, /* Bitsize. */
316 FALSE, /* PC_relative. */
317 0, /* Bitpos. */
318 complain_overflow_dont,/* Complain_on_overflow. */
319 _bfd_elf_rel_vtable_reloc_fn,/* Special_function. */
320 "R_DLX_GNU_VTENTRY", /* Name. */
321 FALSE, /* Partial_inplace. */
322 0, /* Src_mask. */
323 0, /* Dst_mask. */
324 FALSE) /* PCrel_offset. */
325};
326
327/* 16 bit offset for pc-relative branches. */
328static reloc_howto_type elf_dlx_gnu_rel16_s2 =
329 HOWTO (R_DLX_RELOC_16_PCREL, /* Type. */
330 0, /* Rightshift. */
331 1, /* Size (0 = byte, 1 = short, 2 = long). */
332 16, /* Bitsize. */
333 TRUE, /* PC_relative. */
334 0, /* Bitpos. */
335 complain_overflow_signed, /* Complain_on_overflow. */
336 elf32_dlx_relocate16, /* Special_function. */
337 "R_DLX_RELOC_16_PCREL",/* Name. */
338 TRUE, /* Partial_inplace. */
339 0xffff, /* Src_mask. */
340 0xffff, /* Dst_mask. */
341 TRUE); /* PCrel_offset. */
342
343/* 26 bit offset for pc-relative branches. */
344static reloc_howto_type elf_dlx_gnu_rel26_s2 =
345 HOWTO (R_DLX_RELOC_26_PCREL, /* Type. */
346 0, /* Rightshift. */
347 2, /* Size (0 = byte, 1 = short, 2 = long). */
348 26, /* Bitsize. */
349 TRUE, /* PC_relative. */
350 0, /* Bitpos. */
351 complain_overflow_dont,/* Complain_on_overflow. */
352 elf32_dlx_relocate26, /* Special_function. */
353 "R_DLX_RELOC_26_PCREL",/* Name. */
354 TRUE, /* Partial_inplace. */
355 0xffff, /* Src_mask. */
356 0xffff, /* Dst_mask. */
357 TRUE); /* PCrel_offset. */
358
359/* High 16 bits of symbol value. */
360static reloc_howto_type elf_dlx_reloc_16_hi =
361 HOWTO (R_DLX_RELOC_16_HI, /* Type. */
362 16, /* Rightshift. */
363 2, /* Size (0 = byte, 1 = short, 2 = long). */
364 32, /* Bitsize. */
365 FALSE, /* PC_relative. */
366 0, /* Bitpos. */
367 complain_overflow_dont,/* Complain_on_overflow. */
368 _bfd_dlx_elf_hi16_reloc,/* Special_function. */
369 "R_DLX_RELOC_16_HI", /* Name. */
370 TRUE, /* Partial_inplace. */
371 0xFFFF, /* Src_mask. */
372 0xffff, /* Dst_mask. */
373 FALSE); /* PCrel_offset. */
374
375 /* Low 16 bits of symbol value. */
376static reloc_howto_type elf_dlx_reloc_16_lo =
377 HOWTO (R_DLX_RELOC_16_LO, /* Type. */
378 0, /* Rightshift. */
379 1, /* Size (0 = byte, 1 = short, 2 = long). */
380 16, /* Bitsize. */
381 FALSE, /* PC_relative. */
382 0, /* Bitpos. */
383 complain_overflow_dont,/* Complain_on_overflow. */
384 bfd_elf_generic_reloc, /* Special_function. */
385 "R_DLX_RELOC_16_LO", /* Name. */
386 TRUE, /* Partial_inplace. */
387 0xffff, /* Src_mask. */
388 0xffff, /* Dst_mask. */
389 FALSE); /* PCrel_offset. */
390
d172d4ba
NC
391/* A mapping from BFD reloc types to DLX ELF reloc types.
392 Stolen from elf32-mips.c.
cedb70c5 393
d172d4ba
NC
394 More about this table - for dlx elf relocation we do not really
395 need this table, if we have a rtype defined in this table will
396 caused tc_gen_relocate confused and die on us, but if we remove
4cc11e76 397 this table it will caused more problem, so for now simple solution
d172d4ba
NC
398 is to remove those entries which may cause problem. */
399struct elf_reloc_map
400{
401 bfd_reloc_code_real_type bfd_reloc_val;
402 enum elf_dlx_reloc_type elf_reloc_val;
403};
404
3f9c735e 405static const struct elf_reloc_map dlx_reloc_map[] =
47b0e7ad
NC
406{
407 { BFD_RELOC_NONE, R_DLX_NONE },
408 { BFD_RELOC_16, R_DLX_RELOC_16 },
409 { BFD_RELOC_32, R_DLX_RELOC_32 },
410 { BFD_RELOC_DLX_HI16_S, R_DLX_RELOC_16_HI },
411 { BFD_RELOC_DLX_LO16, R_DLX_RELOC_16_LO },
412 { BFD_RELOC_VTABLE_INHERIT, R_DLX_GNU_VTINHERIT },
413 { BFD_RELOC_VTABLE_ENTRY, R_DLX_GNU_VTENTRY }
414};
d172d4ba
NC
415
416/* Look through the relocs for a section during the first phase.
417 Since we don't do .gots or .plts, we just need to consider the
418 virtual table relocs for gc. */
419
b34976b6 420static bfd_boolean
47b0e7ad
NC
421elf32_dlx_check_relocs (bfd *abfd,
422 struct bfd_link_info *info,
423 asection *sec,
424 const Elf_Internal_Rela *relocs)
d172d4ba
NC
425{
426 Elf_Internal_Shdr *symtab_hdr;
5582a088 427 struct elf_link_hash_entry **sym_hashes;
d172d4ba
NC
428 const Elf_Internal_Rela *rel;
429 const Elf_Internal_Rela *rel_end;
430
0e1862bb 431 if (bfd_link_relocatable (info))
b34976b6 432 return TRUE;
d172d4ba
NC
433
434 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
435 sym_hashes = elf_sym_hashes (abfd);
d172d4ba
NC
436
437 rel_end = relocs + sec->reloc_count;
438 for (rel = relocs; rel < rel_end; rel++)
439 {
440 struct elf_link_hash_entry *h;
441 unsigned long r_symndx;
442
443 r_symndx = ELF32_R_SYM (rel->r_info);
444 if (r_symndx < symtab_hdr->sh_info)
445 h = NULL;
446 else
973a3492
L
447 {
448 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
449 while (h->root.type == bfd_link_hash_indirect
450 || h->root.type == bfd_link_hash_warning)
451 h = (struct elf_link_hash_entry *) h->root.u.i.link;
81fbe831
AM
452
453 /* PR15323, ref flags aren't set for references in the same
454 object. */
455 h->root.non_ir_ref = 1;
973a3492 456 }
d172d4ba
NC
457
458 switch (ELF32_R_TYPE (rel->r_info))
459 {
460 /* This relocation describes the C++ object vtable hierarchy.
461 Reconstruct it for later use during GC. */
462 case R_DLX_GNU_VTINHERIT:
c152c796 463 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 464 return FALSE;
d172d4ba
NC
465 break;
466
467 /* This relocation describes which C++ vtable entries are actually
468 used. Record for later use during GC. */
469 case R_DLX_GNU_VTENTRY:
d17e0c6e
JB
470 BFD_ASSERT (h != NULL);
471 if (h != NULL
472 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 473 return FALSE;
d172d4ba
NC
474 break;
475 }
476 }
477
b34976b6 478 return TRUE;
d172d4ba
NC
479}
480
481/* Given a BFD reloc type, return a howto structure. */
482
483static reloc_howto_type *
47b0e7ad
NC
484elf32_dlx_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
485 bfd_reloc_code_real_type code)
d172d4ba
NC
486{
487 unsigned int i;
488
489 for (i = 0; i < sizeof (dlx_reloc_map) / sizeof (struct elf_reloc_map); i++)
490 if (dlx_reloc_map[i].bfd_reloc_val == code)
491 return &dlx_elf_howto_table[(int) dlx_reloc_map[i].elf_reloc_val];
492
493 switch (code)
494 {
495 default:
496 bfd_set_error (bfd_error_bad_value);
497 return NULL;
498 case BFD_RELOC_16_PCREL_S2:
499 return &elf_dlx_gnu_rel16_s2;
500 case BFD_RELOC_DLX_JMP26:
501 return &elf_dlx_gnu_rel26_s2;
502 case BFD_RELOC_HI16_S:
503 return &elf_dlx_reloc_16_hi;
504 case BFD_RELOC_LO16:
505 return &elf_dlx_reloc_16_lo;
506 }
507}
508
157090f7
AM
509static reloc_howto_type *
510elf32_dlx_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
511 const char *r_name)
512{
513 unsigned int i;
514
515 for (i = 0;
516 i < sizeof (dlx_elf_howto_table) / sizeof (dlx_elf_howto_table[0]);
517 i++)
518 if (dlx_elf_howto_table[i].name != NULL
519 && strcasecmp (dlx_elf_howto_table[i].name, r_name) == 0)
520 return &dlx_elf_howto_table[i];
521
522 if (strcasecmp (elf_dlx_gnu_rel16_s2.name, r_name) == 0)
523 return &elf_dlx_gnu_rel16_s2;
524 if (strcasecmp (elf_dlx_gnu_rel26_s2.name, r_name) == 0)
525 return &elf_dlx_gnu_rel26_s2;
526 if (strcasecmp (elf_dlx_reloc_16_hi.name, r_name) == 0)
527 return &elf_dlx_reloc_16_hi;
528 if (strcasecmp (elf_dlx_reloc_16_lo.name, r_name) == 0)
529 return &elf_dlx_reloc_16_lo;
530
531 return NULL;
532}
533
d172d4ba 534static reloc_howto_type *
47b0e7ad 535dlx_rtype_to_howto (unsigned int r_type)
d172d4ba
NC
536{
537 switch (r_type)
538 {
539 case R_DLX_RELOC_16_PCREL:
540 return & elf_dlx_gnu_rel16_s2;
d172d4ba
NC
541 case R_DLX_RELOC_26_PCREL:
542 return & elf_dlx_gnu_rel26_s2;
d172d4ba
NC
543 case R_DLX_RELOC_16_HI:
544 return & elf_dlx_reloc_16_hi;
d172d4ba
NC
545 case R_DLX_RELOC_16_LO:
546 return & elf_dlx_reloc_16_lo;
d172d4ba 547 default:
5860e3f8
NC
548 if (r_type >= (unsigned int) R_DLX_max)
549 {
550 _bfd_error_handler (_("Invalid DLX reloc number: %d"), r_type);
551 r_type = 0;
552 }
d172d4ba 553 return & dlx_elf_howto_table[r_type];
d172d4ba
NC
554 }
555}
556
557static void
47b0e7ad
NC
558elf32_dlx_info_to_howto (bfd * abfd ATTRIBUTE_UNUSED,
559 arelent * cache_ptr ATTRIBUTE_UNUSED,
560 Elf_Internal_Rela * dst ATTRIBUTE_UNUSED)
d172d4ba
NC
561{
562 abort ();
563}
564
565static void
47b0e7ad
NC
566elf32_dlx_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
567 arelent *cache_ptr,
568 Elf_Internal_Rela *dst)
d172d4ba
NC
569{
570 unsigned int r_type;
571
572 r_type = ELF32_R_TYPE (dst->r_info);
573 cache_ptr->howto = dlx_rtype_to_howto (r_type);
574 return;
575}
576
6d00b590 577#define TARGET_BIG_SYM dlx_elf32_be_vec
d172d4ba
NC
578#define TARGET_BIG_NAME "elf32-dlx"
579#define ELF_ARCH bfd_arch_dlx
580#define ELF_MACHINE_CODE EM_DLX
581#define ELF_MAXPAGESIZE 1 /* FIXME: This number is wrong, It should be the page size in bytes. */
582
583#include "elf32-target.h"
This page took 1.14547 seconds and 4 git commands to generate.