diff options
author | David Truby <david@truby.dev> | 2023-05-11 14:47:31 +0100 |
---|---|---|
committer | David Truby <david@truby.dev> | 2023-05-11 15:47:20 +0100 |
commit | 28dc5f4cdd5e552c87ec72d39bd0f9d7378ab747 (patch) | |
tree | 56c0e5911f8501d4a066b7959b54f26734b274bd /flang | |
parent | e13d1b5227a77bb7becfd4c49a60720ecc33f870 (diff) | |
download | llvm-28dc5f4cdd5e552c87ec72d39bd0f9d7378ab747.tar.gz |
[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
Diffstat (limited to 'flang')
-rw-r--r-- | flang/lib/Optimizer/Builder/FIRBuilder.cpp | 4 | ||||
-rw-r--r-- | flang/test/Lower/allocatable-assignment.f90 | 2 | ||||
-rw-r--r-- | flang/test/Lower/character-assignment.f90 | 2 | ||||
-rwxr-xr-x | flang/test/Lower/convert.f90 | 4 | ||||
-rw-r--r-- | flang/test/Lower/global-format-strings.f90 | 2 | ||||
-rwxr-xr-x | flang/test/Lower/io-statement-open-options.f90 | 2 | ||||
-rw-r--r-- | flang/test/Lower/namelist.f90 | 6 | ||||
-rw-r--r-- | flang/test/Lower/read-write-buffer.f90 | 2 | ||||
-rw-r--r-- | flang/unittests/Optimizer/Builder/FIRBuilderTest.cpp | 2 |
9 files changed, 14 insertions, 12 deletions
diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp index 8ffff7ad7809..ae82a5afa2ac 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 5d2f28177bcb..60f6fac107bf 100644 --- a/flang/test/Lower/allocatable-assignment.f90 +++ b/flang/test/Lower/allocatable-assignment.f90 @@ -1242,7 +1242,7 @@ subroutine test_both_sides_with_elemental_call(x) ! 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 7f1874d3f083..fad419ea9fc3 100644 --- a/flang/test/Lower/character-assignment.f90 +++ b/flang/test/Lower/character-assignment.f90 @@ -102,7 +102,7 @@ end subroutine ! 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 1ab93dcc1732..50050190803e 100755 --- a/flang/test/Lower/convert.f90 +++ b/flang/test/Lower/convert.f90 @@ -21,11 +21,11 @@ end ! 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 3112da33dc0f..d9307abd7473 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 4348767ec203..4d414e069f59 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 0a9a5b34b938..7789effc0d31 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 889209242cb4..188cdb088973 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 c3436ccd1c77..650a4d13b2b5 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()); |