[PATCH] D54361: [ELF] .gdb_index: fix CuOff when a .debug_info section more than 1 CUThis fixes a .gdb_index issue linking Scrt1.o with debug information, as Scrt1.o has two DW_tag_compile_unit.

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 9 16:03:39 PST 2018


MaskRay created this revision.
Herald added subscribers: llvm-commits, arphaman, JDevlieghere, arichardson, aprantl, emaste.
Herald added a reviewer: espindola.

Repository:
  rLLD LLVM Linker

https://reviews.llvm.org/D54361

Files:
  ELF/SyntheticSections.cpp


Index: ELF/SyntheticSections.cpp
===================================================================
--- ELF/SyntheticSections.cpp
+++ ELF/SyntheticSections.cpp
@@ -2414,6 +2414,8 @@
 
 static std::vector<GdbIndexSection::NameTypeEntry>
 readPubNamesAndTypes(DWARFContext &Dwarf, uint32_t Idx) {
+  // Idx is chunk/section offset which should be converted to CU offset later.
+
   StringRef Sec1 = Dwarf.getDWARFObj().getGnuPubNamesSection();
   StringRef Sec2 = Dwarf.getDWARFObj().getGnuPubTypesSection();
 
@@ -2548,14 +2550,17 @@
   Hdr->CuTypesOff = Buf - Start;
   Hdr->AddressAreaOff = Buf - Start;
   uint32_t CuOff = 0;
+  std::vector<uint32_t> ChunkOffToCuOff;
+  ChunkOffToCuOff.reserve(Chunks.size());
   for (GdbChunk &Chunk : Chunks) {
     for (AddressEntry &E : Chunk.AddressAreas) {
       uint64_t BaseAddr = E.Section->getVA(0);
       write64le(Buf, BaseAddr + E.LowAddress);
       write64le(Buf + 8, BaseAddr + E.HighAddress);
       write32le(Buf + 16, E.CuIndex + CuOff);
       Buf += 20;
     }
+    ChunkOffToCuOff.push_back(CuOff);
     CuOff += Chunk.CompilationUnits.size();
   }
 
@@ -2585,11 +2590,12 @@
   });
 
   // Write the CU vectors.
+  constexpr uint32_t CuOffMask = (1 << 24) - 1;
   for (GdbSymbol &Sym : Symbols) {
     write32le(Buf, Sym.CuVector.size());
     Buf += 4;
     for (uint32_t Val : Sym.CuVector) {
-      write32le(Buf, Val);
+      write32le(Buf, (Val & ~CuOffMask) | ChunkOffToCuOff[Val & CuOffMask]);
       Buf += 4;
     }
   }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D54361.173462.patch
Type: text/x-patch
Size: 1491 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181110/95828ed4/attachment.bin>


More information about the llvm-commits mailing list