//===- FunctionCallUtils.h - Utilities for C function calls -----*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // This file declares helper functions to call common simple C functions in // LLVMIR (e.g. among others to support printing and debugging). // //===----------------------------------------------------------------------===// #ifndef MLIR_DIALECT_LLVMIR_FUNCTIONCALLUTILS_H_ #define MLIR_DIALECT_LLVMIR_FUNCTIONCALLUTILS_H_ #include "mlir/IR/Operation.h" #include "mlir/Support/LLVM.h" namespace mlir { class Location; class ModuleOp; class OpBuilder; class Operation; class Type; class ValueRange; class SymbolTableCollection; namespace LLVM { class LLVMFuncOp; /// Helper functions to look up or create the declaration for commonly used /// external C function calls. The list of functions provided here must be /// implemented separately (e.g. as part of a support runtime library or as part /// of the libc). /// Failure if an unexpected version of function is found. FailureOr lookupOrCreatePrintI64Fn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintU64Fn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintF16Fn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintBF16Fn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintF32Fn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintF64Fn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreateApFloatPrintFn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); /// Declares a function to print a C-string. /// If a custom runtime function is defined via `runtimeFunctionName`, it must /// have the signature void(char const*). The default function is `printString`. FailureOr lookupOrCreatePrintStringFn(OpBuilder &b, Operation *moduleOp, std::optional runtimeFunctionName = {}, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintOpenFn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintCloseFn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintCommaFn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreatePrintNewlineFn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreateMallocFn(OpBuilder &b, Operation *moduleOp, Type indexType, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreateAlignedAllocFn(OpBuilder &b, Operation *moduleOp, Type indexType, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreateFreeFn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreateGenericAllocFn(OpBuilder &b, Operation *moduleOp, Type indexType, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreateGenericAlignedAllocFn( OpBuilder &b, Operation *moduleOp, Type indexType, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreateGenericFreeFn(OpBuilder &b, Operation *moduleOp, SymbolTableCollection *symbolTables = nullptr); FailureOr lookupOrCreateMemRefCopyFn(OpBuilder &b, Operation *moduleOp, Type indexType, Type unrankedDescriptorType, SymbolTableCollection *symbolTables = nullptr); /// Create a FuncOp with signature `resultType`(`paramTypes`)` and name `name`. /// Return a failure if the FuncOp found has unexpected signature. FailureOr lookupOrCreateFn(OpBuilder &b, Operation *moduleOp, StringRef name, ArrayRef paramTypes = {}, Type resultType = {}, bool isVarArg = false, bool isReserved = false, SymbolTableCollection *symbolTables = nullptr); } // namespace LLVM } // namespace mlir #endif // MLIR_DIALECT_LLVMIR_FUNCTIONCALLUTILS_H_