xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchFixupKinds.h (revision 52418fc2be8efa5172b90a3a9e617017173612c4)
1bdd1243dSDimitry Andric //===- LoongArchFixupKinds.h - LoongArch Specific Fixup Entries -*- C++ -*-===//
2bdd1243dSDimitry Andric //
3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bdd1243dSDimitry Andric //
7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
8bdd1243dSDimitry Andric 
9bdd1243dSDimitry Andric #ifndef LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHFIXUPKINDS_H
10bdd1243dSDimitry Andric #define LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHFIXUPKINDS_H
11bdd1243dSDimitry Andric 
12bdd1243dSDimitry Andric #include "llvm/BinaryFormat/ELF.h"
13bdd1243dSDimitry Andric #include "llvm/MC/MCFixup.h"
14bdd1243dSDimitry Andric 
15bdd1243dSDimitry Andric #undef LoongArch
16bdd1243dSDimitry Andric 
17bdd1243dSDimitry Andric namespace llvm {
18bdd1243dSDimitry Andric namespace LoongArch {
19bdd1243dSDimitry Andric //
20bdd1243dSDimitry Andric // This table *must* be in the same order of
21bdd1243dSDimitry Andric // MCFixupKindInfo Infos[LoongArch::NumTargetFixupKinds] in
22bdd1243dSDimitry Andric // LoongArchAsmBackend.cpp.
23bdd1243dSDimitry Andric //
24bdd1243dSDimitry Andric enum Fixups {
25bdd1243dSDimitry Andric   // Define fixups can be handled by LoongArchAsmBackend::applyFixup.
26bdd1243dSDimitry Andric   // 16-bit fixup corresponding to %b16(foo) for instructions like bne.
27bdd1243dSDimitry Andric   fixup_loongarch_b16 = FirstTargetFixupKind,
28bdd1243dSDimitry Andric   // 21-bit fixup corresponding to %b21(foo) for instructions like bnez.
29bdd1243dSDimitry Andric   fixup_loongarch_b21,
30bdd1243dSDimitry Andric   // 26-bit fixup corresponding to %b26(foo)/%plt(foo) for instructions b/bl.
31bdd1243dSDimitry Andric   fixup_loongarch_b26,
32bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %abs_hi20(foo) for instruction lu12i.w.
33bdd1243dSDimitry Andric   fixup_loongarch_abs_hi20,
34bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %abs_lo12(foo) for instruction ori.
35bdd1243dSDimitry Andric   fixup_loongarch_abs_lo12,
36bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %abs64_lo20(foo) for instruction lu32i.d.
37bdd1243dSDimitry Andric   fixup_loongarch_abs64_lo20,
38bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %abs_hi12(foo) for instruction lu52i.d.
39bdd1243dSDimitry Andric   fixup_loongarch_abs64_hi12,
40bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %le_hi20(foo) for instruction lu12i.w.
41bdd1243dSDimitry Andric   fixup_loongarch_tls_le_hi20,
42bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %le_lo12(foo) for instruction ori.
43bdd1243dSDimitry Andric   fixup_loongarch_tls_le_lo12,
44bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %le64_lo20(foo) for instruction lu32i.d.
45bdd1243dSDimitry Andric   fixup_loongarch_tls_le64_lo20,
46bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %le64_hi12(foo) for instruction lu52i.d.
47bdd1243dSDimitry Andric   fixup_loongarch_tls_le64_hi12,
48bdd1243dSDimitry Andric   // TODO: Add more fixup kind.
49bdd1243dSDimitry Andric 
50bdd1243dSDimitry Andric   // Used as a sentinel, must be the last of the fixup which can be handled by
51bdd1243dSDimitry Andric   // LoongArchAsmBackend::applyFixup.
52bdd1243dSDimitry Andric   fixup_loongarch_invalid,
53bdd1243dSDimitry Andric   NumTargetFixupKinds = fixup_loongarch_invalid - FirstTargetFixupKind,
54bdd1243dSDimitry Andric 
55bdd1243dSDimitry Andric   // Define fixups for force relocation as FirstLiteralRelocationKind+V
56bdd1243dSDimitry Andric   // represents the relocation type with number V.
57bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %pc_hi20(foo) for instruction pcalau12i.
58bdd1243dSDimitry Andric   fixup_loongarch_pcala_hi20 =
59bdd1243dSDimitry Andric       FirstLiteralRelocationKind + ELF::R_LARCH_PCALA_HI20,
60bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %pc_lo12(foo) for instructions like addi.w/d.
61bdd1243dSDimitry Andric   fixup_loongarch_pcala_lo12,
62bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %pc64_lo20(foo) for instruction lu32i.d.
63bdd1243dSDimitry Andric   fixup_loongarch_pcala64_lo20,
64bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %pc64_hi12(foo) for instruction lu52i.d.
65bdd1243dSDimitry Andric   fixup_loongarch_pcala64_hi12,
66bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %got_pc_hi20(foo) for instruction pcalau12i.
67bdd1243dSDimitry Andric   fixup_loongarch_got_pc_hi20,
68bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %got_pc_lo12(foo) for instructions
69bdd1243dSDimitry Andric   // ld.w/ld.d/add.d.
70bdd1243dSDimitry Andric   fixup_loongarch_got_pc_lo12,
71bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %got64_pc_lo20(foo) for instruction lu32i.d.
72bdd1243dSDimitry Andric   fixup_loongarch_got64_pc_lo20,
73bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %got64_pc_hi12(foo) for instruction lu52i.d.
74bdd1243dSDimitry Andric   fixup_loongarch_got64_pc_hi12,
75bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %got_hi20(foo) for instruction lu12i.w.
76bdd1243dSDimitry Andric   fixup_loongarch_got_hi20,
77bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %got_lo12(foo) for instruction ori.
78bdd1243dSDimitry Andric   fixup_loongarch_got_lo12,
79bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %got64_lo20(foo) for instruction lu32i.d.
80bdd1243dSDimitry Andric   fixup_loongarch_got64_lo20,
81bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %got64_hi12(foo) for instruction lu52i.d.
82bdd1243dSDimitry Andric   fixup_loongarch_got64_hi12,
83bdd1243dSDimitry Andric   // Skip R_LARCH_TLS_LE_*.
84bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %ie_pc_hi20(foo) for instruction pcalau12i.
85bdd1243dSDimitry Andric   fixup_loongarch_tls_ie_pc_hi20 =
86bdd1243dSDimitry Andric       FirstLiteralRelocationKind + ELF::R_LARCH_TLS_IE_PC_HI20,
87bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %ie_pc_lo12(foo) for instructions
88bdd1243dSDimitry Andric   // ld.w/ld.d/add.d.
89bdd1243dSDimitry Andric   fixup_loongarch_tls_ie_pc_lo12,
90bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %ie64_pc_lo20(foo) for instruction lu32i.d.
91bdd1243dSDimitry Andric   fixup_loongarch_tls_ie64_pc_lo20,
92bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %ie64_pc_hi12(foo) for instruction lu52i.d.
93bdd1243dSDimitry Andric   fixup_loongarch_tls_ie64_pc_hi12,
94bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %ie_hi20(foo) for instruction lu12i.w.
95bdd1243dSDimitry Andric   fixup_loongarch_tls_ie_hi20,
96bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %ie_lo12(foo) for instruction ori.
97bdd1243dSDimitry Andric   fixup_loongarch_tls_ie_lo12,
98bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %ie64_lo20(foo) for instruction lu32i.d.
99bdd1243dSDimitry Andric   fixup_loongarch_tls_ie64_lo20,
100bdd1243dSDimitry Andric   // 12-bit fixup corresponding to %ie64_hi12(foo) for instruction lu52i.d.
101bdd1243dSDimitry Andric   fixup_loongarch_tls_ie64_hi12,
102bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %ld_pc_hi20(foo) for instruction pcalau12i.
103bdd1243dSDimitry Andric   fixup_loongarch_tls_ld_pc_hi20,
104bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %ld_hi20(foo) for instruction lu12i.w.
105bdd1243dSDimitry Andric   fixup_loongarch_tls_ld_hi20,
106bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %gd_pc_hi20(foo) for instruction pcalau12i.
107bdd1243dSDimitry Andric   fixup_loongarch_tls_gd_pc_hi20,
108bdd1243dSDimitry Andric   // 20-bit fixup corresponding to %gd_hi20(foo) for instruction lu12i.w.
109cb14a3feSDimitry Andric   fixup_loongarch_tls_gd_hi20,
110cb14a3feSDimitry Andric   // Generate an R_LARCH_RELAX which indicates the linker may relax here.
1111db9f3b2SDimitry Andric   fixup_loongarch_relax = FirstLiteralRelocationKind + ELF::R_LARCH_RELAX,
1127a6dacacSDimitry Andric   // Generate an R_LARCH_ALIGN which indicates the linker may fixup align here.
1137a6dacacSDimitry Andric   fixup_loongarch_align = FirstLiteralRelocationKind + ELF::R_LARCH_ALIGN,
114*52418fc2SDimitry Andric   // 20-bit fixup corresponding to %pcrel_20(foo) for instruction pcaddi.
115*52418fc2SDimitry Andric   fixup_loongarch_pcrel20_s2,
1161db9f3b2SDimitry Andric   // 36-bit fixup corresponding to %call36(foo) for a pair instructions:
1171db9f3b2SDimitry Andric   // pcaddu18i+jirl.
1181db9f3b2SDimitry Andric   fixup_loongarch_call36 = FirstLiteralRelocationKind + ELF::R_LARCH_CALL36,
1190fca6ea1SDimitry Andric   // 20-bit fixup corresponding to %desc_pc_hi20(foo) for instruction pcalau12i.
1200fca6ea1SDimitry Andric   fixup_loongarch_tls_desc_pc_hi20 =
1210fca6ea1SDimitry Andric       FirstLiteralRelocationKind + ELF::R_LARCH_TLS_DESC_PC_HI20,
1220fca6ea1SDimitry Andric   // 12-bit fixup corresponding to %desc_pc_lo12(foo) for instructions like
1230fca6ea1SDimitry Andric   // addi.w/d.
1240fca6ea1SDimitry Andric   fixup_loongarch_tls_desc_pc_lo12,
1250fca6ea1SDimitry Andric   // 20-bit fixup corresponding to %desc64_pc_lo20(foo) for instruction lu32i.d.
1260fca6ea1SDimitry Andric   fixup_loongarch_tls_desc64_pc_lo20,
1270fca6ea1SDimitry Andric   // 12-bit fixup corresponding to %desc64_pc_hi12(foo) for instruction lu52i.d.
1280fca6ea1SDimitry Andric   fixup_loongarch_tls_desc64_pc_hi12,
1290fca6ea1SDimitry Andric   // 20-bit fixup corresponding to %desc_hi20(foo) for instruction lu12i.w.
1300fca6ea1SDimitry Andric   fixup_loongarch_tls_desc_hi20,
1310fca6ea1SDimitry Andric   // 12-bit fixup corresponding to %desc_lo12(foo) for instruction ori.
1320fca6ea1SDimitry Andric   fixup_loongarch_tls_desc_lo12,
1330fca6ea1SDimitry Andric   // 20-bit fixup corresponding to %desc64_lo20(foo) for instruction lu32i.d.
1340fca6ea1SDimitry Andric   fixup_loongarch_tls_desc64_lo20,
1350fca6ea1SDimitry Andric   // 12-bit fixup corresponding to %desc64_hi12(foo) for instruction lu52i.d.
1360fca6ea1SDimitry Andric   fixup_loongarch_tls_desc64_hi12,
1370fca6ea1SDimitry Andric   // 12-bit fixup corresponding to %desc_ld(foo) for instruction ld.w/d.
1380fca6ea1SDimitry Andric   fixup_loongarch_tls_desc_ld,
1390fca6ea1SDimitry Andric   // 12-bit fixup corresponding to %desc_call(foo) for instruction jirl.
1400fca6ea1SDimitry Andric   fixup_loongarch_tls_desc_call,
1410fca6ea1SDimitry Andric   // 20-bit fixup corresponding to %le_hi20_r(foo) for instruction lu12i.w.
1420fca6ea1SDimitry Andric   fixup_loongarch_tls_le_hi20_r,
1430fca6ea1SDimitry Andric   // Fixup corresponding to %le_add_r(foo) for instruction PseudoAddTPRel_W/D.
1440fca6ea1SDimitry Andric   fixup_loongarch_tls_le_add_r,
1450fca6ea1SDimitry Andric   // 12-bit fixup corresponding to %le_lo12_r(foo) for instruction addi.w/d.
1460fca6ea1SDimitry Andric   fixup_loongarch_tls_le_lo12_r,
147*52418fc2SDimitry Andric   // 20-bit fixup corresponding to %ld_pcrel_20(foo) for instruction pcaddi.
148*52418fc2SDimitry Andric   fixup_loongarch_tls_ld_pcrel20_s2,
149*52418fc2SDimitry Andric   // 20-bit fixup corresponding to %gd_pcrel_20(foo) for instruction pcaddi.
150*52418fc2SDimitry Andric   fixup_loongarch_tls_gd_pcrel20_s2,
151*52418fc2SDimitry Andric   // 20-bit fixup corresponding to %desc_pcrel_20(foo) for instruction pcaddi.
152*52418fc2SDimitry Andric   fixup_loongarch_tls_desc_pcrel20_s2,
153bdd1243dSDimitry Andric };
154bdd1243dSDimitry Andric } // end namespace LoongArch
155bdd1243dSDimitry Andric } // end namespace llvm
156bdd1243dSDimitry Andric 
157bdd1243dSDimitry Andric #endif
158