summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/InputSection.cpp6
-rw-r--r--lld/ELF/InputSection.h12
-rw-r--r--lld/ELF/OutputSections.cpp4
3 files changed, 14 insertions, 8 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index 2f265e35ae6..1e9e96eb631 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -28,6 +28,10 @@ using namespace llvm::support::endian;
using namespace lld;
using namespace lld::elf;
+ArrayRef<uint8_t> InputSectionData::getData(const SectionPiece &P) const {
+ return Data.slice(P.InputOff, P.size());
+}
+
template <class ELFT>
static ArrayRef<uint8_t> getSectionContents(elf::ObjectFile<ELFT> *File,
const typename ELFT::Shdr *Hdr) {
@@ -638,7 +642,7 @@ template <class ELFT> void MergeInputSection<ELFT>::finalizePieces() {
if (Piece.OutputOff == size_t(-1)) {
// Offsets of tail-merged strings are computed lazily.
auto *OutSec = static_cast<MergeOutputSection<ELFT> *>(this->OutSec);
- ArrayRef<uint8_t> D = Piece.data();
+ ArrayRef<uint8_t> D = this->getData(Piece);
StringRef S((const char *)D.data(), D.size());
Piece.OutputOff = OutSec->getOffset(S);
}
diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h
index 34549156f6b..b5ff603a87c 100644
--- a/lld/ELF/InputSection.h
+++ b/lld/ELF/InputSection.h
@@ -23,6 +23,7 @@ namespace elf {
class DefinedCommon;
class SymbolBody;
+struct SectionPiece;
template <class ELFT> class ICF;
template <class ELFT> class DefinedRegular;
@@ -63,6 +64,7 @@ public:
StringRef Name;
ArrayRef<uint8_t> Data;
+ ArrayRef<uint8_t> getData(const SectionPiece &P) const;
// If a section is compressed, this has the uncompressed section data.
std::unique_ptr<char[]> UncompressedData;
@@ -123,10 +125,8 @@ template <class ELFT> InputSectionBase<ELFT> InputSectionBase<ELFT>::Discarded;
// SectionPiece represents a piece of splittable section contents.
struct SectionPiece {
SectionPiece(size_t Off, ArrayRef<uint8_t> Data, bool Live = false)
- : InputOff(Off), Data((const uint8_t *)Data.data()), Size(Data.size()),
- Live(Live || !Config->GcSections) {}
+ : InputOff(Off), Size(Data.size()), Live(Live || !Config->GcSections) {}
- ArrayRef<uint8_t> data() { return {Data, Size}; }
size_t size() const { return Size; }
size_t InputOff;
@@ -136,7 +136,6 @@ private:
// We use bitfields because SplitInputSection is accessed by
// std::upper_bound very often.
// We want to save bits to make it cache friendly.
- const uint8_t *Data;
uint32_t Size : 31;
public:
@@ -182,7 +181,10 @@ private:
struct EhSectionPiece : public SectionPiece {
EhSectionPiece(size_t Off, ArrayRef<uint8_t> Data, unsigned FirstRelocation)
- : SectionPiece(Off, Data), FirstRelocation(FirstRelocation) {}
+ : SectionPiece(Off, Data), Data(Data.data()),
+ FirstRelocation(FirstRelocation) {}
+ const uint8_t *Data;
+ ArrayRef<uint8_t> data() { return {Data, size()}; }
unsigned FirstRelocation;
};
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index bce9d5983e2..683c15c6060 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -1191,7 +1191,7 @@ template <class ELFT> void EhOutputSection<ELFT>::writeTo(uint8_t *Buf) {
size_t CieOffset = Cie->Piece->OutputOff;
writeCieFde<ELFT>(Buf + CieOffset, Cie->Piece->data());
- for (SectionPiece *Fde : Cie->FdePieces) {
+ for (EhSectionPiece *Fde : Cie->FdePieces) {
size_t Off = Fde->OutputOff;
writeCieFde<ELFT>(Buf + Off, Fde->data());
@@ -1244,7 +1244,7 @@ void MergeOutputSection<ELFT>::addSection(InputSectionBase<ELFT> *C) {
for (SectionPiece &Piece : Sec->Pieces) {
if (!Piece.Live)
continue;
- uintX_t OutputOffset = Builder.add(toStringRef(Piece.data()));
+ uintX_t OutputOffset = Builder.add(toStringRef(Sec->getData(Piece)));
if (!shouldTailMerge())
Piece.OutputOff = OutputOffset;
}
OpenPOWER on IntegriCloud