[ELF] Simplify MergeInputSection::getParentOffset. NFC
authorFangrui Song <i@maskray.me>
Mon, 28 Mar 2022 17:02:35 +0000 (10:02 -0700)
committerFangrui Song <i@maskray.me>
Mon, 28 Mar 2022 17:02:35 +0000 (10:02 -0700)
and remove overly verbose comments.

lld/ELF/InputSection.cpp
lld/ELF/InputSection.h
lld/ELF/MarkLive.cpp
lld/ELF/Writer.cpp

index 1d23c065000cbe6a68acf838ca39827457a91c4e..d45ab9480f4215dad6ad76ca7bb06daf53d20889 100644 (file)
@@ -1410,26 +1410,17 @@ void MergeInputSection::splitIntoPieces() {
     splitNonStrings(data(), entsize);
 }
 
-SectionPiece *MergeInputSection::getSectionPiece(uint64_t offset) {
-  if (this->rawData.size() <= offset)
+SectionPiece &MergeInputSection::getSectionPiece(uint64_t offset) {
+  if (rawData.size() <= offset)
     fatal(toString(this) + ": offset is outside the section");
-
-  // If Offset is not at beginning of a section piece, it is not in the map.
-  // In that case we need to  do a binary search of the original section piece vector.
-  auto it = partition_point(
-      pieces, [=](SectionPiece p) { return p.inputOff <= offset; });
-  return &it[-1];
+  return partition_point(
+      pieces, [=](SectionPiece p) { return p.inputOff <= offset; })[-1];
 }
 
-// Returns the offset in an output section for a given input offset.
-// Because contents of a mergeable section is not contiguous in output,
-// it is not just an addition to a base output offset.
+// Return the offset in an output section for a given input offset.
 uint64_t MergeInputSection::getParentOffset(uint64_t offset) const {
-  // If Offset is not at beginning of a section piece, it is not in the map.
-  // In that case we need to search from the original section piece vector.
-  const SectionPiece &piece = *getSectionPiece(offset);
-  uint64_t addend = offset - piece.inputOff;
-  return piece.outputOff + addend;
+  const SectionPiece &piece = getSectionPiece(offset);
+  return piece.outputOff + (offset - piece.inputOff);
 }
 
 template InputSection::InputSection(ObjFile<ELF32LE> &, const ELF32LE::Shdr &,
index 7e23e565b3d349d96a8195a95f173c9fbfa7d856..b99a344618ada0d81dcef3c63ad0baae4f2f6d0f 100644 (file)
@@ -282,8 +282,8 @@ public:
   }
 
   // Returns the SectionPiece at a given input section offset.
-  SectionPiece *getSectionPiece(uint64_t offset);
-  const SectionPiece *getSectionPiece(uint64_t offset) const {
+  SectionPiece &getSectionPiece(uint64_t offset);
+  const SectionPiece &getSectionPiece(uint64_t offset) const {
     return const_cast<MergeInputSection *>(this)->getSectionPiece(offset);
   }
 
index 7a97af96d3ed184691555211eeddeb1b3a66d79c..42875c10cb2b75c6fb4020efdffcee9bbaf3a06e 100644 (file)
@@ -198,7 +198,7 @@ void MarkLive<ELFT>::enqueue(InputSectionBase *sec, uint64_t offset) {
   // (splittable) sections, each piece of data has independent liveness bit.
   // So we explicitly tell it which offset is in use.
   if (auto *ms = dyn_cast<MergeInputSection>(sec))
-    ms->getSectionPiece(offset)->live = true;
+    ms->getSectionPiece(offset).live = true;
 
   // Set Sec->Partition to the meet (i.e. the "minimum") of Partition and
   // Sec->Partition in the following lattice: 1 < other < 0. If Sec->Partition
index fa374fd08e432f0e56079d2cea1ad2cf64fcdb84..8ca72b3455927bfc0da1578fca740a2f48bec5e8 100644 (file)
@@ -673,7 +673,7 @@ static bool includeInSymtab(const Symbol &b) {
       return true;
 
     if (auto *s = dyn_cast<MergeInputSection>(sec))
-      return s->getSectionPiece(d->value)->live;
+      return s->getSectionPiece(d->value).live;
     return sec->isLive();
   }
   return b.used || !config->gcSections;