[ELF] - Report location for div/mod by zero.
"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. Differential revision: https://reviews.llvm.org/D43934 llvm-svn: 326686
This commit is contained in:
@@ -98,6 +98,7 @@ private:
|
||||
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 @@ static ExprValue sub(ExprValue A, ExprValue B) {
|
||||
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 @@ Expr ScriptParser::readExpr() {
|
||||
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 == ">>")
|
||||
|
||||
Reference in New Issue
Block a user