15#include <mlir/IR/Diagnostics.h>
16#include <mlir/Interfaces/CallInterfaces.h>
18#include <llvm/ADT/STLFunctionalExtras.h>
43llvm::SmallVector<mlir::StringRef>
getNames(mlir::SymbolRefAttr ref);
44llvm::SmallVector<mlir::FlatSymbolRefAttr>
getPieces(mlir::SymbolRefAttr ref);
47inline mlir::FlatSymbolRefAttr
49 return mlir::FlatSymbolRefAttr::get(mlir::StringAttr::get(context, twine));
53inline mlir::SymbolRefAttr
asSymbolRefAttr(mlir::StringAttr root, mlir::SymbolRefAttr tail) {
54 return mlir::SymbolRefAttr::get(root,
getPieces(tail));
58inline mlir::SymbolRefAttr
asSymbolRefAttr(llvm::ArrayRef<mlir::FlatSymbolRefAttr> path) {
59 return mlir::SymbolRefAttr::get(path.front().getAttr(), path.drop_front());
63inline mlir::SymbolRefAttr
asSymbolRefAttr(
const std::vector<mlir::FlatSymbolRefAttr> &path) {
74 return mlir::SymbolRefAttr::get(
75 symbol.getRootReference(), symbol.getNestedReferences().drop_back()
80mlir::SymbolRefAttr
replaceLeaf(mlir::SymbolRefAttr orig, mlir::FlatSymbolRefAttr newLeaf);
81inline mlir::SymbolRefAttr
replaceLeaf(mlir::SymbolRefAttr orig, mlir::StringAttr newLeaf) {
82 return replaceLeaf(orig, mlir::FlatSymbolRefAttr::get(newLeaf));
84inline mlir::SymbolRefAttr
replaceLeaf(mlir::SymbolRefAttr orig,
const mlir::Twine &newLeaf) {
85 return replaceLeaf(orig, mlir::StringAttr::get(orig.getContext(), newLeaf));
89mlir::SymbolRefAttr
appendLeaf(mlir::SymbolRefAttr orig, mlir::FlatSymbolRefAttr newLeaf);
90inline mlir::SymbolRefAttr
appendLeaf(mlir::SymbolRefAttr orig, mlir::StringAttr newLeaf) {
91 return appendLeaf(orig, mlir::FlatSymbolRefAttr::get(newLeaf));
93inline mlir::SymbolRefAttr
appendLeaf(mlir::SymbolRefAttr orig,
const mlir::Twine &newLeaf) {
94 return appendLeaf(orig, mlir::StringAttr::get(orig.getContext(), newLeaf));
99mlir::SymbolRefAttr
appendLeafName(mlir::SymbolRefAttr orig,
const mlir::Twine &newLeafSuffix);
104mlir::FailureOr<mlir::SymbolRefAttr>
106mlir::FailureOr<mlir::SymbolRefAttr>
108mlir::FailureOr<mlir::SymbolRefAttr>
110mlir::FailureOr<mlir::SymbolRefAttr>
123 mlir::SymbolOpInterface symbol, mlir::ModuleOp ancestor,
124 llvm::function_ref<mlir::InFlightDiagnostic()> emitError =
nullptr
130inline mlir::SymbolRefAttr
132 if (!requireParent && symbol.getOperation()->getParentOp() ==
nullptr) {
133 return mlir::SymbolRefAttr::get(symbol.getOperation());
136 assert(mlir::succeeded(res));
143mlir::FailureOr<mlir::SymbolRefAttr>
145mlir::FailureOr<mlir::SymbolRefAttr>
147mlir::FailureOr<mlir::SymbolRefAttr>
149mlir::FailureOr<mlir::SymbolRefAttr>
162mlir::FailureOr<SymbolLookupResult<llzk::component::StructDefOp>>
169 mlir::SymbolTableCollection &tables, mlir::Operation *lookupFrom,
170 mlir::StringRef symbolPath = {}
179inline mlir::FailureOr<SymbolLookupResult<T>>
180resolveCallable(mlir::SymbolTableCollection &symbolTable, mlir::CallOpInterface call) {
181 mlir::CallInterfaceCallable callable = call.getCallableForCallee();
182 if (
auto symbolVal = llvm::dyn_cast<mlir::Value>(callable)) {
190 auto symbolRef = llvm::cast<mlir::SymbolRefAttr>(callable);
191 mlir::Operation *op = symbolTable.lookupNearestSymbolFrom(call.getOperation(), symbolRef);
205inline mlir::FailureOr<SymbolLookupResult<T>>
207 mlir::CallInterfaceCallable callable = call.getCallableForCallee();
208 if (
auto symbolVal = llvm::dyn_cast<mlir::Value>(callable)) {
211 return mlir::failure();
216 auto symbolRef = llvm::cast<mlir::SymbolRefAttr>(callable);
217 if (mlir::Operation *op = symbolTable.lookupNearestSymbolFrom(call.getOperation(), symbolRef)) {
220 return mlir::failure();
225 symbolTable, symbolRef, call.getOperation(),
false
230inline mlir::FailureOr<SymbolLookupResult<T>>
resolveCallable(mlir::CallOpInterface call) {
231 mlir::SymbolTableCollection symbolTable;
240mlir::FailureOr<polymorphic::TemplateOp>
246 mlir::SymbolTableCollection &tables, mlir::SymbolRefAttr symbol, mlir::Operation *origin
258 mlir::Operation *origin, mlir::ArrayAttr explicitParams,
259 llvm::iterator_range<mlir::Region::op_iterator<polymorphic::TemplateParamOp>> targetParamDefs
271 mlir::Operation *origin, mlir::ArrayAttr explicitParams,
272 llvm::iterator_range<mlir::Region::op_iterator<polymorphic::TemplateParamOp>> targetParamDefs,
279 mlir::SymbolTableCollection &tables, mlir::SymbolRefAttr param, mlir::Type structOrArrayType,
280 mlir::Operation *origin, std::optional<mlir::Type> requiredParamType = std::nullopt
287 mlir::SymbolTableCollection &tables, mlir::ArrayRef<mlir::Attribute> tyParams,
288 mlir::Type structOrArrayType, mlir::Operation *origin,
289 std::optional<mlir::Type> requiredParamType = std::nullopt
302template <std::ranges::input_range Range>
304 mlir::SymbolTableCollection &tables, mlir::Operation *origin,
const Range &types
308 for (
const auto &t : types) {
311 return mlir::LogicalResult::failure(failed);
Apache License January AND DISTRIBUTION Definitions License shall mean the terms and conditions for and distribution as defined by Sections through of this document Licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the License Legal Entity shall mean the union of the acting entity and all other entities that control are controlled by or are under common control with that entity For the purposes of this definition control direct or to cause the direction or management of such whether by contract or including but not limited to software source documentation and configuration files Object form shall mean any form resulting from mechanical transformation or translation of a Source including but not limited to compiled object generated and conversions to other media types Work shall mean the work of whether in Source or Object made available under the as indicated by a copyright notice that is included in or attached to the whether in Source or Object that is based or other modifications as a an original work of authorship For the purposes of this Derivative Works shall not include works that remain separable from
This file defines methods symbol lookup across LLZK operations and included files.
mlir::SymbolRefAttr getPrefixAsSymbolRefAttr(mlir::SymbolRefAttr symbol)
Return SymbolRefAttr like the one given but with the leaf/final element removed.
SymbolRefAttr appendLeafName(SymbolRefAttr orig, const Twine &newLeafSuffix)
mlir::FlatSymbolRefAttr getFlatSymbolRefAttr(mlir::MLIRContext *context, const mlir::Twine &twine)
Construct a FlatSymbolRefAttr with the given content.
mlir::FailureOr< SymbolLookupResultUntyped > lookupTopLevelSymbol(mlir::SymbolTableCollection &tables, mlir::SymbolRefAttr symbol, mlir::Operation *origin, bool reportMissing=true)
FailureOr< StructType > getMainInstanceType(Operation *lookupFrom)
llvm::SmallVector< StringRef > getNames(SymbolRefAttr ref)
FailureOr< ModuleOp > getRootModule(Operation *from)
FailureOr< TemplateOp > getConstResolutionTemplate(SymbolTableCollection &tables, Operation *origin)
LogicalResult verifyTemplateParamsMatchInferred(Operation *origin, ArrayAttr explicitParams, llvm::iterator_range< Region::op_iterator< TemplateParamOp > > targetParamDefs, const UnificationMap &unifications)
mlir::DenseMap< std::pair< mlir::SymbolRefAttr, Side >, mlir::Attribute > UnificationMap
Optional result from type unifications.
SymbolRefAttr appendLeaf(SymbolRefAttr orig, FlatSymbolRefAttr newLeaf)
SymbolRefAttr replaceLeaf(SymbolRefAttr orig, FlatSymbolRefAttr newLeaf)
FailureOr< StructDefOp > verifyStructTypeResolution(SymbolTableCollection &tables, StructType ty, Operation *origin)
mlir::FailureOr< SymbolLookupResult< T > > resolveCallable(mlir::SymbolTableCollection &symbolTable, mlir::CallOpInterface call)
Based on mlir::CallOpInterface::resolveCallable, but using LLZK lookup helpers.
FailureOr< ModuleOp > getTopRootModule(Operation *from)
LogicalResult verifyParamsOfType(SymbolTableCollection &tables, ArrayRef< Attribute > tyParams, Type parameterizedType, Operation *origin, std::optional< Type > requiredParamType)
LogicalResult verifyTypeResolution(SymbolTableCollection &tables, Operation *origin, Type ty)
LogicalResult verifyTemplateParamValueCompatibility(Operation *origin, Attribute value, TemplateParamOp targetParam)
mlir::FailureOr< SymbolLookupResult< T > > resolveCallableSilently(mlir::SymbolTableCollection &symbolTable, mlir::CallOpInterface call)
Resolve a callable without emitting a diagnostic for missing top-level symbols.
LogicalResult verifyTemplateParamValuesCompatibility(Operation *origin, ArrayAttr explicitParams, llvm::iterator_range< Region::op_iterator< TemplateParamOp > > targetParamDefs)
mlir::SymbolRefAttr asSymbolRefAttr(mlir::StringAttr root, mlir::SymbolRefAttr tail)
Build a SymbolRefAttr that prepends tail with root, i.e., root::tail.
mlir::SymbolRefAttr getFullyQualifiedName(mlir::SymbolOpInterface symbol, bool requireParent=true)
Return the full name for this symbol from the root module, including any surrounding symbol table nam...
mlir::SymbolRefAttr getTailAsSymbolRefAttr(mlir::SymbolRefAttr symbol)
Return SymbolRefAttr like the one given but with the root/head element removed.
void eraseEmptyNestedModules(ModuleOp rootModule)
FailureOr< SymbolLookupResult< StructDefOp > > getMainInstanceDef(SymbolTableCollection &symbolTable, Operation *lookupFrom)
FailureOr< SymbolRefAttr > getPathFromTopRoot(SymbolOpInterface to, ModuleOp *foundRoot)
FailureOr< SymbolRefAttr > getPathRelativeToAncestor(SymbolOpInterface symbol, ModuleOp ancestor, llvm::function_ref< InFlightDiagnostic()> emitError)
LogicalResult verifyTemplateParamSymbol(SymbolTableCollection &tables, SymbolRefAttr symbol, Operation *origin)
llvm::SmallVector< FlatSymbolRefAttr > getPieces(SymbolRefAttr ref)
FailureOr< SymbolLookupResult< StructDefOp > > getRootStructDef(SymbolTableCollection &tables, Operation *lookupFrom, StringRef symbolPath)
FailureOr< SymbolRefAttr > getPathFromRoot(SymbolOpInterface to, ModuleOp *foundRoot)
LogicalResult verifyParamOfType(SymbolTableCollection &tables, SymbolRefAttr param, Type parameterizedType, Operation *origin, std::optional< Type > requiredParamType)