xref: /aosp_15_r20/external/clang/lib/CodeGen/CGExprConstant.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- CGExprConstant.cpp - Emit LLVM Code from Constant Expressions ----===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This contains code to emit Constant Expr nodes as LLVM code.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #include "CodeGenFunction.h"
15*67e74705SXin Li #include "CGCXXABI.h"
16*67e74705SXin Li #include "CGObjCRuntime.h"
17*67e74705SXin Li #include "CGRecordLayout.h"
18*67e74705SXin Li #include "CodeGenModule.h"
19*67e74705SXin Li #include "clang/AST/APValue.h"
20*67e74705SXin Li #include "clang/AST/ASTContext.h"
21*67e74705SXin Li #include "clang/AST/RecordLayout.h"
22*67e74705SXin Li #include "clang/AST/StmtVisitor.h"
23*67e74705SXin Li #include "clang/Basic/Builtins.h"
24*67e74705SXin Li #include "llvm/IR/Constants.h"
25*67e74705SXin Li #include "llvm/IR/DataLayout.h"
26*67e74705SXin Li #include "llvm/IR/Function.h"
27*67e74705SXin Li #include "llvm/IR/GlobalVariable.h"
28*67e74705SXin Li using namespace clang;
29*67e74705SXin Li using namespace CodeGen;
30*67e74705SXin Li 
31*67e74705SXin Li //===----------------------------------------------------------------------===//
32*67e74705SXin Li //                            ConstStructBuilder
33*67e74705SXin Li //===----------------------------------------------------------------------===//
34*67e74705SXin Li 
35*67e74705SXin Li namespace {
36*67e74705SXin Li class ConstExprEmitter;
37*67e74705SXin Li class ConstStructBuilder {
38*67e74705SXin Li   CodeGenModule &CGM;
39*67e74705SXin Li   CodeGenFunction *CGF;
40*67e74705SXin Li 
41*67e74705SXin Li   bool Packed;
42*67e74705SXin Li   CharUnits NextFieldOffsetInChars;
43*67e74705SXin Li   CharUnits LLVMStructAlignment;
44*67e74705SXin Li   SmallVector<llvm::Constant *, 32> Elements;
45*67e74705SXin Li public:
46*67e74705SXin Li   static llvm::Constant *BuildStruct(CodeGenModule &CGM, CodeGenFunction *CFG,
47*67e74705SXin Li                                      ConstExprEmitter *Emitter,
48*67e74705SXin Li                                      llvm::ConstantStruct *Base,
49*67e74705SXin Li                                      InitListExpr *Updater);
50*67e74705SXin Li   static llvm::Constant *BuildStruct(CodeGenModule &CGM, CodeGenFunction *CGF,
51*67e74705SXin Li                                      InitListExpr *ILE);
52*67e74705SXin Li   static llvm::Constant *BuildStruct(CodeGenModule &CGM, CodeGenFunction *CGF,
53*67e74705SXin Li                                      const APValue &Value, QualType ValTy);
54*67e74705SXin Li 
55*67e74705SXin Li private:
ConstStructBuilder(CodeGenModule & CGM,CodeGenFunction * CGF)56*67e74705SXin Li   ConstStructBuilder(CodeGenModule &CGM, CodeGenFunction *CGF)
57*67e74705SXin Li     : CGM(CGM), CGF(CGF), Packed(false),
58*67e74705SXin Li     NextFieldOffsetInChars(CharUnits::Zero()),
59*67e74705SXin Li     LLVMStructAlignment(CharUnits::One()) { }
60*67e74705SXin Li 
61*67e74705SXin Li   void AppendField(const FieldDecl *Field, uint64_t FieldOffset,
62*67e74705SXin Li                    llvm::Constant *InitExpr);
63*67e74705SXin Li 
64*67e74705SXin Li   void AppendBytes(CharUnits FieldOffsetInChars, llvm::Constant *InitCst);
65*67e74705SXin Li 
66*67e74705SXin Li   void AppendBitField(const FieldDecl *Field, uint64_t FieldOffset,
67*67e74705SXin Li                       llvm::ConstantInt *InitExpr);
68*67e74705SXin Li 
69*67e74705SXin Li   void AppendPadding(CharUnits PadSize);
70*67e74705SXin Li 
71*67e74705SXin Li   void AppendTailPadding(CharUnits RecordSize);
72*67e74705SXin Li 
73*67e74705SXin Li   void ConvertStructToPacked();
74*67e74705SXin Li 
75*67e74705SXin Li   bool Build(InitListExpr *ILE);
76*67e74705SXin Li   bool Build(ConstExprEmitter *Emitter, llvm::ConstantStruct *Base,
77*67e74705SXin Li              InitListExpr *Updater);
78*67e74705SXin Li   void Build(const APValue &Val, const RecordDecl *RD, bool IsPrimaryBase,
79*67e74705SXin Li              const CXXRecordDecl *VTableClass, CharUnits BaseOffset);
80*67e74705SXin Li   llvm::Constant *Finalize(QualType Ty);
81*67e74705SXin Li 
getAlignment(const llvm::Constant * C) const82*67e74705SXin Li   CharUnits getAlignment(const llvm::Constant *C) const {
83*67e74705SXin Li     if (Packed)  return CharUnits::One();
84*67e74705SXin Li     return CharUnits::fromQuantity(
85*67e74705SXin Li         CGM.getDataLayout().getABITypeAlignment(C->getType()));
86*67e74705SXin Li   }
87*67e74705SXin Li 
getSizeInChars(const llvm::Constant * C) const88*67e74705SXin Li   CharUnits getSizeInChars(const llvm::Constant *C) const {
89*67e74705SXin Li     return CharUnits::fromQuantity(
90*67e74705SXin Li         CGM.getDataLayout().getTypeAllocSize(C->getType()));
91*67e74705SXin Li   }
92*67e74705SXin Li };
93*67e74705SXin Li 
94*67e74705SXin Li void ConstStructBuilder::
AppendField(const FieldDecl * Field,uint64_t FieldOffset,llvm::Constant * InitCst)95*67e74705SXin Li AppendField(const FieldDecl *Field, uint64_t FieldOffset,
96*67e74705SXin Li             llvm::Constant *InitCst) {
97*67e74705SXin Li   const ASTContext &Context = CGM.getContext();
98*67e74705SXin Li 
99*67e74705SXin Li   CharUnits FieldOffsetInChars = Context.toCharUnitsFromBits(FieldOffset);
100*67e74705SXin Li 
101*67e74705SXin Li   AppendBytes(FieldOffsetInChars, InitCst);
102*67e74705SXin Li }
103*67e74705SXin Li 
104*67e74705SXin Li void ConstStructBuilder::
AppendBytes(CharUnits FieldOffsetInChars,llvm::Constant * InitCst)105*67e74705SXin Li AppendBytes(CharUnits FieldOffsetInChars, llvm::Constant *InitCst) {
106*67e74705SXin Li 
107*67e74705SXin Li   assert(NextFieldOffsetInChars <= FieldOffsetInChars
108*67e74705SXin Li          && "Field offset mismatch!");
109*67e74705SXin Li 
110*67e74705SXin Li   CharUnits FieldAlignment = getAlignment(InitCst);
111*67e74705SXin Li 
112*67e74705SXin Li   // Round up the field offset to the alignment of the field type.
113*67e74705SXin Li   CharUnits AlignedNextFieldOffsetInChars =
114*67e74705SXin Li       NextFieldOffsetInChars.alignTo(FieldAlignment);
115*67e74705SXin Li 
116*67e74705SXin Li   if (AlignedNextFieldOffsetInChars < FieldOffsetInChars) {
117*67e74705SXin Li     // We need to append padding.
118*67e74705SXin Li     AppendPadding(FieldOffsetInChars - NextFieldOffsetInChars);
119*67e74705SXin Li 
120*67e74705SXin Li     assert(NextFieldOffsetInChars == FieldOffsetInChars &&
121*67e74705SXin Li            "Did not add enough padding!");
122*67e74705SXin Li 
123*67e74705SXin Li     AlignedNextFieldOffsetInChars =
124*67e74705SXin Li         NextFieldOffsetInChars.alignTo(FieldAlignment);
125*67e74705SXin Li   }
126*67e74705SXin Li 
127*67e74705SXin Li   if (AlignedNextFieldOffsetInChars > FieldOffsetInChars) {
128*67e74705SXin Li     assert(!Packed && "Alignment is wrong even with a packed struct!");
129*67e74705SXin Li 
130*67e74705SXin Li     // Convert the struct to a packed struct.
131*67e74705SXin Li     ConvertStructToPacked();
132*67e74705SXin Li 
133*67e74705SXin Li     // After we pack the struct, we may need to insert padding.
134*67e74705SXin Li     if (NextFieldOffsetInChars < FieldOffsetInChars) {
135*67e74705SXin Li       // We need to append padding.
136*67e74705SXin Li       AppendPadding(FieldOffsetInChars - NextFieldOffsetInChars);
137*67e74705SXin Li 
138*67e74705SXin Li       assert(NextFieldOffsetInChars == FieldOffsetInChars &&
139*67e74705SXin Li              "Did not add enough padding!");
140*67e74705SXin Li     }
141*67e74705SXin Li     AlignedNextFieldOffsetInChars = NextFieldOffsetInChars;
142*67e74705SXin Li   }
143*67e74705SXin Li 
144*67e74705SXin Li   // Add the field.
145*67e74705SXin Li   Elements.push_back(InitCst);
146*67e74705SXin Li   NextFieldOffsetInChars = AlignedNextFieldOffsetInChars +
147*67e74705SXin Li                            getSizeInChars(InitCst);
148*67e74705SXin Li 
149*67e74705SXin Li   if (Packed)
150*67e74705SXin Li     assert(LLVMStructAlignment == CharUnits::One() &&
151*67e74705SXin Li            "Packed struct not byte-aligned!");
152*67e74705SXin Li   else
153*67e74705SXin Li     LLVMStructAlignment = std::max(LLVMStructAlignment, FieldAlignment);
154*67e74705SXin Li }
155*67e74705SXin Li 
AppendBitField(const FieldDecl * Field,uint64_t FieldOffset,llvm::ConstantInt * CI)156*67e74705SXin Li void ConstStructBuilder::AppendBitField(const FieldDecl *Field,
157*67e74705SXin Li                                         uint64_t FieldOffset,
158*67e74705SXin Li                                         llvm::ConstantInt *CI) {
159*67e74705SXin Li   const ASTContext &Context = CGM.getContext();
160*67e74705SXin Li   const uint64_t CharWidth = Context.getCharWidth();
161*67e74705SXin Li   uint64_t NextFieldOffsetInBits = Context.toBits(NextFieldOffsetInChars);
162*67e74705SXin Li   if (FieldOffset > NextFieldOffsetInBits) {
163*67e74705SXin Li     // We need to add padding.
164*67e74705SXin Li     CharUnits PadSize = Context.toCharUnitsFromBits(
165*67e74705SXin Li         llvm::alignTo(FieldOffset - NextFieldOffsetInBits,
166*67e74705SXin Li                       Context.getTargetInfo().getCharAlign()));
167*67e74705SXin Li 
168*67e74705SXin Li     AppendPadding(PadSize);
169*67e74705SXin Li   }
170*67e74705SXin Li 
171*67e74705SXin Li   uint64_t FieldSize = Field->getBitWidthValue(Context);
172*67e74705SXin Li 
173*67e74705SXin Li   llvm::APInt FieldValue = CI->getValue();
174*67e74705SXin Li 
175*67e74705SXin Li   // Promote the size of FieldValue if necessary
176*67e74705SXin Li   // FIXME: This should never occur, but currently it can because initializer
177*67e74705SXin Li   // constants are cast to bool, and because clang is not enforcing bitfield
178*67e74705SXin Li   // width limits.
179*67e74705SXin Li   if (FieldSize > FieldValue.getBitWidth())
180*67e74705SXin Li     FieldValue = FieldValue.zext(FieldSize);
181*67e74705SXin Li 
182*67e74705SXin Li   // Truncate the size of FieldValue to the bit field size.
183*67e74705SXin Li   if (FieldSize < FieldValue.getBitWidth())
184*67e74705SXin Li     FieldValue = FieldValue.trunc(FieldSize);
185*67e74705SXin Li 
186*67e74705SXin Li   NextFieldOffsetInBits = Context.toBits(NextFieldOffsetInChars);
187*67e74705SXin Li   if (FieldOffset < NextFieldOffsetInBits) {
188*67e74705SXin Li     // Either part of the field or the entire field can go into the previous
189*67e74705SXin Li     // byte.
190*67e74705SXin Li     assert(!Elements.empty() && "Elements can't be empty!");
191*67e74705SXin Li 
192*67e74705SXin Li     unsigned BitsInPreviousByte = NextFieldOffsetInBits - FieldOffset;
193*67e74705SXin Li 
194*67e74705SXin Li     bool FitsCompletelyInPreviousByte =
195*67e74705SXin Li       BitsInPreviousByte >= FieldValue.getBitWidth();
196*67e74705SXin Li 
197*67e74705SXin Li     llvm::APInt Tmp = FieldValue;
198*67e74705SXin Li 
199*67e74705SXin Li     if (!FitsCompletelyInPreviousByte) {
200*67e74705SXin Li       unsigned NewFieldWidth = FieldSize - BitsInPreviousByte;
201*67e74705SXin Li 
202*67e74705SXin Li       if (CGM.getDataLayout().isBigEndian()) {
203*67e74705SXin Li         Tmp = Tmp.lshr(NewFieldWidth);
204*67e74705SXin Li         Tmp = Tmp.trunc(BitsInPreviousByte);
205*67e74705SXin Li 
206*67e74705SXin Li         // We want the remaining high bits.
207*67e74705SXin Li         FieldValue = FieldValue.trunc(NewFieldWidth);
208*67e74705SXin Li       } else {
209*67e74705SXin Li         Tmp = Tmp.trunc(BitsInPreviousByte);
210*67e74705SXin Li 
211*67e74705SXin Li         // We want the remaining low bits.
212*67e74705SXin Li         FieldValue = FieldValue.lshr(BitsInPreviousByte);
213*67e74705SXin Li         FieldValue = FieldValue.trunc(NewFieldWidth);
214*67e74705SXin Li       }
215*67e74705SXin Li     }
216*67e74705SXin Li 
217*67e74705SXin Li     Tmp = Tmp.zext(CharWidth);
218*67e74705SXin Li     if (CGM.getDataLayout().isBigEndian()) {
219*67e74705SXin Li       if (FitsCompletelyInPreviousByte)
220*67e74705SXin Li         Tmp = Tmp.shl(BitsInPreviousByte - FieldValue.getBitWidth());
221*67e74705SXin Li     } else {
222*67e74705SXin Li       Tmp = Tmp.shl(CharWidth - BitsInPreviousByte);
223*67e74705SXin Li     }
224*67e74705SXin Li 
225*67e74705SXin Li     // 'or' in the bits that go into the previous byte.
226*67e74705SXin Li     llvm::Value *LastElt = Elements.back();
227*67e74705SXin Li     if (llvm::ConstantInt *Val = dyn_cast<llvm::ConstantInt>(LastElt))
228*67e74705SXin Li       Tmp |= Val->getValue();
229*67e74705SXin Li     else {
230*67e74705SXin Li       assert(isa<llvm::UndefValue>(LastElt));
231*67e74705SXin Li       // If there is an undef field that we're adding to, it can either be a
232*67e74705SXin Li       // scalar undef (in which case, we just replace it with our field) or it
233*67e74705SXin Li       // is an array.  If it is an array, we have to pull one byte off the
234*67e74705SXin Li       // array so that the other undef bytes stay around.
235*67e74705SXin Li       if (!isa<llvm::IntegerType>(LastElt->getType())) {
236*67e74705SXin Li         // The undef padding will be a multibyte array, create a new smaller
237*67e74705SXin Li         // padding and then an hole for our i8 to get plopped into.
238*67e74705SXin Li         assert(isa<llvm::ArrayType>(LastElt->getType()) &&
239*67e74705SXin Li                "Expected array padding of undefs");
240*67e74705SXin Li         llvm::ArrayType *AT = cast<llvm::ArrayType>(LastElt->getType());
241*67e74705SXin Li         assert(AT->getElementType()->isIntegerTy(CharWidth) &&
242*67e74705SXin Li                AT->getNumElements() != 0 &&
243*67e74705SXin Li                "Expected non-empty array padding of undefs");
244*67e74705SXin Li 
245*67e74705SXin Li         // Remove the padding array.
246*67e74705SXin Li         NextFieldOffsetInChars -= CharUnits::fromQuantity(AT->getNumElements());
247*67e74705SXin Li         Elements.pop_back();
248*67e74705SXin Li 
249*67e74705SXin Li         // Add the padding back in two chunks.
250*67e74705SXin Li         AppendPadding(CharUnits::fromQuantity(AT->getNumElements()-1));
251*67e74705SXin Li         AppendPadding(CharUnits::One());
252*67e74705SXin Li         assert(isa<llvm::UndefValue>(Elements.back()) &&
253*67e74705SXin Li                Elements.back()->getType()->isIntegerTy(CharWidth) &&
254*67e74705SXin Li                "Padding addition didn't work right");
255*67e74705SXin Li       }
256*67e74705SXin Li     }
257*67e74705SXin Li 
258*67e74705SXin Li     Elements.back() = llvm::ConstantInt::get(CGM.getLLVMContext(), Tmp);
259*67e74705SXin Li 
260*67e74705SXin Li     if (FitsCompletelyInPreviousByte)
261*67e74705SXin Li       return;
262*67e74705SXin Li   }
263*67e74705SXin Li 
264*67e74705SXin Li   while (FieldValue.getBitWidth() > CharWidth) {
265*67e74705SXin Li     llvm::APInt Tmp;
266*67e74705SXin Li 
267*67e74705SXin Li     if (CGM.getDataLayout().isBigEndian()) {
268*67e74705SXin Li       // We want the high bits.
269*67e74705SXin Li       Tmp =
270*67e74705SXin Li         FieldValue.lshr(FieldValue.getBitWidth() - CharWidth).trunc(CharWidth);
271*67e74705SXin Li     } else {
272*67e74705SXin Li       // We want the low bits.
273*67e74705SXin Li       Tmp = FieldValue.trunc(CharWidth);
274*67e74705SXin Li 
275*67e74705SXin Li       FieldValue = FieldValue.lshr(CharWidth);
276*67e74705SXin Li     }
277*67e74705SXin Li 
278*67e74705SXin Li     Elements.push_back(llvm::ConstantInt::get(CGM.getLLVMContext(), Tmp));
279*67e74705SXin Li     ++NextFieldOffsetInChars;
280*67e74705SXin Li 
281*67e74705SXin Li     FieldValue = FieldValue.trunc(FieldValue.getBitWidth() - CharWidth);
282*67e74705SXin Li   }
283*67e74705SXin Li 
284*67e74705SXin Li   assert(FieldValue.getBitWidth() > 0 &&
285*67e74705SXin Li          "Should have at least one bit left!");
286*67e74705SXin Li   assert(FieldValue.getBitWidth() <= CharWidth &&
287*67e74705SXin Li          "Should not have more than a byte left!");
288*67e74705SXin Li 
289*67e74705SXin Li   if (FieldValue.getBitWidth() < CharWidth) {
290*67e74705SXin Li     if (CGM.getDataLayout().isBigEndian()) {
291*67e74705SXin Li       unsigned BitWidth = FieldValue.getBitWidth();
292*67e74705SXin Li 
293*67e74705SXin Li       FieldValue = FieldValue.zext(CharWidth) << (CharWidth - BitWidth);
294*67e74705SXin Li     } else
295*67e74705SXin Li       FieldValue = FieldValue.zext(CharWidth);
296*67e74705SXin Li   }
297*67e74705SXin Li 
298*67e74705SXin Li   // Append the last element.
299*67e74705SXin Li   Elements.push_back(llvm::ConstantInt::get(CGM.getLLVMContext(),
300*67e74705SXin Li                                             FieldValue));
301*67e74705SXin Li   ++NextFieldOffsetInChars;
302*67e74705SXin Li }
303*67e74705SXin Li 
AppendPadding(CharUnits PadSize)304*67e74705SXin Li void ConstStructBuilder::AppendPadding(CharUnits PadSize) {
305*67e74705SXin Li   if (PadSize.isZero())
306*67e74705SXin Li     return;
307*67e74705SXin Li 
308*67e74705SXin Li   llvm::Type *Ty = CGM.Int8Ty;
309*67e74705SXin Li   if (PadSize > CharUnits::One())
310*67e74705SXin Li     Ty = llvm::ArrayType::get(Ty, PadSize.getQuantity());
311*67e74705SXin Li 
312*67e74705SXin Li   llvm::Constant *C = llvm::UndefValue::get(Ty);
313*67e74705SXin Li   Elements.push_back(C);
314*67e74705SXin Li   assert(getAlignment(C) == CharUnits::One() &&
315*67e74705SXin Li          "Padding must have 1 byte alignment!");
316*67e74705SXin Li 
317*67e74705SXin Li   NextFieldOffsetInChars += getSizeInChars(C);
318*67e74705SXin Li }
319*67e74705SXin Li 
AppendTailPadding(CharUnits RecordSize)320*67e74705SXin Li void ConstStructBuilder::AppendTailPadding(CharUnits RecordSize) {
321*67e74705SXin Li   assert(NextFieldOffsetInChars <= RecordSize &&
322*67e74705SXin Li          "Size mismatch!");
323*67e74705SXin Li 
324*67e74705SXin Li   AppendPadding(RecordSize - NextFieldOffsetInChars);
325*67e74705SXin Li }
326*67e74705SXin Li 
ConvertStructToPacked()327*67e74705SXin Li void ConstStructBuilder::ConvertStructToPacked() {
328*67e74705SXin Li   SmallVector<llvm::Constant *, 16> PackedElements;
329*67e74705SXin Li   CharUnits ElementOffsetInChars = CharUnits::Zero();
330*67e74705SXin Li 
331*67e74705SXin Li   for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
332*67e74705SXin Li     llvm::Constant *C = Elements[i];
333*67e74705SXin Li 
334*67e74705SXin Li     CharUnits ElementAlign = CharUnits::fromQuantity(
335*67e74705SXin Li       CGM.getDataLayout().getABITypeAlignment(C->getType()));
336*67e74705SXin Li     CharUnits AlignedElementOffsetInChars =
337*67e74705SXin Li         ElementOffsetInChars.alignTo(ElementAlign);
338*67e74705SXin Li 
339*67e74705SXin Li     if (AlignedElementOffsetInChars > ElementOffsetInChars) {
340*67e74705SXin Li       // We need some padding.
341*67e74705SXin Li       CharUnits NumChars =
342*67e74705SXin Li         AlignedElementOffsetInChars - ElementOffsetInChars;
343*67e74705SXin Li 
344*67e74705SXin Li       llvm::Type *Ty = CGM.Int8Ty;
345*67e74705SXin Li       if (NumChars > CharUnits::One())
346*67e74705SXin Li         Ty = llvm::ArrayType::get(Ty, NumChars.getQuantity());
347*67e74705SXin Li 
348*67e74705SXin Li       llvm::Constant *Padding = llvm::UndefValue::get(Ty);
349*67e74705SXin Li       PackedElements.push_back(Padding);
350*67e74705SXin Li       ElementOffsetInChars += getSizeInChars(Padding);
351*67e74705SXin Li     }
352*67e74705SXin Li 
353*67e74705SXin Li     PackedElements.push_back(C);
354*67e74705SXin Li     ElementOffsetInChars += getSizeInChars(C);
355*67e74705SXin Li   }
356*67e74705SXin Li 
357*67e74705SXin Li   assert(ElementOffsetInChars == NextFieldOffsetInChars &&
358*67e74705SXin Li          "Packing the struct changed its size!");
359*67e74705SXin Li 
360*67e74705SXin Li   Elements.swap(PackedElements);
361*67e74705SXin Li   LLVMStructAlignment = CharUnits::One();
362*67e74705SXin Li   Packed = true;
363*67e74705SXin Li }
364*67e74705SXin Li 
Build(InitListExpr * ILE)365*67e74705SXin Li bool ConstStructBuilder::Build(InitListExpr *ILE) {
366*67e74705SXin Li   RecordDecl *RD = ILE->getType()->getAs<RecordType>()->getDecl();
367*67e74705SXin Li   const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
368*67e74705SXin Li 
369*67e74705SXin Li   unsigned FieldNo = 0;
370*67e74705SXin Li   unsigned ElementNo = 0;
371*67e74705SXin Li 
372*67e74705SXin Li   // Bail out if we have base classes. We could support these, but they only
373*67e74705SXin Li   // arise in C++1z where we will have already constant folded most interesting
374*67e74705SXin Li   // cases. FIXME: There are still a few more cases we can handle this way.
375*67e74705SXin Li   if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
376*67e74705SXin Li     if (CXXRD->getNumBases())
377*67e74705SXin Li       return false;
378*67e74705SXin Li 
379*67e74705SXin Li   for (RecordDecl::field_iterator Field = RD->field_begin(),
380*67e74705SXin Li        FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {
381*67e74705SXin Li     // If this is a union, skip all the fields that aren't being initialized.
382*67e74705SXin Li     if (RD->isUnion() && ILE->getInitializedFieldInUnion() != *Field)
383*67e74705SXin Li       continue;
384*67e74705SXin Li 
385*67e74705SXin Li     // Don't emit anonymous bitfields, they just affect layout.
386*67e74705SXin Li     if (Field->isUnnamedBitfield())
387*67e74705SXin Li       continue;
388*67e74705SXin Li 
389*67e74705SXin Li     // Get the initializer.  A struct can include fields without initializers,
390*67e74705SXin Li     // we just use explicit null values for them.
391*67e74705SXin Li     llvm::Constant *EltInit;
392*67e74705SXin Li     if (ElementNo < ILE->getNumInits())
393*67e74705SXin Li       EltInit = CGM.EmitConstantExpr(ILE->getInit(ElementNo++),
394*67e74705SXin Li                                      Field->getType(), CGF);
395*67e74705SXin Li     else
396*67e74705SXin Li       EltInit = CGM.EmitNullConstant(Field->getType());
397*67e74705SXin Li 
398*67e74705SXin Li     if (!EltInit)
399*67e74705SXin Li       return false;
400*67e74705SXin Li 
401*67e74705SXin Li     if (!Field->isBitField()) {
402*67e74705SXin Li       // Handle non-bitfield members.
403*67e74705SXin Li       AppendField(*Field, Layout.getFieldOffset(FieldNo), EltInit);
404*67e74705SXin Li     } else {
405*67e74705SXin Li       // Otherwise we have a bitfield.
406*67e74705SXin Li       if (auto *CI = dyn_cast<llvm::ConstantInt>(EltInit)) {
407*67e74705SXin Li         AppendBitField(*Field, Layout.getFieldOffset(FieldNo), CI);
408*67e74705SXin Li       } else {
409*67e74705SXin Li         // We are trying to initialize a bitfield with a non-trivial constant,
410*67e74705SXin Li         // this must require run-time code.
411*67e74705SXin Li         return false;
412*67e74705SXin Li       }
413*67e74705SXin Li     }
414*67e74705SXin Li   }
415*67e74705SXin Li 
416*67e74705SXin Li   return true;
417*67e74705SXin Li }
418*67e74705SXin Li 
419*67e74705SXin Li namespace {
420*67e74705SXin Li struct BaseInfo {
BaseInfo__anon40e7fc890111::__anon40e7fc890211::BaseInfo421*67e74705SXin Li   BaseInfo(const CXXRecordDecl *Decl, CharUnits Offset, unsigned Index)
422*67e74705SXin Li     : Decl(Decl), Offset(Offset), Index(Index) {
423*67e74705SXin Li   }
424*67e74705SXin Li 
425*67e74705SXin Li   const CXXRecordDecl *Decl;
426*67e74705SXin Li   CharUnits Offset;
427*67e74705SXin Li   unsigned Index;
428*67e74705SXin Li 
operator <__anon40e7fc890111::__anon40e7fc890211::BaseInfo429*67e74705SXin Li   bool operator<(const BaseInfo &O) const { return Offset < O.Offset; }
430*67e74705SXin Li };
431*67e74705SXin Li }
432*67e74705SXin Li 
Build(const APValue & Val,const RecordDecl * RD,bool IsPrimaryBase,const CXXRecordDecl * VTableClass,CharUnits Offset)433*67e74705SXin Li void ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
434*67e74705SXin Li                                bool IsPrimaryBase,
435*67e74705SXin Li                                const CXXRecordDecl *VTableClass,
436*67e74705SXin Li                                CharUnits Offset) {
437*67e74705SXin Li   const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
438*67e74705SXin Li 
439*67e74705SXin Li   if (const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD)) {
440*67e74705SXin Li     // Add a vtable pointer, if we need one and it hasn't already been added.
441*67e74705SXin Li     if (CD->isDynamicClass() && !IsPrimaryBase) {
442*67e74705SXin Li       llvm::Constant *VTableAddressPoint =
443*67e74705SXin Li           CGM.getCXXABI().getVTableAddressPointForConstExpr(
444*67e74705SXin Li               BaseSubobject(CD, Offset), VTableClass);
445*67e74705SXin Li       AppendBytes(Offset, VTableAddressPoint);
446*67e74705SXin Li     }
447*67e74705SXin Li 
448*67e74705SXin Li     // Accumulate and sort bases, in order to visit them in address order, which
449*67e74705SXin Li     // may not be the same as declaration order.
450*67e74705SXin Li     SmallVector<BaseInfo, 8> Bases;
451*67e74705SXin Li     Bases.reserve(CD->getNumBases());
452*67e74705SXin Li     unsigned BaseNo = 0;
453*67e74705SXin Li     for (CXXRecordDecl::base_class_const_iterator Base = CD->bases_begin(),
454*67e74705SXin Li          BaseEnd = CD->bases_end(); Base != BaseEnd; ++Base, ++BaseNo) {
455*67e74705SXin Li       assert(!Base->isVirtual() && "should not have virtual bases here");
456*67e74705SXin Li       const CXXRecordDecl *BD = Base->getType()->getAsCXXRecordDecl();
457*67e74705SXin Li       CharUnits BaseOffset = Layout.getBaseClassOffset(BD);
458*67e74705SXin Li       Bases.push_back(BaseInfo(BD, BaseOffset, BaseNo));
459*67e74705SXin Li     }
460*67e74705SXin Li     std::stable_sort(Bases.begin(), Bases.end());
461*67e74705SXin Li 
462*67e74705SXin Li     for (unsigned I = 0, N = Bases.size(); I != N; ++I) {
463*67e74705SXin Li       BaseInfo &Base = Bases[I];
464*67e74705SXin Li 
465*67e74705SXin Li       bool IsPrimaryBase = Layout.getPrimaryBase() == Base.Decl;
466*67e74705SXin Li       Build(Val.getStructBase(Base.Index), Base.Decl, IsPrimaryBase,
467*67e74705SXin Li             VTableClass, Offset + Base.Offset);
468*67e74705SXin Li     }
469*67e74705SXin Li   }
470*67e74705SXin Li 
471*67e74705SXin Li   unsigned FieldNo = 0;
472*67e74705SXin Li   uint64_t OffsetBits = CGM.getContext().toBits(Offset);
473*67e74705SXin Li 
474*67e74705SXin Li   for (RecordDecl::field_iterator Field = RD->field_begin(),
475*67e74705SXin Li        FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {
476*67e74705SXin Li     // If this is a union, skip all the fields that aren't being initialized.
477*67e74705SXin Li     if (RD->isUnion() && Val.getUnionField() != *Field)
478*67e74705SXin Li       continue;
479*67e74705SXin Li 
480*67e74705SXin Li     // Don't emit anonymous bitfields, they just affect layout.
481*67e74705SXin Li     if (Field->isUnnamedBitfield())
482*67e74705SXin Li       continue;
483*67e74705SXin Li 
484*67e74705SXin Li     // Emit the value of the initializer.
485*67e74705SXin Li     const APValue &FieldValue =
486*67e74705SXin Li       RD->isUnion() ? Val.getUnionValue() : Val.getStructField(FieldNo);
487*67e74705SXin Li     llvm::Constant *EltInit =
488*67e74705SXin Li       CGM.EmitConstantValueForMemory(FieldValue, Field->getType(), CGF);
489*67e74705SXin Li     assert(EltInit && "EmitConstantValue can't fail");
490*67e74705SXin Li 
491*67e74705SXin Li     if (!Field->isBitField()) {
492*67e74705SXin Li       // Handle non-bitfield members.
493*67e74705SXin Li       AppendField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits, EltInit);
494*67e74705SXin Li     } else {
495*67e74705SXin Li       // Otherwise we have a bitfield.
496*67e74705SXin Li       AppendBitField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits,
497*67e74705SXin Li                      cast<llvm::ConstantInt>(EltInit));
498*67e74705SXin Li     }
499*67e74705SXin Li   }
500*67e74705SXin Li }
501*67e74705SXin Li 
Finalize(QualType Ty)502*67e74705SXin Li llvm::Constant *ConstStructBuilder::Finalize(QualType Ty) {
503*67e74705SXin Li   RecordDecl *RD = Ty->getAs<RecordType>()->getDecl();
504*67e74705SXin Li   const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
505*67e74705SXin Li 
506*67e74705SXin Li   CharUnits LayoutSizeInChars = Layout.getSize();
507*67e74705SXin Li 
508*67e74705SXin Li   if (NextFieldOffsetInChars > LayoutSizeInChars) {
509*67e74705SXin Li     // If the struct is bigger than the size of the record type,
510*67e74705SXin Li     // we must have a flexible array member at the end.
511*67e74705SXin Li     assert(RD->hasFlexibleArrayMember() &&
512*67e74705SXin Li            "Must have flexible array member if struct is bigger than type!");
513*67e74705SXin Li 
514*67e74705SXin Li     // No tail padding is necessary.
515*67e74705SXin Li   } else {
516*67e74705SXin Li     // Append tail padding if necessary.
517*67e74705SXin Li     CharUnits LLVMSizeInChars =
518*67e74705SXin Li         NextFieldOffsetInChars.alignTo(LLVMStructAlignment);
519*67e74705SXin Li 
520*67e74705SXin Li     if (LLVMSizeInChars != LayoutSizeInChars)
521*67e74705SXin Li       AppendTailPadding(LayoutSizeInChars);
522*67e74705SXin Li 
523*67e74705SXin Li     LLVMSizeInChars = NextFieldOffsetInChars.alignTo(LLVMStructAlignment);
524*67e74705SXin Li 
525*67e74705SXin Li     // Check if we need to convert the struct to a packed struct.
526*67e74705SXin Li     if (NextFieldOffsetInChars <= LayoutSizeInChars &&
527*67e74705SXin Li         LLVMSizeInChars > LayoutSizeInChars) {
528*67e74705SXin Li       assert(!Packed && "Size mismatch!");
529*67e74705SXin Li 
530*67e74705SXin Li       ConvertStructToPacked();
531*67e74705SXin Li       assert(NextFieldOffsetInChars <= LayoutSizeInChars &&
532*67e74705SXin Li              "Converting to packed did not help!");
533*67e74705SXin Li     }
534*67e74705SXin Li 
535*67e74705SXin Li     LLVMSizeInChars = NextFieldOffsetInChars.alignTo(LLVMStructAlignment);
536*67e74705SXin Li 
537*67e74705SXin Li     assert(LayoutSizeInChars == LLVMSizeInChars &&
538*67e74705SXin Li            "Tail padding mismatch!");
539*67e74705SXin Li   }
540*67e74705SXin Li 
541*67e74705SXin Li   // Pick the type to use.  If the type is layout identical to the ConvertType
542*67e74705SXin Li   // type then use it, otherwise use whatever the builder produced for us.
543*67e74705SXin Li   llvm::StructType *STy =
544*67e74705SXin Li       llvm::ConstantStruct::getTypeForElements(CGM.getLLVMContext(),
545*67e74705SXin Li                                                Elements, Packed);
546*67e74705SXin Li   llvm::Type *ValTy = CGM.getTypes().ConvertType(Ty);
547*67e74705SXin Li   if (llvm::StructType *ValSTy = dyn_cast<llvm::StructType>(ValTy)) {
548*67e74705SXin Li     if (ValSTy->isLayoutIdentical(STy))
549*67e74705SXin Li       STy = ValSTy;
550*67e74705SXin Li   }
551*67e74705SXin Li 
552*67e74705SXin Li   llvm::Constant *Result = llvm::ConstantStruct::get(STy, Elements);
553*67e74705SXin Li 
554*67e74705SXin Li   assert(NextFieldOffsetInChars.alignTo(getAlignment(Result)) ==
555*67e74705SXin Li              getSizeInChars(Result) &&
556*67e74705SXin Li          "Size mismatch!");
557*67e74705SXin Li 
558*67e74705SXin Li   return Result;
559*67e74705SXin Li }
560*67e74705SXin Li 
BuildStruct(CodeGenModule & CGM,CodeGenFunction * CGF,ConstExprEmitter * Emitter,llvm::ConstantStruct * Base,InitListExpr * Updater)561*67e74705SXin Li llvm::Constant *ConstStructBuilder::BuildStruct(CodeGenModule &CGM,
562*67e74705SXin Li                                                 CodeGenFunction *CGF,
563*67e74705SXin Li                                                 ConstExprEmitter *Emitter,
564*67e74705SXin Li                                                 llvm::ConstantStruct *Base,
565*67e74705SXin Li                                                 InitListExpr *Updater) {
566*67e74705SXin Li   ConstStructBuilder Builder(CGM, CGF);
567*67e74705SXin Li   if (!Builder.Build(Emitter, Base, Updater))
568*67e74705SXin Li     return nullptr;
569*67e74705SXin Li   return Builder.Finalize(Updater->getType());
570*67e74705SXin Li }
571*67e74705SXin Li 
BuildStruct(CodeGenModule & CGM,CodeGenFunction * CGF,InitListExpr * ILE)572*67e74705SXin Li llvm::Constant *ConstStructBuilder::BuildStruct(CodeGenModule &CGM,
573*67e74705SXin Li                                                 CodeGenFunction *CGF,
574*67e74705SXin Li                                                 InitListExpr *ILE) {
575*67e74705SXin Li   ConstStructBuilder Builder(CGM, CGF);
576*67e74705SXin Li 
577*67e74705SXin Li   if (!Builder.Build(ILE))
578*67e74705SXin Li     return nullptr;
579*67e74705SXin Li 
580*67e74705SXin Li   return Builder.Finalize(ILE->getType());
581*67e74705SXin Li }
582*67e74705SXin Li 
BuildStruct(CodeGenModule & CGM,CodeGenFunction * CGF,const APValue & Val,QualType ValTy)583*67e74705SXin Li llvm::Constant *ConstStructBuilder::BuildStruct(CodeGenModule &CGM,
584*67e74705SXin Li                                                 CodeGenFunction *CGF,
585*67e74705SXin Li                                                 const APValue &Val,
586*67e74705SXin Li                                                 QualType ValTy) {
587*67e74705SXin Li   ConstStructBuilder Builder(CGM, CGF);
588*67e74705SXin Li 
589*67e74705SXin Li   const RecordDecl *RD = ValTy->castAs<RecordType>()->getDecl();
590*67e74705SXin Li   const CXXRecordDecl *CD = dyn_cast<CXXRecordDecl>(RD);
591*67e74705SXin Li   Builder.Build(Val, RD, false, CD, CharUnits::Zero());
592*67e74705SXin Li 
593*67e74705SXin Li   return Builder.Finalize(ValTy);
594*67e74705SXin Li }
595*67e74705SXin Li 
596*67e74705SXin Li 
597*67e74705SXin Li //===----------------------------------------------------------------------===//
598*67e74705SXin Li //                             ConstExprEmitter
599*67e74705SXin Li //===----------------------------------------------------------------------===//
600*67e74705SXin Li 
601*67e74705SXin Li /// This class only needs to handle two cases:
602*67e74705SXin Li /// 1) Literals (this is used by APValue emission to emit literals).
603*67e74705SXin Li /// 2) Arrays, structs and unions (outside C++11 mode, we don't currently
604*67e74705SXin Li ///    constant fold these types).
605*67e74705SXin Li class ConstExprEmitter :
606*67e74705SXin Li   public StmtVisitor<ConstExprEmitter, llvm::Constant*> {
607*67e74705SXin Li   CodeGenModule &CGM;
608*67e74705SXin Li   CodeGenFunction *CGF;
609*67e74705SXin Li   llvm::LLVMContext &VMContext;
610*67e74705SXin Li public:
ConstExprEmitter(CodeGenModule & cgm,CodeGenFunction * cgf)611*67e74705SXin Li   ConstExprEmitter(CodeGenModule &cgm, CodeGenFunction *cgf)
612*67e74705SXin Li     : CGM(cgm), CGF(cgf), VMContext(cgm.getLLVMContext()) {
613*67e74705SXin Li   }
614*67e74705SXin Li 
615*67e74705SXin Li   //===--------------------------------------------------------------------===//
616*67e74705SXin Li   //                            Visitor Methods
617*67e74705SXin Li   //===--------------------------------------------------------------------===//
618*67e74705SXin Li 
VisitStmt(Stmt * S)619*67e74705SXin Li   llvm::Constant *VisitStmt(Stmt *S) {
620*67e74705SXin Li     return nullptr;
621*67e74705SXin Li   }
622*67e74705SXin Li 
VisitParenExpr(ParenExpr * PE)623*67e74705SXin Li   llvm::Constant *VisitParenExpr(ParenExpr *PE) {
624*67e74705SXin Li     return Visit(PE->getSubExpr());
625*67e74705SXin Li   }
626*67e74705SXin Li 
627*67e74705SXin Li   llvm::Constant *
VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * PE)628*67e74705SXin Li   VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *PE) {
629*67e74705SXin Li     return Visit(PE->getReplacement());
630*67e74705SXin Li   }
631*67e74705SXin Li 
VisitGenericSelectionExpr(GenericSelectionExpr * GE)632*67e74705SXin Li   llvm::Constant *VisitGenericSelectionExpr(GenericSelectionExpr *GE) {
633*67e74705SXin Li     return Visit(GE->getResultExpr());
634*67e74705SXin Li   }
635*67e74705SXin Li 
VisitChooseExpr(ChooseExpr * CE)636*67e74705SXin Li   llvm::Constant *VisitChooseExpr(ChooseExpr *CE) {
637*67e74705SXin Li     return Visit(CE->getChosenSubExpr());
638*67e74705SXin Li   }
639*67e74705SXin Li 
VisitCompoundLiteralExpr(CompoundLiteralExpr * E)640*67e74705SXin Li   llvm::Constant *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
641*67e74705SXin Li     return Visit(E->getInitializer());
642*67e74705SXin Li   }
643*67e74705SXin Li 
VisitCastExpr(CastExpr * E)644*67e74705SXin Li   llvm::Constant *VisitCastExpr(CastExpr* E) {
645*67e74705SXin Li     if (const auto *ECE = dyn_cast<ExplicitCastExpr>(E))
646*67e74705SXin Li       CGM.EmitExplicitCastExprType(ECE, CGF);
647*67e74705SXin Li     Expr *subExpr = E->getSubExpr();
648*67e74705SXin Li     llvm::Constant *C = CGM.EmitConstantExpr(subExpr, subExpr->getType(), CGF);
649*67e74705SXin Li     if (!C) return nullptr;
650*67e74705SXin Li 
651*67e74705SXin Li     llvm::Type *destType = ConvertType(E->getType());
652*67e74705SXin Li 
653*67e74705SXin Li     switch (E->getCastKind()) {
654*67e74705SXin Li     case CK_ToUnion: {
655*67e74705SXin Li       // GCC cast to union extension
656*67e74705SXin Li       assert(E->getType()->isUnionType() &&
657*67e74705SXin Li              "Destination type is not union type!");
658*67e74705SXin Li 
659*67e74705SXin Li       // Build a struct with the union sub-element as the first member,
660*67e74705SXin Li       // and padded to the appropriate size
661*67e74705SXin Li       SmallVector<llvm::Constant*, 2> Elts;
662*67e74705SXin Li       SmallVector<llvm::Type*, 2> Types;
663*67e74705SXin Li       Elts.push_back(C);
664*67e74705SXin Li       Types.push_back(C->getType());
665*67e74705SXin Li       unsigned CurSize = CGM.getDataLayout().getTypeAllocSize(C->getType());
666*67e74705SXin Li       unsigned TotalSize = CGM.getDataLayout().getTypeAllocSize(destType);
667*67e74705SXin Li 
668*67e74705SXin Li       assert(CurSize <= TotalSize && "Union size mismatch!");
669*67e74705SXin Li       if (unsigned NumPadBytes = TotalSize - CurSize) {
670*67e74705SXin Li         llvm::Type *Ty = CGM.Int8Ty;
671*67e74705SXin Li         if (NumPadBytes > 1)
672*67e74705SXin Li           Ty = llvm::ArrayType::get(Ty, NumPadBytes);
673*67e74705SXin Li 
674*67e74705SXin Li         Elts.push_back(llvm::UndefValue::get(Ty));
675*67e74705SXin Li         Types.push_back(Ty);
676*67e74705SXin Li       }
677*67e74705SXin Li 
678*67e74705SXin Li       llvm::StructType* STy =
679*67e74705SXin Li         llvm::StructType::get(C->getType()->getContext(), Types, false);
680*67e74705SXin Li       return llvm::ConstantStruct::get(STy, Elts);
681*67e74705SXin Li     }
682*67e74705SXin Li 
683*67e74705SXin Li     case CK_AddressSpaceConversion:
684*67e74705SXin Li       return llvm::ConstantExpr::getAddrSpaceCast(C, destType);
685*67e74705SXin Li 
686*67e74705SXin Li     case CK_LValueToRValue:
687*67e74705SXin Li     case CK_AtomicToNonAtomic:
688*67e74705SXin Li     case CK_NonAtomicToAtomic:
689*67e74705SXin Li     case CK_NoOp:
690*67e74705SXin Li     case CK_ConstructorConversion:
691*67e74705SXin Li       return C;
692*67e74705SXin Li 
693*67e74705SXin Li     case CK_Dependent: llvm_unreachable("saw dependent cast!");
694*67e74705SXin Li 
695*67e74705SXin Li     case CK_BuiltinFnToFnPtr:
696*67e74705SXin Li       llvm_unreachable("builtin functions are handled elsewhere");
697*67e74705SXin Li 
698*67e74705SXin Li     case CK_ReinterpretMemberPointer:
699*67e74705SXin Li     case CK_DerivedToBaseMemberPointer:
700*67e74705SXin Li     case CK_BaseToDerivedMemberPointer:
701*67e74705SXin Li       return CGM.getCXXABI().EmitMemberPointerConversion(E, C);
702*67e74705SXin Li 
703*67e74705SXin Li     // These will never be supported.
704*67e74705SXin Li     case CK_ObjCObjectLValueCast:
705*67e74705SXin Li     case CK_ARCProduceObject:
706*67e74705SXin Li     case CK_ARCConsumeObject:
707*67e74705SXin Li     case CK_ARCReclaimReturnedObject:
708*67e74705SXin Li     case CK_ARCExtendBlockObject:
709*67e74705SXin Li     case CK_CopyAndAutoreleaseBlockObject:
710*67e74705SXin Li       return nullptr;
711*67e74705SXin Li 
712*67e74705SXin Li     // These don't need to be handled here because Evaluate knows how to
713*67e74705SXin Li     // evaluate them in the cases where they can be folded.
714*67e74705SXin Li     case CK_BitCast:
715*67e74705SXin Li     case CK_ToVoid:
716*67e74705SXin Li     case CK_Dynamic:
717*67e74705SXin Li     case CK_LValueBitCast:
718*67e74705SXin Li     case CK_NullToMemberPointer:
719*67e74705SXin Li     case CK_UserDefinedConversion:
720*67e74705SXin Li     case CK_CPointerToObjCPointerCast:
721*67e74705SXin Li     case CK_BlockPointerToObjCPointerCast:
722*67e74705SXin Li     case CK_AnyPointerToBlockPointerCast:
723*67e74705SXin Li     case CK_ArrayToPointerDecay:
724*67e74705SXin Li     case CK_FunctionToPointerDecay:
725*67e74705SXin Li     case CK_BaseToDerived:
726*67e74705SXin Li     case CK_DerivedToBase:
727*67e74705SXin Li     case CK_UncheckedDerivedToBase:
728*67e74705SXin Li     case CK_MemberPointerToBoolean:
729*67e74705SXin Li     case CK_VectorSplat:
730*67e74705SXin Li     case CK_FloatingRealToComplex:
731*67e74705SXin Li     case CK_FloatingComplexToReal:
732*67e74705SXin Li     case CK_FloatingComplexToBoolean:
733*67e74705SXin Li     case CK_FloatingComplexCast:
734*67e74705SXin Li     case CK_FloatingComplexToIntegralComplex:
735*67e74705SXin Li     case CK_IntegralRealToComplex:
736*67e74705SXin Li     case CK_IntegralComplexToReal:
737*67e74705SXin Li     case CK_IntegralComplexToBoolean:
738*67e74705SXin Li     case CK_IntegralComplexCast:
739*67e74705SXin Li     case CK_IntegralComplexToFloatingComplex:
740*67e74705SXin Li     case CK_PointerToIntegral:
741*67e74705SXin Li     case CK_PointerToBoolean:
742*67e74705SXin Li     case CK_NullToPointer:
743*67e74705SXin Li     case CK_IntegralCast:
744*67e74705SXin Li     case CK_BooleanToSignedIntegral:
745*67e74705SXin Li     case CK_IntegralToPointer:
746*67e74705SXin Li     case CK_IntegralToBoolean:
747*67e74705SXin Li     case CK_IntegralToFloating:
748*67e74705SXin Li     case CK_FloatingToIntegral:
749*67e74705SXin Li     case CK_FloatingToBoolean:
750*67e74705SXin Li     case CK_FloatingCast:
751*67e74705SXin Li     case CK_ZeroToOCLEvent:
752*67e74705SXin Li       return nullptr;
753*67e74705SXin Li     }
754*67e74705SXin Li     llvm_unreachable("Invalid CastKind");
755*67e74705SXin Li   }
756*67e74705SXin Li 
VisitCXXDefaultArgExpr(CXXDefaultArgExpr * DAE)757*67e74705SXin Li   llvm::Constant *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
758*67e74705SXin Li     return Visit(DAE->getExpr());
759*67e74705SXin Li   }
760*67e74705SXin Li 
VisitCXXDefaultInitExpr(CXXDefaultInitExpr * DIE)761*67e74705SXin Li   llvm::Constant *VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) {
762*67e74705SXin Li     // No need for a DefaultInitExprScope: we don't handle 'this' in a
763*67e74705SXin Li     // constant expression.
764*67e74705SXin Li     return Visit(DIE->getExpr());
765*67e74705SXin Li   }
766*67e74705SXin Li 
VisitExprWithCleanups(ExprWithCleanups * E)767*67e74705SXin Li   llvm::Constant *VisitExprWithCleanups(ExprWithCleanups *E) {
768*67e74705SXin Li     if (!E->cleanupsHaveSideEffects())
769*67e74705SXin Li       return Visit(E->getSubExpr());
770*67e74705SXin Li     return nullptr;
771*67e74705SXin Li   }
772*67e74705SXin Li 
VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr * E)773*67e74705SXin Li   llvm::Constant *VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *E) {
774*67e74705SXin Li     return Visit(E->GetTemporaryExpr());
775*67e74705SXin Li   }
776*67e74705SXin Li 
EmitArrayInitialization(InitListExpr * ILE)777*67e74705SXin Li   llvm::Constant *EmitArrayInitialization(InitListExpr *ILE) {
778*67e74705SXin Li     if (ILE->isStringLiteralInit())
779*67e74705SXin Li       return Visit(ILE->getInit(0));
780*67e74705SXin Li 
781*67e74705SXin Li     llvm::ArrayType *AType =
782*67e74705SXin Li         cast<llvm::ArrayType>(ConvertType(ILE->getType()));
783*67e74705SXin Li     llvm::Type *ElemTy = AType->getElementType();
784*67e74705SXin Li     unsigned NumInitElements = ILE->getNumInits();
785*67e74705SXin Li     unsigned NumElements = AType->getNumElements();
786*67e74705SXin Li 
787*67e74705SXin Li     // Initialising an array requires us to automatically
788*67e74705SXin Li     // initialise any elements that have not been initialised explicitly
789*67e74705SXin Li     unsigned NumInitableElts = std::min(NumInitElements, NumElements);
790*67e74705SXin Li 
791*67e74705SXin Li     // Initialize remaining array elements.
792*67e74705SXin Li     // FIXME: This doesn't handle member pointers correctly!
793*67e74705SXin Li     llvm::Constant *fillC;
794*67e74705SXin Li     if (Expr *filler = ILE->getArrayFiller())
795*67e74705SXin Li       fillC = CGM.EmitConstantExpr(filler, filler->getType(), CGF);
796*67e74705SXin Li     else
797*67e74705SXin Li       fillC = llvm::Constant::getNullValue(ElemTy);
798*67e74705SXin Li     if (!fillC)
799*67e74705SXin Li       return nullptr;
800*67e74705SXin Li 
801*67e74705SXin Li     // Try to use a ConstantAggregateZero if we can.
802*67e74705SXin Li     if (fillC->isNullValue() && !NumInitableElts)
803*67e74705SXin Li       return llvm::ConstantAggregateZero::get(AType);
804*67e74705SXin Li 
805*67e74705SXin Li     // Copy initializer elements.
806*67e74705SXin Li     std::vector<llvm::Constant*> Elts;
807*67e74705SXin Li     Elts.reserve(NumInitableElts + NumElements);
808*67e74705SXin Li 
809*67e74705SXin Li     bool RewriteType = false;
810*67e74705SXin Li     for (unsigned i = 0; i < NumInitableElts; ++i) {
811*67e74705SXin Li       Expr *Init = ILE->getInit(i);
812*67e74705SXin Li       llvm::Constant *C = CGM.EmitConstantExpr(Init, Init->getType(), CGF);
813*67e74705SXin Li       if (!C)
814*67e74705SXin Li         return nullptr;
815*67e74705SXin Li       RewriteType |= (C->getType() != ElemTy);
816*67e74705SXin Li       Elts.push_back(C);
817*67e74705SXin Li     }
818*67e74705SXin Li 
819*67e74705SXin Li     RewriteType |= (fillC->getType() != ElemTy);
820*67e74705SXin Li     Elts.resize(NumElements, fillC);
821*67e74705SXin Li 
822*67e74705SXin Li     if (RewriteType) {
823*67e74705SXin Li       // FIXME: Try to avoid packing the array
824*67e74705SXin Li       std::vector<llvm::Type*> Types;
825*67e74705SXin Li       Types.reserve(NumInitableElts + NumElements);
826*67e74705SXin Li       for (unsigned i = 0, e = Elts.size(); i < e; ++i)
827*67e74705SXin Li         Types.push_back(Elts[i]->getType());
828*67e74705SXin Li       llvm::StructType *SType = llvm::StructType::get(AType->getContext(),
829*67e74705SXin Li                                                             Types, true);
830*67e74705SXin Li       return llvm::ConstantStruct::get(SType, Elts);
831*67e74705SXin Li     }
832*67e74705SXin Li 
833*67e74705SXin Li     return llvm::ConstantArray::get(AType, Elts);
834*67e74705SXin Li   }
835*67e74705SXin Li 
EmitRecordInitialization(InitListExpr * ILE)836*67e74705SXin Li   llvm::Constant *EmitRecordInitialization(InitListExpr *ILE) {
837*67e74705SXin Li     return ConstStructBuilder::BuildStruct(CGM, CGF, ILE);
838*67e74705SXin Li   }
839*67e74705SXin Li 
VisitImplicitValueInitExpr(ImplicitValueInitExpr * E)840*67e74705SXin Li   llvm::Constant *VisitImplicitValueInitExpr(ImplicitValueInitExpr* E) {
841*67e74705SXin Li     return CGM.EmitNullConstant(E->getType());
842*67e74705SXin Li   }
843*67e74705SXin Li 
VisitInitListExpr(InitListExpr * ILE)844*67e74705SXin Li   llvm::Constant *VisitInitListExpr(InitListExpr *ILE) {
845*67e74705SXin Li     if (ILE->getType()->isArrayType())
846*67e74705SXin Li       return EmitArrayInitialization(ILE);
847*67e74705SXin Li 
848*67e74705SXin Li     if (ILE->getType()->isRecordType())
849*67e74705SXin Li       return EmitRecordInitialization(ILE);
850*67e74705SXin Li 
851*67e74705SXin Li     return nullptr;
852*67e74705SXin Li   }
853*67e74705SXin Li 
EmitDesignatedInitUpdater(llvm::Constant * Base,InitListExpr * Updater)854*67e74705SXin Li   llvm::Constant *EmitDesignatedInitUpdater(llvm::Constant *Base,
855*67e74705SXin Li                                             InitListExpr *Updater) {
856*67e74705SXin Li     QualType ExprType = Updater->getType();
857*67e74705SXin Li 
858*67e74705SXin Li     if (ExprType->isArrayType()) {
859*67e74705SXin Li       llvm::ArrayType *AType = cast<llvm::ArrayType>(ConvertType(ExprType));
860*67e74705SXin Li       llvm::Type *ElemType = AType->getElementType();
861*67e74705SXin Li 
862*67e74705SXin Li       unsigned NumInitElements = Updater->getNumInits();
863*67e74705SXin Li       unsigned NumElements = AType->getNumElements();
864*67e74705SXin Li 
865*67e74705SXin Li       std::vector<llvm::Constant *> Elts;
866*67e74705SXin Li       Elts.reserve(NumElements);
867*67e74705SXin Li 
868*67e74705SXin Li       if (llvm::ConstantDataArray *DataArray =
869*67e74705SXin Li             dyn_cast<llvm::ConstantDataArray>(Base))
870*67e74705SXin Li         for (unsigned i = 0; i != NumElements; ++i)
871*67e74705SXin Li           Elts.push_back(DataArray->getElementAsConstant(i));
872*67e74705SXin Li       else if (llvm::ConstantArray *Array =
873*67e74705SXin Li                  dyn_cast<llvm::ConstantArray>(Base))
874*67e74705SXin Li         for (unsigned i = 0; i != NumElements; ++i)
875*67e74705SXin Li           Elts.push_back(Array->getOperand(i));
876*67e74705SXin Li       else
877*67e74705SXin Li         return nullptr; // FIXME: other array types not implemented
878*67e74705SXin Li 
879*67e74705SXin Li       llvm::Constant *fillC = nullptr;
880*67e74705SXin Li       if (Expr *filler = Updater->getArrayFiller())
881*67e74705SXin Li         if (!isa<NoInitExpr>(filler))
882*67e74705SXin Li           fillC = CGM.EmitConstantExpr(filler, filler->getType(), CGF);
883*67e74705SXin Li       bool RewriteType = (fillC && fillC->getType() != ElemType);
884*67e74705SXin Li 
885*67e74705SXin Li       for (unsigned i = 0; i != NumElements; ++i) {
886*67e74705SXin Li         Expr *Init = nullptr;
887*67e74705SXin Li         if (i < NumInitElements)
888*67e74705SXin Li           Init = Updater->getInit(i);
889*67e74705SXin Li 
890*67e74705SXin Li         if (!Init && fillC)
891*67e74705SXin Li           Elts[i] = fillC;
892*67e74705SXin Li         else if (!Init || isa<NoInitExpr>(Init))
893*67e74705SXin Li           ; // Do nothing.
894*67e74705SXin Li         else if (InitListExpr *ChildILE = dyn_cast<InitListExpr>(Init))
895*67e74705SXin Li           Elts[i] = EmitDesignatedInitUpdater(Elts[i], ChildILE);
896*67e74705SXin Li         else
897*67e74705SXin Li           Elts[i] = CGM.EmitConstantExpr(Init, Init->getType(), CGF);
898*67e74705SXin Li 
899*67e74705SXin Li        if (!Elts[i])
900*67e74705SXin Li           return nullptr;
901*67e74705SXin Li         RewriteType |= (Elts[i]->getType() != ElemType);
902*67e74705SXin Li       }
903*67e74705SXin Li 
904*67e74705SXin Li       if (RewriteType) {
905*67e74705SXin Li         std::vector<llvm::Type *> Types;
906*67e74705SXin Li         Types.reserve(NumElements);
907*67e74705SXin Li         for (unsigned i = 0; i != NumElements; ++i)
908*67e74705SXin Li           Types.push_back(Elts[i]->getType());
909*67e74705SXin Li         llvm::StructType *SType = llvm::StructType::get(AType->getContext(),
910*67e74705SXin Li                                                         Types, true);
911*67e74705SXin Li         return llvm::ConstantStruct::get(SType, Elts);
912*67e74705SXin Li       }
913*67e74705SXin Li 
914*67e74705SXin Li       return llvm::ConstantArray::get(AType, Elts);
915*67e74705SXin Li     }
916*67e74705SXin Li 
917*67e74705SXin Li     if (ExprType->isRecordType())
918*67e74705SXin Li       return ConstStructBuilder::BuildStruct(CGM, CGF, this,
919*67e74705SXin Li                  dyn_cast<llvm::ConstantStruct>(Base), Updater);
920*67e74705SXin Li 
921*67e74705SXin Li     return nullptr;
922*67e74705SXin Li   }
923*67e74705SXin Li 
VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * E)924*67e74705SXin Li   llvm::Constant *VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr *E) {
925*67e74705SXin Li     return EmitDesignatedInitUpdater(
926*67e74705SXin Li                CGM.EmitConstantExpr(E->getBase(), E->getType(), CGF),
927*67e74705SXin Li                E->getUpdater());
928*67e74705SXin Li   }
929*67e74705SXin Li 
VisitCXXConstructExpr(CXXConstructExpr * E)930*67e74705SXin Li   llvm::Constant *VisitCXXConstructExpr(CXXConstructExpr *E) {
931*67e74705SXin Li     if (!E->getConstructor()->isTrivial())
932*67e74705SXin Li       return nullptr;
933*67e74705SXin Li 
934*67e74705SXin Li     QualType Ty = E->getType();
935*67e74705SXin Li 
936*67e74705SXin Li     // FIXME: We should not have to call getBaseElementType here.
937*67e74705SXin Li     const RecordType *RT =
938*67e74705SXin Li       CGM.getContext().getBaseElementType(Ty)->getAs<RecordType>();
939*67e74705SXin Li     const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
940*67e74705SXin Li 
941*67e74705SXin Li     // If the class doesn't have a trivial destructor, we can't emit it as a
942*67e74705SXin Li     // constant expr.
943*67e74705SXin Li     if (!RD->hasTrivialDestructor())
944*67e74705SXin Li       return nullptr;
945*67e74705SXin Li 
946*67e74705SXin Li     // Only copy and default constructors can be trivial.
947*67e74705SXin Li 
948*67e74705SXin Li 
949*67e74705SXin Li     if (E->getNumArgs()) {
950*67e74705SXin Li       assert(E->getNumArgs() == 1 && "trivial ctor with > 1 argument");
951*67e74705SXin Li       assert(E->getConstructor()->isCopyOrMoveConstructor() &&
952*67e74705SXin Li              "trivial ctor has argument but isn't a copy/move ctor");
953*67e74705SXin Li 
954*67e74705SXin Li       Expr *Arg = E->getArg(0);
955*67e74705SXin Li       assert(CGM.getContext().hasSameUnqualifiedType(Ty, Arg->getType()) &&
956*67e74705SXin Li              "argument to copy ctor is of wrong type");
957*67e74705SXin Li 
958*67e74705SXin Li       return Visit(Arg);
959*67e74705SXin Li     }
960*67e74705SXin Li 
961*67e74705SXin Li     return CGM.EmitNullConstant(Ty);
962*67e74705SXin Li   }
963*67e74705SXin Li 
VisitStringLiteral(StringLiteral * E)964*67e74705SXin Li   llvm::Constant *VisitStringLiteral(StringLiteral *E) {
965*67e74705SXin Li     return CGM.GetConstantArrayFromStringLiteral(E);
966*67e74705SXin Li   }
967*67e74705SXin Li 
VisitObjCEncodeExpr(ObjCEncodeExpr * E)968*67e74705SXin Li   llvm::Constant *VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
969*67e74705SXin Li     // This must be an @encode initializing an array in a static initializer.
970*67e74705SXin Li     // Don't emit it as the address of the string, emit the string data itself
971*67e74705SXin Li     // as an inline array.
972*67e74705SXin Li     std::string Str;
973*67e74705SXin Li     CGM.getContext().getObjCEncodingForType(E->getEncodedType(), Str);
974*67e74705SXin Li     QualType T = E->getType();
975*67e74705SXin Li     if (T->getTypeClass() == Type::TypeOfExpr)
976*67e74705SXin Li       T = cast<TypeOfExprType>(T)->getUnderlyingExpr()->getType();
977*67e74705SXin Li     const ConstantArrayType *CAT = cast<ConstantArrayType>(T);
978*67e74705SXin Li 
979*67e74705SXin Li     // Resize the string to the right size, adding zeros at the end, or
980*67e74705SXin Li     // truncating as needed.
981*67e74705SXin Li     Str.resize(CAT->getSize().getZExtValue(), '\0');
982*67e74705SXin Li     return llvm::ConstantDataArray::getString(VMContext, Str, false);
983*67e74705SXin Li   }
984*67e74705SXin Li 
VisitUnaryExtension(const UnaryOperator * E)985*67e74705SXin Li   llvm::Constant *VisitUnaryExtension(const UnaryOperator *E) {
986*67e74705SXin Li     return Visit(E->getSubExpr());
987*67e74705SXin Li   }
988*67e74705SXin Li 
989*67e74705SXin Li   // Utility methods
ConvertType(QualType T)990*67e74705SXin Li   llvm::Type *ConvertType(QualType T) {
991*67e74705SXin Li     return CGM.getTypes().ConvertType(T);
992*67e74705SXin Li   }
993*67e74705SXin Li 
994*67e74705SXin Li public:
EmitLValue(APValue::LValueBase LVBase)995*67e74705SXin Li   ConstantAddress EmitLValue(APValue::LValueBase LVBase) {
996*67e74705SXin Li     if (const ValueDecl *Decl = LVBase.dyn_cast<const ValueDecl*>()) {
997*67e74705SXin Li       if (Decl->hasAttr<WeakRefAttr>())
998*67e74705SXin Li         return CGM.GetWeakRefReference(Decl);
999*67e74705SXin Li       if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl))
1000*67e74705SXin Li         return ConstantAddress(CGM.GetAddrOfFunction(FD), CharUnits::One());
1001*67e74705SXin Li       if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) {
1002*67e74705SXin Li         // We can never refer to a variable with local storage.
1003*67e74705SXin Li         if (!VD->hasLocalStorage()) {
1004*67e74705SXin Li           CharUnits Align = CGM.getContext().getDeclAlign(VD);
1005*67e74705SXin Li           if (VD->isFileVarDecl() || VD->hasExternalStorage())
1006*67e74705SXin Li             return ConstantAddress(CGM.GetAddrOfGlobalVar(VD), Align);
1007*67e74705SXin Li           else if (VD->isLocalVarDecl()) {
1008*67e74705SXin Li             auto Ptr = CGM.getOrCreateStaticVarDecl(
1009*67e74705SXin Li                 *VD, CGM.getLLVMLinkageVarDefinition(VD, /*isConstant=*/false));
1010*67e74705SXin Li             return ConstantAddress(Ptr, Align);
1011*67e74705SXin Li           }
1012*67e74705SXin Li         }
1013*67e74705SXin Li       }
1014*67e74705SXin Li       return ConstantAddress::invalid();
1015*67e74705SXin Li     }
1016*67e74705SXin Li 
1017*67e74705SXin Li     Expr *E = const_cast<Expr*>(LVBase.get<const Expr*>());
1018*67e74705SXin Li     switch (E->getStmtClass()) {
1019*67e74705SXin Li     default: break;
1020*67e74705SXin Li     case Expr::CompoundLiteralExprClass: {
1021*67e74705SXin Li       // Note that due to the nature of compound literals, this is guaranteed
1022*67e74705SXin Li       // to be the only use of the variable, so we just generate it here.
1023*67e74705SXin Li       CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E);
1024*67e74705SXin Li       llvm::Constant* C = CGM.EmitConstantExpr(CLE->getInitializer(),
1025*67e74705SXin Li                                                CLE->getType(), CGF);
1026*67e74705SXin Li       // FIXME: "Leaked" on failure.
1027*67e74705SXin Li       if (!C) return ConstantAddress::invalid();
1028*67e74705SXin Li 
1029*67e74705SXin Li       CharUnits Align = CGM.getContext().getTypeAlignInChars(E->getType());
1030*67e74705SXin Li 
1031*67e74705SXin Li       auto GV = new llvm::GlobalVariable(CGM.getModule(), C->getType(),
1032*67e74705SXin Li                                      E->getType().isConstant(CGM.getContext()),
1033*67e74705SXin Li                                      llvm::GlobalValue::InternalLinkage,
1034*67e74705SXin Li                                      C, ".compoundliteral", nullptr,
1035*67e74705SXin Li                                      llvm::GlobalVariable::NotThreadLocal,
1036*67e74705SXin Li                           CGM.getContext().getTargetAddressSpace(E->getType()));
1037*67e74705SXin Li       GV->setAlignment(Align.getQuantity());
1038*67e74705SXin Li       return ConstantAddress(GV, Align);
1039*67e74705SXin Li     }
1040*67e74705SXin Li     case Expr::StringLiteralClass:
1041*67e74705SXin Li       return CGM.GetAddrOfConstantStringFromLiteral(cast<StringLiteral>(E));
1042*67e74705SXin Li     case Expr::ObjCEncodeExprClass:
1043*67e74705SXin Li       return CGM.GetAddrOfConstantStringFromObjCEncode(cast<ObjCEncodeExpr>(E));
1044*67e74705SXin Li     case Expr::ObjCStringLiteralClass: {
1045*67e74705SXin Li       ObjCStringLiteral* SL = cast<ObjCStringLiteral>(E);
1046*67e74705SXin Li       ConstantAddress C =
1047*67e74705SXin Li           CGM.getObjCRuntime().GenerateConstantString(SL->getString());
1048*67e74705SXin Li       return C.getElementBitCast(ConvertType(E->getType()));
1049*67e74705SXin Li     }
1050*67e74705SXin Li     case Expr::PredefinedExprClass: {
1051*67e74705SXin Li       unsigned Type = cast<PredefinedExpr>(E)->getIdentType();
1052*67e74705SXin Li       if (CGF) {
1053*67e74705SXin Li         LValue Res = CGF->EmitPredefinedLValue(cast<PredefinedExpr>(E));
1054*67e74705SXin Li         return cast<ConstantAddress>(Res.getAddress());
1055*67e74705SXin Li       } else if (Type == PredefinedExpr::PrettyFunction) {
1056*67e74705SXin Li         return CGM.GetAddrOfConstantCString("top level", ".tmp");
1057*67e74705SXin Li       }
1058*67e74705SXin Li 
1059*67e74705SXin Li       return CGM.GetAddrOfConstantCString("", ".tmp");
1060*67e74705SXin Li     }
1061*67e74705SXin Li     case Expr::AddrLabelExprClass: {
1062*67e74705SXin Li       assert(CGF && "Invalid address of label expression outside function.");
1063*67e74705SXin Li       llvm::Constant *Ptr =
1064*67e74705SXin Li         CGF->GetAddrOfLabel(cast<AddrLabelExpr>(E)->getLabel());
1065*67e74705SXin Li       Ptr = llvm::ConstantExpr::getBitCast(Ptr, ConvertType(E->getType()));
1066*67e74705SXin Li       return ConstantAddress(Ptr, CharUnits::One());
1067*67e74705SXin Li     }
1068*67e74705SXin Li     case Expr::CallExprClass: {
1069*67e74705SXin Li       CallExpr* CE = cast<CallExpr>(E);
1070*67e74705SXin Li       unsigned builtin = CE->getBuiltinCallee();
1071*67e74705SXin Li       if (builtin !=
1072*67e74705SXin Li             Builtin::BI__builtin___CFStringMakeConstantString &&
1073*67e74705SXin Li           builtin !=
1074*67e74705SXin Li             Builtin::BI__builtin___NSStringMakeConstantString)
1075*67e74705SXin Li         break;
1076*67e74705SXin Li       const Expr *Arg = CE->getArg(0)->IgnoreParenCasts();
1077*67e74705SXin Li       const StringLiteral *Literal = cast<StringLiteral>(Arg);
1078*67e74705SXin Li       if (builtin ==
1079*67e74705SXin Li             Builtin::BI__builtin___NSStringMakeConstantString) {
1080*67e74705SXin Li         return CGM.getObjCRuntime().GenerateConstantString(Literal);
1081*67e74705SXin Li       }
1082*67e74705SXin Li       // FIXME: need to deal with UCN conversion issues.
1083*67e74705SXin Li       return CGM.GetAddrOfConstantCFString(Literal);
1084*67e74705SXin Li     }
1085*67e74705SXin Li     case Expr::BlockExprClass: {
1086*67e74705SXin Li       std::string FunctionName;
1087*67e74705SXin Li       if (CGF)
1088*67e74705SXin Li         FunctionName = CGF->CurFn->getName();
1089*67e74705SXin Li       else
1090*67e74705SXin Li         FunctionName = "global";
1091*67e74705SXin Li 
1092*67e74705SXin Li       // This is not really an l-value.
1093*67e74705SXin Li       llvm::Constant *Ptr =
1094*67e74705SXin Li         CGM.GetAddrOfGlobalBlock(cast<BlockExpr>(E), FunctionName.c_str());
1095*67e74705SXin Li       return ConstantAddress(Ptr, CGM.getPointerAlign());
1096*67e74705SXin Li     }
1097*67e74705SXin Li     case Expr::CXXTypeidExprClass: {
1098*67e74705SXin Li       CXXTypeidExpr *Typeid = cast<CXXTypeidExpr>(E);
1099*67e74705SXin Li       QualType T;
1100*67e74705SXin Li       if (Typeid->isTypeOperand())
1101*67e74705SXin Li         T = Typeid->getTypeOperand(CGM.getContext());
1102*67e74705SXin Li       else
1103*67e74705SXin Li         T = Typeid->getExprOperand()->getType();
1104*67e74705SXin Li       return ConstantAddress(CGM.GetAddrOfRTTIDescriptor(T),
1105*67e74705SXin Li                              CGM.getPointerAlign());
1106*67e74705SXin Li     }
1107*67e74705SXin Li     case Expr::CXXUuidofExprClass: {
1108*67e74705SXin Li       return CGM.GetAddrOfUuidDescriptor(cast<CXXUuidofExpr>(E));
1109*67e74705SXin Li     }
1110*67e74705SXin Li     case Expr::MaterializeTemporaryExprClass: {
1111*67e74705SXin Li       MaterializeTemporaryExpr *MTE = cast<MaterializeTemporaryExpr>(E);
1112*67e74705SXin Li       assert(MTE->getStorageDuration() == SD_Static);
1113*67e74705SXin Li       SmallVector<const Expr *, 2> CommaLHSs;
1114*67e74705SXin Li       SmallVector<SubobjectAdjustment, 2> Adjustments;
1115*67e74705SXin Li       const Expr *Inner = MTE->GetTemporaryExpr()
1116*67e74705SXin Li           ->skipRValueSubobjectAdjustments(CommaLHSs, Adjustments);
1117*67e74705SXin Li       return CGM.GetAddrOfGlobalTemporary(MTE, Inner);
1118*67e74705SXin Li     }
1119*67e74705SXin Li     }
1120*67e74705SXin Li 
1121*67e74705SXin Li     return ConstantAddress::invalid();
1122*67e74705SXin Li   }
1123*67e74705SXin Li };
1124*67e74705SXin Li 
1125*67e74705SXin Li }  // end anonymous namespace.
1126*67e74705SXin Li 
Build(ConstExprEmitter * Emitter,llvm::ConstantStruct * Base,InitListExpr * Updater)1127*67e74705SXin Li bool ConstStructBuilder::Build(ConstExprEmitter *Emitter,
1128*67e74705SXin Li                                llvm::ConstantStruct *Base,
1129*67e74705SXin Li                                InitListExpr *Updater) {
1130*67e74705SXin Li   assert(Base && "base expression should not be empty");
1131*67e74705SXin Li 
1132*67e74705SXin Li   QualType ExprType = Updater->getType();
1133*67e74705SXin Li   RecordDecl *RD = ExprType->getAs<RecordType>()->getDecl();
1134*67e74705SXin Li   const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
1135*67e74705SXin Li   const llvm::StructLayout *BaseLayout = CGM.getDataLayout().getStructLayout(
1136*67e74705SXin Li                                            Base->getType());
1137*67e74705SXin Li   unsigned FieldNo = -1;
1138*67e74705SXin Li   unsigned ElementNo = 0;
1139*67e74705SXin Li 
1140*67e74705SXin Li   // Bail out if we have base classes. We could support these, but they only
1141*67e74705SXin Li   // arise in C++1z where we will have already constant folded most interesting
1142*67e74705SXin Li   // cases. FIXME: There are still a few more cases we can handle this way.
1143*67e74705SXin Li   if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1144*67e74705SXin Li     if (CXXRD->getNumBases())
1145*67e74705SXin Li       return false;
1146*67e74705SXin Li 
1147*67e74705SXin Li   for (FieldDecl *Field : RD->fields()) {
1148*67e74705SXin Li     ++FieldNo;
1149*67e74705SXin Li 
1150*67e74705SXin Li     if (RD->isUnion() && Updater->getInitializedFieldInUnion() != Field)
1151*67e74705SXin Li       continue;
1152*67e74705SXin Li 
1153*67e74705SXin Li     // Skip anonymous bitfields.
1154*67e74705SXin Li     if (Field->isUnnamedBitfield())
1155*67e74705SXin Li       continue;
1156*67e74705SXin Li 
1157*67e74705SXin Li     llvm::Constant *EltInit = Base->getOperand(ElementNo);
1158*67e74705SXin Li 
1159*67e74705SXin Li     // Bail out if the type of the ConstantStruct does not have the same layout
1160*67e74705SXin Li     // as the type of the InitListExpr.
1161*67e74705SXin Li     if (CGM.getTypes().ConvertType(Field->getType()) != EltInit->getType() ||
1162*67e74705SXin Li         Layout.getFieldOffset(ElementNo) !=
1163*67e74705SXin Li           BaseLayout->getElementOffsetInBits(ElementNo))
1164*67e74705SXin Li       return false;
1165*67e74705SXin Li 
1166*67e74705SXin Li     // Get the initializer. If we encounter an empty field or a NoInitExpr,
1167*67e74705SXin Li     // we use values from the base expression.
1168*67e74705SXin Li     Expr *Init = nullptr;
1169*67e74705SXin Li     if (ElementNo < Updater->getNumInits())
1170*67e74705SXin Li       Init = Updater->getInit(ElementNo);
1171*67e74705SXin Li 
1172*67e74705SXin Li     if (!Init || isa<NoInitExpr>(Init))
1173*67e74705SXin Li       ; // Do nothing.
1174*67e74705SXin Li     else if (InitListExpr *ChildILE = dyn_cast<InitListExpr>(Init))
1175*67e74705SXin Li       EltInit = Emitter->EmitDesignatedInitUpdater(EltInit, ChildILE);
1176*67e74705SXin Li     else
1177*67e74705SXin Li       EltInit = CGM.EmitConstantExpr(Init, Field->getType(), CGF);
1178*67e74705SXin Li 
1179*67e74705SXin Li     ++ElementNo;
1180*67e74705SXin Li 
1181*67e74705SXin Li     if (!EltInit)
1182*67e74705SXin Li       return false;
1183*67e74705SXin Li 
1184*67e74705SXin Li     if (!Field->isBitField())
1185*67e74705SXin Li       AppendField(Field, Layout.getFieldOffset(FieldNo), EltInit);
1186*67e74705SXin Li     else if (llvm::ConstantInt *CI = dyn_cast<llvm::ConstantInt>(EltInit))
1187*67e74705SXin Li       AppendBitField(Field, Layout.getFieldOffset(FieldNo), CI);
1188*67e74705SXin Li     else
1189*67e74705SXin Li       // Initializing a bitfield with a non-trivial constant?
1190*67e74705SXin Li       return false;
1191*67e74705SXin Li   }
1192*67e74705SXin Li 
1193*67e74705SXin Li   return true;
1194*67e74705SXin Li }
1195*67e74705SXin Li 
EmitConstantInit(const VarDecl & D,CodeGenFunction * CGF)1196*67e74705SXin Li llvm::Constant *CodeGenModule::EmitConstantInit(const VarDecl &D,
1197*67e74705SXin Li                                                 CodeGenFunction *CGF) {
1198*67e74705SXin Li   // Make a quick check if variable can be default NULL initialized
1199*67e74705SXin Li   // and avoid going through rest of code which may do, for c++11,
1200*67e74705SXin Li   // initialization of memory to all NULLs.
1201*67e74705SXin Li   if (!D.hasLocalStorage()) {
1202*67e74705SXin Li     QualType Ty = D.getType();
1203*67e74705SXin Li     if (Ty->isArrayType())
1204*67e74705SXin Li       Ty = Context.getBaseElementType(Ty);
1205*67e74705SXin Li     if (Ty->isRecordType())
1206*67e74705SXin Li       if (const CXXConstructExpr *E =
1207*67e74705SXin Li           dyn_cast_or_null<CXXConstructExpr>(D.getInit())) {
1208*67e74705SXin Li         const CXXConstructorDecl *CD = E->getConstructor();
1209*67e74705SXin Li         if (CD->isTrivial() && CD->isDefaultConstructor())
1210*67e74705SXin Li           return EmitNullConstant(D.getType());
1211*67e74705SXin Li       }
1212*67e74705SXin Li   }
1213*67e74705SXin Li 
1214*67e74705SXin Li   if (const APValue *Value = D.evaluateValue())
1215*67e74705SXin Li     return EmitConstantValueForMemory(*Value, D.getType(), CGF);
1216*67e74705SXin Li 
1217*67e74705SXin Li   // FIXME: Implement C++11 [basic.start.init]p2: if the initializer of a
1218*67e74705SXin Li   // reference is a constant expression, and the reference binds to a temporary,
1219*67e74705SXin Li   // then constant initialization is performed. ConstExprEmitter will
1220*67e74705SXin Li   // incorrectly emit a prvalue constant in this case, and the calling code
1221*67e74705SXin Li   // interprets that as the (pointer) value of the reference, rather than the
1222*67e74705SXin Li   // desired value of the referee.
1223*67e74705SXin Li   if (D.getType()->isReferenceType())
1224*67e74705SXin Li     return nullptr;
1225*67e74705SXin Li 
1226*67e74705SXin Li   const Expr *E = D.getInit();
1227*67e74705SXin Li   assert(E && "No initializer to emit");
1228*67e74705SXin Li 
1229*67e74705SXin Li   llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E));
1230*67e74705SXin Li   if (C && C->getType()->isIntegerTy(1)) {
1231*67e74705SXin Li     llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType());
1232*67e74705SXin Li     C = llvm::ConstantExpr::getZExt(C, BoolTy);
1233*67e74705SXin Li   }
1234*67e74705SXin Li   return C;
1235*67e74705SXin Li }
1236*67e74705SXin Li 
EmitConstantExpr(const Expr * E,QualType DestType,CodeGenFunction * CGF)1237*67e74705SXin Li llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
1238*67e74705SXin Li                                                 QualType DestType,
1239*67e74705SXin Li                                                 CodeGenFunction *CGF) {
1240*67e74705SXin Li   Expr::EvalResult Result;
1241*67e74705SXin Li 
1242*67e74705SXin Li   bool Success = false;
1243*67e74705SXin Li 
1244*67e74705SXin Li   if (DestType->isReferenceType())
1245*67e74705SXin Li     Success = E->EvaluateAsLValue(Result, Context);
1246*67e74705SXin Li   else
1247*67e74705SXin Li     Success = E->EvaluateAsRValue(Result, Context);
1248*67e74705SXin Li 
1249*67e74705SXin Li   llvm::Constant *C = nullptr;
1250*67e74705SXin Li   if (Success && !Result.HasSideEffects)
1251*67e74705SXin Li     C = EmitConstantValue(Result.Val, DestType, CGF);
1252*67e74705SXin Li   else
1253*67e74705SXin Li     C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E));
1254*67e74705SXin Li 
1255*67e74705SXin Li   if (C && C->getType()->isIntegerTy(1)) {
1256*67e74705SXin Li     llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType());
1257*67e74705SXin Li     C = llvm::ConstantExpr::getZExt(C, BoolTy);
1258*67e74705SXin Li   }
1259*67e74705SXin Li   return C;
1260*67e74705SXin Li }
1261*67e74705SXin Li 
EmitConstantValue(const APValue & Value,QualType DestType,CodeGenFunction * CGF)1262*67e74705SXin Li llvm::Constant *CodeGenModule::EmitConstantValue(const APValue &Value,
1263*67e74705SXin Li                                                  QualType DestType,
1264*67e74705SXin Li                                                  CodeGenFunction *CGF) {
1265*67e74705SXin Li   // For an _Atomic-qualified constant, we may need to add tail padding.
1266*67e74705SXin Li   if (auto *AT = DestType->getAs<AtomicType>()) {
1267*67e74705SXin Li     QualType InnerType = AT->getValueType();
1268*67e74705SXin Li     auto *Inner = EmitConstantValue(Value, InnerType, CGF);
1269*67e74705SXin Li 
1270*67e74705SXin Li     uint64_t InnerSize = Context.getTypeSize(InnerType);
1271*67e74705SXin Li     uint64_t OuterSize = Context.getTypeSize(DestType);
1272*67e74705SXin Li     if (InnerSize == OuterSize)
1273*67e74705SXin Li       return Inner;
1274*67e74705SXin Li 
1275*67e74705SXin Li     assert(InnerSize < OuterSize && "emitted over-large constant for atomic");
1276*67e74705SXin Li     llvm::Constant *Elts[] = {
1277*67e74705SXin Li       Inner,
1278*67e74705SXin Li       llvm::ConstantAggregateZero::get(
1279*67e74705SXin Li           llvm::ArrayType::get(Int8Ty, (OuterSize - InnerSize) / 8))
1280*67e74705SXin Li     };
1281*67e74705SXin Li     return llvm::ConstantStruct::getAnon(Elts);
1282*67e74705SXin Li   }
1283*67e74705SXin Li 
1284*67e74705SXin Li   switch (Value.getKind()) {
1285*67e74705SXin Li   case APValue::Uninitialized:
1286*67e74705SXin Li     llvm_unreachable("Constant expressions should be initialized.");
1287*67e74705SXin Li   case APValue::LValue: {
1288*67e74705SXin Li     llvm::Type *DestTy = getTypes().ConvertTypeForMem(DestType);
1289*67e74705SXin Li     llvm::Constant *Offset =
1290*67e74705SXin Li       llvm::ConstantInt::get(Int64Ty, Value.getLValueOffset().getQuantity());
1291*67e74705SXin Li 
1292*67e74705SXin Li     llvm::Constant *C = nullptr;
1293*67e74705SXin Li     if (APValue::LValueBase LVBase = Value.getLValueBase()) {
1294*67e74705SXin Li       // An array can be represented as an lvalue referring to the base.
1295*67e74705SXin Li       if (isa<llvm::ArrayType>(DestTy)) {
1296*67e74705SXin Li         assert(Offset->isNullValue() && "offset on array initializer");
1297*67e74705SXin Li         return ConstExprEmitter(*this, CGF).Visit(
1298*67e74705SXin Li           const_cast<Expr*>(LVBase.get<const Expr*>()));
1299*67e74705SXin Li       }
1300*67e74705SXin Li 
1301*67e74705SXin Li       C = ConstExprEmitter(*this, CGF).EmitLValue(LVBase).getPointer();
1302*67e74705SXin Li 
1303*67e74705SXin Li       // Apply offset if necessary.
1304*67e74705SXin Li       if (!Offset->isNullValue()) {
1305*67e74705SXin Li         unsigned AS = C->getType()->getPointerAddressSpace();
1306*67e74705SXin Li         llvm::Type *CharPtrTy = Int8Ty->getPointerTo(AS);
1307*67e74705SXin Li         llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, CharPtrTy);
1308*67e74705SXin Li         Casted = llvm::ConstantExpr::getGetElementPtr(Int8Ty, Casted, Offset);
1309*67e74705SXin Li         C = llvm::ConstantExpr::getPointerCast(Casted, C->getType());
1310*67e74705SXin Li       }
1311*67e74705SXin Li 
1312*67e74705SXin Li       // Convert to the appropriate type; this could be an lvalue for
1313*67e74705SXin Li       // an integer.
1314*67e74705SXin Li       if (isa<llvm::PointerType>(DestTy))
1315*67e74705SXin Li         return llvm::ConstantExpr::getPointerCast(C, DestTy);
1316*67e74705SXin Li 
1317*67e74705SXin Li       return llvm::ConstantExpr::getPtrToInt(C, DestTy);
1318*67e74705SXin Li     } else {
1319*67e74705SXin Li       C = Offset;
1320*67e74705SXin Li 
1321*67e74705SXin Li       // Convert to the appropriate type; this could be an lvalue for
1322*67e74705SXin Li       // an integer.
1323*67e74705SXin Li       if (isa<llvm::PointerType>(DestTy)) {
1324*67e74705SXin Li         // Convert the integer to a pointer-sized integer before converting it
1325*67e74705SXin Li         // to a pointer.
1326*67e74705SXin Li         C = llvm::ConstantExpr::getIntegerCast(
1327*67e74705SXin Li             C, getDataLayout().getIntPtrType(DestTy),
1328*67e74705SXin Li             /*isSigned=*/false);
1329*67e74705SXin Li         return llvm::ConstantExpr::getIntToPtr(C, DestTy);
1330*67e74705SXin Li       }
1331*67e74705SXin Li 
1332*67e74705SXin Li       // If the types don't match this should only be a truncate.
1333*67e74705SXin Li       if (C->getType() != DestTy)
1334*67e74705SXin Li         return llvm::ConstantExpr::getTrunc(C, DestTy);
1335*67e74705SXin Li 
1336*67e74705SXin Li       return C;
1337*67e74705SXin Li     }
1338*67e74705SXin Li   }
1339*67e74705SXin Li   case APValue::Int:
1340*67e74705SXin Li     return llvm::ConstantInt::get(VMContext, Value.getInt());
1341*67e74705SXin Li   case APValue::ComplexInt: {
1342*67e74705SXin Li     llvm::Constant *Complex[2];
1343*67e74705SXin Li 
1344*67e74705SXin Li     Complex[0] = llvm::ConstantInt::get(VMContext,
1345*67e74705SXin Li                                         Value.getComplexIntReal());
1346*67e74705SXin Li     Complex[1] = llvm::ConstantInt::get(VMContext,
1347*67e74705SXin Li                                         Value.getComplexIntImag());
1348*67e74705SXin Li 
1349*67e74705SXin Li     // FIXME: the target may want to specify that this is packed.
1350*67e74705SXin Li     llvm::StructType *STy = llvm::StructType::get(Complex[0]->getType(),
1351*67e74705SXin Li                                                   Complex[1]->getType(),
1352*67e74705SXin Li                                                   nullptr);
1353*67e74705SXin Li     return llvm::ConstantStruct::get(STy, Complex);
1354*67e74705SXin Li   }
1355*67e74705SXin Li   case APValue::Float: {
1356*67e74705SXin Li     const llvm::APFloat &Init = Value.getFloat();
1357*67e74705SXin Li     if (&Init.getSemantics() == &llvm::APFloat::IEEEhalf &&
1358*67e74705SXin Li         !Context.getLangOpts().NativeHalfType &&
1359*67e74705SXin Li         !Context.getLangOpts().HalfArgsAndReturns)
1360*67e74705SXin Li       return llvm::ConstantInt::get(VMContext, Init.bitcastToAPInt());
1361*67e74705SXin Li     else
1362*67e74705SXin Li       return llvm::ConstantFP::get(VMContext, Init);
1363*67e74705SXin Li   }
1364*67e74705SXin Li   case APValue::ComplexFloat: {
1365*67e74705SXin Li     llvm::Constant *Complex[2];
1366*67e74705SXin Li 
1367*67e74705SXin Li     Complex[0] = llvm::ConstantFP::get(VMContext,
1368*67e74705SXin Li                                        Value.getComplexFloatReal());
1369*67e74705SXin Li     Complex[1] = llvm::ConstantFP::get(VMContext,
1370*67e74705SXin Li                                        Value.getComplexFloatImag());
1371*67e74705SXin Li 
1372*67e74705SXin Li     // FIXME: the target may want to specify that this is packed.
1373*67e74705SXin Li     llvm::StructType *STy = llvm::StructType::get(Complex[0]->getType(),
1374*67e74705SXin Li                                                   Complex[1]->getType(),
1375*67e74705SXin Li                                                   nullptr);
1376*67e74705SXin Li     return llvm::ConstantStruct::get(STy, Complex);
1377*67e74705SXin Li   }
1378*67e74705SXin Li   case APValue::Vector: {
1379*67e74705SXin Li     unsigned NumElts = Value.getVectorLength();
1380*67e74705SXin Li     SmallVector<llvm::Constant *, 4> Inits(NumElts);
1381*67e74705SXin Li 
1382*67e74705SXin Li     for (unsigned I = 0; I != NumElts; ++I) {
1383*67e74705SXin Li       const APValue &Elt = Value.getVectorElt(I);
1384*67e74705SXin Li       if (Elt.isInt())
1385*67e74705SXin Li         Inits[I] = llvm::ConstantInt::get(VMContext, Elt.getInt());
1386*67e74705SXin Li       else if (Elt.isFloat())
1387*67e74705SXin Li         Inits[I] = llvm::ConstantFP::get(VMContext, Elt.getFloat());
1388*67e74705SXin Li       else
1389*67e74705SXin Li         llvm_unreachable("unsupported vector element type");
1390*67e74705SXin Li     }
1391*67e74705SXin Li     return llvm::ConstantVector::get(Inits);
1392*67e74705SXin Li   }
1393*67e74705SXin Li   case APValue::AddrLabelDiff: {
1394*67e74705SXin Li     const AddrLabelExpr *LHSExpr = Value.getAddrLabelDiffLHS();
1395*67e74705SXin Li     const AddrLabelExpr *RHSExpr = Value.getAddrLabelDiffRHS();
1396*67e74705SXin Li     llvm::Constant *LHS = EmitConstantExpr(LHSExpr, LHSExpr->getType(), CGF);
1397*67e74705SXin Li     llvm::Constant *RHS = EmitConstantExpr(RHSExpr, RHSExpr->getType(), CGF);
1398*67e74705SXin Li 
1399*67e74705SXin Li     // Compute difference
1400*67e74705SXin Li     llvm::Type *ResultType = getTypes().ConvertType(DestType);
1401*67e74705SXin Li     LHS = llvm::ConstantExpr::getPtrToInt(LHS, IntPtrTy);
1402*67e74705SXin Li     RHS = llvm::ConstantExpr::getPtrToInt(RHS, IntPtrTy);
1403*67e74705SXin Li     llvm::Constant *AddrLabelDiff = llvm::ConstantExpr::getSub(LHS, RHS);
1404*67e74705SXin Li 
1405*67e74705SXin Li     // LLVM is a bit sensitive about the exact format of the
1406*67e74705SXin Li     // address-of-label difference; make sure to truncate after
1407*67e74705SXin Li     // the subtraction.
1408*67e74705SXin Li     return llvm::ConstantExpr::getTruncOrBitCast(AddrLabelDiff, ResultType);
1409*67e74705SXin Li   }
1410*67e74705SXin Li   case APValue::Struct:
1411*67e74705SXin Li   case APValue::Union:
1412*67e74705SXin Li     return ConstStructBuilder::BuildStruct(*this, CGF, Value, DestType);
1413*67e74705SXin Li   case APValue::Array: {
1414*67e74705SXin Li     const ArrayType *CAT = Context.getAsArrayType(DestType);
1415*67e74705SXin Li     unsigned NumElements = Value.getArraySize();
1416*67e74705SXin Li     unsigned NumInitElts = Value.getArrayInitializedElts();
1417*67e74705SXin Li 
1418*67e74705SXin Li     // Emit array filler, if there is one.
1419*67e74705SXin Li     llvm::Constant *Filler = nullptr;
1420*67e74705SXin Li     if (Value.hasArrayFiller())
1421*67e74705SXin Li       Filler = EmitConstantValueForMemory(Value.getArrayFiller(),
1422*67e74705SXin Li                                           CAT->getElementType(), CGF);
1423*67e74705SXin Li 
1424*67e74705SXin Li     // Emit initializer elements.
1425*67e74705SXin Li     llvm::Type *CommonElementType =
1426*67e74705SXin Li         getTypes().ConvertType(CAT->getElementType());
1427*67e74705SXin Li 
1428*67e74705SXin Li     // Try to use a ConstantAggregateZero if we can.
1429*67e74705SXin Li     if (Filler && Filler->isNullValue() && !NumInitElts) {
1430*67e74705SXin Li       llvm::ArrayType *AType =
1431*67e74705SXin Li           llvm::ArrayType::get(CommonElementType, NumElements);
1432*67e74705SXin Li       return llvm::ConstantAggregateZero::get(AType);
1433*67e74705SXin Li     }
1434*67e74705SXin Li 
1435*67e74705SXin Li     std::vector<llvm::Constant*> Elts;
1436*67e74705SXin Li     Elts.reserve(NumElements);
1437*67e74705SXin Li     for (unsigned I = 0; I < NumElements; ++I) {
1438*67e74705SXin Li       llvm::Constant *C = Filler;
1439*67e74705SXin Li       if (I < NumInitElts)
1440*67e74705SXin Li         C = EmitConstantValueForMemory(Value.getArrayInitializedElt(I),
1441*67e74705SXin Li                                        CAT->getElementType(), CGF);
1442*67e74705SXin Li       else
1443*67e74705SXin Li         assert(Filler && "Missing filler for implicit elements of initializer");
1444*67e74705SXin Li       if (I == 0)
1445*67e74705SXin Li         CommonElementType = C->getType();
1446*67e74705SXin Li       else if (C->getType() != CommonElementType)
1447*67e74705SXin Li         CommonElementType = nullptr;
1448*67e74705SXin Li       Elts.push_back(C);
1449*67e74705SXin Li     }
1450*67e74705SXin Li 
1451*67e74705SXin Li     if (!CommonElementType) {
1452*67e74705SXin Li       // FIXME: Try to avoid packing the array
1453*67e74705SXin Li       std::vector<llvm::Type*> Types;
1454*67e74705SXin Li       Types.reserve(NumElements);
1455*67e74705SXin Li       for (unsigned i = 0, e = Elts.size(); i < e; ++i)
1456*67e74705SXin Li         Types.push_back(Elts[i]->getType());
1457*67e74705SXin Li       llvm::StructType *SType = llvm::StructType::get(VMContext, Types, true);
1458*67e74705SXin Li       return llvm::ConstantStruct::get(SType, Elts);
1459*67e74705SXin Li     }
1460*67e74705SXin Li 
1461*67e74705SXin Li     llvm::ArrayType *AType =
1462*67e74705SXin Li       llvm::ArrayType::get(CommonElementType, NumElements);
1463*67e74705SXin Li     return llvm::ConstantArray::get(AType, Elts);
1464*67e74705SXin Li   }
1465*67e74705SXin Li   case APValue::MemberPointer:
1466*67e74705SXin Li     return getCXXABI().EmitMemberPointer(Value, DestType);
1467*67e74705SXin Li   }
1468*67e74705SXin Li   llvm_unreachable("Unknown APValue kind");
1469*67e74705SXin Li }
1470*67e74705SXin Li 
1471*67e74705SXin Li llvm::Constant *
EmitConstantValueForMemory(const APValue & Value,QualType DestType,CodeGenFunction * CGF)1472*67e74705SXin Li CodeGenModule::EmitConstantValueForMemory(const APValue &Value,
1473*67e74705SXin Li                                           QualType DestType,
1474*67e74705SXin Li                                           CodeGenFunction *CGF) {
1475*67e74705SXin Li   llvm::Constant *C = EmitConstantValue(Value, DestType, CGF);
1476*67e74705SXin Li   if (C->getType()->isIntegerTy(1)) {
1477*67e74705SXin Li     llvm::Type *BoolTy = getTypes().ConvertTypeForMem(DestType);
1478*67e74705SXin Li     C = llvm::ConstantExpr::getZExt(C, BoolTy);
1479*67e74705SXin Li   }
1480*67e74705SXin Li   return C;
1481*67e74705SXin Li }
1482*67e74705SXin Li 
1483*67e74705SXin Li ConstantAddress
GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr * E)1484*67e74705SXin Li CodeGenModule::GetAddrOfConstantCompoundLiteral(const CompoundLiteralExpr *E) {
1485*67e74705SXin Li   assert(E->isFileScope() && "not a file-scope compound literal expr");
1486*67e74705SXin Li   return ConstExprEmitter(*this, nullptr).EmitLValue(E);
1487*67e74705SXin Li }
1488*67e74705SXin Li 
1489*67e74705SXin Li llvm::Constant *
getMemberPointerConstant(const UnaryOperator * uo)1490*67e74705SXin Li CodeGenModule::getMemberPointerConstant(const UnaryOperator *uo) {
1491*67e74705SXin Li   // Member pointer constants always have a very particular form.
1492*67e74705SXin Li   const MemberPointerType *type = cast<MemberPointerType>(uo->getType());
1493*67e74705SXin Li   const ValueDecl *decl = cast<DeclRefExpr>(uo->getSubExpr())->getDecl();
1494*67e74705SXin Li 
1495*67e74705SXin Li   // A member function pointer.
1496*67e74705SXin Li   if (const CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(decl))
1497*67e74705SXin Li     return getCXXABI().EmitMemberFunctionPointer(method);
1498*67e74705SXin Li 
1499*67e74705SXin Li   // Otherwise, a member data pointer.
1500*67e74705SXin Li   uint64_t fieldOffset = getContext().getFieldOffset(decl);
1501*67e74705SXin Li   CharUnits chars = getContext().toCharUnitsFromBits((int64_t) fieldOffset);
1502*67e74705SXin Li   return getCXXABI().EmitMemberDataPointer(type, chars);
1503*67e74705SXin Li }
1504*67e74705SXin Li 
1505*67e74705SXin Li static llvm::Constant *EmitNullConstantForBase(CodeGenModule &CGM,
1506*67e74705SXin Li                                                llvm::Type *baseType,
1507*67e74705SXin Li                                                const CXXRecordDecl *base);
1508*67e74705SXin Li 
EmitNullConstant(CodeGenModule & CGM,const CXXRecordDecl * record,bool asCompleteObject)1509*67e74705SXin Li static llvm::Constant *EmitNullConstant(CodeGenModule &CGM,
1510*67e74705SXin Li                                         const CXXRecordDecl *record,
1511*67e74705SXin Li                                         bool asCompleteObject) {
1512*67e74705SXin Li   const CGRecordLayout &layout = CGM.getTypes().getCGRecordLayout(record);
1513*67e74705SXin Li   llvm::StructType *structure =
1514*67e74705SXin Li     (asCompleteObject ? layout.getLLVMType()
1515*67e74705SXin Li                       : layout.getBaseSubobjectLLVMType());
1516*67e74705SXin Li 
1517*67e74705SXin Li   unsigned numElements = structure->getNumElements();
1518*67e74705SXin Li   std::vector<llvm::Constant *> elements(numElements);
1519*67e74705SXin Li 
1520*67e74705SXin Li   // Fill in all the bases.
1521*67e74705SXin Li   for (const auto &I : record->bases()) {
1522*67e74705SXin Li     if (I.isVirtual()) {
1523*67e74705SXin Li       // Ignore virtual bases; if we're laying out for a complete
1524*67e74705SXin Li       // object, we'll lay these out later.
1525*67e74705SXin Li       continue;
1526*67e74705SXin Li     }
1527*67e74705SXin Li 
1528*67e74705SXin Li     const CXXRecordDecl *base =
1529*67e74705SXin Li       cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
1530*67e74705SXin Li 
1531*67e74705SXin Li     // Ignore empty bases.
1532*67e74705SXin Li     if (base->isEmpty())
1533*67e74705SXin Li       continue;
1534*67e74705SXin Li 
1535*67e74705SXin Li     unsigned fieldIndex = layout.getNonVirtualBaseLLVMFieldNo(base);
1536*67e74705SXin Li     llvm::Type *baseType = structure->getElementType(fieldIndex);
1537*67e74705SXin Li     elements[fieldIndex] = EmitNullConstantForBase(CGM, baseType, base);
1538*67e74705SXin Li   }
1539*67e74705SXin Li 
1540*67e74705SXin Li   // Fill in all the fields.
1541*67e74705SXin Li   for (const auto *Field : record->fields()) {
1542*67e74705SXin Li     // Fill in non-bitfields. (Bitfields always use a zero pattern, which we
1543*67e74705SXin Li     // will fill in later.)
1544*67e74705SXin Li     if (!Field->isBitField()) {
1545*67e74705SXin Li       unsigned fieldIndex = layout.getLLVMFieldNo(Field);
1546*67e74705SXin Li       elements[fieldIndex] = CGM.EmitNullConstant(Field->getType());
1547*67e74705SXin Li     }
1548*67e74705SXin Li 
1549*67e74705SXin Li     // For unions, stop after the first named field.
1550*67e74705SXin Li     if (record->isUnion()) {
1551*67e74705SXin Li       if (Field->getIdentifier())
1552*67e74705SXin Li         break;
1553*67e74705SXin Li       if (const auto *FieldRD =
1554*67e74705SXin Li               dyn_cast_or_null<RecordDecl>(Field->getType()->getAsTagDecl()))
1555*67e74705SXin Li         if (FieldRD->findFirstNamedDataMember())
1556*67e74705SXin Li           break;
1557*67e74705SXin Li     }
1558*67e74705SXin Li   }
1559*67e74705SXin Li 
1560*67e74705SXin Li   // Fill in the virtual bases, if we're working with the complete object.
1561*67e74705SXin Li   if (asCompleteObject) {
1562*67e74705SXin Li     for (const auto &I : record->vbases()) {
1563*67e74705SXin Li       const CXXRecordDecl *base =
1564*67e74705SXin Li         cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
1565*67e74705SXin Li 
1566*67e74705SXin Li       // Ignore empty bases.
1567*67e74705SXin Li       if (base->isEmpty())
1568*67e74705SXin Li         continue;
1569*67e74705SXin Li 
1570*67e74705SXin Li       unsigned fieldIndex = layout.getVirtualBaseIndex(base);
1571*67e74705SXin Li 
1572*67e74705SXin Li       // We might have already laid this field out.
1573*67e74705SXin Li       if (elements[fieldIndex]) continue;
1574*67e74705SXin Li 
1575*67e74705SXin Li       llvm::Type *baseType = structure->getElementType(fieldIndex);
1576*67e74705SXin Li       elements[fieldIndex] = EmitNullConstantForBase(CGM, baseType, base);
1577*67e74705SXin Li     }
1578*67e74705SXin Li   }
1579*67e74705SXin Li 
1580*67e74705SXin Li   // Now go through all other fields and zero them out.
1581*67e74705SXin Li   for (unsigned i = 0; i != numElements; ++i) {
1582*67e74705SXin Li     if (!elements[i])
1583*67e74705SXin Li       elements[i] = llvm::Constant::getNullValue(structure->getElementType(i));
1584*67e74705SXin Li   }
1585*67e74705SXin Li 
1586*67e74705SXin Li   return llvm::ConstantStruct::get(structure, elements);
1587*67e74705SXin Li }
1588*67e74705SXin Li 
1589*67e74705SXin Li /// Emit the null constant for a base subobject.
EmitNullConstantForBase(CodeGenModule & CGM,llvm::Type * baseType,const CXXRecordDecl * base)1590*67e74705SXin Li static llvm::Constant *EmitNullConstantForBase(CodeGenModule &CGM,
1591*67e74705SXin Li                                                llvm::Type *baseType,
1592*67e74705SXin Li                                                const CXXRecordDecl *base) {
1593*67e74705SXin Li   const CGRecordLayout &baseLayout = CGM.getTypes().getCGRecordLayout(base);
1594*67e74705SXin Li 
1595*67e74705SXin Li   // Just zero out bases that don't have any pointer to data members.
1596*67e74705SXin Li   if (baseLayout.isZeroInitializableAsBase())
1597*67e74705SXin Li     return llvm::Constant::getNullValue(baseType);
1598*67e74705SXin Li 
1599*67e74705SXin Li   // Otherwise, we can just use its null constant.
1600*67e74705SXin Li   return EmitNullConstant(CGM, base, /*asCompleteObject=*/false);
1601*67e74705SXin Li }
1602*67e74705SXin Li 
EmitNullConstant(QualType T)1603*67e74705SXin Li llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {
1604*67e74705SXin Li   if (getTypes().isZeroInitializable(T))
1605*67e74705SXin Li     return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T));
1606*67e74705SXin Li 
1607*67e74705SXin Li   if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(T)) {
1608*67e74705SXin Li     llvm::ArrayType *ATy =
1609*67e74705SXin Li       cast<llvm::ArrayType>(getTypes().ConvertTypeForMem(T));
1610*67e74705SXin Li 
1611*67e74705SXin Li     QualType ElementTy = CAT->getElementType();
1612*67e74705SXin Li 
1613*67e74705SXin Li     llvm::Constant *Element = EmitNullConstant(ElementTy);
1614*67e74705SXin Li     unsigned NumElements = CAT->getSize().getZExtValue();
1615*67e74705SXin Li     SmallVector<llvm::Constant *, 8> Array(NumElements, Element);
1616*67e74705SXin Li     return llvm::ConstantArray::get(ATy, Array);
1617*67e74705SXin Li   }
1618*67e74705SXin Li 
1619*67e74705SXin Li   if (const RecordType *RT = T->getAs<RecordType>()) {
1620*67e74705SXin Li     const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
1621*67e74705SXin Li     return ::EmitNullConstant(*this, RD, /*complete object*/ true);
1622*67e74705SXin Li   }
1623*67e74705SXin Li 
1624*67e74705SXin Li   assert(T->isMemberDataPointerType() &&
1625*67e74705SXin Li          "Should only see pointers to data members here!");
1626*67e74705SXin Li 
1627*67e74705SXin Li   return getCXXABI().EmitNullMemberPointer(T->castAs<MemberPointerType>());
1628*67e74705SXin Li }
1629*67e74705SXin Li 
1630*67e74705SXin Li llvm::Constant *
EmitNullConstantForBase(const CXXRecordDecl * Record)1631*67e74705SXin Li CodeGenModule::EmitNullConstantForBase(const CXXRecordDecl *Record) {
1632*67e74705SXin Li   return ::EmitNullConstant(*this, Record, false);
1633*67e74705SXin Li }
1634