mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-26 07:24:25 +00:00
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:
@ -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 {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user