diff --git a/include/llvm/MC/MCContext.h b/include/llvm/MC/MCContext.h index 17a37ed3b9d..e93a97a96e6 100644 --- a/include/llvm/MC/MCContext.h +++ b/include/llvm/MC/MCContext.h @@ -148,10 +148,7 @@ namespace llvm { /// The dwarf line information from the .loc directives for the sections /// with assembled machine instructions have after seeing .loc directives. - DenseMap MCLineSections; - /// We need a deterministic iteration order, so we remember the order - /// the elements were added. - std::vector MCLineSectionOrder; + std::map MCLineSections; /// The Compile Unit ID that we are currently processing. unsigned DwarfCompileUnitID; /// The line table start symbol for each Compile Unit. @@ -316,16 +313,11 @@ namespace llvm { return MCDwarfDirsCUMap[CUID]; } - const DenseMap - &getMCLineSections() const { + const std::map &getMCLineSections() const { return MCLineSections; } - const std::vector &getMCLineSectionOrder() const { - return MCLineSectionOrder; - } - void addMCLineSection(const MCSection *Sec, MCLineSection *Line) { - MCLineSections[Sec] = Line; - MCLineSectionOrder.push_back(Sec); + std::map &getMCLineSections() { + return MCLineSections; } unsigned getDwarfCompileUnitID() { return DwarfCompileUnitID; diff --git a/include/llvm/MC/MCDwarf.h b/include/llvm/MC/MCDwarf.h index fd59280f672..418c213fcdf 100644 --- a/include/llvm/MC/MCDwarf.h +++ b/include/llvm/MC/MCDwarf.h @@ -16,6 +16,7 @@ #define LLVM_MC_MCDWARF_H #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/MapVector.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Dwarf.h" #include "llvm/Support/raw_ostream.h" @@ -172,45 +173,29 @@ public: }; /// MCLineSection - Instances of this class represent the line information -/// for a section where machine instructions have been assembled after seeing +/// for a compile unit where machine instructions have been assembled after seeing /// .loc directives. This is the information used to build the dwarf line /// table for a section. class MCLineSection { - -private: - MCLineSection(const MCLineSection &) LLVM_DELETED_FUNCTION; - void operator=(const MCLineSection &) LLVM_DELETED_FUNCTION; - public: - // Constructor to create an MCLineSection with an empty MCLineEntries - // vector. - MCLineSection() {} - // addLineEntry - adds an entry to this MCLineSection's line entries - void addLineEntry(const MCLineEntry &LineEntry, unsigned CUID) { - MCLineDivisions[CUID].push_back(LineEntry); + void addLineEntry(const MCLineEntry &LineEntry, const MCSection *Sec) { + MCLineDivisions[Sec].push_back(LineEntry); } typedef std::vector MCLineEntryCollection; typedef MCLineEntryCollection::iterator iterator; typedef MCLineEntryCollection::const_iterator const_iterator; - typedef std::map MCLineDivisionMap; + typedef MapVector MCLineDivisionMap; private: - // A collection of MCLineEntry for each Compile Unit ID. + // A collection of MCLineEntry for each section. MCLineDivisionMap MCLineDivisions; public: - // Returns whether MCLineSection contains entries for a given Compile - // Unit ID. - bool containEntriesForID(unsigned CUID) const { - return MCLineDivisions.count(CUID); - } // Returns the collection of MCLineEntry for a given Compile Unit ID. - const MCLineEntryCollection &getMCLineEntries(unsigned CUID) const { - MCLineDivisionMap::const_iterator CIter = MCLineDivisions.find(CUID); - assert(CIter != MCLineDivisions.end()); - return CIter->second; + const MCLineDivisionMap &getMCLineEntries() const { + return MCLineDivisions; } }; diff --git a/lib/MC/MCContext.cpp b/lib/MC/MCContext.cpp index 5c515b4f1eb..718c3cefaa3 100644 --- a/lib/MC/MCContext.cpp +++ b/lib/MC/MCContext.cpp @@ -89,7 +89,6 @@ void MCContext::reset() { MCGenDwarfLabelEntries.clear(); DwarfDebugFlags = StringRef(); MCLineSections.clear(); - MCLineSectionOrder.clear(); DwarfCompileUnitID = 0; MCLineTableSymbols.clear(); CurrentDwarfLoc = MCDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,0); diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 98d78737cc6..ba61a5d8ce3 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -80,23 +80,10 @@ void MCLineEntry::Make(MCStreamer *MCOS, const MCSection *Section) { // clear DwarfLocSeen saying the current .loc info is now used. MCOS->getContext().ClearDwarfLocSeen(); - // Get the MCLineSection for this section, if one does not exist for this - // section create it. - const DenseMap &MCLineSections = - MCOS->getContext().getMCLineSections(); - MCLineSection *LineSection = MCLineSections.lookup(Section); - if (!LineSection) { - // Create a new MCLineSection. This will be deleted after the dwarf line - // table is created using it by iterating through the MCLineSections - // DenseMap. - LineSection = new MCLineSection; - // Save a pointer to the new LineSection into the MCLineSections DenseMap. - MCOS->getContext().addMCLineSection(Section, LineSection); - } - // Add the line entry to this section's entries. - LineSection->addLineEntry(LineEntry, - MCOS->getContext().getDwarfCompileUnitID()); + MCOS->getContext() + .getMCLineSections()[MCOS->getContext().getDwarfCompileUnitID()] + .addLineEntry(LineEntry, Section); } // @@ -126,12 +113,8 @@ static inline const MCExpr *MakeStartMinusEndExpr(const MCStreamer &MCOS, // static inline void EmitDwarfLineTable(MCStreamer *MCOS, const MCSection *Section, - const MCLineSection *LineSection, + const MCLineSection::MCLineEntryCollection &LineEntries, unsigned CUID) { - // This LineSection does not contain any LineEntry for the given Compile Unit. - if (!LineSection->containEntriesForID(CUID)) - return; - unsigned FileNum = 1; unsigned LastLine = 1; unsigned Column = 0; @@ -141,9 +124,9 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS, MCSymbol *LastLabel = NULL; // Loop through each MCLineEntry and encode the dwarf line number table. - for (MCLineSection::const_iterator - it = LineSection->getMCLineEntries(CUID).begin(), - ie = LineSection->getMCLineEntries(CUID).end(); it != ie; ++it) { + for (auto it = LineEntries.begin(), + ie = LineEntries.end(); + it != ie; ++it) { if (FileNum != it->getFileNum()) { FileNum = it->getFileNum(); @@ -236,15 +219,6 @@ const MCSymbol *MCDwarfFileTable::Emit(MCStreamer *MCOS) { for (unsigned Is = 1, Ie = MCLineTableSymbols.size(); Is < Ie; Is++) EmitCU(MCOS, Is); - // Now delete the MCLineSections that were created in MCLineEntry::Make() - // and used to emit the line table. - const DenseMap &MCLineSections = - MCOS->getContext().getMCLineSections(); - for (DenseMap::const_iterator it = - MCLineSections.begin(), ie = MCLineSections.end(); it != ie; - ++it) - delete it->second; - return LineStartSym; } @@ -329,20 +303,15 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS, unsigned CUID) { MCOS->EmitLabel(ProEndSym); // Put out the line tables. - const DenseMap &MCLineSections = + const std::map &MCLineSections = MCOS->getContext().getMCLineSections(); - const std::vector &MCLineSectionOrder = - MCOS->getContext().getMCLineSectionOrder(); - for (std::vector::const_iterator it = - MCLineSectionOrder.begin(), ie = MCLineSectionOrder.end(); it != ie; - ++it) { - const MCSection *Sec = *it; - const MCLineSection *Line = MCLineSections.lookup(Sec); - EmitDwarfLineTable(MCOS, Sec, Line, CUID); - } + auto Iter = MCLineSections.find(CUID); + if (Iter != MCLineSections.end()) + for (const auto &LineSec : Iter->second.getMCLineEntries()) + EmitDwarfLineTable(MCOS, LineSec.first, LineSec.second, CUID); - if (MCOS->getContext().getAsmInfo()->getLinkerRequiresNonEmptyDwarfLines() - && MCLineSectionOrder.begin() == MCLineSectionOrder.end()) { + if (MCOS->getContext().getAsmInfo()->getLinkerRequiresNonEmptyDwarfLines() && + Iter == MCLineSections.end()) { // The darwin9 linker has a bug (see PR8715). For for 32-bit architectures // it requires: // total_length >= prologue_length + 10