| ; RUN: llc < %s -relocation-model=static | FileCheck %s |
| ; RUN: llc < %s -relocation-model=pic | FileCheck %s --check-prefix=PIC |
| ; RUN: llc < %s -relocation-model=pic -code-model=large | FileCheck %s --check-prefix=PIC |
| |
| ; 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.bb2 |
| ; CHECK: .LBB0_{{.*}}: # %sw.bb3 |
| ; CHECK: .LBB0_{{.*}}: # %sw.bb1 |
| ; CHECK: callq g |
| ; CHECK: jmp g # TAILCALL |
| ; CHECK: .section .rdata,"dr" |
| ; CHECK: .quad .LBB0_ |
| ; CHECK: .quad .LBB0_ |
| ; CHECK: .quad .LBB0_ |
| ; CHECK: .quad .LBB0_ |
| |
| ; It's important that we switch back to .text here, not .rdata. |
| ; CHECK: .text |
| ; CHECK: .seh_endproc |
| |
| ; Windows PIC code should use 32-bit entries |
| ; PIC: .long .LBB0_2-.LJTI0_0 |
| ; PIC: .long .LBB0_3-.LJTI0_0 |
| ; PIC: .long .LBB0_4-.LJTI0_0 |
| ; PIC: .long .LBB0_5-.LJTI0_0 |