mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-04 18:24:38 +00:00
Use zlib to uncompress debug sections in DWARF parser.
This makes llvm-dwarfdump and llvm-symbolizer understand debug info sections compressed by ld.gold linker. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180088 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -10,6 +10,8 @@
|
||||
#include "DWARFContext.h"
|
||||
#include "llvm/ADT/SmallString.h"
|
||||
#include "llvm/ADT/StringSwitch.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Support/Compression.h"
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
#include "llvm/Support/Format.h"
|
||||
#include "llvm/Support/Path.h"
|
||||
@ -483,6 +485,22 @@ DIInliningInfo DWARFContext::getInliningInfoForAddress(uint64_t Address,
|
||||
return InliningInfo;
|
||||
}
|
||||
|
||||
static bool consumeCompressedDebugSectionHeader(StringRef &data,
|
||||
uint64_t &OriginalSize) {
|
||||
// Consume "ZLIB" prefix.
|
||||
if (!data.startswith("ZLIB"))
|
||||
return false;
|
||||
data = data.substr(4);
|
||||
// Consume uncompressed section size (big-endian 8 bytes).
|
||||
DataExtractor extractor(data, false, 8);
|
||||
uint32_t Offset = 0;
|
||||
OriginalSize = extractor.getU64(&Offset);
|
||||
if (Offset == 0)
|
||||
return false;
|
||||
data = data.substr(Offset);
|
||||
return true;
|
||||
}
|
||||
|
||||
DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile *Obj) :
|
||||
IsLittleEndian(Obj->isLittleEndian()),
|
||||
AddressSize(Obj->getBytesInAddress()) {
|
||||
@ -497,6 +515,22 @@ DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile *Obj) :
|
||||
|
||||
name = name.substr(name.find_first_not_of("._")); // Skip . and _ prefixes.
|
||||
|
||||
// Check if debug info section is compressed with zlib.
|
||||
if (name.startswith("zdebug_")) {
|
||||
uint64_t OriginalSize;
|
||||
if (!zlib::isAvailable() ||
|
||||
!consumeCompressedDebugSectionHeader(data, OriginalSize))
|
||||
continue;
|
||||
OwningPtr<MemoryBuffer> UncompressedSection;
|
||||
if (zlib::uncompress(data, UncompressedSection, OriginalSize) !=
|
||||
zlib::StatusOK)
|
||||
continue;
|
||||
// Make data point to uncompressed section contents and save its contents.
|
||||
name = name.substr(1);
|
||||
data = UncompressedSection->getBuffer();
|
||||
UncompressedSections.push_back(UncompressedSection.take());
|
||||
}
|
||||
|
||||
StringRef *Section = StringSwitch<StringRef*>(name)
|
||||
.Case("debug_info", &InfoSection)
|
||||
.Case("debug_abbrev", &AbbrevSection)
|
||||
@ -584,4 +618,8 @@ DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile *Obj) :
|
||||
}
|
||||
}
|
||||
|
||||
DWARFContextInMemory::~DWARFContextInMemory() {
|
||||
DeleteContainerPointers(UncompressedSections);
|
||||
}
|
||||
|
||||
void DWARFContextInMemory::anchor() { }
|
||||
|
Reference in New Issue
Block a user