mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-02 18:31:54 +00:00
Revert r270540 "[llvm-dwarfdump] - Teach dwarfdump to decompress debug sections in zlib style."
it broked bot: http://lab.llvm.org:8011/builders/clang-s390x-linux/builds/5036 llvm-svn: 270541
This commit is contained in:
parent
4be95a7436
commit
eaa1b15204
@ -694,7 +694,6 @@ protected:
|
||||
std::error_code getSectionContents(DataRefImpl Sec,
|
||||
StringRef &Res) const override;
|
||||
uint64_t getSectionAlignment(DataRefImpl Sec) const override;
|
||||
bool isSectionCompressed(DataRefImpl Sec) const override;
|
||||
bool isSectionText(DataRefImpl Sec) const override;
|
||||
bool isSectionData(DataRefImpl Sec) const override;
|
||||
bool isSectionBSS(DataRefImpl Sec) const override;
|
||||
|
@ -222,7 +222,6 @@ protected:
|
||||
std::error_code getSectionContents(DataRefImpl Sec,
|
||||
StringRef &Res) const override;
|
||||
uint64_t getSectionAlignment(DataRefImpl Sec) const override;
|
||||
bool isSectionCompressed(DataRefImpl Sec) const override;
|
||||
bool isSectionText(DataRefImpl Sec) const override;
|
||||
bool isSectionData(DataRefImpl Sec) const override;
|
||||
bool isSectionBSS(DataRefImpl Sec) const override;
|
||||
@ -584,11 +583,6 @@ uint64_t ELFObjectFile<ELFT>::getSectionAlignment(DataRefImpl Sec) const {
|
||||
return getSection(Sec)->sh_addralign;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
bool ELFObjectFile<ELFT>::isSectionCompressed(DataRefImpl Sec) const {
|
||||
return getSection(Sec)->sh_flags & ELF::SHF_COMPRESSED;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
bool ELFObjectFile<ELFT>::isSectionText(DataRefImpl Sec) const {
|
||||
return getSection(Sec)->sh_flags & ELF::SHF_EXECINSTR;
|
||||
|
@ -222,7 +222,6 @@ public:
|
||||
std::error_code getSectionContents(DataRefImpl Sec,
|
||||
StringRef &Res) const override;
|
||||
uint64_t getSectionAlignment(DataRefImpl Sec) const override;
|
||||
bool isSectionCompressed(DataRefImpl Sec) const override;
|
||||
bool isSectionText(DataRefImpl Sec) const override;
|
||||
bool isSectionData(DataRefImpl Sec) const override;
|
||||
bool isSectionBSS(DataRefImpl Sec) const override;
|
||||
|
@ -89,7 +89,6 @@ public:
|
||||
/// @brief Get the alignment of this section as the actual value (not log 2).
|
||||
uint64_t getAlignment() const;
|
||||
|
||||
bool isCompressed() const;
|
||||
bool isText() const;
|
||||
bool isData() const;
|
||||
bool isBSS() const;
|
||||
@ -215,7 +214,6 @@ protected:
|
||||
virtual std::error_code getSectionContents(DataRefImpl Sec,
|
||||
StringRef &Res) const = 0;
|
||||
virtual uint64_t getSectionAlignment(DataRefImpl Sec) const = 0;
|
||||
virtual bool isSectionCompressed(DataRefImpl Sec) const = 0;
|
||||
virtual bool isSectionText(DataRefImpl Sec) const = 0;
|
||||
virtual bool isSectionData(DataRefImpl Sec) const = 0;
|
||||
virtual bool isSectionBSS(DataRefImpl Sec) const = 0;
|
||||
@ -382,10 +380,6 @@ inline uint64_t SectionRef::getAlignment() const {
|
||||
return OwningObject->getSectionAlignment(SectionPimpl);
|
||||
}
|
||||
|
||||
inline bool SectionRef::isCompressed() const {
|
||||
return OwningObject->isSectionCompressed(SectionPimpl);
|
||||
}
|
||||
|
||||
inline bool SectionRef::isText() const {
|
||||
return OwningObject->isSectionText(SectionPimpl);
|
||||
}
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
|
||||
#include "llvm/Support/Compression.h"
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
#include "llvm/Support/ELF.h"
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
@ -591,8 +590,8 @@ DWARFContext::getInliningInfoForAddress(uint64_t Address,
|
||||
return InliningInfo;
|
||||
}
|
||||
|
||||
static bool consumeCompressedGnuHeader(StringRef &data,
|
||||
uint64_t &OriginalSize) {
|
||||
static bool consumeCompressedDebugSectionHeader(StringRef &data,
|
||||
uint64_t &OriginalSize) {
|
||||
// Consume "ZLIB" prefix.
|
||||
if (!data.startswith("ZLIB"))
|
||||
return false;
|
||||
@ -607,50 +606,6 @@ static bool consumeCompressedGnuHeader(StringRef &data,
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool consumeCompressedZLibHeader(StringRef &Data, uint64_t &OriginalSize,
|
||||
bool IsLE, bool Is64Bit) {
|
||||
using namespace ELF;
|
||||
uint64_t HdrSize = Is64Bit ? sizeof(Elf64_Chdr) : sizeof(Elf32_Chdr);
|
||||
if (Data.size() < HdrSize)
|
||||
return false;
|
||||
|
||||
DataExtractor Extractor(Data, IsLE, 0);
|
||||
uint32_t Offset = 0;
|
||||
if (Extractor.getUnsigned(&Offset, Is64Bit ? sizeof(Elf64_Word)
|
||||
: sizeof(Elf32_Word)) !=
|
||||
ELFCOMPRESS_ZLIB)
|
||||
return false;
|
||||
|
||||
// Skip Elf64_Chdr::ch_reserved field.
|
||||
if (Is64Bit)
|
||||
Offset += sizeof(Elf64_Word);
|
||||
|
||||
OriginalSize = Extractor.getUnsigned(&Offset, Is64Bit ? sizeof(Elf64_Xword)
|
||||
: sizeof(Elf32_Word));
|
||||
Data = Data.substr(HdrSize);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool tryDecompress(StringRef &Name, StringRef &Data,
|
||||
SmallString<32> &Out, bool ZLibStyle, bool IsLE,
|
||||
bool Is64Bit) {
|
||||
if (!zlib::isAvailable())
|
||||
return false;
|
||||
|
||||
uint64_t OriginalSize;
|
||||
bool Result =
|
||||
ZLibStyle ? consumeCompressedZLibHeader(Data, OriginalSize, IsLE, Is64Bit)
|
||||
: consumeCompressedGnuHeader(Data, OriginalSize);
|
||||
|
||||
if (!Result || zlib::uncompress(Data, Out, OriginalSize) != zlib::StatusOK)
|
||||
return false;
|
||||
|
||||
// gnu-style names are started from "z", consume that.
|
||||
if (!ZLibStyle)
|
||||
Name = Name.substr(1);
|
||||
return true;
|
||||
}
|
||||
|
||||
DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
|
||||
const LoadedObjectInfo *L)
|
||||
: IsLittleEndian(Obj.isLittleEndian()),
|
||||
@ -676,13 +631,20 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
|
||||
|
||||
name = name.substr(name.find_first_not_of("._")); // Skip . and _ prefixes.
|
||||
|
||||
bool ZLibStyleCompressed = Section.isCompressed();
|
||||
if (ZLibStyleCompressed || name.startswith("zdebug_")) {
|
||||
SmallString<32> Out;
|
||||
if (!tryDecompress(name, data, Out, ZLibStyleCompressed, IsLittleEndian,
|
||||
AddressSize == 8))
|
||||
// Check if debug info section is compressed with zlib.
|
||||
if (name.startswith("zdebug_")) {
|
||||
uint64_t OriginalSize;
|
||||
if (!zlib::isAvailable() ||
|
||||
!consumeCompressedDebugSectionHeader(data, OriginalSize))
|
||||
continue;
|
||||
UncompressedSections.emplace_back(std::move(Out));
|
||||
UncompressedSections.resize(UncompressedSections.size() + 1);
|
||||
if (zlib::uncompress(data, UncompressedSections.back(), OriginalSize) !=
|
||||
zlib::StatusOK) {
|
||||
UncompressedSections.pop_back();
|
||||
continue;
|
||||
}
|
||||
// Make data point to uncompressed section contents and save its contents.
|
||||
name = name.substr(1);
|
||||
data = UncompressedSections.back();
|
||||
}
|
||||
|
||||
|
@ -292,10 +292,6 @@ uint64_t COFFObjectFile::getSectionAlignment(DataRefImpl Ref) const {
|
||||
return Sec->getAlignment();
|
||||
}
|
||||
|
||||
bool COFFObjectFile::isSectionCompressed(DataRefImpl Sec) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool COFFObjectFile::isSectionText(DataRefImpl Ref) const {
|
||||
const coff_section *Sec = toSec(Ref);
|
||||
return Sec->Characteristics & COFF::IMAGE_SCN_CNT_CODE;
|
||||
|
@ -653,10 +653,6 @@ uint64_t MachOObjectFile::getSectionAlignment(DataRefImpl Sec) const {
|
||||
return uint64_t(1) << Align;
|
||||
}
|
||||
|
||||
bool MachOObjectFile::isSectionCompressed(DataRefImpl Sec) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MachOObjectFile::isSectionText(DataRefImpl Sec) const {
|
||||
uint32_t Flags = getSectionFlags(this, Sec);
|
||||
return Flags & MachO::S_ATTR_PURE_INSTRUCTIONS;
|
||||
|
@ -16,11 +16,9 @@ int main() {
|
||||
return f(2, 3);
|
||||
}
|
||||
|
||||
// Built with Clang 3.9 and GNU gold (GNU Binutils for Ubuntu 2.26) 1.11:
|
||||
// Built with Clang 3.2 and ld.gold linker:
|
||||
// $ mkdir -p /tmp/dbginfo
|
||||
// $ cp dwarfdump-test-zlib.cc /tmp/dbginfo
|
||||
// $ cd /tmp/dbginfo
|
||||
// $ clang++ -g dwarfdump-test-zlib.cc -Wl,--compress-debug-sections=zlib -o dwarfdump-test-zlib.elf-x86-64
|
||||
// $ clang++ -g dwarfdump-test-zlib.cc -Wl,--compress-debug-sections=zlib-gnu -o dwarfdump-test-zlibgnu.elf-x86-64
|
||||
// llvm-readobj -sections can be used to see that outputs really contain the compressed sections, also output in both
|
||||
// cases is slightly smaller, that is because of compression.
|
||||
// $ clang++ -g dwarfdump-test-zlib.cc -Wl,--compress-debug-sections=zlib \
|
||||
// -o <output>
|
||||
|
Binary file not shown.
@ -1,12 +1,6 @@
|
||||
REQUIRES: zlib
|
||||
|
||||
RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test-zlib.elf-x86-64 | FileCheck %s
|
||||
RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test-zlibgnu.elf-x86-64 | FileCheck %s
|
||||
|
||||
CHECK: .debug_abbrev contents
|
||||
|
||||
// Dump content of a little section to check that both zlib and zlib gnu styles do
|
||||
// the decompression correctly and result is the same. This and above also checks
|
||||
// that sections names are properly shown in zlib-gnu style (without additional 'z' prefix).
|
||||
CHECK: .debug_info contents
|
||||
CHECK: 0x00000000: Compile Unit: length = 0x00000144 version = 0x0004 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x00000148)
|
||||
|
Loading…
x
Reference in New Issue
Block a user