[flang-commits] [flang] 28dc5f4 - [flang] Use internal linkage for string literals

David Truby via flang-commits flang-commits at lists.llvm.org
Thu May 11 07:47:33 PDT 2023


Author: David Truby
Date: 2023-05-11T15:47:20+01:00
New Revision: 28dc5f4cdd5e552c87ec72d39bd0f9d7378ab747

URL: https://github.com/llvm/llvm-project/commit/28dc5f4cdd5e552c87ec72d39bd0f9d7378ab747
DIFF: https://github.com/llvm/llvm-project/commit/28dc5f4cdd5e552c87ec72d39bd0f9d7378ab747.diff

LOG: [flang] Use internal linkage for string literals

On Windows, global string literals with "linkonce" linkage is not
supported without using comdat. As a simpler fix than adding comdat
support we can use internal linkage instead.

This fixes a bug where two string literals with the same value in
different fortran files would cause a linker error due to the use
of linkonce linkage.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D149859

Added: 
    

Modified: 
    flang/lib/Optimizer/Builder/FIRBuilder.cpp
    flang/test/Lower/allocatable-assignment.f90
    flang/test/Lower/character-assignment.f90
    flang/test/Lower/convert.f90
    flang/test/Lower/global-format-strings.f90
    flang/test/Lower/io-statement-open-options.f90
    flang/test/Lower/namelist.f90
    flang/test/Lower/read-write-buffer.f90
    flang/unittests/Optimizer/Builder/FIRBuilderTest.cpp

Removed: 
    


################################################################################
diff  --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
index 8ffff7ad7809a..ae82a5afa2acb 100644
--- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp
+++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
@@ -999,7 +999,9 @@ fir::ExtendedValue fir::factory::createStringLiteral(fir::FirOpBuilder &builder,
           auto stringLitOp = builder.createStringLitOp(loc, str);
           builder.create<fir::HasValueOp>(loc, stringLitOp);
         },
-        builder.createLinkOnceLinkage());
+        builder.createInternalLinkage());
+  // TODO: This can be changed to linkonce linkage once we have support for
+  // generating comdat sections
   auto addr = builder.create<fir::AddrOfOp>(loc, global.resultType(),
                                             global.getSymbol());
   auto len = builder.createIntegerConstant(

diff  --git a/flang/test/Lower/allocatable-assignment.f90 b/flang/test/Lower/allocatable-assignment.f90
index 5d2f28177bcbf..60f6fac107bf4 100644
--- a/flang/test/Lower/allocatable-assignment.f90
+++ b/flang/test/Lower/allocatable-assignment.f90
@@ -1242,7 +1242,7 @@ end function elt
 ! CHECK:       }
 end subroutine
 
-! CHECK: fir.global linkonce @[[error_message]] constant : !fir.char<1,76> {
+! CHECK: fir.global internal @[[error_message]] constant : !fir.char<1,76> {
 ! CHECK:   %[[msg:.*]] = fir.string_lit "array left hand side must be allocated when the right hand side is a scalar\00"(76) : !fir.char<1,76>
 ! CHECK:   fir.has_value %[[msg:.*]] : !fir.char<1,76>
 ! CHECK: }

diff  --git a/flang/test/Lower/character-assignment.f90 b/flang/test/Lower/character-assignment.f90
index 7f1874d3f083f..fad419ea9fc3b 100644
--- a/flang/test/Lower/character-assignment.f90
+++ b/flang/test/Lower/character-assignment.f90
@@ -102,7 +102,7 @@ subroutine assign_zero_size_array(n)
     ! CHECK:   return
   end subroutine
 
-! CHECK-LABEL: fir.global linkonce @_QQcl.48656C6C6F20576F726C64
+! CHECK-LABEL: fir.global internal @_QQcl.48656C6C6F20576F726C64
 ! CHECK: %[[lit:.*]] = fir.string_lit "Hello World"(11) : !fir.char<1,11>
 ! CHECK: fir.has_value %[[lit]] : !fir.char<1,11>
 ! CHECK: }

diff  --git a/flang/test/Lower/convert.f90 b/flang/test/Lower/convert.f90
index 1ab93dcc17320..50050190803e2 100755
--- a/flang/test/Lower/convert.f90
+++ b/flang/test/Lower/convert.f90
@@ -21,11 +21,11 @@ program test
 ! ALL: %[[VAL_8:.*]] = fir.insert_value %[[VAL_4]], %[[VAL_7]], [0 : index, 1 : index] : (!fir.array<1xtuple<!fir.ref<i8>, !fir.ref<i8>>>, !fir.ref<i8>) -> !fir.array<1xtuple<!fir.ref<i8>, !fir.ref<i8>>>
 ! ALL: fir.has_value %[[VAL_8]] : !fir.array<1xtuple<!fir.ref<i8>, !fir.ref<i8>>>
 
