mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-27 14:19:01 +00:00
Improve Mips back-end's handling of DBG_VALUE.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134224 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Analysis/DebugInfo.h"
|
||||
|
||||
#define GET_REGINFO_MC_DESC
|
||||
#define GET_REGINFO_TARGET_DESC
|
||||
@@ -179,30 +180,6 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
|
||||
<< "spOffset : " << spOffset << "\n"
|
||||
<< "stackSize : " << stackSize << "\n");
|
||||
|
||||
int Offset;
|
||||
|
||||
// Calculate final offset.
|
||||
// - There is no need to change the offset if the frame object is one of the
|
||||
// following: an outgoing argument, pointer to a dynamically allocated
|
||||
// stack space or a $gp restore location,
|
||||
// - If the frame object is any of the following, its offset must be adjusted
|
||||
// by adding the size of the stack:
|
||||
// incoming argument, callee-saved register location or local variable.
|
||||
if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isGPFI(FrameIndex) ||
|
||||
MipsFI->isDynAllocFI(FrameIndex))
|
||||
Offset = spOffset;
|
||||
else
|
||||
Offset = spOffset + stackSize;
|
||||
|
||||
Offset += MI.getOperand(i-1).getImm();
|
||||
|
||||
DEBUG(errs() << "Offset : " << Offset << "\n" << "<--------->\n");
|
||||
|
||||
unsigned NewReg = 0;
|
||||
int NewImm = 0;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
bool ATUsed;
|
||||
unsigned FrameReg;
|
||||
const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
|
||||
int MinCSFI = 0;
|
||||
int MaxCSFI = -1;
|
||||
@@ -218,12 +195,44 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
|
||||
// 3. Locations for callee-saved registers.
|
||||
// Everything else is referenced relative to whatever register
|
||||
// getFrameRegister() returns.
|
||||
unsigned FrameReg;
|
||||
|
||||
if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isDynAllocFI(FrameIndex) ||
|
||||
(FrameIndex >= MinCSFI && FrameIndex <= MaxCSFI))
|
||||
FrameReg = Mips::SP;
|
||||
else
|
||||
FrameReg = getFrameRegister(MF);
|
||||
|
||||
// Calculate final offset.
|
||||
// - There is no need to change the offset if the frame object is one of the
|
||||
// following: an outgoing argument, pointer to a dynamically allocated
|
||||
// stack space or a $gp restore location,
|
||||
// - If the frame object is any of the following, its offset must be adjusted
|
||||
// by adding the size of the stack:
|
||||
// incoming argument, callee-saved register location or local variable.
|
||||
int Offset;
|
||||
|
||||
if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isGPFI(FrameIndex) ||
|
||||
MipsFI->isDynAllocFI(FrameIndex))
|
||||
Offset = spOffset;
|
||||
else
|
||||
Offset = spOffset + stackSize;
|
||||
|
||||
if (MI.isDebugValue()) {
|
||||
MI.getOperand(i).ChangeToRegister(FrameReg, false /*isDef*/);
|
||||
MI.getOperand(i+1).ChangeToImmediate(Offset);
|
||||
return;
|
||||
}
|
||||
|
||||
Offset += MI.getOperand(i-1).getImm();
|
||||
|
||||
DEBUG(errs() << "Offset : " << Offset << "\n" << "<--------->\n");
|
||||
|
||||
unsigned NewReg = 0;
|
||||
int NewImm = 0;
|
||||
MachineBasicBlock &MBB = *MI.getParent();
|
||||
bool ATUsed;
|
||||
|
||||
// Offset fits in the 16-bit field
|
||||
if (Offset < 0x8000 && Offset >= -0x8000) {
|
||||
NewReg = FrameReg;
|
||||
|
||||
Reference in New Issue
Block a user