xref: /llvm-project/lld/test/ELF/linkerscript/end-overflow-check.test (revision e4118a7ac0fc2347e78d7c87a1663b70e8ab71ed)
1*e4118a7aSAndreu CarminatiREQUIRES: x86
2*e4118a7aSAndreu Carminati
3*e4118a7aSAndreu Carminati# RUN: rm -rf %t && split-file %s %t
4*e4118a7aSAndreu Carminati# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o
5*e4118a7aSAndreu Carminati
6*e4118a7aSAndreu Carminati## The error should be triggered only for the second test where the overflow really exists.
7*e4118a7aSAndreu Carminati
8*e4118a7aSAndreu CarminatiRUN: ld.lld %t/a.o -T %t/b.lds -o /dev/null 2>&1
9*e4118a7aSAndreu CarminatiRUN: not ld.lld %t/a.o -T %t/c.lds -o /dev/null 2>&1 | FileCheck --check-prefix=ERROR %s
10*e4118a7aSAndreu Carminati
11*e4118a7aSAndreu Carminati# ERROR: error: section '_abss' will not fit in region 'SRAM0': overflowed by 1024 bytes
12*e4118a7aSAndreu Carminati# ERROR: error: section '.c.bss' will not fit in region 'SRAM0': overflowed by 1024 bytes
13*e4118a7aSAndreu Carminati# ERROR: error: section '.text' will not fit in region 'SRAM0': overflowed by 1025 bytes
14*e4118a7aSAndreu Carminati
15*e4118a7aSAndreu Carminati#--- a.s
16*e4118a7aSAndreu Carminati.section .a.bss, "aw", %nobits
17*e4118a7aSAndreu Carminati.globl abss
18*e4118a7aSAndreu Carminatiabss:
19*e4118a7aSAndreu Carminati.zero 0xDF0
20*e4118a7aSAndreu Carminati.size abss, 0xDF0
21*e4118a7aSAndreu Carminati
22*e4118a7aSAndreu Carminati.section .c.bss, "aw", %nobits
23*e4118a7aSAndreu Carminati.globl cbss
24*e4118a7aSAndreu Carminati
25*e4118a7aSAndreu Carminati.text
26*e4118a7aSAndreu Carminati.globl _start
27*e4118a7aSAndreu Carminati_start:
28*e4118a7aSAndreu Carminatinop
29*e4118a7aSAndreu Carminati
30*e4118a7aSAndreu Carminati#--- b.lds
31*e4118a7aSAndreu CarminatiMEMORY
32*e4118a7aSAndreu Carminati{
33*e4118a7aSAndreu Carminati    SRAM0 (rw) : ORIGIN = 0x20000400, LENGTH = 10K
34*e4118a7aSAndreu Carminati}
35*e4118a7aSAndreu Carminati
36*e4118a7aSAndreu CarminatiSECTIONS
37*e4118a7aSAndreu Carminati{
38*e4118a7aSAndreu Carminati    _abss ALIGN(REGION1__PRE_ALIGNMENT) :
39*e4118a7aSAndreu Carminati    {
40*e4118a7aSAndreu Carminati        REGION1__BEGIN = .; REGION1__ALIGNED_BEGIN = .; REGION1_ALIGNED_BEGIN = .;
41*e4118a7aSAndreu Carminati        *(.a.bss)
42*e4118a7aSAndreu Carminati        REGION1__END = .; . = ALIGN(REGION1__POST_ALIGNMENT); REGION1_ALIGNED_END = .;
43*e4118a7aSAndreu Carminati    } > SRAM0
44*e4118a7aSAndreu Carminati}
45*e4118a7aSAndreu Carminati
46*e4118a7aSAndreu CarminatiREGION1__PRE_ALIGNMENT = 0x00000800;
47*e4118a7aSAndreu CarminatiREGION1__PADDED_XOR = ((ABSOLUTE(REGION1__ALIGNED_BEGIN) | (ABSOLUTE(REGION1__END) - 1)) & ~(ABSOLUTE(REGION1__ALIGNED_BEGIN) & (ABSOLUTE(REGION1__END) - 1)));
48*e4118a7aSAndreu CarminatiREGION1__PADDED_REGION_SHIFT = LOG2CEIL(REGION1__PADDED_XOR);
49*e4118a7aSAndreu CarminatiREGION1__PADDED_SR_SHIFT = REGION1__PADDED_REGION_SHIFT - 3;
50*e4118a7aSAndreu CarminatiREGION1__PADDED_SR_SIZE = MAX(1 << REGION1__PADDED_SR_SHIFT, 32);
51*e4118a7aSAndreu CarminatiREGION1__POST_ALIGNMENT = REGION1__PADDED_SR_SIZE;
52*e4118a7aSAndreu Carminati
53*e4118a7aSAndreu Carminati#--- c.lds
54*e4118a7aSAndreu CarminatiMEMORY
55*e4118a7aSAndreu Carminati{
56*e4118a7aSAndreu Carminati    SRAM0 (rw) : ORIGIN = 0x20000400, LENGTH = 4K
57*e4118a7aSAndreu Carminati}
58*e4118a7aSAndreu Carminati
59*e4118a7aSAndreu CarminatiSECTIONS
60*e4118a7aSAndreu Carminati{
61*e4118a7aSAndreu Carminati    _abss ALIGN(REGION1__PRE_ALIGNMENT) :
62*e4118a7aSAndreu Carminati    {
63*e4118a7aSAndreu Carminati        REGION1__BEGIN = .; REGION1__ALIGNED_BEGIN = .; REGION1_ALIGNED_BEGIN = .;
64*e4118a7aSAndreu Carminati        *(.a.bss)
65*e4118a7aSAndreu Carminati        REGION1__END = .; . = ALIGN(REGION1__POST_ALIGNMENT); REGION1_ALIGNED_END = .;
66*e4118a7aSAndreu Carminati    } > SRAM0
67*e4118a7aSAndreu Carminati}
68*e4118a7aSAndreu Carminati
69*e4118a7aSAndreu CarminatiREGION1__PRE_ALIGNMENT = 0x00000800;
70*e4118a7aSAndreu CarminatiREGION1__PADDED_XOR = ((ABSOLUTE(REGION1__ALIGNED_BEGIN) | (ABSOLUTE(REGION1__END) - 1)) & ~(ABSOLUTE(REGION1__ALIGNED_BEGIN) & (ABSOLUTE(REGION1__END) - 1)));
71*e4118a7aSAndreu CarminatiREGION1__PADDED_REGION_SHIFT = LOG2CEIL(REGION1__PADDED_XOR);
72*e4118a7aSAndreu CarminatiREGION1__PADDED_SR_SHIFT = REGION1__PADDED_REGION_SHIFT - 3;
73*e4118a7aSAndreu CarminatiREGION1__PADDED_SR_SIZE = MAX(1 << REGION1__PADDED_SR_SHIFT, 32);
74*e4118a7aSAndreu CarminatiREGION1__POST_ALIGNMENT = REGION1__PADDED_SR_SIZE;
75