Skip to content

Commit 261a402

Browse files
authored
[Flang][OpenMP] Use internal linkage for OpenMP code-gen'ed helper functions (#117911)
When compiling WORKSHARE construct in different compilation units, a linker error happened, when two equal WORKSHARE constructs with a copy operation have been compiled: ``` /usr/bin/ld: module2.o: in function `_workshare_copy_f64': FIRModule:(.text+0x0): multiple definition of `_workshare_copy_f64'; module1.o:FIRModule:(.text+0x0): first defined here ``` Reason is that the generate copy function has the wrong linkage: ``` 0000000000000000 T _workshare_copy_f64 ``` while it should be ``` 0000000000000000 t _workshare_copy_f64 ```
1 parent b207a17 commit 261a402

File tree

6 files changed

+27
-21
lines changed

6 files changed

+27
-21
lines changed

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,7 @@ createCopyFunc(mlir::Location loc, lower::AbstractConverter &converter,
744744
mlir::func::FuncOp funcOp =
745745
modBuilder.create<mlir::func::FuncOp>(loc, copyFuncName, funcType);
746746
funcOp.setVisibility(mlir::SymbolTable::Visibility::Private);
747+
fir::factory::setInternalLinkage(funcOp);
747748
builder.createBlock(&funcOp.getRegion(), funcOp.getRegion().end(), argsTy,
748749
{loc, loc});
749750
builder.setInsertionPointToStart(&funcOp.getRegion().back());

flang/lib/Optimizer/OpenMP/LowerWorkshare.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ static mlir::func::FuncOp createCopyFunc(mlir::Location loc, mlir::Type varType,
153153

154154
if (auto decl = module.lookupSymbol<mlir::func::FuncOp>(copyFuncName))
155155
return decl;
156+
156157
// create function
157158
mlir::OpBuilder::InsertionGuard guard(builder);
158159
mlir::OpBuilder modBuilder(module.getBodyRegion());
@@ -161,6 +162,7 @@ static mlir::func::FuncOp createCopyFunc(mlir::Location loc, mlir::Type varType,
161162
mlir::func::FuncOp funcOp =
162163
modBuilder.create<mlir::func::FuncOp>(loc, copyFuncName, funcType);
163164
funcOp.setVisibility(mlir::SymbolTable::Visibility::Private);
165+
fir::factory::setInternalLinkage(funcOp);
164166
builder.createBlock(&funcOp.getRegion(), funcOp.getRegion().end(), argsTy,
165167
{loc, loc});
166168
builder.setInsertionPointToStart(&funcOp.getRegion().back());

flang/test/Integration/OpenMP/copyprivate.f90

+17-17
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,24 @@
88

99
!RUN: %flang_fc1 -emit-llvm -fopenmp %s -o - | FileCheck %s
1010

11-
!CHECK-DAG: define void @_copy_box_Uxi32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
12-
!CHECK-DAG: define void @_copy_10xi32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
13-
!CHECK-DAG: define void @_copy_i64(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
14-
!CHECK-DAG: define void @_copy_box_Uxi64(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
15-
!CHECK-DAG: define void @_copy_f32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
16-
!CHECK-DAG: define void @_copy_2x3xf32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
17-
!CHECK-DAG: define void @_copy_z32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
18-
!CHECK-DAG: define void @_copy_10xz32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
19-
!CHECK-DAG: define void @_copy_l32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
20-
!CHECK-DAG: define void @_copy_5xl32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
21-
!CHECK-DAG: define void @_copy_c8x8(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
22-
!CHECK-DAG: define void @_copy_10xc8x8(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
23-
!CHECK-DAG: define void @_copy_c16x5(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
24-
!CHECK-DAG: define void @_copy_rec__QFtest_typesTdt(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
25-
!CHECK-DAG: define void @_copy_box_heap_Uxi32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
26-
!CHECK-DAG: define void @_copy_box_ptr_Uxc8x9(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
11+
!CHECK-DAG: define internal void @_copy_box_Uxi32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
12+
!CHECK-DAG: define internal void @_copy_10xi32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
13+
!CHECK-DAG: define internal void @_copy_i64(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
14+
!CHECK-DAG: define internal void @_copy_box_Uxi64(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
15+
!CHECK-DAG: define internal void @_copy_f32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
16+
!CHECK-DAG: define internal void @_copy_2x3xf32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
17+
!CHECK-DAG: define internal void @_copy_z32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
18+
!CHECK-DAG: define internal void @_copy_10xz32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
19+
!CHECK-DAG: define internal void @_copy_l32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
20+
!CHECK-DAG: define internal void @_copy_5xl32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
21+
!CHECK-DAG: define internal void @_copy_c8x8(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
22+
!CHECK-DAG: define internal void @_copy_10xc8x8(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
23+
!CHECK-DAG: define internal void @_copy_c16x5(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
24+
!CHECK-DAG: define internal void @_copy_rec__QFtest_typesTdt(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
25+
!CHECK-DAG: define internal void @_copy_box_heap_Uxi32(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
26+
!CHECK-DAG: define internal void @_copy_box_ptr_Uxc8x9(ptr nocapture %{{.*}}, ptr nocapture %{{.*}})
2727

28-
!CHECK-LABEL: define void @_copy_i32(
28+
!CHECK-LABEL: define internal void @_copy_i32(
2929
!CHECK-SAME: ptr nocapture %[[DST:.*]], ptr nocapture %[[SRC:.*]]){{.*}} {
3030
!CHECK-NEXT: %[[SRC_VAL:.*]] = load i32, ptr %[[SRC]]
3131
!CHECK-NEXT: store i32 %[[SRC_VAL]], ptr %[[DST]]

flang/test/Lower/OpenMP/copyprivate.f90

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
!CHECK-DAG: func private @_copy_box_ptr_Uxc8x9(%{{.*}}: !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,9>>>>>, %{{.*}}: !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,9>>>>>)
3232

3333
!CHECK-LABEL: func private @_copy_i32(
34-
!CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i32>, %[[ARG1:.*]]: !fir.ref<i32>) {
34+
!CHECK-SAME: %[[ARG0:.*]]: !fir.ref<i32>, %[[ARG1:.*]]: !fir.ref<i32>) attributes {llvm.linkage = #llvm.linkage<internal>} {
3535
!CHECK-NEXT: %[[DST:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_copy_i32_dst"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
3636
!CHECK-NEXT: %[[SRC:.*]]:2 = hlfir.declare %[[ARG1]] {uniq_name = "_copy_i32_src"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
3737
!CHECK-NEXT: %[[SRC_VAL:.*]] = fir.load %[[SRC]]#0 : !fir.ref<i32>

flang/test/Lower/OpenMP/copyprivate2.f90

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33

44
!CHECK-LABEL: func private @_copy_box_ptr_i32(
55
!CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>>,
6-
!CHECK-SAME: %[[ARG1:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>>) {
6+
!CHECK-SAME: %[[ARG1:.*]]: !fir.ref<!fir.box<!fir.ptr<i32>>>)
7+
!CHECK-SAME: attributes {llvm.linkage = #llvm.linkage<internal>} {
78
!CHECK-NEXT: %[[DST:.*]]:2 = hlfir.declare %[[ARG0]] {fortran_attrs = #fir.var_attrs<pointer>,
89
!CHECK-SAME: uniq_name = "_copy_box_ptr_i32_dst"} : (!fir.ref<!fir.box<!fir.ptr<i32>>>) ->
910
!CHECK-SAME: (!fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.ref<!fir.box<!fir.ptr<i32>>>)
@@ -17,7 +18,8 @@
1718

1819
!CHECK-LABEL: func private @_copy_box_heap_Uxi32(
1920
!CHECK-SAME: %[[ARG0:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>,
20-
!CHECK-SAME: %[[ARG1:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) {
21+
!CHECK-SAME: %[[ARG1:.*]]: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
22+
!CHECK-SAME: attributes {llvm.linkage = #llvm.linkage<internal>} {
2123
!CHECK-NEXT: %[[DST:.*]]:2 = hlfir.declare %[[ARG0]] {fortran_attrs = #fir.var_attrs<allocatable>,
2224
!CHECK-SAME: uniq_name = "_copy_box_heap_Uxi32_dst"} : (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>) ->
2325
!CHECK-SAME: (!fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)

flang/test/Transforms/OpenMP/lower-workshare-alloca.mlir

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ func.func @wsfunc() {
2222

2323
// CHECK-LABEL: func.func private @_workshare_copy_i32(
2424
// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32>,
25-
// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32>) {
25+
// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32>)
26+
// CHECK-SAME: attributes {llvm.linkage = #llvm.linkage<internal>} {
2627
// CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<i32>
2728
// CHECK: fir.store %[[VAL_2]] to %[[VAL_0]] : !fir.ref<i32>
2829
// CHECK: return

0 commit comments

Comments
 (0)