@@ -395,6 +395,7 @@ class MIParser {
395
395
MachineFunction &MF;
396
396
SMDiagnostic &Error;
397
397
StringRef Source, CurrentSource;
398
+ SMRange SourceRange;
398
399
MIToken Token;
399
400
PerFunctionMIParsingState &PFS;
400
401
// / Maps from slot numbers to function's unnamed basic blocks.
@@ -403,6 +404,8 @@ class MIParser {
403
404
public:
404
405
MIParser (PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
405
406
StringRef Source);
407
+ MIParser (PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
408
+ StringRef Source, SMRange SourceRange);
406
409
407
410
// / \p SkipChar gives the number of characters to skip before looking
408
411
// / for the next token.
@@ -428,6 +431,10 @@ class MIParser {
428
431
bool parseStandaloneRegister (Register &Reg);
429
432
bool parseStandaloneStackObject (int &FI);
430
433
bool parseStandaloneMDNode (MDNode *&Node);
434
+ bool parseMachineMetadata ();
435
+ bool parseMDTuple (MDNode *&MD, bool IsDistinct);
436
+ bool parseMDNodeVector (SmallVectorImpl<Metadata *> &Elts);
437
+ bool parseMetadata (Metadata *&MD);
431
438
432
439
bool
433
440
parseBasicBlockDefinition (DenseMap<unsigned , MachineBasicBlock *> &MBBSlots);
@@ -550,6 +557,10 @@ class MIParser {
550
557
// / parseStringConstant
551
558
// / ::= StringConstant
552
559
bool parseStringConstant (std::string &Result);
560
+
561
+ // / Map the location in the MI string to the corresponding location specified
562
+ // / in `SourceRange`.
563
+ SMLoc mapSMLoc (StringRef::iterator Loc);
553
564
};
554
565
555
566
} // end anonymous namespace
@@ -559,6 +570,11 @@ MIParser::MIParser(PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
559
570
: MF(PFS.MF), Error(Error), Source(Source), CurrentSource(Source), PFS(PFS)
560
571
{}
561
572
573
+ MIParser::MIParser (PerFunctionMIParsingState &PFS, SMDiagnostic &Error,
574
+ StringRef Source, SMRange SourceRange)
575
+ : MF(PFS.MF), Error(Error), Source(Source), CurrentSource(Source),
576
+ SourceRange(SourceRange), PFS(PFS) {}
577
+
562
578
void MIParser::lex (unsigned SkipChar) {
563
579
CurrentSource = lexMIToken (
564
580
CurrentSource.slice (SkipChar, StringRef::npos), Token,
@@ -584,6 +600,13 @@ bool MIParser::error(StringRef::iterator Loc, const Twine &Msg) {
584
600
return true ;
585
601
}
586
602
603
+ SMLoc MIParser::mapSMLoc (StringRef::iterator Loc) {
604
+ assert (SourceRange.isValid () && " Invalid source range" );
605
+ assert (Loc >= Source.data () && Loc <= (Source.data () + Source.size ()));
606
+ return SMLoc::getFromPointer (SourceRange.Start .getPointer () +
607
+ (Loc - Source.data ()));
608
+ }
609
+
587
610
typedef function_ref<bool (StringRef::iterator Loc, const Twine &)>
588
611
ErrorCallbackType;
589
612
@@ -1172,6 +1195,130 @@ bool MIParser::parseStandaloneMDNode(MDNode *&Node) {
1172
1195
return false ;
1173
1196
}
1174
1197
1198
+ bool MIParser::parseMachineMetadata () {
1199
+ lex ();
1200
+ if (Token.isNot (MIToken::exclaim))
1201
+ return error (" expected a metadata node" );
1202
+
1203
+ lex ();
1204
+ if (Token.isNot (MIToken::IntegerLiteral) || Token.integerValue ().isSigned ())
1205
+ return error (" expected metadata id after '!'" );
1206
+ unsigned ID = 0 ;
1207
+ if (getUnsigned (ID))
1208
+ return true ;
1209
+ lex ();
1210
+ if (expectAndConsume (MIToken::equal))
1211
+ return true ;
1212
+ bool IsDistinct = Token.is (MIToken::kw_distinct);
1213
+ if (IsDistinct)
1214
+ lex ();
1215
+ if (Token.isNot (MIToken::exclaim))
1216
+ return error (" expected a metadata node" );
1217
+ lex ();
1218
+
1219
+ MDNode *MD;
1220
+ if (parseMDTuple (MD, IsDistinct))
1221
+ return true ;
1222
+
1223
+ auto FI = PFS.MachineForwardRefMDNodes .find (ID);
1224
+ if (FI != PFS.MachineForwardRefMDNodes .end ()) {
1225
+ FI->second .first ->replaceAllUsesWith (MD);
1226
+ PFS.MachineForwardRefMDNodes .erase (FI);
1227
+
1228
+ assert (PFS.MachineMetadataNodes [ID] == MD && " Tracking VH didn't work" );
1229
+ } else {
1230
+ if (PFS.MachineMetadataNodes .count (ID))
1231
+ return error (" Metadata id is already used" );
1232
+ PFS.MachineMetadataNodes [ID].reset (MD);
1233
+ }
1234
+
1235
+ return false ;
1236
+ }
1237
+
1238
+ bool MIParser::parseMDTuple (MDNode *&MD, bool IsDistinct) {
1239
+ SmallVector<Metadata *, 16 > Elts;
1240
+ if (parseMDNodeVector (Elts))
1241
+ return true ;
1242
+ MD = (IsDistinct ? MDTuple::getDistinct
1243
+ : MDTuple::get)(MF.getFunction ().getContext (), Elts);
1244
+ return false ;
1245
+ }
1246
+
1247
+ bool MIParser::parseMDNodeVector (SmallVectorImpl<Metadata *> &Elts) {
1248
+ if (Token.isNot (MIToken::lbrace))
1249
+ return error (" expected '{' here" );
1250
+ lex ();
1251
+
1252
+ if (Token.is (MIToken::rbrace)) {
1253
+ lex ();
1254
+ return false ;
1255
+ }
1256
+
1257
+ do {
1258
+ Metadata *MD;
1259
+ if (parseMetadata (MD))
1260
+ return true ;
1261
+
1262
+ Elts.push_back (MD);
1263
+
1264
+ if (Token.isNot (MIToken::comma))
1265
+ break ;
1266
+ lex ();
1267
+ } while (true );
1268
+
1269
+ if (Token.isNot (MIToken::rbrace))
1270
+ return error (" expected end of metadata node" );
1271
+ lex ();
1272
+
1273
+ return false ;
1274
+ }
1275
+
1276
+ // ::= !42
1277
+ // ::= !"string"
1278
+ bool MIParser::parseMetadata (Metadata *&MD) {
1279
+ if (Token.isNot (MIToken::exclaim))
1280
+ return error (" expected '!' here" );
1281
+ lex ();
1282
+
1283
+ if (Token.is (MIToken::StringConstant)) {
1284
+ std::string Str;
1285
+ if (parseStringConstant (Str))
1286
+ return true ;
1287
+ MD = MDString::get (MF.getFunction ().getContext (), Str);
1288
+ return false ;
1289
+ }
1290
+
1291
+ if (Token.isNot (MIToken::IntegerLiteral) || Token.integerValue ().isSigned ())
1292
+ return error (" expected metadata id after '!'" );
1293
+
1294
+ SMLoc Loc = mapSMLoc (Token.location ());
1295
+
1296
+ unsigned ID = 0 ;
1297
+ if (getUnsigned (ID))
1298
+ return true ;
1299
+ lex ();
1300
+
1301
+ auto NodeInfo = PFS.IRSlots .MetadataNodes .find (ID);
1302
+ if (NodeInfo != PFS.IRSlots .MetadataNodes .end ()) {
1303
+ MD = NodeInfo->second .get ();
1304
+ return false ;
1305
+ }
1306
+ // Check machine metadata.
1307
+ NodeInfo = PFS.MachineMetadataNodes .find (ID);
1308
+ if (NodeInfo != PFS.MachineMetadataNodes .end ()) {
1309
+ MD = NodeInfo->second .get ();
1310
+ return false ;
1311
+ }
1312
+ // Forward reference.
1313
+ auto &FwdRef = PFS.MachineForwardRefMDNodes [ID];
1314
+ FwdRef = std::make_pair (
1315
+ MDTuple::getTemporary (MF.getFunction ().getContext (), None), Loc);
1316
+ PFS.MachineMetadataNodes [ID].reset (FwdRef.first .get ());
1317
+ MD = FwdRef.first .get ();
1318
+
1319
+ return false ;
1320
+ }
1321
+
1175
1322
static const char *printImplicitRegisterFlag (const MachineOperand &MO) {
1176
1323
assert (MO.isImplicit ());
1177
1324
return MO.isDef () ? " implicit-def" : " implicit" ;
@@ -2014,8 +2161,11 @@ bool MIParser::parseMDNode(MDNode *&Node) {
2014
2161
if (getUnsigned (ID))
2015
2162
return true ;
2016
2163
auto NodeInfo = PFS.IRSlots .MetadataNodes .find (ID);
2017
- if (NodeInfo == PFS.IRSlots .MetadataNodes .end ())
2018
- return error (Loc, " use of undefined metadata '!" + Twine (ID) + " '" );
2164
+ if (NodeInfo == PFS.IRSlots .MetadataNodes .end ()) {
2165
+ NodeInfo = PFS.MachineMetadataNodes .find (ID);
2166
+ if (NodeInfo == PFS.MachineMetadataNodes .end ())
2167
+ return error (Loc, " use of undefined metadata '!" + Twine (ID) + " '" );
2168
+ }
2019
2169
lex ();
2020
2170
Node = NodeInfo->second .get ();
2021
2171
return false ;
@@ -3281,6 +3431,11 @@ bool llvm::parseMDNode(PerFunctionMIParsingState &PFS,
3281
3431
return MIParser (PFS, Error, Src).parseStandaloneMDNode (Node);
3282
3432
}
3283
3433
3434
+ bool llvm::parseMachineMetadata (PerFunctionMIParsingState &PFS, StringRef Src,
3435
+ SMRange SrcRange, SMDiagnostic &Error) {
3436
+ return MIParser (PFS, Error, Src, SrcRange).parseMachineMetadata ();
3437
+ }
3438
+
3284
3439
bool MIRFormatter::parseIRValue (StringRef Src, MachineFunction &MF,
3285
3440
PerFunctionMIParsingState &PFS, const Value *&V,
3286
3441
ErrorCallbackType ErrorCallback) {
0 commit comments