[llvm] [Cygwin] Emit COMDAT name correctly for Cygwin (PR #138621)
via llvm-commits
llvm-commits at lists.llvm.org
Mon May 5 18:24:13 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
Author: Tomohiro Kashiwada (kikairoya)
<details>
<summary>Changes</summary>
Cygwin-gcc emits COMDAT in the same format as MinGW-gcc.
Checking for the behavior of gcc:
```
$ cat test.cc
int bar(int);
__declspec(selectany) int gv = 42;
inline int foo(int x) { try { return bar(x) + gv; } catch (...) { return 0; } }
int main() { return foo(1); }
$ x86_64-pc-cygwin-gcc -c test.cc -o test.cygwin.o
$ x86_64-w64-mingw32-gcc -c test.cc -o test.mingw.o
$ objdump -h test.mingw.o
test.mingw.o: ファイル形式 pe-x86-64
セクション:
Idx Name Size VMA LMA File off Algn
0 .text 00000020 0000000000000000 0000000000000000 000001a4 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000000 0000000000000000 0000000000000000 00000000 2**4
ALLOC, LOAD, DATA
2 .bss 00000000 0000000000000000 0000000000000000 00000000 2**4
ALLOC
3 .data$gv 00000010 0000000000000000 0000000000000000 000001c4 2**4
CONTENTS, ALLOC, LOAD, DATA, LINK_ONCE_SAME_SIZE (COMDAT gv 25)
4 .text$_Z3fooi 00000040 0000000000000000 0000000000000000 000001d4 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE, LINK_ONCE_DISCARD (COMDAT _Z3fooi 6)
5 .xdata$_Z3fooi 00000024 0000000000000000 0000000000000000 00000214 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA, LINK_ONCE_DISCARD
6 .pdata$_Z3fooi 0000000c 0000000000000000 0000000000000000 00000238 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA, LINK_ONCE_DISCARD
7 .xdata 0000000c 0000000000000000 0000000000000000 00000244 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .pdata 0000000c 0000000000000000 0000000000000000 00000250 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
9 .rdata$zzz 00000020 0000000000000000 0000000000000000 0000025c 2**4
CONTENTS, ALLOC, LOAD, READONLY, DATA
$ diff -u <(objdump -h test.cygwin.o) <(objdump -h test.mingw.o)
--- /dev/fd/63 2025-05-06 10:20:13.000000000 +0900
+++ /dev/fd/62 2025-05-06 10:20:13.000000000 +0900
@@ -1,5 +1,5 @@
-test.cygwin.o: ファイル形式 pe-x86-64
+test.mingw.o: ファイル形式 pe-x86-64
セクション:
Idx Name Size VMA LMA File off Algn
@@ -21,5 +21,5 @@
CONTENTS, ALLOC, LOAD, READONLY, DATA
8 .pdata 0000000c 0000000000000000 0000000000000000 00000250 2**2
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
- 9 .rdata$zzz 00000030 0000000000000000 0000000000000000 0000025c 2**4
+ 9 .rdata$zzz 00000020 0000000000000000 0000000000000000 0000025c 2**4
CONTENTS, ALLOC, LOAD, READONLY, DATA
```
Generated COMDAT names are identical.
> `- 9 .rdata$zzz 00000030 0000000000000000 0000000000000000 0000025c 2**4`
> `+ 9 .rdata$zzz 00000020 0000000000000000 0000000000000000 0000025c 2**4`
This difference comes from size of .rdata section, It's not point of this PR.
---
Full diff: https://github.com/llvm/llvm-project/pull/138621.diff
3 Files Affected:
- (modified) llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (+1-1)
- (modified) llvm/test/CodeGen/X86/mingw-comdats-xdata.ll (+2)
- (modified) llvm/test/CodeGen/X86/mingw-comdats.ll (+2)
``````````diff
diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
index c9415292e88f7..e1bdc7e09fdc0 100644
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -1830,7 +1830,7 @@ MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
// Append "$symbol" to the section name *before* IR-level mangling is
// applied when targetting mingw. This is what GCC does, and the ld.bfd
// COFF linker will not properly handle comdats otherwise.
- if (getContext().getTargetTriple().isWindowsGNUEnvironment())
+ if (getContext().getTargetTriple().isOSCygMing())
raw_svector_ostream(Name) << '$' << ComdatGV->getName();
return getContext().getCOFFSection(Name, Characteristics, COMDATSymName,
diff --git a/llvm/test/CodeGen/X86/mingw-comdats-xdata.ll b/llvm/test/CodeGen/X86/mingw-comdats-xdata.ll
index 1a60c155b3c4d..0e914a89aee76 100644
--- a/llvm/test/CodeGen/X86/mingw-comdats-xdata.ll
+++ b/llvm/test/CodeGen/X86/mingw-comdats-xdata.ll
@@ -1,5 +1,7 @@
; RUN: llc -mtriple=x86_64-w64-windows-gnu < %s | FileCheck %s --check-prefix=GNU
+; RUN: llc -mtriple=x86_64-pc-cygwin < %s | FileCheck %s --check-prefix=GNU
; RUN: llc -mtriple=x86_64-w64-windows-gnu < %s -filetype=obj | llvm-objdump - --headers | FileCheck %s --check-prefix=GNUOBJ
+; RUN: llc -mtriple=x86_64-pc-cygwin < %s -filetype=obj | llvm-objdump - --headers | FileCheck %s --check-prefix=GNUOBJ
; When doing GCC style comdats for MinGW, the .xdata sections don't have a normal comdat
; symbol attached, which requires a bit of adjustments for the assembler output.
diff --git a/llvm/test/CodeGen/X86/mingw-comdats.ll b/llvm/test/CodeGen/X86/mingw-comdats.ll
index bca8e12ea3c73..01a66470bbf8e 100644
--- a/llvm/test/CodeGen/X86/mingw-comdats.ll
+++ b/llvm/test/CodeGen/X86/mingw-comdats.ll
@@ -1,8 +1,10 @@
; RUN: llc -function-sections -mtriple=x86_64-windows-itanium < %s | FileCheck %s
; RUN: llc -function-sections -mtriple=x86_64-windows-msvc < %s | FileCheck %s
; RUN: llc -function-sections -mtriple=x86_64-w64-windows-gnu < %s | FileCheck %s --check-prefix=GNU
+; RUN: llc -function-sections -mtriple=x86_64-pc-cygwin < %s | FileCheck %s --check-prefix=GNU
; RUN: llc -function-sections -mtriple=i686-w64-windows-gnu < %s | FileCheck %s --check-prefix=GNU32
; RUN: llc -function-sections -mtriple=x86_64-w64-windows-gnu < %s -filetype=obj | llvm-objdump - --headers | FileCheck %s --check-prefix=GNUOBJ
+; RUN: llc -function-sections -mtriple=x86_64-pc-cygwin < %s -filetype=obj | llvm-objdump - --headers | FileCheck %s --check-prefix=GNUOBJ
; GCC and MSVC handle comdats completely differently. Make sure we do the right
; thing for each.
``````````
</details>
https://github.com/llvm/llvm-project/pull/138621
More information about the llvm-commits
mailing list