diff options
| -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  | 

