Commit 122778 broke DWARF debug output when using the MBlaze backend. Fixed by overri...
authorWesley Peck <peckw@wesleypeck.com>
Wed, 5 Jan 2011 17:34:20 +0000 (17:34 +0000)
committerWesley Peck <peckw@wesleypeck.com>
Wed, 5 Jan 2011 17:34:20 +0000 (17:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122889 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/MBlaze/MBlazeFrameInfo.cpp
lib/Target/MBlaze/MBlazeFrameInfo.h
lib/Target/MBlaze/MBlazeMachineFunction.h

index 1e4f337fe5a32ce0130608a708d4a10d186f027c..ab888c9348c582bd68d7e23226b3f193d11d1039 100644 (file)
@@ -43,6 +43,7 @@ namespace llvm {
 static void replaceFrameIndexes(MachineFunction &MF, 
                                 SmallVector<std::pair<int,int64_t>, 16> &FR) {
   MachineFrameInfo *MFI = MF.getFrameInfo();
+  MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
   const SmallVector<std::pair<int,int64_t>, 16>::iterator FRB = FR.begin();
   const SmallVector<std::pair<int,int64_t>, 16>::iterator FRE = FR.end();
 
@@ -50,6 +51,7 @@ static void replaceFrameIndexes(MachineFunction &MF,
   for (; FRI != FRE; ++FRI) {
     MFI->RemoveStackObject(FRI->first);
     int NFI = MFI->CreateFixedObject(4, FRI->second, true);
+    MBlazeFI->recordReplacement(FRI->first, NFI);
 
     for (MachineFunction::iterator MB=MF.begin(), ME=MF.end(); MB!=ME; ++MB) {
       MachineBasicBlock::iterator MBB = MB->begin();
@@ -321,6 +323,14 @@ static void determineFrameLayout(MachineFunction &MF) {
   DEBUG(dbgs() << "Aligned Frame Size: " << FrameSize << "\n" );
 }
 
+int MBlazeFrameInfo::getFrameIndexOffset(const MachineFunction &MF, int FI) 
+  const {
+  const MBlazeFunctionInfo *MBlazeFI = MF.getInfo<MBlazeFunctionInfo>();
+  if (MBlazeFI->hasReplacement(FI))
+    FI = MBlazeFI->getReplacement(FI);
+  return TargetFrameInfo::getFrameIndexOffset(MF,FI);
+}
+
 // hasFP - Return true if the specified function should have a dedicated frame
 // pointer register.  This is true if the function has variable sized allocas or
 // if frame pointer elimination is disabled.
index 03c39f05024f25ed15a824ae26366670279db777..8c8bfeb9969adae701d226fdbe8c221a33fb77fb 100644 (file)
@@ -42,6 +42,8 @@ public:
 
   bool hasFP(const MachineFunction &MF) const;
 
+  int getFrameIndexOffset(const MachineFunction &MF, int FI) const;
+
   virtual void processFunctionBeforeCalleeSavedScan(MachineFunction &MF,
                                                     RegScavenger *RS) const;
 };
index 8340d921ba45dd6eac3b3862a55945ddc51990de..df395094282fbb88a3843dba2d06749ca3c992a1 100644 (file)
@@ -14,6 +14,7 @@
 #ifndef MBLAZE_MACHINE_FUNCTION_INFO_H
 #define MBLAZE_MACHINE_FUNCTION_INFO_H
 
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/VectorExtras.h"
 #include "llvm/CodeGen/MachineFunction.h"
@@ -63,6 +64,11 @@ private:
   SmallVector<MBlazeFIHolder, 4> FnStoreVarArgs;
   bool HasStoreVarArgs;
 
+  // When determining the final stack layout some of the frame indexes may
+  // be replaced by new frame indexes that reside in the caller's stack
+  // frame. The replacements are recorded in this structure.
+  DenseMap<int,int> FIReplacements;
+
   /// SRetReturnReg - Some subtargets require that sret lowering includes
   /// returning the value of the returned struct in a register. This field
   /// holds the virtual register into which the sret argument is passed.
@@ -115,6 +121,18 @@ public:
 
   const SmallVector<int, 16>& getLiveIn() const { return LiveInFI; }
 
+  void recordReplacement(int OFI, int NFI) {
+    FIReplacements.insert(std::make_pair(OFI,NFI));
+  }
+
+  bool hasReplacement(int OFI) const {
+    return FIReplacements.find(OFI) != FIReplacements.end();
+  }
+
+  int getReplacement(int OFI) const {
+    return FIReplacements.lookup(OFI);
+  }
+
   void recordLoadArgsFI(int FI, int SPOffset) {
     if (!HasLoadArgs) HasLoadArgs=true;
     FnLoadArgs.push_back(MBlazeFIHolder(FI, SPOffset));