Deleted Added
full compact
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 ---