diff options
| author | George Rimar <grimar@accesssoftek.com> | 2018-03-28 11:33:00 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2018-03-28 11:33:00 +0000 |
| commit | fd11560f6e6ae03c3026f25956339c81c627408d (patch) | |
| tree | 4896cc3b51d9f9e9909d31ed19f24bc96778d521 | |
| parent | cdac172e2a6d8b1efc130ede138e157e21568c85 (diff) | |
| download | bcm5719-llvm-fd11560f6e6ae03c3026f25956339c81c627408d.tar.gz bcm5719-llvm-fd11560f6e6ae03c3026f25956339c81c627408d.zip | |
[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
| -rw-r--r-- | lld/ELF/ScriptParser.cpp | 10 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/operators.test | 4 |
2 files changed, 14 insertions, 0 deletions
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 6f16c45baab..ff650d8ef87 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -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) { diff --git a/lld/test/ELF/linkerscript/operators.test b/lld/test/ELF/linkerscript/operators.test index d3c6c7aeb35..79960443a3a 100644 --- a/lld/test/ELF/linkerscript/operators.test +++ b/lld/test/ELF/linkerscript/operators.test @@ -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 |

