diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-04-10 21:53:53 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-04-10 21:53:53 +0000 |
commit | fe255214516f62b9ec2d37dc44eab879f5576ea6 (patch) | |
tree | 96660d816ea028d50d34d20d024f9cf5a1353f3a /test | |
parent | 22f3236dd688ec4109ed02a93c3f0ada8887d682 (diff) | |
download | llvm-fe255214516f62b9ec2d37dc44eab879f5576ea6.tar.gz llvm-fe255214516f62b9ec2d37dc44eab879f5576ea6.tar.bz2 llvm-fe255214516f62b9ec2d37dc44eab879f5576ea6.tar.xz |
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
Diffstat (limited to 'test')
-rw-r--r-- | test/MC/ELF/compression.s | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/test/MC/ELF/compression.s b/test/MC/ELF/compression.s index 4e55905942..2ecb271e43 100644 --- a/test/MC/ELF/compression.s +++ b/test/MC/ELF/compression.s @@ -1,25 +1,35 @@ -// RUN: llvm-mc -filetype=obj -compress-debug-sections -triple x86_64-pc-linux-gnu %s -o - | llvm-objdump -s - | FileCheck %s - -// XFAIL: * +// RUN: llvm-mc -filetype=obj -compress-debug-sections -triple x86_64-pc-linux-gnu %s -o %t +// RUN: llvm-objdump -s %t | FileCheck %s +// RUN: llvm-dwarfdump -debug-dump=abbrev %t | FileCheck --check-prefix=ABBREV %s // REQUIRES: zlib -// CHECK: Contents of section .debug_line: -// FIXME: Figure out how to handle debug_line that currently uses multiple section fragments +// CHECK: Contents of section .zdebug_line: +// Check for the 'ZLIB' file magic at the start of the section only +// CHECK-NEXT: ZLIB // CHECK-NOT: ZLIB +// CHECK: Contents of // CHECK: Contents of section .zdebug_abbrev: -// Check for the 'ZLIB' file magic at the start of the section // CHECK-NEXT: ZLIB -// We shouldn't compress the debug_frame section, since it can be relaxed -// CHECK: Contents of section .debug_frame +// FIXME: Handle compressing alignment fragments to support compressing debug_frame +// CHECK: Contents of section .debug_frame: // CHECK-NOT: ZLIB +// CHECK: Contents of + +// Decompress one valid dwarf section just to check that this roundtrips +// ABBREV: Abbrev table for offset: 0x00000000 +// ABBREV: [1] DW_TAG_compile_unit DW_CHILDREN_no .section .debug_line,"",@progbits .section .debug_abbrev,"",@progbits .byte 1 # Abbreviation Code + .byte 17 # DW_TAG_compile_unit + .byte 0 # DW_CHILDREN_no + .byte 0 # EOM(1) + .byte 0 # EOM(2) .text foo: .cfi_startproc |