@@ -3267,27 +3267,29 @@ llvm::Value* MipsABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
3267
3267
CGBuilderTy &Builder = CGF.Builder ;
3268
3268
llvm::Value *VAListAddrAsBPP = Builder.CreateBitCast (VAListAddr, BPP, " ap" );
3269
3269
llvm::Value *Addr = Builder.CreateLoad (VAListAddrAsBPP, " ap.cur" );
3270
- unsigned TypeAlign = getContext ().getTypeAlign (Ty) / 8 ;
3270
+ int64_t TypeAlign = getContext ().getTypeAlign (Ty) / 8 ;
3271
3271
llvm::Type *PTy = llvm::PointerType::getUnqual (CGF.ConvertType (Ty));
3272
3272
llvm::Value *AddrTyped;
3273
+ unsigned PtrWidth = getContext ().getTargetInfo ().getPointerWidth (0 );
3274
+ llvm::IntegerType *IntTy = (PtrWidth == 32 ) ? CGF.Int32Ty : CGF.Int64Ty ;
3273
3275
3274
3276
if (TypeAlign > MinABIStackAlignInBytes) {
3275
- llvm::Value *AddrAsInt32 = CGF.Builder .CreatePtrToInt (Addr, CGF. Int32Ty );
3276
- llvm::Value *Inc = llvm::ConstantInt::get (CGF. Int32Ty , TypeAlign - 1 );
3277
- llvm::Value *Mask = llvm::ConstantInt::get (CGF. Int32Ty , -TypeAlign);
3278
- llvm::Value *Add = CGF.Builder .CreateAdd (AddrAsInt32 , Inc);
3277
+ llvm::Value *AddrAsInt = CGF.Builder .CreatePtrToInt (Addr, IntTy );
3278
+ llvm::Value *Inc = llvm::ConstantInt::get (IntTy , TypeAlign - 1 );
3279
+ llvm::Value *Mask = llvm::ConstantInt::get (IntTy , -TypeAlign);
3280
+ llvm::Value *Add = CGF.Builder .CreateAdd (AddrAsInt , Inc);
3279
3281
llvm::Value *And = CGF.Builder .CreateAnd (Add, Mask);
3280
3282
AddrTyped = CGF.Builder .CreateIntToPtr (And, PTy);
3281
3283
}
3282
3284
else
3283
3285
AddrTyped = Builder.CreateBitCast (Addr, PTy);
3284
3286
3285
3287
llvm::Value *AlignedAddr = Builder.CreateBitCast (AddrTyped, BP);
3286
- TypeAlign = std::max (TypeAlign, MinABIStackAlignInBytes);
3288
+ TypeAlign = std::max (( unsigned ) TypeAlign, MinABIStackAlignInBytes);
3287
3289
uint64_t Offset =
3288
3290
llvm::RoundUpToAlignment (CGF.getContext ().getTypeSize (Ty) / 8 , TypeAlign);
3289
3291
llvm::Value *NextAddr =
3290
- Builder.CreateGEP (AlignedAddr, llvm::ConstantInt::get (CGF. Int32Ty , Offset),
3292
+ Builder.CreateGEP (AlignedAddr, llvm::ConstantInt::get (IntTy , Offset),
3291
3293
" ap.next" );
3292
3294
Builder.CreateStore (NextAddr, VAListAddrAsBPP);
3293
3295
0 commit comments