Reimplement debug info compression by compressing the whole section, rather…

Press ? to show keyboard shortcuts.
Auditors
grosbach
H23 MC code reviews Triggered Audit
Committed
dblaikieApr 10 2014, 2:53 PM
Parents
rL205989: Revert debug info compression support.
Branches
Unknown
Tags
Unknown
Description

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.

rL205990

llvm/trunk/include/llvm/MC/MCContext.h

Loading...

llvm/trunk/include/llvm/MC/MCSectionELF.h

Loading...

llvm/trunk/lib/MC/ELFObjectWriter.cpp

Loading...

llvm/trunk/lib/MC/MCContext.cpp

Loading...

llvm/trunk/test/MC/ELF/compression.s

Loading...

Add Comment