Use std::unique_ptr for DIE children

Got bored, removed some manual memory management.

Pushed references (rather than pointers) through a few APIs rather than
replacing *x with x.get().

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206222 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie
2014-04-14 22:45:02 +00:00
parent fdf3f439eb
commit 40352669ba
5 changed files with 31 additions and 43 deletions

View File

@ -104,15 +104,6 @@ void DIEAbbrev::print(raw_ostream &O) {
void DIEAbbrev::dump() { print(dbgs()); } void DIEAbbrev::dump() { print(dbgs()); }
#endif #endif
//===----------------------------------------------------------------------===//
// DIE Implementation
//===----------------------------------------------------------------------===//
DIE::~DIE() {
for (unsigned i = 0, N = Children.size(); i < N; ++i)
delete Children[i];
}
/// Climb up the parent chain to get the unit DIE to which this DIE /// Climb up the parent chain to get the unit DIE to which this DIE
/// belongs. /// belongs.
const DIE *DIE::getUnit() const { const DIE *DIE::getUnit() const {

View File

@ -124,7 +124,7 @@ protected:
/// Children DIEs. /// Children DIEs.
/// ///
std::vector<DIE *> Children; std::vector<std::unique_ptr<DIE>> Children;
DIE *Parent; DIE *Parent;
@ -141,7 +141,6 @@ public:
explicit DIE(dwarf::Tag Tag) explicit DIE(dwarf::Tag Tag)
: Offset(0), Size(0), Abbrev((dwarf::Tag)Tag, dwarf::DW_CHILDREN_no), : Offset(0), Size(0), Abbrev((dwarf::Tag)Tag, dwarf::DW_CHILDREN_no),
Parent(0) {} Parent(0) {}
~DIE();
// Accessors. // Accessors.
DIEAbbrev &getAbbrev() { return Abbrev; } DIEAbbrev &getAbbrev() { return Abbrev; }
@ -150,7 +149,9 @@ public:
dwarf::Tag getTag() const { return Abbrev.getTag(); } dwarf::Tag getTag() const { return Abbrev.getTag(); }
unsigned getOffset() const { return Offset; } unsigned getOffset() const { return Offset; }
unsigned getSize() const { return Size; } unsigned getSize() const { return Size; }
const std::vector<DIE *> &getChildren() const { return Children; } const std::vector<std::unique_ptr<DIE>> &getChildren() const {
return Children;
}
const SmallVectorImpl<DIEValue *> &getValues() const { return Values; } const SmallVectorImpl<DIEValue *> &getValues() const { return Values; }
DIE *getParent() const { return Parent; } DIE *getParent() const { return Parent; }
/// Climb up the parent chain to get the compile or type unit DIE this DIE /// Climb up the parent chain to get the compile or type unit DIE this DIE
@ -174,7 +175,7 @@ public:
void addChild(DIE *Child) { void addChild(DIE *Child) {
assert(!Child->getParent()); assert(!Child->getParent());
Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes); Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes);
Children.push_back(Child); Children.push_back(std::unique_ptr<DIE>(Child));
Child->Parent = this; Child->Parent = this;
} }

View File

@ -463,20 +463,18 @@ void DIEHash::computeHash(const DIE &Die) {
addAttributes(Die); addAttributes(Die);
// Then hash each of the children of the DIE. // Then hash each of the children of the DIE.
for (std::vector<DIE *>::const_iterator I = Die.getChildren().begin(), for (auto &C : Die.getChildren()) {
E = Die.getChildren().end();
I != E; ++I) {
// 7.27 Step 7 // 7.27 Step 7
// If C is a nested type entry or a member function entry, ... // If C is a nested type entry or a member function entry, ...
if (isType((*I)->getTag()) || (*I)->getTag() == dwarf::DW_TAG_subprogram) { if (isType(C->getTag()) || C->getTag() == dwarf::DW_TAG_subprogram) {
StringRef Name = getDIEStringAttr(**I, dwarf::DW_AT_name); StringRef Name = getDIEStringAttr(*C, dwarf::DW_AT_name);
// ... and has a DW_AT_name attribute // ... and has a DW_AT_name attribute
if (!Name.empty()) { if (!Name.empty()) {
hashNestedType(**I, Name); hashNestedType(*C, Name);
continue; continue;
} }
} }
computeHash(**I); computeHash(*C);
} }
// Following the last (or if there are no children), append a zero byte. // Following the last (or if there are no children), append a zero byte.

View File

@ -1798,20 +1798,20 @@ void DwarfDebug::recordSourceLine(unsigned Line, unsigned Col, const MDNode *S,
// Compute the size and offset of a DIE. The offset is relative to start of the // Compute the size and offset of a DIE. The offset is relative to start of the
// CU. It returns the offset after laying out the DIE. // CU. It returns the offset after laying out the DIE.
unsigned DwarfFile::computeSizeAndOffset(DIE *Die, unsigned Offset) { unsigned DwarfFile::computeSizeAndOffset(DIE &Die, unsigned Offset) {
// Record the abbreviation. // Record the abbreviation.
assignAbbrevNumber(Die->getAbbrev()); assignAbbrevNumber(Die.getAbbrev());
// Get the abbreviation for this DIE. // Get the abbreviation for this DIE.
const DIEAbbrev &Abbrev = Die->getAbbrev(); const DIEAbbrev &Abbrev = Die.getAbbrev();
// Set DIE offset // Set DIE offset
Die->setOffset(Offset); Die.setOffset(Offset);
// Start the size with the size of abbreviation code. // Start the size with the size of abbreviation code.
Offset += getULEB128Size(Die->getAbbrevNumber()); Offset += getULEB128Size(Die.getAbbrevNumber());
const SmallVectorImpl<DIEValue *> &Values = Die->getValues(); const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData(); const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
// Size the DIE attribute values. // Size the DIE attribute values.
@ -1820,20 +1820,20 @@ unsigned DwarfFile::computeSizeAndOffset(DIE *Die, unsigned Offset) {
Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm()); Offset += Values[i]->SizeOf(Asm, AbbrevData[i].getForm());
// Get the children. // Get the children.
const std::vector<DIE *> &Children = Die->getChildren(); const auto &Children = Die.getChildren();
// Size the DIE children if any. // Size the DIE children if any.
if (!Children.empty()) { if (!Children.empty()) {
assert(Abbrev.hasChildren() && "Children flag not set"); assert(Abbrev.hasChildren() && "Children flag not set");
for (DIE *Child : Children) for (auto &Child : Children)
Offset = computeSizeAndOffset(Child, Offset); Offset = computeSizeAndOffset(*Child, Offset);
// End of children marker. // End of children marker.
Offset += sizeof(int8_t); Offset += sizeof(int8_t);
} }
Die->setSize(Offset - Die->getOffset()); Die.setSize(Offset - Die.getOffset());
return Offset; return Offset;
} }
@ -1853,7 +1853,7 @@ void DwarfFile::computeSizeAndOffsets() {
// EndOffset here is CU-relative, after laying out // EndOffset here is CU-relative, after laying out
// all of the CU DIE. // all of the CU DIE.
unsigned EndOffset = computeSizeAndOffset(TheU->getUnitDie(), Offset); unsigned EndOffset = computeSizeAndOffset(*TheU->getUnitDie(), Offset);
SecOffset += EndOffset; SecOffset += EndOffset;
} }
} }
@ -1905,19 +1905,19 @@ void DwarfDebug::emitSectionLabels() {
} }
// Recursively emits a debug information entry. // Recursively emits a debug information entry.
void DwarfDebug::emitDIE(DIE *Die) { void DwarfDebug::emitDIE(DIE &Die) {
// Get the abbreviation for this DIE. // Get the abbreviation for this DIE.
const DIEAbbrev &Abbrev = Die->getAbbrev(); const DIEAbbrev &Abbrev = Die.getAbbrev();
// Emit the code (index) for the abbreviation. // Emit the code (index) for the abbreviation.
if (Asm->isVerbose()) if (Asm->isVerbose())
Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) + Asm->OutStreamer.AddComment("Abbrev [" + Twine(Abbrev.getNumber()) +
"] 0x" + Twine::utohexstr(Die->getOffset()) + "] 0x" + Twine::utohexstr(Die.getOffset()) +
":0x" + Twine::utohexstr(Die->getSize()) + " " + ":0x" + Twine::utohexstr(Die.getSize()) + " " +
dwarf::TagString(Abbrev.getTag())); dwarf::TagString(Abbrev.getTag()));
Asm->EmitULEB128(Abbrev.getNumber()); Asm->EmitULEB128(Abbrev.getNumber());
const SmallVectorImpl<DIEValue *> &Values = Die->getValues(); const SmallVectorImpl<DIEValue *> &Values = Die.getValues();
const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData(); const SmallVectorImpl<DIEAbbrevData> &AbbrevData = Abbrev.getData();
// Emit the DIE attribute values. // Emit the DIE attribute values.
@ -1939,10 +1939,8 @@ void DwarfDebug::emitDIE(DIE *Die) {
// Emit the DIE children if any. // Emit the DIE children if any.
if (Abbrev.hasChildren()) { if (Abbrev.hasChildren()) {
const std::vector<DIE *> &Children = Die->getChildren(); for (auto &Child : Die.getChildren())
emitDIE(*Child);
for (DIE *Child : Children)
emitDIE(Child);
Asm->OutStreamer.AddComment("End Of Children Mark"); Asm->OutStreamer.AddComment("End Of Children Mark");
Asm->EmitInt8(0); Asm->EmitInt8(0);
@ -1966,7 +1964,7 @@ void DwarfFile::emitUnits(DwarfDebug *DD, const MCSymbol *ASectionSym) {
TheU->emitHeader(ASectionSym); TheU->emitHeader(ASectionSym);
DD->emitDIE(Die); DD->emitDIE(*Die);
Asm->OutStreamer.EmitLabel(TheU->getLabelEnd()); Asm->OutStreamer.EmitLabel(TheU->getLabelEnd());
} }
} }

View File

@ -178,7 +178,7 @@ public:
const SmallVectorImpl<DwarfUnit *> &getUnits() { return CUs; } const SmallVectorImpl<DwarfUnit *> &getUnits() { return CUs; }
/// \brief Compute the size and offset of a DIE given an incoming Offset. /// \brief Compute the size and offset of a DIE given an incoming Offset.
unsigned computeSizeAndOffset(DIE *Die, unsigned Offset); unsigned computeSizeAndOffset(DIE &Die, unsigned Offset);
/// \brief Compute the size and offset of all the DIEs. /// \brief Compute the size and offset of all the DIEs.
void computeSizeAndOffsets(); void computeSizeAndOffsets();
@ -666,7 +666,7 @@ public:
} }
/// \brief Recursively Emits a debug information entry. /// \brief Recursively Emits a debug information entry.
void emitDIE(DIE *Die); void emitDIE(DIE &Die);
// Experimental DWARF5 features. // Experimental DWARF5 features.