[PATCH] D48636: [Sparc] Flush register windows for @llvm.returnaddress(1)

Daniel Cederman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 27 05:22:01 PDT 2018


dcederman created this revision.
dcederman added reviewers: jyknight, venkatra.
Herald added subscribers: llvm-commits, jrtc27, fedor.sergeev.

When @llvm.returnaddress is called with a value higher than 0 it needs to read from the call stack to get the return address. This means that the register windows needs to be flushed to the stack to guarantee that the data read is valid. For values higher than 1 this is done indirectly by the call to getFRAMEADDR(), but not for the value 1.


Repository:
  rL LLVM

https://reviews.llvm.org/D48636

Files:
  lib/Target/Sparc/SparcISelLowering.cpp
  test/CodeGen/SPARC/2011-01-11-FrameAddr.ll


Index: test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
===================================================================
--- test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
+++ test/CodeGen/SPARC/2011-01-11-FrameAddr.ll
@@ -96,4 +96,22 @@
   ret i8* %0
 }
 
+define i8* @retaddr3() nounwind readnone {
+entry:
+;V8-LABEL: retaddr3:
+;V8: ta 3
+;V8: ld [%fp+60], {{.+}}
+
+;V9-LABEL: retaddr3:
+;V9: flushw
+;V9: ld [%fp+60], {{.+}}
+
+;SPARC64-LABEL: retaddr3
+;SPARC64:       flushw
+;SPARC64: ldx [%fp+2167],     %[[R0:[goli][0-7]]]
+
+  %0 = tail call i8* @llvm.returnaddress(i32 1)
+  ret i8* %0
+}
+
 declare i8* @llvm.returnaddress(i32) nounwind readnone
Index: lib/Target/Sparc/SparcISelLowering.cpp
===================================================================
--- lib/Target/Sparc/SparcISelLowering.cpp
+++ lib/Target/Sparc/SparcISelLowering.cpp
@@ -2730,15 +2730,17 @@
     return RetAddr;
   }
 
+  SDValue Chain = getFLUSHW(Op, DAG);
+
   // Need frame address to find return address of the caller.
   SDValue FrameAddr = getFRAMEADDR(depth - 1, Op, DAG, Subtarget);
 
   unsigned Offset = (Subtarget->is64Bit()) ? 120 : 60;
   SDValue Ptr = DAG.getNode(ISD::ADD,
                             dl, VT,
                             FrameAddr,
                             DAG.getIntPtrConstant(Offset, dl));
-  RetAddr = DAG.getLoad(VT, dl, DAG.getEntryNode(), Ptr, MachinePointerInfo());
+  RetAddr = DAG.getLoad(VT, dl, Chain, Ptr, MachinePointerInfo());
 
   return RetAddr;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D48636.153051.patch
Type: text/x-patch
Size: 1489 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180627/5d474f3a/attachment-0001.bin>


More information about the llvm-commits mailing list