1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

Revert "[DWARF] - Make collectAddressRanges() return section index in addition to Low/High PC"

Broked BB again:

TEST 'LLVM :: DebugInfo/X86/dbg-value-regmask-clobber.ll' FAILED
...
LLVM ERROR: Section was outside of section table.

llvm-svn: 303984
This commit is contained in:
George Rimar 2017-05-26 13:20:09 +00:00
parent 0f9fc74c0e
commit 8808a64045
18 changed files with 42 additions and 96 deletions

View File

@ -46,8 +46,7 @@ class raw_ostream;
/// Reads a value from data extractor and applies a relocation to the result if /// Reads a value from data extractor and applies a relocation to the result if
/// one exists for the given offset. /// one exists for the given offset.
uint64_t getRelocatedValue(const DataExtractor &Data, uint32_t Size, uint64_t getRelocatedValue(const DataExtractor &Data, uint32_t Size,
uint32_t *Off, const RelocAddrMap *Relocs, uint32_t *Off, const RelocAddrMap *Relocs);
uint64_t *SecNdx = nullptr);
/// DWARFContext /// DWARFContext
/// This data structure is the top level entity that deals with dwarf debug /// This data structure is the top level entity that deals with dwarf debug

View File

@ -25,7 +25,6 @@ class raw_ostream;
struct DWARFAddressRange { struct DWARFAddressRange {
uint64_t LowPC; uint64_t LowPC;
uint64_t HighPC; uint64_t HighPC;
uint64_t SectionIndex;
}; };
/// DWARFAddressRangesVector - represents a set of absolute address ranges. /// DWARFAddressRangesVector - represents a set of absolute address ranges.
@ -45,8 +44,6 @@ public:
/// address past the end of the address range. The ending address must /// address past the end of the address range. The ending address must
/// be greater than or equal to the beginning address. /// be greater than or equal to the beginning address.
uint64_t EndAddress; uint64_t EndAddress;
/// A section index this range belongs to.
uint64_t SectionIndex;
/// The end of any given range list is marked by an end of list entry, /// The end of any given range list is marked by an end of list entry,
/// which consists of a 0 for the beginning address offset /// which consists of a 0 for the beginning address offset

View File

@ -195,8 +195,7 @@ public:
/// Retrieves DW_AT_low_pc and DW_AT_high_pc from CU. /// Retrieves DW_AT_low_pc and DW_AT_high_pc from CU.
/// Returns true if both attributes are present. /// Returns true if both attributes are present.
bool getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC, bool getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC) const;
uint64_t &SectionIndex) const;
/// Get the address ranges for this DIE. /// Get the address ranges for this DIE.
/// ///

View File

@ -47,7 +47,6 @@ private:
const char *cstr; const char *cstr;
}; };
const uint8_t *data = nullptr; const uint8_t *data = nullptr;
uint64_t SectionIndex; /// Section index for reference forms.
}; };
dwarf::Form Form; /// Form for this value. dwarf::Form Form; /// Form for this value.
@ -59,7 +58,6 @@ public:
dwarf::Form getForm() const { return Form; } dwarf::Form getForm() const { return Form; }
uint64_t getRawUValue() const { return Value.uval; } uint64_t getRawUValue() const { return Value.uval; }
uint64_t getSectionIndex() const { return Value.SectionIndex; }
void setForm(dwarf::Form F) { Form = F; } void setForm(dwarf::Form F) { Form = F; }
void setUValue(uint64_t V) { Value.uval = V; } void setUValue(uint64_t V) { Value.uval = V; }
void setSValue(int64_t V) { Value.sval = V; } void setSValue(int64_t V) { Value.sval = V; }

View File

