Linux target variants for elfxx-hppa.
[deliverable/binutils-gdb.git] / bfd / elf32-arc.c
CommitLineData
252b5132 1/* ARC-specific support for 32-bit ELF
0d2bcfaf 2 Copyright (C) 1994, 1995, 1997, 1999, 2000 Free Software Foundation, Inc.
252b5132
RH
3 Contributed by Doug Evans (dje@cygnus.com).
4
0d2bcfaf 5 This file is part of BFD, the Binary File Descriptor library.
252b5132 6
0d2bcfaf
NC
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
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
252b5132 11
0d2bcfaf
NC
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.
252b5132 16
0d2bcfaf
NC
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
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
252b5132
RH
20
21#include "bfd.h"
22#include "sysdep.h"
23#include "libbfd.h"
24#include "elf-bfd.h"
25#include "elf/arc.h"
26
27static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
0d2bcfaf 28 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
252b5132
RH
29static void arc_info_to_howto_rel
30 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
0d2bcfaf
NC
31static boolean arc_elf_object_p
32 PARAMS ((bfd *));
33static void arc_elf_final_write_processing
34 PARAMS ((bfd *, boolean));
252b5132
RH
35
36/* Try to minimize the amount of space occupied by relocation tables
37 on the ROM (not that the ROM won't be swamped by other ELF overhead). */
0d2bcfaf 38
252b5132
RH
39#define USE_REL
40
41static reloc_howto_type elf_arc_howto_table[] =
42{
43 /* This reloc does nothing. */
0d2bcfaf
NC
44 HOWTO (R_ARC_NONE, /* type */
45 0, /* rightshift */
46 2, /* size (0 = byte, 1 = short, 2 = long) */
47 32, /* bitsize */
48 false, /* pc_relative */
49 0, /* bitpos */
50 complain_overflow_bitfield, /* complain_on_overflow */
51 bfd_elf_generic_reloc, /* special_function */
52 "R_ARC_NONE", /* name */
53 false, /* partial_inplace */
54 0, /* src_mask */
55 0, /* dst_mask */
56 false), /* pcrel_offset */
252b5132
RH
57
58 /* A standard 32 bit relocation. */
0d2bcfaf
NC
59 HOWTO (R_ARC_32, /* type */
60 0, /* rightshift */
61 2, /* size (0 = byte, 1 = short, 2 = long) */
62 32, /* bitsize */
63 false, /* pc_relative */
64 0, /* bitpos */
65 complain_overflow_bitfield, /* complain_on_overflow */
66 bfd_elf_generic_reloc, /* special_function */
67 "R_ARC_32", /* name */
68 false, /* partial_inplace */
69 0xffffffff, /* src_mask */
70 0xffffffff, /* dst_mask */
71 false), /* pcrel_offset */
252b5132
RH
72
73 /* A 26 bit absolute branch, right shifted by 2. */
0d2bcfaf
NC
74 HOWTO (R_ARC_B26, /* type */
75 2, /* rightshift */
76 2, /* size (0 = byte, 1 = short, 2 = long) */
77 26, /* bitsize */
78 false, /* pc_relative */
79 0, /* bitpos */
80 complain_overflow_bitfield, /* complain_on_overflow */
81 bfd_elf_generic_reloc, /* special_function */
82 "R_ARC_B26", /* name */
83 false, /* partial_inplace */
84 0x00ffffff, /* src_mask */
85 0x00ffffff, /* dst_mask */
86 false), /* pcrel_offset */
252b5132
RH
87
88 /* A relative 22 bit branch; bits 21-2 are stored in bits 26-7. */
0d2bcfaf
NC
89 HOWTO (R_ARC_B22_PCREL, /* type */
90 2, /* rightshift */
91 2, /* size (0 = byte, 1 = short, 2 = long) */
92 22, /* bitsize */
93 true, /* pc_relative */
94 7, /* bitpos */
95 complain_overflow_signed, /* complain_on_overflow */
96 bfd_elf_generic_reloc, /* special_function */
97 "R_ARC_B22_PCREL", /* name */
98 false, /* partial_inplace */
99 0x07ffff80, /* src_mask */
100 0x07ffff80, /* dst_mask */
101 true), /* pcrel_offset */
252b5132
RH
102
103};
104
105/* Map BFD reloc types to ARC ELF reloc types. */
106
107struct arc_reloc_map
108{
109 bfd_reloc_code_real_type bfd_reloc_val;
110 unsigned char elf_reloc_val;
111};
112
113static const struct arc_reloc_map arc_reloc_map[] =
114{
115 { BFD_RELOC_NONE, R_ARC_NONE, },
116 { BFD_RELOC_32, R_ARC_32 },
117 { BFD_RELOC_CTOR, R_ARC_32 },
118 { BFD_RELOC_ARC_B26, R_ARC_B26 },
119 { BFD_RELOC_ARC_B22_PCREL, R_ARC_B22_PCREL },
120};
121
122static reloc_howto_type *
123bfd_elf32_bfd_reloc_type_lookup (abfd, code)
5f771d47 124 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
125 bfd_reloc_code_real_type code;
126{
127 unsigned int i;
128
0d2bcfaf 129 for (i = 0; i < sizeof (arc_reloc_map) / sizeof (struct arc_reloc_map); i++)
252b5132
RH
130 {
131 if (arc_reloc_map[i].bfd_reloc_val == code)
132 return &elf_arc_howto_table[arc_reloc_map[i].elf_reloc_val];
133 }
252b5132
RH
134 return NULL;
135}
136
137/* Set the howto pointer for an ARC ELF reloc. */
138
139static void
140arc_info_to_howto_rel (abfd, cache_ptr, dst)
5f771d47 141 bfd *abfd ATTRIBUTE_UNUSED;
252b5132
RH
142 arelent *cache_ptr;
143 Elf32_Internal_Rel *dst;
144{
145 unsigned int r_type;
146
147 r_type = ELF32_R_TYPE (dst->r_info);
148 BFD_ASSERT (r_type < (unsigned int) R_ARC_max);
149 cache_ptr->howto = &elf_arc_howto_table[r_type];
150}
151
152/* Set the right machine number for an ARC ELF file. */
153
154static boolean
155arc_elf_object_p (abfd)
156 bfd *abfd;
157{
0d2bcfaf 158 int mach = bfd_mach_arc_5;
252b5132 159
0d2bcfaf 160 if (elf_elfheader(abfd)->e_machine == EM_ARC)
252b5132 161 {
0d2bcfaf
NC
162 unsigned long arch = elf_elfheader (abfd)->e_flags & EF_ARC_MACH;
163
164 switch (arch)
165 {
166 default:
167 case E_ARC_MACH_ARC5:
168 mach = bfd_mach_arc_5;
169 break;
170 case E_ARC_MACH_ARC6:
171 mach = bfd_mach_arc_6;
172 break;
173 case E_ARC_MACH_ARC7:
174 mach = bfd_mach_arc_7;
175 break;
176 case E_ARC_MACH_ARC8:
177 mach = bfd_mach_arc_8;
178 break;
179 }
252b5132 180 }
0d2bcfaf 181 return bfd_default_set_arch_mach (abfd, bfd_arch_arc, mach);
252b5132
RH
182}
183
184/* The final processing done just before writing out an ARC ELF object file.
185 This gets the ARC architecture right based on the machine number. */
186
187static void
188arc_elf_final_write_processing (abfd, linker)
189 bfd *abfd;
5f771d47 190 boolean linker ATTRIBUTE_UNUSED;
252b5132 191{
252b5132
RH
192 unsigned long val;
193
0d2bcfaf 194 switch (bfd_get_mach (abfd))
252b5132 195 {
252b5132 196 default:
0d2bcfaf
NC
197 case bfd_mach_arc_5:
198 val = E_ARC_MACH_ARC5;
199 break;
200 case bfd_mach_arc_6:
201 val = E_ARC_MACH_ARC6;
202 break;
203 case bfd_mach_arc_7:
204 val = E_ARC_MACH_ARC7;
205 break;
206 case bfd_mach_arc_8:
207 val = E_ARC_MACH_ARC8;
208 break;
252b5132 209 }
0d2bcfaf 210 elf_elfheader (abfd)->e_machine = EM_ARC;
252b5132
RH
211 elf_elfheader (abfd)->e_flags &=~ EF_ARC_MACH;
212 elf_elfheader (abfd)->e_flags |= val;
213}
214
0d2bcfaf
NC
215#define TARGET_LITTLE_SYM bfd_elf32_littlearc_vec
216#define TARGET_LITTLE_NAME "elf32-littlearc"
217#define TARGET_BIG_SYM bfd_elf32_bigarc_vec
218#define TARGET_BIG_NAME "elf32-bigarc"
219#define ELF_ARCH bfd_arch_arc
220#define ELF_MACHINE_CODE EM_ARC
221#define ELF_MAXPAGESIZE 0x1000
222
223#define elf_info_to_howto 0
224#define elf_info_to_howto_rel arc_info_to_howto_rel
225#define elf_backend_object_p arc_elf_object_p
226#define elf_backend_final_write_processing arc_elf_final_write_processing
252b5132
RH
227
228#include "elf32-target.h"
This page took 0.074543 seconds and 4 git commands to generate.