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:
Akira Hatanaka
2011-07-01 01:04:43 +00:00
parent 68c0dbc14f
commit c4f24eb584
5 changed files with 72 additions and 25 deletions

View File

@@ -38,6 +38,8 @@
#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h" #include "llvm/ADT/Twine.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
#include "llvm/Analysis/DebugInfo.h"
using namespace llvm; using namespace llvm;
namespace { namespace {
@@ -75,6 +77,10 @@ namespace {
void EmitInstruction(const MachineInstr *MI) { void EmitInstruction(const MachineInstr *MI) {
SmallString<128> Str; SmallString<128> Str;
raw_svector_ostream OS(Str); raw_svector_ostream OS(Str);
if (MI->isDebugValue())
PrintDebugValueComment(MI, OS);
printInstruction(MI, OS); printInstruction(MI, OS);
OutStreamer.EmitRawText(OS.str()); OutStreamer.EmitRawText(OS.str());
} }
@@ -86,6 +92,9 @@ namespace {
virtual void EmitFunctionEntryLabel(); virtual void EmitFunctionEntryLabel();
void EmitStartOfAsmFile(Module &M); void EmitStartOfAsmFile(Module &M);
virtual MachineLocation getDebugValueLocation(const MachineInstr *MI) const;
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
}; };
} // end of anonymous namespace } // end of anonymous namespace
@@ -441,6 +450,21 @@ void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) {
OutStreamer.EmitRawText(StringRef("\t.previous")); OutStreamer.EmitRawText(StringRef("\t.previous"));
} }
MachineLocation
MipsAsmPrinter::getDebugValueLocation(const MachineInstr *MI) const {
// Handles frame addresses emitted in MipsInstrInfo::emitFrameIndexDebugValue.
assert(MI->getNumOperands() == 4 && "Invalid no. of machine operands!");
assert(MI->getOperand(0).isReg() && MI->getOperand(1).isImm() &&
"Unexpected MachineOperand types");
return MachineLocation(MI->getOperand(0).getReg(),
MI->getOperand(1).getImm());
}
void MipsAsmPrinter::PrintDebugValueComment(const MachineInstr *MI,
raw_ostream &OS) {
// TODO: implement
}
// Force static initialization. // Force static initialization.
extern "C" void LLVMInitializeMipsAsmPrinter() { extern "C" void LLVMInitializeMipsAsmPrinter() {
RegisterAsmPrinter<MipsAsmPrinter> X(TheMipsTarget); RegisterAsmPrinter<MipsAsmPrinter> X(TheMipsTarget);

View File

@@ -217,6 +217,15 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
llvm_unreachable("Register class not handled!"); llvm_unreachable("Register class not handled!");
} }
MachineInstr*
MipsInstrInfo::emitFrameIndexDebugValue(MachineFunction &MF, int FrameIx,
uint64_t Offset, const MDNode *MDPtr,
DebugLoc DL) const {
MachineInstrBuilder MIB = BuildMI(MF, DL, get(Mips::DBG_VALUE))
.addFrameIndex(FrameIx).addImm(0).addImm(Offset).addMetadata(MDPtr);
return &*MIB;
}
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Branch Analysis // Branch Analysis
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@@ -224,6 +224,11 @@ public:
const TargetRegisterClass *RC, const TargetRegisterClass *RC,
const TargetRegisterInfo *TRI) const; const TargetRegisterInfo *TRI) const;
virtual MachineInstr* emitFrameIndexDebugValue(MachineFunction &MF,
int FrameIx, uint64_t Offset,
const MDNode *MDPtr,
DebugLoc DL) const;
virtual virtual
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const; bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;

View File

@@ -16,7 +16,7 @@ using namespace llvm;
MipsMCAsmInfo::MipsMCAsmInfo(const Target &T, StringRef TT) { MipsMCAsmInfo::MipsMCAsmInfo(const Target &T, StringRef TT) {
AlignmentIsInBytes = false; AlignmentIsInBytes = false;
Data16bitsDirective = "\t.half\t"; Data16bitsDirective = "\t.2byte\t";
Data32bitsDirective = "\t.4byte\t"; Data32bitsDirective = "\t.4byte\t";
Data64bitsDirective = 0; Data64bitsDirective = 0;
PrivateGlobalPrefix = "$"; PrivateGlobalPrefix = "$";

View File

@@ -35,6 +35,7 @@
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/BitVector.h" #include "llvm/ADT/BitVector.h"
#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/STLExtras.h"
#include "llvm/Analysis/DebugInfo.h"
#define GET_REGINFO_MC_DESC #define GET_REGINFO_MC_DESC
#define GET_REGINFO_TARGET_DESC #define GET_REGINFO_TARGET_DESC
@@ -179,30 +180,6 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
<< "spOffset : " << spOffset << "\n" << "spOffset : " << spOffset << "\n"
<< "stackSize : " << stackSize << "\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(); const std::vector<CalleeSavedInfo> &CSI = MFI->getCalleeSavedInfo();
int MinCSFI = 0; int MinCSFI = 0;
int MaxCSFI = -1; int MaxCSFI = -1;
@@ -218,12 +195,44 @@ eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj,
// 3. Locations for callee-saved registers. // 3. Locations for callee-saved registers.
// Everything else is referenced relative to whatever register // Everything else is referenced relative to whatever register
// getFrameRegister() returns. // getFrameRegister() returns.
unsigned FrameReg;
if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isDynAllocFI(FrameIndex) || if (MipsFI->isOutArgFI(FrameIndex) || MipsFI->isDynAllocFI(FrameIndex) ||
(FrameIndex >= MinCSFI && FrameIndex <= MaxCSFI)) (FrameIndex >= MinCSFI && FrameIndex <= MaxCSFI))
FrameReg = Mips::SP; FrameReg = Mips::SP;
else else
FrameReg = getFrameRegister(MF); 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 // Offset fits in the 16-bit field
if (Offset < 0x8000 && Offset >= -0x8000) { if (Offset < 0x8000 && Offset >= -0x8000) {
NewReg = FrameReg; NewReg = FrameReg;