@ -17,7 +17,6 @@
namespace llvm { namespace llvm {
struct RelocAddrEntry { struct RelocAddrEntry {
uint64_t SectionIndex;
uint64_t Value; uint64_t Value;
}; };

View File

@ -782,7 +782,6 @@ protected:
std::error_code getSectionName(DataRefImpl Sec, std::error_code getSectionName(DataRefImpl Sec,
StringRef &Res) const override; StringRef &Res) const override;
uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override;
uint64_t getSectionIndex(DataRefImpl Sec) const override;
uint64_t getSectionSize(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override;
std::error_code getSectionContents(DataRefImpl Sec, std::error_code getSectionContents(DataRefImpl Sec,
StringRef &Res) const override; StringRef &Res) const override;

View File

@ -235,7 +235,6 @@ protected:
std::error_code getSectionName(DataRefImpl Sec, std::error_code getSectionName(DataRefImpl Sec,
StringRef &Res) const override; StringRef &Res) const override;
uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override;
uint64_t getSectionIndex(DataRefImpl Sec) const override;
uint64_t getSectionSize(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override;
std::error_code getSectionContents(DataRefImpl Sec, std::error_code getSectionContents(DataRefImpl Sec,
StringRef &Res) const override; StringRef &Res) const override;
@ -646,17 +645,6 @@ uint64_t ELFObjectFile<ELFT>::getSectionAddress(DataRefImpl Sec) const {
return getSection(Sec)->sh_addr; return getSection(Sec)->sh_addr;
} }
template <class ELFT>
uint64_t ELFObjectFile<ELFT>::getSectionIndex(DataRefImpl Sec) const {
auto SectionsOrErr = EF.sections();
handleAllErrors(std::move(SectionsOrErr.takeError()),
[](const ErrorInfoBase &) {
llvm_unreachable("unable to get section index");
});
const Elf_Shdr *First = SectionsOrErr->begin();
return getSection(Sec) - First;
}
template <class ELFT> template <class ELFT>
uint64_t ELFObjectFile<ELFT>::getSectionSize(DataRefImpl Sec) const { uint64_t ELFObjectFile<ELFT>::getSectionSize(DataRefImpl Sec) const {
return getSection(Sec)->sh_size; return getSection(Sec)->sh_size;

View File

@ -290,7 +290,6 @@ public:
std::error_code getSectionName(DataRefImpl Sec, std::error_code getSectionName(DataRefImpl Sec,
StringRef &Res) const override; StringRef &Res) const override;
uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override;
uint64_t getSectionIndex(DataRefImpl Sec) const override;
uint64_t getSectionSize(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override;
std::error_code getSectionContents(DataRefImpl Sec, std::error_code getSectionContents(DataRefImpl Sec,
StringRef &Res) const override; StringRef &Res) const override;

View File

@ -95,7 +95,6 @@ public:
std::error_code getName(StringRef &Result) const; std::error_code getName(StringRef &Result) const;
uint64_t getAddress() const; uint64_t getAddress() const;
uint64_t getIndex() const;
uint64_t getSize() const; uint64_t getSize() const;
std::error_code getContents(StringRef &Result) const; std::error_code getContents(StringRef &Result) const;
@ -223,7 +222,6 @@ protected:
virtual std::error_code getSectionName(DataRefImpl Sec, virtual std::error_code getSectionName(DataRefImpl Sec,
StringRef &Res) const = 0; StringRef &Res) const = 0;
virtual uint64_t getSectionAddress(DataRefImpl Sec) const = 0; virtual uint64_t getSectionAddress(DataRefImpl Sec) const = 0;
virtual uint64_t getSectionIndex(DataRefImpl Sec) const = 0;
virtual uint64_t getSectionSize(DataRefImpl Sec) const = 0; virtual uint64_t getSectionSize(DataRefImpl Sec) const = 0;
virtual std::error_code getSectionContents(DataRefImpl Sec, virtual std::error_code getSectionContents(DataRefImpl Sec,
StringRef &Res) const = 0; StringRef &Res) const = 0;
@ -395,10 +393,6 @@ inline uint64_t SectionRef::getAddress() const {
return OwningObject->getSectionAddress(SectionPimpl); return OwningObject->getSectionAddress(SectionPimpl);
} }
inline uint64_t SectionRef::getIndex() const {
return OwningObject->getSectionIndex(SectionPimpl);
}
inline uint64_t SectionRef::getSize() const { inline uint64_t SectionRef::getSize() const {
return OwningObject->getSectionSize(SectionPimpl); return OwningObject->getSectionSize(SectionPimpl);
} }

View File

@ -119,7 +119,6 @@ public:
std::error_code getSectionName(DataRefImpl Sec, std::error_code getSectionName(DataRefImpl Sec,
StringRef &Res) const override; StringRef &Res) const override;
uint64_t getSectionAddress(DataRefImpl Sec) const override; uint64_t getSectionAddress(DataRefImpl Sec) const override;
uint64_t getSectionIndex(DataRefImpl Sec) const override;
uint64_t getSectionSize(DataRefImpl Sec) const override; uint64_t getSectionSize(DataRefImpl Sec) const override;
std::error_code getSectionContents(DataRefImpl Sec, std::error_code getSectionContents(DataRefImpl Sec,
StringRef &Res) const override; StringRef &Res) const override;

View File

@ -60,15 +60,12 @@ typedef DILineInfoSpecifier::FileLineInfoKind FileLineInfoKind;
typedef DILineInfoSpecifier::FunctionNameKind FunctionNameKind; typedef DILineInfoSpecifier::FunctionNameKind FunctionNameKind;
uint64_t llvm::getRelocatedValue(const DataExtractor &Data, uint32_t Size, uint64_t llvm::getRelocatedValue(const DataExtractor &Data, uint32_t Size,
uint32_t *Off, const RelocAddrMap *Relocs, uint32_t *Off, const RelocAddrMap *Relocs) {
uint64_t *SectionIndex) {
if (!Relocs) if (!Relocs)
return Data.getUnsigned(Off, Size); return Data.getUnsigned(Off, Size);
RelocAddrMap::const_iterator AI = Relocs->find(*Off); RelocAddrMap::const_iterator AI = Relocs->find(*Off);
if (AI == Relocs->end()) if (AI == Relocs->end())
return Data.getUnsigned(Off, Size); return Data.getUnsigned(Off, Size);
if (SectionIndex)
*SectionIndex = AI->second.SectionIndex;
return Data.getUnsigned(Off, Size) + AI->second.Value; return Data.getUnsigned(Off, Size) + AI->second.Value;
} }
@ -961,27 +958,23 @@ static Error createError(const Twine &Reason, llvm::Error E) {
inconvertibleErrorCode()); inconvertibleErrorCode());
} }
struct SymInfo { /// Returns the address of symbol relocation used against. Used for futher
uint64_t Address; /// relocations computation. Symbol's section load address is taken in account if
uint64_t SectionIndex; /// LoadedObjectInfo interface is provided.
}; static Expected<uint64_t>
getSymbolAddress(const object::ObjectFile &Obj, const RelocationRef &Reloc,
/// Returns the address of symbol relocation used against and a section index. const LoadedObjectInfo *L,
/// Used for futher relocations computation. Symbol's section load address is std::map<SymbolRef, uint64_t> &Cache) {
static Expected<SymInfo> getSymbolInfo(const object::ObjectFile &Obj, uint64_t Ret = 0;
const RelocationRef &Reloc,
const LoadedObjectInfo *L,
std::map<SymbolRef, SymInfo> &Cache) {
SymInfo Ret;
object::section_iterator RSec = Obj.section_end(); object::section_iterator RSec = Obj.section_end();
object::symbol_iterator Sym = Reloc.getSymbol(); object::symbol_iterator Sym = Reloc.getSymbol();
std::map<SymbolRef, SymInfo>::iterator CacheIt = Cache.end(); std::map<SymbolRef, uint64_t>::iterator CacheIt = Cache.end();
// First calculate the address of the symbol or section as it appears // First calculate the address of the symbol or section as it appears
// in the object file // in the object file
if (Sym != Obj.symbol_end()) { if (Sym != Obj.symbol_end()) {
bool New; bool New;
std::tie(CacheIt, New) = Cache.insert({*Sym, {0, 0}}); std::tie(CacheIt, New) = Cache.insert({*Sym, 0});
if (!New) if (!New)
return CacheIt->second; return CacheIt->second;
@ -997,14 +990,12 @@ static Expected<SymInfo> getSymbolInfo(const object::ObjectFile &Obj,
SectOrErr.takeError()); SectOrErr.takeError());
RSec = *SectOrErr; RSec = *SectOrErr;
Ret.Address = *SymAddrOrErr; Ret = *SymAddrOrErr;
} else if (auto *MObj = dyn_cast<MachOObjectFile>(&Obj)) { } else if (auto *MObj = dyn_cast<MachOObjectFile>(&Obj)) {
RSec = MObj->getRelocationSection(Reloc.getRawDataRefImpl()); RSec = MObj->getRelocationSection(Reloc.getRawDataRefImpl());
Ret.Address = RSec->getAddress(); Ret = RSec->getAddress();
} }
Ret.SectionIndex = RSec->getIndex();
// If we are given load addresses for the sections, we need to adjust: // If we are given load addresses for the sections, we need to adjust:
// SymAddr = (Address of Symbol Or Section in File) - // SymAddr = (Address of Symbol Or Section in File) -
// (Address of Section in File) + // (Address of Section in File) +
@ -1014,7 +1005,7 @@ static Expected<SymInfo> getSymbolInfo(const object::ObjectFile &Obj,
// we need to perform the same computation. // we need to perform the same computation.
if (L && RSec != Obj.section_end()) if (L && RSec != Obj.section_end())
if (uint64_t SectionLoadAddress = L->getSectionLoadAddress(*RSec)) if (uint64_t SectionLoadAddress = L->getSectionLoadAddress(*RSec))
Ret.Address += SectionLoadAddress - RSec->getAddress(); Ret += SectionLoadAddress - RSec->getAddress();
if (CacheIt != Cache.end()) if (CacheIt != Cache.end())
CacheIt->second = Ret; CacheIt->second = Ret;
@ -1073,7 +1064,7 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
// Try to obtain an already relocated version of this section. // Try to obtain an already relocated version of this section.
// Else use the unrelocated section from the object file. We'll have to // Else use the unrelocated section from the object file. We'll have to
// apply relocations ourselves later. // apply relocations ourselves later.
if (!L || !L->getLoadedSectionContents(*RelocatedSection, data)) if (!L || !L->getLoadedSectionContents(*RelocatedSection,data))
Section.getContents(data); Section.getContents(data);
if (auto Err = maybeDecompress(Section, name, data)) { if (auto Err = maybeDecompress(Section, name, data)) {
@ -1112,7 +1103,7 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
// If the section we're relocating was relocated already by the JIT, // If the section we're relocating was relocated already by the JIT,
// then we used the relocated version above, so we do not need to process // then we used the relocated version above, so we do not need to process
// relocations for it now. // relocations for it now.
if (L && L->getLoadedSectionContents(*RelocatedSection, RelSecData)) if (L && L->getLoadedSectionContents(*RelocatedSection,RelSecData))
continue; continue;
// In Mach-o files, the relocations do not need to be applied if // In Mach-o files, the relocations do not need to be applied if
@ -1156,30 +1147,29 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
if (Section.relocation_begin() == Section.relocation_end()) if (Section.relocation_begin() == Section.relocation_end())
continue; continue;
// Symbol to [address, section index] cache mapping. std::map<SymbolRef, uint64_t> AddrCache;
std::map<SymbolRef, SymInfo> AddrCache;
for (const RelocationRef &Reloc : Section.relocations()) { for (const RelocationRef &Reloc : Section.relocations()) {
// FIXME: it's not clear how to correctly handle scattered // FIXME: it's not clear how to correctly handle scattered
// relocations. // relocations.
if (isRelocScattered(Obj, Reloc)) if (isRelocScattered(Obj, Reloc))
continue; continue;
Expected<SymInfo> SymInfoOrErr = getSymbolInfo(Obj, Reloc, L, AddrCache); Expected<uint64_t> SymAddrOrErr =
if (!SymInfoOrErr) { getSymbolAddress(Obj, Reloc, L, AddrCache);
errs() << toString(SymInfoOrErr.takeError()) << '\n'; if (!SymAddrOrErr) {
errs() << toString(SymAddrOrErr.takeError()) << '\n';
continue; continue;
} }
object::RelocVisitor V(Obj); object::RelocVisitor V(Obj);
uint64_t Val = V.visit(Reloc.getType(), Reloc, SymInfoOrErr->Address); uint64_t Val = V.visit(Reloc.getType(), Reloc, *SymAddrOrErr);
if (V.error()) { if (V.error()) {
SmallString<32> Name; SmallString<32> Name;
Reloc.getTypeName(Name); Reloc.getTypeName(Name);
errs() << "error: failed to compute relocation: " << Name << "\n"; errs() << "error: failed to compute relocation: " << Name << "\n";
continue; continue;
} }
llvm::RelocAddrEntry Rel = {SymInfoOrErr->SectionIndex, Val}; Map->insert({Reloc.getOffset(), {Val}});
Map->insert({Reloc.getOffset(), Rel});
} }
} }
} }

View File

@ -35,8 +35,8 @@ bool DWARFDebugRangeList::extract(DataExtractor data, uint32_t *offset_ptr,
while (true) { while (true) {
RangeListEntry entry; RangeListEntry entry;
uint32_t prev_offset = *offset_ptr; uint32_t prev_offset = *offset_ptr;
entry.StartAddress = getRelocatedValue(data, AddressSize, offset_ptr, entry.StartAddress =
&Relocs, &entry.SectionIndex); getRelocatedValue(data, AddressSize, offset_ptr, &Relocs);
entry.EndAddress = entry.EndAddress =
getRelocatedValue(data, AddressSize, offset_ptr, &Relocs); getRelocatedValue(data, AddressSize, offset_ptr, &Relocs);
@ -69,8 +69,8 @@ DWARFDebugRangeList::getAbsoluteRanges(uint64_t BaseAddress) const {
if (RLE.isBaseAddressSelectionEntry(AddressSize)) { if (RLE.isBaseAddressSelectionEntry(AddressSize)) {
BaseAddress = RLE.EndAddress; BaseAddress = RLE.EndAddress;
} else { } else {
Res.push_back({BaseAddress + RLE.StartAddress, Res.push_back(
BaseAddress + RLE.EndAddress, RLE.SectionIndex}); {BaseAddress + RLE.StartAddress, BaseAddress + RLE.EndAddress});
} }
} }
return Res; return Res;

View File

@ -211,16 +211,13 @@ Optional<uint64_t> DWARFDie::getHighPC(uint64_t LowPC) const {
return None; return None;
} }
bool DWARFDie::getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC, bool DWARFDie::getLowAndHighPC(uint64_t &LowPC, uint64_t &HighPC) const {
uint64_t &SectionIndex) const { auto LowPcAddr = toAddress(find(DW_AT_low_pc));
auto F = find(DW_AT_low_pc);
auto LowPcAddr = toAddress(F);
if (!LowPcAddr) if (!LowPcAddr)
return false; return false;
if (auto HighPcAddr = getHighPC(*LowPcAddr)) { if (auto HighPcAddr = getHighPC(*LowPcAddr)) {
LowPC = *LowPcAddr; LowPC = *LowPcAddr;
HighPC = *HighPcAddr; HighPC = *HighPcAddr;
SectionIndex = F->getSectionIndex();
return true; return true;
} }
return false; return false;
@ -231,9 +228,9 @@ DWARFDie::getAddressRanges() const {
if (isNULL()) if (isNULL())
return DWARFAddressRangesVector(); return DWARFAddressRangesVector();
// Single range specified by low/high PC. // Single range specified by low/high PC.
uint64_t LowPC, HighPC, Index; uint64_t LowPC, HighPC;
if (getLowAndHighPC(LowPC, HighPC, Index)) if (getLowAndHighPC(LowPC, HighPC))
return {{LowPC, HighPC, Index}}; return {{LowPC, HighPC}};
// Multiple ranges from .debug_ranges section. // Multiple ranges from .debug_ranges section.
auto RangesOffset = toSectionOffset(find(DW_AT_ranges)); auto RangesOffset = toSectionOffset(find(DW_AT_ranges));

View File

@ -333,8 +333,8 @@ bool DWARFFormValue::extractValue(const DataExtractor &Data,
return false; return false;
uint16_t AddrSize = (Form == DW_FORM_addr) ? U->getAddressByteSize() uint16_t AddrSize = (Form == DW_FORM_addr) ? U->getAddressByteSize()
: U->getRefAddrByteSize(); : U->getRefAddrByteSize();
Value.uval = getRelocatedValue(Data, AddrSize, OffsetPtr, Value.uval =
U->getRelocMap(), &Value.SectionIndex); getRelocatedValue(Data, AddrSize, OffsetPtr, U->getRelocMap());
break; break;
} }
case DW_FORM_exprloc: case DW_FORM_exprloc:

View File

@ -293,10 +293,6 @@ uint64_t COFFObjectFile::getSectionAddress(DataRefImpl Ref) const {
return Result; return Result;
} }
uint64_t COFFObjectFile::getSectionIndex(DataRefImpl Sec) const {
return toSec(Sec) - SectionTable;
}
uint64_t COFFObjectFile::getSectionSize(DataRefImpl Ref) const { uint64_t COFFObjectFile::getSectionSize(DataRefImpl Ref) const {
return getSectionSize(toSec(Ref)); return getSectionSize(toSec(Ref));
} }

View File

@ -1820,10 +1820,6 @@ uint64_t MachOObjectFile::getSectionAddress(DataRefImpl Sec) const {
return getSection(Sec).addr; return getSection(Sec).addr;
} }
uint64_t MachOObjectFile::getSectionIndex(DataRefImpl Sec) const {
return Sec.d.a;
}
uint64_t MachOObjectFile::getSectionSize(DataRefImpl Sec) const { uint64_t MachOObjectFile::getSectionSize(DataRefImpl Sec) const {
// In the case if a malformed Mach-O file where the section offset is past // In the case if a malformed Mach-O file where the section offset is past
// the end of the file or some part of the section size is past the end of // the end of the file or some part of the section size is past the end of

View File

@ -743,10 +743,6 @@ std::error_code WasmObjectFile::getSectionName(DataRefImpl Sec,
uint64_t WasmObjectFile::getSectionAddress(DataRefImpl Sec) const { return 0; } uint64_t WasmObjectFile::getSectionAddress(DataRefImpl Sec) const { return 0; }
uint64_t WasmObjectFile::getSectionIndex(DataRefImpl Sec) const {
return Sec.d.a;
}
uint64_t WasmObjectFile::getSectionSize(DataRefImpl Sec) const { uint64_t WasmObjectFile::getSectionSize(DataRefImpl Sec) const {
const WasmSection &S = Sections[Sec.d.a]; const WasmSection &S = Sections[Sec.d.a];
return S.Content.size(); return S.Content.size();

View File

@ -853,8 +853,8 @@ template <uint16_t Version, class AddrType> void TestAddresses() {
// Get the compile unit DIE is valid. // Get the compile unit DIE is valid.
auto DieDG = U->getUnitDIE(false); auto DieDG = U->getUnitDIE(false);
EXPECT_TRUE(DieDG.isValid()); EXPECT_TRUE(DieDG.isValid());
uint64_t LowPC, HighPC, SectionIndex; uint64_t LowPC, HighPC;
Optional<uint64_t> OptU64; Optional<uint64_t> OptU64;
// Verify the that our subprogram with no PC value fails appropriately when // Verify the that our subprogram with no PC value fails appropriately when
// asked for any PC values. // asked for any PC values.
@ -865,14 +865,14 @@ template <uint16_t Version, class AddrType> void TestAddresses() {
EXPECT_FALSE((bool)OptU64); EXPECT_FALSE((bool)OptU64);
OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc)); OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc));
EXPECT_FALSE((bool)OptU64); EXPECT_FALSE((bool)OptU64);
EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC, SectionIndex)); EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc)); OptU64 = toAddress(SubprogramDieNoPC.find(DW_AT_high_pc));
EXPECT_FALSE((bool)OptU64); EXPECT_FALSE((bool)OptU64);
OptU64 = toUnsigned(SubprogramDieNoPC.find(DW_AT_high_pc)); OptU64 = toUnsigned(SubprogramDieNoPC.find(DW_AT_high_pc));
EXPECT_FALSE((bool)OptU64); EXPECT_FALSE((bool)OptU64);
OptU64 = SubprogramDieNoPC.getHighPC(ActualLowPC); OptU64 = SubprogramDieNoPC.getHighPC(ActualLowPC);
EXPECT_FALSE((bool)OptU64); EXPECT_FALSE((bool)OptU64);
EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC, SectionIndex)); EXPECT_FALSE(SubprogramDieNoPC.getLowAndHighPC(LowPC, HighPC));
// Verify the that our subprogram with only a low PC value succeeds when // Verify the that our subprogram with only a low PC value succeeds when
// we ask for the Low PC, but fails appropriately when asked for the high PC // we ask for the Low PC, but fails appropriately when asked for the high PC
@ -889,7 +889,7 @@ template <uint16_t Version, class AddrType> void TestAddresses() {
EXPECT_FALSE((bool)OptU64); EXPECT_FALSE((bool)OptU64);
OptU64 = SubprogramDieLowPC.getHighPC(ActualLowPC); OptU64 = SubprogramDieLowPC.getHighPC(ActualLowPC);
EXPECT_FALSE((bool)OptU64); EXPECT_FALSE((bool)OptU64);
EXPECT_FALSE(SubprogramDieLowPC.getLowAndHighPC(LowPC, HighPC, SectionIndex)); EXPECT_FALSE(SubprogramDieLowPC.getLowAndHighPC(LowPC, HighPC));
// Verify the that our subprogram with only a low PC value succeeds when // Verify the that our subprogram with only a low PC value succeeds when
// we ask for the Low PC, but fails appropriately when asked for the high PC // we ask for the Low PC, but fails appropriately when asked for the high PC
@ -923,7 +923,7 @@ template <uint16_t Version, class AddrType> void TestAddresses() {
EXPECT_TRUE((bool)OptU64); EXPECT_TRUE((bool)OptU64);
EXPECT_EQ(OptU64.getValue(), ActualHighPC); EXPECT_EQ(OptU64.getValue(), ActualHighPC);
EXPECT_TRUE(SubprogramDieLowHighPC.getLowAndHighPC(LowPC, HighPC, SectionIndex)); EXPECT_TRUE(SubprogramDieLowHighPC.getLowAndHighPC(LowPC, HighPC));
EXPECT_EQ(LowPC, ActualLowPC); EXPECT_EQ(LowPC, ActualLowPC);
EXPECT_EQ(HighPC, ActualHighPC); EXPECT_EQ(HighPC, ActualHighPC);
} }