Bug Summary

File:build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/llvm/lib/CodeGen/MIRParser/MIParser.cpp
Warning:line 2082, column 15
The left operand of '>=' is a garbage value

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name MIParser.cpp -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -ffunction-sections -fdata-sections -fcoverage-compilation-dir=/build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/build-llvm/tools/clang/stage2-bins -resource-dir /usr/lib/llvm-15/lib/clang/15.0.0 -D _DEBUG -D _GNU_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D __STDC_LIMIT_MACROS -I lib/CodeGen/MIRParser -I /build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/llvm/lib/CodeGen/MIRParser -I include -I /build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/llvm/include -D _FORTIFY_SOURCE=2 -D NDEBUG -U NDEBUG -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/x86_64-linux-gnu/c++/10 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../include/c++/10/backward -internal-isystem /usr/lib/llvm-15/lib/clang/15.0.0/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/build-llvm/tools/clang/stage2-bins=build-llvm/tools/clang/stage2-bins -fmacro-prefix-map=/build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/= -fcoverage-prefix-map=/build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/build-llvm/tools/clang/stage2-bins=build-llvm/tools/clang/stage2-bins -fcoverage-prefix-map=/build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/= -O3 -Wno-unused-command-line-argument -Wno-unused-parameter -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wno-comment -std=c++14 -fdeprecated-macro -fdebug-compilation-dir=/build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/build-llvm/tools/clang/stage2-bins -fdebug-prefix-map=/build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/build-llvm/tools/clang/stage2-bins=build-llvm/tools/clang/stage2-bins -fdebug-prefix-map=/build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/= -ferror-limit 19 -fvisibility-inlines-hidden -stack-protector 2 -fgnuc-version=4.2.1 -fcolor-diagnostics -vectorize-loops -vectorize-slp -analyzer-output=html -analyzer-config stable-report-filename=true -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/scan-build-2022-04-20-140412-16051-1 -x c++ /build/llvm-toolchain-snapshot-15~++20220420111733+e13d2efed663/llvm/lib/CodeGen/MIRParser/MIParser.cpp
1//===- MIParser.cpp - Machine instructions parser implementation ----------===//
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 implements the parsing of machine instructions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/CodeGen/MIRParser/MIParser.h"
14#include "MILexer.h"
15#include "llvm/ADT/APInt.h"
16#include "llvm/ADT/APSInt.h"
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/None.h"
20#include "llvm/ADT/Optional.h"
21#include "llvm/ADT/SmallVector.h"
22#include "llvm/ADT/StringMap.h"
23#include "llvm/ADT/StringRef.h"
24#include "llvm/ADT/StringSwitch.h"
25#include "llvm/ADT/Twine.h"
26#include "llvm/Analysis/MemoryLocation.h"
27#include "llvm/AsmParser/Parser.h"
28#include "llvm/AsmParser/SlotMapping.h"
29#include "llvm/CodeGen/MIRFormatter.h"
30#include "llvm/CodeGen/MIRPrinter.h"
31#include "llvm/CodeGen/MachineBasicBlock.h"
32#include "llvm/CodeGen/MachineFrameInfo.h"
33#include "llvm/CodeGen/MachineFunction.h"
34#include "llvm/CodeGen/MachineInstr.h"
35#include "llvm/CodeGen/MachineInstrBuilder.h"
36#include "llvm/CodeGen/MachineMemOperand.h"
37#include "llvm/CodeGen/MachineOperand.h"
38#include "llvm/CodeGen/MachineRegisterInfo.h"
39#include "llvm/CodeGen/RegisterBank.h"
40#include "llvm/CodeGen/RegisterBankInfo.h"
41#include "llvm/CodeGen/TargetInstrInfo.h"
42#include "llvm/CodeGen/TargetRegisterInfo.h"
43#include "llvm/CodeGen/TargetSubtargetInfo.h"
44#include "llvm/IR/BasicBlock.h"
45#include "llvm/IR/Constants.h"
46#include "llvm/IR/DataLayout.h"
47#include "llvm/IR/DebugInfoMetadata.h"
48#include "llvm/IR/DebugLoc.h"
49#include "llvm/IR/Function.h"
50#include "llvm/IR/InstrTypes.h"
51#include "llvm/IR/Instructions.h"
52#include "llvm/IR/Intrinsics.h"
53#include "llvm/IR/Metadata.h"
54#include "llvm/IR/Module.h"
55#include "llvm/IR/ModuleSlotTracker.h"
56#include "llvm/IR/Type.h"
57#include "llvm/IR/Value.h"
58#include "llvm/IR/ValueSymbolTable.h"
59#include "llvm/MC/LaneBitmask.h"
60#include "llvm/MC/MCContext.h"
61#include "llvm/MC/MCDwarf.h"
62#include "llvm/MC/MCInstrDesc.h"
63#include "llvm/Support/AtomicOrdering.h"
64#include "llvm/Support/BranchProbability.h"
65#include "llvm/Support/Casting.h"
66#include "llvm/Support/ErrorHandling.h"
67#include "llvm/Support/LowLevelTypeImpl.h"
68#include "llvm/Support/MemoryBuffer.h"
69#include "llvm/Support/SMLoc.h"
70#include "llvm/Support/SourceMgr.h"
71#include "llvm/Target/TargetIntrinsicInfo.h"
72#include "llvm/Target/TargetMachine.h"
73#include <cassert>
74#include <cctype>
75#include <cstddef>
76#include <cstdint>
77#include <limits>
78#include <string>
79#include <utility>
80
81using namespace llvm;
82
83void PerTargetMIParsingState::setTarget(
84 const TargetSubtargetInfo &NewSubtarget) {
85
86 // If the subtarget changed, over conservatively assume everything is invalid.
87 if (&Subtarget == &NewSubtarget)
88 return;
89
90 Names2InstrOpCodes.clear();
91 Names2Regs.clear();
92 Names2RegMasks.clear();
93 Names2SubRegIndices.clear();
94 Names2TargetIndices.clear();
95 Names2DirectTargetFlags.clear();
96 Names2BitmaskTargetFlags.clear();
97 Names2MMOTargetFlags.clear();
98
99 initNames2RegClasses();
100 initNames2RegBanks();
101}
102
103void PerTargetMIParsingState::initNames2Regs() {
104 if (!Names2Regs.empty())
105 return;
106
107 // The '%noreg' register is the register 0.
108 Names2Regs.insert(std::make_pair("noreg", 0));
109 const auto *TRI = Subtarget.getRegisterInfo();
110 assert(TRI && "Expected target register info")(static_cast <bool> (TRI && "Expected target register info"
) ? void (0) : __assert_fail ("TRI && \"Expected target register info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 110, __extension__
__PRETTY_FUNCTION__))
;
111
112 for (unsigned I = 0, E = TRI->getNumRegs(); I < E; ++I) {
113 bool WasInserted =
114 Names2Regs.insert(std::make_pair(StringRef(TRI->getName(I)).lower(), I))
115 .second;
116 (void)WasInserted;
117 assert(WasInserted && "Expected registers to be unique case-insensitively")(static_cast <bool> (WasInserted && "Expected registers to be unique case-insensitively"
) ? void (0) : __assert_fail ("WasInserted && \"Expected registers to be unique case-insensitively\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 117, __extension__
__PRETTY_FUNCTION__))
;
118 }
119}
120
121bool PerTargetMIParsingState::getRegisterByName(StringRef RegName,
122 Register &Reg) {
123 initNames2Regs();
124 auto RegInfo = Names2Regs.find(RegName);
125 if (RegInfo == Names2Regs.end())
126 return true;
127 Reg = RegInfo->getValue();
128 return false;
129}
130
131void PerTargetMIParsingState::initNames2InstrOpCodes() {
132 if (!Names2InstrOpCodes.empty())
133 return;
134 const auto *TII = Subtarget.getInstrInfo();
135 assert(TII && "Expected target instruction info")(static_cast <bool> (TII && "Expected target instruction info"
) ? void (0) : __assert_fail ("TII && \"Expected target instruction info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 135, __extension__
__PRETTY_FUNCTION__))
;
136 for (unsigned I = 0, E = TII->getNumOpcodes(); I < E; ++I)
137 Names2InstrOpCodes.insert(std::make_pair(StringRef(TII->getName(I)), I));
138}
139
140bool PerTargetMIParsingState::parseInstrName(StringRef InstrName,
141 unsigned &OpCode) {
142 initNames2InstrOpCodes();
143 auto InstrInfo = Names2InstrOpCodes.find(InstrName);
144 if (InstrInfo == Names2InstrOpCodes.end())
145 return true;
146 OpCode = InstrInfo->getValue();
147 return false;
148}
149
150void PerTargetMIParsingState::initNames2RegMasks() {
151 if (!Names2RegMasks.empty())
152 return;
153 const auto *TRI = Subtarget.getRegisterInfo();
154 assert(TRI && "Expected target register info")(static_cast <bool> (TRI && "Expected target register info"
) ? void (0) : __assert_fail ("TRI && \"Expected target register info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 154, __extension__
__PRETTY_FUNCTION__))
;
155 ArrayRef<const uint32_t *> RegMasks = TRI->getRegMasks();
156 ArrayRef<const char *> RegMaskNames = TRI->getRegMaskNames();
157 assert(RegMasks.size() == RegMaskNames.size())(static_cast <bool> (RegMasks.size() == RegMaskNames.size
()) ? void (0) : __assert_fail ("RegMasks.size() == RegMaskNames.size()"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 157, __extension__
__PRETTY_FUNCTION__))
;
158 for (size_t I = 0, E = RegMasks.size(); I < E; ++I)
159 Names2RegMasks.insert(
160 std::make_pair(StringRef(RegMaskNames[I]).lower(), RegMasks[I]));
161}
162
163const uint32_t *PerTargetMIParsingState::getRegMask(StringRef Identifier) {
164 initNames2RegMasks();
165 auto RegMaskInfo = Names2RegMasks.find(Identifier);
166 if (RegMaskInfo == Names2RegMasks.end())
167 return nullptr;
168 return RegMaskInfo->getValue();
169}
170
171void PerTargetMIParsingState::initNames2SubRegIndices() {
172 if (!Names2SubRegIndices.empty())
173 return;
174 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
175 for (unsigned I = 1, E = TRI->getNumSubRegIndices(); I < E; ++I)
176 Names2SubRegIndices.insert(
177 std::make_pair(TRI->getSubRegIndexName(I), I));
178}
179
180unsigned PerTargetMIParsingState::getSubRegIndex(StringRef Name) {
181 initNames2SubRegIndices();
182 auto SubRegInfo = Names2SubRegIndices.find(Name);
183 if (SubRegInfo == Names2SubRegIndices.end())
184 return 0;
185 return SubRegInfo->getValue();
186}
187
188void PerTargetMIParsingState::initNames2TargetIndices() {
189 if (!Names2TargetIndices.empty())
190 return;
191 const auto *TII = Subtarget.getInstrInfo();
192 assert(TII && "Expected target instruction info")(static_cast <bool> (TII && "Expected target instruction info"
) ? void (0) : __assert_fail ("TII && \"Expected target instruction info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 192, __extension__
__PRETTY_FUNCTION__))
;
193 auto Indices = TII->getSerializableTargetIndices();
194 for (const auto &I : Indices)
195 Names2TargetIndices.insert(std::make_pair(StringRef(I.second), I.first));
196}
197
198bool PerTargetMIParsingState::getTargetIndex(StringRef Name, int &Index) {
199 initNames2TargetIndices();
200 auto IndexInfo = Names2TargetIndices.find(Name);
201 if (IndexInfo == Names2TargetIndices.end())
202 return true;
203 Index = IndexInfo->second;
204 return false;
205}
206
207void PerTargetMIParsingState::initNames2DirectTargetFlags() {
208 if (!Names2DirectTargetFlags.empty())
209 return;
210
211 const auto *TII = Subtarget.getInstrInfo();
212 assert(TII && "Expected target instruction info")(static_cast <bool> (TII && "Expected target instruction info"
) ? void (0) : __assert_fail ("TII && \"Expected target instruction info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 212, __extension__
__PRETTY_FUNCTION__))
;
213 auto Flags = TII->getSerializableDirectMachineOperandTargetFlags();
214 for (const auto &I : Flags)
215 Names2DirectTargetFlags.insert(
216 std::make_pair(StringRef(I.second), I.first));
217}
218
219bool PerTargetMIParsingState::getDirectTargetFlag(StringRef Name,
220 unsigned &Flag) {
221 initNames2DirectTargetFlags();
222 auto FlagInfo = Names2DirectTargetFlags.find(Name);
223 if (FlagInfo == Names2DirectTargetFlags.end())
224 return true;
225 Flag = FlagInfo->second;
226 return false;
227}
228
229void PerTargetMIParsingState::initNames2BitmaskTargetFlags() {
230 if (!Names2BitmaskTargetFlags.empty())
231 return;
232
233 const auto *TII = Subtarget.getInstrInfo();
234 assert(TII && "Expected target instruction info")(static_cast <bool> (TII && "Expected target instruction info"
) ? void (0) : __assert_fail ("TII && \"Expected target instruction info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 234, __extension__
__PRETTY_FUNCTION__))
;
235 auto Flags = TII->getSerializableBitmaskMachineOperandTargetFlags();
236 for (const auto &I : Flags)
237 Names2BitmaskTargetFlags.insert(
238 std::make_pair(StringRef(I.second), I.first));
239}
240
241bool PerTargetMIParsingState::getBitmaskTargetFlag(StringRef Name,
242 unsigned &Flag) {
243 initNames2BitmaskTargetFlags();
244 auto FlagInfo = Names2BitmaskTargetFlags.find(Name);
245 if (FlagInfo == Names2BitmaskTargetFlags.end())
246 return true;
247 Flag = FlagInfo->second;
248 return false;
249}
250
251void PerTargetMIParsingState::initNames2MMOTargetFlags() {
252 if (!Names2MMOTargetFlags.empty())
253 return;
254
255 const auto *TII = Subtarget.getInstrInfo();
256 assert(TII && "Expected target instruction info")(static_cast <bool> (TII && "Expected target instruction info"
) ? void (0) : __assert_fail ("TII && \"Expected target instruction info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 256, __extension__
__PRETTY_FUNCTION__))
;
257 auto Flags = TII->getSerializableMachineMemOperandTargetFlags();
258 for (const auto &I : Flags)
259 Names2MMOTargetFlags.insert(std::make_pair(StringRef(I.second), I.first));
260}
261
262bool PerTargetMIParsingState::getMMOTargetFlag(StringRef Name,
263 MachineMemOperand::Flags &Flag) {
264 initNames2MMOTargetFlags();
265 auto FlagInfo = Names2MMOTargetFlags.find(Name);
266 if (FlagInfo == Names2MMOTargetFlags.end())
267 return true;
268 Flag = FlagInfo->second;
269 return false;
270}
271
272void PerTargetMIParsingState::initNames2RegClasses() {
273 if (!Names2RegClasses.empty())
274 return;
275
276 const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
277 for (unsigned I = 0, E = TRI->getNumRegClasses(); I < E; ++I) {
278 const auto *RC = TRI->getRegClass(I);
279 Names2RegClasses.insert(
280 std::make_pair(StringRef(TRI->getRegClassName(RC)).lower(), RC));
281 }
282}
283
284void PerTargetMIParsingState::initNames2RegBanks() {
285 if (!Names2RegBanks.empty())
286 return;
287
288 const RegisterBankInfo *RBI = Subtarget.getRegBankInfo();
289 // If the target does not support GlobalISel, we may not have a
290 // register bank info.
291 if (!RBI)
292 return;
293
294 for (unsigned I = 0, E = RBI->getNumRegBanks(); I < E; ++I) {
295 const auto &RegBank = RBI->getRegBank(I);
296 Names2RegBanks.insert(
297 std::make_pair(StringRef(RegBank.getName()).lower(), &RegBank));
298 }
299}
300
301const TargetRegisterClass *
302PerTargetMIParsingState::getRegClass(StringRef Name) {
303 auto RegClassInfo = Names2RegClasses.find(Name);
304 if (RegClassInfo == Names2RegClasses.end())
305 return nullptr;
306 return RegClassInfo->getValue();
307}
308
309const RegisterBank *PerTargetMIParsingState::getRegBank(StringRef Name) {
310 auto RegBankInfo = Names2RegBanks.find(Name);
311 if (RegBankInfo == Names2RegBanks.end())
312 return nullptr;
313 return RegBankInfo->getValue();
314}
315
316PerFunctionMIParsingState::PerFunctionMIParsingState(MachineFunction &MF,
317 SourceMgr &SM, const SlotMapping &IRSlots, PerTargetMIParsingState &T)
318 : MF(MF), SM(&SM), IRSlots(IRSlots), Target(T) {
319}
320
321VRegInfo &PerFunctionMIParsingState::getVRegInfo(Register Num) {
322 auto I = VRegInfos.insert(std::make_pair(Num, nullptr));
323 if (I.second) {
324 MachineRegisterInfo &MRI = MF.getRegInfo();
325 VRegInfo *Info = new (Allocator) VRegInfo;
326 Info->VReg = MRI.createIncompleteVirtualRegister();
327 I.first->second = Info;
328 }
329 return *I.first->second;
330}
331
332VRegInfo &PerFunctionMIParsingState::getVRegInfoNamed(StringRef RegName) {
333 assert(RegName != "" && "Expected named reg.")(static_cast <bool> (RegName != "" && "Expected named reg."
) ? void (0) : __assert_fail ("RegName != \"\" && \"Expected named reg.\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 333, __extension__
__PRETTY_FUNCTION__))
;
334
335 auto I = VRegInfosNamed.insert(std::make_pair(RegName.str(), nullptr));
336 if (I.second) {
337 VRegInfo *Info = new (Allocator) VRegInfo;
338 Info->VReg = MF.getRegInfo().createIncompleteVirtualRegister(RegName);
339 I.first->second = Info;
340 }
341 return *I.first->second;
342}
343
344static void mapValueToSlot(const Value *V, ModuleSlotTracker &MST,
345 DenseMap<unsigned, const Value *> &Slots2Values) {
346 int Slot = MST.getLocalSlot(V);
347 if (Slot == -1)
348 return;
349 Slots2Values.insert(std::make_pair(unsigned(Slot), V));
350}
351
352/// Creates the mapping from slot numbers to function's unnamed IR values.
353static void initSlots2Values(const Function &F,
354 DenseMap<unsigned, const Value *> &Slots2Values) {
355 ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false);
356 MST.incorporateFunction(F);
357 for (const auto &Arg : F.args())
358 mapValueToSlot(&Arg, MST, Slots2Values);
359 for (const auto &BB : F) {
360 mapValueToSlot(&BB, MST, Slots2Values);
361 for (const auto &I : BB)
362 mapValueToSlot(&I, MST, Slots2Values);
363 }
364}
365
366const Value* PerFunctionMIParsingState::getIRValue(unsigned Slot) {
367 if (Slots2Values.empty())
368 initSlots2Values(MF.getFunction(), Slots2Values);
369 return Slots2Values.lookup(Slot);
370}
371
372namespace {
373
374/// A wrapper struct around the 'MachineOperand' struct that includes a source
375/// range and other attributes.
376struct ParsedMachineOperand {
377 MachineOperand Operand;
378 StringRef::iterator Begin;
379 StringRef::iterator End;
380 Optional<unsigned> TiedDefIdx;
381
382 ParsedMachineOperand(const MachineOperand &Operand, StringRef::iterator Begin,
383 StringRef::iterator End, Optional<unsigned> &TiedDefIdx)
384 : Operand(Operand), Begin(Begin), End(End), TiedDefIdx(TiedDefIdx) {
385 if (TiedDefIdx)
386 assert(Operand.isReg() && Operand.isUse() &&(static_cast <bool> (Operand.isReg() && Operand
.isUse() && "Only used register operands can be tied"
) ? void (0) : __assert_fail ("Operand.isReg() && Operand.isUse() && \"Only used register operands can be tied\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 387, __extension__
__PRETTY_FUNCTION__))
387 "Only used register operands can be tied")(static_cast <bool> (Operand.isReg() && Operand
.isUse() && "Only used register operands can be tied"
) ? void (0) : __assert_fail ("Operand.isReg() && Operand.isUse() && \"Only used register operands can be tied\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 387, __extension__
__PRETTY_FUNCTION__))
;
388 }
389};
390
391class MIParser {
392 MachineFunction &MF;
393 SMDiagnostic &Error;
394 StringRef Source, CurrentSource;
395 SMRange SourceRange;
396 MIToken Token;
397 PerFunctionMIParsingState &PFS;
398 /// Maps from slot numbers to function's unnamed basic blocks.
399 DenseMap<unsigned, const BasicBlock *> Slots2BasicBlocks;
400
401public:
402 MIParser(PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
403 StringRef Source);
404 MIParser(PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
405 StringRef Source, SMRange SourceRange);
406
407 /// \p SkipChar gives the number of characters to skip before looking
408 /// for the next token.
409 void lex(unsigned SkipChar = 0);
410
411 /// Report an error at the current location with the given message.
412 ///
413 /// This function always return true.
414 bool error(const Twine &Msg);
415
416 /// Report an error at the given location with the given message.
417 ///
418 /// This function always return true.
419 bool error(StringRef::iterator Loc, const Twine &Msg);
420
421 bool
422 parseBasicBlockDefinitions(DenseMap<unsigned, MachineBasicBlock *> &MBBSlots);
423 bool parseBasicBlocks();
424 bool parse(MachineInstr *&MI);
425 bool parseStandaloneMBB(MachineBasicBlock *&MBB);
426 bool parseStandaloneNamedRegister(Register &Reg);
427 bool parseStandaloneVirtualRegister(VRegInfo *&Info);
428 bool parseStandaloneRegister(Register &Reg);
429 bool parseStandaloneStackObject(int &FI);
430 bool parseStandaloneMDNode(MDNode *&Node);
431 bool parseMachineMetadata();
432 bool parseMDTuple(MDNode *&MD, bool IsDistinct);
433 bool parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts);
434 bool parseMetadata(Metadata *&MD);
435
436 bool
437 parseBasicBlockDefinition(DenseMap<unsigned, MachineBasicBlock *> &MBBSlots);
438 bool parseBasicBlock(MachineBasicBlock &MBB,
439 MachineBasicBlock *&AddFalthroughFrom);
440 bool parseBasicBlockLiveins(MachineBasicBlock &MBB);
441 bool parseBasicBlockSuccessors(MachineBasicBlock &MBB);
442
443 bool parseNamedRegister(Register &Reg);
444 bool parseVirtualRegister(VRegInfo *&Info);
445 bool parseNamedVirtualRegister(VRegInfo *&Info);
446 bool parseRegister(Register &Reg, VRegInfo *&VRegInfo);
447 bool parseRegisterFlag(unsigned &Flags);
448 bool parseRegisterClassOrBank(VRegInfo &RegInfo);
449 bool parseSubRegisterIndex(unsigned &SubReg);
450 bool parseRegisterTiedDefIndex(unsigned &TiedDefIdx);
451 bool parseRegisterOperand(MachineOperand &Dest,
452 Optional<unsigned> &TiedDefIdx, bool IsDef = false);
453 bool parseImmediateOperand(MachineOperand &Dest);
454 bool parseIRConstant(StringRef::iterator Loc, StringRef StringValue,
455 const Constant *&C);
456 bool parseIRConstant(StringRef::iterator Loc, const Constant *&C);
457 bool parseLowLevelType(StringRef::iterator Loc, LLT &Ty);
458 bool parseTypedImmediateOperand(MachineOperand &Dest);
459 bool parseFPImmediateOperand(MachineOperand &Dest);
460 bool parseMBBReference(MachineBasicBlock *&MBB);
461 bool parseMBBOperand(MachineOperand &Dest);
462 bool parseStackFrameIndex(int &FI);
463 bool parseStackObjectOperand(MachineOperand &Dest);
464 bool parseFixedStackFrameIndex(int &FI);
465 bool parseFixedStackObjectOperand(MachineOperand &Dest);
466 bool parseGlobalValue(GlobalValue *&GV);
467 bool parseGlobalAddressOperand(MachineOperand &Dest);
468 bool parseConstantPoolIndexOperand(MachineOperand &Dest);
469 bool parseSubRegisterIndexOperand(MachineOperand &Dest);
470 bool parseJumpTableIndexOperand(MachineOperand &Dest);
471 bool parseExternalSymbolOperand(MachineOperand &Dest);
472 bool parseMCSymbolOperand(MachineOperand &Dest);
473 bool parseMDNode(MDNode *&Node);
474 bool parseDIExpression(MDNode *&Expr);
475 bool parseDILocation(MDNode *&Expr);
476 bool parseMetadataOperand(MachineOperand &Dest);
477 bool parseCFIOffset(int &Offset);
478 bool parseCFIRegister(Register &Reg);
479 bool parseCFIAddressSpace(unsigned &AddressSpace);
480 bool parseCFIEscapeValues(std::string& Values);
481 bool parseCFIOperand(MachineOperand &Dest);
482 bool parseIRBlock(BasicBlock *&BB, const Function &F);
483 bool parseBlockAddressOperand(MachineOperand &Dest);
484 bool parseIntrinsicOperand(MachineOperand &Dest);
485 bool parsePredicateOperand(MachineOperand &Dest);
486 bool parseShuffleMaskOperand(MachineOperand &Dest);
487 bool parseTargetIndexOperand(MachineOperand &Dest);
488 bool parseCustomRegisterMaskOperand(MachineOperand &Dest);
489 bool parseLiveoutRegisterMaskOperand(MachineOperand &Dest);
490 bool parseMachineOperand(const unsigned OpCode, const unsigned OpIdx,
491 MachineOperand &Dest,
492 Optional<unsigned> &TiedDefIdx);
493 bool parseMachineOperandAndTargetFlags(const unsigned OpCode,
494 const unsigned OpIdx,
495 MachineOperand &Dest,
496 Optional<unsigned> &TiedDefIdx);
497 bool parseOffset(int64_t &Offset);
498 bool parseAlignment(uint64_t &Alignment);
499 bool parseAddrspace(unsigned &Addrspace);
500 bool parseSectionID(Optional<MBBSectionID> &SID);
501 bool parseOperandsOffset(MachineOperand &Op);
502 bool parseIRValue(const Value *&V);
503 bool parseMemoryOperandFlag(MachineMemOperand::Flags &Flags);
504 bool parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV);
505 bool parseMachinePointerInfo(MachinePointerInfo &Dest);
506 bool parseOptionalScope(LLVMContext &Context, SyncScope::ID &SSID);
507 bool parseOptionalAtomicOrdering(AtomicOrdering &Order);
508 bool parseMachineMemoryOperand(MachineMemOperand *&Dest);
509 bool parsePreOrPostInstrSymbol(MCSymbol *&Symbol);
510 bool parseHeapAllocMarker(MDNode *&Node);
511
512 bool parseTargetImmMnemonic(const unsigned OpCode, const unsigned OpIdx,
513 MachineOperand &Dest, const MIRFormatter &MF);
514
515private:
516 /// Convert the integer literal in the current token into an unsigned integer.
517 ///
518 /// Return true if an error occurred.
519 bool getUnsigned(unsigned &Result);
520
521 /// Convert the integer literal in the current token into an uint64.
522 ///
523 /// Return true if an error occurred.
524 bool getUint64(uint64_t &Result);
525
526 /// Convert the hexadecimal literal in the current token into an unsigned
527 /// APInt with a minimum bitwidth required to represent the value.
528 ///
529 /// Return true if the literal does not represent an integer value.
530 bool getHexUint(APInt &Result);
531
532 /// If the current token is of the given kind, consume it and return false.
533 /// Otherwise report an error and return true.
534 bool expectAndConsume(MIToken::TokenKind TokenKind);
535
536 /// If the current token is of the given kind, consume it and return true.
537 /// Otherwise return false.
538 bool consumeIfPresent(MIToken::TokenKind TokenKind);
539
540 bool parseInstruction(unsigned &OpCode, unsigned &Flags);
541
542 bool assignRegisterTies(MachineInstr &MI,
543 ArrayRef<ParsedMachineOperand> Operands);
544
545 bool verifyImplicitOperands(ArrayRef<ParsedMachineOperand> Operands,
546 const MCInstrDesc &MCID);
547
548 const BasicBlock *getIRBlock(unsigned Slot);
549 const BasicBlock *getIRBlock(unsigned Slot, const Function &F);
550
551 /// Get or create an MCSymbol for a given name.
552 MCSymbol *getOrCreateMCSymbol(StringRef Name);
553
554 /// parseStringConstant
555 /// ::= StringConstant
556 bool parseStringConstant(std::string &Result);
557
558 /// Map the location in the MI string to the corresponding location specified
559 /// in `SourceRange`.
560 SMLoc mapSMLoc(StringRef::iterator Loc);
561};
562
563} // end anonymous namespace
564
565MIParser::MIParser(PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
566 StringRef Source)
567 : MF(PFS.MF), Error(Error), Source(Source), CurrentSource(Source), PFS(PFS)
568{}
569
570MIParser::MIParser(PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
571 StringRef Source, SMRange SourceRange)
572 : MF(PFS.MF), Error(Error), Source(Source), CurrentSource(Source),
573 SourceRange(SourceRange), PFS(PFS) {}
574
575void MIParser::lex(unsigned SkipChar) {
576 CurrentSource = lexMIToken(
577 CurrentSource.slice(SkipChar, StringRef::npos), Token,
578 [this](StringRef::iterator Loc, const Twine &Msg) { error(Loc, Msg); });
579}
580
581bool MIParser::error(const Twine &Msg) { return error(Token.location(), Msg); }
582
583bool MIParser::error(StringRef::iterator Loc, const Twine &Msg) {
584 const SourceMgr &SM = *PFS.SM;
585 assert(Loc >= Source.data() && Loc <= (Source.data() + Source.size()))(static_cast <bool> (Loc >= Source.data() &&
Loc <= (Source.data() + Source.size())) ? void (0) : __assert_fail
("Loc >= Source.data() && Loc <= (Source.data() + Source.size())"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 585, __extension__
__PRETTY_FUNCTION__))
;
586 const MemoryBuffer &Buffer = *SM.getMemoryBuffer(SM.getMainFileID());
587 if (Loc >= Buffer.getBufferStart() && Loc <= Buffer.getBufferEnd()) {
588 // Create an ordinary diagnostic when the source manager's buffer is the
589 // source string.
590 Error = SM.GetMessage(SMLoc::getFromPointer(Loc), SourceMgr::DK_Error, Msg);
591 return true;
592 }
593 // Create a diagnostic for a YAML string literal.
594 Error = SMDiagnostic(SM, SMLoc(), Buffer.getBufferIdentifier(), 1,
595 Loc - Source.data(), SourceMgr::DK_Error, Msg.str(),
596 Source, None, None);
597 return true;
598}
599
600SMLoc MIParser::mapSMLoc(StringRef::iterator Loc) {
601 assert(SourceRange.isValid() && "Invalid source range")(static_cast <bool> (SourceRange.isValid() && "Invalid source range"
) ? void (0) : __assert_fail ("SourceRange.isValid() && \"Invalid source range\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 601, __extension__
__PRETTY_FUNCTION__))
;
602 assert(Loc >= Source.data() && Loc <= (Source.data() + Source.size()))(static_cast <bool> (Loc >= Source.data() &&
Loc <= (Source.data() + Source.size())) ? void (0) : __assert_fail
("Loc >= Source.data() && Loc <= (Source.data() + Source.size())"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 602, __extension__
__PRETTY_FUNCTION__))
;
603 return SMLoc::getFromPointer(SourceRange.Start.getPointer() +
604 (Loc - Source.data()));
605}
606
607typedef function_ref<bool(StringRef::iterator Loc, const Twine &)>
608 ErrorCallbackType;
609
610static const char *toString(MIToken::TokenKind TokenKind) {
611 switch (TokenKind) {
612 case MIToken::comma:
613 return "','";
614 case MIToken::equal:
615 return "'='";
616 case MIToken::colon:
617 return "':'";
618 case MIToken::lparen:
619 return "'('";
620 case MIToken::rparen:
621 return "')'";
622 default:
623 return "<unknown token>";
624 }
625}
626
627bool MIParser::expectAndConsume(MIToken::TokenKind TokenKind) {
628 if (Token.isNot(TokenKind))
629 return error(Twine("expected ") + toString(TokenKind));
630 lex();
631 return false;
632}
633
634bool MIParser::consumeIfPresent(MIToken::TokenKind TokenKind) {
635 if (Token.isNot(TokenKind))
636 return false;
637 lex();
638 return true;
639}
640
641// Parse Machine Basic Block Section ID.
642bool MIParser::parseSectionID(Optional<MBBSectionID> &SID) {
643 assert(Token.is(MIToken::kw_bbsections))(static_cast <bool> (Token.is(MIToken::kw_bbsections)) ?
void (0) : __assert_fail ("Token.is(MIToken::kw_bbsections)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 643, __extension__
__PRETTY_FUNCTION__))
;
644 lex();
645 if (Token.is(MIToken::IntegerLiteral)) {
646 unsigned Value = 0;
647 if (getUnsigned(Value))
648 return error("Unknown Section ID");
649 SID = MBBSectionID{Value};
650 } else {
651 const StringRef &S = Token.stringValue();
652 if (S == "Exception")
653 SID = MBBSectionID::ExceptionSectionID;
654 else if (S == "Cold")
655 SID = MBBSectionID::ColdSectionID;
656 else
657 return error("Unknown Section ID");
658 }
659 lex();
660 return false;
661}
662
663bool MIParser::parseBasicBlockDefinition(
664 DenseMap<unsigned, MachineBasicBlock *> &MBBSlots) {
665 assert(Token.is(MIToken::MachineBasicBlockLabel))(static_cast <bool> (Token.is(MIToken::MachineBasicBlockLabel
)) ? void (0) : __assert_fail ("Token.is(MIToken::MachineBasicBlockLabel)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 665, __extension__
__PRETTY_FUNCTION__))
;
666 unsigned ID = 0;
667 if (getUnsigned(ID))
668 return true;
669 auto Loc = Token.location();
670 auto Name = Token.stringValue();
671 lex();
672 bool HasAddressTaken = false;
673 bool IsLandingPad = false;
674 bool IsInlineAsmBrIndirectTarget = false;
675 bool IsEHFuncletEntry = false;
676 Optional<MBBSectionID> SectionID;
677 uint64_t Alignment = 0;
678 BasicBlock *BB = nullptr;
679 if (consumeIfPresent(MIToken::lparen)) {
680 do {
681 // TODO: Report an error when multiple same attributes are specified.
682 switch (Token.kind()) {
683 case MIToken::kw_address_taken:
684 HasAddressTaken = true;
685 lex();
686 break;
687 case MIToken::kw_landing_pad:
688 IsLandingPad = true;
689 lex();
690 break;
691 case MIToken::kw_inlineasm_br_indirect_target:
692 IsInlineAsmBrIndirectTarget = true;
693 lex();
694 break;
695 case MIToken::kw_ehfunclet_entry:
696 IsEHFuncletEntry = true;
697 lex();
698 break;
699 case MIToken::kw_align:
700 if (parseAlignment(Alignment))
701 return true;
702 break;
703 case MIToken::IRBlock:
704 // TODO: Report an error when both name and ir block are specified.
705 if (parseIRBlock(BB, MF.getFunction()))
706 return true;
707 lex();
708 break;
709 case MIToken::kw_bbsections:
710 if (parseSectionID(SectionID))
711 return true;
712 break;
713 default:
714 break;
715 }
716 } while (consumeIfPresent(MIToken::comma));
717 if (expectAndConsume(MIToken::rparen))
718 return true;
719 }
720 if (expectAndConsume(MIToken::colon))
721 return true;
722
723 if (!Name.empty()) {
724 BB = dyn_cast_or_null<BasicBlock>(
725 MF.getFunction().getValueSymbolTable()->lookup(Name));
726 if (!BB)
727 return error(Loc, Twine("basic block '") + Name +
728 "' is not defined in the function '" +
729 MF.getName() + "'");
730 }
731 auto *MBB = MF.CreateMachineBasicBlock(BB);
732 MF.insert(MF.end(), MBB);
733 bool WasInserted = MBBSlots.insert(std::make_pair(ID, MBB)).second;
734 if (!WasInserted)
735 return error(Loc, Twine("redefinition of machine basic block with id #") +
736 Twine(ID));
737 if (Alignment)
738 MBB->setAlignment(Align(Alignment));
739 if (HasAddressTaken)
740 MBB->setHasAddressTaken();
741 MBB->setIsEHPad(IsLandingPad);
742 MBB->setIsInlineAsmBrIndirectTarget(IsInlineAsmBrIndirectTarget);
743 MBB->setIsEHFuncletEntry(IsEHFuncletEntry);
744 if (SectionID.hasValue()) {
745 MBB->setSectionID(SectionID.getValue());
746 MF.setBBSectionsType(BasicBlockSection::List);
747 }
748 return false;
749}
750
751bool MIParser::parseBasicBlockDefinitions(
752 DenseMap<unsigned, MachineBasicBlock *> &MBBSlots) {
753 lex();
754 // Skip until the first machine basic block.
755 while (Token.is(MIToken::Newline))
756 lex();
757 if (Token.isErrorOrEOF())
758 return Token.isError();
759 if (Token.isNot(MIToken::MachineBasicBlockLabel))
760 return error("expected a basic block definition before instructions");
761 unsigned BraceDepth = 0;
762 do {
763 if (parseBasicBlockDefinition(MBBSlots))
764 return true;
765 bool IsAfterNewline = false;
766 // Skip until the next machine basic block.
767 while (true) {
768 if ((Token.is(MIToken::MachineBasicBlockLabel) && IsAfterNewline) ||
769 Token.isErrorOrEOF())
770 break;
771 else if (Token.is(MIToken::MachineBasicBlockLabel))
772 return error("basic block definition should be located at the start of "
773 "the line");
774 else if (consumeIfPresent(MIToken::Newline)) {
775 IsAfterNewline = true;
776 continue;
777 }
778 IsAfterNewline = false;
779 if (Token.is(MIToken::lbrace))
780 ++BraceDepth;
781 if (Token.is(MIToken::rbrace)) {
782 if (!BraceDepth)
783 return error("extraneous closing brace ('}')");
784 --BraceDepth;
785 }
786 lex();
787 }
788 // Verify that we closed all of the '{' at the end of a file or a block.
789 if (!Token.isError() && BraceDepth)
790 return error("expected '}'"); // FIXME: Report a note that shows '{'.
791 } while (!Token.isErrorOrEOF());
792 return Token.isError();
793}
794
795bool MIParser::parseBasicBlockLiveins(MachineBasicBlock &MBB) {
796 assert(Token.is(MIToken::kw_liveins))(static_cast <bool> (Token.is(MIToken::kw_liveins)) ? void
(0) : __assert_fail ("Token.is(MIToken::kw_liveins)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 796, __extension__ __PRETTY_FUNCTION__))
;
797 lex();
798 if (expectAndConsume(MIToken::colon))
799 return true;
800 if (Token.isNewlineOrEOF()) // Allow an empty list of liveins.
801 return false;
802 do {
803 if (Token.isNot(MIToken::NamedRegister))
804 return error("expected a named register");
805 Register Reg;
806 if (parseNamedRegister(Reg))
807 return true;
808 lex();
809 LaneBitmask Mask = LaneBitmask::getAll();
810 if (consumeIfPresent(MIToken::colon)) {
811 // Parse lane mask.
812 if (Token.isNot(MIToken::IntegerLiteral) &&
813 Token.isNot(MIToken::HexLiteral))
814 return error("expected a lane mask");
815 static_assert(sizeof(LaneBitmask::Type) == sizeof(uint64_t),
816 "Use correct get-function for lane mask");
817 LaneBitmask::Type V;
818 if (getUint64(V))
819 return error("invalid lane mask value");
820 Mask = LaneBitmask(V);
821 lex();
822 }
823 MBB.addLiveIn(Reg, Mask);
824 } while (consumeIfPresent(MIToken::comma));
825 return false;
826}
827
828bool MIParser::parseBasicBlockSuccessors(MachineBasicBlock &MBB) {
829 assert(Token.is(MIToken::kw_successors))(static_cast <bool> (Token.is(MIToken::kw_successors)) ?
void (0) : __assert_fail ("Token.is(MIToken::kw_successors)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 829, __extension__
__PRETTY_FUNCTION__))
;
830 lex();
831 if (expectAndConsume(MIToken::colon))
832 return true;
833 if (Token.isNewlineOrEOF()) // Allow an empty list of successors.
834 return false;
835 do {
836 if (Token.isNot(MIToken::MachineBasicBlock))
837 return error("expected a machine basic block reference");
838 MachineBasicBlock *SuccMBB = nullptr;
839 if (parseMBBReference(SuccMBB))
840 return true;
841 lex();
842 unsigned Weight = 0;
843 if (consumeIfPresent(MIToken::lparen)) {
844 if (Token.isNot(MIToken::IntegerLiteral) &&
845 Token.isNot(MIToken::HexLiteral))
846 return error("expected an integer literal after '('");
847 if (getUnsigned(Weight))
848 return true;
849 lex();
850 if (expectAndConsume(MIToken::rparen))
851 return true;
852 }
853 MBB.addSuccessor(SuccMBB, BranchProbability::getRaw(Weight));
854 } while (consumeIfPresent(MIToken::comma));
855 MBB.normalizeSuccProbs();
856 return false;
857}
858
859bool MIParser::parseBasicBlock(MachineBasicBlock &MBB,
860 MachineBasicBlock *&AddFalthroughFrom) {
861 // Skip the definition.
862 assert(Token.is(MIToken::MachineBasicBlockLabel))(static_cast <bool> (Token.is(MIToken::MachineBasicBlockLabel
)) ? void (0) : __assert_fail ("Token.is(MIToken::MachineBasicBlockLabel)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 862, __extension__
__PRETTY_FUNCTION__))
;
863 lex();
864 if (consumeIfPresent(MIToken::lparen)) {
865 while (Token.isNot(MIToken::rparen) && !Token.isErrorOrEOF())
866 lex();
867 consumeIfPresent(MIToken::rparen);
868 }
869 consumeIfPresent(MIToken::colon);
870
871 // Parse the liveins and successors.
872 // N.B: Multiple lists of successors and liveins are allowed and they're
873 // merged into one.
874 // Example:
875 // liveins: $edi
876 // liveins: $esi
877 //
878 // is equivalent to
879 // liveins: $edi, $esi
880 bool ExplicitSuccessors = false;
881 while (true) {
882 if (Token.is(MIToken::kw_successors)) {
883 if (parseBasicBlockSuccessors(MBB))
884 return true;
885 ExplicitSuccessors = true;
886 } else if (Token.is(MIToken::kw_liveins)) {
887 if (parseBasicBlockLiveins(MBB))
888 return true;
889 } else if (consumeIfPresent(MIToken::Newline)) {
890 continue;
891 } else
892 break;
893 if (!Token.isNewlineOrEOF())
894 return error("expected line break at the end of a list");
895 lex();
896 }
897
898 // Parse the instructions.
899 bool IsInBundle = false;
900 MachineInstr *PrevMI = nullptr;
901 while (!Token.is(MIToken::MachineBasicBlockLabel) &&
902 !Token.is(MIToken::Eof)) {
903 if (consumeIfPresent(MIToken::Newline))
904 continue;
905 if (consumeIfPresent(MIToken::rbrace)) {
906 // The first parsing pass should verify that all closing '}' have an
907 // opening '{'.
908 assert(IsInBundle)(static_cast <bool> (IsInBundle) ? void (0) : __assert_fail
("IsInBundle", "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 908
, __extension__ __PRETTY_FUNCTION__))
;
909 IsInBundle = false;
910 continue;
911 }
912 MachineInstr *MI = nullptr;
913 if (parse(MI))
914 return true;
915 MBB.insert(MBB.end(), MI);
916 if (IsInBundle) {
917 PrevMI->setFlag(MachineInstr::BundledSucc);
918 MI->setFlag(MachineInstr::BundledPred);
919 }
920 PrevMI = MI;
921 if (Token.is(MIToken::lbrace)) {
922 if (IsInBundle)
923 return error("nested instruction bundles are not allowed");
924 lex();
925 // This instruction is the start of the bundle.
926 MI->setFlag(MachineInstr::BundledSucc);
927 IsInBundle = true;
928 if (!Token.is(MIToken::Newline))
929 // The next instruction can be on the same line.
930 continue;
931 }
932 assert(Token.isNewlineOrEOF() && "MI is not fully parsed")(static_cast <bool> (Token.isNewlineOrEOF() && "MI is not fully parsed"
) ? void (0) : __assert_fail ("Token.isNewlineOrEOF() && \"MI is not fully parsed\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 932, __extension__
__PRETTY_FUNCTION__))
;
933 lex();
934 }
935
936 // Construct successor list by searching for basic block machine operands.
937 if (!ExplicitSuccessors) {
938 SmallVector<MachineBasicBlock*,4> Successors;
939 bool IsFallthrough;
940 guessSuccessors(MBB, Successors, IsFallthrough);
941 for (MachineBasicBlock *Succ : Successors)
942 MBB.addSuccessor(Succ);
943
944 if (IsFallthrough) {
945 AddFalthroughFrom = &MBB;
946 } else {
947 MBB.normalizeSuccProbs();
948 }
949 }
950
951 return false;
952}
953
954bool MIParser::parseBasicBlocks() {
955 lex();
956 // Skip until the first machine basic block.
957 while (Token.is(MIToken::Newline))
958 lex();
959 if (Token.isErrorOrEOF())
960 return Token.isError();
961 // The first parsing pass should have verified that this token is a MBB label
962 // in the 'parseBasicBlockDefinitions' method.
963 assert(Token.is(MIToken::MachineBasicBlockLabel))(static_cast <bool> (Token.is(MIToken::MachineBasicBlockLabel
)) ? void (0) : __assert_fail ("Token.is(MIToken::MachineBasicBlockLabel)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 963, __extension__
__PRETTY_FUNCTION__))
;
964 MachineBasicBlock *AddFalthroughFrom = nullptr;
965 do {
966 MachineBasicBlock *MBB = nullptr;
967 if (parseMBBReference(MBB))
968 return true;
969 if (AddFalthroughFrom) {
970 if (!AddFalthroughFrom->isSuccessor(MBB))
971 AddFalthroughFrom->addSuccessor(MBB);
972 AddFalthroughFrom->normalizeSuccProbs();
973 AddFalthroughFrom = nullptr;
974 }
975 if (parseBasicBlock(*MBB, AddFalthroughFrom))
976 return true;
977 // The method 'parseBasicBlock' should parse the whole block until the next
978 // block or the end of file.
979 assert(Token.is(MIToken::MachineBasicBlockLabel) || Token.is(MIToken::Eof))(static_cast <bool> (Token.is(MIToken::MachineBasicBlockLabel
) || Token.is(MIToken::Eof)) ? void (0) : __assert_fail ("Token.is(MIToken::MachineBasicBlockLabel) || Token.is(MIToken::Eof)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 979, __extension__
__PRETTY_FUNCTION__))
;
980 } while (Token.isNot(MIToken::Eof));
981 return false;
982}
983
984bool MIParser::parse(MachineInstr *&MI) {
985 // Parse any register operands before '='
986 MachineOperand MO = MachineOperand::CreateImm(0);
987 SmallVector<ParsedMachineOperand, 8> Operands;
988 while (Token.isRegister() || Token.isRegisterFlag()) {
989 auto Loc = Token.location();
990 Optional<unsigned> TiedDefIdx;
991 if (parseRegisterOperand(MO, TiedDefIdx, /*IsDef=*/true))
992 return true;
993 Operands.push_back(
994 ParsedMachineOperand(MO, Loc, Token.location(), TiedDefIdx));
995 if (Token.isNot(MIToken::comma))
996 break;
997 lex();
998 }
999 if (!Operands.empty() && expectAndConsume(MIToken::equal))
1000 return true;
1001
1002 unsigned OpCode, Flags = 0;
1003 if (Token.isError() || parseInstruction(OpCode, Flags))
1004 return true;
1005
1006 // Parse the remaining machine operands.
1007 while (!Token.isNewlineOrEOF() && Token.isNot(MIToken::kw_pre_instr_symbol) &&
1008 Token.isNot(MIToken::kw_post_instr_symbol) &&
1009 Token.isNot(MIToken::kw_heap_alloc_marker) &&
1010 Token.isNot(MIToken::kw_debug_location) &&
1011 Token.isNot(MIToken::kw_debug_instr_number) &&
1012 Token.isNot(MIToken::coloncolon) && Token.isNot(MIToken::lbrace)) {
1013 auto Loc = Token.location();
1014 Optional<unsigned> TiedDefIdx;
1015 if (parseMachineOperandAndTargetFlags(OpCode, Operands.size(), MO, TiedDefIdx))
1016 return true;
1017 Operands.push_back(
1018 ParsedMachineOperand(MO, Loc, Token.location(), TiedDefIdx));
1019 if (Token.isNewlineOrEOF() || Token.is(MIToken::coloncolon) ||
1020 Token.is(MIToken::lbrace))
1021 break;
1022 if (Token.isNot(MIToken::comma))
1023 return error("expected ',' before the next machine operand");
1024 lex();
1025 }
1026
1027 MCSymbol *PreInstrSymbol = nullptr;
1028 if (Token.is(MIToken::kw_pre_instr_symbol))
1029 if (parsePreOrPostInstrSymbol(PreInstrSymbol))
1030 return true;
1031 MCSymbol *PostInstrSymbol = nullptr;
1032 if (Token.is(MIToken::kw_post_instr_symbol))
1033 if (parsePreOrPostInstrSymbol(PostInstrSymbol))
1034 return true;
1035 MDNode *HeapAllocMarker = nullptr;
1036 if (Token.is(MIToken::kw_heap_alloc_marker))
1037 if (parseHeapAllocMarker(HeapAllocMarker))
1038 return true;
1039
1040 unsigned InstrNum = 0;
1041 if (Token.is(MIToken::kw_debug_instr_number)) {
1042 lex();
1043 if (Token.isNot(MIToken::IntegerLiteral))
1044 return error("expected an integer literal after 'debug-instr-number'");
1045 if (getUnsigned(InstrNum))
1046 return true;
1047 lex();
1048 // Lex past trailing comma if present.
1049 if (Token.is(MIToken::comma))
1050 lex();
1051 }
1052
1053 DebugLoc DebugLocation;
1054 if (Token.is(MIToken::kw_debug_location)) {
1055 lex();
1056 MDNode *Node = nullptr;
1057 if (Token.is(MIToken::exclaim)) {
1058 if (parseMDNode(Node))
1059 return true;
1060 } else if (Token.is(MIToken::md_dilocation)) {
1061 if (parseDILocation(Node))
1062 return true;
1063 } else
1064 return error("expected a metadata node after 'debug-location'");
1065 if (!isa<DILocation>(Node))
1066 return error("referenced metadata is not a DILocation");
1067 DebugLocation = DebugLoc(Node);
1068 }
1069
1070 // Parse the machine memory operands.
1071 SmallVector<MachineMemOperand *, 2> MemOperands;
1072 if (Token.is(MIToken::coloncolon)) {
1073 lex();
1074 while (!Token.isNewlineOrEOF()) {
1075 MachineMemOperand *MemOp = nullptr;
1076 if (parseMachineMemoryOperand(MemOp))
1077 return true;
1078 MemOperands.push_back(MemOp);
1079 if (Token.isNewlineOrEOF())
1080 break;
1081 if (Token.isNot(MIToken::comma))
1082 return error("expected ',' before the next machine memory operand");
1083 lex();
1084 }
1085 }
1086
1087 const auto &MCID = MF.getSubtarget().getInstrInfo()->get(OpCode);
1088 if (!MCID.isVariadic()) {
1089 // FIXME: Move the implicit operand verification to the machine verifier.
1090 if (verifyImplicitOperands(Operands, MCID))
1091 return true;
1092 }
1093
1094 MI = MF.CreateMachineInstr(MCID, DebugLocation, /*NoImplicit=*/true);
1095 MI->setFlags(Flags);
1096
1097 unsigned NumExplicitOps = 0;
1098 for (const auto &Operand : Operands) {
1099 bool IsImplicitOp = Operand.Operand.isReg() && Operand.Operand.isImplicit();
1100 if (!IsImplicitOp) {
1101 if (!MCID.isVariadic() && NumExplicitOps >= MCID.getNumOperands() &&
1102 !Operand.Operand.isValidExcessOperand())
1103 return error("too many operands for instruction");
1104
1105 ++NumExplicitOps;
1106 }
1107
1108 MI->addOperand(MF, Operand.Operand);
1109 }
1110
1111 if (assignRegisterTies(*MI, Operands))
1112 return true;
1113 if (PreInstrSymbol)
1114 MI->setPreInstrSymbol(MF, PreInstrSymbol);
1115 if (PostInstrSymbol)
1116 MI->setPostInstrSymbol(MF, PostInstrSymbol);
1117 if (HeapAllocMarker)
1118 MI->setHeapAllocMarker(MF, HeapAllocMarker);
1119 if (!MemOperands.empty())
1120 MI->setMemRefs(MF, MemOperands);
1121 if (InstrNum)
1122 MI->setDebugInstrNum(InstrNum);
1123 return false;
1124}
1125
1126bool MIParser::parseStandaloneMBB(MachineBasicBlock *&MBB) {
1127 lex();
1128 if (Token.isNot(MIToken::MachineBasicBlock))
1129 return error("expected a machine basic block reference");
1130 if (parseMBBReference(MBB))
1131 return true;
1132 lex();
1133 if (Token.isNot(MIToken::Eof))
1134 return error(
1135 "expected end of string after the machine basic block reference");
1136 return false;
1137}
1138
1139bool MIParser::parseStandaloneNamedRegister(Register &Reg) {
1140 lex();
1141 if (Token.isNot(MIToken::NamedRegister))
1142 return error("expected a named register");
1143 if (parseNamedRegister(Reg))
1144 return true;
1145 lex();
1146 if (Token.isNot(MIToken::Eof))
1147 return error("expected end of string after the register reference");
1148 return false;
1149}
1150
1151bool MIParser::parseStandaloneVirtualRegister(VRegInfo *&Info) {
1152 lex();
1153 if (Token.isNot(MIToken::VirtualRegister))
1154 return error("expected a virtual register");
1155 if (parseVirtualRegister(Info))
1156 return true;
1157 lex();
1158 if (Token.isNot(MIToken::Eof))
1159 return error("expected end of string after the register reference");
1160 return false;
1161}
1162
1163bool MIParser::parseStandaloneRegister(Register &Reg) {
1164 lex();
1165 if (Token.isNot(MIToken::NamedRegister) &&
1166 Token.isNot(MIToken::VirtualRegister))
1167 return error("expected either a named or virtual register");
1168
1169 VRegInfo *Info;
1170 if (parseRegister(Reg, Info))
1171 return true;
1172
1173 lex();
1174 if (Token.isNot(MIToken::Eof))
1175 return error("expected end of string after the register reference");
1176 return false;
1177}
1178
1179bool MIParser::parseStandaloneStackObject(int &FI) {
1180 lex();
1181 if (Token.isNot(MIToken::StackObject))
1182 return error("expected a stack object");
1183 if (parseStackFrameIndex(FI))
1184 return true;
1185 if (Token.isNot(MIToken::Eof))
1186 return error("expected end of string after the stack object reference");
1187 return false;
1188}
1189
1190bool MIParser::parseStandaloneMDNode(MDNode *&Node) {
1191 lex();
1192 if (Token.is(MIToken::exclaim)) {
1193 if (parseMDNode(Node))
1194 return true;
1195 } else if (Token.is(MIToken::md_diexpr)) {
1196 if (parseDIExpression(Node))
1197 return true;
1198 } else if (Token.is(MIToken::md_dilocation)) {
1199 if (parseDILocation(Node))
1200 return true;
1201 } else
1202 return error("expected a metadata node");
1203 if (Token.isNot(MIToken::Eof))
1204 return error("expected end of string after the metadata node");
1205 return false;
1206}
1207
1208bool MIParser::parseMachineMetadata() {
1209 lex();
1210 if (Token.isNot(MIToken::exclaim))
1211 return error("expected a metadata node");
1212
1213 lex();
1214 if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
1215 return error("expected metadata id after '!'");
1216 unsigned ID = 0;
1217 if (getUnsigned(ID))
1218 return true;
1219 lex();
1220 if (expectAndConsume(MIToken::equal))
1221 return true;
1222 bool IsDistinct = Token.is(MIToken::kw_distinct);
1223 if (IsDistinct)
1224 lex();
1225 if (Token.isNot(MIToken::exclaim))
1226 return error("expected a metadata node");
1227 lex();
1228
1229 MDNode *MD;
1230 if (parseMDTuple(MD, IsDistinct))
1231 return true;
1232
1233 auto FI = PFS.MachineForwardRefMDNodes.find(ID);
1234 if (FI != PFS.MachineForwardRefMDNodes.end()) {
1235 FI->second.first->replaceAllUsesWith(MD);
1236 PFS.MachineForwardRefMDNodes.erase(FI);
1237
1238 assert(PFS.MachineMetadataNodes[ID] == MD && "Tracking VH didn't work")(static_cast <bool> (PFS.MachineMetadataNodes[ID] == MD
&& "Tracking VH didn't work") ? void (0) : __assert_fail
("PFS.MachineMetadataNodes[ID] == MD && \"Tracking VH didn't work\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1238, __extension__
__PRETTY_FUNCTION__))
;
1239 } else {
1240 if (PFS.MachineMetadataNodes.count(ID))
1241 return error("Metadata id is already used");
1242 PFS.MachineMetadataNodes[ID].reset(MD);
1243 }
1244
1245 return false;
1246}
1247
1248bool MIParser::parseMDTuple(MDNode *&MD, bool IsDistinct) {
1249 SmallVector<Metadata *, 16> Elts;
1250 if (parseMDNodeVector(Elts))
1251 return true;
1252 MD = (IsDistinct ? MDTuple::getDistinct
1253 : MDTuple::get)(MF.getFunction().getContext(), Elts);
1254 return false;
1255}
1256
1257bool MIParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
1258 if (Token.isNot(MIToken::lbrace))
1259 return error("expected '{' here");
1260 lex();
1261
1262 if (Token.is(MIToken::rbrace)) {
1263 lex();
1264 return false;
1265 }
1266
1267 do {
1268 Metadata *MD;
1269 if (parseMetadata(MD))
1270 return true;
1271
1272 Elts.push_back(MD);
1273
1274 if (Token.isNot(MIToken::comma))
1275 break;
1276 lex();
1277 } while (true);
1278
1279 if (Token.isNot(MIToken::rbrace))
1280 return error("expected end of metadata node");
1281 lex();
1282
1283 return false;
1284}
1285
1286// ::= !42
1287// ::= !"string"
1288bool MIParser::parseMetadata(Metadata *&MD) {
1289 if (Token.isNot(MIToken::exclaim))
1290 return error("expected '!' here");
1291 lex();
1292
1293 if (Token.is(MIToken::StringConstant)) {
1294 std::string Str;
1295 if (parseStringConstant(Str))
1296 return true;
1297 MD = MDString::get(MF.getFunction().getContext(), Str);
1298 return false;
1299 }
1300
1301 if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
1302 return error("expected metadata id after '!'");
1303
1304 SMLoc Loc = mapSMLoc(Token.location());
1305
1306 unsigned ID = 0;
1307 if (getUnsigned(ID))
1308 return true;
1309 lex();
1310
1311 auto NodeInfo = PFS.IRSlots.MetadataNodes.find(ID);
1312 if (NodeInfo != PFS.IRSlots.MetadataNodes.end()) {
1313 MD = NodeInfo->second.get();
1314 return false;
1315 }
1316 // Check machine metadata.
1317 NodeInfo = PFS.MachineMetadataNodes.find(ID);
1318 if (NodeInfo != PFS.MachineMetadataNodes.end()) {
1319 MD = NodeInfo->second.get();
1320 return false;
1321 }
1322 // Forward reference.
1323 auto &FwdRef = PFS.MachineForwardRefMDNodes[ID];
1324 FwdRef = std::make_pair(
1325 MDTuple::getTemporary(MF.getFunction().getContext(), None), Loc);
1326 PFS.MachineMetadataNodes[ID].reset(FwdRef.first.get());
1327 MD = FwdRef.first.get();
1328
1329 return false;
1330}
1331
1332static const char *printImplicitRegisterFlag(const MachineOperand &MO) {
1333 assert(MO.isImplicit())(static_cast <bool> (MO.isImplicit()) ? void (0) : __assert_fail
("MO.isImplicit()", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 1333, __extension__ __PRETTY_FUNCTION__))
;
1334 return MO.isDef() ? "implicit-def" : "implicit";
1335}
1336
1337static std::string getRegisterName(const TargetRegisterInfo *TRI,
1338 Register Reg) {
1339 assert(Register::isPhysicalRegister(Reg) && "expected phys reg")(static_cast <bool> (Register::isPhysicalRegister(Reg) &&
"expected phys reg") ? void (0) : __assert_fail ("Register::isPhysicalRegister(Reg) && \"expected phys reg\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1339, __extension__
__PRETTY_FUNCTION__))
;
1340 return StringRef(TRI->getName(Reg)).lower();
1341}
1342
1343/// Return true if the parsed machine operands contain a given machine operand.
1344static bool isImplicitOperandIn(const MachineOperand &ImplicitOperand,
1345 ArrayRef<ParsedMachineOperand> Operands) {
1346 for (const auto &I : Operands) {
1347 if (ImplicitOperand.isIdenticalTo(I.Operand))
1348 return true;
1349 }
1350 return false;
1351}
1352
1353bool MIParser::verifyImplicitOperands(ArrayRef<ParsedMachineOperand> Operands,
1354 const MCInstrDesc &MCID) {
1355 if (MCID.isCall())
1356 // We can't verify call instructions as they can contain arbitrary implicit
1357 // register and register mask operands.
1358 return false;
1359
1360 // Gather all the expected implicit operands.
1361 SmallVector<MachineOperand, 4> ImplicitOperands;
1362 if (MCID.ImplicitDefs)
1363 for (const MCPhysReg *ImpDefs = MCID.getImplicitDefs(); *ImpDefs; ++ImpDefs)
1364 ImplicitOperands.push_back(
1365 MachineOperand::CreateReg(*ImpDefs, true, true));
1366 if (MCID.ImplicitUses)
1367 for (const MCPhysReg *ImpUses = MCID.getImplicitUses(); *ImpUses; ++ImpUses)
1368 ImplicitOperands.push_back(
1369 MachineOperand::CreateReg(*ImpUses, false, true));
1370
1371 const auto *TRI = MF.getSubtarget().getRegisterInfo();
1372 assert(TRI && "Expected target register info")(static_cast <bool> (TRI && "Expected target register info"
) ? void (0) : __assert_fail ("TRI && \"Expected target register info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1372, __extension__
__PRETTY_FUNCTION__))
;
1373 for (const auto &I : ImplicitOperands) {
1374 if (isImplicitOperandIn(I, Operands))
1375 continue;
1376 return error(Operands.empty() ? Token.location() : Operands.back().End,
1377 Twine("missing implicit register operand '") +
1378 printImplicitRegisterFlag(I) + " $" +
1379 getRegisterName(TRI, I.getReg()) + "'");
1380 }
1381 return false;
1382}
1383
1384bool MIParser::parseInstruction(unsigned &OpCode, unsigned &Flags) {
1385 // Allow frame and fast math flags for OPCODE
1386 while (Token.is(MIToken::kw_frame_setup) ||
1387 Token.is(MIToken::kw_frame_destroy) ||
1388 Token.is(MIToken::kw_nnan) ||
1389 Token.is(MIToken::kw_ninf) ||
1390 Token.is(MIToken::kw_nsz) ||
1391 Token.is(MIToken::kw_arcp) ||
1392 Token.is(MIToken::kw_contract) ||
1393 Token.is(MIToken::kw_afn) ||
1394 Token.is(MIToken::kw_reassoc) ||
1395 Token.is(MIToken::kw_nuw) ||
1396 Token.is(MIToken::kw_nsw) ||
1397 Token.is(MIToken::kw_exact) ||
1398 Token.is(MIToken::kw_nofpexcept)) {
1399 // Mine frame and fast math flags
1400 if (Token.is(MIToken::kw_frame_setup))
1401 Flags |= MachineInstr::FrameSetup;
1402 if (Token.is(MIToken::kw_frame_destroy))
1403 Flags |= MachineInstr::FrameDestroy;
1404 if (Token.is(MIToken::kw_nnan))
1405 Flags |= MachineInstr::FmNoNans;
1406 if (Token.is(MIToken::kw_ninf))
1407 Flags |= MachineInstr::FmNoInfs;
1408 if (Token.is(MIToken::kw_nsz))
1409 Flags |= MachineInstr::FmNsz;
1410 if (Token.is(MIToken::kw_arcp))
1411 Flags |= MachineInstr::FmArcp;
1412 if (Token.is(MIToken::kw_contract))
1413 Flags |= MachineInstr::FmContract;
1414 if (Token.is(MIToken::kw_afn))
1415 Flags |= MachineInstr::FmAfn;
1416 if (Token.is(MIToken::kw_reassoc))
1417 Flags |= MachineInstr::FmReassoc;
1418 if (Token.is(MIToken::kw_nuw))
1419 Flags |= MachineInstr::NoUWrap;
1420 if (Token.is(MIToken::kw_nsw))
1421 Flags |= MachineInstr::NoSWrap;
1422 if (Token.is(MIToken::kw_exact))
1423 Flags |= MachineInstr::IsExact;
1424 if (Token.is(MIToken::kw_nofpexcept))
1425 Flags |= MachineInstr::NoFPExcept;
1426
1427 lex();
1428 }
1429 if (Token.isNot(MIToken::Identifier))
1430 return error("expected a machine instruction");
1431 StringRef InstrName = Token.stringValue();
1432 if (PFS.Target.parseInstrName(InstrName, OpCode))
1433 return error(Twine("unknown machine instruction name '") + InstrName + "'");
1434 lex();
1435 return false;
1436}
1437
1438bool MIParser::parseNamedRegister(Register &Reg) {
1439 assert(Token.is(MIToken::NamedRegister) && "Needs NamedRegister token")(static_cast <bool> (Token.is(MIToken::NamedRegister) &&
"Needs NamedRegister token") ? void (0) : __assert_fail ("Token.is(MIToken::NamedRegister) && \"Needs NamedRegister token\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1439, __extension__
__PRETTY_FUNCTION__))
;
1440 StringRef Name = Token.stringValue();
1441 if (PFS.Target.getRegisterByName(Name, Reg))
1442 return error(Twine("unknown register name '") + Name + "'");
1443 return false;
1444}
1445
1446bool MIParser::parseNamedVirtualRegister(VRegInfo *&Info) {
1447 assert(Token.is(MIToken::NamedVirtualRegister) && "Expected NamedVReg token")(static_cast <bool> (Token.is(MIToken::NamedVirtualRegister
) && "Expected NamedVReg token") ? void (0) : __assert_fail
("Token.is(MIToken::NamedVirtualRegister) && \"Expected NamedVReg token\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1447, __extension__
__PRETTY_FUNCTION__))
;
1448 StringRef Name = Token.stringValue();
1449 // TODO: Check that the VReg name is not the same as a physical register name.
1450 // If it is, then print a warning (when warnings are implemented).
1451 Info = &PFS.getVRegInfoNamed(Name);
1452 return false;
1453}
1454
1455bool MIParser::parseVirtualRegister(VRegInfo *&Info) {
1456 if (Token.is(MIToken::NamedVirtualRegister))
1457 return parseNamedVirtualRegister(Info);
1458 assert(Token.is(MIToken::VirtualRegister) && "Needs VirtualRegister token")(static_cast <bool> (Token.is(MIToken::VirtualRegister)
&& "Needs VirtualRegister token") ? void (0) : __assert_fail
("Token.is(MIToken::VirtualRegister) && \"Needs VirtualRegister token\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1458, __extension__
__PRETTY_FUNCTION__))
;
1459 unsigned ID;
1460 if (getUnsigned(ID))
1461 return true;
1462 Info = &PFS.getVRegInfo(ID);
1463 return false;
1464}
1465
1466bool MIParser::parseRegister(Register &Reg, VRegInfo *&Info) {
1467 switch (Token.kind()) {
1468 case MIToken::underscore:
1469 Reg = 0;
1470 return false;
1471 case MIToken::NamedRegister:
1472 return parseNamedRegister(Reg);
1473 case MIToken::NamedVirtualRegister:
1474 case MIToken::VirtualRegister:
1475 if (parseVirtualRegister(Info))
1476 return true;
1477 Reg = Info->VReg;
1478 return false;
1479 // TODO: Parse other register kinds.
1480 default:
1481 llvm_unreachable("The current token should be a register")::llvm::llvm_unreachable_internal("The current token should be a register"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1481)
;
1482 }
1483}
1484
1485bool MIParser::parseRegisterClassOrBank(VRegInfo &RegInfo) {
1486 if (Token.isNot(MIToken::Identifier) && Token.isNot(MIToken::underscore))
1487 return error("expected '_', register class, or register bank name");
1488 StringRef::iterator Loc = Token.location();
1489 StringRef Name = Token.stringValue();
1490
1491 // Was it a register class?
1492 const TargetRegisterClass *RC = PFS.Target.getRegClass(Name);
1493 if (RC) {
1494 lex();
1495
1496 switch (RegInfo.Kind) {
1497 case VRegInfo::UNKNOWN:
1498 case VRegInfo::NORMAL:
1499 RegInfo.Kind = VRegInfo::NORMAL;
1500 if (RegInfo.Explicit && RegInfo.D.RC != RC) {
1501 const TargetRegisterInfo &TRI = *MF.getSubtarget().getRegisterInfo();
1502 return error(Loc, Twine("conflicting register classes, previously: ") +
1503 Twine(TRI.getRegClassName(RegInfo.D.RC)));
1504 }
1505 RegInfo.D.RC = RC;
1506 RegInfo.Explicit = true;
1507 return false;
1508
1509 case VRegInfo::GENERIC:
1510 case VRegInfo::REGBANK:
1511 return error(Loc, "register class specification on generic register");
1512 }
1513 llvm_unreachable("Unexpected register kind")::llvm::llvm_unreachable_internal("Unexpected register kind",
"llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1513)
;
1514 }
1515
1516 // Should be a register bank or a generic register.
1517 const RegisterBank *RegBank = nullptr;
1518 if (Name != "_") {
1519 RegBank = PFS.Target.getRegBank(Name);
1520 if (!RegBank)
1521 return error(Loc, "expected '_', register class, or register bank name");
1522 }
1523
1524 lex();
1525
1526 switch (RegInfo.Kind) {
1527 case VRegInfo::UNKNOWN:
1528 case VRegInfo::GENERIC:
1529 case VRegInfo::REGBANK:
1530 RegInfo.Kind = RegBank ? VRegInfo::REGBANK : VRegInfo::GENERIC;
1531 if (RegInfo.Explicit && RegInfo.D.RegBank != RegBank)
1532 return error(Loc, "conflicting generic register banks");
1533 RegInfo.D.RegBank = RegBank;
1534 RegInfo.Explicit = true;
1535 return false;
1536
1537 case VRegInfo::NORMAL:
1538 return error(Loc, "register bank specification on normal register");
1539 }
1540 llvm_unreachable("Unexpected register kind")::llvm::llvm_unreachable_internal("Unexpected register kind",
"llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1540)
;
1541}
1542
1543bool MIParser::parseRegisterFlag(unsigned &Flags) {
1544 const unsigned OldFlags = Flags;
1545 switch (Token.kind()) {
1546 case MIToken::kw_implicit:
1547 Flags |= RegState::Implicit;
1548 break;
1549 case MIToken::kw_implicit_define:
1550 Flags |= RegState::ImplicitDefine;
1551 break;
1552 case MIToken::kw_def:
1553 Flags |= RegState::Define;
1554 break;
1555 case MIToken::kw_dead:
1556 Flags |= RegState::Dead;
1557 break;
1558 case MIToken::kw_killed:
1559 Flags |= RegState::Kill;
1560 break;
1561 case MIToken::kw_undef:
1562 Flags |= RegState::Undef;
1563 break;
1564 case MIToken::kw_internal:
1565 Flags |= RegState::InternalRead;
1566 break;
1567 case MIToken::kw_early_clobber:
1568 Flags |= RegState::EarlyClobber;
1569 break;
1570 case MIToken::kw_debug_use:
1571 Flags |= RegState::Debug;
1572 break;
1573 case MIToken::kw_renamable:
1574 Flags |= RegState::Renamable;
1575 break;
1576 default:
1577 llvm_unreachable("The current token should be a register flag")::llvm::llvm_unreachable_internal("The current token should be a register flag"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1577)
;
1578 }
1579 if (OldFlags == Flags)
1580 // We know that the same flag is specified more than once when the flags
1581 // weren't modified.
1582 return error("duplicate '" + Token.stringValue() + "' register flag");
1583 lex();
1584 return false;
1585}
1586
1587bool MIParser::parseSubRegisterIndex(unsigned &SubReg) {
1588 assert(Token.is(MIToken::dot))(static_cast <bool> (Token.is(MIToken::dot)) ? void (0)
: __assert_fail ("Token.is(MIToken::dot)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 1588, __extension__ __PRETTY_FUNCTION__))
;
1589 lex();
1590 if (Token.isNot(MIToken::Identifier))
1591 return error("expected a subregister index after '.'");
1592 auto Name = Token.stringValue();
1593 SubReg = PFS.Target.getSubRegIndex(Name);
1594 if (!SubReg)
1595 return error(Twine("use of unknown subregister index '") + Name + "'");
1596 lex();
1597 return false;
1598}
1599
1600bool MIParser::parseRegisterTiedDefIndex(unsigned &TiedDefIdx) {
1601 if (!consumeIfPresent(MIToken::kw_tied_def))
1602 return true;
1603 if (Token.isNot(MIToken::IntegerLiteral))
1604 return error("expected an integer literal after 'tied-def'");
1605 if (getUnsigned(TiedDefIdx))
1606 return true;
1607 lex();
1608 if (expectAndConsume(MIToken::rparen))
1609 return true;
1610 return false;
1611}
1612
1613bool MIParser::assignRegisterTies(MachineInstr &MI,
1614 ArrayRef<ParsedMachineOperand> Operands) {
1615 SmallVector<std::pair<unsigned, unsigned>, 4> TiedRegisterPairs;
1616 for (unsigned I = 0, E = Operands.size(); I != E; ++I) {
1617 if (!Operands[I].TiedDefIdx)
1618 continue;
1619 // The parser ensures that this operand is a register use, so we just have
1620 // to check the tied-def operand.
1621 unsigned DefIdx = Operands[I].TiedDefIdx.getValue();
1622 if (DefIdx >= E)
1623 return error(Operands[I].Begin,
1624 Twine("use of invalid tied-def operand index '" +
1625 Twine(DefIdx) + "'; instruction has only ") +
1626 Twine(E) + " operands");
1627 const auto &DefOperand = Operands[DefIdx].Operand;
1628 if (!DefOperand.isReg() || !DefOperand.isDef())
1629 // FIXME: add note with the def operand.
1630 return error(Operands[I].Begin,
1631 Twine("use of invalid tied-def operand index '") +
1632 Twine(DefIdx) + "'; the operand #" + Twine(DefIdx) +
1633 " isn't a defined register");
1634 // Check that the tied-def operand wasn't tied elsewhere.
1635 for (const auto &TiedPair : TiedRegisterPairs) {
1636 if (TiedPair.first == DefIdx)
1637 return error(Operands[I].Begin,
1638 Twine("the tied-def operand #") + Twine(DefIdx) +
1639 " is already tied with another register operand");
1640 }
1641 TiedRegisterPairs.push_back(std::make_pair(DefIdx, I));
1642 }
1643 // FIXME: Verify that for non INLINEASM instructions, the def and use tied
1644 // indices must be less than tied max.
1645 for (const auto &TiedPair : TiedRegisterPairs)
1646 MI.tieOperands(TiedPair.first, TiedPair.second);
1647 return false;
1648}
1649
1650bool MIParser::parseRegisterOperand(MachineOperand &Dest,
1651 Optional<unsigned> &TiedDefIdx,
1652 bool IsDef) {
1653 unsigned Flags = IsDef ? RegState::Define : 0;
1654 while (Token.isRegisterFlag()) {
1655 if (parseRegisterFlag(Flags))
1656 return true;
1657 }
1658 if (!Token.isRegister())
1659 return error("expected a register after register flags");
1660 Register Reg;
1661 VRegInfo *RegInfo;
1662 if (parseRegister(Reg, RegInfo))
1663 return true;
1664 lex();
1665 unsigned SubReg = 0;
1666 if (Token.is(MIToken::dot)) {
1667 if (parseSubRegisterIndex(SubReg))
1668 return true;
1669 if (!Register::isVirtualRegister(Reg))
1670 return error("subregister index expects a virtual register");
1671 }
1672 if (Token.is(MIToken::colon)) {
1673 if (!Register::isVirtualRegister(Reg))
1674 return error("register class specification expects a virtual register");
1675 lex();
1676 if (parseRegisterClassOrBank(*RegInfo))
1677 return true;
1678 }
1679 MachineRegisterInfo &MRI = MF.getRegInfo();
1680 if ((Flags & RegState::Define) == 0) {
1681 if (consumeIfPresent(MIToken::lparen)) {
1682 unsigned Idx;
1683 if (!parseRegisterTiedDefIndex(Idx))
1684 TiedDefIdx = Idx;
1685 else {
1686 // Try a redundant low-level type.
1687 LLT Ty;
1688 if (parseLowLevelType(Token.location(), Ty))
1689 return error("expected tied-def or low-level type after '('");
1690
1691 if (expectAndConsume(MIToken::rparen))
1692 return true;
1693
1694 if (MRI.getType(Reg).isValid() && MRI.getType(Reg) != Ty)
1695 return error("inconsistent type for generic virtual register");
1696
1697 MRI.setRegClassOrRegBank(Reg, static_cast<RegisterBank *>(nullptr));
1698 MRI.setType(Reg, Ty);
1699 }
1700 }
1701 } else if (consumeIfPresent(MIToken::lparen)) {
1702 // Virtual registers may have a tpe with GlobalISel.
1703 if (!Register::isVirtualRegister(Reg))
1704 return error("unexpected type on physical register");
1705
1706 LLT Ty;
1707 if (parseLowLevelType(Token.location(), Ty))
1708 return true;
1709
1710 if (expectAndConsume(MIToken::rparen))
1711 return true;
1712
1713 if (MRI.getType(Reg).isValid() && MRI.getType(Reg) != Ty)
1714 return error("inconsistent type for generic virtual register");
1715
1716 MRI.setRegClassOrRegBank(Reg, static_cast<RegisterBank *>(nullptr));
1717 MRI.setType(Reg, Ty);
1718 } else if (Register::isVirtualRegister(Reg)) {
1719 // Generic virtual registers must have a type.
1720 // If we end up here this means the type hasn't been specified and
1721 // this is bad!
1722 if (RegInfo->Kind == VRegInfo::GENERIC ||
1723 RegInfo->Kind == VRegInfo::REGBANK)
1724 return error("generic virtual registers must have a type");
1725 }
1726
1727 if (Flags & RegState::Define) {
1728 if (Flags & RegState::Kill)
1729 return error("cannot have a killed def operand");
1730 } else {
1731 if (Flags & RegState::Dead)
1732 return error("cannot have a dead use operand");
1733 }
1734
1735 Dest = MachineOperand::CreateReg(
1736 Reg, Flags & RegState::Define, Flags & RegState::Implicit,
1737 Flags & RegState::Kill, Flags & RegState::Dead, Flags & RegState::Undef,
1738 Flags & RegState::EarlyClobber, SubReg, Flags & RegState::Debug,
1739 Flags & RegState::InternalRead, Flags & RegState::Renamable);
1740
1741 return false;
1742}
1743
1744bool MIParser::parseImmediateOperand(MachineOperand &Dest) {
1745 assert(Token.is(MIToken::IntegerLiteral))(static_cast <bool> (Token.is(MIToken::IntegerLiteral))
? void (0) : __assert_fail ("Token.is(MIToken::IntegerLiteral)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1745, __extension__
__PRETTY_FUNCTION__))
;
1746 const APSInt &Int = Token.integerValue();
1747 if (Int.getMinSignedBits() > 64)
1748 return error("integer literal is too large to be an immediate operand");
1749 Dest = MachineOperand::CreateImm(Int.getExtValue());
1750 lex();
1751 return false;
1752}
1753
1754bool MIParser::parseTargetImmMnemonic(const unsigned OpCode,
1755 const unsigned OpIdx,
1756 MachineOperand &Dest,
1757 const MIRFormatter &MF) {
1758 assert(Token.is(MIToken::dot))(static_cast <bool> (Token.is(MIToken::dot)) ? void (0)
: __assert_fail ("Token.is(MIToken::dot)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 1758, __extension__ __PRETTY_FUNCTION__))
;
1759 auto Loc = Token.location(); // record start position
1760 size_t Len = 1; // for "."
1761 lex();
1762
1763 // Handle the case that mnemonic starts with number.
1764 if (Token.is(MIToken::IntegerLiteral)) {
1765 Len += Token.range().size();
1766 lex();
1767 }
1768
1769 StringRef Src;
1770 if (Token.is(MIToken::comma))
1771 Src = StringRef(Loc, Len);
1772 else {
1773 assert(Token.is(MIToken::Identifier))(static_cast <bool> (Token.is(MIToken::Identifier)) ? void
(0) : __assert_fail ("Token.is(MIToken::Identifier)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 1773, __extension__ __PRETTY_FUNCTION__))
;
1774 Src = StringRef(Loc, Len + Token.stringValue().size());
1775 }
1776 int64_t Val;
1777 if (MF.parseImmMnemonic(OpCode, OpIdx, Src, Val,
1778 [this](StringRef::iterator Loc, const Twine &Msg)
1779 -> bool { return error(Loc, Msg); }))
1780 return true;
1781
1782 Dest = MachineOperand::CreateImm(Val);
1783 if (!Token.is(MIToken::comma))
1784 lex();
1785 return false;
1786}
1787
1788static bool parseIRConstant(StringRef::iterator Loc, StringRef StringValue,
1789 PerFunctionMIParsingState &PFS, const Constant *&C,
1790 ErrorCallbackType ErrCB) {
1791 auto Source = StringValue.str(); // The source has to be null terminated.
1792 SMDiagnostic Err;
1793 C = parseConstantValue(Source, Err, *PFS.MF.getFunction().getParent(),
1794 &PFS.IRSlots);
1795 if (!C)
1796 return ErrCB(Loc + Err.getColumnNo(), Err.getMessage());
1797 return false;
1798}
1799
1800bool MIParser::parseIRConstant(StringRef::iterator Loc, StringRef StringValue,
1801 const Constant *&C) {
1802 return ::parseIRConstant(
1803 Loc, StringValue, PFS, C,
1804 [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
1805 return error(Loc, Msg);
1806 });
1807}
1808
1809bool MIParser::parseIRConstant(StringRef::iterator Loc, const Constant *&C) {
1810 if (parseIRConstant(Loc, StringRef(Loc, Token.range().end() - Loc), C))
1811 return true;
1812 lex();
1813 return false;
1814}
1815
1816// See LLT implemntation for bit size limits.
1817static bool verifyScalarSize(uint64_t Size) {
1818 return Size != 0 && isUInt<16>(Size);
1819}
1820
1821static bool verifyVectorElementCount(uint64_t NumElts) {
1822 return NumElts != 0 && isUInt<16>(NumElts);
1823}
1824
1825static bool verifyAddrSpace(uint64_t AddrSpace) {
1826 return isUInt<24>(AddrSpace);
1827}
1828
1829bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
1830 if (Token.range().front() == 's' || Token.range().front() == 'p') {
1831 StringRef SizeStr = Token.range().drop_front();
1832 if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1833 return error("expected integers after 's'/'p' type character");
1834 }
1835
1836 if (Token.range().front() == 's') {
1837 auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
1838 if (!verifyScalarSize(ScalarSize))
1839 return error("invalid size for scalar type");
1840
1841 Ty = LLT::scalar(ScalarSize);
1842 lex();
1843 return false;
1844 } else if (Token.range().front() == 'p') {
1845 const DataLayout &DL = MF.getDataLayout();
1846 uint64_t AS = APSInt(Token.range().drop_front()).getZExtValue();
1847 if (!verifyAddrSpace(AS))
1848 return error("invalid address space number");
1849
1850 Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
1851 lex();
1852 return false;
1853 }
1854
1855 // Now we're looking for a vector.
1856 if (Token.isNot(MIToken::less))
1857 return error(Loc,
1858 "expected sN, pA, <M x sN>, or <M x pA> for GlobalISel type");
1859 lex();
1860
1861 if (Token.isNot(MIToken::IntegerLiteral))
1862 return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1863 uint64_t NumElements = Token.integerValue().getZExtValue();
1864 if (!verifyVectorElementCount(NumElements))
1865 return error("invalid number of vector elements");
1866
1867 lex();
1868
1869 if (Token.isNot(MIToken::Identifier) || Token.stringValue() != "x")
1870 return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1871 lex();
1872
1873 if (Token.range().front() != 's' && Token.range().front() != 'p')
1874 return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1875 StringRef SizeStr = Token.range().drop_front();
1876 if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1877 return error("expected integers after 's'/'p' type character");
1878
1879 if (Token.range().front() == 's') {
1880 auto ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
1881 if (!verifyScalarSize(ScalarSize))
1882 return error("invalid size for scalar type");
1883 Ty = LLT::scalar(ScalarSize);
1884 } else if (Token.range().front() == 'p') {
1885 const DataLayout &DL = MF.getDataLayout();
1886 uint64_t AS = APSInt(Token.range().drop_front()).getZExtValue();
1887 if (!verifyAddrSpace(AS))
1888 return error("invalid address space number");
1889
1890 Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
1891 } else
1892 return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1893 lex();
1894
1895 if (Token.isNot(MIToken::greater))
1896 return error(Loc, "expected <M x sN> or <M x pA> for vector type");
1897 lex();
1898
1899 Ty = LLT::fixed_vector(NumElements, Ty);
1900 return false;
1901}
1902
1903bool MIParser::parseTypedImmediateOperand(MachineOperand &Dest) {
1904 assert(Token.is(MIToken::Identifier))(static_cast <bool> (Token.is(MIToken::Identifier)) ? void
(0) : __assert_fail ("Token.is(MIToken::Identifier)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 1904, __extension__ __PRETTY_FUNCTION__))
;
1905 StringRef TypeStr = Token.range();
1906 if (TypeStr.front() != 'i' && TypeStr.front() != 's' &&
1907 TypeStr.front() != 'p')
1908 return error(
1909 "a typed immediate operand should start with one of 'i', 's', or 'p'");
1910 StringRef SizeStr = Token.range().drop_front();
1911 if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
1912 return error("expected integers after 'i'/'s'/'p' type character");
1913
1914 auto Loc = Token.location();
1915 lex();
1916 if (Token.isNot(MIToken::IntegerLiteral)) {
1917 if (Token.isNot(MIToken::Identifier) ||
1918 !(Token.range() == "true" || Token.range() == "false"))
1919 return error("expected an integer literal");
1920 }
1921 const Constant *C = nullptr;
1922 if (parseIRConstant(Loc, C))
1923 return true;
1924 Dest = MachineOperand::CreateCImm(cast<ConstantInt>(C));
1925 return false;
1926}
1927
1928bool MIParser::parseFPImmediateOperand(MachineOperand &Dest) {
1929 auto Loc = Token.location();
1930 lex();
1931 if (Token.isNot(MIToken::FloatingPointLiteral) &&
1932 Token.isNot(MIToken::HexLiteral))
1933 return error("expected a floating point literal");
1934 const Constant *C = nullptr;
1935 if (parseIRConstant(Loc, C))
1936 return true;
1937 Dest = MachineOperand::CreateFPImm(cast<ConstantFP>(C));
1938 return false;
1939}
1940
1941static bool getHexUint(const MIToken &Token, APInt &Result) {
1942 assert(Token.is(MIToken::HexLiteral))(static_cast <bool> (Token.is(MIToken::HexLiteral)) ? void
(0) : __assert_fail ("Token.is(MIToken::HexLiteral)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 1942, __extension__ __PRETTY_FUNCTION__))
;
1943 StringRef S = Token.range();
1944 assert(S[0] == '0' && tolower(S[1]) == 'x')(static_cast <bool> (S[0] == '0' && tolower(S[1
]) == 'x') ? void (0) : __assert_fail ("S[0] == '0' && tolower(S[1]) == 'x'"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1944, __extension__
__PRETTY_FUNCTION__))
;
1945 // This could be a floating point literal with a special prefix.
1946 if (!isxdigit(S[2]))
1947 return true;
1948 StringRef V = S.substr(2);
1949 APInt A(V.size()*4, V, 16);
1950
1951 // If A is 0, then A.getActiveBits() is 0. This isn't a valid bitwidth. Make
1952 // sure it isn't the case before constructing result.
1953 unsigned NumBits = (A == 0) ? 32 : A.getActiveBits();
1954 Result = APInt(NumBits, ArrayRef<uint64_t>(A.getRawData(), A.getNumWords()));
1955 return false;
1956}
1957
1958static bool getUnsigned(const MIToken &Token, unsigned &Result,
1959 ErrorCallbackType ErrCB) {
1960 if (Token.hasIntegerValue()) {
7
Taking true branch
1961 const uint64_t Limit = uint64_t(std::numeric_limits<unsigned>::max()) + 1;
1962 uint64_t Val64 = Token.integerValue().getLimitedValue(Limit);
1963 if (Val64
7.1
'Val64' is equal to 'Limit'
== Limit)
8
Taking true branch
1964 return ErrCB(Token.location(), "expected 32-bit integer (too large)");
9
Returning without writing to 'Result'
1965 Result = Val64;
1966 return false;
1967 }
1968 if (Token.is(MIToken::HexLiteral)) {
1969 APInt A;
1970 if (getHexUint(Token, A))
1971 return true;
1972 if (A.getBitWidth() > 32)
1973 return ErrCB(Token.location(), "expected 32-bit integer (too large)");
1974 Result = A.getZExtValue();
1975 return false;
1976 }
1977 return true;
1978}
1979
1980bool MIParser::getUnsigned(unsigned &Result) {
1981 return ::getUnsigned(
1982 Token, Result, [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
1983 return error(Loc, Msg);
1984 });
1985}
1986
1987bool MIParser::parseMBBReference(MachineBasicBlock *&MBB) {
1988 assert(Token.is(MIToken::MachineBasicBlock) ||(static_cast <bool> (Token.is(MIToken::MachineBasicBlock
) || Token.is(MIToken::MachineBasicBlockLabel)) ? void (0) : __assert_fail
("Token.is(MIToken::MachineBasicBlock) || Token.is(MIToken::MachineBasicBlockLabel)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1989, __extension__
__PRETTY_FUNCTION__))
1989 Token.is(MIToken::MachineBasicBlockLabel))(static_cast <bool> (Token.is(MIToken::MachineBasicBlock
) || Token.is(MIToken::MachineBasicBlockLabel)) ? void (0) : __assert_fail
("Token.is(MIToken::MachineBasicBlock) || Token.is(MIToken::MachineBasicBlockLabel)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 1989, __extension__
__PRETTY_FUNCTION__))
;
1990 unsigned Number;
1991 if (getUnsigned(Number))
1992 return true;
1993 auto MBBInfo = PFS.MBBSlots.find(Number);
1994 if (MBBInfo == PFS.MBBSlots.end())
1995 return error(Twine("use of undefined machine basic block #") +
1996 Twine(Number));
1997 MBB = MBBInfo->second;
1998 // TODO: Only parse the name if it's a MachineBasicBlockLabel. Deprecate once
1999 // we drop the <irname> from the bb.<id>.<irname> format.
2000 if (!Token.stringValue().empty() && Token.stringValue() != MBB->getName())
2001 return error(Twine("the name of machine basic block #") + Twine(Number) +
2002 " isn't '" + Token.stringValue() + "'");
2003 return false;
2004}
2005
2006bool MIParser::parseMBBOperand(MachineOperand &Dest) {
2007 MachineBasicBlock *MBB;
2008 if (parseMBBReference(MBB))
2009 return true;
2010 Dest = MachineOperand::CreateMBB(MBB);
2011 lex();
2012 return false;
2013}
2014
2015bool MIParser::parseStackFrameIndex(int &FI) {
2016 assert(Token.is(MIToken::StackObject))(static_cast <bool> (Token.is(MIToken::StackObject)) ? void
(0) : __assert_fail ("Token.is(MIToken::StackObject)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 2016, __extension__ __PRETTY_FUNCTION__))
;
2017 unsigned ID;
2018 if (getUnsigned(ID))
2019 return true;
2020 auto ObjectInfo = PFS.StackObjectSlots.find(ID);
2021 if (ObjectInfo == PFS.StackObjectSlots.end())
2022 return error(Twine("use of undefined stack object '%stack.") + Twine(ID) +
2023 "'");
2024 StringRef Name;
2025 if (const auto *Alloca =
2026 MF.getFrameInfo().getObjectAllocation(ObjectInfo->second))
2027 Name = Alloca->getName();
2028 if (!Token.stringValue().empty() && Token.stringValue() != Name)
2029 return error(Twine("the name of the stack object '%stack.") + Twine(ID) +
2030 "' isn't '" + Token.stringValue() + "'");
2031 lex();
2032 FI = ObjectInfo->second;
2033 return false;
2034}
2035
2036bool MIParser::parseStackObjectOperand(MachineOperand &Dest) {
2037 int FI;
2038 if (parseStackFrameIndex(FI))
2039 return true;
2040 Dest = MachineOperand::CreateFI(FI);
2041 return false;
2042}
2043
2044bool MIParser::parseFixedStackFrameIndex(int &FI) {
2045 assert(Token.is(MIToken::FixedStackObject))(static_cast <bool> (Token.is(MIToken::FixedStackObject
)) ? void (0) : __assert_fail ("Token.is(MIToken::FixedStackObject)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2045, __extension__
__PRETTY_FUNCTION__))
;
2046 unsigned ID;
2047 if (getUnsigned(ID))
2048 return true;
2049 auto ObjectInfo = PFS.FixedStackObjectSlots.find(ID);
2050 if (ObjectInfo == PFS.FixedStackObjectSlots.end())
2051 return error(Twine("use of undefined fixed stack object '%fixed-stack.") +
2052 Twine(ID) + "'");
2053 lex();
2054 FI = ObjectInfo->second;
2055 return false;
2056}
2057
2058bool MIParser::parseFixedStackObjectOperand(MachineOperand &Dest) {
2059 int FI;
2060 if (parseFixedStackFrameIndex(FI))
2061 return true;
2062 Dest = MachineOperand::CreateFI(FI);
2063 return false;
2064}
2065
2066static bool parseGlobalValue(const MIToken &Token,
2067 PerFunctionMIParsingState &PFS, GlobalValue *&GV,
2068 ErrorCallbackType ErrCB) {
2069 switch (Token.kind()) {
4
Control jumps to 'case GlobalValue:' at line 2078
2070 case MIToken::NamedGlobalValue: {
2071 const Module *M = PFS.MF.getFunction().getParent();
2072 GV = M->getNamedValue(Token.stringValue());
2073 if (!GV)
2074 return ErrCB(Token.location(), Twine("use of undefined global value '") +
2075 Token.range() + "'");
2076 break;
2077 }
2078 case MIToken::GlobalValue: {
2079 unsigned GVIdx;
5
'GVIdx' declared without an initial value
2080 if (getUnsigned(Token, GVIdx, ErrCB))
6
Calling 'getUnsigned'
10
Returning from 'getUnsigned'
11
Assuming the condition is false
12
Taking false branch
2081 return true;
2082 if (GVIdx >= PFS.IRSlots.GlobalValues.size())
13
The left operand of '>=' is a garbage value
2083 return ErrCB(Token.location(), Twine("use of undefined global value '@") +
2084 Twine(GVIdx) + "'");
2085 GV = PFS.IRSlots.GlobalValues[GVIdx];
2086 break;
2087 }
2088 default:
2089 llvm_unreachable("The current token should be a global value")::llvm::llvm_unreachable_internal("The current token should be a global value"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2089)
;
2090 }
2091 return false;
2092}
2093
2094bool MIParser::parseGlobalValue(GlobalValue *&GV) {
2095 return ::parseGlobalValue(
2096 Token, PFS, GV,
2097 [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
2098 return error(Loc, Msg);
2099 });
2100}
2101
2102bool MIParser::parseGlobalAddressOperand(MachineOperand &Dest) {
2103 GlobalValue *GV = nullptr;
2104 if (parseGlobalValue(GV))
2105 return true;
2106 lex();
2107 Dest = MachineOperand::CreateGA(GV, /*Offset=*/0);
2108 if (parseOperandsOffset(Dest))
2109 return true;
2110 return false;
2111}
2112
2113bool MIParser::parseConstantPoolIndexOperand(MachineOperand &Dest) {
2114 assert(Token.is(MIToken::ConstantPoolItem))(static_cast <bool> (Token.is(MIToken::ConstantPoolItem
)) ? void (0) : __assert_fail ("Token.is(MIToken::ConstantPoolItem)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2114, __extension__
__PRETTY_FUNCTION__))
;
2115 unsigned ID;
2116 if (getUnsigned(ID))
2117 return true;
2118 auto ConstantInfo = PFS.ConstantPoolSlots.find(ID);
2119 if (ConstantInfo == PFS.ConstantPoolSlots.end())
2120 return error("use of undefined constant '%const." + Twine(ID) + "'");
2121 lex();
2122 Dest = MachineOperand::CreateCPI(ID, /*Offset=*/0);
2123 if (parseOperandsOffset(Dest))
2124 return true;
2125 return false;
2126}
2127
2128bool MIParser::parseJumpTableIndexOperand(MachineOperand &Dest) {
2129 assert(Token.is(MIToken::JumpTableIndex))(static_cast <bool> (Token.is(MIToken::JumpTableIndex))
? void (0) : __assert_fail ("Token.is(MIToken::JumpTableIndex)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2129, __extension__
__PRETTY_FUNCTION__))
;
2130 unsigned ID;
2131 if (getUnsigned(ID))
2132 return true;
2133 auto JumpTableEntryInfo = PFS.JumpTableSlots.find(ID);
2134 if (JumpTableEntryInfo == PFS.JumpTableSlots.end())
2135 return error("use of undefined jump table '%jump-table." + Twine(ID) + "'");
2136 lex();
2137 Dest = MachineOperand::CreateJTI(JumpTableEntryInfo->second);
2138 return false;
2139}
2140
2141bool MIParser::parseExternalSymbolOperand(MachineOperand &Dest) {
2142 assert(Token.is(MIToken::ExternalSymbol))(static_cast <bool> (Token.is(MIToken::ExternalSymbol))
? void (0) : __assert_fail ("Token.is(MIToken::ExternalSymbol)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2142, __extension__
__PRETTY_FUNCTION__))
;
2143 const char *Symbol = MF.createExternalSymbolName(Token.stringValue());
2144 lex();
2145 Dest = MachineOperand::CreateES(Symbol);
2146 if (parseOperandsOffset(Dest))
2147 return true;
2148 return false;
2149}
2150
2151bool MIParser::parseMCSymbolOperand(MachineOperand &Dest) {
2152 assert(Token.is(MIToken::MCSymbol))(static_cast <bool> (Token.is(MIToken::MCSymbol)) ? void
(0) : __assert_fail ("Token.is(MIToken::MCSymbol)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 2152, __extension__ __PRETTY_FUNCTION__))
;
2153 MCSymbol *Symbol = getOrCreateMCSymbol(Token.stringValue());
2154 lex();
2155 Dest = MachineOperand::CreateMCSymbol(Symbol);
2156 if (parseOperandsOffset(Dest))
2157 return true;
2158 return false;
2159}
2160
2161bool MIParser::parseSubRegisterIndexOperand(MachineOperand &Dest) {
2162 assert(Token.is(MIToken::SubRegisterIndex))(static_cast <bool> (Token.is(MIToken::SubRegisterIndex
)) ? void (0) : __assert_fail ("Token.is(MIToken::SubRegisterIndex)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2162, __extension__
__PRETTY_FUNCTION__))
;
2163 StringRef Name = Token.stringValue();
2164 unsigned SubRegIndex = PFS.Target.getSubRegIndex(Token.stringValue());
2165 if (SubRegIndex == 0)
2166 return error(Twine("unknown subregister index '") + Name + "'");
2167 lex();
2168 Dest = MachineOperand::CreateImm(SubRegIndex);
2169 return false;
2170}
2171
2172bool MIParser::parseMDNode(MDNode *&Node) {
2173 assert(Token.is(MIToken::exclaim))(static_cast <bool> (Token.is(MIToken::exclaim)) ? void
(0) : __assert_fail ("Token.is(MIToken::exclaim)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 2173, __extension__ __PRETTY_FUNCTION__))
;
2174
2175 auto Loc = Token.location();
2176 lex();
2177 if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
2178 return error("expected metadata id after '!'");
2179 unsigned ID;
2180 if (getUnsigned(ID))
2181 return true;
2182 auto NodeInfo = PFS.IRSlots.MetadataNodes.find(ID);
2183 if (NodeInfo == PFS.IRSlots.MetadataNodes.end()) {
2184 NodeInfo = PFS.MachineMetadataNodes.find(ID);
2185 if (NodeInfo == PFS.MachineMetadataNodes.end())
2186 return error(Loc, "use of undefined metadata '!" + Twine(ID) + "'");
2187 }
2188 lex();
2189 Node = NodeInfo->second.get();
2190 return false;
2191}
2192
2193bool MIParser::parseDIExpression(MDNode *&Expr) {
2194 assert(Token.is(MIToken::md_diexpr))(static_cast <bool> (Token.is(MIToken::md_diexpr)) ? void
(0) : __assert_fail ("Token.is(MIToken::md_diexpr)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 2194, __extension__ __PRETTY_FUNCTION__))
;
2195 lex();
2196
2197 // FIXME: Share this parsing with the IL parser.
2198 SmallVector<uint64_t, 8> Elements;
2199
2200 if (expectAndConsume(MIToken::lparen))
2201 return true;
2202
2203 if (Token.isNot(MIToken::rparen)) {
2204 do {
2205 if (Token.is(MIToken::Identifier)) {
2206 if (unsigned Op = dwarf::getOperationEncoding(Token.stringValue())) {
2207 lex();
2208 Elements.push_back(Op);
2209 continue;
2210 }
2211 if (unsigned Enc = dwarf::getAttributeEncoding(Token.stringValue())) {
2212 lex();
2213 Elements.push_back(Enc);
2214 continue;
2215 }
2216 return error(Twine("invalid DWARF op '") + Token.stringValue() + "'");
2217 }
2218
2219 if (Token.isNot(MIToken::IntegerLiteral) ||
2220 Token.integerValue().isSigned())
2221 return error("expected unsigned integer");
2222
2223 auto &U = Token.integerValue();
2224 if (U.ugt(UINT64_MAX(18446744073709551615UL)))
2225 return error("element too large, limit is " + Twine(UINT64_MAX(18446744073709551615UL)));
2226 Elements.push_back(U.getZExtValue());
2227 lex();
2228
2229 } while (consumeIfPresent(MIToken::comma));
2230 }
2231
2232 if (expectAndConsume(MIToken::rparen))
2233 return true;
2234
2235 Expr = DIExpression::get(MF.getFunction().getContext(), Elements);
2236 return false;
2237}
2238
2239bool MIParser::parseDILocation(MDNode *&Loc) {
2240 assert(Token.is(MIToken::md_dilocation))(static_cast <bool> (Token.is(MIToken::md_dilocation)) ?
void (0) : __assert_fail ("Token.is(MIToken::md_dilocation)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2240, __extension__
__PRETTY_FUNCTION__))
;
2241 lex();
2242
2243 bool HaveLine = false;
2244 unsigned Line = 0;
2245 unsigned Column = 0;
2246 MDNode *Scope = nullptr;
2247 MDNode *InlinedAt = nullptr;
2248 bool ImplicitCode = false;
2249
2250 if (expectAndConsume(MIToken::lparen))
2251 return true;
2252
2253 if (Token.isNot(MIToken::rparen)) {
2254 do {
2255 if (Token.is(MIToken::Identifier)) {
2256 if (Token.stringValue() == "line") {
2257 lex();
2258 if (expectAndConsume(MIToken::colon))
2259 return true;
2260 if (Token.isNot(MIToken::IntegerLiteral) ||
2261 Token.integerValue().isSigned())
2262 return error("expected unsigned integer");
2263 Line = Token.integerValue().getZExtValue();
2264 HaveLine = true;
2265 lex();
2266 continue;
2267 }
2268 if (Token.stringValue() == "column") {
2269 lex();
2270 if (expectAndConsume(MIToken::colon))
2271 return true;
2272 if (Token.isNot(MIToken::IntegerLiteral) ||
2273 Token.integerValue().isSigned())
2274 return error("expected unsigned integer");
2275 Column = Token.integerValue().getZExtValue();
2276 lex();
2277 continue;
2278 }
2279 if (Token.stringValue() == "scope") {
2280 lex();
2281 if (expectAndConsume(MIToken::colon))
2282 return true;
2283 if (parseMDNode(Scope))
2284 return error("expected metadata node");
2285 if (!isa<DIScope>(Scope))
2286 return error("expected DIScope node");
2287 continue;
2288 }
2289 if (Token.stringValue() == "inlinedAt") {
2290 lex();
2291 if (expectAndConsume(MIToken::colon))
2292 return true;
2293 if (Token.is(MIToken::exclaim)) {
2294 if (parseMDNode(InlinedAt))
2295 return true;
2296 } else if (Token.is(MIToken::md_dilocation)) {
2297 if (parseDILocation(InlinedAt))
2298 return true;
2299 } else
2300 return error("expected metadata node");
2301 if (!isa<DILocation>(InlinedAt))
2302 return error("expected DILocation node");
2303 continue;
2304 }
2305 if (Token.stringValue() == "isImplicitCode") {
2306 lex();
2307 if (expectAndConsume(MIToken::colon))
2308 return true;
2309 if (!Token.is(MIToken::Identifier))
2310 return error("expected true/false");
2311 // As far as I can see, we don't have any existing need for parsing
2312 // true/false in MIR yet. Do it ad-hoc until there's something else
2313 // that needs it.
2314 if (Token.stringValue() == "true")
2315 ImplicitCode = true;
2316 else if (Token.stringValue() == "false")
2317 ImplicitCode = false;
2318 else
2319 return error("expected true/false");
2320 lex();
2321 continue;
2322 }
2323 }
2324 return error(Twine("invalid DILocation argument '") +
2325 Token.stringValue() + "'");
2326 } while (consumeIfPresent(MIToken::comma));
2327 }
2328
2329 if (expectAndConsume(MIToken::rparen))
2330 return true;
2331
2332 if (!HaveLine)
2333 return error("DILocation requires line number");
2334 if (!Scope)
2335 return error("DILocation requires a scope");
2336
2337 Loc = DILocation::get(MF.getFunction().getContext(), Line, Column, Scope,
2338 InlinedAt, ImplicitCode);
2339 return false;
2340}
2341
2342bool MIParser::parseMetadataOperand(MachineOperand &Dest) {
2343 MDNode *Node = nullptr;
2344 if (Token.is(MIToken::exclaim)) {
2345 if (parseMDNode(Node))
2346 return true;
2347 } else if (Token.is(MIToken::md_diexpr)) {
2348 if (parseDIExpression(Node))
2349 return true;
2350 }
2351 Dest = MachineOperand::CreateMetadata(Node);
2352 return false;
2353}
2354
2355bool MIParser::parseCFIOffset(int &Offset) {
2356 if (Token.isNot(MIToken::IntegerLiteral))
2357 return error("expected a cfi offset");
2358 if (Token.integerValue().getMinSignedBits() > 32)
2359 return error("expected a 32 bit integer (the cfi offset is too large)");
2360 Offset = (int)Token.integerValue().getExtValue();
2361 lex();
2362 return false;
2363}
2364
2365bool MIParser::parseCFIRegister(Register &Reg) {
2366 if (Token.isNot(MIToken::NamedRegister))
2367 return error("expected a cfi register");
2368 Register LLVMReg;
2369 if (parseNamedRegister(LLVMReg))
2370 return true;
2371 const auto *TRI = MF.getSubtarget().getRegisterInfo();
2372 assert(TRI && "Expected target register info")(static_cast <bool> (TRI && "Expected target register info"
) ? void (0) : __assert_fail ("TRI && \"Expected target register info\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2372, __extension__
__PRETTY_FUNCTION__))
;
2373 int DwarfReg = TRI->getDwarfRegNum(LLVMReg, true);
2374 if (DwarfReg < 0)
2375 return error("invalid DWARF register");
2376 Reg = (unsigned)DwarfReg;
2377 lex();
2378 return false;
2379}
2380
2381bool MIParser::parseCFIAddressSpace(unsigned &AddressSpace) {
2382 if (Token.isNot(MIToken::IntegerLiteral))
2383 return error("expected a cfi address space literal");
2384 if (Token.integerValue().isSigned())
2385 return error("expected an unsigned integer (cfi address space)");
2386 AddressSpace = Token.integerValue().getZExtValue();
2387 lex();
2388 return false;
2389}
2390
2391bool MIParser::parseCFIEscapeValues(std::string &Values) {
2392 do {
2393 if (Token.isNot(MIToken::HexLiteral))
2394 return error("expected a hexadecimal literal");
2395 unsigned Value;
2396 if (getUnsigned(Value))
2397 return true;
2398 if (Value > UINT8_MAX(255))
2399 return error("expected a 8-bit integer (too large)");
2400 Values.push_back(static_cast<uint8_t>(Value));
2401 lex();
2402 } while (consumeIfPresent(MIToken::comma));
2403 return false;
2404}
2405
2406bool MIParser::parseCFIOperand(MachineOperand &Dest) {
2407 auto Kind = Token.kind();
2408 lex();
2409 int Offset;
2410 Register Reg;
2411 unsigned AddressSpace;
2412 unsigned CFIIndex;
2413 switch (Kind) {
2414 case MIToken::kw_cfi_same_value:
2415 if (parseCFIRegister(Reg))
2416 return true;
2417 CFIIndex = MF.addFrameInst(MCCFIInstruction::createSameValue(nullptr, Reg));
2418 break;
2419 case MIToken::kw_cfi_offset:
2420 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2421 parseCFIOffset(Offset))
2422 return true;
2423 CFIIndex =
2424 MF.addFrameInst(MCCFIInstruction::createOffset(nullptr, Reg, Offset));
2425 break;
2426 case MIToken::kw_cfi_rel_offset:
2427 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2428 parseCFIOffset(Offset))
2429 return true;
2430 CFIIndex = MF.addFrameInst(
2431 MCCFIInstruction::createRelOffset(nullptr, Reg, Offset));
2432 break;
2433 case MIToken::kw_cfi_def_cfa_register:
2434 if (parseCFIRegister(Reg))
2435 return true;
2436 CFIIndex =
2437 MF.addFrameInst(MCCFIInstruction::createDefCfaRegister(nullptr, Reg));
2438 break;
2439 case MIToken::kw_cfi_def_cfa_offset:
2440 if (parseCFIOffset(Offset))
2441 return true;
2442 CFIIndex =
2443 MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset(nullptr, Offset));
2444 break;
2445 case MIToken::kw_cfi_adjust_cfa_offset:
2446 if (parseCFIOffset(Offset))
2447 return true;
2448 CFIIndex = MF.addFrameInst(
2449 MCCFIInstruction::createAdjustCfaOffset(nullptr, Offset));
2450 break;
2451 case MIToken::kw_cfi_def_cfa:
2452 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2453 parseCFIOffset(Offset))
2454 return true;
2455 CFIIndex =
2456 MF.addFrameInst(MCCFIInstruction::cfiDefCfa(nullptr, Reg, Offset));
2457 break;
2458 case MIToken::kw_cfi_llvm_def_aspace_cfa:
2459 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2460 parseCFIOffset(Offset) || expectAndConsume(MIToken::comma) ||
2461 parseCFIAddressSpace(AddressSpace))
2462 return true;
2463 CFIIndex = MF.addFrameInst(MCCFIInstruction::createLLVMDefAspaceCfa(
2464 nullptr, Reg, Offset, AddressSpace));
2465 break;
2466 case MIToken::kw_cfi_remember_state:
2467 CFIIndex = MF.addFrameInst(MCCFIInstruction::createRememberState(nullptr));
2468 break;
2469 case MIToken::kw_cfi_restore:
2470 if (parseCFIRegister(Reg))
2471 return true;
2472 CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestore(nullptr, Reg));
2473 break;
2474 case MIToken::kw_cfi_restore_state:
2475 CFIIndex = MF.addFrameInst(MCCFIInstruction::createRestoreState(nullptr));
2476 break;
2477 case MIToken::kw_cfi_undefined:
2478 if (parseCFIRegister(Reg))
2479 return true;
2480 CFIIndex = MF.addFrameInst(MCCFIInstruction::createUndefined(nullptr, Reg));
2481 break;
2482 case MIToken::kw_cfi_register: {
2483 Register Reg2;
2484 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
2485 parseCFIRegister(Reg2))
2486 return true;
2487
2488 CFIIndex =
2489 MF.addFrameInst(MCCFIInstruction::createRegister(nullptr, Reg, Reg2));
2490 break;
2491 }
2492 case MIToken::kw_cfi_window_save:
2493 CFIIndex = MF.addFrameInst(MCCFIInstruction::createWindowSave(nullptr));
2494 break;
2495 case MIToken::kw_cfi_aarch64_negate_ra_sign_state:
2496 CFIIndex = MF.addFrameInst(MCCFIInstruction::createNegateRAState(nullptr));
2497 break;
2498 case MIToken::kw_cfi_escape: {
2499 std::string Values;
2500 if (parseCFIEscapeValues(Values))
2501 return true;
2502 CFIIndex = MF.addFrameInst(MCCFIInstruction::createEscape(nullptr, Values));
2503 break;
2504 }
2505 default:
2506 // TODO: Parse the other CFI operands.
2507 llvm_unreachable("The current token should be a cfi operand")::llvm::llvm_unreachable_internal("The current token should be a cfi operand"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2507)
;
2508 }
2509 Dest = MachineOperand::CreateCFIIndex(CFIIndex);
2510 return false;
2511}
2512
2513bool MIParser::parseIRBlock(BasicBlock *&BB, const Function &F) {
2514 switch (Token.kind()) {
2515 case MIToken::NamedIRBlock: {
2516 BB = dyn_cast_or_null<BasicBlock>(
2517 F.getValueSymbolTable()->lookup(Token.stringValue()));
2518 if (!BB)
2519 return error(Twine("use of undefined IR block '") + Token.range() + "'");
2520 break;
2521 }
2522 case MIToken::IRBlock: {
2523 unsigned SlotNumber = 0;
2524 if (getUnsigned(SlotNumber))
2525 return true;
2526 BB = const_cast<BasicBlock *>(getIRBlock(SlotNumber, F));
2527 if (!BB)
2528 return error(Twine("use of undefined IR block '%ir-block.") +
2529 Twine(SlotNumber) + "'");
2530 break;
2531 }
2532 default:
2533 llvm_unreachable("The current token should be an IR block reference")::llvm::llvm_unreachable_internal("The current token should be an IR block reference"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2533)
;
2534 }
2535 return false;
2536}
2537
2538bool MIParser::parseBlockAddressOperand(MachineOperand &Dest) {
2539 assert(Token.is(MIToken::kw_blockaddress))(static_cast <bool> (Token.is(MIToken::kw_blockaddress)
) ? void (0) : __assert_fail ("Token.is(MIToken::kw_blockaddress)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2539, __extension__
__PRETTY_FUNCTION__))
;
2540 lex();
2541 if (expectAndConsume(MIToken::lparen))
2542 return true;
2543 if (Token.isNot(MIToken::GlobalValue) &&
2544 Token.isNot(MIToken::NamedGlobalValue))
2545 return error("expected a global value");
2546 GlobalValue *GV = nullptr;
2547 if (parseGlobalValue(GV))
2548 return true;
2549 auto *F = dyn_cast<Function>(GV);
2550 if (!F)
2551 return error("expected an IR function reference");
2552 lex();
2553 if (expectAndConsume(MIToken::comma))
2554 return true;
2555 BasicBlock *BB = nullptr;
2556 if (Token.isNot(MIToken::IRBlock) && Token.isNot(MIToken::NamedIRBlock))
2557 return error("expected an IR block reference");
2558 if (parseIRBlock(BB, *F))
2559 return true;
2560 lex();
2561 if (expectAndConsume(MIToken::rparen))
2562 return true;
2563 Dest = MachineOperand::CreateBA(BlockAddress::get(F, BB), /*Offset=*/0);
2564 if (parseOperandsOffset(Dest))
2565 return true;
2566 return false;
2567}
2568
2569bool MIParser::parseIntrinsicOperand(MachineOperand &Dest) {
2570 assert(Token.is(MIToken::kw_intrinsic))(static_cast <bool> (Token.is(MIToken::kw_intrinsic)) ?
void (0) : __assert_fail ("Token.is(MIToken::kw_intrinsic)",
"llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2570, __extension__
__PRETTY_FUNCTION__))
;
2571 lex();
2572 if (expectAndConsume(MIToken::lparen))
2573 return error("expected syntax intrinsic(@llvm.whatever)");
2574
2575 if (Token.isNot(MIToken::NamedGlobalValue))
2576 return error("expected syntax intrinsic(@llvm.whatever)");
2577
2578 std::string Name = std::string(Token.stringValue());
2579 lex();
2580
2581 if (expectAndConsume(MIToken::rparen))
2582 return error("expected ')' to terminate intrinsic name");
2583
2584 // Find out what intrinsic we're dealing with, first try the global namespace
2585 // and then the target's private intrinsics if that fails.
2586 const TargetIntrinsicInfo *TII = MF.getTarget().getIntrinsicInfo();
2587 Intrinsic::ID ID = Function::lookupIntrinsicID(Name);
2588 if (ID == Intrinsic::not_intrinsic && TII)
2589 ID = static_cast<Intrinsic::ID>(TII->lookupName(Name));
2590
2591 if (ID == Intrinsic::not_intrinsic)
2592 return error("unknown intrinsic name");
2593 Dest = MachineOperand::CreateIntrinsicID(ID);
2594
2595 return false;
2596}
2597
2598bool MIParser::parsePredicateOperand(MachineOperand &Dest) {
2599 assert(Token.is(MIToken::kw_intpred) || Token.is(MIToken::kw_floatpred))(static_cast <bool> (Token.is(MIToken::kw_intpred) || Token
.is(MIToken::kw_floatpred)) ? void (0) : __assert_fail ("Token.is(MIToken::kw_intpred) || Token.is(MIToken::kw_floatpred)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2599, __extension__
__PRETTY_FUNCTION__))
;
2600 bool IsFloat = Token.is(MIToken::kw_floatpred);
2601 lex();
2602
2603 if (expectAndConsume(MIToken::lparen))
2604 return error("expected syntax intpred(whatever) or floatpred(whatever");
2605
2606 if (Token.isNot(MIToken::Identifier))
2607 return error("whatever");
2608
2609 CmpInst::Predicate Pred;
2610 if (IsFloat) {
2611 Pred = StringSwitch<CmpInst::Predicate>(Token.stringValue())
2612 .Case("false", CmpInst::FCMP_FALSE)
2613 .Case("oeq", CmpInst::FCMP_OEQ)
2614 .Case("ogt", CmpInst::FCMP_OGT)
2615 .Case("oge", CmpInst::FCMP_OGE)
2616 .Case("olt", CmpInst::FCMP_OLT)
2617 .Case("ole", CmpInst::FCMP_OLE)
2618 .Case("one", CmpInst::FCMP_ONE)
2619 .Case("ord", CmpInst::FCMP_ORD)
2620 .Case("uno", CmpInst::FCMP_UNO)
2621 .Case("ueq", CmpInst::FCMP_UEQ)
2622 .Case("ugt", CmpInst::FCMP_UGT)
2623 .Case("uge", CmpInst::FCMP_UGE)
2624 .Case("ult", CmpInst::FCMP_ULT)
2625 .Case("ule", CmpInst::FCMP_ULE)
2626 .Case("une", CmpInst::FCMP_UNE)
2627 .Case("true", CmpInst::FCMP_TRUE)
2628 .Default(CmpInst::BAD_FCMP_PREDICATE);
2629 if (!CmpInst::isFPPredicate(Pred))
2630 return error("invalid floating-point predicate");
2631 } else {
2632 Pred = StringSwitch<CmpInst::Predicate>(Token.stringValue())
2633 .Case("eq", CmpInst::ICMP_EQ)
2634 .Case("ne", CmpInst::ICMP_NE)
2635 .Case("sgt", CmpInst::ICMP_SGT)
2636 .Case("sge", CmpInst::ICMP_SGE)
2637 .Case("slt", CmpInst::ICMP_SLT)
2638 .Case("sle", CmpInst::ICMP_SLE)
2639 .Case("ugt", CmpInst::ICMP_UGT)
2640 .Case("uge", CmpInst::ICMP_UGE)
2641 .Case("ult", CmpInst::ICMP_ULT)
2642 .Case("ule", CmpInst::ICMP_ULE)
2643 .Default(CmpInst::BAD_ICMP_PREDICATE);
2644 if (!CmpInst::isIntPredicate(Pred))
2645 return error("invalid integer predicate");
2646 }
2647
2648 lex();
2649 Dest = MachineOperand::CreatePredicate(Pred);
2650 if (expectAndConsume(MIToken::rparen))
2651 return error("predicate should be terminated by ')'.");
2652
2653 return false;
2654}
2655
2656bool MIParser::parseShuffleMaskOperand(MachineOperand &Dest) {
2657 assert(Token.is(MIToken::kw_shufflemask))(static_cast <bool> (Token.is(MIToken::kw_shufflemask))
? void (0) : __assert_fail ("Token.is(MIToken::kw_shufflemask)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2657, __extension__
__PRETTY_FUNCTION__))
;
2658
2659 lex();
2660 if (expectAndConsume(MIToken::lparen))
2661 return error("expected syntax shufflemask(<integer or undef>, ...)");
2662
2663 SmallVector<int, 32> ShufMask;
2664 do {
2665 if (Token.is(MIToken::kw_undef)) {
2666 ShufMask.push_back(-1);
2667 } else if (Token.is(MIToken::IntegerLiteral)) {
2668 const APSInt &Int = Token.integerValue();
2669 ShufMask.push_back(Int.getExtValue());
2670 } else
2671 return error("expected integer constant");
2672
2673 lex();
2674 } while (consumeIfPresent(MIToken::comma));
2675
2676 if (expectAndConsume(MIToken::rparen))
2677 return error("shufflemask should be terminated by ')'.");
2678
2679 ArrayRef<int> MaskAlloc = MF.allocateShuffleMask(ShufMask);
2680 Dest = MachineOperand::CreateShuffleMask(MaskAlloc);
2681 return false;
2682}
2683
2684bool MIParser::parseTargetIndexOperand(MachineOperand &Dest) {
2685 assert(Token.is(MIToken::kw_target_index))(static_cast <bool> (Token.is(MIToken::kw_target_index)
) ? void (0) : __assert_fail ("Token.is(MIToken::kw_target_index)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2685, __extension__
__PRETTY_FUNCTION__))
;
2686 lex();
2687 if (expectAndConsume(MIToken::lparen))
2688 return true;
2689 if (Token.isNot(MIToken::Identifier))
2690 return error("expected the name of the target index");
2691 int Index = 0;
2692 if (PFS.Target.getTargetIndex(Token.stringValue(), Index))
2693 return error("use of undefined target index '" + Token.stringValue() + "'");
2694 lex();
2695 if (expectAndConsume(MIToken::rparen))
2696 return true;
2697 Dest = MachineOperand::CreateTargetIndex(unsigned(Index), /*Offset=*/0);
2698 if (parseOperandsOffset(Dest))
2699 return true;
2700 return false;
2701}
2702
2703bool MIParser::parseCustomRegisterMaskOperand(MachineOperand &Dest) {
2704 assert(Token.stringValue() == "CustomRegMask" && "Expected a custom RegMask")(static_cast <bool> (Token.stringValue() == "CustomRegMask"
&& "Expected a custom RegMask") ? void (0) : __assert_fail
("Token.stringValue() == \"CustomRegMask\" && \"Expected a custom RegMask\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2704, __extension__
__PRETTY_FUNCTION__))
;
2705 lex();
2706 if (expectAndConsume(MIToken::lparen))
2707 return true;
2708
2709 uint32_t *Mask = MF.allocateRegMask();
2710 while (true) {
2711 if (Token.isNot(MIToken::NamedRegister))
2712 return error("expected a named register");
2713 Register Reg;
2714 if (parseNamedRegister(Reg))
2715 return true;
2716 lex();
2717 Mask[Reg / 32] |= 1U << (Reg % 32);
2718 // TODO: Report an error if the same register is used more than once.
2719 if (Token.isNot(MIToken::comma))
2720 break;
2721 lex();
2722 }
2723
2724 if (expectAndConsume(MIToken::rparen))
2725 return true;
2726 Dest = MachineOperand::CreateRegMask(Mask);
2727 return false;
2728}
2729
2730bool MIParser::parseLiveoutRegisterMaskOperand(MachineOperand &Dest) {
2731 assert(Token.is(MIToken::kw_liveout))(static_cast <bool> (Token.is(MIToken::kw_liveout)) ? void
(0) : __assert_fail ("Token.is(MIToken::kw_liveout)", "llvm/lib/CodeGen/MIRParser/MIParser.cpp"
, 2731, __extension__ __PRETTY_FUNCTION__))
;
2732 uint32_t *Mask = MF.allocateRegMask();
2733 lex();
2734 if (expectAndConsume(MIToken::lparen))
2735 return true;
2736 while (true) {
2737 if (Token.isNot(MIToken::NamedRegister))
2738 return error("expected a named register");
2739 Register Reg;
2740 if (parseNamedRegister(Reg))
2741 return true;
2742 lex();
2743 Mask[Reg / 32] |= 1U << (Reg % 32);
2744 // TODO: Report an error if the same register is used more than once.
2745 if (Token.isNot(MIToken::comma))
2746 break;
2747 lex();
2748 }
2749 if (expectAndConsume(MIToken::rparen))
2750 return true;
2751 Dest = MachineOperand::CreateRegLiveOut(Mask);
2752 return false;
2753}
2754
2755bool MIParser::parseMachineOperand(const unsigned OpCode, const unsigned OpIdx,
2756 MachineOperand &Dest,
2757 Optional<unsigned> &TiedDefIdx) {
2758 switch (Token.kind()) {
2759 case MIToken::kw_implicit:
2760 case MIToken::kw_implicit_define:
2761 case MIToken::kw_def:
2762 case MIToken::kw_dead:
2763 case MIToken::kw_killed:
2764 case MIToken::kw_undef:
2765 case MIToken::kw_internal:
2766 case MIToken::kw_early_clobber:
2767 case MIToken::kw_debug_use:
2768 case MIToken::kw_renamable:
2769 case MIToken::underscore:
2770 case MIToken::NamedRegister:
2771 case MIToken::VirtualRegister:
2772 case MIToken::NamedVirtualRegister:
2773 return parseRegisterOperand(Dest, TiedDefIdx);
2774 case MIToken::IntegerLiteral:
2775 return parseImmediateOperand(Dest);
2776 case MIToken::kw_half:
2777 case MIToken::kw_float:
2778 case MIToken::kw_double:
2779 case MIToken::kw_x86_fp80:
2780 case MIToken::kw_fp128:
2781 case MIToken::kw_ppc_fp128:
2782 return parseFPImmediateOperand(Dest);
2783 case MIToken::MachineBasicBlock:
2784 return parseMBBOperand(Dest);
2785 case MIToken::StackObject:
2786 return parseStackObjectOperand(Dest);
2787 case MIToken::FixedStackObject:
2788 return parseFixedStackObjectOperand(Dest);
2789 case MIToken::GlobalValue:
2790 case MIToken::NamedGlobalValue:
2791 return parseGlobalAddressOperand(Dest);
2792 case MIToken::ConstantPoolItem:
2793 return parseConstantPoolIndexOperand(Dest);
2794 case MIToken::JumpTableIndex:
2795 return parseJumpTableIndexOperand(Dest);
2796 case MIToken::ExternalSymbol:
2797 return parseExternalSymbolOperand(Dest);
2798 case MIToken::MCSymbol:
2799 return parseMCSymbolOperand(Dest);
2800 case MIToken::SubRegisterIndex:
2801 return parseSubRegisterIndexOperand(Dest);
2802 case MIToken::md_diexpr:
2803 case MIToken::exclaim:
2804 return parseMetadataOperand(Dest);
2805 case MIToken::kw_cfi_same_value:
2806 case MIToken::kw_cfi_offset:
2807 case MIToken::kw_cfi_rel_offset:
2808 case MIToken::kw_cfi_def_cfa_register:
2809 case MIToken::kw_cfi_def_cfa_offset:
2810 case MIToken::kw_cfi_adjust_cfa_offset:
2811 case MIToken::kw_cfi_escape:
2812 case MIToken::kw_cfi_def_cfa:
2813 case MIToken::kw_cfi_llvm_def_aspace_cfa:
2814 case MIToken::kw_cfi_register:
2815 case MIToken::kw_cfi_remember_state:
2816 case MIToken::kw_cfi_restore:
2817 case MIToken::kw_cfi_restore_state:
2818 case MIToken::kw_cfi_undefined:
2819 case MIToken::kw_cfi_window_save:
2820 case MIToken::kw_cfi_aarch64_negate_ra_sign_state:
2821 return parseCFIOperand(Dest);
2822 case MIToken::kw_blockaddress:
2823 return parseBlockAddressOperand(Dest);
2824 case MIToken::kw_intrinsic:
2825 return parseIntrinsicOperand(Dest);
2826 case MIToken::kw_target_index:
2827 return parseTargetIndexOperand(Dest);
2828 case MIToken::kw_liveout:
2829 return parseLiveoutRegisterMaskOperand(Dest);
2830 case MIToken::kw_floatpred:
2831 case MIToken::kw_intpred:
2832 return parsePredicateOperand(Dest);
2833 case MIToken::kw_shufflemask:
2834 return parseShuffleMaskOperand(Dest);
2835 case MIToken::Error:
2836 return true;
2837 case MIToken::Identifier:
2838 if (const auto *RegMask = PFS.Target.getRegMask(Token.stringValue())) {
2839 Dest = MachineOperand::CreateRegMask(RegMask);
2840 lex();
2841 break;
2842 } else if (Token.stringValue() == "CustomRegMask") {
2843 return parseCustomRegisterMaskOperand(Dest);
2844 } else
2845 return parseTypedImmediateOperand(Dest);
2846 case MIToken::dot: {
2847 const auto *TII = MF.getSubtarget().getInstrInfo();
2848 if (const auto *Formatter = TII->getMIRFormatter()) {
2849 return parseTargetImmMnemonic(OpCode, OpIdx, Dest, *Formatter);
2850 }
2851 LLVM_FALLTHROUGH[[gnu::fallthrough]];
2852 }
2853 default:
2854 // FIXME: Parse the MCSymbol machine operand.
2855 return error("expected a machine operand");
2856 }
2857 return false;
2858}
2859
2860bool MIParser::parseMachineOperandAndTargetFlags(
2861 const unsigned OpCode, const unsigned OpIdx, MachineOperand &Dest,
2862 Optional<unsigned> &TiedDefIdx) {
2863 unsigned TF = 0;
2864 bool HasTargetFlags = false;
2865 if (Token.is(MIToken::kw_target_flags)) {
2866 HasTargetFlags = true;
2867 lex();
2868 if (expectAndConsume(MIToken::lparen))
2869 return true;
2870 if (Token.isNot(MIToken::Identifier))
2871 return error("expected the name of the target flag");
2872 if (PFS.Target.getDirectTargetFlag(Token.stringValue(), TF)) {
2873 if (PFS.Target.getBitmaskTargetFlag(Token.stringValue(), TF))
2874 return error("use of undefined target flag '" + Token.stringValue() +
2875 "'");
2876 }
2877 lex();
2878 while (Token.is(MIToken::comma)) {
2879 lex();
2880 if (Token.isNot(MIToken::Identifier))
2881 return error("expected the name of the target flag");
2882 unsigned BitFlag = 0;
2883 if (PFS.Target.getBitmaskTargetFlag(Token.stringValue(), BitFlag))
2884 return error("use of undefined target flag '" + Token.stringValue() +
2885 "'");
2886 // TODO: Report an error when using a duplicate bit target flag.
2887 TF |= BitFlag;
2888 lex();
2889 }
2890 if (expectAndConsume(MIToken::rparen))
2891 return true;
2892 }
2893 auto Loc = Token.location();
2894 if (parseMachineOperand(OpCode, OpIdx, Dest, TiedDefIdx))
2895 return true;
2896 if (!HasTargetFlags)
2897 return false;
2898 if (Dest.isReg())
2899 return error(Loc, "register operands can't have target flags");
2900 Dest.setTargetFlags(TF);
2901 return false;
2902}
2903
2904bool MIParser::parseOffset(int64_t &Offset) {
2905 if (Token.isNot(MIToken::plus) && Token.isNot(MIToken::minus))
2906 return false;
2907 StringRef Sign = Token.range();
2908 bool IsNegative = Token.is(MIToken::minus);
2909 lex();
2910 if (Token.isNot(MIToken::IntegerLiteral))
2911 return error("expected an integer literal after '" + Sign + "'");
2912 if (Token.integerValue().getMinSignedBits() > 64)
2913 return error("expected 64-bit integer (too large)");
2914 Offset = Token.integerValue().getExtValue();
2915 if (IsNegative)
2916 Offset = -Offset;
2917 lex();
2918 return false;
2919}
2920
2921bool MIParser::parseAlignment(uint64_t &Alignment) {
2922 assert(Token.is(MIToken::kw_align) || Token.is(MIToken::kw_basealign))(static_cast <bool> (Token.is(MIToken::kw_align) || Token
.is(MIToken::kw_basealign)) ? void (0) : __assert_fail ("Token.is(MIToken::kw_align) || Token.is(MIToken::kw_basealign)"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2922, __extension__
__PRETTY_FUNCTION__))
;
2923 lex();
2924 if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
2925 return error("expected an integer literal after 'align'");
2926 if (getUint64(Alignment))
2927 return true;
2928 lex();
2929
2930 if (!isPowerOf2_64(Alignment))
2931 return error("expected a power-of-2 literal after 'align'");
2932
2933 return false;
2934}
2935
2936bool MIParser::parseAddrspace(unsigned &Addrspace) {
2937 assert(Token.is(MIToken::kw_addrspace))(static_cast <bool> (Token.is(MIToken::kw_addrspace)) ?
void (0) : __assert_fail ("Token.is(MIToken::kw_addrspace)",
"llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2937, __extension__
__PRETTY_FUNCTION__))
;
2938 lex();
2939 if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
2940 return error("expected an integer literal after 'addrspace'");
2941 if (getUnsigned(Addrspace))
2942 return true;
2943 lex();
2944 return false;
2945}
2946
2947bool MIParser::parseOperandsOffset(MachineOperand &Op) {
2948 int64_t Offset = 0;
2949 if (parseOffset(Offset))
2950 return true;
2951 Op.setOffset(Offset);
2952 return false;
2953}
2954
2955static bool parseIRValue(const MIToken &Token, PerFunctionMIParsingState &PFS,
2956 const Value *&V, ErrorCallbackType ErrCB) {
2957 switch (Token.kind()) {
2
Control jumps to 'case GlobalValue:' at line 2970
2958 case MIToken::NamedIRValue: {
2959 V = PFS.MF.getFunction().getValueSymbolTable()->lookup(Token.stringValue());
2960 break;
2961 }
2962 case MIToken::IRValue: {
2963 unsigned SlotNumber = 0;
2964 if (getUnsigned(Token, SlotNumber, ErrCB))
2965 return true;
2966 V = PFS.getIRValue(SlotNumber);
2967 break;
2968 }
2969 case MIToken::NamedGlobalValue:
2970 case MIToken::GlobalValue: {
2971 GlobalValue *GV = nullptr;
2972 if (parseGlobalValue(Token, PFS, GV, ErrCB))
3
Calling 'parseGlobalValue'
2973 return true;
2974 V = GV;
2975 break;
2976 }
2977 case MIToken::QuotedIRValue: {
2978 const Constant *C = nullptr;
2979 if (parseIRConstant(Token.location(), Token.stringValue(), PFS, C, ErrCB))
2980 return true;
2981 V = C;
2982 break;
2983 }
2984 case MIToken::kw_unknown_address:
2985 V = nullptr;
2986 return false;
2987 default:
2988 llvm_unreachable("The current token should be an IR block reference")::llvm::llvm_unreachable_internal("The current token should be an IR block reference"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 2988)
;
2989 }
2990 if (!V)
2991 return ErrCB(Token.location(), Twine("use of undefined IR value '") + Token.range() + "'");
2992 return false;
2993}
2994
2995bool MIParser::parseIRValue(const Value *&V) {
2996 return ::parseIRValue(
2997 Token, PFS, V, [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
2998 return error(Loc, Msg);
2999 });
3000}
3001
3002bool MIParser::getUint64(uint64_t &Result) {
3003 if (Token.hasIntegerValue()) {
3004 if (Token.integerValue().getActiveBits() > 64)
3005 return error("expected 64-bit integer (too large)");
3006 Result = Token.integerValue().getZExtValue();
3007 return false;
3008 }
3009 if (Token.is(MIToken::HexLiteral)) {
3010 APInt A;
3011 if (getHexUint(A))
3012 return true;
3013 if (A.getBitWidth() > 64)
3014 return error("expected 64-bit integer (too large)");
3015 Result = A.getZExtValue();
3016 return false;
3017 }
3018 return true;
3019}
3020
3021bool MIParser::getHexUint(APInt &Result) {
3022 return ::getHexUint(Token, Result);
3023}
3024
3025bool MIParser::parseMemoryOperandFlag(MachineMemOperand::Flags &Flags) {
3026 const auto OldFlags = Flags;
3027 switch (Token.kind()) {
3028 case MIToken::kw_volatile:
3029 Flags |= MachineMemOperand::MOVolatile;
3030 break;
3031 case MIToken::kw_non_temporal:
3032 Flags |= MachineMemOperand::MONonTemporal;
3033 break;
3034 case MIToken::kw_dereferenceable:
3035 Flags |= MachineMemOperand::MODereferenceable;
3036 break;
3037 case MIToken::kw_invariant:
3038 Flags |= MachineMemOperand::MOInvariant;
3039 break;
3040 case MIToken::StringConstant: {
3041 MachineMemOperand::Flags TF;
3042 if (PFS.Target.getMMOTargetFlag(Token.stringValue(), TF))
3043 return error("use of undefined target MMO flag '" + Token.stringValue() +
3044 "'");
3045 Flags |= TF;
3046 break;
3047 }
3048 default:
3049 llvm_unreachable("The current token should be a memory operand flag")::llvm::llvm_unreachable_internal("The current token should be a memory operand flag"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 3049)
;
3050 }
3051 if (OldFlags == Flags)
3052 // We know that the same flag is specified more than once when the flags
3053 // weren't modified.
3054 return error("duplicate '" + Token.stringValue() + "' memory operand flag");
3055 lex();
3056 return false;
3057}
3058
3059bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) {
3060 switch (Token.kind()) {
3061 case MIToken::kw_stack:
3062 PSV = MF.getPSVManager().getStack();
3063 break;
3064 case MIToken::kw_got:
3065 PSV = MF.getPSVManager().getGOT();
3066 break;
3067 case MIToken::kw_jump_table:
3068 PSV = MF.getPSVManager().getJumpTable();
3069 break;
3070 case MIToken::kw_constant_pool:
3071 PSV = MF.getPSVManager().getConstantPool();
3072 break;
3073 case MIToken::FixedStackObject: {
3074 int FI;
3075 if (parseFixedStackFrameIndex(FI))
3076 return true;
3077 PSV = MF.getPSVManager().getFixedStack(FI);
3078 // The token was already consumed, so use return here instead of break.
3079 return false;
3080 }
3081 case MIToken::StackObject: {
3082 int FI;
3083 if (parseStackFrameIndex(FI))
3084 return true;
3085 PSV = MF.getPSVManager().getFixedStack(FI);
3086 // The token was already consumed, so use return here instead of break.
3087 return false;
3088 }
3089 case MIToken::kw_call_entry:
3090 lex();
3091 switch (Token.kind()) {
3092 case MIToken::GlobalValue:
3093 case MIToken::NamedGlobalValue: {
3094 GlobalValue *GV = nullptr;
3095 if (parseGlobalValue(GV))
3096 return true;
3097 PSV = MF.getPSVManager().getGlobalValueCallEntry(GV);
3098 break;
3099 }
3100 case MIToken::ExternalSymbol:
3101 PSV = MF.getPSVManager().getExternalSymbolCallEntry(
3102 MF.createExternalSymbolName(Token.stringValue()));
3103 break;
3104 default:
3105 return error(
3106 "expected a global value or an external symbol after 'call-entry'");
3107 }
3108 break;
3109 case MIToken::kw_custom: {
3110 lex();
3111 const auto *TII = MF.getSubtarget().getInstrInfo();
3112 if (const auto *Formatter = TII->getMIRFormatter()) {
3113 if (Formatter->parseCustomPseudoSourceValue(
3114 Token.stringValue(), MF, PFS, PSV,
3115 [this](StringRef::iterator Loc, const Twine &Msg) -> bool {
3116 return error(Loc, Msg);
3117 }))
3118 return true;
3119 } else
3120 return error("unable to parse target custom pseudo source value");
3121 break;
3122 }
3123 default:
3124 llvm_unreachable("The current token should be pseudo source value")::llvm::llvm_unreachable_internal("The current token should be pseudo source value"
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 3124)
;
3125 }
3126 lex();
3127 return false;
3128}
3129
3130bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) {
3131 if (Token.is(MIToken::kw_constant_pool) || Token.is(MIToken::kw_stack) ||
3132 Token.is(MIToken::kw_got) || Token.is(MIToken::kw_jump_table) ||
3133 Token.is(MIToken::FixedStackObject) || Token.is(MIToken::StackObject) ||
3134 Token.is(MIToken::kw_call_entry) || Token.is(MIToken::kw_custom)) {
3135 const PseudoSourceValue *PSV = nullptr;
3136 if (parseMemoryPseudoSourceValue(PSV))
3137 return true;
3138 int64_t Offset = 0;
3139 if (parseOffset(Offset))
3140 return true;
3141 Dest = MachinePointerInfo(PSV, Offset);
3142 return false;
3143 }
3144 if (Token.isNot(MIToken::NamedIRValue) && Token.isNot(MIToken::IRValue) &&
3145 Token.isNot(MIToken::GlobalValue) &&
3146 Token.isNot(MIToken::NamedGlobalValue) &&
3147 Token.isNot(MIToken::QuotedIRValue) &&
3148 Token.isNot(MIToken::kw_unknown_address))
3149 return error("expected an IR value reference");
3150 const Value *V = nullptr;
3151 if (parseIRValue(V))
3152 return true;
3153 if (V && !V->getType()->isPointerTy())
3154 return error("expected a pointer IR value");
3155 lex();
3156 int64_t Offset = 0;
3157 if (parseOffset(Offset))
3158 return true;
3159 Dest = MachinePointerInfo(V, Offset);
3160 return false;
3161}
3162
3163bool MIParser::parseOptionalScope(LLVMContext &Context,
3164 SyncScope::ID &SSID) {
3165 SSID = SyncScope::System;
3166 if (Token.is(MIToken::Identifier) && Token.stringValue() == "syncscope") {
3167 lex();
3168 if (expectAndConsume(MIToken::lparen))
3169 return error("expected '(' in syncscope");
3170
3171 std::string SSN;
3172 if (parseStringConstant(SSN))
3173 return true;
3174
3175 SSID = Context.getOrInsertSyncScopeID(SSN);
3176 if (expectAndConsume(MIToken::rparen))
3177 return error("expected ')' in syncscope");
3178 }
3179
3180 return false;
3181}
3182
3183bool MIParser::parseOptionalAtomicOrdering(AtomicOrdering &Order) {
3184 Order = AtomicOrdering::NotAtomic;
3185 if (Token.isNot(MIToken::Identifier))
3186 return false;
3187
3188 Order = StringSwitch<AtomicOrdering>(Token.stringValue())
3189 .Case("unordered", AtomicOrdering::Unordered)
3190 .Case("monotonic", AtomicOrdering::Monotonic)
3191 .Case("acquire", AtomicOrdering::Acquire)
3192 .Case("release", AtomicOrdering::Release)
3193 .Case("acq_rel", AtomicOrdering::AcquireRelease)
3194 .Case("seq_cst", AtomicOrdering::SequentiallyConsistent)
3195 .Default(AtomicOrdering::NotAtomic);
3196
3197 if (Order != AtomicOrdering::NotAtomic) {
3198 lex();
3199 return false;
3200 }
3201
3202 return error("expected an atomic scope, ordering or a size specification");
3203}
3204
3205bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
3206 if (expectAndConsume(MIToken::lparen))
3207 return true;
3208 MachineMemOperand::Flags Flags = MachineMemOperand::MONone;
3209 while (Token.isMemoryOperandFlag()) {
3210 if (parseMemoryOperandFlag(Flags))
3211 return true;
3212 }
3213 if (Token.isNot(MIToken::Identifier) ||
3214 (Token.stringValue() != "load" && Token.stringValue() != "store"))
3215 return error("expected 'load' or 'store' memory operation");
3216 if (Token.stringValue() == "load")
3217 Flags |= MachineMemOperand::MOLoad;
3218 else
3219 Flags |= MachineMemOperand::MOStore;
3220 lex();
3221
3222 // Optional 'store' for operands that both load and store.
3223 if (Token.is(MIToken::Identifier) && Token.stringValue() == "store") {
3224 Flags |= MachineMemOperand::MOStore;
3225 lex();
3226 }
3227
3228 // Optional synchronization scope.
3229 SyncScope::ID SSID;
3230 if (parseOptionalScope(MF.getFunction().getContext(), SSID))
3231 return true;
3232
3233 // Up to two atomic orderings (cmpxchg provides guarantees on failure).
3234 AtomicOrdering Order, FailureOrder;
3235 if (parseOptionalAtomicOrdering(Order))
3236 return true;
3237
3238 if (parseOptionalAtomicOrdering(FailureOrder))
3239 return true;
3240
3241 LLT MemoryType;
3242 if (Token.isNot(MIToken::IntegerLiteral) &&
3243 Token.isNot(MIToken::kw_unknown_size) &&
3244 Token.isNot(MIToken::lparen))
3245 return error("expected memory LLT, the size integer literal or 'unknown-size' after "
3246 "memory operation");
3247
3248 uint64_t Size = MemoryLocation::UnknownSize;
3249 if (Token.is(MIToken::IntegerLiteral)) {
3250 if (getUint64(Size))
3251 return true;
3252
3253 // Convert from bytes to bits for storage.
3254 MemoryType = LLT::scalar(8 * Size);
3255 lex();
3256 } else if (Token.is(MIToken::kw_unknown_size)) {
3257 Size = MemoryLocation::UnknownSize;
3258 lex();
3259 } else {
3260 if (expectAndConsume(MIToken::lparen))
3261 return true;
3262 if (parseLowLevelType(Token.location(), MemoryType))
3263 return true;
3264 if (expectAndConsume(MIToken::rparen))
3265 return true;
3266
3267 Size = MemoryType.getSizeInBytes();
3268 }
3269
3270 MachinePointerInfo Ptr = MachinePointerInfo();
3271 if (Token.is(MIToken::Identifier)) {
3272 const char *Word =
3273 ((Flags & MachineMemOperand::MOLoad) &&
3274 (Flags & MachineMemOperand::MOStore))
3275 ? "on"
3276 : Flags & MachineMemOperand::MOLoad ? "from" : "into";
3277 if (Token.stringValue() != Word)
3278 return error(Twine("expected '") + Word + "'");
3279 lex();
3280
3281 if (parseMachinePointerInfo(Ptr))
3282 return true;
3283 }
3284 uint64_t BaseAlignment =
3285 (Size != MemoryLocation::UnknownSize ? PowerOf2Ceil(Size) : 1);
3286 AAMDNodes AAInfo;
3287 MDNode *Range = nullptr;
3288 while (consumeIfPresent(MIToken::comma)) {
3289 switch (Token.kind()) {
3290 case MIToken::kw_align: {
3291 // align is printed if it is different than size.
3292 uint64_t Alignment;
3293 if (parseAlignment(Alignment))
3294 return true;
3295 if (Ptr.Offset & (Alignment - 1)) {
3296 // MachineMemOperand::getAlign never returns a value greater than the
3297 // alignment of offset, so this just guards against hand-written MIR
3298 // that specifies a large "align" value when it should probably use
3299 // "basealign" instead.
3300 return error("specified alignment is more aligned than offset");
3301 }
3302 BaseAlignment = Alignment;
3303 break;
3304 }
3305 case MIToken::kw_basealign:
3306 // basealign is printed if it is different than align.
3307 if (parseAlignment(BaseAlignment))
3308 return true;
3309 break;
3310 case MIToken::kw_addrspace:
3311 if (parseAddrspace(Ptr.AddrSpace))
3312 return true;
3313 break;
3314 case MIToken::md_tbaa:
3315 lex();
3316 if (parseMDNode(AAInfo.TBAA))
3317 return true;
3318 break;
3319 case MIToken::md_alias_scope:
3320 lex();
3321 if (parseMDNode(AAInfo.Scope))
3322 return true;
3323 break;
3324 case MIToken::md_noalias:
3325 lex();
3326 if (parseMDNode(AAInfo.NoAlias))
3327 return true;
3328 break;
3329 case MIToken::md_range:
3330 lex();
3331 if (parseMDNode(Range))
3332 return true;
3333 break;
3334 // TODO: Report an error on duplicate metadata nodes.
3335 default:
3336 return error("expected 'align' or '!tbaa' or '!alias.scope' or "
3337 "'!noalias' or '!range'");
3338 }
3339 }
3340 if (expectAndConsume(MIToken::rparen))
3341 return true;
3342 Dest = MF.getMachineMemOperand(Ptr, Flags, MemoryType, Align(BaseAlignment),
3343 AAInfo, Range, SSID, Order, FailureOrder);
3344 return false;
3345}
3346
3347bool MIParser::parsePreOrPostInstrSymbol(MCSymbol *&Symbol) {
3348 assert((Token.is(MIToken::kw_pre_instr_symbol) ||(static_cast <bool> ((Token.is(MIToken::kw_pre_instr_symbol
) || Token.is(MIToken::kw_post_instr_symbol)) && "Invalid token for a pre- post-instruction symbol!"
) ? void (0) : __assert_fail ("(Token.is(MIToken::kw_pre_instr_symbol) || Token.is(MIToken::kw_post_instr_symbol)) && \"Invalid token for a pre- post-instruction symbol!\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 3350, __extension__
__PRETTY_FUNCTION__))
3349 Token.is(MIToken::kw_post_instr_symbol)) &&(static_cast <bool> ((Token.is(MIToken::kw_pre_instr_symbol
) || Token.is(MIToken::kw_post_instr_symbol)) && "Invalid token for a pre- post-instruction symbol!"
) ? void (0) : __assert_fail ("(Token.is(MIToken::kw_pre_instr_symbol) || Token.is(MIToken::kw_post_instr_symbol)) && \"Invalid token for a pre- post-instruction symbol!\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 3350, __extension__
__PRETTY_FUNCTION__))
3350 "Invalid token for a pre- post-instruction symbol!")(static_cast <bool> ((Token.is(MIToken::kw_pre_instr_symbol
) || Token.is(MIToken::kw_post_instr_symbol)) && "Invalid token for a pre- post-instruction symbol!"
) ? void (0) : __assert_fail ("(Token.is(MIToken::kw_pre_instr_symbol) || Token.is(MIToken::kw_post_instr_symbol)) && \"Invalid token for a pre- post-instruction symbol!\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 3350, __extension__
__PRETTY_FUNCTION__))
;
3351 lex();
3352 if (Token.isNot(MIToken::MCSymbol))
3353 return error("expected a symbol after 'pre-instr-symbol'");
3354 Symbol = getOrCreateMCSymbol(Token.stringValue());
3355 lex();
3356 if (Token.isNewlineOrEOF() || Token.is(MIToken::coloncolon) ||
3357 Token.is(MIToken::lbrace))
3358 return false;
3359 if (Token.isNot(MIToken::comma))
3360 return error("expected ',' before the next machine operand");
3361 lex();
3362 return false;
3363}
3364
3365bool MIParser::parseHeapAllocMarker(MDNode *&Node) {
3366 assert(Token.is(MIToken::kw_heap_alloc_marker) &&(static_cast <bool> (Token.is(MIToken::kw_heap_alloc_marker
) && "Invalid token for a heap alloc marker!") ? void
(0) : __assert_fail ("Token.is(MIToken::kw_heap_alloc_marker) && \"Invalid token for a heap alloc marker!\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 3367, __extension__
__PRETTY_FUNCTION__))
3367 "Invalid token for a heap alloc marker!")(static_cast <bool> (Token.is(MIToken::kw_heap_alloc_marker
) && "Invalid token for a heap alloc marker!") ? void
(0) : __assert_fail ("Token.is(MIToken::kw_heap_alloc_marker) && \"Invalid token for a heap alloc marker!\""
, "llvm/lib/CodeGen/MIRParser/MIParser.cpp", 3367, __extension__
__PRETTY_FUNCTION__))
;
3368 lex();
3369 parseMDNode(Node);
3370 if (!Node)
3371 return error("expected a MDNode after 'heap-alloc-marker'");
3372 if (Token.isNewlineOrEOF() || Token.is(MIToken::coloncolon) ||
3373 Token.is(MIToken::lbrace))
3374 return false;
3375 if (Token.isNot(MIToken::comma))
3376 return error("expected ',' before the next machine operand");
3377 lex();
3378 return false;
3379}
3380
3381static void initSlots2BasicBlocks(
3382 const Function &F,
3383 DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) {
3384 ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false);
3385 MST.incorporateFunction(F);
3386 for (auto &BB : F) {
3387 if (BB.hasName())
3388 continue;
3389 int Slot = MST.getLocalSlot(&BB);
3390 if (Slot == -1)
3391 continue;
3392 Slots2BasicBlocks.insert(std::make_pair(unsigned(Slot), &BB));
3393 }
3394}
3395
3396static const BasicBlock *getIRBlockFromSlot(
3397 unsigned Slot,
3398 const DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) {
3399 return Slots2BasicBlocks.lookup(Slot);
3400}
3401
3402const BasicBlock *MIParser::getIRBlock(unsigned Slot) {
3403 if (Slots2BasicBlocks.empty())
3404 initSlots2BasicBlocks(MF.getFunction(), Slots2BasicBlocks);
3405 return getIRBlockFromSlot(Slot, Slots2BasicBlocks);
3406}
3407
3408const BasicBlock *MIParser::getIRBlock(unsigned Slot, const Function &F) {
3409 if (&F == &MF.getFunction())
3410 return getIRBlock(Slot);
3411 DenseMap<unsigned, const BasicBlock *> CustomSlots2BasicBlocks;
3412 initSlots2BasicBlocks(F, CustomSlots2BasicBlocks);
3413 return getIRBlockFromSlot(Slot, CustomSlots2BasicBlocks);
3414}
3415
3416MCSymbol *MIParser::getOrCreateMCSymbol(StringRef Name) {
3417 // FIXME: Currently we can't recognize temporary or local symbols and call all
3418 // of the appropriate forms to create them. However, this handles basic cases
3419 // well as most of the special aspects are recognized by a prefix on their
3420 // name, and the input names should already be unique. For test cases, keeping
3421 // the symbol name out of the symbol table isn't terribly important.
3422 return MF.getContext().getOrCreateSymbol(Name);
3423}
3424
3425bool MIParser::parseStringConstant(std::string &Result) {
3426 if (Token.isNot(MIToken::StringConstant))
3427 return error("expected string constant");
3428 Result = std::string(Token.stringValue());
3429 lex();
3430 return false;
3431}
3432
3433bool llvm::parseMachineBasicBlockDefinitions(PerFunctionMIParsingState &PFS,
3434 StringRef Src,
3435 SMDiagnostic &Error) {
3436 return MIParser(PFS, Error, Src).parseBasicBlockDefinitions(PFS.MBBSlots);
3437}
3438
3439bool llvm::parseMachineInstructions(PerFunctionMIParsingState &PFS,
3440 StringRef Src, SMDiagnostic &Error) {
3441 return MIParser(PFS, Error, Src).parseBasicBlocks();
3442}
3443
3444bool llvm::parseMBBReference(PerFunctionMIParsingState &PFS,
3445 MachineBasicBlock *&MBB, StringRef Src,
3446 SMDiagnostic &Error) {
3447 return MIParser(PFS, Error, Src).parseStandaloneMBB(MBB);
3448}
3449
3450bool llvm::parseRegisterReference(PerFunctionMIParsingState &PFS,
3451 Register &Reg, StringRef Src,
3452 SMDiagnostic &Error) {
3453 return MIParser(PFS, Error, Src).parseStandaloneRegister(Reg);
3454}
3455
3456bool llvm::parseNamedRegisterReference(PerFunctionMIParsingState &PFS,
3457 Register &Reg, StringRef Src,
3458 SMDiagnostic &Error) {
3459 return MIParser(PFS, Error, Src).parseStandaloneNamedRegister(Reg);
3460}
3461
3462bool llvm::parseVirtualRegisterReference(PerFunctionMIParsingState &PFS,
3463 VRegInfo *&Info, StringRef Src,
3464 SMDiagnostic &Error) {
3465 return MIParser(PFS, Error, Src).parseStandaloneVirtualRegister(Info);
3466}
3467
3468bool llvm::parseStackObjectReference(PerFunctionMIParsingState &PFS,
3469 int &FI, StringRef Src,
3470 SMDiagnostic &Error) {
3471 return MIParser(PFS, Error, Src).parseStandaloneStackObject(FI);
3472}
3473
3474bool llvm::parseMDNode(PerFunctionMIParsingState &PFS,
3475 MDNode *&Node, StringRef Src, SMDiagnostic &Error) {
3476 return MIParser(PFS, Error, Src).parseStandaloneMDNode(Node);
3477}
3478
3479bool llvm::parseMachineMetadata(PerFunctionMIParsingState &PFS, StringRef Src,
3480 SMRange SrcRange, SMDiagnostic &Error) {
3481 return MIParser(PFS, Error, Src, SrcRange).parseMachineMetadata();
3482}
3483
3484bool MIRFormatter::parseIRValue(StringRef Src, MachineFunction &MF,
3485 PerFunctionMIParsingState &PFS, const Value *&V,
3486 ErrorCallbackType ErrorCallback) {
3487 MIToken Token;
3488 Src = lexMIToken(Src, Token, [&](StringRef::iterator Loc, const Twine &Msg) {
3489 ErrorCallback(Loc, Msg);
3490 });
3491 V = nullptr;
3492
3493 return ::parseIRValue(Token, PFS, V, ErrorCallback);
1
Calling 'parseIRValue'
3494}