Tighter data structure for deleted debug labels.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31152 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jim Laskey 2006-10-24 11:50:43 +00:00
parent ae5d51c9c9
commit fcc1d9473e
3 changed files with 22 additions and 8 deletions

View File

@ -30,8 +30,6 @@
#ifndef LLVM_CODEGEN_MACHINEDEBUGINFO_H #ifndef LLVM_CODEGEN_MACHINEDEBUGINFO_H
#define LLVM_CODEGEN_MACHINEDEBUGINFO_H #define LLVM_CODEGEN_MACHINEDEBUGINFO_H
#include <set>
#include "llvm/Support/Dwarf.h" #include "llvm/Support/Dwarf.h"
#include "llvm/Support/DataTypes.h" #include "llvm/Support/DataTypes.h"
#include "llvm/ADT/UniqueVector.h" #include "llvm/ADT/UniqueVector.h"
@ -981,9 +979,9 @@ private:
// //
DebugScope *RootScope; DebugScope *RootScope;
// DeletedLabelIDs - List of label IDs that have been removed from the // DeletedLabelIDs - Sorted list of label IDs that have been removed from the
// module. // module.
std::set<unsigned> DeletedLabelIDs; std::vector<unsigned> DeletedLabelIDs;
// FrameMoves - List of moves done by a function's prolog. Used to construct // FrameMoves - List of moves done by a function's prolog. Used to construct
// frame maps by debug consumers. // frame maps by debug consumers.

View File

@ -2207,8 +2207,7 @@ void DwarfWriter::EmitDebugLines() const {
const SourceLineInfo &LineInfo = LineInfos[i]; const SourceLineInfo &LineInfo = LineInfos[i];
unsigned LabelID = LineInfo.getLabelID(); unsigned LabelID = LineInfo.getLabelID();
// Throw out line info if label is invalid. // Source line labels are validated at the MachineDebugInfo level.
if (!DebugInfo->isLabelValid(LabelID)) continue;
if (DwarfVerbose) { if (DwarfVerbose) {
unsigned SourceID = LineInfo.getSourceID(); unsigned SourceID = LineInfo.getSourceID();

View File

@ -1544,16 +1544,33 @@ unsigned MachineDebugInfo::RecordLabel(unsigned Line, unsigned Column,
return ID; return ID;
} }
static bool LabelUIDComparison(const SourceLineInfo &LI, unsigned UID) {
return LI.getLabelID() < UID;
}
/// InvalidateLabel - Inhibit use of the specified label # from /// InvalidateLabel - Inhibit use of the specified label # from
/// MachineDebugInfo, for example because the code was deleted. /// MachineDebugInfo, for example because the code was deleted.
void MachineDebugInfo::InvalidateLabel(unsigned LabelID) { void MachineDebugInfo::InvalidateLabel(unsigned LabelID) {
DeletedLabelIDs.insert(LabelID); // Check source line list first. SourceLineInfo is sorted by LabelID.
std::vector<SourceLineInfo>::iterator I =
std::lower_bound(Lines.begin(), Lines.end(), LabelID, LabelUIDComparison);
if (I != Lines.end() && I->getLabelID() == LabelID) {
Lines.erase(I);
return;
}
// Otherwise add for use by isLabelValid.
std::vector<unsigned>::iterator J =
std::lower_bound(DeletedLabelIDs.begin(), DeletedLabelIDs.end(), LabelID);
DeletedLabelIDs.insert(J, LabelID);
} }
/// isLabelValid - Check to make sure the label is still valid before /// isLabelValid - Check to make sure the label is still valid before
/// attempting to use. /// attempting to use.
bool MachineDebugInfo::isLabelValid(unsigned LabelID) { bool MachineDebugInfo::isLabelValid(unsigned LabelID) {
return DeletedLabelIDs.find(LabelID) == DeletedLabelIDs.end(); std::vector<unsigned>::iterator I =
std::lower_bound(DeletedLabelIDs.begin(), DeletedLabelIDs.end(), LabelID);
return I != DeletedLabelIDs.end() && *I == LabelID;
} }
/// RecordSource - Register a source file with debug info. Returns an source /// RecordSource - Register a source file with debug info. Returns an source