diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index cc051dba0e0aa..8d328626b85f9 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -272,7 +272,12 @@ template void OutputSection::maybeCompress() { // Write section contents to a temporary buffer and compress it. std::vector buf(size); writeTo(buf.data()); - if (Error e = zlib::compress(toStringRef(buf), compressedData)) + // We chose 1 as the default compression level because it is the fastest. If + // -O2 is given, we use level 6 to compress debug info more by ~15%. We found + // that level 7 to 9 doesn't make much difference (~1% more compression) while + // they take significant amount of time (~2x), so level 6 seems enough. + if (Error e = zlib::compress(toStringRef(buf), compressedData, + config->optimize >= 2 ? 6 : 1)) fatal("compress failed: " + llvm::toString(std::move(e))); // Update section headers. diff --git a/lld/test/ELF/compressed-debug-level.test b/lld/test/ELF/compressed-debug-level.test new file mode 100644 index 0000000000000..38d7d9016d127 --- /dev/null +++ b/lld/test/ELF/compressed-debug-level.test @@ -0,0 +1,38 @@ +# REQUIRES: x86, zlib + +# RUN: yaml2obj %s -o %t.o + +# RUN: ld.lld %t.o -o %t.default --compress-debug-sections=zlib +# RUN: llvm-readelf --sections %t.default | FileCheck -check-prefixes=HEADER,LEVEL1 %s + +# RUN: ld.lld -O0 %t.o -o %t.O0 --compress-debug-sections=zlib +# RUN: llvm-readelf --sections %t.O0 | FileCheck -check-prefixes=HEADER,LEVEL1 %s +# RUN: cmp %t.default %t.O0 + +# RUN: ld.lld -O1 %t.o -o %t.O1 --compress-debug-sections=zlib +# RUN: llvm-readelf --sections %t.O1 | FileCheck -check-prefixes=HEADER,LEVEL1 %s +# RUN: cmp %t.default %t.O1 + +# RUN: ld.lld -O2 %t.o -o %t.O2 --compress-debug-sections=zlib +# RUN: llvm-readelf --sections %t.O2 | FileCheck -check-prefixes=HEADER,LEVEL6 %s + +## LLD uses zlib compression of level 1 when -O0, -O1 and level 6 when -O2. +## Here we check how -O flag affects the size of compressed sections produced. + +# HEADER: [Nr] Name Type Address Off Size +# LEVEL1: [ 1] .debug_info PROGBITS 00000000 000094 00001c +# LEVEL6: [ 1] .debug_info PROGBITS 00000000 000094 00001b + +## A little arbitrary debug section which has a different size after +## applying compression of level 1 and 6. + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_386 +Sections: + - Name: .debug_info + Type: SHT_PROGBITS + Content: '01010201020201020102'