[CodeGen] [WinException] Only produce handler data at the end of the function if...
authorMartin Storsjö <martin@martin.st>
Thu, 10 Sep 2020 10:33:00 +0000 (13:33 +0300)
committerMartin Storsjö <martin@martin.st>
Mon, 21 Sep 2020 20:42:59 +0000 (23:42 +0300)
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

24 files changed:
llvm/lib/CodeGen/AsmPrinter/WinException.cpp
llvm/test/CodeGen/AArch64/win64-jumptable.ll
llvm/test/CodeGen/AArch64/wineh1.mir
llvm/test/CodeGen/X86/avx512-intel-ocl.ll
llvm/test/CodeGen/X86/avx512-regcall-Mask.ll
llvm/test/CodeGen/X86/avx512-regcall-NoMask.ll
llvm/test/CodeGen/X86/break-false-dep.ll
llvm/test/CodeGen/X86/conditional-tailcall-pgso.ll
llvm/test/CodeGen/X86/conditional-tailcall.ll
llvm/test/CodeGen/X86/gnu-seh-nolpads.ll
llvm/test/CodeGen/X86/mingw-comdats.ll
llvm/test/CodeGen/X86/mixed-ptr-sizes.ll
llvm/test/CodeGen/X86/musttail-varargs.ll
llvm/test/CodeGen/X86/no-sse-win64.ll
llvm/test/CodeGen/X86/win64-jumptable.ll
llvm/test/CodeGen/X86/win64_frame.ll
llvm/test/DebugInfo/COFF/defer-complete-type.ll
llvm/test/DebugInfo/COFF/enum-co.ll
llvm/test/DebugInfo/COFF/global_visibility.ll
llvm/test/DebugInfo/COFF/type-quals.ll
llvm/test/DebugInfo/COFF/types-basic.ll
llvm/test/DebugInfo/COFF/types-data-members.ll
llvm/test/DebugInfo/COFF/types-method-ref-qualifiers.ll
llvm/test/DebugInfo/COFF/types-recursive-struct.ll

