2018-11-22 06:01:10 +08:00
|
|
|
; 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
|
[mingw] Fix GCC ABI compatibility for comdat things
Summary:
GCC and the binutils COFF linker do comdats differently from MSVC.
If we want to be ABI compatible, we have to do what they do, which is to
emit unique section names like ".text$_Z3foov" instead of short section
names like ".text". Otherwise, the binutils linker gets confused and
reports multiple definition errors when two object files from GCC and
Clang containing the same inline function are linked together.
The best description of the issue is probably at
https://github.com/Alexpux/MINGW-packages/issues/1677, we don't seem to
have a good one in our tracker.
I fixed up the .pdata and .xdata sections needed everywhere other than
32-bit x86. GCC doesn't use associative comdats for those, it appears to
rely on the section name.
Reviewers: smeenai, compnerd, mstorsjo, martell, mati865
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D48402
llvm-svn: 335286
2018-06-22 04:27:38 +08:00
|
|
|
|
|
|
|
; GCC and MSVC handle comdats completely differently. Make sure we do the right
|
|
|
|
; thing for each.
|
|
|
|
|
2018-11-22 06:01:10 +08:00
|
|
|
; Modeled on this C++ source, with additional modifications for
|
|
|
|
; -ffunction-sections:
|
[mingw] Fix GCC ABI compatibility for comdat things
Summary:
GCC and the binutils COFF linker do comdats differently from MSVC.
If we want to be ABI compatible, we have to do what they do, which is to
emit unique section names like ".text$_Z3foov" instead of short section
names like ".text". Otherwise, the binutils linker gets confused and
reports multiple definition errors when two object files from GCC and
Clang containing the same inline function are linked together.
The best description of the issue is probably at
https://github.com/Alexpux/MINGW-packages/issues/1677, we don't seem to
have a good one in our tracker.
I fixed up the .pdata and .xdata sections needed everywhere other than
32-bit x86. GCC doesn't use associative comdats for those, it appears to
rely on the section name.
Reviewers: smeenai, compnerd, mstorsjo, martell, mati865
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D48402
llvm-svn: 335286
2018-06-22 04:27:38 +08:00
|
|
|
; int bar(int);
|
|
|
|
; __declspec(selectany) int gv = 42;
|
|
|
|
; inline int foo(int x) { return bar(x) + gv; }
|
|
|
|
; int main() { return foo(1); }
|
|
|
|
|
|
|
|
$_Z3fooi = comdat any
|
|
|
|
|
|
|
|
$gv = comdat any
|
|
|
|
|
|
|
|
@gv = weak_odr dso_local global i32 42, comdat, align 4
|
|
|
|
|
|
|
|
; Function Attrs: norecurse uwtable
|
|
|
|
define dso_local i32 @main() #0 {
|
|
|
|
entry:
|
|
|
|
%call = tail call i32 @_Z3fooi(i32 1)
|
|
|
|
ret i32 %call
|
|
|
|
}
|
|
|
|
|
2018-11-22 06:01:10 +08:00
|
|
|
; CHECK: .section .text,"xr",one_only,main
|
[mingw] Fix GCC ABI compatibility for comdat things
Summary:
GCC and the binutils COFF linker do comdats differently from MSVC.
If we want to be ABI compatible, we have to do what they do, which is to
emit unique section names like ".text$_Z3foov" instead of short section
names like ".text". Otherwise, the binutils linker gets confused and
reports multiple definition errors when two object files from GCC and
Clang containing the same inline function are linked together.
The best description of the issue is probably at
https://github.com/Alexpux/MINGW-packages/issues/1677, we don't seem to
have a good one in our tracker.
I fixed up the .pdata and .xdata sections needed everywhere other than
32-bit x86. GCC doesn't use associative comdats for those, it appears to
rely on the section name.
Reviewers: smeenai, compnerd, mstorsjo, martell, mati865
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D48402
llvm-svn: 335286
2018-06-22 04:27:38 +08:00
|
|
|
; CHECK: main:
|
2018-11-22 06:01:10 +08:00
|
|
|
; GNU: .section .text$main,"xr",one_only,main
|
[mingw] Fix GCC ABI compatibility for comdat things
Summary:
GCC and the binutils COFF linker do comdats differently from MSVC.
If we want to be ABI compatible, we have to do what they do, which is to
emit unique section names like ".text$_Z3foov" instead of short section
names like ".text". Otherwise, the binutils linker gets confused and
reports multiple definition errors when two object files from GCC and
Clang containing the same inline function are linked together.
The best description of the issue is probably at
https://github.com/Alexpux/MINGW-packages/issues/1677, we don't seem to
have a good one in our tracker.
I fixed up the .pdata and .xdata sections needed everywhere other than
32-bit x86. GCC doesn't use associative comdats for those, it appears to
rely on the section name.
Reviewers: smeenai, compnerd, mstorsjo, martell, mati865
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D48402
llvm-svn: 335286
2018-06-22 04:27:38 +08:00
|
|
|
; GNU: main:
|
2018-11-22 06:01:10 +08:00
|
|
|
; 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:
|
[mingw] Fix GCC ABI compatibility for comdat things
Summary:
GCC and the binutils COFF linker do comdats differently from MSVC.
If we want to be ABI compatible, we have to do what they do, which is to
emit unique section names like ".text$_Z3foov" instead of short section
names like ".text". Otherwise, the binutils linker gets confused and
reports multiple definition errors when two object files from GCC and
Clang containing the same inline function are linked together.
The best description of the issue is probably at
https://github.com/Alexpux/MINGW-packages/issues/1677, we don't seem to
have a good one in our tracker.
I fixed up the .pdata and .xdata sections needed everywhere other than
32-bit x86. GCC doesn't use associative comdats for those, it appears to
rely on the section name.
Reviewers: smeenai, compnerd, mstorsjo, martell, mati865
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D48402
llvm-svn: 335286
2018-06-22 04:27:38 +08:00
|
|
|
|
|
|
|
; Function Attrs: inlinehint uwtable
|
|
|
|
define linkonce_odr dso_local i32 @_Z3fooi(i32 %x) #1 comdat {
|
|
|
|
entry:
|
|
|
|
%call = tail call i32 @_Z3bari(i32 %x)
|
|
|
|
%0 = load i32, i32* @gv, align 4
|
|
|
|
%add = add nsw i32 %0, %call
|
|
|
|
ret i32 %add
|
|
|
|
}
|
|
|
|
|
|
|
|
; CHECK: .section .text,"xr",discard,_Z3fooi
|
|
|
|
; CHECK: _Z3fooi:
|
|
|
|
; CHECK: .section .data,"dw",discard,gv
|
|
|
|
; CHECK: gv:
|
|
|
|
; CHECK: .long 42
|
|
|
|
|
|
|
|
; GNU: .section .text$_Z3fooi,"xr",discard,_Z3fooi
|
|
|
|
; GNU: _Z3fooi:
|
|
|
|
; GNU: .section .data$gv,"dw",discard,gv
|
|
|
|
; GNU: gv:
|
|
|
|
; GNU: .long 42
|
|
|
|
|
2018-11-22 06:01:10 +08:00
|
|
|
; GNU32: .section .text$_Z3fooi,"xr",discard,__Z3fooi
|
2018-06-22 07:06:33 +08:00
|
|
|
; GNU32: __Z3fooi:
|
2018-11-22 06:01:10 +08:00
|
|
|
; GNU32: .section .data$gv,"dw",discard,_gv
|
2018-06-22 07:06:33 +08:00
|
|
|
; GNU32: _gv:
|
|
|
|
; GNU32: .long 42
|
|
|
|
|
|
|
|
|
[mingw] Fix GCC ABI compatibility for comdat things
Summary:
GCC and the binutils COFF linker do comdats differently from MSVC.
If we want to be ABI compatible, we have to do what they do, which is to
emit unique section names like ".text$_Z3foov" instead of short section
names like ".text". Otherwise, the binutils linker gets confused and
reports multiple definition errors when two object files from GCC and
Clang containing the same inline function are linked together.
The best description of the issue is probably at
https://github.com/Alexpux/MINGW-packages/issues/1677, we don't seem to
have a good one in our tracker.
I fixed up the .pdata and .xdata sections needed everywhere other than
32-bit x86. GCC doesn't use associative comdats for those, it appears to
rely on the section name.
Reviewers: smeenai, compnerd, mstorsjo, martell, mati865
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D48402
llvm-svn: 335286
2018-06-22 04:27:38 +08:00
|
|
|
; Make sure the assembler puts the .xdata and .pdata in sections with the right
|
|
|
|
; names.
|
|
|
|
; GNUOBJ: .text$_Z3fooi
|
|
|
|
; GNUOBJ: .xdata$_Z3fooi
|
|
|
|
; GNUOBJ: .data$gv
|
|
|
|
; GNUOBJ: .pdata$_Z3fooi
|
|
|
|
|
|
|
|
declare dso_local i32 @_Z3bari(i32)
|
|
|
|
|
|
|
|
attributes #0 = { norecurse uwtable }
|
|
|
|
attributes #1 = { inlinehint uwtable }
|