Index: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h @@ -80,8 +80,10 @@ /// \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; Index: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h =================================================================== --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFDie.h +++ llvm/trunk/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 @@ /// \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. /// Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp @@ -143,12 +143,12 @@ 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 @@ 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 @@ DWARFFormValue::skipValue(Spec.Form, DebugInfoData, &Offset, &U); ++AttrIndex; } - return false; + return None; } size_t DWARFAbbreviationDeclaration::FixedSizeInfo::getByteSize( Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -133,68 +133,68 @@ 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; } Index: llvm/trunk/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp =================================================================== --- llvm/trunk/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp @@ -26,11 +26,7 @@ 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 << "'" Index: llvm/trunk/tools/dsymutil/DwarfLinker.cpp =================================================================== --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp @@ -2136,19 +2136,19 @@ 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. Index: llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp =================================================================== --- llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ llvm/trunk/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp @@ -227,33 +227,37 @@ //---------------------------------------------------------------------- // 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);