Index: ELF/ScriptParser.cpp =================================================================== --- ELF/ScriptParser.cpp +++ ELF/ScriptParser.cpp @@ -1097,6 +1097,16 @@ 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) { Index: test/ELF/linkerscript/operators.test =================================================================== --- test/ELF/linkerscript/operators.test +++ test/ELF/linkerscript/operators.test @@ -36,6 +36,8 @@ _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 @@ # 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