forked from OSchip/llvm-project
[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:
parent
cdac172e2a
commit
fd11560f6e
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue