MLIR  22.0.0git
Trait.cpp
Go to the documentation of this file.
1 //===- Trait.cpp ----------------------------------------------------------===//
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 // Trait wrapper to simplify using TableGen Record defining a MLIR Trait.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "mlir/TableGen/Trait.h"
16 #include "llvm/TableGen/Error.h"
17 #include "llvm/TableGen/Record.h"
18 
19 using namespace mlir;
20 using namespace mlir::tblgen;
21 
22 //===----------------------------------------------------------------------===//
23 // Trait
24 //===----------------------------------------------------------------------===//
25 
26 Trait Trait::create(const llvm::Init *init) {
27  auto *def = cast<llvm::DefInit>(init)->getDef();
28  if (def->isSubClassOf("PredTrait"))
29  return Trait(Kind::Pred, def);
30  if (def->isSubClassOf("GenInternalTrait"))
31  return Trait(Kind::Internal, def);
32  if (def->isSubClassOf("InterfaceTrait"))
33  return Trait(Kind::Interface, def);
34  assert(def->isSubClassOf("NativeTrait"));
35  return Trait(Kind::Native, def);
36 }
37 
38 Trait::Trait(Kind kind, const llvm::Record *def) : def(def), kind(kind) {}
39 
40 //===----------------------------------------------------------------------===//
41 // NativeTrait
42 //===----------------------------------------------------------------------===//
43 
45  llvm::StringRef trait = def->getValueAsString("trait");
46  llvm::StringRef cppNamespace = def->getValueAsString("cppNamespace");
47  return cppNamespace.empty() ? trait.str()
48  : (cppNamespace + "::" + trait).str();
49 }
50 
52  return def->isSubClassOf("StructuralOpTrait");
53 }
54 
56  return def->getValueAsString("extraConcreteClassDeclaration");
57 }
58 
60  return def->getValueAsString("extraConcreteClassDefinition");
61 }
62 
63 //===----------------------------------------------------------------------===//
64 // InternalTrait
65 //===----------------------------------------------------------------------===//
66 
68  return def->getValueAsString("trait");
69 }
70 
71 //===----------------------------------------------------------------------===//
72 // PredTrait
73 //===----------------------------------------------------------------------===//
74 
75 std::string PredTrait::getPredTemplate() const {
76  auto pred = Pred(def->getValueInit("predicate"));
77  return pred.getCondition();
78 }
79 
80 llvm::StringRef PredTrait::getSummary() const {
81  return def->getValueAsString("summary");
82 }
83 
84 //===----------------------------------------------------------------------===//
85 // InterfaceTrait
86 //===----------------------------------------------------------------------===//
87 
89 
91  llvm::StringRef trait = def->getValueAsString("trait");
92  llvm::StringRef cppNamespace = def->getValueAsString("cppNamespace");
93  return cppNamespace.empty() ? trait.str()
94  : (cppNamespace + "::" + trait).str();
95 }
96 
98  return def->isSubClassOf("DeclareInterfaceMethods");
99 }
100 
101 std::vector<StringRef> InterfaceTrait::getAlwaysDeclaredMethods() const {
102  return def->getValueAsListOfStrings("alwaysOverriddenMethods");
103 }
union mlir::linalg::@1242::ArityGroupAndKind::Kind kind
std::vector< StringRef > getAlwaysDeclaredMethods() const
Definition: Trait.cpp:101
std::string getFullyQualifiedTraitName() const
Definition: Trait.cpp:90
Interface getInterface() const
Definition: Trait.cpp:88
bool shouldDeclareMethods() const
Definition: Trait.cpp:97
StringRef getFullyQualifiedTraitName() const
Definition: Trait.cpp:67
bool isStructuralOpTrait() const
Definition: Trait.cpp:51
std::string getFullyQualifiedTraitName() const
Definition: Trait.cpp:44
StringRef getExtraConcreteClassDeclaration() const
Definition: Trait.cpp:55
StringRef getExtraConcreteClassDefinition() const
Definition: Trait.cpp:59
StringRef getSummary() const
Definition: Trait.cpp:80
std::string getPredTemplate() const
Definition: Trait.cpp:75
const llvm::Record * def
Definition: Trait.h:58
Trait(Kind kind, const llvm::Record *def)
Definition: Trait.cpp:38
static Trait create(const llvm::Init *init)
Definition: Trait.cpp:26
Include the generated interface declarations.