LLVM 22.0.0git
SparcMCExpr.cpp
Go to the documentation of this file.
1//===-- SparcMCExpr.cpp - Sparc specific MC expression classes --------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the implementation of the assembly expression modifiers
10// accepted by the Sparc architecture (e.g. "%hi", "%lo", ...).
11//
12//===----------------------------------------------------------------------===//
13
17
18using namespace llvm;
19
20#define DEBUG_TYPE "sparcmcexpr"
21
23 // clang-format off
24 switch (uint16_t(S)) {
25 case 0: return {};
26 case ELF::R_SPARC_LO10: return "lo";
27 case ELF::R_SPARC_HI22: return "hi";
28 case ELF::R_SPARC_H44: return "h44";
29 case ELF::R_SPARC_M44: return "m44";
30 case ELF::R_SPARC_L44: return "l44";
31 case ELF::R_SPARC_HH22: return "hh";
32 case ELF::R_SPARC_HM10: return "hm";
33 case ELF::R_SPARC_LM22: return "lm";
34 // FIXME: use %pc22/%pc10, if system assembler supports them.
35 case ELF::R_SPARC_PC22: return "hi";
36 case ELF::R_SPARC_PC10: return "lo";
37 case ELF::R_SPARC_GOT22: return "hi";
38 case ELF::R_SPARC_GOT10: return "lo";
39 case ELF::R_SPARC_GOT13: return {};
40 case ELF::R_SPARC_DISP32: return "r_disp32";
41 case ELF::R_SPARC_TLS_GD_HI22: return "tgd_hi22";
42 case ELF::R_SPARC_TLS_GD_LO10: return "tgd_lo10";
43 case ELF::R_SPARC_TLS_GD_ADD: return "tgd_add";
44 case ELF::R_SPARC_TLS_GD_CALL: return "tgd_call";
45 case ELF::R_SPARC_TLS_LDM_HI22: return "tldm_hi22";
46 case ELF::R_SPARC_TLS_LDM_LO10: return "tldm_lo10";
47 case ELF::R_SPARC_TLS_LDM_ADD: return "tldm_add";
48 case ELF::R_SPARC_TLS_LDM_CALL: return "tldm_call";
49 case ELF::R_SPARC_TLS_LDO_HIX22: return "tldo_hix22";
50 case ELF::R_SPARC_TLS_LDO_LOX10: return "tldo_lox10";
51 case ELF::R_SPARC_TLS_LDO_ADD: return "tldo_add";
52 case ELF::R_SPARC_TLS_IE_HI22: return "tie_hi22";
53 case ELF::R_SPARC_TLS_IE_LO10: return "tie_lo10";
54 case ELF::R_SPARC_TLS_IE_LD: return "tie_ld";
55 case ELF::R_SPARC_TLS_IE_LDX: return "tie_ldx";
56 case ELF::R_SPARC_TLS_IE_ADD: return "tie_add";
57 case ELF::R_SPARC_TLS_LE_HIX22: return "tle_hix22";
58 case ELF::R_SPARC_TLS_LE_LOX10: return "tle_lox10";
59 case ELF::R_SPARC_HIX22: return "hix";
60 case ELF::R_SPARC_LOX10: return "lox";
61 case ELF::R_SPARC_GOTDATA_OP_HIX22: return "gdop_hix22";
62 case ELF::R_SPARC_GOTDATA_OP_LOX10: return "gdop_lox10";
63 case ELF::R_SPARC_GOTDATA_OP: return "gdop";
64 }
65 // clang-format on
66 llvm_unreachable("Unhandled SparcMCExpr::Specifier");
67}
68
71 .Case("lo", ELF::R_SPARC_LO10)
72 .Case("hi", ELF::R_SPARC_HI22)
73 .Case("h44", ELF::R_SPARC_H44)
74 .Case("m44", ELF::R_SPARC_M44)
75 .Case("l44", ELF::R_SPARC_L44)
76 .Case("hh", ELF::R_SPARC_HH22)
77 // Nonstandard GNU extension
78 .Case("uhi", ELF::R_SPARC_HH22)
79 .Case("hm", ELF::R_SPARC_HM10)
80 // Nonstandard GNU extension
81 .Case("ulo", ELF::R_SPARC_HM10)
82 .Case("lm", ELF::R_SPARC_LM22)
83 .Case("pc22", ELF::R_SPARC_PC22)
84 .Case("pc10", ELF::R_SPARC_PC10)
85 .Case("got22", ELF::R_SPARC_GOT22)
86 .Case("got10", ELF::R_SPARC_GOT10)
87 .Case("got13", ELF::R_SPARC_GOT13)
88 .Case("r_disp32", ELF::R_SPARC_DISP32)
89 .Case("tgd_hi22", ELF::R_SPARC_TLS_GD_HI22)
90 .Case("tgd_lo10", ELF::R_SPARC_TLS_GD_LO10)
91 .Case("tgd_add", ELF::R_SPARC_TLS_GD_ADD)
92 .Case("tgd_call", ELF::R_SPARC_TLS_GD_CALL)
93 .Case("tldm_hi22", ELF::R_SPARC_TLS_LDM_HI22)
94 .Case("tldm_lo10", ELF::R_SPARC_TLS_LDM_LO10)
95 .Case("tldm_add", ELF::R_SPARC_TLS_LDM_ADD)
96 .Case("tldm_call", ELF::R_SPARC_TLS_LDM_CALL)
97 .Case("tldo_hix22", ELF::R_SPARC_TLS_LDO_HIX22)
98 .Case("tldo_lox10", ELF::R_SPARC_TLS_LDO_LOX10)
99 .Case("tldo_add", ELF::R_SPARC_TLS_LDO_ADD)
100 .Case("tie_hi22", ELF::R_SPARC_TLS_IE_HI22)
101 .Case("tie_lo10", ELF::R_SPARC_TLS_IE_LO10)
102 .Case("tie_ld", ELF::R_SPARC_TLS_IE_LD)
103 .Case("tie_ldx", ELF::R_SPARC_TLS_IE_LDX)
104 .Case("tie_add", ELF::R_SPARC_TLS_IE_ADD)
105 .Case("tle_hix22", ELF::R_SPARC_TLS_LE_HIX22)
106 .Case("tle_lox10", ELF::R_SPARC_TLS_LE_LOX10)
107 .Case("hix", ELF::R_SPARC_HIX22)
108 .Case("lox", ELF::R_SPARC_LOX10)
109 .Case("gdop_hix22", ELF::R_SPARC_GOTDATA_OP_HIX22)
110 .Case("gdop_lox10", ELF::R_SPARC_GOTDATA_OP_LOX10)
111 .Case("gdop", ELF::R_SPARC_GOTDATA_OP)
112 .Default(0);
113}
static const char * name
Definition: SMEABIPass.cpp:52
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
A switch()-like statement whose cases are string literals.
Definition: StringSwitch.h:43
StringSwitch & Case(StringLiteral S, T Value)
Definition: StringSwitch.h:68
R Default(T Value)
Definition: StringSwitch.h:177
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
uint16_t parseSpecifier(StringRef name)
Definition: SparcMCExpr.cpp:69
StringRef getSpecifierName(uint16_t S)
Definition: SparcMCExpr.cpp:22
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18