blob: 9bbc84e37e5a338cf9dc82e214201df3e681b3e4 [file] [log] [blame]
//===- OperationSet.cpp - OperationSet implementation ---------------------===//
//
// Copyright 2019 The MLIR Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// =============================================================================
#include "mlir/IR/OperationSet.h"
#include "mlir/IR/OpDefinition.h"
#include "mlir/IR/OpImplementation.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/raw_ostream.h"
using namespace mlir;
using llvm::StringMap;
OpAsmParser::~OpAsmParser() {}
// The fallback for the printer is to reject the short form.
OpAsmParserResult OpBaseState::parse(OpAsmParser *parser) {
parser->emitError(parser->getNameLoc(), "has no concise form");
return {};
}
// The fallback for the printer is to print it the longhand form.
void OpBaseState::print(OpAsmPrinter *p) const {
p->printDefaultOp(getOperation());
}
static StringMap<AbstractOperation> &getImpl(void *pImpl) {
return *static_cast<StringMap<AbstractOperation> *>(pImpl);
}
OperationSet::OperationSet() {
pImpl = new StringMap<AbstractOperation>();
}
OperationSet::~OperationSet() {
delete &getImpl(pImpl);
}
void OperationSet::addOperation(StringRef prefix, AbstractOperation opInfo) {
assert(opInfo.name.startswith(prefix) && "op name doesn't start with prefix");
if (!getImpl(pImpl).insert({opInfo.name, opInfo}).second) {
llvm::errs() << "error: ops named '" << opInfo.name
<< "' is already registered.\n";
abort();
}
}
/// Look up the specified operation in the operation set and return a pointer
/// to it if present. Otherwise, return a null pointer.
const AbstractOperation *OperationSet::lookup(StringRef opName) const {
auto &map = getImpl(pImpl);
auto it = map.find(opName);
if (it != map.end())
return &it->second;
return nullptr;
}