diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h --- a/llvm/include/llvm/ADT/APFloat.h +++ b/llvm/include/llvm/ADT/APFloat.h @@ -679,21 +679,14 @@ DoubleAPFloat(DoubleAPFloat &&RHS); DoubleAPFloat &operator=(const DoubleAPFloat &RHS); - - DoubleAPFloat &operator=(DoubleAPFloat &&RHS) { - if (this != &RHS) { - this->~DoubleAPFloat(); - new (this) DoubleAPFloat(std::move(RHS)); - } - return *this; - } + inline DoubleAPFloat &operator=(DoubleAPFloat &&RHS); bool needsCleanup() const { return Floats != nullptr; } - APFloat &getFirst() { return Floats[0]; } - const APFloat &getFirst() const { return Floats[0]; } - APFloat &getSecond() { return Floats[1]; } - const APFloat &getSecond() const { return Floats[1]; } + inline APFloat &getFirst(); + inline const APFloat &getFirst() const; + inline APFloat &getSecond(); + inline const APFloat &getSecond() const; opStatus add(const DoubleAPFloat &RHS, roundingMode RM); opStatus subtract(const DoubleAPFloat &RHS, roundingMode RM); @@ -1408,6 +1401,27 @@ return A < B ? B : A; } +// We want the following functions to be available in the header for inlining. +// We cannot define them inline in the class definition of `DoubleAPFloat` +// because doing so would instantiate `std::unique_ptr` before +// `APFloat` is defined, and that would be undefined behavior. +namespace detail { + +DoubleAPFloat &DoubleAPFloat::operator=(DoubleAPFloat &&RHS) { + if (this != &RHS) { + this->~DoubleAPFloat(); + new (this) DoubleAPFloat(std::move(RHS)); + } + return *this; +} + +APFloat &DoubleAPFloat::getFirst() { return Floats[0]; } +const APFloat &DoubleAPFloat::getFirst() const { return Floats[0]; } +APFloat &DoubleAPFloat::getSecond() { return Floats[1]; } +const APFloat &DoubleAPFloat::getSecond() const { return Floats[1]; } + +} // namespace detail + } // namespace llvm #undef APFLOAT_DISPATCH_ON_SEMANTICS diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h --- a/llvm/include/llvm/IR/ModuleSummaryIndex.h +++ b/llvm/include/llvm/IR/ModuleSummaryIndex.h @@ -147,7 +147,7 @@ StringRef Name; } U; - GlobalValueSummaryInfo(bool HaveGVs) : U(HaveGVs) {} + inline GlobalValueSummaryInfo(bool HaveGVs); /// List of global value summary structures for a particular value held /// in the GlobalValueMap. Requires a vector in the case of multiple @@ -575,6 +575,8 @@ friend class ModuleSummaryIndex; }; +GlobalValueSummaryInfo::GlobalValueSummaryInfo(bool HaveGVs) : U(HaveGVs) {} + /// Alias summary information. class AliasSummary : public GlobalValueSummary { ValueInfo AliaseeValueInfo;