File: RISCVFixupKinds.h

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (137 lines) | stat: -rw-r--r-- 5,541 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//===-- RISCVFixupKinds.h - RISCV Specific Fixup Entries --------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVFIXUPKINDS_H
#define LLVM_LIB_TARGET_RISCV_MCTARGETDESC_RISCVFIXUPKINDS_H

#include "llvm/MC/MCFixup.h"
#include <utility>

#undef RISCV

namespace llvm::RISCV {
enum Fixups {
  // 20-bit fixup corresponding to %hi(foo) for instructions like lui
  fixup_riscv_hi20 = FirstTargetFixupKind,
  // 12-bit fixup corresponding to %lo(foo) for instructions like addi
  fixup_riscv_lo12_i,
  // 12-bit fixup corresponding to foo-bar for instructions like addi
  fixup_riscv_12_i,
  // 12-bit fixup corresponding to %lo(foo) for the S-type store instructions
  fixup_riscv_lo12_s,
  // 20-bit fixup corresponding to %pcrel_hi(foo) for instructions like auipc
  fixup_riscv_pcrel_hi20,
  // 12-bit fixup corresponding to %pcrel_lo(foo) for instructions like addi
  fixup_riscv_pcrel_lo12_i,
  // 12-bit fixup corresponding to %pcrel_lo(foo) for the S-type store
  // instructions
  fixup_riscv_pcrel_lo12_s,
  // 20-bit fixup corresponding to %got_pcrel_hi(foo) for instructions like
  // auipc
  fixup_riscv_got_hi20,
  // 20-bit fixup corresponding to %tprel_hi(foo) for instructions like lui
  fixup_riscv_tprel_hi20,
  // 12-bit fixup corresponding to %tprel_lo(foo) for instructions like addi
  fixup_riscv_tprel_lo12_i,
  // 12-bit fixup corresponding to %tprel_lo(foo) for the S-type store
  // instructions
  fixup_riscv_tprel_lo12_s,
  // Fixup corresponding to %tprel_add(foo) for PseudoAddTPRel, used as a linker
  // hint
  fixup_riscv_tprel_add,
  // 20-bit fixup corresponding to %tls_ie_pcrel_hi(foo) for instructions like
  // auipc
  fixup_riscv_tls_got_hi20,
  // 20-bit fixup corresponding to %tls_gd_pcrel_hi(foo) for instructions like
  // auipc
  fixup_riscv_tls_gd_hi20,
  // 20-bit fixup for symbol references in the jal instruction
  fixup_riscv_jal,
  // 12-bit fixup for symbol references in the branch instructions
  fixup_riscv_branch,
  // 11-bit fixup for symbol references in the compressed jump instruction
  fixup_riscv_rvc_jump,
  // 8-bit fixup for symbol references in the compressed branch instruction
  fixup_riscv_rvc_branch,
  // Fixup representing a legacy no-pic function call attached to the auipc
  // instruction in a pair composed of adjacent auipc+jalr instructions.
  fixup_riscv_call,
  // Fixup representing a function call attached to the auipc instruction in a
  // pair composed of adjacent auipc+jalr instructions.
  fixup_riscv_call_plt,
  // Used to generate an R_RISCV_RELAX relocation, which indicates the linker
  // may relax the instruction pair.
  fixup_riscv_relax,
  // Used to generate an R_RISCV_ALIGN relocation, which indicates the linker
  // should fixup the alignment after linker relaxation.
  fixup_riscv_align,
  // 8-bit fixup corresponding to R_RISCV_SET8 for local label assignment.
  fixup_riscv_set_8,
  // 8-bit fixup corresponding to R_RISCV_ADD8 for 8-bit symbolic difference
  // paired relocations.
  fixup_riscv_add_8,
  // 8-bit fixup corresponding to R_RISCV_SUB8 for 8-bit symbolic difference
  // paired relocations.
  fixup_riscv_sub_8,
  // 16-bit fixup corresponding to R_RISCV_SET16 for local label assignment.
  fixup_riscv_set_16,
  // 16-bit fixup corresponding to R_RISCV_ADD16 for 16-bit symbolic difference
  // paired reloctions.
  fixup_riscv_add_16,
  // 16-bit fixup corresponding to R_RISCV_SUB16 for 16-bit symbolic difference
  // paired reloctions.
  fixup_riscv_sub_16,
  // 32-bit fixup corresponding to R_RISCV_SET32 for local label assignment.
  fixup_riscv_set_32,
  // 32-bit fixup corresponding to R_RISCV_ADD32 for 32-bit symbolic difference
  // paired relocations.
  fixup_riscv_add_32,
  // 32-bit fixup corresponding to R_RISCV_SUB32 for 32-bit symbolic difference
  // paired relocations.
  fixup_riscv_sub_32,
  // 64-bit fixup corresponding to R_RISCV_ADD64 for 64-bit symbolic difference
  // paired relocations.
  fixup_riscv_add_64,
  // 64-bit fixup corresponding to R_RISCV_SUB64 for 64-bit symbolic difference
  // paired relocations.
  fixup_riscv_sub_64,
  // 6-bit fixup corresponding to R_RISCV_SET6 for local label assignment in
  // DWARF CFA.
  fixup_riscv_set_6b,
  // 6-bit fixup corresponding to R_RISCV_SUB6 for local label assignment in
  // DWARF CFA.
  fixup_riscv_sub_6b,

  // Used as a sentinel, must be the last
  fixup_riscv_invalid,
  NumTargetFixupKinds = fixup_riscv_invalid - FirstTargetFixupKind
};

static inline std::pair<MCFixupKind, MCFixupKind>
getRelocPairForSize(unsigned Size) {
  switch (Size) {
  default:
    llvm_unreachable("unsupported fixup size");
  case 1:
    return std::make_pair(MCFixupKind(RISCV::fixup_riscv_add_8),
                          MCFixupKind(RISCV::fixup_riscv_sub_8));
  case 2:
    return std::make_pair(MCFixupKind(RISCV::fixup_riscv_add_16),
                          MCFixupKind(RISCV::fixup_riscv_sub_16));
  case 4:
    return std::make_pair(MCFixupKind(RISCV::fixup_riscv_add_32),
                          MCFixupKind(RISCV::fixup_riscv_sub_32));
  case 8:
    return std::make_pair(MCFixupKind(RISCV::fixup_riscv_add_64),
                          MCFixupKind(RISCV::fixup_riscv_sub_64));
  }
}

} // end namespace llvm::RISCV

#endif