-! ALL: fir.global linkonce @[[FC_STR]] constant : !fir.char<1,13> {
+! ALL: fir.global internal @[[FC_STR]] constant : !fir.char<1,13> {
 ! ALL: %[[VAL_0:.*]] = fir.string_lit "FORT_CONVERT\00"(13) : !fir.char<1,13>
 ! ALL: fir.has_value %[[VAL_0]] : !fir.char<1,13>
 
-! ALL: fir.global linkonce @[[OPT_STR]] constant : !fir.char<1,[[OPT_STR_LEN]]> {
+! ALL: fir.global internal @[[OPT_STR]] constant : !fir.char<1,[[OPT_STR_LEN]]> {
 ! UNKNOWN: %[[VAL_0:.*]] = fir.string_lit "UNKNOWN\00"([[OPT_STR_LEN]]) : !fir.char<1,[[OPT_STR_LEN]]>
 ! NATIVE: %[[VAL_0:.*]] = fir.string_lit "NATIVE\00"([[OPT_STR_LEN]]) : !fir.char<1,[[OPT_STR_LEN]]>
 ! LITTLE_ENDIAN: %[[VAL_0:.*]] = fir.string_lit "LITTLE_ENDIAN\00"([[OPT_STR_LEN]]) : !fir.char<1,[[OPT_STR_LEN]]>

diff  --git a/flang/test/Lower/global-format-strings.f90 b/flang/test/Lower/global-format-strings.f90
index 3112da33dc0fe..d9307abd74731 100644
--- a/flang/test/Lower/global-format-strings.f90
+++ b/flang/test/Lower/global-format-strings.f90
@@ -8,7 +8,7 @@ program other
   ! CHECK:  fir.address_of(@{{.*}}) :
 1008 format('ok')
 end
-! CHECK-LABEL: fir.global linkonce @_QQcl.28276F6B2729 constant
+! CHECK-LABEL: fir.global internal @_QQcl.28276F6B2729 constant
 ! CHECK: %[[lit:.*]] = fir.string_lit "('ok')"(6) : !fir.char<1,6>
 ! CHECK: fir.has_value %[[lit]] : !fir.char<1,6>
 ! CHECK: }

diff  --git a/flang/test/Lower/io-statement-open-options.f90 b/flang/test/Lower/io-statement-open-options.f90
index 4348767ec2033..4d414e069f599 100755
--- a/flang/test/Lower/io-statement-open-options.f90
+++ b/flang/test/Lower/io-statement-open-options.f90
@@ -15,6 +15,6 @@ subroutine test_convert_specifier(unit)
   close(unit)
 end subroutine
 
-! CHECK: fir.global linkonce @[[be_str_name]] constant : !fir.char<1,10> {
+! CHECK: fir.global internal @[[be_str_name]] constant : !fir.char<1,10> {
 ! CHECK: %[[be_str_lit:.*]] = fir.string_lit "BIG_ENDIAN"(10) : !fir.char<1,10>
 ! CHECK: fir.has_value %[[be_str_lit]] : !fir.char<1,10>

diff  --git a/flang/test/Lower/namelist.f90 b/flang/test/Lower/namelist.f90
index 0a9a5b34b9387..7789effc0d313 100644
--- a/flang/test/Lower/namelist.f90
+++ b/flang/test/Lower/namelist.f90
@@ -83,6 +83,6 @@ subroutine global_pointer
   write(10, nml=mygroup)
 end
 
-  ! CHECK-DAG: fir.global linkonce @_QQcl.6A6A6A00 constant : !fir.char<1,4>
-  ! CHECK-DAG: fir.global linkonce @_QQcl.63636300 constant : !fir.char<1,4>
-  ! CHECK-DAG: fir.global linkonce @_QQcl.6E6E6E00 constant : !fir.char<1,4>
+  ! CHECK-DAG: fir.global internal @_QQcl.6A6A6A00 constant : !fir.char<1,4>
+  ! CHECK-DAG: fir.global internal @_QQcl.63636300 constant : !fir.char<1,4>
+  ! CHECK-DAG: fir.global internal @_QQcl.6E6E6E00 constant : !fir.char<1,4>

diff  --git a/flang/test/Lower/read-write-buffer.f90 b/flang/test/Lower/read-write-buffer.f90
index 889209242cb4a..188cdb088973f 100644
--- a/flang/test/Lower/read-write-buffer.f90
+++ b/flang/test/Lower/read-write-buffer.f90
@@ -29,7 +29,7 @@ subroutine some()
   write (buffer, 10) "compiler"
   read (buffer, 10) greeting
 end
-! CHECK-LABEL: fir.global linkonce @_QQcl.636F6D70696C6572
+! CHECK-LABEL: fir.global internal @_QQcl.636F6D70696C6572
 ! CHECK: %[[lit:.*]] = fir.string_lit "compiler"(8) : !fir.char<1,8>
 ! CHECK: fir.has_value %[[lit]] : !fir.char<1,8>
 ! CHECK: }

diff  --git a/flang/unittests/Optimizer/Builder/FIRBuilderTest.cpp b/flang/unittests/Optimizer/Builder/FIRBuilderTest.cpp
index c3436ccd1c779..650a4d13b2b52 100644
--- a/flang/unittests/Optimizer/Builder/FIRBuilderTest.cpp
+++ b/flang/unittests/Optimizer/Builder/FIRBuilderTest.cpp
@@ -311,7 +311,7 @@ TEST_F(FIRBuilderTest, createStringLiteral) {
   auto symbol = addrOp.getSymbol().getRootReference().getValue();
   auto global = builder.getNamedGlobal(symbol);
   EXPECT_EQ(
-      builder.createLinkOnceLinkage().getValue(), global.getLinkName().value());
+      builder.createInternalLinkage().getValue(), global.getLinkName().value());
   EXPECT_EQ(fir::CharacterType::get(builder.getContext(), 1, strValue.size()),
       global.getType());
 


        


More information about the flang-commits mailing list