CGExprAgg.cpp revision b1851249d787f573b9e1312fff8ca4bbcf351f10
1566b6ce741c742cc3f8cb85e2376ec4a3490ff5fChris Lattner//===--- CGExprAgg.cpp - Emit LLVM Code from Aggregate Expressions --------===// 2af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner// 3af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner// The LLVM Compiler Infrastructure 4af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 7af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner// 8af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner//===----------------------------------------------------------------------===// 9af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner// 10af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner// This contains code to emit Aggregate Expr nodes as LLVM code. 11af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner// 12af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner//===----------------------------------------------------------------------===// 13af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner 14af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattner#include "CodeGenFunction.h" 15883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner#include "CodeGenModule.h" 16883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner#include "clang/AST/AST.h" 17883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner#include "llvm/Constants.h" 18883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner#include "llvm/Function.h" 19636c3d04673da8c8605d7e45640a2ff7aec648f1Devang Patel#include "llvm/GlobalVariable.h" 209c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner#include "llvm/Support/Compiler.h" 21f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner#include "llvm/Intrinsics.h" 22af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattnerusing namespace clang; 23af6f528b2bd6c3ee517e02d346238addb74159ccChris Lattnerusing namespace CodeGen; 24883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 259c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner//===----------------------------------------------------------------------===// 269c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner// Aggregate Expression Emitter 279c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner//===----------------------------------------------------------------------===// 289c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 299c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattnernamespace { 309c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattnerclass VISIBILITY_HIDDEN AggExprEmitter : public StmtVisitor<AggExprEmitter> { 319c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner CodeGenFunction &CGF; 3250b36741673258aaebcd3c7fe1260031901cae57Chris Lattner llvm::IRBuilder &Builder; 339c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner llvm::Value *DestPtr; 349c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner bool VolatileDest; 359c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattnerpublic: 369c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner AggExprEmitter(CodeGenFunction &cgf, llvm::Value *destPtr, bool volatileDest) 37bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner : CGF(cgf), Builder(CGF.Builder), 38bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner DestPtr(destPtr), VolatileDest(volatileDest) { 399c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner } 409c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 41ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner //===--------------------------------------------------------------------===// 42ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner // Utilities 43ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner //===--------------------------------------------------------------------===// 44ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner 459c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner /// EmitAggLoadOfLValue - Given an expression with aggregate type that 469c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner /// represents a value lvalue, this method emits the address of the lvalue, 479c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner /// then loads the result into DestPtr. 489c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner void EmitAggLoadOfLValue(const Expr *E); 499c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 50bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner void EmitAggregateCopy(llvm::Value *DestPtr, llvm::Value *SrcPtr, 51bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner QualType EltTy); 5213e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio 5313e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio void EmitAggregateClear(llvm::Value *DestPtr, QualType Ty); 5413e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio 5513e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio void EmitNonConstInit(InitListExpr *E); 56922696f03ec9637449e2cba260493808b4977cd3Eli Friedman 57ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner //===--------------------------------------------------------------------===// 58ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner // Visitor Methods 59ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner //===--------------------------------------------------------------------===// 60ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner 619c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner void VisitStmt(Stmt *S) { 62dc4d280136d3301fcbf3c7b4b2782c8bd804342cChris Lattner CGF.WarnUnsupported(S, "aggregate expression"); 639c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner } 649c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner void VisitParenExpr(ParenExpr *PE) { Visit(PE->getSubExpr()); } 659c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 669c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner // l-values. 679b73b39f6fbf987acbbe6570d557d13f07c7e0f7Seo Sanghyeon void VisitDeclRefExpr(DeclRefExpr *DRE) { EmitAggLoadOfLValue(DRE); } 689b73b39f6fbf987acbbe6570d557d13f07c7e0f7Seo Sanghyeon void VisitMemberExpr(MemberExpr *ME) { EmitAggLoadOfLValue(ME); } 699b73b39f6fbf987acbbe6570d557d13f07c7e0f7Seo Sanghyeon void VisitUnaryDeref(UnaryOperator *E) { EmitAggLoadOfLValue(E); } 70ad6ebd6efcc30cc54540ed9d92256b410519ec0fSeo Sanghyeon void VisitStringLiteral(StringLiteral *E) { EmitAggLoadOfLValue(E); } 71b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman void VisitCompoundLiteralExpr(CompoundLiteralExpr *E) 72b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman { EmitAggLoadOfLValue(E); } 739b73b39f6fbf987acbbe6570d557d13f07c7e0f7Seo Sanghyeon 749b73b39f6fbf987acbbe6570d557d13f07c7e0f7Seo Sanghyeon void VisitArraySubscriptExpr(ArraySubscriptExpr *E) { 759b73b39f6fbf987acbbe6570d557d13f07c7e0f7Seo Sanghyeon EmitAggLoadOfLValue(E); 769b73b39f6fbf987acbbe6570d557d13f07c7e0f7Seo Sanghyeon } 779c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 789c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner // Operators. 799c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner // case Expr::UnaryOperatorClass: 809c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner // case Expr::CastExprClass: 81e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlsson void VisitImplicitCastExpr(ImplicitCastExpr *E); 82148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson void VisitCallExpr(const CallExpr *E); 83b2d963f527674275c9109252474948368b6e6161Chris Lattner void VisitStmtExpr(const StmtExpr *E); 849c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner void VisitBinaryOperator(const BinaryOperator *BO); 8503d6fb99224c36935c9af9f4785cb33453c99b2bChris Lattner void VisitBinAssign(const BinaryOperator *E); 86796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman void VisitOverloadExpr(const OverloadExpr *E); 8707fa52ab33a75d7a5736ea5bd0d4e3134fb10c7eEli Friedman void VisitBinComma(const BinaryOperator *E); 889c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 899c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 909c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner void VisitConditionalOperator(const ConditionalOperator *CO); 91636c3d04673da8c8605d7e45640a2ff7aec648f1Devang Patel void VisitInitListExpr(InitListExpr *E); 9204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner void VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) { 9304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner Visit(DAE->getExpr()); 9404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner } 95b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman void VisitVAArgExpr(VAArgExpr *E); 96f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 97f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner void EmitInitializationToLValue(Expr *E, LValue Address); 98f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner void EmitNullInitializationToLValue(LValue Address, QualType T); 999c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner // case Expr::ChooseExprClass: 100305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio 1019c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner}; 1029c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner} // end anonymous namespace. 1039c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 104ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner//===----------------------------------------------------------------------===// 105ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner// Utilities 106ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner//===----------------------------------------------------------------------===// 1079c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner 10813e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venanciovoid AggExprEmitter::EmitAggregateClear(llvm::Value *DestPtr, QualType Ty) { 1099b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner assert(!Ty->isAnyComplexType() && "Shouldn't happen for complex"); 11013e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio 11113e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio // Aggregate assignment turns into llvm.memset. 11213e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 11313e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio if (DestPtr->getType() != BP) 11413e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio DestPtr = Builder.CreateBitCast(DestPtr, BP, "tmp"); 11513e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio 11613e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio // Get size and alignment info for this aggregate. 11798be4943e8dc4f3905629a7102668960873cf863Chris Lattner std::pair<uint64_t, unsigned> TypeInfo = CGF.getContext().getTypeInfo(Ty); 11813e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio 11913e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio // FIXME: Handle variable sized types. 12013e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio const llvm::Type *IntPtr = llvm::IntegerType::get(CGF.LLVMPointerWidth); 12113e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio 12213e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio llvm::Value *MemSetOps[4] = { 12313e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio DestPtr, 12413e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio llvm::ConstantInt::getNullValue(llvm::Type::Int8Ty), 12513e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio // TypeInfo.first describes size in bits. 12613e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio llvm::ConstantInt::get(IntPtr, TypeInfo.first/8), 12713e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio llvm::ConstantInt::get(llvm::Type::Int32Ty, TypeInfo.second/8) 12813e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio }; 12913e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio 13013e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio Builder.CreateCall(CGF.CGM.getMemSetFn(), MemSetOps, MemSetOps+4); 13113e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio} 13213e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio 133bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattnervoid AggExprEmitter::EmitAggregateCopy(llvm::Value *DestPtr, 134bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner llvm::Value *SrcPtr, QualType Ty) { 1359b2dc287177394a8f73833e2ad4f7ca8cd6f22bbChris Lattner assert(!Ty->isAnyComplexType() && "Shouldn't happen for complex"); 136bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner 1370c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman // Aggregate assignment turns into llvm.memmove. 138ddc23f3e6fdc4f83dd46ef7e20394cfbd6063ff9Christopher Lamb const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 139bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner if (DestPtr->getType() != BP) 140bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner DestPtr = Builder.CreateBitCast(DestPtr, BP, "tmp"); 141bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner if (SrcPtr->getType() != BP) 142bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner SrcPtr = Builder.CreateBitCast(SrcPtr, BP, "tmp"); 143bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner 144bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner // Get size and alignment info for this aggregate. 14598be4943e8dc4f3905629a7102668960873cf863Chris Lattner std::pair<uint64_t, unsigned> TypeInfo = CGF.getContext().getTypeInfo(Ty); 146bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner 147bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner // FIXME: Handle variable sized types. 148bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner const llvm::Type *IntPtr = llvm::IntegerType::get(CGF.LLVMPointerWidth); 149bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner 1500c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman llvm::Value *MemMoveOps[4] = { 151bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner DestPtr, SrcPtr, 152636c3d04673da8c8605d7e45640a2ff7aec648f1Devang Patel // TypeInfo.first describes size in bits. 153636c3d04673da8c8605d7e45640a2ff7aec648f1Devang Patel llvm::ConstantInt::get(IntPtr, TypeInfo.first/8), 15413e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio llvm::ConstantInt::get(llvm::Type::Int32Ty, TypeInfo.second/8) 155bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner }; 156bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner 1570c99509927a0c7a48490486b9fec287b63e5c09cEli Friedman Builder.CreateCall(CGF.CGM.getMemMoveFn(), MemMoveOps, MemMoveOps+4); 158bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner} 159bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner 160bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner 161883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner/// EmitAggLoadOfLValue - Given an expression with aggregate type that 162883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner/// represents a value lvalue, this method emits the address of the lvalue, 163883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner/// then loads the result into DestPtr. 1649c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattnervoid AggExprEmitter::EmitAggLoadOfLValue(const Expr *E) { 1659c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner LValue LV = CGF.EmitLValue(E); 166883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner assert(LV.isSimple() && "Can't have aggregate bitfield, vector, etc"); 167883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner llvm::Value *SrcPtr = LV.getAddress(); 168883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 169883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner // If the result is ignored, don't copy from the value. 170883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner if (DestPtr == 0) 171883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner // FIXME: If the source is volatile, we must read from it. 172883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner return; 173883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 174bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner EmitAggregateCopy(DestPtr, SrcPtr, E->getType()); 175883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner} 176883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 177ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner//===----------------------------------------------------------------------===// 178ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner// Visitor Methods 179ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner//===----------------------------------------------------------------------===// 180ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner 181e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlssonvoid AggExprEmitter::VisitImplicitCastExpr(ImplicitCastExpr *E) 182e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlsson{ 183e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlsson QualType STy = E->getSubExpr()->getType().getCanonicalType(); 184e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlsson QualType Ty = E->getType().getCanonicalType(); 185ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman 186ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman assert(CGF.getContext().typesAreCompatible( 187ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman STy.getUnqualifiedType(), Ty.getUnqualifiedType()) 188ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman && "Implicit cast types must be compatible"); 189e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlsson 190e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlsson Visit(E->getSubExpr()); 191e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlsson} 192e4707ff0bb48add651c6a1ad9acfcb22609462d1Anders Carlsson 193148fe6772733166c720e28b7bb5084af6e624b44Anders Carlssonvoid AggExprEmitter::VisitCallExpr(const CallExpr *E) 194148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson{ 195148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson RValue RV = CGF.EmitCallExpr(E); 196148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson assert(RV.isAggregate() && "Return value must be aggregate value!"); 197148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson 198148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson // If the result is ignored, don't copy from the value. 199148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson if (DestPtr == 0) 200796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman // FIXME: If the source is volatile, we must read from it. 201796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman return; 202796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman 203796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType()); 204796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman} 205796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman 206796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begemanvoid AggExprEmitter::VisitOverloadExpr(const OverloadExpr *E) 207796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman{ 208796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman RValue RV = CGF.EmitCallExpr(E->getFn(), E->arg_begin(), 209796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman E->getNumArgs(CGF.getContext())); 210796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman assert(RV.isAggregate() && "Return value must be aggregate value!"); 211796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman 212796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman // If the result is ignored, don't copy from the value. 213796ef3d4a32ce8d9e76df0d5bcab07db97883064Nate Begeman if (DestPtr == 0) 214148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson // FIXME: If the source is volatile, we must read from it. 215148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson return; 216148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson 217148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson EmitAggregateCopy(DestPtr, RV.getAggregateAddr(), E->getType()); 218148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson} 219148fe6772733166c720e28b7bb5084af6e624b44Anders Carlsson 22007fa52ab33a75d7a5736ea5bd0d4e3134fb10c7eEli Friedmanvoid AggExprEmitter::VisitBinComma(const BinaryOperator *E) 22107fa52ab33a75d7a5736ea5bd0d4e3134fb10c7eEli Friedman{ 22207fa52ab33a75d7a5736ea5bd0d4e3134fb10c7eEli Friedman CGF.EmitAnyExpr(E->getLHS()); 22307fa52ab33a75d7a5736ea5bd0d4e3134fb10c7eEli Friedman CGF.EmitAggExpr(E->getRHS(), DestPtr, false); 22407fa52ab33a75d7a5736ea5bd0d4e3134fb10c7eEli Friedman} 22507fa52ab33a75d7a5736ea5bd0d4e3134fb10c7eEli Friedman 226b2d963f527674275c9109252474948368b6e6161Chris Lattnervoid AggExprEmitter::VisitStmtExpr(const StmtExpr *E) { 227b2d963f527674275c9109252474948368b6e6161Chris Lattner CGF.EmitCompoundStmt(*E->getSubStmt(), true, DestPtr, VolatileDest); 228b2d963f527674275c9109252474948368b6e6161Chris Lattner} 229b2d963f527674275c9109252474948368b6e6161Chris Lattner 2309c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattnervoid AggExprEmitter::VisitBinaryOperator(const BinaryOperator *E) { 231dc4d280136d3301fcbf3c7b4b2782c8bd804342cChris Lattner CGF.WarnUnsupported(E, "aggregate binary expression"); 232ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner} 233ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner 23403d6fb99224c36935c9af9f4785cb33453c99b2bChris Lattnervoid AggExprEmitter::VisitBinAssign(const BinaryOperator *E) { 235ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman // For an assignment to work, the value on the right has 236ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman // to be compatible with the value on the left. 237ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman assert(CGF.getContext().typesAreCompatible( 238ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman E->getLHS()->getType().getUnqualifiedType(), 239ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman E->getRHS()->getType().getUnqualifiedType()) 240ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman && "Invalid assignment"); 2419c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner LValue LHS = CGF.EmitLValue(E->getLHS()); 242883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 243883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner // Codegen the RHS so that it stores directly into the LHS. 2449c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner CGF.EmitAggExpr(E->getRHS(), LHS.getAddress(), false /*FIXME: VOLATILE LHS*/); 245883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 246ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman if (DestPtr == 0) 247ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman return; 248ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman 249883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner // If the result of the assignment is used, copy the RHS there also. 250ff6e2b7d31b0f5494f583419e5061c32ea4e6180Eli Friedman EmitAggregateCopy(DestPtr, LHS.getAddress(), E->getType()); 251883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner} 252883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 2539c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattnervoid AggExprEmitter::VisitConditionalOperator(const ConditionalOperator *E) { 254984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif llvm::BasicBlock *LHSBlock = llvm::BasicBlock::Create("cond.?"); 255984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif llvm::BasicBlock *RHSBlock = llvm::BasicBlock::Create("cond.:"); 256984d0b414bc76d3530b9bc55a5a55834ba76c607Gabor Greif llvm::BasicBlock *ContBlock = llvm::BasicBlock::Create("cond.cont"); 257883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 2589c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner llvm::Value *Cond = CGF.EvaluateExprAsBool(E->getCond()); 259bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner Builder.CreateCondBr(Cond, LHSBlock, RHSBlock); 260883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 2619c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner CGF.EmitBlock(LHSBlock); 262883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 263883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner // Handle the GNU extension for missing LHS. 264883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner assert(E->getLHS() && "Must have LHS for aggregate value"); 265883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 266c748f27f4055f5732a3c231f31dc7325c5279020Chris Lattner Visit(E->getLHS()); 267bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner Builder.CreateBr(ContBlock); 268bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner LHSBlock = Builder.GetInsertBlock(); 269883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 2709c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner CGF.EmitBlock(RHSBlock); 271883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 272c748f27f4055f5732a3c231f31dc7325c5279020Chris Lattner Visit(E->getRHS()); 273bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner Builder.CreateBr(ContBlock); 274bfc0c1ae4b505b52b36f572a9641f99e76879cabChris Lattner RHSBlock = Builder.GetInsertBlock(); 275883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner 2769c03356918aee078e925c35f9854dfdf2492dfc3Chris Lattner CGF.EmitBlock(ContBlock); 277883f6a7cc7dccb1d675e27121a82614d63492a8dChris Lattner} 278ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner 279b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedmanvoid AggExprEmitter::VisitVAArgExpr(VAArgExpr *VE) { 280b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman llvm::Value *ArgValue = CGF.EmitLValue(VE->getSubExpr()).getAddress(); 281b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman llvm::Value *V = Builder.CreateVAArg(ArgValue, CGF.ConvertType(VE->getType())); 282b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman if (DestPtr) 283b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman Builder.CreateStore(V, DestPtr); 284b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman} 285b1851249d787f573b9e1312fff8ca4bbcf351f10Eli Friedman 28613e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venanciovoid AggExprEmitter::EmitNonConstInit(InitListExpr *E) { 287305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio 28813e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio const llvm::PointerType *APType = 28913e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio cast<llvm::PointerType>(DestPtr->getType()); 29013e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio const llvm::Type *DestType = APType->getElementType(); 291305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio 29213e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio if (const llvm::ArrayType *AType = dyn_cast<llvm::ArrayType>(DestType)) { 29313e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio unsigned NumInitElements = E->getNumInits(); 294305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio 295305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio unsigned i; 296305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio for (i = 0; i != NumInitElements; ++i) { 29736b6a0a63e87803a85080c639ad8b61e8bb5f9eeChris Lattner llvm::Value *NextVal = Builder.CreateStructGEP(DestPtr, i, ".array"); 29813e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio Expr *Init = E->getInit(i); 29913e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio if (isa<InitListExpr>(Init)) 30013e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio CGF.EmitAggExpr(Init, NextVal, VolatileDest); 30113e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio else 30213e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio Builder.CreateStore(CGF.EmitScalarExpr(Init), NextVal); 303305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio } 304636c3d04673da8c8605d7e45640a2ff7aec648f1Devang Patel 305305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio // Emit remaining default initializers 306305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio unsigned NumArrayElements = AType->getNumElements(); 30713e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio QualType QType = E->getInit(0)->getType(); 30813e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio const llvm::Type *EType = AType->getElementType(); 309305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio for (/*Do not initialize i*/; i < NumArrayElements; ++i) { 31036b6a0a63e87803a85080c639ad8b61e8bb5f9eeChris Lattner llvm::Value *NextVal = Builder.CreateStructGEP(DestPtr, i, ".array"); 311d79a726dc3c8af61b486948c97a183c7fe5b0179Dan Gohman if (EType->isSingleValueType()) 31213e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio Builder.CreateStore(llvm::Constant::getNullValue(EType), NextVal); 31313e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio else 31413e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio EmitAggregateClear(NextVal, QType); 315305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio } 31613e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio } else 31713e22cf1ee6ecb554e329c16edfb5bcbfaee6050Lauro Ramos Venancio assert(false && "Invalid initializer"); 318305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio} 319636c3d04673da8c8605d7e45640a2ff7aec648f1Devang Patel 320f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattnervoid AggExprEmitter::EmitInitializationToLValue(Expr* E, LValue LV) { 321f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // FIXME: Are initializers affected by volatile? 322f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (E->getType()->isComplexType()) { 323f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner CGF.EmitComplexExprIntoAddr(E, LV.getAddress(), false); 324c8ba9614ca5469c3ae259e3ec09792f4b8969397Eli Friedman } else if (CGF.hasAggregateLLVMType(E->getType())) { 325c8ba9614ca5469c3ae259e3ec09792f4b8969397Eli Friedman CGF.EmitAnyExpr(E, LV.getAddress(), false); 326c8ba9614ca5469c3ae259e3ec09792f4b8969397Eli Friedman } else { 327c8ba9614ca5469c3ae259e3ec09792f4b8969397Eli Friedman CGF.EmitStoreThroughLValue(CGF.EmitAnyExpr(E), LV, E->getType()); 328f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } 329f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner} 330305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio 331f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattnervoid AggExprEmitter::EmitNullInitializationToLValue(LValue LV, QualType T) { 332f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (!CGF.hasAggregateLLVMType(T)) { 333f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // For non-aggregates, we can store zero 334f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner const llvm::Type *T = 335f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner cast<llvm::PointerType>(LV.getAddress()->getType())->getElementType(); 336f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner Builder.CreateStore(llvm::Constant::getNullValue(T), LV.getAddress()); 337f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } else { 338f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // Otherwise, just memset the whole thing to zero. This is legal 339f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // because in LLVM, all default initializers are guaranteed to have a 340f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // bit pattern of all zeros. 341f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // There's a potential optimization opportunity in combining 342f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // memsets; that would be easy for arrays, but relatively 343f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // difficult for structures with the current code. 344f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner llvm::Value *MemSet = CGF.CGM.getIntrinsic(llvm::Intrinsic::memset_i64); 345f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner uint64_t Size = CGF.getContext().getTypeSize(T); 346f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 347f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner const llvm::Type *BP = llvm::PointerType::getUnqual(llvm::Type::Int8Ty); 348f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner llvm::Value* DestPtr = Builder.CreateBitCast(LV.getAddress(), BP, "tmp"); 3493eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner Builder.CreateCall4(MemSet, DestPtr, 3503eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner llvm::ConstantInt::get(llvm::Type::Int8Ty, 0), 3513eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner llvm::ConstantInt::get(llvm::Type::Int64Ty, Size/8), 3523eae03e7d165f20a863a9a4d7122ba2a691ab16dChris Lattner llvm::ConstantInt::get(llvm::Type::Int32Ty, 0)); 353f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } 354f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner} 355305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio 356f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattnervoid AggExprEmitter::VisitInitListExpr(InitListExpr *E) { 357f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (E->isConstantExpr(CGF.getContext(), 0)) { 358f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // FIXME: call into const expr emitter so that we can emit 359f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // a memcpy instead of storing the individual members. 360f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // This is purely for perf; both codepaths lead to equivalent 361f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // (although not necessarily identical) code. 362f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // It's worth noting that LLVM keeps on getting smarter, though, 363f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // so it might not be worth bothering. 364f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } 365f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 366f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // Handle initialization of an array. 367f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (E->getType()->isArrayType()) { 368f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner const llvm::PointerType *APType = 369f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner cast<llvm::PointerType>(DestPtr->getType()); 370f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner const llvm::ArrayType *AType = 371f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner cast<llvm::ArrayType>(APType->getElementType()); 372f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 373f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner uint64_t NumInitElements = E->getNumInits(); 374922696f03ec9637449e2cba260493808b4977cd3Eli Friedman 375922696f03ec9637449e2cba260493808b4977cd3Eli Friedman if (E->getNumInits() > 0 && 376922696f03ec9637449e2cba260493808b4977cd3Eli Friedman E->getType().getCanonicalType().getUnqualifiedType() == 377922696f03ec9637449e2cba260493808b4977cd3Eli Friedman E->getInit(0)->getType().getCanonicalType().getUnqualifiedType()) { 378922696f03ec9637449e2cba260493808b4977cd3Eli Friedman EmitAggLoadOfLValue(E->getInit(0)); 379922696f03ec9637449e2cba260493808b4977cd3Eli Friedman return; 380922696f03ec9637449e2cba260493808b4977cd3Eli Friedman } 381922696f03ec9637449e2cba260493808b4977cd3Eli Friedman 382f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner uint64_t NumArrayElements = AType->getNumElements(); 383f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner QualType ElementType = E->getType()->getAsArrayType()->getElementType(); 384f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 385f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner for (uint64_t i = 0; i != NumArrayElements; ++i) { 386f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner llvm::Value *NextVal = Builder.CreateStructGEP(DestPtr, i, ".array"); 387f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (i < NumInitElements) 388f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner EmitInitializationToLValue(E->getInit(i), LValue::MakeAddr(NextVal)); 389f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner else 390f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner EmitNullInitializationToLValue(LValue::MakeAddr(NextVal), 391f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner ElementType); 392f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } 393305762c08975cd6e0bebd684ca910fa208792483Lauro Ramos Venancio return; 394f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } 395f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 396f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner assert(E->getType()->isRecordType() && "Only support structs/unions here!"); 397f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 398f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // Do struct initialization; this code just sets each individual member 399f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // to the approprate value. This makes bitfield support automatic; 400f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // the disadvantage is that the generated code is more difficult for 401f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // the optimizer, especially with bitfields. 402f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner unsigned NumInitElements = E->getNumInits(); 403f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner RecordDecl *SD = E->getType()->getAsRecordType()->getDecl(); 404f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner unsigned NumMembers = SD->getNumMembers() - SD->hasFlexibleArrayMember(); 405f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner unsigned CurInitVal = 0; 406f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner bool isUnion = E->getType()->isUnionType(); 407f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 408f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // Here we iterate over the fields; this makes it simpler to both 409f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // default-initialize fields and skip over unnamed fields. 410f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner for (unsigned CurFieldNo = 0; CurFieldNo != NumMembers; ++CurFieldNo) { 411f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (CurInitVal >= NumInitElements) { 412f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // No more initializers; we're done. 413f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner break; 414145cd89f9233d375381aa13bd28b2d36f83e6181Lauro Ramos Venancio } 415f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 416f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner FieldDecl *CurField = SD->getMember(CurFieldNo); 417f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (CurField->getIdentifier() == 0) { 418f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // Initializers can't initialize unnamed fields, e.g. "int : 20;" 419f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner continue; 420f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } 421f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner LValue FieldLoc = CGF.EmitLValueForField(DestPtr, CurField, isUnion); 422f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (CurInitVal < NumInitElements) { 423f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // Store the initializer into the field 424f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // This will probably have to get a bit smarter when we support 425f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // designators in initializers 426f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner EmitInitializationToLValue(E->getInit(CurInitVal++), FieldLoc); 427f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } else { 428f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // We're out of initalizers; default-initialize to null 429f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner EmitNullInitializationToLValue(FieldLoc, CurField->getType()); 430f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner } 431f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner 432f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // Unions only initialize one field. 433f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // (things can get weird with designators, but they aren't 434f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner // supported yet.) 435f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner if (E->getType()->isUnionType()) 436f81557cb719dd0d1ce3713f050fb76b0a0cb729aChris Lattner break; 437145cd89f9233d375381aa13bd28b2d36f83e6181Lauro Ramos Venancio } 438636c3d04673da8c8605d7e45640a2ff7aec648f1Devang Patel} 439636c3d04673da8c8605d7e45640a2ff7aec648f1Devang Patel 440ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner//===----------------------------------------------------------------------===// 441ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner// Entry Points into this File 442ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner//===----------------------------------------------------------------------===// 443ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner 444ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner/// EmitAggExpr - Emit the computation of the specified expression of 445ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner/// aggregate type. The result is computed into DestPtr. Note that if 446ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner/// DestPtr is null, the value of the aggregate expression is not needed. 447ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattnervoid CodeGenFunction::EmitAggExpr(const Expr *E, llvm::Value *DestPtr, 448ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner bool VolatileDest) { 449ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner assert(E && hasAggregateLLVMType(E->getType()) && 450ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner "Invalid aggregate expression to emit"); 451ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner 452ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner AggExprEmitter(*this, DestPtr, VolatileDest).Visit(const_cast<Expr*>(E)); 453ee755f9118c4061b21e0a787d4a20484df36f603Chris Lattner} 454