summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h6
-rw-r--r--llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h4
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp15
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDie.cpp48
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFTypeUnit.cpp6
-rw-r--r--llvm/tools/dsymutil/DwarfLinker.cpp12
-rw-r--r--llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp22
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 a0a3c59932f..8f8876bbc24 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<DWARFFormValue> 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 57ceeeb7714..c034661c84b 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<DWARFFormValue> 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 638830ee568..6126470aa09 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<DWARFFormValue> DWARFAbbreviationDeclaration::getAttributeValue(
+ const uint32_t DIEOffset, const dwarf::Attribute Attr,
+ const DWARFUnit &U) const {
Optional<uint32_t> 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<uint8_t> 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 a41fe6fce1d..f52cc112f7f 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<DWARFFormValue>
+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<const char *> Result = FormValue.getAsCString();
+ Optional<const char *> 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<uint64_t> Result = FormValue.getAsAddress();
+ Optional<uint64_t> 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<int64_t> Result = FormValue.getAsSignedConstant();
+ Optional<int64_t> 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<uint64_t> Result = FormValue.getAsUnsignedConstant();
+ Optional<uint64_t> 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<uint64_t> Result = FormValue.getAsReference();
+ Optional<uint64_t> 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<uint64_t> Result = FormValue.getAsSectionOffset();
+ Optional<uint64_t> 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 dacd6449d3d..88fb20381f9 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 6818ed220d0..068bf22cc89 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<DWARFFormValue> 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 95eec29ae38..3a418f8a985 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<DWARFFormValue> FormValue;
ArrayRef<uint8_t> ExtractedBlockData;
Optional<ArrayRef<uint8_t>> 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);
OpenPOWER on IntegriCloud