CGExprConstant.cpp revision fc3eaa47fa2ef70ab21131005c328adda3020737
13b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//===--- CGExprConstant.cpp - Emit LLVM Code from Constant Expressions ----===//
23b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//
33b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//                     The LLVM Compiler Infrastructure
43b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//
53b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson// This file is distributed under the University of Illinois Open Source
63b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson// License. See LICENSE.TXT for details.
73b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//
83b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//===----------------------------------------------------------------------===//
93b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//
103b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson// This contains code to emit Constant Expr nodes as LLVM code.
113b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//
123b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson//===----------------------------------------------------------------------===//
133b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
143b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson#include "CodeGenFunction.h"
153b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson#include "CodeGenModule.h"
16af2f62ce32e462f256855cd24b06dec4755d2827Daniel Dunbar#include "CGObjCRuntime.h"
17f6b24ea67b5898295e2fc645327837037462a0fdChris Lattner#include "clang/AST/APValue.h"
18de7fb8413b13651fd85b7125d08b3c9ac2816d9dDaniel Dunbar#include "clang/AST/ASTContext.h"
194c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson#include "clang/AST/RecordLayout.h"
20de7fb8413b13651fd85b7125d08b3c9ac2816d9dDaniel Dunbar#include "clang/AST/StmtVisitor.h"
211b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner#include "clang/Basic/Builtins.h"
223b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson#include "llvm/Constants.h"
233b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson#include "llvm/Function.h"
243b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson#include "llvm/GlobalVariable.h"
253b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson#include "llvm/Support/Compiler.h"
26a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman#include "llvm/Target/TargetData.h"
273b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlssonusing namespace clang;
283b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlssonusing namespace CodeGen;
293b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
303b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlssonnamespace  {
314c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
324c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlssonclass VISIBILITY_HIDDEN ConstStructBuilder {
334c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  CodeGenModule &CGM;
344c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  CodeGenFunction *CGF;
354c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
364c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  bool Packed;
374257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson
384c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  unsigned NextFieldOffsetInBytes;
394c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
404c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  std::vector<llvm::Constant *> Elements;
414c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
424c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  ConstStructBuilder(CodeGenModule &CGM, CodeGenFunction *CGF)
434c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    : CGM(CGM), CGF(CGF), Packed(false), NextFieldOffsetInBytes(0) { }
444c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
454c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  bool AppendField(const FieldDecl *Field, uint64_t FieldOffset,
464c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson                   const Expr *InitExpr) {
474c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    uint64_t FieldOffsetInBytes = FieldOffset / 8;
484c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
494c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    assert(NextFieldOffsetInBytes <= FieldOffsetInBytes
504c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson           && "Field offset mismatch!");
514c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
524c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    // Emit the field.
534c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    llvm::Constant *C = CGM.EmitConstantExpr(InitExpr, Field->getType(), CGF);
544c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    if (!C)
554c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      return false;
564c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
574c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    unsigned FieldAlignment = getAlignment(C);
584c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
594c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    // Round up the field offset to the alignment of the field type.
604c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    uint64_t AlignedNextFieldOffsetInBytes =
614c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      llvm::RoundUpToAlignment(NextFieldOffsetInBytes, FieldAlignment);
624c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
634c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    if (AlignedNextFieldOffsetInBytes > FieldOffsetInBytes) {
64bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      std::vector<llvm::Constant *> PackedElements;
65bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
66bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      assert(!Packed && "Alignment is wrong even with a packed struct!");
67bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
68bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      // Convert the struct to a packed struct.
69bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      uint64_t ElementOffsetInBytes = 0;
70bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
71bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      for (unsigned i = 0, e = Elements.size(); i != e; ++i) {
72bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson        llvm::Constant *C = Elements[i];
73bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
74bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson        unsigned ElementAlign =
75bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson          CGM.getTargetData().getABITypeAlignment(C->getType());
76bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson        uint64_t AlignedElementOffsetInBytes =
77bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson          llvm::RoundUpToAlignment(ElementOffsetInBytes, ElementAlign);
78bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
79bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson        if (AlignedElementOffsetInBytes > ElementOffsetInBytes) {
80bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson          // We need some padding.
81bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson          uint64_t NumBytes =
82bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson            AlignedElementOffsetInBytes - ElementOffsetInBytes;
83bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
840032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson          const llvm::Type *Ty = llvm::Type::getInt8Ty(CGF->getLLVMContext());
85bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson          if (NumBytes > 1)
8696e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson            Ty = llvm::ArrayType::get(Ty, NumBytes);
87bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
88c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson          llvm::Constant *Padding = llvm::Constant::getNullValue(Ty);
89bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson          PackedElements.push_back(Padding);
90bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson          ElementOffsetInBytes += getSizeInBytes(Padding);
91bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson        }
92bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
93bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson        PackedElements.push_back(C);
94bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson        ElementOffsetInBytes += getSizeInBytes(C);
95bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      }
96bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
97bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      assert(ElementOffsetInBytes == NextFieldOffsetInBytes &&
98bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson             "Packing the struct changed its size!");
99bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson
100bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      Elements = PackedElements;
101bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      Packed = true;
102bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      AlignedNextFieldOffsetInBytes = NextFieldOffsetInBytes;
1034c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    }
1044c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
1054c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    if (AlignedNextFieldOffsetInBytes < FieldOffsetInBytes) {
1064c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      // We need to append padding.
107bea9c52992d98d7d837dfbdd226d02cbd8bab601Anders Carlsson      AppendPadding(FieldOffsetInBytes - NextFieldOffsetInBytes);
1084c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
1094c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      assert(NextFieldOffsetInBytes == FieldOffsetInBytes &&
1104c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson             "Did not add enough padding!");
1114c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
1124c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      AlignedNextFieldOffsetInBytes = NextFieldOffsetInBytes;
1134c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    }
1144c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
1154c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    // Add the field.
1164c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    Elements.push_back(C);
1174c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    NextFieldOffsetInBytes = AlignedNextFieldOffsetInBytes + getSizeInBytes(C);
1184c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
1194c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    return true;
1204c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  }
1214c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
122d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson  bool AppendBitField(const FieldDecl *Field, uint64_t FieldOffset,
123d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson                      const Expr *InitExpr) {
124d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    llvm::ConstantInt *CI =
125d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      cast_or_null<llvm::ConstantInt>(CGM.EmitConstantExpr(InitExpr,
126d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson                                                           Field->getType(),
127d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson                                                           CGF));
128d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    // FIXME: Can this ever happen?
129d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    if (!CI)
130d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      return false;
131d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
132d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    if (FieldOffset > NextFieldOffsetInBytes * 8) {
1337a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      // We need to add padding.
1347a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      uint64_t NumBytes =
1357a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        llvm::RoundUpToAlignment(FieldOffset -
1367a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson                                 NextFieldOffsetInBytes * 8, 8) / 8;
1377a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1387a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      AppendPadding(NumBytes);
139d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    }
140d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
141d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    uint64_t FieldSize =
142d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      Field->getBitWidth()->EvaluateAsInt(CGM.getContext()).getZExtValue();
143d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
144d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    llvm::APInt FieldValue = CI->getValue();
145d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
146d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    // Promote the size of FieldValue if necessary
147d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    // FIXME: This should never occur, but currently it can because initializer
148d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    // constants are cast to bool, and because clang is not enforcing bitfield
149d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    // width limits.
150d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    if (FieldSize > FieldValue.getBitWidth())
151d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      FieldValue.zext(FieldSize);
152d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
153d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    // Truncate the size of FieldValue to the bit field size.
154d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    if (FieldSize < FieldValue.getBitWidth())
155d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      FieldValue.trunc(FieldSize);
156d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
157d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    if (FieldOffset < NextFieldOffsetInBytes * 8) {
1587a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      // Either part of the field or the entire field can go into the previous
1597a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      // byte.
1607a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      assert(!Elements.empty() && "Elements can't be empty!");
1617a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1627a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      unsigned BitsInPreviousByte =
1637a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        NextFieldOffsetInBytes * 8 - FieldOffset;
1647a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1657a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      bool FitsCompletelyInPreviousByte =
1667a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        BitsInPreviousByte >= FieldValue.getBitWidth();
1677a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1687a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      llvm::APInt Tmp = FieldValue;
1697a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1707a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      if (!FitsCompletelyInPreviousByte) {
1717a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        unsigned NewFieldWidth = FieldSize - BitsInPreviousByte;
1727a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1737a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        if (CGM.getTargetData().isBigEndian()) {
1747a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          Tmp = Tmp.lshr(NewFieldWidth);
1757a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          Tmp.trunc(BitsInPreviousByte);
1767a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1777a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          // We want the remaining high bits.
1787a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          FieldValue.trunc(NewFieldWidth);
1797a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        } else {
1807a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          Tmp.trunc(BitsInPreviousByte);
1817a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1827a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          // We want the remaining low bits.
1837a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          FieldValue = FieldValue.lshr(BitsInPreviousByte);
1847a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          FieldValue.trunc(NewFieldWidth);
1857a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        }
1867a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      }
1877a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1887a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      Tmp.zext(8);
1897a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      if (CGM.getTargetData().isBigEndian()) {
1907a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        if (FitsCompletelyInPreviousByte)
1917a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson          Tmp = Tmp.shl(BitsInPreviousByte - FieldValue.getBitWidth());
1927a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      } else {
1937a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        Tmp = Tmp.shl(8 - BitsInPreviousByte);
1947a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      }
1957a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
1967a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      // Or in the bits that go into the previous byte.
1977a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      Tmp |= cast<llvm::ConstantInt>(Elements.back())->getValue();
1987a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      Elements.back() = llvm::ConstantInt::get(CGM.getLLVMContext(), Tmp);
1997a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
2007a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      if (FitsCompletelyInPreviousByte)
2017a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        return true;
202d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    }
203d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
204d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    while (FieldValue.getBitWidth() > 8) {
205d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      llvm::APInt Tmp;
206d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
207d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      if (CGM.getTargetData().isBigEndian()) {
208d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson        // We want the high bits.
2097a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        Tmp = FieldValue;
2107a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        Tmp = Tmp.lshr(Tmp.getBitWidth() - 8);
2117a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        Tmp.trunc(8);
2127a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson      } else {
2137a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        // We want the low bits.
2147a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        Tmp = FieldValue;
2157a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        Tmp.trunc(8);
2167a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson
2177a86d4b8a4fe34bb8a9e3bc94f839a4a657856b8Anders Carlsson        FieldValue = FieldValue.lshr(8);
218d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      }
219d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
220d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      Elements.push_back(llvm::ConstantInt::get(CGM.getLLVMContext(), Tmp));
221d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      NextFieldOffsetInBytes++;
222d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
223d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      FieldValue.trunc(FieldValue.getBitWidth() - 8);
224d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    }
225d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
226d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    assert(FieldValue.getBitWidth() > 0 &&
227d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson           "Should have at least one bit left!");
228d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    assert(FieldValue.getBitWidth() <= 8 &&
229d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson           "Should not have more than a byte left!");
230d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
231d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    if (FieldValue.getBitWidth() < 8) {
232d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      if (CGM.getTargetData().isBigEndian()) {
233d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson        unsigned BitWidth = FieldValue.getBitWidth();
234d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
235d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson        FieldValue.zext(8);
236d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson        FieldValue = FieldValue << (8 - BitWidth);
237d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson      } else
238d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson        FieldValue.zext(8);
239d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    }
240d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
241d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    // Append the last element.
242d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    Elements.push_back(llvm::ConstantInt::get(CGM.getLLVMContext(),
243d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson                                              FieldValue));
244d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    NextFieldOffsetInBytes++;
245d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson    return true;
246d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson  }
247d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson
2484c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  void AppendPadding(uint64_t NumBytes) {
2494c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    if (!NumBytes)
2504c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      return;
2514c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
2520032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    const llvm::Type *Ty = llvm::Type::getInt8Ty(CGM.getLLVMContext());
2534c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    if (NumBytes > 1)
25496e0fc726c6fe7538522c60743705d5e696b40afOwen Anderson      Ty = llvm::ArrayType::get(Ty, NumBytes);
2554c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
256c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson    llvm::Constant *C = llvm::Constant::getNullValue(Ty);
2574c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    Elements.push_back(C);
2584c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    assert(getAlignment(C) == 1 && "Padding must have 1 byte alignment!");
2594c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
2604c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    NextFieldOffsetInBytes += getSizeInBytes(C);
2614c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  }
2624c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
2634c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  void AppendTailPadding(uint64_t RecordSize) {
2644c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    assert(RecordSize % 8 == 0 && "Invalid record size!");
2654c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
2664c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    uint64_t RecordSizeInBytes = RecordSize / 8;
2674c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    assert(NextFieldOffsetInBytes <= RecordSizeInBytes && "Size mismatch!");
2684c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
2694c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    unsigned NumPadBytes = RecordSizeInBytes - NextFieldOffsetInBytes;
2704c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    AppendPadding(NumPadBytes);
2714c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  }
2724c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
273c0879bbbe06f1983f1291669dcc1d451767c601cEli Friedman  bool Build(InitListExpr *ILE) {
2746217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek    RecordDecl *RD = ILE->getType()->getAs<RecordType>()->getDecl();
2754c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
2764c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
2774c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    unsigned FieldNo = 0;
2784c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    unsigned ElementNo = 0;
2794c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    for (RecordDecl::field_iterator Field = RD->field_begin(),
2804c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson         FieldEnd = RD->field_end();
2814c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson         ElementNo < ILE->getNumInits() && Field != FieldEnd;
2824c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson         ++Field, ++FieldNo) {
283c0879bbbe06f1983f1291669dcc1d451767c601cEli Friedman      if (RD->isUnion() && ILE->getInitializedFieldInUnion() != *Field)
284c0879bbbe06f1983f1291669dcc1d451767c601cEli Friedman        continue;
285c0879bbbe06f1983f1291669dcc1d451767c601cEli Friedman
2864c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      if (Field->isBitField()) {
2874c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson        if (!Field->getIdentifier())
2884c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson          continue;
2894c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
290d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson        if (!AppendBitField(*Field, Layout.getFieldOffset(FieldNo),
291d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson                            ILE->getInit(ElementNo)))
292d24393bbc18fe8d30273e832fb9617604cb20493Anders Carlsson          return false;
2934c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      } else {
2944c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson        if (!AppendField(*Field, Layout.getFieldOffset(FieldNo),
2954c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson                         ILE->getInit(ElementNo)))
2964c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson          return false;
2974c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      }
2984c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
2994c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      ElementNo++;
3004c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    }
3014c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3024257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson    uint64_t LayoutSizeInBytes = Layout.getSize() / 8;
3034257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson
3044257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson    if (NextFieldOffsetInBytes > LayoutSizeInBytes) {
3054257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson      // If the struct is bigger than the size of the record type,
3064257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson      // we must have a flexible array member at the end.
3074257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson      assert(RD->hasFlexibleArrayMember() &&
3084257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson             "Must have flexible array member if struct is bigger than type!");
3094257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson
3104257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson      // No tail padding is necessary.
3114257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson      return true;
3124257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson    }
3134257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson
3144c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    // Append tail padding if necessary.
3154c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    AppendTailPadding(Layout.getSize());
3164257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson
3174c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    assert(Layout.getSize() / 8 == NextFieldOffsetInBytes &&
3184c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson           "Tail padding mismatch!");
3194257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson
3204c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    return true;
3214c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  }
3224c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3234c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  unsigned getAlignment(const llvm::Constant *C) const {
3244c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    if (Packed)
3254c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      return 1;
3264c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3274c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    return CGM.getTargetData().getABITypeAlignment(C->getType());
3284c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  }
3294c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3304c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  uint64_t getSizeInBytes(const llvm::Constant *C) const {
3314c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    return CGM.getTargetData().getTypeAllocSize(C->getType());
3324c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  }
3334c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3344c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlssonpublic:
3354c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  static llvm::Constant *BuildStruct(CodeGenModule &CGM, CodeGenFunction *CGF,
336c0879bbbe06f1983f1291669dcc1d451767c601cEli Friedman                                     InitListExpr *ILE) {
3374c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    ConstStructBuilder Builder(CGM, CGF);
3384c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3394c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    if (!Builder.Build(ILE))
3404c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson      return 0;
3414c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3424c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson    llvm::Constant *Result =
343a10f7eabea651c5ba71569e69143dd77008f2a56Daniel Dunbar      llvm::ConstantStruct::get(CGM.getLLVMContext(),
34447a434ff3d49e7906eda88e8e8242e4297725b32Owen Anderson                                Builder.Elements, Builder.Packed);
3454c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3464257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson    assert(llvm::RoundUpToAlignment(Builder.NextFieldOffsetInBytes,
3474257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson                                    Builder.getAlignment(Result)) ==
3484257bc6d5bd6ec0789287bc5ee7c2fea1f44c59eAnders Carlsson           Builder.getSizeInBytes(Result) && "Size mismatch!");
3494c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
3505602719fd5394c1e00c8aac237eb006b6aa32e52Anders Carlsson    return Result;
3514c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson  }
3524c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson};
3534c98efdf06f94da20a640aa36f6a4f3284c26bffAnders Carlsson
35484005b4b6b92e3a716fa4a792bea7d41bbb0102eAnders Carlssonclass VISIBILITY_HIDDEN ConstExprEmitter :
35584005b4b6b92e3a716fa4a792bea7d41bbb0102eAnders Carlsson  public StmtVisitor<ConstExprEmitter, llvm::Constant*> {
3563b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  CodeGenModule &CGM;
357813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio  CodeGenFunction *CGF;
358a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson  llvm::LLVMContext &VMContext;
3593b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlssonpublic:
360813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio  ConstExprEmitter(CodeGenModule &cgm, CodeGenFunction *cgf)
361a1cf15f4680e5cf39e72e28c5ea854fcba792e84Owen Anderson    : CGM(cgm), CGF(cgf), VMContext(cgm.getLLVMContext()) {
3623b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  }
3633b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
3643b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  //===--------------------------------------------------------------------===//
3653b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  //                            Visitor Methods
3663b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  //===--------------------------------------------------------------------===//
3673b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
3683b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  llvm::Constant *VisitStmt(Stmt *S) {
369069880ef6a2ecfdbc98a4980de53d3902499e83bAnders Carlsson    return 0;
3703b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  }
3713b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
3723b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  llvm::Constant *VisitParenExpr(ParenExpr *PE) {
3733b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson    return Visit(PE->getSubExpr());
3743b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  }
375bcf6225ad69ea388e287f952981fd076636991b2Anders Carlsson
3763b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  llvm::Constant *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
3773b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson    return Visit(E->getInitializer());
3783b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  }
3793b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
3800835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  llvm::Constant *VisitCastExpr(CastExpr* E) {
3810086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson    switch (E->getCastKind()) {
3820086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson    case CastExpr::CK_ToUnion: {
3830086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson      // GCC cast to union extension
3840086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson      assert(E->getType()->isUnionType() &&
3850086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson             "Destination type is not union type!");
38681e51e2c5bf1e4edc3b70040e2083fa83d314e40Nuno Lopes      const llvm::Type *Ty = ConvertType(E->getType());
387e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson      Expr *SubExpr = E->getSubExpr();
3880086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson
389aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      llvm::Constant *C =
390aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson        CGM.EmitConstantExpr(SubExpr, SubExpr->getType(), CGF);
391aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      if (!C)
392aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson        return 0;
393aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson
394aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      // Build a struct with the union sub-element as the first member,
395aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      // and padded to the appropriate size
396aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      std::vector<llvm::Constant*> Elts;
397aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      std::vector<const llvm::Type*> Types;
398aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      Elts.push_back(C);
399aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      Types.push_back(C->getType());
400aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      unsigned CurSize = CGM.getTargetData().getTypeAllocSize(C->getType());
401aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      unsigned TotalSize = CGM.getTargetData().getTypeAllocSize(Ty);
4020086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson
403aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      assert(CurSize <= TotalSize && "Union size mismatch!");
404aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      if (unsigned NumPadBytes = TotalSize - CurSize) {
4050032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson        const llvm::Type *Ty = llvm::Type::getInt8Ty(VMContext);
406aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson        if (NumPadBytes > 1)
407aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson          Ty = llvm::ArrayType::get(Ty, NumPadBytes);
4080086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson
409aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson        Elts.push_back(llvm::Constant::getNullValue(Ty));
410aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson        Types.push_back(Ty);
411aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      }
4120086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson
4130086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson      llvm::StructType* STy =
4140086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson        llvm::StructType::get(C->getType()->getContext(), Types, false);
415aaed50dfb52d358a407dbbdd1ca323f9328e957aAnders Carlsson      return llvm::ConstantStruct::get(STy, Elts);
41681e51e2c5bf1e4edc3b70040e2083fa83d314e40Nuno Lopes    }
417d1a9bac24466831e089c8f330ec9264fb3ace367Anders Carlsson    case CastExpr::CK_NullToMemberPointer:
418d1a9bac24466831e089c8f330ec9264fb3ace367Anders Carlsson      return CGM.EmitNullConstant(E->getType());
4190086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson    default: {
4200086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson      // FIXME: This should be handled by the CK_NoOp cast kind.
4210086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson      // Explicit and implicit no-op casts
4220086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson      QualType Ty = E->getType(), SubTy = E->getSubExpr()->getType();
4230086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson      if (CGM.getContext().hasSameUnqualifiedType(Ty, SubTy))
4240086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson          return Visit(E->getSubExpr());
4250086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson      return 0;
4260086ccb1985f392ac688a19b35b300610db102e8Anders Carlsson    }
427ddd2b6e1e7406ab45f71398fb78b86c36acd789bEli Friedman    }
4283b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  }
429f6884ac7cfc4c5562c0678ad65b3460a38f56e23Anders Carlsson
43004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  llvm::Constant *VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
43104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    return Visit(DAE->getExpr());
43204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  }
43304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
434a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman  llvm::Constant *EmitArrayInitialization(InitListExpr *ILE) {
4354d1c01860708c05757f6a0e17fd90e584000c752Eli Friedman    std::vector<llvm::Constant*> Elts;
436a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman    const llvm::ArrayType *AType =
437a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman        cast<llvm::ArrayType>(ConvertType(ILE->getType()));
4384d1c01860708c05757f6a0e17fd90e584000c752Eli Friedman    unsigned NumInitElements = ILE->getNumInits();
4394d1c01860708c05757f6a0e17fd90e584000c752Eli Friedman    // FIXME: Check for wide strings
440eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // FIXME: Check for NumInitElements exactly equal to 1??
441eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    if (NumInitElements > 0 &&
442eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner        (isa<StringLiteral>(ILE->getInit(0)) ||
443eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner         isa<ObjCEncodeExpr>(ILE->getInit(0))) &&
444c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner        ILE->getType()->getArrayElementTypeNoTypeQual()->isCharType())
4454d1c01860708c05757f6a0e17fd90e584000c752Eli Friedman      return Visit(ILE->getInit(0));
446eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    const llvm::Type *ElemTy = AType->getElementType();
447eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    unsigned NumElements = AType->getNumElements();
448eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel
449eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    // Initialising an array requires us to automatically
450eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    // initialise any elements that have not been initialised explicitly
451eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    unsigned NumInitableElts = std::min(NumInitElements, NumElements);
452eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel
453eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    // Copy initializer elements.
454eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    unsigned i = 0;
455a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman    bool RewriteType = false;
456eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    for (; i < NumInitableElts; ++i) {
457e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson      Expr *Init = ILE->getInit(i);
458e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson      llvm::Constant *C = CGM.EmitConstantExpr(Init, Init->getType(), CGF);
459d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar      if (!C)
460d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar        return 0;
461a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman      RewriteType |= (C->getType() != ElemTy);
462eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel      Elts.push_back(C);
4633b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson    }
464a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman
465eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    // Initialize remaining array elements.
4660f59312e7b625fa5821a63db65377d4b3b667e99Eli Friedman    // FIXME: This doesn't handle member pointers correctly!
467eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    for (; i < NumElements; ++i)
468c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson      Elts.push_back(llvm::Constant::getNullValue(ElemTy));
469eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel
470a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman    if (RewriteType) {
471a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman      // FIXME: Try to avoid packing the array
472a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman      std::vector<const llvm::Type*> Types;
473a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman      for (unsigned i = 0; i < Elts.size(); ++i)
474a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman        Types.push_back(Elts[i]->getType());
47547a434ff3d49e7906eda88e8e8242e4297725b32Owen Anderson      const llvm::StructType *SType = llvm::StructType::get(AType->getContext(),
47647a434ff3d49e7906eda88e8e8242e4297725b32Owen Anderson                                                            Types, true);
47708e252425ca2cbdc44ba65d9a657ed5398014e36Owen Anderson      return llvm::ConstantStruct::get(SType, Elts);
478a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman    }
479a04a1538ee5e286e94e3374caf51ba1094d289b0Eli Friedman
4807db6d838aad4083fe86d7bf703a75fe6e8a17856Owen Anderson    return llvm::ConstantArray::get(AType, Elts);
481eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel  }
482eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel
483a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman  llvm::Constant *EmitStructInitialization(InitListExpr *ILE) {
4848dca3b3d09ff48b3ec528cd603f835f120c4d9eeAnders Carlsson    return ConstStructBuilder::BuildStruct(CGM, CGF, ILE);
485eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel  }
48612905987c4ab9fb705f88f56b35298f730c8dbd5Anders Carlsson
487a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman  llvm::Constant *EmitUnionInitialization(InitListExpr *ILE) {
488f6c43965c41e042f0541bdd47b1511d585b2dcfdAnders Carlsson    return ConstStructBuilder::BuildStruct(CGM, CGF, ILE);
489a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman  }
490a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman
491a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman  llvm::Constant *EmitVectorInitialization(InitListExpr *ILE) {
492a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman    const llvm::VectorType *VType =
493a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman        cast<llvm::VectorType>(ConvertType(ILE->getType()));
494cfb313bd56fb935c54544489d71d77364fd312dbEli Friedman    const llvm::Type *ElemTy = VType->getElementType();
495cfb313bd56fb935c54544489d71d77364fd312dbEli Friedman    std::vector<llvm::Constant*> Elts;
496eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    unsigned NumElements = VType->getNumElements();
497cfb313bd56fb935c54544489d71d77364fd312dbEli Friedman    unsigned NumInitElements = ILE->getNumInits();
498cfb313bd56fb935c54544489d71d77364fd312dbEli Friedman
499cfb313bd56fb935c54544489d71d77364fd312dbEli Friedman    unsigned NumInitableElts = std::min(NumInitElements, NumElements);
50047fb6977509a285501d02611845e9f8e081a15e1Devang Patel
5013b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson    // Copy initializer elements.
5023b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson    unsigned i = 0;
503cfb313bd56fb935c54544489d71d77364fd312dbEli Friedman    for (; i < NumInitableElts; ++i) {
504e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson      Expr *Init = ILE->getInit(i);
505e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson      llvm::Constant *C = CGM.EmitConstantExpr(Init, Init->getType(), CGF);
506d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar      if (!C)
507d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar        return 0;
5083b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson      Elts.push_back(C);
5093b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson    }
510eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel
511cfb313bd56fb935c54544489d71d77364fd312dbEli Friedman    for (; i < NumElements; ++i)
512c9c88b4159791c48e486ca94e3743b5979e2b7a6Owen Anderson      Elts.push_back(llvm::Constant::getNullValue(ElemTy));
513cfb313bd56fb935c54544489d71d77364fd312dbEli Friedman
5144a28932dba03132dabbe70abdadcaae468dd7933Owen Anderson    return llvm::ConstantVector::get(VType, Elts);
515eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel  }
5167d801eae4db97c46e47c40d431d34225ce6f6143Anders Carlsson
5177d801eae4db97c46e47c40d431d34225ce6f6143Anders Carlsson  llvm::Constant *VisitImplicitValueInitExpr(ImplicitValueInitExpr* E) {
5180f59312e7b625fa5821a63db65377d4b3b667e99Eli Friedman    return CGM.EmitNullConstant(E->getType());
5197d801eae4db97c46e47c40d431d34225ce6f6143Anders Carlsson  }
5207d801eae4db97c46e47c40d431d34225ce6f6143Anders Carlsson
521eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel  llvm::Constant *VisitInitListExpr(InitListExpr *ILE) {
522a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman    if (ILE->getType()->isScalarType()) {
523a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman      // We have a scalar in braces. Just use the first element.
524e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson      if (ILE->getNumInits() > 0) {
525e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson        Expr *Init = ILE->getInit(0);
526e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson        return CGM.EmitConstantExpr(Init, Init->getType(), CGF);
527e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson      }
5280f59312e7b625fa5821a63db65377d4b3b667e99Eli Friedman      return CGM.EmitNullConstant(ILE->getType());
52947fb6977509a285501d02611845e9f8e081a15e1Devang Patel    }
530be20bb558cae5352898e6a913e29d24d20134841Chris Lattner
531a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman    if (ILE->getType()->isArrayType())
532a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman      return EmitArrayInitialization(ILE);
533a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman
534a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman    if (ILE->getType()->isStructureType())
535a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman      return EmitStructInitialization(ILE);
536a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman
537a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman    if (ILE->getType()->isUnionType())
538a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman      return EmitUnionInitialization(ILE);
539a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman
540a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman    if (ILE->getType()->isVectorType())
541a823400df727968fda4b2df23abab0d8ecff7a75Eli Friedman      return EmitVectorInitialization(ILE);
54247fb6977509a285501d02611845e9f8e081a15e1Devang Patel
543eae1560d4fb99b9df814bc12c0419825996156cdDevang Patel    assert(0 && "Unable to handle InitListExpr");
5442b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner    // Get rid of control reaches end of void function warning.
5452b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner    // Not reached.
5462b94fe35edf951a14ecd32b21f7ebcc2e3754c67Chris Lattner    return 0;
5473b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  }
5483b707e7476cd46945e4e187b57b7f0ad811d8752Eli Friedman
5493b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  llvm::Constant *VisitStringLiteral(StringLiteral *E) {
550a7ad98ff0919d6a24ea7c46634ea29bea551c1a0Chris Lattner    assert(!E->getType()->isPointerType() && "Strings are always arrays");
5513b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
552eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // This must be a string initializing an array in a static initializer.
553eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // Don't emit it as the address of the string, emit the string data itself
554eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // as an inline array.
5550032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    return llvm::ConstantArray::get(VMContext,
5560032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson                                    CGM.GetStringForStringLiteral(E), false);
5573b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  }
5583b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
559eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner  llvm::Constant *VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
560eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // This must be an @encode initializing an array in a static initializer.
561eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // Don't emit it as the address of the string, emit the string data itself
562eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // as an inline array.
563eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    std::string Str;
564eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    CGM.getContext().getObjCEncodingForType(E->getEncodedType(), Str);
565eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    const ConstantArrayType *CAT = cast<ConstantArrayType>(E->getType());
566eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner
567eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // Resize the string to the right size, adding zeros at the end, or
568eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    // truncating as needed.
569eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    Str.resize(CAT->getSize().getZExtValue(), '\0');
5700032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson    return llvm::ConstantArray::get(VMContext, Str, false);
571eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner  }
572eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner
573bc5ed6ef52d43b5a3c924421aac3c1f0f829dcc8Eli Friedman  llvm::Constant *VisitUnaryExtension(const UnaryOperator *E) {
574bc5ed6ef52d43b5a3c924421aac3c1f0f829dcc8Eli Friedman    return Visit(E->getSubExpr());
575bc5ed6ef52d43b5a3c924421aac3c1f0f829dcc8Eli Friedman  }
576b83d287bc7f47d36fb0751a481e2ef9308b37252Mike Stump
5773b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  // Utility methods
5783b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  const llvm::Type *ConvertType(QualType T) {
5793b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson    return CGM.getTypes().ConvertType(T);
5803b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson  }
58184005b4b6b92e3a716fa4a792bea7d41bbb0102eAnders Carlsson
5825ea7d07ea7d9f2b679c85df7cc45fcc6e157e396Anders Carlssonpublic:
58384005b4b6b92e3a716fa4a792bea7d41bbb0102eAnders Carlsson  llvm::Constant *EmitLValue(Expr *E) {
584e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson    switch (E->getStmtClass()) {
585546d94c77e4636a7dbce160c3c8e4157a2fe6d81Eli Friedman    default: break;
586e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson    case Expr::CompoundLiteralExprClass: {
587e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson      // Note that due to the nature of compound literals, this is guaranteed
588e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson      // to be the only use of the variable, so we just generate it here.
58984005b4b6b92e3a716fa4a792bea7d41bbb0102eAnders Carlsson      CompoundLiteralExpr *CLE = cast<CompoundLiteralExpr>(E);
59084005b4b6b92e3a716fa4a792bea7d41bbb0102eAnders Carlsson      llvm::Constant* C = Visit(CLE->getInitializer());
591d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar      // FIXME: "Leaked" on failure.
592d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar      if (C)
5931c431b323d776362490bbf7cc796b74fedaf19f2Owen Anderson        C = new llvm::GlobalVariable(CGM.getModule(), C->getType(),
594d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar                                     E->getType().isConstQualified(),
595d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar                                     llvm::GlobalValue::InternalLinkage,
5961c431b323d776362490bbf7cc796b74fedaf19f2Owen Anderson                                     C, ".compoundliteral");
597e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson      return C;
59884005b4b6b92e3a716fa4a792bea7d41bbb0102eAnders Carlsson    }
5991a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor    case Expr::DeclRefExprClass:
6001a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor    case Expr::QualifiedDeclRefExprClass: {
6018e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor      NamedDecl *Decl = cast<DeclRefExpr>(E)->getDecl();
602e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson      if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl))
603b4880bab7fc1b61267cfd9a0ad52188e7a828cb3Chris Lattner        return CGM.GetAddrOfFunction(GlobalDecl(FD));
604248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff      if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) {
605d01b669f26703663da3515638e254fa7a987e860Daniel Dunbar        // We can never refer to a variable with local storage.
606d01b669f26703663da3515638e254fa7a987e860Daniel Dunbar        if (!VD->hasLocalStorage()) {
607d01b669f26703663da3515638e254fa7a987e860Daniel Dunbar          if (VD->isFileVarDecl() || VD->hasExternalStorage())
608d01b669f26703663da3515638e254fa7a987e860Daniel Dunbar            return CGM.GetAddrOfGlobalVar(VD);
609d01b669f26703663da3515638e254fa7a987e860Daniel Dunbar          else if (VD->isBlockVarDecl()) {
610d01b669f26703663da3515638e254fa7a987e860Daniel Dunbar            assert(CGF && "Can't access static local vars without CGF");
611d01b669f26703663da3515638e254fa7a987e860Daniel Dunbar            return CGF->GetAddrOfStaticLocalVar(VD);
612d01b669f26703663da3515638e254fa7a987e860Daniel Dunbar          }
613248a753f6b670692523c99afaeb8fe98f7ae3ca7Steve Naroff        }
614813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venancio      }
615546d94c77e4636a7dbce160c3c8e4157a2fe6d81Eli Friedman      break;
616e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson    }
6176143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar    case Expr::StringLiteralClass:
6186143293fa4366ee95d7e47e61bd030a34bf68b55Daniel Dunbar      return CGM.GetAddrOfConstantStringFromLiteral(cast<StringLiteral>(E));
619eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner    case Expr::ObjCEncodeExprClass:
620eaf2bb89eb2aad3b80673de30febe52df43c10ecChris Lattner      return CGM.GetAddrOfConstantStringFromObjCEncode(cast<ObjCEncodeExpr>(E));
6215ea7d07ea7d9f2b679c85df7cc45fcc6e157e396Anders Carlsson    case Expr::ObjCStringLiteralClass: {
6225ea7d07ea7d9f2b679c85df7cc45fcc6e157e396Anders Carlsson      ObjCStringLiteral* SL = cast<ObjCStringLiteral>(E);
62333fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff      llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(SL);
6243c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson      return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType()));
6255ea7d07ea7d9f2b679c85df7cc45fcc6e157e396Anders Carlsson    }
62635345640442594acbc29445fbde4874a6e4c860aChris Lattner    case Expr::PredefinedExprClass: {
62735345640442594acbc29445fbde4874a6e4c860aChris Lattner      // __func__/__FUNCTION__ -> "".  __PRETTY_FUNCTION__ -> "top level".
62835345640442594acbc29445fbde4874a6e4c860aChris Lattner      std::string Str;
62935345640442594acbc29445fbde4874a6e4c860aChris Lattner      if (cast<PredefinedExpr>(E)->getIdentType() ==
63035345640442594acbc29445fbde4874a6e4c860aChris Lattner          PredefinedExpr::PrettyFunction)
63135345640442594acbc29445fbde4874a6e4c860aChris Lattner        Str = "top level";
63235345640442594acbc29445fbde4874a6e4c860aChris Lattner
63335345640442594acbc29445fbde4874a6e4c860aChris Lattner      return CGM.GetAddrOfConstantCString(Str, ".tmp");
63435345640442594acbc29445fbde4874a6e4c860aChris Lattner    }
635f01158941ba4560c63150032073bb231ce38999eEli Friedman    case Expr::AddrLabelExprClass: {
636f01158941ba4560c63150032073bb231ce38999eEli Friedman      assert(CGF && "Invalid address of label expression outside function.");
6370032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      unsigned id =
6380032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson          CGF->GetIDForAddrOfLabel(cast<AddrLabelExpr>(E)->getLabel());
6390032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      llvm::Constant *C =
6400032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson            llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), id);
6413c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson      return llvm::ConstantExpr::getIntToPtr(C, ConvertType(E->getType()));
642f01158941ba4560c63150032073bb231ce38999eEli Friedman    }
6433941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman    case Expr::CallExprClass: {
6443941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman      CallExpr* CE = cast<CallExpr>(E);
6453c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor      if (CE->isBuiltinCall(CGM.getContext()) !=
6463c385e5f8d9008fff18597ca302be19fa86e51f6Douglas Gregor            Builtin::BI__builtin___CFStringMakeConstantString)
6473941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman        break;
6483941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman      const Expr *Arg = CE->getArg(0)->IgnoreParenCasts();
6493941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman      const StringLiteral *Literal = cast<StringLiteral>(Arg);
65033fdb738a6c125f4c788733897021b7c1a062b0cSteve Naroff      // FIXME: need to deal with UCN conversion issues.
6518d4141f83d9de379547cf05bd75d4c6cf894b189Steve Naroff      return CGM.GetAddrOfConstantCFString(Literal);
6523941b18b8e441c8c466efecd557de60b9a32d10bEli Friedman    }
653bd65cac8de63d108a681035782a71d42954b03abMike Stump    case Expr::BlockExprClass: {
6544de9fce48e42cc7ec1345c0fd21b3dbc5b9114c8Anders Carlsson      std::string FunctionName;
6554de9fce48e42cc7ec1345c0fd21b3dbc5b9114c8Anders Carlsson      if (CGF)
6564de9fce48e42cc7ec1345c0fd21b3dbc5b9114c8Anders Carlsson        FunctionName = CGF->CurFn->getName();
6574de9fce48e42cc7ec1345c0fd21b3dbc5b9114c8Anders Carlsson      else
6584de9fce48e42cc7ec1345c0fd21b3dbc5b9114c8Anders Carlsson        FunctionName = "global";
6594de9fce48e42cc7ec1345c0fd21b3dbc5b9114c8Anders Carlsson
6604de9fce48e42cc7ec1345c0fd21b3dbc5b9114c8Anders Carlsson      return CGM.GetAddrOfGlobalBlock(cast<BlockExpr>(E), FunctionName.c_str());
661bd65cac8de63d108a681035782a71d42954b03abMike Stump    }
662546d94c77e4636a7dbce160c3c8e4157a2fe6d81Eli Friedman    }
663d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar
664d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar    return 0;
665e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson  }
666e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson};
667e3d3b7d44ffb69ad7a756de50dda2f22441f5d0dAnders Carlsson
6683b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson}  // end anonymous namespace.
6693b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson
670813733577d33ec56479667b49e1bff42dc6bba90Lauro Ramos Venanciollvm::Constant *CodeGenModule::EmitConstantExpr(const Expr *E,
671e9352cc9818ba59e7cf88500ef048991c90f3821Anders Carlsson                                                QualType DestType,
6729619662a1d42e2008b865d3459c0677e149dad1bChris Lattner                                                CodeGenFunction *CGF) {
6734b3f9c06d548d3de576441a91ef986c6840bd983Anders Carlsson  Expr::EvalResult Result;
6744b3f9c06d548d3de576441a91ef986c6840bd983Anders Carlsson
6751e5dc6e12ccda4e783c67fa9ae11be419d7b0573Anders Carlsson  bool Success = false;
6761e5dc6e12ccda4e783c67fa9ae11be419d7b0573Anders Carlsson
67750c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  if (DestType->isReferenceType())
67850c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman    Success = E->EvaluateAsLValue(Result, Context);
67950c39ea4858265f3f5f42a0c624557ce2281936bEli Friedman  else
6801e5dc6e12ccda4e783c67fa9ae11be419d7b0573Anders Carlsson    Success = E->Evaluate(Result, Context);
6811e5dc6e12ccda4e783c67fa9ae11be419d7b0573Anders Carlsson
6821e5dc6e12ccda4e783c67fa9ae11be419d7b0573Anders Carlsson  if (Success) {
6834b3f9c06d548d3de576441a91ef986c6840bd983Anders Carlsson    assert(!Result.HasSideEffects &&
6844b3f9c06d548d3de576441a91ef986c6840bd983Anders Carlsson           "Constant expr should not have any side effects!");
6854b3f9c06d548d3de576441a91ef986c6840bd983Anders Carlsson    switch (Result.Val.getKind()) {
686a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    case APValue::Uninitialized:
687d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar      assert(0 && "Constant expressions should be initialized.");
688d60f2fbf69df08e952377b498c036f269395024dDaniel Dunbar      return 0;
6895a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson    case APValue::LValue: {
6901e5dc6e12ccda4e783c67fa9ae11be419d7b0573Anders Carlsson      const llvm::Type *DestTy = getTypes().ConvertTypeForMem(DestType);
6914b3f9c06d548d3de576441a91ef986c6840bd983Anders Carlsson      llvm::Constant *Offset =
6920032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson        llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
6934b3f9c06d548d3de576441a91ef986c6840bd983Anders Carlsson                               Result.Val.getLValueOffset());
6945a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson
695e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar      llvm::Constant *C;
6964b3f9c06d548d3de576441a91ef986c6840bd983Anders Carlsson      if (const Expr *LVBase = Result.Val.getLValueBase()) {
697e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        C = ConstExprEmitter(*this, CGF).EmitLValue(const_cast<Expr*>(LVBase));
698e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar
699e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        // Apply offset if necessary.
700e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        if (!Offset->isNullValue()) {
701e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar          const llvm::Type *Type =
7020032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson            llvm::PointerType::getUnqual(llvm::Type::getInt8Ty(VMContext));
7033c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson          llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, Type);
7043c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson          Casted = llvm::ConstantExpr::getGetElementPtr(Casted, &Offset, 1);
7053c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson          C = llvm::ConstantExpr::getBitCast(Casted, C->getType());
706e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        }
7075ea7d07ea7d9f2b679c85df7cc45fcc6e157e396Anders Carlsson
708e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        // Convert to the appropriate type; this could be an lvalue for
709e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        // an integer.
71012e330c46ab3a4a12dbbd4ad7e96ffdd399f5518Anders Carlsson        if (isa<llvm::PointerType>(DestTy))
7113c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson          return llvm::ConstantExpr::getBitCast(C, DestTy);
712e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar
7133c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson        return llvm::ConstantExpr::getPtrToInt(C, DestTy);
714e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar      } else {
715e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        C = Offset;
716e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar
717e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        // Convert to the appropriate type; this could be an lvalue for
718e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        // an integer.
71912e330c46ab3a4a12dbbd4ad7e96ffdd399f5518Anders Carlsson        if (isa<llvm::PointerType>(DestTy))
7203c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson          return llvm::ConstantExpr::getIntToPtr(C, DestTy);
721e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar
722e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        // If the types don't match this should only be a truncate.
72312e330c46ab3a4a12dbbd4ad7e96ffdd399f5518Anders Carlsson        if (C->getType() != DestTy)
7243c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson          return llvm::ConstantExpr::getTrunc(C, DestTy);
725e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar
726e20de512d88cf42a26ef994687d87fc6f5826625Daniel Dunbar        return C;
7275ea7d07ea7d9f2b679c85df7cc45fcc6e157e396Anders Carlsson      }
7285a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson    }
7297b30b1c866deb37fabe2b25684b7d238258d46adEli Friedman    case APValue::Int: {
7304a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson      llvm::Constant *C = llvm::ConstantInt::get(VMContext,
7314a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson                                                 Result.Val.getInt());
7325a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson
7330032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson      if (C->getType() == llvm::Type::getInt1Ty(VMContext)) {
7345a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson        const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType());
7353c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson        C = llvm::ConstantExpr::getZExt(C, BoolTy);
7365a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson      }
7375a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson      return C;
7387b30b1c866deb37fabe2b25684b7d238258d46adEli Friedman    }
739a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    case APValue::ComplexInt: {
740a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar      llvm::Constant *Complex[2];
741a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
7424a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson      Complex[0] = llvm::ConstantInt::get(VMContext,
7434a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson                                          Result.Val.getComplexIntReal());
7444a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson      Complex[1] = llvm::ConstantInt::get(VMContext,
7454a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson                                          Result.Val.getComplexIntImag());
746a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar
74747a434ff3d49e7906eda88e8e8242e4297725b32Owen Anderson      return llvm::ConstantStruct::get(VMContext, Complex, 2);
748a5fd07bbc5e4bae542c06643da3fbfe4967a9379Daniel Dunbar    }
7495a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson    case APValue::Float:
750bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson      return llvm::ConstantFP::get(VMContext, Result.Val.getFloat());
751aa432560efb1ff10aec504a68fe909cd9ae7c1a2Anders Carlsson    case APValue::ComplexFloat: {
752aa432560efb1ff10aec504a68fe909cd9ae7c1a2Anders Carlsson      llvm::Constant *Complex[2];
753aa432560efb1ff10aec504a68fe909cd9ae7c1a2Anders Carlsson
754bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson      Complex[0] = llvm::ConstantFP::get(VMContext,
755bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson                                         Result.Val.getComplexFloatReal());
756bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson      Complex[1] = llvm::ConstantFP::get(VMContext,
757bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson                                         Result.Val.getComplexFloatImag());
758aa432560efb1ff10aec504a68fe909cd9ae7c1a2Anders Carlsson
75947a434ff3d49e7906eda88e8e8242e4297725b32Owen Anderson      return llvm::ConstantStruct::get(VMContext, Complex, 2);
760aa432560efb1ff10aec504a68fe909cd9ae7c1a2Anders Carlsson    }
7613d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman    case APValue::Vector: {
7623d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman      llvm::SmallVector<llvm::Constant *, 4> Inits;
7633d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman      unsigned NumElts = Result.Val.getVectorLength();
7643d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman
7653d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman      for (unsigned i = 0; i != NumElts; ++i) {
7663d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman        APValue &Elt = Result.Val.getVectorElt(i);
7673d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman        if (Elt.isInt())
7684a28d5deeba33722aa009eab488591fb9055cc7eOwen Anderson          Inits.push_back(llvm::ConstantInt::get(VMContext, Elt.getInt()));
7693d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman        else
770bc0a2226c7fcd18b29b6846049e2cfcb872d3593Owen Anderson          Inits.push_back(llvm::ConstantFP::get(VMContext, Elt.getFloat()));
7713d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman      }
7724a28932dba03132dabbe70abdadcaae468dd7933Owen Anderson      return llvm::ConstantVector::get(&Inits[0], Inits.size());
7733d309f9d62a6f9f634b869937139d533ccd7265bNate Begeman    }
7745a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson    }
7755a9a457ecf66343ae8b64baa7909007837b2a2cdAnders Carlsson  }
7767dfa639e9274b9f40c8f207e35c0fcbfe75d04f8Eli Friedman
7777dfa639e9274b9f40c8f207e35c0fcbfe75d04f8Eli Friedman  llvm::Constant* C = ConstExprEmitter(*this, CGF).Visit(const_cast<Expr*>(E));
7780032b2781b4deb131f8c9b7968f2030bf2489cddOwen Anderson  if (C && C->getType() == llvm::Type::getInt1Ty(VMContext)) {
7797dfa639e9274b9f40c8f207e35c0fcbfe75d04f8Eli Friedman    const llvm::Type *BoolTy = getTypes().ConvertTypeForMem(E->getType());
7803c4972def972f8ca44dcd0561779a12aaa6fec97Owen Anderson    C = llvm::ConstantExpr::getZExt(C, BoolTy);
7817dfa639e9274b9f40c8f207e35c0fcbfe75d04f8Eli Friedman  }
7827dfa639e9274b9f40c8f207e35c0fcbfe75d04f8Eli Friedman  return C;
7833b1d57b623702865e4158b00cb1d984ba6dd5d50Anders Carlsson}
7840f59312e7b625fa5821a63db65377d4b3b667e99Eli Friedman
7850f59312e7b625fa5821a63db65377d4b3b667e99Eli Friedmanllvm::Constant *CodeGenModule::EmitNullConstant(QualType T) {
786237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson  if (const ConstantArrayType *CAT = Context.getAsConstantArrayType(T)) {
787237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson
788237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson    QualType ElementTy = CAT->getElementType();
789237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson
790237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson    // FIXME: Handle arrays of structs that contain member pointers.
791237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson    if (Context.getBaseElementType(ElementTy)->isMemberPointerType()) {
792237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson      llvm::Constant *Element = EmitNullConstant(ElementTy);
793237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson      uint64_t NumElements = CAT->getSize().getZExtValue();
794237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson      std::vector<llvm::Constant *> Array(NumElements);
795237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson      for (uint64_t i = 0; i != NumElements; ++i)
796237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson        Array[i] = Element;
797237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson
798237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson      const llvm::ArrayType *ATy =
799237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson        cast<llvm::ArrayType>(getTypes().ConvertTypeForMem(T));
800237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson      return llvm::ConstantArray::get(ATy, Array);
801237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson    }
802237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson  }
803fc3eaa47fa2ef70ab21131005c328adda3020737Anders Carlsson
804fc3eaa47fa2ef70ab21131005c328adda3020737Anders Carlsson  if (const RecordType *RT = T->getAs<RecordType>()) {
805fc3eaa47fa2ef70ab21131005c328adda3020737Anders Carlsson    const CGRecordLayout *Layout = Types.getCGRecordLayout(RT->getDecl());
806fc3eaa47fa2ef70ab21131005c328adda3020737Anders Carlsson    if (Layout->containsMemberPointer()) {
807fc3eaa47fa2ef70ab21131005c328adda3020737Anders Carlsson      assert(0 && "FIXME: No support for structs with member pointers yet!");
808fc3eaa47fa2ef70ab21131005c328adda3020737Anders Carlsson    }
809fc3eaa47fa2ef70ab21131005c328adda3020737Anders Carlsson
810fc3eaa47fa2ef70ab21131005c328adda3020737Anders Carlsson  }
811237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson
812237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson  // FIXME: Handle structs that contain member pointers.
813237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson  if (T->isMemberPointerType())
814237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson    return llvm::Constant::getAllOnesValue(getTypes().ConvertTypeForMem(T));
815237957c45774713f81fbd5394b3db4317fef0938Anders Carlsson
816b0d0ea042116c1f451d3db8ceff9f1dd92bc36d2Anders Carlsson  return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T));
8170f59312e7b625fa5821a63db65377d4b3b667e99Eli Friedman}
818