summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/APFloat.cpp
diff options
context:
space:
mode:
authorTim Shen <timshen91@gmail.com>2016-10-28 22:45:33 +0000
committerTim Shen <timshen91@gmail.com>2016-10-28 22:45:33 +0000
commitb4991548c80b2bcac37ea5f2eb7d8b6dfec63d03 (patch)
tree632255d5e510f541eb81a36f319e61db38b3bc21 /llvm/lib/Support/APFloat.cpp
parentdb6b6a7f0c951c6b11b68605ede0aacbbda4bb2a (diff)
downloadbcm5719-llvm-b4991548c80b2bcac37ea5f2eb7d8b6dfec63d03.tar.gz
bcm5719-llvm-b4991548c80b2bcac37ea5f2eb7d8b6dfec63d03.zip
[APFloat] Fix memory bugs revealed by MSan
Reviewers: eugenis, hfinkel, kbarton, iteratee, echristo Subscribers: mehdi_amini, llvm-commits Differential Revision: https://reviews.llvm.org/D26102 llvm-svn: 285468
Diffstat (limited to 'llvm/lib/Support/APFloat.cpp')
-rw-r--r--llvm/lib/Support/APFloat.cpp11
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp
index 05afa06a552..20e7841129d 100644
--- a/llvm/lib/Support/APFloat.cpp
+++ b/llvm/lib/Support/APFloat.cpp
@@ -818,7 +818,10 @@ IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics) {
sign = false;
}
-IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, uninitializedTag tag) {
+// Delegate to the previous constructor, because later copy constructor may
+// actually inspects category, which can't be garbage.
+IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, uninitializedTag tag)
+ : IEEEFloat(ourSemantics) {
// Allocates storage if necessary but does not initialize it.
initialize(&ourSemantics);
}
@@ -3877,7 +3880,9 @@ DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, APFloat &&First,
DoubleAPFloat::DoubleAPFloat(const DoubleAPFloat &RHS)
: Semantics(RHS.Semantics),
- Floats(new APFloat[2]{APFloat(RHS.Floats[0]), APFloat(RHS.Floats[1])}) {
+ Floats(RHS.Floats ? new APFloat[2]{APFloat(RHS.Floats[0]),
+ APFloat(RHS.Floats[1])}
+ : nullptr) {
assert(Semantics == &PPCDoubleDouble);
}
@@ -3888,7 +3893,7 @@ DoubleAPFloat::DoubleAPFloat(DoubleAPFloat &&RHS)
}
DoubleAPFloat &DoubleAPFloat::operator=(const DoubleAPFloat &RHS) {
- if (Semantics == RHS.Semantics) {
+ if (Semantics == RHS.Semantics && RHS.Floats) {
Floats[0] = RHS.Floats[0];
Floats[1] = RHS.Floats[1];
} else if (this != &RHS) {
OpenPOWER on IntegriCloud