Index: lld/trunk/ELF/LinkerScript.cpp =================================================================== --- lld/trunk/ELF/LinkerScript.cpp +++ lld/trunk/ELF/LinkerScript.cpp @@ -621,6 +621,16 @@ return End; } +// Expands the memory region by the specified size. +static void expandMemoryRegion(MemoryRegion *MemRegion, uint64_t Size, + StringRef RegionName, StringRef SecName) { + MemRegion->CurPos += Size; + uint64_t NewSize = MemRegion->CurPos - MemRegion->Origin; + if (NewSize > MemRegion->Length) + error("section '" + SecName + "' will not fit in region '" + RegionName + + "': overflowed by " + Twine(NewSize - MemRegion->Length) + " bytes"); +} + void LinkerScript::output(InputSection *S) { uint64_t Before = advance(0, 1); uint64_t Pos = advance(S->getSize(), S->Alignment); @@ -637,17 +647,9 @@ Ctx->LMARegion->CurPos += Pos - Before; // FIXME: should we also produce overflow errors for LMARegion? - if (Ctx->MemRegion) { - uint64_t &CurOffset = Ctx->MemRegion->CurPos; - CurOffset += Pos - Before; - uint64_t CurSize = CurOffset - Ctx->MemRegion->Origin; - if (CurSize > Ctx->MemRegion->Length) { - uint64_t OverflowAmt = CurSize - Ctx->MemRegion->Length; - error("section '" + Ctx->OutSec->Name + "' will not fit in region '" + - Ctx->MemRegion->Name + "': overflowed by " + Twine(OverflowAmt) + - " bytes"); - } - } + if (Ctx->MemRegion) + expandMemoryRegion(Ctx->MemRegion, Pos - Before, Ctx->MemRegion->Name, + Ctx->OutSec->Name); } void LinkerScript::switchTo(OutputSection *Sec) { @@ -738,7 +740,8 @@ Cmd->Offset = Dot - Ctx->OutSec->Addr; Dot += Cmd->Size; if (Ctx->MemRegion) - Ctx->MemRegion->CurPos += Cmd->Size; + expandMemoryRegion(Ctx->MemRegion, Cmd->Size, Ctx->MemRegion->Name, + Ctx->OutSec->Name); if (Ctx->LMARegion) Ctx->LMARegion->CurPos += Cmd->Size; Ctx->OutSec->Size = Dot - Ctx->OutSec->Addr; Index: lld/trunk/test/ELF/linkerscript/memory-data-commands.test =================================================================== --- lld/trunk/test/ELF/linkerscript/memory-data-commands.test +++ lld/trunk/test/ELF/linkerscript/memory-data-commands.test @@ -0,0 +1,22 @@ +# REQUIRES: x86 + +# RUN: echo ".section .foo,\"a\"" > %t.s +# RUN: echo ".quad 1" >> %t.s +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t.s -o %t.o + +# RUN: not ld.lld -o %t %t.o --script %s 2>&1 | FileCheck %s + +# Check we are able to catch 'ram' overflow caused by BYTE command. +# CHECK: error: section '.foo' will not fit in region 'ram': overflowed by 1 bytes + +MEMORY { + text (rwx): org = 0x0, len = 0x1000 + ram (rwx): org = 0x1000, len = 8 +} +SECTIONS { + .text : { *(.text) } > text + .foo : { + *(.foo) + BYTE(0x1) + } > ram +}