Files
llvm-project/lld/test/ELF/linkerscript/memory-include.test
Fangrui Song 2855525c4a [ELF] Handle INCLUDE like a call stack (#193427)
The lexer maintains a stack of buffers, which allows a construct
started in an INCLUDE'd file to be closed by the parent. This produces
spurious acceptance of malformed scripts (e.g. a bare assignment with
no trailing `;` in the include, terminated by the parent's `;` after
`INCLUDE`) and undefined-behavior span computations in
`readAssignment`'s `commandString` (issue #190376).

Force each INCLUDE to fully parse its own content, similar to a call
stack frame. `ScriptLexer::lex` no longer auto-pops on EOF; the
`buffers` member is gone. `readInclude` takes a `function_ref<void()>`
callback, and the four call sites (top-level, SECTIONS, output
section, MEMORY) pass a context-appropriate parser.

With this, each buffer contains complete parser structures by
construction, so the `[oldS, curTok)` pointer range in
`readAssignment` no longer needs a guard.
2026-04-22 19:59:00 -07:00

74 lines
1.9 KiB
Plaintext

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