diff --git a/include/llvm/CodeGen/MachineDebugInfo.h b/include/llvm/CodeGen/MachineDebugInfo.h index 940adb78996..39b24640723 100644 --- a/include/llvm/CodeGen/MachineDebugInfo.h +++ b/include/llvm/CodeGen/MachineDebugInfo.h @@ -30,8 +30,6 @@ #ifndef LLVM_CODEGEN_MACHINEDEBUGINFO_H #define LLVM_CODEGEN_MACHINEDEBUGINFO_H -#include - #include "llvm/Support/Dwarf.h" #include "llvm/Support/DataTypes.h" #include "llvm/ADT/UniqueVector.h" @@ -981,9 +979,9 @@ private: // 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. - std::set DeletedLabelIDs; + std::vector DeletedLabelIDs; // FrameMoves - List of moves done by a function's prolog. Used to construct // frame maps by debug consumers. diff --git a/lib/CodeGen/DwarfWriter.cpp b/lib/CodeGen/DwarfWriter.cpp index c600edbdf83..7e3e4831d1e 100644 --- a/lib/CodeGen/DwarfWriter.cpp +++ b/lib/CodeGen/DwarfWriter.cpp @@ -2207,8 +2207,7 @@ void DwarfWriter::EmitDebugLines() const { const SourceLineInfo &LineInfo = LineInfos[i]; unsigned LabelID = LineInfo.getLabelID(); - // Throw out line info if label is invalid. - if (!DebugInfo->isLabelValid(LabelID)) continue; + // Source line labels are validated at the MachineDebugInfo level. if (DwarfVerbose) { unsigned SourceID = LineInfo.getSourceID(); diff --git a/lib/CodeGen/MachineDebugInfo.cpp b/lib/CodeGen/MachineDebugInfo.cpp index 380b8a9656d..b895cd7727a 100644 --- a/lib/CodeGen/MachineDebugInfo.cpp +++ b/lib/CodeGen/MachineDebugInfo.cpp @@ -1544,16 +1544,33 @@ unsigned MachineDebugInfo::RecordLabel(unsigned Line, unsigned Column, return ID; } +static bool LabelUIDComparison(const SourceLineInfo &LI, unsigned UID) { + return LI.getLabelID() < UID; +} + /// InvalidateLabel - Inhibit use of the specified label # from /// MachineDebugInfo, for example because the code was deleted. void MachineDebugInfo::InvalidateLabel(unsigned LabelID) { - DeletedLabelIDs.insert(LabelID); + // Check source line list first. SourceLineInfo is sorted by LabelID. + std::vector::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::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 /// attempting to use. bool MachineDebugInfo::isLabelValid(unsigned LabelID) { - return DeletedLabelIDs.find(LabelID) == DeletedLabelIDs.end(); + std::vector::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