git: ed698ef1e152 - stable/13 - Apply upstream lld fix for compressed input sections on BE targets
Dimitry Andric
dim at FreeBSD.org
Sat Aug 14 12:57:27 UTC 2021
The branch stable/13 has been updated by dim:
URL: https://cgit.FreeBSD.org/src/commit/?id=ed698ef1e1523b3bd25405f5dc82bbeb44f79805
commit ed698ef1e1523b3bd25405f5dc82bbeb44f79805
Author: Dimitry Andric <dim at FreeBSD.org>
AuthorDate: 2021-08-07 11:14:11 +0000
Commit: Dimitry Andric <dim at FreeBSD.org>
CommitDate: 2021-08-14 12:52:55 +0000
Apply upstream lld fix for compressed input sections on BE targets
Merge commit c6ebc651b6fa from llvm git (by Simon Atanasyan):
[LLD] Support compressed input sections on big-endian targets
This patch enables compressed input sections on big-endian targets by
checking the target endianness and selecting an appropriate `Chdr`
structure.
Fixes PR51369
Differential Revision: https://reviews.llvm.org/D107635
Reported by: emaste
(cherry picked from commit d69d07569ee2404705ff4c4abb45dc0b884eeb35)
Follow-up to d69d07569ee2 by bumping lld local version
This makes it easier to detect that lld's support for compressed input
sections on BE targets is fixed.
(cherry picked from commit cd38d9cf26db9264f709c52469f0f4e9684d62bb)
---
contrib/llvm-project/lld/ELF/InputSection.cpp | 47 ++++++++++++---------------
contrib/llvm-project/lld/ELF/InputSection.h | 1 +
lib/clang/include/VCSVersion.inc | 2 +-
3 files changed, 22 insertions(+), 28 deletions(-)
diff --git a/contrib/llvm-project/lld/ELF/InputSection.cpp b/contrib/llvm-project/lld/ELF/InputSection.cpp
index 6f16fc7abc48..f9cad7f975a7 100644
--- a/contrib/llvm-project/lld/ELF/InputSection.cpp
+++ b/contrib/llvm-project/lld/ELF/InputSection.cpp
@@ -88,7 +88,22 @@ InputSectionBase::InputSectionBase(InputFile *file, uint64_t flags,
if (!zlib::isAvailable())
error(toString(file) + ": contains a compressed section, " +
"but zlib is not available");
- parseCompressedHeader();
+ switch (config->ekind) {
+ case ELF32LEKind:
+ parseCompressedHeader<ELF32LE>();
+ break;
+ case ELF32BEKind:
+ parseCompressedHeader<ELF32BE>();
+ break;
+ case ELF64LEKind:
+ parseCompressedHeader<ELF64LE>();
+ break;
+ case ELF64BEKind:
+ parseCompressedHeader<ELF64BE>();
+ break;
+ default:
+ llvm_unreachable("unknown ELFT");
+ }
}
}
@@ -210,10 +225,7 @@ OutputSection *SectionBase::getOutputSection() {
// When a section is compressed, `rawData` consists with a header followed
// by zlib-compressed data. This function parses a header to initialize
// `uncompressedSize` member and remove the header from `rawData`.
-void InputSectionBase::parseCompressedHeader() {
- using Chdr64 = typename ELF64LE::Chdr;
- using Chdr32 = typename ELF32LE::Chdr;
-
+template <typename ELFT> void InputSectionBase::parseCompressedHeader() {
// Old-style header
if (name.startswith(".zdebug")) {
if (!toStringRef(rawData).startswith("ZLIB")) {
@@ -239,32 +251,13 @@ void InputSectionBase::parseCompressedHeader() {
assert(flags & SHF_COMPRESSED);
flags &= ~(uint64_t)SHF_COMPRESSED;
- // New-style 64-bit header
- if (config->is64) {
- if (rawData.size() < sizeof(Chdr64)) {
- error(toString(this) + ": corrupted compressed section");
- return;
- }
-
- auto *hdr = reinterpret_cast<const Chdr64 *>(rawData.data());
- if (hdr->ch_type != ELFCOMPRESS_ZLIB) {
- error(toString(this) + ": unsupported compression type");
- return;
- }
-
- uncompressedSize = hdr->ch_size;
- alignment = std::max<uint32_t>(hdr->ch_addralign, 1);
- rawData = rawData.slice(sizeof(*hdr));
- return;
- }
-
- // New-style 32-bit header
- if (rawData.size() < sizeof(Chdr32)) {
+ // New-style header
+ if (rawData.size() < sizeof(typename ELFT::Chdr)) {
error(toString(this) + ": corrupted compressed section");
return;
}
- auto *hdr = reinterpret_cast<const Chdr32 *>(rawData.data());
+ auto *hdr = reinterpret_cast<const typename ELFT::Chdr *>(rawData.data());
if (hdr->ch_type != ELFCOMPRESS_ZLIB) {
error(toString(this) + ": unsupported compression type");
return;
diff --git a/contrib/llvm-project/lld/ELF/InputSection.h b/contrib/llvm-project/lld/ELF/InputSection.h
index 5b91c1c90bd2..c914d0b42155 100644
--- a/contrib/llvm-project/lld/ELF/InputSection.h
+++ b/contrib/llvm-project/lld/ELF/InputSection.h
@@ -238,6 +238,7 @@ public:
}
protected:
+ template <typename ELFT>
void parseCompressedHeader();
void uncompress() const;
diff --git a/lib/clang/include/VCSVersion.inc b/lib/clang/include/VCSVersion.inc
index cb7736e7d7de..8c1798de59ee 100644
--- a/lib/clang/include/VCSVersion.inc
+++ b/lib/clang/include/VCSVersion.inc
@@ -7,7 +7,7 @@
#define CLANG_REPOSITORY "git at github.com:llvm/llvm-project.git"
// <Upstream revision at import>-<Local identifier in __FreeBSD_version style>
-#define LLD_REVISION "llvmorg-12.0.1-0-gfed41342a82f-1400001"
+#define LLD_REVISION "llvmorg-12.0.1-0-gfed41342a82f-1400002"
#define LLD_REPOSITORY "FreeBSD"
#define LLDB_REVISION "llvmorg-12.0.1-0-gfed41342a82f"
More information about the dev-commits-src-all
mailing list