X86: @llvm.frameaddress should defer to SelectionDAG for Win CFI

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228754 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer 2015-02-10 22:00:34 +00:00
parent 19332b06c3
commit f2138c2df8
2 changed files with 20 additions and 2 deletions

View File

@ -37,6 +37,7 @@
#include "llvm/IR/Instructions.h" #include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Operator.h" #include "llvm/IR/Operator.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetOptions.h"
using namespace llvm; using namespace llvm;
@ -2136,6 +2137,10 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
switch (II->getIntrinsicID()) { switch (II->getIntrinsicID()) {
default: return false; default: return false;
case Intrinsic::frameaddress: { case Intrinsic::frameaddress: {
MachineFunction *MF = FuncInfo.MF;
if (MF->getTarget().getMCAsmInfo()->usesWindowsCFI())
return false;
Type *RetTy = II->getCalledFunction()->getReturnType(); Type *RetTy = II->getCalledFunction()->getReturnType();
MVT VT; MVT VT;
@ -2153,11 +2158,11 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) {
// This needs to be set before we call getPtrSizedFrameRegister, otherwise // This needs to be set before we call getPtrSizedFrameRegister, otherwise
// we get the wrong frame register. // we get the wrong frame register.
MachineFrameInfo *MFI = FuncInfo.MF->getFrameInfo(); MachineFrameInfo *MFI = MF->getFrameInfo();
MFI->setFrameAddressIsTaken(true); MFI->setFrameAddressIsTaken(true);
const X86RegisterInfo *RegInfo = Subtarget->getRegisterInfo(); const X86RegisterInfo *RegInfo = Subtarget->getRegisterInfo();
unsigned FrameReg = RegInfo->getPtrSizedFrameRegister(*(FuncInfo.MF)); unsigned FrameReg = RegInfo->getPtrSizedFrameRegister(*MF);
assert(((FrameReg == X86::RBP && VT == MVT::i64) || assert(((FrameReg == X86::RBP && VT == MVT::i64) ||
(FrameReg == X86::EBP && VT == MVT::i32)) && (FrameReg == X86::EBP && VT == MVT::i32)) &&
"Invalid Frame Register!"); "Invalid Frame Register!");

View File

@ -1,5 +1,6 @@
; RUN: llc < %s -march=x86 | FileCheck %s --check-prefix=CHECK-32 ; RUN: llc < %s -march=x86 | FileCheck %s --check-prefix=CHECK-32
; RUN: llc < %s -march=x86 -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-32 ; RUN: llc < %s -march=x86 -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-32
; RUN: llc < %s -mtriple=x86_64-pc-win32 -fast-isel | FileCheck %s --check-prefix=CHECK-W64
; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=CHECK-64 ; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=CHECK-64
; RUN: llc < %s -mtriple=x86_64-unknown -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-64 ; RUN: llc < %s -mtriple=x86_64-unknown -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-64
; RUN: llc < %s -mtriple=x86_64-gnux32 | FileCheck %s --check-prefix=CHECK-X32ABI ; RUN: llc < %s -mtriple=x86_64-gnux32 | FileCheck %s --check-prefix=CHECK-X32ABI
@ -15,6 +16,12 @@ entry:
; CHECK-32-NEXT: movl %ebp, %eax ; CHECK-32-NEXT: movl %ebp, %eax
; CHECK-32-NEXT: pop ; CHECK-32-NEXT: pop
; CHECK-32-NEXT: ret ; CHECK-32-NEXT: ret
; CHECK-W64-LABEL: test1
; CHECK-W64: push
; CHECK-W64-NEXT: leaq (%rsp), %rbp
; CHECK-W64-NEXT: leaq (%rbp), %rax
; CHECK-W64-NEXT: pop
; CHECK-W64-NEXT: ret
; CHECK-64-LABEL: test1 ; CHECK-64-LABEL: test1
; CHECK-64: push ; CHECK-64: push
; CHECK-64-NEXT: movq %rsp, %rbp ; CHECK-64-NEXT: movq %rsp, %rbp
@ -44,6 +51,12 @@ entry:
; CHECK-32-NEXT: movl (%eax), %eax ; CHECK-32-NEXT: movl (%eax), %eax
; CHECK-32-NEXT: pop ; CHECK-32-NEXT: pop
; CHECK-32-NEXT: ret ; CHECK-32-NEXT: ret
; CHECK-W64-LABEL: test2
; CHECK-W64: push
; CHECK-W64-NEXT: leaq (%rsp), %rbp
; CHECK-W64-NEXT: leaq (%rbp), %rax
; CHECK-W64-NEXT: pop
; CHECK-W64-NEXT: ret
; CHECK-64-LABEL: test2 ; CHECK-64-LABEL: test2
; CHECK-64: push ; CHECK-64: push
; CHECK-64-NEXT: movq %rsp, %rbp ; CHECK-64-NEXT: movq %rsp, %rbp