summaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2011-03-22 19:18:42 +0000
committerAndrew Trick <atrick@apple.com>2011-03-22 19:18:42 +0000
commitc1dbd5d9c30ea67ae45f190ff90e076cdf8bbc17 (patch)
treea174c59395d7ca84096e5115461e51d83bee5104 /lib/CodeGen
parent91dde155f1c42417e4db24fb595494b14fd7ab2e (diff)
downloadllvm-c1dbd5d9c30ea67ae45f190ff90e076cdf8bbc17.tar.gz
llvm-c1dbd5d9c30ea67ae45f190ff90e076cdf8bbc17.tar.bz2
llvm-c1dbd5d9c30ea67ae45f190ff90e076cdf8bbc17.tar.xz
Revert r128045 and r128051, debug info enhancements.
Temporarily reverting these to see if we can get llvm-objdump to link. Hopefully this is not the problem. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128097 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.cpp97
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfDebug.h12
-rw-r--r--lib/CodeGen/LiveDebugVariables.cpp17
3 files changed, 49 insertions, 77 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index c775c38f70..15330c28d2 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -2424,7 +2424,8 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
ME = DbgValues.end(); MI != ME; ++MI) {
const MDNode *Var =
(*MI)->getOperand((*MI)->getNumOperands()-1).getMetadata();
- if (Var == DV && !PrevMI->isIdenticalTo(*MI))
+ if (Var == DV &&
+ !PrevMI->isIdenticalTo(*MI))
MultipleValues.push_back(*MI);
PrevMI = *MI;
}
@@ -2447,7 +2448,7 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
DbgVariableToDbgInstMap[AbsVar] = MInsn;
VarToAbstractVarMap[RegVar] = AbsVar;
}
- if (MultipleValues.size() <= 1 && !RegClobberInsn.count(MInsn)) {
+ if (MultipleValues.size() <= 1) {
DbgVariableToDbgInstMap[RegVar] = MInsn;
continue;
}
@@ -2457,11 +2458,16 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
RegVar->setDotDebugLocOffset(0);
else
RegVar->setDotDebugLocOffset(DotDebugLocEntries.size());
-
+ const MachineInstr *Begin = NULL;
+ const MachineInstr *End = NULL;
for (SmallVector<const MachineInstr *, 4>::iterator
MVI = MultipleValues.begin(), MVE = MultipleValues.end();
MVI != MVE; ++MVI) {
- const MachineInstr *Begin = *MVI;
+ if (!Begin) {
+ Begin = *MVI;
+ continue;
+ }
+ End = *MVI;
MachineLocation MLoc;
if (Begin->getNumOperands() == 3) {
if (Begin->getOperand(0).isReg() && Begin->getOperand(1).isImm())
@@ -2469,25 +2475,25 @@ DwarfDebug::collectVariableInfo(const MachineFunction *MF,
} else
MLoc = Asm->getDebugValueLocation(Begin);
- if (!MLoc.getReg())
- continue;
-
- // Compute the range for a register location.
const MCSymbol *FLabel = getLabelBeforeInsn(Begin);
- const MCSymbol *SLabel = 0;
+ const MCSymbol *SLabel = getLabelBeforeInsn(End);
+ if (MLoc.getReg())
+ DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
- if (const MachineInstr *ClobberMI = RegClobberInsn.lookup(Begin))
- // The register range starting at Begin may be clobbered.
- SLabel = getLabelAfterInsn(ClobberMI);
- else if (MVI + 1 == MVE)
- // If Begin is the last instruction then its value is valid
+ Begin = End;
+ if (MVI + 1 == MVE) {
+ // If End is the last instruction then its value is valid
// until the end of the funtion.
- SLabel = FunctionEndSym;
- else
- // The value is valid until the next DBG_VALUE.
- SLabel = getLabelBeforeInsn(MVI[1]);
-
- DotDebugLocEntries.push_back(DotDebugLocEntry(FLabel, SLabel, MLoc));
+ MachineLocation EMLoc;
+ if (End->getNumOperands() == 3) {
+ if (End->getOperand(0).isReg() && Begin->getOperand(1).isImm())
+ EMLoc.set(Begin->getOperand(0).getReg(), Begin->getOperand(1).getImm());
+ } else
+ EMLoc = Asm->getDebugValueLocation(End);
+ if (EMLoc.getReg())
+ DotDebugLocEntries.
+ push_back(DotDebugLocEntry(SLabel, FunctionEndSym, EMLoc));
+ }
}
DotDebugLocEntries.push_back(DotDebugLocEntry());
}
@@ -2562,7 +2568,7 @@ void DwarfDebug::beginInstruction(const MachineInstr *MI) {
/// endInstruction - Process end of an instruction.
void DwarfDebug::endInstruction(const MachineInstr *MI) {
- if (InsnsNeedsLabelAfter.count(MI) != 0) {
+ if (InsnsEndScopeSet.count(MI) != 0) {
// Emit a label if this instruction ends a scope.
MCSymbol *Label = MMI->getContext().CreateTempSymbol();
Asm->OutStreamer.EmitLabel(Label);
@@ -2827,7 +2833,7 @@ void DwarfDebug::identifyScopeMarkers() {
RE = Ranges.end(); RI != RE; ++RI) {
assert(RI->first && "DbgRange does not have first instruction!");
assert(RI->second && "DbgRange does not have second instruction!");
- InsnsNeedsLabelAfter.insert(RI->second);
+ InsnsEndScopeSet.insert(RI->second);
}
}
}
@@ -2908,14 +2914,6 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
/// ProcessedArgs - Collection of arguments already processed.
SmallPtrSet<const MDNode *, 8> ProcessedArgs;
- /// LastDbgValue - Refer back to the last DBG_VALUE instruction to mention MD.
- DenseMap<const MDNode*, const MachineInstr*> LastDbgValue;
-
- const TargetRegisterInfo *TRI = Asm->TM.getRegisterInfo();
-
- /// LiveUserVar - Map physreg numbers to the MDNode they contain.
- std::vector<const MDNode*> LiveUserVar(TRI->getNumRegs());
-
DebugLoc PrevLoc;
for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
I != E; ++I)
@@ -2925,15 +2923,7 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
DebugLoc DL = MI->getDebugLoc();
if (MI->isDebugValue()) {
assert (MI->getNumOperands() > 1 && "Invalid machine instruction!");
-
- // Keep track of variables in registers.
- const MDNode *Var =
- MI->getOperand(MI->getNumOperands() - 1).getMetadata();
- LastDbgValue[Var] = MI;
- if (isDbgValueInDefinedReg(MI))
- LiveUserVar[MI->getOperand(0).getReg()] = Var;
-
- DIVariable DV(Var);
+ DIVariable DV(MI->getOperand(MI->getNumOperands() - 1).getMetadata());
if (!DV.Verify()) continue;
// If DBG_VALUE is for a local variable then it needs a label.
if (DV.getTag() != dwarf::DW_TAG_arg_variable)
@@ -2954,32 +2944,6 @@ void DwarfDebug::beginFunction(const MachineFunction *MF) {
} else if (DL != PrevLoc)
// Otherwise, instruction needs a location only if it is new location.
InsnNeedsLabel.insert(MI);
-
- // Check if the instruction clobbers any registers with debug vars.
- for (MachineInstr::const_mop_iterator MOI = MI->operands_begin(),
- MOE = MI->operands_end(); MOI != MOE; ++MOI) {
- if (!MOI->isReg() || !MOI->isDef() || !MOI->getReg())
- continue;
- for (const unsigned *AI = TRI->getOverlaps(MOI->getReg());
- unsigned Reg = *AI; ++AI) {
- const MDNode *Var = LiveUserVar[Reg];
- if (!Var)
- continue;
- // Reg is now clobbered.
- LiveUserVar[Reg] = 0;
-
- // Was MD last defined by a DBG_VALUE referring to Reg?
- const MachineInstr *Last = LastDbgValue.lookup(Var);
- if (!Last || Last->getParent() != MI->getParent())
- continue;
- if (!isDbgValueInDefinedReg(Last) ||
- Last->getOperand(0).getReg() != Reg)
- continue;
- // MD is clobbered. Make sure the next instruction gets a label.
- InsnsNeedsLabelAfter.insert(MI);
- RegClobberInsn[Last] = MI;
- }
- }
}
if (!DL.isUnknown() || UnknownLocations)
@@ -3049,8 +3013,7 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
VarToAbstractVarMap.clear();
DbgVariableToDbgInstMap.clear();
DeleteContainerSeconds(DbgScopeMap);
- InsnsNeedsLabelAfter.clear();
- RegClobberInsn.clear();
+ InsnsEndScopeSet.clear();
ConcreteScopes.clear();
DeleteContainerSeconds(AbstractScopes);
AbstractScopesList.clear();
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h
index e59ab5bd82..2863ea3806 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.h
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h
@@ -200,6 +200,8 @@ class DwarfDebug {
typedef SmallVector<DbgScope *, 2> ScopeVector;
+ SmallPtrSet<const MachineInstr *, 8> InsnsEndScopeSet;
+
/// InlineInfo - Keep track of inlined functions and their location. This
/// information is used to populate debug_inlined section.
typedef std::pair<const MCSymbol *, DIE *> InlineInfoLabels;
@@ -222,16 +224,6 @@ class DwarfDebug {
/// a debuggging information entity.
SmallPtrSet<const MachineInstr *, 8> InsnNeedsLabel;
- /// InsnsNeedsLabelAfter - Collection of instructions that need a label after
- /// the instruction because they end a scope of clobber a register.
- SmallPtrSet<const MachineInstr *, 8> InsnsNeedsLabelAfter;
-
- /// RegClobberInsn - For each DBG_VALUE instruction referring to a register
- /// that is clobbered before the variable gets a new DBG_VALUE, map the
- /// instruction that clobbered the register. This instruction will also be in
- /// InsnsNeedsLabelAfter.
- DenseMap<const MachineInstr *, const MachineInstr *> RegClobberInsn;
-
SmallVector<const MCSymbol *, 8> DebugRangeSymbols;
/// Previous instruction's location information. This is used to determine
diff --git a/lib/CodeGen/LiveDebugVariables.cpp b/lib/CodeGen/LiveDebugVariables.cpp
index 900dc01327..20e997ae37 100644
--- a/lib/CodeGen/LiveDebugVariables.cpp
+++ b/lib/CodeGen/LiveDebugVariables.cpp
@@ -101,6 +101,10 @@ class UserValue {
void insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx, unsigned LocNo,
LiveIntervals &LIS, const TargetInstrInfo &TII);
+ /// insertDebugKill - Insert an undef DBG_VALUE into MBB at Idx.
+ void insertDebugKill(MachineBasicBlock *MBB, SlotIndex Idx,
+ LiveIntervals &LIS, const TargetInstrInfo &TII);
+
public:
/// UserValue - Create a new UserValue.
UserValue(const MDNode *var, unsigned o, DebugLoc L,
@@ -748,6 +752,13 @@ void UserValue::insertDebugValue(MachineBasicBlock *MBB, SlotIndex Idx,
.addOperand(Loc).addImm(offset).addMetadata(variable);
}
+void UserValue::insertDebugKill(MachineBasicBlock *MBB, SlotIndex Idx,
+ LiveIntervals &LIS, const TargetInstrInfo &TII) {
+ MachineBasicBlock::iterator I = findInsertLocation(MBB, Idx, LIS);
+ BuildMI(*MBB, I, findDebugLoc(), TII.get(TargetOpcode::DBG_VALUE)).addReg(0)
+ .addImm(offset).addMetadata(variable);
+}
+
void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,
const TargetInstrInfo &TII) {
MachineFunction::iterator MFEnd = VRM->getMachineFunction().end();
@@ -779,6 +790,12 @@ void UserValue::emitDebugValues(VirtRegMap *VRM, LiveIntervals &LIS,
break;
++I;
+ if (Stop == MBBEnd)
+ continue;
+ // The current interval ends before MBB.
+ // Insert a kill if there is a gap.
+ if (!I.valid() || I.start() > Stop)
+ insertDebugKill(MBB, Stop, LIS, TII);
}
}