<div dir="ltr">I found a usage in the internal code search.</div><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Feb 28, 2018 at 10:36 AM Rafael Avila de Espindola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">LGTM<br>
<br>
out of curiosity, what uses it?<br>
<br>
Cheers,<br>
Rafael<br>
<br>
Rui Ueyama via Phabricator <<a href="mailto:reviews@reviews.llvm.org" target="_blank">reviews@reviews.llvm.org</a>> writes:<br>
<br>
> ruiu created this revision.<br>
> ruiu added a reviewer: rafael.<br>
> Herald added subscribers: arichardson, emaste.<br>
><br>
> This patch improves compatibility with GNU linkers.<br>
><br>
><br>
> <a href="https://reviews.llvm.org/D43883" rel="noreferrer" target="_blank">https://reviews.llvm.org/D43883</a><br>
><br>
> Files:<br>
>   lld/ELF/ScriptParser.cpp<br>
>   lld/test/ELF/linkerscript/operators.s<br>
><br>
><br>
> Index: lld/test/ELF/linkerscript/operators.s<br>
> ===================================================================<br>
> --- lld/test/ELF/linkerscript/operators.s<br>
> +++ lld/test/ELF/linkerscript/operators.s<br>
> @@ -5,6 +5,7 @@<br>
>  # RUN:  plus = 1 + 2 + 3; \<br>
>  # RUN:  minus = 5 - 1; \<br>
>  # RUN:  div = 6 / 2; \<br>
> +# RUN:  mod = 20 % 7; \<br>
>  # RUN:  mul = 1 + 2 * 3; \<br>
>  # RUN:  nospace = 1+2*6/3; \<br>
>  # RUN:  braces = 1 + (2 + 3) * 4; \<br>
> @@ -37,6 +38,7 @@<br>
>  # CHECK: 00000000000006 *ABS* 00000000 plus<br>
>  # CHECK: 00000000000004 *ABS* 00000000 minus<br>
>  # CHECK: 00000000000003 *ABS* 00000000 div<br>
> +# CHECK: 00000000000006 *ABS* 00000000 mod<br>
>  # CHECK: 00000000000007 *ABS* 00000000 mul<br>
>  # CHECK: 00000000000005 *ABS* 00000000 nospace<br>
>  # CHECK: 00000000000015 *ABS* 00000000 braces<br>
> Index: lld/ELF/ScriptParser.cpp<br>
> ===================================================================<br>
> --- lld/ELF/ScriptParser.cpp<br>
> +++ lld/ELF/ScriptParser.cpp<br>
> @@ -168,6 +168,13 @@<br>
>    return 0;<br>
>  }<br>
><br>
> +static ExprValue mod(ExprValue A, ExprValue B) {<br>
> +  if (uint64_t BV = B.getValue())<br>
> +    return A.getValue() % BV;<br>
> +  error("modulo by zero");<br>
> +  return 0;<br>
> +}<br>
> +<br>
>  static ExprValue bitAnd(ExprValue A, ExprValue B) {<br>
>    moveAbsRight(A, B);<br>
>    return {A.Sec, A.ForceAbsolute,<br>
> @@ -461,7 +468,7 @@<br>
><br>
>  static int precedence(StringRef Op) {<br>
>    return StringSwitch<int>(Op)<br>
> -      .Cases("*", "/", 5)<br>
> +      .Cases("*", "/", "%", 5)<br>
>        .Cases("+", "-", 4)<br>
>        .Cases("<<", ">>", 3)<br>
>        .Cases("<", "<=", ">", ">=", "==", "!=", 2)<br>
> @@ -811,6 +818,8 @@<br>
>      return [=] { return mul(L(), R()); };<br>
>    if (Op == "/")<br>
>      return [=] { return div(L(), R()); };<br>
> +  if (Op == "%")<br>
> +    return [=] { return mod(L(), R()); };<br>
>    if (Op == "<<")<br>
>      return [=] { return L().getValue() << R().getValue(); };<br>
>    if (Op == ">>")<br>
><br>
><br>
> Index: lld/test/ELF/linkerscript/operators.s<br>
> ===================================================================<br>
> --- lld/test/ELF/linkerscript/operators.s<br>
> +++ lld/test/ELF/linkerscript/operators.s<br>
> @@ -5,6 +5,7 @@<br>
>  # RUN:  plus = 1 + 2 + 3; \<br>
>  # RUN:  minus = 5 - 1; \<br>
>  # RUN:  div = 6 / 2; \<br>
> +# RUN:  mod = 20 % 7; \<br>
>  # RUN:  mul = 1 + 2 * 3; \<br>
>  # RUN:  nospace = 1+2*6/3; \<br>
>  # RUN:  braces = 1 + (2 + 3) * 4; \<br>
> @@ -37,6 +38,7 @@<br>
>  # CHECK: 00000000000006 *ABS* 00000000 plus<br>
>  # CHECK: 00000000000004 *ABS* 00000000 minus<br>
>  # CHECK: 00000000000003 *ABS* 00000000 div<br>
> +# CHECK: 00000000000006 *ABS* 00000000 mod<br>
>  # CHECK: 00000000000007 *ABS* 00000000 mul<br>
>  # CHECK: 00000000000005 *ABS* 00000000 nospace<br>
>  # CHECK: 00000000000015 *ABS* 00000000 braces<br>
> Index: lld/ELF/ScriptParser.cpp<br>
> ===================================================================<br>
> --- lld/ELF/ScriptParser.cpp<br>
> +++ lld/ELF/ScriptParser.cpp<br>
> @@ -168,6 +168,13 @@<br>
>    return 0;<br>
>  }<br>
><br>
> +static ExprValue mod(ExprValue A, ExprValue B) {<br>
> +  if (uint64_t BV = B.getValue())<br>
> +    return A.getValue() % BV;<br>
> +  error("modulo by zero");<br>
> +  return 0;<br>
> +}<br>
> +<br>
>  static ExprValue bitAnd(ExprValue A, ExprValue B) {<br>
>    moveAbsRight(A, B);<br>
>    return {A.Sec, A.ForceAbsolute,<br>
> @@ -461,7 +468,7 @@<br>
><br>
>  static int precedence(StringRef Op) {<br>
>    return StringSwitch<int>(Op)<br>
> -      .Cases("*", "/", 5)<br>
> +      .Cases("*", "/", "%", 5)<br>
>        .Cases("+", "-", 4)<br>
>        .Cases("<<", ">>", 3)<br>
>        .Cases("<", "<=", ">", ">=", "==", "!=", 2)<br>
> @@ -811,6 +818,8 @@<br>
>      return [=] { return mul(L(), R()); };<br>
>    if (Op == "/")<br>
>      return [=] { return div(L(), R()); };<br>
> +  if (Op == "%")<br>
> +    return [=] { return mod(L(), R()); };<br>
>    if (Op == "<<")<br>
>      return [=] { return L().getValue() << R().getValue(); };<br>
>    if (Op == ">>")<br>
</blockquote></div>