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