/src/binutils-gdb/include/elf/mmix.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* MMIX support for BFD. |
2 | | Copyright (C) 2001-2025 Free Software Foundation, Inc. |
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 |
8 | | the Free Software Foundation; either version 3 of the License, or |
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 |
18 | | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
19 | | MA 02110-1301, USA. */ |
20 | | |
21 | | /* This file holds definitions specific to the MMIX ELF ABI. */ |
22 | | |
23 | | #ifndef ELF_MMIX_H |
24 | | #define ELF_MMIX_H |
25 | | |
26 | | #include "elf/reloc-macros.h" |
27 | | |
28 | | /* Relocations. See the reloc table in bfd/elf64-mmix.c for details. */ |
29 | 942 | START_RELOC_NUMBERS (elf_mmix_reloc_type) |
30 | 942 | RELOC_NUMBER (R_MMIX_NONE, 0) |
31 | | |
32 | | /* Standard absolute relocations. */ |
33 | 9 | RELOC_NUMBER (R_MMIX_8, 1) |
34 | 11 | RELOC_NUMBER (R_MMIX_16, 2) |
35 | 11 | RELOC_NUMBER (R_MMIX_24, 3) |
36 | 9 | RELOC_NUMBER (R_MMIX_32, 4) |
37 | 9 | RELOC_NUMBER (R_MMIX_64, 5) |
38 | | |
39 | | /* Standard relative relocations. */ |
40 | 7 | RELOC_NUMBER (R_MMIX_PC_8, 6) |
41 | 9 | RELOC_NUMBER (R_MMIX_PC_16, 7) |
42 | 27 | RELOC_NUMBER (R_MMIX_PC_24, 8) |
43 | 61 | RELOC_NUMBER (R_MMIX_PC_32, 9) |
44 | 4 | RELOC_NUMBER (R_MMIX_PC_64, 10) |
45 | | |
46 | | /* GNU extensions for C++ vtables. */ |
47 | 5 | RELOC_NUMBER (R_MMIX_GNU_VTINHERIT, 11) |
48 | 8 | RELOC_NUMBER (R_MMIX_GNU_VTENTRY, 12) |
49 | | |
50 | | /* A GETA instruction. */ |
51 | 8 | RELOC_NUMBER (R_MMIX_GETA, 13) |
52 | 3 | RELOC_NUMBER (R_MMIX_GETA_1, 14) |
53 | 2 | RELOC_NUMBER (R_MMIX_GETA_2, 15) |
54 | 7 | RELOC_NUMBER (R_MMIX_GETA_3, 16) |
55 | | |
56 | | /* A conditional branch instruction. */ |
57 | 10 | RELOC_NUMBER (R_MMIX_CBRANCH, 17) |
58 | 6 | RELOC_NUMBER (R_MMIX_CBRANCH_J, 18) |
59 | 9 | RELOC_NUMBER (R_MMIX_CBRANCH_1, 19) |
60 | 35 | RELOC_NUMBER (R_MMIX_CBRANCH_2, 20) |
61 | 6 | RELOC_NUMBER (R_MMIX_CBRANCH_3, 21) |
62 | | |
63 | | /* A PUSHJ instruction. */ |
64 | 4 | RELOC_NUMBER (R_MMIX_PUSHJ, 22) |
65 | 3 | RELOC_NUMBER (R_MMIX_PUSHJ_1, 23) |
66 | 18 | RELOC_NUMBER (R_MMIX_PUSHJ_2, 24) |
67 | 0 | RELOC_NUMBER (R_MMIX_PUSHJ_3, 25) |
68 | | |
69 | | /* A JMP instruction. */ |
70 | 5 | RELOC_NUMBER (R_MMIX_JMP, 26) |
71 | 9 | RELOC_NUMBER (R_MMIX_JMP_1, 27) |
72 | 11 | RELOC_NUMBER (R_MMIX_JMP_2, 28) |
73 | 4 | RELOC_NUMBER (R_MMIX_JMP_3, 29) |
74 | | |
75 | | /* A relative address such as in a GETA or a branch. */ |
76 | 3 | RELOC_NUMBER (R_MMIX_ADDR19, 30) |
77 | | |
78 | | /* A relative address such as in a JMP (only). */ |
79 | 1 | RELOC_NUMBER (R_MMIX_ADDR27, 31) |
80 | | |
81 | | /* A general register or a number 0..255. */ |
82 | 22 | RELOC_NUMBER (R_MMIX_REG_OR_BYTE, 32) |
83 | | |
84 | | /* A general register. */ |
85 | 13 | RELOC_NUMBER (R_MMIX_REG, 33) |
86 | | |
87 | | /* A global register and an offset, the global register (allocated at |
88 | | link time) contents plus the offset made equivalent to the relocation |
89 | | expression at link time. The relocation must point at the Y field of |
90 | | an instruction. */ |
91 | 3 | RELOC_NUMBER (R_MMIX_BASE_PLUS_OFFSET, 34) |
92 | | |
93 | | /* A LOCAL assertion. */ |
94 | 4 | RELOC_NUMBER (R_MMIX_LOCAL, 35) |
95 | | |
96 | | /* A PUSHJ instruction, generating a stub if it does not reach. */ |
97 | 13 | RELOC_NUMBER (R_MMIX_PUSHJ_STUBBABLE, 36) |
98 | 400 | END_RELOC_NUMBERS (R_MMIX_max) |
99 | | |
100 | | |
101 | | /* Section Attributes. */ |
102 | | /* A section containing necessary information for relaxation. */ |
103 | | #define SHF_MMIX_CANRELAX 0x80000000 |
104 | | |
105 | | /* Symbol attributes. */ |
106 | | /* A symbol with this section-index is a register. */ |
107 | 0 | #define SHN_REGISTER SHN_LOPROC |
108 | | |
109 | | /* This section holds contents for each initialized register, at VMA |
110 | | regno*8. A symbol relative to this section will be transformed to an |
111 | | absolute symbol with the value corresponding to the register number at |
112 | | final link time. A symbol with a value outside the inclusive range |
113 | | 32*8 .. 254*8 is an error. It is highly recommended to only use an |
114 | | upper bound of 253*8 or lower as specified in the (currently |
115 | | unspecified) ABI. */ |
116 | 523 | #define MMIX_REG_CONTENTS_SECTION_NAME ".MMIX.reg_contents" |
117 | | |
118 | | /* At link time, a section by this name is created, expected to be |
119 | | included in MMIX_REG_CONTENTS_SECTION_NAME in the output. */ |
120 | | #define MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME \ |
121 | 0 | ".MMIX.reg_contents.linker_allocated" |
122 | | |
123 | | /* This is a faked section holding symbols with SHN_REGISTER. Don't |
124 | | confuse it with MMIX_REG_CONTENTS_SECTION_NAME; this one has no |
125 | | contents, just values. It is an error for a value in this section to |
126 | | be outside the range 32..255 and it must never become an actual section |
127 | | in an object file. */ |
128 | 919 | #define MMIX_REG_SECTION_NAME "*REG*" |
129 | | |
130 | | /* Appended with a number N=0..65535, this is a representation of the |
131 | | mmixal "BSPEC N" ... "ESPEC" directive pair; the contents go into an |
132 | | ELF section by name ".MMIX.spec_data.N". */ |
133 | 94.4k | #define MMIX_OTHER_SPEC_SECTION_PREFIX ".MMIX.spec_data." |
134 | | |
135 | | /* A section SECNAME is noted to start at "__.MMIX.start.SECNAME" by the |
136 | | presence of this symbol. Currently only implemented for ".text" |
137 | | through the symbol "__.MMIX.start..text". */ |
138 | 0 | #define MMIX_LOC_SECTION_START_SYMBOL_PREFIX "__.MMIX.start." |
139 | | |
140 | | /* This symbol is always a function. */ |
141 | 38.0k | #define MMIX_START_SYMBOL_NAME "Main" |
142 | | |
143 | | |
144 | | /* We smuggle in a few MMO specifics here. We don't make a specific MMO |
145 | | file, since we can't reasonably support MMO without ELF; we have to |
146 | | include this file anyway. */ |
147 | | |
148 | 21.6k | #define MMO_TEXT_SECTION_NAME ".text" |
149 | 11.3k | #define MMO_DATA_SECTION_NAME ".data" |
150 | | |
151 | | /* A definition for the flags we put in spec data in files. A copy of our |
152 | | own of some flags to keep immune to BFD flag changes. See section.c of |
153 | | 2001-07-18 for flag documentation. */ |
154 | 13.7k | #define MMO_SEC_ALLOC 0x001 |
155 | 13.7k | #define MMO_SEC_LOAD 0x002 |
156 | 13.7k | #define MMO_SEC_RELOC 0x004 |
157 | 13.7k | #define MMO_SEC_READONLY 0x010 |
158 | 13.7k | #define MMO_SEC_CODE 0x020 |
159 | 13.7k | #define MMO_SEC_DATA 0x040 |
160 | 13.7k | #define MMO_SEC_NEVER_LOAD 0x400 |
161 | 13.7k | #define MMO_SEC_IS_COMMON 0x8000 |
162 | 13.7k | #define MMO_SEC_DEBUGGING 0x10000 |
163 | | |
164 | | #ifdef BFD_ARCH_SIZE |
165 | | extern bool _bfd_mmix_before_linker_allocation |
166 | | (bfd *, struct bfd_link_info *); |
167 | | extern bool _bfd_mmix_after_linker_allocation |
168 | | (bfd *, struct bfd_link_info *); |
169 | | extern bool _bfd_mmix_check_all_relocs |
170 | | (bfd *, struct bfd_link_info *); |
171 | | #endif |
172 | | |
173 | | #endif /* ELF_MMIX_H */ |