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