From fd11560f6e6ae03c3026f25956339c81c627408d Mon Sep 17 00:00:00 2001 From: George Rimar Date: Wed, 28 Mar 2018 11:33:00 +0000 Subject: [PATCH] [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 --- lld/ELF/ScriptParser.cpp | 10 ++++++++++ lld/test/ELF/linkerscript/operators.test | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 6f16c45..ff650d8 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 d3c6c7a..7996044 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 -- 2.7.4