Skip to content

Commit fac9391

Browse files
authored
[fir] Update symbol table after external name mangling
1 parent a51722f commit fac9391

File tree

3 files changed

+30
-15
lines changed

3 files changed

+30
-15
lines changed

flang/lib/Optimizer/Transforms/ExternalNameConversion.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
1414
#include "mlir/Dialect/OpenACC/OpenACC.h"
1515
#include "mlir/Dialect/OpenMP/OpenMPDialect.h"
16+
#include "mlir/IR/SymbolTable.h"
1617
#include "mlir/Pass/Pass.h"
1718
#include "mlir/Transforms/DialectConversion.h"
1819

@@ -68,7 +69,9 @@ struct MangleNameOnFuncOp : public mlir::OpRewritePattern<mlir::FuncOp> {
6869
rewriter.startRootUpdate(op);
6970
auto result = fir::NameUniquer::deconstruct(op.sym_name());
7071
if (fir::NameUniquer::isExternalFacingUniquedName(result)) {
71-
op.sym_nameAttr(rewriter.getStringAttr(mangleExternalName(result)));
72+
auto newName = mangleExternalName(result);
73+
op.sym_nameAttr(rewriter.getStringAttr(newName));
74+
SymbolTable::setSymbolName(op, newName);
7275
}
7376
rewriter.finalizeRootUpdate(op);
7477
return success();
@@ -84,9 +87,11 @@ struct MangleNameForCommonBlock : public mlir::OpRewritePattern<fir::GlobalOp> {
8487
mlir::PatternRewriter &rewriter) const override {
8588
rewriter.startRootUpdate(op);
8689
auto result = fir::NameUniquer::deconstruct(op.symref().getRootReference());
87-
if (fir::NameUniquer::isExternalFacingUniquedName(result))
88-
op.symrefAttr(mlir::SymbolRefAttr::get(op.getContext(),
89-
mangleExternalName(result)));
90+
if (fir::NameUniquer::isExternalFacingUniquedName(result)) {
91+
auto newName = mangleExternalName(result);
92+
op.symrefAttr(mlir::SymbolRefAttr::get(op.getContext(), newName));
93+
SymbolTable::setSymbolName(op, newName);
94+
}
9095
rewriter.finalizeRootUpdate(op);
9196
return success();
9297
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: fir-opt --external-name-interop %s | FileCheck %s
2+
// RUN: tco --external-name-interop %s | FileCheck %s
3+
4+
func @_QPfoo() {
5+
%e6 = fir.alloca tuple<i32,f64>
6+
%0 = fir.emboxproc @_QPfoo_impl, %e6 : ((!fir.box<!fir.type<derived3{f:f32}>>) -> (), !fir.ref<tuple<i32,f64>>) -> !fir.boxproc<(!fir.box<!fir.type<derived3{f:f32}>>) -> ()>
7+
return
8+
}
9+
func private @_QPfoo_impl(!fir.ref<i32>)
10+
11+
// CHECK: %{{.*}}= fir.emboxproc @foo_impl_

flang/test/Fir/external-mangling.fir

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: fir-opt --external-name-interop %s | FileCheck %s
22
// RUN: tco --external-name-interop %s | FileCheck %s
3-
// RUN: tco --external-name-interop %s | tco | FileCheck %s --check-prefix=LLVMIR
3+
// RUN: tco --external-name-interop %s | tco --fir-to-llvm-ir | FileCheck %s --check-prefix=LLVMIR
44

55
func @_QPfoo() {
66
%c0 = constant 0 : index
@@ -14,8 +14,6 @@ func @_QPfoo() {
1414
%7 = fir.convert %6 : (!fir.ref<i8>) -> !fir.ref<f32>
1515
fir.call @_QPbar(%3) : (!fir.ref<i32>) -> ()
1616
fir.call @_QPbar2(%7) : (!fir.ref<f32>) -> ()
17-
%e6 = fir.alloca tuple<i32,f64>
18-
%8 = fir.emboxproc @_QPfoo_impl, %e6 : ((!fir.box<!fir.type<derived3{f:f32}>>) -> (), !fir.ref<tuple<i32,f64>>) -> !fir.boxproc<(!fir.box<!fir.type<derived3{f:f32}>>) -> ()>
1917
return
2018
}
2119
fir.global common @_QBa(dense<0> : vector<4xi8>) : !fir.array<4xi8>
@@ -28,15 +26,16 @@ func private @_QPbar2(!fir.ref<f32>)
2826
// CHECK: %{{.*}} = fir.address_of(@__BLNK__) : !fir.ref<!fir.array<4xi8>>
2927
// CHECK: fir.call @bar_
3028
// CHECK: fir.call @bar2_
31-
// CHECK: %{{.*}}= fir.emboxproc @foo_impl_
3229
// CHECK: fir.global common @a_(dense<0> : vector<4xi8>) : !fir.array<4xi8>
3330
// CHECK: fir.global common @__BLNK__(dense<0> : vector<4xi8>) : !fir.array<4xi8>
3431
// CHECK: func private @bar_(!fir.ref<i32>)
3532

36-
// LLVMIR: @a_ = common global [4 x i8] zeroinitializer
37-
// LLVMIR: @__BLNK__ = common global [4 x i8] zeroinitializer
38-
// LLVMIR: define void @foo_()
39-
// LLVMIR: call void @bar_(
40-
// LLVMIR: call void @bar2_(
41-
// LLVMIR: declare void @bar_(
42-
// LLVMIR: declare void @bar2_(
33+
// LLVMIR: %{{.*}} = llvm.mlir.addressof @a_ : !llvm.ptr<array<4 x i8>>
34+
// LLVMIR: %{{.*}} = llvm.mlir.addressof @__BLNK__ : !llvm.ptr<array<4 x i8>>
35+
// LLVMIR: llvm.call @bar_(%{{.*}}) : (!llvm.ptr<i32>) -> ()
36+
// LLVMIR: llvm.call @bar2_(%{{.*}}) : (!llvm.ptr<f32>) -> ()
37+
38+
// LLVMIR: llvm.mlir.global common @a_(dense<0> : vector<4xi8>) : !llvm.array<4 x i8>
39+
// LLVMIR: llvm.mlir.global common @__BLNK__(dense<0> : vector<4xi8>) : !llvm.array<4 x i8>
40+
// LLVMIR: llvm.func @bar_(!llvm.ptr<i32>) attributes {sym_visibility = "private"}
41+
// LLVMIR: llvm.func @bar2_(!llvm.ptr<f32>) attributes {sym_visibility = "private"}

0 commit comments

Comments
 (0)