mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +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:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user