The frame address on an x86-64 box needs to be offset by -8, not -4.
authorBill Wendling <isanbard@gmail.com>
Fri, 11 Jul 2008 07:18:52 +0000 (07:18 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 11 Jul 2008 07:18:52 +0000 (07:18 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53450 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/x86-64-frameaddr.ll [new file with mode: 0644]

index 958f7425cdeb73ec17c9c25dd402f1d6e911947b..5dd0116726e612f6f0d3de2fe5cfa727c6a8cc0b 100644 (file)
@@ -5348,7 +5348,7 @@ SDOperand X86TargetLowering::LowerFRAMEADDR(SDOperand Op, SelectionDAG &DAG) {
     
   SDOperand RetAddrFI = getReturnAddressFrameIndex(DAG);
   return DAG.getNode(ISD::SUB, getPointerTy(), RetAddrFI, 
-                     DAG.getIntPtrConstant(4));
+                     DAG.getIntPtrConstant(!Subtarget->is64Bit() ? 4 : 8));
 }
 
 SDOperand X86TargetLowering::LowerFRAME_TO_ARGS_OFFSET(SDOperand Op,
diff --git a/test/CodeGen/X86/x86-64-frameaddr.ll b/test/CodeGen/X86/x86-64-frameaddr.ll
new file mode 100644 (file)
index 0000000..86a238f
--- /dev/null
@@ -0,0 +1,11 @@
+; RUN: llvm-as < %s | llc -march=x86-64 | grep {leaq   -8(%rsp), %rax}
+@llvm.noinline = appending global [1 x i8*] [ i8* bitcast (i64* ()* @stack_end_address to i8*) ], section "llvm.metadata"
+
+define internal i64* @stack_end_address() nounwind  {
+entry:
+       tail call i8* @llvm.frameaddress( i32 0 )
+       bitcast i8* %0 to i64*
+       ret i64* %1
+}
+
+declare i8* @llvm.frameaddress(i32) nounwind readnone