Files
clang-p2996/llvm/test/CodeGen/X86/mingw-comdats.ll
Pan, Tao 7af802994e [CodeGen] Add text section prefix for COFF object file
Text section prefix is created in CodeGenPrepare, it's file format independent implementation,  text section name is written into object file in TargetLoweringObjectFile, it's file format dependent implementation, port code of adding text section prefix to text section name from ELF to COFF.
Different with ELF that use '.' as concatenation character, COFF use '$' as concatenation character. That is, concatenation character is variable, so split concatenation character from text section prefix.
Text section prefix is existing feature of ELF, it can help to reduce icache and itlb misses, it's also make possible aggregate other compilers e.g. v8 created same prefix sections. Furthermore, the recent feature Machine Function Splitter (basic block level text prefix section) is based on text section prefix.

Reviewed By: pengfei, rnk

Differential Revision: https://reviews.llvm.org/D92073
2020-12-08 18:56:21 +08:00

100 lines
2.9 KiB
LLVM

; 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.
; 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; }
; 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
}
; 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 {
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
; GNU32: .section .text$_Z3fooi,"xr",discard,__Z3fooi
; GNU32: __Z3fooi:
; GNU32: .section .data$gv,"dw",discard,_gv
; GNU32: _gv:
; GNU32: .long 42
define linkonce_odr dso_local i32 @_Z3fooj(i32 %x) !section_prefix !0 {
entry:
%call = tail call i32 @_Z3bari(i32 %x)
%0 = load i32, i32* @gv, align 4
%add = add nsw i32 %0, %call
ret i32 %add
}
; Make sure the assembler puts the .xdata and .pdata in sections with the right
; names.
; GNUOBJ: .text$_Z3fooi
; GNUOBJ: .xdata$_Z3fooi
; GNUOBJ: .text$unlikely$_Z3fooj
; GNUOBJ: .xdata$unlikely$_Z3fooj
; GNUOBJ: .data$gv
; GNUOBJ: .pdata$_Z3fooi
; GNUOBJ: .pdata$unlikely$_Z3fooj
declare dso_local i32 @_Z3bari(i32)
attributes #0 = { norecurse uwtable }
attributes #1 = { inlinehint uwtable }
!0 = !{!"function_section_prefix", !"unlikely"}