[PATCH] D78113: Fix DWARFDataExtractor::getRelocatedValue near EOF

Pavel Labath via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 14 09:38:49 PDT 2020


labath updated this revision to Diff 257377.
labath added a comment.

- add const & to Twine


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D78113/new/

https://reviews.llvm.org/D78113

Files:
  llvm/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp
  llvm/unittests/DebugInfo/DWARF/DWARFDataExtractorTest.cpp


Index: llvm/unittests/DebugInfo/DWARF/DWARFDataExtractorTest.cpp
===================================================================
--- llvm/unittests/DebugInfo/DWARF/DWARFDataExtractorTest.cpp
+++ 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<object::ObjectFile> Obj = yaml::yaml2ObjectFile(
+      Storage, Yaml, [](const Twine &Err) { errs() << Err; });
+  ASSERT_TRUE(Obj);
+  std::unique_ptr<DWARFContext> 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<uint8_t> Bytes)
       -> Expected<std::tuple<uint64_t, dwarf::DwarfFormat, uint64_t>> {
Index: llvm/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp
===================================================================
--- llvm/lib/DebugInfo/DWARF/DWARFDataExtractor.cpp
+++ 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<RelocAddrEntry> 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;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78113.257377.patch
Type: text/x-patch
Size: 2839 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200414/3009509a/attachment.bin>


More information about the llvm-commits mailing list