Skip to content

Commit

Permalink
[mingw] Use unmangled name after the $ in the section name
Browse files Browse the repository at this point in the history
GCC does it this way, and we have to be consistent. This includes
stdcall and fastcall functions with suffixes. I confirmed that a
fastcall function named "foo" ends up in ".text$foo", not
".text$@foo@8".

Based on a patch by Andrew Yohn!

Fixes PR39218.

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

llvm-svn: 347431
  • Loading branch information
rnk committed Nov 21, 2018
1 parent fd6a8ab commit 86ada54
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 10 deletions.
5 changes: 3 additions & 2 deletions llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Expand Up @@ -1317,10 +1317,11 @@ MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
MCSymbol *Sym = TM.getSymbol(ComdatGV);
StringRef COMDATSymName = Sym->getName();

// Append "$symbol" to the section name when targetting mingw. The ld.bfd
// 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 (getTargetTriple().isWindowsGNUEnvironment())
raw_svector_ostream(Name) << '$' << COMDATSymName;
raw_svector_ostream(Name) << '$' << ComdatGV->getName();

return getContext().getCOFFSection(Name, Characteristics, Kind,
COMDATSymName, Selection, UniqueID);
Expand Down
33 changes: 25 additions & 8 deletions llvm/test/CodeGen/X86/mingw-comdats.ll
@@ -1,13 +1,14 @@
; RUN: llc -mtriple=x86_64-windows-itanium < %s | FileCheck %s
; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s
; RUN: llc -mtriple=x86_64-w64-windows-gnu < %s | FileCheck %s --check-prefix=GNU
; RUN: llc -mtriple=i686-w64-windows-gnu < %s | FileCheck %s --check-prefix=GNU32
; RUN: llc -mtriple=x86_64-w64-windows-gnu < %s -filetype=obj | llvm-objdump - -headers | FileCheck %s --check-prefix=GNUOBJ
; 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=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

; GCC and MSVC handle comdats completely differently. Make sure we do the right
; thing for each.

; Generated with this C++ source:
; Modeled on this C++ source, with additional modifications for
; -ffunction-sections:
; int bar(int);
; __declspec(selectany) int gv = 42;
; inline int foo(int x) { return bar(x) + gv; }
Expand All @@ -26,8 +27,24 @@ entry:
ret i32 %call
}

; CHECK: .section .text,"xr",one_only,main
; CHECK: main:
; GNU: .section .text$main,"xr",one_only,main
; GNU: main:
; GNU32: .section .text$main,"xr",one_only,_main
; GNU32: _main:

define dso_local x86_fastcallcc i32 @fastcall(i32 %x, i32 %y) {
%rv = add i32 %x, %y
ret i32 %rv
}

; CHECK: .section .text,"xr",one_only,fastcall
; CHECK: fastcall:
; GNU: .section .text$fastcall,"xr",one_only,fastcall
; GNU: fastcall:
; GNU32: .section .text$fastcall,"xr",one_only,@fastcall@8
; GNU32: @fastcall@8:

; Function Attrs: inlinehint uwtable
define linkonce_odr dso_local i32 @_Z3fooi(i32 %x) #1 comdat {
Expand All @@ -50,9 +67,9 @@ entry:
; GNU: gv:
; GNU: .long 42

; GNU32: .section .text$__Z3fooi,"xr",discard,__Z3fooi
; GNU32: .section .text$_Z3fooi,"xr",discard,__Z3fooi
; GNU32: __Z3fooi:
; GNU32: .section .data$_gv,"dw",discard,_gv
; GNU32: .section .data$gv,"dw",discard,_gv
; GNU32: _gv:
; GNU32: .long 42

Expand Down

0 comments on commit 86ada54

Please sign in to comment.