[PATCH] D43934: [ELF] - Report location for div/mod by zero.
George Rimar via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 5 02:05:12 PST 2018
This revision was automatically updated to reflect the committed changes.
Closed by commit rL326686: [ELF] - Report location for div/mod by zero. (authored by grimar, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D43934?vs=136687&id=136959#toc
Repository:
rL LLVM
https://reviews.llvm.org/D43934
Files:
lld/trunk/ELF/ScriptParser.cpp
lld/trunk/test/ELF/linkerscript/operators.test
Index: lld/trunk/test/ELF/linkerscript/operators.test
===================================================================
--- lld/trunk/test/ELF/linkerscript/operators.test
+++ lld/trunk/test/ELF/linkerscript/operators.test
@@ -91,7 +91,13 @@
# RUN: echo "SECTIONS { . = 1 / 0; }" > %t.script
# RUN: not ld.lld %t --script %t.script -o %t2 2>&1 | \
# RUN: FileCheck --check-prefix=DIVZERO %s
-# DIVZERO: division by zero
+# DIVZERO: {{.*}}.script:1: division by zero
+
+## Mod by zero error.
+# RUN: echo "SECTIONS { . = 1 % 0; }" > %t.script
+# RUN: not ld.lld %t --script %t.script -o %t2 2>&1 | \
+# RUN: FileCheck --check-prefix=MODZERO %s
+# MODZERO: {{.*}}.script:1: modulo by zero
## Broken ternary operator expression.
# RUN: echo "SECTIONS { . = 1 ? 2; }" > %t.script
Index: lld/trunk/ELF/ScriptParser.cpp
===================================================================
--- lld/trunk/ELF/ScriptParser.cpp
+++ lld/trunk/ELF/ScriptParser.cpp
@@ -98,6 +98,7 @@
uint64_t readMemoryAssignment(StringRef, StringRef, StringRef);
std::pair<uint32_t, uint32_t> readMemoryAttributes();
+ Expr combine(StringRef Op, Expr L, Expr R);
Expr readExpr();
Expr readExpr1(Expr Lhs, int MinPrec);
StringRef readParenLiteral();
@@ -157,20 +158,6 @@
return {A.Sec, false, A.getSectionOffset() - B.getValue(), A.Loc};
}
-static ExprValue div(ExprValue A, ExprValue B) {
- if (uint64_t BV = B.getValue())
- return A.getValue() / BV;
- error("division by zero");
- 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,
@@ -809,17 +796,31 @@
return E;
}
-static Expr combine(StringRef Op, Expr L, Expr R) {
+Expr ScriptParser::combine(StringRef Op, Expr L, Expr R) {
if (Op == "+")
return [=] { return add(L(), R()); };
if (Op == "-")
return [=] { return sub(L(), R()); };
if (Op == "*")
return [=] { return L().getValue() * R().getValue(); };
- if (Op == "/")
- return [=] { return div(L(), R()); };
- if (Op == "%")
- return [=] { return mod(L(), R()); };
+ if (Op == "/") {
+ std::string Loc = getCurrentLocation();
+ return [=]() -> uint64_t {
+ if (uint64_t RV = R().getValue())
+ return L().getValue() / RV;
+ error(Loc + ": division by zero");
+ return (uint64_t)0;
+ };
+ }
+ if (Op == "%") {
+ std::string Loc = getCurrentLocation();
+ return [=]() -> uint64_t {
+ if (uint64_t RV = R().getValue())
+ return L().getValue() % RV;
+ error(Loc + ": modulo by zero");
+ return (uint64_t)0;
+ };
+ }
if (Op == "<<")
return [=] { return L().getValue() << R().getValue(); };
if (Op == ">>")
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43934.136959.patch
Type: text/x-patch
Size: 2869 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180305/10f1e2ea/attachment.bin>
More information about the llvm-commits
mailing list