MCDwarf: Invert the Section+CU->LineEntries mapping so the CU is the primary dimension

This makes the mapping consistent with other CU->X mappings in the
MCContext, helping pave the way to refactor all these values into a
single data structure per CU and thus a single map.

I haven't renamed the data structure as that would make the patch churn
even higher (the MCLineSection name no longer makes sense, as this
structure now contains lines for multiple sections covered by a single
CU, rather than lines for a single section in multiple CUs) and further
refactorings will follow that may remove this type entirely.

For convenience, I also gave the MCLineSection value semantics so we
didn't have to do the lazy construction, manual delete, etc.

(& for those playing at home, refactoring the line printing into a
single data structure will eventually alow that data structure to be
reused to own the debug_line.dwo line table used for type unit file name
resolution)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203726 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie
2014-03-12 22:28:56 +00:00
parent eb8eef0b3f
commit 16300ca843
4 changed files with 26 additions and 81 deletions

View File

@@ -148,10 +148,7 @@ namespace llvm {
/// The dwarf line information from the .loc directives for the sections /// The dwarf line information from the .loc directives for the sections
/// with assembled machine instructions have after seeing .loc directives. /// with assembled machine instructions have after seeing .loc directives.
DenseMap<const MCSection *, MCLineSection *> MCLineSections; std::map<unsigned, MCLineSection> MCLineSections;
/// We need a deterministic iteration order, so we remember the order
/// the elements were added.
std::vector<const MCSection *> MCLineSectionOrder;
/// The Compile Unit ID that we are currently processing. /// The Compile Unit ID that we are currently processing.
unsigned DwarfCompileUnitID; unsigned DwarfCompileUnitID;
/// The line table start symbol for each Compile Unit. /// The line table start symbol for each Compile Unit.
@@ -316,16 +313,11 @@ namespace llvm {
return MCDwarfDirsCUMap[CUID]; return MCDwarfDirsCUMap[CUID];
} }
const DenseMap<const MCSection *, MCLineSection *> const std::map<unsigned, MCLineSection> &getMCLineSections() const {
&getMCLineSections() const {
return MCLineSections; return MCLineSections;
} }
const std::vector<const MCSection *> &getMCLineSectionOrder() const { std::map<unsigned, MCLineSection> &getMCLineSections() {
return MCLineSectionOrder; return MCLineSections;
}
void addMCLineSection(const MCSection *Sec, MCLineSection *Line) {
MCLineSections[Sec] = Line;
MCLineSectionOrder.push_back(Sec);
} }
unsigned getDwarfCompileUnitID() { unsigned getDwarfCompileUnitID() {
return DwarfCompileUnitID; return DwarfCompileUnitID;

View File

@@ -16,6 +16,7 @@
#define LLVM_MC_MCDWARF_H #define LLVM_MC_MCDWARF_H
#include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringRef.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/Support/Compiler.h" #include "llvm/Support/Compiler.h"
#include "llvm/Support/Dwarf.h" #include "llvm/Support/Dwarf.h"
#include "llvm/Support/raw_ostream.h" #include "llvm/Support/raw_ostream.h"
@@ -172,45 +173,29 @@ public:
}; };
/// MCLineSection - Instances of this class represent the line information /// 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 /// .loc directives. This is the information used to build the dwarf line
/// table for a section. /// table for a section.
class MCLineSection { class MCLineSection {
private:
MCLineSection(const MCLineSection &) LLVM_DELETED_FUNCTION;
void operator=(const MCLineSection &) LLVM_DELETED_FUNCTION;
public: public:
// Constructor to create an MCLineSection with an empty MCLineEntries
// vector.
MCLineSection() {}
// addLineEntry - adds an entry to this MCLineSection's line entries // addLineEntry - adds an entry to this MCLineSection's line entries
void addLineEntry(const MCLineEntry &LineEntry, unsigned CUID) { void addLineEntry(const MCLineEntry &LineEntry, const MCSection *Sec) {
MCLineDivisions[CUID].push_back(LineEntry); MCLineDivisions[Sec].push_back(LineEntry);
} }
typedef std::vector<MCLineEntry> MCLineEntryCollection; typedef std::vector<MCLineEntry> MCLineEntryCollection;
typedef MCLineEntryCollection::iterator iterator; typedef MCLineEntryCollection::iterator iterator;
typedef MCLineEntryCollection::const_iterator const_iterator; typedef MCLineEntryCollection::const_iterator const_iterator;
typedef std::map<unsigned, MCLineEntryCollection> MCLineDivisionMap; typedef MapVector<const MCSection *, MCLineEntryCollection> MCLineDivisionMap;
private: private:
// A collection of MCLineEntry for each Compile Unit ID. // A collection of MCLineEntry for each section.
MCLineDivisionMap MCLineDivisions; MCLineDivisionMap MCLineDivisions;
public: 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. // Returns the collection of MCLineEntry for a given Compile Unit ID.
const MCLineEntryCollection &getMCLineEntries(unsigned CUID) const { const MCLineDivisionMap &getMCLineEntries() const {
MCLineDivisionMap::const_iterator CIter = MCLineDivisions.find(CUID); return MCLineDivisions;
assert(CIter != MCLineDivisions.end());
return CIter->second;
} }
}; };

