| //===- LowerFunctionDiscardablesToLLVM.cpp - Func discardables to llvm ----===// | |
| // | |
| // 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "mlir/Conversion/LLVMCommon/LowerFunctionDiscardablesToLLVM.h" | |
| #include "llvm/ADT/DenseSet.h" | |
| #include "llvm/Support/DebugLog.h" | |
| using namespace mlir; | |
| #define DEBUG_TYPE "lower-function-discardables-to-llvm" | |
| FailureOr<LoweredLLVMFuncAttrs> | |
| mlir::lowerDiscardableAttrsForLLVMFunc(FunctionOpInterface funcOp, | |
| Type llvmFuncType) { | |
| MLIRContext *ctx = funcOp->getContext(); | |
| LoweredLLVMFuncAttrs result; | |
| result.properties.sym_name = StringAttr::get(ctx, funcOp.getName()); | |
| result.properties.function_type = TypeAttr::get(llvmFuncType); | |
| llvm::SmallDenseSet<StringRef> odsAttrNames( | |
| LLVM::LLVMFuncOp::getAttributeNames().begin(), | |
| LLVM::LLVMFuncOp::getAttributeNames().end()); | |
| NamedAttrList inherentAttrs; | |
| for (const NamedAttribute &attr : funcOp->getDiscardableAttrs()) { | |
| StringRef attrName = attr.getName().strref(); | |
| if (odsAttrNames.contains(attrName)) { | |
| LDBG() << "LLVM specific attributes: " << attrName | |
| << "should use llvm.* prefix, discarding it"; | |
| continue; | |
| } | |
| StringRef inherent = attrName; | |
| if (inherent.consume_front("llvm.") && odsAttrNames.contains(inherent)) | |
| inherentAttrs.set(inherent, attr.getValue()); // collect inherent attrs | |
| else | |
| result.discardableAttrs.push_back(attr); | |
| } | |
| // Convert collected inherent attrs into typed properties. | |
| if (!inherentAttrs.empty()) { | |
| DictionaryAttr dict = inherentAttrs.getDictionary(ctx); | |
| auto emitError = [&] { | |
| return funcOp.emitOpError("invalid llvm.func property"); | |
| }; | |
| if (failed(LLVM::LLVMFuncOp::setPropertiesFromAttr(result.properties, dict, | |
| emitError))) { | |
| return failure(); | |
| } | |
| } | |
| return result; | |
| } |