1#ifndef ELF_RELOC
2#error "ELF_RELOC must be defined"
3#endif
4
5// These types and values are from the LoongArch ELF psABI which can be found at
6// https://github.com/loongson/LoongArch-Documentation
7// and these definitions has been adopted by binutils (include/elf/loongarch.h).
8// The commit hash (main branch) we reference is:
9// 9b3bd9f4a497115913c22f1a2a47863798fbc02a
10
11ELF_RELOC(R_LARCH_NONE,                        0)
12ELF_RELOC(R_LARCH_32,                          1)
13ELF_RELOC(R_LARCH_64,                          2)
14ELF_RELOC(R_LARCH_RELATIVE,                    3)
15ELF_RELOC(R_LARCH_COPY,                        4)
16ELF_RELOC(R_LARCH_JUMP_SLOT,                   5)
17ELF_RELOC(R_LARCH_TLS_DTPMOD32,                6)
18ELF_RELOC(R_LARCH_TLS_DTPMOD64,                7)
19ELF_RELOC(R_LARCH_TLS_DTPREL32,                8)
20ELF_RELOC(R_LARCH_TLS_DTPREL64,                9)
21ELF_RELOC(R_LARCH_TLS_TPREL32,                10)
22ELF_RELOC(R_LARCH_TLS_TPREL64,                11)
23ELF_RELOC(R_LARCH_IRELATIVE,                  12)
24ELF_RELOC(R_LARCH_MARK_LA,                    20)
25ELF_RELOC(R_LARCH_MARK_PCREL,                 21)
26ELF_RELOC(R_LARCH_SOP_PUSH_PCREL,             22)
27ELF_RELOC(R_LARCH_SOP_PUSH_ABSOLUTE,          23)
28ELF_RELOC(R_LARCH_SOP_PUSH_DUP,               24)
29ELF_RELOC(R_LARCH_SOP_PUSH_GPREL,             25)
30ELF_RELOC(R_LARCH_SOP_PUSH_TLS_TPREL,         26)
31ELF_RELOC(R_LARCH_SOP_PUSH_TLS_GOT,           27)
32ELF_RELOC(R_LARCH_SOP_PUSH_TLS_GD,            28)
33ELF_RELOC(R_LARCH_SOP_PUSH_PLT_PCREL,         29)
34ELF_RELOC(R_LARCH_SOP_ASSERT,                 30)
35ELF_RELOC(R_LARCH_SOP_NOT,                    31)
36ELF_RELOC(R_LARCH_SOP_SUB,                    32)
37ELF_RELOC(R_LARCH_SOP_SL,                     33)
38ELF_RELOC(R_LARCH_SOP_SR,                     34)
39ELF_RELOC(R_LARCH_SOP_ADD,                    35)
40ELF_RELOC(R_LARCH_SOP_AND,                    36)
41ELF_RELOC(R_LARCH_SOP_IF_ELSE,                37)
42ELF_RELOC(R_LARCH_SOP_POP_32_S_10_5,          38)
43ELF_RELOC(R_LARCH_SOP_POP_32_U_10_12,         39)
44ELF_RELOC(R_LARCH_SOP_POP_32_S_10_12,         40)
45ELF_RELOC(R_LARCH_SOP_POP_32_S_10_16,         41)
46ELF_RELOC(R_LARCH_SOP_POP_32_S_10_16_S2,      42)
47ELF_RELOC(R_LARCH_SOP_POP_32_S_5_20,          43)
48ELF_RELOC(R_LARCH_SOP_POP_32_S_0_5_10_16_S2,  44)
49ELF_RELOC(R_LARCH_SOP_POP_32_S_0_10_10_16_S2, 45)
50ELF_RELOC(R_LARCH_SOP_POP_32_U,               46)
51ELF_RELOC(R_LARCH_ADD8,                       47)
52ELF_RELOC(R_LARCH_ADD16,                      48)
53ELF_RELOC(R_LARCH_ADD24,                      49)
54ELF_RELOC(R_LARCH_ADD32,                      50)
55ELF_RELOC(R_LARCH_ADD64,                      51)
56ELF_RELOC(R_LARCH_SUB8,                       52)
57ELF_RELOC(R_LARCH_SUB16,                      53)
58ELF_RELOC(R_LARCH_SUB24,                      54)
59ELF_RELOC(R_LARCH_SUB32,                      55)
60ELF_RELOC(R_LARCH_SUB64,                      56)
61ELF_RELOC(R_LARCH_GNU_VTINHERIT,              57)
62ELF_RELOC(R_LARCH_GNU_VTENTRY,                58)
63
64// Relocs whose processing do not require a stack machine.
65//
66// Spec addition: https://github.com/loongson/LoongArch-Documentation/pull/57
67// Binutils commit 6d13722a97cee3fd397e116bde3bcedbb1e220be
68//      and commit 9801120721c3a702ce3bd50433ef920f92a83502
69ELF_RELOC(R_LARCH_B16,              64)
70ELF_RELOC(R_LARCH_B21,              65)
71ELF_RELOC(R_LARCH_B26,              66)
72ELF_RELOC(R_LARCH_ABS_HI20,         67)
73ELF_RELOC(R_LARCH_ABS_LO12,         68)
74ELF_RELOC(R_LARCH_ABS64_LO20,       69)
75ELF_RELOC(R_LARCH_ABS64_HI12,       70)
76ELF_RELOC(R_LARCH_PCALA_HI20,       71)
77ELF_RELOC(R_LARCH_PCALA_LO12,       72)
78ELF_RELOC(R_LARCH_PCALA64_LO20,     73)
79ELF_RELOC(R_LARCH_PCALA64_HI12,     74)
80ELF_RELOC(R_LARCH_GOT_PC_HI20,      75)
81ELF_RELOC(R_LARCH_GOT_PC_LO12,      76)
82ELF_RELOC(R_LARCH_GOT64_PC_LO20,    77)
83ELF_RELOC(R_LARCH_GOT64_PC_HI12,    78)
84ELF_RELOC(R_LARCH_GOT_HI20,         79)
85ELF_RELOC(R_LARCH_GOT_LO12,         80)
86ELF_RELOC(R_LARCH_GOT64_LO20,       81)
87ELF_RELOC(R_LARCH_GOT64_HI12,       82)
88ELF_RELOC(R_LARCH_TLS_LE_HI20,      83)
89ELF_RELOC(R_LARCH_TLS_LE_LO12,      84)
90ELF_RELOC(R_LARCH_TLS_LE64_LO20,    85)
91ELF_RELOC(R_LARCH_TLS_LE64_HI12,    86)
92ELF_RELOC(R_LARCH_TLS_IE_PC_HI20,   87)
93ELF_RELOC(R_LARCH_TLS_IE_PC_LO12,   88)
94ELF_RELOC(R_LARCH_TLS_IE64_PC_LO20, 89)
95ELF_RELOC(R_LARCH_TLS_IE64_PC_HI12, 90)
96ELF_RELOC(R_LARCH_TLS_IE_HI20,      91)
97ELF_RELOC(R_LARCH_TLS_IE_LO12,      92)
98ELF_RELOC(R_LARCH_TLS_IE64_LO20,    93)
99ELF_RELOC(R_LARCH_TLS_IE64_HI12,    94)
100ELF_RELOC(R_LARCH_TLS_LD_PC_HI20,   95)
101ELF_RELOC(R_LARCH_TLS_LD_HI20,      96)
102ELF_RELOC(R_LARCH_TLS_GD_PC_HI20,   97)
103ELF_RELOC(R_LARCH_TLS_GD_HI20,      98)
104ELF_RELOC(R_LARCH_32_PCREL,         99)
105ELF_RELOC(R_LARCH_RELAX,            100)
106
107// Relocs added in ELF for the LoongArch™ Architecture v20230519, part of the
108// v2.10 LoongArch ABI specs.
109//
110// Spec addition: https://github.com/loongson/la-abi-specs/pull/1
111// Binutils commit 57a930e3bfe4b2c7fd6463ed39311e1938513138
112ELF_RELOC(R_LARCH_DELETE,      101)
113ELF_RELOC(R_LARCH_ALIGN,       102)
114ELF_RELOC(R_LARCH_PCREL20_S2,  103)
115ELF_RELOC(R_LARCH_CFA,         104)
116ELF_RELOC(R_LARCH_ADD6,        105)
117ELF_RELOC(R_LARCH_SUB6,        106)
118ELF_RELOC(R_LARCH_ADD_ULEB128, 107)
119ELF_RELOC(R_LARCH_SUB_ULEB128, 108)
120ELF_RELOC(R_LARCH_64_PCREL,    109)
121