]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - include/elf/loongarch.h
LoongArch bfd support
[thirdparty/binutils-gdb.git] / include / elf / loongarch.h
1 /* Copyright (C) 2021 Free Software Foundation, Inc.
2 Contributed by Loongson Ltd.
3
4 This file is part of GNU Binutils.
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; see the file COPYING3. If not,
18 see <http://www.gnu.org/licenses/>. */
19
20 #ifndef _ELF_LOONGARCH_H
21 #define _ELF_LOONGARCH_H
22
23 #include "elf/reloc-macros.h"
24 #include "libiberty.h"
25
26 START_RELOC_NUMBERS (elf_loongarch_reloc_type)
27 /* Used by the dynamic linker. */
28 RELOC_NUMBER (R_LARCH_NONE, 0)
29 RELOC_NUMBER (R_LARCH_32, 1)
30 RELOC_NUMBER (R_LARCH_64, 2)
31 RELOC_NUMBER (R_LARCH_RELATIVE, 3)
32 RELOC_NUMBER (R_LARCH_COPY, 4)
33 RELOC_NUMBER (R_LARCH_JUMP_SLOT, 5)
34 RELOC_NUMBER (R_LARCH_TLS_DTPMOD32, 6)
35 RELOC_NUMBER (R_LARCH_TLS_DTPMOD64, 7)
36 RELOC_NUMBER (R_LARCH_TLS_DTPREL32, 8)
37 RELOC_NUMBER (R_LARCH_TLS_DTPREL64, 9)
38 RELOC_NUMBER (R_LARCH_TLS_TPREL32, 10)
39 RELOC_NUMBER (R_LARCH_TLS_TPREL64, 11)
40 RELOC_NUMBER (R_LARCH_IRELATIVE, 12)
41
42 /* Reserved for future relocs that the dynamic linker must understand. */
43
44 /* Used by the static linker for relocating .text. */
45 RELOC_NUMBER (R_LARCH_MARK_LA, 20)
46 RELOC_NUMBER (R_LARCH_MARK_PCREL, 21)
47
48 RELOC_NUMBER (R_LARCH_SOP_PUSH_PCREL, 22)
49
50 RELOC_NUMBER (R_LARCH_SOP_PUSH_ABSOLUTE, 23)
51
52 RELOC_NUMBER (R_LARCH_SOP_PUSH_DUP, 24)
53 RELOC_NUMBER (R_LARCH_SOP_PUSH_GPREL, 25)
54 RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_TPREL, 26)
55 RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_GOT, 27)
56 RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_GD, 28)
57 RELOC_NUMBER (R_LARCH_SOP_PUSH_PLT_PCREL, 29)
58
59 RELOC_NUMBER (R_LARCH_SOP_ASSERT, 30)
60 RELOC_NUMBER (R_LARCH_SOP_NOT, 31)
61 RELOC_NUMBER (R_LARCH_SOP_SUB, 32)
62 RELOC_NUMBER (R_LARCH_SOP_SL, 33)
63 RELOC_NUMBER (R_LARCH_SOP_SR, 34)
64 RELOC_NUMBER (R_LARCH_SOP_ADD, 35)
65 RELOC_NUMBER (R_LARCH_SOP_AND, 36)
66 RELOC_NUMBER (R_LARCH_SOP_IF_ELSE, 37)
67 RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_5, 38)
68 RELOC_NUMBER (R_LARCH_SOP_POP_32_U_10_12, 39)
69 RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_12, 40)
70 RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_16, 41)
71 RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_16_S2, 42)
72 RELOC_NUMBER (R_LARCH_SOP_POP_32_S_5_20, 43)
73 RELOC_NUMBER (R_LARCH_SOP_POP_32_S_0_5_10_16_S2, 44)
74 RELOC_NUMBER (R_LARCH_SOP_POP_32_S_0_10_10_16_S2, 45)
75 RELOC_NUMBER (R_LARCH_SOP_POP_32_U, 46)
76
77 /* Used by the static linker for relocating non .text. */
78 RELOC_NUMBER (R_LARCH_ADD8, 47)
79 RELOC_NUMBER (R_LARCH_ADD16, 48)
80 RELOC_NUMBER (R_LARCH_ADD24, 49)
81 RELOC_NUMBER (R_LARCH_ADD32, 50)
82 RELOC_NUMBER (R_LARCH_ADD64, 51)
83 RELOC_NUMBER (R_LARCH_SUB8, 52)
84 RELOC_NUMBER (R_LARCH_SUB16, 53)
85 RELOC_NUMBER (R_LARCH_SUB24, 54)
86 RELOC_NUMBER (R_LARCH_SUB32, 55)
87 RELOC_NUMBER (R_LARCH_SUB64, 56)
88
89 /* I don't know what it is. Existing in almost all other arch. */
90 RELOC_NUMBER (R_LARCH_GNU_VTINHERIT, 57)
91 RELOC_NUMBER (R_LARCH_GNU_VTENTRY, 58)
92
93 END_RELOC_NUMBERS (R_LARCH_count)
94
95 /* Processor specific flags for the ELF header e_flags field. */
96 #define EF_LOONGARCH_ABI_ILP32 0b01
97 #define EF_LOONGARCH_ABI_LP64 0b11
98 #define EF_LOONGARCH_ABI_MASK 0b11
99
100 #define EF_LOONGARCH_FLOAT_ABI_SOFT 0b001100
101 #define EF_LOONGARCH_FLOAT_ABI_SINGLE 0b001000
102 #define EF_LOONGARCH_FLOAT_ABI_DOUBLE 0b000000
103 #define EF_LOONGARCH_FLOAT_ABI_MASK 0b111100
104
105 #define EF_LOONGARCH_IS_LP64(abi) \
106 ((abi & EF_LOONGARCH_ABI_MASK) == EF_LOONGARCH_ABI_LP64)
107 #define EF_LOONGARCH_IS_ILP32(abi) \
108 ((abi & EF_LOONGARCH_ABI_MASK) == EF_LOONGARCH_ABI_ILP32)
109
110 #define EF_LOONGARCH_IS_SOFT_FLOAT(abi) \
111 ((abi & EF_LOONGARCH_FLOAT_ABI_MASK) == EF_LOONGARCH_FLOAT_ABI_SOFT)
112 #define EF_LOONGARCH_IS_SINGLE_FLOAT(abi) \
113 ((abi & EF_LOONGARCH_FLOAT_ABI_MASK) == EF_LOONGARCH_FLOAT_ABI_SINGLE)
114 #define EF_LOONGARCH_IS_DOUBLE_FLOAT(abi) \
115 ((abi & EF_LOONGARCH_FLOAT_ABI_MASK) == EF_LOONGARCH_FLOAT_ABI_DOUBLE)
116
117 #define EF_LOONGARCH_ABI (EF_LOONGARCH_ABI_MASK | EF_LOONGARCH_FLOAT_ABI_MASK)
118
119 #endif /* _ELF_LOONGARCH_H */