mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
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:
@@ -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<const MCSection *, MCLineSection *> MCLineSections;
|
||||
/// We need a deterministic iteration order, so we remember the order
|
||||
/// the elements were added.
|
||||
std::vector<const MCSection *> MCLineSectionOrder;
|
||||
std::map<unsigned, MCLineSection> 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<const MCSection *, MCLineSection *>
|
||||
&getMCLineSections() const {
|
||||
const std::map<unsigned, MCLineSection> &getMCLineSections() const {
|
||||
return MCLineSections;
|
||||
}
|
||||
const std::vector<const MCSection *> &getMCLineSectionOrder() const {
|
||||
return MCLineSectionOrder;
|
||||
}
|
||||
void addMCLineSection(const MCSection *Sec, MCLineSection *Line) {
|
||||
MCLineSections[Sec] = Line;
|
||||
MCLineSectionOrder.push_back(Sec);
|
||||
std::map<unsigned, MCLineSection> &getMCLineSections() {
|
||||
return MCLineSections;
|
||||
}
|
||||
unsigned getDwarfCompileUnitID() {
|
||||
return DwarfCompileUnitID;
|
||||
|
@@ -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<MCLineEntry> MCLineEntryCollection;
|
||||
typedef MCLineEntryCollection::iterator iterator;
|
||||
typedef MCLineEntryCollection::const_iterator const_iterator;
|
||||
typedef std::map<unsigned, MCLineEntryCollection> MCLineDivisionMap;
|
||||
typedef MapVector<const MCSection *, MCLineEntryCollection> 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;
|
||||
}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user