[mlir] Support translating function linkage between MLIR and LLVM IR

Linkage support is already present in the LLVM dialect, and is being translated
for globals other than functions. Translation support has been missing for
functions because their conversion goes through a different code path than
other globals.

Differential Revision: https://reviews.llvm.org/D84149
This commit is contained in:
Alex Zinenko 2020-07-20 13:54:30 +02:00
parent 6384ec4099
commit ebbdecdd57
4 changed files with 27 additions and 4 deletions

View File

@ -846,8 +846,9 @@ LogicalResult Importer::processFunction(llvm::Function *f) {
return failure();
b.setInsertionPoint(module.getBody(), getFuncInsertPt());
LLVMFuncOp fop = b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(),
functionType);
LLVMFuncOp fop =
b.create<LLVMFuncOp>(UnknownLoc::get(context), f->getName(), functionType,
convertLinkageFromLLVM(f->getLinkage()));
if (FlatSymbolRefAttr personality = getPersonalityAsAttr(f))
fop.setAttr(b.getIdentifier("personality"), personality);

View File

@ -884,6 +884,7 @@ LogicalResult ModuleTranslation::convertFunctionSignatures() {
function.getName(),
cast<llvm::FunctionType>(function.getType().getUnderlyingType()));
llvm::Function *llvmFunc = cast<llvm::Function>(llvmFuncCst.getCallee());
llvmFunc->setLinkage(convertLinkageToLLVM(function.linkage()));
functionMapping[function.getName()] = llvmFunc;
// Forward the pass-through attributes to LLVM.

View File

@ -64,11 +64,20 @@
; CHECK: llvm.mlir.global internal constant @nested_array_vector(dense<[{{\[}}[1, 2], [3, 4]]]> : vector<1x2x2xi32>) : !llvm<"[1 x [2 x <2 x i32>]]">
@nested_array_vector = internal constant [1 x [2 x <2 x i32>]] [[2 x <2 x i32>] [<2 x i32> <i32 1, i32 2>, <2 x i32> <i32 3, i32 4>]]
;
; Linkage on functions.
;
; CHECK: llvm.func internal @func_internal
define internal void @func_internal() {
ret void
}
; CHECK: llvm.func @fe(!llvm.i32) -> !llvm.float
declare float @fe(i32)
; FIXME: function attributes.
; CHECK-LABEL: llvm.func @f1(%arg0: !llvm.i64) -> !llvm.i32 {
; CHECK-LABEL: llvm.func internal @f1(%arg0: !llvm.i64) -> !llvm.i32 {
; CHECK-DAG: %[[c2:[0-9]+]] = llvm.mlir.constant(2 : i32) : !llvm.i32
; CHECK-DAG: %[[c42:[0-9]+]] = llvm.mlir.constant(42 : i32) : !llvm.i32
; CHECK-DAG: %[[c1:[0-9]+]] = llvm.mlir.constant(true) : !llvm.i1

View File

@ -61,7 +61,8 @@ llvm.mlir.global external @external() : !llvm.i32
//
// Declarations of the allocation functions to be linked against.
// Declarations of the allocation functions to be linked against. These are
// inserted before other functions in the module.
//
// CHECK: declare i8* @malloc(i64)
@ -390,6 +391,17 @@ llvm.func @more_imperfectly_nested_loops() {
llvm.return
}
//
// Check that linkage is translated for functions. No need to check all linkage
// flags since the logic is the same as for globals.
//
// CHECK: define internal void @func_internal
llvm.func internal @func_internal() {
llvm.return
}
//
// MemRef type conversion, allocation and communication with functions.
//