# REQUIRES: x86, zlib # RUN: rm -rf %t && split-file %s %t && cd %t # RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o # RUN: ld.lld -T a.lds a.o --compress-sections nonalloc=zlib --compress-sections str=zlib -o out # RUN: llvm-readelf -SsXz -p str out | FileCheck %s # CHECK: Name Type Address Off Size ES Flg Lk Inf Al # CHECK: nonalloc PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 00 C 0 0 1 # CHECK-NEXT: str PROGBITS 0000000000000000 [[#%x,]] [[#%x,]] 01 MSC 0 0 1 # CHECK: 0000000000000000 0 NOTYPE GLOBAL DEFAULT [[#]] (nonalloc) nonalloc_start # CHECK: 0000000000000063 0 NOTYPE GLOBAL DEFAULT [[#]] (nonalloc) nonalloc_end # CHECK: String dump of section 'str': # CHECK-NEXT: [ 0] AAA # CHECK-NEXT: [ 4] {{a+}} # CHECK-NEXT: [ 45] BBB ## TODO The uncompressed size of 'nonalloc' is dependent on linker script ## commands, which is not handled. We should report an error. # RUN: ld.lld -T b.lds a.o --compress-sections nonalloc=zlib #--- a.s .globl _start _start: ret .section nonalloc0,"" .balign 8 .quad .text .quad .text .space 64 .section nonalloc1,"" .balign 8 .quad 42 .section str,"MS",@progbits,1 .asciz "AAA" .asciz "BBB" .fill 64,1,0x61 .byte 0 #--- a.lds SECTIONS { .text : { *(.text) } c = SIZEOF(.text); b = c+1; a = b+1; nonalloc : { nonalloc_start = .; ## In general, using data commands is error-prone. This case is correct, though. *(nonalloc*) QUAD(SIZEOF(.text)) . += a; nonalloc_end = .; } str : { *(str) } } #--- b.lds SECTIONS { nonalloc : { *(nonalloc*) . += a; } .text : { *(.text) } a = b+1; b = c+1; c = SIZEOF(.text); }