1 //===--- CGExprConstant.cpp - Emit LLVM Code from Constant Expressions ----===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This contains code to emit Constant Expr nodes as LLVM code.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "CodeGenFunction.h"
15 #include "CodeGenModule.h"
16 #include "CGObjCRuntime.h"
17 #include "CGRecordLayout.h"
18 #include "clang/AST/APValue.h"
19 #include "clang/AST/ASTContext.h"
20 #include "clang/AST/RecordLayout.h"
21 #include "clang/AST/StmtVisitor.h"
22 #include "clang/Basic/Builtins.h"
23 #include "llvm/Constants.h"
24 #include "llvm/Function.h"
25 #include "llvm/GlobalVariable.h"
26 #include "llvm/Target/TargetData.h"
27 using namespace clang;
28 using namespace CodeGen;
29 
30 //===----------------------------------------------------------------------===//
31 //                            ConstStructBuilder
32 //===----------------------------------------------------------------------===//
33 
34 namespace {
35 class ConstStructBuilder {
36   CodeGenModule &CGM;
37   CodeGenFunction *CGF;
38 
39   bool Packed;
40   unsigned NextFieldOffsetInBytes;
41   unsigned LLVMStructAlignment;
42   std::vector<llvm::Constant *> Elements;
43 public:
44   static llvm::Constant *BuildStruct(CodeGenModule &CGM, CodeGenFunction *CGF,
45                                      InitListExpr *ILE);
46 
47 private:
48   ConstStructBuilder(CodeGenModule &CGM, CodeGenFunction *CGF)
49     : CGM(CGM), CGF(CGF), Packed(false), NextFieldOffsetInBytes(0),
50     LLVMStructAlignment(1) { }
51 
52   bool AppendField(const FieldDecl *Field, uint64_t FieldOffset,
53                    llvm::Constant *InitExpr);
54 
55   void AppendBitField(const FieldDecl *Field, uint64_t FieldOffset,
56                       llvm::ConstantInt *InitExpr);
57 
58   void AppendPadding(uint64_t NumBytes);
59 
60   void AppendTailPadding(uint64_t RecordSize);
61 
62   void ConvertStructToPacked();
63 
64   bool Build(InitListExpr *ILE);
65 
66   unsigned getAlignment(const llvm::Constant *C) const {
67     if (Packed)  return 1;
68     return CGM.getTargetData().getABITypeAlignment(C->getType());
69   }
70 
71   uint64_t getSizeInBytes(const llvm::Constant *C) const {
72     return CGM.getTargetData().getTypeAllocSize(C->getType());
73   }
74 };
75 
76 bool ConstStructBuilder::
77 AppendField(const FieldDecl *Field, uint64_t FieldOffset,
78             llvm::Constant *InitCst) {
79   uint64_t FieldOffsetInBytes = FieldOffset / 8;
80 
81   assert(NextFieldOffsetInBytes <= FieldOffsetInBytes
82          && "Field offset mismatch!");
83 
84   // Emit the field.
85   if (!InitCst)
86     return false;
87 
88   unsigned FieldAlignment = getAlignment(InitCst);
89 
90   // Round up the field offset to the alignment of the field type.
91   uint64_t AlignedNextFieldOffsetInBytes =
92     llvm::RoundUpToAlignment(NextFieldOffsetInBytes, FieldAlignment);
93 
94   if (AlignedNextFieldOffsetInBytes > FieldOffsetInBytes) {
95     assert(!Packed && "Alignment is wrong even with a packed struct!");
96 
97     // Convert the struct to a packed struct.
98     ConvertStructToPacked();
99 
100     AlignedNextFieldOffsetInBytes = NextFieldOffsetInBytes;
101   }
102 
103   if (AlignedNextFieldOffsetInBytes < FieldOffsetInBytes) {
104     // We need to append padding.
105     AppendPadding(FieldOffsetInBytes - NextFieldOffsetInBytes);
106 
107     assert(NextFieldOffsetInBytes == FieldOffsetInBytes &&
108            "Did not add enough padding!");
109 
110     AlignedNextFieldOffsetInBytes = NextFieldOffsetInBytes;
111   }
112 
113   // Add the field.
114   Elements.push_back(InitCst);
115   NextFieldOffsetInBytes = AlignedNextFieldOffsetInBytes +
116                              getSizeInBytes(InitCst);
117 
118   if (Packed)
119     assert(LLVMStructAlignment == 1 && "Packed struct not byte-aligned!");
120   else
121     LLVMStructAlignment = std::max(LLVMStructAlignment, FieldAlignment);
122 
123   return true;
124 }
125 
126 void ConstStructBuilder::AppendBitField(const FieldDecl *Field,
127                                         uint64_t FieldOffset,
128                                         llvm::ConstantInt *CI) {
129   if (FieldOffset > NextFieldOffsetInBytes * 8) {
130     // We need to add padding.
131     uint64_t NumBytes =
132       llvm::RoundUpToAlignment(FieldOffset -
133                                NextFieldOffsetInBytes * 8, 8) / 8;
134 
135     AppendPadding(NumBytes);
136   }
137 
138   uint64_t FieldSize =
139     Field->getBitWidth()->EvaluateAsInt(CGM.getContext()).getZExtValue();
140 
141   llvm::APInt FieldValue = CI->getValue();
142 
143   // Promote the size of FieldValue if necessary
144   // FIXME: This should never occur, but currently it can because initializer
145   // constants are cast to bool, and because clang is not enforcing bitfield
146   // width limits.
147   if (FieldSize > FieldValue.getBitWidth())
148     FieldValue.zext(FieldSize);
149 
150   // Truncate the size of FieldValue to the bit field size.
151   if (FieldSize < FieldValue.getBitWidth())
152     FieldValue.trunc(FieldSize);
153 
154   if (FieldOffset < NextFieldOffsetInBytes * 8) {
155     // Either part of the field or the entire field can go into the previous
156     // byte.
157     assert(!Elements.empty() && "Elements can't be empty!");
158 
159     unsigned BitsInPreviousByte =
160       NextFieldOffsetInBytes * 8 - FieldOffset;
161 
162     bool FitsCompletelyInPreviousByte =
163       BitsInPreviousByte >= FieldValue.getBitWidth();
164 
165     llvm::APInt Tmp = FieldValue;
166 
167     if (!FitsCompletelyInPreviousByte) {
168       unsigned NewFieldWidth = FieldSize - BitsInPreviousByte;
169 
170       if (CGM.getTargetData().isBigEndian()) {
171         Tmp = Tmp.lshr(NewFieldWidth);
172         Tmp.trunc(BitsInPreviousByte);
173 
174         // We want the remaining high bits.
175         FieldValue.trunc(NewFieldWidth);
176       } else {
177         Tmp.trunc(BitsInPreviousByte);
178 
179         // We want the remaining low bits.
180         FieldValue = FieldValue.lshr(BitsInPreviousByte);
181         FieldValue.trunc(NewFieldWidth);
182       }
183     }
184 
185     Tmp.zext(8);
186     if (CGM.getTargetData().isBigEndian()) {
187       if (FitsCompletelyInPreviousByte)
188         Tmp = Tmp.shl(BitsInPreviousByte - FieldValue.getBitWidth());
189     } else {
190       Tmp = Tmp.shl(8 - BitsInPreviousByte);
191     }
192 
193     // Or in the bits that go into the previous byte.
194     if (llvm::ConstantInt *Val = dyn_cast<llvm::ConstantInt>(Elements.back()))
195       Tmp |= Val->getValue();
196     else
197       assert(isa<llvm::UndefValue>(Elements.back()));
198 
199     Elements.back() = llvm::ConstantInt::get(CGM.getLLVMContext(), Tmp);
200 
201     if (FitsCompletelyInPreviousByte)
202       return;
203   }
204 
205   while (FieldValue.getBitWidth() > 8) {
206     llvm::APInt Tmp;
207 
208     if (CGM.getTargetData().isBigEndian()) {
209       // We want the high bits.
210       Tmp = FieldValue;
211       Tmp = Tmp.lshr(Tmp.getBitWidth() - 8);
212       Tmp.trunc(8);
213     } else {
214       // We want the low bits.
215       Tmp = FieldValue;
216       Tmp.trunc(8);
217 
218       FieldValue = FieldValue.lshr(8);
219     }
220 
221     Elements.push_back(llvm::ConstantInt::get(CGM.getLLVMContext(), Tmp));
222     NextFieldOffsetInBytes++;
223 
224     FieldValue.trunc(FieldValue.getBitWidth() - 8);
225   }
226 
227   assert(FieldValue.getBitWidth() > 0 &&
228          "Should have at least one bit left!");
229   assert(FieldValue.getBitWidth() <= 8 &&
230          "Should not have more than a byte left!");
231 
232   if (FieldValue.getBitWidth() < 8) {
233     if (CGM.getTargetData().isBigEndian()) {
234       unsigned BitWidth = FieldValue.getBitWidth();
235 
236       FieldValue.zext(8);
237       FieldValue = FieldValue << (8 - BitWidth);
238     } else
239       FieldValue.zext(8);
240   }
241 
242   // Append the last element.
243   Elements.push_back(llvm::ConstantInt::get(CGM.getLLVMContext(),
244                                             FieldValue));
245   NextFieldOffsetInBytes++;
246 }
247 
248 void ConstStructBuilder::AppendPadding(uint64_t NumBytes) {
249   if (!NumBytes)
250     return;
251 
252   const llvm::Type *Ty = llvm::Type::getInt8Ty(CGM.getLLVMContext());
253   if (NumBytes > 1)
254     Ty = llvm::ArrayType::get(Ty, NumBytes);
255 
256   llvm::Constant *C = llvm::UndefValue::get(Ty);
257   Elements.push_back(C);
258   assert(getAlignment(C) == 1 && "Padding must have 1 byte alignment!");
259 
260   NextFieldOffsetInBytes += getSizeInBytes(C);
261 }
262 
263 void ConstStructBuilder::AppendTailPadding(uint64_t RecordSize) {
264   assert(RecordSize % 8 == 0 && "Invalid record size!");
265 
266   uint64_t RecordSizeInBytes = RecordSize / 8;
267   assert(NextFieldOffsetInBytes <= RecordSizeInBytes && "Size mismatch!");
268 
269   unsigned NumPadBytes = RecordSizeInBytes - NextFieldOffsetInBytes;
270   AppendPadding(NumPadBytes);
271 }
272 
273 void ConstStructBuilder::ConvertStructToPacked() {
274   std::vector<llvm::Constant *> PackedElements;
275   uint64_t ElementOffsetInBytes = 0;
276 
277   for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
278     llvm::Constant *C = Elements[i];
279 
280     unsigned ElementAlign =
281       CGM.getTargetData().getABITypeAlignment(C->getType());
282     uint64_t AlignedElementOffsetInBytes =
283       llvm::RoundUpToAlignment(ElementOffsetInBytes, ElementAlign);
284 
285     if (AlignedElementOffsetInBytes > ElementOffsetInBytes) {
286       // We need some padding.
287       uint64_t NumBytes =
288         AlignedElementOffsetInBytes - ElementOffsetInBytes;
289 
290       const llvm::Type *Ty = llvm::Type::getInt8Ty(CGM.getLLVMContext());
291       if (NumBytes > 1)
292         Ty = llvm::ArrayType::get(Ty, NumBytes);
293 
294       llvm::Constant *Padding = llvm::UndefValue::get(Ty);
295       PackedElements.push_back(Padding);
296       ElementOffsetInBytes += getSizeInBytes(Padding);
297     }
298 
299     PackedElements.push_back(C);
300     ElementOffsetInBytes += getSizeInBytes(C);
301   }
302 
303   assert(ElementOffsetInBytes == NextFieldOffsetInBytes &&
304          "Packing the struct changed its size!");
305 
306   Elements = PackedElements;
307   LLVMStructAlignment = 1;
308   Packed = true;
309 }
310 
311 bool ConstStructBuilder::Build(InitListExpr *ILE) {
312   RecordDecl *RD = ILE->getType()->getAs<RecordType>()->getDecl();
313   const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
314 
315   unsigned FieldNo = 0;
316   unsigned ElementNo = 0;
317   for (RecordDecl::field_iterator Field = RD->field_begin(),
318        FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {
319 
320     // If this is a union, skip all the fields that aren't being initialized.
321     if (RD->isUnion() && ILE->getInitializedFieldInUnion() != *Field)
322       continue;
323 
324     // Don't emit anonymous bitfields, they just affect layout.
325     if (Field->isBitField() && !Field->getIdentifier())
326       continue;
327 
328     // Get the initializer.  A struct can include fields without initializers,
329     // we just use explicit null values for them.
330     llvm::Constant *EltInit;
331     if (ElementNo < ILE->getNumInits())
332       EltInit = CGM.EmitConstantExpr(ILE->getInit(ElementNo++),
333                                      Field->getType(), CGF);
334     else
335       EltInit = CGM.EmitNullConstant(Field->getType());
336 
337     if (!Field->isBitField()) {
338       // Handle non-bitfield members.
339       if (!AppendField(*Field, Layout.getFieldOffset(FieldNo), EltInit))
340         return false;
341     } else {
342       // Otherwise we have a bitfield.
343       AppendBitField(*Field, Layout.getFieldOffset(FieldNo),
344                      cast<llvm::ConstantInt>(EltInit));
345     }
346   }
347 
348   uint64_t LayoutSizeInBytes = Layout.getSize() / 8;
349 
350   if (NextFieldOffsetInBytes > LayoutSizeInBytes) {
351     // If the struct is bigger than the size of the record type,
352     // we must have a flexible array member at the end.
353     assert(RD->hasFlexibleArrayMember() &&
354            "Must have flexible array member if struct is bigger than type!");
355 
356     // No tail padding is necessary.
357     return true;
358   }
359 
360   uint64_t LLVMSizeInBytes = llvm::RoundUpToAlignment(NextFieldOffsetInBytes,
361                                                       LLVMStructAlignment);
362 
363   // Check if we need to convert the struct to a packed struct.
364   if (NextFieldOffsetInBytes <= LayoutSizeInBytes &&
365       LLVMSizeInBytes > LayoutSizeInBytes) {
366     assert(!Packed && "Size mismatch!");
367 
368     ConvertStructToPacked();
369     assert(NextFieldOffsetInBytes <= LayoutSizeInBytes &&
370            "Converting to packed did not help!");
371   }
372 
373   // Append tail padding if necessary.
374   AppendTailPadding(Layout.getSize());
375 
376   assert(Layout.getSize() / 8 == NextFieldOffsetInBytes &&
377          "Tail padding mismatch!");
378 
379   return true;
380 }
381 
382 llvm::Constant *ConstStructBuilder::
383   BuildStruct(CodeGenModule &CGM, CodeGenFunction *CGF, InitListExpr *ILE) {
384   ConstStructBuilder Builder(CGM, CGF);
385 
386   if (!Builder.Build(ILE))
387     return 0;
388 
389   llvm::Constant *Result =
390   llvm::ConstantStruct::get(CGM.getLLVMContext(),
391                             Builder.Elements, Builder.Packed);
392 
393   assert(llvm::RoundUpToAlignment(Builder.NextFieldOffsetInBytes,
394                                   Builder.getAlignment(Result)) ==
395          Builder.getSizeInBytes(Result) && "Size mismatch!");
396 
397   return Result;
398 }
399 
400 
401 //===----------------------------------------------------------------------===//
402 //                             ConstExprEmitter
403 //===----------------------------------------------------------------------===//
404 
405 class ConstExprEmitter :
406   public StmtVisitor<ConstExprEmitter, llvm::Constant*> {
407   CodeGenModule &CGM;
408   CodeGenFunction *CGF;
409   llvm::LLVMContext &VMContext;
410 public:
411   ConstExprEmitter(CodeGenModule &cgm, CodeGenFunction *cgf)
412     : CGM(cgm), CGF(cgf), VMContext(cgm.getLLVMContext()) {
413   }
414 
415   //===--------------------------------------------------------------------===//
416   //                            Visitor Methods
417   //===--------------------------------------------------------------------===//
418 
419   llvm::Constant *VisitStmt(Stmt *S) {
420     return 0;
421   }
422 
423   llvm::Constant *VisitParenExpr(ParenExpr *PE) {
424     return Visit(PE->getSubExpr());
425   }
426 
427   llvm::Constant *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
428     return Visit(E->getInitializer());
429   }
430 
431   llvm::Constant *EmitMemberFunctionPointer(CXXMethodDecl *MD) {
432     assert(MD->isInstance() && "Member function must not be static!");
433 
434     MD = MD->getCanonicalDecl();
435 
436     const llvm::Type *PtrDiffTy =
437       CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
438 
439     llvm::Constant *Values[2];
440 
441     Values[0] = CGM.GetCXXMemberFunctionPointerValue(MD);
442 
443     // The adjustment will always be 0.
444     Values[1] = llvm::ConstantInt::get(PtrDiffTy, 0);
445 
446     return llvm::ConstantStruct::get(CGM.getLLVMContext(),
447                                      Values, 2, /*Packed=*/false);
448   }
449 
450   llvm::Constant *VisitUnaryAddrOf(UnaryOperator *E) {
451     if (const MemberPointerType *MPT =
452         E->getType()->getAs<MemberPointerType>()) {
453       QualType T = MPT->getPointeeType();
454       DeclRefExpr *DRE = cast<DeclRefExpr>(E->getSubExpr());
455 
456       NamedDecl *ND = DRE->getDecl();
457       if (T->isFunctionProtoType())
458         return EmitMemberFunctionPointer(cast<CXXMethodDecl>(ND));
459 
460       // We have a pointer to data member.
461       return CGM.EmitPointerToDataMember(cast<FieldDecl>(ND));
462     }
463 
464     return 0;
465   }
466 
467   llvm::Constant *VisitBinSub(BinaryOperator *E) {
468     // This must be a pointer/pointer subtraction.  This only happens for
469     // address of label.
470     if (!isa<AddrLabelExpr>(E->getLHS()->IgnoreParenNoopCasts(CGM.getContext())) ||
471        !isa<AddrLabelExpr>(E->getRHS()->IgnoreParenNoopCasts(CGM.getContext())))
472       return 0;
473 
474     llvm::Constant *LHS = CGM.EmitConstantExpr(E->getLHS(),
475                                                E->getLHS()->getType(), CGF);
476     llvm::Constant *RHS = CGM.EmitConstantExpr(E->getRHS(),
477                                                E->getRHS()->getType(), CGF);
478 
479     const llvm::Type *ResultType = ConvertType(E->getType());
480     LHS = llvm::ConstantExpr::getPtrToInt(LHS, ResultType);
481     RHS = llvm::ConstantExpr::getPtrToInt(RHS, ResultType);
482 
483     // No need to divide by element size, since addr of label is always void*,
484     // which has size 1 in GNUish.
485     return llvm::ConstantExpr::getSub(LHS, RHS);
486   }
487 
488   llvm::Constant *VisitCastExpr(CastExpr* E) {
489     switch (E->getCastKind()) {
490     case CastExpr::CK_ToUnion: {
491       // GCC cast to union extension
492       assert(E->getType()->isUnionType() &&
493              "Destination type is not union type!");
494       const llvm::Type *Ty = ConvertType(E->getType());
495       Expr *SubExpr = E->getSubExpr();
496 
497       llvm::Constant *C =
498         CGM.EmitConstantExpr(SubExpr, SubExpr->getType(), CGF);
499       if (!C)
500         return 0;
501 
502       // Build a struct with the union sub-element as the first member,
503       // and padded to the appropriate size
504       std::vector<llvm::Constant*> Elts;
505       std::vector<const llvm::Type*> Types;
506       Elts.push_back(C);
507       Types.push_back(C->getType());
508       unsigned CurSize = CGM.getTargetData().getTypeAllocSize(C->getType());
509       unsigned TotalSize = CGM.getTargetData().getTypeAllocSize(Ty);
510 
511       assert(CurSize <= TotalSize && "Union size mismatch!");
512       if (unsigned NumPadBytes = TotalSize - CurSize) {
513         const llvm::Type *Ty = llvm::Type::getInt8Ty(VMContext);
514         if (NumPadBytes > 1)
515           Ty = llvm::ArrayType::get(Ty, NumPadBytes);
516 
517         Elts.push_back(llvm::UndefValue::get(Ty));
518         Types.push_back(Ty);
519       }
520 
521       llvm::StructType* STy =
522         llvm::StructType::get(C->getType()->getContext(), Types, false);
523       return llvm::ConstantStruct::get(STy, Elts);
524     }
525     case CastExpr::CK_NullToMemberPointer:
526       return CGM.EmitNullConstant(E->getType());
527 
528     case CastExpr::CK_BaseToDerivedMemberPointer: {
529       Expr *SubExpr = E->getSubExpr();
530 
531       const MemberPointerType *SrcTy =
532         SubExpr->getType()->getAs<MemberPointerType>();
533       const MemberPointerType *DestTy =
534         E->getType()->getAs<MemberPointerType>();
535 
536       const CXXRecordDecl *DerivedClass =
537         cast<CXXRecordDecl>(cast<RecordType>(DestTy->getClass())->getDecl());
538 
539       if (SrcTy->getPointeeType()->isFunctionProtoType()) {
540         llvm::Constant *C =
541           CGM.EmitConstantExpr(SubExpr, SubExpr->getType(), CGF);
542         if (!C)
543           return 0;
544 
545         llvm::ConstantStruct *CS = cast<llvm::ConstantStruct>(C);
546 
547         // Check if we need to update the adjustment.
548         if (llvm::Constant *Offset =
549             CGM.GetNonVirtualBaseClassOffset(DerivedClass, E->getBasePath())) {
550           llvm::Constant *Values[2];
551 
552           Values[0] = CS->getOperand(0);
553           Values[1] = llvm::ConstantExpr::getAdd(CS->getOperand(1), Offset);
554           return llvm::ConstantStruct::get(CGM.getLLVMContext(), Values, 2,
555                                            /*Packed=*/false);
556         }
557 
558         return CS;
559       }
560     }
561 
562     case CastExpr::CK_BitCast:
563       // This must be a member function pointer cast.
564       return Visit(E->getSubExpr());
565 
566     default: {
567       // FIXME: This should be handled by the CK_NoOp cast kind.
568       // Explicit and implicit no-op casts
569       QualType Ty = E->getType(), SubTy = E->getSubExpr()->getType();
570       if (CGM.getContext().hasSameUnqualifiedType(Ty, SubTy))
571         return Visit(E->getSubExpr());
572 
573       // Handle integer->integer casts for address-of-label differences.
574       if (Ty->isIntegerType() && SubTy->isIntegerType() &&
575           CGF) {
576         llvm::Value *Src = Visit(E->getSubExpr());
577         if (Src == 0) return 0;
578 
579         // Use EmitScalarConversion to perform the conversion.
580         return cast<llvm::Constant>(CGF->EmitScalarConversion(Src, SubTy, Ty));
581       }
582 
583       return 0;
584     }
585     }
586   }
587 
588   llvm::Constant *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
589     return Visit(DAE->getExpr());
590   }
591 
592   llvm::Constant *EmitArrayInitialization(InitListExpr *ILE) {
593     unsigned NumInitElements = ILE->getNumInits();
594     if (NumInitElements == 1 &&
595         (isa<StringLiteral>(ILE->getInit(0)) ||
596          isa<ObjCEncodeExpr>(ILE->getInit(0))))
597       return Visit(ILE->getInit(0));
598 
599     std::vector<llvm::Constant*> Elts;
600     const llvm::ArrayType *AType =
601         cast<llvm::ArrayType>(ConvertType(ILE->getType()));
602     const llvm::Type *ElemTy = AType->getElementType();
603     unsigned NumElements = AType->getNumElements();
604 
605     // Initialising an array requires us to automatically
606     // initialise any elements that have not been initialised explicitly
607     unsigned NumInitableElts = std::min(NumInitElements, NumElements);
608 
609     // Copy initializer elements.
610     unsigned i = 0;
611     bool RewriteType = false;
612     for (; i < NumInitableElts; ++i) {
613       Expr *Init = ILE->getInit(i);
614       llvm::Constant *C = CGM.EmitConstantExpr(Init, Init->getType(), CGF);
615       if (!C)
616         return 0;
617       RewriteType |= (C->getType() != ElemTy);
618       Elts.push_back(C);
619     }
620 
621     // Initialize remaining array elements.
622     // FIXME: This doesn't handle member pointers correctly!
623     for (; i < NumElements; ++i)
624       Elts.push_back(llvm::Constant::getNullValue(ElemTy));
625 
626     if (RewriteType) {
627       // FIXME: Try to avoid packing the array
628       std::vector<const llvm::Type*> Types;
629       for (unsigned i = 0; i < Elts.size(); ++i)
630         Types.push_back(Elts[i]->getType());
631       const llvm::StructType *SType = llvm::StructType::get(AType->getContext(),
632                                                             Types, true);
633       return llvm::ConstantStruct::get(SType, Elts);
634     }
635 
636     return llvm::ConstantArray::get(AType, Elts);
637   }
638 
639   llvm::Constant *EmitStructInitialization(InitListExpr *ILE) {
640     return ConstStructBuilder::BuildStruct(CGM, CGF, ILE);
641   }
642 
643   llvm::Constant *EmitUnionInitialization(InitListExpr *ILE) {
644     return ConstStructBuilder::BuildStruct(CGM, CGF, ILE);
645   }
646 
647   llvm::Constant *VisitImplicitValueInitExpr(ImplicitValueInitExpr* E) {
648     return CGM.EmitNullConstant(E->getType());
649   }
650 
651   llvm::Constant *VisitInitListExpr(InitListExpr *ILE) {
652     if (ILE->getType()->isScalarType()) {
653       // We have a scalar in braces. Just use the first element.
654       if (ILE->getNumInits() > 0) {
655         Expr *Init = ILE->getInit(0);
656         return CGM.EmitConstantExpr(Init, Init->getType(), CGF);
657       }
658       return CGM.EmitNullConstant(ILE->getType());
659     }
660 
661     if (ILE->getType()->isArrayType())
662       return EmitArrayInitialization(ILE);
663 
664     if (ILE->getType()->isRecordType())
665       return EmitStructInitialization(ILE);
666 
667     if (ILE->getType()->isUnionType())
668       return EmitUnionInitialization(ILE);
669 
670     // If ILE was a constant vector, we would have handled it already.
671     if (ILE->getType()->isVectorType())
672       return 0;
673 
674     assert(0 && "Unable to handle InitListExpr");
675     // Get rid of control reaches end of void function warning.
676     // Not reached.
677     return 0;
678   }
679 
680   llvm::Constant *VisitCXXConstructExpr(CXXConstructExpr *E) {
681     if (!E->getConstructor()->isTrivial())
682       return 0;
683 
684     QualType Ty = E->getType();
685 
686     // FIXME: We should not have to call getBaseElementType here.
687     const RecordType *RT =
688       CGM.getContext().getBaseElementType(Ty)->getAs<RecordType>();
689     const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
690 
691     // If the class doesn't have a trivial destructor, we can't emit it as a
692     // constant expr.
693     if (!RD->hasTrivialDestructor())
694       return 0;
695 
696     // Only copy and default constructors can be trivial.
697 
698 
699     if (E->getNumArgs()) {
700       assert(E->getNumArgs() == 1 && "trivial ctor with > 1 argument");
701       assert(E->getConstructor()->isCopyConstructor() &&
702              "trivial ctor has argument but isn't a copy ctor");
703 
704       Expr *Arg = E->getArg(0);
705       assert(CGM.getContext().hasSameUnqualifiedType(Ty, Arg->getType()) &&
706              "argument to copy ctor is of wrong type");
707 
708       return Visit(Arg);
709     }
710 
711     return CGM.EmitNullConstant(Ty);
712   }
713 
714   llvm::Constant *VisitStringLiteral(StringLiteral *E) {
715     assert(!E->getType()->isPointerType() && "Strings are always arrays");
716 
717     // This must be a string initializing an array in a static initializer.
718     // Don't emit it as the address of the string, emit the string data itself
719     // as an inline array.
720     return llvm::ConstantArray::get(VMContext,
721                                     CGM.GetStringForStringLiteral(E), false);
722   }
723 
724   llvm::Constant *VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
725     // This must be an @encode initializing an array in a static initializer.
726     // Don't emit it as the address of the string, emit the string data itself
727     // as an inline array.
728     std::string Str;
729     CGM.getContext().getObjCEncodingForType(E->getEncodedType(), Str);
730     const ConstantArrayType *CAT = cast<ConstantArrayType>(E->getType());
731 
732     // Resize the string to the right size, adding zeros at the end, or
733     // truncating as needed.
734     Str.resize(CAT->getSize().getZExtValue(), '\0');
735     return llvm::ConstantArray::get(VMContext, Str, false);
736   }
737 
738   llvm::Constant *VisitUnaryExtension(const UnaryOperator *E) {
739     return Visit(E->getSubExpr());
740   }
741 
742   // Utility methods
743   const llvm::Type *ConvertType(QualType T) {
744     return CGM.getTypes().ConvertType(T);
745   }
746 
747 public:
748   llvm::Constant *EmitLValue(Expr *E) {
749     switch (E->getStmtClass()) {
750     default: break;
751     case Expr::CompoundLiteralExprClass: {
752       // Note that due to the nature of compound literals, this is guaranteed
753       // to be the only use of the variable, so we just generate it here.
754       CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E);
755       llvm::Constant* C = Visit(CLE->getInitializer());
756       // FIXME: "Leaked" on failure.
757       if (C)
758         C = new llvm::GlobalVariable(CGM.getModule(), C->getType(),
759                                      E->getType().isConstant(CGM.getContext()),
760                                      llvm::GlobalValue::InternalLinkage,
761                                      C, ".compoundliteral", 0, false,
762                                      E->getType().getAddressSpace());
763       return C;
764     }
765     case Expr::DeclRefExprClass: {
766       ValueDecl *Decl = cast<DeclRefExpr>(E)->getDecl();
767       if (Decl->hasAttr<WeakRefAttr>())
768 	return CGM.GetWeakRefReference(Decl);
769       if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl))
770         return CGM.GetAddrOfFunction(FD);
771       if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) {
772         // We can never refer to a variable with local storage.
773         if (!VD->hasLocalStorage()) {
774           if (VD->isFileVarDecl() || VD->hasExternalStorage())
775             return CGM.GetAddrOfGlobalVar(VD);
776           else if (VD->isBlockVarDecl()) {
777             assert(CGF && "Can't access static local vars without CGF");
778             return CGF->GetAddrOfStaticLocalVar(VD);
779           }
780         }
781       }
782       break;
783     }
784     case Expr::StringLiteralClass:
785       return CGM.GetAddrOfConstantStringFromLiteral(cast<StringLiteral>(E));
786     case Expr::ObjCEncodeExprClass:
787       return CGM.GetAddrOfConstantStringFromObjCEncode(cast<ObjCEncodeExpr>(E));
788     case Expr::ObjCStringLiteralClass: {
789       ObjCStringLiteral* SL = cast<ObjCStringLiteral>(E);
790       llvm::Constant *C =
791           CGM.getObjCRuntime().GenerateConstantString(SL->getString());
792       return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType()));
793     }
794     case Expr::PredefinedExprClass: {
795       unsigned Type = cast<PredefinedExpr>(E)->getIdentType();
796       if (CGF) {
797         LValue Res = CGF->EmitPredefinedFunctionName(Type);
798         return cast<llvm::Constant>(Res.getAddress());
799       } else if (Type == PredefinedExpr::PrettyFunction) {
800         return CGM.GetAddrOfConstantCString("top level", ".tmp");
801       }
802 
803       return CGM.GetAddrOfConstantCString("", ".tmp");
804     }
805     case Expr::AddrLabelExprClass: {
806       assert(CGF && "Invalid address of label expression outside function.");
807       llvm::Constant *Ptr =
808         CGF->GetAddrOfLabel(cast<AddrLabelExpr>(E)->getLabel());
809       return llvm::ConstantExpr::getBitCast(Ptr, ConvertType(E->getType()));
810     }
811     case Expr::CallExprClass: {
812       CallExpr* CE = cast<CallExpr>(E);
813       unsigned builtin = CE->isBuiltinCall(CGM.getContext());
814       if (builtin !=
815             Builtin::BI__builtin___CFStringMakeConstantString &&
816           builtin !=
817             Builtin::BI__builtin___NSStringMakeConstantString)
818         break;
819       const Expr *Arg = CE->getArg(0)->IgnoreParenCasts();
820       const StringLiteral *Literal = cast<StringLiteral>(Arg);
821       if (builtin ==
822             Builtin::BI__builtin___NSStringMakeConstantString) {
823         return CGM.getObjCRuntime().GenerateConstantString(Literal);
824       }
825       // FIXME: need to deal with UCN conversion issues.
826       return CGM.GetAddrOfConstantCFString(Literal);
827     }
828     case Expr::BlockExprClass: {
829       std::string FunctionName;
830       if (CGF)
831         FunctionName = CGF->CurFn->getName();
832       else
833         FunctionName = "global";
834 
835       return CGM.GetAddrOfGlobalBlock(cast<BlockExpr>(E), FunctionName.c_str());
836     }
837     }
838 
839     return 0;
840   }
841 };
842 
843 }  // end anonymous namespace.
844 
845 llvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
846                                                 QualType DestType,
847                                                 CodeGenFunction *CGF) {
848   Expr::EvalResult Result;
849 
850   bool Success = false;
851 
852   if (DestType->isReferenceType())
853     Success = E->EvaluateAsLValue(Result, Context);
854   else
855     Success = E->Evaluate(Result, Context);
856 
857   if (Success && !Result.HasSideEffects) {
858     switch (Result.Val.getKind()) {
859     case APValue::Uninitialized:
860       assert(0 && "Constant expressions should be initialized.");
861       return 0;
862     case APValue::LValue: {
863       const llvm::Type *DestTy = getTypes().ConvertTypeForMem(DestType);
864       llvm::Constant *Offset =
865         llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
866                                Result.Val.getLValueOffset().getQuantity());
867 
868       llvm::Constant *C;
869       if (const Expr *LVBase = Result.Val.getLValueBase()) {
870         C = ConstExprEmitter(*this, CGF).EmitLValue(const_cast<Expr*>(LVBase));
871 
872         // Apply offset if necessary.
873         if (!Offset->isNullValue()) {
874           const llvm::Type *Type = llvm::Type::getInt8PtrTy(VMContext);
875           llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, Type);
876           Casted = llvm::ConstantExpr::getGetElementPtr(Casted, &Offset, 1);
877           C = llvm::ConstantExpr::getBitCast(Casted, C->getType());
878         }
879 
880         // Convert to the appropriate type; this could be an lvalue for
881         // an integer.
882         if (isa<llvm::PointerType>(DestTy))
883           return llvm::ConstantExpr::getBitCast(C, DestTy);
884 
885         return llvm::ConstantExpr::getPtrToInt(C, DestTy);
886       } else {
887         C = Offset;
888 
889         // Convert to the appropriate type; this could be an lvalue for
890         // an integer.
891         if (isa<llvm::PointerType>(DestTy))
892           return llvm::ConstantExpr::getIntToPtr(C, DestTy);
893 
894         // If the types don't match this should only be a truncate.
895         if (C->getType() != DestTy)
896           return llvm::ConstantExpr::getTrunc(C, DestTy);
897 
898         return C;
899       }
900     }
901     case APValue::Int: {
902       llvm::Constant *C = llvm::ConstantInt::get(VMContext,
903                                                  Result.Val.getInt());
904 
905       if (C->getType()->isIntegerTy(1)) {
906         const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType());
907         C = llvm::ConstantExpr::getZExt(C, BoolTy);
908       }
909       return C;
910     }
911     case APValue::ComplexInt: {
912       llvm::Constant *Complex[2];
913 
914       Complex[0] = llvm::ConstantInt::get(VMContext,
915                                           Result.Val.getComplexIntReal());
916       Complex[1] = llvm::ConstantInt::get(VMContext,
917                                           Result.Val.getComplexIntImag());
918 
919       // FIXME: the target may want to specify that this is packed.
920       return llvm::ConstantStruct::get(VMContext, Complex, 2, false);
921     }
922     case APValue::Float:
923       return llvm::ConstantFP::get(VMContext, Result.Val.getFloat());
924     case APValue::ComplexFloat: {
925       llvm::Constant *Complex[2];
926 
927       Complex[0] = llvm::ConstantFP::get(VMContext,
928                                          Result.Val.getComplexFloatReal());
929       Complex[1] = llvm::ConstantFP::get(VMContext,
930                                          Result.Val.getComplexFloatImag());
931 
932       // FIXME: the target may want to specify that this is packed.
933       return llvm::ConstantStruct::get(VMContext, Complex, 2, false);
934     }
935     case APValue::Vector: {
936       llvm::SmallVector<llvm::Constant *, 4> Inits;
937       unsigned NumElts = Result.Val.getVectorLength();
938 
939       for (unsigned i = 0; i != NumElts; ++i) {
940         APValue &Elt = Result.Val.getVectorElt(i);
941         if (Elt.isInt())
942           Inits.push_back(llvm::ConstantInt::get(VMContext, Elt.getInt()));
943         else
944           Inits.push_back(llvm::ConstantFP::get(VMContext, Elt.getFloat()));
945       }
946       return llvm::ConstantVector::get(&Inits[0], Inits.size());
947     }
948     }
949   }
950 
951   llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E));
952   if (C && C->getType()->isIntegerTy(1)) {
953     const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType());
954     C = llvm::ConstantExpr::getZExt(C, BoolTy);
955   }
956   return C;
957 }
958 
959 static void
960 FillInNullDataMemberPointers(CodeGenModule &CGM, QualType T,
961                              std::vector<llvm::Constant *> &Elements,
962                              uint64_t StartOffset) {
963   assert(StartOffset % 8 == 0 && "StartOffset not byte aligned!");
964 
965   if (!CGM.getTypes().ContainsPointerToDataMember(T))
966     return;
967 
968   if (const ConstantArrayType *CAT =
969         CGM.getContext().getAsConstantArrayType(T)) {
970     QualType ElementTy = CAT->getElementType();
971     uint64_t ElementSize = CGM.getContext().getTypeSize(ElementTy);
972 
973     for (uint64_t I = 0, E = CAT->getSize().getZExtValue(); I != E; ++I) {
974       FillInNullDataMemberPointers(CGM, ElementTy, Elements,
975                                    StartOffset + I * ElementSize);
976     }
977   } else if (const RecordType *RT = T->getAs<RecordType>()) {
978     const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
979     const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
980 
981     // Go through all bases and fill in any null pointer to data members.
982     for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
983          E = RD->bases_end(); I != E; ++I) {
984       if (I->isVirtual()) {
985         // FIXME: We should initialize null pointer to data members in virtual
986         // bases here.
987         continue;
988       }
989 
990       const CXXRecordDecl *BaseDecl =
991       cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
992 
993       // Ignore empty bases.
994       if (BaseDecl->isEmpty())
995         continue;
996 
997       // Ignore bases that don't have any pointer to data members.
998       if (!CGM.getTypes().ContainsPointerToDataMember(BaseDecl))
999         continue;
1000 
1001       uint64_t BaseOffset = Layout.getBaseClassOffset(BaseDecl);
1002       FillInNullDataMemberPointers(CGM, I->getType(),
1003                                    Elements, StartOffset + BaseOffset);
1004     }
1005 
1006     // Visit all fields.
1007     unsigned FieldNo = 0;
1008     for (RecordDecl::field_iterator I = RD->field_begin(),
1009          E = RD->field_end(); I != E; ++I, ++FieldNo) {
1010       QualType FieldType = I->getType();
1011 
1012       if (!CGM.getTypes().ContainsPointerToDataMember(FieldType))
1013         continue;
1014 
1015       uint64_t FieldOffset = StartOffset + Layout.getFieldOffset(FieldNo);
1016       FillInNullDataMemberPointers(CGM, FieldType, Elements, FieldOffset);
1017     }
1018   } else {
1019     assert(T->isMemberPointerType() && "Should only see member pointers here!");
1020     assert(!T->getAs<MemberPointerType>()->getPointeeType()->isFunctionType() &&
1021            "Should only see pointers to data members here!");
1022 
1023     uint64_t StartIndex = StartOffset / 8;
1024     uint64_t EndIndex = StartIndex + CGM.getContext().getTypeSize(T) / 8;
1025 
1026     llvm::Constant *NegativeOne =
1027       llvm::ConstantInt::get(llvm::Type::getInt8Ty(CGM.getLLVMContext()),
1028                              -1ULL, /*isSigned=*/true);
1029 
1030     // Fill in the null data member pointer.
1031     for (uint64_t I = StartIndex; I != EndIndex; ++I)
1032       Elements[I] = NegativeOne;
1033   }
1034 }
1035 
1036 llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {
1037   if (!getTypes().ContainsPointerToDataMember(T))
1038     return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T));
1039 
1040   if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(T)) {
1041 
1042     QualType ElementTy = CAT->getElementType();
1043 
1044     llvm::Constant *Element = EmitNullConstant(ElementTy);
1045     unsigned NumElements = CAT->getSize().getZExtValue();
1046     std::vector<llvm::Constant *> Array(NumElements);
1047     for (unsigned i = 0; i != NumElements; ++i)
1048       Array[i] = Element;
1049 
1050     const llvm::ArrayType *ATy =
1051       cast<llvm::ArrayType>(getTypes().ConvertTypeForMem(T));
1052     return llvm::ConstantArray::get(ATy, Array);
1053   }
1054 
1055   if (const RecordType *RT = T->getAs<RecordType>()) {
1056     const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
1057     const llvm::StructType *STy =
1058       cast<llvm::StructType>(getTypes().ConvertTypeForMem(T));
1059     unsigned NumElements = STy->getNumElements();
1060     std::vector<llvm::Constant *> Elements(NumElements);
1061 
1062     const CGRecordLayout &Layout = getTypes().getCGRecordLayout(RD);
1063 
1064     // Go through all bases and fill in any null pointer to data members.
1065     for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
1066          E = RD->bases_end(); I != E; ++I) {
1067       if (I->isVirtual()) {
1068         // FIXME: We should initialize null pointer to data members in virtual
1069         // bases here.
1070         continue;
1071       }
1072 
1073       const CXXRecordDecl *BaseDecl =
1074         cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl());
1075 
1076       // Ignore empty bases.
1077       if (BaseDecl->isEmpty())
1078         continue;
1079 
1080       // Ignore bases that don't have any pointer to data members.
1081       if (!getTypes().ContainsPointerToDataMember(BaseDecl))
1082         continue;
1083 
1084       // Currently, all bases are arrays of i8. Figure out how many elements
1085       // this base array has.
1086       unsigned BaseFieldNo = Layout.getNonVirtualBaseLLVMFieldNo(BaseDecl);
1087       const llvm::ArrayType *BaseArrayTy =
1088         cast<llvm::ArrayType>(STy->getElementType(BaseFieldNo));
1089 
1090       unsigned NumBaseElements = BaseArrayTy->getNumElements();
1091       std::vector<llvm::Constant *> BaseElements(NumBaseElements);
1092 
1093       // Now fill in null data member pointers.
1094       FillInNullDataMemberPointers(*this, I->getType(), BaseElements, 0);
1095 
1096       // Now go through all other elements and zero them out.
1097       if (NumBaseElements) {
1098         llvm::Constant *Zero =
1099           llvm::ConstantInt::get(llvm::Type::getInt8Ty(getLLVMContext()), 0);
1100 
1101         for (unsigned I = 0; I != NumBaseElements; ++I) {
1102           if (!BaseElements[I])
1103             BaseElements[I] = Zero;
1104         }
1105       }
1106 
1107       Elements[BaseFieldNo] = llvm::ConstantArray::get(BaseArrayTy,
1108                                                        BaseElements);
1109     }
1110 
1111     for (RecordDecl::field_iterator I = RD->field_begin(),
1112          E = RD->field_end(); I != E; ++I) {
1113       const FieldDecl *FD = *I;
1114 
1115       // Ignore bit fields.
1116       if (FD->isBitField())
1117         continue;
1118 
1119       unsigned FieldNo = Layout.getLLVMFieldNo(FD);
1120       Elements[FieldNo] = EmitNullConstant(FD->getType());
1121     }
1122 
1123     // Now go through all other fields and zero them out.
1124     for (unsigned i = 0; i != NumElements; ++i) {
1125       if (!Elements[i])
1126         Elements[i] = llvm::Constant::getNullValue(STy->getElementType(i));
1127     }
1128 
1129     return llvm::ConstantStruct::get(STy, Elements);
1130   }
1131 
1132   assert(T->isMemberPointerType() && "Should only see member pointers here!");
1133   assert(!T->getAs<MemberPointerType>()->getPointeeType()->isFunctionType() &&
1134          "Should only see pointers to data members here!");
1135 
1136   // Itanium C++ ABI 2.3:
1137   //   A NULL pointer is represented as -1.
1138   return llvm::ConstantInt::get(getTypes().ConvertTypeForMem(T), -1ULL,
1139                                 /*isSigned=*/true);
1140 }
1141 
1142 llvm::Constant *
1143 CodeGenModule::EmitPointerToDataMember(const FieldDecl *FD) {
1144 
1145   // Itanium C++ ABI 2.3:
1146   //   A pointer to data member is an offset from the base address of the class
1147   //   object containing it, represented as a ptrdiff_t
1148 
1149   const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(FD->getParent());
1150   QualType ClassType =
1151     getContext().getTypeDeclType(const_cast<CXXRecordDecl *>(ClassDecl));
1152 
1153   const llvm::StructType *ClassLTy =
1154     cast<llvm::StructType>(getTypes().ConvertType(ClassType));
1155 
1156   const CGRecordLayout &RL =
1157     getTypes().getCGRecordLayout(FD->getParent());
1158   unsigned FieldNo = RL.getLLVMFieldNo(FD);
1159   uint64_t Offset =
1160     getTargetData().getStructLayout(ClassLTy)->getElementOffset(FieldNo);
1161 
1162   const llvm::Type *PtrDiffTy =
1163     getTypes().ConvertType(getContext().getPointerDiffType());
1164 
1165   return llvm::ConstantInt::get(PtrDiffTy, Offset);
1166 }
1167