diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp @@ -50,9 +50,11 @@ *SecNdx = object::SectionedAddress::UndefSection; if (!Section) return getUnsigned(Off, Size, Err); + + ErrorAsOutParameter ErrAsOut(Err); Optional E = Obj->find(*Section, *Off); uint64_t A = getUnsigned(Off, Size, Err); - if (!E) + if (!E || (Err && *Err)) return A; if (SecNdx) *SecNdx = E->SectionIndex; diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDataExtractorTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDataExtractorTest.cpp --- a/llvm/unittests/DebugInfo/DWARF/DWARFDataExtractorTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDataExtractorTest.cpp @@ -7,6 +7,9 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h" +#include "llvm/DebugInfo/DWARF/DWARFContext.h" +#include "llvm/Object/ObjectFile.h" +#include "llvm/ObjectYAML/yaml2obj.h" #include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" @@ -14,6 +17,54 @@ namespace { +TEST(DWARFDataExtractorTest, getRelocatedValue) { + StringRef Yaml = R"( +!ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .text + Type: SHT_PROGBITS + Size: 0x80 + - Name: .debug_line + Type: SHT_PROGBITS + Content: '000000000000' + - Name: .rel.debug_line + Type: SHT_REL + Info: .debug_line + Relocations: + - Offset: 0 + Symbol: f + Type: R_386_32 + - Offset: 4 + Symbol: f + Type: R_386_32 +Symbols: + - Name: f + Type: STT_SECTION + Section: .text + Value: 0x42 +)"; + SmallString<0> Storage; + std::unique_ptr Obj = yaml::yaml2ObjectFile( + Storage, Yaml, [](const Twine &Err) { errs() << Err; }); + ASSERT_TRUE(Obj); + std::unique_ptr Ctx = DWARFContext::create(*Obj); + const DWARFObject &DObj = Ctx->getDWARFObj(); + ASSERT_EQ(6u, DObj.getLineSection().Data.size()); + + DWARFDataExtractor Data(DObj, DObj.getLineSection(), Obj->isLittleEndian(), + Obj->getBytesInAddress()); + DataExtractor::Cursor C(0); + EXPECT_EQ(0x42u, Data.getRelocatedAddress(C)); + EXPECT_EQ(0u, Data.getRelocatedAddress(C)); + EXPECT_THAT_ERROR(C.takeError(), + FailedWithMessage("unexpected end of data at offset 0x4")); +} + TEST(DWARFDataExtractorTest, getInitialLength) { auto GetWithError = [](ArrayRef Bytes) -> Expected> {