summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
authorAlexey Samsonov <vonosmas@gmail.com>2014-09-02 17:25:29 +0000
committerAlexey Samsonov <vonosmas@gmail.com>2014-09-02 17:25:29 +0000
commit1b0713ce09713a098cf3589941c26bf4c82974cf (patch)
tree43bb87e87c5ed66f9b7d4455f160b44b17e63c15 /llvm/lib/MC
parentb9de900788380aee9020d2067b6013ec805c9099 (diff)
downloadbcm5719-llvm-1b0713ce09713a098cf3589941c26bf4c82974cf.tar.gz
bcm5719-llvm-1b0713ce09713a098cf3589941c26bf4c82974cf.zip
Fix left shifts by too large exponents in MCParser
(which happened only on error recovery path). This bug was reported by UBSan. llvm-svn: 216915
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r--llvm/lib/MC/MCParser/AsmParser.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp
index a1b469d6797..388d2fc3452 100644
--- a/llvm/lib/MC/MCParser/AsmParser.cpp
+++ b/llvm/lib/MC/MCParser/AsmParser.cpp
@@ -2601,13 +2601,14 @@ bool AsmParser::parseDirectiveFill() {
if (!isUInt<32>(FillExpr) && FillSize > 4)
Warning(ExprLoc, "'.fill' directive pattern has been truncated to 32-bits");
- int64_t NonZeroFillSize = FillSize > 4 ? 4 : FillSize;
- FillExpr &= ~0ULL >> (64 - NonZeroFillSize * 8);
-
- for (uint64_t i = 0, e = NumValues; i != e; ++i) {
- getStreamer().EmitIntValue(FillExpr, NonZeroFillSize);
- if (NonZeroFillSize < FillSize)
- getStreamer().EmitIntValue(0, FillSize - NonZeroFillSize);
+ if (NumValues > 0) {
+ int64_t NonZeroFillSize = FillSize > 4 ? 4 : FillSize;
+ FillExpr &= ~0ULL >> (64 - NonZeroFillSize * 8);
+ for (uint64_t i = 0, e = NumValues; i != e; ++i) {
+ getStreamer().EmitIntValue(FillExpr, NonZeroFillSize);
+ if (NonZeroFillSize < FillSize)
+ getStreamer().EmitIntValue(0, FillSize - NonZeroFillSize);
+ }
}
return false;
OpenPOWER on IntegriCloud