From 1cbf3fa94a6ef7a3dd4f5d177aeed5ea3fa539bc Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Tue, 13 Dec 2016 23:20:56 +0000 Subject: [PATCH] Switch functions that returned bool and filled in a DWARFFormValue arg with ones that return Optional Differential Revision: https://reviews.llvm.org/D27737 llvm-svn: 289611 --- .../DebugInfo/DWARF/DWARFAbbreviationDeclaration.h | 6 ++- llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h | 4 +- .../DWARF/DWARFAbbreviationDeclaration.cpp | 15 +++---- llvm/lib/DebugInfo/DWARF/DWARFDie.cpp | 48 +++++++++++----------- llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp | 6 +-- llvm/tools/dsymutil/DwarfLinker.cpp | 12 +++--- .../DebugInfo/DWARF/DWARFDebugInfoTest.cpp | 22 ++++++---- 7 files changed, 58 insertions(+), 55 deletions(-) diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h index a0a3c59..8f8876b 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h @@ -80,8 +80,10 @@ public: /// \param U the DWARFUnit the contains the DIE. /// \param FormValue the form value that will be filled in. /// \returns true if the attribute was extracted into \p FormValue. - bool getAttributeValue(const uint32_t DIEOffset, const dwarf::Attribute Attr, - const DWARFUnit &U, DWARFFormValue &FormValue) const; + Optional getAttributeValue(const uint32_t DIEOffset, + const dwarf::Attribute Attr, + const DWARFUnit &U) const; + bool extract(DataExtractor Data, uint32_t* OffsetPtr); void dump(raw_ostream &OS) const; diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h index 57ceeeb..c034661 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h @@ -10,6 +10,7 @@ #ifndef LLVM_LIB_DEBUGINFO_DWARFDIE_H #define LLVM_LIB_DEBUGINFO_DWARFDIE_H +#include "llvm/ADT/Optional.h" #include "llvm/DebugInfo/DWARF/DWARFDebugInfoEntry.h" namespace llvm { @@ -117,8 +118,7 @@ public: /// \param Attr the attribute to extract. /// \param FormValue contains the attribute value if true is returned. /// \returns true if the attribute was extracted from this DIE. - bool getAttributeValue(dwarf::Attribute Attr, - DWARFFormValue &FormValue) const; + Optional getAttributeValue(dwarf::Attribute Attr) const; /// Extract the specified attribute from this DIE as a C string. /// diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp index 638830e..6126470 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp @@ -143,12 +143,12 @@ DWARFAbbreviationDeclaration::findAttributeIndex(dwarf::Attribute Attr) const { return None; } -bool DWARFAbbreviationDeclaration::getAttributeValue( - const uint32_t DIEOffset, const dwarf::Attribute Attr, const DWARFUnit &U, - DWARFFormValue &FormValue) const { +Optional DWARFAbbreviationDeclaration::getAttributeValue( + const uint32_t DIEOffset, const dwarf::Attribute Attr, + const DWARFUnit &U) const { Optional MatchAttrIndex = findAttributeIndex(Attr); if (!MatchAttrIndex) - return false; + return None; auto DebugInfoData = U.getDebugInfoExtractor(); @@ -159,8 +159,9 @@ bool DWARFAbbreviationDeclaration::getAttributeValue( for (const auto &Spec : AttributeSpecs) { if (*MatchAttrIndex == AttrIndex) { // We have arrived at the attribute to extract, extract if from Offset. - FormValue.setForm(Spec.Form); - return FormValue.extractValue(DebugInfoData, &Offset, &U); + DWARFFormValue FormValue(Spec.Form); + if (FormValue.extractValue(DebugInfoData, &Offset, &U)) + return FormValue; } // March Offset along until we get to the attribute we want. if (Optional FixedSize = Spec.getByteSize(U)) @@ -169,7 +170,7 @@ bool DWARFAbbreviationDeclaration::getAttributeValue( DWARFFormValue::skipValue(Spec.Form, DebugInfoData, &Offset, &U); ++AttrIndex; } - return false; + return None; } size_t DWARFAbbreviationDeclaration::FixedSizeInfo::getByteSize( diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp index a41fe6f..f52cc11 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -133,68 +133,68 @@ bool DWARFDie::isSubroutineDIE() const { return Tag == DW_TAG_subprogram || Tag == DW_TAG_inlined_subroutine; } -bool DWARFDie::getAttributeValue(dwarf::Attribute Attr, - DWARFFormValue &FormValue) const { - if (!U) - return false; +Optional +DWARFDie::getAttributeValue(dwarf::Attribute Attr) const { + if (!isValid()) + return None; auto AbbrevDecl = getAbbreviationDeclarationPtr(); if (AbbrevDecl) - return AbbrevDecl->getAttributeValue(getOffset(), Attr, *U, FormValue); - return false; + return AbbrevDecl->getAttributeValue(getOffset(), Attr, *U); + return None; } const char *DWARFDie::getAttributeValueAsString(dwarf::Attribute Attr, const char *FailValue) const { - DWARFFormValue FormValue; - if (!getAttributeValue(Attr, FormValue)) + auto FormValue = getAttributeValue(Attr); + if (!FormValue) return FailValue; - Optional Result = FormValue.getAsCString(); + Optional Result = FormValue->getAsCString(); return Result.hasValue() ? Result.getValue() : FailValue; } uint64_t DWARFDie::getAttributeValueAsAddress(dwarf::Attribute Attr, uint64_t FailValue) const { - DWARFFormValue FormValue; - if (!getAttributeValue(Attr, FormValue)) + auto FormValue = getAttributeValue(Attr); + if (!FormValue) return FailValue; - Optional Result = FormValue.getAsAddress(); + Optional Result = FormValue->getAsAddress(); return Result.hasValue() ? Result.getValue() : FailValue; } int64_t DWARFDie::getAttributeValueAsSignedConstant(dwarf::Attribute Attr, int64_t FailValue) const { - DWARFFormValue FormValue; - if (!getAttributeValue(Attr, FormValue)) + auto FormValue = getAttributeValue(Attr); + if (!FormValue) return FailValue; - Optional Result = FormValue.getAsSignedConstant(); + Optional Result = FormValue->getAsSignedConstant(); return Result.hasValue() ? Result.getValue() : FailValue; } uint64_t DWARFDie::getAttributeValueAsUnsignedConstant(dwarf::Attribute Attr, uint64_t FailValue) const { - DWARFFormValue FormValue; - if (!getAttributeValue(Attr, FormValue)) + auto FormValue = getAttributeValue(Attr); + if (!FormValue) return FailValue; - Optional Result = FormValue.getAsUnsignedConstant(); + Optional Result = FormValue->getAsUnsignedConstant(); return Result.hasValue() ? Result.getValue() : FailValue; } uint64_t DWARFDie::getAttributeValueAsReference(dwarf::Attribute Attr, uint64_t FailValue) const { - DWARFFormValue FormValue; - if (!getAttributeValue(Attr, FormValue)) + auto FormValue = getAttributeValue(Attr); + if (!FormValue) return FailValue; - Optional Result = FormValue.getAsReference(); + Optional Result = FormValue->getAsReference(); return Result.hasValue() ? Result.getValue() : FailValue; } uint64_t DWARFDie::getAttributeValueAsSectionOffset(dwarf::Attribute Attr, uint64_t FailValue) const { - DWARFFormValue FormValue; - if (!getAttributeValue(Attr, FormValue)) + auto FormValue = getAttributeValue(Attr); + if (!FormValue) return FailValue; - Optional Result = FormValue.getAsSectionOffset(); + Optional Result = FormValue->getAsSectionOffset(); return Result.hasValue() ? Result.getValue() : FailValue; } diff --git a/llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp b/llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp index dacd644..88fb203 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp @@ -26,11 +26,7 @@ bool DWARFTypeUnit::extractImpl(DataExtractor debug_info, void DWARFTypeUnit::dump(raw_ostream &OS, bool SummarizeTypes) { DWARFDie TD = getDIEForOffset(TypeOffset + getOffset()); - DWARFFormValue NameVal; - const char *Name = ""; - if (TD.getAttributeValue(llvm::dwarf::DW_AT_name, NameVal)) - if (auto ON = NameVal.getAsCString()) - Name = *ON; + const char *Name = TD.getAttributeValueAsString(llvm::dwarf::DW_AT_name, ""); if (SummarizeTypes) { OS << "name = '" << Name << "'" diff --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp index 6818ed2..068bf22 100644 --- a/llvm/tools/dsymutil/DwarfLinker.cpp +++ b/llvm/tools/dsymutil/DwarfLinker.cpp @@ -2136,19 +2136,19 @@ unsigned DwarfLinker::shouldKeepSubprogramDIE( Flags |= TF_Keep; - DWARFFormValue HighPcValue; - if (!DIE.getAttributeValue(dwarf::DW_AT_high_pc, HighPcValue)) { + Optional HighPcValue; + if (!(HighPcValue = DIE.getAttributeValue(dwarf::DW_AT_high_pc))) { reportWarning("Function without high_pc. Range will be discarded.\n", &DIE); return Flags; } uint64_t HighPc; - if (HighPcValue.isFormClass(DWARFFormValue::FC_Address)) { - HighPc = *HighPcValue.getAsAddress(); + if (HighPcValue->isFormClass(DWARFFormValue::FC_Address)) { + HighPc = *HighPcValue->getAsAddress(); } else { - assert(HighPcValue.isFormClass(DWARFFormValue::FC_Constant)); - HighPc = LowPc + *HighPcValue.getAsUnsignedConstant(); + assert(HighPcValue->isFormClass(DWARFFormValue::FC_Constant)); + HighPc = LowPc + *HighPcValue->getAsUnsignedConstant(); } // Replace the debug map range with a more accurate one. diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp index 95eec29..3a418f8 100644 --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp @@ -227,33 +227,37 @@ void TestAllForms() { //---------------------------------------------------------------------- // Test block forms //---------------------------------------------------------------------- - DWARFFormValue FormValue; + Optional FormValue; ArrayRef ExtractedBlockData; Optional> BlockDataOpt; - EXPECT_TRUE(DieDG.getAttributeValue(Attr_DW_FORM_block, FormValue)); - BlockDataOpt = FormValue.getAsBlock(); + FormValue = DieDG.getAttributeValue(Attr_DW_FORM_block); + EXPECT_TRUE((bool)FormValue); + BlockDataOpt = FormValue->getAsBlock(); EXPECT_TRUE(BlockDataOpt.hasValue()); ExtractedBlockData = BlockDataOpt.getValue(); EXPECT_EQ(ExtractedBlockData.size(), BlockSize); EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0); - EXPECT_TRUE(DieDG.getAttributeValue(Attr_DW_FORM_block1, FormValue)); - BlockDataOpt = FormValue.getAsBlock(); + FormValue = DieDG.getAttributeValue(Attr_DW_FORM_block1); + EXPECT_TRUE((bool)FormValue); + BlockDataOpt = FormValue->getAsBlock(); EXPECT_TRUE(BlockDataOpt.hasValue()); ExtractedBlockData = BlockDataOpt.getValue(); EXPECT_EQ(ExtractedBlockData.size(), BlockSize); EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0); - EXPECT_TRUE(DieDG.getAttributeValue(Attr_DW_FORM_block2, FormValue)); - BlockDataOpt = FormValue.getAsBlock(); + FormValue = DieDG.getAttributeValue(Attr_DW_FORM_block2); + EXPECT_TRUE((bool)FormValue); + BlockDataOpt = FormValue->getAsBlock(); EXPECT_TRUE(BlockDataOpt.hasValue()); ExtractedBlockData = BlockDataOpt.getValue(); EXPECT_EQ(ExtractedBlockData.size(), BlockSize); EXPECT_TRUE(memcmp(ExtractedBlockData.data(), BlockData, BlockSize) == 0); - EXPECT_TRUE(DieDG.getAttributeValue(Attr_DW_FORM_block4, FormValue)); - BlockDataOpt = FormValue.getAsBlock(); + FormValue = DieDG.getAttributeValue(Attr_DW_FORM_block4); + EXPECT_TRUE((bool)FormValue); + BlockDataOpt = FormValue->getAsBlock(); EXPECT_TRUE(BlockDataOpt.hasValue()); ExtractedBlockData = BlockDataOpt.getValue(); EXPECT_EQ(ExtractedBlockData.size(), BlockSize); -- 2.7.4