mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
0be5551915
This caused an explosion in ICF times during linking on Windows when libfuzzer instrumentation is enabled. For a small binary we see ICF time go from ~0 to ~10 s. For a large binary it goes from ~1 s to forevert (I gave up after 30 minutes). See comment on the code review. > If we are going to write handler data (that is written as variable > length data following after the unwind info in .xdata), we need to > emit the handler data immediately, but for cases where no such > info is going to be written, skip emitting it right away. (Unwind > info for all remaining functions that hasn't gotten it emitted > directly is emitted at the end.) > > This does slightly change the ordering of sections (triggering a > bunch of updates to DebugInfo/COFF tests), but the change should be > benign. > > This also matches GCC's assembly output, which doesn't output > .seh_handlerdata unless it actually is needed. > > For ARM64, the unwind info can be packed into the runtime function > entry itself (leaving no data in the .xdata section at all), but > that can only be done if there's no follow-on data in the .xdata > section. If emission of the unwind info is triggered via > EmitWinEHHandlerData (or the .seh_handlerdata directive), which > implicitly switches to the .xdata section, there's a chance of the > caller wanting to pass further data there, so the packed format > can't be used in that case. > > Differential Revision: https://reviews.llvm.org/D87448 This reverts commit 36c64af9d7f97414d48681b74352c9684077259b.
61 lines
1.6 KiB
LLVM
61 lines
1.6 KiB
LLVM
; RUN: llc < %s -relocation-model static | FileCheck %s
|
|
|
|
; FIXME: Remove '-relocation-model static' when it is no longer necessary to
|
|
; trigger the separate .rdata section.
|
|
|
|
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-pc-windows-msvc19.0.24215"
|
|
|
|
define void @f(i32 %x) {
|
|
entry:
|
|
switch i32 %x, label %sw.epilog [
|
|
i32 0, label %sw.bb
|
|
i32 1, label %sw.bb1
|
|
i32 2, label %sw.bb2
|
|
i32 3, label %sw.bb3
|
|
]
|
|
|
|
sw.bb: ; preds = %entry
|
|
tail call void @g(i32 0) #2
|
|
br label %sw.epilog
|
|
|
|
sw.bb1: ; preds = %entry
|
|
tail call void @g(i32 1) #2
|
|
br label %sw.epilog
|
|
|
|
sw.bb2: ; preds = %entry
|
|
tail call void @g(i32 2) #2
|
|
br label %sw.epilog
|
|
|
|
sw.bb3: ; preds = %entry
|
|
tail call void @g(i32 3) #2
|
|
br label %sw.epilog
|
|
|
|
sw.epilog: ; preds = %entry, %sw.bb3, %sw.bb2, %sw.bb1, %sw.bb
|
|
tail call void @g(i32 10) #2
|
|
ret void
|
|
}
|
|
|
|
declare void @g(i32)
|
|
|
|
; CHECK: .text
|
|
; CHECK: f:
|
|
; CHECK: .seh_proc f
|
|
; CHECK: jmpq *.LJTI0_0
|
|
; CHECK: .LBB0_{{.*}}: # %sw.bb
|
|
; CHECK: .LBB0_{{.*}}: # %sw.bb1
|
|
; CHECK: .LBB0_{{.*}}: # %sw.bb2
|
|
; CHECK: .LBB0_{{.*}}: # %sw.bb3
|
|
; CHECK: callq g
|
|
; CHECK: jmp g # TAILCALL
|
|
; CHECK: .section .rdata,"dr"
|
|
; CHECK: .quad .LBB0_
|
|
; CHECK: .quad .LBB0_
|
|
; CHECK: .quad .LBB0_
|
|
; CHECK: .quad .LBB0_
|
|
; CHECK: .seh_handlerdata
|
|
|
|
; It's important that we switch back to .text here, not .rdata.
|
|
; CHECK: .text
|
|
; CHECK: .seh_endproc
|