# 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);
}