index c47ac7e..08f259c 100644 (file)
@@ -258,11 +258,11 @@ void WinException::endFuncletImpl() {
     if (F.hasPersonalityFn())
       Per = classifyEHPersonality(F.getPersonalityFn()->stripPointerCasts());
 
-    // Emit an UNWIND_INFO struct describing the prologue.
-    Asm->OutStreamer->EmitWinEHHandlerData();
-
     if (Per == EHPersonality::MSVC_CXX && shouldEmitPersonality &&
         !CurrentFuncletEntry->isCleanupFuncletEntry()) {
+      // Emit an UNWIND_INFO struct describing the prologue.
+      Asm->OutStreamer->EmitWinEHHandlerData();
+
       // If this is a C++ catch funclet (or the parent function),
       // emit a reference to the LSDA for the parent function.
       StringRef FuncLinkageName = GlobalValue::dropLLVMManglingEscape(F.getName());
@@ -271,9 +271,22 @@ void WinException::endFuncletImpl() {
       Asm->OutStreamer->emitValue(create32bitRef(FuncInfoXData), 4);
     } else if (Per == EHPersonality::MSVC_Win64SEH && MF->hasEHFunclets() &&
                !CurrentFuncletEntry->isEHFuncletEntry()) {
+      // Emit an UNWIND_INFO struct describing the prologue.
+      Asm->OutStreamer->EmitWinEHHandlerData();
+
       // If this is the parent function in Win64 SEH, emit the LSDA immediately
       // following .seh_handlerdata.
       emitCSpecificHandlerTable(MF);
+    } else if (shouldEmitPersonality || shouldEmitLSDA) {
+      // Emit an UNWIND_INFO struct describing the prologue.
+      Asm->OutStreamer->EmitWinEHHandlerData();
+      // In these cases, no further info is written to the .xdata section
+      // right here, but is written by e.g. emitExceptionTable in endFunction()
+      // above.
+    } else {
+      // No need to emit the EH handler data right here if nothing needs
+      // writing to the .xdata section; it will be emitted for all
+      // functions that need it in the end anyway.
     }
 
     // Switch back to the funclet start .text section now that we are done
index 1071a73..7c4efa2 100644 (file)
@@ -44,8 +44,6 @@ declare void @g(i32, i32)
 ; CHECK:    .word .LBB0_3-.Ltmp0
 ; CHECK:    .word .LBB0_4-.Ltmp0
 ; CHECK:    .word .LBB0_5-.Ltmp0
-; CHECK:    .seh_handlerdata
-; CHECK:    .text
 ; CHECK:    .seh_endproc
 
 ; Check that we can emit an object file with correct unwind info.
index 2f73a52..d82e4bc 100644 (file)
@@ -73,8 +73,6 @@
 # ASM: .seh_endepilogue
 
 # ASM: .seh_endfunclet
-# ASM: .seh_handlerdata
-# ASM: .text
 # ASM: .seh_endproc
 
 ...
index b928541..439bf8d 100644 (file)
@@ -423,8 +423,6 @@ define <16 x float> @testf16_inp_mask(<16 x float> %a, i16 %mask)  {
 ; WIN64-KNL-NEXT:    nop
 ; WIN64-KNL-NEXT:    addq $40, %rsp
 ; WIN64-KNL-NEXT:    retq
-; WIN64-KNL-NEXT:    .seh_handlerdata
-; WIN64-KNL-NEXT:    .text
 ; WIN64-KNL-NEXT:    .seh_endproc
 ;
 ; WIN64-SKX-LABEL: testf16_inp_mask:
@@ -439,8 +437,6 @@ define <16 x float> @testf16_inp_mask(<16 x float> %a, i16 %mask)  {
 ; WIN64-SKX-NEXT:    nop
 ; WIN64-SKX-NEXT:    addq $40, %rsp
 ; WIN64-SKX-NEXT:    retq
-; WIN64-SKX-NEXT:    .seh_handlerdata
-; WIN64-SKX-NEXT:    .text
 ; WIN64-SKX-NEXT:    .seh_endproc
 ;
 ; X64-KNL-LABEL: testf16_inp_mask:
index 897632f..bbf4956 100644 (file)
@@ -157,8 +157,6 @@ define i64 @caller_argv64i1() #0 {
 ; WIN64-NEXT:    popq %r14
 ; WIN64-NEXT:    popq %r15
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: caller_argv64i1:
@@ -263,8 +261,6 @@ define <64 x i1> @caller_retv64i1() #0 {
 ; WIN64-NEXT:    popq %rdi
 ; WIN64-NEXT:    popq %rsi
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: caller_retv64i1:
@@ -349,8 +345,6 @@ define x86_regcallcc i32 @test_argv32i1(<32 x i1> %x0, <32 x i1> %x1, <32 x i1>
 ; WIN64-NEXT:    popq %r11
 ; WIN64-NEXT:    popq %rbp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_argv32i1:
@@ -438,8 +432,6 @@ define i32 @caller_argv32i1() #0 {
 ; WIN64-NEXT:    popq %rdi
 ; WIN64-NEXT:    popq %rsi
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: caller_argv32i1:
@@ -503,8 +495,6 @@ define i32 @caller_retv32i1() #0 {
 ; WIN64-NEXT:    popq %rdi
 ; WIN64-NEXT:    popq %rsi
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: caller_retv32i1:
@@ -584,8 +574,6 @@ define x86_regcallcc i16 @test_argv16i1(<16 x i1> %x0, <16 x i1> %x1, <16 x i1>
 ; WIN64-NEXT:    popq %r10
 ; WIN64-NEXT:    popq %r11
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_argv16i1:
@@ -672,8 +660,6 @@ define i16 @caller_argv16i1() #0 {
 ; WIN64-NEXT:    popq %rdi
 ; WIN64-NEXT:    popq %rsi
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: caller_argv16i1:
@@ -741,8 +727,6 @@ define i16 @caller_retv16i1() #0 {
 ; WIN64-NEXT:    popq %rdi
 ; WIN64-NEXT:    popq %rsi
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: caller_retv16i1:
@@ -824,8 +808,6 @@ define x86_regcallcc i8 @test_argv8i1(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)
 ; WIN64-NEXT:    popq %r10
 ; WIN64-NEXT:    popq %r11
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_argv8i1:
@@ -912,8 +894,6 @@ define i8 @caller_argv8i1() #0 {
 ; WIN64-NEXT:    popq %rdi
 ; WIN64-NEXT:    popq %rsi
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: caller_argv8i1:
@@ -985,8 +965,6 @@ define <8 x i1> @caller_retv8i1() #0 {
 ; WIN64-NEXT:    popq %rsi
 ; WIN64-NEXT:    vzeroupper
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: caller_retv8i1:
index e832e42..1ab55e1 100644 (file)
@@ -49,8 +49,6 @@ define x86_regcallcc i1 @test_CallargReti1(i1 %a)  {
 ; WIN64-NEXT:    incb %al
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargReti1:
@@ -117,8 +115,6 @@ define x86_regcallcc i8 @test_CallargReti8(i8 %a)  {
 ; WIN64-NEXT:    incb %al
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargReti8:
@@ -187,8 +183,6 @@ define x86_regcallcc i16 @test_CallargReti16(i16 %a)  {
 ; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargReti16:
@@ -251,8 +245,6 @@ define x86_regcallcc i32 @test_CallargReti32(i32 %a)  {
 ; WIN64-NEXT:    incl %eax
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargReti32:
@@ -318,8 +310,6 @@ define x86_regcallcc i64 @test_CallargReti64(i64 %a)  {
 ; WIN64-NEXT:    incq %rax
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargReti64:
@@ -392,8 +382,6 @@ define x86_regcallcc float @test_CallargRetFloat(float %a)  {
 ; WIN64-NEXT:    addq $16, %rsp
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargRetFloat:
@@ -474,8 +462,6 @@ define x86_regcallcc double @test_CallargRetDouble(double %a)  {
 ; WIN64-NEXT:    addq $16, %rsp
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargRetDouble:
@@ -575,8 +561,6 @@ define x86_regcallcc x86_fp80 @test_CallargRetf80(x86_fp80 %a)  {
 ; WIN64-NEXT:    fadd %st, %st(0)
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargRetf80:
@@ -616,8 +600,6 @@ define x86_regcallcc double @test_CallargParamf80(x86_fp80 %a)  {
 ; WIN64-NEXT:    vaddsd %xmm0, %xmm0, %xmm0
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargParamf80:
@@ -680,8 +662,6 @@ define x86_regcallcc [4 x i32]* @test_CallargRetPointer([4 x i32]* %a)  {
 ; WIN64-NEXT:    incl %eax
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargRetPointer:
@@ -774,8 +754,6 @@ define x86_regcallcc <4 x i32> @test_CallargRet128Vector(<4 x i1> %x, <4 x i32>
 ; WIN64-NEXT:    addq $32, %rsp
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargRet128Vector:
@@ -866,8 +844,6 @@ define x86_regcallcc <8 x i32> @test_CallargRet256Vector(<8 x i1> %x, <8 x i32>
 ; WIN64-NEXT:    addq $80, %rsp
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargRet256Vector:
@@ -954,8 +930,6 @@ define x86_regcallcc <16 x i32> @test_CallargRet512Vector(<16 x i1> %x, <16 x i3
 ; WIN64-NEXT:    addq $176, %rsp
 ; WIN64-NEXT:    popq %rsp
 ; WIN64-NEXT:    retq
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 ;
 ; LINUXOSX64-LABEL: test_CallargRet512Vector:
index e480ba1..9bc2b43 100644 (file)
@@ -519,8 +519,6 @@ define void @loopdep3() {
 ; SSE-WIN-NEXT:    addq $160, %rsp
 ; SSE-WIN-NEXT:    popq %rsi
 ; SSE-WIN-NEXT:    retq
-; SSE-WIN-NEXT:    .seh_handlerdata
-; SSE-WIN-NEXT:    .text
 ; SSE-WIN-NEXT:    .seh_endproc
 ;
 ; AVX-LABEL: loopdep3:
@@ -597,8 +595,6 @@ define void @loopdep3() {
 ; AVX-NEXT:    addq $160, %rsp
 ; AVX-NEXT:    popq %rsi
 ; AVX-NEXT:    retq
-; AVX-NEXT:    .seh_handlerdata
-; AVX-NEXT:    .text
 ; AVX-NEXT:    .seh_endproc
 entry:
   br label %for.cond1.preheader
@@ -716,8 +712,6 @@ define double @inlineasmdep(i64 %arg) {
 ; SSE-WIN-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; SSE-WIN-NEXT:    addq $168, %rsp
 ; SSE-WIN-NEXT:    retq
-; SSE-WIN-NEXT:    .seh_handlerdata
-; SSE-WIN-NEXT:    .text
 ; SSE-WIN-NEXT:    .seh_endproc
 ;
 ; AVX-LABEL: inlineasmdep:
@@ -775,8 +769,6 @@ define double @inlineasmdep(i64 %arg) {
 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; AVX-NEXT:    addq $168, %rsp
 ; AVX-NEXT:    retq
-; AVX-NEXT:    .seh_handlerdata
-; AVX-NEXT:    .text
 ; AVX-NEXT:    .seh_endproc
 top:
   tail call void asm sideeffect "", "~{xmm0},~{xmm1},~{xmm2},~{xmm3},~{dirflag},~{fpsr},~{flags}"()
@@ -879,8 +871,6 @@ define double @truedeps(float %arg) {
 ; SSE-WIN-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; SSE-WIN-NEXT:    addq $184, %rsp
 ; SSE-WIN-NEXT:    retq
-; SSE-WIN-NEXT:    .seh_handlerdata
-; SSE-WIN-NEXT:    .text
 ; SSE-WIN-NEXT:    .seh_endproc
 ;
 ; AVX-LABEL: truedeps:
@@ -942,8 +932,6 @@ define double @truedeps(float %arg) {
 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; AVX-NEXT:    addq $184, %rsp
 ; AVX-NEXT:    retq
-; AVX-NEXT:    .seh_handlerdata
-; AVX-NEXT:    .text
 ; AVX-NEXT:    .seh_endproc
 top:
   tail call void asm sideeffect "", "~{xmm6},~{dirflag},~{fpsr},~{flags}"()
@@ -1043,8 +1031,6 @@ define double @clearence(i64 %arg) {
 ; SSE-WIN-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; SSE-WIN-NEXT:    addq $168, %rsp
 ; SSE-WIN-NEXT:    retq
-; SSE-WIN-NEXT:    .seh_handlerdata
-; SSE-WIN-NEXT:    .text
 ; SSE-WIN-NEXT:    .seh_endproc
 ;
 ; AVX-LABEL: clearence:
@@ -1104,8 +1090,6 @@ define double @clearence(i64 %arg) {
 ; AVX-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; AVX-NEXT:    addq $168, %rsp
 ; AVX-NEXT:    retq
-; AVX-NEXT:    .seh_handlerdata
-; AVX-NEXT:    .text
 ; AVX-NEXT:    .seh_endproc
 top:
   tail call void asm sideeffect "", "~{xmm6},~{dirflag},~{fpsr},~{flags}"()
@@ -1416,8 +1400,6 @@ define void @loopclearance2(double* nocapture %y, i64* %x, double %c1, double %c
 ; SSE-WIN-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; SSE-WIN-NEXT:    addq $152, %rsp
 ; SSE-WIN-NEXT:    retq
-; SSE-WIN-NEXT:    .seh_handlerdata
-; SSE-WIN-NEXT:    .text
 ; SSE-WIN-NEXT:    .seh_endproc
 ;
 ; AVX1-LABEL: loopclearance2:
@@ -1499,8 +1481,6 @@ define void @loopclearance2(double* nocapture %y, i64* %x, double %c1, double %c
 ; AVX1-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; AVX1-NEXT:    addq $152, %rsp
 ; AVX1-NEXT:    retq
-; AVX1-NEXT:    .seh_handlerdata
-; AVX1-NEXT:    .text
 ; AVX1-NEXT:    .seh_endproc
 ;
 ; AVX512VL-LABEL: loopclearance2:
@@ -1582,8 +1562,6 @@ define void @loopclearance2(double* nocapture %y, i64* %x, double %c1, double %c
 ; AVX512VL-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
 ; AVX512VL-NEXT:    addq $152, %rsp
 ; AVX512VL-NEXT:    retq
-; AVX512VL-NEXT:    .seh_handlerdata
-; AVX512VL-NEXT:    .text
 ; AVX512VL-NEXT:    .seh_endproc
 entry:
   tail call void asm sideeffect "", "~{xmm7},~{dirflag},~{fpsr},~{flags}"()
index 65bd1da..074d9d1 100644 (file)
@@ -124,8 +124,6 @@ define void @f_non_leaf(i32 %x, i32 %y) !prof !14 {
 ; WIN64-NEXT:    jmp bar # TAILCALL
 ; WIN64-NEXT:    # encoding: [0xeb,A]
 ; WIN64-NEXT:    # fixup A - offset: 1, value: bar-1, kind: FK_PCRel_1
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 entry:
   ; Force %ebx to be spilled on the stack, turning this into
index 1707841..822e3d5 100644 (file)
@@ -124,8 +124,6 @@ define void @f_non_leaf(i32 %x, i32 %y) optsize {
 ; WIN64-NEXT:    jmp bar # TAILCALL
 ; WIN64-NEXT:    # encoding: [0xeb,A]
 ; WIN64-NEXT:    # fixup A - offset: 1, value: bar-1, kind: FK_PCRel_1
-; WIN64-NEXT:    .seh_handlerdata
-; WIN64-NEXT:    .text
 ; WIN64-NEXT:    .seh_endproc
 entry:
   ; Force %ebx to be spilled on the stack, turning this into
index 311f4d5..53912b0 100644 (file)
@@ -15,7 +15,6 @@ entry:
 ; CHECK: .seh_proc use_gxx_seh
 ; CHECK-NOT: .seh_handler __gxx_personality_seh0
 ; CHECK: callq throwit
-; CHECK: .seh_handlerdata
 ; CHECK: .seh_endproc
 
 define void @use_gcc_seh()
@@ -29,6 +28,5 @@ entry:
 ; CHECK: .seh_proc use_gcc_seh
 ; CHECK-NOT: .seh_handler __gcc_personality_seh0
 ; CHECK: callq throwit
-; CHECK: .seh_handlerdata
 ; CHECK: .seh_endproc
 
index c7caf92..ddf72cf 100644 (file)
@@ -77,8 +77,8 @@ entry:
 ; 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: .xdata$_Z3fooi
 ; GNUOBJ: .pdata$_Z3fooi
 
 declare dso_local i32 @_Z3bari(i32)
index e282f6d..76f775b 100644 (file)
@@ -135,8 +135,6 @@ define dso_local void @test_null_arg(%struct.Foo* %f) {
 ; ALL-NEXT:    nop
 ; ALL-NEXT:    addq $40, %rsp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
 entry:
   call void @test_noop1(%struct.Foo* %f, i32 addrspace(270)* null)
index 5d88f0d..6e29393 100644 (file)
@@ -236,8 +236,6 @@ define void @f_thunk(i8* %this, ...) {
 ; WINDOWS-NEXT:    popq %rsi
 ; WINDOWS-NEXT:    popq %r14
 ; WINDOWS-NEXT:    rex64 jmpq *%rax # TAILCALL
-; WINDOWS-NEXT:    .seh_handlerdata
-; WINDOWS-NEXT:    .text
 ; WINDOWS-NEXT:    .seh_endproc
 ;
 ; X86-NOSSE-LABEL: f_thunk:
index c220b96..258cdf2 100644 (file)
@@ -54,8 +54,6 @@ define void @pass_double(double* %p) {
 ; CHECK-NEXT:    nop
 ; CHECK-NEXT:    addq $40, %rsp
 ; CHECK-NEXT:    retq
-; CHECK-NEXT:    .seh_handlerdata
-; CHECK-NEXT:    .text
 ; CHECK-NEXT:    .seh_endproc
   %v = load double, double* %p
   call void @take_double(double %v)
@@ -73,8 +71,6 @@ define void @pass_float(float* %p) {
 ; CHECK-NEXT:    nop
 ; CHECK-NEXT:    addq $40, %rsp
 ; CHECK-NEXT:    retq
-; CHECK-NEXT:    .seh_handlerdata
-; CHECK-NEXT:    .text
 ; CHECK-NEXT:    .seh_endproc
   %v = load float, float* %p
   call void @take_float(float %v)
@@ -98,8 +94,6 @@ define void @call_double(double* %p) {
 ; CHECK-NEXT:    addq $32, %rsp
 ; CHECK-NEXT:    popq %rsi
 ; CHECK-NEXT:    retq
-; CHECK-NEXT:    .seh_handlerdata
-; CHECK-NEXT:    .text
 ; CHECK-NEXT:    .seh_endproc
   %v = call double @produce_double()
   store double %v, double* %p
@@ -120,8 +114,6 @@ define void @call_float(float* %p) {
 ; CHECK-NEXT:    addq $32, %rsp
 ; CHECK-NEXT:    popq %rsi
 ; CHECK-NEXT:    retq
-; CHECK-NEXT:    .seh_handlerdata
-; CHECK-NEXT:    .text
 ; CHECK-NEXT:    .seh_endproc
   %v = call float @produce_float()
   store float %v, float* %p
index 6bb9d64..000f176 100644 (file)
@@ -53,7 +53,6 @@ declare void @g(i32)
 ; 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
index 9158b19..7ba6c98 100644 (file)
@@ -13,8 +13,6 @@ define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "frame-pointer"="all
 ; ALL-NEXT:    movl 48(%rbp), %eax
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   ret i32 %p5
 }
@@ -37,8 +35,6 @@ define void @f2(i32 %p, ...) "frame-pointer"="all" {
 ; ALL-NEXT:    addq $8, %rsp
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   %ap = alloca i8, align 8
   call void @llvm.va_start(i8* %ap)
@@ -56,8 +52,6 @@ define i8* @f3() "frame-pointer"="all" {
 ; ALL-NEXT:    movq 8(%rbp), %rax
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   %ra = call i8* @llvm.returnaddress(i32 0)
   ret i8* %ra
@@ -77,8 +71,6 @@ define i8* @f4() "frame-pointer"="all" {
 ; ALL-NEXT:    addq $304, %rsp # imm = 0x130
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   alloca [300 x i8]
   %ra = call i8* @llvm.returnaddress(i32 0)
@@ -103,8 +95,6 @@ define void @f5() "frame-pointer"="all" {
 ; ALL-NEXT:    addq $336, %rsp # imm = 0x150
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   %a = alloca [300 x i8]
   %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
@@ -128,8 +118,6 @@ define void @f6(i32 %p, ...) "frame-pointer"="all" {
 ; ALL-NEXT:    addq $336, %rsp # imm = 0x150
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   %a = alloca [300 x i8]
   %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
@@ -152,8 +140,6 @@ define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "frame-pointer"="all" {
 ; ALL-NEXT:    leaq 176(%rbp), %rsp
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   alloca [300 x i8], align 64
   ret i32 %e
@@ -191,8 +177,6 @@ define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "frame-pointer"="all" {
 ; ALL-NEXT:    popq %rsi
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   %alloca = alloca [300 x i8], align 64
   alloca i32, i32 %a
@@ -213,8 +197,6 @@ define i64 @f9() {
 ; ALL-NEXT:    popq %rax
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
 entry:
   %call = call i64 @llvm.x86.flags.read.u64()
@@ -244,8 +226,6 @@ define i64 @f10(i64* %foo, i64 %bar, i64 %baz) {
 ; ALL-NEXT:    popq %rbx
 ; ALL-NEXT:    popq %rsi
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   %cx = cmpxchg i64* %foo, i64 %bar, i64 %baz seq_cst seq_cst
   %v = extractvalue { i64, i1 } %cx, 0
@@ -266,8 +246,6 @@ define i8* @f11() "frame-pointer"="all" {
 ; ALL-NEXT:    leaq 8(%rbp), %rax
 ; ALL-NEXT:    popq %rbp
 ; ALL-NEXT:    retq
-; ALL-NEXT:    .seh_handlerdata
-; ALL-NEXT:    .text
 ; ALL-NEXT:    .seh_endproc
   %aora = call i8* @llvm.addressofreturnaddress()
   ret i8* %aora
index 67b4f28..9f0b5da 100644 (file)
@@ -12,7 +12,7 @@
 ; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll
 
 ; CHECK: CodeViewTypes [
-; CHECK:   Section: .debug$T (6)
+; CHECK:   Section: .debug$T (5)
 ; CHECK:   Magic: 0x4
 ; CHECK:   Struct (0x1000) {
 ; CHECK:     TypeLeafKind: LF_STRUCTURE (0x1505)
index b6cb10b..08cd637 100644 (file)
@@ -31,7 +31,7 @@
 ; CHECK: Arch: x86_64
 ; CHECK: AddressSize: 64bit
 ; CHECK: CodeViewTypes [
-; CHECK:   Section: .debug$T (6)
+; CHECK:   Section: .debug$T (5)
 ; CHECK:   Magic: 0x4
 ; CHECK:   Enum ({{.*}}) {
 ; CHECK:     TypeLeafKind: LF_ENUM (0x1507)
index 4a5eff8..5765b8a 100644 (file)
@@ -42,7 +42,7 @@
 ;
 
 ; CHECK: CodeViewDebugInfo [
-; CHECK:   Section: .debug$S (9)
+; CHECK:   Section: .debug$S (8)
 
 ; CHECK:   Subsection [
 ; CHECK:     SubSectionType: Symbols (0xF1)
@@ -96,7 +96,7 @@
 ; CHECK:   ]
 ; CHECK: ]
 ; CHECK: CodeViewDebugInfo [
-; CHECK:   Section: .debug$S (16)
+; CHECK:   Section: .debug$S (12)
 ; CHECK:   Subsection [
 ; CHECK:     SubSectionType: Symbols (0xF1)
 ; CHECK:     GlobalData {
 ; CHECK:   ]
 ; CHECK: ]
 ; CHECK: CodeViewDebugInfo [
-; CHECK:   Section: .debug$S (17)
+; CHECK:   Section: .debug$S (15)
 ; CHECK:   Subsection [
 ; CHECK:     SubSectionType: Symbols (0xF1)
 ; CHECK:     GlobalData {
index c5953d3..5c0d5bf 100644 (file)
@@ -40,7 +40,7 @@
 
 
 ; CHECK: CodeViewTypes [
-; CHECK:   Section: .debug$T (7)
+; CHECK:   Section: .debug$T (6)
 ; CHECK:   Magic: 0x4
 ; CHECK:   Modifier (0x1000) {
 ; CHECK:     TypeLeafKind: LF_MODIFIER (0x1001)
 ; CHECK: ]
 
 ; CHECK-LABEL: CodeViewDebugInfo [
-; CHECK-NEXT:   Section: .debug$S (6)
+; CHECK-NEXT:   Section: .debug$S (5)
 ; CHECK:   Subsection [
 ; CHECK:     SubSectionType: Symbols (0xF1)
 ; CHECK:     GlobalProcIdSym {
index 81e0c25..537502f 100644 (file)
@@ -35,7 +35,7 @@
 ; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll
 
 ; CHECK: CodeViewTypes [
-; CHECK:   Section: .debug$T (6)
+; CHECK:   Section: .debug$T (5)
 ; CHECK:   Magic: 0x4
 ; CHECK:   ArgList (0x1000) {
 ; CHECK:     TypeLeafKind: LF_ARGLIST (0x1201)
index 87fde74..f470473 100644 (file)
@@ -39,7 +39,7 @@
 ; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll
 
 ; CHECK: CodeViewTypes [
-; CHECK:   Section: .debug$T (8)
+; CHECK:   Section: .debug$T (7)
 ; CHECK:   Magic: 0x4
 ; CHECK:   ArgList (0x1000) {
 ; CHECK:     TypeLeafKind: LF_ARGLIST (0x1201)
index bfb6735..479a2a9 100644 (file)
@@ -85,7 +85,7 @@ attributes #1 = { nounwind readnone speculatable }
 
 
 ; CHECK: CodeViewTypes [
-; CHECK:   Section: .debug$T (7)
+; CHECK:   Section: .debug$T (6)
 ; CHECK:   Magic: 0x4
 ; CHECK:   Pointer (0x1005) {
 ; CHECK:     TypeLeafKind: LF_POINTER (0x1002)
index d8697e4..5afd241 100644 (file)
@@ -20,7 +20,7 @@
 ; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll
 
 ; CHECK: CodeViewTypes [
-; CHECK:   Section: .debug$T (6)
+; CHECK:   Section: .debug$T (5)
 ; CHECK:   Magic: 0x4
 ; CHECK:   ArgList (0x1000) {
 ; CHECK:     TypeLeafKind: LF_ARGLIST (0x1201)