diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index 1d23c065000c..d45ab9480f42 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -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 &, const ELF32LE::Shdr &, diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index 7e23e565b3d3..b99a344618ad 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -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(this)->getSectionPiece(offset); } diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp index 7a97af96d3ed..42875c10cb2b 100644 --- a/lld/ELF/MarkLive.cpp +++ b/lld/ELF/MarkLive.cpp @@ -198,7 +198,7 @@ void MarkLive::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(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 diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index fa374fd08e43..8ca72b345592 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -673,7 +673,7 @@ static bool includeInSymtab(const Symbol &b) { return true; if (auto *s = dyn_cast(sec)) - return s->getSectionPiece(d->value)->live; + return s->getSectionPiece(d->value).live; return sec->isLive(); } return b.used || !config->gcSections;