# REQUIRES: x86 ## Test INCLUDE inside MEMORY { ... }. # 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 -o out # RUN: llvm-objdump --section-headers out | FileCheck %s # CHECK: .data 00000008 0000000000002000 DATA # CHECK: .data2 00000008 0000000000003000 DATA ## An empty INCLUDE between two region declarations is accepted. # RUN: ld.lld -T empty.lds a.o -o empty # RUN: llvm-readelf -Sl empty | FileCheck %s --check-prefix=EMPTY # EMPTY: .text PROGBITS 0000000000001000 {{.*}} AX # EMPTY-NEXT: .data PROGBITS 0000000000002000 {{.*}} WA # EMPTY: LOAD {{.*}} 0x0000000000001000 0x0000000000001000 {{.*}} R E # EMPTY-NEXT: LOAD {{.*}} 0x0000000000002000 0x0000000000002000 {{.*}} RW ## A region declaration truncated mid-expression cannot be completed by the ## parent MEMORY { ... }. # RUN: cp trunc.lds inc.lds # RUN: not ld.lld -T a.lds a.o 2>&1 | FileCheck %s --check-prefix=TRUNC # TRUNC: error: inc.lds:1: unexpected EOF ## A stray '}' in the include cannot close the parent MEMORY { ... }. # RUN: cp brace.lds inc.lds # RUN: not ld.lld -T a.lds a.o 2>&1 | FileCheck %s --check-prefix=BRACE # BRACE: error: inc.lds:1: unexpected EOF #--- a.s .section .text,"ax" .global _start _start: nop .section .data,"aw" .quad 0 #--- a.lds MEMORY { ROM (rwx): ORIGIN = 0x1000, LENGTH = 0x100 RAM (rwx): ORIGIN = 0x2000, LENGTH = 0x100 INCLUDE "inc.lds" } SECTIONS { .text : { *(.text*) } > ROM .data : { *(.data*) } > RAM .data2 : { QUAD(0) } > RAM2 } #--- inc.lds RAM2 (rwx): ORIGIN = 0x3000, LENGTH = 0x100 #--- empty.lds MEMORY { ROM (rx): ORIGIN = 0x1000, LENGTH = 0x100 INCLUDE "inc-empty.lds" RAM (rw): ORIGIN = 0x2000, LENGTH = 0x100 } SECTIONS { .text : { *(.text*) } > ROM .data : { *(.data*) } > RAM } #--- inc-empty.lds #--- trunc.lds RAM3 : ORIGIN = 0x4000, LENGTH #--- brace.lds }