[PATCH] D31606: [AsmParser] Add DiagnosticString to AsmOperands in tablegen
Oliver Stannard via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 3 07:36:43 PDT 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL314803: [AsmParser] Add DiagnosticString to AsmOperands in tablegen (authored by olista01).
Changed prior to commit:
https://reviews.llvm.org/D31606?vs=93879&id=117525#toc
Repository:
rL LLVM
https://reviews.llvm.org/D31606
Files:
llvm/trunk/include/llvm/Target/Target.td
llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
Index: llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
===================================================================
--- llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
+++ llvm/trunk/utils/TableGen/AsmMatcherEmitter.cpp
@@ -205,6 +205,9 @@
/// For custom match classes: the diagnostic kind for when the predicate fails.
std::string DiagnosticType;
+ /// For custom match classes: the diagnostic string for when the predicate fails.
+ std::string DiagnosticString;
+
/// Is this operand optional and not always required.
bool IsOptional;
@@ -1357,11 +1360,17 @@
if (StringInit *SI = dyn_cast<StringInit>(PRMName))
CI->ParserMethod = SI->getValue();
- // Get the diagnostic type or leave it as empty.
- // Get the parse method name or leave it as empty.
+ // Get the diagnostic type and string or leave them as empty.
Init *DiagnosticType = Rec->getValueInit("DiagnosticType");
if (StringInit *SI = dyn_cast<StringInit>(DiagnosticType))
CI->DiagnosticType = SI->getValue();
+ Init *DiagnosticString = Rec->getValueInit("DiagnosticString");
+ if (StringInit *SI = dyn_cast<StringInit>(DiagnosticString))
+ CI->DiagnosticString = SI->getValue();
+ // If we have a DiagnosticString, we need a DiagnosticType for use within
+ // the matcher.
+ if (!CI->DiagnosticString.empty() && CI->DiagnosticType.empty())
+ CI->DiagnosticType = CI->ClassName;
Init *IsOptional = Rec->getValueInit("IsOptional");
if (BitInit *BI = dyn_cast<BitInit>(IsOptional))
@@ -2188,6 +2197,38 @@
OS << "}\n\n";
}
+/// emitMatchClassDiagStrings - Emit a function to get the diagnostic text to be
+/// used when an assembly operand does not match the expected operand class.
+static void emitOperandMatchErrorDiagStrings(AsmMatcherInfo &Info, raw_ostream &OS) {
+ // If the target does not use DiagnosticString for any operands, don't emit
+ // an unused function.
+ if (std::all_of(
+ Info.Classes.begin(), Info.Classes.end(),
+ [](const ClassInfo &CI) { return CI.DiagnosticString.empty(); }))
+ return;
+
+ OS << "static const char *getMatchKindDiag(" << Info.Target.getName()
+ << "AsmParser::" << Info.Target.getName()
+ << "MatchResultTy MatchResult) {\n";
+ OS << " switch (MatchResult) {\n";
+
+ for (const auto &CI: Info.Classes) {
+ if (!CI.DiagnosticString.empty()) {
+ assert(!CI.DiagnosticType.empty() &&
+ "DiagnosticString set without DiagnosticType");
+ OS << " case " << Info.Target.getName()
+ << "AsmParser::Match_" << CI.DiagnosticType << ":\n";
+ OS << " return \"" << CI.DiagnosticString << "\";\n";
+ }
+ }
+
+ OS << " default:\n";
+ OS << " return nullptr;\n";
+
+ OS << " }\n";
+ OS << "}\n\n";
+}
+
/// emitValidateOperandClass - Emit the function to validate an operand class.
static void emitValidateOperandClass(AsmMatcherInfo &Info,
raw_ostream &OS) {
@@ -2914,6 +2955,10 @@
// Emit the enumeration for classes which participate in matching.
emitMatchClassEnumeration(Target, Info.Classes, OS);
+ // Emit a function to get the user-visible string to describe an operand
+ // match failure in diagnostics.
+ emitOperandMatchErrorDiagStrings(Info, OS);
+
// Emit the routine to match token strings to their match class.
emitMatchTokenString(Target, Info.Classes, OS);
Index: llvm/trunk/include/llvm/Target/Target.td
===================================================================
--- llvm/trunk/include/llvm/Target/Target.td
+++ llvm/trunk/include/llvm/Target/Target.td
@@ -677,6 +677,10 @@
// diagnostic. The target AsmParser maps these codes to text.
string DiagnosticType = "";
+ /// A diagnostic message to emit when an invalid value is provided for this
+ /// operand.
+ string DiagnosticString = "";
+
/// Set to 1 if this operand is optional and not always required. Typically,
/// the AsmParser will emit an error when it finishes parsing an
/// instruction if it hasn't matched all the operands yet. However, this
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31606.117525.patch
Type: text/x-patch
Size: 4101 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171003/18cb4b2d/attachment.bin>
More information about the llvm-commits
mailing list