diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -100,6 +100,11 @@ return Address::invalid(); } +static llvm::Type *getVAListElementType(CodeGenFunction &CGF) { + return CGF.ConvertTypeForMem( + CGF.getContext().getBuiltinVaListType()->getPointeeType()); +} + bool ABIInfo::isPromotableIntegerTypeForABI(QualType Ty) const { if (Ty->isPromotableIntegerType()) return true; @@ -375,7 +380,7 @@ } // Cast the address we've calculated to the right type. - llvm::Type *DirectTy = CGF.ConvertTypeForMem(ValueTy); + llvm::Type *DirectTy = CGF.ConvertTypeForMem(ValueTy), *ElementTy = DirectTy; if (IsIndirect) DirectTy = DirectTy->getPointerTo(0); @@ -384,7 +389,7 @@ SlotSizeAndAlign, AllowHigherAlign); if (IsIndirect) { - Addr = Address::deprecated(CGF.Builder.CreateLoad(Addr), ValueInfo.Align); + Addr = Address(CGF.Builder.CreateLoad(Addr), ElementTy, ValueInfo.Align); } return Addr; @@ -688,11 +693,11 @@ auto TyInfo = CGF.getContext().getTypeInfoInChars(Ty); CharUnits TyAlignForABI = TyInfo.Align; - llvm::Type *BaseTy = - llvm::PointerType::getUnqual(CGF.ConvertTypeForMem(Ty)); + llvm::Type *ElementTy = CGF.ConvertTypeForMem(Ty); + llvm::Type *BaseTy = llvm::PointerType::getUnqual(ElementTy); llvm::Value *Addr = CGF.Builder.CreateVAArg(VAListAddr.getPointer(), BaseTy); - return Address::deprecated(Addr, TyAlignForABI); + return Address(Addr, ElementTy, TyAlignForABI); } else { assert((AI.isDirect() || AI.isExtend()) && "Unexpected ArgInfo Kind in generic VAArg emitter!"); @@ -4826,7 +4831,7 @@ Builder.CreateCondBr(CC, UsingRegs, UsingOverflow); - llvm::Type *DirectTy = CGF.ConvertType(Ty); + llvm::Type *DirectTy = CGF.ConvertType(Ty), *ElementTy = DirectTy; if (isIndirect) DirectTy = DirectTy->getPointerTo(0); // Case 1: consume registers. @@ -4835,8 +4840,8 @@ CGF.EmitBlock(UsingRegs); Address RegSaveAreaPtr = Builder.CreateStructGEP(VAList, 4); - RegAddr = Address::deprecated(Builder.CreateLoad(RegSaveAreaPtr), - CharUnits::fromQuantity(8)); + RegAddr = Address(Builder.CreateLoad(RegSaveAreaPtr), CGF.Int8Ty, + CharUnits::fromQuantity(8)); assert(RegAddr.getElementType() == CGF.Int8Ty); // Floating-point registers start after the general-purpose registers. @@ -4883,14 +4888,15 @@ } Address OverflowAreaAddr = Builder.CreateStructGEP(VAList, 3); - Address OverflowArea = Address::deprecated( - Builder.CreateLoad(OverflowAreaAddr, "argp.cur"), OverflowAreaAlign); + Address OverflowArea = + Address(Builder.CreateLoad(OverflowAreaAddr, "argp.cur"), CGF.Int8Ty, + OverflowAreaAlign); // Round up address of argument to alignment CharUnits Align = CGF.getContext().getTypeAlignInChars(Ty); if (Align > OverflowAreaAlign) { llvm::Value *Ptr = OverflowArea.getPointer(); - OverflowArea = Address::deprecated( - emitRoundPointerUpToAlignment(CGF, Ptr, Align), Align); + OverflowArea = Address(emitRoundPointerUpToAlignment(CGF, Ptr, Align), + OverflowArea.getElementType(), Align); } MemAddr = Builder.CreateElementBitCast(OverflowArea, DirectTy); @@ -4909,8 +4915,8 @@ // Load the pointer if the argument was passed indirectly. if (isIndirect) { - Result = Address::deprecated(Builder.CreateLoad(Result, "aggr"), - getContext().getTypeAlignInChars(Ty)); + Result = Address(Builder.CreateLoad(Result, "aggr"), ElementTy, + getContext().getTypeAlignInChars(Ty)); } return Result; @@ -6060,7 +6066,7 @@ Address BaseAddr(CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, reg_top, reg_offs), CGF.Int8Ty, CharUnits::fromQuantity(IsFPR ? 16 : 8)); Address RegAddr = Address::invalid(); - llvm::Type *MemTy = CGF.ConvertTypeForMem(Ty); + llvm::Type *MemTy = CGF.ConvertTypeForMem(Ty), *ElementTy = MemTy; if (IsIndirect) { // If it's been passed indirectly (actually a struct), whatever we find from @@ -6143,8 +6149,8 @@ OnStackPtr = CGF.Builder.CreateIntToPtr(OnStackPtr, CGF.Int8PtrTy); } - Address OnStackAddr = Address::deprecated( - OnStackPtr, std::max(CharUnits::fromQuantity(8), TyAlign)); + Address OnStackAddr = Address(OnStackPtr, CGF.Int8Ty, + std::max(CharUnits::fromQuantity(8), TyAlign)); // All stack slots are multiples of 8 bytes. CharUnits StackSlotSize = CharUnits::fromQuantity(8); @@ -6180,8 +6186,8 @@ OnStackBlock, "vaargs.addr"); if (IsIndirect) - return Address::deprecated(CGF.Builder.CreateLoad(ResAddr, "vaarg.addr"), - TyAlign); + return Address(CGF.Builder.CreateLoad(ResAddr, "vaarg.addr"), ElementTy, + TyAlign); return ResAddr; } @@ -6199,8 +6205,8 @@ // Empty records are ignored for parameter passing purposes. if (isEmptyRecord(getContext(), Ty, true)) { - Address Addr = Address::deprecated( - CGF.Builder.CreateLoad(VAListAddr, "ap.cur"), SlotSize); + Address Addr = Address(CGF.Builder.CreateLoad(VAListAddr, "ap.cur"), + getVAListElementType(CGF), SlotSize); Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty)); return Addr; } @@ -6988,8 +6994,8 @@ // Empty records are ignored for parameter passing purposes. if (isEmptyRecord(getContext(), Ty, true)) { - Address Addr = - Address::deprecated(CGF.Builder.CreateLoad(VAListAddr), SlotSize); + Address Addr = Address(CGF.Builder.CreateLoad(VAListAddr), + getVAListElementType(CGF), SlotSize); Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty)); return Addr; } @@ -7562,9 +7568,9 @@ // single (8 byte) or double (16 byte) stack slot. Address OverflowArgAreaPtr = CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_ptr"); - Address OverflowArgArea = Address::deprecated( - CGF.Builder.CreateLoad(OverflowArgAreaPtr, "overflow_arg_area"), - TyInfo.Align); + Address OverflowArgArea = + Address(CGF.Builder.CreateLoad(OverflowArgAreaPtr, "overflow_arg_area"), + CGF.Int8Ty, TyInfo.Align); Address MemAddr = CGF.Builder.CreateElementBitCast(OverflowArgArea, DirectTy, "mem_addr"); @@ -7639,9 +7645,9 @@ // Work out the address of a stack argument. Address OverflowArgAreaPtr = CGF.Builder.CreateStructGEP(VAListAddr, 2, "overflow_arg_area_ptr"); - Address OverflowArgArea = Address::deprecated( - CGF.Builder.CreateLoad(OverflowArgAreaPtr, "overflow_arg_area"), - PaddedSize); + Address OverflowArgArea = + Address(CGF.Builder.CreateLoad(OverflowArgAreaPtr, "overflow_arg_area"), + CGF.Int8Ty, PaddedSize); Address RawMemAddr = CGF.Builder.CreateConstByteGEP(OverflowArgArea, Padding, "raw_mem_addr"); Address MemAddr = @@ -7661,8 +7667,8 @@ "va_arg.addr"); if (IsIndirect) - ResAddr = Address::deprecated( - CGF.Builder.CreateLoad(ResAddr, "indirect_arg"), TyInfo.Align); + ResAddr = Address(CGF.Builder.CreateLoad(ResAddr, "indirect_arg"), ArgTy, + TyInfo.Align); return ResAddr; } @@ -8600,8 +8606,8 @@ // overflow area pointer to the argument type. llvm::Type *PTy = CGF.ConvertTypeForMem(Ty); Address AddrTyped = CGF.Builder.CreateElementBitCast( - Address::deprecated(__overflow_area_pointer, - CharUnits::fromQuantity(Align)), + Address(__overflow_area_pointer, CGF.Int8Ty, + CharUnits::fromQuantity(Align)), PTy); // Round up to the minimum stack alignment for varargs which is 4 bytes. @@ -8634,7 +8640,7 @@ Addr = Builder.CreateIntToPtr(AddrAsInt, BP); } Address AddrTyped = Builder.CreateElementBitCast( - Address::deprecated(Addr, CharUnits::fromQuantity(TyAlign)), + Address(Addr, CGF.Int8Ty, CharUnits::fromQuantity(TyAlign)), CGF.ConvertType(Ty)); uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4); @@ -9707,8 +9713,8 @@ CharUnits SlotSize = CharUnits::fromQuantity(8); CGBuilderTy &Builder = CGF.Builder; - Address Addr = - Address::deprecated(Builder.CreateLoad(VAListAddr, "ap.cur"), SlotSize); + Address Addr = Address(Builder.CreateLoad(VAListAddr, "ap.cur"), + getVAListElementType(CGF), SlotSize); llvm::Type *ArgPtrTy = llvm::PointerType::getUnqual(ArgTy); auto TypeInfo = getContext().getTypeInfoInChars(Ty); @@ -9739,8 +9745,8 @@ case ABIArgInfo::IndirectAliased: Stride = SlotSize; ArgAddr = Builder.CreateElementBitCast(Addr, ArgPtrTy, "indirect"); - ArgAddr = Address::deprecated(Builder.CreateLoad(ArgAddr, "indirect.arg"), - TypeInfo.Align); + ArgAddr = Address(Builder.CreateLoad(ArgAddr, "indirect.arg"), ArgTy, + TypeInfo.Align); break; case ABIArgInfo::Ignore: @@ -10085,7 +10091,8 @@ // Get the VAList. CharUnits SlotSize = CharUnits::fromQuantity(4); - Address AP = Address::deprecated(Builder.CreateLoad(VAListAddr), SlotSize); + Address AP = Address(Builder.CreateLoad(VAListAddr), + getVAListElementType(CGF), SlotSize); // Handle the argument. ABIArgInfo AI = classifyArgumentType(Ty); @@ -10116,7 +10123,7 @@ case ABIArgInfo::Indirect: case ABIArgInfo::IndirectAliased: Val = Builder.CreateElementBitCast(AP, ArgPtrTy); - Val = Address::deprecated(Builder.CreateLoad(Val), TypeAlign); + Val = Address(Builder.CreateLoad(Val), ArgTy, TypeAlign); ArgSize = SlotSize; break; } @@ -11130,8 +11137,8 @@ // Empty records are ignored for parameter passing purposes. if (isEmptyRecord(getContext(), Ty, true)) { - Address Addr = - Address::deprecated(CGF.Builder.CreateLoad(VAListAddr), SlotSize); + Address Addr = Address(CGF.Builder.CreateLoad(VAListAddr), + getVAListElementType(CGF), SlotSize); Addr = CGF.Builder.CreateElementBitCast(Addr, CGF.ConvertTypeForMem(Ty)); return Addr; }