From 6332dbec69017aa9505468102775f6e7399dcb8c Mon Sep 17 00:00:00 2001
From: Evan Cheng <evan.cheng@apple.com>
Date: Thu, 31 Jan 2008 04:06:00 +0000
Subject: [PATCH] Add x86 specific getFrameIndexOffset(). This fixes local
 variable debugging info.

llvm-svn: 46598
---
 llvm/lib/Target/X86/X86RegisterInfo.cpp | 14 ++++++++++++++
 llvm/lib/Target/X86/X86RegisterInfo.h   |  1 +
 2 files changed, 15 insertions(+)

diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp
index 2f8ee1dadd89..53efdc8d5543 100644
--- a/llvm/lib/Target/X86/X86RegisterInfo.cpp
+++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp
@@ -835,6 +835,20 @@ unsigned X86RegisterInfo::getFrameRegister(MachineFunction &MF) const {
   return hasFP(MF) ? FramePtr : StackPtr;
 }
 
+int
+X86RegisterInfo::getFrameIndexOffset(MachineFunction &MF, unsigned FI) const {
+  int Offset = MF.getFrameInfo()->getObjectOffset(FI) + SlotSize;
+  if (!hasFP(MF))
+    return Offset + MF.getFrameInfo()->getStackSize();
+
+  Offset += SlotSize;  // Skip the saved EBP
+  // Skip the RETADDR move area
+  X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
+  int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
+  if (TailCallReturnAddrDelta < 0) Offset -= TailCallReturnAddrDelta;
+  return Offset;
+}
+
 void X86RegisterInfo::getInitialFrameState(std::vector<MachineMove> &Moves)
                                                                          const {
   // Calculate amount of bytes used for return address storing
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.h b/llvm/lib/Target/X86/X86RegisterInfo.h
index 16bbf074898e..fd18c4135db5 100644
--- a/llvm/lib/Target/X86/X86RegisterInfo.h
+++ b/llvm/lib/Target/X86/X86RegisterInfo.h
@@ -122,6 +122,7 @@ public:
   // Debug information queries.
   unsigned getRARegister() const;
   unsigned getFrameRegister(MachineFunction &MF) const;
+  int getFrameIndexOffset(MachineFunction &MF, unsigned FI) const;
   void getInitialFrameState(std::vector<MachineMove> &Moves) const;
 
   // Exception handling queries.