Lines Matching defs:CGF
32 RValue EmitVAArg(CodeGenFunction &CGF, Address VAListAddr, QualType Ty,
182 Address HexagonABIInfo::EmitVAArgFromMemory(CodeGenFunction &CGF,
187 CGF.Builder.CreateStructGEP(VAListAddr, 2, "__overflow_area_pointer_p");
188 llvm::Value *__overflow_area_pointer = CGF.Builder.CreateLoad(
191 uint64_t Align = CGF.getContext().getTypeAlign(Ty) / 8;
197 llvm::Value *Offset = llvm::ConstantInt::get(CGF.Int64Ty, Align - 1);
201 CGF.Builder.CreateGEP(CGF.Int8Ty, __overflow_area_pointer, Offset);
203 CGF.Builder.CreatePtrToInt(__overflow_area_pointer, CGF.Int32Ty);
207 llvm::Value *Mask = llvm::ConstantInt::get(CGF.Int32Ty, -(int)Align);
208 __overflow_area_pointer = CGF.Builder.CreateIntToPtr(
209 CGF.Builder.CreateAnd(AsInt, Mask), __overflow_area_pointer->getType(),
215 llvm::Type *PTy = CGF.ConvertTypeForMem(Ty);
220 uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
222 __overflow_area_pointer = CGF.Builder.CreateGEP(
223 CGF.Int8Ty, __overflow_area_pointer,
224 llvm::ConstantInt::get(CGF.Int32Ty, Offset),
226 CGF.Builder.CreateStore(__overflow_area_pointer, __overflow_area_pointer_p);
231 Address HexagonABIInfo::EmitVAArgForHexagon(CodeGenFunction &CGF,
235 llvm::Type *BP = CGF.Int8PtrTy;
236 CGBuilderTy &Builder = CGF.Builder;
240 uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8;
243 llvm::Value *AddrAsInt = Builder.CreatePtrToInt(Addr, CGF.Int32Ty);
249 Address(Addr, CGF.ConvertType(Ty), CharUnits::fromQuantity(TyAlign));
251 uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
253 CGF.Int8Ty, Addr, llvm::ConstantInt::get(CGF.Int32Ty, Offset), "ap.next");
259 Address HexagonABIInfo::EmitVAArgForHexagonLinux(CodeGenFunction &CGF,
262 int ArgSize = CGF.getContext().getTypeSize(Ty) / 8;
265 return EmitVAArgFromMemory(CGF, VAListAddr, Ty);
272 Ty = CGF.getContext().getCanonicalType(Ty);
275 llvm::BasicBlock *MaybeRegBlock = CGF.createBasicBlock("vaarg.maybe_reg");
276 llvm::BasicBlock *InRegBlock = CGF.createBasicBlock("vaarg.in_reg");
277 llvm::BasicBlock *OnStackBlock = CGF.createBasicBlock("vaarg.on_stack");
278 llvm::BasicBlock *ContBlock = CGF.createBasicBlock("vaarg.end");
282 ArgSize = (CGF.getContext().getTypeSize(Ty) <= 32) ? 4 : 8;
283 int ArgAlign = (CGF.getContext().getTypeSize(Ty) <= 32) ? 4 : 8;
286 CGF.EmitBlock(MaybeRegBlock);
289 Address __current_saved_reg_area_pointer_p = CGF.Builder.CreateStructGEP(
291 llvm::Value *__current_saved_reg_area_pointer = CGF.Builder.CreateLoad(
295 Address __saved_reg_area_end_pointer_p = CGF.Builder.CreateStructGEP(
297 llvm::Value *__saved_reg_area_end_pointer = CGF.Builder.CreateLoad(
305 CGF.Builder.CreatePtrToInt(__current_saved_reg_area_pointer,
306 CGF.Int32Ty);
308 __current_saved_reg_area_pointer_int = CGF.Builder.CreateAdd(
310 llvm::ConstantInt::get(CGF.Int32Ty, (ArgAlign - 1)),
314 CGF.Builder.CreateAnd(__current_saved_reg_area_pointer_int,
315 llvm::ConstantInt::get(CGF.Int32Ty, -ArgAlign),
319 CGF.Builder.CreateIntToPtr(__current_saved_reg_area_pointer_int,
325 CGF.Builder.CreateGEP(CGF.Int8Ty, __current_saved_reg_area_pointer,
326 llvm::ConstantInt::get(CGF.Int32Ty, ArgSize),
330 UsingStack = CGF.Builder.CreateICmpSGT(__new_saved_reg_area_pointer,
333 CGF.Builder.CreateCondBr(UsingStack, OnStackBlock, InRegBlock);
337 CGF.EmitBlock(InRegBlock);
339 llvm::Type *PTy = CGF.ConvertType(Ty);
340 llvm::Value *__saved_reg_area_p = CGF.Builder.CreateBitCast(
343 CGF.Builder.CreateStore(__new_saved_reg_area_pointer,
346 CGF.EmitBranch(ContBlock);
350 CGF.EmitBlock(OnStackBlock);
354 CGF.Builder.CreateStructGEP(VAListAddr, 2, "__overflow_area_pointer_p");
355 llvm::Value *__overflow_area_pointer = CGF.Builder.CreateLoad(
361 CGF.Builder.CreatePtrToInt(__overflow_area_pointer, CGF.Int32Ty);
364 CGF.Builder.CreateAdd(__overflow_area_pointer_int,
365 llvm::ConstantInt::get(CGF.Int32Ty, ArgAlign - 1),
369 CGF.Builder.CreateAnd(__overflow_area_pointer_int,
370 llvm::ConstantInt::get(CGF.Int32Ty, -ArgAlign),
373 __overflow_area_pointer = CGF.Builder.CreateIntToPtr(
380 llvm::Value *__new_overflow_area_pointer = CGF.Builder.CreateGEP(
381 CGF.Int8Ty, __overflow_area_pointer,
382 llvm::ConstantInt::get(CGF.Int32Ty, ArgSize),
385 CGF.Builder.CreateStore(__new_overflow_area_pointer,
388 CGF.Builder.CreateStore(__new_overflow_area_pointer,
392 llvm::Type *OverflowPTy = CGF.ConvertTypeForMem(Ty);
393 llvm::Value *__overflow_area_p = CGF.Builder.CreateBitCast(
396 CGF.EmitBranch(ContBlock);
400 CGF.EmitBlock(ContBlock);
402 llvm::Type *MemTy = CGF.ConvertTypeForMem(Ty);
404 llvm::PHINode *ArgAddr = CGF.Builder.CreatePHI(MemPTy, 2, "vaarg.addr");
411 RValue HexagonABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
415 return CGF.EmitLoadOfAnyValue(
416 CGF.MakeAddrLValue(EmitVAArgForHexagonLinux(CGF, VAListAddr, Ty), Ty),
419 return CGF.EmitLoadOfAnyValue(
420 CGF.MakeAddrLValue(EmitVAArgForHexagon(CGF, VAListAddr, Ty), Ty), Slot);