Skip to content

Commit e833a6d

Browse files
committed
Test VMA vs LMA; add fix
1 parent f7e8896 commit e833a6d

File tree

2 files changed

+90
-35
lines changed

2 files changed

+90
-35
lines changed

lld/ELF/LinkerScript.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,8 +1598,11 @@ bool LinkerScript::spillSections() {
15981598
else
15991599
potentialSpillLists.erase(isec);
16001600

1601-
// Spills to the same regions cannot help.
1602-
if (spill->getParent()->memRegion == osec->memRegion &&
1601+
// Spills to the same region that overflowed cannot help.
1602+
if (hasRegionOverflowed(osec->memRegion) &&
1603+
spill->getParent()->memRegion == osec->memRegion)
1604+
continue;
1605+
if (hasRegionOverflowed(osec->lmaRegion) &&
16031606
spill->getParent()->lmaRegion == osec->lmaRegion)
16041607
continue;
16051608

lld/test/ELF/linkerscript/section-class.test

Lines changed: 85 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -452,49 +452,101 @@ SECTIONS {
452452
# TO-DISCARD-WARN: warning: section '.two_byte_section' cannot spill from/to /DISCARD/
453453

454454
#--- same-mem-region.lds
455-
## Spills to the same memory region do not consume address assignment passes.
455+
## Spills to the same memory region that overflowed do not consume address assignment passes.
456456
MEMORY {
457457
a : ORIGIN = 0, LENGTH = 0
458458
b : ORIGIN = 0, LENGTH = 3
459+
c : ORIGIN = 3, LENGTH = 3
460+
d : ORIGIN = 6, LENGTH = 3
459461
}
460462
SECTIONS {
461463
CLASS(class) { *(.one_byte_section .two_byte_section) }
462-
.a00 : { CLASS(class) } >a
463-
.a01 : { CLASS(class) } >a
464-
.a02 : { CLASS(class) } >a
465-
.a03 : { CLASS(class) } >a
466-
.a04 : { CLASS(class) } >a
467-
.a05 : { CLASS(class) } >a
468-
.a06 : { CLASS(class) } >a
469-
.a07 : { CLASS(class) } >a
470-
.a08 : { CLASS(class) } >a
471-
.a09 : { CLASS(class) } >a
472-
.a10 : { CLASS(class) } >a
473-
.a11 : { CLASS(class) } >a
474-
.a12 : { CLASS(class) } >a
475-
.a13 : { CLASS(class) } >a
476-
.a14 : { CLASS(class) } >a
477-
.a15 : { CLASS(class) } >a
478-
.a16 : { CLASS(class) } >a
479-
.a17 : { CLASS(class) } >a
480-
.a18 : { CLASS(class) } >a
481-
.a19 : { CLASS(class) } >a
482-
.a20 : { CLASS(class) } >a
483-
.a21 : { CLASS(class) } >a
484-
.a22 : { CLASS(class) } >a
485-
.a23 : { CLASS(class) } >a
486-
.a24 : { CLASS(class) } >a
487-
.a25 : { CLASS(class) } >a
488-
.a26 : { CLASS(class) } >a
489-
.a27 : { CLASS(class) } >a
490-
.a28 : { CLASS(class) } >a
491-
.a29 : { CLASS(class) } >a
492-
.a30 : { CLASS(class) } >a
493-
.b : { CLASS(class) } >b
464+
.a00 : { CLASS(class) } >a AT>c
465+
.a01 : { CLASS(class) } >a AT>d
466+
.a02 : { CLASS(class) } >a AT>d
467+
.a03 : { CLASS(class) } >a AT>d
468+
.a04 : { CLASS(class) } >a AT>d
469+
.a05 : { CLASS(class) } >a AT>d
470+
.a06 : { CLASS(class) } >a AT>d
471+
.a07 : { CLASS(class) } >a AT>d
472+
.a08 : { CLASS(class) } >a AT>d
473+
.a09 : { CLASS(class) } >a AT>d
474+
.a10 : { CLASS(class) } >a AT>d
475+
.a11 : { CLASS(class) } >a AT>d
476+
.a12 : { CLASS(class) } >a AT>d
477+
.a13 : { CLASS(class) } >a AT>d
478+
.a14 : { CLASS(class) } >a AT>d
479+
.a15 : { CLASS(class) } >a AT>d
480+
.a16 : { CLASS(class) } >a AT>d
481+
.a17 : { CLASS(class) } >a AT>d
482+
.a18 : { CLASS(class) } >a AT>d
483+
.a19 : { CLASS(class) } >a AT>d
484+
.a20 : { CLASS(class) } >a AT>d
485+
.a21 : { CLASS(class) } >a AT>d
486+
.a22 : { CLASS(class) } >a AT>d
487+
.a23 : { CLASS(class) } >a AT>d
488+
.a24 : { CLASS(class) } >a AT>d
489+
.a25 : { CLASS(class) } >a AT>d
490+
.a26 : { CLASS(class) } >a AT>d
491+
.a27 : { CLASS(class) } >a AT>d
492+
.a28 : { CLASS(class) } >a AT>d
493+
.a29 : { CLASS(class) } >a AT>d
494+
.a30 : { CLASS(class) } >a AT>d
495+
.b : { CLASS(class) } >b AT>d
494496
}
495497

496498
# RUN: ld.lld -T same-mem-region.lds -o same-mem-region spill.o
497499
# RUN: llvm-readelf -S same-mem-region | FileCheck %s --check-prefix=SAME-MEM-REGION
498500

499501
# SAME-MEM-REGION: Name Type Address Off Size
500502
# SAME-MEM-REGION: .b PROGBITS 0000000000000000 001000 000003
503+
504+
#--- same-lma-region.lds
505+
## Spills to the same load region that overflowed do not consume address assignment passes.
506+
MEMORY {
507+
a : ORIGIN = 0, LENGTH = 0
508+
b : ORIGIN = 0, LENGTH = 3
509+
c : ORIGIN = 3, LENGTH = 3
510+
d : ORIGIN = 6, LENGTH = 3
511+
}
512+
SECTIONS {
513+
CLASS(class) { *(.one_byte_section .two_byte_section) }
514+
.a00 : { CLASS(class) } >c AT>a
515+
.a01 : { CLASS(class) } >d AT>a
516+
.a02 : { CLASS(class) } >d AT>a
517+
.a03 : { CLASS(class) } >d AT>a
518+
.a04 : { CLASS(class) } >d AT>a
519+
.a05 : { CLASS(class) } >d AT>a
520+
.a06 : { CLASS(class) } >d AT>a
521+
.a07 : { CLASS(class) } >d AT>a
522+
.a08 : { CLASS(class) } >d AT>a
523+
.a09 : { CLASS(class) } >d AT>a
524+
.a10 : { CLASS(class) } >d AT>a
525+
.a11 : { CLASS(class) } >d AT>a
526+
.a12 : { CLASS(class) } >d AT>a
527+
.a13 : { CLASS(class) } >d AT>a
528+
.a14 : { CLASS(class) } >d AT>a
529+
.a15 : { CLASS(class) } >d AT>a
530+
.a16 : { CLASS(class) } >d AT>a
531+
.a17 : { CLASS(class) } >d AT>a
532+
.a18 : { CLASS(class) } >d AT>a
533+
.a19 : { CLASS(class) } >d AT>a
534+
.a20 : { CLASS(class) } >d AT>a
535+
.a21 : { CLASS(class) } >d AT>a
536+
.a22 : { CLASS(class) } >d AT>a
537+
.a23 : { CLASS(class) } >d AT>a
538+
.a24 : { CLASS(class) } >d AT>a
539+
.a25 : { CLASS(class) } >d AT>a
540+
.a26 : { CLASS(class) } >d AT>a
541+
.a27 : { CLASS(class) } >d AT>a
542+
.a28 : { CLASS(class) } >d AT>a
543+
.a29 : { CLASS(class) } >d AT>a
544+
.a30 : { CLASS(class) } >d AT>a
545+
.b : { CLASS(class) } >d AT>b
546+
}
547+
548+
# RUN: ld.lld -T same-lma-region.lds -o same-lma-region spill.o
549+
# RUN: llvm-readelf -S same-lma-region | FileCheck %s --check-prefix=SAME-LMA-REGION
550+
551+
# SAME-LMA-REGION: Name Type Address Off Size
552+
# SAME-LMA-REGION: .b PROGBITS 0000000000000006 001006 000003

0 commit comments

Comments
 (0)