[PATCH] D127811: Fix a bug introduced by the move of AddressRanges.h into ADT.

Greg Clayton via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 14 16:48:28 PDT 2022


clayborg created this revision.
clayborg added a reviewer: avl.
Herald added a subscriber: hiraditya.
Herald added a project: All.
clayborg requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

The bug was introduced when the AddressRange class was no longer able to modify the End address directly and the entire range of the .text address range that contained the trailing empty symbol was replaced. There was no unit test for this, so it wasn't caught. I fixed the bug and added a unit test for it.

The effects of this bug are serious as the AddressOffsetSize in the header would be incorrectly calculated and an invalid GSYM would be created.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D127811

Files:
  llvm/include/llvm/ADT/AddressRanges.h
  llvm/lib/DebugInfo/GSYM/GsymCreator.cpp
  llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp


Index: llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp
===================================================================
--- llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp
+++ llvm/unittests/DebugInfo/GSYM/GSYMTest.cpp
@@ -1644,6 +1644,35 @@
   EXPECT_EQ(MethodName, "main");
 }
 
+TEST(GSYMTest, TestEmptySymbolEndAddressOfTextRanges) {
+  // Test that if we have valid text ranges and we have a symbol with no size
+  // as the last FunctionInfo entry that the size of the symbol gets set to the
+  // end address of the text range.
+  GsymCreator GC;
+  AddressRanges TextRanges;
+  TextRanges.insert(AddressRange(0x1000, 0x2000));
+  GC.SetValidTextRanges(TextRanges);
+  GC.addFunctionInfo(FunctionInfo(0x1500, 0, GC.insertString("symbol")));
+  auto &OS = llvm::nulls();
+  ASSERT_THAT_ERROR(GC.finalize(OS), Succeeded());
+  SmallString<512> Str;
+  raw_svector_ostream OutStrm(Str);
+  const auto ByteOrder = support::endian::system_endianness();
+  FileWriter FW(OutStrm, ByteOrder);
+  ASSERT_THAT_ERROR(GC.encode(FW), Succeeded());
+  Expected<GsymReader> GR = GsymReader::copyBuffer(OutStrm.str());
+  ASSERT_THAT_EXPECTED(GR, Succeeded());
+  // There should only be one function in our GSYM.
+  EXPECT_EQ(GR->getNumAddresses(), 1u);
+  auto ExpFI = GR->getFunctionInfo(0x1500);
+  ASSERT_THAT_EXPECTED(ExpFI, Succeeded());
+  ASSERT_EQ(ExpFI->Range, AddressRange(0x1500, 0x2000));
+  EXPECT_FALSE(ExpFI->OptLineTable.hasValue());
+  EXPECT_FALSE(ExpFI->Inline.hasValue());
+  StringRef MethodName = GR->getString(ExpFI->Name);
+  EXPECT_EQ(MethodName, "symbol");
+}
+
 TEST(GSYMTest, TestDWARFInlineInfo) {
   // Make sure we parse the line table and inline information correctly from
   // DWARF.
Index: llvm/lib/DebugInfo/GSYM/GsymCreator.cpp
===================================================================
--- llvm/lib/DebugInfo/GSYM/GsymCreator.cpp
+++ llvm/lib/DebugInfo/GSYM/GsymCreator.cpp
@@ -292,7 +292,7 @@
   if (!Funcs.empty() && Funcs.back().Range.size() == 0 && ValidTextRanges) {
     if (auto Range =
             ValidTextRanges->getRangeThatContains(Funcs.back().Range.start())) {
-      Funcs.back().Range = *Range;
+      Funcs.back().Range.setEnd(Range->end());
     }
   }
   OS << "Pruned " << NumBefore - Funcs.size() << " functions, ended with "
Index: llvm/include/llvm/ADT/AddressRanges.h
===================================================================
--- llvm/include/llvm/ADT/AddressRanges.h
+++ llvm/include/llvm/ADT/AddressRanges.h
@@ -26,6 +26,8 @@
   }
   uint64_t start() const { return Start; }
   uint64_t end() const { return End; }
+  void setStart(uint64_t Addr) { Start = Addr; }
+  void setEnd(uint64_t Addr) { End = Addr; }
   uint64_t size() const { return End - Start; }
   bool contains(uint64_t Addr) const { return Start <= Addr && Addr < End; }
   bool intersects(const AddressRange &R) const {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127811.436976.patch
Type: text/x-patch
Size: 2859 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220614/bc26a2f5/attachment.bin>


More information about the llvm-commits mailing list