| OLD | NEW |
| 1 //===--- CGExprAgg.cpp - Emit LLVM Code from Aggregate Expressions --------===// | 1 //===--- CGExprAgg.cpp - Emit LLVM Code from Aggregate Expressions --------===// |
| 2 // | 2 // |
| 3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 // | 9 // |
| 10 // This contains code to emit Aggregate Expr nodes as LLVM code. | 10 // This contains code to emit Aggregate Expr nodes as LLVM code. |
| (...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 921 | 921 |
| 922 void AggExprEmitter::VisitChooseExpr(const ChooseExpr *CE) { | 922 void AggExprEmitter::VisitChooseExpr(const ChooseExpr *CE) { |
| 923 Visit(CE->getChosenSubExpr()); | 923 Visit(CE->getChosenSubExpr()); |
| 924 } | 924 } |
| 925 | 925 |
| 926 void AggExprEmitter::VisitVAArgExpr(VAArgExpr *VE) { | 926 void AggExprEmitter::VisitVAArgExpr(VAArgExpr *VE) { |
| 927 llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr()); | 927 llvm::Value *ArgValue = CGF.EmitVAListRef(VE->getSubExpr()); |
| 928 llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType()); | 928 llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, VE->getType()); |
| 929 | 929 |
| 930 if (!ArgPtr) { | 930 if (!ArgPtr) { |
| 931 CGF.ErrorUnsupported(VE, "aggregate va_arg expression"); | 931 // If EmitVAArg fails, we fall back to the LLVM instruction. |
| 932 llvm::Value *Val = |
| 933 Builder.CreateVAArg(ArgValue, CGF.ConvertType(VE->getType())); |
| 934 if (!Dest.isIgnored()) |
| 935 Builder.CreateStore(Val, Dest.getAddr()); |
| 932 return; | 936 return; |
| 933 } | 937 } |
| 934 | 938 |
| 935 EmitFinalDestCopy(VE->getType(), CGF.MakeAddrLValue(ArgPtr, VE->getType())); | 939 EmitFinalDestCopy(VE->getType(), CGF.MakeAddrLValue(ArgPtr, VE->getType())); |
| 936 } | 940 } |
| 937 | 941 |
| 938 void AggExprEmitter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { | 942 void AggExprEmitter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { |
| 939 // Ensure that we have a slot, but if we already do, remember | 943 // Ensure that we have a slot, but if we already do, remember |
| 940 // whether it was externally destructed. | 944 // whether it was externally destructed. |
| 941 bool wasExternallyDestructed = Dest.isExternallyDestructed(); | 945 bool wasExternallyDestructed = Dest.isExternallyDestructed(); |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1466 // memcpy, as well as the TBAA tags for the members of the struct, in case | 1470 // memcpy, as well as the TBAA tags for the members of the struct, in case |
| 1467 // the optimizer wishes to expand it in to scalar memory operations. | 1471 // the optimizer wishes to expand it in to scalar memory operations. |
| 1468 llvm::MDNode *TBAAStructTag = CGM.getTBAAStructInfo(Ty); | 1472 llvm::MDNode *TBAAStructTag = CGM.getTBAAStructInfo(Ty); |
| 1469 | 1473 |
| 1470 Builder.CreateMemCpy(DestPtr, SrcPtr, | 1474 Builder.CreateMemCpy(DestPtr, SrcPtr, |
| 1471 llvm::ConstantInt::get(IntPtrTy, | 1475 llvm::ConstantInt::get(IntPtrTy, |
| 1472 TypeInfo.first.getQuantity()), | 1476 TypeInfo.first.getQuantity()), |
| 1473 alignment.getQuantity(), isVolatile, | 1477 alignment.getQuantity(), isVolatile, |
| 1474 /*TBAATag=*/0, TBAAStructTag); | 1478 /*TBAATag=*/0, TBAAStructTag); |
| 1475 } | 1479 } |
| OLD | NEW |