LLVM  14.0.0git
PPCMCExpr.cpp
Go to the documentation of this file.
1 //===-- PPCMCExpr.cpp - PPC 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 #include "PPCMCExpr.h"
10 #include "PPCFixupKinds.h"
11 #include "llvm/MC/MCAsmInfo.h"
12 #include "llvm/MC/MCAssembler.h"
13 #include "llvm/MC/MCContext.h"
15 
16 using namespace llvm;
17 
18 #define DEBUG_TYPE "ppcmcexpr"
19 
21  MCContext &Ctx) {
22  return new (Ctx) PPCMCExpr(Kind, Expr);
23 }
24 
25 void PPCMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
26  getSubExpr()->print(OS, MAI);
27 
28  switch (Kind) {
29  default:
30  llvm_unreachable("Invalid kind!");
31  case VK_PPC_LO:
32  OS << "@l";
33  break;
34  case VK_PPC_HI:
35  OS << "@h";
36  break;
37  case VK_PPC_HA:
38  OS << "@ha";
39  break;
40  case VK_PPC_HIGH:
41  OS << "@high";
42  break;
43  case VK_PPC_HIGHA:
44  OS << "@higha";
45  break;
46  case VK_PPC_HIGHER:
47  OS << "@higher";
48  break;
49  case VK_PPC_HIGHERA:
50  OS << "@highera";
51  break;
52  case VK_PPC_HIGHEST:
53  OS << "@highest";
54  break;
55  case VK_PPC_HIGHESTA:
56  OS << "@highesta";
57  break;
58  }
59 }
60 
61 bool
62 PPCMCExpr::evaluateAsConstant(int64_t &Res) const {
63  MCValue Value;
64 
65  if (!getSubExpr()->evaluateAsRelocatable(Value, nullptr, nullptr))
66  return false;
67 
68  if (!Value.isAbsolute())
69  return false;
70 
71  Res = evaluateAsInt64(Value.getConstant());
72  return true;
73 }
74 
75 int64_t
76 PPCMCExpr::evaluateAsInt64(int64_t Value) const {
77  switch (Kind) {
78  case VK_PPC_LO:
79  return Value & 0xffff;
80  case VK_PPC_HI:
81  return (Value >> 16) & 0xffff;
82  case VK_PPC_HA:
83  return ((Value + 0x8000) >> 16) & 0xffff;
84  case VK_PPC_HIGH:
85  return (Value >> 16) & 0xffff;
86  case VK_PPC_HIGHA:
87  return ((Value + 0x8000) >> 16) & 0xffff;
88  case VK_PPC_HIGHER:
89  return (Value >> 32) & 0xffff;
90  case VK_PPC_HIGHERA:
91  return ((Value + 0x8000) >> 32) & 0xffff;
92  case VK_PPC_HIGHEST:
93  return (Value >> 48) & 0xffff;
94  case VK_PPC_HIGHESTA:
95  return ((Value + 0x8000) >> 48) & 0xffff;
96  case VK_PPC_None:
97  break;
98  }
99  llvm_unreachable("Invalid kind!");
100 }
101 
102 bool
104  const MCAsmLayout *Layout,
105  const MCFixup *Fixup) const {
106  MCValue Value;
107 
108  if (!getSubExpr()->evaluateAsRelocatable(Value, Layout, Fixup))
109  return false;
110 
111  if (Value.isAbsolute()) {
112  int64_t Result = evaluateAsInt64(Value.getConstant());
113  if ((Fixup == nullptr || (unsigned)Fixup->getKind() != PPC::fixup_ppc_half16) &&
114  (Result >= 0x8000))
115  return false;
116  Res = MCValue::get(Result);
117  } else {
118  if (!Layout)
119  return false;
120 
121  MCContext &Context = Layout->getAssembler().getContext();
122  const MCSymbolRefExpr *Sym = Value.getSymA();
123  MCSymbolRefExpr::VariantKind Modifier = Sym->getKind();
124  if (Modifier != MCSymbolRefExpr::VK_None)
125  return false;
126  switch (Kind) {
127  default:
128  llvm_unreachable("Invalid kind!");
129  case VK_PPC_LO:
130  Modifier = MCSymbolRefExpr::VK_PPC_LO;
131  break;
132  case VK_PPC_HI:
133  Modifier = MCSymbolRefExpr::VK_PPC_HI;
134  break;
135  case VK_PPC_HA:
136  Modifier = MCSymbolRefExpr::VK_PPC_HA;
137  break;
138  case VK_PPC_HIGH:
139  Modifier = MCSymbolRefExpr::VK_PPC_HIGH;
140  break;
141  case VK_PPC_HIGHA:
143  break;
144  case VK_PPC_HIGHERA:
146  break;
147  case VK_PPC_HIGHER:
149  break;
150  case VK_PPC_HIGHEST:
152  break;
153  case VK_PPC_HIGHESTA:
155  break;
156  }
157  Sym = MCSymbolRefExpr::create(&Sym->getSymbol(), Modifier, Context);
158  Res = MCValue::get(Sym, Value.getSymB(), Value.getConstant());
159  }
160 
161  return true;
162 }
163 
164 void PPCMCExpr::visitUsedExpr(MCStreamer &Streamer) const {
165  Streamer.visitUsedExpr(*getSubExpr());
166 }
llvm::MCSymbolRefExpr::getKind
VariantKind getKind() const
Definition: MCExpr.h:400
llvm::PPCMCExpr::VK_PPC_HA
@ VK_PPC_HA
Definition: PPCMCExpr.h:24
llvm::MCStreamer::visitUsedExpr
void visitUsedExpr(const MCExpr &Expr)
Definition: MCStreamer.cpp:1061
llvm
---------------------— PointerInfo ------------------------------------—
Definition: AllocatorList.h:23
llvm::MCSymbolRefExpr::VK_PPC_HIGHESTA
@ VK_PPC_HIGHESTA
Definition: MCExpr.h:255
llvm::MCContext
Context object for machine code objects.
Definition: MCContext.h:72
llvm::PPCMCExpr::evaluateAsRelocatableImpl
bool evaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout, const MCFixup *Fixup) const override
Definition: PPCMCExpr.cpp:103
llvm::MCSymbolRefExpr::VK_PPC_HIGHA
@ VK_PPC_HIGHA
Definition: MCExpr.h:251
llvm::MCAsmInfo
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
llvm::PPCMCExpr::getSubExpr
const MCExpr * getSubExpr() const
getSubExpr - Get the child of this expression.
Definition: PPCMCExpr.h:69
MCAssembler.h
llvm::PPCMCExpr::VK_PPC_LO
@ VK_PPC_LO
Definition: PPCMCExpr.h:22
llvm::PPCMCExpr::VK_PPC_HIGHA
@ VK_PPC_HIGHA
Definition: PPCMCExpr.h:26
llvm::MCExpr::evaluateAsRelocatable
bool evaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout, const MCFixup *Fixup) const
Try to evaluate the expression to a relocatable value, i.e.
Definition: MCExpr.cpp:747
llvm::PPCMCExpr
Definition: PPCMCExpr.h:18
Context
LLVMContext & Context
Definition: NVVMIntrRange.cpp:66
MCObjectStreamer.h
llvm::MCStreamer
Streaming machine code generation interface.
Definition: MCStreamer.h:199
llvm::MCAssembler::getContext
MCContext & getContext() const
Definition: MCAssembler.h:292
MCContext.h
llvm::PPCMCExpr::VK_PPC_HIGHEST
@ VK_PPC_HIGHEST
Definition: PPCMCExpr.h:29
llvm::PPCMCExpr::VK_PPC_HI
@ VK_PPC_HI
Definition: PPCMCExpr.h:23
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
llvm::MCSymbolRefExpr::getSymbol
const MCSymbol & getSymbol() const
Definition: MCExpr.h:398
llvm::PPCMCExpr::VK_PPC_HIGHERA
@ VK_PPC_HIGHERA
Definition: PPCMCExpr.h:28
llvm::MCSymbolRefExpr::VK_PPC_HA
@ VK_PPC_HA
Definition: MCExpr.h:249
llvm::lltok::Kind
Kind
Definition: LLToken.h:18
llvm::PPC::fixup_ppc_half16
@ fixup_ppc_half16
A 16-bit fixup corresponding to lo16(_foo) or ha16(_foo) for instrs like 'li' or 'addis'.
Definition: PPCFixupKinds.h:37
llvm::MCSymbolRefExpr::VK_PPC_HI
@ VK_PPC_HI
Definition: MCExpr.h:248
llvm::PPCMCExpr::VK_PPC_None
@ VK_PPC_None
Definition: PPCMCExpr.h:21
llvm::MCSymbolRefExpr::VariantKind
VariantKind
Definition: MCExpr.h:194
PPCMCExpr.h
llvm::MCValue::get
static MCValue get(const MCSymbolRefExpr *SymA, const MCSymbolRefExpr *SymB=nullptr, int64_t Val=0, uint32_t RefKind=0)
Definition: MCValue.h:60
PPCFixupKinds.h
llvm::MCSymbolRefExpr::VK_PPC_HIGHEST
@ VK_PPC_HIGHEST
Definition: MCExpr.h:254
llvm::MCSymbolRefExpr
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:192
MCAsmInfo.h
Fixup
PowerPC TLS Dynamic Call Fixup
Definition: PPCTLSDynamicCall.cpp:235
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition: ErrorHandling.h:136
llvm::PPCMCExpr::create
static const PPCMCExpr * create(VariantKind Kind, const MCExpr *Expr, MCContext &Ctx)
Definition: PPCMCExpr.cpp:20
llvm::MCSymbolRefExpr::VK_PPC_HIGH
@ VK_PPC_HIGH
Definition: MCExpr.h:250
llvm::PPCMCExpr::VK_PPC_HIGHESTA
@ VK_PPC_HIGHESTA
Definition: PPCMCExpr.h:30
llvm::MCAsmLayout
Encapsulates the layout of an assembly file at a particular point in time.
Definition: MCAsmLayout.h:28
llvm::TargetStackID::Value
Value
Definition: TargetFrameLowering.h:27
llvm::MCSymbolRefExpr::create
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:385
llvm::MCSymbolRefExpr::VK_PPC_HIGHER
@ VK_PPC_HIGHER
Definition: MCExpr.h:252
llvm::PPCMCExpr::evaluateAsConstant
bool evaluateAsConstant(int64_t &Res) const
Definition: PPCMCExpr.cpp:62
llvm::MCExpr::print
void print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens=false) const
Definition: MCExpr.cpp:42
llvm::MCSymbolRefExpr::VK_PPC_LO
@ VK_PPC_LO
Definition: MCExpr.h:247
llvm::PPCMCExpr::VariantKind
VariantKind
Definition: PPCMCExpr.h:20
llvm::PPCMCExpr::VK_PPC_HIGHER
@ VK_PPC_HIGHER
Definition: PPCMCExpr.h:27
llvm::PPCMCExpr::visitUsedExpr
void visitUsedExpr(MCStreamer &Streamer) const override
Definition: PPCMCExpr.cpp:164
llvm::MCAsmLayout::getAssembler
MCAssembler & getAssembler() const
Get the assembler object this is a layout for.
Definition: MCAsmLayout.h:50
llvm::MCValue
This represents an "assembler immediate".
Definition: MCValue.h:37
llvm::PPCMCExpr::VK_PPC_HIGH
@ VK_PPC_HIGH
Definition: PPCMCExpr.h:25
llvm::MCSymbolRefExpr::VK_None
@ VK_None
Definition: MCExpr.h:195
llvm::PPCMCExpr::printImpl
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override
Definition: PPCMCExpr.cpp:25
llvm::MCSymbolRefExpr::VK_PPC_HIGHERA
@ VK_PPC_HIGHERA
Definition: MCExpr.h:253
llvm::MCFixup
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition: MCFixup.h:71
llvm::Value
LLVM Value Representation.
Definition: Value.h:75
llvm::MCExpr
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35