forked from OSchip/llvm-project
Make DWARFCompileUnit non-copyable
Summary: This is a part of D1164. DWARFCompileUnit is not that lightweight to copy it around, and we want it to own corresponding .dwo compile unit eventually. Reviewers: echristo Reviewed By: echristo CC: llvm-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1298 llvm-svn: 189089
This commit is contained in:
parent
da45a0fa6f
commit
a9debbfb01
|
@ -23,6 +23,9 @@ class StringRef;
|
|||
class raw_ostream;
|
||||
|
||||
class DWARFCompileUnit {
|
||||
DWARFCompileUnit(DWARFCompileUnit const &) LLVM_DELETED_FUNCTION;
|
||||
DWARFCompileUnit &operator=(DWARFCompileUnit const &) LLVM_DELETED_FUNCTION;
|
||||
|
||||
const DWARFDebugAbbrev *Abbrev;
|
||||
StringRef InfoSection;
|
||||
StringRef AbbrevSection;
|
||||
|
|
|
@ -23,6 +23,11 @@ using namespace object;
|
|||
|
||||
typedef DWARFDebugLine::LineTable DWARFLineTable;
|
||||
|
||||
DWARFContext::~DWARFContext() {
|
||||
DeleteContainerPointers(CUs);
|
||||
DeleteContainerPointers(DWOCUs);
|
||||
}
|
||||
|
||||
void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) {
|
||||
if (DumpType == DIDT_All || DumpType == DIDT_Abbrev) {
|
||||
OS << ".debug_abbrev contents:\n";
|
||||
|
@ -249,18 +254,15 @@ void DWARFContext::parseCompileUnits() {
|
|||
const DataExtractor &DIData = DataExtractor(getInfoSection(),
|
||||
isLittleEndian(), 0);
|
||||
while (DIData.isValidOffset(offset)) {
|
||||
CUs.push_back(DWARFCompileUnit(getDebugAbbrev(), getInfoSection(),
|
||||
getAbbrevSection(), getRangeSection(),
|
||||
getStringSection(), StringRef(),
|
||||
getAddrSection(),
|
||||
&infoRelocMap(),
|
||||
isLittleEndian()));
|
||||
if (!CUs.back().extract(DIData, &offset)) {
|
||||
CUs.pop_back();
|
||||
OwningPtr<DWARFCompileUnit> CU(new DWARFCompileUnit(
|
||||
getDebugAbbrev(), getInfoSection(), getAbbrevSection(),
|
||||
getRangeSection(), getStringSection(), StringRef(), getAddrSection(),
|
||||
&infoRelocMap(), isLittleEndian()));
|
||||
if (!CU->extract(DIData, &offset)) {
|
||||
break;
|
||||
}
|
||||
|
||||
offset = CUs.back().getNextCompileUnitOffset();
|
||||
CUs.push_back(CU.take());
|
||||
offset = CUs.back()->getNextCompileUnitOffset();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -269,34 +271,30 @@ void DWARFContext::parseDWOCompileUnits() {
|
|||
const DataExtractor &DIData = DataExtractor(getInfoDWOSection(),
|
||||
isLittleEndian(), 0);
|
||||
while (DIData.isValidOffset(offset)) {
|
||||
DWOCUs.push_back(DWARFCompileUnit(getDebugAbbrevDWO(), getInfoDWOSection(),
|
||||
getAbbrevDWOSection(),
|
||||
getRangeDWOSection(),
|
||||
getStringDWOSection(),
|
||||
getStringOffsetDWOSection(),
|
||||
getAddrSection(),
|
||||
&infoDWORelocMap(),
|
||||
isLittleEndian()));
|
||||
if (!DWOCUs.back().extract(DIData, &offset)) {
|
||||
DWOCUs.pop_back();
|
||||
OwningPtr<DWARFCompileUnit> DWOCU(new DWARFCompileUnit(
|
||||
getDebugAbbrevDWO(), getInfoDWOSection(), getAbbrevDWOSection(),
|
||||
getRangeDWOSection(), getStringDWOSection(),
|
||||
getStringOffsetDWOSection(), getAddrSection(), &infoDWORelocMap(),
|
||||
isLittleEndian()));
|
||||
if (!DWOCU->extract(DIData, &offset)) {
|
||||
break;
|
||||
}
|
||||
|
||||
offset = DWOCUs.back().getNextCompileUnitOffset();
|
||||
DWOCUs.push_back(DWOCU.take());
|
||||
offset = DWOCUs.back()->getNextCompileUnitOffset();
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct OffsetComparator {
|
||||
bool operator()(const DWARFCompileUnit &LHS,
|
||||
const DWARFCompileUnit &RHS) const {
|
||||
return LHS.getOffset() < RHS.getOffset();
|
||||
bool operator()(const DWARFCompileUnit *LHS,
|
||||
const DWARFCompileUnit *RHS) const {
|
||||
return LHS->getOffset() < RHS->getOffset();
|
||||
}
|
||||
bool operator()(const DWARFCompileUnit &LHS, uint32_t RHS) const {
|
||||
return LHS.getOffset() < RHS;
|
||||
bool operator()(const DWARFCompileUnit *LHS, uint32_t RHS) const {
|
||||
return LHS->getOffset() < RHS;
|
||||
}
|
||||
bool operator()(uint32_t LHS, const DWARFCompileUnit &RHS) const {
|
||||
return LHS < RHS.getOffset();
|
||||
bool operator()(uint32_t LHS, const DWARFCompileUnit *RHS) const {
|
||||
return LHS < RHS->getOffset();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -305,10 +303,11 @@ DWARFCompileUnit *DWARFContext::getCompileUnitForOffset(uint32_t Offset) {
|
|||
if (CUs.empty())
|
||||
parseCompileUnits();
|
||||
|
||||
DWARFCompileUnit *CU = std::lower_bound(CUs.begin(), CUs.end(), Offset,
|
||||
OffsetComparator());
|
||||
if (CU != CUs.end())
|
||||
return &*CU;
|
||||
DWARFCompileUnit **CU =
|
||||
std::lower_bound(CUs.begin(), CUs.end(), Offset, OffsetComparator());
|
||||
if (CU != CUs.end()) {
|
||||
return *CU;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,14 +27,14 @@ namespace llvm {
|
|||
/// information parsing. The actual data is supplied through pure virtual
|
||||
/// methods that a concrete implementation provides.
|
||||
class DWARFContext : public DIContext {
|
||||
SmallVector<DWARFCompileUnit, 1> CUs;
|
||||
SmallVector<DWARFCompileUnit *, 1> CUs;
|
||||
OwningPtr<DWARFDebugAbbrev> Abbrev;
|
||||
OwningPtr<DWARFDebugLoc> Loc;
|
||||
OwningPtr<DWARFDebugAranges> Aranges;
|
||||
OwningPtr<DWARFDebugLine> Line;
|
||||
OwningPtr<DWARFDebugFrame> DebugFrame;
|
||||
|
||||
SmallVector<DWARFCompileUnit, 1> DWOCUs;
|
||||
SmallVector<DWARFCompileUnit *, 1> DWOCUs;
|
||||
OwningPtr<DWARFDebugAbbrev> AbbrevDWO;
|
||||
|
||||
DWARFContext(DWARFContext &) LLVM_DELETED_FUNCTION;
|
||||
|
@ -49,6 +49,7 @@ class DWARFContext : public DIContext {
|
|||
|
||||
public:
|
||||
DWARFContext() : DIContext(CK_DWARF) {}
|
||||
virtual ~DWARFContext();
|
||||
|
||||
static bool classof(const DIContext *DICtx) {
|
||||
return DICtx->getKind() == CK_DWARF;
|
||||
|
@ -74,14 +75,14 @@ public:
|
|||
DWARFCompileUnit *getCompileUnitAtIndex(unsigned index) {
|
||||
if (CUs.empty())
|
||||
parseCompileUnits();
|
||||
return &CUs[index];
|
||||
return CUs[index];
|
||||
}
|
||||
|
||||
/// Get the compile unit at the specified index for the DWO compile units.
|
||||
DWARFCompileUnit *getDWOCompileUnitAtIndex(unsigned index) {
|
||||
if (DWOCUs.empty())
|
||||
parseDWOCompileUnits();
|
||||
return &DWOCUs[index];
|
||||
return DWOCUs[index];
|
||||
}
|
||||
|
||||
/// Get a pointer to the parsed DebugAbbrev object.
|
||||
|
|
Loading…
Reference in New Issue