diff options
| -rw-r--r-- | lld/ELF/LinkerScript.cpp | 14 | ||||
| -rw-r--r-- | lld/ELF/LinkerScript.h | 9 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/locationcountererr.s | 6 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/locationcountererr2.s | 5 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/out-of-order.s | 2 |
5 files changed, 22 insertions, 14 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index 53b39f2b1ba..be42bec9f41 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -91,13 +91,15 @@ static bool isUnderSysroot(StringRef Path) { return false; } -template <class ELFT> void LinkerScript<ELFT>::setDot(Expr E, bool InSec) { +template <class ELFT> +void LinkerScript<ELFT>::setDot(Expr E, const Twine &Loc, bool InSec) { uintX_t Val = E(Dot); if (Val < Dot) { if (InSec) - error("unable to move location counter backward for: " + CurOutSec->Name); + error(Loc + ": unable to move location counter backward for: " + + CurOutSec->Name); else - error("unable to move location counter backward"); + error(Loc + ": unable to move location counter backward"); } Dot = Val; // Update to location counter means update to section size. @@ -111,7 +113,7 @@ template <class ELFT> void LinkerScript<ELFT>::setDot(Expr E, bool InSec) { template <class ELFT> void LinkerScript<ELFT>::assignSymbol(SymbolAssignment *Cmd, bool InSec) { if (Cmd->Name == ".") { - setDot(Cmd->Expression, InSec); + setDot(Cmd->Expression, Cmd->Location, InSec); return; } @@ -567,7 +569,7 @@ void LinkerScript<ELFT>::assignOffsets(OutputSectionCommand *Cmd) { return; if (Cmd->AddrExpr && Sec->Flags & SHF_ALLOC) - setDot(Cmd->AddrExpr); + setDot(Cmd->AddrExpr, Cmd->Location); // Handle align (e.g. ".foo : ALIGN(16) { ... }"). if (Cmd->AlignExpr) @@ -1622,7 +1624,7 @@ SymbolAssignment *ScriptParser::readAssignment(StringRef Name) { return getSymbolValue(Loc, Name, Dot) + E(Dot); }; } - return new SymbolAssignment(Name, E); + return new SymbolAssignment(Name, E, getCurrentLocation()); } // This is an operator-precedence parser to parse a linker diff --git a/lld/ELF/LinkerScript.h b/lld/ELF/LinkerScript.h index a3b9c128f7a..8e5b67a980b 100644 --- a/lld/ELF/LinkerScript.h +++ b/lld/ELF/LinkerScript.h @@ -89,8 +89,9 @@ struct BaseCommand { // This represents ". = <expr>" or "<symbol> = <expr>". struct SymbolAssignment : BaseCommand { - SymbolAssignment(StringRef Name, Expr E) - : BaseCommand(AssignmentKind), Name(Name), Expression(E) {} + SymbolAssignment(StringRef Name, Expr E, std::string &&Loc) + : BaseCommand(AssignmentKind), Name(Name), Expression(E), + Location(std::move(Loc)) {} static bool classof(const BaseCommand *C); @@ -104,6 +105,8 @@ struct SymbolAssignment : BaseCommand { // Command attributes for PROVIDE, HIDDEN and PROVIDE_HIDDEN. bool Provide = false; bool Hidden = false; + + std::string Location; }; // Linker scripts allow additional constraints to be put on ouput sections. @@ -278,7 +281,7 @@ private: void assignSymbol(SymbolAssignment *Cmd, bool InSec = false); void addSymbol(SymbolAssignment *Cmd); void computeInputSections(InputSectionDescription *); - void setDot(Expr E, bool InSec = false); + void setDot(Expr E, const Twine &Loc, bool InSec = false); void discard(ArrayRef<InputSectionBase<ELFT> *> V); diff --git a/lld/test/ELF/linkerscript/locationcountererr.s b/lld/test/ELF/linkerscript/locationcountererr.s index 7664d8d4691..113e102d4bc 100644 --- a/lld/test/ELF/linkerscript/locationcountererr.s +++ b/lld/test/ELF/linkerscript/locationcountererr.s @@ -1,8 +1,10 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t -# RUN: echo "SECTIONS { .text 0x2000 : {. = 0x10 ; *(.text) } }" > %t.script + +# RUN: echo "SECTIONS {" > %t.script +# RUN: echo ".text 0x2000 : {. = 0x10 ; *(.text) } }" >> %t.script # RUN: not ld.lld %t --script %t.script -o %t1 2>&1 | FileCheck %s -# CHECK: unable to move location counter backward for: .text +# CHECK: {{.*}}.script:2: unable to move location counter backward for: .text .globl _start _start: diff --git a/lld/test/ELF/linkerscript/locationcountererr2.s b/lld/test/ELF/linkerscript/locationcountererr2.s index 7458f3f20a0..e711f77a3f7 100644 --- a/lld/test/ELF/linkerscript/locationcountererr2.s +++ b/lld/test/ELF/linkerscript/locationcountererr2.s @@ -1,8 +1,9 @@ # REQUIRES: x86 # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -# RUN: echo "SECTIONS { . = 0x20; . = 0x10; }" > %t.script +# RUN: echo "SECTIONS {" > %t.script +# RUN: echo ". = 0x20; . = 0x10; }" >> %t.script # RUN: not ld.lld %t.o --script %t.script -o %t -shared 2>&1 | FileCheck %s -# CHECK: unable to move location counter backward +# CHECK: {{.*}}.script:2: unable to move location counter backward # RUN: echo "SECTIONS { . = 0x20; . = ASSERT(0x1, "foo"); }" > %t2.script # RUN: ld.lld %t.o --script %t2.script -o %t -shared diff --git a/lld/test/ELF/linkerscript/out-of-order.s b/lld/test/ELF/linkerscript/out-of-order.s index 274a94a6e54..9c6547a6864 100644 --- a/lld/test/ELF/linkerscript/out-of-order.s +++ b/lld/test/ELF/linkerscript/out-of-order.s @@ -3,7 +3,7 @@ # RUN: echo "SECTIONS { .data 0x4000 : { *(.data) } .text 0x2000 : { *(.text) } }" > %t.script # RUN: not ld.lld -o %t.so --script %t.script %t.o -shared 2>&1 | FileCheck %s -# CHECK: error: unable to move location counter backward +# CHECK: error: {{.*}}.script:1: unable to move location counter backward .quad 0 .data |

