Index: flang/test/Fir/global.fir =================================================================== --- flang/test/Fir/global.fir +++ flang/test/Fir/global.fir @@ -1,6 +1,9 @@ // RUN: tco %s | FileCheck %s // RUN: %flang_fc1 -emit-llvm %s -o - | FileCheck %s +// CHECK: $w_i86 = comdat any +// CHECK: $str1 = comdat any + // CHECK: @g_i0 = global i32 0 fir.global @g_i0 : i32 { %1 = arith.constant 0 : i32 @@ -25,11 +28,11 @@ // CHECK: @C_i511 = common global i32 0 fir.global common @C_i511 (0:i32) : i32 -// CHECK: @w_i86 = weak global i32 86 +// CHECK: @w_i86 = weak global i32 86, comdat fir.global weak @w_i86 (86:i32) : i32 -// CHECK: @str1 = global [6 x i8] c"Hello!" -fir.global @str1 : !fir.char<1,6> { +// CHECK: @str1 = linkonce global [6 x i8] c"Hello!", comdat +fir.global linkonce @str1 : !fir.char<1,6> { %1 = fir.string_lit "Hello!"(6) : !fir.char<1,6> fir.has_value %1 : !fir.char<1,6> } Index: mlir/lib/Target/LLVMIR/ModuleTranslation.cpp =================================================================== --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -672,6 +672,11 @@ if (op.getSection().hasValue()) var->setSection(*op.getSection()); + auto TargetTriple = llvm::Triple(llvmModule->getTargetTriple()); + if (var->isWeakForLinker() && !var->hasCommonLinkage() && + !var->isDeclarationForLinker() && TargetTriple.supportsCOMDAT()) + var->setComdat(llvmModule->getOrInsertComdat(var->getName())); + addRuntimePreemptionSpecifier(op.getDsoLocal(), var); Optional alignment = op.getAlignment(); Index: mlir/test/Target/LLVMIR/llvmir.mlir =================================================================== --- mlir/test/Target/LLVMIR/llvmir.mlir +++ mlir/test/Target/LLVMIR/llvmir.mlir @@ -1,5 +1,10 @@ // RUN: mlir-translate -mlir-to-llvmir -split-input-file %s | FileCheck %s +// CHECK: $linkonce = comdat any +// CHECK: $weak = comdat any +// CHECK: $linkonce_odr = comdat any +// CHECK: $weak_odr = comdat any + // CHECK: @global_aligned32 = private global i64 42, align 32 "llvm.mlir.global"() ({}) {sym_name = "global_aligned32", global_type = i64, value = 42 : i64, linkage = #llvm.linkage, alignment = 32} : () -> () @@ -93,9 +98,9 @@ llvm.mlir.global internal @internal(42 : i32) : i32 // CHECK: @available_externally = available_externally global i32 42 llvm.mlir.global available_externally @available_externally(42 : i32) : i32 -// CHECK: @linkonce = linkonce global i32 42 +// CHECK: @linkonce = linkonce global i32 42, comdat llvm.mlir.global linkonce @linkonce(42 : i32) : i32 -// CHECK: @weak = weak global i32 42 +// CHECK: @weak = weak global i32 42, comdat llvm.mlir.global weak @weak(42 : i32) : i32 // CHECK: @common = common global i32 0 llvm.mlir.global common @common(0 : i32) : i32 @@ -103,9 +108,9 @@ llvm.mlir.global appending @appending(dense<[1,2,3]> : tensor<3xi32>) : !llvm.array<3xi32> // CHECK: @extern_weak = extern_weak global i32 llvm.mlir.global extern_weak @extern_weak() : i32 -// CHECK: @linkonce_odr = linkonce_odr global i32 42 +// CHECK: @linkonce_odr = linkonce_odr global i32 42, comdat llvm.mlir.global linkonce_odr @linkonce_odr(42 : i32) : i32 -// CHECK: @weak_odr = weak_odr global i32 42 +// CHECK: @weak_odr = weak_odr global i32 42, comdat llvm.mlir.global weak_odr @weak_odr(42 : i32) : i32 // CHECK: @external = external global i32 llvm.mlir.global external @external() : i32 @@ -1490,7 +1495,8 @@ // ----- -// CHECK: @forward_use_of_address = linkonce global ptr @address_declared_after_use +// CHECK: $forward_use_of_address = comdat any +// CHECK: @forward_use_of_address = linkonce global ptr @address_declared_after_use, comdat llvm.mlir.global linkonce @forward_use_of_address() : !llvm.ptr { %0 = llvm.mlir.addressof @address_declared_after_use : !llvm.ptr llvm.return %0 : !llvm.ptr @@ -1500,7 +1506,8 @@ // ----- -// CHECK: @take_self_address = linkonce global { i32, ptr } {{.*}} ptr @take_self_address +// CHECK: $take_self_address = comdat any +// CHECK: @take_self_address = linkonce global { i32, ptr } {{.*}} ptr @take_self_address }, comdat llvm.mlir.global linkonce @take_self_address() : !llvm.struct<(i32, !llvm.ptr)> { %z32 = llvm.mlir.constant(0 : i32) : i32 %0 = llvm.mlir.undef : !llvm.struct<(i32, !llvm.ptr)>