[ELF] - Linkerscript: support MIN and MAX.

Sample for the OVERLAY command from the spec 
(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/sections.html)
uses MAX command that we do not support currently:

. = 0x1000 + MAX (SIZEOF (.text0), SIZEOF (.text1));

This patch implements support for MIN and MAX.

Differential revision: https://reviews.llvm.org/D44734

llvm-svn: 328696
This commit is contained in:
George Rimar 2018-03-28 11:33:00 +00:00
parent cdac172e2a
commit fd11560f6e
2 changed files with 14 additions and 0 deletions

View File

@ -1097,6 +1097,16 @@ Expr ScriptParser::readPrimary() {
return Cmd->getLMA();
};
}
if (Tok == "MAX" || Tok == "MIN") {
expect("(");
Expr A = readExpr();
expect(",");
Expr B = readExpr();
expect(")");
if (Tok == "MIN")
return [=] { return std::min(A().getValue(), B().getValue()); };
return [=] { return std::max(A().getValue(), B().getValue()); };
}
if (Tok == "ORIGIN") {
StringRef Name = readParenLiteral();
if (Script->MemoryRegions.count(Name) == 0) {

View File

@ -36,6 +36,8 @@ SECTIONS {
_end = .;
minus_rel = _end - 0x10;
minus_abs = _end - _start;
max = MAX(11, 22);
min = MIN(11, 22);
}
# CHECK: 00000000000006 *ABS* 00000000 plus
@ -66,6 +68,8 @@ SECTIONS {
# CHECK: 0000000000fff0 *ABS* 00000000 datasegmentalign2
# CHECK: 0000000000ffe0 .text 00000000 minus_rel
# CHECK: 0000000000fff0 *ABS* 00000000 minus_abs
# CHECK: 00000000000016 *ABS* 00000000 max
# CHECK: 0000000000000b *ABS* 00000000 min
## Mailformed number error.
# RUN: echo "SECTIONS { . = 0x12Q41; }" > %t.script