[PATCH] D43883: Add "%" operator to the linker script.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 28 10:37:24 PST 2018
I found a usage in the internal code search.
On Wed, Feb 28, 2018 at 10:36 AM Rafael Avila de Espindola <
rafael.espindola at gmail.com> wrote:
> LGTM
>
> out of curiosity, what uses it?
>
> Cheers,
> Rafael
>
> Rui Ueyama via Phabricator <reviews at reviews.llvm.org> writes:
>
> > ruiu created this revision.
> > ruiu added a reviewer: rafael.
> > Herald added subscribers: arichardson, emaste.
> >
> > This patch improves compatibility with GNU linkers.
> >
> >
> > https://reviews.llvm.org/D43883
> >
> > Files:
> > lld/ELF/ScriptParser.cpp
> > lld/test/ELF/linkerscript/operators.s
> >
> >
> > Index: lld/test/ELF/linkerscript/operators.s
> > ===================================================================
> > --- lld/test/ELF/linkerscript/operators.s
> > +++ lld/test/ELF/linkerscript/operators.s
> > @@ -5,6 +5,7 @@
> > # RUN: plus = 1 + 2 + 3; \
> > # RUN: minus = 5 - 1; \
> > # RUN: div = 6 / 2; \
> > +# RUN: mod = 20 % 7; \
> > # RUN: mul = 1 + 2 * 3; \
> > # RUN: nospace = 1+2*6/3; \
> > # RUN: braces = 1 + (2 + 3) * 4; \
> > @@ -37,6 +38,7 @@
> > # CHECK: 00000000000006 *ABS* 00000000 plus
> > # CHECK: 00000000000004 *ABS* 00000000 minus
> > # CHECK: 00000000000003 *ABS* 00000000 div
> > +# CHECK: 00000000000006 *ABS* 00000000 mod
> > # CHECK: 00000000000007 *ABS* 00000000 mul
> > # CHECK: 00000000000005 *ABS* 00000000 nospace
> > # CHECK: 00000000000015 *ABS* 00000000 braces
> > Index: lld/ELF/ScriptParser.cpp
> > ===================================================================
> > --- lld/ELF/ScriptParser.cpp
> > +++ lld/ELF/ScriptParser.cpp
> > @@ -168,6 +168,13 @@
> > return 0;
> > }
> >
> > +static ExprValue mod(ExprValue A, ExprValue B) {
> > + if (uint64_t BV = B.getValue())
> > + return A.getValue() % BV;
> > + error("modulo by zero");
> > + return 0;
> > +}
> > +
> > static ExprValue bitAnd(ExprValue A, ExprValue B) {
> > moveAbsRight(A, B);
> > return {A.Sec, A.ForceAbsolute,
> > @@ -461,7 +468,7 @@
> >
> > static int precedence(StringRef Op) {
> > return StringSwitch<int>(Op)
> > - .Cases("*", "/", 5)
> > + .Cases("*", "/", "%", 5)
> > .Cases("+", "-", 4)
> > .Cases("<<", ">>", 3)
> > .Cases("<", "<=", ">", ">=", "==", "!=", 2)
> > @@ -811,6 +818,8 @@
> > return [=] { return mul(L(), R()); };
> > if (Op == "/")
> > return [=] { return div(L(), R()); };
> > + if (Op == "%")
> > + return [=] { return mod(L(), R()); };
> > if (Op == "<<")
> > return [=] { return L().getValue() << R().getValue(); };
> > if (Op == ">>")
> >
> >
> > Index: lld/test/ELF/linkerscript/operators.s
> > ===================================================================
> > --- lld/test/ELF/linkerscript/operators.s
> > +++ lld/test/ELF/linkerscript/operators.s
> > @@ -5,6 +5,7 @@
> > # RUN: plus = 1 + 2 + 3; \
> > # RUN: minus = 5 - 1; \
> > # RUN: div = 6 / 2; \
> > +# RUN: mod = 20 % 7; \
> > # RUN: mul = 1 + 2 * 3; \
> > # RUN: nospace = 1+2*6/3; \
> > # RUN: braces = 1 + (2 + 3) * 4; \
> > @@ -37,6 +38,7 @@
> > # CHECK: 00000000000006 *ABS* 00000000 plus
> > # CHECK: 00000000000004 *ABS* 00000000 minus
> > # CHECK: 00000000000003 *ABS* 00000000 div
> > +# CHECK: 00000000000006 *ABS* 00000000 mod
> > # CHECK: 00000000000007 *ABS* 00000000 mul
> > # CHECK: 00000000000005 *ABS* 00000000 nospace
> > # CHECK: 00000000000015 *ABS* 00000000 braces
> > Index: lld/ELF/ScriptParser.cpp
> > ===================================================================
> > --- lld/ELF/ScriptParser.cpp
> > +++ lld/ELF/ScriptParser.cpp
> > @@ -168,6 +168,13 @@
> > return 0;
> > }
> >
> > +static ExprValue mod(ExprValue A, ExprValue B) {
> > + if (uint64_t BV = B.getValue())
> > + return A.getValue() % BV;
> > + error("modulo by zero");
> > + return 0;
> > +}
> > +
> > static ExprValue bitAnd(ExprValue A, ExprValue B) {
> > moveAbsRight(A, B);
> > return {A.Sec, A.ForceAbsolute,
> > @@ -461,7 +468,7 @@
> >
> > static int precedence(StringRef Op) {
> > return StringSwitch<int>(Op)
> > - .Cases("*", "/", 5)
> > + .Cases("*", "/", "%", 5)
> > .Cases("+", "-", 4)
> > .Cases("<<", ">>", 3)
> > .Cases("<", "<=", ">", ">=", "==", "!=", 2)
> > @@ -811,6 +818,8 @@
> > return [=] { return mul(L(), R()); };
> > if (Op == "/")
> > return [=] { return div(L(), R()); };
> > + if (Op == "%")
> > + return [=] { return mod(L(), R()); };
> > if (Op == "<<")
> > return [=] { return L().getValue() << R().getValue(); };
> > if (Op == ">>")
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180228/6fa1bb15/attachment.html>
More information about the llvm-commits
mailing list