blob: e1770cd7fdb46df1409c2da0b3b2132b17f41739 [file] [log] [blame]
Alex Lorenz8e0a1b42015-06-22 17:02:30 +00001//===- MIParser.cpp - Machine instructions parser implementation ----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the parsing of machine instructions.
11//
12//===----------------------------------------------------------------------===//
13
14#include "MIParser.h"
Alex Lorenz91370c52015-06-22 20:37:46 +000015#include "MILexer.h"
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000016#include "llvm/ADT/StringMap.h"
Alex Lorenzad156fb2015-07-31 20:49:21 +000017#include "llvm/AsmParser/Parser.h"
Alex Lorenz5d6108e2015-06-26 22:56:48 +000018#include "llvm/AsmParser/SlotMapping.h"
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000019#include "llvm/CodeGen/MachineBasicBlock.h"
20#include "llvm/CodeGen/MachineFunction.h"
Alex Lorenz7feaf7c2015-07-16 23:37:45 +000021#include "llvm/CodeGen/MachineFrameInfo.h"
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000022#include "llvm/CodeGen/MachineInstr.h"
Alex Lorenzcb268d42015-07-06 23:07:26 +000023#include "llvm/CodeGen/MachineInstrBuilder.h"
Alex Lorenz4af7e612015-08-03 23:08:19 +000024#include "llvm/CodeGen/MachineMemOperand.h"
Alex Lorenzf4baeb52015-07-21 22:28:27 +000025#include "llvm/CodeGen/MachineModuleInfo.h"
Alex Lorenz7feaf7c2015-07-16 23:37:45 +000026#include "llvm/IR/Instructions.h"
Alex Lorenzdeb53492015-07-28 17:28:03 +000027#include "llvm/IR/Constants.h"
Alex Lorenz5d6108e2015-06-26 22:56:48 +000028#include "llvm/IR/Module.h"
Alex Lorenz8a1915b2015-07-27 22:42:41 +000029#include "llvm/IR/ModuleSlotTracker.h"
Alex Lorenzdeb53492015-07-28 17:28:03 +000030#include "llvm/IR/ValueSymbolTable.h"
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000031#include "llvm/Support/raw_ostream.h"
32#include "llvm/Support/SourceMgr.h"
33#include "llvm/Target/TargetSubtargetInfo.h"
34#include "llvm/Target/TargetInstrInfo.h"
35
36using namespace llvm;
37
38namespace {
39
Alex Lorenzb29554d2015-07-20 20:31:01 +000040struct StringValueUtility {
41 StringRef String;
42 std::string UnescapedString;
43
44 StringValueUtility(const MIToken &Token) {
45 if (Token.isStringValueQuoted()) {
46 Token.unescapeQuotedStringValue(UnescapedString);
47 String = UnescapedString;
48 return;
49 }
50 String = Token.stringValue();
51 }
52
53 operator StringRef() const { return String; }
54};
55
Alex Lorenz36962cd2015-07-07 02:08:46 +000056/// A wrapper struct around the 'MachineOperand' struct that includes a source
57/// range.
58struct MachineOperandWithLocation {
59 MachineOperand Operand;
60 StringRef::iterator Begin;
61 StringRef::iterator End;
62
63 MachineOperandWithLocation(const MachineOperand &Operand,
64 StringRef::iterator Begin, StringRef::iterator End)
65 : Operand(Operand), Begin(Begin), End(End) {}
66};
67
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000068class MIParser {
69 SourceMgr &SM;
70 MachineFunction &MF;
71 SMDiagnostic &Error;
Alex Lorenz91370c52015-06-22 20:37:46 +000072 StringRef Source, CurrentSource;
73 MIToken Token;
Alex Lorenz7a503fa2015-07-07 17:46:43 +000074 const PerFunctionMIParsingState &PFS;
Alex Lorenz5d6108e2015-06-26 22:56:48 +000075 /// Maps from indices to unnamed global values and metadata nodes.
76 const SlotMapping &IRSlots;
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000077 /// Maps from instruction names to op codes.
78 StringMap<unsigned> Names2InstrOpCodes;
Alex Lorenzf3db51de2015-06-23 16:35:26 +000079 /// Maps from register names to registers.
80 StringMap<unsigned> Names2Regs;
Alex Lorenz8f6f4282015-06-29 16:57:06 +000081 /// Maps from register mask names to register masks.
82 StringMap<const uint32_t *> Names2RegMasks;
Alex Lorenz2eacca82015-07-13 23:24:34 +000083 /// Maps from subregister names to subregister indices.
84 StringMap<unsigned> Names2SubRegIndices;
Alex Lorenz8a1915b2015-07-27 22:42:41 +000085 /// Maps from slot numbers to function's unnamed basic blocks.
86 DenseMap<unsigned, const BasicBlock *> Slots2BasicBlocks;
Alex Lorenzef5c1962015-07-28 23:02:45 +000087 /// Maps from target index names to target indices.
88 StringMap<int> Names2TargetIndices;
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000089
90public:
91 MIParser(SourceMgr &SM, MachineFunction &MF, SMDiagnostic &Error,
Alex Lorenz7a503fa2015-07-07 17:46:43 +000092 StringRef Source, const PerFunctionMIParsingState &PFS,
Alex Lorenz5d6108e2015-06-26 22:56:48 +000093 const SlotMapping &IRSlots);
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000094
Alex Lorenz91370c52015-06-22 20:37:46 +000095 void lex();
96
Alex Lorenz8e0a1b42015-06-22 17:02:30 +000097 /// Report an error at the current location with the given message.
98 ///
99 /// This function always return true.
100 bool error(const Twine &Msg);
101
Alex Lorenz91370c52015-06-22 20:37:46 +0000102 /// Report an error at the given location with the given message.
103 ///
104 /// This function always return true.
105 bool error(StringRef::iterator Loc, const Twine &Msg);
106
Alex Lorenz3708a642015-06-30 17:47:50 +0000107 bool parse(MachineInstr *&MI);
Alex Lorenz1ea60892015-07-27 20:29:27 +0000108 bool parseStandaloneMBB(MachineBasicBlock *&MBB);
109 bool parseStandaloneNamedRegister(unsigned &Reg);
Alex Lorenz12045a42015-07-27 17:42:45 +0000110 bool parseStandaloneVirtualRegister(unsigned &Reg);
Alex Lorenz8a1915b2015-07-27 22:42:41 +0000111 bool parseStandaloneIRBlockReference(const BasicBlock *&BB);
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000112
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000113 bool parseRegister(unsigned &Reg);
Alex Lorenzcb268d42015-07-06 23:07:26 +0000114 bool parseRegisterFlag(unsigned &Flags);
Alex Lorenz2eacca82015-07-13 23:24:34 +0000115 bool parseSubRegisterIndex(unsigned &SubReg);
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000116 bool parseRegisterOperand(MachineOperand &Dest, bool IsDef = false);
Alex Lorenz240fc1e2015-06-23 23:42:28 +0000117 bool parseImmediateOperand(MachineOperand &Dest);
Alex Lorenzad156fb2015-07-31 20:49:21 +0000118 bool parseFPImmediateOperand(MachineOperand &Dest);
Alex Lorenzf09df002015-06-30 18:16:42 +0000119 bool parseMBBReference(MachineBasicBlock *&MBB);
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000120 bool parseMBBOperand(MachineOperand &Dest);
Alex Lorenz7feaf7c2015-07-16 23:37:45 +0000121 bool parseStackObjectOperand(MachineOperand &Dest);
122 bool parseFixedStackObjectOperand(MachineOperand &Dest);
Alex Lorenz41df7d32015-07-28 17:09:52 +0000123 bool parseGlobalValue(GlobalValue *&GV);
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000124 bool parseGlobalAddressOperand(MachineOperand &Dest);
Alex Lorenzab980492015-07-20 20:51:18 +0000125 bool parseConstantPoolIndexOperand(MachineOperand &Dest);
Alex Lorenz31d70682015-07-15 23:38:35 +0000126 bool parseJumpTableIndexOperand(MachineOperand &Dest);
Alex Lorenz6ede3742015-07-21 16:59:53 +0000127 bool parseExternalSymbolOperand(MachineOperand &Dest);
Alex Lorenz44f29252015-07-22 21:07:04 +0000128 bool parseMDNode(MDNode *&Node);
Alex Lorenz35e44462015-07-22 17:58:46 +0000129 bool parseMetadataOperand(MachineOperand &Dest);
Alex Lorenzf4baeb52015-07-21 22:28:27 +0000130 bool parseCFIOffset(int &Offset);
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000131 bool parseCFIRegister(unsigned &Reg);
Alex Lorenzf4baeb52015-07-21 22:28:27 +0000132 bool parseCFIOperand(MachineOperand &Dest);
Alex Lorenzdeb53492015-07-28 17:28:03 +0000133 bool parseIRBlock(BasicBlock *&BB, const Function &F);
134 bool parseBlockAddressOperand(MachineOperand &Dest);
Alex Lorenzef5c1962015-07-28 23:02:45 +0000135 bool parseTargetIndexOperand(MachineOperand &Dest);
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000136 bool parseMachineOperand(MachineOperand &Dest);
Alex Lorenz4af7e612015-08-03 23:08:19 +0000137 bool parseIRValue(Value *&V);
138 bool parseMachineMemoryOperand(MachineMemOperand *&Dest);
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000139
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000140private:
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000141 /// Convert the integer literal in the current token into an unsigned integer.
142 ///
143 /// Return true if an error occurred.
144 bool getUnsigned(unsigned &Result);
145
Alex Lorenz4af7e612015-08-03 23:08:19 +0000146 /// Convert the integer literal in the current token into an uint64.
147 ///
148 /// Return true if an error occurred.
149 bool getUint64(uint64_t &Result);
150
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000151 /// If the current token is of the given kind, consume it and return false.
152 /// Otherwise report an error and return true.
153 bool expectAndConsume(MIToken::TokenKind TokenKind);
154
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000155 void initNames2InstrOpCodes();
156
157 /// Try to convert an instruction name to an opcode. Return true if the
158 /// instruction name is invalid.
159 bool parseInstrName(StringRef InstrName, unsigned &OpCode);
Alex Lorenz91370c52015-06-22 20:37:46 +0000160
Alex Lorenze5a44662015-07-17 00:24:15 +0000161 bool parseInstruction(unsigned &OpCode, unsigned &Flags);
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000162
Alex Lorenz36962cd2015-07-07 02:08:46 +0000163 bool verifyImplicitOperands(ArrayRef<MachineOperandWithLocation> Operands,
164 const MCInstrDesc &MCID);
165
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000166 void initNames2Regs();
167
168 /// Try to convert a register name to a register number. Return true if the
169 /// register name is invalid.
170 bool getRegisterByName(StringRef RegName, unsigned &Reg);
Alex Lorenz8f6f4282015-06-29 16:57:06 +0000171
172 void initNames2RegMasks();
173
174 /// Check if the given identifier is a name of a register mask.
175 ///
176 /// Return null if the identifier isn't a register mask.
177 const uint32_t *getRegMask(StringRef Identifier);
Alex Lorenz2eacca82015-07-13 23:24:34 +0000178
179 void initNames2SubRegIndices();
180
181 /// Check if the given identifier is a name of a subregister index.
182 ///
183 /// Return 0 if the name isn't a subregister index class.
184 unsigned getSubRegIndex(StringRef Name);
Alex Lorenz8a1915b2015-07-27 22:42:41 +0000185
186 void initSlots2BasicBlocks();
187
188 const BasicBlock *getIRBlock(unsigned Slot);
Alex Lorenzef5c1962015-07-28 23:02:45 +0000189
190 void initNames2TargetIndices();
191
192 /// Try to convert a name of target index to the corresponding target index.
193 ///
194 /// Return true if the name isn't a name of a target index.
195 bool getTargetIndex(StringRef Name, int &Index);
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000196};
197
198} // end anonymous namespace
199
200MIParser::MIParser(SourceMgr &SM, MachineFunction &MF, SMDiagnostic &Error,
Alex Lorenz7a503fa2015-07-07 17:46:43 +0000201 StringRef Source, const PerFunctionMIParsingState &PFS,
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000202 const SlotMapping &IRSlots)
Alex Lorenz91370c52015-06-22 20:37:46 +0000203 : SM(SM), MF(MF), Error(Error), Source(Source), CurrentSource(Source),
Alex Lorenz7a503fa2015-07-07 17:46:43 +0000204 Token(MIToken::Error, StringRef()), PFS(PFS), IRSlots(IRSlots) {}
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000205
Alex Lorenz91370c52015-06-22 20:37:46 +0000206void MIParser::lex() {
207 CurrentSource = lexMIToken(
208 CurrentSource, Token,
209 [this](StringRef::iterator Loc, const Twine &Msg) { error(Loc, Msg); });
210}
211
212bool MIParser::error(const Twine &Msg) { return error(Token.location(), Msg); }
213
214bool MIParser::error(StringRef::iterator Loc, const Twine &Msg) {
Alex Lorenz91370c52015-06-22 20:37:46 +0000215 assert(Loc >= Source.data() && Loc <= (Source.data() + Source.size()));
216 Error = SMDiagnostic(
217 SM, SMLoc(),
218 SM.getMemoryBuffer(SM.getMainFileID())->getBufferIdentifier(), 1,
219 Loc - Source.data(), SourceMgr::DK_Error, Msg.str(), Source, None, None);
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000220 return true;
221}
222
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000223static const char *toString(MIToken::TokenKind TokenKind) {
224 switch (TokenKind) {
225 case MIToken::comma:
226 return "','";
Alex Lorenzfbe9c042015-07-29 18:51:21 +0000227 case MIToken::equal:
228 return "'='";
Alex Lorenzdeb53492015-07-28 17:28:03 +0000229 case MIToken::lparen:
230 return "'('";
231 case MIToken::rparen:
232 return "')'";
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000233 default:
234 return "<unknown token>";
235 }
236}
237
238bool MIParser::expectAndConsume(MIToken::TokenKind TokenKind) {
239 if (Token.isNot(TokenKind))
240 return error(Twine("expected ") + toString(TokenKind));
241 lex();
242 return false;
243}
244
Alex Lorenz3708a642015-06-30 17:47:50 +0000245bool MIParser::parse(MachineInstr *&MI) {
Alex Lorenz91370c52015-06-22 20:37:46 +0000246 lex();
247
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000248 // Parse any register operands before '='
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000249 MachineOperand MO = MachineOperand::CreateImm(0);
Alex Lorenz36962cd2015-07-07 02:08:46 +0000250 SmallVector<MachineOperandWithLocation, 8> Operands;
Alex Lorenzfbe9c042015-07-29 18:51:21 +0000251 while (Token.isRegister() || Token.isRegisterFlag()) {
Alex Lorenz36962cd2015-07-07 02:08:46 +0000252 auto Loc = Token.location();
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000253 if (parseRegisterOperand(MO, /*IsDef=*/true))
Alex Lorenz3708a642015-06-30 17:47:50 +0000254 return true;
Alex Lorenz36962cd2015-07-07 02:08:46 +0000255 Operands.push_back(MachineOperandWithLocation(MO, Loc, Token.location()));
Alex Lorenzfbe9c042015-07-29 18:51:21 +0000256 if (Token.isNot(MIToken::comma))
257 break;
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000258 lex();
259 }
Alex Lorenzfbe9c042015-07-29 18:51:21 +0000260 if (!Operands.empty() && expectAndConsume(MIToken::equal))
261 return true;
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000262
Alex Lorenze5a44662015-07-17 00:24:15 +0000263 unsigned OpCode, Flags = 0;
264 if (Token.isError() || parseInstruction(OpCode, Flags))
Alex Lorenz3708a642015-06-30 17:47:50 +0000265 return true;
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000266
Alex Lorenz4af7e612015-08-03 23:08:19 +0000267 // TODO: Parse the bundle instruction flags.
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000268
269 // Parse the remaining machine operands.
Alex Lorenz4af7e612015-08-03 23:08:19 +0000270 while (Token.isNot(MIToken::Eof) && Token.isNot(MIToken::kw_debug_location) &&
271 Token.isNot(MIToken::coloncolon)) {
Alex Lorenz36962cd2015-07-07 02:08:46 +0000272 auto Loc = Token.location();
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000273 if (parseMachineOperand(MO))
Alex Lorenz3708a642015-06-30 17:47:50 +0000274 return true;
Alex Lorenz36962cd2015-07-07 02:08:46 +0000275 Operands.push_back(MachineOperandWithLocation(MO, Loc, Token.location()));
Alex Lorenz4af7e612015-08-03 23:08:19 +0000276 if (Token.is(MIToken::Eof) || Token.is(MIToken::coloncolon))
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000277 break;
Alex Lorenz3708a642015-06-30 17:47:50 +0000278 if (Token.isNot(MIToken::comma))
279 return error("expected ',' before the next machine operand");
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000280 lex();
281 }
282
Alex Lorenz46d760d2015-07-22 21:15:11 +0000283 DebugLoc DebugLocation;
284 if (Token.is(MIToken::kw_debug_location)) {
285 lex();
286 if (Token.isNot(MIToken::exclaim))
287 return error("expected a metadata node after 'debug-location'");
288 MDNode *Node = nullptr;
289 if (parseMDNode(Node))
290 return true;
291 DebugLocation = DebugLoc(Node);
292 }
293
Alex Lorenz4af7e612015-08-03 23:08:19 +0000294 // Parse the machine memory operands.
295 SmallVector<MachineMemOperand *, 2> MemOperands;
296 if (Token.is(MIToken::coloncolon)) {
297 lex();
298 while (Token.isNot(MIToken::Eof)) {
299 MachineMemOperand *MemOp = nullptr;
300 if (parseMachineMemoryOperand(MemOp))
301 return true;
302 MemOperands.push_back(MemOp);
303 if (Token.is(MIToken::Eof))
304 break;
305 if (Token.isNot(MIToken::comma))
306 return error("expected ',' before the next machine memory operand");
307 lex();
308 }
309 }
310
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000311 const auto &MCID = MF.getSubtarget().getInstrInfo()->get(OpCode);
Alex Lorenz36962cd2015-07-07 02:08:46 +0000312 if (!MCID.isVariadic()) {
313 // FIXME: Move the implicit operand verification to the machine verifier.
314 if (verifyImplicitOperands(Operands, MCID))
315 return true;
316 }
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000317
Alex Lorenzcb268d42015-07-06 23:07:26 +0000318 // TODO: Check for extraneous machine operands.
Alex Lorenz46d760d2015-07-22 21:15:11 +0000319 MI = MF.CreateMachineInstr(MCID, DebugLocation, /*NoImplicit=*/true);
Alex Lorenze5a44662015-07-17 00:24:15 +0000320 MI->setFlags(Flags);
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000321 for (const auto &Operand : Operands)
Alex Lorenz36962cd2015-07-07 02:08:46 +0000322 MI->addOperand(MF, Operand.Operand);
Alex Lorenz4af7e612015-08-03 23:08:19 +0000323 if (MemOperands.empty())
324 return false;
325 MachineInstr::mmo_iterator MemRefs =
326 MF.allocateMemRefsArray(MemOperands.size());
327 std::copy(MemOperands.begin(), MemOperands.end(), MemRefs);
328 MI->setMemRefs(MemRefs, MemRefs + MemOperands.size());
Alex Lorenz3708a642015-06-30 17:47:50 +0000329 return false;
Alex Lorenz8e0a1b42015-06-22 17:02:30 +0000330}
331
Alex Lorenz1ea60892015-07-27 20:29:27 +0000332bool MIParser::parseStandaloneMBB(MachineBasicBlock *&MBB) {
Alex Lorenzf09df002015-06-30 18:16:42 +0000333 lex();
334 if (Token.isNot(MIToken::MachineBasicBlock))
335 return error("expected a machine basic block reference");
336 if (parseMBBReference(MBB))
337 return true;
338 lex();
339 if (Token.isNot(MIToken::Eof))
340 return error(
341 "expected end of string after the machine basic block reference");
342 return false;
343}
344
Alex Lorenz1ea60892015-07-27 20:29:27 +0000345bool MIParser::parseStandaloneNamedRegister(unsigned &Reg) {
Alex Lorenz9fab3702015-07-14 21:24:41 +0000346 lex();
347 if (Token.isNot(MIToken::NamedRegister))
348 return error("expected a named register");
349 if (parseRegister(Reg))
350 return 0;
351 lex();
352 if (Token.isNot(MIToken::Eof))
353 return error("expected end of string after the register reference");
354 return false;
355}
356
Alex Lorenz12045a42015-07-27 17:42:45 +0000357bool MIParser::parseStandaloneVirtualRegister(unsigned &Reg) {
358 lex();
359 if (Token.isNot(MIToken::VirtualRegister))
360 return error("expected a virtual register");
361 if (parseRegister(Reg))
362 return 0;
363 lex();
364 if (Token.isNot(MIToken::Eof))
365 return error("expected end of string after the register reference");
366 return false;
367}
368
Alex Lorenz8a1915b2015-07-27 22:42:41 +0000369bool MIParser::parseStandaloneIRBlockReference(const BasicBlock *&BB) {
370 lex();
371 if (Token.isNot(MIToken::IRBlock))
372 return error("expected an IR block reference");
373 unsigned SlotNumber = 0;
374 if (getUnsigned(SlotNumber))
375 return true;
376 BB = getIRBlock(SlotNumber);
377 if (!BB)
378 return error(Twine("use of undefined IR block '%ir-block.") +
379 Twine(SlotNumber) + "'");
380 lex();
381 if (Token.isNot(MIToken::Eof))
382 return error("expected end of string after the IR block reference");
383 return false;
384}
385
Alex Lorenz36962cd2015-07-07 02:08:46 +0000386static const char *printImplicitRegisterFlag(const MachineOperand &MO) {
387 assert(MO.isImplicit());
388 return MO.isDef() ? "implicit-def" : "implicit";
389}
390
391static std::string getRegisterName(const TargetRegisterInfo *TRI,
392 unsigned Reg) {
393 assert(TargetRegisterInfo::isPhysicalRegister(Reg) && "expected phys reg");
394 return StringRef(TRI->getName(Reg)).lower();
395}
396
397bool MIParser::verifyImplicitOperands(
398 ArrayRef<MachineOperandWithLocation> Operands, const MCInstrDesc &MCID) {
399 if (MCID.isCall())
400 // We can't verify call instructions as they can contain arbitrary implicit
401 // register and register mask operands.
402 return false;
403
404 // Gather all the expected implicit operands.
405 SmallVector<MachineOperand, 4> ImplicitOperands;
406 if (MCID.ImplicitDefs)
407 for (const uint16_t *ImpDefs = MCID.getImplicitDefs(); *ImpDefs; ++ImpDefs)
408 ImplicitOperands.push_back(
409 MachineOperand::CreateReg(*ImpDefs, true, true));
410 if (MCID.ImplicitUses)
411 for (const uint16_t *ImpUses = MCID.getImplicitUses(); *ImpUses; ++ImpUses)
412 ImplicitOperands.push_back(
413 MachineOperand::CreateReg(*ImpUses, false, true));
414
415 const auto *TRI = MF.getSubtarget().getRegisterInfo();
416 assert(TRI && "Expected target register info");
417 size_t I = ImplicitOperands.size(), J = Operands.size();
418 while (I) {
419 --I;
420 if (J) {
421 --J;
422 const auto &ImplicitOperand = ImplicitOperands[I];
423 const auto &Operand = Operands[J].Operand;
424 if (ImplicitOperand.isIdenticalTo(Operand))
425 continue;
426 if (Operand.isReg() && Operand.isImplicit()) {
427 return error(Operands[J].Begin,
428 Twine("expected an implicit register operand '") +
429 printImplicitRegisterFlag(ImplicitOperand) + " %" +
430 getRegisterName(TRI, ImplicitOperand.getReg()) + "'");
431 }
432 }
433 // TODO: Fix source location when Operands[J].end is right before '=', i.e:
434 // insead of reporting an error at this location:
435 // %eax = MOV32r0
436 // ^
437 // report the error at the following location:
438 // %eax = MOV32r0
439 // ^
440 return error(J < Operands.size() ? Operands[J].End : Token.location(),
441 Twine("missing implicit register operand '") +
442 printImplicitRegisterFlag(ImplicitOperands[I]) + " %" +
443 getRegisterName(TRI, ImplicitOperands[I].getReg()) + "'");
444 }
445 return false;
446}
447
Alex Lorenze5a44662015-07-17 00:24:15 +0000448bool MIParser::parseInstruction(unsigned &OpCode, unsigned &Flags) {
449 if (Token.is(MIToken::kw_frame_setup)) {
450 Flags |= MachineInstr::FrameSetup;
451 lex();
452 }
Alex Lorenz91370c52015-06-22 20:37:46 +0000453 if (Token.isNot(MIToken::Identifier))
454 return error("expected a machine instruction");
455 StringRef InstrName = Token.stringValue();
456 if (parseInstrName(InstrName, OpCode))
457 return error(Twine("unknown machine instruction name '") + InstrName + "'");
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000458 lex();
459 return false;
460}
461
462bool MIParser::parseRegister(unsigned &Reg) {
463 switch (Token.kind()) {
Alex Lorenz12b554e2015-06-24 17:34:58 +0000464 case MIToken::underscore:
465 Reg = 0;
466 break;
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000467 case MIToken::NamedRegister: {
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000468 StringRef Name = Token.stringValue();
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000469 if (getRegisterByName(Name, Reg))
470 return error(Twine("unknown register name '") + Name + "'");
471 break;
472 }
Alex Lorenz53464512015-07-10 22:51:20 +0000473 case MIToken::VirtualRegister: {
474 unsigned ID;
475 if (getUnsigned(ID))
476 return true;
477 const auto RegInfo = PFS.VirtualRegisterSlots.find(ID);
478 if (RegInfo == PFS.VirtualRegisterSlots.end())
479 return error(Twine("use of undefined virtual register '%") + Twine(ID) +
480 "'");
481 Reg = RegInfo->second;
482 break;
483 }
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000484 // TODO: Parse other register kinds.
485 default:
486 llvm_unreachable("The current token should be a register");
487 }
488 return false;
489}
490
Alex Lorenzcb268d42015-07-06 23:07:26 +0000491bool MIParser::parseRegisterFlag(unsigned &Flags) {
492 switch (Token.kind()) {
493 case MIToken::kw_implicit:
494 Flags |= RegState::Implicit;
495 break;
496 case MIToken::kw_implicit_define:
497 Flags |= RegState::ImplicitDefine;
498 break;
Alex Lorenzcbbfd0b2015-07-07 20:34:53 +0000499 case MIToken::kw_dead:
500 Flags |= RegState::Dead;
501 break;
Alex Lorenz495ad872015-07-08 21:23:34 +0000502 case MIToken::kw_killed:
503 Flags |= RegState::Kill;
504 break;
Alex Lorenz4d026b892015-07-08 23:58:31 +0000505 case MIToken::kw_undef:
506 Flags |= RegState::Undef;
507 break;
Alex Lorenzcb268d42015-07-06 23:07:26 +0000508 // TODO: report an error when we specify the same flag more than once.
509 // TODO: parse the other register flags.
510 default:
511 llvm_unreachable("The current token should be a register flag");
512 }
513 lex();
514 return false;
515}
516
Alex Lorenz2eacca82015-07-13 23:24:34 +0000517bool MIParser::parseSubRegisterIndex(unsigned &SubReg) {
518 assert(Token.is(MIToken::colon));
519 lex();
520 if (Token.isNot(MIToken::Identifier))
521 return error("expected a subregister index after ':'");
522 auto Name = Token.stringValue();
523 SubReg = getSubRegIndex(Name);
524 if (!SubReg)
525 return error(Twine("use of unknown subregister index '") + Name + "'");
526 lex();
527 return false;
528}
529
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000530bool MIParser::parseRegisterOperand(MachineOperand &Dest, bool IsDef) {
531 unsigned Reg;
Alex Lorenzcb268d42015-07-06 23:07:26 +0000532 unsigned Flags = IsDef ? RegState::Define : 0;
533 while (Token.isRegisterFlag()) {
534 if (parseRegisterFlag(Flags))
535 return true;
536 }
537 if (!Token.isRegister())
538 return error("expected a register after register flags");
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000539 if (parseRegister(Reg))
540 return true;
541 lex();
Alex Lorenz2eacca82015-07-13 23:24:34 +0000542 unsigned SubReg = 0;
543 if (Token.is(MIToken::colon)) {
544 if (parseSubRegisterIndex(SubReg))
545 return true;
546 }
Alex Lorenz495ad872015-07-08 21:23:34 +0000547 Dest = MachineOperand::CreateReg(
548 Reg, Flags & RegState::Define, Flags & RegState::Implicit,
Alex Lorenz2eacca82015-07-13 23:24:34 +0000549 Flags & RegState::Kill, Flags & RegState::Dead, Flags & RegState::Undef,
550 /*isEarlyClobber=*/false, SubReg);
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000551 return false;
552}
553
Alex Lorenz240fc1e2015-06-23 23:42:28 +0000554bool MIParser::parseImmediateOperand(MachineOperand &Dest) {
555 assert(Token.is(MIToken::IntegerLiteral));
556 const APSInt &Int = Token.integerValue();
557 if (Int.getMinSignedBits() > 64)
558 // TODO: Replace this with an error when we can parse CIMM Machine Operands.
559 llvm_unreachable("Can't parse large integer literals yet!");
560 Dest = MachineOperand::CreateImm(Int.getExtValue());
561 lex();
562 return false;
563}
564
Alex Lorenzad156fb2015-07-31 20:49:21 +0000565bool MIParser::parseFPImmediateOperand(MachineOperand &Dest) {
566 auto Loc = Token.location();
567 lex();
568 if (Token.isNot(MIToken::FloatingPointLiteral))
569 return error("expected a floating point literal");
570 auto Source = StringRef(Loc, Token.stringValue().end() - Loc).str();
571 lex();
572 SMDiagnostic Err;
573 const Constant *C =
574 parseConstantValue(Source.c_str(), Err, *MF.getFunction()->getParent());
575 if (!C)
576 return error(Loc + Err.getColumnNo(), Err.getMessage());
577 Dest = MachineOperand::CreateFPImm(cast<ConstantFP>(C));
578 return false;
579}
580
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000581bool MIParser::getUnsigned(unsigned &Result) {
582 assert(Token.hasIntegerValue() && "Expected a token with an integer value");
583 const uint64_t Limit = uint64_t(std::numeric_limits<unsigned>::max()) + 1;
584 uint64_t Val64 = Token.integerValue().getLimitedValue(Limit);
585 if (Val64 == Limit)
586 return error("expected 32-bit integer (too large)");
587 Result = Val64;
588 return false;
589}
590
Alex Lorenzf09df002015-06-30 18:16:42 +0000591bool MIParser::parseMBBReference(MachineBasicBlock *&MBB) {
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000592 assert(Token.is(MIToken::MachineBasicBlock));
593 unsigned Number;
594 if (getUnsigned(Number))
595 return true;
Alex Lorenz7a503fa2015-07-07 17:46:43 +0000596 auto MBBInfo = PFS.MBBSlots.find(Number);
597 if (MBBInfo == PFS.MBBSlots.end())
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000598 return error(Twine("use of undefined machine basic block #") +
599 Twine(Number));
Alex Lorenzf09df002015-06-30 18:16:42 +0000600 MBB = MBBInfo->second;
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000601 if (!Token.stringValue().empty() && Token.stringValue() != MBB->getName())
602 return error(Twine("the name of machine basic block #") + Twine(Number) +
603 " isn't '" + Token.stringValue() + "'");
Alex Lorenzf09df002015-06-30 18:16:42 +0000604 return false;
605}
606
607bool MIParser::parseMBBOperand(MachineOperand &Dest) {
608 MachineBasicBlock *MBB;
609 if (parseMBBReference(MBB))
610 return true;
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000611 Dest = MachineOperand::CreateMBB(MBB);
612 lex();
613 return false;
614}
615
Alex Lorenz7feaf7c2015-07-16 23:37:45 +0000616bool MIParser::parseStackObjectOperand(MachineOperand &Dest) {
617 assert(Token.is(MIToken::StackObject));
618 unsigned ID;
619 if (getUnsigned(ID))
620 return true;
621 auto ObjectInfo = PFS.StackObjectSlots.find(ID);
622 if (ObjectInfo == PFS.StackObjectSlots.end())
623 return error(Twine("use of undefined stack object '%stack.") + Twine(ID) +
624 "'");
625 StringRef Name;
626 if (const auto *Alloca =
627 MF.getFrameInfo()->getObjectAllocation(ObjectInfo->second))
628 Name = Alloca->getName();
629 if (!Token.stringValue().empty() && Token.stringValue() != Name)
630 return error(Twine("the name of the stack object '%stack.") + Twine(ID) +
631 "' isn't '" + Token.stringValue() + "'");
632 lex();
633 Dest = MachineOperand::CreateFI(ObjectInfo->second);
634 return false;
635}
636
637bool MIParser::parseFixedStackObjectOperand(MachineOperand &Dest) {
638 assert(Token.is(MIToken::FixedStackObject));
639 unsigned ID;
640 if (getUnsigned(ID))
641 return true;
642 auto ObjectInfo = PFS.FixedStackObjectSlots.find(ID);
643 if (ObjectInfo == PFS.FixedStackObjectSlots.end())
644 return error(Twine("use of undefined fixed stack object '%fixed-stack.") +
645 Twine(ID) + "'");
646 lex();
647 Dest = MachineOperand::CreateFI(ObjectInfo->second);
648 return false;
649}
650
Alex Lorenz41df7d32015-07-28 17:09:52 +0000651bool MIParser::parseGlobalValue(GlobalValue *&GV) {
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000652 switch (Token.kind()) {
Alex Lorenzb29554d2015-07-20 20:31:01 +0000653 case MIToken::NamedGlobalValue:
654 case MIToken::QuotedNamedGlobalValue: {
655 StringValueUtility Name(Token);
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000656 const Module *M = MF.getFunction()->getParent();
Alex Lorenz41df7d32015-07-28 17:09:52 +0000657 GV = M->getNamedValue(Name);
658 if (!GV)
659 return error(Twine("use of undefined global value '@") +
660 Token.rawStringValue() + "'");
661 break;
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000662 }
663 case MIToken::GlobalValue: {
664 unsigned GVIdx;
665 if (getUnsigned(GVIdx))
666 return true;
667 if (GVIdx >= IRSlots.GlobalValues.size())
668 return error(Twine("use of undefined global value '@") + Twine(GVIdx) +
669 "'");
Alex Lorenz41df7d32015-07-28 17:09:52 +0000670 GV = IRSlots.GlobalValues[GVIdx];
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000671 break;
672 }
673 default:
674 llvm_unreachable("The current token should be a global value");
675 }
Alex Lorenz41df7d32015-07-28 17:09:52 +0000676 return false;
677}
678
679bool MIParser::parseGlobalAddressOperand(MachineOperand &Dest) {
680 GlobalValue *GV = nullptr;
681 if (parseGlobalValue(GV))
682 return true;
683 Dest = MachineOperand::CreateGA(GV, /*Offset=*/0);
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000684 // TODO: Parse offset and target flags.
685 lex();
686 return false;
687}
688
Alex Lorenzab980492015-07-20 20:51:18 +0000689bool MIParser::parseConstantPoolIndexOperand(MachineOperand &Dest) {
690 assert(Token.is(MIToken::ConstantPoolItem));
691 unsigned ID;
692 if (getUnsigned(ID))
693 return true;
694 auto ConstantInfo = PFS.ConstantPoolSlots.find(ID);
695 if (ConstantInfo == PFS.ConstantPoolSlots.end())
696 return error("use of undefined constant '%const." + Twine(ID) + "'");
697 lex();
698 // TODO: Parse offset and target flags.
699 Dest = MachineOperand::CreateCPI(ID, /*Offset=*/0);
700 return false;
701}
702
Alex Lorenz31d70682015-07-15 23:38:35 +0000703bool MIParser::parseJumpTableIndexOperand(MachineOperand &Dest) {
704 assert(Token.is(MIToken::JumpTableIndex));
705 unsigned ID;
706 if (getUnsigned(ID))
707 return true;
708 auto JumpTableEntryInfo = PFS.JumpTableSlots.find(ID);
709 if (JumpTableEntryInfo == PFS.JumpTableSlots.end())
710 return error("use of undefined jump table '%jump-table." + Twine(ID) + "'");
711 lex();
712 // TODO: Parse target flags.
713 Dest = MachineOperand::CreateJTI(JumpTableEntryInfo->second);
714 return false;
715}
716
Alex Lorenz6ede3742015-07-21 16:59:53 +0000717bool MIParser::parseExternalSymbolOperand(MachineOperand &Dest) {
718 assert(Token.is(MIToken::ExternalSymbol) ||
719 Token.is(MIToken::QuotedExternalSymbol));
720 StringValueUtility Name(Token);
721 const char *Symbol = MF.createExternalSymbolName(Name);
722 lex();
723 // TODO: Parse the target flags.
724 Dest = MachineOperand::CreateES(Symbol);
725 return false;
726}
727
Alex Lorenz44f29252015-07-22 21:07:04 +0000728bool MIParser::parseMDNode(MDNode *&Node) {
Alex Lorenz35e44462015-07-22 17:58:46 +0000729 assert(Token.is(MIToken::exclaim));
730 auto Loc = Token.location();
731 lex();
732 if (Token.isNot(MIToken::IntegerLiteral) || Token.integerValue().isSigned())
733 return error("expected metadata id after '!'");
734 unsigned ID;
735 if (getUnsigned(ID))
736 return true;
737 auto NodeInfo = IRSlots.MetadataNodes.find(ID);
738 if (NodeInfo == IRSlots.MetadataNodes.end())
739 return error(Loc, "use of undefined metadata '!" + Twine(ID) + "'");
740 lex();
Alex Lorenz44f29252015-07-22 21:07:04 +0000741 Node = NodeInfo->second.get();
742 return false;
743}
744
745bool MIParser::parseMetadataOperand(MachineOperand &Dest) {
746 MDNode *Node = nullptr;
747 if (parseMDNode(Node))
748 return true;
749 Dest = MachineOperand::CreateMetadata(Node);
Alex Lorenz35e44462015-07-22 17:58:46 +0000750 return false;
751}
752
Alex Lorenzf4baeb52015-07-21 22:28:27 +0000753bool MIParser::parseCFIOffset(int &Offset) {
754 if (Token.isNot(MIToken::IntegerLiteral))
755 return error("expected a cfi offset");
756 if (Token.integerValue().getMinSignedBits() > 32)
757 return error("expected a 32 bit integer (the cfi offset is too large)");
758 Offset = (int)Token.integerValue().getExtValue();
759 lex();
760 return false;
761}
762
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000763bool MIParser::parseCFIRegister(unsigned &Reg) {
764 if (Token.isNot(MIToken::NamedRegister))
765 return error("expected a cfi register");
766 unsigned LLVMReg;
767 if (parseRegister(LLVMReg))
Alex Lorenzf4baeb52015-07-21 22:28:27 +0000768 return true;
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000769 const auto *TRI = MF.getSubtarget().getRegisterInfo();
770 assert(TRI && "Expected target register info");
771 int DwarfReg = TRI->getDwarfRegNum(LLVMReg, true);
772 if (DwarfReg < 0)
773 return error("invalid DWARF register");
774 Reg = (unsigned)DwarfReg;
775 lex();
776 return false;
777}
778
779bool MIParser::parseCFIOperand(MachineOperand &Dest) {
780 auto Kind = Token.kind();
781 lex();
782 auto &MMI = MF.getMMI();
783 int Offset;
784 unsigned Reg;
785 unsigned CFIIndex;
786 switch (Kind) {
787 case MIToken::kw_cfi_offset:
788 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
789 parseCFIOffset(Offset))
790 return true;
791 CFIIndex =
792 MMI.addFrameInst(MCCFIInstruction::createOffset(nullptr, Reg, Offset));
793 break;
Alex Lorenz5b0d5f62015-07-27 20:39:03 +0000794 case MIToken::kw_cfi_def_cfa_register:
795 if (parseCFIRegister(Reg))
796 return true;
797 CFIIndex =
798 MMI.addFrameInst(MCCFIInstruction::createDefCfaRegister(nullptr, Reg));
799 break;
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000800 case MIToken::kw_cfi_def_cfa_offset:
801 if (parseCFIOffset(Offset))
802 return true;
803 // NB: MCCFIInstruction::createDefCfaOffset negates the offset.
804 CFIIndex = MMI.addFrameInst(
805 MCCFIInstruction::createDefCfaOffset(nullptr, -Offset));
806 break;
Alex Lorenzb1393232015-07-29 18:57:23 +0000807 case MIToken::kw_cfi_def_cfa:
808 if (parseCFIRegister(Reg) || expectAndConsume(MIToken::comma) ||
809 parseCFIOffset(Offset))
810 return true;
811 // NB: MCCFIInstruction::createDefCfa negates the offset.
812 CFIIndex =
813 MMI.addFrameInst(MCCFIInstruction::createDefCfa(nullptr, Reg, -Offset));
814 break;
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000815 default:
816 // TODO: Parse the other CFI operands.
817 llvm_unreachable("The current token should be a cfi operand");
818 }
819 Dest = MachineOperand::CreateCFIIndex(CFIIndex);
Alex Lorenzf4baeb52015-07-21 22:28:27 +0000820 return false;
821}
822
Alex Lorenzdeb53492015-07-28 17:28:03 +0000823bool MIParser::parseIRBlock(BasicBlock *&BB, const Function &F) {
824 switch (Token.kind()) {
825 case MIToken::NamedIRBlock:
826 case MIToken::QuotedNamedIRBlock: {
827 StringValueUtility Name(Token);
828 BB = dyn_cast_or_null<BasicBlock>(F.getValueSymbolTable().lookup(Name));
829 if (!BB)
830 return error(Twine("use of undefined IR block '%ir-block.") +
831 Token.rawStringValue() + "'");
832 break;
833 }
834 case MIToken::IRBlock: {
835 unsigned SlotNumber = 0;
836 if (getUnsigned(SlotNumber))
837 return true;
838 BB = const_cast<BasicBlock *>(getIRBlock(SlotNumber));
839 if (!BB)
840 return error(Twine("use of undefined IR block '%ir-block.") +
841 Twine(SlotNumber) + "'");
842 break;
843 }
844 default:
845 llvm_unreachable("The current token should be an IR block reference");
846 }
847 return false;
848}
849
850bool MIParser::parseBlockAddressOperand(MachineOperand &Dest) {
851 assert(Token.is(MIToken::kw_blockaddress));
852 lex();
853 if (expectAndConsume(MIToken::lparen))
854 return true;
855 if (Token.isNot(MIToken::GlobalValue) &&
856 Token.isNot(MIToken::NamedGlobalValue) &&
857 Token.isNot(MIToken::QuotedNamedGlobalValue))
858 return error("expected a global value");
859 GlobalValue *GV = nullptr;
860 if (parseGlobalValue(GV))
861 return true;
862 auto *F = dyn_cast<Function>(GV);
863 if (!F)
864 return error("expected an IR function reference");
865 lex();
866 if (expectAndConsume(MIToken::comma))
867 return true;
868 BasicBlock *BB = nullptr;
869 if (Token.isNot(MIToken::IRBlock) && Token.isNot(MIToken::NamedIRBlock) &&
870 Token.isNot(MIToken::QuotedNamedIRBlock))
871 return error("expected an IR block reference");
872 if (parseIRBlock(BB, *F))
873 return true;
874 lex();
875 if (expectAndConsume(MIToken::rparen))
876 return true;
877 // TODO: parse offset and target flags.
878 Dest = MachineOperand::CreateBA(BlockAddress::get(F, BB), /*Offset=*/0);
879 return false;
880}
881
Alex Lorenzef5c1962015-07-28 23:02:45 +0000882bool MIParser::parseTargetIndexOperand(MachineOperand &Dest) {
883 assert(Token.is(MIToken::kw_target_index));
884 lex();
885 if (expectAndConsume(MIToken::lparen))
886 return true;
887 if (Token.isNot(MIToken::Identifier))
888 return error("expected the name of the target index");
889 int Index = 0;
890 if (getTargetIndex(Token.stringValue(), Index))
891 return error("use of undefined target index '" + Token.stringValue() + "'");
892 lex();
893 if (expectAndConsume(MIToken::rparen))
894 return true;
895 // TODO: Parse the offset and target flags.
896 Dest = MachineOperand::CreateTargetIndex(unsigned(Index), /*Offset=*/0);
897 return false;
898}
899
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000900bool MIParser::parseMachineOperand(MachineOperand &Dest) {
901 switch (Token.kind()) {
Alex Lorenzcb268d42015-07-06 23:07:26 +0000902 case MIToken::kw_implicit:
903 case MIToken::kw_implicit_define:
Alex Lorenzcbbfd0b2015-07-07 20:34:53 +0000904 case MIToken::kw_dead:
Alex Lorenz495ad872015-07-08 21:23:34 +0000905 case MIToken::kw_killed:
Alex Lorenz4d026b892015-07-08 23:58:31 +0000906 case MIToken::kw_undef:
Alex Lorenz12b554e2015-06-24 17:34:58 +0000907 case MIToken::underscore:
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000908 case MIToken::NamedRegister:
Alex Lorenz53464512015-07-10 22:51:20 +0000909 case MIToken::VirtualRegister:
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000910 return parseRegisterOperand(Dest);
Alex Lorenz240fc1e2015-06-23 23:42:28 +0000911 case MIToken::IntegerLiteral:
912 return parseImmediateOperand(Dest);
Alex Lorenzad156fb2015-07-31 20:49:21 +0000913 case MIToken::kw_half:
914 case MIToken::kw_float:
915 case MIToken::kw_double:
916 case MIToken::kw_x86_fp80:
917 case MIToken::kw_fp128:
918 case MIToken::kw_ppc_fp128:
919 return parseFPImmediateOperand(Dest);
Alex Lorenz33f0aef2015-06-26 16:46:11 +0000920 case MIToken::MachineBasicBlock:
921 return parseMBBOperand(Dest);
Alex Lorenz7feaf7c2015-07-16 23:37:45 +0000922 case MIToken::StackObject:
923 return parseStackObjectOperand(Dest);
924 case MIToken::FixedStackObject:
925 return parseFixedStackObjectOperand(Dest);
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000926 case MIToken::GlobalValue:
927 case MIToken::NamedGlobalValue:
Alex Lorenzb29554d2015-07-20 20:31:01 +0000928 case MIToken::QuotedNamedGlobalValue:
Alex Lorenz5d6108e2015-06-26 22:56:48 +0000929 return parseGlobalAddressOperand(Dest);
Alex Lorenzab980492015-07-20 20:51:18 +0000930 case MIToken::ConstantPoolItem:
931 return parseConstantPoolIndexOperand(Dest);
Alex Lorenz31d70682015-07-15 23:38:35 +0000932 case MIToken::JumpTableIndex:
933 return parseJumpTableIndexOperand(Dest);
Alex Lorenz6ede3742015-07-21 16:59:53 +0000934 case MIToken::ExternalSymbol:
935 case MIToken::QuotedExternalSymbol:
936 return parseExternalSymbolOperand(Dest);
Alex Lorenz35e44462015-07-22 17:58:46 +0000937 case MIToken::exclaim:
938 return parseMetadataOperand(Dest);
Alex Lorenz8cfc6862015-07-23 23:09:07 +0000939 case MIToken::kw_cfi_offset:
Alex Lorenz5b0d5f62015-07-27 20:39:03 +0000940 case MIToken::kw_cfi_def_cfa_register:
Alex Lorenzf4baeb52015-07-21 22:28:27 +0000941 case MIToken::kw_cfi_def_cfa_offset:
Alex Lorenzb1393232015-07-29 18:57:23 +0000942 case MIToken::kw_cfi_def_cfa:
Alex Lorenzf4baeb52015-07-21 22:28:27 +0000943 return parseCFIOperand(Dest);
Alex Lorenzdeb53492015-07-28 17:28:03 +0000944 case MIToken::kw_blockaddress:
945 return parseBlockAddressOperand(Dest);
Alex Lorenzef5c1962015-07-28 23:02:45 +0000946 case MIToken::kw_target_index:
947 return parseTargetIndexOperand(Dest);
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000948 case MIToken::Error:
949 return true;
Alex Lorenz8f6f4282015-06-29 16:57:06 +0000950 case MIToken::Identifier:
951 if (const auto *RegMask = getRegMask(Token.stringValue())) {
952 Dest = MachineOperand::CreateRegMask(RegMask);
953 lex();
954 break;
955 }
956 // fallthrough
Alex Lorenzf3db51de2015-06-23 16:35:26 +0000957 default:
958 // TODO: parse the other machine operands.
959 return error("expected a machine operand");
960 }
Alex Lorenz91370c52015-06-22 20:37:46 +0000961 return false;
962}
963
Alex Lorenz4af7e612015-08-03 23:08:19 +0000964bool MIParser::parseIRValue(Value *&V) {
965 switch (Token.kind()) {
966 case MIToken::NamedIRValue:
967 case MIToken::QuotedNamedIRValue: {
968 StringValueUtility Name(Token);
969 V = MF.getFunction()->getValueSymbolTable().lookup(Name);
970 if (!V)
971 return error(Twine("use of undefined IR value '%ir.") +
972 Token.rawStringValue() + "'");
973 break;
974 }
975 // TODO: Parse unnamed IR value references.
976 default:
977 llvm_unreachable("The current token should be an IR block reference");
978 }
979 return false;
980}
981
982bool MIParser::getUint64(uint64_t &Result) {
983 assert(Token.hasIntegerValue());
984 if (Token.integerValue().getActiveBits() > 64)
985 return error("expected 64-bit integer (too large)");
986 Result = Token.integerValue().getZExtValue();
987 return false;
988}
989
990bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) {
991 if (expectAndConsume(MIToken::lparen))
992 return true;
993 // TODO: Parse the operand's flags.
994 if (Token.isNot(MIToken::Identifier) ||
995 (Token.stringValue() != "load" && Token.stringValue() != "store"))
996 return error("expected 'load' or 'store' memory operation");
997 unsigned Flags = 0;
998 if (Token.stringValue() == "load")
999 Flags |= MachineMemOperand::MOLoad;
1000 else
1001 Flags |= MachineMemOperand::MOStore;
1002 lex();
1003
1004 if (Token.isNot(MIToken::IntegerLiteral))
1005 return error("expected the size integer literal after memory operation");
1006 uint64_t Size;
1007 if (getUint64(Size))
1008 return true;
1009 lex();
1010
1011 const char *Word = Flags & MachineMemOperand::MOLoad ? "from" : "into";
1012 if (Token.isNot(MIToken::Identifier) || Token.stringValue() != Word)
1013 return error(Twine("expected '") + Word + "'");
1014 lex();
1015
1016 // TODO: Parse pseudo source values.
1017 if (Token.isNot(MIToken::NamedIRValue) &&
1018 Token.isNot(MIToken::QuotedNamedIRValue))
1019 return error("expected an IR value reference");
1020 Value *V = nullptr;
1021 if (parseIRValue(V))
1022 return true;
1023 if (!V->getType()->isPointerTy())
1024 return error("expected a pointer IR value");
1025 lex();
1026 // TODO: Parse the base alignment.
1027 // TODO: Parse the attached metadata nodes.
1028 if (expectAndConsume(MIToken::rparen))
1029 return true;
1030
1031 Dest = MF.getMachineMemOperand(MachinePointerInfo(V), Flags, Size, Size);
1032 return false;
1033}
1034
Alex Lorenz8e0a1b42015-06-22 17:02:30 +00001035void MIParser::initNames2InstrOpCodes() {
1036 if (!Names2InstrOpCodes.empty())
1037 return;
1038 const auto *TII = MF.getSubtarget().getInstrInfo();
1039 assert(TII && "Expected target instruction info");
1040 for (unsigned I = 0, E = TII->getNumOpcodes(); I < E; ++I)
1041 Names2InstrOpCodes.insert(std::make_pair(StringRef(TII->getName(I)), I));
1042}
1043
1044bool MIParser::parseInstrName(StringRef InstrName, unsigned &OpCode) {
1045 initNames2InstrOpCodes();
1046 auto InstrInfo = Names2InstrOpCodes.find(InstrName);
1047 if (InstrInfo == Names2InstrOpCodes.end())
1048 return true;
1049 OpCode = InstrInfo->getValue();
1050 return false;
1051}
1052
Alex Lorenzf3db51de2015-06-23 16:35:26 +00001053void MIParser::initNames2Regs() {
1054 if (!Names2Regs.empty())
1055 return;
Alex Lorenz12b554e2015-06-24 17:34:58 +00001056 // The '%noreg' register is the register 0.
1057 Names2Regs.insert(std::make_pair("noreg", 0));
Alex Lorenzf3db51de2015-06-23 16:35:26 +00001058 const auto *TRI = MF.getSubtarget().getRegisterInfo();
1059 assert(TRI && "Expected target register info");
1060 for (unsigned I = 0, E = TRI->getNumRegs(); I < E; ++I) {
1061 bool WasInserted =
1062 Names2Regs.insert(std::make_pair(StringRef(TRI->getName(I)).lower(), I))
1063 .second;
1064 (void)WasInserted;
1065 assert(WasInserted && "Expected registers to be unique case-insensitively");
1066 }
1067}
1068
1069bool MIParser::getRegisterByName(StringRef RegName, unsigned &Reg) {
1070 initNames2Regs();
1071 auto RegInfo = Names2Regs.find(RegName);
1072 if (RegInfo == Names2Regs.end())
1073 return true;
1074 Reg = RegInfo->getValue();
1075 return false;
1076}
1077
Alex Lorenz8f6f4282015-06-29 16:57:06 +00001078void MIParser::initNames2RegMasks() {
1079 if (!Names2RegMasks.empty())
1080 return;
1081 const auto *TRI = MF.getSubtarget().getRegisterInfo();
1082 assert(TRI && "Expected target register info");
1083 ArrayRef<const uint32_t *> RegMasks = TRI->getRegMasks();
1084 ArrayRef<const char *> RegMaskNames = TRI->getRegMaskNames();
1085 assert(RegMasks.size() == RegMaskNames.size());
1086 for (size_t I = 0, E = RegMasks.size(); I < E; ++I)
1087 Names2RegMasks.insert(
1088 std::make_pair(StringRef(RegMaskNames[I]).lower(), RegMasks[I]));
1089}
1090
1091const uint32_t *MIParser::getRegMask(StringRef Identifier) {
1092 initNames2RegMasks();
1093 auto RegMaskInfo = Names2RegMasks.find(Identifier);
1094 if (RegMaskInfo == Names2RegMasks.end())
1095 return nullptr;
1096 return RegMaskInfo->getValue();
1097}
1098
Alex Lorenz2eacca82015-07-13 23:24:34 +00001099void MIParser::initNames2SubRegIndices() {
1100 if (!Names2SubRegIndices.empty())
1101 return;
1102 const TargetRegisterInfo *TRI = MF.getSubtarget().getRegisterInfo();
1103 for (unsigned I = 1, E = TRI->getNumSubRegIndices(); I < E; ++I)
1104 Names2SubRegIndices.insert(
1105 std::make_pair(StringRef(TRI->getSubRegIndexName(I)).lower(), I));
1106}
1107
1108unsigned MIParser::getSubRegIndex(StringRef Name) {
1109 initNames2SubRegIndices();
1110 auto SubRegInfo = Names2SubRegIndices.find(Name);
1111 if (SubRegInfo == Names2SubRegIndices.end())
1112 return 0;
1113 return SubRegInfo->getValue();
1114}
1115
Alex Lorenz8a1915b2015-07-27 22:42:41 +00001116void MIParser::initSlots2BasicBlocks() {
1117 if (!Slots2BasicBlocks.empty())
1118 return;
1119 const auto &F = *MF.getFunction();
1120 ModuleSlotTracker MST(F.getParent());
1121 MST.incorporateFunction(F);
1122 for (auto &BB : F) {
1123 if (BB.hasName())
1124 continue;
1125 int Slot = MST.getLocalSlot(&BB);
1126 if (Slot == -1)
1127 continue;
1128 Slots2BasicBlocks.insert(std::make_pair(unsigned(Slot), &BB));
1129 }
1130}
1131
1132const BasicBlock *MIParser::getIRBlock(unsigned Slot) {
1133 initSlots2BasicBlocks();
1134 auto BlockInfo = Slots2BasicBlocks.find(Slot);
1135 if (BlockInfo == Slots2BasicBlocks.end())
1136 return nullptr;
1137 return BlockInfo->second;
1138}
1139
Alex Lorenzef5c1962015-07-28 23:02:45 +00001140void MIParser::initNames2TargetIndices() {
1141 if (!Names2TargetIndices.empty())
1142 return;
1143 const auto *TII = MF.getSubtarget().getInstrInfo();
1144 assert(TII && "Expected target instruction info");
1145 auto Indices = TII->getSerializableTargetIndices();
1146 for (const auto &I : Indices)
1147 Names2TargetIndices.insert(std::make_pair(StringRef(I.second), I.first));
1148}
1149
1150bool MIParser::getTargetIndex(StringRef Name, int &Index) {
1151 initNames2TargetIndices();
1152 auto IndexInfo = Names2TargetIndices.find(Name);
1153 if (IndexInfo == Names2TargetIndices.end())
1154 return true;
1155 Index = IndexInfo->second;
1156 return false;
1157}
1158
Alex Lorenz7a503fa2015-07-07 17:46:43 +00001159bool llvm::parseMachineInstr(MachineInstr *&MI, SourceMgr &SM,
1160 MachineFunction &MF, StringRef Src,
1161 const PerFunctionMIParsingState &PFS,
1162 const SlotMapping &IRSlots, SMDiagnostic &Error) {
1163 return MIParser(SM, MF, Error, Src, PFS, IRSlots).parse(MI);
Alex Lorenz8e0a1b42015-06-22 17:02:30 +00001164}
Alex Lorenzf09df002015-06-30 18:16:42 +00001165
Alex Lorenz7a503fa2015-07-07 17:46:43 +00001166bool llvm::parseMBBReference(MachineBasicBlock *&MBB, SourceMgr &SM,
1167 MachineFunction &MF, StringRef Src,
1168 const PerFunctionMIParsingState &PFS,
1169 const SlotMapping &IRSlots, SMDiagnostic &Error) {
Alex Lorenz1ea60892015-07-27 20:29:27 +00001170 return MIParser(SM, MF, Error, Src, PFS, IRSlots).parseStandaloneMBB(MBB);
Alex Lorenzf09df002015-06-30 18:16:42 +00001171}
Alex Lorenz9fab3702015-07-14 21:24:41 +00001172
1173bool llvm::parseNamedRegisterReference(unsigned &Reg, SourceMgr &SM,
1174 MachineFunction &MF, StringRef Src,
1175 const PerFunctionMIParsingState &PFS,
1176 const SlotMapping &IRSlots,
1177 SMDiagnostic &Error) {
Alex Lorenz1ea60892015-07-27 20:29:27 +00001178 return MIParser(SM, MF, Error, Src, PFS, IRSlots)
1179 .parseStandaloneNamedRegister(Reg);
Alex Lorenz9fab3702015-07-14 21:24:41 +00001180}
Alex Lorenz12045a42015-07-27 17:42:45 +00001181
1182bool llvm::parseVirtualRegisterReference(unsigned &Reg, SourceMgr &SM,
1183 MachineFunction &MF, StringRef Src,
1184 const PerFunctionMIParsingState &PFS,
1185 const SlotMapping &IRSlots,
1186 SMDiagnostic &Error) {
1187 return MIParser(SM, MF, Error, Src, PFS, IRSlots)
1188 .parseStandaloneVirtualRegister(Reg);
1189}
Alex Lorenz8a1915b2015-07-27 22:42:41 +00001190
1191bool llvm::parseIRBlockReference(const BasicBlock *&BB, SourceMgr &SM,
1192 MachineFunction &MF, StringRef Src,
1193 const PerFunctionMIParsingState &PFS,
1194 const SlotMapping &IRSlots,
1195 SMDiagnostic &Error) {
1196 return MIParser(SM, MF, Error, Src, PFS, IRSlots)
1197 .parseStandaloneIRBlockReference(BB);
1198}