loongarch.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /* Copyright (C) 2021-2022 Free Software Foundation, Inc.
  2. Contributed by Loongson Ltd.
  3. This file is part of GNU Binutils.
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 3 of the license, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; see the file COPYING3. If not,
  14. see <http://www.gnu.org/licenses/>. */
  15. #ifndef _ELF_LOONGARCH_H
  16. #define _ELF_LOONGARCH_H
  17. #include "elf/reloc-macros.h"
  18. #include "libiberty.h"
  19. START_RELOC_NUMBERS (elf_loongarch_reloc_type)
  20. /* Used by the dynamic linker. */
  21. RELOC_NUMBER (R_LARCH_NONE, 0)
  22. RELOC_NUMBER (R_LARCH_32, 1)
  23. RELOC_NUMBER (R_LARCH_64, 2)
  24. RELOC_NUMBER (R_LARCH_RELATIVE, 3)
  25. RELOC_NUMBER (R_LARCH_COPY, 4)
  26. RELOC_NUMBER (R_LARCH_JUMP_SLOT, 5)
  27. RELOC_NUMBER (R_LARCH_TLS_DTPMOD32, 6)
  28. RELOC_NUMBER (R_LARCH_TLS_DTPMOD64, 7)
  29. RELOC_NUMBER (R_LARCH_TLS_DTPREL32, 8)
  30. RELOC_NUMBER (R_LARCH_TLS_DTPREL64, 9)
  31. RELOC_NUMBER (R_LARCH_TLS_TPREL32, 10)
  32. RELOC_NUMBER (R_LARCH_TLS_TPREL64, 11)
  33. RELOC_NUMBER (R_LARCH_IRELATIVE, 12)
  34. /* Reserved for future relocs that the dynamic linker must understand. */
  35. /* Used by the static linker for relocating .text. */
  36. RELOC_NUMBER (R_LARCH_MARK_LA, 20)
  37. RELOC_NUMBER (R_LARCH_MARK_PCREL, 21)
  38. RELOC_NUMBER (R_LARCH_SOP_PUSH_PCREL, 22)
  39. RELOC_NUMBER (R_LARCH_SOP_PUSH_ABSOLUTE, 23)
  40. RELOC_NUMBER (R_LARCH_SOP_PUSH_DUP, 24)
  41. RELOC_NUMBER (R_LARCH_SOP_PUSH_GPREL, 25)
  42. RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_TPREL, 26)
  43. RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_GOT, 27)
  44. RELOC_NUMBER (R_LARCH_SOP_PUSH_TLS_GD, 28)
  45. RELOC_NUMBER (R_LARCH_SOP_PUSH_PLT_PCREL, 29)
  46. RELOC_NUMBER (R_LARCH_SOP_ASSERT, 30)
  47. RELOC_NUMBER (R_LARCH_SOP_NOT, 31)
  48. RELOC_NUMBER (R_LARCH_SOP_SUB, 32)
  49. RELOC_NUMBER (R_LARCH_SOP_SL, 33)
  50. RELOC_NUMBER (R_LARCH_SOP_SR, 34)
  51. RELOC_NUMBER (R_LARCH_SOP_ADD, 35)
  52. RELOC_NUMBER (R_LARCH_SOP_AND, 36)
  53. RELOC_NUMBER (R_LARCH_SOP_IF_ELSE, 37)
  54. RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_5, 38)
  55. RELOC_NUMBER (R_LARCH_SOP_POP_32_U_10_12, 39)
  56. RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_12, 40)
  57. RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_16, 41)
  58. RELOC_NUMBER (R_LARCH_SOP_POP_32_S_10_16_S2, 42)
  59. RELOC_NUMBER (R_LARCH_SOP_POP_32_S_5_20, 43)
  60. RELOC_NUMBER (R_LARCH_SOP_POP_32_S_0_5_10_16_S2, 44)
  61. RELOC_NUMBER (R_LARCH_SOP_POP_32_S_0_10_10_16_S2, 45)
  62. RELOC_NUMBER (R_LARCH_SOP_POP_32_U, 46)
  63. /* Used by the static linker for relocating non .text. */
  64. RELOC_NUMBER (R_LARCH_ADD8, 47)
  65. RELOC_NUMBER (R_LARCH_ADD16, 48)
  66. RELOC_NUMBER (R_LARCH_ADD24, 49)
  67. RELOC_NUMBER (R_LARCH_ADD32, 50)
  68. RELOC_NUMBER (R_LARCH_ADD64, 51)
  69. RELOC_NUMBER (R_LARCH_SUB8, 52)
  70. RELOC_NUMBER (R_LARCH_SUB16, 53)
  71. RELOC_NUMBER (R_LARCH_SUB24, 54)
  72. RELOC_NUMBER (R_LARCH_SUB32, 55)
  73. RELOC_NUMBER (R_LARCH_SUB64, 56)
  74. /* I don't know what it is. Existing in almost all other arch. */
  75. RELOC_NUMBER (R_LARCH_GNU_VTINHERIT, 57)
  76. RELOC_NUMBER (R_LARCH_GNU_VTENTRY, 58)
  77. END_RELOC_NUMBERS (R_LARCH_count)
  78. /* Processor specific flags for the ELF header e_flags field. */
  79. /*The flag lp64s/lp64f/lp64d/ilp32s/ilp32f/ilp32d 3bits. */
  80. #define EF_LOONGARCH_ABI_LP64_SOFT_FLOAT 0x1
  81. #define EF_LOONGARCH_ABI_LP64_SINGLE_FLOAT 0x2
  82. #define EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT 0x3
  83. #define EF_LOONGARCH_ABI_ILP32_SOFT_FLOAT 0x5
  84. #define EF_LOONGARCH_ABI_ILP32_SINGLE_FLOAT 0x6
  85. #define EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT 0x7
  86. #define EF_LOONGARCH_ABI_MASK 0x7
  87. #define EF_LOONGARCH_ABI_ILP32_MASK 0x4
  88. #define EF_LOONGARCH_ABI_FLOAT_MASK 0x3
  89. #define EF_LOONGARCH_ABI_SOFT_FLOAT_MASK 0x1
  90. #define EF_LOONGARCH_ABI_SINGLE_FLOAT_MASK 0x2
  91. #define EF_LOONGARCH_ABI_DOUBLE_FLOAT_MASK 0x3
  92. #define EF_LOONGARCH_ABI(abi) (EF_LOONGARCH_ABI_MASK & (abi))
  93. #define EF_LOONGARCH_IS_LP64(abi) \
  94. (EF_LOONGARCH_ABI(abi) && (!(EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_ILP32_MASK)))
  95. #define EF_LOONGARCH_IS_ILP32(abi) \
  96. (EF_LOONGARCH_ABI(abi) && (EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_ILP32_MASK))
  97. #define EF_LOONGARCH_IS_SOFT_FLOAT(abi) \
  98. (!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_SOFT_FLOAT_MASK))
  99. #define EF_LOONGARCH_IS_SINGLE_FLOAT(abi) \
  100. (!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_SINGLE_FLOAT_MASK))
  101. #define EF_LOONGARCH_IS_DOUBLE_FLOAT(abi) \
  102. (!((EF_LOONGARCH_ABI(abi) & EF_LOONGARCH_ABI_FLOAT_MASK) ^ EF_LOONGARCH_ABI_DOUBLE_FLOAT_MASK))
  103. #endif /* _ELF_LOONGARCH_H */