diff options
-rw-r--r-- | lld/ELF/InputSection.cpp | 15 | ||||
-rw-r--r-- | lld/ELF/InputSection.h | 11 |
2 files changed, 16 insertions, 10 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp index f1902800c33..7fcb279b8d3 100644 --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -144,13 +144,18 @@ size_t InputSectionBase::getSize() const { void InputSectionBase::uncompress() const { size_t Size = UncompressedSize; - UncompressedBuf.reset(new char[Size]); + char *UncompressedBuf; + { + static std::mutex Mu; + std::lock_guard<std::mutex> Lock(Mu); + UncompressedBuf = BAlloc.Allocate<char>(Size); + } - if (Error E = - zlib::uncompress(toStringRef(RawData), UncompressedBuf.get(), Size)) + if (Error E = zlib::uncompress(toStringRef(RawData), UncompressedBuf, Size)) fatal(toString(this) + ": uncompress failed: " + llvm::toString(std::move(E))); - RawData = makeArrayRef((uint8_t *)UncompressedBuf.get(), Size); + RawData = makeArrayRef((uint8_t *)UncompressedBuf, Size); + UncompressedSize = -1; } uint64_t InputSectionBase::getOffsetInFile() const { @@ -1062,7 +1067,7 @@ template <class ELFT> void InputSection::writeTo(uint8_t *Buf) { // If this is a compressed section, uncompress section contents directly // to the buffer. - if (UncompressedSize >= 0 && !UncompressedBuf) { + if (UncompressedSize >= 0) { size_t Size = UncompressedSize; if (Error E = zlib::uncompress(toStringRef(RawData), (char *)(Buf + OutSecOff), Size)) diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h index 2a410e0acce..b559ff1b202 100644 --- a/lld/ELF/InputSection.h +++ b/lld/ELF/InputSection.h @@ -133,7 +133,7 @@ public: } ArrayRef<uint8_t> data() const { - if (UncompressedSize >= 0 && !UncompressedBuf) + if (UncompressedSize >= 0) uncompress(); return RawData; } @@ -210,10 +210,11 @@ protected: mutable ArrayRef<uint8_t> RawData; - // A pointer that owns uncompressed data if a section is compressed by zlib. - // Since the feature is not used often, this is usually a nullptr. - mutable std::unique_ptr<char[]> UncompressedBuf; - int64_t UncompressedSize = -1; + // This field stores the uncompressed size of the compressed data in RawData, + // or -1 if RawData is not compressed (either because the section wasn't + // compressed in the first place, or because we ended up uncompressing it). + // Since the feature is not used often, this is usually -1. + mutable int64_t UncompressedSize = -1; }; // SectionPiece represents a piece of splittable section contents. |