CGCXX.cpp (198893) | CGCXX.cpp (198954) |
---|---|
1//===--- CGDecl.cpp - Emit LLVM Code for declarations ---------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 277 unchanged lines hidden (view full) --- 286 const Expr *BaseExpr = BO->getLHS(); 287 const Expr *MemFnExpr = BO->getRHS(); 288 289 const MemberPointerType *MPT = 290 MemFnExpr->getType()->getAs<MemberPointerType>(); 291 const FunctionProtoType *FPT = 292 MPT->getPointeeType()->getAs<FunctionProtoType>(); 293 const CXXRecordDecl *RD = | 1//===--- CGDecl.cpp - Emit LLVM Code for declarations ---------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 277 unchanged lines hidden (view full) --- 286 const Expr *BaseExpr = BO->getLHS(); 287 const Expr *MemFnExpr = BO->getRHS(); 288 289 const MemberPointerType *MPT = 290 MemFnExpr->getType()->getAs<MemberPointerType>(); 291 const FunctionProtoType *FPT = 292 MPT->getPointeeType()->getAs<FunctionProtoType>(); 293 const CXXRecordDecl *RD = |
294 cast<CXXRecordDecl>(cast<RecordType>(MPT->getClass())->getDecl()); | 294 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl()); |
295 296 const llvm::FunctionType *FTy = 297 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(RD, FPT), 298 FPT->isVariadic()); 299 300 const llvm::Type *Int8PtrTy = 301 llvm::Type::getInt8Ty(VMContext)->getPointerTo(); 302 --- 502 unchanged lines hidden (view full) --- 805 // llvm::Value *Arg = CGF.GetAddrOfLocalVar(Dst); 806 Expr *Arg = new (getContext()) DeclRefExpr(D, ArgType, SourceLocation()); 807 CallArgs.push_back(std::make_pair(EmitCallArg(Arg, ArgType), ArgType)); 808 } 809 810 RValue RV = EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs), 811 Callee, CallArgs, MD); 812 if (nv_r || v_r) { | 295 296 const llvm::FunctionType *FTy = 297 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(RD, FPT), 298 FPT->isVariadic()); 299 300 const llvm::Type *Int8PtrTy = 301 llvm::Type::getInt8Ty(VMContext)->getPointerTo(); 302 --- 502 unchanged lines hidden (view full) --- 805 // llvm::Value *Arg = CGF.GetAddrOfLocalVar(Dst); 806 Expr *Arg = new (getContext()) DeclRefExpr(D, ArgType, SourceLocation()); 807 CallArgs.push_back(std::make_pair(EmitCallArg(Arg, ArgType), ArgType)); 808 } 809 810 RValue RV = EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs), 811 Callee, CallArgs, MD); 812 if (nv_r || v_r) { |
813 bool CanBeZero = !(ResultType->isReferenceType() 814 // FIXME: attr nonnull can't be zero either 815 /* || ResultType->hasAttr<NonNullAttr>() */ ); |
|
813 // Do the return result adjustment. | 816 // Do the return result adjustment. |
814 RV = RValue::get(DynamicTypeAdjust(RV.getScalarVal(), nv_r, v_r)); | 817 if (CanBeZero) { 818 llvm::BasicBlock *NonZeroBlock = createBasicBlock(); 819 llvm::BasicBlock *ZeroBlock = createBasicBlock(); 820 llvm::BasicBlock *ContBlock = createBasicBlock(); 821 822 const llvm::Type *Ty = RV.getScalarVal()->getType(); 823 llvm::Value *Zero = llvm::Constant::getNullValue(Ty); 824 Builder.CreateCondBr(Builder.CreateICmpNE(RV.getScalarVal(), Zero), 825 NonZeroBlock, ZeroBlock); 826 EmitBlock(NonZeroBlock); 827 llvm::Value *NZ = DynamicTypeAdjust(RV.getScalarVal(), nv_r, v_r); 828 EmitBranch(ContBlock); 829 EmitBlock(ZeroBlock); 830 llvm::Value *Z = RV.getScalarVal(); 831 EmitBlock(ContBlock); 832 llvm::PHINode *RVOrZero = Builder.CreatePHI(Ty); 833 RVOrZero->reserveOperandSpace(2); 834 RVOrZero->addIncoming(NZ, NonZeroBlock); 835 RVOrZero->addIncoming(Z, ZeroBlock); 836 RV = RValue::get(RVOrZero); 837 } else 838 RV = RValue::get(DynamicTypeAdjust(RV.getScalarVal(), nv_r, v_r)); |
815 } 816 817 if (!ResultType->isVoidType()) 818 EmitReturnOfRValue(RV, ResultType); 819 820 FinishFunction(); 821 return Fn; 822} --- 593 unchanged lines hidden (view full) --- 1416 } 1417 1418 assert(Member->getNumArgs() == 1 && "Initializer count must be 1 only"); 1419 Expr *RhsExpr = *Member->arg_begin(); 1420 RValue RHS; 1421 if (FieldType->isReferenceType()) 1422 RHS = EmitReferenceBindingToExpr(RhsExpr, FieldType, 1423 /*IsInitializer=*/true); | 839 } 840 841 if (!ResultType->isVoidType()) 842 EmitReturnOfRValue(RV, ResultType); 843 844 FinishFunction(); 845 return Fn; 846} --- 593 unchanged lines hidden (view full) --- 1440 } 1441 1442 assert(Member->getNumArgs() == 1 && "Initializer count must be 1 only"); 1443 Expr *RhsExpr = *Member->arg_begin(); 1444 RValue RHS; 1445 if (FieldType->isReferenceType()) 1446 RHS = EmitReferenceBindingToExpr(RhsExpr, FieldType, 1447 /*IsInitializer=*/true); |
1448 else if (FieldType->isMemberFunctionPointerType()) 1449 RHS = RValue::get(CGM.EmitConstantExpr(RhsExpr, FieldType, this)); |
|
1424 else 1425 RHS = RValue::get(EmitScalarExpr(RhsExpr, true)); 1426 EmitStoreThroughLValue(RHS, LHS, FieldType); 1427 } 1428 } 1429 1430 if (!CD->getNumBaseOrMemberInitializers() && !CD->isTrivial()) { 1431 // Nontrivial default constructor with no initializer list. It may still --- 212 unchanged lines hidden --- | 1450 else 1451 RHS = RValue::get(EmitScalarExpr(RhsExpr, true)); 1452 EmitStoreThroughLValue(RHS, LHS, FieldType); 1453 } 1454 } 1455 1456 if (!CD->getNumBaseOrMemberInitializers() && !CD->isTrivial()) { 1457 // Nontrivial default constructor with no initializer list. It may still --- 212 unchanged lines hidden --- |