From b7669139e6309679acbe16ca26f1b1a2fdd91268 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Wed, 7 Aug 2013 01:18:33 +0000 Subject: [PATCH] Add a way to grab a particular attribute out of a DIE. Use it when we're looking for a string in particular. Update comments as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187844 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DIE.cpp | 12 ++++++++++++ lib/CodeGen/AsmPrinter/DIE.h | 4 ++++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 18 +++++------------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/DIE.cpp b/lib/CodeGen/AsmPrinter/DIE.cpp index 0b154123315..ab03861f9dd 100644 --- a/lib/CodeGen/AsmPrinter/DIE.cpp +++ b/lib/CodeGen/AsmPrinter/DIE.cpp @@ -122,6 +122,18 @@ DIE *DIE::getCompileUnit() { llvm_unreachable("We should not have orphaned DIEs."); } +DIEValue *DIE::findAttribute(unsigned Attribute) { + const SmallVectorImpl &Values = getValues(); + const DIEAbbrev &Abbrevs = getAbbrev(); + + // Iterate through all the attributes until we find the one we're + // looking for, if we can't find it return NULL. + for (size_t i = 0; i < Values.size(); ++i) + if (Abbrevs.getData()[i].getAttribute() == Attribute) + return Values[i]; + return NULL; +} + #ifndef NDEBUG void DIE::print(raw_ostream &O, unsigned IndentCount) const { const std::string Indent(IndentCount, ' '); diff --git a/lib/CodeGen/AsmPrinter/DIE.h b/lib/CodeGen/AsmPrinter/DIE.h index e2f49d64bee..bfd7d1daeed 100644 --- a/lib/CodeGen/AsmPrinter/DIE.h +++ b/lib/CodeGen/AsmPrinter/DIE.h @@ -175,6 +175,10 @@ namespace llvm { Child->Parent = this; } + /// findAttribute - Find a value in the DIE with the attribute given, returns NULL + /// if no such attribute exists. + DIEValue *findAttribute(unsigned Attribute); + #ifndef NDEBUG void print(raw_ostream &O, unsigned IndentCount = 0) const; void dump(); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 859805c8181..9a09bc1b644 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -966,21 +966,13 @@ void DwarfDebug::collectDeadVariables() { typedef ArrayRef HashValue; /// \brief Grabs the string in whichever attribute is passed in and returns -/// a reference to it. +/// a reference to it. Returns "" if the attribute doesn't exist. static StringRef getDIEStringAttr(DIE *Die, unsigned Attr) { - const SmallVectorImpl &Values = Die->getValues(); - const DIEAbbrev &Abbrevs = Die->getAbbrev(); + DIEValue *V = Die->findAttribute(Attr); + + if (DIEString *S = dyn_cast_or_null(V)) + return S->getString(); - // Iterate through all the attributes until we find the one we're - // looking for, if we can't find it return an empty string. - for (size_t i = 0; i < Values.size(); ++i) { - if (Abbrevs.getData()[i].getAttribute() == Attr) { - DIEValue *V = Values[i]; - assert(isa(V) && "String requested. Not a string."); - DIEString *S = cast(V); - return S->getString(); - } - } return StringRef(""); }