xref: /dflybsd-src/contrib/binutils-2.34/include/elf/mips.h (revision b52ef7118d1621abed722c5bbbd542210290ecef)
1*fae548d3Szrj /* MIPS ELF support for BFD.
2*fae548d3Szrj    Copyright (C) 1993-2020 Free Software Foundation, Inc.
3*fae548d3Szrj 
4*fae548d3Szrj    By Ian Lance Taylor, Cygnus Support, <ian@cygnus.com>, from
5*fae548d3Szrj    information in the System V Application Binary Interface, MIPS
6*fae548d3Szrj    Processor Supplement.
7*fae548d3Szrj 
8*fae548d3Szrj    This file is part of BFD, the Binary File Descriptor library.
9*fae548d3Szrj 
10*fae548d3Szrj    This program is free software; you can redistribute it and/or modify
11*fae548d3Szrj    it under the terms of the GNU General Public License as published by
12*fae548d3Szrj    the Free Software Foundation; either version 3 of the License, or
13*fae548d3Szrj    (at your option) any later version.
14*fae548d3Szrj 
15*fae548d3Szrj    This program is distributed in the hope that it will be useful,
16*fae548d3Szrj    but WITHOUT ANY WARRANTY; without even the implied warranty of
17*fae548d3Szrj    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*fae548d3Szrj    GNU General Public License for more details.
19*fae548d3Szrj 
20*fae548d3Szrj    You should have received a copy of the GNU General Public License
21*fae548d3Szrj    along with this program; if not, write to the Free Software
22*fae548d3Szrj    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23*fae548d3Szrj    MA 02110-1301, USA.  */
24*fae548d3Szrj 
25*fae548d3Szrj /* This file holds definitions specific to the MIPS ELF ABI.  Note
26*fae548d3Szrj    that most of this is not actually implemented by BFD.  */
27*fae548d3Szrj 
28*fae548d3Szrj #ifndef _ELF_MIPS_H
29*fae548d3Szrj #define _ELF_MIPS_H
30*fae548d3Szrj 
31*fae548d3Szrj #include "elf/reloc-macros.h"
32*fae548d3Szrj 
33*fae548d3Szrj #ifdef __cplusplus
34*fae548d3Szrj extern "C" {
35*fae548d3Szrj #endif
36*fae548d3Szrj 
37*fae548d3Szrj /* Relocation types.  */
38*fae548d3Szrj START_RELOC_NUMBERS (elf_mips_reloc_type)
39*fae548d3Szrj   RELOC_NUMBER (R_MIPS_NONE, 0)
40*fae548d3Szrj   RELOC_NUMBER (R_MIPS_16, 1)
41*fae548d3Szrj   RELOC_NUMBER (R_MIPS_32, 2)		/* In Elf 64: alias R_MIPS_ADD */
42*fae548d3Szrj   RELOC_NUMBER (R_MIPS_REL32, 3)	/* In Elf 64: alias R_MIPS_REL */
43*fae548d3Szrj   RELOC_NUMBER (R_MIPS_26, 4)
44*fae548d3Szrj   RELOC_NUMBER (R_MIPS_HI16, 5)
45*fae548d3Szrj   RELOC_NUMBER (R_MIPS_LO16, 6)
46*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GPREL16, 7)	/* In Elf 64: alias R_MIPS_GPREL */
47*fae548d3Szrj   RELOC_NUMBER (R_MIPS_LITERAL, 8)
48*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GOT16, 9)	/* In Elf 64: alias R_MIPS_GOT */
49*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PC16, 10)
50*fae548d3Szrj   RELOC_NUMBER (R_MIPS_CALL16, 11)	/* In Elf 64: alias R_MIPS_CALL */
51*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GPREL32, 12)
52*fae548d3Szrj   /* The remaining relocs are defined on Irix, although they are not
53*fae548d3Szrj      in the MIPS ELF ABI.  */
54*fae548d3Szrj   RELOC_NUMBER (R_MIPS_UNUSED1, 13)
55*fae548d3Szrj   RELOC_NUMBER (R_MIPS_UNUSED2, 14)
56*fae548d3Szrj   RELOC_NUMBER (R_MIPS_UNUSED3, 15)
57*fae548d3Szrj   RELOC_NUMBER (R_MIPS_SHIFT5, 16)
58*fae548d3Szrj   RELOC_NUMBER (R_MIPS_SHIFT6, 17)
59*fae548d3Szrj   RELOC_NUMBER (R_MIPS_64, 18)
60*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GOT_DISP, 19)
61*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GOT_PAGE, 20)
62*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GOT_OFST, 21)
63*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GOT_HI16, 22)
64*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GOT_LO16, 23)
65*fae548d3Szrj   RELOC_NUMBER (R_MIPS_SUB, 24)
66*fae548d3Szrj   RELOC_NUMBER (R_MIPS_INSERT_A, 25)
67*fae548d3Szrj   RELOC_NUMBER (R_MIPS_INSERT_B, 26)
68*fae548d3Szrj   RELOC_NUMBER (R_MIPS_DELETE, 27)
69*fae548d3Szrj   RELOC_NUMBER (R_MIPS_HIGHER, 28)
70*fae548d3Szrj   RELOC_NUMBER (R_MIPS_HIGHEST, 29)
71*fae548d3Szrj   RELOC_NUMBER (R_MIPS_CALL_HI16, 30)
72*fae548d3Szrj   RELOC_NUMBER (R_MIPS_CALL_LO16, 31)
73*fae548d3Szrj   RELOC_NUMBER (R_MIPS_SCN_DISP, 32)
74*fae548d3Szrj   RELOC_NUMBER (R_MIPS_REL16, 33)
75*fae548d3Szrj   RELOC_NUMBER (R_MIPS_ADD_IMMEDIATE, 34)
76*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PJUMP, 35)
77*fae548d3Szrj   RELOC_NUMBER (R_MIPS_RELGOT, 36)
78*fae548d3Szrj   RELOC_NUMBER (R_MIPS_JALR, 37)
79*fae548d3Szrj   /* TLS relocations.  */
80*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_DTPMOD32, 38)
81*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_DTPREL32, 39)
82*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_DTPMOD64, 40)
83*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_DTPREL64, 41)
84*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_GD, 42)
85*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_LDM, 43)
86*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_DTPREL_HI16, 44)
87*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_DTPREL_LO16, 45)
88*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_GOTTPREL, 46)
89*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_TPREL32, 47)
90*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_TPREL64, 48)
91*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_TPREL_HI16, 49)
92*fae548d3Szrj   RELOC_NUMBER (R_MIPS_TLS_TPREL_LO16, 50)
93*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GLOB_DAT, 51)
94*fae548d3Szrj   /* Space to grow */
95*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PC21_S2, 60)
96*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PC26_S2, 61)
97*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PC18_S3, 62)
98*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PC19_S2, 63)
99*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PCHI16, 64)
100*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PCLO16, 65)
101*fae548d3Szrj   FAKE_RELOC (R_MIPS_max, 66)
102*fae548d3Szrj   /* These relocs are used for the mips16.  */
103*fae548d3Szrj   FAKE_RELOC (R_MIPS16_min, 100)
104*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_26, 100)
105*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_GPREL, 101)
106*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_GOT16, 102)
107*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_CALL16, 103)
108*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_HI16, 104)
109*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_LO16, 105)
110*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_TLS_GD, 106)
111*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_TLS_LDM, 107)
112*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_TLS_DTPREL_HI16, 108)
113*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_TLS_DTPREL_LO16, 109)
114*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_TLS_GOTTPREL, 110)
115*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_TLS_TPREL_HI16, 111)
116*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_TLS_TPREL_LO16, 112)
117*fae548d3Szrj   RELOC_NUMBER (R_MIPS16_PC16_S1, 113)
118*fae548d3Szrj   FAKE_RELOC (R_MIPS16_max, 114)
119*fae548d3Szrj   /* These relocations are specific to VxWorks.  */
120*fae548d3Szrj   RELOC_NUMBER (R_MIPS_COPY, 126)
121*fae548d3Szrj   RELOC_NUMBER (R_MIPS_JUMP_SLOT, 127)
122*fae548d3Szrj 
123*fae548d3Szrj   /* These relocations are specific to microMIPS.  */
124*fae548d3Szrj   FAKE_RELOC (R_MICROMIPS_min, 130)
125*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_26_S1, 133)
126*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_HI16, 134)
127*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_LO16, 135)
128*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_GPREL16, 136)	/* In Elf 64:
129*fae548d3Szrj 						   alias R_MICROMIPS_GPREL */
130*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_LITERAL, 137)
131*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_GOT16, 138)		/* In Elf 64:
132*fae548d3Szrj 						   alias R_MICROMIPS_GOT */
133*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_PC7_S1, 139)
134*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_PC10_S1, 140)
135*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_PC16_S1, 141)
136*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_CALL16, 142)	/* In Elf 64:
137*fae548d3Szrj 						   alias R_MICROMIPS_CALL */
138*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_GOT_DISP, 145)
139*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_GOT_PAGE, 146)
140*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_GOT_OFST, 147)
141*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_GOT_HI16, 148)
142*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_GOT_LO16, 149)
143*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_SUB, 150)
144*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_HIGHER, 151)
145*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_HIGHEST, 152)
146*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_CALL_HI16, 153)
147*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_CALL_LO16, 154)
148*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_SCN_DISP, 155)
149*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_JALR, 156)
150*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_HI0_LO16, 157)
151*fae548d3Szrj   /* TLS relocations.  */
152*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_TLS_GD, 162)
153*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_TLS_LDM, 163)
154*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_TLS_DTPREL_HI16, 164)
155*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_TLS_DTPREL_LO16, 165)
156*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_TLS_GOTTPREL, 166)
157*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_TLS_TPREL_HI16, 169)
158*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_TLS_TPREL_LO16, 170)
159*fae548d3Szrj   /* microMIPS GP- and PC-relative relocations. */
160*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_GPREL7_S2, 172)
161*fae548d3Szrj   RELOC_NUMBER (R_MICROMIPS_PC23_S2, 173)
162*fae548d3Szrj   FAKE_RELOC (R_MICROMIPS_max, 174)
163*fae548d3Szrj 
164*fae548d3Szrj   /* This was a GNU extension used by embedded-PIC.  It was co-opted by
165*fae548d3Szrj      mips-linux for exception-handling data.  GCC stopped using it in
166*fae548d3Szrj      May, 2004, then started using it again for compact unwind tables.  */
167*fae548d3Szrj   RELOC_NUMBER (R_MIPS_PC32, 248)
168*fae548d3Szrj   RELOC_NUMBER (R_MIPS_EH, 249)
169*fae548d3Szrj   /* FIXME: this relocation is used internally by gas.  */
170*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GNU_REL16_S2, 250)
171*fae548d3Szrj   /* These are GNU extensions to enable C++ vtable garbage collection.  */
172*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GNU_VTINHERIT, 253)
173*fae548d3Szrj   RELOC_NUMBER (R_MIPS_GNU_VTENTRY, 254)
174*fae548d3Szrj END_RELOC_NUMBERS (R_MIPS_maxext)
175*fae548d3Szrj 
176*fae548d3Szrj /* Processor specific flags for the ELF header e_flags field.  */
177*fae548d3Szrj 
178*fae548d3Szrj /* At least one .noreorder directive appears in the source.  */
179*fae548d3Szrj #define EF_MIPS_NOREORDER	0x00000001
180*fae548d3Szrj 
181*fae548d3Szrj /* File contains position independent code.  */
182*fae548d3Szrj #define EF_MIPS_PIC		0x00000002
183*fae548d3Szrj 
184*fae548d3Szrj /* Code in file uses the standard calling sequence for calling
185*fae548d3Szrj    position independent code.  */
186*fae548d3Szrj #define EF_MIPS_CPIC		0x00000004
187*fae548d3Szrj 
188*fae548d3Szrj /* ???  Unknown flag, set in IRIX 6's BSDdup2.o in libbsd.a.  */
189*fae548d3Szrj #define EF_MIPS_XGOT		0x00000008
190*fae548d3Szrj 
191*fae548d3Szrj /* Code in file uses UCODE (obsolete) */
192*fae548d3Szrj #define EF_MIPS_UCODE		0x00000010
193*fae548d3Szrj 
194*fae548d3Szrj /* Code in file uses new ABI (-n32 on Irix 6).  */
195*fae548d3Szrj #define EF_MIPS_ABI2		0x00000020
196*fae548d3Szrj 
197*fae548d3Szrj /* Process the .MIPS.options section first by ld */
198*fae548d3Szrj #define EF_MIPS_OPTIONS_FIRST	0x00000080
199*fae548d3Szrj 
200*fae548d3Szrj /* Indicates code compiled for a 64-bit machine in 32-bit mode
201*fae548d3Szrj    (regs are 32-bits wide).  */
202*fae548d3Szrj #define EF_MIPS_32BITMODE	0x00000100
203*fae548d3Szrj 
204*fae548d3Szrj /* 32-bit machine but FP registers are 64 bit (-mfp64).  */
205*fae548d3Szrj #define EF_MIPS_FP64		0x00000200
206*fae548d3Szrj 
207*fae548d3Szrj /* Code in file uses the IEEE 754-2008 NaN encoding convention.  */
208*fae548d3Szrj #define EF_MIPS_NAN2008		0x00000400
209*fae548d3Szrj 
210*fae548d3Szrj /* Architectural Extensions used by this file */
211*fae548d3Szrj #define EF_MIPS_ARCH_ASE	0x0f000000
212*fae548d3Szrj 
213*fae548d3Szrj /* Use MDMX multimedia extensions */
214*fae548d3Szrj #define EF_MIPS_ARCH_ASE_MDMX	0x08000000
215*fae548d3Szrj 
216*fae548d3Szrj /* Use MIPS-16 ISA extensions */
217*fae548d3Szrj #define EF_MIPS_ARCH_ASE_M16	0x04000000
218*fae548d3Szrj 
219*fae548d3Szrj /* Use MICROMIPS ISA extensions.  */
220*fae548d3Szrj #define EF_MIPS_ARCH_ASE_MICROMIPS	0x02000000
221*fae548d3Szrj 
222*fae548d3Szrj /* Four bit MIPS architecture field.  */
223*fae548d3Szrj #define EF_MIPS_ARCH		0xf0000000
224*fae548d3Szrj 
225*fae548d3Szrj /* -mips1 code.  */
226*fae548d3Szrj #define E_MIPS_ARCH_1		0x00000000
227*fae548d3Szrj 
228*fae548d3Szrj /* -mips2 code.  */
229*fae548d3Szrj #define E_MIPS_ARCH_2		0x10000000
230*fae548d3Szrj 
231*fae548d3Szrj /* -mips3 code.  */
232*fae548d3Szrj #define E_MIPS_ARCH_3		0x20000000
233*fae548d3Szrj 
234*fae548d3Szrj /* -mips4 code.  */
235*fae548d3Szrj #define E_MIPS_ARCH_4		0x30000000
236*fae548d3Szrj 
237*fae548d3Szrj /* -mips5 code.  */
238*fae548d3Szrj #define E_MIPS_ARCH_5           0x40000000
239*fae548d3Szrj 
240*fae548d3Szrj /* -mips32 code.  */
241*fae548d3Szrj #define E_MIPS_ARCH_32          0x50000000
242*fae548d3Szrj 
243*fae548d3Szrj /* -mips64 code.  */
244*fae548d3Szrj #define E_MIPS_ARCH_64          0x60000000
245*fae548d3Szrj 
246*fae548d3Szrj /* -mips32r2 code.  */
247*fae548d3Szrj #define E_MIPS_ARCH_32R2        0x70000000
248*fae548d3Szrj 
249*fae548d3Szrj /* -mips64r2 code.  */
250*fae548d3Szrj #define E_MIPS_ARCH_64R2        0x80000000
251*fae548d3Szrj 
252*fae548d3Szrj /* -mips32r6 code.  */
253*fae548d3Szrj #define E_MIPS_ARCH_32R6        0x90000000
254*fae548d3Szrj 
255*fae548d3Szrj /* -mips64r6 code.  */
256*fae548d3Szrj #define E_MIPS_ARCH_64R6        0xa0000000
257*fae548d3Szrj 
258*fae548d3Szrj /* The ABI of the file.  Also see EF_MIPS_ABI2 above. */
259*fae548d3Szrj #define EF_MIPS_ABI		0x0000F000
260*fae548d3Szrj 
261*fae548d3Szrj /* The original o32 abi. */
262*fae548d3Szrj #define E_MIPS_ABI_O32          0x00001000
263*fae548d3Szrj 
264*fae548d3Szrj /* O32 extended to work on 64 bit architectures */
265*fae548d3Szrj #define E_MIPS_ABI_O64          0x00002000
266*fae548d3Szrj 
267*fae548d3Szrj /* EABI in 32 bit mode */
268*fae548d3Szrj #define E_MIPS_ABI_EABI32       0x00003000
269*fae548d3Szrj 
270*fae548d3Szrj /* EABI in 64 bit mode */
271*fae548d3Szrj #define E_MIPS_ABI_EABI64       0x00004000
272*fae548d3Szrj 
273*fae548d3Szrj 
274*fae548d3Szrj /* Machine variant if we know it.  This field was invented at Cygnus,
275*fae548d3Szrj    but it is hoped that other vendors will adopt it.  If some standard
276*fae548d3Szrj    is developed, this code should be changed to follow it. */
277*fae548d3Szrj 
278*fae548d3Szrj #define EF_MIPS_MACH		0x00FF0000
279*fae548d3Szrj 
280*fae548d3Szrj /* Cygnus is choosing values between 80 and 9F;
281*fae548d3Szrj    00 - 7F should be left for a future standard;
282*fae548d3Szrj    the rest are open. */
283*fae548d3Szrj 
284*fae548d3Szrj #define E_MIPS_MACH_3900	0x00810000
285*fae548d3Szrj #define E_MIPS_MACH_4010	0x00820000
286*fae548d3Szrj #define E_MIPS_MACH_4100	0x00830000
287*fae548d3Szrj #define E_MIPS_MACH_4650	0x00850000
288*fae548d3Szrj #define E_MIPS_MACH_4120	0x00870000
289*fae548d3Szrj #define E_MIPS_MACH_4111	0x00880000
290*fae548d3Szrj #define E_MIPS_MACH_SB1         0x008a0000
291*fae548d3Szrj #define E_MIPS_MACH_OCTEON	0x008b0000
292*fae548d3Szrj #define E_MIPS_MACH_XLR     	0x008c0000
293*fae548d3Szrj #define E_MIPS_MACH_OCTEON2	0x008d0000
294*fae548d3Szrj #define E_MIPS_MACH_OCTEON3	0x008e0000
295*fae548d3Szrj #define E_MIPS_MACH_5400	0x00910000
296*fae548d3Szrj #define E_MIPS_MACH_5900	0x00920000
297*fae548d3Szrj #define E_MIPS_MACH_IAMR2	0x00930000
298*fae548d3Szrj #define E_MIPS_MACH_5500	0x00980000
299*fae548d3Szrj #define E_MIPS_MACH_9000	0x00990000
300*fae548d3Szrj #define E_MIPS_MACH_LS2E        0x00A00000
301*fae548d3Szrj #define E_MIPS_MACH_LS2F        0x00A10000
302*fae548d3Szrj #define E_MIPS_MACH_GS464       0x00A20000
303*fae548d3Szrj #define E_MIPS_MACH_GS464E	0x00A30000
304*fae548d3Szrj #define E_MIPS_MACH_GS264E	0x00A40000
305*fae548d3Szrj 
306*fae548d3Szrj /* Processor specific section indices.  These sections do not actually
307*fae548d3Szrj    exist.  Symbols with a st_shndx field corresponding to one of these
308*fae548d3Szrj    values have a special meaning.  */
309*fae548d3Szrj 
310*fae548d3Szrj /* Defined and allocated common symbol.  Value is virtual address.  If
311*fae548d3Szrj    relocated, alignment must be preserved.  */
312*fae548d3Szrj #define SHN_MIPS_ACOMMON	SHN_LORESERVE
313*fae548d3Szrj 
314*fae548d3Szrj /* Defined and allocated text symbol.  Value is virtual address.
315*fae548d3Szrj    Occur in the dynamic symbol table of Alpha OSF/1 and Irix 5 executables.  */
316*fae548d3Szrj #define SHN_MIPS_TEXT		(SHN_LORESERVE + 1)
317*fae548d3Szrj 
318*fae548d3Szrj /* Defined and allocated data symbol.  Value is virtual address.
319*fae548d3Szrj    Occur in the dynamic symbol table of Alpha OSF/1 and Irix 5 executables.  */
320*fae548d3Szrj #define SHN_MIPS_DATA		(SHN_LORESERVE + 2)
321*fae548d3Szrj 
322*fae548d3Szrj /* Small common symbol.  */
323*fae548d3Szrj #define SHN_MIPS_SCOMMON	(SHN_LORESERVE + 3)
324*fae548d3Szrj 
325*fae548d3Szrj /* Small undefined symbol.  */
326*fae548d3Szrj #define SHN_MIPS_SUNDEFINED	(SHN_LORESERVE + 4)
327*fae548d3Szrj 
328*fae548d3Szrj /* Processor specific section types.  */
329*fae548d3Szrj 
330*fae548d3Szrj /* Section contains the set of dynamic shared objects used when
331*fae548d3Szrj    statically linking.  */
332*fae548d3Szrj #define SHT_MIPS_LIBLIST	0x70000000
333*fae548d3Szrj 
334*fae548d3Szrj /* I'm not sure what this is, but it's used on Irix 5.  */
335*fae548d3Szrj #define SHT_MIPS_MSYM		0x70000001
336*fae548d3Szrj 
337*fae548d3Szrj /* Section contains list of symbols whose definitions conflict with
338*fae548d3Szrj    symbols defined in shared objects.  */
339*fae548d3Szrj #define SHT_MIPS_CONFLICT	0x70000002
340*fae548d3Szrj 
341*fae548d3Szrj /* Section contains the global pointer table.  */
342*fae548d3Szrj #define SHT_MIPS_GPTAB		0x70000003
343*fae548d3Szrj 
344*fae548d3Szrj /* Section contains microcode information.  The exact format is
345*fae548d3Szrj    unspecified.  */
346*fae548d3Szrj #define SHT_MIPS_UCODE		0x70000004
347*fae548d3Szrj 
348*fae548d3Szrj /* Section contains some sort of debugging information.  The exact
349*fae548d3Szrj    format is unspecified.  It's probably ECOFF symbols.  */
350*fae548d3Szrj #define SHT_MIPS_DEBUG		0x70000005
351*fae548d3Szrj 
352*fae548d3Szrj /* Section contains register usage information.  */
353*fae548d3Szrj #define SHT_MIPS_REGINFO	0x70000006
354*fae548d3Szrj 
355*fae548d3Szrj /* ??? */
356*fae548d3Szrj #define SHT_MIPS_PACKAGE	0x70000007
357*fae548d3Szrj 
358*fae548d3Szrj /* ??? */
359*fae548d3Szrj #define SHT_MIPS_PACKSYM	0x70000008
360*fae548d3Szrj 
361*fae548d3Szrj /* ??? */
362*fae548d3Szrj #define SHT_MIPS_RELD		0x70000009
363*fae548d3Szrj 
364*fae548d3Szrj /* Section contains interface information.  */
365*fae548d3Szrj #define SHT_MIPS_IFACE		0x7000000b
366*fae548d3Szrj 
367*fae548d3Szrj /* Section contains description of contents of another section.  */
368*fae548d3Szrj #define SHT_MIPS_CONTENT	0x7000000c
369*fae548d3Szrj 
370*fae548d3Szrj /* Section contains miscellaneous options.  */
371*fae548d3Szrj #define SHT_MIPS_OPTIONS	0x7000000d
372*fae548d3Szrj 
373*fae548d3Szrj /* ??? */
374*fae548d3Szrj #define SHT_MIPS_SHDR		0x70000010
375*fae548d3Szrj 
376*fae548d3Szrj /* ??? */
377*fae548d3Szrj #define SHT_MIPS_FDESC		0x70000011
378*fae548d3Szrj 
379*fae548d3Szrj /* ??? */
380*fae548d3Szrj #define SHT_MIPS_EXTSYM		0x70000012
381*fae548d3Szrj 
382*fae548d3Szrj /* ??? */
383*fae548d3Szrj #define SHT_MIPS_DENSE		0x70000013
384*fae548d3Szrj 
385*fae548d3Szrj /* ??? */
386*fae548d3Szrj #define SHT_MIPS_PDESC		0x70000014
387*fae548d3Szrj 
388*fae548d3Szrj /* ??? */
389*fae548d3Szrj #define SHT_MIPS_LOCSYM		0x70000015
390*fae548d3Szrj 
391*fae548d3Szrj /* ??? */
392*fae548d3Szrj #define SHT_MIPS_AUXSYM		0x70000016
393*fae548d3Szrj 
394*fae548d3Szrj /* ??? */
395*fae548d3Szrj #define SHT_MIPS_OPTSYM		0x70000017
396*fae548d3Szrj 
397*fae548d3Szrj /* ??? */
398*fae548d3Szrj #define SHT_MIPS_LOCSTR		0x70000018
399*fae548d3Szrj 
400*fae548d3Szrj /* ??? */
401*fae548d3Szrj #define SHT_MIPS_LINE		0x70000019
402*fae548d3Szrj 
403*fae548d3Szrj /* ??? */
404*fae548d3Szrj #define SHT_MIPS_RFDESC		0x7000001a
405*fae548d3Szrj 
406*fae548d3Szrj /* Delta C++: symbol table */
407*fae548d3Szrj #define SHT_MIPS_DELTASYM	0x7000001b
408*fae548d3Szrj 
409*fae548d3Szrj /* Delta C++: instance table */
410*fae548d3Szrj #define SHT_MIPS_DELTAINST	0x7000001c
411*fae548d3Szrj 
412*fae548d3Szrj /* Delta C++: class table */
413*fae548d3Szrj #define SHT_MIPS_DELTACLASS	0x7000001d
414*fae548d3Szrj 
415*fae548d3Szrj /* DWARF debugging section.  */
416*fae548d3Szrj #define SHT_MIPS_DWARF		0x7000001e
417*fae548d3Szrj 
418*fae548d3Szrj /* Delta C++: declarations */
419*fae548d3Szrj #define SHT_MIPS_DELTADECL	0x7000001f
420*fae548d3Szrj 
421*fae548d3Szrj /* List of libraries the binary depends on.  Includes a time stamp, version
422*fae548d3Szrj    number.  */
423*fae548d3Szrj #define SHT_MIPS_SYMBOL_LIB	0x70000020
424*fae548d3Szrj 
425*fae548d3Szrj /* Events section.  */
426*fae548d3Szrj #define SHT_MIPS_EVENTS		0x70000021
427*fae548d3Szrj 
428*fae548d3Szrj /* ??? */
429*fae548d3Szrj #define SHT_MIPS_TRANSLATE	0x70000022
430*fae548d3Szrj 
431*fae548d3Szrj /* Special pixie sections */
432*fae548d3Szrj #define SHT_MIPS_PIXIE		0x70000023
433*fae548d3Szrj 
434*fae548d3Szrj /* Address translation table (for debug info) */
435*fae548d3Szrj #define SHT_MIPS_XLATE		0x70000024
436*fae548d3Szrj 
437*fae548d3Szrj /* SGI internal address translation table (for debug info) */
438*fae548d3Szrj #define SHT_MIPS_XLATE_DEBUG	0x70000025
439*fae548d3Szrj 
440*fae548d3Szrj /* Intermediate code */
441*fae548d3Szrj #define SHT_MIPS_WHIRL		0x70000026
442*fae548d3Szrj 
443*fae548d3Szrj /* C++ exception handling region info */
444*fae548d3Szrj #define SHT_MIPS_EH_REGION	0x70000027
445*fae548d3Szrj 
446*fae548d3Szrj /* Obsolete address translation table (for debug info) */
447*fae548d3Szrj #define SHT_MIPS_XLATE_OLD	0x70000028
448*fae548d3Szrj 
449*fae548d3Szrj /* Runtime procedure descriptor table exception information (ucode) ??? */
450*fae548d3Szrj #define SHT_MIPS_PDR_EXCEPTION	0x70000029
451*fae548d3Szrj 
452*fae548d3Szrj /* ABI related flags section.  */
453*fae548d3Szrj #define SHT_MIPS_ABIFLAGS	0x7000002a
454*fae548d3Szrj 
455*fae548d3Szrj /* GNU style symbol hash table with xlat.  */
456*fae548d3Szrj #define SHT_MIPS_XHASH		0x7000002b
457*fae548d3Szrj 
458*fae548d3Szrj /* A section of type SHT_MIPS_LIBLIST contains an array of the
459*fae548d3Szrj    following structure.  The sh_link field is the section index of the
460*fae548d3Szrj    string table.  The sh_info field is the number of entries in the
461*fae548d3Szrj    section.  */
462*fae548d3Szrj typedef struct
463*fae548d3Szrj {
464*fae548d3Szrj   /* String table index for name of shared object.  */
465*fae548d3Szrj   unsigned long l_name;
466*fae548d3Szrj   /* Time stamp.  */
467*fae548d3Szrj   unsigned long l_time_stamp;
468*fae548d3Szrj   /* Checksum of symbol names and common sizes.  */
469*fae548d3Szrj   unsigned long l_checksum;
470*fae548d3Szrj   /* String table index for version.  */
471*fae548d3Szrj   unsigned long l_version;
472*fae548d3Szrj   /* Flags.  */
473*fae548d3Szrj   unsigned long l_flags;
474*fae548d3Szrj } Elf32_Lib;
475*fae548d3Szrj 
476*fae548d3Szrj /* The external version of Elf32_Lib.  */
477*fae548d3Szrj typedef struct
478*fae548d3Szrj {
479*fae548d3Szrj   unsigned char l_name[4];
480*fae548d3Szrj   unsigned char l_time_stamp[4];
481*fae548d3Szrj   unsigned char l_checksum[4];
482*fae548d3Szrj   unsigned char l_version[4];
483*fae548d3Szrj   unsigned char l_flags[4];
484*fae548d3Szrj } Elf32_External_Lib;
485*fae548d3Szrj 
486*fae548d3Szrj /* The l_flags field of an Elf32_Lib structure may contain the
487*fae548d3Szrj    following flags.  */
488*fae548d3Szrj 
489*fae548d3Szrj /* Require an exact match at runtime.  */
490*fae548d3Szrj #define LL_EXACT_MATCH		0x00000001
491*fae548d3Szrj 
492*fae548d3Szrj /* Ignore version incompatibilities at runtime.  */
493*fae548d3Szrj #define LL_IGNORE_INT_VER	0x00000002
494*fae548d3Szrj 
495*fae548d3Szrj /* Require matching minor version number.  */
496*fae548d3Szrj #define LL_REQUIRE_MINOR	0x00000004
497*fae548d3Szrj 
498*fae548d3Szrj /* ??? */
499*fae548d3Szrj #define LL_EXPORTS		0x00000008
500*fae548d3Szrj 
501*fae548d3Szrj /* Delay loading of this library until really needed.  */
502*fae548d3Szrj #define LL_DELAY_LOAD		0x00000010
503*fae548d3Szrj 
504*fae548d3Szrj /* ??? Delta C++ stuff ??? */
505*fae548d3Szrj #define LL_DELTA		0x00000020
506*fae548d3Szrj 
507*fae548d3Szrj 
508*fae548d3Szrj /* A section of type SHT_MIPS_CONFLICT is an array of indices into the
509*fae548d3Szrj    .dynsym section.  Each element has the following type.  */
510*fae548d3Szrj typedef unsigned long Elf32_Conflict;
511*fae548d3Szrj typedef unsigned char Elf32_External_Conflict[4];
512*fae548d3Szrj 
513*fae548d3Szrj typedef unsigned long Elf64_Conflict;
514*fae548d3Szrj typedef unsigned char Elf64_External_Conflict[8];
515*fae548d3Szrj 
516*fae548d3Szrj /* A section of type SHT_MIPS_GPTAB contains information about how
517*fae548d3Szrj    much GP space would be required for different -G arguments.  This
518*fae548d3Szrj    information is only used so that the linker can provide informative
519*fae548d3Szrj    suggestions as to the best -G value to use.  The sh_info field is
520*fae548d3Szrj    the index of the section for which this information applies.  The
521*fae548d3Szrj    contents of the section are an array of the following union.  The
522*fae548d3Szrj    first element uses the gt_header field.  The remaining elements use
523*fae548d3Szrj    the gt_entry field.  */
524*fae548d3Szrj typedef union
525*fae548d3Szrj {
526*fae548d3Szrj   struct
527*fae548d3Szrj     {
528*fae548d3Szrj       /* -G value actually used for this object file.  */
529*fae548d3Szrj       unsigned long gt_current_g_value;
530*fae548d3Szrj       /* Unused.  */
531*fae548d3Szrj       unsigned long gt_unused;
532*fae548d3Szrj     } gt_header;
533*fae548d3Szrj   struct
534*fae548d3Szrj     {
535*fae548d3Szrj       /* If this -G argument has been used...  */
536*fae548d3Szrj       unsigned long gt_g_value;
537*fae548d3Szrj       /* ...this many GP section bytes would be required.  */
538*fae548d3Szrj       unsigned long gt_bytes;
539*fae548d3Szrj     } gt_entry;
540*fae548d3Szrj } Elf32_gptab;
541*fae548d3Szrj 
542*fae548d3Szrj /* The external version of Elf32_gptab.  */
543*fae548d3Szrj 
544*fae548d3Szrj typedef union
545*fae548d3Szrj {
546*fae548d3Szrj   struct
547*fae548d3Szrj     {
548*fae548d3Szrj       unsigned char gt_current_g_value[4];
549*fae548d3Szrj       unsigned char gt_unused[4];
550*fae548d3Szrj     } gt_header;
551*fae548d3Szrj   struct
552*fae548d3Szrj     {
553*fae548d3Szrj       unsigned char gt_g_value[4];
554*fae548d3Szrj       unsigned char gt_bytes[4];
555*fae548d3Szrj     } gt_entry;
556*fae548d3Szrj } Elf32_External_gptab;
557*fae548d3Szrj 
558*fae548d3Szrj /* A section of type SHT_MIPS_REGINFO contains the following
559*fae548d3Szrj    structure.  */
560*fae548d3Szrj typedef struct
561*fae548d3Szrj {
562*fae548d3Szrj   /* Mask of general purpose registers used.  */
563*fae548d3Szrj   unsigned long ri_gprmask;
564*fae548d3Szrj   /* Mask of co-processor registers used.  */
565*fae548d3Szrj   unsigned long ri_cprmask[4];
566*fae548d3Szrj   /* GP register value for this object file.  */
567*fae548d3Szrj   long ri_gp_value;
568*fae548d3Szrj } Elf32_RegInfo;
569*fae548d3Szrj 
570*fae548d3Szrj /* The external version of the Elf_RegInfo structure.  */
571*fae548d3Szrj typedef struct
572*fae548d3Szrj {
573*fae548d3Szrj   unsigned char ri_gprmask[4];
574*fae548d3Szrj   unsigned char ri_cprmask[4][4];
575*fae548d3Szrj   unsigned char ri_gp_value[4];
576*fae548d3Szrj } Elf32_External_RegInfo;
577*fae548d3Szrj 
578*fae548d3Szrj /* MIPS ELF .reginfo swapping routines.  */
579*fae548d3Szrj extern void bfd_mips_elf32_swap_reginfo_in
580*fae548d3Szrj   (bfd *, const Elf32_External_RegInfo *, Elf32_RegInfo *);
581*fae548d3Szrj extern void bfd_mips_elf32_swap_reginfo_out
582*fae548d3Szrj   (bfd *, const Elf32_RegInfo *, Elf32_External_RegInfo *);
583*fae548d3Szrj 
584*fae548d3Szrj /* Processor specific section flags.  */
585*fae548d3Szrj 
586*fae548d3Szrj /* This section must be in the global data area.  */
587*fae548d3Szrj #define SHF_MIPS_GPREL		0x10000000
588*fae548d3Szrj 
589*fae548d3Szrj /* This section should be merged.  */
590*fae548d3Szrj #define SHF_MIPS_MERGE		0x20000000
591*fae548d3Szrj 
592*fae548d3Szrj /* This section contains address data of size implied by section
593*fae548d3Szrj    element size.  */
594*fae548d3Szrj #define SHF_MIPS_ADDR		0x40000000
595*fae548d3Szrj 
596*fae548d3Szrj /* This section contains string data.  */
597*fae548d3Szrj #define SHF_MIPS_STRING		0x80000000
598*fae548d3Szrj 
599*fae548d3Szrj /* This section may not be stripped.  */
600*fae548d3Szrj #define SHF_MIPS_NOSTRIP	0x08000000
601*fae548d3Szrj 
602*fae548d3Szrj /* This section is local to threads.  */
603*fae548d3Szrj #define SHF_MIPS_LOCAL		0x04000000
604*fae548d3Szrj 
605*fae548d3Szrj /* Linker should generate implicit weak names for this section.  */
606*fae548d3Szrj #define SHF_MIPS_NAMES		0x02000000
607*fae548d3Szrj 
608*fae548d3Szrj /* Section contais text/data which may be replicated in other sections.
609*fae548d3Szrj    Linker should retain only one copy.  */
610*fae548d3Szrj #define SHF_MIPS_NODUPES	0x01000000
611*fae548d3Szrj 
612*fae548d3Szrj /* Processor specific program header types.  */
613*fae548d3Szrj 
614*fae548d3Szrj /* Register usage information.  Identifies one .reginfo section.  */
615*fae548d3Szrj #define PT_MIPS_REGINFO		0x70000000
616*fae548d3Szrj 
617*fae548d3Szrj /* Runtime procedure table.  */
618*fae548d3Szrj #define PT_MIPS_RTPROC		0x70000001
619*fae548d3Szrj 
620*fae548d3Szrj /* .MIPS.options section.  */
621*fae548d3Szrj #define PT_MIPS_OPTIONS		0x70000002
622*fae548d3Szrj 
623*fae548d3Szrj /* Records ABI related flags.  */
624*fae548d3Szrj #define PT_MIPS_ABIFLAGS	0x70000003
625*fae548d3Szrj 
626*fae548d3Szrj /* Processor specific dynamic array tags.  */
627*fae548d3Szrj 
628*fae548d3Szrj /* 32 bit version number for runtime linker interface.  */
629*fae548d3Szrj #define DT_MIPS_RLD_VERSION	0x70000001
630*fae548d3Szrj 
631*fae548d3Szrj /* Time stamp.  */
632*fae548d3Szrj #define DT_MIPS_TIME_STAMP	0x70000002
633*fae548d3Szrj 
634*fae548d3Szrj /* Checksum of external strings and common sizes.  */
635*fae548d3Szrj #define DT_MIPS_ICHECKSUM	0x70000003
636*fae548d3Szrj 
637*fae548d3Szrj /* Index of version string in string table.  */
638*fae548d3Szrj #define DT_MIPS_IVERSION	0x70000004
639*fae548d3Szrj 
640*fae548d3Szrj /* 32 bits of flags.  */
641*fae548d3Szrj #define DT_MIPS_FLAGS		0x70000005
642*fae548d3Szrj 
643*fae548d3Szrj /* Base address of the segment.  */
644*fae548d3Szrj #define DT_MIPS_BASE_ADDRESS	0x70000006
645*fae548d3Szrj 
646*fae548d3Szrj /* ??? */
647*fae548d3Szrj #define DT_MIPS_MSYM		0x70000007
648*fae548d3Szrj 
649*fae548d3Szrj /* Address of .conflict section.  */
650*fae548d3Szrj #define DT_MIPS_CONFLICT	0x70000008
651*fae548d3Szrj 
652*fae548d3Szrj /* Address of .liblist section.  */
653*fae548d3Szrj #define DT_MIPS_LIBLIST		0x70000009
654*fae548d3Szrj 
655*fae548d3Szrj /* Number of local global offset table entries.  */
656*fae548d3Szrj #define DT_MIPS_LOCAL_GOTNO	0x7000000a
657*fae548d3Szrj 
658*fae548d3Szrj /* Number of entries in the .conflict section.  */
659*fae548d3Szrj #define DT_MIPS_CONFLICTNO	0x7000000b
660*fae548d3Szrj 
661*fae548d3Szrj /* Number of entries in the .liblist section.  */
662*fae548d3Szrj #define DT_MIPS_LIBLISTNO	0x70000010
663*fae548d3Szrj 
664*fae548d3Szrj /* Number of entries in the .dynsym section.  */
665*fae548d3Szrj #define DT_MIPS_SYMTABNO	0x70000011
666*fae548d3Szrj 
667*fae548d3Szrj /* Index of first external dynamic symbol not referenced locally.  */
668*fae548d3Szrj #define DT_MIPS_UNREFEXTNO	0x70000012
669*fae548d3Szrj 
670*fae548d3Szrj /* Index of first dynamic symbol in global offset table.  */
671*fae548d3Szrj #define DT_MIPS_GOTSYM		0x70000013
672*fae548d3Szrj 
673*fae548d3Szrj /* Number of page table entries in global offset table.  */
674*fae548d3Szrj #define DT_MIPS_HIPAGENO	0x70000014
675*fae548d3Szrj 
676*fae548d3Szrj /* Address of run time loader map, used for debugging.  */
677*fae548d3Szrj #define DT_MIPS_RLD_MAP		0x70000016
678*fae548d3Szrj 
679*fae548d3Szrj /* Delta C++ class definition.  */
680*fae548d3Szrj #define DT_MIPS_DELTA_CLASS	0x70000017
681*fae548d3Szrj 
682*fae548d3Szrj /* Number of entries in DT_MIPS_DELTA_CLASS.  */
683*fae548d3Szrj #define DT_MIPS_DELTA_CLASS_NO	0x70000018
684*fae548d3Szrj 
685*fae548d3Szrj /* Delta C++ class instances.  */
686*fae548d3Szrj #define DT_MIPS_DELTA_INSTANCE	0x70000019
687*fae548d3Szrj 
688*fae548d3Szrj /* Number of entries in DT_MIPS_DELTA_INSTANCE.  */
689*fae548d3Szrj #define DT_MIPS_DELTA_INSTANCE_NO	0x7000001a
690*fae548d3Szrj 
691*fae548d3Szrj /* Delta relocations.  */
692*fae548d3Szrj #define DT_MIPS_DELTA_RELOC	0x7000001b
693*fae548d3Szrj 
694*fae548d3Szrj /* Number of entries in DT_MIPS_DELTA_RELOC.  */
695*fae548d3Szrj #define DT_MIPS_DELTA_RELOC_NO	0x7000001c
696*fae548d3Szrj 
697*fae548d3Szrj /* Delta symbols that Delta relocations refer to.  */
698*fae548d3Szrj #define DT_MIPS_DELTA_SYM	0x7000001d
699*fae548d3Szrj 
700*fae548d3Szrj /* Number of entries in DT_MIPS_DELTA_SYM.  */
701*fae548d3Szrj #define DT_MIPS_DELTA_SYM_NO	0x7000001e
702*fae548d3Szrj 
703*fae548d3Szrj /* Delta symbols that hold class declarations.  */
704*fae548d3Szrj #define DT_MIPS_DELTA_CLASSSYM	0x70000020
705*fae548d3Szrj 
706*fae548d3Szrj /* Number of entries in DT_MIPS_DELTA_CLASSSYM.  */
707*fae548d3Szrj #define DT_MIPS_DELTA_CLASSSYM_NO	0x70000021
708*fae548d3Szrj 
709*fae548d3Szrj /* Flags indicating information about C++ flavor.  */
710*fae548d3Szrj #define DT_MIPS_CXX_FLAGS	0x70000022
711*fae548d3Szrj 
712*fae548d3Szrj /* Pixie information (???).  */
713*fae548d3Szrj #define DT_MIPS_PIXIE_INIT	0x70000023
714*fae548d3Szrj 
715*fae548d3Szrj /* Address of .MIPS.symlib */
716*fae548d3Szrj #define DT_MIPS_SYMBOL_LIB	0x70000024
717*fae548d3Szrj 
718*fae548d3Szrj /* The GOT index of the first PTE for a segment */
719*fae548d3Szrj #define DT_MIPS_LOCALPAGE_GOTIDX	0x70000025
720*fae548d3Szrj 
721*fae548d3Szrj /* The GOT index of the first PTE for a local symbol */
722*fae548d3Szrj #define DT_MIPS_LOCAL_GOTIDX	0x70000026
723*fae548d3Szrj 
724*fae548d3Szrj /* The GOT index of the first PTE for a hidden symbol */
725*fae548d3Szrj #define DT_MIPS_HIDDEN_GOTIDX	0x70000027
726*fae548d3Szrj 
727*fae548d3Szrj /* The GOT index of the first PTE for a protected symbol */
728*fae548d3Szrj #define DT_MIPS_PROTECTED_GOTIDX	0x70000028
729*fae548d3Szrj 
730*fae548d3Szrj /* Address of `.MIPS.options'.  */
731*fae548d3Szrj #define DT_MIPS_OPTIONS		0x70000029
732*fae548d3Szrj 
733*fae548d3Szrj /* Address of `.interface'.  */
734*fae548d3Szrj #define DT_MIPS_INTERFACE	0x7000002a
735*fae548d3Szrj 
736*fae548d3Szrj /* ??? */
737*fae548d3Szrj #define DT_MIPS_DYNSTR_ALIGN	0x7000002b
738*fae548d3Szrj 
739*fae548d3Szrj /* Size of the .interface section.  */
740*fae548d3Szrj #define DT_MIPS_INTERFACE_SIZE	0x7000002c
741*fae548d3Szrj 
742*fae548d3Szrj /* Size of rld_text_resolve function stored in the GOT.  */
743*fae548d3Szrj #define DT_MIPS_RLD_TEXT_RESOLVE_ADDR	0x7000002d
744*fae548d3Szrj 
745*fae548d3Szrj /* Default suffix of DSO to be added by rld on dlopen() calls.  */
746*fae548d3Szrj #define DT_MIPS_PERF_SUFFIX	0x7000002e
747*fae548d3Szrj 
748*fae548d3Szrj /* Size of compact relocation section (O32).  */
749*fae548d3Szrj #define DT_MIPS_COMPACT_SIZE	0x7000002f
750*fae548d3Szrj 
751*fae548d3Szrj /* GP value for auxiliary GOTs.  */
752*fae548d3Szrj #define DT_MIPS_GP_VALUE	0x70000030
753*fae548d3Szrj 
754*fae548d3Szrj /* Address of auxiliary .dynamic.  */
755*fae548d3Szrj #define DT_MIPS_AUX_DYNAMIC	0x70000031
756*fae548d3Szrj 
757*fae548d3Szrj /* Address of the base of the PLTGOT.  */
758*fae548d3Szrj #define DT_MIPS_PLTGOT         0x70000032
759*fae548d3Szrj 
760*fae548d3Szrj /* Points to the base of a writable PLT.  */
761*fae548d3Szrj #define DT_MIPS_RWPLT          0x70000034
762*fae548d3Szrj 
763*fae548d3Szrj /* Relative offset of run time loader map, used for debugging.  */
764*fae548d3Szrj #define DT_MIPS_RLD_MAP_REL    0x70000035
765*fae548d3Szrj 
766*fae548d3Szrj /* Address of .MIPS.xhash section.  */
767*fae548d3Szrj #define DT_MIPS_XHASH	       0x70000036
768*fae548d3Szrj 
769*fae548d3Szrj /* Flags which may appear in a DT_MIPS_FLAGS entry.  */
770*fae548d3Szrj 
771*fae548d3Szrj /* No flags.  */
772*fae548d3Szrj #define RHF_NONE		0x00000000
773*fae548d3Szrj 
774*fae548d3Szrj /* Uses shortcut pointers.  */
775*fae548d3Szrj #define RHF_QUICKSTART		0x00000001
776*fae548d3Szrj 
777*fae548d3Szrj /* Hash size is not a power of two.  */
778*fae548d3Szrj #define RHF_NOTPOT		0x00000002
779*fae548d3Szrj 
780*fae548d3Szrj /* Ignore LD_LIBRARY_PATH.  */
781*fae548d3Szrj #define RHS_NO_LIBRARY_REPLACEMENT 0x00000004
782*fae548d3Szrj 
783*fae548d3Szrj /* DSO address may not be relocated. */
784*fae548d3Szrj #define RHF_NO_MOVE		0x00000008
785*fae548d3Szrj 
786*fae548d3Szrj /* SGI specific features. */
787*fae548d3Szrj #define RHF_SGI_ONLY		0x00000010
788*fae548d3Szrj 
789*fae548d3Szrj /* Guarantee that .init will finish executing before any non-init
790*fae548d3Szrj    code in DSO is called. */
791*fae548d3Szrj #define RHF_GUARANTEE_INIT	   0x00000020
792*fae548d3Szrj 
793*fae548d3Szrj /* Contains Delta C++ code. */
794*fae548d3Szrj #define RHF_DELTA_C_PLUS_PLUS	   0x00000040
795*fae548d3Szrj 
796*fae548d3Szrj /* Guarantee that .init will start executing before any non-init
797*fae548d3Szrj    code in DSO is called. */
798*fae548d3Szrj #define RHF_GUARANTEE_START_INIT   0x00000080
799*fae548d3Szrj 
800*fae548d3Szrj /* Generated by pixie. */
801*fae548d3Szrj #define RHF_PIXIE		   0x00000100
802*fae548d3Szrj 
803*fae548d3Szrj /* Delay-load DSO by default. */
804*fae548d3Szrj #define RHF_DEFAULT_DELAY_LOAD	   0x00000200
805*fae548d3Szrj 
806*fae548d3Szrj /* Object may be requickstarted */
807*fae548d3Szrj #define RHF_REQUICKSTART	   0x00000400
808*fae548d3Szrj 
809*fae548d3Szrj /* Object has been requickstarted */
810*fae548d3Szrj #define RHF_REQUICKSTARTED	   0x00000800
811*fae548d3Szrj 
812*fae548d3Szrj /* Generated by cord. */
813*fae548d3Szrj #define RHF_CORD		   0x00001000
814*fae548d3Szrj 
815*fae548d3Szrj /* Object contains no unresolved undef symbols. */
816*fae548d3Szrj #define RHF_NO_UNRES_UNDEF	   0x00002000
817*fae548d3Szrj 
818*fae548d3Szrj /* Symbol table is in a safe order. */
819*fae548d3Szrj #define RHF_RLD_ORDER_SAFE	   0x00004000
820*fae548d3Szrj 
821*fae548d3Szrj /* Special values for the st_other field in the symbol table.  These
822*fae548d3Szrj    are used in an Irix 5 dynamic symbol table.  */
823*fae548d3Szrj 
824*fae548d3Szrj #define STO_DEFAULT		STV_DEFAULT
825*fae548d3Szrj #define STO_INTERNAL		STV_INTERNAL
826*fae548d3Szrj #define STO_HIDDEN		STV_HIDDEN
827*fae548d3Szrj #define STO_PROTECTED		STV_PROTECTED
828*fae548d3Szrj 
829*fae548d3Szrj /* Two topmost bits denote the MIPS ISA for .text symbols:
830*fae548d3Szrj    + 00 -- standard MIPS code,
831*fae548d3Szrj    + 10 -- microMIPS code,
832*fae548d3Szrj    + 11 -- MIPS16 code; requires the following two bits to be set too.
833*fae548d3Szrj    Note that one of the MIPS16 bits overlaps with STO_MIPS_PIC.  See below
834*fae548d3Szrj    for details.  */
835*fae548d3Szrj #define STO_MIPS_ISA		(3 << 6)
836*fae548d3Szrj 
837*fae548d3Szrj /* The mask spanning the rest of MIPS psABI flags.  At most one is expected
838*fae548d3Szrj    to be set except for STO_MIPS16.  */
839*fae548d3Szrj #define STO_MIPS_FLAGS		(~(STO_MIPS_ISA | ELF_ST_VISIBILITY (-1)))
840*fae548d3Szrj 
841*fae548d3Szrj /* The MIPS psABI was updated in 2008 with support for PLTs and copy
842*fae548d3Szrj    relocs.  There are therefore two types of nonzero SHN_UNDEF functions:
843*fae548d3Szrj    PLT entries and traditional MIPS lazy binding stubs.  We mark the former
844*fae548d3Szrj    with STO_MIPS_PLT to distinguish them from the latter.  */
845*fae548d3Szrj #define STO_MIPS_PLT		0x8
846*fae548d3Szrj #define ELF_ST_IS_MIPS_PLT(other)					\
847*fae548d3Szrj   ((ELF_ST_IS_MIPS16 (other)						\
848*fae548d3Szrj     ? ((other) & (~STO_MIPS16 & STO_MIPS_FLAGS))			\
849*fae548d3Szrj     : ((other) & STO_MIPS_FLAGS)) == STO_MIPS_PLT)
850*fae548d3Szrj #define ELF_ST_SET_MIPS_PLT(other)					\
851*fae548d3Szrj   ((ELF_ST_IS_MIPS16 (other)						\
852*fae548d3Szrj     ? ((other) & (STO_MIPS16 | ~STO_MIPS_FLAGS))			\
853*fae548d3Szrj     : ((other) & ~STO_MIPS_FLAGS)) | STO_MIPS_PLT)
854*fae548d3Szrj 
855*fae548d3Szrj /* This value is used to mark PIC functions in an object that mixes
856*fae548d3Szrj    PIC and non-PIC.  Note that this bit overlaps with STO_MIPS16,
857*fae548d3Szrj    although MIPS16 symbols are never considered to be MIPS_PIC.  */
858*fae548d3Szrj #define STO_MIPS_PIC		0x20
859*fae548d3Szrj #define ELF_ST_IS_MIPS_PIC(other) (((other) & STO_MIPS_FLAGS) == STO_MIPS_PIC)
860*fae548d3Szrj #define ELF_ST_SET_MIPS_PIC(other)					\
861*fae548d3Szrj   ((ELF_ST_IS_MIPS16 (other)						\
862*fae548d3Szrj     ? ((other) & ~(STO_MIPS16 | STO_MIPS_FLAGS))			\
863*fae548d3Szrj     : ((other) & ~STO_MIPS_FLAGS)) | STO_MIPS_PIC)
864*fae548d3Szrj 
865*fae548d3Szrj /* This value is used for a mips16 .text symbol.  */
866*fae548d3Szrj #define STO_MIPS16		0xf0
867*fae548d3Szrj #define ELF_ST_IS_MIPS16(other) (((other) & STO_MIPS16) == STO_MIPS16)
868*fae548d3Szrj #define ELF_ST_SET_MIPS16(other) ((other) | STO_MIPS16)
869*fae548d3Szrj 
870*fae548d3Szrj /* This value is used for a microMIPS .text symbol.  To distinguish from
871*fae548d3Szrj    STO_MIPS16, we set top two bits to be 10 to denote STO_MICROMIPS.  The
872*fae548d3Szrj    mask is STO_MIPS_ISA.  */
873*fae548d3Szrj #define STO_MICROMIPS		(2 << 6)
874*fae548d3Szrj #define ELF_ST_IS_MICROMIPS(other) (((other) & STO_MIPS_ISA) == STO_MICROMIPS)
875*fae548d3Szrj #define ELF_ST_SET_MICROMIPS(other) (((other) & ~STO_MIPS_ISA) | STO_MICROMIPS)
876*fae548d3Szrj 
877*fae548d3Szrj /* Whether code compression (either of the MIPS16 or the microMIPS ASEs)
878*fae548d3Szrj    has been indicated for a .text symbol.  */
879*fae548d3Szrj #define ELF_ST_IS_COMPRESSED(other) \
880*fae548d3Szrj   (ELF_ST_IS_MIPS16 (other) || ELF_ST_IS_MICROMIPS (other))
881*fae548d3Szrj 
882*fae548d3Szrj /* This bit is used on Irix to indicate a symbol whose definition
883*fae548d3Szrj    is optional - if, at final link time, it cannot be found, no
884*fae548d3Szrj    error message should be produced.  */
885*fae548d3Szrj #define STO_OPTIONAL		(1 << 2)
886*fae548d3Szrj /* A macro to examine the STO_OPTIONAL bit.  */
887*fae548d3Szrj #define ELF_MIPS_IS_OPTIONAL(other)	((other) & STO_OPTIONAL)
888*fae548d3Szrj 
889*fae548d3Szrj /* The 64-bit MIPS ELF ABI uses an unusual reloc format.  Each
890*fae548d3Szrj    relocation entry specifies up to three actual relocations, all at
891*fae548d3Szrj    the same address.  The first relocation which required a symbol
892*fae548d3Szrj    uses the symbol in the r_sym field.  The second relocation which
893*fae548d3Szrj    requires a symbol uses the symbol in the r_ssym field.  If all
894*fae548d3Szrj    three relocations require a symbol, the third one uses a zero
895*fae548d3Szrj    value.  */
896*fae548d3Szrj 
897*fae548d3Szrj /* An entry in a 64 bit SHT_REL section.  */
898*fae548d3Szrj 
899*fae548d3Szrj typedef struct
900*fae548d3Szrj {
901*fae548d3Szrj   /* Address of relocation.  */
902*fae548d3Szrj   unsigned char r_offset[8];
903*fae548d3Szrj   /* Symbol index.  */
904*fae548d3Szrj   unsigned char r_sym[4];
905*fae548d3Szrj   /* Special symbol.  */
906*fae548d3Szrj   unsigned char r_ssym[1];
907*fae548d3Szrj   /* Third relocation.  */
908*fae548d3Szrj   unsigned char r_type3[1];
909*fae548d3Szrj   /* Second relocation.  */
910*fae548d3Szrj   unsigned char r_type2[1];
911*fae548d3Szrj   /* First relocation.  */
912*fae548d3Szrj   unsigned char r_type[1];
913*fae548d3Szrj } Elf64_Mips_External_Rel;
914*fae548d3Szrj 
915*fae548d3Szrj typedef struct
916*fae548d3Szrj {
917*fae548d3Szrj   /* Address of relocation.  */
918*fae548d3Szrj   bfd_vma r_offset;
919*fae548d3Szrj   /* Symbol index.  */
920*fae548d3Szrj   unsigned long r_sym;
921*fae548d3Szrj   /* Special symbol.  */
922*fae548d3Szrj   unsigned char r_ssym;
923*fae548d3Szrj   /* Third relocation.  */
924*fae548d3Szrj   unsigned char r_type3;
925*fae548d3Szrj   /* Second relocation.  */
926*fae548d3Szrj   unsigned char r_type2;
927*fae548d3Szrj   /* First relocation.  */
928*fae548d3Szrj   unsigned char r_type;
929*fae548d3Szrj } Elf64_Mips_Internal_Rel;
930*fae548d3Szrj 
931*fae548d3Szrj /* An entry in a 64 bit SHT_RELA section.  */
932*fae548d3Szrj 
933*fae548d3Szrj typedef struct
934*fae548d3Szrj {
935*fae548d3Szrj   /* Address of relocation.  */
936*fae548d3Szrj   unsigned char r_offset[8];
937*fae548d3Szrj   /* Symbol index.  */
938*fae548d3Szrj   unsigned char r_sym[4];
939*fae548d3Szrj   /* Special symbol.  */
940*fae548d3Szrj   unsigned char r_ssym[1];
941*fae548d3Szrj   /* Third relocation.  */
942*fae548d3Szrj   unsigned char r_type3[1];
943*fae548d3Szrj   /* Second relocation.  */
944*fae548d3Szrj   unsigned char r_type2[1];
945*fae548d3Szrj   /* First relocation.  */
946*fae548d3Szrj   unsigned char r_type[1];
947*fae548d3Szrj   /* Addend.  */
948*fae548d3Szrj   unsigned char r_addend[8];
949*fae548d3Szrj } Elf64_Mips_External_Rela;
950*fae548d3Szrj 
951*fae548d3Szrj typedef struct
952*fae548d3Szrj {
953*fae548d3Szrj   /* Address of relocation.  */
954*fae548d3Szrj   bfd_vma r_offset;
955*fae548d3Szrj   /* Symbol index.  */
956*fae548d3Szrj   unsigned long r_sym;
957*fae548d3Szrj   /* Special symbol.  */
958*fae548d3Szrj   unsigned char r_ssym;
959*fae548d3Szrj   /* Third relocation.  */
960*fae548d3Szrj   unsigned char r_type3;
961*fae548d3Szrj   /* Second relocation.  */
962*fae548d3Szrj   unsigned char r_type2;
963*fae548d3Szrj   /* First relocation.  */
964*fae548d3Szrj   unsigned char r_type;
965*fae548d3Szrj   /* Addend.  */
966*fae548d3Szrj   bfd_signed_vma r_addend;
967*fae548d3Szrj } Elf64_Mips_Internal_Rela;
968*fae548d3Szrj 
969*fae548d3Szrj /* MIPS ELF 64 relocation info access macros.  */
970*fae548d3Szrj #define ELF64_MIPS_R_SSYM(i) (((i) >> 24) & 0xff)
971*fae548d3Szrj #define ELF64_MIPS_R_TYPE3(i) (((i) >> 16) & 0xff)
972*fae548d3Szrj #define ELF64_MIPS_R_TYPE2(i) (((i) >> 8) & 0xff)
973*fae548d3Szrj #define ELF64_MIPS_R_TYPE(i) ((i) & 0xff)
974*fae548d3Szrj 
975*fae548d3Szrj /* Values found in the r_ssym field of a relocation entry.  */
976*fae548d3Szrj 
977*fae548d3Szrj /* No relocation.  */
978*fae548d3Szrj #define RSS_UNDEF	0
979*fae548d3Szrj 
980*fae548d3Szrj /* Value of GP.  */
981*fae548d3Szrj #define RSS_GP		1
982*fae548d3Szrj 
983*fae548d3Szrj /* Value of GP in object being relocated.  */
984*fae548d3Szrj #define RSS_GP0		2
985*fae548d3Szrj 
986*fae548d3Szrj /* Address of location being relocated.  */
987*fae548d3Szrj #define RSS_LOC		3
988*fae548d3Szrj 
989*fae548d3Szrj /* A SHT_MIPS_OPTIONS section contains a series of options, each of
990*fae548d3Szrj    which starts with this header.  */
991*fae548d3Szrj 
992*fae548d3Szrj typedef struct
993*fae548d3Szrj {
994*fae548d3Szrj   /* Type of option.  */
995*fae548d3Szrj   unsigned char kind[1];
996*fae548d3Szrj   /* Size of option descriptor, including header.  */
997*fae548d3Szrj   unsigned char size[1];
998*fae548d3Szrj   /* Section index of affected section, or 0 for global option.  */
999*fae548d3Szrj   unsigned char section[2];
1000*fae548d3Szrj   /* Information specific to this kind of option.  */
1001*fae548d3Szrj   unsigned char info[4];
1002*fae548d3Szrj } Elf_External_Options;
1003*fae548d3Szrj 
1004*fae548d3Szrj typedef struct
1005*fae548d3Szrj {
1006*fae548d3Szrj   /* Type of option.  */
1007*fae548d3Szrj   unsigned char kind;
1008*fae548d3Szrj   /* Size of option descriptor, including header.  */
1009*fae548d3Szrj   unsigned char size;
1010*fae548d3Szrj   /* Section index of affected section, or 0 for global option.  */
1011*fae548d3Szrj   unsigned short section;
1012*fae548d3Szrj   /* Information specific to this kind of option.  */
1013*fae548d3Szrj   unsigned long info;
1014*fae548d3Szrj } Elf_Internal_Options;
1015*fae548d3Szrj 
1016*fae548d3Szrj /* MIPS ELF option header swapping routines.  */
1017*fae548d3Szrj extern void bfd_mips_elf_swap_options_in
1018*fae548d3Szrj   (bfd *, const Elf_External_Options *, Elf_Internal_Options *);
1019*fae548d3Szrj extern void bfd_mips_elf_swap_options_out
1020*fae548d3Szrj   (bfd *, const Elf_Internal_Options *, Elf_External_Options *);
1021*fae548d3Szrj 
1022*fae548d3Szrj /* Values which may appear in the kind field of an Elf_Options
1023*fae548d3Szrj    structure.  */
1024*fae548d3Szrj 
1025*fae548d3Szrj /* Undefined.  */
1026*fae548d3Szrj #define ODK_NULL	0
1027*fae548d3Szrj 
1028*fae548d3Szrj /* Register usage and GP value.  */
1029*fae548d3Szrj #define ODK_REGINFO	1
1030*fae548d3Szrj 
1031*fae548d3Szrj /* Exception processing information.  */
1032*fae548d3Szrj #define ODK_EXCEPTIONS	2
1033*fae548d3Szrj 
1034*fae548d3Szrj /* Section padding information.  */
1035*fae548d3Szrj #define ODK_PAD		3
1036*fae548d3Szrj 
1037*fae548d3Szrj /* Hardware workarounds performed.  */
1038*fae548d3Szrj #define ODK_HWPATCH	4
1039*fae548d3Szrj 
1040*fae548d3Szrj /* Fill value used by the linker.  */
1041*fae548d3Szrj #define ODK_FILL	5
1042*fae548d3Szrj 
1043*fae548d3Szrj /* Reserved space for desktop tools.  */
1044*fae548d3Szrj #define ODK_TAGS	6
1045*fae548d3Szrj 
1046*fae548d3Szrj /* Hardware workarounds, AND bits when merging.  */
1047*fae548d3Szrj #define ODK_HWAND	7
1048*fae548d3Szrj 
1049*fae548d3Szrj /* Hardware workarounds, OR bits when merging.  */
1050*fae548d3Szrj #define ODK_HWOR	8
1051*fae548d3Szrj 
1052*fae548d3Szrj /* GP group to use for text/data sections.  */
1053*fae548d3Szrj #define ODK_GP_GROUP	9
1054*fae548d3Szrj 
1055*fae548d3Szrj /* ID information.  */
1056*fae548d3Szrj #define ODK_IDENT	10
1057*fae548d3Szrj 
1058*fae548d3Szrj /* In the 32 bit ABI, an ODK_REGINFO option is just a Elf32_RegInfo
1059*fae548d3Szrj    structure.  In the 64 bit ABI, it is the following structure.  The
1060*fae548d3Szrj    info field of the options header is not used.  */
1061*fae548d3Szrj 
1062*fae548d3Szrj typedef struct
1063*fae548d3Szrj {
1064*fae548d3Szrj   /* Mask of general purpose registers used.  */
1065*fae548d3Szrj   unsigned char ri_gprmask[4];
1066*fae548d3Szrj   /* Padding.  */
1067*fae548d3Szrj   unsigned char ri_pad[4];
1068*fae548d3Szrj   /* Mask of co-processor registers used.  */
1069*fae548d3Szrj   unsigned char ri_cprmask[4][4];
1070*fae548d3Szrj   /* GP register value for this object file.  */
1071*fae548d3Szrj   unsigned char ri_gp_value[8];
1072*fae548d3Szrj } Elf64_External_RegInfo;
1073*fae548d3Szrj 
1074*fae548d3Szrj typedef struct
1075*fae548d3Szrj {
1076*fae548d3Szrj   /* Mask of general purpose registers used.  */
1077*fae548d3Szrj   unsigned long ri_gprmask;
1078*fae548d3Szrj   /* Padding.  */
1079*fae548d3Szrj   unsigned long ri_pad;
1080*fae548d3Szrj   /* Mask of co-processor registers used.  */
1081*fae548d3Szrj   unsigned long ri_cprmask[4];
1082*fae548d3Szrj   /* GP register value for this object file.  */
1083*fae548d3Szrj   bfd_vma ri_gp_value;
1084*fae548d3Szrj } Elf64_Internal_RegInfo;
1085*fae548d3Szrj 
1086*fae548d3Szrj /* ABI Flags structure version 0.  */
1087*fae548d3Szrj 
1088*fae548d3Szrj typedef struct
1089*fae548d3Szrj {
1090*fae548d3Szrj   /* Version of flags structure.  */
1091*fae548d3Szrj   unsigned char version[2];
1092*fae548d3Szrj   /* The level of the ISA: 1-5, 32, 64.  */
1093*fae548d3Szrj   unsigned char isa_level[1];
1094*fae548d3Szrj   /* The revision of ISA: 0 for MIPS V and below, 1-n otherwise.  */
1095*fae548d3Szrj   unsigned char isa_rev[1];
1096*fae548d3Szrj   /* The size of general purpose registers.  */
1097*fae548d3Szrj   unsigned char gpr_size[1];
1098*fae548d3Szrj   /* The size of co-processor 1 registers.  */
1099*fae548d3Szrj   unsigned char cpr1_size[1];
1100*fae548d3Szrj   /* The size of co-processor 2 registers.  */
1101*fae548d3Szrj   unsigned char cpr2_size[1];
1102*fae548d3Szrj   /* The floating-point ABI.  */
1103*fae548d3Szrj   unsigned char fp_abi[1];
1104*fae548d3Szrj   /* Processor-specific extension.  */
1105*fae548d3Szrj   unsigned char isa_ext[4];
1106*fae548d3Szrj   /* Mask of ASEs used.  */
1107*fae548d3Szrj   unsigned char ases[4];
1108*fae548d3Szrj   /* Mask of general flags.  */
1109*fae548d3Szrj   unsigned char flags1[4];
1110*fae548d3Szrj   unsigned char flags2[4];
1111*fae548d3Szrj } Elf_External_ABIFlags_v0;
1112*fae548d3Szrj 
1113*fae548d3Szrj typedef struct elf_internal_abiflags_v0
1114*fae548d3Szrj {
1115*fae548d3Szrj   /* Version of flags structure.  */
1116*fae548d3Szrj   unsigned short version;
1117*fae548d3Szrj   /* The level of the ISA: 1-5, 32, 64.  */
1118*fae548d3Szrj   unsigned char isa_level;
1119*fae548d3Szrj   /* The revision of ISA: 0 for MIPS V and below, 1-n otherwise.  */
1120*fae548d3Szrj   unsigned char isa_rev;
1121*fae548d3Szrj   /* The size of general purpose registers.  */
1122*fae548d3Szrj   unsigned char gpr_size;
1123*fae548d3Szrj   /* The size of co-processor 1 registers.  */
1124*fae548d3Szrj   unsigned char cpr1_size;
1125*fae548d3Szrj   /* The size of co-processor 2 registers.  */
1126*fae548d3Szrj   unsigned char cpr2_size;
1127*fae548d3Szrj   /* The floating-point ABI.  */
1128*fae548d3Szrj   unsigned char fp_abi;
1129*fae548d3Szrj   /* Processor-specific extension.  */
1130*fae548d3Szrj   unsigned long isa_ext;
1131*fae548d3Szrj   /* Mask of ASEs used.  */
1132*fae548d3Szrj   unsigned long ases;
1133*fae548d3Szrj   /* Mask of general flags.  */
1134*fae548d3Szrj   unsigned long flags1;
1135*fae548d3Szrj   unsigned long flags2;
1136*fae548d3Szrj } Elf_Internal_ABIFlags_v0;
1137*fae548d3Szrj 
1138*fae548d3Szrj typedef struct
1139*fae548d3Szrj {
1140*fae548d3Szrj   /* The hash value computed from the name of the corresponding
1141*fae548d3Szrj      dynamic symbol.  */
1142*fae548d3Szrj   unsigned char ms_hash_value[4];
1143*fae548d3Szrj   /* Contains both the dynamic relocation index and the symbol flags
1144*fae548d3Szrj      field.  The macros ELF32_MS_REL_INDEX and ELF32_MS_FLAGS are used
1145*fae548d3Szrj      to access the individual values.  The dynamic relocation index
1146*fae548d3Szrj      identifies the first entry in the .rel.dyn section that
1147*fae548d3Szrj      references the dynamic symbol corresponding to this msym entry.
1148*fae548d3Szrj      If the index is 0, no dynamic relocations are associated with the
1149*fae548d3Szrj      symbol.  The symbol flags field is reserved for future use.  */
1150*fae548d3Szrj   unsigned char ms_info[4];
1151*fae548d3Szrj } Elf32_External_Msym;
1152*fae548d3Szrj 
1153*fae548d3Szrj typedef struct
1154*fae548d3Szrj {
1155*fae548d3Szrj   /* The hash value computed from the name of the corresponding
1156*fae548d3Szrj      dynamic symbol.  */
1157*fae548d3Szrj   unsigned long ms_hash_value;
1158*fae548d3Szrj   /* Contains both the dynamic relocation index and the symbol flags
1159*fae548d3Szrj      field.  The macros ELF32_MS_REL_INDEX and ELF32_MS_FLAGS are used
1160*fae548d3Szrj      to access the individual values.  The dynamic relocation index
1161*fae548d3Szrj      identifies the first entry in the .rel.dyn section that
1162*fae548d3Szrj      references the dynamic symbol corresponding to this msym entry.
1163*fae548d3Szrj      If the index is 0, no dynamic relocations are associated with the
1164*fae548d3Szrj      symbol.  The symbol flags field is reserved for future use.  */
1165*fae548d3Szrj   unsigned long ms_info;
1166*fae548d3Szrj } Elf32_Internal_Msym;
1167*fae548d3Szrj 
1168*fae548d3Szrj #define ELF32_MS_REL_INDEX(i) ((i) >> 8)
1169*fae548d3Szrj #define ELF32_MS_FLAGS(i)     (i) & 0xff)
1170*fae548d3Szrj #define ELF32_MS_INFO(r, f)   (((r) << 8) + ((f) & 0xff))
1171*fae548d3Szrj 
1172*fae548d3Szrj /* MIPS ELF reginfo swapping routines.  */
1173*fae548d3Szrj extern void bfd_mips_elf64_swap_reginfo_in
1174*fae548d3Szrj   (bfd *, const Elf64_External_RegInfo *, Elf64_Internal_RegInfo *);
1175*fae548d3Szrj extern void bfd_mips_elf64_swap_reginfo_out
1176*fae548d3Szrj   (bfd *, const Elf64_Internal_RegInfo *, Elf64_External_RegInfo *);
1177*fae548d3Szrj 
1178*fae548d3Szrj /* MIPS ELF flags swapping routines.  */
1179*fae548d3Szrj extern void bfd_mips_elf_swap_abiflags_v0_in
1180*fae548d3Szrj   (bfd *, const Elf_External_ABIFlags_v0 *, Elf_Internal_ABIFlags_v0 *);
1181*fae548d3Szrj extern void bfd_mips_elf_swap_abiflags_v0_out
1182*fae548d3Szrj   (bfd *, const Elf_Internal_ABIFlags_v0 *, Elf_External_ABIFlags_v0 *);
1183*fae548d3Szrj 
1184*fae548d3Szrj /* Masks for the info work of an ODK_EXCEPTIONS descriptor.  */
1185*fae548d3Szrj #define OEX_FPU_MIN	0x1f	/* FPEs which must be enabled.  */
1186*fae548d3Szrj #define OEX_FPU_MAX	0x1f00	/* FPEs which may be enabled.  */
1187*fae548d3Szrj #define OEX_PAGE0	0x10000	/* Page zero must be mapped.  */
1188*fae548d3Szrj #define OEX_SMM		0x20000	/* Force sequential memory mode.  */
1189*fae548d3Szrj #define OEX_FPDBUG	0x40000	/* Force precise floating-point
1190*fae548d3Szrj 				   exceptions (debug mode).  */
1191*fae548d3Szrj #define OEX_DISMISS	0x80000	/* Dismiss invalid address faults.  */
1192*fae548d3Szrj 
1193*fae548d3Szrj /* Masks of the FP exceptions for OEX_FPU_MIN and OEX_FPU_MAX.  */
1194*fae548d3Szrj #define OEX_FPU_INVAL	0x10	/* Invalid operation exception.  */
1195*fae548d3Szrj #define OEX_FPU_DIV0	0x08	/* Division by zero exception.  */
1196*fae548d3Szrj #define OEX_FPU_OFLO	0x04	/* Overflow exception.  */
1197*fae548d3Szrj #define OEX_FPU_UFLO	0x02	/* Underflow exception.  */
1198*fae548d3Szrj #define OEX_FPU_INEX	0x01	/* Inexact exception.  */
1199*fae548d3Szrj 
1200*fae548d3Szrj /* Masks for the info word of an ODK_PAD descriptor.  */
1201*fae548d3Szrj #define OPAD_PREFIX	0x01
1202*fae548d3Szrj #define OPAD_POSTFIX	0x02
1203*fae548d3Szrj #define OPAD_SYMBOL	0x04
1204*fae548d3Szrj 
1205*fae548d3Szrj /* Masks for the info word of an ODK_HWPATCH descriptor.  */
1206*fae548d3Szrj #define OHW_R4KEOP	0x00000001	/* R4000 end-of-page patch.  */
1207*fae548d3Szrj #define OHW_R8KPFETCH	0x00000002	/* May need R8000 prefetch patch.  */
1208*fae548d3Szrj #define OHW_R5KEOP	0x00000004	/* R5000 end-of-page patch.  */
1209*fae548d3Szrj #define OHW_R5KCVTL	0x00000008	/* R5000 cvt.[ds].l bug
1210*fae548d3Szrj 					   (clean == 1).  */
1211*fae548d3Szrj #define OHW_R10KLDL	0x00000010	/* Needs R10K misaligned
1212*fae548d3Szrj 					   load patch. */
1213*fae548d3Szrj 
1214*fae548d3Szrj /* Masks for the info word of an ODK_IDENT/ODK_GP_GROUP descriptor.  */
1215*fae548d3Szrj #define OGP_GROUP	0x0000ffff	/* GP group number.  */
1216*fae548d3Szrj #define OGP_SELF	0xffff0000	/* Self-contained GP groups.  */
1217*fae548d3Szrj 
1218*fae548d3Szrj /* Masks for the info word of an ODK_HWAND/ODK_HWOR descriptor.  */
1219*fae548d3Szrj #define OHWA0_R4KEOP_CHECKED	0x00000001
1220*fae548d3Szrj #define OHWA0_R4KEOP_CLEAN	0x00000002
1221*fae548d3Szrj 
1222*fae548d3Szrj /* Values for the xxx_size bytes of an ABI flags structure.  */
1223*fae548d3Szrj 
1224*fae548d3Szrj #define AFL_REG_NONE	     0x00	/* No registers.  */
1225*fae548d3Szrj #define AFL_REG_32	     0x01	/* 32-bit registers.  */
1226*fae548d3Szrj #define AFL_REG_64	     0x02	/* 64-bit registers.  */
1227*fae548d3Szrj #define AFL_REG_128	     0x03	/* 128-bit registers.  */
1228*fae548d3Szrj 
1229*fae548d3Szrj /* Masks for the ases word of an ABI flags structure.  */
1230*fae548d3Szrj 
1231*fae548d3Szrj #define AFL_ASE_DSP          0x00000001 /* DSP ASE.  */
1232*fae548d3Szrj #define AFL_ASE_DSPR2        0x00000002 /* DSP R2 ASE.  */
1233*fae548d3Szrj #define AFL_ASE_EVA          0x00000004 /* Enhanced VA Scheme.  */
1234*fae548d3Szrj #define AFL_ASE_MCU          0x00000008 /* MCU (MicroController) ASE.  */
1235*fae548d3Szrj #define AFL_ASE_MDMX         0x00000010 /* MDMX ASE.  */
1236*fae548d3Szrj #define AFL_ASE_MIPS3D       0x00000020 /* MIPS-3D ASE.  */
1237*fae548d3Szrj #define AFL_ASE_MT           0x00000040 /* MT ASE.  */
1238*fae548d3Szrj #define AFL_ASE_SMARTMIPS    0x00000080 /* SmartMIPS ASE.  */
1239*fae548d3Szrj #define AFL_ASE_VIRT         0x00000100 /* VZ ASE.  */
1240*fae548d3Szrj #define AFL_ASE_MSA          0x00000200 /* MSA ASE.  */
1241*fae548d3Szrj #define AFL_ASE_MIPS16       0x00000400 /* MIPS16 ASE.  */
1242*fae548d3Szrj #define AFL_ASE_MICROMIPS    0x00000800 /* MICROMIPS ASE.  */
1243*fae548d3Szrj #define AFL_ASE_XPA          0x00001000 /* XPA ASE.  */
1244*fae548d3Szrj #define AFL_ASE_DSPR3        0x00002000 /* DSP R3 ASE.  */
1245*fae548d3Szrj #define AFL_ASE_MIPS16E2     0x00004000 /* MIPS16e2 ASE.  */
1246*fae548d3Szrj #define AFL_ASE_CRC          0x00008000 /* CRC ASE.  */
1247*fae548d3Szrj #define AFL_ASE_RESERVED1    0x00010000 /* Reserved by MIPS Tech for WIP.  */
1248*fae548d3Szrj #define AFL_ASE_GINV         0x00020000 /* GINV ASE.  */
1249*fae548d3Szrj #define AFL_ASE_LOONGSON_MMI 0x00040000 /* Loongson MMI ASE.  */
1250*fae548d3Szrj #define AFL_ASE_LOONGSON_CAM 0x00080000 /* Loongson CAM ASE.  */
1251*fae548d3Szrj #define AFL_ASE_LOONGSON_EXT 0x00100000 /* Loongson EXT instructions.  */
1252*fae548d3Szrj #define AFL_ASE_LOONGSON_EXT2 0x00200000 /* Loongson EXT2 instructions.  */
1253*fae548d3Szrj #define AFL_ASE_MASK         0x003effff /* All ASEs.  */
1254*fae548d3Szrj 
1255*fae548d3Szrj /* Values for the isa_ext word of an ABI flags structure.  */
1256*fae548d3Szrj 
1257*fae548d3Szrj #define AFL_EXT_XLR           1  /* RMI Xlr instruction.  */
1258*fae548d3Szrj #define AFL_EXT_OCTEON2       2  /* Cavium Networks Octeon2.  */
1259*fae548d3Szrj #define AFL_EXT_OCTEONP       3  /* Cavium Networks OcteonP.  */
1260*fae548d3Szrj #define AFL_EXT_OCTEON        5  /* Cavium Networks Octeon.  */
1261*fae548d3Szrj #define AFL_EXT_5900          6  /* MIPS R5900 instruction.  */
1262*fae548d3Szrj #define AFL_EXT_4650          7  /* MIPS R4650 instruction.  */
1263*fae548d3Szrj #define AFL_EXT_4010          8  /* LSI R4010 instruction.  */
1264*fae548d3Szrj #define AFL_EXT_4100          9  /* NEC VR4100 instruction.  */
1265*fae548d3Szrj #define AFL_EXT_3900         10  /* Toshiba R3900 instruction.  */
1266*fae548d3Szrj #define AFL_EXT_10000        11  /* MIPS R10000 instruction.  */
1267*fae548d3Szrj #define AFL_EXT_SB1          12  /* Broadcom SB-1 instruction.  */
1268*fae548d3Szrj #define AFL_EXT_4111         13  /* NEC VR4111/VR4181 instruction.  */
1269*fae548d3Szrj #define AFL_EXT_4120         14  /* NEC VR4120 instruction.  */
1270*fae548d3Szrj #define AFL_EXT_5400         15  /* NEC VR5400 instruction.  */
1271*fae548d3Szrj #define AFL_EXT_5500         16  /* NEC VR5500 instruction.  */
1272*fae548d3Szrj #define AFL_EXT_LOONGSON_2E  17  /* ST Microelectronics Loongson 2E.  */
1273*fae548d3Szrj #define AFL_EXT_LOONGSON_2F  18  /* ST Microelectronics Loongson 2F.  */
1274*fae548d3Szrj #define AFL_EXT_OCTEON3      19  /* Cavium Networks Octeon3.  */
1275*fae548d3Szrj #define AFL_EXT_INTERAPTIV_MR2 20  /* Imagination interAptiv MR2.  */
1276*fae548d3Szrj 
1277*fae548d3Szrj /* Masks for the flags1 word of an ABI flags structure.  */
1278*fae548d3Szrj #define AFL_FLAGS1_ODDSPREG   1	 /* Uses odd single-precision registers.  */
1279*fae548d3Szrj 
1280*fae548d3Szrj extern unsigned int bfd_mips_isa_ext (bfd *);
1281*fae548d3Szrj 
1282*fae548d3Szrj 
1283*fae548d3Szrj /* Object attribute tags.  */
1284*fae548d3Szrj enum
1285*fae548d3Szrj {
1286*fae548d3Szrj   /* 0-3 are generic.  */
1287*fae548d3Szrj 
1288*fae548d3Szrj   /* Floating-point ABI used by this object file.  */
1289*fae548d3Szrj   Tag_GNU_MIPS_ABI_FP = 4,
1290*fae548d3Szrj 
1291*fae548d3Szrj   /* MSA ABI used by this object file.  */
1292*fae548d3Szrj   Tag_GNU_MIPS_ABI_MSA = 8,
1293*fae548d3Szrj };
1294*fae548d3Szrj 
1295*fae548d3Szrj /* Object attribute values.  */
1296*fae548d3Szrj enum
1297*fae548d3Szrj {
1298*fae548d3Szrj   /* Values defined for Tag_GNU_MIPS_ABI_FP.  */
1299*fae548d3Szrj 
1300*fae548d3Szrj   /* Not tagged or not using any ABIs affected by the differences.  */
1301*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_ANY = 0,
1302*fae548d3Szrj 
1303*fae548d3Szrj   /* Using hard-float -mdouble-float.  */
1304*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_DOUBLE = 1,
1305*fae548d3Szrj 
1306*fae548d3Szrj   /* Using hard-float -msingle-float.  */
1307*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_SINGLE = 2,
1308*fae548d3Szrj 
1309*fae548d3Szrj   /* Using soft-float.  */
1310*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_SOFT = 3,
1311*fae548d3Szrj 
1312*fae548d3Szrj   /* Using -mips32r2 -mfp64.  */
1313*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_OLD_64 = 4,
1314*fae548d3Szrj 
1315*fae548d3Szrj   /* Using -mfpxx */
1316*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_XX = 5,
1317*fae548d3Szrj 
1318*fae548d3Szrj   /* Using -mips32r2 -mfp64.  */
1319*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_64 = 6,
1320*fae548d3Szrj 
1321*fae548d3Szrj   /* Using -mips32r2 -mfp64 -mno-odd-spreg.  */
1322*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_64A = 7,
1323*fae548d3Szrj 
1324*fae548d3Szrj   /* This is reserved for backward-compatibility with an earlier
1325*fae548d3Szrj      implementation of the MIPS NaN2008 functionality.  */
1326*fae548d3Szrj   Val_GNU_MIPS_ABI_FP_NAN2008 = 8,
1327*fae548d3Szrj 
1328*fae548d3Szrj   /* Values defined for Tag_GNU_MIPS_ABI_MSA.  */
1329*fae548d3Szrj 
1330*fae548d3Szrj   /* Not tagged or not using any ABIs affected by the differences.  */
1331*fae548d3Szrj   Val_GNU_MIPS_ABI_MSA_ANY = 0,
1332*fae548d3Szrj 
1333*fae548d3Szrj   /* Using 128-bit MSA.  */
1334*fae548d3Szrj   Val_GNU_MIPS_ABI_MSA_128 = 1,
1335*fae548d3Szrj };
1336*fae548d3Szrj 
1337*fae548d3Szrj #ifdef __cplusplus
1338*fae548d3Szrj }
1339*fae548d3Szrj #endif
1340*fae548d3Szrj 
1341*fae548d3Szrj #endif /* _ELF_MIPS_H */
1342