mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-30 08:25:08 +00:00
Switch functions that returned bool and filled in a DWARFFormValue arg with ones that return Optional<DWARFFormValue>
Differential Revision: https://reviews.llvm.org/D27737 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289611 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
06f5b6a274
commit
e96000e8bd
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
///
|
||||
|
@ -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(
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 << "'"
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user