diff options
| author | Reid Kleckner <reid@kleckner.net> | 2015-07-07 23:23:03 +0000 |
|---|---|---|
| committer | Reid Kleckner <reid@kleckner.net> | 2015-07-07 23:23:03 +0000 |
| commit | d5afc62ff61ceb8e6339cf6bc89c278d90ec4a09 (patch) | |
| tree | 2a2576e4916ab0b391cf1d0e012900a1aa8ee072 /llvm/lib/Target/X86/X86ISelLowering.cpp | |
| parent | 142ec39739ce2cdfaea28407f916e241bbd4c43c (diff) | |
| download | bcm5719-llvm-d5afc62ff61ceb8e6339cf6bc89c278d90ec4a09.tar.gz bcm5719-llvm-d5afc62ff61ceb8e6339cf6bc89c278d90ec4a09.zip | |
[WinEH] Add localaddress intrinsic instead of using frameaddress
Clang uses this for SEH finally. The new intrinsic will produce the
right value when stack realignment is required.
llvm-svn: 241643
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 1b37912cf61..cc9374450ce 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -15737,6 +15737,19 @@ static SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, const X86Subtarget *Subtarget "llvm.x86.seh.recoverfp must take a function as the first argument"); return recoverFramePointer(DAG, Fn, IncomingFPOp); } + + case Intrinsic::localaddress: { + // Returns one of the stack, base, or frame pointer registers, depending on + // which is used to reference local variables. + MachineFunction &MF = DAG.getMachineFunction(); + const X86RegisterInfo *RegInfo = Subtarget->getRegisterInfo(); + unsigned Reg; + if (RegInfo->hasBasePointer(MF)) + Reg = RegInfo->getBaseRegister(); + else // This function handles the SP or FP case. + Reg = RegInfo->getPtrSizedFrameRegister(MF); + return DAG.getCopyFromReg(DAG.getEntryNode(), dl, Reg, VT); + } } } |

