mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-03 17:24:24 +00:00
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:
parent
19332b06c3
commit
f2138c2df8
@ -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!");
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user