/src/binutils-gdb/include/elf/ppc.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* PPC ELF support for BFD. |
2 | | Copyright (C) 1995-2025 Free Software Foundation, Inc. |
3 | | |
4 | | By Michael Meissner, Cygnus Support, <meissner@cygnus.com>, |
5 | | from information in the System V Application Binary Interface, |
6 | | PowerPC Processor Supplement and the PowerPC Embedded Application |
7 | | Binary Interface (eabi). |
8 | | |
9 | | This file is part of BFD, the Binary File Descriptor library. |
10 | | |
11 | | This program is free software; you can redistribute it and/or modify |
12 | | it under the terms of the GNU General Public License as published by |
13 | | the Free Software Foundation; either version 3 of the License, or |
14 | | (at your option) any later version. |
15 | | |
16 | | This program is distributed in the hope that it will be useful, |
17 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
19 | | GNU General Public License for more details. |
20 | | |
21 | | You should have received a copy of the GNU General Public License |
22 | | along with this program; if not, write to the Free Software |
23 | | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
24 | | MA 02110-1301, USA. */ |
25 | | |
26 | | /* This file holds definitions specific to the PPC ELF ABI. Note |
27 | | that most of this is not actually implemented by BFD. */ |
28 | | |
29 | | #ifndef _ELF_PPC_H |
30 | | #define _ELF_PPC_H |
31 | | |
32 | | #include "elf/reloc-macros.h" |
33 | | |
34 | | /* Relocations. */ |
35 | 2.18k | START_RELOC_NUMBERS (elf_ppc_reloc_type) |
36 | 2.18k | RELOC_NUMBER (R_PPC_NONE, 0) |
37 | 35 | RELOC_NUMBER (R_PPC_ADDR32, 1) |
38 | 14 | RELOC_NUMBER (R_PPC_ADDR24, 2) |
39 | 14 | RELOC_NUMBER (R_PPC_ADDR16, 3) |
40 | 9 | RELOC_NUMBER (R_PPC_ADDR16_LO, 4) |
41 | 2 | RELOC_NUMBER (R_PPC_ADDR16_HI, 5) |
42 | 4 | RELOC_NUMBER (R_PPC_ADDR16_HA, 6) |
43 | 9 | RELOC_NUMBER (R_PPC_ADDR14, 7) |
44 | 13 | RELOC_NUMBER (R_PPC_ADDR14_BRTAKEN, 8) |
45 | 238 | RELOC_NUMBER (R_PPC_ADDR14_BRNTAKEN, 9) |
46 | 5 | RELOC_NUMBER (R_PPC_REL24, 10) |
47 | 8 | RELOC_NUMBER (R_PPC_REL14, 11) |
48 | 8 | RELOC_NUMBER (R_PPC_REL14_BRTAKEN, 12) |
49 | 3 | RELOC_NUMBER (R_PPC_REL14_BRNTAKEN, 13) |
50 | 7 | RELOC_NUMBER (R_PPC_GOT16, 14) |
51 | 2 | RELOC_NUMBER (R_PPC_GOT16_LO, 15) |
52 | 30 | RELOC_NUMBER (R_PPC_GOT16_HI, 16) |
53 | 6 | RELOC_NUMBER (R_PPC_GOT16_HA, 17) |
54 | 10 | RELOC_NUMBER (R_PPC_PLTREL24, 18) |
55 | 7 | RELOC_NUMBER (R_PPC_COPY, 19) |
56 | 18 | RELOC_NUMBER (R_PPC_GLOB_DAT, 20) |
57 | 214 | RELOC_NUMBER (R_PPC_JMP_SLOT, 21) |
58 | 2 | RELOC_NUMBER (R_PPC_RELATIVE, 22) |
59 | 1 | RELOC_NUMBER (R_PPC_LOCAL24PC, 23) |
60 | 2 | RELOC_NUMBER (R_PPC_UADDR32, 24) |
61 | 7 | RELOC_NUMBER (R_PPC_UADDR16, 25) |
62 | 6 | RELOC_NUMBER (R_PPC_REL32, 26) |
63 | 4 | RELOC_NUMBER (R_PPC_PLT32, 27) |
64 | 2 | RELOC_NUMBER (R_PPC_PLTREL32, 28) |
65 | 0 | RELOC_NUMBER (R_PPC_PLT16_LO, 29) |
66 | 7 | RELOC_NUMBER (R_PPC_PLT16_HI, 30) |
67 | 9 | RELOC_NUMBER (R_PPC_PLT16_HA, 31) |
68 | 19 | RELOC_NUMBER (R_PPC_SDAREL16, 32) |
69 | 32 | RELOC_NUMBER (R_PPC_SECTOFF, 33) |
70 | 5 | RELOC_NUMBER (R_PPC_SECTOFF_LO, 34) |
71 | 8 | RELOC_NUMBER (R_PPC_SECTOFF_HI, 35) |
72 | 2 | RELOC_NUMBER (R_PPC_SECTOFF_HA, 36) |
73 | 2 | RELOC_NUMBER (R_PPC_ADDR30, 37) |
74 | | |
75 | | #ifndef RELOC_MACROS_GEN_FUNC |
76 | | /* Relocations only used internally by ld. If you need to use these |
77 | | reloc numbers, you can change them to some other unused value |
78 | | without affecting the ABI. They will never appear in object files. */ |
79 | | RELOC_NUMBER (R_PPC_RELAX, 48) |
80 | | RELOC_NUMBER (R_PPC_RELAX_PLT, 49) |
81 | | RELOC_NUMBER (R_PPC_RELAX_PLTREL24, 50) |
82 | | /* Reloc only used internally by gas. As above, value is unimportant. */ |
83 | | RELOC_NUMBER (R_PPC_16DX_HA, 51) |
84 | | #endif |
85 | | |
86 | | /* Relocs added to support TLS. */ |
87 | 0 | RELOC_NUMBER (R_PPC_TLS, 67) |
88 | 10 | RELOC_NUMBER (R_PPC_DTPMOD32, 68) |
89 | 5 | RELOC_NUMBER (R_PPC_TPREL16, 69) |
90 | 27 | RELOC_NUMBER (R_PPC_TPREL16_LO, 70) |
91 | 3 | RELOC_NUMBER (R_PPC_TPREL16_HI, 71) |
92 | 0 | RELOC_NUMBER (R_PPC_TPREL16_HA, 72) |
93 | 7 | RELOC_NUMBER (R_PPC_TPREL32, 73) |
94 | 2 | RELOC_NUMBER (R_PPC_DTPREL16, 74) |
95 | 3 | RELOC_NUMBER (R_PPC_DTPREL16_LO, 75) |
96 | 41 | RELOC_NUMBER (R_PPC_DTPREL16_HI, 76) |
97 | 1 | RELOC_NUMBER (R_PPC_DTPREL16_HA, 77) |
98 | 4 | RELOC_NUMBER (R_PPC_DTPREL32, 78) |
99 | 42 | RELOC_NUMBER (R_PPC_GOT_TLSGD16, 79) |
100 | 10 | RELOC_NUMBER (R_PPC_GOT_TLSGD16_LO, 80) |
101 | 3 | RELOC_NUMBER (R_PPC_GOT_TLSGD16_HI, 81) |
102 | 0 | RELOC_NUMBER (R_PPC_GOT_TLSGD16_HA, 82) |
103 | 2 | RELOC_NUMBER (R_PPC_GOT_TLSLD16, 83) |
104 | 0 | RELOC_NUMBER (R_PPC_GOT_TLSLD16_LO, 84) |
105 | 4 | RELOC_NUMBER (R_PPC_GOT_TLSLD16_HI, 85) |
106 | 0 | RELOC_NUMBER (R_PPC_GOT_TLSLD16_HA, 86) |
107 | 0 | RELOC_NUMBER (R_PPC_GOT_TPREL16, 87) |
108 | 1 | RELOC_NUMBER (R_PPC_GOT_TPREL16_LO, 88) |
109 | 4 | RELOC_NUMBER (R_PPC_GOT_TPREL16_HI, 89) |
110 | 4 | RELOC_NUMBER (R_PPC_GOT_TPREL16_HA, 90) |
111 | 1 | RELOC_NUMBER (R_PPC_GOT_DTPREL16, 91) |
112 | 3 | RELOC_NUMBER (R_PPC_GOT_DTPREL16_LO, 92) |
113 | 4 | RELOC_NUMBER (R_PPC_GOT_DTPREL16_HI, 93) |
114 | 2 | RELOC_NUMBER (R_PPC_GOT_DTPREL16_HA, 94) |
115 | 10 | RELOC_NUMBER (R_PPC_TLSGD, 95) |
116 | 9 | RELOC_NUMBER (R_PPC_TLSLD, 96) |
117 | | |
118 | | /* The remaining relocs are from the Embedded ELF ABI, and are not |
119 | | in the SVR4 ELF ABI. */ |
120 | 7 | RELOC_NUMBER (R_PPC_EMB_NADDR32, 101) |
121 | 1 | RELOC_NUMBER (R_PPC_EMB_NADDR16, 102) |
122 | 4 | RELOC_NUMBER (R_PPC_EMB_NADDR16_LO, 103) |
123 | 4 | RELOC_NUMBER (R_PPC_EMB_NADDR16_HI, 104) |
124 | 0 | RELOC_NUMBER (R_PPC_EMB_NADDR16_HA, 105) |
125 | 0 | RELOC_NUMBER (R_PPC_EMB_SDAI16, 106) |
126 | 14 | RELOC_NUMBER (R_PPC_EMB_SDA2I16, 107) |
127 | 2 | RELOC_NUMBER (R_PPC_EMB_SDA2REL, 108) |
128 | 8 | RELOC_NUMBER (R_PPC_EMB_SDA21, 109) |
129 | 1 | RELOC_NUMBER (R_PPC_EMB_MRKREF, 110) |
130 | 11 | RELOC_NUMBER (R_PPC_EMB_RELSEC16, 111) |
131 | 0 | RELOC_NUMBER (R_PPC_EMB_RELST_LO, 112) |
132 | 1 | RELOC_NUMBER (R_PPC_EMB_RELST_HI, 113) |
133 | 0 | RELOC_NUMBER (R_PPC_EMB_RELST_HA, 114) |
134 | 0 | RELOC_NUMBER (R_PPC_EMB_BIT_FLD, 115) |
135 | 1 | RELOC_NUMBER (R_PPC_EMB_RELSDA, 116) |
136 | | |
137 | | /* Marker reloc for inline plt call insns. */ |
138 | 4 | RELOC_NUMBER (R_PPC_PLTSEQ, 119) |
139 | 0 | RELOC_NUMBER (R_PPC_PLTCALL, 120) |
140 | | |
141 | | /* PowerPC VLE relocations. */ |
142 | 0 | RELOC_NUMBER (R_PPC_VLE_REL8, 216) |
143 | 0 | RELOC_NUMBER (R_PPC_VLE_REL15, 217) |
144 | 0 | RELOC_NUMBER (R_PPC_VLE_REL24, 218) |
145 | 10 | RELOC_NUMBER (R_PPC_VLE_LO16A, 219) |
146 | 6 | RELOC_NUMBER (R_PPC_VLE_LO16D, 220) |
147 | 2 | RELOC_NUMBER (R_PPC_VLE_HI16A, 221) |
148 | 0 | RELOC_NUMBER (R_PPC_VLE_HI16D, 222) |
149 | 5 | RELOC_NUMBER (R_PPC_VLE_HA16A, 223) |
150 | 0 | RELOC_NUMBER (R_PPC_VLE_HA16D, 224) |
151 | 3 | RELOC_NUMBER (R_PPC_VLE_SDA21, 225) |
152 | 1 | RELOC_NUMBER (R_PPC_VLE_SDA21_LO, 226) |
153 | 3 | RELOC_NUMBER (R_PPC_VLE_SDAREL_LO16A, 227) |
154 | 3 | RELOC_NUMBER (R_PPC_VLE_SDAREL_LO16D, 228) |
155 | 3 | RELOC_NUMBER (R_PPC_VLE_SDAREL_HI16A, 229) |
156 | 3 | RELOC_NUMBER (R_PPC_VLE_SDAREL_HI16D, 230) |
157 | 4 | RELOC_NUMBER (R_PPC_VLE_SDAREL_HA16A, 231) |
158 | 4 | RELOC_NUMBER (R_PPC_VLE_SDAREL_HA16D, 232) |
159 | 5 | RELOC_NUMBER (R_PPC_VLE_ADDR20, 233) |
160 | | |
161 | | /* Power9 split rel16 for addpcis. */ |
162 | 12 | RELOC_NUMBER (R_PPC_REL16DX_HA, 246) |
163 | | |
164 | | /* Support STT_GNU_IFUNC plt calls. */ |
165 | 1 | RELOC_NUMBER (R_PPC_IRELATIVE, 248) |
166 | | |
167 | | /* These are GNU extensions used in PIC code sequences. */ |
168 | 22 | RELOC_NUMBER (R_PPC_REL16, 249) |
169 | 9 | RELOC_NUMBER (R_PPC_REL16_LO, 250) |
170 | 1 | RELOC_NUMBER (R_PPC_REL16_HI, 251) |
171 | 9 | RELOC_NUMBER (R_PPC_REL16_HA, 252) |
172 | | |
173 | | /* These are GNU extensions to enable C++ vtable garbage collection. */ |
174 | 3 | RELOC_NUMBER (R_PPC_GNU_VTINHERIT, 253) |
175 | 1 | RELOC_NUMBER (R_PPC_GNU_VTENTRY, 254) |
176 | | |
177 | | /* This is a phony reloc to handle any old fashioned TOC16 references |
178 | | that may still be in object files. */ |
179 | 102 | RELOC_NUMBER (R_PPC_TOC16, 255) |
180 | | |
181 | 514 | END_RELOC_NUMBERS (R_PPC_max) |
182 | | |
183 | | #define IS_PPC_TLS_RELOC(R) \ |
184 | 0 | ((R) >= R_PPC_TLS && (R) <= R_PPC_GOT_DTPREL16_HA) |
185 | | |
186 | | /* Specify the value of _GLOBAL_OFFSET_TABLE_. */ |
187 | 49 | #define DT_PPC_GOT (DT_LOPROC) |
188 | | |
189 | | /* Specify that tls descriptors should be optimized. */ |
190 | 5 | #define DT_PPC_OPT (DT_LOPROC + 1) |
191 | | #define PPC_OPT_TLS 1 |
192 | | |
193 | | /* Processor specific flags for the ELF header e_flags field. */ |
194 | | |
195 | 366 | #define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag. */ |
196 | | |
197 | 366 | #define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag. */ |
198 | 366 | #define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib flag. */ |
199 | | |
200 | | /* Processor specific program headers, p_flags field. */ |
201 | 2 | #define PF_PPC_VLE 0x10000000 /* PowerPC VLE. */ |
202 | | |
203 | | /* Processor specific section headers, sh_flags field. */ |
204 | 16.7k | #define SHF_PPC_VLE 0x10000000 /* PowerPC VLE text section. */ |
205 | | |
206 | | /* Processor specific section headers, sh_type field. */ |
207 | | |
208 | 97.7k | #define SHT_ORDERED SHT_HIPROC /* Link editor is to sort the \ |
209 | | entries in this section \ |
210 | | based on the address \ |
211 | | specified in the associated \ |
212 | | symbol table entry. */ |
213 | | |
214 | | /* APUinfo note section. */ |
215 | 35.0k | #define APUINFO_SECTION_NAME ".PPC.EMB.apuinfo" |
216 | 0 | #define APUINFO_LABEL "APUinfo" |
217 | | |
218 | 836 | #define PPC_APUINFO_ISEL 0x40 |
219 | 1.18k | #define PPC_APUINFO_PMR 0x41 |
220 | 2.45k | #define PPC_APUINFO_RFMCI 0x42 |
221 | 1.27k | #define PPC_APUINFO_CACHELCK 0x43 |
222 | 1.22k | #define PPC_APUINFO_SPE 0x100 |
223 | 10.1k | #define PPC_APUINFO_EFS 0x101 |
224 | 11.1k | #define PPC_APUINFO_BRLOCK 0x102 |
225 | 204 | #define PPC_APUINFO_VLE 0x104 |
226 | | |
227 | | /* Object attribute tags. */ |
228 | | enum |
229 | | { |
230 | | /* 0-3 are generic. */ |
231 | | |
232 | | /* FP ABI, low 2 bits: |
233 | | 1 for double precision hard-float, |
234 | | 2 for soft-float, |
235 | | 3 for single precision hard-float. |
236 | | 0 for not tagged or not using any ABIs affected by the differences. |
237 | | Next 2 bits: |
238 | | 1 for ibm long double |
239 | | 2 for 64-bit long double |
240 | | 3 for IEEE long double. |
241 | | 0 for not tagged or not using any ABIs affected by the differences. */ |
242 | | Tag_GNU_Power_ABI_FP = 4, |
243 | | |
244 | | /* Value 1 for general purpose registers only, 2 for AltiVec |
245 | | registers, 3 for SPE registers; 0 for not tagged or not using any |
246 | | ABIs affected by the differences. */ |
247 | | Tag_GNU_Power_ABI_Vector = 8, |
248 | | |
249 | | /* Value 1 for ABIs using r3/r4 for returning structures <= 8 bytes, |
250 | | 2 for ABIs using memory; 0 for not tagged or not using any ABIs |
251 | | affected by the differences. */ |
252 | | Tag_GNU_Power_ABI_Struct_Return = 12 |
253 | | }; |
254 | | |
255 | | #endif /* _ELF_PPC_H */ |