Index: lld/trunk/ELF/ScriptParser.cpp =================================================================== --- lld/trunk/ELF/ScriptParser.cpp +++ lld/trunk/ELF/ScriptParser.cpp @@ -90,6 +90,8 @@ void readSort(); AssertCommand *readAssert(); Expr readAssertExpr(); + Expr readConstant(); + Expr getPageSize(); uint64_t readMemoryAssignment(StringRef, StringRef, StringRef); std::pair readMemoryAttributes(); @@ -793,13 +795,24 @@ return Lhs; } -uint64_t static getConstant(StringRef S) { +Expr ScriptParser::getPageSize() { + std::string Location = getCurrentLocation(); + return [=]() -> uint64_t { + if (Target) + return Target->PageSize; + error(Location + ": unable to calculate page size"); + return 4096; // Return a dummy value. + }; +} + +Expr ScriptParser::readConstant() { + StringRef S = readParenLiteral(); if (S == "COMMONPAGESIZE") - return Target->PageSize; + return getPageSize(); if (S == "MAXPAGESIZE") - return Config->MaxPageSize; - error("unknown constant: " + S); - return 0; + return [] { return Config->MaxPageSize; }; + setError("unknown constant: " + S); + return {}; } // Parses Tok as an integer. It recognizes hexadecimal (prefixed with @@ -919,10 +932,8 @@ } if (Tok == "ASSERT") return readAssertExpr(); - if (Tok == "CONSTANT") { - StringRef Name = readParenLiteral(); - return [=] { return getConstant(Name); }; - } + if (Tok == "CONSTANT") + return readConstant(); if (Tok == "DATA_SEGMENT_ALIGN") { expect("("); Expr E = readExpr(); @@ -948,7 +959,8 @@ expect(","); readExpr(); expect(")"); - return [] { return alignTo(Script->getDot(), Target->PageSize); }; + Expr E = getPageSize(); + return [=] { return alignTo(Script->getDot(), E().getValue()); }; } if (Tok == "DEFINED") { StringRef Name = readParenLiteral(); Index: lld/trunk/test/ELF/linkerscript/memory-err.s =================================================================== --- lld/trunk/test/ELF/linkerscript/memory-err.s +++ lld/trunk/test/ELF/linkerscript/memory-err.s @@ -0,0 +1,10 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: echo "MEMORY { name : ORIGIN = DATA_SEGMENT_RELRO_END; }" > %t.script +# RUN: not ld.lld -shared -o %t2 --script %t.script %t 2>&1 | FileCheck %s +# CHECK: error: {{.*}}.script:1: unable to calculate page size + +# RUN: echo "MEMORY { name : ORIGIN = CONSTANT(COMMONPAGESIZE); }" > %t.script +# RUN: not ld.lld -shared -o %t2 --script %t.script %t 2>&1 |\ +# RUN: FileCheck %s --check-prefix=ERR2 +# ERR2: error: {{.*}}.script:1: unable to calculate page size