[ELF] - Basic support of linkerscript commands: DATA_SEGMENT_ALIGN, DATA_SEGMENT_END, CONSTANT
It is called basic because:
CONSTANT expression can refer to COMMONPAGESIZE and MAXPAGESIZE.
This sizes are usually different and used for possible optimization of
memory consumption.
More details are here: https://sourceware.org/ml/binutils/2002-02/msg00265.html
We currently do not support this optimization, so both CONSTANT(MAXPAGESIZE)
and CONSTANT(COMMONPAGESIZE) just return Target->PageSize value.
DATA_SEGMENT_ALIGN and DATA_SEGMENT_END are used as a part of opt.
The latter one is just ignored now.
According to documentation DATA_SEGMENT_ALIGN has 2 possible
calculation, but since we do not support mentioned opt - it
is always calculated now as (ALIGN(MAXPAGESIZE) + (. & (MAXPAGESIZE - 1))).
In general this should work for now until we deside to support this opt.
Differential revision: https://reviews.llvm.org/D19663
llvm-svn: 276323
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 8ff729b..1f6fbbc 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -105,6 +105,13 @@
return V;
}
+uint64_t static getConstantValue(StringRef C) {
+ if (C == "COMMONPAGESIZE" || C == "MAXPAGESIZE")
+ return Target->PageSize;
+ error("unknown constant: " + C);
+ return 0;
+}
+
// This is a part of the operator-precedence parser to evaluate
// arithmetic expressions in SECTIONS command. This function evaluates an
// integer literal, a parenthesized expression, the ALIGN function,
@@ -124,6 +131,34 @@
expect(")");
return alignTo(Dot, V);
}
+ if (Tok == "CONSTANT") {
+ expect("(");
+ uint64_t V = getConstantValue(next());
+ expect(")");
+ return V;
+ }
+ // Documentations says there are two ways to compute
+ // the value of DATA_SEGMENT_ALIGN command, depending on whether the second
+ // uses fewer COMMONPAGESIZE sized pages for the data segment(area between the
+ // result of this expression and `DATA_SEGMENT_END') than the first or not.
+ // That is possible optimization, that we do not support, so we compute that
+ // function always as (ALIGN(MAXPAGESIZE) + (. & (MAXPAGESIZE - 1))) now.
+ if (Tok == "DATA_SEGMENT_ALIGN") {
+ expect("(");
+ uint64_t L = parseExpr();
+ expect(",");
+ parseExpr();
+ expect(")");
+ return alignTo(Dot, L) + (Dot & (L - 1));
+ }
+ // Since we do not support the optimization from comment above,
+ // we can just ignore that command.
+ if (Tok == "DATA_SEGMENT_END") {
+ expect("(");
+ expect(".");
+ expect(")");
+ return Dot;
+ }
uint64_t V = 0;
if (Tok.getAsInteger(0, V))
setError("malformed number: " + Tok);