//===- 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 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 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; }