Files
Meador Inge 96ebc3749e [LinkerScript] Implement MEMORY command
As specified here:

* https://sourceware.org/binutils/docs/ld/MEMORY.html#MEMORY

There are two deviations from what is specified for GNU ld:

  1. Only integer constants and *not* constant expressions
     are allowed in `LENGTH` and `ORIGIN` initializations.

  2. The `I` and `L` attributes are *not* implemented.

With (1) there is currently no easy way to evaluate integer
only constant expressions.  This can be enhanced in the
future.

With (2) it isn't clear how these flags map to the `SHF_*`
flags or if they even make sense for an ELF linker.

Differential Revision: https://reviews.llvm.org/D28911

git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@292875 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-24 02:34:00 +00:00

141 lines
4.0 KiB
ArmAsm

# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
## Check simple RAM-only memory region.
# RUN: echo "MEMORY { \
# RUN: ram (rwx) : ORIGIN = 0x8000, LENGTH = 256K \
# RUN: } \
# RUN: SECTIONS { \
# RUN: .text : { \
# RUN: *(.text) \
# RUN: } > ram \
# RUN: .data : { \
# RUN: *(.data) \
# RUN: } > ram \
# RUN: }" > %t.script
# RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix=RAM %s
# RAM: 1 .text 00000001 0000000000008000 TEXT DATA
# RAM-NEXT: 2 .data 00001000 0000000000008001 DATA
## Check RAM and ROM memory regions.
# RUN: echo "MEMORY { \
# RUN: ram (rwx) : ORIGIN = 0x0, LENGTH = 1024M \
# RUN: rom (rx) : org = 0x80000000, len = 64M \
# RUN: } \
# RUN: SECTIONS { \
# RUN: .text : { \
# RUN: *(.text) \
# RUN: } > rom \
# RUN: .data : { \
# RUN: *(.data) \
# RUN: } > ram \
# RUN: }" > %t.script
# RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix=RAMROM %s
# RAMROM: 1 .text 00000001 0000000080000000 TEXT DATA
# RAMROM-NEXT: 2 .data 00001000 0000000000000000 DATA
## Check memory region placement by attributes.
# RUN: echo "MEMORY { \
# RUN: ram (!rx) : ORIGIN = 0x0, LENGTH = 1024M \
# RUN: rom (rx) : o = 0x80000000, l = 64M \
# RUN: } \
# RUN: SECTIONS { \
# RUN: .text : { \
# RUN: *(.text) \
# RUN: } \
# RUN: .data : { \
# RUN: *(.data) \
# RUN: } > ram \
# RUN: }" > %t.script
# RUN: ld.lld -o %t1 --script %t.script %t
# RUN: llvm-objdump -section-headers %t1 | FileCheck -check-prefix=ATTRS %s
# ATTRS: 1 .text 00000001 0000000080000000 TEXT DATA
# ATTRS: 2 .data 00001000 0000000000000000 DATA
## Check bad `ORIGIN`.
# RUN: echo "MEMORY { ram (rwx) : ORIGI = 0x8000, LENGTH = 256K } }" > %t.script
# RUN: not ld.lld -o %t2 --script %t.script %t 2>&1 \
# RUN: | FileCheck -check-prefix=ERR1 %s
# ERR1: {{.*}}.script:1: expected one of: ORIGIN, org, or o
## Check bad `LENGTH`.
# RUN: echo "MEMORY { ram (rwx) : ORIGIN = 0x8000, LENTH = 256K } }" > %t.script
# RUN: not ld.lld -o %t2 --script %t.script %t 2>&1 \
# RUN: | FileCheck -check-prefix=ERR2 %s
# ERR2: {{.*}}.script:1: expected one of: LENGTH, len, or l
## Check duplicate regions.
# RUN: echo "MEMORY { ram (rwx) : o = 0x8, l = 256K ram (rx) : o = 0x0, l = 256K }" > %t.script
# RUN: not ld.lld -o %t2 --script %t.script %t 2>&1 \
# RUN: | FileCheck -check-prefix=ERR3 %s
# ERR3: {{.*}}.script:1: region 'ram' already defined
## Check no region available.
# RUN: echo "MEMORY { \
# RUN: ram (!rx) : ORIGIN = 0x8000, LENGTH = 256K \
# RUN: } \
# RUN: SECTIONS { \
# RUN: .text : { \
# RUN: *(.text) \
# RUN: } \
# RUN: .data : { \
# RUN: *(.data) \
# RUN: } > ram \
# RUN: }" > %t.script
# RUN: not ld.lld -o %t2 --script %t.script %t 2>&1 \
# RUN: | FileCheck -check-prefix=ERR4 %s
# ERR4: {{.*}}: no memory region specified for section '.text'
## Check undeclared region.
# RUN: echo "SECTIONS { .text : { *(.text) } > ram }" > %t.script
# RUN: not ld.lld -o %t2 --script %t.script %t 2>&1 \
# RUN: | FileCheck -check-prefix=ERR5 %s
# ERR5: {{.*}}: memory region 'ram' not declared
## Check region overflow.
# RUN: echo "MEMORY { \
# RUN: ram (rwx) : ORIGIN = 0x0, LENGTH = 2K \
# RUN: } \
# RUN: SECTIONS { \
# RUN: .text : { \
# RUN: *(.text) \
# RUN: } > ram \
# RUN: .data : { \
# RUN: *(.data) \
# RUN: } > ram \
# RUN: }" > %t.script
# RUN: not ld.lld -o %t2 --script %t.script %t 2>&1 \
# RUN: | FileCheck -check-prefix=ERR6 %s
# ERR6: {{.*}}: section '.data' will not fit in region 'ram': overflowed by 2049 bytes
## Check invalid region attributes.
# RUN: echo "MEMORY { ram (abc) : ORIGIN = 0x8000, LENGTH = 256K } }" > %t.script
# RUN: not ld.lld -o %t2 --script %t.script %t 2>&1 \
# RUN: | FileCheck -check-prefix=ERR7 %s
# ERR7: {{.*}}.script:1: invalid memory region attribute
.text
.global _start
_start:
nop
.data
b:
.long 1
.zero 4092