1 //===- Constraint.cpp - Constraint class ----------------------------------===//
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 // Constraint wrapper to simplify using TableGen Record for constraints.
10 //
11 //===----------------------------------------------------------------------===//
12
13 #include "mlir/TableGen/Constraint.h"
14 #include "llvm/TableGen/Record.h"
15
16 using namespace mlir::tblgen;
17
Constraint(const llvm::Record * record)18 Constraint::Constraint(const llvm::Record *record)
19 : def(record), kind(CK_Uncategorized) {
20 // Look through OpVariable's to their constraint.
21 if (def->isSubClassOf("OpVariable"))
22 def = def->getValueAsDef("constraint");
23 if (def->isSubClassOf("TypeConstraint")) {
24 kind = CK_Type;
25 } else if (def->isSubClassOf("AttrConstraint")) {
26 kind = CK_Attr;
27 } else if (def->isSubClassOf("RegionConstraint")) {
28 kind = CK_Region;
29 } else if (def->isSubClassOf("SuccessorConstraint")) {
30 kind = CK_Successor;
31 } else {
32 assert(def->isSubClassOf("Constraint"));
33 }
34 }
35
Constraint(Kind kind,const llvm::Record * record)36 Constraint::Constraint(Kind kind, const llvm::Record *record)
37 : def(record), kind(kind) {
38 // Look through OpVariable's to their constraint.
39 if (def->isSubClassOf("OpVariable"))
40 def = def->getValueAsDef("constraint");
41 }
42
getPredicate() const43 Pred Constraint::getPredicate() const {
44 auto *val = def->getValue("predicate");
45
46 // If no predicate is specified, then return the null predicate (which
47 // corresponds to true).
48 if (!val)
49 return Pred();
50
51 const auto *pred = dyn_cast<llvm::DefInit>(val->getValue());
52 return Pred(pred);
53 }
54
getConditionTemplate() const55 std::string Constraint::getConditionTemplate() const {
56 return getPredicate().getCondition();
57 }
58
getDescription() const59 llvm::StringRef Constraint::getDescription() const {
60 auto doc = def->getValueAsString("description");
61 if (doc.empty())
62 return def->getName();
63 return doc;
64 }
65
AppliedConstraint(Constraint && constraint,llvm::StringRef self,std::vector<std::string> && entities)66 AppliedConstraint::AppliedConstraint(Constraint &&constraint,
67 llvm::StringRef self,
68 std::vector<std::string> &&entities)
69 : constraint(constraint), self(std::string(self)),
70 entities(std::move(entities)) {}
71