mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 21:24:00 +00:00
Reimplement debug info compression by compressing the whole section, rather than a fragment.
To support compressing the debug_line section that contains multiple fragments (due, I believe, to variation in choices of line table encoding depending on the size of instruction ranges in the actual program code) we needed to support compressing multiple MCFragments in a single pass. This patch implements that behavior by mutating the post-relaxed and relocated section to be the compressed form of its former self, including renaming the section. This is a more flexible (and less invasive, to a degree) implementation that will allow for other features such as "use compression only if it's smaller than the uncompressed data". Compressing debug_frame would be a possible further extension to this work, but I've left it for now. The hurdle there is alignment sections - which might require going as far as to refactor MCAssembler.cpp:writeFragment to handle writing to a byte buffer or an MCObjectWriter (there's already a virtual call there, so it shouldn't add substantial compile-time cost) which could in turn involve refactoring MCAsmBackend::writeNopData to use that same abstraction... which involves touching all the backends. This would remove the limited handling of fragment writing seen in ELFObjectWriter.cpp:getUncompressedData which would be nice - but it's more invasive. I did discover that I (perhaps obviously) don't need to handle relocations when I rewrite the fragments - since the relocations have already been applied and computed (and stored into ELFObjectWriter::Relocations) by this stage (necessarily, because we need to have written any immediate values or assembly-time relocations into the data already before we compress it, which we have). The test case doesn't necessarily cover that in detail - I can add more test coverage if that's preferred. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205990 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -251,6 +251,21 @@ getELFSection(StringRef Section, unsigned Type, unsigned Flags,
|
||||
return getELFSection(Section, Type, Flags, Kind, 0, "");
|
||||
}
|
||||
|
||||
void MCContext::renameELFSection(const MCSectionELF *Section, StringRef Name) {
|
||||
if (ELFUniquingMap == 0)
|
||||
ELFUniquingMap = new ELFUniqueMapTy();
|
||||
ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)ELFUniquingMap;
|
||||
|
||||
StringRef GroupName;
|
||||
if (const MCSymbol *Group = Section->getGroup())
|
||||
GroupName = Group->getName();
|
||||
|
||||
Map.erase(SectionGroupPair(Section->getSectionName(), GroupName));
|
||||
auto I = Map.insert(std::make_pair(SectionGroupPair(Name, GroupName),
|
||||
Section)).first;
|
||||
const_cast<MCSectionELF*>(Section)->setSectionName(I->first.first);
|
||||
}
|
||||
|
||||
const MCSectionELF *MCContext::
|
||||
getELFSection(StringRef Section, unsigned Type, unsigned Flags,
|
||||
SectionKind Kind, unsigned EntrySize, StringRef Group) {
|
||||
|
Reference in New Issue
Block a user