mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-14 00:31:06 +00:00
Commit 122778 broke DWARF debug output when using the MBlaze backend. Fixed by overriding TargetFrameInfo::getFrameIndexOffset to take into account the new frame index information.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122889 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
31ff1333e0
commit
3d2148f5ac
@ -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.
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user