[PATCH] D43934: [ELF] - Report location for div/mod by zero.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 1 02:36:20 PST 2018


grimar created this revision.
grimar added reviewers: espindola, ruiu.
Herald added subscribers: arichardson, emaste.

"division by zero" or "modulo by zero" are not
very informative errors and even probably confusing
as does not let to know that error is coming from linker script.
Patch adds location reporting.


https://reviews.llvm.org/D43934

Files:
  ELF/ScriptParser.cpp
  test/ELF/linkerscript/operators.test


Index: test/ELF/linkerscript/operators.test
===================================================================
--- test/ELF/linkerscript/operators.test
+++ 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: ELF/ScriptParser.cpp
===================================================================
--- ELF/ScriptParser.cpp
+++ 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,17 +158,17 @@
   return {A.Sec, false, A.getSectionOffset() - B.getValue(), A.Loc};
 }
 
-static ExprValue div(ExprValue A, ExprValue B) {
+static ExprValue div(ExprValue A, ExprValue B, std::string Loc) {
   if (uint64_t BV = B.getValue())
     return A.getValue() / BV;
-  error("division by zero");
+  error(Loc + ": division by zero");
   return 0;
 }
 
-static ExprValue mod(ExprValue A, ExprValue B) {
+static ExprValue mod(ExprValue A, ExprValue B, std::string Loc) {
   if (uint64_t BV = B.getValue())
     return A.getValue() % BV;
-  error("modulo by zero");
+  error(Loc + ": modulo by zero");
   return 0;
 }
 
@@ -805,17 +806,21 @@
   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 [=] { return div(L(), R(), Loc); };
+  }
+  if (Op == "%") {
+    std::string Loc = getCurrentLocation();
+    return [=] { return mod(L(), R(), Loc); };
+  }
   if (Op == "<<")
     return [=] { return L().getValue() << R().getValue(); };
   if (Op == ">>")


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43934.136485.patch
Type: text/x-patch
Size: 2631 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180301/c387e180/attachment.bin>


More information about the llvm-commits mailing list