diff --git a/mlir/tools/mlir-tblgen/OpFormatGen.cpp b/mlir/tools/mlir-tblgen/OpFormatGen.cpp --- a/mlir/tools/mlir-tblgen/OpFormatGen.cpp +++ b/mlir/tools/mlir-tblgen/OpFormatGen.cpp @@ -1057,7 +1057,8 @@ Token emitError(llvm::SMLoc loc, const Twine &msg); Token emitError(const char *loc, const Twine &msg); - Token emitErrorAndNote(llvm::SMLoc loc, const Twine &msg, const Twine ¬e); + Token emitErrorAndNote(Operator &op, llvm::SMLoc loc, + const Twine &msg, const Twine ¬e); private: Token formToken(Token::Kind kind, const char *tokStart) { @@ -1087,9 +1088,13 @@ srcMgr.PrintMessage(loc, llvm::SourceMgr::DK_Error, msg); return formToken(Token::error, loc.getPointer()); } -Token FormatLexer::emitErrorAndNote(llvm::SMLoc loc, - const Twine &msg, - const Twine ¬e) { +Token FormatLexer::emitErrorAndNote(Operator &op, + llvm::SMLoc loc, + const Twine &msg, + const Twine ¬e) { + llvm::SrcMgr.PrintMessage(op.getLoc()[0], + llvm::SourceMgr::DK_Note, + "here"); srcMgr.PrintMessage(loc, llvm::SourceMgr::DK_Error, msg); srcMgr.PrintMessage(loc, llvm::SourceMgr::DK_Note, note); return formToken(Token::error, loc.getPointer()); @@ -1311,10 +1316,11 @@ lexer.emitError(loc, msg); return failure(); } - LogicalResult emitErrorAndNote(llvm::SMLoc loc, + LogicalResult emitErrorAndNote(Operator &op, + llvm::SMLoc loc, const Twine &msg, const Twine ¬e) { - lexer.emitErrorAndNote(loc, msg, note); + lexer.emitErrorAndNote(op, loc, msg, note); return failure(); } @@ -1394,7 +1400,7 @@ NamedTypeConstraint &result = op.getResult(i); Optional builder = result.constraint.getBuilderCall(); if (!builder || result.constraint.isVariadic()) { - return emitErrorAndNote(loc, + return emitErrorAndNote(op, loc, "type of result #" + Twine(i) + ", named '" + result.name + "', is not buildable and a buildable " + @@ -1418,7 +1424,7 @@ // Check that the operand itself is in the format. if (!hasAllOperands && !seenOperands.count(&operand)) { - return emitErrorAndNote(loc, "operand #" + Twine(i) + + return emitErrorAndNote(op, loc, "operand #" + Twine(i) + ", named '" + operand.name + "', not found in custom assembly format", "suggest adding a '$" + operand.name + @@ -1441,7 +1447,7 @@ // we aren't using the 'operands' directive. Optional builder = operand.constraint.getBuilderCall(); if (!builder || (hasAllOperands && operand.isVariadic())) { - return emitErrorAndNote(loc, + return emitErrorAndNote(op, loc, "type of operand #" + Twine(i) + ", named '" + operand.name + "', is not buildable and a buildable " + @@ -1461,7 +1467,7 @@ for (unsigned i = 0, e = op.getNumSuccessors(); i != e; ++i) { const NamedSuccessor &successor = op.getSuccessor(i); if (!seenSuccessors.count(&successor)) { - return emitErrorAndNote(loc, "successor #" + Twine(i) + + return emitErrorAndNote(op, loc, "successor #" + Twine(i) + ", named '" + successor.name + "', not found in custom assembly format", "suggest adding a '$" + successor.name +