summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2016-10-05 18:40:00 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2016-10-05 18:40:00 +0000
commit32aca87bf8a1fc191abf685ec3e4ff4eb55895c9 (patch)
tree67f2321505a1c3fdf30adba7cf4b794005462678
parente81d2fa9bb6d2dd56aea00a01d0b521a43ddbb54 (diff)
downloadbcm5719-llvm-32aca87bf8a1fc191abf685ec3e4ff4eb55895c9.tar.gz
bcm5719-llvm-32aca87bf8a1fc191abf685ec3e4ff4eb55895c9.zip
Compact SectionPiece.
It is pretty easy to get the data from the InputSection, so we don't have to store it. This opens the way for storing the hash instead. llvm-svn: 283357
-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