View File

@@ -89,7 +89,6 @@ void MCContext::reset() {
MCGenDwarfLabelEntries.clear(); MCGenDwarfLabelEntries.clear();
DwarfDebugFlags = StringRef(); DwarfDebugFlags = StringRef();
MCLineSections.clear(); MCLineSections.clear();
MCLineSectionOrder.clear();
DwarfCompileUnitID = 0; DwarfCompileUnitID = 0;
MCLineTableSymbols.clear(); MCLineTableSymbols.clear();
CurrentDwarfLoc = MCDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,0); CurrentDwarfLoc = MCDwarfLoc(0,0,0,DWARF2_FLAG_IS_STMT,0,0);

View File

@@ -80,23 +80,10 @@ void MCLineEntry::Make(MCStreamer *MCOS, const MCSection *Section) {
// clear DwarfLocSeen saying the current .loc info is now used. // clear DwarfLocSeen saying the current .loc info is now used.
MCOS->getContext().ClearDwarfLocSeen(); MCOS->getContext().ClearDwarfLocSeen();
// Get the MCLineSection for this section, if one does not exist for this
// section create it.
const DenseMap<const MCSection *, MCLineSection *> &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. // Add the line entry to this section's entries.
LineSection->addLineEntry(LineEntry, MCOS->getContext()
MCOS->getContext().getDwarfCompileUnitID()); .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, static inline void EmitDwarfLineTable(MCStreamer *MCOS,
const MCSection *Section, const MCSection *Section,
const MCLineSection *LineSection, const MCLineSection::MCLineEntryCollection &LineEntries,
unsigned CUID) { unsigned CUID) {
// This LineSection does not contain any LineEntry for the given Compile Unit.
if (!LineSection->containEntriesForID(CUID))
return;
unsigned FileNum = 1; unsigned FileNum = 1;
unsigned LastLine = 1; unsigned LastLine = 1;
unsigned Column = 0; unsigned Column = 0;
@@ -141,9 +124,9 @@ static inline void EmitDwarfLineTable(MCStreamer *MCOS,
MCSymbol *LastLabel = NULL; MCSymbol *LastLabel = NULL;
// Loop through each MCLineEntry and encode the dwarf line number table. // Loop through each MCLineEntry and encode the dwarf line number table.
for (MCLineSection::const_iterator for (auto it = LineEntries.begin(),
it = LineSection->getMCLineEntries(CUID).begin(), ie = LineEntries.end();
ie = LineSection->getMCLineEntries(CUID).end(); it != ie; ++it) { it != ie; ++it) {
if (FileNum != it->getFileNum()) { if (FileNum != it->getFileNum()) {
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++) for (unsigned Is = 1, Ie = MCLineTableSymbols.size(); Is < Ie; Is++)
EmitCU(MCOS, Is); EmitCU(MCOS, Is);
// Now delete the MCLineSections that were created in MCLineEntry::Make()
// and used to emit the line table.
const DenseMap<const MCSection *, MCLineSection *> &MCLineSections =
MCOS->getContext().getMCLineSections();
for (DenseMap<const MCSection *, MCLineSection *>::const_iterator it =
MCLineSections.begin(), ie = MCLineSections.end(); it != ie;
++it)
delete it->second;
return LineStartSym; return LineStartSym;
} }
@@ -329,20 +303,15 @@ const MCSymbol *MCDwarfFileTable::EmitCU(MCStreamer *MCOS, unsigned CUID) {
MCOS->EmitLabel(ProEndSym); MCOS->EmitLabel(ProEndSym);
// Put out the line tables. // Put out the line tables.
const DenseMap<const MCSection *, MCLineSection *> &MCLineSections = const std::map<unsigned, MCLineSection> &MCLineSections =
MCOS->getContext().getMCLineSections(); MCOS->getContext().getMCLineSections();
const std::vector<const MCSection *> &MCLineSectionOrder = auto Iter = MCLineSections.find(CUID);
MCOS->getContext().getMCLineSectionOrder(); if (Iter != MCLineSections.end())
for (std::vector<const MCSection*>::const_iterator it = for (const auto &LineSec : Iter->second.getMCLineEntries())
MCLineSectionOrder.begin(), ie = MCLineSectionOrder.end(); it != ie; EmitDwarfLineTable(MCOS, LineSec.first, LineSec.second, CUID);
++it) {
const MCSection *Sec = *it;
const MCLineSection *Line = MCLineSections.lookup(Sec);
EmitDwarfLineTable(MCOS, Sec, Line, CUID);
}
if (MCOS->getContext().getAsmInfo()->getLinkerRequiresNonEmptyDwarfLines() if (MCOS->getContext().getAsmInfo()->getLinkerRequiresNonEmptyDwarfLines() &&
&& MCLineSectionOrder.begin() == MCLineSectionOrder.end()) { Iter == MCLineSections.end()) {
// The darwin9 linker has a bug (see PR8715). For for 32-bit architectures // The darwin9 linker has a bug (see PR8715). For for 32-bit architectures
// it requires: // it requires:
// total_length >= prologue_length + 10 // total_length >= prologue_length + 10