mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-26 17:57:07 +00:00
9445b39673
This change gives explicit order of verifier execution and adds `hasRegionVerifier` and `verifyWithRegions` to increase the granularity of verifier classification. The orders are as below, 1. InternalOpTrait will be verified first, they can be run independently. 2. `verifyInvariants` which is constructed by ODS, it verifies the type, attributes, .etc. 3. Other Traits/Interfaces that have marked their verifier as `verifyTrait` or `verifyWithRegions=0`. 4. Custom verifier which is defined in the op and has marked `hasVerifier=1` If an operation has regions, then it may have the second phase, 5. Traits/Interfaces that have marked their verifier as `verifyRegionTrait` or `verifyWithRegions=1`. This implies the verifier needs to access the operations in its regions. 6. Custom verifier which is defined in the op and has marked `hasRegionVerifier=1` Note that the second phase will be run after the operations in the region are verified. Based on the verification order, you will be able to avoid verifying duplicate things. Reviewed By: Mogball Differential Revision: https://reviews.llvm.org/D116789
98 lines
3.5 KiB
C++
98 lines
3.5 KiB
C++
//===- Trait.cpp ----------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Trait wrapper to simplify using TableGen Record defining a MLIR Trait.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/TableGen/Trait.h"
|
|
#include "mlir/TableGen/Interfaces.h"
|
|
#include "mlir/TableGen/Predicate.h"
|
|
#include "llvm/ADT/StringExtras.h"
|
|
#include "llvm/Support/FormatVariadic.h"
|
|
#include "llvm/TableGen/Error.h"
|
|
#include "llvm/TableGen/Record.h"
|
|
|
|
using namespace mlir;
|
|
using namespace mlir::tblgen;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Trait
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Trait Trait::create(const llvm::Init *init) {
|
|
auto *def = cast<llvm::DefInit>(init)->getDef();
|
|
if (def->isSubClassOf("PredTrait"))
|
|
return Trait(Kind::Pred, def);
|
|
if (def->isSubClassOf("GenInternalTrait"))
|
|
return Trait(Kind::Internal, def);
|
|
if (def->isSubClassOf("InterfaceTrait"))
|
|
return Trait(Kind::Interface, def);
|
|
assert(def->isSubClassOf("NativeTrait"));
|
|
return Trait(Kind::Native, def);
|
|
}
|
|
|
|
Trait::Trait(Kind kind, const llvm::Record *def) : def(def), kind(kind) {}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// NativeTrait
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
std::string NativeTrait::getFullyQualifiedTraitName() const {
|
|
llvm::StringRef trait = def->getValueAsString("trait");
|
|
llvm::StringRef cppNamespace = def->getValueAsString("cppNamespace");
|
|
return cppNamespace.empty() ? trait.str()
|
|
: (cppNamespace + "::" + trait).str();
|
|
}
|
|
|
|
bool NativeTrait::isStructuralOpTrait() const {
|
|
return def->isSubClassOf("StructuralOpTrait");
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// InternalTrait
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
llvm::StringRef InternalTrait::getFullyQualifiedTraitName() const {
|
|
return def->getValueAsString("trait");
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// PredTrait
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
std::string PredTrait::getPredTemplate() const {
|
|
auto pred = Pred(def->getValueInit("predicate"));
|
|
return pred.getCondition();
|
|
}
|
|
|
|
llvm::StringRef PredTrait::getSummary() const {
|
|
return def->getValueAsString("summary");
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// InterfaceTrait
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
Interface InterfaceTrait::getInterface() const { return Interface(def); }
|
|
|
|
std::string InterfaceTrait::getFullyQualifiedTraitName() const {
|
|
llvm::StringRef trait = def->getValueAsString("trait");
|
|
llvm::StringRef cppNamespace = def->getValueAsString("cppNamespace");
|
|
return cppNamespace.empty() ? trait.str()
|
|
: (cppNamespace + "::" + trait).str();
|
|
}
|
|
|
|
bool InterfaceTrait::shouldDeclareMethods() const {
|
|
return def->isSubClassOf("DeclareInterfaceMethods");
|
|
}
|
|
|
|
std::vector<StringRef> InterfaceTrait::getAlwaysDeclaredMethods() const {
|
|
return def->getValueAsListOfStrings("alwaysOverriddenMethods");
|
|
}
|