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
19using namespace mlir;
20using namespace mlir::tblgen;
21
22//===----------------------------------------------------------------------===//
23// Trait
24//===----------------------------------------------------------------------===//
25
26Trait 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
38Trait::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
75std::string PredTrait::getPredTemplate() const {
76 auto pred = Pred(def->getValueInit("predicate"));
77 return pred.getCondition();
78}
79
80llvm::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
101std::vector<StringRef> InterfaceTrait::getAlwaysDeclaredMethods() const {
102 return def->getValueAsListOfStrings("alwaysOverriddenMethods");
103}
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.