Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp
Show First 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | |||||
#define GEN_PASS_DEF_CONVERTFUNCTOLLVM | #define GEN_PASS_DEF_CONVERTFUNCTOLLVM | ||||
#include "mlir/Conversion/Passes.h.inc" | #include "mlir/Conversion/Passes.h.inc" | ||||
} // namespace mlir | } // namespace mlir | ||||
using namespace mlir; | using namespace mlir; | ||||
#define PASS_NAME "convert-func-to-llvm" | #define PASS_NAME "convert-func-to-llvm" | ||||
/// Only retain those attributes that are not constructed by | static constexpr StringRef varargsAttrName = "func.varargs"; | ||||
/// `LLVMFuncOp::build`. If `filterArgAttrs` is set, also filter out argument | static constexpr StringRef linkageAttrName = "llvm.linkage"; | ||||
/// Drop all attributes that are either constructed by the `LLVMFuncOp::build` | |||||
/// or are attached to it. If `filterArgAttrs` is set, also filter out argument | |||||
/// attributes. | /// attributes. | ||||
static void filterFuncAttributes(func::FuncOp func, bool filterArgAndResAttrs, | static void filterFuncAttributes(func::FuncOp func, bool filterArgAndResAttrs, | ||||
SmallVectorImpl<NamedAttribute> &result) { | SmallVectorImpl<NamedAttribute> &result) { | ||||
for (const NamedAttribute &attr : func->getAttrs()) { | for (const NamedAttribute &attr : func->getAttrs()) { | ||||
gysit: ultra nit: Drop -> Drops.
I am not sure about the second half of the comment ("or are… | |||||
if (attr.getName() == SymbolTable::getSymbolAttrName() || | if (attr.getName() == SymbolTable::getSymbolAttrName() || | ||||
attr.getName() == func.getFunctionTypeAttrName() || | attr.getName() == func.getFunctionTypeAttrName() || | ||||
attr.getName() == "func.varargs" || | attr.getName() == linkageAttrName || | ||||
attr.getName() == varargsAttrName || | |||||
(filterArgAndResAttrs && | (filterArgAndResAttrs && | ||||
(attr.getName() == func.getArgAttrsAttrName() || | (attr.getName() == func.getArgAttrsAttrName() || | ||||
attr.getName() == func.getResAttrsAttrName()))) | attr.getName() == func.getResAttrsAttrName()))) | ||||
continue; | continue; | ||||
result.push_back(attr); | result.push_back(attr); | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 209 Lines • ▼ Show 20 Lines | protected: | ||||
// Convert input FuncOp to LLVMFuncOp by using the LLVMTypeConverter provided | // Convert input FuncOp to LLVMFuncOp by using the LLVMTypeConverter provided | ||||
// to this legalization pattern. | // to this legalization pattern. | ||||
LLVM::LLVMFuncOp | LLVM::LLVMFuncOp | ||||
convertFuncOpToLLVMFuncOp(func::FuncOp funcOp, | convertFuncOpToLLVMFuncOp(func::FuncOp funcOp, | ||||
ConversionPatternRewriter &rewriter) const { | ConversionPatternRewriter &rewriter) const { | ||||
// Convert the original function arguments. They are converted using the | // Convert the original function arguments. They are converted using the | ||||
// LLVMTypeConverter provided to this legalization pattern. | // LLVMTypeConverter provided to this legalization pattern. | ||||
auto varargsAttr = funcOp->getAttrOfType<BoolAttr>("func.varargs"); | auto varargsAttr = funcOp->getAttrOfType<BoolAttr>(varargsAttrName); | ||||
TypeConverter::SignatureConversion result(funcOp.getNumArguments()); | TypeConverter::SignatureConversion result(funcOp.getNumArguments()); | ||||
auto llvmType = getTypeConverter()->convertFunctionSignature( | auto llvmType = getTypeConverter()->convertFunctionSignature( | ||||
funcOp.getFunctionType(), varargsAttr && varargsAttr.getValue(), | funcOp.getFunctionType(), varargsAttr && varargsAttr.getValue(), | ||||
result); | result); | ||||
if (!llvmType) | if (!llvmType) | ||||
return nullptr; | return nullptr; | ||||
// Propagate argument/result attributes to all converted arguments/result | // Propagate argument/result attributes to all converted arguments/result | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | if (ArrayAttr argAttrDicts = funcOp.getAllArgAttrs()) { | ||||
assert(mapping && "unexpected deletion of function argument"); | assert(mapping && "unexpected deletion of function argument"); | ||||
for (size_t j = 0; j < mapping->size; ++j) | for (size_t j = 0; j < mapping->size; ++j) | ||||
newArgAttrs[mapping->inputNo + j] = | newArgAttrs[mapping->inputNo + j] = | ||||
DictionaryAttr::get(rewriter.getContext(), convertedAttrs); | DictionaryAttr::get(rewriter.getContext(), convertedAttrs); | ||||
} | } | ||||
attributes.push_back(rewriter.getNamedAttr( | attributes.push_back(rewriter.getNamedAttr( | ||||
funcOp.getArgAttrsAttrName(), rewriter.getArrayAttr(newArgAttrs))); | funcOp.getArgAttrsAttrName(), rewriter.getArrayAttr(newArgAttrs))); | ||||
} | } | ||||
for (const auto &pair : llvm::enumerate(attributes)) { | |||||
if (pair.value().getName() == "llvm.linkage") { | |||||
attributes.erase(attributes.begin() + pair.index()); | |||||
break; | |||||
} | |||||
} | |||||
// Create an LLVM function, use external linkage by default until MLIR | // Create an LLVM function, use external linkage by default until MLIR | ||||
// functions have linkage. | // functions have linkage. | ||||
LLVM::Linkage linkage = LLVM::Linkage::External; | LLVM::Linkage linkage = LLVM::Linkage::External; | ||||
if (funcOp->hasAttr("llvm.linkage")) { | if (funcOp->hasAttr(linkageAttrName)) { | ||||
auto attr = | auto attr = | ||||
funcOp->getAttr("llvm.linkage").dyn_cast<mlir::LLVM::LinkageAttr>(); | funcOp->getAttr(linkageAttrName).dyn_cast<mlir::LLVM::LinkageAttr>(); | ||||
if (!attr) { | if (!attr) { | ||||
funcOp->emitError() | funcOp->emitError() << "Contains " << linkageAttrName | ||||
<< "Contains llvm.linkage attribute not of type LLVM::LinkageAttr"; | << " attribute not of type LLVM::LinkageAttr"; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
linkage = attr.getLinkage(); | linkage = attr.getLinkage(); | ||||
} | } | ||||
auto newFuncOp = rewriter.create<LLVM::LLVMFuncOp>( | auto newFuncOp = rewriter.create<LLVM::LLVMFuncOp>( | ||||
funcOp.getLoc(), funcOp.getName(), llvmType, linkage, | funcOp.getLoc(), funcOp.getName(), llvmType, linkage, | ||||
/*dsoLocal*/ false, /*cconv*/ LLVM::CConv::C, attributes); | /*dsoLocal*/ false, /*cconv*/ LLVM::CConv::C, attributes); | ||||
rewriter.inlineRegionBefore(funcOp.getBody(), newFuncOp.getBody(), | rewriter.inlineRegionBefore(funcOp.getBody(), newFuncOp.getBody(), | ||||
▲ Show 20 Lines • Show All 386 Lines • Show Last 20 Lines |
ultra nit: Drop -> Drops.
I am not sure about the second half of the comment ("or are attached to the function manually". In general the function seems to copy all manually set attributes except for linkageAttrName? Shouldn't we just drop this second half of the sentence?