xref: /freebsd-src/contrib/llvm-project/clang/lib/CodeGen/CGExprConstant.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===--- CGExprConstant.cpp - Emit LLVM Code from Constant Expressions ----===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This contains code to emit Constant Expr nodes as LLVM code.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
13*0fca6ea1SDimitry Andric #include "ABIInfoImpl.h"
140b57cec5SDimitry Andric #include "CGCXXABI.h"
150b57cec5SDimitry Andric #include "CGObjCRuntime.h"
160b57cec5SDimitry Andric #include "CGRecordLayout.h"
17480093f4SDimitry Andric #include "CodeGenFunction.h"
180b57cec5SDimitry Andric #include "CodeGenModule.h"
190b57cec5SDimitry Andric #include "ConstantEmitter.h"
200b57cec5SDimitry Andric #include "TargetInfo.h"
210b57cec5SDimitry Andric #include "clang/AST/APValue.h"
220b57cec5SDimitry Andric #include "clang/AST/ASTContext.h"
23480093f4SDimitry Andric #include "clang/AST/Attr.h"
240b57cec5SDimitry Andric #include "clang/AST/RecordLayout.h"
250b57cec5SDimitry Andric #include "clang/AST/StmtVisitor.h"
260b57cec5SDimitry Andric #include "clang/Basic/Builtins.h"
270b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
28480093f4SDimitry Andric #include "llvm/ADT/Sequence.h"
295f757f3fSDimitry Andric #include "llvm/Analysis/ConstantFolding.h"
300b57cec5SDimitry Andric #include "llvm/IR/Constants.h"
310b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h"
320b57cec5SDimitry Andric #include "llvm/IR/Function.h"
330b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h"
34bdd1243dSDimitry Andric #include <optional>
350b57cec5SDimitry Andric using namespace clang;
360b57cec5SDimitry Andric using namespace CodeGen;
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
390b57cec5SDimitry Andric //                            ConstantAggregateBuilder
400b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric namespace {
430b57cec5SDimitry Andric class ConstExprEmitter;
440b57cec5SDimitry Andric 
450b57cec5SDimitry Andric struct ConstantAggregateBuilderUtils {
460b57cec5SDimitry Andric   CodeGenModule &CGM;
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric   ConstantAggregateBuilderUtils(CodeGenModule &CGM) : CGM(CGM) {}
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric   CharUnits getAlignment(const llvm::Constant *C) const {
510b57cec5SDimitry Andric     return CharUnits::fromQuantity(
52bdd1243dSDimitry Andric         CGM.getDataLayout().getABITypeAlign(C->getType()));
530b57cec5SDimitry Andric   }
540b57cec5SDimitry Andric 
550b57cec5SDimitry Andric   CharUnits getSize(llvm::Type *Ty) const {
560b57cec5SDimitry Andric     return CharUnits::fromQuantity(CGM.getDataLayout().getTypeAllocSize(Ty));
570b57cec5SDimitry Andric   }
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric   CharUnits getSize(const llvm::Constant *C) const {
600b57cec5SDimitry Andric     return getSize(C->getType());
610b57cec5SDimitry Andric   }
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   llvm::Constant *getPadding(CharUnits PadSize) const {
64e8d8bef9SDimitry Andric     llvm::Type *Ty = CGM.CharTy;
650b57cec5SDimitry Andric     if (PadSize > CharUnits::One())
660b57cec5SDimitry Andric       Ty = llvm::ArrayType::get(Ty, PadSize.getQuantity());
670b57cec5SDimitry Andric     return llvm::UndefValue::get(Ty);
680b57cec5SDimitry Andric   }
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric   llvm::Constant *getZeroes(CharUnits ZeroSize) const {
71e8d8bef9SDimitry Andric     llvm::Type *Ty = llvm::ArrayType::get(CGM.CharTy, ZeroSize.getQuantity());
720b57cec5SDimitry Andric     return llvm::ConstantAggregateZero::get(Ty);
730b57cec5SDimitry Andric   }
740b57cec5SDimitry Andric };
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric /// Incremental builder for an llvm::Constant* holding a struct or array
770b57cec5SDimitry Andric /// constant.
780b57cec5SDimitry Andric class ConstantAggregateBuilder : private ConstantAggregateBuilderUtils {
790b57cec5SDimitry Andric   /// The elements of the constant. These two arrays must have the same size;
800b57cec5SDimitry Andric   /// Offsets[i] describes the offset of Elems[i] within the constant. The
810b57cec5SDimitry Andric   /// elements are kept in increasing offset order, and we ensure that there
820b57cec5SDimitry Andric   /// is no overlap: Offsets[i+1] >= Offsets[i] + getSize(Elemes[i]).
830b57cec5SDimitry Andric   ///
840b57cec5SDimitry Andric   /// This may contain explicit padding elements (in order to create a
850b57cec5SDimitry Andric   /// natural layout), but need not. Gaps between elements are implicitly
860b57cec5SDimitry Andric   /// considered to be filled with undef.
870b57cec5SDimitry Andric   llvm::SmallVector<llvm::Constant*, 32> Elems;
880b57cec5SDimitry Andric   llvm::SmallVector<CharUnits, 32> Offsets;
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric   /// The size of the constant (the maximum end offset of any added element).
910b57cec5SDimitry Andric   /// May be larger than the end of Elems.back() if we split the last element
920b57cec5SDimitry Andric   /// and removed some trailing undefs.
930b57cec5SDimitry Andric   CharUnits Size = CharUnits::Zero();
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   /// This is true only if laying out Elems in order as the elements of a
960b57cec5SDimitry Andric   /// non-packed LLVM struct will give the correct layout.
970b57cec5SDimitry Andric   bool NaturalLayout = true;
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric   bool split(size_t Index, CharUnits Hint);
100bdd1243dSDimitry Andric   std::optional<size_t> splitAt(CharUnits Pos);
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric   static llvm::Constant *buildFrom(CodeGenModule &CGM,
1030b57cec5SDimitry Andric                                    ArrayRef<llvm::Constant *> Elems,
1040b57cec5SDimitry Andric                                    ArrayRef<CharUnits> Offsets,
1050b57cec5SDimitry Andric                                    CharUnits StartOffset, CharUnits Size,
1060b57cec5SDimitry Andric                                    bool NaturalLayout, llvm::Type *DesiredTy,
1070b57cec5SDimitry Andric                                    bool AllowOversized);
1080b57cec5SDimitry Andric 
1090b57cec5SDimitry Andric public:
1100b57cec5SDimitry Andric   ConstantAggregateBuilder(CodeGenModule &CGM)
1110b57cec5SDimitry Andric       : ConstantAggregateBuilderUtils(CGM) {}
1120b57cec5SDimitry Andric 
1130b57cec5SDimitry Andric   /// Update or overwrite the value starting at \p Offset with \c C.
1140b57cec5SDimitry Andric   ///
1150b57cec5SDimitry Andric   /// \param AllowOverwrite If \c true, this constant might overwrite (part of)
1160b57cec5SDimitry Andric   ///        a constant that has already been added. This flag is only used to
1170b57cec5SDimitry Andric   ///        detect bugs.
1180b57cec5SDimitry Andric   bool add(llvm::Constant *C, CharUnits Offset, bool AllowOverwrite);
1190b57cec5SDimitry Andric 
1200b57cec5SDimitry Andric   /// Update or overwrite the bits starting at \p OffsetInBits with \p Bits.
1210b57cec5SDimitry Andric   bool addBits(llvm::APInt Bits, uint64_t OffsetInBits, bool AllowOverwrite);
1220b57cec5SDimitry Andric 
1230b57cec5SDimitry Andric   /// Attempt to condense the value starting at \p Offset to a constant of type
1240b57cec5SDimitry Andric   /// \p DesiredTy.
1250b57cec5SDimitry Andric   void condense(CharUnits Offset, llvm::Type *DesiredTy);
1260b57cec5SDimitry Andric 
1270b57cec5SDimitry Andric   /// Produce a constant representing the entire accumulated value, ideally of
1280b57cec5SDimitry Andric   /// the specified type. If \p AllowOversized, the constant might be larger
1290b57cec5SDimitry Andric   /// than implied by \p DesiredTy (eg, if there is a flexible array member).
1300b57cec5SDimitry Andric   /// Otherwise, the constant will be of exactly the same size as \p DesiredTy
1310b57cec5SDimitry Andric   /// even if we can't represent it as that type.
1320b57cec5SDimitry Andric   llvm::Constant *build(llvm::Type *DesiredTy, bool AllowOversized) const {
1330b57cec5SDimitry Andric     return buildFrom(CGM, Elems, Offsets, CharUnits::Zero(), Size,
1340b57cec5SDimitry Andric                      NaturalLayout, DesiredTy, AllowOversized);
1350b57cec5SDimitry Andric   }
1360b57cec5SDimitry Andric };
1370b57cec5SDimitry Andric 
1380b57cec5SDimitry Andric template<typename Container, typename Range = std::initializer_list<
1390b57cec5SDimitry Andric                                  typename Container::value_type>>
1400b57cec5SDimitry Andric static void replace(Container &C, size_t BeginOff, size_t EndOff, Range Vals) {
1410b57cec5SDimitry Andric   assert(BeginOff <= EndOff && "invalid replacement range");
1420b57cec5SDimitry Andric   llvm::replace(C, C.begin() + BeginOff, C.begin() + EndOff, Vals);
1430b57cec5SDimitry Andric }
1440b57cec5SDimitry Andric 
1450b57cec5SDimitry Andric bool ConstantAggregateBuilder::add(llvm::Constant *C, CharUnits Offset,
1460b57cec5SDimitry Andric                           bool AllowOverwrite) {
1470b57cec5SDimitry Andric   // Common case: appending to a layout.
1480b57cec5SDimitry Andric   if (Offset >= Size) {
1490b57cec5SDimitry Andric     CharUnits Align = getAlignment(C);
1500b57cec5SDimitry Andric     CharUnits AlignedSize = Size.alignTo(Align);
1510b57cec5SDimitry Andric     if (AlignedSize > Offset || Offset.alignTo(Align) != Offset)
1520b57cec5SDimitry Andric       NaturalLayout = false;
1530b57cec5SDimitry Andric     else if (AlignedSize < Offset) {
1540b57cec5SDimitry Andric       Elems.push_back(getPadding(Offset - Size));
1550b57cec5SDimitry Andric       Offsets.push_back(Size);
1560b57cec5SDimitry Andric     }
1570b57cec5SDimitry Andric     Elems.push_back(C);
1580b57cec5SDimitry Andric     Offsets.push_back(Offset);
1590b57cec5SDimitry Andric     Size = Offset + getSize(C);
1600b57cec5SDimitry Andric     return true;
1610b57cec5SDimitry Andric   }
1620b57cec5SDimitry Andric 
1630b57cec5SDimitry Andric   // Uncommon case: constant overlaps what we've already created.
164bdd1243dSDimitry Andric   std::optional<size_t> FirstElemToReplace = splitAt(Offset);
1650b57cec5SDimitry Andric   if (!FirstElemToReplace)
1660b57cec5SDimitry Andric     return false;
1670b57cec5SDimitry Andric 
1680b57cec5SDimitry Andric   CharUnits CSize = getSize(C);
169bdd1243dSDimitry Andric   std::optional<size_t> LastElemToReplace = splitAt(Offset + CSize);
1700b57cec5SDimitry Andric   if (!LastElemToReplace)
1710b57cec5SDimitry Andric     return false;
1720b57cec5SDimitry Andric 
1730b57cec5SDimitry Andric   assert((FirstElemToReplace == LastElemToReplace || AllowOverwrite) &&
1740b57cec5SDimitry Andric          "unexpectedly overwriting field");
1750b57cec5SDimitry Andric 
1760b57cec5SDimitry Andric   replace(Elems, *FirstElemToReplace, *LastElemToReplace, {C});
1770b57cec5SDimitry Andric   replace(Offsets, *FirstElemToReplace, *LastElemToReplace, {Offset});
1780b57cec5SDimitry Andric   Size = std::max(Size, Offset + CSize);
1790b57cec5SDimitry Andric   NaturalLayout = false;
1800b57cec5SDimitry Andric   return true;
1810b57cec5SDimitry Andric }
1820b57cec5SDimitry Andric 
1830b57cec5SDimitry Andric bool ConstantAggregateBuilder::addBits(llvm::APInt Bits, uint64_t OffsetInBits,
1840b57cec5SDimitry Andric                               bool AllowOverwrite) {
1850b57cec5SDimitry Andric   const ASTContext &Context = CGM.getContext();
1860b57cec5SDimitry Andric   const uint64_t CharWidth = CGM.getContext().getCharWidth();
1870b57cec5SDimitry Andric 
1880b57cec5SDimitry Andric   // Offset of where we want the first bit to go within the bits of the
1890b57cec5SDimitry Andric   // current char.
1900b57cec5SDimitry Andric   unsigned OffsetWithinChar = OffsetInBits % CharWidth;
1910b57cec5SDimitry Andric 
1920b57cec5SDimitry Andric   // We split bit-fields up into individual bytes. Walk over the bytes and
1930b57cec5SDimitry Andric   // update them.
1940b57cec5SDimitry Andric   for (CharUnits OffsetInChars =
1950b57cec5SDimitry Andric            Context.toCharUnitsFromBits(OffsetInBits - OffsetWithinChar);
1960b57cec5SDimitry Andric        /**/; ++OffsetInChars) {
1970b57cec5SDimitry Andric     // Number of bits we want to fill in this char.
1980b57cec5SDimitry Andric     unsigned WantedBits =
1990b57cec5SDimitry Andric         std::min((uint64_t)Bits.getBitWidth(), CharWidth - OffsetWithinChar);
2000b57cec5SDimitry Andric 
2010b57cec5SDimitry Andric     // Get a char containing the bits we want in the right places. The other
2020b57cec5SDimitry Andric     // bits have unspecified values.
2030b57cec5SDimitry Andric     llvm::APInt BitsThisChar = Bits;
2040b57cec5SDimitry Andric     if (BitsThisChar.getBitWidth() < CharWidth)
2050b57cec5SDimitry Andric       BitsThisChar = BitsThisChar.zext(CharWidth);
2060b57cec5SDimitry Andric     if (CGM.getDataLayout().isBigEndian()) {
2070b57cec5SDimitry Andric       // Figure out how much to shift by. We may need to left-shift if we have
2080b57cec5SDimitry Andric       // less than one byte of Bits left.
2090b57cec5SDimitry Andric       int Shift = Bits.getBitWidth() - CharWidth + OffsetWithinChar;
2100b57cec5SDimitry Andric       if (Shift > 0)
2110b57cec5SDimitry Andric         BitsThisChar.lshrInPlace(Shift);
2120b57cec5SDimitry Andric       else if (Shift < 0)
2130b57cec5SDimitry Andric         BitsThisChar = BitsThisChar.shl(-Shift);
2140b57cec5SDimitry Andric     } else {
2150b57cec5SDimitry Andric       BitsThisChar = BitsThisChar.shl(OffsetWithinChar);
2160b57cec5SDimitry Andric     }
2170b57cec5SDimitry Andric     if (BitsThisChar.getBitWidth() > CharWidth)
2180b57cec5SDimitry Andric       BitsThisChar = BitsThisChar.trunc(CharWidth);
2190b57cec5SDimitry Andric 
2200b57cec5SDimitry Andric     if (WantedBits == CharWidth) {
2210b57cec5SDimitry Andric       // Got a full byte: just add it directly.
2220b57cec5SDimitry Andric       add(llvm::ConstantInt::get(CGM.getLLVMContext(), BitsThisChar),
2230b57cec5SDimitry Andric           OffsetInChars, AllowOverwrite);
2240b57cec5SDimitry Andric     } else {
2250b57cec5SDimitry Andric       // Partial byte: update the existing integer if there is one. If we
2260b57cec5SDimitry Andric       // can't split out a 1-CharUnit range to update, then we can't add
2270b57cec5SDimitry Andric       // these bits and fail the entire constant emission.
228bdd1243dSDimitry Andric       std::optional<size_t> FirstElemToUpdate = splitAt(OffsetInChars);
2290b57cec5SDimitry Andric       if (!FirstElemToUpdate)
2300b57cec5SDimitry Andric         return false;
231bdd1243dSDimitry Andric       std::optional<size_t> LastElemToUpdate =
2320b57cec5SDimitry Andric           splitAt(OffsetInChars + CharUnits::One());
2330b57cec5SDimitry Andric       if (!LastElemToUpdate)
2340b57cec5SDimitry Andric         return false;
2350b57cec5SDimitry Andric       assert(*LastElemToUpdate - *FirstElemToUpdate < 2 &&
2360b57cec5SDimitry Andric              "should have at most one element covering one byte");
2370b57cec5SDimitry Andric 
2380b57cec5SDimitry Andric       // Figure out which bits we want and discard the rest.
2390b57cec5SDimitry Andric       llvm::APInt UpdateMask(CharWidth, 0);
2400b57cec5SDimitry Andric       if (CGM.getDataLayout().isBigEndian())
2410b57cec5SDimitry Andric         UpdateMask.setBits(CharWidth - OffsetWithinChar - WantedBits,
2420b57cec5SDimitry Andric                            CharWidth - OffsetWithinChar);
2430b57cec5SDimitry Andric       else
2440b57cec5SDimitry Andric         UpdateMask.setBits(OffsetWithinChar, OffsetWithinChar + WantedBits);
2450b57cec5SDimitry Andric       BitsThisChar &= UpdateMask;
2460b57cec5SDimitry Andric 
2470b57cec5SDimitry Andric       if (*FirstElemToUpdate == *LastElemToUpdate ||
2480b57cec5SDimitry Andric           Elems[*FirstElemToUpdate]->isNullValue() ||
2490b57cec5SDimitry Andric           isa<llvm::UndefValue>(Elems[*FirstElemToUpdate])) {
2500b57cec5SDimitry Andric         // All existing bits are either zero or undef.
2510b57cec5SDimitry Andric         add(llvm::ConstantInt::get(CGM.getLLVMContext(), BitsThisChar),
2520b57cec5SDimitry Andric             OffsetInChars, /*AllowOverwrite*/ true);
2530b57cec5SDimitry Andric       } else {
2540b57cec5SDimitry Andric         llvm::Constant *&ToUpdate = Elems[*FirstElemToUpdate];
2550b57cec5SDimitry Andric         // In order to perform a partial update, we need the existing bitwise
2560b57cec5SDimitry Andric         // value, which we can only extract for a constant int.
2570b57cec5SDimitry Andric         auto *CI = dyn_cast<llvm::ConstantInt>(ToUpdate);
2580b57cec5SDimitry Andric         if (!CI)
2590b57cec5SDimitry Andric           return false;
2600b57cec5SDimitry Andric         // Because this is a 1-CharUnit range, the constant occupying it must
2610b57cec5SDimitry Andric         // be exactly one CharUnit wide.
2620b57cec5SDimitry Andric         assert(CI->getBitWidth() == CharWidth && "splitAt failed");
2630b57cec5SDimitry Andric         assert((!(CI->getValue() & UpdateMask) || AllowOverwrite) &&
2640b57cec5SDimitry Andric                "unexpectedly overwriting bitfield");
2650b57cec5SDimitry Andric         BitsThisChar |= (CI->getValue() & ~UpdateMask);
2660b57cec5SDimitry Andric         ToUpdate = llvm::ConstantInt::get(CGM.getLLVMContext(), BitsThisChar);
2670b57cec5SDimitry Andric       }
2680b57cec5SDimitry Andric     }
2690b57cec5SDimitry Andric 
2700b57cec5SDimitry Andric     // Stop if we've added all the bits.
2710b57cec5SDimitry Andric     if (WantedBits == Bits.getBitWidth())
2720b57cec5SDimitry Andric       break;
2730b57cec5SDimitry Andric 
2740b57cec5SDimitry Andric     // Remove the consumed bits from Bits.
2750b57cec5SDimitry Andric     if (!CGM.getDataLayout().isBigEndian())
2760b57cec5SDimitry Andric       Bits.lshrInPlace(WantedBits);
2770b57cec5SDimitry Andric     Bits = Bits.trunc(Bits.getBitWidth() - WantedBits);
2780b57cec5SDimitry Andric 
2790b57cec5SDimitry Andric     // The remanining bits go at the start of the following bytes.
2800b57cec5SDimitry Andric     OffsetWithinChar = 0;
2810b57cec5SDimitry Andric   }
2820b57cec5SDimitry Andric 
2830b57cec5SDimitry Andric   return true;
2840b57cec5SDimitry Andric }
2850b57cec5SDimitry Andric 
2860b57cec5SDimitry Andric /// Returns a position within Elems and Offsets such that all elements
2870b57cec5SDimitry Andric /// before the returned index end before Pos and all elements at or after
2880b57cec5SDimitry Andric /// the returned index begin at or after Pos. Splits elements as necessary
289bdd1243dSDimitry Andric /// to ensure this. Returns std::nullopt if we find something we can't split.
290bdd1243dSDimitry Andric std::optional<size_t> ConstantAggregateBuilder::splitAt(CharUnits Pos) {
2910b57cec5SDimitry Andric   if (Pos >= Size)
2920b57cec5SDimitry Andric     return Offsets.size();
2930b57cec5SDimitry Andric 
2940b57cec5SDimitry Andric   while (true) {
2950b57cec5SDimitry Andric     auto FirstAfterPos = llvm::upper_bound(Offsets, Pos);
2960b57cec5SDimitry Andric     if (FirstAfterPos == Offsets.begin())
2970b57cec5SDimitry Andric       return 0;
2980b57cec5SDimitry Andric 
2990b57cec5SDimitry Andric     // If we already have an element starting at Pos, we're done.
3000b57cec5SDimitry Andric     size_t LastAtOrBeforePosIndex = FirstAfterPos - Offsets.begin() - 1;
3010b57cec5SDimitry Andric     if (Offsets[LastAtOrBeforePosIndex] == Pos)
3020b57cec5SDimitry Andric       return LastAtOrBeforePosIndex;
3030b57cec5SDimitry Andric 
3040b57cec5SDimitry Andric     // We found an element starting before Pos. Check for overlap.
3050b57cec5SDimitry Andric     if (Offsets[LastAtOrBeforePosIndex] +
3060b57cec5SDimitry Andric         getSize(Elems[LastAtOrBeforePosIndex]) <= Pos)
3070b57cec5SDimitry Andric       return LastAtOrBeforePosIndex + 1;
3080b57cec5SDimitry Andric 
3090b57cec5SDimitry Andric     // Try to decompose it into smaller constants.
3100b57cec5SDimitry Andric     if (!split(LastAtOrBeforePosIndex, Pos))
311bdd1243dSDimitry Andric       return std::nullopt;
3120b57cec5SDimitry Andric   }
3130b57cec5SDimitry Andric }
3140b57cec5SDimitry Andric 
3150b57cec5SDimitry Andric /// Split the constant at index Index, if possible. Return true if we did.
3160b57cec5SDimitry Andric /// Hint indicates the location at which we'd like to split, but may be
3170b57cec5SDimitry Andric /// ignored.
3180b57cec5SDimitry Andric bool ConstantAggregateBuilder::split(size_t Index, CharUnits Hint) {
3190b57cec5SDimitry Andric   NaturalLayout = false;
3200b57cec5SDimitry Andric   llvm::Constant *C = Elems[Index];
3210b57cec5SDimitry Andric   CharUnits Offset = Offsets[Index];
3220b57cec5SDimitry Andric 
3230b57cec5SDimitry Andric   if (auto *CA = dyn_cast<llvm::ConstantAggregate>(C)) {
3245ffd83dbSDimitry Andric     // Expand the sequence into its contained elements.
3255ffd83dbSDimitry Andric     // FIXME: This assumes vector elements are byte-sized.
3260b57cec5SDimitry Andric     replace(Elems, Index, Index + 1,
3270b57cec5SDimitry Andric             llvm::map_range(llvm::seq(0u, CA->getNumOperands()),
3280b57cec5SDimitry Andric                             [&](unsigned Op) { return CA->getOperand(Op); }));
3295ffd83dbSDimitry Andric     if (isa<llvm::ArrayType>(CA->getType()) ||
3305ffd83dbSDimitry Andric         isa<llvm::VectorType>(CA->getType())) {
3310b57cec5SDimitry Andric       // Array or vector.
3325ffd83dbSDimitry Andric       llvm::Type *ElemTy =
3335ffd83dbSDimitry Andric           llvm::GetElementPtrInst::getTypeAtIndex(CA->getType(), (uint64_t)0);
3345ffd83dbSDimitry Andric       CharUnits ElemSize = getSize(ElemTy);
3350b57cec5SDimitry Andric       replace(
3360b57cec5SDimitry Andric           Offsets, Index, Index + 1,
3370b57cec5SDimitry Andric           llvm::map_range(llvm::seq(0u, CA->getNumOperands()),
3380b57cec5SDimitry Andric                           [&](unsigned Op) { return Offset + Op * ElemSize; }));
3390b57cec5SDimitry Andric     } else {
3400b57cec5SDimitry Andric       // Must be a struct.
3410b57cec5SDimitry Andric       auto *ST = cast<llvm::StructType>(CA->getType());
3420b57cec5SDimitry Andric       const llvm::StructLayout *Layout =
3430b57cec5SDimitry Andric           CGM.getDataLayout().getStructLayout(ST);
3440b57cec5SDimitry Andric       replace(Offsets, Index, Index + 1,
3450b57cec5SDimitry Andric               llvm::map_range(
3460b57cec5SDimitry Andric                   llvm::seq(0u, CA->getNumOperands()), [&](unsigned Op) {
3470b57cec5SDimitry Andric                     return Offset + CharUnits::fromQuantity(
3480b57cec5SDimitry Andric                                         Layout->getElementOffset(Op));
3490b57cec5SDimitry Andric                   }));
3500b57cec5SDimitry Andric     }
3510b57cec5SDimitry Andric     return true;
3520b57cec5SDimitry Andric   }
3530b57cec5SDimitry Andric 
3540b57cec5SDimitry Andric   if (auto *CDS = dyn_cast<llvm::ConstantDataSequential>(C)) {
3555ffd83dbSDimitry Andric     // Expand the sequence into its contained elements.
3565ffd83dbSDimitry Andric     // FIXME: This assumes vector elements are byte-sized.
3570b57cec5SDimitry Andric     // FIXME: If possible, split into two ConstantDataSequentials at Hint.
3580b57cec5SDimitry Andric     CharUnits ElemSize = getSize(CDS->getElementType());
3590b57cec5SDimitry Andric     replace(Elems, Index, Index + 1,
3600b57cec5SDimitry Andric             llvm::map_range(llvm::seq(0u, CDS->getNumElements()),
3610b57cec5SDimitry Andric                             [&](unsigned Elem) {
3620b57cec5SDimitry Andric                               return CDS->getElementAsConstant(Elem);
3630b57cec5SDimitry Andric                             }));
3640b57cec5SDimitry Andric     replace(Offsets, Index, Index + 1,
3650b57cec5SDimitry Andric             llvm::map_range(
3660b57cec5SDimitry Andric                 llvm::seq(0u, CDS->getNumElements()),
3670b57cec5SDimitry Andric                 [&](unsigned Elem) { return Offset + Elem * ElemSize; }));
3680b57cec5SDimitry Andric     return true;
3690b57cec5SDimitry Andric   }
3700b57cec5SDimitry Andric 
3710b57cec5SDimitry Andric   if (isa<llvm::ConstantAggregateZero>(C)) {
3725ffd83dbSDimitry Andric     // Split into two zeros at the hinted offset.
3730b57cec5SDimitry Andric     CharUnits ElemSize = getSize(C);
3740b57cec5SDimitry Andric     assert(Hint > Offset && Hint < Offset + ElemSize && "nothing to split");
3750b57cec5SDimitry Andric     replace(Elems, Index, Index + 1,
3760b57cec5SDimitry Andric             {getZeroes(Hint - Offset), getZeroes(Offset + ElemSize - Hint)});
3770b57cec5SDimitry Andric     replace(Offsets, Index, Index + 1, {Offset, Hint});
3780b57cec5SDimitry Andric     return true;
3790b57cec5SDimitry Andric   }
3800b57cec5SDimitry Andric 
3810b57cec5SDimitry Andric   if (isa<llvm::UndefValue>(C)) {
3825ffd83dbSDimitry Andric     // Drop undef; it doesn't contribute to the final layout.
3830b57cec5SDimitry Andric     replace(Elems, Index, Index + 1, {});
3840b57cec5SDimitry Andric     replace(Offsets, Index, Index + 1, {});
3850b57cec5SDimitry Andric     return true;
3860b57cec5SDimitry Andric   }
3870b57cec5SDimitry Andric 
3880b57cec5SDimitry Andric   // FIXME: We could split a ConstantInt if the need ever arose.
3890b57cec5SDimitry Andric   // We don't need to do this to handle bit-fields because we always eagerly
3900b57cec5SDimitry Andric   // split them into 1-byte chunks.
3910b57cec5SDimitry Andric 
3920b57cec5SDimitry Andric   return false;
3930b57cec5SDimitry Andric }
3940b57cec5SDimitry Andric 
3950b57cec5SDimitry Andric static llvm::Constant *
3960b57cec5SDimitry Andric EmitArrayConstant(CodeGenModule &CGM, llvm::ArrayType *DesiredType,
397*0fca6ea1SDimitry Andric                   llvm::Type *CommonElementType, uint64_t ArrayBound,
3980b57cec5SDimitry Andric                   SmallVectorImpl<llvm::Constant *> &Elements,
3990b57cec5SDimitry Andric                   llvm::Constant *Filler);
4000b57cec5SDimitry Andric 
4010b57cec5SDimitry Andric llvm::Constant *ConstantAggregateBuilder::buildFrom(
4020b57cec5SDimitry Andric     CodeGenModule &CGM, ArrayRef<llvm::Constant *> Elems,
4030b57cec5SDimitry Andric     ArrayRef<CharUnits> Offsets, CharUnits StartOffset, CharUnits Size,
4040b57cec5SDimitry Andric     bool NaturalLayout, llvm::Type *DesiredTy, bool AllowOversized) {
4050b57cec5SDimitry Andric   ConstantAggregateBuilderUtils Utils(CGM);
4060b57cec5SDimitry Andric 
4070b57cec5SDimitry Andric   if (Elems.empty())
4080b57cec5SDimitry Andric     return llvm::UndefValue::get(DesiredTy);
4090b57cec5SDimitry Andric 
4100b57cec5SDimitry Andric   auto Offset = [&](size_t I) { return Offsets[I] - StartOffset; };
4110b57cec5SDimitry Andric 
4120b57cec5SDimitry Andric   // If we want an array type, see if all the elements are the same type and
4130b57cec5SDimitry Andric   // appropriately spaced.
4140b57cec5SDimitry Andric   if (llvm::ArrayType *ATy = dyn_cast<llvm::ArrayType>(DesiredTy)) {
4150b57cec5SDimitry Andric     assert(!AllowOversized && "oversized array emission not supported");
4160b57cec5SDimitry Andric 
4170b57cec5SDimitry Andric     bool CanEmitArray = true;
4180b57cec5SDimitry Andric     llvm::Type *CommonType = Elems[0]->getType();
4190b57cec5SDimitry Andric     llvm::Constant *Filler = llvm::Constant::getNullValue(CommonType);
4200b57cec5SDimitry Andric     CharUnits ElemSize = Utils.getSize(ATy->getElementType());
4210b57cec5SDimitry Andric     SmallVector<llvm::Constant*, 32> ArrayElements;
4220b57cec5SDimitry Andric     for (size_t I = 0; I != Elems.size(); ++I) {
4230b57cec5SDimitry Andric       // Skip zeroes; we'll use a zero value as our array filler.
4240b57cec5SDimitry Andric       if (Elems[I]->isNullValue())
4250b57cec5SDimitry Andric         continue;
4260b57cec5SDimitry Andric 
4270b57cec5SDimitry Andric       // All remaining elements must be the same type.
4280b57cec5SDimitry Andric       if (Elems[I]->getType() != CommonType ||
4290b57cec5SDimitry Andric           Offset(I) % ElemSize != 0) {
4300b57cec5SDimitry Andric         CanEmitArray = false;
4310b57cec5SDimitry Andric         break;
4320b57cec5SDimitry Andric       }
4330b57cec5SDimitry Andric       ArrayElements.resize(Offset(I) / ElemSize + 1, Filler);
4340b57cec5SDimitry Andric       ArrayElements.back() = Elems[I];
4350b57cec5SDimitry Andric     }
4360b57cec5SDimitry Andric 
4370b57cec5SDimitry Andric     if (CanEmitArray) {
4380b57cec5SDimitry Andric       return EmitArrayConstant(CGM, ATy, CommonType, ATy->getNumElements(),
4390b57cec5SDimitry Andric                                ArrayElements, Filler);
4400b57cec5SDimitry Andric     }
4410b57cec5SDimitry Andric 
4420b57cec5SDimitry Andric     // Can't emit as an array, carry on to emit as a struct.
4430b57cec5SDimitry Andric   }
4440b57cec5SDimitry Andric 
44581ad6265SDimitry Andric   // The size of the constant we plan to generate.  This is usually just
44681ad6265SDimitry Andric   // the size of the initialized type, but in AllowOversized mode (i.e.
44781ad6265SDimitry Andric   // flexible array init), it can be larger.
4480b57cec5SDimitry Andric   CharUnits DesiredSize = Utils.getSize(DesiredTy);
44981ad6265SDimitry Andric   if (Size > DesiredSize) {
45081ad6265SDimitry Andric     assert(AllowOversized && "Elems are oversized");
45181ad6265SDimitry Andric     DesiredSize = Size;
45281ad6265SDimitry Andric   }
45381ad6265SDimitry Andric 
45481ad6265SDimitry Andric   // The natural alignment of an unpacked LLVM struct with the given elements.
4550b57cec5SDimitry Andric   CharUnits Align = CharUnits::One();
4560b57cec5SDimitry Andric   for (llvm::Constant *C : Elems)
4570b57cec5SDimitry Andric     Align = std::max(Align, Utils.getAlignment(C));
45881ad6265SDimitry Andric 
45981ad6265SDimitry Andric   // The natural size of an unpacked LLVM struct with the given elements.
4600b57cec5SDimitry Andric   CharUnits AlignedSize = Size.alignTo(Align);
4610b57cec5SDimitry Andric 
4620b57cec5SDimitry Andric   bool Packed = false;
4630b57cec5SDimitry Andric   ArrayRef<llvm::Constant*> UnpackedElems = Elems;
4640b57cec5SDimitry Andric   llvm::SmallVector<llvm::Constant*, 32> UnpackedElemStorage;
46581ad6265SDimitry Andric   if (DesiredSize < AlignedSize || DesiredSize.alignTo(Align) != DesiredSize) {
46681ad6265SDimitry Andric     // The natural layout would be too big; force use of a packed layout.
4670b57cec5SDimitry Andric     NaturalLayout = false;
4680b57cec5SDimitry Andric     Packed = true;
4690b57cec5SDimitry Andric   } else if (DesiredSize > AlignedSize) {
47081ad6265SDimitry Andric     // The natural layout would be too small. Add padding to fix it. (This
47181ad6265SDimitry Andric     // is ignored if we choose a packed layout.)
4720b57cec5SDimitry Andric     UnpackedElemStorage.assign(Elems.begin(), Elems.end());
4730b57cec5SDimitry Andric     UnpackedElemStorage.push_back(Utils.getPadding(DesiredSize - Size));
4740b57cec5SDimitry Andric     UnpackedElems = UnpackedElemStorage;
4750b57cec5SDimitry Andric   }
4760b57cec5SDimitry Andric 
4770b57cec5SDimitry Andric   // If we don't have a natural layout, insert padding as necessary.
4780b57cec5SDimitry Andric   // As we go, double-check to see if we can actually just emit Elems
4790b57cec5SDimitry Andric   // as a non-packed struct and do so opportunistically if possible.
4800b57cec5SDimitry Andric   llvm::SmallVector<llvm::Constant*, 32> PackedElems;
4810b57cec5SDimitry Andric   if (!NaturalLayout) {
4820b57cec5SDimitry Andric     CharUnits SizeSoFar = CharUnits::Zero();
4830b57cec5SDimitry Andric     for (size_t I = 0; I != Elems.size(); ++I) {
4840b57cec5SDimitry Andric       CharUnits Align = Utils.getAlignment(Elems[I]);
4850b57cec5SDimitry Andric       CharUnits NaturalOffset = SizeSoFar.alignTo(Align);
4860b57cec5SDimitry Andric       CharUnits DesiredOffset = Offset(I);
4870b57cec5SDimitry Andric       assert(DesiredOffset >= SizeSoFar && "elements out of order");
4880b57cec5SDimitry Andric 
4890b57cec5SDimitry Andric       if (DesiredOffset != NaturalOffset)
4900b57cec5SDimitry Andric         Packed = true;
4910b57cec5SDimitry Andric       if (DesiredOffset != SizeSoFar)
4920b57cec5SDimitry Andric         PackedElems.push_back(Utils.getPadding(DesiredOffset - SizeSoFar));
4930b57cec5SDimitry Andric       PackedElems.push_back(Elems[I]);
4940b57cec5SDimitry Andric       SizeSoFar = DesiredOffset + Utils.getSize(Elems[I]);
4950b57cec5SDimitry Andric     }
4960b57cec5SDimitry Andric     // If we're using the packed layout, pad it out to the desired size if
4970b57cec5SDimitry Andric     // necessary.
4980b57cec5SDimitry Andric     if (Packed) {
49981ad6265SDimitry Andric       assert(SizeSoFar <= DesiredSize &&
5000b57cec5SDimitry Andric              "requested size is too small for contents");
5010b57cec5SDimitry Andric       if (SizeSoFar < DesiredSize)
5020b57cec5SDimitry Andric         PackedElems.push_back(Utils.getPadding(DesiredSize - SizeSoFar));
5030b57cec5SDimitry Andric     }
5040b57cec5SDimitry Andric   }
5050b57cec5SDimitry Andric 
5060b57cec5SDimitry Andric   llvm::StructType *STy = llvm::ConstantStruct::getTypeForElements(
5070b57cec5SDimitry Andric       CGM.getLLVMContext(), Packed ? PackedElems : UnpackedElems, Packed);
5080b57cec5SDimitry Andric 
5090b57cec5SDimitry Andric   // Pick the type to use.  If the type is layout identical to the desired
5100b57cec5SDimitry Andric   // type then use it, otherwise use whatever the builder produced for us.
5110b57cec5SDimitry Andric   if (llvm::StructType *DesiredSTy = dyn_cast<llvm::StructType>(DesiredTy)) {
5120b57cec5SDimitry Andric     if (DesiredSTy->isLayoutIdentical(STy))
5130b57cec5SDimitry Andric       STy = DesiredSTy;
5140b57cec5SDimitry Andric   }
5150b57cec5SDimitry Andric 
5160b57cec5SDimitry Andric   return llvm::ConstantStruct::get(STy, Packed ? PackedElems : UnpackedElems);
5170b57cec5SDimitry Andric }
5180b57cec5SDimitry Andric 
5190b57cec5SDimitry Andric void ConstantAggregateBuilder::condense(CharUnits Offset,
5200b57cec5SDimitry Andric                                         llvm::Type *DesiredTy) {
5210b57cec5SDimitry Andric   CharUnits Size = getSize(DesiredTy);
5220b57cec5SDimitry Andric 
523bdd1243dSDimitry Andric   std::optional<size_t> FirstElemToReplace = splitAt(Offset);
5240b57cec5SDimitry Andric   if (!FirstElemToReplace)
5250b57cec5SDimitry Andric     return;
5260b57cec5SDimitry Andric   size_t First = *FirstElemToReplace;
5270b57cec5SDimitry Andric 
528bdd1243dSDimitry Andric   std::optional<size_t> LastElemToReplace = splitAt(Offset + Size);
5290b57cec5SDimitry Andric   if (!LastElemToReplace)
5300b57cec5SDimitry Andric     return;
5310b57cec5SDimitry Andric   size_t Last = *LastElemToReplace;
5320b57cec5SDimitry Andric 
5330b57cec5SDimitry Andric   size_t Length = Last - First;
5340b57cec5SDimitry Andric   if (Length == 0)
5350b57cec5SDimitry Andric     return;
5360b57cec5SDimitry Andric 
5370b57cec5SDimitry Andric   if (Length == 1 && Offsets[First] == Offset &&
5380b57cec5SDimitry Andric       getSize(Elems[First]) == Size) {
5390b57cec5SDimitry Andric     // Re-wrap single element structs if necessary. Otherwise, leave any single
5400b57cec5SDimitry Andric     // element constant of the right size alone even if it has the wrong type.
5410b57cec5SDimitry Andric     auto *STy = dyn_cast<llvm::StructType>(DesiredTy);
5420b57cec5SDimitry Andric     if (STy && STy->getNumElements() == 1 &&
5430b57cec5SDimitry Andric         STy->getElementType(0) == Elems[First]->getType())
5440b57cec5SDimitry Andric       Elems[First] = llvm::ConstantStruct::get(STy, Elems[First]);
5450b57cec5SDimitry Andric     return;
5460b57cec5SDimitry Andric   }
5470b57cec5SDimitry Andric 
5480b57cec5SDimitry Andric   llvm::Constant *Replacement = buildFrom(
549bdd1243dSDimitry Andric       CGM, ArrayRef(Elems).slice(First, Length),
550bdd1243dSDimitry Andric       ArrayRef(Offsets).slice(First, Length), Offset, getSize(DesiredTy),
5510b57cec5SDimitry Andric       /*known to have natural layout=*/false, DesiredTy, false);
5520b57cec5SDimitry Andric   replace(Elems, First, Last, {Replacement});
5530b57cec5SDimitry Andric   replace(Offsets, First, Last, {Offset});
5540b57cec5SDimitry Andric }
5550b57cec5SDimitry Andric 
5560b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5570b57cec5SDimitry Andric //                            ConstStructBuilder
5580b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5590b57cec5SDimitry Andric 
5600b57cec5SDimitry Andric class ConstStructBuilder {
5610b57cec5SDimitry Andric   CodeGenModule &CGM;
5620b57cec5SDimitry Andric   ConstantEmitter &Emitter;
5630b57cec5SDimitry Andric   ConstantAggregateBuilder &Builder;
5640b57cec5SDimitry Andric   CharUnits StartOffset;
5650b57cec5SDimitry Andric 
5660b57cec5SDimitry Andric public:
5670b57cec5SDimitry Andric   static llvm::Constant *BuildStruct(ConstantEmitter &Emitter,
568*0fca6ea1SDimitry Andric                                      const InitListExpr *ILE,
569*0fca6ea1SDimitry Andric                                      QualType StructTy);
5700b57cec5SDimitry Andric   static llvm::Constant *BuildStruct(ConstantEmitter &Emitter,
5710b57cec5SDimitry Andric                                      const APValue &Value, QualType ValTy);
5720b57cec5SDimitry Andric   static bool UpdateStruct(ConstantEmitter &Emitter,
5730b57cec5SDimitry Andric                            ConstantAggregateBuilder &Const, CharUnits Offset,
574*0fca6ea1SDimitry Andric                            const InitListExpr *Updater);
5750b57cec5SDimitry Andric 
5760b57cec5SDimitry Andric private:
5770b57cec5SDimitry Andric   ConstStructBuilder(ConstantEmitter &Emitter,
5780b57cec5SDimitry Andric                      ConstantAggregateBuilder &Builder, CharUnits StartOffset)
5790b57cec5SDimitry Andric       : CGM(Emitter.CGM), Emitter(Emitter), Builder(Builder),
5800b57cec5SDimitry Andric         StartOffset(StartOffset) {}
5810b57cec5SDimitry Andric 
5820b57cec5SDimitry Andric   bool AppendField(const FieldDecl *Field, uint64_t FieldOffset,
5830b57cec5SDimitry Andric                    llvm::Constant *InitExpr, bool AllowOverwrite = false);
5840b57cec5SDimitry Andric 
5850b57cec5SDimitry Andric   bool AppendBytes(CharUnits FieldOffsetInChars, llvm::Constant *InitCst,
5860b57cec5SDimitry Andric                    bool AllowOverwrite = false);
5870b57cec5SDimitry Andric 
5880b57cec5SDimitry Andric   bool AppendBitField(const FieldDecl *Field, uint64_t FieldOffset,
589*0fca6ea1SDimitry Andric                       llvm::Constant *InitExpr, bool AllowOverwrite = false);
5900b57cec5SDimitry Andric 
591*0fca6ea1SDimitry Andric   bool Build(const InitListExpr *ILE, bool AllowOverwrite);
5920b57cec5SDimitry Andric   bool Build(const APValue &Val, const RecordDecl *RD, bool IsPrimaryBase,
5930b57cec5SDimitry Andric              const CXXRecordDecl *VTableClass, CharUnits BaseOffset);
5940b57cec5SDimitry Andric   llvm::Constant *Finalize(QualType Ty);
5950b57cec5SDimitry Andric };
5960b57cec5SDimitry Andric 
5970b57cec5SDimitry Andric bool ConstStructBuilder::AppendField(
5980b57cec5SDimitry Andric     const FieldDecl *Field, uint64_t FieldOffset, llvm::Constant *InitCst,
5990b57cec5SDimitry Andric     bool AllowOverwrite) {
6000b57cec5SDimitry Andric   const ASTContext &Context = CGM.getContext();
6010b57cec5SDimitry Andric 
6020b57cec5SDimitry Andric   CharUnits FieldOffsetInChars = Context.toCharUnitsFromBits(FieldOffset);
6030b57cec5SDimitry Andric 
6040b57cec5SDimitry Andric   return AppendBytes(FieldOffsetInChars, InitCst, AllowOverwrite);
6050b57cec5SDimitry Andric }
6060b57cec5SDimitry Andric 
6070b57cec5SDimitry Andric bool ConstStructBuilder::AppendBytes(CharUnits FieldOffsetInChars,
6080b57cec5SDimitry Andric                                      llvm::Constant *InitCst,
6090b57cec5SDimitry Andric                                      bool AllowOverwrite) {
6100b57cec5SDimitry Andric   return Builder.add(InitCst, StartOffset + FieldOffsetInChars, AllowOverwrite);
6110b57cec5SDimitry Andric }
6120b57cec5SDimitry Andric 
613*0fca6ea1SDimitry Andric bool ConstStructBuilder::AppendBitField(const FieldDecl *Field,
614*0fca6ea1SDimitry Andric                                         uint64_t FieldOffset, llvm::Constant *C,
6150b57cec5SDimitry Andric                                         bool AllowOverwrite) {
616*0fca6ea1SDimitry Andric 
617*0fca6ea1SDimitry Andric   llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(C);
618*0fca6ea1SDimitry Andric   if (!CI) {
619*0fca6ea1SDimitry Andric     // Constants for long _BitInt types are sometimes split into individual
620*0fca6ea1SDimitry Andric     // bytes. Try to fold these back into an integer constant. If that doesn't
621*0fca6ea1SDimitry Andric     // work out, then we are trying to initialize a bitfield with a non-trivial
622*0fca6ea1SDimitry Andric     // constant, this must require run-time code.
623*0fca6ea1SDimitry Andric     llvm::Type *LoadType =
624*0fca6ea1SDimitry Andric         CGM.getTypes().convertTypeForLoadStore(Field->getType(), C->getType());
625*0fca6ea1SDimitry Andric     llvm::Constant *FoldedConstant = llvm::ConstantFoldLoadFromConst(
626*0fca6ea1SDimitry Andric         C, LoadType, llvm::APInt::getZero(32), CGM.getDataLayout());
627*0fca6ea1SDimitry Andric     CI = dyn_cast_if_present<llvm::ConstantInt>(FoldedConstant);
628*0fca6ea1SDimitry Andric     if (!CI)
629*0fca6ea1SDimitry Andric       return false;
630*0fca6ea1SDimitry Andric   }
631*0fca6ea1SDimitry Andric 
6325ffd83dbSDimitry Andric   const CGRecordLayout &RL =
6335ffd83dbSDimitry Andric       CGM.getTypes().getCGRecordLayout(Field->getParent());
6345ffd83dbSDimitry Andric   const CGBitFieldInfo &Info = RL.getBitFieldInfo(Field);
6350b57cec5SDimitry Andric   llvm::APInt FieldValue = CI->getValue();
6360b57cec5SDimitry Andric 
6370b57cec5SDimitry Andric   // Promote the size of FieldValue if necessary
6380b57cec5SDimitry Andric   // FIXME: This should never occur, but currently it can because initializer
6390b57cec5SDimitry Andric   // constants are cast to bool, and because clang is not enforcing bitfield
6400b57cec5SDimitry Andric   // width limits.
6415ffd83dbSDimitry Andric   if (Info.Size > FieldValue.getBitWidth())
6425ffd83dbSDimitry Andric     FieldValue = FieldValue.zext(Info.Size);
6430b57cec5SDimitry Andric 
6440b57cec5SDimitry Andric   // Truncate the size of FieldValue to the bit field size.
6455ffd83dbSDimitry Andric   if (Info.Size < FieldValue.getBitWidth())
6465ffd83dbSDimitry Andric     FieldValue = FieldValue.trunc(Info.Size);
6470b57cec5SDimitry Andric 
6480b57cec5SDimitry Andric   return Builder.addBits(FieldValue,
6490b57cec5SDimitry Andric                          CGM.getContext().toBits(StartOffset) + FieldOffset,
6500b57cec5SDimitry Andric                          AllowOverwrite);
6510b57cec5SDimitry Andric }
6520b57cec5SDimitry Andric 
6530b57cec5SDimitry Andric static bool EmitDesignatedInitUpdater(ConstantEmitter &Emitter,
6540b57cec5SDimitry Andric                                       ConstantAggregateBuilder &Const,
6550b57cec5SDimitry Andric                                       CharUnits Offset, QualType Type,
656*0fca6ea1SDimitry Andric                                       const InitListExpr *Updater) {
6570b57cec5SDimitry Andric   if (Type->isRecordType())
6580b57cec5SDimitry Andric     return ConstStructBuilder::UpdateStruct(Emitter, Const, Offset, Updater);
6590b57cec5SDimitry Andric 
6600b57cec5SDimitry Andric   auto CAT = Emitter.CGM.getContext().getAsConstantArrayType(Type);
6610b57cec5SDimitry Andric   if (!CAT)
6620b57cec5SDimitry Andric     return false;
6630b57cec5SDimitry Andric   QualType ElemType = CAT->getElementType();
6640b57cec5SDimitry Andric   CharUnits ElemSize = Emitter.CGM.getContext().getTypeSizeInChars(ElemType);
6650b57cec5SDimitry Andric   llvm::Type *ElemTy = Emitter.CGM.getTypes().ConvertTypeForMem(ElemType);
6660b57cec5SDimitry Andric 
6670b57cec5SDimitry Andric   llvm::Constant *FillC = nullptr;
668*0fca6ea1SDimitry Andric   if (const Expr *Filler = Updater->getArrayFiller()) {
6690b57cec5SDimitry Andric     if (!isa<NoInitExpr>(Filler)) {
6700b57cec5SDimitry Andric       FillC = Emitter.tryEmitAbstractForMemory(Filler, ElemType);
6710b57cec5SDimitry Andric       if (!FillC)
6720b57cec5SDimitry Andric         return false;
6730b57cec5SDimitry Andric     }
6740b57cec5SDimitry Andric   }
6750b57cec5SDimitry Andric 
6760b57cec5SDimitry Andric   unsigned NumElementsToUpdate =
677*0fca6ea1SDimitry Andric       FillC ? CAT->getZExtSize() : Updater->getNumInits();
6780b57cec5SDimitry Andric   for (unsigned I = 0; I != NumElementsToUpdate; ++I, Offset += ElemSize) {
679*0fca6ea1SDimitry Andric     const Expr *Init = nullptr;
6800b57cec5SDimitry Andric     if (I < Updater->getNumInits())
6810b57cec5SDimitry Andric       Init = Updater->getInit(I);
6820b57cec5SDimitry Andric 
6830b57cec5SDimitry Andric     if (!Init && FillC) {
6840b57cec5SDimitry Andric       if (!Const.add(FillC, Offset, true))
6850b57cec5SDimitry Andric         return false;
6860b57cec5SDimitry Andric     } else if (!Init || isa<NoInitExpr>(Init)) {
6870b57cec5SDimitry Andric       continue;
688*0fca6ea1SDimitry Andric     } else if (const auto *ChildILE = dyn_cast<InitListExpr>(Init)) {
6890b57cec5SDimitry Andric       if (!EmitDesignatedInitUpdater(Emitter, Const, Offset, ElemType,
6900b57cec5SDimitry Andric                                      ChildILE))
6910b57cec5SDimitry Andric         return false;
6920b57cec5SDimitry Andric       // Attempt to reduce the array element to a single constant if necessary.
6930b57cec5SDimitry Andric       Const.condense(Offset, ElemTy);
6940b57cec5SDimitry Andric     } else {
6950b57cec5SDimitry Andric       llvm::Constant *Val = Emitter.tryEmitPrivateForMemory(Init, ElemType);
6960b57cec5SDimitry Andric       if (!Const.add(Val, Offset, true))
6970b57cec5SDimitry Andric         return false;
6980b57cec5SDimitry Andric     }
6990b57cec5SDimitry Andric   }
7000b57cec5SDimitry Andric 
7010b57cec5SDimitry Andric   return true;
7020b57cec5SDimitry Andric }
7030b57cec5SDimitry Andric 
704*0fca6ea1SDimitry Andric bool ConstStructBuilder::Build(const InitListExpr *ILE, bool AllowOverwrite) {
705a7dea167SDimitry Andric   RecordDecl *RD = ILE->getType()->castAs<RecordType>()->getDecl();
7060b57cec5SDimitry Andric   const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
7070b57cec5SDimitry Andric 
7080b57cec5SDimitry Andric   unsigned FieldNo = -1;
7090b57cec5SDimitry Andric   unsigned ElementNo = 0;
7100b57cec5SDimitry Andric 
7110b57cec5SDimitry Andric   // Bail out if we have base classes. We could support these, but they only
7120b57cec5SDimitry Andric   // arise in C++1z where we will have already constant folded most interesting
7130b57cec5SDimitry Andric   // cases. FIXME: There are still a few more cases we can handle this way.
7140b57cec5SDimitry Andric   if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
7150b57cec5SDimitry Andric     if (CXXRD->getNumBases())
7160b57cec5SDimitry Andric       return false;
7170b57cec5SDimitry Andric 
7180b57cec5SDimitry Andric   for (FieldDecl *Field : RD->fields()) {
7190b57cec5SDimitry Andric     ++FieldNo;
7200b57cec5SDimitry Andric 
7210b57cec5SDimitry Andric     // If this is a union, skip all the fields that aren't being initialized.
7220b57cec5SDimitry Andric     if (RD->isUnion() &&
7230b57cec5SDimitry Andric         !declaresSameEntity(ILE->getInitializedFieldInUnion(), Field))
7240b57cec5SDimitry Andric       continue;
7250b57cec5SDimitry Andric 
72681ad6265SDimitry Andric     // Don't emit anonymous bitfields.
727*0fca6ea1SDimitry Andric     if (Field->isUnnamedBitField())
7280b57cec5SDimitry Andric       continue;
7290b57cec5SDimitry Andric 
7300b57cec5SDimitry Andric     // Get the initializer.  A struct can include fields without initializers,
7310b57cec5SDimitry Andric     // we just use explicit null values for them.
732*0fca6ea1SDimitry Andric     const Expr *Init = nullptr;
7330b57cec5SDimitry Andric     if (ElementNo < ILE->getNumInits())
7340b57cec5SDimitry Andric       Init = ILE->getInit(ElementNo++);
735*0fca6ea1SDimitry Andric     if (isa_and_nonnull<NoInitExpr>(Init))
7360b57cec5SDimitry Andric       continue;
7370b57cec5SDimitry Andric 
73881ad6265SDimitry Andric     // Zero-sized fields are not emitted, but their initializers may still
73981ad6265SDimitry Andric     // prevent emission of this struct as a constant.
740*0fca6ea1SDimitry Andric     if (isEmptyFieldForLayout(CGM.getContext(), Field)) {
74181ad6265SDimitry Andric       if (Init->HasSideEffects(CGM.getContext()))
74281ad6265SDimitry Andric         return false;
74381ad6265SDimitry Andric       continue;
74481ad6265SDimitry Andric     }
74581ad6265SDimitry Andric 
7460b57cec5SDimitry Andric     // When emitting a DesignatedInitUpdateExpr, a nested InitListExpr
7470b57cec5SDimitry Andric     // represents additional overwriting of our current constant value, and not
7480b57cec5SDimitry Andric     // a new constant to emit independently.
7490b57cec5SDimitry Andric     if (AllowOverwrite &&
7500b57cec5SDimitry Andric         (Field->getType()->isArrayType() || Field->getType()->isRecordType())) {
7510b57cec5SDimitry Andric       if (auto *SubILE = dyn_cast<InitListExpr>(Init)) {
7520b57cec5SDimitry Andric         CharUnits Offset = CGM.getContext().toCharUnitsFromBits(
7530b57cec5SDimitry Andric             Layout.getFieldOffset(FieldNo));
7540b57cec5SDimitry Andric         if (!EmitDesignatedInitUpdater(Emitter, Builder, StartOffset + Offset,
7550b57cec5SDimitry Andric                                        Field->getType(), SubILE))
7560b57cec5SDimitry Andric           return false;
7570b57cec5SDimitry Andric         // If we split apart the field's value, try to collapse it down to a
7580b57cec5SDimitry Andric         // single value now.
7590b57cec5SDimitry Andric         Builder.condense(StartOffset + Offset,
7600b57cec5SDimitry Andric                          CGM.getTypes().ConvertTypeForMem(Field->getType()));
7610b57cec5SDimitry Andric         continue;
7620b57cec5SDimitry Andric       }
7630b57cec5SDimitry Andric     }
7640b57cec5SDimitry Andric 
7650b57cec5SDimitry Andric     llvm::Constant *EltInit =
7660b57cec5SDimitry Andric         Init ? Emitter.tryEmitPrivateForMemory(Init, Field->getType())
7670b57cec5SDimitry Andric              : Emitter.emitNullForMemory(Field->getType());
7680b57cec5SDimitry Andric     if (!EltInit)
7690b57cec5SDimitry Andric       return false;
7700b57cec5SDimitry Andric 
7710b57cec5SDimitry Andric     if (!Field->isBitField()) {
7720b57cec5SDimitry Andric       // Handle non-bitfield members.
7730b57cec5SDimitry Andric       if (!AppendField(Field, Layout.getFieldOffset(FieldNo), EltInit,
7740b57cec5SDimitry Andric                        AllowOverwrite))
7750b57cec5SDimitry Andric         return false;
7760b57cec5SDimitry Andric       // After emitting a non-empty field with [[no_unique_address]], we may
7770b57cec5SDimitry Andric       // need to overwrite its tail padding.
7780b57cec5SDimitry Andric       if (Field->hasAttr<NoUniqueAddressAttr>())
7790b57cec5SDimitry Andric         AllowOverwrite = true;
7800b57cec5SDimitry Andric     } else {
7810b57cec5SDimitry Andric       // Otherwise we have a bitfield.
782*0fca6ea1SDimitry Andric       if (!AppendBitField(Field, Layout.getFieldOffset(FieldNo), EltInit,
7830b57cec5SDimitry Andric                           AllowOverwrite))
7840b57cec5SDimitry Andric         return false;
7850b57cec5SDimitry Andric     }
7860b57cec5SDimitry Andric   }
7870b57cec5SDimitry Andric 
7880b57cec5SDimitry Andric   return true;
7890b57cec5SDimitry Andric }
7900b57cec5SDimitry Andric 
7910b57cec5SDimitry Andric namespace {
7920b57cec5SDimitry Andric struct BaseInfo {
7930b57cec5SDimitry Andric   BaseInfo(const CXXRecordDecl *Decl, CharUnits Offset, unsigned Index)
7940b57cec5SDimitry Andric     : Decl(Decl), Offset(Offset), Index(Index) {
7950b57cec5SDimitry Andric   }
7960b57cec5SDimitry Andric 
7970b57cec5SDimitry Andric   const CXXRecordDecl *Decl;
7980b57cec5SDimitry Andric   CharUnits Offset;
7990b57cec5SDimitry Andric   unsigned Index;
8000b57cec5SDimitry Andric 
8010b57cec5SDimitry Andric   bool operator<(const BaseInfo &O) const { return Offset < O.Offset; }
8020b57cec5SDimitry Andric };
8030b57cec5SDimitry Andric }
8040b57cec5SDimitry Andric 
8050b57cec5SDimitry Andric bool ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
8060b57cec5SDimitry Andric                                bool IsPrimaryBase,
8070b57cec5SDimitry Andric                                const CXXRecordDecl *VTableClass,
8080b57cec5SDimitry Andric                                CharUnits Offset) {
8090b57cec5SDimitry Andric   const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
8100b57cec5SDimitry Andric 
8110b57cec5SDimitry Andric   if (const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD)) {
8120b57cec5SDimitry Andric     // Add a vtable pointer, if we need one and it hasn't already been added.
8135ffd83dbSDimitry Andric     if (Layout.hasOwnVFPtr()) {
8140b57cec5SDimitry Andric       llvm::Constant *VTableAddressPoint =
815*0fca6ea1SDimitry Andric           CGM.getCXXABI().getVTableAddressPoint(BaseSubobject(CD, Offset),
816*0fca6ea1SDimitry Andric                                                 VTableClass);
817*0fca6ea1SDimitry Andric       if (auto Authentication = CGM.getVTablePointerAuthentication(CD)) {
818*0fca6ea1SDimitry Andric         VTableAddressPoint = Emitter.tryEmitConstantSignedPointer(
819*0fca6ea1SDimitry Andric             VTableAddressPoint, *Authentication);
820*0fca6ea1SDimitry Andric         if (!VTableAddressPoint)
821*0fca6ea1SDimitry Andric           return false;
822*0fca6ea1SDimitry Andric       }
8230b57cec5SDimitry Andric       if (!AppendBytes(Offset, VTableAddressPoint))
8240b57cec5SDimitry Andric         return false;
8250b57cec5SDimitry Andric     }
8260b57cec5SDimitry Andric 
8270b57cec5SDimitry Andric     // Accumulate and sort bases, in order to visit them in address order, which
8280b57cec5SDimitry Andric     // may not be the same as declaration order.
8290b57cec5SDimitry Andric     SmallVector<BaseInfo, 8> Bases;
8300b57cec5SDimitry Andric     Bases.reserve(CD->getNumBases());
8310b57cec5SDimitry Andric     unsigned BaseNo = 0;
8320b57cec5SDimitry Andric     for (CXXRecordDecl::base_class_const_iterator Base = CD->bases_begin(),
8330b57cec5SDimitry Andric          BaseEnd = CD->bases_end(); Base != BaseEnd; ++Base, ++BaseNo) {
8340b57cec5SDimitry Andric       assert(!Base->isVirtual() && "should not have virtual bases here");
8350b57cec5SDimitry Andric       const CXXRecordDecl *BD = Base->getType()->getAsCXXRecordDecl();
8360b57cec5SDimitry Andric       CharUnits BaseOffset = Layout.getBaseClassOffset(BD);
8370b57cec5SDimitry Andric       Bases.push_back(BaseInfo(BD, BaseOffset, BaseNo));
8380b57cec5SDimitry Andric     }
8390b57cec5SDimitry Andric     llvm::stable_sort(Bases);
8400b57cec5SDimitry Andric 
8410b57cec5SDimitry Andric     for (unsigned I = 0, N = Bases.size(); I != N; ++I) {
8420b57cec5SDimitry Andric       BaseInfo &Base = Bases[I];
8430b57cec5SDimitry Andric 
8440b57cec5SDimitry Andric       bool IsPrimaryBase = Layout.getPrimaryBase() == Base.Decl;
8450b57cec5SDimitry Andric       Build(Val.getStructBase(Base.Index), Base.Decl, IsPrimaryBase,
8460b57cec5SDimitry Andric             VTableClass, Offset + Base.Offset);
8470b57cec5SDimitry Andric     }
8480b57cec5SDimitry Andric   }
8490b57cec5SDimitry Andric 
8500b57cec5SDimitry Andric   unsigned FieldNo = 0;
8510b57cec5SDimitry Andric   uint64_t OffsetBits = CGM.getContext().toBits(Offset);
8520b57cec5SDimitry Andric 
8530b57cec5SDimitry Andric   bool AllowOverwrite = false;
8540b57cec5SDimitry Andric   for (RecordDecl::field_iterator Field = RD->field_begin(),
8550b57cec5SDimitry Andric        FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {
8560b57cec5SDimitry Andric     // If this is a union, skip all the fields that aren't being initialized.
8570b57cec5SDimitry Andric     if (RD->isUnion() && !declaresSameEntity(Val.getUnionField(), *Field))
8580b57cec5SDimitry Andric       continue;
8590b57cec5SDimitry Andric 
8600b57cec5SDimitry Andric     // Don't emit anonymous bitfields or zero-sized fields.
861*0fca6ea1SDimitry Andric     if (Field->isUnnamedBitField() ||
862*0fca6ea1SDimitry Andric         isEmptyFieldForLayout(CGM.getContext(), *Field))
8630b57cec5SDimitry Andric       continue;
8640b57cec5SDimitry Andric 
8650b57cec5SDimitry Andric     // Emit the value of the initializer.
8660b57cec5SDimitry Andric     const APValue &FieldValue =
8670b57cec5SDimitry Andric       RD->isUnion() ? Val.getUnionValue() : Val.getStructField(FieldNo);
8680b57cec5SDimitry Andric     llvm::Constant *EltInit =
8690b57cec5SDimitry Andric       Emitter.tryEmitPrivateForMemory(FieldValue, Field->getType());
8700b57cec5SDimitry Andric     if (!EltInit)
8710b57cec5SDimitry Andric       return false;
8720b57cec5SDimitry Andric 
8730b57cec5SDimitry Andric     if (!Field->isBitField()) {
8740b57cec5SDimitry Andric       // Handle non-bitfield members.
8750b57cec5SDimitry Andric       if (!AppendField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits,
8760b57cec5SDimitry Andric                        EltInit, AllowOverwrite))
8770b57cec5SDimitry Andric         return false;
8780b57cec5SDimitry Andric       // After emitting a non-empty field with [[no_unique_address]], we may
8790b57cec5SDimitry Andric       // need to overwrite its tail padding.
8800b57cec5SDimitry Andric       if (Field->hasAttr<NoUniqueAddressAttr>())
8810b57cec5SDimitry Andric         AllowOverwrite = true;
8820b57cec5SDimitry Andric     } else {
8830b57cec5SDimitry Andric       // Otherwise we have a bitfield.
8840b57cec5SDimitry Andric       if (!AppendBitField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits,
885*0fca6ea1SDimitry Andric                           EltInit, AllowOverwrite))
8860b57cec5SDimitry Andric         return false;
8870b57cec5SDimitry Andric     }
8880b57cec5SDimitry Andric   }
8890b57cec5SDimitry Andric 
8900b57cec5SDimitry Andric   return true;
8910b57cec5SDimitry Andric }
8920b57cec5SDimitry Andric 
8930b57cec5SDimitry Andric llvm::Constant *ConstStructBuilder::Finalize(QualType Type) {
8941fd87a68SDimitry Andric   Type = Type.getNonReferenceType();
895a7dea167SDimitry Andric   RecordDecl *RD = Type->castAs<RecordType>()->getDecl();
8960b57cec5SDimitry Andric   llvm::Type *ValTy = CGM.getTypes().ConvertType(Type);
8970b57cec5SDimitry Andric   return Builder.build(ValTy, RD->hasFlexibleArrayMember());
8980b57cec5SDimitry Andric }
8990b57cec5SDimitry Andric 
9000b57cec5SDimitry Andric llvm::Constant *ConstStructBuilder::BuildStruct(ConstantEmitter &Emitter,
901*0fca6ea1SDimitry Andric                                                 const InitListExpr *ILE,
9020b57cec5SDimitry Andric                                                 QualType ValTy) {
9030b57cec5SDimitry Andric   ConstantAggregateBuilder Const(Emitter.CGM);
9040b57cec5SDimitry Andric   ConstStructBuilder Builder(Emitter, Const, CharUnits::Zero());
9050b57cec5SDimitry Andric 
9060b57cec5SDimitry Andric   if (!Builder.Build(ILE, /*AllowOverwrite*/false))
9070b57cec5SDimitry Andric     return nullptr;
9080b57cec5SDimitry Andric 
9090b57cec5SDimitry Andric   return Builder.Finalize(ValTy);
9100b57cec5SDimitry Andric }
9110b57cec5SDimitry Andric 
9120b57cec5SDimitry Andric llvm::Constant *ConstStructBuilder::BuildStruct(ConstantEmitter &Emitter,
9130b57cec5SDimitry Andric                                                 const APValue &Val,
9140b57cec5SDimitry Andric                                                 QualType ValTy) {
9150b57cec5SDimitry Andric   ConstantAggregateBuilder Const(Emitter.CGM);
9160b57cec5SDimitry Andric   ConstStructBuilder Builder(Emitter, Const, CharUnits::Zero());
9170b57cec5SDimitry Andric 
9180b57cec5SDimitry Andric   const RecordDecl *RD = ValTy->castAs<RecordType>()->getDecl();
9190b57cec5SDimitry Andric   const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD);
9200b57cec5SDimitry Andric   if (!Builder.Build(Val, RD, false, CD, CharUnits::Zero()))
9210b57cec5SDimitry Andric     return nullptr;
9220b57cec5SDimitry Andric 
9230b57cec5SDimitry Andric   return Builder.Finalize(ValTy);
9240b57cec5SDimitry Andric }
9250b57cec5SDimitry Andric 
9260b57cec5SDimitry Andric bool ConstStructBuilder::UpdateStruct(ConstantEmitter &Emitter,
9270b57cec5SDimitry Andric                                       ConstantAggregateBuilder &Const,
928*0fca6ea1SDimitry Andric                                       CharUnits Offset,
929*0fca6ea1SDimitry Andric                                       const InitListExpr *Updater) {
9300b57cec5SDimitry Andric   return ConstStructBuilder(Emitter, Const, Offset)
9310b57cec5SDimitry Andric       .Build(Updater, /*AllowOverwrite*/ true);
9320b57cec5SDimitry Andric }
9330b57cec5SDimitry Andric 
9340b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
9350b57cec5SDimitry Andric //                             ConstExprEmitter
9360b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
9370b57cec5SDimitry Andric 
938bdd1243dSDimitry Andric static ConstantAddress
939bdd1243dSDimitry Andric tryEmitGlobalCompoundLiteral(ConstantEmitter &emitter,
9400b57cec5SDimitry Andric                              const CompoundLiteralExpr *E) {
941bdd1243dSDimitry Andric   CodeGenModule &CGM = emitter.CGM;
9420b57cec5SDimitry Andric   CharUnits Align = CGM.getContext().getTypeAlignInChars(E->getType());
9430b57cec5SDimitry Andric   if (llvm::GlobalVariable *Addr =
9440b57cec5SDimitry Andric           CGM.getAddrOfConstantCompoundLiteralIfEmitted(E))
9450eae32dcSDimitry Andric     return ConstantAddress(Addr, Addr->getValueType(), Align);
9460b57cec5SDimitry Andric 
9470b57cec5SDimitry Andric   LangAS addressSpace = E->getType().getAddressSpace();
9480b57cec5SDimitry Andric   llvm::Constant *C = emitter.tryEmitForInitializer(E->getInitializer(),
9490b57cec5SDimitry Andric                                                     addressSpace, E->getType());
9500b57cec5SDimitry Andric   if (!C) {
9510b57cec5SDimitry Andric     assert(!E->isFileScope() &&
9520b57cec5SDimitry Andric            "file-scope compound literal did not have constant initializer!");
9530b57cec5SDimitry Andric     return ConstantAddress::invalid();
9540b57cec5SDimitry Andric   }
9550b57cec5SDimitry Andric 
95606c3fb27SDimitry Andric   auto GV = new llvm::GlobalVariable(
95706c3fb27SDimitry Andric       CGM.getModule(), C->getType(),
9585f757f3fSDimitry Andric       E->getType().isConstantStorage(CGM.getContext(), true, false),
95906c3fb27SDimitry Andric       llvm::GlobalValue::InternalLinkage, C, ".compoundliteral", nullptr,
9600b57cec5SDimitry Andric       llvm::GlobalVariable::NotThreadLocal,
9610b57cec5SDimitry Andric       CGM.getContext().getTargetAddressSpace(addressSpace));
9620b57cec5SDimitry Andric   emitter.finalize(GV);
963a7dea167SDimitry Andric   GV->setAlignment(Align.getAsAlign());
9640b57cec5SDimitry Andric   CGM.setAddrOfConstantCompoundLiteral(E, GV);
9650eae32dcSDimitry Andric   return ConstantAddress(GV, GV->getValueType(), Align);
9660b57cec5SDimitry Andric }
9670b57cec5SDimitry Andric 
9680b57cec5SDimitry Andric static llvm::Constant *
9690b57cec5SDimitry Andric EmitArrayConstant(CodeGenModule &CGM, llvm::ArrayType *DesiredType,
970*0fca6ea1SDimitry Andric                   llvm::Type *CommonElementType, uint64_t ArrayBound,
9710b57cec5SDimitry Andric                   SmallVectorImpl<llvm::Constant *> &Elements,
9720b57cec5SDimitry Andric                   llvm::Constant *Filler) {
9730b57cec5SDimitry Andric   // Figure out how long the initial prefix of non-zero elements is.
974*0fca6ea1SDimitry Andric   uint64_t NonzeroLength = ArrayBound;
9750b57cec5SDimitry Andric   if (Elements.size() < NonzeroLength && Filler->isNullValue())
9760b57cec5SDimitry Andric     NonzeroLength = Elements.size();
9770b57cec5SDimitry Andric   if (NonzeroLength == Elements.size()) {
9780b57cec5SDimitry Andric     while (NonzeroLength > 0 && Elements[NonzeroLength - 1]->isNullValue())
9790b57cec5SDimitry Andric       --NonzeroLength;
9800b57cec5SDimitry Andric   }
9810b57cec5SDimitry Andric 
9820b57cec5SDimitry Andric   if (NonzeroLength == 0)
9830b57cec5SDimitry Andric     return llvm::ConstantAggregateZero::get(DesiredType);
9840b57cec5SDimitry Andric 
9850b57cec5SDimitry Andric   // Add a zeroinitializer array filler if we have lots of trailing zeroes.
986*0fca6ea1SDimitry Andric   uint64_t TrailingZeroes = ArrayBound - NonzeroLength;
9870b57cec5SDimitry Andric   if (TrailingZeroes >= 8) {
9880b57cec5SDimitry Andric     assert(Elements.size() >= NonzeroLength &&
9890b57cec5SDimitry Andric            "missing initializer for non-zero element");
9900b57cec5SDimitry Andric 
9910b57cec5SDimitry Andric     // If all the elements had the same type up to the trailing zeroes, emit a
9920b57cec5SDimitry Andric     // struct of two arrays (the nonzero data and the zeroinitializer).
9930b57cec5SDimitry Andric     if (CommonElementType && NonzeroLength >= 8) {
9940b57cec5SDimitry Andric       llvm::Constant *Initial = llvm::ConstantArray::get(
9950b57cec5SDimitry Andric           llvm::ArrayType::get(CommonElementType, NonzeroLength),
996bdd1243dSDimitry Andric           ArrayRef(Elements).take_front(NonzeroLength));
9970b57cec5SDimitry Andric       Elements.resize(2);
9980b57cec5SDimitry Andric       Elements[0] = Initial;
9990b57cec5SDimitry Andric     } else {
10000b57cec5SDimitry Andric       Elements.resize(NonzeroLength + 1);
10010b57cec5SDimitry Andric     }
10020b57cec5SDimitry Andric 
10030b57cec5SDimitry Andric     auto *FillerType =
10040b57cec5SDimitry Andric         CommonElementType ? CommonElementType : DesiredType->getElementType();
10050b57cec5SDimitry Andric     FillerType = llvm::ArrayType::get(FillerType, TrailingZeroes);
10060b57cec5SDimitry Andric     Elements.back() = llvm::ConstantAggregateZero::get(FillerType);
10070b57cec5SDimitry Andric     CommonElementType = nullptr;
10080b57cec5SDimitry Andric   } else if (Elements.size() != ArrayBound) {
10090b57cec5SDimitry Andric     // Otherwise pad to the right size with the filler if necessary.
10100b57cec5SDimitry Andric     Elements.resize(ArrayBound, Filler);
10110b57cec5SDimitry Andric     if (Filler->getType() != CommonElementType)
10120b57cec5SDimitry Andric       CommonElementType = nullptr;
10130b57cec5SDimitry Andric   }
10140b57cec5SDimitry Andric 
10150b57cec5SDimitry Andric   // If all elements have the same type, just emit an array constant.
10160b57cec5SDimitry Andric   if (CommonElementType)
10170b57cec5SDimitry Andric     return llvm::ConstantArray::get(
10180b57cec5SDimitry Andric         llvm::ArrayType::get(CommonElementType, ArrayBound), Elements);
10190b57cec5SDimitry Andric 
10200b57cec5SDimitry Andric   // We have mixed types. Use a packed struct.
10210b57cec5SDimitry Andric   llvm::SmallVector<llvm::Type *, 16> Types;
10220b57cec5SDimitry Andric   Types.reserve(Elements.size());
10230b57cec5SDimitry Andric   for (llvm::Constant *Elt : Elements)
10240b57cec5SDimitry Andric     Types.push_back(Elt->getType());
10250b57cec5SDimitry Andric   llvm::StructType *SType =
10260b57cec5SDimitry Andric       llvm::StructType::get(CGM.getLLVMContext(), Types, true);
10270b57cec5SDimitry Andric   return llvm::ConstantStruct::get(SType, Elements);
10280b57cec5SDimitry Andric }
10290b57cec5SDimitry Andric 
10300b57cec5SDimitry Andric // This class only needs to handle arrays, structs and unions. Outside C++11
10310b57cec5SDimitry Andric // mode, we don't currently constant fold those types.  All other types are
10320b57cec5SDimitry Andric // handled by constant folding.
10330b57cec5SDimitry Andric //
10340b57cec5SDimitry Andric // Constant folding is currently missing support for a few features supported
10350b57cec5SDimitry Andric // here: CK_ToUnion, CK_ReinterpretMemberPointer, and DesignatedInitUpdateExpr.
1036*0fca6ea1SDimitry Andric class ConstExprEmitter
1037*0fca6ea1SDimitry Andric     : public ConstStmtVisitor<ConstExprEmitter, llvm::Constant *, QualType> {
10380b57cec5SDimitry Andric   CodeGenModule &CGM;
10390b57cec5SDimitry Andric   ConstantEmitter &Emitter;
10400b57cec5SDimitry Andric   llvm::LLVMContext &VMContext;
10410b57cec5SDimitry Andric public:
10420b57cec5SDimitry Andric   ConstExprEmitter(ConstantEmitter &emitter)
10430b57cec5SDimitry Andric     : CGM(emitter.CGM), Emitter(emitter), VMContext(CGM.getLLVMContext()) {
10440b57cec5SDimitry Andric   }
10450b57cec5SDimitry Andric 
10460b57cec5SDimitry Andric   //===--------------------------------------------------------------------===//
10470b57cec5SDimitry Andric   //                            Visitor Methods
10480b57cec5SDimitry Andric   //===--------------------------------------------------------------------===//
10490b57cec5SDimitry Andric 
1050*0fca6ea1SDimitry Andric   llvm::Constant *VisitStmt(const Stmt *S, QualType T) { return nullptr; }
10510b57cec5SDimitry Andric 
1052*0fca6ea1SDimitry Andric   llvm::Constant *VisitConstantExpr(const ConstantExpr *CE, QualType T) {
10535ffd83dbSDimitry Andric     if (llvm::Constant *Result = Emitter.tryEmitConstantExpr(CE))
10545ffd83dbSDimitry Andric       return Result;
10550b57cec5SDimitry Andric     return Visit(CE->getSubExpr(), T);
10560b57cec5SDimitry Andric   }
10570b57cec5SDimitry Andric 
1058*0fca6ea1SDimitry Andric   llvm::Constant *VisitParenExpr(const ParenExpr *PE, QualType T) {
10590b57cec5SDimitry Andric     return Visit(PE->getSubExpr(), T);
10600b57cec5SDimitry Andric   }
10610b57cec5SDimitry Andric 
10620b57cec5SDimitry Andric   llvm::Constant *
1063*0fca6ea1SDimitry Andric   VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *PE,
10640b57cec5SDimitry Andric                                     QualType T) {
10650b57cec5SDimitry Andric     return Visit(PE->getReplacement(), T);
10660b57cec5SDimitry Andric   }
10670b57cec5SDimitry Andric 
1068*0fca6ea1SDimitry Andric   llvm::Constant *VisitGenericSelectionExpr(const GenericSelectionExpr *GE,
10690b57cec5SDimitry Andric                                             QualType T) {
10700b57cec5SDimitry Andric     return Visit(GE->getResultExpr(), T);
10710b57cec5SDimitry Andric   }
10720b57cec5SDimitry Andric 
1073*0fca6ea1SDimitry Andric   llvm::Constant *VisitChooseExpr(const ChooseExpr *CE, QualType T) {
10740b57cec5SDimitry Andric     return Visit(CE->getChosenSubExpr(), T);
10750b57cec5SDimitry Andric   }
10760b57cec5SDimitry Andric 
1077*0fca6ea1SDimitry Andric   llvm::Constant *VisitCompoundLiteralExpr(const CompoundLiteralExpr *E,
1078*0fca6ea1SDimitry Andric                                            QualType T) {
10790b57cec5SDimitry Andric     return Visit(E->getInitializer(), T);
10800b57cec5SDimitry Andric   }
10810b57cec5SDimitry Andric 
1082*0fca6ea1SDimitry Andric   llvm::Constant *ProduceIntToIntCast(const Expr *E, QualType DestType) {
1083*0fca6ea1SDimitry Andric     QualType FromType = E->getType();
1084*0fca6ea1SDimitry Andric     // See also HandleIntToIntCast in ExprConstant.cpp
1085*0fca6ea1SDimitry Andric     if (FromType->isIntegerType())
1086*0fca6ea1SDimitry Andric       if (llvm::Constant *C = Visit(E, FromType))
1087*0fca6ea1SDimitry Andric         if (auto *CI = dyn_cast<llvm::ConstantInt>(C)) {
1088*0fca6ea1SDimitry Andric           unsigned SrcWidth = CGM.getContext().getIntWidth(FromType);
1089*0fca6ea1SDimitry Andric           unsigned DstWidth = CGM.getContext().getIntWidth(DestType);
1090*0fca6ea1SDimitry Andric           if (DstWidth == SrcWidth)
1091*0fca6ea1SDimitry Andric             return CI;
1092*0fca6ea1SDimitry Andric           llvm::APInt A = FromType->isSignedIntegerType()
1093*0fca6ea1SDimitry Andric                               ? CI->getValue().sextOrTrunc(DstWidth)
1094*0fca6ea1SDimitry Andric                               : CI->getValue().zextOrTrunc(DstWidth);
1095*0fca6ea1SDimitry Andric           return llvm::ConstantInt::get(CGM.getLLVMContext(), A);
1096*0fca6ea1SDimitry Andric         }
1097*0fca6ea1SDimitry Andric     return nullptr;
1098*0fca6ea1SDimitry Andric   }
1099*0fca6ea1SDimitry Andric 
1100*0fca6ea1SDimitry Andric   llvm::Constant *VisitCastExpr(const CastExpr *E, QualType destType) {
11010b57cec5SDimitry Andric     if (const auto *ECE = dyn_cast<ExplicitCastExpr>(E))
11020b57cec5SDimitry Andric       CGM.EmitExplicitCastExprType(ECE, Emitter.CGF);
1103*0fca6ea1SDimitry Andric     const Expr *subExpr = E->getSubExpr();
11040b57cec5SDimitry Andric 
11050b57cec5SDimitry Andric     switch (E->getCastKind()) {
11060b57cec5SDimitry Andric     case CK_ToUnion: {
11070b57cec5SDimitry Andric       // GCC cast to union extension
11080b57cec5SDimitry Andric       assert(E->getType()->isUnionType() &&
11090b57cec5SDimitry Andric              "Destination type is not union type!");
11100b57cec5SDimitry Andric 
11110b57cec5SDimitry Andric       auto field = E->getTargetUnionField();
11120b57cec5SDimitry Andric 
11130b57cec5SDimitry Andric       auto C = Emitter.tryEmitPrivateForMemory(subExpr, field->getType());
11140b57cec5SDimitry Andric       if (!C) return nullptr;
11150b57cec5SDimitry Andric 
11160b57cec5SDimitry Andric       auto destTy = ConvertType(destType);
11170b57cec5SDimitry Andric       if (C->getType() == destTy) return C;
11180b57cec5SDimitry Andric 
11190b57cec5SDimitry Andric       // Build a struct with the union sub-element as the first member,
11200b57cec5SDimitry Andric       // and padded to the appropriate size.
11210b57cec5SDimitry Andric       SmallVector<llvm::Constant*, 2> Elts;
11220b57cec5SDimitry Andric       SmallVector<llvm::Type*, 2> Types;
11230b57cec5SDimitry Andric       Elts.push_back(C);
11240b57cec5SDimitry Andric       Types.push_back(C->getType());
11250b57cec5SDimitry Andric       unsigned CurSize = CGM.getDataLayout().getTypeAllocSize(C->getType());
11260b57cec5SDimitry Andric       unsigned TotalSize = CGM.getDataLayout().getTypeAllocSize(destTy);
11270b57cec5SDimitry Andric 
11280b57cec5SDimitry Andric       assert(CurSize <= TotalSize && "Union size mismatch!");
11290b57cec5SDimitry Andric       if (unsigned NumPadBytes = TotalSize - CurSize) {
1130e8d8bef9SDimitry Andric         llvm::Type *Ty = CGM.CharTy;
11310b57cec5SDimitry Andric         if (NumPadBytes > 1)
11320b57cec5SDimitry Andric           Ty = llvm::ArrayType::get(Ty, NumPadBytes);
11330b57cec5SDimitry Andric 
11340b57cec5SDimitry Andric         Elts.push_back(llvm::UndefValue::get(Ty));
11350b57cec5SDimitry Andric         Types.push_back(Ty);
11360b57cec5SDimitry Andric       }
11370b57cec5SDimitry Andric 
11380b57cec5SDimitry Andric       llvm::StructType *STy = llvm::StructType::get(VMContext, Types, false);
11390b57cec5SDimitry Andric       return llvm::ConstantStruct::get(STy, Elts);
11400b57cec5SDimitry Andric     }
11410b57cec5SDimitry Andric 
11420b57cec5SDimitry Andric     case CK_AddressSpaceConversion: {
11430b57cec5SDimitry Andric       auto C = Emitter.tryEmitPrivate(subExpr, subExpr->getType());
11440b57cec5SDimitry Andric       if (!C) return nullptr;
11450b57cec5SDimitry Andric       LangAS destAS = E->getType()->getPointeeType().getAddressSpace();
11460b57cec5SDimitry Andric       LangAS srcAS = subExpr->getType()->getPointeeType().getAddressSpace();
11470b57cec5SDimitry Andric       llvm::Type *destTy = ConvertType(E->getType());
11480b57cec5SDimitry Andric       return CGM.getTargetCodeGenInfo().performAddrSpaceCast(CGM, C, srcAS,
11490b57cec5SDimitry Andric                                                              destAS, destTy);
11500b57cec5SDimitry Andric     }
11510b57cec5SDimitry Andric 
115281ad6265SDimitry Andric     case CK_LValueToRValue: {
115381ad6265SDimitry Andric       // We don't really support doing lvalue-to-rvalue conversions here; any
115481ad6265SDimitry Andric       // interesting conversions should be done in Evaluate().  But as a
115581ad6265SDimitry Andric       // special case, allow compound literals to support the gcc extension
115681ad6265SDimitry Andric       // allowing "struct x {int x;} x = (struct x) {};".
1157*0fca6ea1SDimitry Andric       if (const auto *E =
1158*0fca6ea1SDimitry Andric               dyn_cast<CompoundLiteralExpr>(subExpr->IgnoreParens()))
115981ad6265SDimitry Andric         return Visit(E->getInitializer(), destType);
116081ad6265SDimitry Andric       return nullptr;
116181ad6265SDimitry Andric     }
116281ad6265SDimitry Andric 
11630b57cec5SDimitry Andric     case CK_AtomicToNonAtomic:
11640b57cec5SDimitry Andric     case CK_NonAtomicToAtomic:
11650b57cec5SDimitry Andric     case CK_NoOp:
11660b57cec5SDimitry Andric     case CK_ConstructorConversion:
11670b57cec5SDimitry Andric       return Visit(subExpr, destType);
11680b57cec5SDimitry Andric 
11695f757f3fSDimitry Andric     case CK_ArrayToPointerDecay:
11705f757f3fSDimitry Andric       if (const auto *S = dyn_cast<StringLiteral>(subExpr))
11715f757f3fSDimitry Andric         return CGM.GetAddrOfConstantStringFromLiteral(S).getPointer();
11725f757f3fSDimitry Andric       return nullptr;
11735f757f3fSDimitry Andric     case CK_NullToPointer:
11745f757f3fSDimitry Andric       if (Visit(subExpr, destType))
11755f757f3fSDimitry Andric         return CGM.EmitNullConstant(destType);
11765f757f3fSDimitry Andric       return nullptr;
11775f757f3fSDimitry Andric 
11780b57cec5SDimitry Andric     case CK_IntToOCLSampler:
11790b57cec5SDimitry Andric       llvm_unreachable("global sampler variables are not generated");
11800b57cec5SDimitry Andric 
1181*0fca6ea1SDimitry Andric     case CK_IntegralCast:
1182*0fca6ea1SDimitry Andric       return ProduceIntToIntCast(subExpr, destType);
11835f757f3fSDimitry Andric 
11840b57cec5SDimitry Andric     case CK_Dependent: llvm_unreachable("saw dependent cast!");
11850b57cec5SDimitry Andric 
11860b57cec5SDimitry Andric     case CK_BuiltinFnToFnPtr:
11870b57cec5SDimitry Andric       llvm_unreachable("builtin functions are handled elsewhere");
11880b57cec5SDimitry Andric 
11890b57cec5SDimitry Andric     case CK_ReinterpretMemberPointer:
11900b57cec5SDimitry Andric     case CK_DerivedToBaseMemberPointer:
11910b57cec5SDimitry Andric     case CK_BaseToDerivedMemberPointer: {
11920b57cec5SDimitry Andric       auto C = Emitter.tryEmitPrivate(subExpr, subExpr->getType());
11930b57cec5SDimitry Andric       if (!C) return nullptr;
11940b57cec5SDimitry Andric       return CGM.getCXXABI().EmitMemberPointerConversion(E, C);
11950b57cec5SDimitry Andric     }
11960b57cec5SDimitry Andric 
11970b57cec5SDimitry Andric     // These will never be supported.
11980b57cec5SDimitry Andric     case CK_ObjCObjectLValueCast:
11990b57cec5SDimitry Andric     case CK_ARCProduceObject:
12000b57cec5SDimitry Andric     case CK_ARCConsumeObject:
12010b57cec5SDimitry Andric     case CK_ARCReclaimReturnedObject:
12020b57cec5SDimitry Andric     case CK_ARCExtendBlockObject:
12030b57cec5SDimitry Andric     case CK_CopyAndAutoreleaseBlockObject:
12040b57cec5SDimitry Andric       return nullptr;
12050b57cec5SDimitry Andric 
12060b57cec5SDimitry Andric     // These don't need to be handled here because Evaluate knows how to
12070b57cec5SDimitry Andric     // evaluate them in the cases where they can be folded.
12080b57cec5SDimitry Andric     case CK_BitCast:
12090b57cec5SDimitry Andric     case CK_ToVoid:
12100b57cec5SDimitry Andric     case CK_Dynamic:
12110b57cec5SDimitry Andric     case CK_LValueBitCast:
12120b57cec5SDimitry Andric     case CK_LValueToRValueBitCast:
12130b57cec5SDimitry Andric     case CK_NullToMemberPointer:
12140b57cec5SDimitry Andric     case CK_UserDefinedConversion:
12150b57cec5SDimitry Andric     case CK_CPointerToObjCPointerCast:
12160b57cec5SDimitry Andric     case CK_BlockPointerToObjCPointerCast:
12170b57cec5SDimitry Andric     case CK_AnyPointerToBlockPointerCast:
12180b57cec5SDimitry Andric     case CK_FunctionToPointerDecay:
12190b57cec5SDimitry Andric     case CK_BaseToDerived:
12200b57cec5SDimitry Andric     case CK_DerivedToBase:
12210b57cec5SDimitry Andric     case CK_UncheckedDerivedToBase:
12220b57cec5SDimitry Andric     case CK_MemberPointerToBoolean:
12230b57cec5SDimitry Andric     case CK_VectorSplat:
12240b57cec5SDimitry Andric     case CK_FloatingRealToComplex:
12250b57cec5SDimitry Andric     case CK_FloatingComplexToReal:
12260b57cec5SDimitry Andric     case CK_FloatingComplexToBoolean:
12270b57cec5SDimitry Andric     case CK_FloatingComplexCast:
12280b57cec5SDimitry Andric     case CK_FloatingComplexToIntegralComplex:
12290b57cec5SDimitry Andric     case CK_IntegralRealToComplex:
12300b57cec5SDimitry Andric     case CK_IntegralComplexToReal:
12310b57cec5SDimitry Andric     case CK_IntegralComplexToBoolean:
12320b57cec5SDimitry Andric     case CK_IntegralComplexCast:
12330b57cec5SDimitry Andric     case CK_IntegralComplexToFloatingComplex:
12340b57cec5SDimitry Andric     case CK_PointerToIntegral:
12350b57cec5SDimitry Andric     case CK_PointerToBoolean:
12360b57cec5SDimitry Andric     case CK_BooleanToSignedIntegral:
12370b57cec5SDimitry Andric     case CK_IntegralToPointer:
12380b57cec5SDimitry Andric     case CK_IntegralToBoolean:
12390b57cec5SDimitry Andric     case CK_IntegralToFloating:
12400b57cec5SDimitry Andric     case CK_FloatingToIntegral:
12410b57cec5SDimitry Andric     case CK_FloatingToBoolean:
12420b57cec5SDimitry Andric     case CK_FloatingCast:
1243e8d8bef9SDimitry Andric     case CK_FloatingToFixedPoint:
1244e8d8bef9SDimitry Andric     case CK_FixedPointToFloating:
12450b57cec5SDimitry Andric     case CK_FixedPointCast:
12460b57cec5SDimitry Andric     case CK_FixedPointToBoolean:
12470b57cec5SDimitry Andric     case CK_FixedPointToIntegral:
12480b57cec5SDimitry Andric     case CK_IntegralToFixedPoint:
12490b57cec5SDimitry Andric     case CK_ZeroToOCLOpaqueType:
1250fe6060f1SDimitry Andric     case CK_MatrixCast:
1251*0fca6ea1SDimitry Andric     case CK_HLSLVectorTruncation:
1252*0fca6ea1SDimitry Andric     case CK_HLSLArrayRValue:
12530b57cec5SDimitry Andric       return nullptr;
12540b57cec5SDimitry Andric     }
12550b57cec5SDimitry Andric     llvm_unreachable("Invalid CastKind");
12560b57cec5SDimitry Andric   }
12570b57cec5SDimitry Andric 
1258*0fca6ea1SDimitry Andric   llvm::Constant *VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *DIE,
1259*0fca6ea1SDimitry Andric                                           QualType T) {
12600b57cec5SDimitry Andric     // No need for a DefaultInitExprScope: we don't handle 'this' in a
12610b57cec5SDimitry Andric     // constant expression.
12620b57cec5SDimitry Andric     return Visit(DIE->getExpr(), T);
12630b57cec5SDimitry Andric   }
12640b57cec5SDimitry Andric 
1265*0fca6ea1SDimitry Andric   llvm::Constant *VisitExprWithCleanups(const ExprWithCleanups *E, QualType T) {
12660b57cec5SDimitry Andric     return Visit(E->getSubExpr(), T);
12670b57cec5SDimitry Andric   }
12680b57cec5SDimitry Andric 
1269*0fca6ea1SDimitry Andric   llvm::Constant *VisitIntegerLiteral(const IntegerLiteral *I, QualType T) {
12705f757f3fSDimitry Andric     return llvm::ConstantInt::get(CGM.getLLVMContext(), I->getValue());
12715f757f3fSDimitry Andric   }
12725f757f3fSDimitry Andric 
1273*0fca6ea1SDimitry Andric   static APValue withDestType(ASTContext &Ctx, const Expr *E, QualType SrcType,
1274*0fca6ea1SDimitry Andric                               QualType DestType, const llvm::APSInt &Value) {
1275*0fca6ea1SDimitry Andric     if (!Ctx.hasSameType(SrcType, DestType)) {
1276*0fca6ea1SDimitry Andric       if (DestType->isFloatingType()) {
1277*0fca6ea1SDimitry Andric         llvm::APFloat Result =
1278*0fca6ea1SDimitry Andric             llvm::APFloat(Ctx.getFloatTypeSemantics(DestType), 1);
1279*0fca6ea1SDimitry Andric         llvm::RoundingMode RM =
1280*0fca6ea1SDimitry Andric             E->getFPFeaturesInEffect(Ctx.getLangOpts()).getRoundingMode();
1281*0fca6ea1SDimitry Andric         if (RM == llvm::RoundingMode::Dynamic)
1282*0fca6ea1SDimitry Andric           RM = llvm::RoundingMode::NearestTiesToEven;
1283*0fca6ea1SDimitry Andric         Result.convertFromAPInt(Value, Value.isSigned(), RM);
1284*0fca6ea1SDimitry Andric         return APValue(Result);
1285*0fca6ea1SDimitry Andric       }
1286*0fca6ea1SDimitry Andric     }
1287*0fca6ea1SDimitry Andric     return APValue(Value);
1288*0fca6ea1SDimitry Andric   }
1289*0fca6ea1SDimitry Andric 
1290*0fca6ea1SDimitry Andric   llvm::Constant *EmitArrayInitialization(const InitListExpr *ILE, QualType T) {
12910b57cec5SDimitry Andric     auto *CAT = CGM.getContext().getAsConstantArrayType(ILE->getType());
12920b57cec5SDimitry Andric     assert(CAT && "can't emit array init for non-constant-bound array");
1293*0fca6ea1SDimitry Andric     uint64_t NumInitElements = ILE->getNumInits();
1294*0fca6ea1SDimitry Andric     const uint64_t NumElements = CAT->getZExtSize();
1295*0fca6ea1SDimitry Andric     for (const auto *Init : ILE->inits()) {
1296*0fca6ea1SDimitry Andric       if (const auto *Embed =
1297*0fca6ea1SDimitry Andric               dyn_cast<EmbedExpr>(Init->IgnoreParenImpCasts())) {
1298*0fca6ea1SDimitry Andric         NumInitElements += Embed->getDataElementCount() - 1;
1299*0fca6ea1SDimitry Andric         if (NumInitElements > NumElements) {
1300*0fca6ea1SDimitry Andric           NumInitElements = NumElements;
1301*0fca6ea1SDimitry Andric           break;
1302*0fca6ea1SDimitry Andric         }
1303*0fca6ea1SDimitry Andric       }
1304*0fca6ea1SDimitry Andric     }
13050b57cec5SDimitry Andric 
13060b57cec5SDimitry Andric     // Initialising an array requires us to automatically
13070b57cec5SDimitry Andric     // initialise any elements that have not been initialised explicitly
1308*0fca6ea1SDimitry Andric     uint64_t NumInitableElts = std::min<uint64_t>(NumInitElements, NumElements);
13090b57cec5SDimitry Andric 
13100b57cec5SDimitry Andric     QualType EltType = CAT->getElementType();
13110b57cec5SDimitry Andric 
13120b57cec5SDimitry Andric     // Initialize remaining array elements.
13130b57cec5SDimitry Andric     llvm::Constant *fillC = nullptr;
1314*0fca6ea1SDimitry Andric     if (const Expr *filler = ILE->getArrayFiller()) {
13150b57cec5SDimitry Andric       fillC = Emitter.tryEmitAbstractForMemory(filler, EltType);
13160b57cec5SDimitry Andric       if (!fillC)
13170b57cec5SDimitry Andric         return nullptr;
13180b57cec5SDimitry Andric     }
13190b57cec5SDimitry Andric 
13200b57cec5SDimitry Andric     // Copy initializer elements.
13210b57cec5SDimitry Andric     SmallVector<llvm::Constant *, 16> Elts;
13220b57cec5SDimitry Andric     if (fillC && fillC->isNullValue())
13230b57cec5SDimitry Andric       Elts.reserve(NumInitableElts + 1);
13240b57cec5SDimitry Andric     else
13250b57cec5SDimitry Andric       Elts.reserve(NumElements);
13260b57cec5SDimitry Andric 
13270b57cec5SDimitry Andric     llvm::Type *CommonElementType = nullptr;
1328*0fca6ea1SDimitry Andric     auto Emit = [&](const Expr *Init, unsigned ArrayIndex) {
1329*0fca6ea1SDimitry Andric       llvm::Constant *C = nullptr;
1330*0fca6ea1SDimitry Andric       C = Emitter.tryEmitPrivateForMemory(Init, EltType);
13310b57cec5SDimitry Andric       if (!C)
1332*0fca6ea1SDimitry Andric         return false;
1333*0fca6ea1SDimitry Andric       if (ArrayIndex == 0)
13340b57cec5SDimitry Andric         CommonElementType = C->getType();
13350b57cec5SDimitry Andric       else if (C->getType() != CommonElementType)
13360b57cec5SDimitry Andric         CommonElementType = nullptr;
13370b57cec5SDimitry Andric       Elts.push_back(C);
1338*0fca6ea1SDimitry Andric       return true;
1339*0fca6ea1SDimitry Andric     };
1340*0fca6ea1SDimitry Andric 
1341*0fca6ea1SDimitry Andric     unsigned ArrayIndex = 0;
1342*0fca6ea1SDimitry Andric     QualType DestTy = CAT->getElementType();
1343*0fca6ea1SDimitry Andric     for (unsigned i = 0; i < ILE->getNumInits(); ++i) {
1344*0fca6ea1SDimitry Andric       const Expr *Init = ILE->getInit(i);
1345*0fca6ea1SDimitry Andric       if (auto *EmbedS = dyn_cast<EmbedExpr>(Init->IgnoreParenImpCasts())) {
1346*0fca6ea1SDimitry Andric         StringLiteral *SL = EmbedS->getDataStringLiteral();
1347*0fca6ea1SDimitry Andric         llvm::APSInt Value(CGM.getContext().getTypeSize(DestTy),
1348*0fca6ea1SDimitry Andric                            DestTy->isUnsignedIntegerType());
1349*0fca6ea1SDimitry Andric         llvm::Constant *C;
1350*0fca6ea1SDimitry Andric         for (unsigned I = EmbedS->getStartingElementPos(),
1351*0fca6ea1SDimitry Andric                       N = EmbedS->getDataElementCount();
1352*0fca6ea1SDimitry Andric              I != EmbedS->getStartingElementPos() + N; ++I) {
1353*0fca6ea1SDimitry Andric           Value = SL->getCodeUnit(I);
1354*0fca6ea1SDimitry Andric           if (DestTy->isIntegerType()) {
1355*0fca6ea1SDimitry Andric             C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value);
1356*0fca6ea1SDimitry Andric           } else {
1357*0fca6ea1SDimitry Andric             C = Emitter.tryEmitPrivateForMemory(
1358*0fca6ea1SDimitry Andric                 withDestType(CGM.getContext(), Init, EmbedS->getType(), DestTy,
1359*0fca6ea1SDimitry Andric                              Value),
1360*0fca6ea1SDimitry Andric                 EltType);
1361*0fca6ea1SDimitry Andric           }
1362*0fca6ea1SDimitry Andric           if (!C)
1363*0fca6ea1SDimitry Andric             return nullptr;
1364*0fca6ea1SDimitry Andric           Elts.push_back(C);
1365*0fca6ea1SDimitry Andric           ArrayIndex++;
1366*0fca6ea1SDimitry Andric         }
1367*0fca6ea1SDimitry Andric         if ((ArrayIndex - EmbedS->getDataElementCount()) == 0)
1368*0fca6ea1SDimitry Andric           CommonElementType = C->getType();
1369*0fca6ea1SDimitry Andric         else if (C->getType() != CommonElementType)
1370*0fca6ea1SDimitry Andric           CommonElementType = nullptr;
1371*0fca6ea1SDimitry Andric       } else {
1372*0fca6ea1SDimitry Andric         if (!Emit(Init, ArrayIndex))
1373*0fca6ea1SDimitry Andric           return nullptr;
1374*0fca6ea1SDimitry Andric         ArrayIndex++;
1375*0fca6ea1SDimitry Andric       }
13760b57cec5SDimitry Andric     }
13770b57cec5SDimitry Andric 
13780b57cec5SDimitry Andric     llvm::ArrayType *Desired =
13790b57cec5SDimitry Andric         cast<llvm::ArrayType>(CGM.getTypes().ConvertType(ILE->getType()));
13800b57cec5SDimitry Andric     return EmitArrayConstant(CGM, Desired, CommonElementType, NumElements, Elts,
13810b57cec5SDimitry Andric                              fillC);
13820b57cec5SDimitry Andric   }
13830b57cec5SDimitry Andric 
1384*0fca6ea1SDimitry Andric   llvm::Constant *EmitRecordInitialization(const InitListExpr *ILE,
1385*0fca6ea1SDimitry Andric                                            QualType T) {
13860b57cec5SDimitry Andric     return ConstStructBuilder::BuildStruct(Emitter, ILE, T);
13870b57cec5SDimitry Andric   }
13880b57cec5SDimitry Andric 
1389*0fca6ea1SDimitry Andric   llvm::Constant *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E,
13900b57cec5SDimitry Andric                                              QualType T) {
13910b57cec5SDimitry Andric     return CGM.EmitNullConstant(T);
13920b57cec5SDimitry Andric   }
13930b57cec5SDimitry Andric 
1394*0fca6ea1SDimitry Andric   llvm::Constant *VisitInitListExpr(const InitListExpr *ILE, QualType T) {
13950b57cec5SDimitry Andric     if (ILE->isTransparent())
13960b57cec5SDimitry Andric       return Visit(ILE->getInit(0), T);
13970b57cec5SDimitry Andric 
13980b57cec5SDimitry Andric     if (ILE->getType()->isArrayType())
13990b57cec5SDimitry Andric       return EmitArrayInitialization(ILE, T);
14000b57cec5SDimitry Andric 
14010b57cec5SDimitry Andric     if (ILE->getType()->isRecordType())
14020b57cec5SDimitry Andric       return EmitRecordInitialization(ILE, T);
14030b57cec5SDimitry Andric 
14040b57cec5SDimitry Andric     return nullptr;
14050b57cec5SDimitry Andric   }
14060b57cec5SDimitry Andric 
1407*0fca6ea1SDimitry Andric   llvm::Constant *
1408*0fca6ea1SDimitry Andric   VisitDesignatedInitUpdateExpr(const DesignatedInitUpdateExpr *E,
14090b57cec5SDimitry Andric                                 QualType destType) {
14100b57cec5SDimitry Andric     auto C = Visit(E->getBase(), destType);
14110b57cec5SDimitry Andric     if (!C)
14120b57cec5SDimitry Andric       return nullptr;
14130b57cec5SDimitry Andric 
14140b57cec5SDimitry Andric     ConstantAggregateBuilder Const(CGM);
14150b57cec5SDimitry Andric     Const.add(C, CharUnits::Zero(), false);
14160b57cec5SDimitry Andric 
14170b57cec5SDimitry Andric     if (!EmitDesignatedInitUpdater(Emitter, Const, CharUnits::Zero(), destType,
14180b57cec5SDimitry Andric                                    E->getUpdater()))
14190b57cec5SDimitry Andric       return nullptr;
14200b57cec5SDimitry Andric 
14210b57cec5SDimitry Andric     llvm::Type *ValTy = CGM.getTypes().ConvertType(destType);
14220b57cec5SDimitry Andric     bool HasFlexibleArray = false;
1423*0fca6ea1SDimitry Andric     if (const auto *RT = destType->getAs<RecordType>())
14240b57cec5SDimitry Andric       HasFlexibleArray = RT->getDecl()->hasFlexibleArrayMember();
14250b57cec5SDimitry Andric     return Const.build(ValTy, HasFlexibleArray);
14260b57cec5SDimitry Andric   }
14270b57cec5SDimitry Andric 
1428*0fca6ea1SDimitry Andric   llvm::Constant *VisitCXXConstructExpr(const CXXConstructExpr *E,
1429*0fca6ea1SDimitry Andric                                         QualType Ty) {
14300b57cec5SDimitry Andric     if (!E->getConstructor()->isTrivial())
14310b57cec5SDimitry Andric       return nullptr;
14320b57cec5SDimitry Andric 
14335ffd83dbSDimitry Andric     // Only default and copy/move constructors can be trivial.
14340b57cec5SDimitry Andric     if (E->getNumArgs()) {
14350b57cec5SDimitry Andric       assert(E->getNumArgs() == 1 && "trivial ctor with > 1 argument");
14360b57cec5SDimitry Andric       assert(E->getConstructor()->isCopyOrMoveConstructor() &&
14370b57cec5SDimitry Andric              "trivial ctor has argument but isn't a copy/move ctor");
14380b57cec5SDimitry Andric 
1439*0fca6ea1SDimitry Andric       const Expr *Arg = E->getArg(0);
14400b57cec5SDimitry Andric       assert(CGM.getContext().hasSameUnqualifiedType(Ty, Arg->getType()) &&
14410b57cec5SDimitry Andric              "argument to copy ctor is of wrong type");
14420b57cec5SDimitry Andric 
144306c3fb27SDimitry Andric       // Look through the temporary; it's just converting the value to an
144406c3fb27SDimitry Andric       // lvalue to pass it to the constructor.
1445*0fca6ea1SDimitry Andric       if (const auto *MTE = dyn_cast<MaterializeTemporaryExpr>(Arg))
144606c3fb27SDimitry Andric         return Visit(MTE->getSubExpr(), Ty);
144706c3fb27SDimitry Andric       // Don't try to support arbitrary lvalue-to-rvalue conversions for now.
144806c3fb27SDimitry Andric       return nullptr;
14490b57cec5SDimitry Andric     }
14500b57cec5SDimitry Andric 
14510b57cec5SDimitry Andric     return CGM.EmitNullConstant(Ty);
14520b57cec5SDimitry Andric   }
14530b57cec5SDimitry Andric 
1454*0fca6ea1SDimitry Andric   llvm::Constant *VisitStringLiteral(const StringLiteral *E, QualType T) {
14550b57cec5SDimitry Andric     // This is a string literal initializing an array in an initializer.
14560b57cec5SDimitry Andric     return CGM.GetConstantArrayFromStringLiteral(E);
14570b57cec5SDimitry Andric   }
14580b57cec5SDimitry Andric 
1459*0fca6ea1SDimitry Andric   llvm::Constant *VisitObjCEncodeExpr(const ObjCEncodeExpr *E, QualType T) {
14600b57cec5SDimitry Andric     // This must be an @encode initializing an array in a static initializer.
14610b57cec5SDimitry Andric     // Don't emit it as the address of the string, emit the string data itself
14620b57cec5SDimitry Andric     // as an inline array.
14630b57cec5SDimitry Andric     std::string Str;
14640b57cec5SDimitry Andric     CGM.getContext().getObjCEncodingForType(E->getEncodedType(), Str);
14650b57cec5SDimitry Andric     const ConstantArrayType *CAT = CGM.getContext().getAsConstantArrayType(T);
146606c3fb27SDimitry Andric     assert(CAT && "String data not of constant array type!");
14670b57cec5SDimitry Andric 
14680b57cec5SDimitry Andric     // Resize the string to the right size, adding zeros at the end, or
14690b57cec5SDimitry Andric     // truncating as needed.
1470*0fca6ea1SDimitry Andric     Str.resize(CAT->getZExtSize(), '\0');
14710b57cec5SDimitry Andric     return llvm::ConstantDataArray::getString(VMContext, Str, false);
14720b57cec5SDimitry Andric   }
14730b57cec5SDimitry Andric 
14740b57cec5SDimitry Andric   llvm::Constant *VisitUnaryExtension(const UnaryOperator *E, QualType T) {
14750b57cec5SDimitry Andric     return Visit(E->getSubExpr(), T);
14760b57cec5SDimitry Andric   }
14770b57cec5SDimitry Andric 
1478*0fca6ea1SDimitry Andric   llvm::Constant *VisitUnaryMinus(const UnaryOperator *U, QualType T) {
14795f757f3fSDimitry Andric     if (llvm::Constant *C = Visit(U->getSubExpr(), T))
14805f757f3fSDimitry Andric       if (auto *CI = dyn_cast<llvm::ConstantInt>(C))
14815f757f3fSDimitry Andric         return llvm::ConstantInt::get(CGM.getLLVMContext(), -CI->getValue());
14825f757f3fSDimitry Andric     return nullptr;
14835f757f3fSDimitry Andric   }
14845f757f3fSDimitry Andric 
1485*0fca6ea1SDimitry Andric   llvm::Constant *VisitPackIndexingExpr(const PackIndexingExpr *E, QualType T) {
1486*0fca6ea1SDimitry Andric     return Visit(E->getSelectedExpr(), T);
1487*0fca6ea1SDimitry Andric   }
1488*0fca6ea1SDimitry Andric 
14890b57cec5SDimitry Andric   // Utility methods
14900b57cec5SDimitry Andric   llvm::Type *ConvertType(QualType T) {
14910b57cec5SDimitry Andric     return CGM.getTypes().ConvertType(T);
14920b57cec5SDimitry Andric   }
14930b57cec5SDimitry Andric };
14940b57cec5SDimitry Andric 
14950b57cec5SDimitry Andric }  // end anonymous namespace.
14960b57cec5SDimitry Andric 
14970b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::validateAndPopAbstract(llvm::Constant *C,
14980b57cec5SDimitry Andric                                                         AbstractState saved) {
14990b57cec5SDimitry Andric   Abstract = saved.OldValue;
15000b57cec5SDimitry Andric 
15010b57cec5SDimitry Andric   assert(saved.OldPlaceholdersSize == PlaceholderAddresses.size() &&
15020b57cec5SDimitry Andric          "created a placeholder while doing an abstract emission?");
15030b57cec5SDimitry Andric 
15040b57cec5SDimitry Andric   // No validation necessary for now.
15050b57cec5SDimitry Andric   // No cleanup to do for now.
15060b57cec5SDimitry Andric   return C;
15070b57cec5SDimitry Andric }
15080b57cec5SDimitry Andric 
15090b57cec5SDimitry Andric llvm::Constant *
15100b57cec5SDimitry Andric ConstantEmitter::tryEmitAbstractForInitializer(const VarDecl &D) {
15110b57cec5SDimitry Andric   auto state = pushAbstract();
15120b57cec5SDimitry Andric   auto C = tryEmitPrivateForVarInit(D);
15130b57cec5SDimitry Andric   return validateAndPopAbstract(C, state);
15140b57cec5SDimitry Andric }
15150b57cec5SDimitry Andric 
15160b57cec5SDimitry Andric llvm::Constant *
15170b57cec5SDimitry Andric ConstantEmitter::tryEmitAbstract(const Expr *E, QualType destType) {
15180b57cec5SDimitry Andric   auto state = pushAbstract();
15190b57cec5SDimitry Andric   auto C = tryEmitPrivate(E, destType);
15200b57cec5SDimitry Andric   return validateAndPopAbstract(C, state);
15210b57cec5SDimitry Andric }
15220b57cec5SDimitry Andric 
15230b57cec5SDimitry Andric llvm::Constant *
15240b57cec5SDimitry Andric ConstantEmitter::tryEmitAbstract(const APValue &value, QualType destType) {
15250b57cec5SDimitry Andric   auto state = pushAbstract();
15260b57cec5SDimitry Andric   auto C = tryEmitPrivate(value, destType);
15270b57cec5SDimitry Andric   return validateAndPopAbstract(C, state);
15280b57cec5SDimitry Andric }
15290b57cec5SDimitry Andric 
15305ffd83dbSDimitry Andric llvm::Constant *ConstantEmitter::tryEmitConstantExpr(const ConstantExpr *CE) {
15315ffd83dbSDimitry Andric   if (!CE->hasAPValueResult())
15325ffd83dbSDimitry Andric     return nullptr;
1533bdd1243dSDimitry Andric 
1534bdd1243dSDimitry Andric   QualType RetType = CE->getType();
1535bdd1243dSDimitry Andric   if (CE->isGLValue())
1536bdd1243dSDimitry Andric     RetType = CGM.getContext().getLValueReferenceType(RetType);
1537bdd1243dSDimitry Andric 
1538bdd1243dSDimitry Andric   return emitAbstract(CE->getBeginLoc(), CE->getAPValueResult(), RetType);
15395ffd83dbSDimitry Andric }
15405ffd83dbSDimitry Andric 
15410b57cec5SDimitry Andric llvm::Constant *
15420b57cec5SDimitry Andric ConstantEmitter::emitAbstract(const Expr *E, QualType destType) {
15430b57cec5SDimitry Andric   auto state = pushAbstract();
15440b57cec5SDimitry Andric   auto C = tryEmitPrivate(E, destType);
15450b57cec5SDimitry Andric   C = validateAndPopAbstract(C, state);
15460b57cec5SDimitry Andric   if (!C) {
15470b57cec5SDimitry Andric     CGM.Error(E->getExprLoc(),
15480b57cec5SDimitry Andric               "internal error: could not emit constant value \"abstractly\"");
15490b57cec5SDimitry Andric     C = CGM.EmitNullConstant(destType);
15500b57cec5SDimitry Andric   }
15510b57cec5SDimitry Andric   return C;
15520b57cec5SDimitry Andric }
15530b57cec5SDimitry Andric 
15540b57cec5SDimitry Andric llvm::Constant *
15550b57cec5SDimitry Andric ConstantEmitter::emitAbstract(SourceLocation loc, const APValue &value,
1556*0fca6ea1SDimitry Andric                               QualType destType,
1557*0fca6ea1SDimitry Andric                               bool EnablePtrAuthFunctionTypeDiscrimination) {
15580b57cec5SDimitry Andric   auto state = pushAbstract();
1559*0fca6ea1SDimitry Andric   auto C =
1560*0fca6ea1SDimitry Andric       tryEmitPrivate(value, destType, EnablePtrAuthFunctionTypeDiscrimination);
15610b57cec5SDimitry Andric   C = validateAndPopAbstract(C, state);
15620b57cec5SDimitry Andric   if (!C) {
15630b57cec5SDimitry Andric     CGM.Error(loc,
15640b57cec5SDimitry Andric               "internal error: could not emit constant value \"abstractly\"");
15650b57cec5SDimitry Andric     C = CGM.EmitNullConstant(destType);
15660b57cec5SDimitry Andric   }
15670b57cec5SDimitry Andric   return C;
15680b57cec5SDimitry Andric }
15690b57cec5SDimitry Andric 
15700b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::tryEmitForInitializer(const VarDecl &D) {
15710b57cec5SDimitry Andric   initializeNonAbstract(D.getType().getAddressSpace());
15720b57cec5SDimitry Andric   return markIfFailed(tryEmitPrivateForVarInit(D));
15730b57cec5SDimitry Andric }
15740b57cec5SDimitry Andric 
15750b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::tryEmitForInitializer(const Expr *E,
15760b57cec5SDimitry Andric                                                        LangAS destAddrSpace,
15770b57cec5SDimitry Andric                                                        QualType destType) {
15780b57cec5SDimitry Andric   initializeNonAbstract(destAddrSpace);
15790b57cec5SDimitry Andric   return markIfFailed(tryEmitPrivateForMemory(E, destType));
15800b57cec5SDimitry Andric }
15810b57cec5SDimitry Andric 
15820b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::emitForInitializer(const APValue &value,
15830b57cec5SDimitry Andric                                                     LangAS destAddrSpace,
15840b57cec5SDimitry Andric                                                     QualType destType) {
15850b57cec5SDimitry Andric   initializeNonAbstract(destAddrSpace);
15860b57cec5SDimitry Andric   auto C = tryEmitPrivateForMemory(value, destType);
15870b57cec5SDimitry Andric   assert(C && "couldn't emit constant value non-abstractly?");
15880b57cec5SDimitry Andric   return C;
15890b57cec5SDimitry Andric }
15900b57cec5SDimitry Andric 
15910b57cec5SDimitry Andric llvm::GlobalValue *ConstantEmitter::getCurrentAddrPrivate() {
15920b57cec5SDimitry Andric   assert(!Abstract && "cannot get current address for abstract constant");
15930b57cec5SDimitry Andric 
15940b57cec5SDimitry Andric 
15950b57cec5SDimitry Andric 
15960b57cec5SDimitry Andric   // Make an obviously ill-formed global that should blow up compilation
15970b57cec5SDimitry Andric   // if it survives.
15980b57cec5SDimitry Andric   auto global = new llvm::GlobalVariable(CGM.getModule(), CGM.Int8Ty, true,
15990b57cec5SDimitry Andric                                          llvm::GlobalValue::PrivateLinkage,
16000b57cec5SDimitry Andric                                          /*init*/ nullptr,
16010b57cec5SDimitry Andric                                          /*name*/ "",
16020b57cec5SDimitry Andric                                          /*before*/ nullptr,
16030b57cec5SDimitry Andric                                          llvm::GlobalVariable::NotThreadLocal,
16040b57cec5SDimitry Andric                                          CGM.getContext().getTargetAddressSpace(DestAddressSpace));
16050b57cec5SDimitry Andric 
16060b57cec5SDimitry Andric   PlaceholderAddresses.push_back(std::make_pair(nullptr, global));
16070b57cec5SDimitry Andric 
16080b57cec5SDimitry Andric   return global;
16090b57cec5SDimitry Andric }
16100b57cec5SDimitry Andric 
16110b57cec5SDimitry Andric void ConstantEmitter::registerCurrentAddrPrivate(llvm::Constant *signal,
16120b57cec5SDimitry Andric                                            llvm::GlobalValue *placeholder) {
16130b57cec5SDimitry Andric   assert(!PlaceholderAddresses.empty());
16140b57cec5SDimitry Andric   assert(PlaceholderAddresses.back().first == nullptr);
16150b57cec5SDimitry Andric   assert(PlaceholderAddresses.back().second == placeholder);
16160b57cec5SDimitry Andric   PlaceholderAddresses.back().first = signal;
16170b57cec5SDimitry Andric }
16180b57cec5SDimitry Andric 
16190b57cec5SDimitry Andric namespace {
16200b57cec5SDimitry Andric   struct ReplacePlaceholders {
16210b57cec5SDimitry Andric     CodeGenModule &CGM;
16220b57cec5SDimitry Andric 
16230b57cec5SDimitry Andric     /// The base address of the global.
16240b57cec5SDimitry Andric     llvm::Constant *Base;
16250b57cec5SDimitry Andric     llvm::Type *BaseValueTy = nullptr;
16260b57cec5SDimitry Andric 
16270b57cec5SDimitry Andric     /// The placeholder addresses that were registered during emission.
16280b57cec5SDimitry Andric     llvm::DenseMap<llvm::Constant*, llvm::GlobalVariable*> PlaceholderAddresses;
16290b57cec5SDimitry Andric 
16300b57cec5SDimitry Andric     /// The locations of the placeholder signals.
16310b57cec5SDimitry Andric     llvm::DenseMap<llvm::GlobalVariable*, llvm::Constant*> Locations;
16320b57cec5SDimitry Andric 
16330b57cec5SDimitry Andric     /// The current index stack.  We use a simple unsigned stack because
16340b57cec5SDimitry Andric     /// we assume that placeholders will be relatively sparse in the
16350b57cec5SDimitry Andric     /// initializer, but we cache the index values we find just in case.
16360b57cec5SDimitry Andric     llvm::SmallVector<unsigned, 8> Indices;
16370b57cec5SDimitry Andric     llvm::SmallVector<llvm::Constant*, 8> IndexValues;
16380b57cec5SDimitry Andric 
16390b57cec5SDimitry Andric     ReplacePlaceholders(CodeGenModule &CGM, llvm::Constant *base,
16400b57cec5SDimitry Andric                         ArrayRef<std::pair<llvm::Constant*,
16410b57cec5SDimitry Andric                                            llvm::GlobalVariable*>> addresses)
16420b57cec5SDimitry Andric         : CGM(CGM), Base(base),
16430b57cec5SDimitry Andric           PlaceholderAddresses(addresses.begin(), addresses.end()) {
16440b57cec5SDimitry Andric     }
16450b57cec5SDimitry Andric 
16460b57cec5SDimitry Andric     void replaceInInitializer(llvm::Constant *init) {
16470b57cec5SDimitry Andric       // Remember the type of the top-most initializer.
16480b57cec5SDimitry Andric       BaseValueTy = init->getType();
16490b57cec5SDimitry Andric 
16500b57cec5SDimitry Andric       // Initialize the stack.
16510b57cec5SDimitry Andric       Indices.push_back(0);
16520b57cec5SDimitry Andric       IndexValues.push_back(nullptr);
16530b57cec5SDimitry Andric 
16540b57cec5SDimitry Andric       // Recurse into the initializer.
16550b57cec5SDimitry Andric       findLocations(init);
16560b57cec5SDimitry Andric 
16570b57cec5SDimitry Andric       // Check invariants.
16580b57cec5SDimitry Andric       assert(IndexValues.size() == Indices.size() && "mismatch");
16590b57cec5SDimitry Andric       assert(Indices.size() == 1 && "didn't pop all indices");
16600b57cec5SDimitry Andric 
16610b57cec5SDimitry Andric       // Do the replacement; this basically invalidates 'init'.
16620b57cec5SDimitry Andric       assert(Locations.size() == PlaceholderAddresses.size() &&
16630b57cec5SDimitry Andric              "missed a placeholder?");
16640b57cec5SDimitry Andric 
16650b57cec5SDimitry Andric       // We're iterating over a hashtable, so this would be a source of
16660b57cec5SDimitry Andric       // non-determinism in compiler output *except* that we're just
16670b57cec5SDimitry Andric       // messing around with llvm::Constant structures, which never itself
16680b57cec5SDimitry Andric       // does anything that should be visible in compiler output.
16690b57cec5SDimitry Andric       for (auto &entry : Locations) {
1670*0fca6ea1SDimitry Andric         assert(entry.first->getName() == "" && "not a placeholder!");
16710b57cec5SDimitry Andric         entry.first->replaceAllUsesWith(entry.second);
16720b57cec5SDimitry Andric         entry.first->eraseFromParent();
16730b57cec5SDimitry Andric       }
16740b57cec5SDimitry Andric     }
16750b57cec5SDimitry Andric 
16760b57cec5SDimitry Andric   private:
16770b57cec5SDimitry Andric     void findLocations(llvm::Constant *init) {
16780b57cec5SDimitry Andric       // Recurse into aggregates.
16790b57cec5SDimitry Andric       if (auto agg = dyn_cast<llvm::ConstantAggregate>(init)) {
16800b57cec5SDimitry Andric         for (unsigned i = 0, e = agg->getNumOperands(); i != e; ++i) {
16810b57cec5SDimitry Andric           Indices.push_back(i);
16820b57cec5SDimitry Andric           IndexValues.push_back(nullptr);
16830b57cec5SDimitry Andric 
16840b57cec5SDimitry Andric           findLocations(agg->getOperand(i));
16850b57cec5SDimitry Andric 
16860b57cec5SDimitry Andric           IndexValues.pop_back();
16870b57cec5SDimitry Andric           Indices.pop_back();
16880b57cec5SDimitry Andric         }
16890b57cec5SDimitry Andric         return;
16900b57cec5SDimitry Andric       }
16910b57cec5SDimitry Andric 
16920b57cec5SDimitry Andric       // Otherwise, check for registered constants.
16930b57cec5SDimitry Andric       while (true) {
16940b57cec5SDimitry Andric         auto it = PlaceholderAddresses.find(init);
16950b57cec5SDimitry Andric         if (it != PlaceholderAddresses.end()) {
16960b57cec5SDimitry Andric           setLocation(it->second);
16970b57cec5SDimitry Andric           break;
16980b57cec5SDimitry Andric         }
16990b57cec5SDimitry Andric 
17000b57cec5SDimitry Andric         // Look through bitcasts or other expressions.
17010b57cec5SDimitry Andric         if (auto expr = dyn_cast<llvm::ConstantExpr>(init)) {
17020b57cec5SDimitry Andric           init = expr->getOperand(0);
17030b57cec5SDimitry Andric         } else {
17040b57cec5SDimitry Andric           break;
17050b57cec5SDimitry Andric         }
17060b57cec5SDimitry Andric       }
17070b57cec5SDimitry Andric     }
17080b57cec5SDimitry Andric 
17090b57cec5SDimitry Andric     void setLocation(llvm::GlobalVariable *placeholder) {
171006c3fb27SDimitry Andric       assert(!Locations.contains(placeholder) &&
17110b57cec5SDimitry Andric              "already found location for placeholder!");
17120b57cec5SDimitry Andric 
17130b57cec5SDimitry Andric       // Lazily fill in IndexValues with the values from Indices.
17140b57cec5SDimitry Andric       // We do this in reverse because we should always have a strict
17150b57cec5SDimitry Andric       // prefix of indices from the start.
17160b57cec5SDimitry Andric       assert(Indices.size() == IndexValues.size());
17170b57cec5SDimitry Andric       for (size_t i = Indices.size() - 1; i != size_t(-1); --i) {
17180b57cec5SDimitry Andric         if (IndexValues[i]) {
17190b57cec5SDimitry Andric #ifndef NDEBUG
17200b57cec5SDimitry Andric           for (size_t j = 0; j != i + 1; ++j) {
17210b57cec5SDimitry Andric             assert(IndexValues[j] &&
17220b57cec5SDimitry Andric                    isa<llvm::ConstantInt>(IndexValues[j]) &&
17230b57cec5SDimitry Andric                    cast<llvm::ConstantInt>(IndexValues[j])->getZExtValue()
17240b57cec5SDimitry Andric                      == Indices[j]);
17250b57cec5SDimitry Andric           }
17260b57cec5SDimitry Andric #endif
17270b57cec5SDimitry Andric           break;
17280b57cec5SDimitry Andric         }
17290b57cec5SDimitry Andric 
17300b57cec5SDimitry Andric         IndexValues[i] = llvm::ConstantInt::get(CGM.Int32Ty, Indices[i]);
17310b57cec5SDimitry Andric       }
17320b57cec5SDimitry Andric 
17335f757f3fSDimitry Andric       llvm::Constant *location = llvm::ConstantExpr::getInBoundsGetElementPtr(
17345f757f3fSDimitry Andric           BaseValueTy, Base, IndexValues);
17350b57cec5SDimitry Andric 
17360b57cec5SDimitry Andric       Locations.insert({placeholder, location});
17370b57cec5SDimitry Andric     }
17380b57cec5SDimitry Andric   };
17390b57cec5SDimitry Andric }
17400b57cec5SDimitry Andric 
17410b57cec5SDimitry Andric void ConstantEmitter::finalize(llvm::GlobalVariable *global) {
17420b57cec5SDimitry Andric   assert(InitializedNonAbstract &&
17430b57cec5SDimitry Andric          "finalizing emitter that was used for abstract emission?");
17440b57cec5SDimitry Andric   assert(!Finalized && "finalizing emitter multiple times");
17450b57cec5SDimitry Andric   assert(global->getInitializer());
17460b57cec5SDimitry Andric 
17470b57cec5SDimitry Andric   // Note that we might also be Failed.
17480b57cec5SDimitry Andric   Finalized = true;
17490b57cec5SDimitry Andric 
17500b57cec5SDimitry Andric   if (!PlaceholderAddresses.empty()) {
17510b57cec5SDimitry Andric     ReplacePlaceholders(CGM, global, PlaceholderAddresses)
17520b57cec5SDimitry Andric       .replaceInInitializer(global->getInitializer());
17530b57cec5SDimitry Andric     PlaceholderAddresses.clear(); // satisfy
17540b57cec5SDimitry Andric   }
17550b57cec5SDimitry Andric }
17560b57cec5SDimitry Andric 
17570b57cec5SDimitry Andric ConstantEmitter::~ConstantEmitter() {
17580b57cec5SDimitry Andric   assert((!InitializedNonAbstract || Finalized || Failed) &&
17590b57cec5SDimitry Andric          "not finalized after being initialized for non-abstract emission");
17600b57cec5SDimitry Andric   assert(PlaceholderAddresses.empty() && "unhandled placeholders");
17610b57cec5SDimitry Andric }
17620b57cec5SDimitry Andric 
17630b57cec5SDimitry Andric static QualType getNonMemoryType(CodeGenModule &CGM, QualType type) {
17640b57cec5SDimitry Andric   if (auto AT = type->getAs<AtomicType>()) {
17650b57cec5SDimitry Andric     return CGM.getContext().getQualifiedType(AT->getValueType(),
17660b57cec5SDimitry Andric                                              type.getQualifiers());
17670b57cec5SDimitry Andric   }
17680b57cec5SDimitry Andric   return type;
17690b57cec5SDimitry Andric }
17700b57cec5SDimitry Andric 
17710b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::tryEmitPrivateForVarInit(const VarDecl &D) {
17720b57cec5SDimitry Andric   // Make a quick check if variable can be default NULL initialized
17730b57cec5SDimitry Andric   // and avoid going through rest of code which may do, for c++11,
17740b57cec5SDimitry Andric   // initialization of memory to all NULLs.
17750b57cec5SDimitry Andric   if (!D.hasLocalStorage()) {
17760b57cec5SDimitry Andric     QualType Ty = CGM.getContext().getBaseElementType(D.getType());
17770b57cec5SDimitry Andric     if (Ty->isRecordType())
17780b57cec5SDimitry Andric       if (const CXXConstructExpr *E =
17790b57cec5SDimitry Andric           dyn_cast_or_null<CXXConstructExpr>(D.getInit())) {
17800b57cec5SDimitry Andric         const CXXConstructorDecl *CD = E->getConstructor();
17810b57cec5SDimitry Andric         if (CD->isTrivial() && CD->isDefaultConstructor())
17820b57cec5SDimitry Andric           return CGM.EmitNullConstant(D.getType());
17830b57cec5SDimitry Andric       }
17840b57cec5SDimitry Andric   }
178506c3fb27SDimitry Andric   InConstantContext = D.hasConstantInitialization();
17860b57cec5SDimitry Andric 
17870b57cec5SDimitry Andric   QualType destType = D.getType();
17880b57cec5SDimitry Andric   const Expr *E = D.getInit();
17890b57cec5SDimitry Andric   assert(E && "No initializer to emit");
17900b57cec5SDimitry Andric 
179106c3fb27SDimitry Andric   if (!destType->isReferenceType()) {
179206c3fb27SDimitry Andric     QualType nonMemoryDestType = getNonMemoryType(CGM, destType);
1793*0fca6ea1SDimitry Andric     if (llvm::Constant *C = ConstExprEmitter(*this).Visit(E, nonMemoryDestType))
179406c3fb27SDimitry Andric       return emitForMemory(C, destType);
179506c3fb27SDimitry Andric   }
179606c3fb27SDimitry Andric 
179706c3fb27SDimitry Andric   // Try to emit the initializer.  Note that this can allow some things that
179806c3fb27SDimitry Andric   // are not allowed by tryEmitPrivateForMemory alone.
179906c3fb27SDimitry Andric   if (APValue *value = D.evaluateValue())
180006c3fb27SDimitry Andric     return tryEmitPrivateForMemory(*value, destType);
180106c3fb27SDimitry Andric 
180206c3fb27SDimitry Andric   return nullptr;
18030b57cec5SDimitry Andric }
18040b57cec5SDimitry Andric 
18050b57cec5SDimitry Andric llvm::Constant *
18060b57cec5SDimitry Andric ConstantEmitter::tryEmitAbstractForMemory(const Expr *E, QualType destType) {
18070b57cec5SDimitry Andric   auto nonMemoryDestType = getNonMemoryType(CGM, destType);
18080b57cec5SDimitry Andric   auto C = tryEmitAbstract(E, nonMemoryDestType);
18090b57cec5SDimitry Andric   return (C ? emitForMemory(C, destType) : nullptr);
18100b57cec5SDimitry Andric }
18110b57cec5SDimitry Andric 
18120b57cec5SDimitry Andric llvm::Constant *
18130b57cec5SDimitry Andric ConstantEmitter::tryEmitAbstractForMemory(const APValue &value,
18140b57cec5SDimitry Andric                                           QualType destType) {
18150b57cec5SDimitry Andric   auto nonMemoryDestType = getNonMemoryType(CGM, destType);
18160b57cec5SDimitry Andric   auto C = tryEmitAbstract(value, nonMemoryDestType);
18170b57cec5SDimitry Andric   return (C ? emitForMemory(C, destType) : nullptr);
18180b57cec5SDimitry Andric }
18190b57cec5SDimitry Andric 
18200b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::tryEmitPrivateForMemory(const Expr *E,
18210b57cec5SDimitry Andric                                                          QualType destType) {
18220b57cec5SDimitry Andric   auto nonMemoryDestType = getNonMemoryType(CGM, destType);
18230b57cec5SDimitry Andric   llvm::Constant *C = tryEmitPrivate(E, nonMemoryDestType);
18240b57cec5SDimitry Andric   return (C ? emitForMemory(C, destType) : nullptr);
18250b57cec5SDimitry Andric }
18260b57cec5SDimitry Andric 
18270b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::tryEmitPrivateForMemory(const APValue &value,
18280b57cec5SDimitry Andric                                                          QualType destType) {
18290b57cec5SDimitry Andric   auto nonMemoryDestType = getNonMemoryType(CGM, destType);
18300b57cec5SDimitry Andric   auto C = tryEmitPrivate(value, nonMemoryDestType);
18310b57cec5SDimitry Andric   return (C ? emitForMemory(C, destType) : nullptr);
18320b57cec5SDimitry Andric }
18330b57cec5SDimitry Andric 
1834*0fca6ea1SDimitry Andric /// Try to emit a constant signed pointer, given a raw pointer and the
1835*0fca6ea1SDimitry Andric /// destination ptrauth qualifier.
1836*0fca6ea1SDimitry Andric ///
1837*0fca6ea1SDimitry Andric /// This can fail if the qualifier needs address discrimination and the
1838*0fca6ea1SDimitry Andric /// emitter is in an abstract mode.
1839*0fca6ea1SDimitry Andric llvm::Constant *
1840*0fca6ea1SDimitry Andric ConstantEmitter::tryEmitConstantSignedPointer(llvm::Constant *UnsignedPointer,
1841*0fca6ea1SDimitry Andric                                               PointerAuthQualifier Schema) {
1842*0fca6ea1SDimitry Andric   assert(Schema && "applying trivial ptrauth schema");
1843*0fca6ea1SDimitry Andric 
1844*0fca6ea1SDimitry Andric   if (Schema.hasKeyNone())
1845*0fca6ea1SDimitry Andric     return UnsignedPointer;
1846*0fca6ea1SDimitry Andric 
1847*0fca6ea1SDimitry Andric   unsigned Key = Schema.getKey();
1848*0fca6ea1SDimitry Andric 
1849*0fca6ea1SDimitry Andric   // Create an address placeholder if we're using address discrimination.
1850*0fca6ea1SDimitry Andric   llvm::GlobalValue *StorageAddress = nullptr;
1851*0fca6ea1SDimitry Andric   if (Schema.isAddressDiscriminated()) {
1852*0fca6ea1SDimitry Andric     // We can't do this if the emitter is in an abstract state.
1853*0fca6ea1SDimitry Andric     if (isAbstract())
1854*0fca6ea1SDimitry Andric       return nullptr;
1855*0fca6ea1SDimitry Andric 
1856*0fca6ea1SDimitry Andric     StorageAddress = getCurrentAddrPrivate();
1857*0fca6ea1SDimitry Andric   }
1858*0fca6ea1SDimitry Andric 
1859*0fca6ea1SDimitry Andric   llvm::ConstantInt *Discriminator =
1860*0fca6ea1SDimitry Andric       llvm::ConstantInt::get(CGM.IntPtrTy, Schema.getExtraDiscriminator());
1861*0fca6ea1SDimitry Andric 
1862*0fca6ea1SDimitry Andric   llvm::Constant *SignedPointer = CGM.getConstantSignedPointer(
1863*0fca6ea1SDimitry Andric       UnsignedPointer, Key, StorageAddress, Discriminator);
1864*0fca6ea1SDimitry Andric 
1865*0fca6ea1SDimitry Andric   if (Schema.isAddressDiscriminated())
1866*0fca6ea1SDimitry Andric     registerCurrentAddrPrivate(SignedPointer, StorageAddress);
1867*0fca6ea1SDimitry Andric 
1868*0fca6ea1SDimitry Andric   return SignedPointer;
1869*0fca6ea1SDimitry Andric }
1870*0fca6ea1SDimitry Andric 
18710b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::emitForMemory(CodeGenModule &CGM,
18720b57cec5SDimitry Andric                                                llvm::Constant *C,
18730b57cec5SDimitry Andric                                                QualType destType) {
18740b57cec5SDimitry Andric   // For an _Atomic-qualified constant, we may need to add tail padding.
18750b57cec5SDimitry Andric   if (auto AT = destType->getAs<AtomicType>()) {
18760b57cec5SDimitry Andric     QualType destValueType = AT->getValueType();
18770b57cec5SDimitry Andric     C = emitForMemory(CGM, C, destValueType);
18780b57cec5SDimitry Andric 
18790b57cec5SDimitry Andric     uint64_t innerSize = CGM.getContext().getTypeSize(destValueType);
18800b57cec5SDimitry Andric     uint64_t outerSize = CGM.getContext().getTypeSize(destType);
18810b57cec5SDimitry Andric     if (innerSize == outerSize)
18820b57cec5SDimitry Andric       return C;
18830b57cec5SDimitry Andric 
18840b57cec5SDimitry Andric     assert(innerSize < outerSize && "emitted over-large constant for atomic");
18850b57cec5SDimitry Andric     llvm::Constant *elts[] = {
18860b57cec5SDimitry Andric       C,
18870b57cec5SDimitry Andric       llvm::ConstantAggregateZero::get(
18880b57cec5SDimitry Andric           llvm::ArrayType::get(CGM.Int8Ty, (outerSize - innerSize) / 8))
18890b57cec5SDimitry Andric     };
18900b57cec5SDimitry Andric     return llvm::ConstantStruct::getAnon(elts);
18910b57cec5SDimitry Andric   }
18920b57cec5SDimitry Andric 
18930b57cec5SDimitry Andric   // Zero-extend bool.
189406c3fb27SDimitry Andric   if (C->getType()->isIntegerTy(1) && !destType->isBitIntType()) {
18950b57cec5SDimitry Andric     llvm::Type *boolTy = CGM.getTypes().ConvertTypeForMem(destType);
18965f757f3fSDimitry Andric     llvm::Constant *Res = llvm::ConstantFoldCastOperand(
18975f757f3fSDimitry Andric         llvm::Instruction::ZExt, C, boolTy, CGM.getDataLayout());
18985f757f3fSDimitry Andric     assert(Res && "Constant folding must succeed");
18995f757f3fSDimitry Andric     return Res;
19000b57cec5SDimitry Andric   }
19010b57cec5SDimitry Andric 
1902*0fca6ea1SDimitry Andric   if (destType->isBitIntType()) {
1903*0fca6ea1SDimitry Andric     ConstantAggregateBuilder Builder(CGM);
1904*0fca6ea1SDimitry Andric     llvm::Type *LoadStoreTy = CGM.getTypes().convertTypeForLoadStore(destType);
1905*0fca6ea1SDimitry Andric     // ptrtoint/inttoptr should not involve _BitInt in constant expressions, so
1906*0fca6ea1SDimitry Andric     // casting to ConstantInt is safe here.
1907*0fca6ea1SDimitry Andric     auto *CI = cast<llvm::ConstantInt>(C);
1908*0fca6ea1SDimitry Andric     llvm::Constant *Res = llvm::ConstantFoldCastOperand(
1909*0fca6ea1SDimitry Andric         destType->isSignedIntegerOrEnumerationType() ? llvm::Instruction::SExt
1910*0fca6ea1SDimitry Andric                                                      : llvm::Instruction::ZExt,
1911*0fca6ea1SDimitry Andric         CI, LoadStoreTy, CGM.getDataLayout());
1912*0fca6ea1SDimitry Andric     if (CGM.getTypes().typeRequiresSplitIntoByteArray(destType, C->getType())) {
1913*0fca6ea1SDimitry Andric       // Long _BitInt has array of bytes as in-memory type.
1914*0fca6ea1SDimitry Andric       // So, split constant into individual bytes.
1915*0fca6ea1SDimitry Andric       llvm::Type *DesiredTy = CGM.getTypes().ConvertTypeForMem(destType);
1916*0fca6ea1SDimitry Andric       llvm::APInt Value = cast<llvm::ConstantInt>(Res)->getValue();
1917*0fca6ea1SDimitry Andric       Builder.addBits(Value, /*OffsetInBits=*/0, /*AllowOverwrite=*/false);
1918*0fca6ea1SDimitry Andric       return Builder.build(DesiredTy, /*AllowOversized*/ false);
1919*0fca6ea1SDimitry Andric     }
1920*0fca6ea1SDimitry Andric     return Res;
1921*0fca6ea1SDimitry Andric   }
1922*0fca6ea1SDimitry Andric 
19230b57cec5SDimitry Andric   return C;
19240b57cec5SDimitry Andric }
19250b57cec5SDimitry Andric 
19260b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::tryEmitPrivate(const Expr *E,
19270b57cec5SDimitry Andric                                                 QualType destType) {
1928349cc55cSDimitry Andric   assert(!destType->isVoidType() && "can't emit a void constant");
1929349cc55cSDimitry Andric 
1930b121cb00SDimitry Andric   if (!destType->isReferenceType())
1931*0fca6ea1SDimitry Andric     if (llvm::Constant *C = ConstExprEmitter(*this).Visit(E, destType))
193206c3fb27SDimitry Andric       return C;
193306c3fb27SDimitry Andric 
19340b57cec5SDimitry Andric   Expr::EvalResult Result;
19350b57cec5SDimitry Andric 
19360b57cec5SDimitry Andric   bool Success = false;
19370b57cec5SDimitry Andric 
19380b57cec5SDimitry Andric   if (destType->isReferenceType())
19390b57cec5SDimitry Andric     Success = E->EvaluateAsLValue(Result, CGM.getContext());
19400b57cec5SDimitry Andric   else
19410b57cec5SDimitry Andric     Success = E->EvaluateAsRValue(Result, CGM.getContext(), InConstantContext);
19420b57cec5SDimitry Andric 
19430b57cec5SDimitry Andric   if (Success && !Result.HasSideEffects)
194406c3fb27SDimitry Andric     return tryEmitPrivate(Result.Val, destType);
19450b57cec5SDimitry Andric 
194606c3fb27SDimitry Andric   return nullptr;
19470b57cec5SDimitry Andric }
19480b57cec5SDimitry Andric 
19490b57cec5SDimitry Andric llvm::Constant *CodeGenModule::getNullPointer(llvm::PointerType *T, QualType QT) {
19500b57cec5SDimitry Andric   return getTargetCodeGenInfo().getNullPointer(*this, T, QT);
19510b57cec5SDimitry Andric }
19520b57cec5SDimitry Andric 
19530b57cec5SDimitry Andric namespace {
19540b57cec5SDimitry Andric /// A struct which can be used to peephole certain kinds of finalization
19550b57cec5SDimitry Andric /// that normally happen during l-value emission.
19560b57cec5SDimitry Andric struct ConstantLValue {
19570b57cec5SDimitry Andric   llvm::Constant *Value;
19580b57cec5SDimitry Andric   bool HasOffsetApplied;
19590b57cec5SDimitry Andric 
19600b57cec5SDimitry Andric   /*implicit*/ ConstantLValue(llvm::Constant *value,
19610b57cec5SDimitry Andric                               bool hasOffsetApplied = false)
1962480093f4SDimitry Andric     : Value(value), HasOffsetApplied(hasOffsetApplied) {}
19630b57cec5SDimitry Andric 
19640b57cec5SDimitry Andric   /*implicit*/ ConstantLValue(ConstantAddress address)
19650b57cec5SDimitry Andric     : ConstantLValue(address.getPointer()) {}
19660b57cec5SDimitry Andric };
19670b57cec5SDimitry Andric 
19680b57cec5SDimitry Andric /// A helper class for emitting constant l-values.
19690b57cec5SDimitry Andric class ConstantLValueEmitter : public ConstStmtVisitor<ConstantLValueEmitter,
19700b57cec5SDimitry Andric                                                       ConstantLValue> {
19710b57cec5SDimitry Andric   CodeGenModule &CGM;
19720b57cec5SDimitry Andric   ConstantEmitter &Emitter;
19730b57cec5SDimitry Andric   const APValue &Value;
19740b57cec5SDimitry Andric   QualType DestType;
1975*0fca6ea1SDimitry Andric   bool EnablePtrAuthFunctionTypeDiscrimination;
19760b57cec5SDimitry Andric 
19770b57cec5SDimitry Andric   // Befriend StmtVisitorBase so that we don't have to expose Visit*.
19780b57cec5SDimitry Andric   friend StmtVisitorBase;
19790b57cec5SDimitry Andric 
19800b57cec5SDimitry Andric public:
19810b57cec5SDimitry Andric   ConstantLValueEmitter(ConstantEmitter &emitter, const APValue &value,
1982*0fca6ea1SDimitry Andric                         QualType destType,
1983*0fca6ea1SDimitry Andric                         bool EnablePtrAuthFunctionTypeDiscrimination = true)
1984*0fca6ea1SDimitry Andric       : CGM(emitter.CGM), Emitter(emitter), Value(value), DestType(destType),
1985*0fca6ea1SDimitry Andric         EnablePtrAuthFunctionTypeDiscrimination(
1986*0fca6ea1SDimitry Andric             EnablePtrAuthFunctionTypeDiscrimination) {}
19870b57cec5SDimitry Andric 
19880b57cec5SDimitry Andric   llvm::Constant *tryEmit();
19890b57cec5SDimitry Andric 
19900b57cec5SDimitry Andric private:
19910b57cec5SDimitry Andric   llvm::Constant *tryEmitAbsolute(llvm::Type *destTy);
19920b57cec5SDimitry Andric   ConstantLValue tryEmitBase(const APValue::LValueBase &base);
19930b57cec5SDimitry Andric 
19940b57cec5SDimitry Andric   ConstantLValue VisitStmt(const Stmt *S) { return nullptr; }
19950b57cec5SDimitry Andric   ConstantLValue VisitConstantExpr(const ConstantExpr *E);
19960b57cec5SDimitry Andric   ConstantLValue VisitCompoundLiteralExpr(const CompoundLiteralExpr *E);
19970b57cec5SDimitry Andric   ConstantLValue VisitStringLiteral(const StringLiteral *E);
19980b57cec5SDimitry Andric   ConstantLValue VisitObjCBoxedExpr(const ObjCBoxedExpr *E);
19990b57cec5SDimitry Andric   ConstantLValue VisitObjCEncodeExpr(const ObjCEncodeExpr *E);
20000b57cec5SDimitry Andric   ConstantLValue VisitObjCStringLiteral(const ObjCStringLiteral *E);
20010b57cec5SDimitry Andric   ConstantLValue VisitPredefinedExpr(const PredefinedExpr *E);
20020b57cec5SDimitry Andric   ConstantLValue VisitAddrLabelExpr(const AddrLabelExpr *E);
20030b57cec5SDimitry Andric   ConstantLValue VisitCallExpr(const CallExpr *E);
20040b57cec5SDimitry Andric   ConstantLValue VisitBlockExpr(const BlockExpr *E);
20050b57cec5SDimitry Andric   ConstantLValue VisitCXXTypeidExpr(const CXXTypeidExpr *E);
20060b57cec5SDimitry Andric   ConstantLValue VisitMaterializeTemporaryExpr(
20070b57cec5SDimitry Andric                                          const MaterializeTemporaryExpr *E);
20080b57cec5SDimitry Andric 
2009*0fca6ea1SDimitry Andric   ConstantLValue emitPointerAuthSignConstant(const CallExpr *E);
2010*0fca6ea1SDimitry Andric   llvm::Constant *emitPointerAuthPointer(const Expr *E);
2011*0fca6ea1SDimitry Andric   unsigned emitPointerAuthKey(const Expr *E);
2012*0fca6ea1SDimitry Andric   std::pair<llvm::Constant *, llvm::ConstantInt *>
2013*0fca6ea1SDimitry Andric   emitPointerAuthDiscriminator(const Expr *E);
2014*0fca6ea1SDimitry Andric 
20150b57cec5SDimitry Andric   bool hasNonZeroOffset() const {
20160b57cec5SDimitry Andric     return !Value.getLValueOffset().isZero();
20170b57cec5SDimitry Andric   }
20180b57cec5SDimitry Andric 
20190b57cec5SDimitry Andric   /// Return the value offset.
20200b57cec5SDimitry Andric   llvm::Constant *getOffset() {
20210b57cec5SDimitry Andric     return llvm::ConstantInt::get(CGM.Int64Ty,
20220b57cec5SDimitry Andric                                   Value.getLValueOffset().getQuantity());
20230b57cec5SDimitry Andric   }
20240b57cec5SDimitry Andric 
20250b57cec5SDimitry Andric   /// Apply the value offset to the given constant.
20260b57cec5SDimitry Andric   llvm::Constant *applyOffset(llvm::Constant *C) {
20270b57cec5SDimitry Andric     if (!hasNonZeroOffset())
20280b57cec5SDimitry Andric       return C;
20290b57cec5SDimitry Andric 
20305f757f3fSDimitry Andric     return llvm::ConstantExpr::getGetElementPtr(CGM.Int8Ty, C, getOffset());
20310b57cec5SDimitry Andric   }
20320b57cec5SDimitry Andric };
20330b57cec5SDimitry Andric 
20340b57cec5SDimitry Andric }
20350b57cec5SDimitry Andric 
20360b57cec5SDimitry Andric llvm::Constant *ConstantLValueEmitter::tryEmit() {
20370b57cec5SDimitry Andric   const APValue::LValueBase &base = Value.getLValueBase();
20380b57cec5SDimitry Andric 
20390b57cec5SDimitry Andric   // The destination type should be a pointer or reference
20400b57cec5SDimitry Andric   // type, but it might also be a cast thereof.
20410b57cec5SDimitry Andric   //
20420b57cec5SDimitry Andric   // FIXME: the chain of casts required should be reflected in the APValue.
20430b57cec5SDimitry Andric   // We need this in order to correctly handle things like a ptrtoint of a
20440b57cec5SDimitry Andric   // non-zero null pointer and addrspace casts that aren't trivially
20450b57cec5SDimitry Andric   // represented in LLVM IR.
20460b57cec5SDimitry Andric   auto destTy = CGM.getTypes().ConvertTypeForMem(DestType);
20470b57cec5SDimitry Andric   assert(isa<llvm::IntegerType>(destTy) || isa<llvm::PointerType>(destTy));
20480b57cec5SDimitry Andric 
20490b57cec5SDimitry Andric   // If there's no base at all, this is a null or absolute pointer,
20500b57cec5SDimitry Andric   // possibly cast back to an integer type.
20510b57cec5SDimitry Andric   if (!base) {
20520b57cec5SDimitry Andric     return tryEmitAbsolute(destTy);
20530b57cec5SDimitry Andric   }
20540b57cec5SDimitry Andric 
20550b57cec5SDimitry Andric   // Otherwise, try to emit the base.
20560b57cec5SDimitry Andric   ConstantLValue result = tryEmitBase(base);
20570b57cec5SDimitry Andric 
20580b57cec5SDimitry Andric   // If that failed, we're done.
20590b57cec5SDimitry Andric   llvm::Constant *value = result.Value;
20600b57cec5SDimitry Andric   if (!value) return nullptr;
20610b57cec5SDimitry Andric 
20620b57cec5SDimitry Andric   // Apply the offset if necessary and not already done.
20630b57cec5SDimitry Andric   if (!result.HasOffsetApplied) {
20640b57cec5SDimitry Andric     value = applyOffset(value);
20650b57cec5SDimitry Andric   }
20660b57cec5SDimitry Andric 
20670b57cec5SDimitry Andric   // Convert to the appropriate type; this could be an lvalue for
20680b57cec5SDimitry Andric   // an integer.  FIXME: performAddrSpaceCast
20690b57cec5SDimitry Andric   if (isa<llvm::PointerType>(destTy))
20700b57cec5SDimitry Andric     return llvm::ConstantExpr::getPointerCast(value, destTy);
20710b57cec5SDimitry Andric 
20720b57cec5SDimitry Andric   return llvm::ConstantExpr::getPtrToInt(value, destTy);
20730b57cec5SDimitry Andric }
20740b57cec5SDimitry Andric 
20750b57cec5SDimitry Andric /// Try to emit an absolute l-value, such as a null pointer or an integer
20760b57cec5SDimitry Andric /// bitcast to pointer type.
20770b57cec5SDimitry Andric llvm::Constant *
20780b57cec5SDimitry Andric ConstantLValueEmitter::tryEmitAbsolute(llvm::Type *destTy) {
20790b57cec5SDimitry Andric   // If we're producing a pointer, this is easy.
20800b57cec5SDimitry Andric   auto destPtrTy = cast<llvm::PointerType>(destTy);
20810b57cec5SDimitry Andric   if (Value.isNullPointer()) {
20820b57cec5SDimitry Andric     // FIXME: integer offsets from non-zero null pointers.
20830b57cec5SDimitry Andric     return CGM.getNullPointer(destPtrTy, DestType);
20840b57cec5SDimitry Andric   }
20850b57cec5SDimitry Andric 
20860b57cec5SDimitry Andric   // Convert the integer to a pointer-sized integer before converting it
20870b57cec5SDimitry Andric   // to a pointer.
20880b57cec5SDimitry Andric   // FIXME: signedness depends on the original integer type.
20890b57cec5SDimitry Andric   auto intptrTy = CGM.getDataLayout().getIntPtrType(destPtrTy);
20900b57cec5SDimitry Andric   llvm::Constant *C;
20915f757f3fSDimitry Andric   C = llvm::ConstantFoldIntegerCast(getOffset(), intptrTy, /*isSigned*/ false,
20925f757f3fSDimitry Andric                                     CGM.getDataLayout());
20935f757f3fSDimitry Andric   assert(C && "Must have folded, as Offset is a ConstantInt");
20940b57cec5SDimitry Andric   C = llvm::ConstantExpr::getIntToPtr(C, destPtrTy);
20950b57cec5SDimitry Andric   return C;
20960b57cec5SDimitry Andric }
20970b57cec5SDimitry Andric 
20980b57cec5SDimitry Andric ConstantLValue
20990b57cec5SDimitry Andric ConstantLValueEmitter::tryEmitBase(const APValue::LValueBase &base) {
21000b57cec5SDimitry Andric   // Handle values.
21010b57cec5SDimitry Andric   if (const ValueDecl *D = base.dyn_cast<const ValueDecl*>()) {
2102e8d8bef9SDimitry Andric     // The constant always points to the canonical declaration. We want to look
2103e8d8bef9SDimitry Andric     // at properties of the most recent declaration at the point of emission.
2104e8d8bef9SDimitry Andric     D = cast<ValueDecl>(D->getMostRecentDecl());
2105e8d8bef9SDimitry Andric 
21060b57cec5SDimitry Andric     if (D->hasAttr<WeakRefAttr>())
21070b57cec5SDimitry Andric       return CGM.GetWeakRefReference(D).getPointer();
21080b57cec5SDimitry Andric 
2109*0fca6ea1SDimitry Andric     auto PtrAuthSign = [&](llvm::Constant *C) {
2110*0fca6ea1SDimitry Andric       CGPointerAuthInfo AuthInfo;
21110b57cec5SDimitry Andric 
2112*0fca6ea1SDimitry Andric       if (EnablePtrAuthFunctionTypeDiscrimination)
2113*0fca6ea1SDimitry Andric         AuthInfo = CGM.getFunctionPointerAuthInfo(DestType);
2114*0fca6ea1SDimitry Andric 
2115*0fca6ea1SDimitry Andric       if (AuthInfo) {
2116*0fca6ea1SDimitry Andric         if (hasNonZeroOffset())
2117*0fca6ea1SDimitry Andric           return ConstantLValue(nullptr);
2118*0fca6ea1SDimitry Andric 
2119*0fca6ea1SDimitry Andric         C = applyOffset(C);
2120*0fca6ea1SDimitry Andric         C = CGM.getConstantSignedPointer(
2121*0fca6ea1SDimitry Andric             C, AuthInfo.getKey(), nullptr,
2122*0fca6ea1SDimitry Andric             cast_or_null<llvm::ConstantInt>(AuthInfo.getDiscriminator()));
2123*0fca6ea1SDimitry Andric         return ConstantLValue(C, /*applied offset*/ true);
2124*0fca6ea1SDimitry Andric       }
2125*0fca6ea1SDimitry Andric 
2126*0fca6ea1SDimitry Andric       return ConstantLValue(C);
2127*0fca6ea1SDimitry Andric     };
2128*0fca6ea1SDimitry Andric 
2129*0fca6ea1SDimitry Andric     if (const auto *FD = dyn_cast<FunctionDecl>(D))
2130*0fca6ea1SDimitry Andric       return PtrAuthSign(CGM.getRawFunctionPointer(FD));
2131*0fca6ea1SDimitry Andric 
2132*0fca6ea1SDimitry Andric     if (const auto *VD = dyn_cast<VarDecl>(D)) {
21330b57cec5SDimitry Andric       // We can never refer to a variable with local storage.
21340b57cec5SDimitry Andric       if (!VD->hasLocalStorage()) {
21350b57cec5SDimitry Andric         if (VD->isFileVarDecl() || VD->hasExternalStorage())
21360b57cec5SDimitry Andric           return CGM.GetAddrOfGlobalVar(VD);
21370b57cec5SDimitry Andric 
21380b57cec5SDimitry Andric         if (VD->isLocalVarDecl()) {
21390b57cec5SDimitry Andric           return CGM.getOrCreateStaticVarDecl(
21408a4dda33SDimitry Andric               *VD, CGM.getLLVMLinkageVarDefinition(VD));
21410b57cec5SDimitry Andric         }
21420b57cec5SDimitry Andric       }
21430b57cec5SDimitry Andric     }
21440b57cec5SDimitry Andric 
2145*0fca6ea1SDimitry Andric     if (const auto *GD = dyn_cast<MSGuidDecl>(D))
21465ffd83dbSDimitry Andric       return CGM.GetAddrOfMSGuidDecl(GD);
21475ffd83dbSDimitry Andric 
2148*0fca6ea1SDimitry Andric     if (const auto *GCD = dyn_cast<UnnamedGlobalConstantDecl>(D))
214981ad6265SDimitry Andric       return CGM.GetAddrOfUnnamedGlobalConstantDecl(GCD);
215081ad6265SDimitry Andric 
2151*0fca6ea1SDimitry Andric     if (const auto *TPO = dyn_cast<TemplateParamObjectDecl>(D))
2152e8d8bef9SDimitry Andric       return CGM.GetAddrOfTemplateParamObject(TPO);
2153e8d8bef9SDimitry Andric 
21540b57cec5SDimitry Andric     return nullptr;
21550b57cec5SDimitry Andric   }
21560b57cec5SDimitry Andric 
21570b57cec5SDimitry Andric   // Handle typeid(T).
215806c3fb27SDimitry Andric   if (TypeInfoLValue TI = base.dyn_cast<TypeInfoLValue>())
215906c3fb27SDimitry Andric     return CGM.GetAddrOfRTTIDescriptor(QualType(TI.getType(), 0));
21600b57cec5SDimitry Andric 
21610b57cec5SDimitry Andric   // Otherwise, it must be an expression.
21620b57cec5SDimitry Andric   return Visit(base.get<const Expr*>());
21630b57cec5SDimitry Andric }
21640b57cec5SDimitry Andric 
21650b57cec5SDimitry Andric ConstantLValue
21660b57cec5SDimitry Andric ConstantLValueEmitter::VisitConstantExpr(const ConstantExpr *E) {
21675ffd83dbSDimitry Andric   if (llvm::Constant *Result = Emitter.tryEmitConstantExpr(E))
21685ffd83dbSDimitry Andric     return Result;
21690b57cec5SDimitry Andric   return Visit(E->getSubExpr());
21700b57cec5SDimitry Andric }
21710b57cec5SDimitry Andric 
21720b57cec5SDimitry Andric ConstantLValue
21730b57cec5SDimitry Andric ConstantLValueEmitter::VisitCompoundLiteralExpr(const CompoundLiteralExpr *E) {
2174bdd1243dSDimitry Andric   ConstantEmitter CompoundLiteralEmitter(CGM, Emitter.CGF);
2175bdd1243dSDimitry Andric   CompoundLiteralEmitter.setInConstantContext(Emitter.isInConstantContext());
2176bdd1243dSDimitry Andric   return tryEmitGlobalCompoundLiteral(CompoundLiteralEmitter, E);
21770b57cec5SDimitry Andric }
21780b57cec5SDimitry Andric 
21790b57cec5SDimitry Andric ConstantLValue
21800b57cec5SDimitry Andric ConstantLValueEmitter::VisitStringLiteral(const StringLiteral *E) {
21810b57cec5SDimitry Andric   return CGM.GetAddrOfConstantStringFromLiteral(E);
21820b57cec5SDimitry Andric }
21830b57cec5SDimitry Andric 
21840b57cec5SDimitry Andric ConstantLValue
21850b57cec5SDimitry Andric ConstantLValueEmitter::VisitObjCEncodeExpr(const ObjCEncodeExpr *E) {
21860b57cec5SDimitry Andric   return CGM.GetAddrOfConstantStringFromObjCEncode(E);
21870b57cec5SDimitry Andric }
21880b57cec5SDimitry Andric 
21890b57cec5SDimitry Andric static ConstantLValue emitConstantObjCStringLiteral(const StringLiteral *S,
21900b57cec5SDimitry Andric                                                     QualType T,
21910b57cec5SDimitry Andric                                                     CodeGenModule &CGM) {
21920b57cec5SDimitry Andric   auto C = CGM.getObjCRuntime().GenerateConstantString(S);
219306c3fb27SDimitry Andric   return C.withElementType(CGM.getTypes().ConvertTypeForMem(T));
21940b57cec5SDimitry Andric }
21950b57cec5SDimitry Andric 
21960b57cec5SDimitry Andric ConstantLValue
21970b57cec5SDimitry Andric ConstantLValueEmitter::VisitObjCStringLiteral(const ObjCStringLiteral *E) {
21980b57cec5SDimitry Andric   return emitConstantObjCStringLiteral(E->getString(), E->getType(), CGM);
21990b57cec5SDimitry Andric }
22000b57cec5SDimitry Andric 
22010b57cec5SDimitry Andric ConstantLValue
22020b57cec5SDimitry Andric ConstantLValueEmitter::VisitObjCBoxedExpr(const ObjCBoxedExpr *E) {
22030b57cec5SDimitry Andric   assert(E->isExpressibleAsConstantInitializer() &&
22040b57cec5SDimitry Andric          "this boxed expression can't be emitted as a compile-time constant");
2205*0fca6ea1SDimitry Andric   const auto *SL = cast<StringLiteral>(E->getSubExpr()->IgnoreParenCasts());
22060b57cec5SDimitry Andric   return emitConstantObjCStringLiteral(SL, E->getType(), CGM);
22070b57cec5SDimitry Andric }
22080b57cec5SDimitry Andric 
22090b57cec5SDimitry Andric ConstantLValue
22100b57cec5SDimitry Andric ConstantLValueEmitter::VisitPredefinedExpr(const PredefinedExpr *E) {
22110b57cec5SDimitry Andric   return CGM.GetAddrOfConstantStringFromLiteral(E->getFunctionName());
22120b57cec5SDimitry Andric }
22130b57cec5SDimitry Andric 
22140b57cec5SDimitry Andric ConstantLValue
22150b57cec5SDimitry Andric ConstantLValueEmitter::VisitAddrLabelExpr(const AddrLabelExpr *E) {
22160b57cec5SDimitry Andric   assert(Emitter.CGF && "Invalid address of label expression outside function");
22170b57cec5SDimitry Andric   llvm::Constant *Ptr = Emitter.CGF->GetAddrOfLabel(E->getLabel());
22180b57cec5SDimitry Andric   return Ptr;
22190b57cec5SDimitry Andric }
22200b57cec5SDimitry Andric 
22210b57cec5SDimitry Andric ConstantLValue
22220b57cec5SDimitry Andric ConstantLValueEmitter::VisitCallExpr(const CallExpr *E) {
22230b57cec5SDimitry Andric   unsigned builtin = E->getBuiltinCallee();
22240eae32dcSDimitry Andric   if (builtin == Builtin::BI__builtin_function_start)
22250eae32dcSDimitry Andric     return CGM.GetFunctionStart(
22260eae32dcSDimitry Andric         E->getArg(0)->getAsBuiltinConstantDeclRef(CGM.getContext()));
2227*0fca6ea1SDimitry Andric 
2228*0fca6ea1SDimitry Andric   if (builtin == Builtin::BI__builtin_ptrauth_sign_constant)
2229*0fca6ea1SDimitry Andric     return emitPointerAuthSignConstant(E);
2230*0fca6ea1SDimitry Andric 
22310b57cec5SDimitry Andric   if (builtin != Builtin::BI__builtin___CFStringMakeConstantString &&
22320b57cec5SDimitry Andric       builtin != Builtin::BI__builtin___NSStringMakeConstantString)
22330b57cec5SDimitry Andric     return nullptr;
22340b57cec5SDimitry Andric 
2235*0fca6ea1SDimitry Andric   const auto *Literal = cast<StringLiteral>(E->getArg(0)->IgnoreParenCasts());
22360b57cec5SDimitry Andric   if (builtin == Builtin::BI__builtin___NSStringMakeConstantString) {
2237*0fca6ea1SDimitry Andric     return CGM.getObjCRuntime().GenerateConstantString(Literal);
22380b57cec5SDimitry Andric   } else {
22390b57cec5SDimitry Andric     // FIXME: need to deal with UCN conversion issues.
2240*0fca6ea1SDimitry Andric     return CGM.GetAddrOfConstantCFString(Literal);
22410b57cec5SDimitry Andric   }
22420b57cec5SDimitry Andric }
22430b57cec5SDimitry Andric 
22440b57cec5SDimitry Andric ConstantLValue
2245*0fca6ea1SDimitry Andric ConstantLValueEmitter::emitPointerAuthSignConstant(const CallExpr *E) {
2246*0fca6ea1SDimitry Andric   llvm::Constant *UnsignedPointer = emitPointerAuthPointer(E->getArg(0));
2247*0fca6ea1SDimitry Andric   unsigned Key = emitPointerAuthKey(E->getArg(1));
2248*0fca6ea1SDimitry Andric   auto [StorageAddress, OtherDiscriminator] =
2249*0fca6ea1SDimitry Andric       emitPointerAuthDiscriminator(E->getArg(2));
2250*0fca6ea1SDimitry Andric 
2251*0fca6ea1SDimitry Andric   llvm::Constant *SignedPointer = CGM.getConstantSignedPointer(
2252*0fca6ea1SDimitry Andric       UnsignedPointer, Key, StorageAddress, OtherDiscriminator);
2253*0fca6ea1SDimitry Andric   return SignedPointer;
2254*0fca6ea1SDimitry Andric }
2255*0fca6ea1SDimitry Andric 
2256*0fca6ea1SDimitry Andric llvm::Constant *ConstantLValueEmitter::emitPointerAuthPointer(const Expr *E) {
2257*0fca6ea1SDimitry Andric   Expr::EvalResult Result;
2258*0fca6ea1SDimitry Andric   bool Succeeded = E->EvaluateAsRValue(Result, CGM.getContext());
2259*0fca6ea1SDimitry Andric   assert(Succeeded);
2260*0fca6ea1SDimitry Andric   (void)Succeeded;
2261*0fca6ea1SDimitry Andric 
2262*0fca6ea1SDimitry Andric   // The assertions here are all checked by Sema.
2263*0fca6ea1SDimitry Andric   assert(Result.Val.isLValue());
2264*0fca6ea1SDimitry Andric   if (isa<FunctionDecl>(Result.Val.getLValueBase().get<const ValueDecl *>()))
2265*0fca6ea1SDimitry Andric     assert(Result.Val.getLValueOffset().isZero());
2266*0fca6ea1SDimitry Andric   return ConstantEmitter(CGM, Emitter.CGF)
2267*0fca6ea1SDimitry Andric       .emitAbstract(E->getExprLoc(), Result.Val, E->getType(), false);
2268*0fca6ea1SDimitry Andric }
2269*0fca6ea1SDimitry Andric 
2270*0fca6ea1SDimitry Andric unsigned ConstantLValueEmitter::emitPointerAuthKey(const Expr *E) {
2271*0fca6ea1SDimitry Andric   return E->EvaluateKnownConstInt(CGM.getContext()).getZExtValue();
2272*0fca6ea1SDimitry Andric }
2273*0fca6ea1SDimitry Andric 
2274*0fca6ea1SDimitry Andric std::pair<llvm::Constant *, llvm::ConstantInt *>
2275*0fca6ea1SDimitry Andric ConstantLValueEmitter::emitPointerAuthDiscriminator(const Expr *E) {
2276*0fca6ea1SDimitry Andric   E = E->IgnoreParens();
2277*0fca6ea1SDimitry Andric 
2278*0fca6ea1SDimitry Andric   if (const auto *Call = dyn_cast<CallExpr>(E)) {
2279*0fca6ea1SDimitry Andric     if (Call->getBuiltinCallee() ==
2280*0fca6ea1SDimitry Andric         Builtin::BI__builtin_ptrauth_blend_discriminator) {
2281*0fca6ea1SDimitry Andric       llvm::Constant *Pointer = ConstantEmitter(CGM).emitAbstract(
2282*0fca6ea1SDimitry Andric           Call->getArg(0), Call->getArg(0)->getType());
2283*0fca6ea1SDimitry Andric       auto *Extra = cast<llvm::ConstantInt>(ConstantEmitter(CGM).emitAbstract(
2284*0fca6ea1SDimitry Andric           Call->getArg(1), Call->getArg(1)->getType()));
2285*0fca6ea1SDimitry Andric       return {Pointer, Extra};
2286*0fca6ea1SDimitry Andric     }
2287*0fca6ea1SDimitry Andric   }
2288*0fca6ea1SDimitry Andric 
2289*0fca6ea1SDimitry Andric   llvm::Constant *Result = ConstantEmitter(CGM).emitAbstract(E, E->getType());
2290*0fca6ea1SDimitry Andric   if (Result->getType()->isPointerTy())
2291*0fca6ea1SDimitry Andric     return {Result, nullptr};
2292*0fca6ea1SDimitry Andric   return {nullptr, cast<llvm::ConstantInt>(Result)};
2293*0fca6ea1SDimitry Andric }
2294*0fca6ea1SDimitry Andric 
2295*0fca6ea1SDimitry Andric ConstantLValue
22960b57cec5SDimitry Andric ConstantLValueEmitter::VisitBlockExpr(const BlockExpr *E) {
22970b57cec5SDimitry Andric   StringRef functionName;
22980b57cec5SDimitry Andric   if (auto CGF = Emitter.CGF)
22990b57cec5SDimitry Andric     functionName = CGF->CurFn->getName();
23000b57cec5SDimitry Andric   else
23010b57cec5SDimitry Andric     functionName = "global";
23020b57cec5SDimitry Andric 
23030b57cec5SDimitry Andric   return CGM.GetAddrOfGlobalBlock(E, functionName);
23040b57cec5SDimitry Andric }
23050b57cec5SDimitry Andric 
23060b57cec5SDimitry Andric ConstantLValue
23070b57cec5SDimitry Andric ConstantLValueEmitter::VisitCXXTypeidExpr(const CXXTypeidExpr *E) {
23080b57cec5SDimitry Andric   QualType T;
23090b57cec5SDimitry Andric   if (E->isTypeOperand())
23100b57cec5SDimitry Andric     T = E->getTypeOperand(CGM.getContext());
23110b57cec5SDimitry Andric   else
23120b57cec5SDimitry Andric     T = E->getExprOperand()->getType();
23130b57cec5SDimitry Andric   return CGM.GetAddrOfRTTIDescriptor(T);
23140b57cec5SDimitry Andric }
23150b57cec5SDimitry Andric 
23160b57cec5SDimitry Andric ConstantLValue
23170b57cec5SDimitry Andric ConstantLValueEmitter::VisitMaterializeTemporaryExpr(
23180b57cec5SDimitry Andric                                             const MaterializeTemporaryExpr *E) {
23190b57cec5SDimitry Andric   assert(E->getStorageDuration() == SD_Static);
2320*0fca6ea1SDimitry Andric   const Expr *Inner = E->getSubExpr()->skipRValueSubobjectAdjustments();
23210b57cec5SDimitry Andric   return CGM.GetAddrOfGlobalTemporary(E, Inner);
23220b57cec5SDimitry Andric }
23230b57cec5SDimitry Andric 
2324*0fca6ea1SDimitry Andric llvm::Constant *
2325*0fca6ea1SDimitry Andric ConstantEmitter::tryEmitPrivate(const APValue &Value, QualType DestType,
2326*0fca6ea1SDimitry Andric                                 bool EnablePtrAuthFunctionTypeDiscrimination) {
23270b57cec5SDimitry Andric   switch (Value.getKind()) {
23280b57cec5SDimitry Andric   case APValue::None:
23290b57cec5SDimitry Andric   case APValue::Indeterminate:
23300b57cec5SDimitry Andric     // Out-of-lifetime and indeterminate values can be modeled as 'undef'.
23310b57cec5SDimitry Andric     return llvm::UndefValue::get(CGM.getTypes().ConvertType(DestType));
23320b57cec5SDimitry Andric   case APValue::LValue:
2333*0fca6ea1SDimitry Andric     return ConstantLValueEmitter(*this, Value, DestType,
2334*0fca6ea1SDimitry Andric                                  EnablePtrAuthFunctionTypeDiscrimination)
2335*0fca6ea1SDimitry Andric         .tryEmit();
23360b57cec5SDimitry Andric   case APValue::Int:
23370b57cec5SDimitry Andric     return llvm::ConstantInt::get(CGM.getLLVMContext(), Value.getInt());
23380b57cec5SDimitry Andric   case APValue::FixedPoint:
23390b57cec5SDimitry Andric     return llvm::ConstantInt::get(CGM.getLLVMContext(),
23400b57cec5SDimitry Andric                                   Value.getFixedPoint().getValue());
23410b57cec5SDimitry Andric   case APValue::ComplexInt: {
23420b57cec5SDimitry Andric     llvm::Constant *Complex[2];
23430b57cec5SDimitry Andric 
23440b57cec5SDimitry Andric     Complex[0] = llvm::ConstantInt::get(CGM.getLLVMContext(),
23450b57cec5SDimitry Andric                                         Value.getComplexIntReal());
23460b57cec5SDimitry Andric     Complex[1] = llvm::ConstantInt::get(CGM.getLLVMContext(),
23470b57cec5SDimitry Andric                                         Value.getComplexIntImag());
23480b57cec5SDimitry Andric 
23490b57cec5SDimitry Andric     // FIXME: the target may want to specify that this is packed.
23500b57cec5SDimitry Andric     llvm::StructType *STy =
23510b57cec5SDimitry Andric         llvm::StructType::get(Complex[0]->getType(), Complex[1]->getType());
23520b57cec5SDimitry Andric     return llvm::ConstantStruct::get(STy, Complex);
23530b57cec5SDimitry Andric   }
23540b57cec5SDimitry Andric   case APValue::Float: {
23550b57cec5SDimitry Andric     const llvm::APFloat &Init = Value.getFloat();
23560b57cec5SDimitry Andric     if (&Init.getSemantics() == &llvm::APFloat::IEEEhalf() &&
23570b57cec5SDimitry Andric         !CGM.getContext().getLangOpts().NativeHalfType &&
23580b57cec5SDimitry Andric         CGM.getContext().getTargetInfo().useFP16ConversionIntrinsics())
23590b57cec5SDimitry Andric       return llvm::ConstantInt::get(CGM.getLLVMContext(),
23600b57cec5SDimitry Andric                                     Init.bitcastToAPInt());
23610b57cec5SDimitry Andric     else
23620b57cec5SDimitry Andric       return llvm::ConstantFP::get(CGM.getLLVMContext(), Init);
23630b57cec5SDimitry Andric   }
23640b57cec5SDimitry Andric   case APValue::ComplexFloat: {
23650b57cec5SDimitry Andric     llvm::Constant *Complex[2];
23660b57cec5SDimitry Andric 
23670b57cec5SDimitry Andric     Complex[0] = llvm::ConstantFP::get(CGM.getLLVMContext(),
23680b57cec5SDimitry Andric                                        Value.getComplexFloatReal());
23690b57cec5SDimitry Andric     Complex[1] = llvm::ConstantFP::get(CGM.getLLVMContext(),
23700b57cec5SDimitry Andric                                        Value.getComplexFloatImag());
23710b57cec5SDimitry Andric 
23720b57cec5SDimitry Andric     // FIXME: the target may want to specify that this is packed.
23730b57cec5SDimitry Andric     llvm::StructType *STy =
23740b57cec5SDimitry Andric         llvm::StructType::get(Complex[0]->getType(), Complex[1]->getType());
23750b57cec5SDimitry Andric     return llvm::ConstantStruct::get(STy, Complex);
23760b57cec5SDimitry Andric   }
23770b57cec5SDimitry Andric   case APValue::Vector: {
23780b57cec5SDimitry Andric     unsigned NumElts = Value.getVectorLength();
23790b57cec5SDimitry Andric     SmallVector<llvm::Constant *, 4> Inits(NumElts);
23800b57cec5SDimitry Andric 
23810b57cec5SDimitry Andric     for (unsigned I = 0; I != NumElts; ++I) {
23820b57cec5SDimitry Andric       const APValue &Elt = Value.getVectorElt(I);
23830b57cec5SDimitry Andric       if (Elt.isInt())
23840b57cec5SDimitry Andric         Inits[I] = llvm::ConstantInt::get(CGM.getLLVMContext(), Elt.getInt());
23850b57cec5SDimitry Andric       else if (Elt.isFloat())
23860b57cec5SDimitry Andric         Inits[I] = llvm::ConstantFP::get(CGM.getLLVMContext(), Elt.getFloat());
23875f757f3fSDimitry Andric       else if (Elt.isIndeterminate())
23885f757f3fSDimitry Andric         Inits[I] = llvm::UndefValue::get(CGM.getTypes().ConvertType(
23895f757f3fSDimitry Andric             DestType->castAs<VectorType>()->getElementType()));
23900b57cec5SDimitry Andric       else
23910b57cec5SDimitry Andric         llvm_unreachable("unsupported vector element type");
23920b57cec5SDimitry Andric     }
23930b57cec5SDimitry Andric     return llvm::ConstantVector::get(Inits);
23940b57cec5SDimitry Andric   }
23950b57cec5SDimitry Andric   case APValue::AddrLabelDiff: {
23960b57cec5SDimitry Andric     const AddrLabelExpr *LHSExpr = Value.getAddrLabelDiffLHS();
23970b57cec5SDimitry Andric     const AddrLabelExpr *RHSExpr = Value.getAddrLabelDiffRHS();
23980b57cec5SDimitry Andric     llvm::Constant *LHS = tryEmitPrivate(LHSExpr, LHSExpr->getType());
23990b57cec5SDimitry Andric     llvm::Constant *RHS = tryEmitPrivate(RHSExpr, RHSExpr->getType());
24000b57cec5SDimitry Andric     if (!LHS || !RHS) return nullptr;
24010b57cec5SDimitry Andric 
24020b57cec5SDimitry Andric     // Compute difference
24030b57cec5SDimitry Andric     llvm::Type *ResultType = CGM.getTypes().ConvertType(DestType);
24040b57cec5SDimitry Andric     LHS = llvm::ConstantExpr::getPtrToInt(LHS, CGM.IntPtrTy);
24050b57cec5SDimitry Andric     RHS = llvm::ConstantExpr::getPtrToInt(RHS, CGM.IntPtrTy);
24060b57cec5SDimitry Andric     llvm::Constant *AddrLabelDiff = llvm::ConstantExpr::getSub(LHS, RHS);
24070b57cec5SDimitry Andric 
24080b57cec5SDimitry Andric     // LLVM is a bit sensitive about the exact format of the
24090b57cec5SDimitry Andric     // address-of-label difference; make sure to truncate after
24100b57cec5SDimitry Andric     // the subtraction.
24110b57cec5SDimitry Andric     return llvm::ConstantExpr::getTruncOrBitCast(AddrLabelDiff, ResultType);
24120b57cec5SDimitry Andric   }
24130b57cec5SDimitry Andric   case APValue::Struct:
24140b57cec5SDimitry Andric   case APValue::Union:
24150b57cec5SDimitry Andric     return ConstStructBuilder::BuildStruct(*this, Value, DestType);
24160b57cec5SDimitry Andric   case APValue::Array: {
2417e8d8bef9SDimitry Andric     const ArrayType *ArrayTy = CGM.getContext().getAsArrayType(DestType);
24180b57cec5SDimitry Andric     unsigned NumElements = Value.getArraySize();
24190b57cec5SDimitry Andric     unsigned NumInitElts = Value.getArrayInitializedElts();
24200b57cec5SDimitry Andric 
24210b57cec5SDimitry Andric     // Emit array filler, if there is one.
24220b57cec5SDimitry Andric     llvm::Constant *Filler = nullptr;
24230b57cec5SDimitry Andric     if (Value.hasArrayFiller()) {
24240b57cec5SDimitry Andric       Filler = tryEmitAbstractForMemory(Value.getArrayFiller(),
2425e8d8bef9SDimitry Andric                                         ArrayTy->getElementType());
24260b57cec5SDimitry Andric       if (!Filler)
24270b57cec5SDimitry Andric         return nullptr;
24280b57cec5SDimitry Andric     }
24290b57cec5SDimitry Andric 
24300b57cec5SDimitry Andric     // Emit initializer elements.
24310b57cec5SDimitry Andric     SmallVector<llvm::Constant*, 16> Elts;
24320b57cec5SDimitry Andric     if (Filler && Filler->isNullValue())
24330b57cec5SDimitry Andric       Elts.reserve(NumInitElts + 1);
24340b57cec5SDimitry Andric     else
24350b57cec5SDimitry Andric       Elts.reserve(NumElements);
24360b57cec5SDimitry Andric 
24370b57cec5SDimitry Andric     llvm::Type *CommonElementType = nullptr;
24380b57cec5SDimitry Andric     for (unsigned I = 0; I < NumInitElts; ++I) {
24390b57cec5SDimitry Andric       llvm::Constant *C = tryEmitPrivateForMemory(
2440e8d8bef9SDimitry Andric           Value.getArrayInitializedElt(I), ArrayTy->getElementType());
24410b57cec5SDimitry Andric       if (!C) return nullptr;
24420b57cec5SDimitry Andric 
24430b57cec5SDimitry Andric       if (I == 0)
24440b57cec5SDimitry Andric         CommonElementType = C->getType();
24450b57cec5SDimitry Andric       else if (C->getType() != CommonElementType)
24460b57cec5SDimitry Andric         CommonElementType = nullptr;
24470b57cec5SDimitry Andric       Elts.push_back(C);
24480b57cec5SDimitry Andric     }
24490b57cec5SDimitry Andric 
24500b57cec5SDimitry Andric     llvm::ArrayType *Desired =
24510b57cec5SDimitry Andric         cast<llvm::ArrayType>(CGM.getTypes().ConvertType(DestType));
245206c3fb27SDimitry Andric 
245306c3fb27SDimitry Andric     // Fix the type of incomplete arrays if the initializer isn't empty.
245406c3fb27SDimitry Andric     if (DestType->isIncompleteArrayType() && !Elts.empty())
245506c3fb27SDimitry Andric       Desired = llvm::ArrayType::get(Desired->getElementType(), Elts.size());
245606c3fb27SDimitry Andric 
24570b57cec5SDimitry Andric     return EmitArrayConstant(CGM, Desired, CommonElementType, NumElements, Elts,
24580b57cec5SDimitry Andric                              Filler);
24590b57cec5SDimitry Andric   }
24600b57cec5SDimitry Andric   case APValue::MemberPointer:
24610b57cec5SDimitry Andric     return CGM.getCXXABI().EmitMemberPointer(Value, DestType);
24620b57cec5SDimitry Andric   }
24630b57cec5SDimitry Andric   llvm_unreachable("Unknown APValue kind");
24640b57cec5SDimitry Andric }
24650b57cec5SDimitry Andric 
24660b57cec5SDimitry Andric llvm::GlobalVariable *CodeGenModule::getAddrOfConstantCompoundLiteralIfEmitted(
24670b57cec5SDimitry Andric     const CompoundLiteralExpr *E) {
24680b57cec5SDimitry Andric   return EmittedCompoundLiterals.lookup(E);
24690b57cec5SDimitry Andric }
24700b57cec5SDimitry Andric 
24710b57cec5SDimitry Andric void CodeGenModule::setAddrOfConstantCompoundLiteral(
24720b57cec5SDimitry Andric     const CompoundLiteralExpr *CLE, llvm::GlobalVariable *GV) {
24730b57cec5SDimitry Andric   bool Ok = EmittedCompoundLiterals.insert(std::make_pair(CLE, GV)).second;
24740b57cec5SDimitry Andric   (void)Ok;
24750b57cec5SDimitry Andric   assert(Ok && "CLE has already been emitted!");
24760b57cec5SDimitry Andric }
24770b57cec5SDimitry Andric 
24780b57cec5SDimitry Andric ConstantAddress
24790b57cec5SDimitry Andric CodeGenModule::GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr *E) {
24800b57cec5SDimitry Andric   assert(E->isFileScope() && "not a file-scope compound literal expr");
2481bdd1243dSDimitry Andric   ConstantEmitter emitter(*this);
2482bdd1243dSDimitry Andric   return tryEmitGlobalCompoundLiteral(emitter, E);
24830b57cec5SDimitry Andric }
24840b57cec5SDimitry Andric 
24850b57cec5SDimitry Andric llvm::Constant *
24860b57cec5SDimitry Andric CodeGenModule::getMemberPointerConstant(const UnaryOperator *uo) {
24870b57cec5SDimitry Andric   // Member pointer constants always have a very particular form.
24880b57cec5SDimitry Andric   const MemberPointerType *type = cast<MemberPointerType>(uo->getType());
24890b57cec5SDimitry Andric   const ValueDecl *decl = cast<DeclRefExpr>(uo->getSubExpr())->getDecl();
24900b57cec5SDimitry Andric 
24910b57cec5SDimitry Andric   // A member function pointer.
24920b57cec5SDimitry Andric   if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(decl))
24930b57cec5SDimitry Andric     return getCXXABI().EmitMemberFunctionPointer(method);
24940b57cec5SDimitry Andric 
24950b57cec5SDimitry Andric   // Otherwise, a member data pointer.
24960b57cec5SDimitry Andric   uint64_t fieldOffset = getContext().getFieldOffset(decl);
24970b57cec5SDimitry Andric   CharUnits chars = getContext().toCharUnitsFromBits((int64_t) fieldOffset);
24980b57cec5SDimitry Andric   return getCXXABI().EmitMemberDataPointer(type, chars);
24990b57cec5SDimitry Andric }
25000b57cec5SDimitry Andric 
25010b57cec5SDimitry Andric static llvm::Constant *EmitNullConstantForBase(CodeGenModule &CGM,
25020b57cec5SDimitry Andric                                                llvm::Type *baseType,
25030b57cec5SDimitry Andric                                                const CXXRecordDecl *base);
25040b57cec5SDimitry Andric 
25050b57cec5SDimitry Andric static llvm::Constant *EmitNullConstant(CodeGenModule &CGM,
25060b57cec5SDimitry Andric                                         const RecordDecl *record,
25070b57cec5SDimitry Andric                                         bool asCompleteObject) {
25080b57cec5SDimitry Andric   const CGRecordLayout &layout = CGM.getTypes().getCGRecordLayout(record);
25090b57cec5SDimitry Andric   llvm::StructType *structure =
25100b57cec5SDimitry Andric     (asCompleteObject ? layout.getLLVMType()
25110b57cec5SDimitry Andric                       : layout.getBaseSubobjectLLVMType());
25120b57cec5SDimitry Andric 
25130b57cec5SDimitry Andric   unsigned numElements = structure->getNumElements();
25140b57cec5SDimitry Andric   std::vector<llvm::Constant *> elements(numElements);
25150b57cec5SDimitry Andric 
25160b57cec5SDimitry Andric   auto CXXR = dyn_cast<CXXRecordDecl>(record);
25170b57cec5SDimitry Andric   // Fill in all the bases.
25180b57cec5SDimitry Andric   if (CXXR) {
25190b57cec5SDimitry Andric     for (const auto &I : CXXR->bases()) {
25200b57cec5SDimitry Andric       if (I.isVirtual()) {
25210b57cec5SDimitry Andric         // Ignore virtual bases; if we're laying out for a complete
25220b57cec5SDimitry Andric         // object, we'll lay these out later.
25230b57cec5SDimitry Andric         continue;
25240b57cec5SDimitry Andric       }
25250b57cec5SDimitry Andric 
25260b57cec5SDimitry Andric       const CXXRecordDecl *base =
25270b57cec5SDimitry Andric         cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
25280b57cec5SDimitry Andric 
25290b57cec5SDimitry Andric       // Ignore empty bases.
2530*0fca6ea1SDimitry Andric       if (isEmptyRecordForLayout(CGM.getContext(), I.getType()) ||
2531*0fca6ea1SDimitry Andric           CGM.getContext()
2532*0fca6ea1SDimitry Andric               .getASTRecordLayout(base)
2533*0fca6ea1SDimitry Andric               .getNonVirtualSize()
25340b57cec5SDimitry Andric               .isZero())
25350b57cec5SDimitry Andric         continue;
25360b57cec5SDimitry Andric 
25370b57cec5SDimitry Andric       unsigned fieldIndex = layout.getNonVirtualBaseLLVMFieldNo(base);
25380b57cec5SDimitry Andric       llvm::Type *baseType = structure->getElementType(fieldIndex);
25390b57cec5SDimitry Andric       elements[fieldIndex] = EmitNullConstantForBase(CGM, baseType, base);
25400b57cec5SDimitry Andric     }
25410b57cec5SDimitry Andric   }
25420b57cec5SDimitry Andric 
25430b57cec5SDimitry Andric   // Fill in all the fields.
25440b57cec5SDimitry Andric   for (const auto *Field : record->fields()) {
25450b57cec5SDimitry Andric     // Fill in non-bitfields. (Bitfields always use a zero pattern, which we
25460b57cec5SDimitry Andric     // will fill in later.)
2547*0fca6ea1SDimitry Andric     if (!Field->isBitField() &&
2548*0fca6ea1SDimitry Andric         !isEmptyFieldForLayout(CGM.getContext(), Field)) {
25490b57cec5SDimitry Andric       unsigned fieldIndex = layout.getLLVMFieldNo(Field);
25500b57cec5SDimitry Andric       elements[fieldIndex] = CGM.EmitNullConstant(Field->getType());
25510b57cec5SDimitry Andric     }
25520b57cec5SDimitry Andric 
25530b57cec5SDimitry Andric     // For unions, stop after the first named field.
25540b57cec5SDimitry Andric     if (record->isUnion()) {
25550b57cec5SDimitry Andric       if (Field->getIdentifier())
25560b57cec5SDimitry Andric         break;
25570b57cec5SDimitry Andric       if (const auto *FieldRD = Field->getType()->getAsRecordDecl())
25580b57cec5SDimitry Andric         if (FieldRD->findFirstNamedDataMember())
25590b57cec5SDimitry Andric           break;
25600b57cec5SDimitry Andric     }
25610b57cec5SDimitry Andric   }
25620b57cec5SDimitry Andric 
25630b57cec5SDimitry Andric   // Fill in the virtual bases, if we're working with the complete object.
25640b57cec5SDimitry Andric   if (CXXR && asCompleteObject) {
25650b57cec5SDimitry Andric     for (const auto &I : CXXR->vbases()) {
25660b57cec5SDimitry Andric       const CXXRecordDecl *base =
25670b57cec5SDimitry Andric         cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
25680b57cec5SDimitry Andric 
25690b57cec5SDimitry Andric       // Ignore empty bases.
2570*0fca6ea1SDimitry Andric       if (isEmptyRecordForLayout(CGM.getContext(), I.getType()))
25710b57cec5SDimitry Andric         continue;
25720b57cec5SDimitry Andric 
25730b57cec5SDimitry Andric       unsigned fieldIndex = layout.getVirtualBaseIndex(base);
25740b57cec5SDimitry Andric 
25750b57cec5SDimitry Andric       // We might have already laid this field out.
25760b57cec5SDimitry Andric       if (elements[fieldIndex]) continue;
25770b57cec5SDimitry Andric 
25780b57cec5SDimitry Andric       llvm::Type *baseType = structure->getElementType(fieldIndex);
25790b57cec5SDimitry Andric       elements[fieldIndex] = EmitNullConstantForBase(CGM, baseType, base);
25800b57cec5SDimitry Andric     }
25810b57cec5SDimitry Andric   }
25820b57cec5SDimitry Andric 
25830b57cec5SDimitry Andric   // Now go through all other fields and zero them out.
25840b57cec5SDimitry Andric   for (unsigned i = 0; i != numElements; ++i) {
25850b57cec5SDimitry Andric     if (!elements[i])
25860b57cec5SDimitry Andric       elements[i] = llvm::Constant::getNullValue(structure->getElementType(i));
25870b57cec5SDimitry Andric   }
25880b57cec5SDimitry Andric 
25890b57cec5SDimitry Andric   return llvm::ConstantStruct::get(structure, elements);
25900b57cec5SDimitry Andric }
25910b57cec5SDimitry Andric 
25920b57cec5SDimitry Andric /// Emit the null constant for a base subobject.
25930b57cec5SDimitry Andric static llvm::Constant *EmitNullConstantForBase(CodeGenModule &CGM,
25940b57cec5SDimitry Andric                                                llvm::Type *baseType,
25950b57cec5SDimitry Andric                                                const CXXRecordDecl *base) {
25960b57cec5SDimitry Andric   const CGRecordLayout &baseLayout = CGM.getTypes().getCGRecordLayout(base);
25970b57cec5SDimitry Andric 
25980b57cec5SDimitry Andric   // Just zero out bases that don't have any pointer to data members.
25990b57cec5SDimitry Andric   if (baseLayout.isZeroInitializableAsBase())
26000b57cec5SDimitry Andric     return llvm::Constant::getNullValue(baseType);
26010b57cec5SDimitry Andric 
26020b57cec5SDimitry Andric   // Otherwise, we can just use its null constant.
26030b57cec5SDimitry Andric   return EmitNullConstant(CGM, base, /*asCompleteObject=*/false);
26040b57cec5SDimitry Andric }
26050b57cec5SDimitry Andric 
26060b57cec5SDimitry Andric llvm::Constant *ConstantEmitter::emitNullForMemory(CodeGenModule &CGM,
26070b57cec5SDimitry Andric                                                    QualType T) {
26080b57cec5SDimitry Andric   return emitForMemory(CGM, CGM.EmitNullConstant(T), T);
26090b57cec5SDimitry Andric }
26100b57cec5SDimitry Andric 
26110b57cec5SDimitry Andric llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {
26120b57cec5SDimitry Andric   if (T->getAs<PointerType>())
26130b57cec5SDimitry Andric     return getNullPointer(
26140b57cec5SDimitry Andric         cast<llvm::PointerType>(getTypes().ConvertTypeForMem(T)), T);
26150b57cec5SDimitry Andric 
26160b57cec5SDimitry Andric   if (getTypes().isZeroInitializable(T))
26170b57cec5SDimitry Andric     return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T));
26180b57cec5SDimitry Andric 
26190b57cec5SDimitry Andric   if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(T)) {
26200b57cec5SDimitry Andric     llvm::ArrayType *ATy =
26210b57cec5SDimitry Andric       cast<llvm::ArrayType>(getTypes().ConvertTypeForMem(T));
26220b57cec5SDimitry Andric 
26230b57cec5SDimitry Andric     QualType ElementTy = CAT->getElementType();
26240b57cec5SDimitry Andric 
26250b57cec5SDimitry Andric     llvm::Constant *Element =
26260b57cec5SDimitry Andric       ConstantEmitter::emitNullForMemory(*this, ElementTy);
2627*0fca6ea1SDimitry Andric     unsigned NumElements = CAT->getZExtSize();
26280b57cec5SDimitry Andric     SmallVector<llvm::Constant *, 8> Array(NumElements, Element);
26290b57cec5SDimitry Andric     return llvm::ConstantArray::get(ATy, Array);
26300b57cec5SDimitry Andric   }
26310b57cec5SDimitry Andric 
26320b57cec5SDimitry Andric   if (const RecordType *RT = T->getAs<RecordType>())
26330b57cec5SDimitry Andric     return ::EmitNullConstant(*this, RT->getDecl(), /*complete object*/ true);
26340b57cec5SDimitry Andric 
26350b57cec5SDimitry Andric   assert(T->isMemberDataPointerType() &&
26360b57cec5SDimitry Andric          "Should only see pointers to data members here!");
26370b57cec5SDimitry Andric 
26380b57cec5SDimitry Andric   return getCXXABI().EmitNullMemberPointer(T->castAs<MemberPointerType>());
26390b57cec5SDimitry Andric }
26400b57cec5SDimitry Andric 
26410b57cec5SDimitry Andric llvm::Constant *
26420b57cec5SDimitry Andric CodeGenModule::EmitNullConstantForBase(const CXXRecordDecl *Record) {
26430b57cec5SDimitry Andric   return ::EmitNullConstant(*this, Record, false);
26440b57cec5SDimitry Andric }
2645