17ce1e7abSRiver Riddle //===- CallInterfaces.cpp - ControlFlow Interfaces ------------------------===//
27ce1e7abSRiver Riddle //
37ce1e7abSRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47ce1e7abSRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
57ce1e7abSRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67ce1e7abSRiver Riddle //
77ce1e7abSRiver Riddle //===----------------------------------------------------------------------===//
87ce1e7abSRiver Riddle 
97ce1e7abSRiver Riddle #include "mlir/Interfaces/CallInterfaces.h"
107ce1e7abSRiver Riddle 
117ce1e7abSRiver Riddle using namespace mlir;
127ce1e7abSRiver Riddle 
137ce1e7abSRiver Riddle //===----------------------------------------------------------------------===//
14*a5ea6045SRiver Riddle // CallOpInterface
15*a5ea6045SRiver Riddle //===----------------------------------------------------------------------===//
16*a5ea6045SRiver Riddle 
17*a5ea6045SRiver Riddle /// Resolve the callable operation for given callee to a CallableOpInterface, or
18*a5ea6045SRiver Riddle /// nullptr if a valid callable was not resolved. `symbolTable` is an optional
19*a5ea6045SRiver Riddle /// parameter that will allow for using a cached symbol table for symbol lookups
20*a5ea6045SRiver Riddle /// instead of performing an O(N) scan.
21*a5ea6045SRiver Riddle Operation *
resolveCallable(SymbolTableCollection * symbolTable)22*a5ea6045SRiver Riddle CallOpInterface::resolveCallable(SymbolTableCollection *symbolTable) {
23*a5ea6045SRiver Riddle   CallInterfaceCallable callable = getCallableForCallee();
24*a5ea6045SRiver Riddle   if (auto symbolVal = callable.dyn_cast<Value>())
25*a5ea6045SRiver Riddle     return symbolVal.getDefiningOp();
26*a5ea6045SRiver Riddle 
27*a5ea6045SRiver Riddle   // If the callable isn't a value, lookup the symbol reference.
28*a5ea6045SRiver Riddle   auto symbolRef = callable.get<SymbolRefAttr>();
29*a5ea6045SRiver Riddle   if (symbolTable)
30*a5ea6045SRiver Riddle     return symbolTable->lookupNearestSymbolFrom(getOperation(), symbolRef);
31*a5ea6045SRiver Riddle   return SymbolTable::lookupNearestSymbolFrom(getOperation(), symbolRef);
32*a5ea6045SRiver Riddle }
33*a5ea6045SRiver Riddle 
34*a5ea6045SRiver Riddle //===----------------------------------------------------------------------===//
357ce1e7abSRiver Riddle // CallInterfaces
367ce1e7abSRiver Riddle //===----------------------------------------------------------------------===//
377ce1e7abSRiver Riddle 
387ce1e7abSRiver Riddle #include "mlir/Interfaces/CallInterfaces.cpp.inc"
39