From eed959015b74763873f17ea82ba141f93952e007 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 6 Nov 2014 14:39:49 +0000 Subject: [PATCH] Compute the correct jump table entries on 32 bit windows. On 32 bit windows we use label differences and .set does not suppress rolocations, a combination that was not used before r220256. This fixes PR21497. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221456 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 5 ++-- test/CodeGen/X86/win32-pic-jumptable.ll | 36 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/X86/win32-pic-jumptable.ll diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index ba42742dd35..61f1d1b653e 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1247,8 +1247,9 @@ void AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo *MJTI, break; } Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext); - const MCExpr *JTI = MCSymbolRefExpr::Create(GetJTISymbol(UID), OutContext); - Value = MCBinaryExpr::CreateSub(Value, JTI, OutContext); + const TargetLowering *TLI = TM.getSubtargetImpl()->getTargetLowering(); + const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF, UID, OutContext); + Value = MCBinaryExpr::CreateSub(Value, Base, OutContext); break; } } diff --git a/test/CodeGen/X86/win32-pic-jumptable.ll b/test/CodeGen/X86/win32-pic-jumptable.ll new file mode 100644 index 00000000000..cabd36ae395 --- /dev/null +++ b/test/CodeGen/X86/win32-pic-jumptable.ll @@ -0,0 +1,36 @@ +; RUN: llc < %s -relocation-model=pic | FileCheck %s + +; CHECK: calll L0$pb +; CHECK-NEXT: L0$pb: +; CHECK-NEXT: popl %eax +; CHECK-NEXT: addl LJTI0_0(,%ecx,4), %eax +; CHECK-NEXT: jmpl *%eax + +; CHECK: LJTI0_0: +; CHECK-NEXT: .long LBB0_4-L0$pb +; CHECK-NEXT: .long LBB0_5-L0$pb +; CHECK-NEXT: .long LBB0_6-L0$pb +; CHECK-NEXT: .long LBB0_7-L0$pb + + +target triple = "i686--windows-itanium" +define i32 @f(i64 %x) { +bb0: + switch i64 %x, label %bb5 [ + i64 1, label %bb1 + i64 2, label %bb2 + i64 3, label %bb3 + i64 4, label %bb4 + ] +bb1: + br label %bb5 +bb2: + br label %bb5 +bb3: + br label %bb5 +bb4: + br label %bb5 +bb5: + %y = phi i32 [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ] + ret i32 %y +} -- 2.34.1